diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 990cb6d38d60c..e306ae5ddb7ad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,16 +11,16 @@ jobs: strategy: fail-fast: false matrix: - node-version: [20, 22, 24] + node-version: [20, 22, 24, 25] steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index e09aabca02246..26d7b1210818d 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -18,18 +18,18 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} queries: security-and-quality - name: Autobuild CodeQL - uses: github/codeql-action/autobuild@v3 + uses: github/codeql-action/autobuild@v4 - name: Perform CodeQL analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4 diff --git a/.github/workflows/fluent_linter.yml b/.github/workflows/fluent_linter.yml index 5188630df185a..0cc989c9af4ef 100644 --- a/.github/workflows/fluent_linter.yml +++ b/.github/workflows/fluent_linter.yml @@ -25,12 +25,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - - name: Use Python 3.13 - uses: actions/setup-python@v5 + - name: Use Python 3.14 + uses: actions/setup-python@v6 with: - python-version: '3.13' + python-version: '3.14' cache: 'pip' - name: Install Fluent dependencies diff --git a/.github/workflows/font_tests.yml b/.github/workflows/font_tests.yml index 712c37e63e68c..445dc124f5c23 100644 --- a/.github/workflows/font_tests.yml +++ b/.github/workflows/font_tests.yml @@ -36,22 +36,22 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} - name: Install dependencies run: npm ci - - name: Use Python 3.13 - uses: actions/setup-python@v5 + - name: Use Python 3.14 + uses: actions/setup-python@v6 with: - python-version: '3.13' + python-version: '3.14' cache: 'pip' - name: Install Fonttools diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 55d2c6eab692c..94e849728c673 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -15,12 +15,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} @@ -30,5 +30,5 @@ jobs: - name: Run lint run: npx gulp lint - - name: Run lint-chromium - run: npx gulp lint-chromium + - name: Run lint-mozcentral + run: npx gulp lint-mozcentral diff --git a/.github/workflows/prefs_tests.yml b/.github/workflows/prefs_tests.yml new file mode 100644 index 0000000000000..b439dbf5c61a7 --- /dev/null +++ b/.github/workflows/prefs_tests.yml @@ -0,0 +1,31 @@ +name: Prefs tests +on: [push, pull_request] +permissions: + contents: read + +jobs: + test: + name: Test + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + node-version: [lts/*] + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v6 + with: + node-version: ${{ matrix.node-version }} + + - name: Install dependencies + run: npm ci + + - name: Run prefs tests + run: npx gulp prefstest diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index f6c49355680e8..ea903e1fbb538 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -17,12 +17,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} registry-url: 'https://registry.npmjs.org' @@ -34,6 +34,4 @@ jobs: run: npx gulp dist - name: Publish the `pdfjs-dist` library to NPM - run: npm publish ./build/dist --provenance - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: npm publish ./build/dist diff --git a/.github/workflows/publish_website.yml b/.github/workflows/publish_website.yml index 99fa7711dbaf8..a882ba16098f3 100644 --- a/.github/workflows/publish_website.yml +++ b/.github/workflows/publish_website.yml @@ -17,12 +17,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} @@ -49,7 +49,7 @@ jobs: INPUT_PATH: build/gh-pages - name: Upload the website - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: github-pages path: ${{ runner.temp }}/website.tar diff --git a/.github/workflows/types_tests.yml b/.github/workflows/types_tests.yml index 8a69425bf395a..15bb3d25d147d 100644 --- a/.github/workflows/types_tests.yml +++ b/.github/workflows/types_tests.yml @@ -15,12 +15,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} diff --git a/.gitignore b/.gitignore index 157225dcdd027..5e460c990d9a2 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ Makefile node_modules/ examples/node/svgdump/ examples/node/pdf2png/*.png +.vscode/ diff --git a/.prettierrc b/.prettierrc index 3455ffe60da99..49e6b8e7e0962 100644 --- a/.prettierrc +++ b/.prettierrc @@ -9,10 +9,17 @@ "overrides": [ { - files: ["tsconfig.json"], - options: { - parser: "json", - }, + "files": ["tsconfig.json", ".prettierrc"], + "options": { + "parser": "json" + } }, + { + "files": ["**/*.html"], + "options": { + "parser": "html", + "printWidth": 160 + } + } ] } diff --git a/.stylelintrc b/.stylelintrc index 530e76a96a685..c705193f8a919 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -17,9 +17,9 @@ "float": ["inline-start", "inline-end"] }, "length-zero-no-unit": [true, { - ignore: ["custom-properties"] + "ignore": ["custom-properties"] }], "selector-pseudo-element-colon-notation": "double", - "shorthand-property-no-redundant-values": true, - }, + "shorthand-property-no-redundant-values": true + } } diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000000..acd7e480fc916 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,204 @@ +## Overview + +PDF.js is a Portable Document Format (PDF) viewer built with JavaScript, HTML5 Canvas, and CSS. It's a Mozilla project that provides a general-purpose, web standards-based platform for parsing and rendering PDFs without requiring native code or plugins. + +## Common Commands + +### Development Server +```bash +npx gulp server +``` +Then open http://localhost:8888/web/viewer.html to view the PDF viewer. Test PDFs are available at http://localhost:8888/test/pdfs/?frame + +### Building + +Build for modern browsers: +```bash +npx gulp generic +``` + +This generates `pdf.js` and `pdf.worker.js` in `build/generic/build/`. + +Build for distribution (creates pdfjs-dist package): +```bash +npx gulp dist +npx gulp dist-install # Build and install locally +``` + +### Testing + +Run all tests: +```bash +npx gulp test +``` + +Run unit tests only: +```bash +npx gulp unittest +``` + +Run integration tests (browser-based tests using Puppeteer): +```bash +npx gulp integrationtest +``` + +Run font tests: +```bash +npx gulp fonttest +``` + +Run a single test file by modifying test/test_manifest.json or using test runner options. + +### Linting and Formatting + +Lint JavaScript: +```bash +npx gulp lint +``` + +Format code (uses Prettier and ESLint): +```bash +npx eslint --fix +``` + +### Type Checking + +Run TypeScript type checking: +```bash +npx gulp typestest +``` + +## Architecture + +### High-Level Structure + +PDF.js has a multi-layer architecture that separates concerns between PDF parsing, rendering, and UI: + +#### 1. Core Layer (`src/core/`) +The core layer handles PDF parsing and interpretation. Key responsibilities: +- **PDF parsing**: Parsing PDF structure, cross-reference tables, streams +- **Font handling**: CFF, TrueType, Type1 font parsing and conversion (`font.js`, `fonts.js`, `cff_*.js`, `type1_*.js`) +- **Image decoding**: JPEG, JBIG2, JPX/JPEG2000 decoders +- **Operators**: Processing PDF drawing operators (`operator_list.js`, `evaluator.js`) +- **XFA Forms**: XML Forms Architecture support (`src/core/xfa/`) +- **Color spaces**: ICC profiles, device color spaces (`colorspace.js`, `icc_colorspace.js`) +- Runs in a Web Worker for performance isolation + +Entry point: `src/pdf.worker.js` + +#### 2. Display Layer (`src/display/`) +The display layer provides the API for rendering PDFs to canvas and managing documents. Key components: +- **API**: Main public API (`api.js`) - `PDFDocumentProxy`, `PDFPageProxy`, `getDocument()` +- **Canvas rendering**: Renders PDF operations to HTML5 canvas (`canvas.js`) +- **Text layer**: Extracts and positions text for selection/search (`text_layer.js`) +- **Annotation layer**: Renders and handles PDF annotations (`annotation_layer.js`) +- **Editor layer**: Supports PDF editing (annotations, highlights, stamps) (`editor/`) +- **Metadata**: Parses XMP metadata (`metadata.js`) +- **Streams**: Handles PDF data fetching (fetch, network, node) (`fetch_stream.js`, `network.js`, `node_stream.js`) + +Entry point: `src/pdf.js` + +#### 3. Scripting Layer (`src/scripting_api/`) +Implements JavaScript execution for interactive PDFs (form calculations, validations, button actions). +- Sandboxed execution environment +- Implements Acrobat JavaScript API objects (App, Doc, Field, etc.) + +Entry points: `src/pdf.scripting.js`, `src/pdf.sandbox.js` + +#### 4. Web Viewer (`web/`) +The complete PDF viewer application with UI. Key components: +- **Main app**: Application orchestration (`app.js`) +- **Viewer**: Page rendering and layout (`pdf_viewer.js`, `pdf_page_view.js`) +- **Toolbar**: Zoom, page navigation, print, download controls +- **Sidebar**: Thumbnails, outlines, attachments (`pdf_sidebar.js`, `pdf_thumbnail_view.js`, `pdf_outline_viewer.js`) +- **Find controller**: Text search functionality (`pdf_find_controller.js`) +- **Annotation editors**: UI for creating/editing annotations (`annotation_editor_layer_builder.js`) +- **Presentation mode**: Full-screen presentation (`pdf_presentation_mode.js`) + +Entry point: `web/viewer.html` + `web/viewer.mjs` + +#### 5. Shared Utilities (`src/shared/`) +Common utilities used across layers: +- **Message handling**: Worker communication (`message_handler.js`) +- **Utilities**: Common functions and constants (`util.js`) +- **Image utilities**: Image processing helpers (`image_utils.js`) + +### Worker Communication + +PDF.js uses a Web Worker architecture: +- Main thread (`display` layer) communicates with worker thread (`core` layer) via `MessageHandler` +- Keeps PDF parsing off the main thread for better performance +- Messages include: page rendering requests, text content extraction, metadata queries + +### Build System + +- Uses **Gulp** for build orchestration (`gulpfile.mjs`) +- **Webpack** bundles modules into browser-compatible formats +- **Babel** transpiles for browser compatibility (configurable targets in gulpfile) +- Preprocessor replaces build-time constants (e.g., `typeof PDFJSDev !== "undefined"` checks) +- Multiple build targets: generic, components, minified, legacy (older browser support) + +### External Dependencies + +Located in `external/`: +- **bcmaps**: Binary CMaps for CJK fonts +- **standard_fonts**: Core 14 PDF fonts metrics +- **cmapscompress**: Tools for compressing CMaps +- **openjpeg**: JPEG2000 decoder (WASM) +- **quickjs**: JavaScript engine for sandboxed execution + +### Translations + +Translations in `l10n/` are imported from Mozilla Firefox Nightly. Only the file l10n/en-US/viewer.ftl can be updated. + +## Development Notes + +### Adding New Features + +When adding features that span multiple layers: +1. Start with the `core` layer if parsing/interpretation changes are needed +2. Update the `display` layer API if new capabilities need exposure +3. Modify the `web` viewer if UI changes are required +4. Ensure worker communication handles new message types + +### Preprocessor Directives + +Code uses preprocessor checks for build-time conditionals: +```javascript +if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("GENERIC")) { + // Generic build-specific code +} +``` + +Common flags: `GENERIC`, `MOZCENTRAL`, `CHROME`, `MINIFIED`, `TESTING`, `LIB`, `SKIP_BABEL`, `IMAGE_DECODERS` + +### Testing + +- Unit tests use Jasmine framework (`test/unit/`) +- Integration tests use Puppeteer for browser automation (`test/integration/`) +- Test PDFs downloaded from manifest (`test/test_manifest.json`) +- Reference images for visual regression testing (`test/ref/`) + +### Code Style + +- Uses ESLint with custom configuration (`eslint.config.mjs`) +- Prettier for formatting +- Stylelint for CSS +- No semicolons required (ASI enabled) +- Single quotes for strings + +### Pull Request Process + +- Keep PRs focused on a single issue +- Provide a test PDF if the issue is PDF-specific +- Ensure tests pass (`npx gulp test`) +- Run linting (`npx gulp lint`) +- Follow existing code patterns +- Don't modify translations directly (they come from Firefox) + +### Performance Considerations + +- Core parsing runs in a Web Worker - keep main thread work minimal +- Canvas rendering can be expensive - use appropriate scale factors +- Text layer generation is separate from rendering - can be deferred +- Annotation layer is optional - only enable when needed diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000000000..43c994c2d3617 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/README.md b/README.md index c4b5598f9c1cc..a6a6153a8d5f7 100644 --- a/README.md +++ b/README.md @@ -52,23 +52,69 @@ Use a **squash merge PR for new feature work** so that all your development comm ### Changes We Have Made From Mainline +#### Build & Development * These README updates -* Temporary fix for file loading until https://github.com/mozilla/pdf.js/issues/20137 is resolved (web/app.js) -* The additional gulp tasks that detailed below +* The additional gulp tasks detailed below +* Changed ESLint sourceType to "module" for Chrome extension to support ES6 imports (eslint.config.mjs) + +#### Security +* Added DOMPurify sanitization for URL handling in Chrome extension to prevent XSS attacks (extensions/chromium/contentscript.js, package.json) + +#### Bug Fixes +* Temporary fix for file loading until https://github.com/mozilla/pdf.js/issues/20137 is resolved (web/app.js) (issue was closed but we're still experiencing the double encoding issues) + +#### Feature Restrictions * We don't allow download (web/app.js) * We don't allow save (web/app.js) * We don't allow annotating/inking the pdf (web/viewer.html) (currently just hiding the button, we may want to find a more pdf.js way to disable editing) +* We don't allow page management actions (copy/cut/delete/save pages) - hidden via viewsManagerStatus element (web/viewer.html) + +#### Styling & UI Customizations +* Custom dark theme styling for the views manager (formerly sidebar): + - Applied via mcSidebar class and CSS targeting #viewsManager, #viewsManagerHeader, #viewsManagerContent, and view containers (web/viewer.html, web/viewer.css) + - Uses `color-scheme: dark` to automatically apply light text on dark backgrounds +* Custom thumbnail styling via mcThumbnail class (web/pdf_thumbnail_view.js, web/viewer.css) +* Custom toolbar styling via mcToolbar class (web/viewer.html, web/viewer.css) +* Custom viewer background via mcViewer class (web/viewer.html, web/viewer.css) +* Use plain HTML checkboxes in findbar instead of Mozilla's custom toggle buttons (web/viewer.html - removed toggleButton class, moved toolbarLabel to label) +* Removed Mozilla's dark theme option (web/viewer.css) +* Added presentation mode button to main toolbar for easy access (web/viewer.html id="presentationMode", web/viewer.js configuration) +* Removed page scroll mode from the toolbar (web/viewer.html) (didn't feel intuitive that there were other pages to scroll to) +* Include Global-complete styles (web/viewer.html) + +#### Configuration Changes * We change the print resolution (web/app_options.js) * Configurably can allow printing (web/pdf_print_service.js, app.js) -* Affect styling via css (web/pdf_thumbnail_view.js, web/viewer.css, web/viewer.html) -* Removed dark theme (web/viewer.css) -* Added presentation mode to the toolbar (web/toolbar.js, web/viewer.html) -* Remove page scroll mode from the toolbar (web/viewer.html) (didn't feel intuitive that there were other pages to scroll to) -* Include Global-complete styles (web/viewer.html) * Turned off rendering of form field values via HTML canvas due to issues with it rendering correctly with hardware acceleration on in Chromium browsers (the default) (core/annotation.js) * Changed AnnotationMode to "ENABLE" which disables interactive form fields. This setting may be dependent on the form field rendering change above. (web/app_options.js) +### Important: Cross-File Dependencies When Merging (does this section belong in AGENTS.md?) + +When merging Mozilla updates, be aware of these critical cross-file dependencies: + +#### HTML ↔ JavaScript Configuration +- `web/viewer.html` button IDs must match `web/viewer.js` configuration +- Example: If viewer.html has `id="presentationMode"`, viewer.js must have `getElementById("presentationMode")` +- **Files to check together**: `web/viewer.html` + `web/viewer.js` + +#### CSS ↔ HTML Classes +- Custom CSS classes (mcToolbar, mcViewer, mcSidebar, mcThumbnail) must be applied in HTML +- **Files to check together**: `web/viewer.css` + `web/viewer.html` + `web/pdf_thumbnail_view.js` + +#### Business Logic ↔ UI +- MCOptions usage must match UI elements +- Print permission checks must align with print button visibility +- **Files to check together**: `web/app.js` + `web/viewer.html` + +#### After Merge Validation Checklist +1. Run `gulp generic` to ensure it builds without errors +2. Open the viewer in a browser and check browser console for errors +3. Verify all toolbar buttons load without null reference errors +4. Test that hidden buttons (print, download, annotations) remain hidden +5. Test that custom classes (mcToolbar, etc.) are applied and styled correctly + + ### Building during development To build for use in MasterControl during developmental testing you can either run diff --git a/eslint.config.mjs b/eslint.config.mjs index 46a48f448d6c2..3df415b3c68e2 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -35,6 +35,7 @@ export default [ "external/builder/fixtures_babel/", "external/openjpeg/", "external/qcms/", + "external/jbig2/", "external/quickjs/", "test/stats/results/", "test/tmp/", @@ -116,6 +117,7 @@ export default [ "web", "fluent-bundle", "fluent-dom", + "postcss-values-parser", // See https://github.com/firebase/firebase-admin-node/discussions/1359. "eslint-plugin-perfectionist", ], diff --git a/examples/components/pageviewer.html b/examples/components/pageviewer.html index 267f8cc291512..76f7e36845092 100644 --- a/examples/components/pageviewer.html +++ b/examples/components/pageviewer.html @@ -1,4 +1,4 @@ - + - - - - - PDF.js page viewer using built components - - - - - - - - - - -
- - - + + + + + PDF.js page viewer using built components + + + + + + + + + + +
+ + + diff --git a/examples/components/simpleviewer.html b/examples/components/simpleviewer.html index e6493263dc8e3..8504062d5910f 100644 --- a/examples/components/simpleviewer.html +++ b/examples/components/simpleviewer.html @@ -1,4 +1,4 @@ - + - - - - - PDF.js viewer using built components - - - - - - - - - - -
-
-
- - - + + + + + PDF.js viewer using built components + + + + + + + + + + +
+
+
+ + + diff --git a/examples/components/singlepageviewer.html b/examples/components/singlepageviewer.html index 3636dbe77f96e..3e71aad80b5cf 100644 --- a/examples/components/singlepageviewer.html +++ b/examples/components/singlepageviewer.html @@ -1,4 +1,4 @@ - + - - - - - PDF.js Single Page Viewer using built components - - - - - - - - - - -
-
-
- - - + + + + + PDF.js Single Page Viewer using built components + + + + + + + + + + +
+
+
+ + + diff --git a/examples/image_decoders/jpeg_viewer.html b/examples/image_decoders/jpeg_viewer.html index 87f757bd6f20c..a120efedd0c72 100644 --- a/examples/image_decoders/jpeg_viewer.html +++ b/examples/image_decoders/jpeg_viewer.html @@ -1,4 +1,4 @@ - + - - - - - PDF.js standalone JpegImage parser + + + + + PDF.js standalone JpegImage parser - + - - + + - - + + - - + + diff --git a/examples/learning/helloworld.html b/examples/learning/helloworld.html index 6a74298f802e5..028fb015fc20b 100644 --- a/examples/learning/helloworld.html +++ b/examples/learning/helloworld.html @@ -1,76 +1,71 @@ - + - - - 'Hello, world!' example - - + + + 'Hello, world!' example + + +

'Hello, world!' example

-

'Hello, world!' example

+ - + - + - // - // Render PDF page into canvas context - // - const renderContext = { - canvasContext: context, - transform, - viewport, - }; - page.render(renderContext); - - -
-

JavaScript code:

-

-
-
+    
+

JavaScript code:

+

+    
+  
 
diff --git a/examples/learning/helloworld64.html b/examples/learning/helloworld64.html
index ed98e189f4898..5b833a2dbfd96 100644
--- a/examples/learning/helloworld64.html
+++ b/examples/learning/helloworld64.html
@@ -1,81 +1,77 @@
-
+
 
-
-  
-  'Hello, world!' base64 example
-
-
+  
+    
+    'Hello, world!' base64 example
+  
+  
+    

'Hello, world!' example

-

'Hello, world!' example

+ - + - + - // Render PDF page into canvas context. - var renderContext = { - canvasContext: context, - transform, - viewport, - }; - page.render(renderContext); - - -
-

JavaScript code:

-

-
-
+    
+

JavaScript code:

+

+    
+  
 
diff --git a/examples/learning/prevnext.html b/examples/learning/prevnext.html
index e1043bf1e8fad..5249d32aace9d 100644
--- a/examples/learning/prevnext.html
+++ b/examples/learning/prevnext.html
@@ -1,139 +1,134 @@
-
+
 
-
-  
-  Previous/Next example
-
-
-
-

'Previous/Next' example

- -
- - -     - Page: / -
- -
- -
- - - - + + - - + } + + /** + * Displays previous page. + */ + function onPrevPage() { + if (pageNum <= 1) { + return; + } + pageNum--; + queueRenderPage(pageNum); + } + document.getElementById("prev").addEventListener("click", onPrevPage); + + /** + * Displays next page. + */ + function onNextPage() { + if (pageNum >= pdfDoc.numPages) { + return; + } + pageNum++; + queueRenderPage(pageNum); + } + document.getElementById("next").addEventListener("click", onNextPage); + + /** + * Asynchronously downloads PDF. + */ + var loadingTask = pdfjsLib.getDocument(url); + pdfDoc = await loadingTask.promise; + document.getElementById("page_count").textContent = pdfDoc.numPages; + + // Initial/first page rendering + renderPage(pageNum); + + diff --git a/examples/mobile-viewer/viewer.html b/examples/mobile-viewer/viewer.html index 6bd8b540647be..1812db9481e7d 100644 --- a/examples/mobile-viewer/viewer.html +++ b/examples/mobile-viewer/viewer.html @@ -1,4 +1,4 @@ - + - - + + PDF.js viewer - - + + @@ -46,12 +46,12 @@

- + - + diff --git a/examples/mobile-viewer/viewer.mjs b/examples/mobile-viewer/viewer.mjs index bf496c91e62aa..edf7d7079e02c 100644 --- a/examples/mobile-viewer/viewer.mjs +++ b/examples/mobile-viewer/viewer.mjs @@ -46,19 +46,13 @@ const PDFViewerApplication = { * @returns {Promise} - Returns the promise, which is resolved when document * is opened. */ - open(params) { + async open(params) { if (this.pdfLoadingTask) { - // We need to destroy already opened document - return this.close().then( - function () { - // ... and repeat the open() call. - return this.open(params); - }.bind(this) - ); + // We need to destroy already opened document. + await this.close(); } - const url = params.url; - const self = this; + const { url } = params; this.setTitleUsingUrl(url); // Loading document. @@ -70,24 +64,22 @@ const PDFViewerApplication = { }); this.pdfLoadingTask = loadingTask; - loadingTask.onProgress = function (progressData) { - self.progress(progressData.loaded / progressData.total); - }; + loadingTask.onProgress = evt => this.progress(evt.percent); return loadingTask.promise.then( - function (pdfDocument) { + pdfDocument => { // Document loaded, specifying document for the viewer. - self.pdfDocument = pdfDocument; - self.pdfViewer.setDocument(pdfDocument); - self.pdfLinkService.setDocument(pdfDocument); - self.pdfHistory.initialize({ + this.pdfDocument = pdfDocument; + this.pdfViewer.setDocument(pdfDocument); + this.pdfLinkService.setDocument(pdfDocument); + this.pdfHistory.initialize({ fingerprint: pdfDocument.fingerprints[0], }); - self.loadingBar.hide(); - self.setTitleUsingMetadata(pdfDocument); + this.loadingBar.hide(); + this.setTitleUsingMetadata(pdfDocument); }, - function (reason) { + reason => { let key = "pdfjs-loading-error"; if (reason instanceof pdfjsLib.InvalidPDFException) { key = "pdfjs-invalid-file-error"; @@ -96,10 +88,10 @@ const PDFViewerApplication = { ? "pdfjs-missing-file-error" : "pdfjs-unexpected-response-error"; } - self.l10n.get(key).then(msg => { - self.error(msg, { message: reason?.message }); + this.l10n.get(key).then(msg => { + this.error(msg, { message: reason.message }); }); - self.loadingBar.hide(); + this.loadingBar.hide(); } ); }, @@ -109,9 +101,9 @@ const PDFViewerApplication = { * @returns {Promise} - Returns the promise, which is resolved when all * destruction is completed. */ - close() { + async close() { if (!this.pdfLoadingTask) { - return Promise.resolve(); + return; } const promise = this.pdfLoadingTask.destroy(); @@ -128,7 +120,7 @@ const PDFViewerApplication = { } } - return promise; + await promise; }, get loadingBar() { @@ -152,48 +144,36 @@ const PDFViewerApplication = { this.setTitle(title); }, - setTitleUsingMetadata(pdfDocument) { - const self = this; - pdfDocument.getMetadata().then(function (data) { - const info = data.info, - metadata = data.metadata; - self.documentInfo = info; - self.metadata = metadata; - - // Provides some basic debug information - console.log( - "PDF " + - pdfDocument.fingerprints[0] + - " [" + - info.PDFFormatVersion + - " " + - (info.Producer || "-").trim() + - " / " + - (info.Creator || "-").trim() + - "]" + - " (PDF.js: " + - (pdfjsLib.version || "-") + - ")" - ); - - let pdfTitle; - if (metadata && metadata.has("dc:title")) { - const title = metadata.get("dc:title"); - // Ghostscript sometimes returns 'Untitled', so prevent setting the - // title to 'Untitled. - if (title !== "Untitled") { - pdfTitle = title; - } - } + async setTitleUsingMetadata(pdfDocument) { + const { info, metadata } = await pdfDocument.getMetadata(); + this.documentInfo = info; + this.metadata = metadata; + + // Provides some basic debug information + console.log( + `PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` + + `${(metadata?.get("pdf:producer") || info.Producer || "-").trim()} / ` + + `${(metadata?.get("xmp:creatortool") || info.Creator || "-").trim()}` + + `] (PDF.js: ${pdfjsLib.version || "?"} [${pdfjsLib.build || "?"}])` + ); - if (!pdfTitle && info && info.Title) { - pdfTitle = info.Title; + let pdfTitle; + if (metadata && metadata.has("dc:title")) { + const title = metadata.get("dc:title"); + // Ghostscript sometimes returns 'Untitled', so prevent setting the + // title to 'Untitled. + if (title !== "Untitled") { + pdfTitle = title; } + } - if (pdfTitle) { - self.setTitle(pdfTitle + " - " + document.title); - } - }); + if (!pdfTitle && info && info.Title) { + pdfTitle = info.Title; + } + + if (pdfTitle) { + this.setTitle(pdfTitle + " - " + document.title); + } }, setTitle: function pdfViewSetTitle(title) { @@ -223,8 +203,7 @@ const PDFViewerApplication = { console.error(`${message}\n\n${moreInfoText.join("\n")}`); }, - progress: function pdfViewProgress(level) { - const percent = Math.round(level * 100); + progress(percent) { // Updating the bar if value increases. if (percent > this.loadingBar.percent || isNaN(percent)) { this.loadingBar.percent = percent; diff --git a/examples/text-only/index.html b/examples/text-only/index.html index 2acbd553ea912..410307cc8a9d6 100644 --- a/examples/text-only/index.html +++ b/examples/text-only/index.html @@ -1,14 +1,13 @@ - + - - + + Text-only PDF.js example - - -

Text-only PDF.js example

-
-
- + + +

Text-only PDF.js example

+
+ diff --git a/examples/webpack/index.html b/examples/webpack/index.html index ed25387f2217a..a9ba7bd12e328 100644 --- a/examples/webpack/index.html +++ b/examples/webpack/index.html @@ -1,11 +1,11 @@ - + - - - webpack example - - - - - + + + webpack example + + + + + diff --git a/extensions/chromium/options/options.html b/extensions/chromium/options/options.html index bd18c2456465f..e83db6c62c6db 100644 --- a/extensions/chromium/options/options.html +++ b/extensions/chromium/options/options.html @@ -15,171 +15,171 @@ limitations under the License. --> - - -PDF.js viewer options - - - -
- + + + PDF.js viewer options + + + +
+ - + - + - + - + - + - + - + - + - + - + - - + + diff --git a/extensions/chromium/preferences_schema.json b/extensions/chromium/preferences_schema.json deleted file mode 100644 index 00a5070fdce54..0000000000000 --- a/extensions/chromium/preferences_schema.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "type": "object", - "properties": { - "viewerCssTheme": { - "title": "Theme", - "description": "The theme to use.\n0 = Use system theme.\n1 = Light theme.\n2 = Dark theme.", - "type": "integer", - "enum": [0, 1, 2], - "default": 2 - }, - "showPreviousViewOnLoad": { - "description": "DEPRECATED. Set viewOnLoad to 1 to disable showing the last page/position on load.", - "type": "boolean", - "default": true - }, - "viewOnLoad": { - "title": "View position on load", - "description": "The position in the document upon load.\n -1 = Default (uses OpenAction if available, otherwise equal to `viewOnLoad = 0`).\n 0 = The last viewed page/position.\n 1 = The initial page/position.", - "type": "integer", - "enum": [-1, 0, 1], - "default": 0 - }, - "defaultZoomDelay": { - "title": "Default zoom delay", - "description": "Delay (in ms) to wait before redrawing the canvas.", - "type": "integer", - "default": 400 - }, - "defaultZoomValue": { - "title": "Default zoom level", - "description": "Default zoom level of the viewer. Accepted values: 'auto', 'page-actual', 'page-width', 'page-height', 'page-fit', or a zoom level in percents.", - "type": "string", - "pattern": "|auto|page-actual|page-width|page-height|page-fit|[0-9]+\\.?[0-9]*(,[0-9]+\\.?[0-9]*){0,2}", - "default": "" - }, - "sidebarViewOnLoad": { - "title": "Sidebar state on load", - "description": "Controls the state of the sidebar upon load.\n -1 = Default (uses PageMode if available, otherwise the last position if available/enabled).\n 0 = Do not show sidebar.\n 1 = Show thumbnails in sidebar.\n 2 = Show document outline in sidebar.\n 3 = Show attachments in sidebar.", - "type": "integer", - "enum": [-1, 0, 1, 2, 3], - "default": -1 - }, - "enableHandToolOnLoad": { - "description": "DEPRECATED. Set cursorToolOnLoad to 1 to enable the hand tool by default.", - "type": "boolean", - "default": false - }, - "enableHWA": { - "title": "Enable hardware acceleration", - "description": "Whether to enable hardware acceleration.", - "type": "boolean", - "default": true - }, - "enableAltText": { - "type": "boolean", - "default": false - }, - "enableGuessAltText": { - "type": "boolean", - "default": true - }, - "enableAltTextModelDownload": { - "type": "boolean", - "default": true - }, - "enableNewAltTextWhenAddingImage": { - "type": "boolean", - "default": true - }, - "altTextLearnMoreUrl": { - "type": "string", - "default": "" - }, - "enableSignatureEditor": { - "type": "boolean", - "default": false - }, - "enableUpdatedAddImage": { - "type": "boolean", - "default": false - }, - "cursorToolOnLoad": { - "title": "Cursor tool on load", - "description": "The cursor tool that is enabled upon load.\n 0 = Text selection tool.\n 1 = Hand tool.", - "type": "integer", - "enum": [0, 1], - "default": 0 - }, - "pdfBugEnabled": { - "title": "Enable debugging tools", - "description": "Whether to enable debugging tools.", - "type": "boolean", - "default": false - }, - "enableScripting": { - "title": "Enable active content (JavaScript) in PDFs", - "type": "boolean", - "description": "Whether to allow execution of active content (JavaScript) by PDF files.", - "default": false - }, - "enableHighlightFloatingButton": { - "type": "boolean", - "default": false - }, - "highlightEditorColors": { - "type": "string", - "default": "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F,yellow_HCM=#FFFFCC,green_HCM=#53FFBC,blue_HCM=#80EBFF,pink_HCM=#F6B8FF,red_HCM=#C50043" - }, - "disableRange": { - "title": "Disable range requests", - "description": "Whether to disable range requests (not recommended).", - "type": "boolean", - "default": false - }, - "disableStream": { - "title": "Disable streaming for requests", - "description": "Whether to disable streaming for requests (not recommended).", - "type": "boolean", - "default": false - }, - "disableAutoFetch": { - "type": "boolean", - "default": false - }, - "disableFontFace": { - "title": "Disable @font-face", - "description": "Whether to disable @font-face and fall back to canvas rendering (this is more resource-intensive).", - "type": "boolean", - "default": false - }, - "disableTextLayer": { - "description": "DEPRECATED. Set textLayerMode to 0 to disable the text selection layer by default.", - "type": "boolean", - "default": false - }, - "textLayerMode": { - "title": "Text layer mode", - "description": "Controls if the text layer is enabled, and the selection mode that is used.\n 0 = Disabled.\n 1 = Enabled.", - "type": "integer", - "enum": [0, 1], - "default": 1 - }, - "externalLinkTarget": { - "title": "External links target window", - "description": "Controls how external links will be opened.\n 0 = default.\n 1 = replaces current window.\n 2 = new window/tab.\n 3 = parent.\n 4 = in top window.", - "type": "integer", - "enum": [0, 1, 2, 3, 4], - "default": 0 - }, - "disablePageLabels": { - "type": "boolean", - "default": false - }, - "disablePageMode": { - "description": "DEPRECATED.", - "type": "boolean", - "default": false - }, - "disableTelemetry": { - "title": "Disable telemetry", - "type": "boolean", - "description": "Whether to prevent the extension from reporting the extension and browser version to the extension developers.", - "default": false - }, - "annotationMode": { - "type": "integer", - "enum": [0, 1, 2, 3], - "default": 1 - }, - "annotationEditorMode": { - "type": "integer", - "enum": [-1, 0, 3, 15], - "default": 0 - }, - "capCanvasAreaFactor": { - "type": "integer", - "default": 200 - }, - "enablePermissions": { - "type": "boolean", - "default": false - }, - "enableXfa": { - "type": "boolean", - "default": true - }, - "historyUpdateUrl": { - "type": "boolean", - "default": false - }, - "ignoreDestinationZoom": { - "title": "Ignore the zoom argument in destinations", - "description": "When enabled it will maintain the currently active zoom level, rather than letting the PDF document modify it, when navigating to internal destinations.", - "type": "boolean", - "default": false - }, - "enablePrintAutoRotate": { - "title": "Automatically rotate printed pages", - "description": "When enabled, landscape pages are rotated when printed.", - "type": "boolean", - "default": true - }, - "scrollModeOnLoad": { - "title": "Scroll mode on load", - "description": "Controls how the viewer scrolls upon load.\n -1 = Default (uses the last position if available/enabled).\n 3 = Page scrolling.\n 0 = Vertical scrolling.\n 1 = Horizontal scrolling.\n 2 = Wrapped scrolling.", - "type": "integer", - "enum": [-1, 0, 1, 2, 3], - "default": -1 - }, - "spreadModeOnLoad": { - "title": "Spread mode on load", - "description": "Whether the viewer should join pages into spreads upon load.\n -1 = Default (uses the last position if available/enabled).\n 0 = No spreads.\n 1 = Odd spreads.\n 2 = Even spreads.", - "type": "integer", - "enum": [-1, 0, 1, 2], - "default": -1 - }, - "forcePageColors": { - "description": "When enabled, the pdf rendering will use the high contrast mode colors", - "type": "boolean", - "default": false - }, - "pageColorsBackground": { - "description": "The color is a string as defined in CSS. Its goal is to help improve readability in high contrast mode", - "type": "string", - "default": "Canvas" - }, - "pageColorsForeground": { - "description": "The color is a string as defined in CSS. Its goal is to help improve readability in high contrast mode", - "type": "string", - "default": "CanvasText" - }, - "enableAutoLinking": { - "description": "Enable creation of hyperlinks from text that look like URLs.", - "type": "boolean", - "default": true - }, - "enableComment": { - "description": "Enable creation of comment annotations.", - "type": "boolean", - "default": false - }, - "enableOptimizedPartialRendering": { - "description": "Enable tracking of PDF operations to optimize partial rendering.", - "type": "boolean", - "default": false - } - } -} diff --git a/external/builder/builder.mjs b/external/builder/builder.mjs index 929a9cf87bab3..6d35c950e7420 100644 --- a/external/builder/builder.mjs +++ b/external/builder/builder.mjs @@ -39,15 +39,22 @@ function preprocess(inFilename, outFilename, defines) { } function expandCssImports(content, baseUrl) { + if (defines.GECKOVIEW) { + // In Geckoview, we don't need some styles. + const startComment = "/* Ignored in GECKOVIEW: begin */"; + const endComment = "/* Ignored in GECKOVIEW: end */"; + const beginIndex = content.indexOf(startComment); + const endIndex = content.indexOf(endComment); + if (beginIndex >= 0 && endIndex > beginIndex) { + content = + content.substring(0, beginIndex) + + content.substring(endIndex + endComment.length); + } + } + return content.replaceAll( /^\s*@import\s+url\(([^)]+)\);\s*$/gm, function (all, url) { - if (defines.GECKOVIEW) { - switch (url) { - case "annotation_editor_layer_builder.css": - return ""; - } - } const file = path.join(path.dirname(baseUrl), url); const imported = fs.readFileSync(file, "utf8").toString(); return expandCssImports(imported, file); @@ -151,7 +158,7 @@ function preprocess(inFilename, outFilename, defines) { let state = STATE_NONE; const stack = []; const control = - /^(?:\/\/|\s*\/\*|)?$)?/; + /^(?:\/\/|\s*\/\*|\s*)?$)?/; while ((line = readLine()) !== null) { ++lineNumber; @@ -213,7 +220,7 @@ function preprocess(inFilename, outFilename, defines) { ) { writeLine( line - .replaceAll(/^\/\/|^$/g, "") ); diff --git a/external/chromium/prefs.mjs b/external/chromium/prefs.mjs new file mode 100644 index 0000000000000..63e3b10e89910 --- /dev/null +++ b/external/chromium/prefs.mjs @@ -0,0 +1,270 @@ +/* Copyright 2026 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const prefsMetadata = { + annotationEditorMode: { + enum: [-1, 0, 3, 15], + }, + annotationMode: { + enum: [0, 1, 2, 3], + }, + cursorToolOnLoad: { + title: "Cursor tool on load", + description: + "The cursor tool that is enabled upon load.\n 0 = Text selection tool.\n 1 = Hand tool.", + enum: [0, 1], + }, + defaultZoomDelay: { + title: "Default zoom delay", + description: "Delay (in ms) to wait before redrawing the canvas.", + }, + defaultZoomValue: { + title: "Default zoom level", + description: + "Default zoom level of the viewer. Accepted values: 'auto', 'page-actual', 'page-width', 'page-height', 'page-fit', or a zoom level in percents.", + pattern: + "|auto|page-actual|page-width|page-height|page-fit|[0-9]+\\.?[0-9]*(,[0-9]+\\.?[0-9]*){0,2}", + }, + disableFontFace: { + title: "Disable @font-face", + description: + "Whether to disable @font-face and fall back to canvas rendering (this is more resource-intensive).", + }, + disableRange: { + title: "Disable range requests", + description: "Whether to disable range requests (not recommended).", + }, + disableStream: { + title: "Disable streaming for requests", + description: "Whether to disable streaming for requests (not recommended).", + }, + disableTelemetry: { + title: "Disable telemetry", + description: + "Whether to prevent the extension from reporting the extension and browser version to the extension developers.", + }, + enableAutoLinking: { + description: "Enable creation of hyperlinks from text that look like URLs.", + }, + enableComment: { + description: "Enable creation of comment annotations.", + }, + enableHWA: { + title: "Enable hardware acceleration", + description: "Whether to enable hardware acceleration.", + }, + enableOptimizedPartialRendering: { + description: + "Enable tracking of PDF operations to optimize partial rendering.", + }, + enablePrintAutoRotate: { + title: "Automatically rotate printed pages", + description: "When enabled, landscape pages are rotated when printed.", + }, + enableScripting: { + title: "Enable active content (JavaScript) in PDFs", + description: + "Whether to allow execution of active content (JavaScript) by PDF files.", + }, + externalLinkTarget: { + title: "External links target window", + description: + "Controls how external links will be opened.\n 0 = default.\n 1 = replaces current window.\n 2 = new window/tab.\n 3 = parent.\n 4 = in top window.", + enum: [0, 1, 2, 3, 4], + }, + forcePageColors: { + description: + "When enabled, the pdf rendering will use the high contrast mode colors", + }, + ignoreDestinationZoom: { + title: "Ignore the zoom argument in destinations", + description: + "When enabled it will maintain the currently active zoom level, rather than letting the PDF document modify it, when navigating to internal destinations.", + }, + pageColorsBackground: { + description: + "The color is a string as defined in CSS. Its goal is to help improve readability in high contrast mode", + }, + pageColorsForeground: { + description: + "The color is a string as defined in CSS. Its goal is to help improve readability in high contrast mode", + }, + pdfBugEnabled: { + title: "Enable debugging tools", + description: "Whether to enable debugging tools.", + }, + scrollModeOnLoad: { + title: "Scroll mode on load", + description: + "Controls how the viewer scrolls upon load.\n -1 = Default (uses the last position if available/enabled).\n 0 = Vertical scrolling.\n 1 = Horizontal scrolling.\n 2 = Wrapped scrolling.\n 3 = Page scrolling.", + enum: [-1, 0, 1, 2, 3], + }, + sidebarViewOnLoad: { + title: "Sidebar state on load", + description: + "Controls the state of the sidebar upon load.\n -1 = Default (uses PageMode if available, otherwise the last position if available/enabled).\n 0 = Do not show sidebar.\n 1 = Show thumbnails in sidebar.\n 2 = Show document outline in sidebar.\n 3 = Show attachments in sidebar.", + enum: [-1, 0, 1, 2, 3], + }, + spreadModeOnLoad: { + title: "Spread mode on load", + description: + "Whether the viewer should join pages into spreads upon load.\n -1 = Default (uses the last position if available/enabled).\n 0 = No spreads.\n 1 = Odd spreads.\n 2 = Even spreads.", + enum: [-1, 0, 1, 2], + }, + textLayerMode: { + title: "Text layer mode", + description: + "Controls if the text layer is enabled, and the selection mode that is used.\n 0 = Disabled.\n 1 = Enabled.", + enum: [0, 1], + }, + viewerCssTheme: { + title: "Theme", + description: + "The theme to use.\n0 = Use system theme.\n1 = Light theme.\n2 = Dark theme.", + enum: [0, 1, 2], + }, + viewOnLoad: { + title: "View position on load", + description: + "The position in the document upon load.\n -1 = Default (uses OpenAction if available, otherwise equal to `viewOnLoad = 0`).\n 0 = The last viewed page/position.\n 1 = The initial page/position.", + enum: [-1, 0, 1], + }, +}; + +// Deprecated keys are allowed in the managed preferences file. +// The code maintainer is responsible for adding migration logic to +// extensions/chromium/options/migration.js and web/chromecom.js . +const deprecatedPrefs = { + disablePageMode: { + description: "DEPRECATED.", + type: "boolean", + default: false, + }, + disableTextLayer: { + description: + "DEPRECATED. Set textLayerMode to 0 to disable the text selection layer by default.", + type: "boolean", + default: false, + }, + enableHandToolOnLoad: { + description: + "DEPRECATED. Set cursorToolOnLoad to 1 to enable the hand tool by default.", + type: "boolean", + default: false, + }, + showPreviousViewOnLoad: { + description: + "DEPRECATED. Set viewOnLoad to 1 to disable showing the last page/position on load.", + type: "boolean", + default: true, + }, +}; + +function buildPrefsSchema(prefs) { + const properties = Object.create(null); + + for (const name in prefs) { + const pref = prefs[name]; + let type = typeof pref; + + switch (type) { + case "boolean": + case "string": + break; + case "number": + type = "integer"; + break; + default: + throw new Error(`Invalid type (${type}) for "${name}"-preference.`); + } + + const metadata = prefsMetadata[name]; + if (metadata) { + let numMetadataKeys = 0; + // Do some (very basic) validation of the metadata. + for (const key in metadata) { + const entry = metadata[key]; + + switch (key) { + case "default": + case "type": + throw new Error( + `Invalid key (${key}) in metadata for "${name}"-preference.` + ); + case "description": + if (entry.startsWith("DEPRECATED.")) { + throw new Error( + `The \`description\` of the "${name}"-preference cannot begin with "DEPRECATED."` + ); + } + break; + } + numMetadataKeys++; + } + if (numMetadataKeys === 0) { + throw new Error( + `No metadata for "${name}"-preference, remove the entry.` + ); + } + } + + properties[name] = { + type, + default: pref, + ...metadata, + }; + } + + for (const name in prefsMetadata) { + if (!properties[name]) { + // Do *not* throw here, since keeping the metadata up-to-date should be + // the responsibility of the CHROMIUM-addon maintainer. + console.error( + `The "${name}"-preference was removed, add it to \`deprecatedPrefs\` instead.\n` + ); + } + } + + for (const name in deprecatedPrefs) { + const entry = deprecatedPrefs[name]; + + if (properties[name]) { + throw new Error( + `The "${name}"-preference should not be listed as deprecated.` + ); + } + if (!entry.description?.startsWith("DEPRECATED.")) { + throw new Error( + `The \`description\` of the deprecated "${name}"-preference must begin with "DEPRECATED."` + ); + } + for (const key of ["default", "type"]) { + if (key in entry) { + continue; + } + throw new Error( + `A \`${key}\` entry must be provided for the deprecated "${name}"-preference.` + ); + } + properties[name] = entry; + } + + return { + type: "object", + properties, + }; +} + +export { buildPrefsSchema }; diff --git a/external/jbig2/LICENSE_JBIG2 b/external/jbig2/LICENSE_JBIG2 new file mode 100644 index 0000000000000..37a329c636c65 --- /dev/null +++ b/external/jbig2/LICENSE_JBIG2 @@ -0,0 +1,196 @@ +// Copyright 2014 The PDFium Authors +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + Copyright [yyyy] [name of copyright owner] + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + https://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/external/jbig2/LICENSE_PDFJS_JBIG2 b/external/jbig2/LICENSE_PDFJS_JBIG2 new file mode 100644 index 0000000000000..f1845baf6613d --- /dev/null +++ b/external/jbig2/LICENSE_PDFJS_JBIG2 @@ -0,0 +1,13 @@ +Copyright 2026 Mozilla Foundation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/external/jbig2/README.md b/external/jbig2/README.md new file mode 100644 index 0000000000000..3736c91ee70e5 --- /dev/null +++ b/external/jbig2/README.md @@ -0,0 +1,12 @@ +## Build + +In order to generate the file `jbig2.js`: +* git clone https://github.com/mozilla/pdf.js.jbig2/ +* the build requires to have a [Docker](https://www.docker.com/) setup and then: + * `node build.js -C` to build the Docker image + * `node build.js -co /pdf.js/external/jbig2/` to compile the decoder + +## Licensing + +[PDFium](https://pdfium.googlesource.com/pdfium/) is under [Apache-2.0](https://pdfium.googlesource.com/pdfium/+/main/LICENSE) +and [pdf.js.jbig2](https://github.com/mozilla/pdf.js.jbig2/) is released under [Apache-2.0](https://github.com/mozilla/pdf.js.jbig2/blob/main/LICENSE) license so `jbig2.js` is released under [Apache-2.0](https://github.com/mozilla/pdf.js.jbig2/blob/main/LICENSE) license too. diff --git a/external/jbig2/jbig2.js b/external/jbig2/jbig2.js new file mode 100644 index 0000000000000..2e937eaf06562 --- /dev/null +++ b/external/jbig2/jbig2.js @@ -0,0 +1,3 @@ +/* THIS FILE IS GENERATED - DO NOT EDIT */ +async function JBig2(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var readyPromiseResolve,readyPromiseReject;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["h"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("jbig2.wasm")}return new URL("jbig2.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};function _setImageData(array_ptr,pitch8,pitch32,height){if(pitch32===pitch8){Module.imageData=new Uint8ClampedArray(HEAPU8.subarray(array_ptr,array_ptr+pitch32*height));return}const destSize=pitch8*height;const imageData=Module.imageData=new Uint8ClampedArray(destSize);for(let srcStart=array_ptr,destStart=0;destStart{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jbig2_decode,__emscripten_timeout,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_malloc=Module["_malloc"]=wasmExports["i"];_free=Module["_free"]=wasmExports["j"];_jbig2_decode=Module["_jbig2_decode"]=wasmExports["k"];__emscripten_timeout=wasmExports["l"];memory=wasmMemory=wasmExports["g"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={e:__abort_js,b:__emscripten_runtime_keepalive_clear,c:__setitimer_js,d:_emscripten_resize_heap,a:_proc_exit,f:_setImageData};function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=await (createWasm());run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} +;return moduleRtn}export default JBig2; diff --git a/external/jbig2/jbig2.wasm b/external/jbig2/jbig2.wasm new file mode 100644 index 0000000000000..04a4a374f9196 Binary files /dev/null and b/external/jbig2/jbig2.wasm differ diff --git a/external/openjpeg/openjpeg.js b/external/openjpeg/openjpeg.js index ca4a431d48c74..56f3e1de63efd 100644 --- a/external/openjpeg/openjpeg.js +++ b/external/openjpeg/openjpeg.js @@ -1,15 +1,3 @@ /* THIS FILE IS GENERATED - DO NOT EDIT */ -var OpenJPEG = (() => { - - return ( -async function(moduleArg = {}) { - var moduleRtn; - -var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["t"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("openjpeg.wasm")}return new URL("openjpeg.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["s"];updateMemoryViews();removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{resolve(receiveInstance(mod,inst))})})}wasmBinaryFile??=findWasmBinary();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}catch(e){readyPromiseReject(e);return Promise.reject(e)}}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};function _copy_pixels_1(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);imageData.set(compG)}function _copy_pixels_3(compR_ptr,compG_ptr,compB_ptr,nb_pixels){compR_ptr>>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*3);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var _fd_close=fd=>52;var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);return 70}var printCharBuffers=[null,[],[]];var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead=NaN)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer));buffer.length=0}else{buffer.push(curr)}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0};function _gray_to_rgba(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);for(let i=0;i>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"]}Module["writeArrayToMemory"]=writeArrayToMemory;var wasmImports={l:__abort_js,k:__emscripten_runtime_keepalive_clear,m:__setitimer_js,g:_copy_pixels_1,f:_copy_pixels_3,e:_copy_pixels_4,n:_emscripten_resize_heap,p:_environ_get,q:_environ_sizes_get,b:_fd_close,o:_fd_seek,c:_fd_write,r:_gray_to_rgba,i:_graya_to_rgba,d:_jsPrintWarning,j:_proc_exit,h:_rgb_to_rgba,a:_storeErrorMessage};var wasmExports=await createWasm();var ___wasm_call_ctors=wasmExports["t"];var _malloc=Module["_malloc"]=wasmExports["u"];var _free=Module["_free"]=wasmExports["v"];var _jp2_decode=Module["_jp2_decode"]=wasmExports["w"];var __emscripten_timeout=wasmExports["x"];function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}function preInit(){if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}preInit();run();moduleRtn=readyPromise; - - - return moduleRtn; -} -); -})(); -export default OpenJPEG; +async function OpenJPEG(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var readyPromiseResolve,readyPromiseReject;var wasmMemory;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["s"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("openjpeg.wasm")}return new URL("openjpeg.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["r"];updateMemoryViews();assignWasmExports(wasmExports);return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{resolve(receiveInstance(mod,inst))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};function _copy_pixels_1(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);imageData.set(compG)}function _copy_pixels_3(compR_ptr,compG_ptr,compB_ptr,nb_pixels){compR_ptr>>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*3);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.language||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);return 70}var printCharBuffers=[null,[],[]];var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder:undefined;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer));buffer.length=0}else{buffer.push(curr)}};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0};function _gray_to_rgba(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);for(let i=0;i>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jp2_decode,__emscripten_timeout;function assignWasmExports(wasmExports){Module["_malloc"]=_malloc=wasmExports["t"];Module["_free"]=_free=wasmExports["u"];Module["_jp2_decode"]=_jp2_decode=wasmExports["v"];__emscripten_timeout=wasmExports["w"]}var wasmImports={k:__abort_js,j:__emscripten_runtime_keepalive_clear,l:__setitimer_js,f:_copy_pixels_1,e:_copy_pixels_3,d:_copy_pixels_4,m:_emscripten_resize_heap,o:_environ_get,p:_environ_sizes_get,n:_fd_seek,b:_fd_write,q:_gray_to_rgba,h:_graya_to_rgba,c:_jsPrintWarning,i:_proc_exit,g:_rgb_to_rgba,a:_storeErrorMessage};function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=await (createWasm());run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} +;return moduleRtn}export default OpenJPEG; diff --git a/external/openjpeg/openjpeg.wasm b/external/openjpeg/openjpeg.wasm index d40cd9ef1ad17..378df79b58557 100644 Binary files a/external/openjpeg/openjpeg.wasm and b/external/openjpeg/openjpeg.wasm differ diff --git a/external/openjpeg/openjpeg_nowasm_fallback.js b/external/openjpeg/openjpeg_nowasm_fallback.js index f90afc938e6d5..9df64ca514648 100644 --- a/external/openjpeg/openjpeg_nowasm_fallback.js +++ b/external/openjpeg/openjpeg_nowasm_fallback.js @@ -1,29 +1,17 @@ /* THIS FILE IS GENERATED - DO NOT EDIT */ -var OpenJPEG = (() => { - - return ( -function(moduleArg = {}) { - var moduleRtn; - -var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( +async function OpenJPEG(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";var readAsync;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( // EMSCRIPTEN_START_ASM -function instantiate(Ba){var a;var b=new Uint8Array(123);for(var c=25;c>=0;--c){b[48+c]=52+c;b[65+c]=c;b[97+c]=26+c}b[43]=62;b[47]=63;function i(j,k,l){var d,e,c=0,f=k,g=l.length,h=k+(g*3>>2)-(l[g-2]=="=")-(l[g-1]=="=");for(;c>4;if(f>2;if(f>>0;A=A>>>0;if(z+A>a.length)throw"trap: invalid memory.fill";a.fill(v,z,z+A)}function B(z,C,A){a.copyWithin(z,C,C+A)}function D(){throw new Error("abort")}function Aa(n){var E=new ArrayBuffer(16777216);var F=new Int8Array(E);var G=new Int16Array(E);var H=new Int32Array(E);var I=new Uint8Array(E);var J=new Uint16Array(E);var K=new Uint32Array(E);var L=new Float32Array(E);var M=new Float64Array(E);var N=Math.imul;var O=Math.fround;var P=Math.abs;var Q=Math.clz32;var R=Math.min;var S=Math.max;var T=Math.floor;var U=Math.ceil;var V=Math.trunc;var W=Math.sqrt;var X=n.a;var Y=X.a;var Z=X.b;var _=X.c;var $=X.d;var aa=X.e;var ba=X.f;var ca=X.g;var da=X.h;var ea=X.i;var fa=X.j;var ga=X.k;var ha=X.l;var ia=X.m;var ja=X.n;var ka=X.o;var la=X.p;var ma=X.q;var na=X.r;var oa=94352;var pa=0;var qa=0;var ra=0; +function instantiate(Aa){var a;var b=new Uint8Array(123);for(var c=25;c>=0;--c){b[48+c]=52+c;b[65+c]=c;b[97+c]=26+c}b[43]=62;b[47]=63;function i(j,k,l){var d,e,c=0,f=k,g=l.length,h=k+(g*3>>2)-(l[g-2]=="=")-(l[g-1]=="=");for(;c>4;if(f>2;if(f>>0;A=A>>>0;if(z+A>a.length)throw"trap: invalid memory.fill";a.fill(v,z,z+A)}function B(z,C,A){a.copyWithin(z,C,C+A)}function D(){throw new Error("abort")}function za(n){var E=new ArrayBuffer(16777216);var F=new Int8Array(E);var G=new Int16Array(E);var H=new Int32Array(E);var I=new Uint8Array(E);var J=new Uint16Array(E);var K=new Uint32Array(E);var L=new Float32Array(E);var M=new Float64Array(E);var N=Math.imul;var O=Math.fround;var P=Math.abs;var Q=Math.clz32;var R=Math.min;var S=Math.max;var T=Math.floor;var U=Math.ceil;var V=Math.trunc;var W=Math.sqrt;var X=n.a;var Y=X.a;var Z=X.b;var _=X.c;var $=X.d;var aa=X.e;var ba=X.f;var ca=X.g;var da=X.h;var ea=X.i;var fa=X.j;var ga=X.k;var ha=X.l;var ia=X.m;var ja=X.n;var ka=X.o;var la=X.p;var ma=X.q;var na=94352;var oa=0;var pa=0;var qa=0; // EMSCRIPTEN_START_FUNCS -function fd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,M=0,P=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=O(0),ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,pa=0,qa=0,ra=0,ta=0,ua=0,va=0,wa=0,xa=0;aa=oa-96|0;oa=aa;E=H[a+8>>2];a:{b:{c:{if(!H[a>>2]){g=N(H[E+16>>2]-H[E+8>>2]|0,H[E+20>>2]-H[E+12>>2]|0)<<2;c=Ja(g);H[E+60>>2]=c;if(!c){Ca(H[a+32>>2],1,8023,0);d=a+28|0;break b}if(!g){break c}y(c,0,g);break c}c=H[E+60>>2];if(!c){break c}Da(c);H[E+60>>2]=0}if(!H[H[a+28>>2]>>2]){break a}qa=H[a+16>>2];c=H[qa+28>>2]+N(H[qa+24>>2],152)|0;wa=H[c-152>>2];xa=H[c-144>>2];ra=H[a+20>>2];ta=H[a+12>>2];va=H[a+4>>2];d=a+28|0;d:{q=H[b+4>>2];e=0;e:{if((q|0)<=0){break e}l=H[b>>2];c=0;f:{while(1){g=l+N(c,12)|0;if(!H[g>>2]){break f}c=c+1|0;if((q|0)!=(c|0)){continue}break}e=0;break e}e=H[g+4>>2]}if(e){break d}e=Fa(1,156);if(!e){Ca(H[a+32>>2],1,6313,0);break b}H[e+140>>2]=0;c=0;l=H[b+4>>2];g:{if((l|0)==2147483647){break g}g=H[b>>2];if((l|0)>0){while(1){q=g+N(c,12)|0;if(!H[q>>2]){l=H[q+8>>2];if(l){sa[l|0](H[q+4>>2]);g=H[b>>2]}b=g+N(c,12)|0;H[b+8>>2]=15;H[b+4>>2]=e;c=1;break g}c=c+1|0;if((l|0)!=(c|0)){continue}break}}g=Ia(g,N(l,12)+12|0);c=0;if(!g){break g}H[b>>2]=g;c=H[b+4>>2];g=g+N(c,12)|0;H[g+8>>2]=15;H[g+4>>2]=e;H[g>>2]=0;H[b+4>>2]=c+1;c=1}if(c){break d}Ca(H[a+32>>2],1,8338,0);b=H[e+116>>2];if(b){Da(b);H[e+116>>2]=0}b=H[e+120>>2];if(b){Da(b);H[e+120>>2]=0}Da(H[e+148>>2]);Da(e);break b}H[e+144>>2]=H[a+24>>2];W=H[a+40>>2];ba=H[a+36>>2];R=H[a+32>>2];P=H[ra+808>>2];b=H[ta+16>>2];h:{Z=H[ra+16>>2];i:{if(Z&64){l=oa-304|0;oa=l;j:{if(P){if(ba){Ca(R,1,3219,0);break j}Ca(R,1,3219,0);break j}j=H[e+116>>2];c=H[E+20>>2]-H[E+12>>2]|0;b=H[E+16>>2]-H[E+8>>2]|0;g=N(c,b);k:{l:{if(g>>>0>K[e+132>>2]){Da(j);f=g<<2;j=Ja(f);H[e+116>>2]=j;if(!j){j=0;break j}H[e+132>>2]=g;break l}if(!j){break k}f=g<<2}if(!f){break k}y(j,0,f)}j=H[e+120>>2];m:{if(K[e+136>>2]>2639){break m}Da(j);j=Ja(10560);H[e+120>>2]=j;if(j){break m}j=0;break j}H[e+136>>2]=2640;y(j,0,10560);H[e+128>>2]=c;H[e+124>>2]=b;n=H[E+24>>2];if(!n){j=1;break j}q=H[E+28>>2];j=1;n:{o:{p:{q:{f=H[E+52>>2];r:{if(f){c=H[E+4>>2];j=0;if(f>>>0>=4){b=f&-4;while(1){g=c+(m<<3)|0;j=H[g+28>>2]+(H[g+20>>2]+(H[g+12>>2]+(H[g+4>>2]+j|0)|0)|0)|0;m=m+4|0;z=z+4|0;if((b|0)!=(z|0)){continue}break}}b=f&3;if(b){while(1){j=H[(c+(m<<3)|0)+4>>2]+j|0;m=m+1|0;k=k+1|0;if((b|0)!=(k|0)){continue}break}}if(!H[e+144>>2]&(f|0)==1){break o}if(K[e+152>>2]>=j>>>0){break r}z=Ia(H[e+148>>2],j);if(z){break q}j=0;break j}if(!H[e+144>>2]){break j}}z=H[e+148>>2];if(z){break p}j=0;break j}H[e+152>>2]=j;H[e+148>>2]=z}if(!H[E+52>>2]){j=0;break n}f=H[E+4>>2];j=0;m=0;while(1){g=m<<3;c=g+f|0;b=H[c+4>>2];if(b){B(j+z|0,H[c>>2],b)}f=H[E+4>>2];j=H[(g+f|0)+4>>2]+j|0;m=m+1|0;if(m>>>0>2]){continue}break}break n}z=H[H[E+4>>2]>>2]}m=0;f=0;c=H[E+40>>2];g=0;s:{if(!c){break s}b=H[E>>2];f=H[b+8>>2];g=0;if((c|0)==1){break s}g=H[b+32>>2]}c=n-q|0;f=f+g|0;t:{if(!f){k=0;break t}m=1;b=H[E>>2];r=H[b>>2];k=0;if((f|0)==1){m=0;break t}k=H[b+24>>2]}S=c+1|0;ia=H[e+116>>2];$=H[e+120>>2];W=H[E+12>>2];t=H[E+20>>2];M=H[E+8>>2];ja=H[E+16>>2];u:{v:{w:{x:{y:{z:{A:{B:{if(!(!m|k)){if(!ba){break B}Ca(R,2,10806,0);f=1;break A}if(f>>>0<4){break A}if(ba){H[l+112>>2]=f;Ca(R,1,9590,l+112|0);break u}H[l+96>>2]=f;Ca(R,1,9590,l+96|0);j=0;break j}Ca(R,2,10806,0);m=H[E+24>>2];if(m>>>0>30){break z}P=1;if(m>>>0>=S>>>0){break x}break v}m=H[E+24>>2];if(m>>>0<=30){break y}if(!ba){break z}H[l+32>>2]=H[E+24>>2];Ca(R,1,12302,l+32|0);break u}H[l>>2]=m;Ca(R,1,12302,l);j=0;break j}if(m>>>0>>0){break w}if(f>>>0<2){P=f;break x}if((m|0)!=(S|0)){P=f;break x}P=1;if(I[26384]){break x}if(!ba){F[26384]=1;H[l+64>>2]=f;Ca(R,2,10299,l- -64|0);break x}if(!I[26384]){F[26384]=1;H[l+80>>2]=f;Ca(R,2,10299,l+80|0)}}if(!(!(r>>>0<2|j>>>0>>0)&k+r>>>0<=j>>>0)){if(ba){j=0;Ca(R,1,9532,0);break j}j=0;Ca(R,1,9532,0);break j}T=r+z|0;b=I[T-1|0];j=b<<4|I[T-2|0]&15;if(!(!(j>>>0<2|(b|0)==255)&(j|0)<=(r|0))){if(ba){j=0;Ca(R,1,15305,0);break j}j=0;Ca(R,1,15305,0);break j}ua=H[E+28>>2];H[l+272>>2]=0;H[l+280>>2]=0;H[l+264>>2]=0;H[l+268>>2]=0;H[l+296>>2]=0;H[l+300>>2]=0;H[l+284>>2]=0;H[l+288>>2]=0;c=j-1|0;H[l+276>>2]=c;f=(r+z|0)-j|0;H[l+256>>2]=f;q=I[f|0];b=8;H[l+272>>2]=8;i=f+1|0;H[l+256>>2]=i;g=j-2|0;H[l+276>>2]=g;n=(c|0)==1?q|15:q;c=0;q=c;H[l+264>>2]=n;H[l+268>>2]=c;H[l+280>>2]=!c&(n|0)==255;h=f&3;C:{D:{if((h|0)==3){break D}w=0;if(!((n|0)!=255|(c|0)!=0|I[i|0]<=143)){break C}c=255;c=j>>>0>=3?I[i|0]:c;m=j-3|0;H[l+276>>2]=m;f=!q&(n|0)==255;b=f?15:16;H[l+272>>2]=b;V=i+(j>>>0>2)|0;H[l+256>>2]=V;c=(g|0)==1?c|15:c;g=0;H[l+280>>2]=!g&(c|0)==255;g=c;i=n;c=f?7:8;f=c&31;if((c&63)>>>0>=32){U=i<>>32-f|q<>2]=n;H[l+268>>2]=c;if((h|0)==2){break D}f=255;w=0;if(!((g|0)!=255|(x|0)!=0|I[V|0]<=143)){break C}f=j>>>0>=4?I[V|0]:f;i=j-4|0;H[l+276>>2]=i;u=V+(j>>>0>3)|0;H[l+256>>2]=u;c=(m|0)==1?f|15:f;f=0;V=f;H[l+280>>2]=!f&(c|0)==255;f=!x&(g|0)==255;b=(f?7:8)+b|0;H[l+272>>2]=b;g=c;m=n;c=f?7:8;f=c&31;if((c&63)>>>0>=32){x=m<>>32-f|q<>2]=n;H[l+268>>2]=c;if((h|0)==1){break D}w=0;if(!((g|0)!=255|(V|0)!=0|I[u|0]<=143)){break C}c=255;c=j>>>0>=5?I[u|0]:c;H[l+276>>2]=j-5;H[l+256>>2]=u+(j>>>0>4);f=0;c=(i|0)==1?c|15:c;H[l+280>>2]=!f&(c|0)==255;g=!V&(g|0)==255;b=(g?7:8)+b|0;H[l+272>>2]=b;i=n;g=g?7:8;m=g&31;if((g&63)>>>0>=32){x=i<>>32-m|q<>2]=n;H[l+268>>2]=c}c=64-b|0;b=n;g=c&31;if((c&63)>>>0>=32){i=b<>>32-g|q<>2]=b;H[l+268>>2]=i;w=1}if(!w){if(ba){j=0;Ca(R,1,11470,0);break j}j=0;Ca(R,1,11470,0);break j}C=ja-M|0;i=j;u=i-2|0;H[l+244>>2]=u;V=r+z|0;c=V-3|0;H[l+224>>2]=c;b=I[V-2|0];f=b>>>0>143;H[l+248>>2]=f;q=0;n=b>>>4|0;H[l+232>>2]=n;H[l+236>>2]=0;v=(n&7)==7?3:4;H[l+240>>2]=v;b=(c&3)+1|0;w=b>>>0>>0?b:u;E:{F:{if(!u){j=0;H[l+244>>2]=u-w;break F}b=V-4|0;H[l+224>>2]=b;g=I[c|0];j=g>>>0>143;H[l+248>>2]=j;q=v&31;if((v&63)>>>0>=32){x=g<>>32-q;q=g<>2]=n;q=x;H[l+236>>2]=q;v=(f?(g&127)==127?7:8:8)+v|0;H[l+240>>2]=v;G:{if(w>>>0<2){f=j;break G}j=V-5|0;H[l+224>>2]=j;c=I[b|0];f=c>>>0>143;H[l+248>>2]=f;m=v&31;if((v&63)>>>0>=32){U=c<>>32-m;s=c<>2]=n;q=q|U;H[l+236>>2]=q;v=(g>>>0<=143?8:(c&127)==127?7:8)+v|0;H[l+240>>2]=v;if((w|0)==2){c=b;b=j;break G}g=V-6|0;H[l+224>>2]=g;b=I[j|0];m=b;f=b>>>0>143;H[l+248>>2]=f;h=v&31;if((v&63)>>>0>=32){x=b<>>32-h;s=b<>2]=n;q=q|x;H[l+236>>2]=q;v=(c>>>0<=143?8:(b&127)==127?7:8)+v|0;H[l+240>>2]=v;if((w|0)==3){c=j;b=g;break G}b=V-7|0;H[l+224>>2]=b;c=I[g|0];f=c>>>0>143;H[l+248>>2]=f;j=v&31;if((v&63)>>>0>=32){U=c<>>32-j;j=c<>2]=n;H[l+236>>2]=j;v=(m>>>0<=143?8:(c&127)==127?7:8)+v|0;H[l+240>>2]=v;c=g}g=u-w|0;H[l+244>>2]=g;if(v>>>0>32){break E}if((g|0)>=4){j=H[c-4>>2];H[l+224>>2]=c-5;H[l+244>>2]=g-4;break F}if((g|0)<=0){j=0;break F}u=g&1;H:{if((w|0)==(i-3|0)){h=24;j=0;break H}V=g&2147483646;h=24;j=0;c=b;w=0;while(1){x=c-1|0;H[l+224>>2]=x;m=I[c|0];b=c-2|0;H[l+224>>2]=b;H[l+244>>2]=g-1;c=I[x|0];g=g-2|0;H[l+244>>2]=g;j=m<>2]=b-1;b=I[b|0];H[l+244>>2]=g-1;j=b<>2]=h>>>0>143;g=f?(j&2130706432)==2130706432?7:8:8;c=g+(j>>>0<=2415919103?8:(j&8323072)==8323072?7:8)|0;m=j>>>16&255;b=c+(m>>>0<=143?8:(j&32512)==32512?7:8)|0;x=j>>>8&255;H[l+240>>2]=b+((x>>>0<=143?8:(j&127)==127?7:8)+v|0);b=m<>>24|x<>>0>=32){x=b<>>32-c;b=b<>2]=b|n;H[l+236>>2]=q|x}jc(l+192|0,z,r-i|0,255);V=0;I:{if(P>>>0<2){break I}jc(l+160|0,T,k,0);V=0;if((P|0)==2){break I}n=0;q=0;f=0;H[l+152>>2]=1;H[l+144>>2]=0;H[l+136>>2]=0;H[l+140>>2]=0;b=k-1|0;H[l+148>>2]=b;c=(r+z|0)+k|0;g=c-1|0;H[l+128>>2]=g;m=g&3;J:{if((k|0)<=0){c=g;break J}c=c-2|0;H[l+128>>2]=c;n=I[g|0]}H[l+136>>2]=n;H[l+140>>2]=0;h=n>>>0>143;H[l+152>>2]=h;v=(n&127)==127?7:8;H[l+144>>2]=v;K:{if(!m){break K}r=k-2|0;H[l+148>>2]=r;L:{if((k|0)<2){j=c;break L}j=c-1|0;H[l+128>>2]=j;f=I[c|0]}h=f>>>0>143;H[l+152>>2]=h;c=v&31;if((v&63)>>>0>=32){i=f<>>32-c;c=f<>2]=q;c=i;H[l+140>>2]=c;v=(n>>>0<=143?8:(f&127)==127?7:8)+v|0;H[l+144>>2]=v;if((m|0)==1){c=j;n=q;q=i;k=b;b=r;break K}i=k-3|0;H[l+148>>2]=i;M:{if((k|0)<3){g=j;break M}g=j-1|0;H[l+128>>2]=g;o=I[j|0]}h=o>>>0>143;H[l+152>>2]=h;b=v&31;if((v&63)>>>0>=32){U=o<>>32-b;b=o<>2]=n;H[l+140>>2]=b;v=(f>>>0<=143?8:(o&127)==127?7:8)+v|0;H[l+144>>2]=v;if((m|0)==2){c=g;k=r;b=i;break K}b=k-4|0;H[l+148>>2]=b;f=0;N:{if((k|0)<4){c=g;break N}c=g-1|0;H[l+128>>2]=c;f=I[g|0]}h=f>>>0>143;H[l+152>>2]=h;g=v&31;if((v&63)>>>0>=32){x=f<>>32-g;g=f<>2]=n;H[l+140>>2]=g;v=(o>>>0<=143?8:(f&127)==127?7:8)+v|0;H[l+144>>2]=v;k=i}if(v>>>0<=32){O:{if((k|0)>=5){j=H[c-3>>2];H[l+148>>2]=k-5;H[l+128>>2]=c-4;break O}j=0;if((k|0)<2){break O}k=24;while(1){f=c-1|0;H[l+128>>2]=f;c=I[c|0];g=b-1|0;H[l+148>>2]=g;j=c<>>0>1;c=f;k=k-8|0;b=g;if(i){continue}break}}i=j&255;H[l+152>>2]=i>>>0>143;g=h?(j&2130706432)==2130706432?7:8:8;c=g+(j>>>0<=2415919103?8:(j&8323072)==8323072?7:8)|0;k=j>>>16&255;b=c+(k>>>0<=143?8:(j&32512)==32512?7:8)|0;f=j>>>8&255;H[l+144>>2]=b+((f>>>0<=143?8:(j&127)==127?7:8)+v|0);b=k<>>24|f<>>0>=32){i=b<>>32-c;b=b<>2]=b|n;H[l+140>>2]=i|q}V=1}ca=t-W|0;X=S+1|0;F[$+2112|0]=0;o=$+2112|0;g=$a(l+256|0);if((C|0)>0){T=ua-1|0;c=$;f=o;b=ia;z=0;while(1){r=z;m=J[(p<<8|(ob(l+224|0)&127)<<1)+16656>>1];P:{if(p){break P}j=g-2|0;m=(j|0)==-1?m:0;if((g|0)>1){g=j;break P}g=$a(l+256|0)}q=H[l+236>>2];n=H[l+232>>2];j=H[l+240>>2];t=m>>>4|0;u=H[c>>2]|(t&3|m>>>2&48)<<_;H[c>>2]=u;h=m&16;p=m>>>5&7|h>>>4;k=j;j=m&7;z=k-j|0;n=((1<>>j;q=q>>>j|0;k=n;j=0;if((C|0)>(r|2)){j=J[(p<<8|(k&127)<<1)+16656>>1];Q:{if(p){break Q}k=g-2|0;j=(k|0)==-1?j:0;if((g|0)>1){g=k;break Q}g=$a(l+256|0)}k=j&7;z=z-k|0;p=j>>>4&1|j>>>5&7;n=((1<>>k;q=q>>>k|0;k=n}H[c>>2]=u|(j<<2&768|j&48)<<_+4;v=j>>>2&2|m>>>3&1;R:{if((v|0)!=3){break R}i=g-2|0;v=(i|0)==-1?4:3;if((g|0)>1){g=i;break R}g=$a(l+256|0)}S:{if(!v){H[l+120>>2]=1;H[l+124>>2]=1;k=0;break S}if(v>>>0<=2){i=I[(k&7)+20804|0];u=i>>>2&7;x=i&3;i=(((-1<>>x)+(i>>>5|0)|0)+1|0;k=(v|0)==1;H[l+124>>2]=k?1:i;H[l+120>>2]=k?i:1;k=u+x|0;break S}i=k;k=I[(k&7)+20804|0];W=k&3;i=i>>>W|0;if((v|0)==3){v=(k>>>5|0)+1|0;if((W|0)==3){H[l+124>>2]=i&1|2;k=k>>>2&7;H[l+120>>2]=v+((-1<>>1);k=k+4|0;break S}u=I[(i&7)+20804|0];x=u&3;i=i>>>x|0;w=k>>>2&7;H[l+120>>2]=v+(i&(-1<>>2&7;H[l+124>>2]=(((-1<>>w)+(u>>>5|0)|0)+1;k=k+(x+(w+W|0)|0)|0;break S}u=I[(i&7)+20804|0];x=u&3;i=i>>>x|0;w=k>>>2&7;H[l+120>>2]=((i&(-1<>>5|0)|0)+3;k=u>>>2&7;H[l+124>>2]=(((-1<>>w)+(u>>>5|0)|0)+3;k=k+(w+(x+W|0)|0)|0}T:{w=H[l+120>>2];if(w>>>0<=X>>>0){u=H[l+124>>2];if(u>>>0<=X>>>0){break T}}if(ba){j=0;Ca(R,1,15756,0);break j}j=0;Ca(R,1,15756,0);break j}H[l+240>>2]=z-k;i=k&31;if((k&63)>>>0>=32){x=0;q=q>>>i|0}else{x=q>>>i|0;q=((1<>>i}H[l+232>>2]=q;H[l+236>>2]=x;z=r+4|0;q=(z|0)<=(C|0)?255:255>>>(z-C<<1)|0;W=(ca|0)>1?q:q&85;if((j&240|t&15)&(W^-1)){if(ba){j=0;Ca(R,1,12194,0);break j}j=0;Ca(R,1,12194,0);break j}U:{V:{if(h){n=Na(l+192|0);i=w+(m<<19>>31)|0;H[l+208>>2]=H[l+208>>2]-i;k=H[l+204>>2];q=H[l+200>>2];h=i&31;if((i&63)>>>0>=32){x=0;q=k>>>h|0}else{x=k>>>h|0;q=((1<>>h}H[l+200>>2]=q;H[l+204>>2]=x;v=(n&(-1<>>8&1)<>2]=v}W:{if(m&32){n=Na(l+192|0);i=w+(m<<18>>31)|0;H[l+208>>2]=H[l+208>>2]-i;k=H[l+204>>2];q=H[l+200>>2];h=i&31;if((i&63)>>>0>=32){x=0;q=k>>>h|0}else{x=k>>>h|0;q=((1<>>h}H[l+200>>2]=q;H[l+204>>2]=x;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break W}if(!(W&2)){break W}H[(C<<2)+b>>2]=0}i=b+4|0;X:{Y:{if(m&64){n=Na(l+192|0);h=w+(m<<17>>31)|0;H[l+208>>2]=H[l+208>>2]-h;k=H[l+204>>2];q=H[l+200>>2];t=h&31;if((h&63)>>>0>=32){x=0;q=k>>>t|0}else{x=k>>>t|0;q=((1<>>t}H[l+200>>2]=q;H[l+204>>2]=x;v=(n&(-1<>>10&1)<>2]=v}F[f+1|0]=0;Z:{if(m&128){n=Na(l+192|0);h=w+(m<<16>>31)|0;H[l+208>>2]=H[l+208>>2]-h;k=H[l+204>>2];q=H[l+200>>2];t=h&31;if((h&63)>>>0>=32){x=0;q=k>>>t|0}else{x=k>>>t|0;q=((1<>>t}H[l+200>>2]=q;H[l+204>>2]=x;q=n&(-1<>>11&1)<>2]=q+2<>2]=0}i=b+8|0;_:{$:{if(j&16){n=Na(l+192|0);m=u+(j<<19>>31)|0;H[l+208>>2]=H[l+208>>2]-m;k=H[l+204>>2];q=H[l+200>>2];h=m&31;if((m&63)>>>0>=32){x=0;q=k>>>h|0}else{x=k>>>h|0;q=((1<>>h}H[l+200>>2]=q;H[l+204>>2]=x;v=(n&(-1<>>8&1)<>2]=v}aa:{if(j&32){n=Na(l+192|0);m=u+(j<<18>>31)|0;H[l+208>>2]=H[l+208>>2]-m;k=H[l+204>>2];q=H[l+200>>2];h=m&31;if((m&63)>>>0>=32){x=0;q=k>>>h|0}else{x=k>>>h|0;q=((1<>>h}H[l+200>>2]=q;H[l+204>>2]=x;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break aa}if(!(W&32)){break aa}H[i+(C<<2)>>2]=0}i=b+12|0;ba:{ca:{if(j&64){n=Na(l+192|0);m=u+(j<<17>>31)|0;H[l+208>>2]=H[l+208>>2]-m;k=H[l+204>>2];q=H[l+200>>2];h=m&31;if((m&63)>>>0>=32){x=0;q=k>>>h|0}else{x=k>>>h|0;q=((1<>>h}H[l+200>>2]=q;H[l+204>>2]=x;v=(n&(-1<>>10&1)<>2]=v}f=f+2|0;F[f|0]=0;da:{if(j&128){n=Na(l+192|0);m=u+(j<<16>>31)|0;H[l+208>>2]=H[l+208>>2]-m;k=H[l+204>>2];q=H[l+200>>2];h=m&31;if((m&63)>>>0>=32){x=0;q=k>>>h|0}else{x=k>>>h|0;q=((1<>>h}H[l+200>>2]=q;H[l+204>>2]=x;j=n&(-1<>>11&1)<>2]=j+2<>>0<128){break da}H[i+(C<<2)>>2]=0}_=_^16;c=(r&4)+c|0;b=b+16|0;if((z|0)<(C|0)){continue}break}}ma=Z&8;ka=$+1584|0;la=$+1056|0;fa=$+528|0;if((ca|0)>=3){na=N(C,12);s=C<<3;ea=ua-1|0;b=ua-2|0;A=3<>>1&2147483644)+4|0;u=2;while(1){Z=u;v=I[o|0];F[o|0]=0;_=_&-17^2;ea:{if((C|0)<=0){u=u+2|0;break ea}p=Z&4?fa:$;u=Z+2|0;f=ia+(N(C,Z)<<2)|0;t=0;b=o;r=0;while(1){h=r;v=v&255;c=I[b+1|0]>>>5&4|(v>>>7|t);m=J[(c<<8|(ob(l+224|0)&127)<<1)+18704>>1];fa:{if(c){break fa}c=g-2|0;m=(c|0)==-1?m:0;if((g|0)>1){g=c;break fa}g=$a(l+256|0)}j=H[l+236>>2];q=H[l+232>>2];c=H[l+240>>2];k=H[p>>2]|(m>>>4&3|m>>>2&48)<<_;H[p>>2]=k;T=m&64;W=m&128;t=T>>>5|W>>>6;n=c;c=m&7;w=n-c|0;n=((1<>>c;q=j>>>c|0;r=n;j=0;if((C|0)>(h|2)){c=I[b+2|0]>>>5&4|I[b+1|0]>>>7|t;j=J[(c<<8|(n&127)<<1)+18704>>1];ga:{if(c){break ga}c=g-2|0;j=(c|0)==-1?j:0;if((g|0)>1){g=c;break ga}g=$a(l+256|0)}c=j&7;w=w-c|0;t=(j>>>5|j>>>6)&2;n=((1<>>c;r=n;q=q>>>c|0}H[p>>2]=k|(j<<2&768|j&48)<<_+4;k=1;c=1;ha:{ia:{ja:{z=j>>>2&2|m>>>3&1;switch(z|0){case 0:break ha;case 3:break ia;default:break ja}}c=I[(r&7)+20804|0];x=c>>>2&7;k=r;r=c&3;i=(((-1<>>r)+(c>>>5|0)|0)+1|0;c=(z|0)==1;k=c?1:i;c=c?i:1;z=r+x|0;break ha}U=I[(r&7)+20804|0];k=U&3;c=r>>>k|0;S=I[(c&7)+20804|0];x=S&3;i=S>>>2&7;r=U>>>2&7;z=i+(r+(k+x|0)|0)|0;k=c>>>x|0;c=((k&(-1<>>5|0)|0)+1|0;k=(((-1<>>r)+(S>>>5|0)|0)+1|0}H[l+240>>2]=w-z;i=z&31;if((z&63)>>>0>=32){x=0;q=q>>>i|0}else{x=q>>>i|0;q=((1<>>i}H[l+232>>2]=q;H[l+236>>2]=x;r=m&240;if(r-1&r){n=c;q=v&127;c=I[b+1|0]&127;q=c>>>0>>0?q:c;c=q-2|0;c=n+(c>>>0<=q>>>0?c:0)|0}i=j&240;if(i-1&i){n=I[b+1|0]&127;q=I[b+2|0]&127;q=n>>>0>q>>>0?n:q;k=(q>>>0>2?q-2|0:0)+k|0}if(!(c>>>0<=X>>>0&k>>>0<=X>>>0)){if(ba){j=0;Ca(R,1,15856,0);break j}j=0;Ca(R,1,15856,0);break j}v=I[b+2|0];F[b+1|0]=0;F[b+2|0]=0;n=i|r>>>4;r=h+4|0;q=(r|0)<=(C|0)?255:255>>>(r-C<<1)|0;S=(u|0)>(ca|0)?q&85:q;if(n&(S^-1)){if(ba){j=0;Ca(R,1,12194,0);break j}j=0;Ca(R,1,12194,0);break j}ka:{la:{if(m&16){n=Na(l+192|0);w=(m<<19>>31)+c|0;H[l+208>>2]=H[l+208>>2]-w;i=H[l+204>>2];q=H[l+200>>2];z=w&31;if((w&63)>>>0>=32){x=0;q=i>>>z|0}else{x=i>>>z|0;q=((1<>>z}H[l+200>>2]=q;H[l+204>>2]=x;w=(n&(-1<>>8&1)<>2]=w}ma:{if(m&32){n=Na(l+192|0);w=(m<<18>>31)+c|0;H[l+208>>2]=H[l+208>>2]-w;i=H[l+204>>2];q=H[l+200>>2];z=w&31;if((w&63)>>>0>=32){x=0;q=i>>>z|0}else{x=i>>>z|0;q=((1<>>z}H[l+200>>2]=q;H[l+204>>2]=x;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break ma}if(!(S&2)){break ma}H[(C<<2)+f>>2]=0}w=f+4|0;na:{oa:{if(T){n=Na(l+192|0);z=(m<<17>>31)+c|0;H[l+208>>2]=H[l+208>>2]-z;i=H[l+204>>2];q=H[l+200>>2];T=z&31;if((z&63)>>>0>=32){x=0;q=i>>>T|0}else{x=i>>>T|0;q=((1<>>T}H[l+200>>2]=q;H[l+204>>2]=x;Y=(n&(-1<>>10&1)<>2]=Y}pa:{if(W){q=Na(l+192|0);i=(m<<16>>31)+c|0;H[l+208>>2]=H[l+208>>2]-i;n=H[l+204>>2];c=H[l+200>>2];z=i&31;if((i&63)>>>0>=32){x=0;c=n>>>z|0}else{x=n>>>z|0;c=((1<>>z}H[l+200>>2]=c;H[l+204>>2]=x;c=q&(-1<>>11&1)<>2]=c+2<>2]=0}i=f+8|0;qa:{ra:{if(j&16){q=Na(l+192|0);m=(j<<19>>31)+k|0;H[l+208>>2]=H[l+208>>2]-m;n=H[l+204>>2];c=H[l+200>>2];w=m&31;if((m&63)>>>0>=32){x=0;c=n>>>w|0}else{x=n>>>w|0;c=((1<>>w}H[l+200>>2]=c;H[l+204>>2]=x;c=(q&(-1<>>8&1)<>2]=c}sa:{if(j&32){q=Na(l+192|0);m=(j<<18>>31)+k|0;H[l+208>>2]=H[l+208>>2]-m;n=H[l+204>>2];c=H[l+200>>2];w=m&31;if((m&63)>>>0>=32){x=0;c=n>>>w|0}else{x=n>>>w|0;c=((1<>>w}H[l+200>>2]=c;H[l+204>>2]=x;c=q&(-1<>>9&1)<>2]=c+2<>>0>>0?q:c)|128;break sa}if(!(S&32)){break sa}H[i+(C<<2)>>2]=0}i=f+12|0;ta:{ua:{if(j&64){q=Na(l+192|0);m=(j<<17>>31)+k|0;H[l+208>>2]=H[l+208>>2]-m;n=H[l+204>>2];c=H[l+200>>2];w=m&31;if((m&63)>>>0>=32){x=0;c=n>>>w|0}else{x=n>>>w|0;c=((1<>>w}H[l+200>>2]=c;H[l+204>>2]=x;c=(q&(-1<>>10&1)<>2]=c}b=b+2|0;va:{if(j&128){q=Na(l+192|0);k=(j<<16>>31)+k|0;H[l+208>>2]=H[l+208>>2]-k;n=H[l+204>>2];c=H[l+200>>2];m=k&31;if((k&63)>>>0>=32){x=0;c=n>>>m|0}else{x=n>>>m|0;c=((1<>>m}H[l+200>>2]=c;H[l+204>>2]=x;c=q&(-1<>>11&1)<>2]=c+2<>>0<128){break va}H[i+(C<<2)>>2]=0}_=_^16;p=(h&4)+p|0;f=f+16|0;if((r|0)<(C|0)){continue}break}}wa:{if(!(Z&2)|P>>>0<2){break wa}p=u&4;xa:{ya:{za:{Aa:{Ba:{if(V){w=p?$:fa;z=0;if((C|0)<=0){break Ba}q=ia+(N(C,Z-2|0)<<2)|0;while(1){j=ob(l+128|0);m=0;f=H[w>>2];if(f){m=q+(z<<2)|0;k=0;b=15;while(1){Ca:{if(!(b&f)){break Ca}n=b&286331153;if(n&f){H[m>>2]=D|H[m>>2]^((j^-1)&1)<>>1|0}if(f&n<<1){c=(C<<2)+m|0;H[c>>2]=D|H[c>>2]^((j^-1)&1)<>>1|0}if(f&n<<2){c=m+s|0;H[c>>2]=D|H[c>>2]^((j^-1)&1)<>>1|0}if(!(f&n<<3)){break Ca}c=m+na|0;H[c>>2]=D|H[c>>2]^((j^-1)&1)<>>1|0}m=m+4|0;b=b<<4;k=k+1|0;if((k|0)!=8){continue}break}m=Me(f)}w=w+4|0;H[l+144>>2]=H[l+144>>2]-m;c=H[l+140>>2];b=H[l+136>>2];j=m&31;if((m&63)>>>0>=32){x=0;b=c>>>j|0}else{x=c>>>j|0;b=((1<>>j}H[l+136>>2]=b;H[l+140>>2]=x;z=z+8|0;if((C|0)>(z|0)){continue}break}}c=0;j=0;Y=p?la:ka;m=Y;w=p?$:fa;b=w;if((C|0)>0){break za}b=!p;break Aa}Y=p?la:ka;b=!p}if(Z>>>0<=5){break wa}h=b?$:fa;if((C|0)<=0){break xa}b=b?la:ka;break ya}while(1){q=j>>>28|0;j=H[b>>2];q=j|(q|j<<4|j>>>4);H[m>>2]=q;q=q|H[b+4>>2]<<28;H[m>>2]=(q>>>1&2004318071|q<<1&-286331154|q)&(j^-1);m=m+4|0;b=b+4|0;c=c+8|0;if((C|0)>(c|0)){continue}break}if(Z>>>0<6){break wa}h=p?fa:$;b=p?ka:la}k=0;p=0;m=w;v=b;j=b;b=h;while(1){q=m+4|0;c=H[j>>2];n=H[m>>2];if(!ma){c=c|(n|(n<<4|p>>>28|n>>>4|H[q>>2]<<28))<<3&-2004318072}H[j>>2]=(H[b>>2]^-1)&c;b=b+4|0;j=j+4|0;p=n;m=q;k=k+8|0;if((C|0)>(k|0)){continue}break}if((C|0)<=0){break xa}T=ia+(N(C,Z-6|0)<<2)|0;pa=0;p=h;while(1){f=0;b=H[v>>2];if(b){W=pa|4;Z=C-pa|0;i=(pa<<2)+T|0;j=0;t=0;while(1){q=j;j=Na(l+160|0);S=(C|0)>(t+W|0)?t+4|0:Z;Da:{if((S|0)<=(t|0)){m=0;break Da}da=H[p>>2]^-1;x=t<<2;z=i+x|0;m=0;k=t;r=15<>>1|0}n=U<<1;if(n&b){if(j&1){f=f|n;b=da&116<<(k<<2)|b}m=m+1|0;j=j>>>1|0}n=U<<2;if(n&b){if(j&1){f=f|n;b=da&232<<(k<<2)|b}m=m+1|0;j=j>>>1|0}n=U<<3;if(!(n&b)){break Ea}if(j&1){f=f|n;b=da&192<<(k<<2)|b}m=m+1|0;j=j>>>1|0}c=c<<4;k=k+1|0;if((S|0)>(k|0)){continue}break}if(!(f>>>x&65535)){break Da}while(1){Fa:{if(!(f&r)){break Fa}n=r&286331153;if(n&f){H[z>>2]=A|(H[z>>2]|j<<31);m=m+1|0;j=j>>>1|0}if(n<<1&f){c=(C<<2)+z|0;H[c>>2]=A|(H[c>>2]|j<<31);m=m+1|0;j=j>>>1|0}if(n<<2&f){c=s+z|0;H[c>>2]=A|(H[c>>2]|j<<31);m=m+1|0;j=j>>>1|0}if(!(n<<3&f)){break Fa}c=z+na|0;H[c>>2]=A|(H[c>>2]|j<<31);m=m+1|0;j=j>>>1|0}r=r<<4;z=z+4|0;t=t+1|0;if((S|0)>(t|0)){continue}break}}H[l+176>>2]=H[l+176>>2]-m;j=H[l+172>>2];c=H[l+168>>2];n=m&31;if((m&63)>>>0>=32){x=0;c=j>>>n|0}else{x=j>>>n|0;c=((1<>>n}H[l+168>>2]=c;H[l+172>>2]=x;j=1;t=4;if(!(q&1)){continue}break}H[v+4>>2]=H[v+4>>2]|(f>>>27&14|f>>>29|f>>>28)&(H[p+4>>2]^-1)}j=H[p>>2]|f;q=j>>>3&286331153;c=q>>>4|q<<4|q;if(pa){b=Y-4|0;H[b>>2]=H[b>>2]|(H[w-4>>2]^-1)&q<<28}H[Y>>2]=H[Y>>2]|c&(H[w>>2]^-1);H[Y+4>>2]=H[Y+4>>2]|(H[w+4>>2]^-1)&j>>>31;v=v+4|0;p=p+4|0;Y=Y+4|0;w=w+4|0;pa=pa+8|0;if((C|0)>(pa|0)){continue}break}}if(!ha){break wa}y(h,0,ha)}if((u|0)<(ca|0)){continue}break}}Ga:{if(P>>>0<2){break Ga}f=(ca&3)-1|0;Ha:{if(V&f>>>0<2){if((C|0)<=0){break Ha}r=1<>2];if(o){m=n+(t<<2)|0;b=15;k=0;while(1){Ia:{if(!(b&o)){break Ia}p=b&286331153;if(p&o){H[m>>2]=r|H[m>>2]^((j^-1)&1)<>>1|0}if(o&p<<1){c=(C<<2)+m|0;H[c>>2]=r|H[c>>2]^((j^-1)&1)<>>1|0}if(o&p<<2){c=g+m|0;H[c>>2]=r|H[c>>2]^((j^-1)&1)<>>1|0}if(!(o&p<<3)){break Ia}c=m+q|0;H[c>>2]=r|H[c>>2]^((j^-1)&1)<>>1|0}m=m+4|0;b=b<<4;k=k+1|0;if((k|0)!=8){continue}break}m=Me(o)}w=w+4|0;H[l+144>>2]=H[l+144>>2]-m;c=H[l+140>>2];b=H[l+136>>2];j=m&31;if((m&63)>>>0>=32){x=0;b=c>>>j|0}else{x=c>>>j|0;b=((1<>>j}H[l+136>>2]=b;H[l+140>>2]=x;t=t+8|0;if((C|0)>(t|0)){continue}break}}if((C|0)<=0|f>>>0>1){break Ha}b=ca&4;m=b?fa:$;b=b?ka:la;c=0;j=0;while(1){g=j>>>28|0;j=H[m>>2];g=j|(g|j<<4|j>>>4);H[b>>2]=g;g=g|H[m+4>>2]<<28;H[b>>2]=(g>>>1&2004318071|g<<1&-286331154|g)&(j^-1);b=b+4|0;m=m+4|0;c=c+8|0;if((C|0)>(c|0)){continue}break}}P=(ca|0)>6?(ca-(ca+1&3)|0)-3|0:0;if((ca|0)<=(P|0)){break Ga}W=N(C,12);t=C<<3;s=3<>>0>=3){_=-1;if((c|0)<5){break La}if(S){break Ja}c=P&4;m=c?fa:$;j=c?ka:la;b=0;if(!ma){b=c?$:fa;c=0;f=0;while(1){g=f>>>28|0;_=-1;f=H[b>>2];H[j>>2]=(H[j>>2]|(f|(g|f<<4|f>>>4|H[b+4>>2]<<28))<<3&-2004318072)&(H[m>>2]^-1);m=m+4|0;j=j+4|0;b=b+4|0;c=c+8|0;if((C|0)>(c|0)){continue}break}break Ka}while(1){_=-1;H[j>>2]=H[j>>2]&(H[m>>2]^-1);m=m+4|0;j=j+4|0;b=b+8|0;if((C|0)>(b|0)){continue}break}break Ka}_=H[(b<<2)+20812>>2]}if(S){break Ja}}b=P&4;r=b?fa:$;p=b?ka:la;g=b?$:fa;v=b?la:ka;u=ia+(N(C,P)<<2)|0;h=0;while(1){f=0;b=H[p>>2]&_;if(b){V=h|4;Z=C-h|0;o=u+(h<<2)|0;j=0;i=0;while(1){q=j;j=Na(l+160|0);T=(C|0)>(i+V|0)?i+4|0:Z;Ma:{if((T|0)<=(i|0)){m=0;break Ma}x=i<<2;z=x+o|0;ha=(H[r>>2]^-1)&_;m=0;k=i;w=15<>>1|0}n=U<<1;if(n&b){if(j&1){f=f|n;b=ha&116<<(k<<2)|b}m=m+1|0;j=j>>>1|0}n=U<<2;if(n&b){if(j&1){f=f|n;b=ha&232<<(k<<2)|b}m=m+1|0;j=j>>>1|0}n=U<<3;if(!(n&b)){break Na}if(j&1){f=f|n;b=ha&192<<(k<<2)|b}m=m+1|0;j=j>>>1|0}c=c<<4;k=k+1|0;if((T|0)>(k|0)){continue}break}if(!(f>>>x&65535)){break Ma}while(1){Oa:{if(!(f&w)){break Oa}n=w&286331153;if(n&f){H[z>>2]=s|(H[z>>2]|j<<31);m=m+1|0;j=j>>>1|0}if(n<<1&f){c=(C<<2)+z|0;H[c>>2]=s|(H[c>>2]|j<<31);m=m+1|0;j=j>>>1|0}if(n<<2&f){c=t+z|0;H[c>>2]=s|(H[c>>2]|j<<31);m=m+1|0;j=j>>>1|0}if(!(n<<3&f)){break Oa}c=z+W|0;H[c>>2]=s|(H[c>>2]|j<<31);m=m+1|0;j=j>>>1|0}w=w<<4;z=z+4|0;i=i+1|0;if((T|0)>(i|0)){continue}break}}H[l+176>>2]=H[l+176>>2]-m;j=H[l+172>>2];c=H[l+168>>2];n=m&31;if((m&63)>>>0>=32){x=0;c=j>>>n|0}else{x=j>>>n|0;c=((1<>>n}H[l+168>>2]=c;H[l+172>>2]=x;j=1;i=4;if(!(q&1)){continue}break}H[p+4>>2]=H[p+4>>2]|(f>>>27&14|f>>>29|f>>>28)&(H[r+4>>2]^-1)}j=H[r>>2]|f;q=j>>>3&286331153;c=q>>>4|q<<4|q;if(h){b=v-4|0;H[b>>2]=H[b>>2]|(H[g-4>>2]^-1)&q<<28}H[v>>2]=H[v>>2]|c&(H[g>>2]^-1);H[v+4>>2]=H[v+4>>2]|(H[g+4>>2]^-1)&j>>>31;p=p+4|0;r=r+4|0;v=v+4|0;g=g+4|0;h=h+8|0;if((C|0)>(h|0)){continue}break}}P=P+4|0;if((ca|0)>(P|0)){continue}break}}j=1;if((ca|0)<=0|(C|0)<=0){break j}q=C&2147483644;n=C&3;g=M-ja>>>0>4294967292;p=0;while(1){j=ia+(N(p,C)<<2)|0;m=0;if(!g){while(1){c=H[j>>2];b=c&2147483647;H[j>>2]=(c|0)<0?0-b|0:b;c=H[j+4>>2];b=c&2147483647;H[j+4>>2]=(c|0)<0?0-b|0:b;c=H[j+8>>2];b=c&2147483647;H[j+8>>2]=(c|0)<0?0-b|0:b;c=H[j+12>>2];b=c&2147483647;H[j+12>>2]=(c|0)<0?0-b|0:b;j=j+16|0;m=m+4|0;if((q|0)!=(m|0)){continue}break}}m=0;if(n){while(1){c=H[j>>2];b=c&2147483647;H[j>>2]=(c|0)<0?0-b|0:b;j=j+4|0;m=m+1|0;if((n|0)!=(m|0)){continue}break}}j=1;p=p+1|0;if((ca|0)!=(p|0)){continue}break}break j}if(!ba){break v}H[l+52>>2]=H[E+24>>2];H[l+48>>2]=S;Ca(R,1,9686,l+48|0);break u}H[l+20>>2]=m;H[l+16>>2]=S;Ca(R,1,9686,l+16|0);j=0;break j}j=0}oa=l+304|0;if(j){break i}break b}H[e+108>>2]=(b<<9)+22336;c=0;b=H[e+116>>2];Pa:{Qa:{p=H[E+16>>2]-H[E+8>>2]|0;k=H[E+20>>2]-H[E+12>>2]|0;g=N(p,k);Ra:{Sa:{Ta:{if(g>>>0>K[e+132>>2]){Da(b);b=Ja(g<<2);H[e+116>>2]=b;if(!b){break Ra}H[e+132>>2]=g;break Ta}if(!b){break Sa}}g=g<<2;if(!g){break Sa}y(b,0,g)}b=H[e+120>>2];r=p+2|0;n=k+3>>>2|0;g=N(r,n+2|0);if(g>>>0<=K[e+136>>2]){z=g<<2;break Qa}Da(b);z=g<<2;b=Ja(z);H[e+120>>2]=b;if(b){break Qa}}b=0;break Pa}H[e+136>>2]=g;if(z){y(b,0,z)}Ua:{if(!r){break Ua}q=H[e+120>>2];b=q;l=p+1|0;if(l>>>0>=7){g=r&-8;while(1){H[b+24>>2]=1226833920;H[b+28>>2]=1226833920;H[b+16>>2]=1226833920;H[b+20>>2]=1226833920;H[b+8>>2]=1226833920;H[b+12>>2]=1226833920;H[b>>2]=1226833920;H[b+4>>2]=1226833920;b=b+32|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}}g=r&7;if(g){c=0;while(1){H[b>>2]=1226833920;b=b+4|0;c=c+1|0;if((g|0)!=(c|0)){continue}break}}b=q+(N(r,n+1|0)<<2)|0;if(l>>>0>=7){g=r&-8;c=0;while(1){H[b+24>>2]=1226833920;H[b+28>>2]=1226833920;H[b+16>>2]=1226833920;H[b+20>>2]=1226833920;H[b+8>>2]=1226833920;H[b+12>>2]=1226833920;H[b>>2]=1226833920;H[b+4>>2]=1226833920;b=b+32|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}}g=r&7;if(g){c=0;while(1){H[b>>2]=1226833920;b=b+4|0;c=c+1|0;if((g|0)!=(c|0)){continue}break}}b=k&3;if(!b){break Ua}g=(b|0)==1?1224736768:(b|0)==2?1207959552:1073741824;b=q+(N(n,r)<<2)|0;if(l>>>0>=7){c=r&-8;z=0;while(1){H[b+28>>2]=g;H[b+24>>2]=g;H[b+20>>2]=g;H[b+16>>2]=g;H[b+12>>2]=g;H[b+8>>2]=g;H[b+4>>2]=g;H[b>>2]=g;b=b+32|0;z=z+8|0;if((c|0)!=(z|0)){continue}break}}c=r&7;if(!c){break Ua}z=0;while(1){H[b>>2]=g;b=b+4|0;z=z+1|0;if((c|0)!=(z|0)){continue}break}}H[e+128>>2]=k;H[e+124>>2]=p;b=1}if(!b){break b}z=P+H[E+28>>2]|0;if((z|0)>=31){if(!ba){break h}H[aa+16>>2]=z;Ca(R,2,8716,aa+16|0);break b}ic(e);_a(e,18,46);_a(e,17,3);_a(e,0,4);if(H[E+64>>2]){break i}q=H[E+52>>2];Va:{if(!(q>>>0<=1&(!H[e+144>>2]|(q|0)!=1))){b=H[E+4>>2];g=0;if(q-1>>>0>=3){c=q&-4;while(1){l=(i<<3)+b|0;g=H[l+28>>2]+(H[l+20>>2]+(H[l+12>>2]+(H[l+4>>2]+g|0)|0)|0)|0;i=i+4|0;f=f+4|0;if((c|0)!=(f|0)){continue}break}}c=q&3;if(c){while(1){g=H[((i<<3)+b|0)+4>>2]+g|0;i=i+1|0;j=j+1|0;if((c|0)!=(j|0)){continue}break}}ja=H[e+148>>2];c=g+2|0;if(c>>>0>K[e+152>>2]){b=Ia(ja,c);if(!b){break b}H[e+148>>2]=b;b=b+g|0;F[b|0]=0;F[b+1|0]=0;H[e+152>>2]=c;ja=H[e+148>>2];if(!H[E+52>>2]){break Va}b=H[E+4>>2]}g=0;i=0;while(1){l=i<<3;c=l+b|0;b=H[c+4>>2];if(b){B(g+ja|0,H[c>>2],b)}b=H[E+4>>2];g=H[(l+b|0)+4>>2]+g|0;i=i+1|0;if(i>>>0>2]){continue}break}break Va}if((q|0)!=1){break i}ja=H[H[E+4>>2]>>2]}b=H[E+60>>2];if(b){$=H[e+116>>2];H[e+116>>2]=b}if(H[E+44>>2]){ia=Z&2;ha=Z&8;da=e+28|0;V=!(Z&1);_=2;while(1){l=U+ja|0;ma=H[E>>2]+N(S,24)|0;c=H[ma>>2];na=V|((H[E+28>>2]-4|0)<(z|0)|_>>>0>1);Wa:{if(!na){H[e+20>>2]=l;b=c+l|0;H[e+24>>2]=b;G[e+112>>1]=I[b|0]|I[b+1|0]<<8;F[b|0]=255;F[H[e+24>>2]+1|0]=255;H[e+8>>2]=0;H[e>>2]=0;H[e+16>>2]=l;break Wa}H[e+20>>2]=l;b=c+l|0;H[e+24>>2]=b;G[e+112>>1]=I[b|0]|I[b+1|0]<<8;F[b|0]=255;F[H[e+24>>2]+1|0]=255;H[e+104>>2]=e+28;H[e+16>>2]=l;H[e+12>>2]=0;b=c?I[l|0]<<16:16711680;H[e>>2]=b;j=1;c=l+1|0;g=I[l+1|0];Xa:{if(I[l|0]==255){if(g>>>0>=144){H[e+12>>2]=1;b=b|65280;break Xa}H[e+16>>2]=c;j=0;b=b+(g<<9)|0;break Xa}H[e+16>>2]=c;b=b|g<<8}H[e+8>>2]=j;H[e+4>>2]=32768;H[e>>2]=b<<7}x=H[ma>>2];Ya:{if(!H[ma+8>>2]|(z|0)<=0){break Ya}T=0;P=na&(ia|0)!=0;while(1){Za:{_a:{$a:{switch(_-1|0){default:if(!na){b=1<>>1|b;r=H[e+124>>2];n=r<<2;b=(n+H[e+120>>2]|0)+12|0;g=H[e+116>>2];m=0;c=H[e+128>>2];if(c>>>0>=4){if(!r){break Za}d=N(r,12);q=r<<3;f=0-o|0;while(1){c=0;while(1){l=b;b=H[b>>2];ab:{if(!b){break ab}if(!(!(b&495)|b&2097168)){b=H[e>>2];j=H[e+8>>2];bb:{if(j){break bb}j=(b|0)==255;k=H[e+16>>2];b=I[k|0];cb:{if(!j){H[e>>2]=b;H[e+16>>2]=k+1;break cb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=k+1;j=7;break bb}b=255;H[e>>2]=255}j=8}j=j-1|0;H[e+8>>2]=j;db:{if(!(b>>>j&1)){break db}eb:{if(j){break eb}j=(b|0)==255;k=H[e+16>>2];b=I[k|0];fb:{if(!j){H[e>>2]=b;H[e+16>>2]=k+1;break fb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=k+1;j=7;break eb}b=255;H[e>>2]=255}j=8}j=j-1|0;H[e+8>>2]=j;k=b>>>j&1;H[g>>2]=k?f:o;j=H[e+124>>2];b=l-4|0;H[b>>2]=H[b>>2]|32;H[l+4>>2]=H[l+4>>2]|8;H[l>>2]=H[l>>2]|k<<19|16;if(ha){break db}b=l+(-2-j<<2)|0;H[b+4>>2]=H[b+4>>2]|32768;H[b>>2]=H[b>>2]|k<<31|65536;b=b-4|0;H[b>>2]=H[b>>2]|131072}b=H[l>>2]|2097152;H[l>>2]=b}if(!(!(b&3960)|b&16777344)){b=H[e>>2];j=H[e+8>>2];gb:{if(j){break gb}j=(b|0)==255;k=H[e+16>>2];b=I[k|0];hb:{if(!j){H[e>>2]=b;H[e+16>>2]=k+1;break hb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=k+1;j=7;break gb}b=255;H[e>>2]=255}j=8}j=j-1|0;H[e+8>>2]=j;if(b>>>j&1){ib:{if(j){break ib}j=(b|0)==255;k=H[e+16>>2];b=I[k|0];jb:{if(!j){H[e>>2]=b;H[e+16>>2]=k+1;break jb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=k+1;j=7;break ib}b=255;H[e>>2]=255}j=8}j=j-1|0;H[e+8>>2]=j;j=b>>>j&1;H[g+n>>2]=j?f:o;b=l-4|0;H[b>>2]=H[b>>2]|256;H[l+4>>2]=H[l+4>>2]|64;b=H[l>>2]|j<<22|128}else{b=H[l>>2]}b=b|16777216;H[l>>2]=b}if(!(!(b&31680)|b&134218752)){b=H[e>>2];j=H[e+8>>2];kb:{if(j){break kb}j=(b|0)==255;k=H[e+16>>2];b=I[k|0];lb:{if(!j){H[e>>2]=b;H[e+16>>2]=k+1;break lb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=k+1;j=7;break kb}b=255;H[e>>2]=255}j=8}j=j-1|0;H[e+8>>2]=j;if(b>>>j&1){mb:{if(j){break mb}j=(b|0)==255;k=H[e+16>>2];b=I[k|0];nb:{if(!j){H[e>>2]=b;H[e+16>>2]=k+1;break nb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=k+1;j=7;break mb}b=255;H[e>>2]=255}j=8}j=j-1|0;H[e+8>>2]=j;j=b>>>j&1;H[g+q>>2]=j?f:o;b=l-4|0;H[b>>2]=H[b>>2]|2048;H[l+4>>2]=H[l+4>>2]|512;b=H[l>>2]|j<<25|1024}else{b=H[l>>2]}b=b|134217728;H[l>>2]=b}if(!(b&253440)|b&1073750016){break ab}b=H[e>>2];j=H[e+8>>2];ob:{if(j){break ob}j=(b|0)==255;k=H[e+16>>2];b=I[k|0];pb:{if(!j){H[e>>2]=b;H[e+16>>2]=k+1;break pb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=k+1;j=7;break ob}b=255;H[e>>2]=255}j=8}j=j-1|0;H[e+8>>2]=j;if(b>>>j&1){qb:{if(j){break qb}j=(b|0)==255;k=H[e+16>>2];b=I[k|0];rb:{if(!j){H[e>>2]=b;H[e+16>>2]=k+1;break rb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=k+1;j=7;break qb}b=255;H[e>>2]=255}j=8}j=j-1|0;H[e+8>>2]=j;k=b>>>j&1;H[d+g>>2]=k?f:o;j=H[e+124>>2];b=l-4|0;H[b>>2]=H[b>>2]|16384;H[l+4>>2]=H[l+4>>2]|4096;H[l>>2]=H[l>>2]|k<<28|8192;b=l+(j<<2)|0;H[b+4>>2]=H[b+4>>2]|4;H[b+12>>2]=H[b+12>>2]|1;H[b+8>>2]=H[b+8>>2]|k<<18|2}H[l>>2]=H[l>>2]|1073741824}g=g+4|0;b=l+4|0;c=c+1|0;if((r|0)!=(c|0)){continue}break}g=d+g|0;b=l+12|0;m=m+4|0;c=H[e+128>>2];if(m>>>0<(c&-4)>>>0){continue}break}}if(!r|c>>>0<=m>>>0){break _a}v=0;q=0-o|0;j=c;while(1){sb:{if((j|0)==(m|0)){j=m;break sb}d=b-4|0;k=H[b>>2];i=0;while(1){p=N(i,3);l=k>>>p|0;if(!(l&2097168|!(l&495))){c=H[e>>2];f=H[e+8>>2];tb:{if(f){break tb}l=(c|0)!=255;j=H[e+16>>2];c=I[j|0];ub:{if(!l){if(c>>>0>=144){c=255;H[e>>2]=255;break ub}H[e>>2]=c;H[e+16>>2]=j+1;f=7;break tb}H[e>>2]=c;H[e+16>>2]=j+1}f=8}f=f-1|0;H[e+8>>2]=f;vb:{if(!(c>>>f&1)){break vb}j=(N(i,r)<<2)+g|0;wb:{if(f){break wb}l=(c|0)!=255;n=H[e+16>>2];c=I[n|0];xb:{if(!l){if(c>>>0>=144){c=255;H[e>>2]=255;break xb}H[e>>2]=c;H[e+16>>2]=n+1;f=7;break wb}H[e>>2]=c;H[e+16>>2]=n+1}f=8}l=f-1|0;H[e+8>>2]=l;k=j;j=c>>>l&1;H[k>>2]=j?q:o;l=H[e+124>>2];H[d>>2]=H[d>>2]|32<>2]=H[b>>2]|(j<<19|16)<>2]=H[b+4>>2]|8<>2]=H[c+4>>2]|32768;H[c>>2]=H[c>>2]|j<<31|65536;c=c-4|0;H[c>>2]=H[c>>2]|131072}if((i|0)!=3){break vb}c=(l<<2)+b|0;H[c+4>>2]=H[c+4>>2]|4;H[c+12>>2]=H[c+12>>2]|1;H[c+8>>2]=H[c+8>>2]|j<<18|2}k=H[b>>2]|2097152<>2]=k;c=H[e+128>>2]}j=c;i=i+1|0;if(i>>>0>>0){continue}break}}g=g+4|0;b=b+4|0;v=v+1|0;if((r|0)!=(v|0)){continue}break}break _a}j=0;r=0;v=0;yb:{zb:{Ab:{D=H[e+124>>2];if(!((D|0)!=64|H[e+128>>2]!=64)){b=1<>>1|b;l=0-j|0;u=e+28|0;g=H[e+120>>2]+268|0;f=H[e+8>>2];c=H[e+4>>2];k=H[e>>2];m=H[e+104>>2];b=H[e+116>>2];if(Z&8){break Ab}while(1){v=0;while(1){q=b;n=g;g=H[g>>2];if(g){Bb:{if(g&2097168){break Bb}b=g&495;if(!b){break Bb}m=u+(I[b+H[e+108>>2]|0]<<2)|0;i=H[m>>2];b=H[i>>2];c=c-b|0;Cb:{if(k>>>16>>>0>>0){p=H[i+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[i+(d?8:12)>>2];while(1){Db:{if(f){break Db}f=H[e+16>>2];c=f+1|0;i=I[f+1|0];if(I[f|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Db}H[e+16>>2]=c;k=(i<<9)+k|0;f=7;break Db}H[e+16>>2]=c;f=8;k=(i<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?p:!p;break Cb}k=k-(b<<16)|0;if(!(c&32768)){p=H[i+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[i+(b?12:8)>>2];while(1){Eb:{if(f){break Eb}f=H[e+16>>2];d=f+1|0;i=I[f+1|0];if(I[f|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Eb}H[e+16>>2]=d;k=(i<<9)+k|0;f=7;break Eb}H[e+16>>2]=d;f=8;k=(i<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!p:p;break Cb}b=H[i+4>>2]}if(b){o=n-4|0;d=H[n+4>>2]>>>17&4|(H[o>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));m=u+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;p=I[d+24640|0];Fb:{if(k>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Gb:{if(f){break Gb}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Gb}H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break Gb}H[e+16>>2]=c;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?i:!i;break Fb}k=k-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Hb:{if(f){break Hb}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Hb}H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break Hb}H[e+16>>2]=d;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!i:i;break Fb}d=H[h+4>>2]}H[q>>2]=(p|0)==(d|0)?j:l;H[o>>2]=H[o>>2]|32;H[n+4>>2]=H[n+4>>2]|8;b=n-268|0;H[b>>2]=H[b>>2]|131072;b=n-260|0;H[b>>2]=H[b>>2]|32768;b=n-264|0;i=b;w=H[b>>2];b=d^p;H[i>>2]=w|b<<31|65536;g=b<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){p=g>>>3|0;m=u+(I[H[e+108>>2]+(p&495)|0]<<2)|0;o=H[m>>2];b=H[o>>2];c=c-b|0;Ib:{if(k>>>16>>>0>>0){i=H[o+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[o+(d?8:12)>>2];while(1){Jb:{if(f){break Jb}f=H[e+16>>2];c=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Jb}H[e+16>>2]=c;k=(o<<9)+k|0;f=7;break Jb}H[e+16>>2]=c;f=8;k=(o<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break Ib}k=k-(b<<16)|0;if(!(c&32768)){i=H[o+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[o+(b?12:8)>>2];while(1){Kb:{if(f){break Kb}f=H[e+16>>2];d=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Kb}H[e+16>>2]=d;k=(o<<9)+k|0;f=7;break Kb}H[e+16>>2]=d;f=8;k=(o<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break Ib}b=H[o+4>>2]}if(b){o=n-4|0;d=H[n+4>>2]>>>20&4|(H[o>>2]>>>22&1|(g>>>15&16|(g>>>19&64|p&170)));m=u+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;p=I[d+24640|0];Lb:{if(k>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Mb:{if(f){break Mb}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Mb}H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break Mb}H[e+16>>2]=c;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break Lb}k=k-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Nb:{if(f){break Nb}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Nb}H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break Nb}H[e+16>>2]=d;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break Lb}b=H[h+4>>2]}H[q+256>>2]=(p|0)==(b|0)?j:l;H[o>>2]=H[o>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^p)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){p=g>>>6|0;m=u+(I[H[e+108>>2]+(p&495)|0]<<2)|0;o=H[m>>2];b=H[o>>2];c=c-b|0;Ob:{if(k>>>16>>>0>>0){i=H[o+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[o+(d?8:12)>>2];while(1){Pb:{if(f){break Pb}f=H[e+16>>2];c=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Pb}H[e+16>>2]=c;k=(o<<9)+k|0;f=7;break Pb}H[e+16>>2]=c;f=8;k=(o<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break Ob}k=k-(b<<16)|0;if(!(c&32768)){i=H[o+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[o+(b?12:8)>>2];while(1){Qb:{if(f){break Qb}f=H[e+16>>2];d=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Qb}H[e+16>>2]=d;k=(o<<9)+k|0;f=7;break Qb}H[e+16>>2]=d;f=8;k=(o<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break Ob}b=H[o+4>>2]}if(b){o=n-4|0;d=H[n+4>>2]>>>23&4|(H[o>>2]>>>25&1|(g>>>18&16|(g>>>22&64|p&170)));m=u+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;p=I[d+24640|0];Rb:{if(k>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Sb:{if(f){break Sb}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Sb}H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break Sb}H[e+16>>2]=c;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break Rb}k=k-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Tb:{if(f){break Tb}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Tb}H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break Tb}H[e+16>>2]=d;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break Rb}b=H[h+4>>2]}H[q+512>>2]=(p|0)==(b|0)?j:l;H[o>>2]=H[o>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^p)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){p=g>>>9|0;m=u+(I[H[e+108>>2]+(p&495)|0]<<2)|0;o=H[m>>2];b=H[o>>2];c=c-b|0;Ub:{if(k>>>16>>>0>>0){i=H[o+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[o+(d?8:12)>>2];while(1){Vb:{if(f){break Vb}f=H[e+16>>2];c=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Vb}H[e+16>>2]=c;k=(o<<9)+k|0;f=7;break Vb}H[e+16>>2]=c;f=8;k=(o<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break Ub}k=k-(b<<16)|0;if(!(c&32768)){i=H[o+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[o+(b?12:8)>>2];while(1){Wb:{if(f){break Wb}f=H[e+16>>2];d=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Wb}H[e+16>>2]=d;k=(o<<9)+k|0;f=7;break Wb}H[e+16>>2]=d;f=8;k=(o<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break Ub}b=H[o+4>>2]}if(b){o=n-4|0;d=H[n+4>>2]>>>26&4|(H[o>>2]>>>28&1|(g>>>21&16|(g>>>25&64|p&170)));m=u+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;p=I[d+24640|0];Xb:{if(k>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Yb:{if(f){break Yb}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Yb}H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break Yb}H[e+16>>2]=c;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break Xb}k=k-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Zb:{if(f){break Zb}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break Zb}H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break Zb}H[e+16>>2]=d;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break Xb}b=H[h+4>>2]}H[q+768>>2]=(p|0)==(b|0)?j:l;H[o>>2]=H[o>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;H[n+260>>2]=H[n+260>>2]|4;H[n+268>>2]=H[n+268>>2]|1;b=b^p;H[n+264>>2]=H[n+264>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;b=q+4|0;v=v+1|0;if((v|0)!=64){continue}break}g=n+12|0;b=q+772|0;q=r>>>0<60;r=r+4|0;if(q){continue}break}break zb}b=1<>>1|b;q=H[e+120>>2];g=(q+(D<<2)|0)+12|0;b=H[e+128>>2];f=H[e+8>>2];c=H[e+4>>2];k=H[e>>2];m=H[e+104>>2];p=H[e+116>>2];_b:{if(Z&8){$b:{if(b>>>0<4){break $b}if(D){t=N(D,12);o=D<<3;q=0-l|0;M=e+28|0;while(1){w=0;while(1){n=g;g=H[g>>2];if(g){ac:{if(g&2097168){break ac}b=g&495;if(!b){break ac}m=M+(I[b+H[e+108>>2]|0]<<2)|0;r=H[m>>2];b=H[r>>2];c=c-b|0;bc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;i=H[r+4>>2];if(c&32768){break bc}i=H[r+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[r+(b?12:8)>>2];while(1){cc:{if(f){break cc}f=H[e+16>>2];d=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(r<<8)+k|0;break cc}if(r>>>0<=143){H[e+16>>2]=d;k=(r<<9)+k|0;f=7;break cc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}i=b?!i:i;break bc}i=H[r+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[r+(d?8:12)>>2];while(1){dc:{if(f){break dc}f=H[e+16>>2];c=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(r<<8)+k|0;break dc}if(r>>>0<=143){H[e+16>>2]=c;k=(r<<9)+k|0;f=7;break dc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;i=d?i:!i}if(i){h=n-4|0;d=H[n+4>>2]>>>17&4|(H[h>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));m=M+(I[d+24384|0]<<2)|0;u=H[m>>2];b=H[u>>2];c=c-b|0;i=I[d+24640|0];ec:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;s=H[u+4>>2];if(c&32768){break ec}r=H[u+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[u+(b?12:8)>>2];while(1){fc:{if(f){break fc}f=H[e+16>>2];d=f+1|0;u=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(u<<8)+k|0;break fc}if(u>>>0<=143){H[e+16>>2]=d;k=(u<<9)+k|0;f=7;break fc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!r:r;break ec}r=H[u+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[u+(d?8:12)>>2];while(1){gc:{if(f){break gc}f=H[e+16>>2];c=f+1|0;u=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(u<<8)+k|0;break gc}if(u>>>0<=143){H[e+16>>2]=c;k=(u<<9)+k|0;f=7;break gc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?r:!r}b=s;H[p>>2]=(i|0)==(b|0)?l:q;H[h>>2]=H[h>>2]|32;H[n+4>>2]=H[n+4>>2]|8;g=(b^i)<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){i=g>>>3|0;m=M+(I[H[e+108>>2]+(i&495)|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;hc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;s=H[h+4>>2];if(c&32768){break hc}r=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){ic:{if(f){break ic}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(h<<8)+k|0;break ic}if(h>>>0<=143){H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break ic}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!r:r;break hc}r=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){jc:{if(f){break jc}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(h<<8)+k|0;break jc}if(h>>>0<=143){H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break jc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?r:!r}if(s){u=n-4|0;d=H[n+4>>2]>>>20&4|(H[u>>2]>>>22&1|(g>>>15&16|(g>>>19&64|i&170)));m=M+(I[d+24384|0]<<2)|0;s=H[m>>2];b=H[s>>2];c=c-b|0;r=(D<<2)+p|0;i=I[d+24640|0];kc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;A=H[s+4>>2];if(c&32768){break kc}h=H[s+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[s+(b?12:8)>>2];while(1){lc:{if(f){break lc}f=H[e+16>>2];d=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(s<<8)+k|0;break lc}if(s>>>0<=143){H[e+16>>2]=d;k=(s<<9)+k|0;f=7;break lc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}A=b?!h:h;break kc}h=H[s+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[s+(d?8:12)>>2];while(1){mc:{if(f){break mc}f=H[e+16>>2];c=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(s<<8)+k|0;break mc}if(s>>>0<=143){H[e+16>>2]=c;k=(s<<9)+k|0;f=7;break mc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;A=d?h:!h}b=A;H[r>>2]=(i|0)==(b|0)?l:q;H[u>>2]=H[u>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^i)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){i=g>>>6|0;m=M+(I[H[e+108>>2]+(i&495)|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;nc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;s=H[h+4>>2];if(c&32768){break nc}r=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){oc:{if(f){break oc}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(h<<8)+k|0;break oc}if(h>>>0<=143){H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break oc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!r:r;break nc}r=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){pc:{if(f){break pc}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(h<<8)+k|0;break pc}if(h>>>0<=143){H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break pc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?r:!r}if(s){u=n-4|0;d=H[n+4>>2]>>>23&4|(H[u>>2]>>>25&1|(g>>>18&16|(g>>>22&64|i&170)));m=M+(I[d+24384|0]<<2)|0;s=H[m>>2];b=H[s>>2];c=c-b|0;r=o+p|0;i=I[d+24640|0];qc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;A=H[s+4>>2];if(c&32768){break qc}h=H[s+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[s+(b?12:8)>>2];while(1){rc:{if(f){break rc}f=H[e+16>>2];d=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(s<<8)+k|0;break rc}if(s>>>0<=143){H[e+16>>2]=d;k=(s<<9)+k|0;f=7;break rc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}A=b?!h:h;break qc}h=H[s+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[s+(d?8:12)>>2];while(1){sc:{if(f){break sc}f=H[e+16>>2];c=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(s<<8)+k|0;break sc}if(s>>>0<=143){H[e+16>>2]=c;k=(s<<9)+k|0;f=7;break sc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;A=d?h:!h}b=A;H[r>>2]=(i|0)==(b|0)?l:q;H[u>>2]=H[u>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^i)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){i=g>>>9|0;m=M+(I[H[e+108>>2]+(i&495)|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;tc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;s=H[h+4>>2];if(c&32768){break tc}r=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){uc:{if(f){break uc}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(h<<8)+k|0;break uc}if(h>>>0<=143){H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break uc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!r:r;break tc}r=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){vc:{if(f){break vc}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(h<<8)+k|0;break vc}if(h>>>0<=143){H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break vc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?r:!r}if(s){u=n-4|0;d=H[n+4>>2]>>>26&4|(H[u>>2]>>>28&1|(g>>>21&16|(g>>>25&64|i&170)));m=M+(I[d+24384|0]<<2)|0;s=H[m>>2];b=H[s>>2];c=c-b|0;r=p+t|0;i=I[d+24640|0];wc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;A=H[s+4>>2];if(c&32768){break wc}h=H[s+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[s+(b?12:8)>>2];while(1){xc:{if(f){break xc}f=H[e+16>>2];d=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(s<<8)+k|0;break xc}if(s>>>0<=143){H[e+16>>2]=d;k=(s<<9)+k|0;f=7;break xc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}A=b?!h:h;break wc}h=H[s+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[s+(d?8:12)>>2];while(1){yc:{if(f){break yc}f=H[e+16>>2];c=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(s<<8)+k|0;break yc}if(s>>>0<=143){H[e+16>>2]=c;k=(s<<9)+k|0;f=7;break yc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;A=d?h:!h}b=A;H[r>>2]=(i|0)==(b|0)?l:q;H[u>>2]=H[u>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;d=n+(H[e+124>>2]<<2)|0;H[d+4>>2]=H[d+4>>2]|4;H[d+12>>2]=H[d+12>>2]|1;b=b^i;H[d+8>>2]=H[d+8>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;p=p+4|0;w=w+1|0;if((D|0)!=(w|0)){continue}break}g=n+12|0;p=p+t|0;j=j+4|0;b=H[e+128>>2];if(j>>>0<(b&-4)>>>0){continue}break}break $b}g=(b&-4)-1|0;j=(g&-4)+4|0;g=(q+(g<<1&-8)|0)+20|0}H[e+8>>2]=f;H[e+4>>2]=c;H[e>>2]=k;H[e+104>>2]=m;if(!D|b>>>0<=j>>>0){break _b}while(1){c=(b|0)==(j|0);f=0;b=j;if(!c){while(1){hc(e,g,(N(f,D)<<2)+p|0,l,f,H[e+124>>2]+2|0,1);f=f+1|0;b=H[e+128>>2];if(f>>>0>>0){continue}break}}g=g+4|0;p=p+4|0;v=v+1|0;if((D|0)!=(v|0)){continue}break}break _b}zc:{if(b>>>0<4){break zc}if(D){t=N(D,12);o=D<<3;q=0-l|0;M=e+28|0;while(1){w=0;while(1){n=g;g=H[g>>2];if(g){Ac:{if(g&2097168){break Ac}b=g&495;if(!b){break Ac}m=M+(I[b+H[e+108>>2]|0]<<2)|0;r=H[m>>2];b=H[r>>2];c=c-b|0;Bc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;i=H[r+4>>2];if(c&32768){break Bc}i=H[r+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[r+(b?12:8)>>2];while(1){Cc:{if(f){break Cc}f=H[e+16>>2];d=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(r<<8)+k|0;break Cc}if(r>>>0<=143){H[e+16>>2]=d;k=(r<<9)+k|0;f=7;break Cc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}i=b?!i:i;break Bc}i=H[r+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[r+(d?8:12)>>2];while(1){Dc:{if(f){break Dc}f=H[e+16>>2];c=f+1|0;r=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(r<<8)+k|0;break Dc}if(r>>>0<=143){H[e+16>>2]=c;k=(r<<9)+k|0;f=7;break Dc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;i=d?i:!i}if(i){h=n-4|0;d=H[n+4>>2]>>>17&4|(H[h>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));m=M+(I[d+24384|0]<<2)|0;u=H[m>>2];b=H[u>>2];c=c-b|0;i=I[d+24640|0];Ec:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;d=H[u+4>>2];if(c&32768){break Ec}r=H[u+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[u+(b?12:8)>>2];while(1){Fc:{if(f){break Fc}f=H[e+16>>2];d=f+1|0;u=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(u<<8)+k|0;break Fc}if(u>>>0<=143){H[e+16>>2]=d;k=(u<<9)+k|0;f=7;break Fc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break Ec}r=H[u+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[u+(d?8:12)>>2];while(1){Gc:{if(f){break Gc}f=H[e+16>>2];c=f+1|0;u=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(u<<8)+k|0;break Gc}if(u>>>0<=143){H[e+16>>2]=c;k=(u<<9)+k|0;f=7;break Gc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}H[p>>2]=(i|0)==(d|0)?l:q;H[h>>2]=H[h>>2]|32;H[n+4>>2]=H[n+4>>2]|8;b=n+(-2-H[e+124>>2]<<2)|0;H[b+4>>2]=H[b+4>>2]|32768;d=d^i;H[b>>2]=H[b>>2]|d<<31|65536;b=b-4|0;H[b>>2]=H[b>>2]|131072;g=d<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){i=g>>>3|0;m=M+(I[H[e+108>>2]+(i&495)|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;Hc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;s=H[h+4>>2];if(c&32768){break Hc}r=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Ic:{if(f){break Ic}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(h<<8)+k|0;break Ic}if(h>>>0<=143){H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break Ic}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!r:r;break Hc}r=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Jc:{if(f){break Jc}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(h<<8)+k|0;break Jc}if(h>>>0<=143){H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break Jc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?r:!r}if(s){u=n-4|0;d=H[n+4>>2]>>>20&4|(H[u>>2]>>>22&1|(g>>>15&16|(g>>>19&64|i&170)));m=M+(I[d+24384|0]<<2)|0;s=H[m>>2];b=H[s>>2];c=c-b|0;r=(D<<2)+p|0;i=I[d+24640|0];Kc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;A=H[s+4>>2];if(c&32768){break Kc}h=H[s+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[s+(b?12:8)>>2];while(1){Lc:{if(f){break Lc}f=H[e+16>>2];d=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(s<<8)+k|0;break Lc}if(s>>>0<=143){H[e+16>>2]=d;k=(s<<9)+k|0;f=7;break Lc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}A=b?!h:h;break Kc}h=H[s+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[s+(d?8:12)>>2];while(1){Mc:{if(f){break Mc}f=H[e+16>>2];c=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(s<<8)+k|0;break Mc}if(s>>>0<=143){H[e+16>>2]=c;k=(s<<9)+k|0;f=7;break Mc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;A=d?h:!h}b=A;H[r>>2]=(i|0)==(b|0)?l:q;H[u>>2]=H[u>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^i)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){i=g>>>6|0;m=M+(I[H[e+108>>2]+(i&495)|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;Nc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;s=H[h+4>>2];if(c&32768){break Nc}r=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Oc:{if(f){break Oc}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(h<<8)+k|0;break Oc}if(h>>>0<=143){H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break Oc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!r:r;break Nc}r=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Pc:{if(f){break Pc}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(h<<8)+k|0;break Pc}if(h>>>0<=143){H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break Pc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?r:!r}if(s){u=n-4|0;d=H[n+4>>2]>>>23&4|(H[u>>2]>>>25&1|(g>>>18&16|(g>>>22&64|i&170)));m=M+(I[d+24384|0]<<2)|0;s=H[m>>2];b=H[s>>2];c=c-b|0;r=o+p|0;i=I[d+24640|0];Qc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;A=H[s+4>>2];if(c&32768){break Qc}h=H[s+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[s+(b?12:8)>>2];while(1){Rc:{if(f){break Rc}f=H[e+16>>2];d=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(s<<8)+k|0;break Rc}if(s>>>0<=143){H[e+16>>2]=d;k=(s<<9)+k|0;f=7;break Rc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}A=b?!h:h;break Qc}h=H[s+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[s+(d?8:12)>>2];while(1){Sc:{if(f){break Sc}f=H[e+16>>2];c=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(s<<8)+k|0;break Sc}if(s>>>0<=143){H[e+16>>2]=c;k=(s<<9)+k|0;f=7;break Sc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;A=d?h:!h}b=A;H[r>>2]=(i|0)==(b|0)?l:q;H[u>>2]=H[u>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^i)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){i=g>>>9|0;m=M+(I[H[e+108>>2]+(i&495)|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;Tc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;s=H[h+4>>2];if(c&32768){break Tc}r=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Uc:{if(f){break Uc}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(h<<8)+k|0;break Uc}if(h>>>0<=143){H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break Uc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!r:r;break Tc}r=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Vc:{if(f){break Vc}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(h<<8)+k|0;break Vc}if(h>>>0<=143){H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break Vc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?r:!r}if(s){u=n-4|0;d=H[n+4>>2]>>>26&4|(H[u>>2]>>>28&1|(g>>>21&16|(g>>>25&64|i&170)));m=M+(I[d+24384|0]<<2)|0;s=H[m>>2];b=H[s>>2];c=c-b|0;r=p+t|0;i=I[d+24640|0];Wc:{if(k>>>16>>>0>=b>>>0){k=k-(b<<16)|0;A=H[s+4>>2];if(c&32768){break Wc}h=H[s+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[s+(b?12:8)>>2];while(1){Xc:{if(f){break Xc}f=H[e+16>>2];d=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=d;f=8;k=(s<<8)+k|0;break Xc}if(s>>>0<=143){H[e+16>>2]=d;k=(s<<9)+k|0;f=7;break Xc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}A=b?!h:h;break Wc}h=H[s+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[s+(d?8:12)>>2];while(1){Yc:{if(f){break Yc}f=H[e+16>>2];c=f+1|0;s=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=c;f=8;k=(s<<8)+k|0;break Yc}if(s>>>0<=143){H[e+16>>2]=c;k=(s<<9)+k|0;f=7;break Yc}H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;A=d?h:!h}b=A;H[r>>2]=(i|0)==(b|0)?l:q;H[u>>2]=H[u>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;d=n+(H[e+124>>2]<<2)|0;H[d+4>>2]=H[d+4>>2]|4;H[d+12>>2]=H[d+12>>2]|1;b=b^i;H[d+8>>2]=H[d+8>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;p=p+4|0;w=w+1|0;if((D|0)!=(w|0)){continue}break}g=n+12|0;p=p+t|0;j=j+4|0;b=H[e+128>>2];if(j>>>0<(b&-4)>>>0){continue}break}break zc}g=(b&-4)-1|0;j=(g&-4)+4|0;g=(q+(g<<1&-8)|0)+20|0}H[e+8>>2]=f;H[e+4>>2]=c;H[e>>2]=k;H[e+104>>2]=m;if(!D|b>>>0<=j>>>0){break _b}while(1){c=(b|0)==(j|0);f=0;b=j;if(!c){while(1){hc(e,g,(N(f,D)<<2)+p|0,l,f,H[e+124>>2]+2|0,0);f=f+1|0;b=H[e+128>>2];if(f>>>0>>0){continue}break}}g=g+4|0;p=p+4|0;v=v+1|0;if((D|0)!=(v|0)){continue}break}}break yb}while(1){v=0;while(1){q=b;n=g;g=H[g>>2];if(g){Zc:{if(g&2097168){break Zc}b=g&495;if(!b){break Zc}m=u+(I[b+H[e+108>>2]|0]<<2)|0;i=H[m>>2];b=H[i>>2];c=c-b|0;_c:{if(k>>>16>>>0>>0){p=H[i+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[i+(d?8:12)>>2];while(1){$c:{if(f){break $c}f=H[e+16>>2];c=f+1|0;i=I[f+1|0];if(I[f|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break $c}H[e+16>>2]=c;k=(i<<9)+k|0;f=7;break $c}H[e+16>>2]=c;f=8;k=(i<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?p:!p;break _c}k=k-(b<<16)|0;if(!(c&32768)){p=H[i+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[i+(b?12:8)>>2];while(1){ad:{if(f){break ad}f=H[e+16>>2];d=f+1|0;i=I[f+1|0];if(I[f|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break ad}H[e+16>>2]=d;k=(i<<9)+k|0;f=7;break ad}H[e+16>>2]=d;f=8;k=(i<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!p:p;break _c}b=H[i+4>>2]}if(b){o=n-4|0;d=H[n+4>>2]>>>17&4|(H[o>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));m=u+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;p=I[d+24640|0];bd:{if(k>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){cd:{if(f){break cd}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break cd}H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break cd}H[e+16>>2]=c;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break bd}k=k-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){dd:{if(f){break dd}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break dd}H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break dd}H[e+16>>2]=d;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break bd}b=H[h+4>>2]}H[q>>2]=(p|0)==(b|0)?j:l;H[o>>2]=H[o>>2]|32;H[n+4>>2]=H[n+4>>2]|8;g=(b^p)<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){p=g>>>3|0;m=u+(I[H[e+108>>2]+(p&495)|0]<<2)|0;o=H[m>>2];b=H[o>>2];c=c-b|0;ed:{if(k>>>16>>>0>>0){i=H[o+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[o+(d?8:12)>>2];while(1){fd:{if(f){break fd}f=H[e+16>>2];c=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break fd}H[e+16>>2]=c;k=(o<<9)+k|0;f=7;break fd}H[e+16>>2]=c;f=8;k=(o<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break ed}k=k-(b<<16)|0;if(!(c&32768)){i=H[o+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[o+(b?12:8)>>2];while(1){gd:{if(f){break gd}f=H[e+16>>2];d=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break gd}H[e+16>>2]=d;k=(o<<9)+k|0;f=7;break gd}H[e+16>>2]=d;f=8;k=(o<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break ed}b=H[o+4>>2]}if(b){o=n-4|0;d=H[n+4>>2]>>>20&4|(H[o>>2]>>>22&1|(g>>>15&16|(g>>>19&64|p&170)));m=u+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;p=I[d+24640|0];hd:{if(k>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){id:{if(f){break id}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break id}H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break id}H[e+16>>2]=c;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break hd}k=k-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){jd:{if(f){break jd}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break jd}H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break jd}H[e+16>>2]=d;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break hd}b=H[h+4>>2]}H[q+256>>2]=(p|0)==(b|0)?j:l;H[o>>2]=H[o>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^p)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){p=g>>>6|0;m=u+(I[H[e+108>>2]+(p&495)|0]<<2)|0;o=H[m>>2];b=H[o>>2];c=c-b|0;kd:{if(k>>>16>>>0>>0){i=H[o+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[o+(d?8:12)>>2];while(1){ld:{if(f){break ld}f=H[e+16>>2];c=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break ld}H[e+16>>2]=c;k=(o<<9)+k|0;f=7;break ld}H[e+16>>2]=c;f=8;k=(o<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break kd}k=k-(b<<16)|0;if(!(c&32768)){i=H[o+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[o+(b?12:8)>>2];while(1){md:{if(f){break md}f=H[e+16>>2];d=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break md}H[e+16>>2]=d;k=(o<<9)+k|0;f=7;break md}H[e+16>>2]=d;f=8;k=(o<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break kd}b=H[o+4>>2]}if(b){o=n-4|0;d=H[n+4>>2]>>>23&4|(H[o>>2]>>>25&1|(g>>>18&16|(g>>>22&64|p&170)));m=u+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;p=I[d+24640|0];nd:{if(k>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){od:{if(f){break od}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break od}H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break od}H[e+16>>2]=c;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break nd}k=k-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){pd:{if(f){break pd}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break pd}H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break pd}H[e+16>>2]=d;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break nd}b=H[h+4>>2]}H[q+512>>2]=(p|0)==(b|0)?j:l;H[o>>2]=H[o>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^p)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){p=g>>>9|0;m=u+(I[H[e+108>>2]+(p&495)|0]<<2)|0;o=H[m>>2];b=H[o>>2];c=c-b|0;qd:{if(k>>>16>>>0>>0){i=H[o+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[o+(d?8:12)>>2];while(1){rd:{if(f){break rd}f=H[e+16>>2];c=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break rd}H[e+16>>2]=c;k=(o<<9)+k|0;f=7;break rd}H[e+16>>2]=c;f=8;k=(o<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break qd}k=k-(b<<16)|0;if(!(c&32768)){i=H[o+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[o+(b?12:8)>>2];while(1){sd:{if(f){break sd}f=H[e+16>>2];d=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break sd}H[e+16>>2]=d;k=(o<<9)+k|0;f=7;break sd}H[e+16>>2]=d;f=8;k=(o<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break qd}b=H[o+4>>2]}if(b){o=n-4|0;d=H[n+4>>2]>>>26&4|(H[o>>2]>>>28&1|(g>>>21&16|(g>>>25&64|p&170)));m=u+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;p=I[d+24640|0];td:{if(k>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){ud:{if(f){break ud}f=H[e+16>>2];c=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break ud}H[e+16>>2]=c;k=(h<<9)+k|0;f=7;break ud}H[e+16>>2]=c;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break td}k=k-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){vd:{if(f){break vd}f=H[e+16>>2];d=f+1|0;h=I[f+1|0];if(I[f|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;k=k+65280|0;f=8;break vd}H[e+16>>2]=d;k=(h<<9)+k|0;f=7;break vd}H[e+16>>2]=d;f=8;k=(h<<8)+k|0}f=f-1|0;k=k<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break td}b=H[h+4>>2]}H[q+768>>2]=(p|0)==(b|0)?j:l;H[o>>2]=H[o>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;H[n+260>>2]=H[n+260>>2]|4;H[n+268>>2]=H[n+268>>2]|1;b=b^p;H[n+264>>2]=H[n+264>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;b=q+4|0;v=v+1|0;if((v|0)!=64){continue}break}g=n+12|0;b=q+772|0;q=r>>>0<60;r=r+4|0;if(q){continue}break}}H[e+8>>2]=f;H[e+4>>2]=c;H[e>>2]=k;H[e+104>>2]=m}break _a;case 0:if(!na){o=1<>>1|0;r=H[e+124>>2];d=r<<2;b=(d+H[e+120>>2]|0)+12|0;g=H[e+116>>2];k=0;c=H[e+128>>2];if(c>>>0>=4){if(!r){break Za}p=N(r,12);n=r<<3;i=0-o|0;while(1){c=0;while(1){l=b;b=H[b>>2];wd:{if(!b){break wd}if((b&2097168)==16){b=H[e>>2];h=H[e+8>>2];xd:{if(h){break xd}j=(b|0)==255;q=H[e+16>>2];b=I[q|0];yd:{if(!j){H[e>>2]=b;H[e+16>>2]=q+1;break yd}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=q+1;h=7;break xd}b=255;H[e>>2]=255}h=8}j=h-1|0;H[e+8>>2]=j;j=b>>>j&1;b=H[g>>2];H[g>>2]=((j|0)==(b>>>31|0)?i:o)+b;b=H[l>>2]|1048576;H[l>>2]=b}if((b&16777344)==128){b=H[e>>2];h=H[e+8>>2];zd:{if(h){break zd}j=(b|0)==255;q=H[e+16>>2];b=I[q|0];Ad:{if(!j){H[e>>2]=b;H[e+16>>2]=q+1;break Ad}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=q+1;h=7;break zd}b=255;H[e>>2]=255}h=8}q=h-1|0;H[e+8>>2]=q;j=d+g|0;f=H[j>>2];H[j>>2]=f+((b>>>q&1)==(f>>>31|0)?i:o);b=H[l>>2]|8388608;H[l>>2]=b}if((b&134218752)==1024){b=H[e>>2];h=H[e+8>>2];Bd:{if(h){break Bd}j=(b|0)==255;q=H[e+16>>2];b=I[q|0];Cd:{if(!j){H[e>>2]=b;H[e+16>>2]=q+1;break Cd}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=q+1;h=7;break Bd}b=255;H[e>>2]=255}h=8}q=h-1|0;H[e+8>>2]=q;j=g+n|0;f=H[j>>2];H[j>>2]=f+((b>>>q&1)==(f>>>31|0)?i:o);b=H[l>>2]|67108864;H[l>>2]=b}if((b&1073750016)!=8192){break wd}b=H[e>>2];h=H[e+8>>2];Dd:{if(h){break Dd}j=(b|0)==255;q=H[e+16>>2];b=I[q|0];Ed:{if(!j){H[e>>2]=b;H[e+16>>2]=q+1;break Ed}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=q+1;h=7;break Dd}b=255;H[e>>2]=255}h=8}q=h-1|0;H[e+8>>2]=q;j=g+p|0;f=H[j>>2];H[j>>2]=f+((b>>>q&1)==(f>>>31|0)?i:o);H[l>>2]=H[l>>2]|536870912}g=g+4|0;b=l+4|0;c=c+1|0;if((r|0)!=(c|0)){continue}break}g=g+p|0;b=l+12|0;k=k+4|0;c=H[e+128>>2];if(k>>>0<(c&-4)>>>0){continue}break}}if(!r|c>>>0<=k>>>0){break _a}v=0;j=0-o|0;d=c;while(1){Fd:{if((d|0)==(k|0)){d=k;break Fd}h=H[b>>2];i=0;while(1){d=N(i,3);if((2097168<>2];m=H[e+8>>2];Gd:{if(m){break Gd}l=(c|0)!=255;q=H[e+16>>2];c=I[q|0];Hd:{if(!l){if(c>>>0>=144){c=255;H[e>>2]=255;break Hd}H[e>>2]=c;H[e+16>>2]=q+1;m=7;break Gd}H[e>>2]=c;H[e+16>>2]=q+1}m=8}l=m-1|0;H[e+8>>2]=l;l=c>>>l&1;c=H[n>>2];H[n>>2]=((l|0)==(c>>>31|0)?j:o)+c;h=H[b>>2]|1048576<>2]=h;c=H[e+128>>2]}i=i+1|0;d=c;if(i>>>0>>0){continue}break}}g=g+4|0;b=b+4|0;v=v+1|0;if((r|0)!=(v|0)){continue}break}break _a}j=H[e+120>>2];d=H[e+116>>2];s=H[e+124>>2];c=H[e+128>>2];if(!((s|0)!=64|(c|0)!=64)){c=j+268|0;r=0;u=1<>>1|0;h=0-u|0;i=H[e+8>>2];g=H[e+4>>2];b=H[e>>2];k=H[e+104>>2];while(1){m=0;while(1){q=d;j=c;d=H[c>>2];if(d){l=c;if((d&2097168)==16){k=da+((d&1048576?16:d&495?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;Id:{if(b>>>16>>>0>>0){p=H[f+4>>2];n=c>>>0>g>>>0;H[k>>2]=H[f+(n?8:12)>>2];while(1){Jd:{if(i){break Jd}f=H[e+16>>2];g=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Jd}H[e+16>>2]=g;b=(o<<9)+b|0;i=7;break Jd}H[e+16>>2]=g;i=8;b=(o<<8)+b|0}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?p:!p;break Id}b=b-(c<<16)|0;if(!(g&32768)){p=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){Kd:{if(i){break Kd}f=H[e+16>>2];n=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Kd}H[e+16>>2]=n;b=(o<<9)+b|0;i=7;break Kd}H[e+16>>2]=n;i=8;b=(o<<8)+b|0}i=i-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!p:p;break Id}n=H[f+4>>2]}c=H[q>>2];H[q>>2]=((n|0)==(c>>>31|0)?h:u)+c;d=d|1048576}if((d&16777344)==128){k=da+((d&8388608?16:d&3960?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;Ld:{if(b>>>16>>>0>>0){p=H[f+4>>2];n=c>>>0>g>>>0;H[k>>2]=H[f+(n?8:12)>>2];while(1){Md:{if(i){break Md}f=H[e+16>>2];g=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Md}H[e+16>>2]=g;b=(o<<9)+b|0;i=7;break Md}H[e+16>>2]=g;i=8;b=(o<<8)+b|0}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?p:!p;break Ld}b=b-(c<<16)|0;if(!(g&32768)){p=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){Nd:{if(i){break Nd}f=H[e+16>>2];n=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Nd}H[e+16>>2]=n;b=(o<<9)+b|0;i=7;break Nd}H[e+16>>2]=n;i=8;b=(o<<8)+b|0}i=i-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!p:p;break Ld}n=H[f+4>>2]}c=H[q+256>>2];H[q+256>>2]=((n|0)==(c>>>31|0)?h:u)+c;d=d|8388608}if((d&134218752)==1024){k=da+((d&67108864?16:d&31680?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;Od:{if(b>>>16>>>0>>0){p=H[f+4>>2];n=c>>>0>g>>>0;H[k>>2]=H[f+(n?8:12)>>2];while(1){Pd:{if(i){break Pd}f=H[e+16>>2];g=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Pd}H[e+16>>2]=g;b=(o<<9)+b|0;i=7;break Pd}H[e+16>>2]=g;i=8;b=(o<<8)+b|0}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?p:!p;break Od}b=b-(c<<16)|0;if(!(g&32768)){p=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){Qd:{if(i){break Qd}f=H[e+16>>2];n=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Qd}H[e+16>>2]=n;b=(o<<9)+b|0;i=7;break Qd}H[e+16>>2]=n;i=8;b=(o<<8)+b|0}i=i-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!p:p;break Od}n=H[f+4>>2]}c=H[q+512>>2];H[q+512>>2]=((n|0)==(c>>>31|0)?h:u)+c;d=d|67108864}if((d&1073750016)==8192){k=da+((d&536870912?16:d&253440?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;Rd:{if(b>>>16>>>0>>0){p=H[f+4>>2];n=c>>>0>g>>>0;H[k>>2]=H[f+(n?8:12)>>2];while(1){Sd:{if(i){break Sd}f=H[e+16>>2];g=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Sd}H[e+16>>2]=g;b=(o<<9)+b|0;i=7;break Sd}H[e+16>>2]=g;i=8;b=(o<<8)+b|0}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?p:!p;break Rd}b=b-(c<<16)|0;if(!(g&32768)){p=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){Td:{if(i){break Td}f=H[e+16>>2];n=f+1|0;o=I[f+1|0];if(I[f|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Td}H[e+16>>2]=n;b=(o<<9)+b|0;i=7;break Td}H[e+16>>2]=n;i=8;b=(o<<8)+b|0}i=i-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!p:p;break Rd}n=H[f+4>>2]}c=H[q+768>>2];H[q+768>>2]=((n|0)==(c>>>31|0)?h:u)+c;d=d|536870912}H[l>>2]=d}c=j+4|0;d=q+4|0;m=m+1|0;if((m|0)!=64){continue}break}c=j+12|0;d=q+772|0;l=r>>>0<60;r=r+4|0;if(l){continue}break}H[e+8>>2]=i;H[e+4>>2]=g;H[e>>2]=b;H[e+104>>2]=k;break _a}v=1<>>1|0;r=s<<2;f=(r+j|0)+12|0;i=H[e+8>>2];g=H[e+4>>2];b=H[e>>2];k=H[e+104>>2];p=0;Ud:{if(c>>>0<4){break Ud}if(s){h=N(s,12);n=s<<3;t=0-v|0;while(1){m=0;while(1){l=f;j=H[f>>2];if(j){if((j&2097168)==16){k=da+((j&1048576?16:j&495?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;Vd:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[f+4>>2];if(g&32768){break Vd}o=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){Wd:{if(i){break Wd}f=H[e+16>>2];q=f+1|0;u=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=q;i=8;b=(u<<8)+b|0;break Wd}if(u>>>0<=143){H[e+16>>2]=q;b=(u<<9)+b|0;i=7;break Wd}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!o:o;break Vd}o=H[f+4>>2];q=c>>>0>g>>>0;H[k>>2]=H[f+(q?8:12)>>2];while(1){Xd:{if(i){break Xd}f=H[e+16>>2];g=f+1|0;u=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=g;i=8;b=(u<<8)+b|0;break Xd}if(u>>>0<=143){H[e+16>>2]=g;b=(u<<9)+b|0;i=7;break Xd}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?o:!o}c=H[d>>2];H[d>>2]=((q|0)==(c>>>31|0)?t:v)+c;j=j|1048576}if((j&16777344)==128){k=da+((j&8388608?16:j&3960?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;Yd:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[f+4>>2];if(g&32768){break Yd}o=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){Zd:{if(i){break Zd}f=H[e+16>>2];q=f+1|0;u=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=q;i=8;b=(u<<8)+b|0;break Zd}if(u>>>0<=143){H[e+16>>2]=q;b=(u<<9)+b|0;i=7;break Zd}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!o:o;break Yd}o=H[f+4>>2];q=c>>>0>g>>>0;H[k>>2]=H[f+(q?8:12)>>2];while(1){_d:{if(i){break _d}f=H[e+16>>2];g=f+1|0;u=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=g;i=8;b=(u<<8)+b|0;break _d}if(u>>>0<=143){H[e+16>>2]=g;b=(u<<9)+b|0;i=7;break _d}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?o:!o}f=q;c=d+r|0;q=H[c>>2];H[c>>2]=q+((f|0)==(q>>>31|0)?t:v);j=j|8388608}if((j&134218752)==1024){k=da+((j&67108864?16:j&31680?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;$d:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[f+4>>2];if(g&32768){break $d}o=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){ae:{if(i){break ae}f=H[e+16>>2];q=f+1|0;u=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=q;i=8;b=(u<<8)+b|0;break ae}if(u>>>0<=143){H[e+16>>2]=q;b=(u<<9)+b|0;i=7;break ae}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!o:o;break $d}o=H[f+4>>2];q=c>>>0>g>>>0;H[k>>2]=H[f+(q?8:12)>>2];while(1){be:{if(i){break be}f=H[e+16>>2];g=f+1|0;u=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=g;i=8;b=(u<<8)+b|0;break be}if(u>>>0<=143){H[e+16>>2]=g;b=(u<<9)+b|0;i=7;break be}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?o:!o}f=q;c=d+n|0;q=H[c>>2];H[c>>2]=q+((f|0)==(q>>>31|0)?t:v);j=j|67108864}if((j&1073750016)==8192){k=da+((j&536870912?16:j&253440?15:14)<<2)|0;f=H[k>>2];c=H[f>>2];g=g-c|0;ce:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[f+4>>2];if(g&32768){break ce}o=H[f+4>>2];c=c>>>0>g>>>0;H[k>>2]=H[f+(c?12:8)>>2];while(1){de:{if(i){break de}f=H[e+16>>2];q=f+1|0;u=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=q;i=8;b=(u<<8)+b|0;break de}if(u>>>0<=143){H[e+16>>2]=q;b=(u<<9)+b|0;i=7;break de}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!o:o;break ce}o=H[f+4>>2];q=c>>>0>g>>>0;H[k>>2]=H[f+(q?8:12)>>2];while(1){ee:{if(i){break ee}f=H[e+16>>2];g=f+1|0;u=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=g;i=8;b=(u<<8)+b|0;break ee}if(u>>>0<=143){H[e+16>>2]=g;b=(u<<9)+b|0;i=7;break ee}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?o:!o}f=q;c=d+h|0;q=H[c>>2];H[c>>2]=q+((f|0)==(q>>>31|0)?t:v);j=j|536870912}H[l>>2]=j}f=l+4|0;d=d+4|0;m=m+1|0;if((s|0)!=(m|0)){continue}break}f=l+12|0;d=d+h|0;p=p+4|0;c=H[e+128>>2];if(p>>>0<(c&-4)>>>0){continue}break}break Ud}l=(c&-4)-1|0;p=(l&-4)+4|0;f=(j+(l<<1&-8)|0)+20|0}H[e+8>>2]=i;H[e+4>>2]=g;H[e>>2]=b;H[e+104>>2]=k;if(!s|c>>>0<=p>>>0){break _a}w=0;l=0-v|0;b=c;while(1){fe:{if((b|0)==(p|0)){b=p;break fe}i=H[f>>2];h=0;while(1){m=N(h,3);if((2097168<>>m|0;j=da+((b&1048576?16:b&495?15:14)<<2)|0;H[e+104>>2]=j;q=H[j>>2];b=H[q>>2];c=H[e+4>>2]-b|0;H[e+4>>2]=c;g=H[e>>2];ge:{if(g>>>16>>>0>>0){n=H[q+4>>2];H[e+4>>2]=b;c=b>>>0>c>>>0;H[j>>2]=H[q+(c?8:12)>>2];i=H[e+8>>2];while(1){he:{if(i){break he}q=H[e+16>>2];j=q+1|0;r=I[q+1|0];if(I[q|0]==255){if(r>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;g=g+65280|0;i=8;break he}H[e+16>>2]=j;g=(r<<9)+g|0;i=7;break he}H[e+16>>2]=j;i=8;g=(r<<8)+g|0}i=i-1|0;H[e+8>>2]=i;g=g<<1;H[e>>2]=g;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}c=c?n:!n;break ge}g=g-(b<<16)|0;H[e>>2]=g;if(!(c&32768)){n=H[q+4>>2];b=b>>>0>c>>>0;H[j>>2]=H[q+(b?12:8)>>2];i=H[e+8>>2];while(1){ie:{if(i){break ie}q=H[e+16>>2];j=q+1|0;r=I[q+1|0];if(I[q|0]==255){if(r>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;g=g+65280|0;i=8;break ie}H[e+16>>2]=j;g=(r<<9)+g|0;i=7;break ie}H[e+16>>2]=j;i=8;g=(r<<8)+g|0}i=i-1|0;H[e+8>>2]=i;g=g<<1;H[e>>2]=g;c=c<<1;H[e+4>>2]=c;if(c>>>0<32768){continue}break}c=b?!n:n;break ge}c=H[q+4>>2]}b=H[k>>2];H[k>>2]=((c|0)==(b>>>31|0)?l:v)+b;i=H[f>>2]|1048576<>2]=i;c=H[e+128>>2]}h=h+1|0;b=c;if(h>>>0>>0){continue}break}}f=f+4|0;d=d+4|0;w=w+1|0;if((s|0)!=(w|0)){continue}break};break _a;case 1:break $a}}M=0;r=0;je:{ke:{le:{X=H[e+124>>2];if(!((X|0)!=64|H[e+128>>2]!=64)){b=1<>>1|b;w=0-v|0;q=e+100|0;l=e+96|0;s=e+28|0;g=H[e+120>>2]+268|0;h=H[e+8>>2];b=H[e+4>>2];d=H[e>>2];j=H[e+104>>2];c=H[e+116>>2];if(Z&8){break le}while(1){u=0;while(1){k=c;f=g;g=H[g>>2];me:{ne:{oe:{if(!g){j=H[l>>2];g=H[j>>2];b=b-g|0;pe:{if(d>>>16>>>0>>0){n=H[j+4>>2];c=b>>>0>>0;H[l>>2]=H[j+(c?8:12)>>2];while(1){qe:{if(h){break qe}j=H[e+16>>2];b=j+1|0;p=I[j+1|0];if(I[j|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break qe}H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break qe}H[e+16>>2]=b;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?n:!n;break pe}d=d-(g<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[l>>2]=H[j+(c?12:8)>>2];while(1){re:{if(h){break re}j=H[e+16>>2];g=j+1|0;p=I[j+1|0];if(I[j|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break re}H[e+16>>2]=g;d=(p<<9)+d|0;h=7;break re}H[e+16>>2]=g;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break pe}c=H[j+4>>2]}if(!c){j=l;break me}c=H[q>>2];g=H[c>>2];b=b-g|0;se:{if(d>>>16>>>0>>0){p=H[c+4>>2];j=b>>>0>>0;c=H[(j?8:12)+c>>2];H[q>>2]=c;while(1){te:{if(h){break te}n=H[e+16>>2];b=n+1|0;i=I[n+1|0];if(I[n|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break te}H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break te}H[e+16>>2]=b;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;n=j?p:!p;break se}d=d-(g<<16)|0;if(!(b&32768)){p=H[c+4>>2];g=b>>>0>>0;c=H[(g?12:8)+c>>2];H[q>>2]=c;while(1){ue:{if(h){break ue}n=H[e+16>>2];j=n+1|0;i=I[n+1|0];if(I[n|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ue}H[e+16>>2]=j;d=(i<<9)+d|0;h=7;break ue}H[e+16>>2]=j;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=g?!p:p;break se}n=H[c+4>>2]}g=H[c>>2];b=b-g|0;ve:{if(d>>>16>>>0>>0){p=H[c+4>>2];j=c;c=b>>>0>>0;H[q>>2]=H[j+(c?8:12)>>2];while(1){we:{if(h){break we}j=H[e+16>>2];b=j+1|0;i=I[j+1|0];if(I[j|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break we}H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break we}H[e+16>>2]=b;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?p:!p;break ve}d=d-(g<<16)|0;if(!(b&32768)){p=H[c+4>>2];j=c;c=b>>>0>>0;H[q>>2]=H[j+(c?12:8)>>2];while(1){xe:{if(h){break xe}j=H[e+16>>2];g=j+1|0;i=I[j+1|0];if(I[j|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break xe}H[e+16>>2]=g;d=(i<<9)+d|0;h=7;break xe}H[e+16>>2]=g;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!p:p;break ve}c=H[c+4>>2]}g=0;j=q;ye:{ze:{Ae:{Be:{Ce:{switch(c|n<<1){case 0:i=f-4|0;j=H[f+4>>2]>>>17&4|H[i>>2]>>>19&1;c=s+(I[j+24384|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;De:{if(d>>>16>>>0>>0){p=H[n+4>>2];A=c;c=b>>>0>>0;H[A>>2]=H[n+(c?8:12)>>2];while(1){Ee:{if(h){break Ee}n=H[e+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ee}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Ee}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;n=c?p:!p;break De}d=d-(g<<16)|0;if(!(b&32768)){p=H[n+4>>2];A=c;c=b>>>0>>0;H[A>>2]=H[n+(c?12:8)>>2];while(1){Fe:{if(h){break Fe}n=H[e+16>>2];g=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Fe}H[e+16>>2]=g;d=(m<<9)+d|0;h=7;break Fe}H[e+16>>2]=g;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!p:p;break De}n=H[n+4>>2]}g=I[j+24640|0];H[k>>2]=(n|0)==(g|0)?v:w;H[i>>2]=H[i>>2]|32;H[f+4>>2]=H[f+4>>2]|8;c=f-268|0;H[c>>2]=H[c>>2]|131072;c=f-260|0;H[c>>2]=H[c>>2]|32768;c=f-264|0;j=c;i=H[c>>2];c=g^n;H[j>>2]=i|c<<31|65536;j=c<<19;i=H[e+108>>2];c=s+(I[i+2|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;Ge:{if(d>>>16>>>0>>0){p=H[n+4>>2];A=c;c=b>>>0>>0;H[A>>2]=H[n+(c?8:12)>>2];while(1){He:{if(h){break He}n=H[e+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break He}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break He}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?p:!p;break Ge}d=d-(g<<16)|0;if(!(b&32768)){p=H[n+4>>2];A=c;c=b>>>0>>0;H[A>>2]=H[n+(c?12:8)>>2];while(1){Ie:{if(h){break Ie}n=H[e+16>>2];g=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ie}H[e+16>>2]=g;d=(m<<9)+d|0;h=7;break Ie}H[e+16>>2]=g;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!p:p;break Ge}c=H[n+4>>2]}g=j|16;if(!c){break Be}break;case 1:break Ce;case 2:break Ae;case 3:break ye;default:break ne}}m=f-4|0;n=H[f+4>>2]>>>20&4|(H[m>>2]>>>22&1|(g>>>15&16|(g>>>19&64|g>>>3&170)));j=s+(I[n+24384|0]<<2)|0;p=H[j>>2];c=H[p>>2];b=b-c|0;Je:{if(d>>>16>>>0>>0){i=H[p+4>>2];A=j;j=b>>>0>>0;H[A>>2]=H[p+(j?8:12)>>2];while(1){Ke:{if(h){break Ke}p=H[e+16>>2];b=p+1|0;o=I[p+1|0];if(I[p|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ke}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Ke}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;j=j?i:!i;break Je}d=d-(c<<16)|0;if(!(b&32768)){i=H[p+4>>2];c=b>>>0>>0;H[j>>2]=H[p+(c?12:8)>>2];while(1){Le:{if(h){break Le}p=H[e+16>>2];j=p+1|0;o=I[p+1|0];if(I[p|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Le}H[e+16>>2]=j;d=(o<<9)+d|0;h=7;break Le}H[e+16>>2]=j;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}j=c?!i:i;break Je}j=H[p+4>>2]}c=I[n+24640|0];H[k+256>>2]=(j|0)==(c|0)?v:w;H[m>>2]=H[m>>2]|256;H[f+4>>2]=H[f+4>>2]|64;i=H[e+108>>2];g=(c^j)<<22|g|128}j=s+(I[(g>>>6&495)+i|0]<<2)|0;n=H[j>>2];c=H[n>>2];b=b-c|0;Me:{if(d>>>16>>>0>>0){p=H[n+4>>2];A=j;j=b>>>0>>0;H[A>>2]=H[n+(j?8:12)>>2];while(1){Ne:{if(h){break Ne}n=H[e+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ne}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Ne}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=j?p:!p;break Me}d=d-(c<<16)|0;if(!(b&32768)){p=H[n+4>>2];c=b>>>0>>0;H[j>>2]=H[n+(c?12:8)>>2];while(1){Oe:{if(h){break Oe}n=H[e+16>>2];j=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Oe}H[e+16>>2]=j;d=(m<<9)+d|0;h=7;break Oe}H[e+16>>2]=j;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!p:p;break Me}c=H[n+4>>2]}if(!c){break ze}}m=f-4|0;n=H[f+4>>2]>>>23&4|(H[m>>2]>>>25&1|(g>>>18&16|(g>>>22&64|g>>>6&170)));j=s+(I[n+24384|0]<<2)|0;p=H[j>>2];c=H[p>>2];b=b-c|0;Pe:{if(d>>>16>>>0>>0){i=H[p+4>>2];A=j;j=b>>>0>>0;H[A>>2]=H[p+(j?8:12)>>2];while(1){Qe:{if(h){break Qe}p=H[e+16>>2];b=p+1|0;o=I[p+1|0];if(I[p|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Qe}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Qe}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;j=j?i:!i;break Pe}d=d-(c<<16)|0;if(!(b&32768)){i=H[p+4>>2];c=b>>>0>>0;H[j>>2]=H[p+(c?12:8)>>2];while(1){Re:{if(h){break Re}p=H[e+16>>2];j=p+1|0;o=I[p+1|0];if(I[p|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Re}H[e+16>>2]=j;d=(o<<9)+d|0;h=7;break Re}H[e+16>>2]=j;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}j=c?!i:i;break Pe}j=H[p+4>>2]}c=I[n+24640|0];H[k+512>>2]=(j|0)==(c|0)?v:w;H[m>>2]=H[m>>2]|2048;H[f+4>>2]=H[f+4>>2]|512;g=(c^j)<<25|g|1024;i=H[e+108>>2]}j=s+(I[(g>>>9&495)+i|0]<<2)|0;p=H[j>>2];c=H[p>>2];b=b-c|0;Se:{if(d>>>16>>>0>>0){i=H[p+4>>2];n=b>>>0>>0;H[j>>2]=H[p+(n?8:12)>>2];while(1){Te:{if(h){break Te}p=H[e+16>>2];b=p+1|0;m=I[p+1|0];if(I[p|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Te}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Te}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?i:!i;break Se}d=d-(c<<16)|0;if(!(b&32768)){i=H[p+4>>2];c=b>>>0>>0;H[j>>2]=H[p+(c?12:8)>>2];while(1){Ue:{if(h){break Ue}p=H[e+16>>2];n=p+1|0;m=I[p+1|0];if(I[p|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ue}H[e+16>>2]=n;d=(m<<9)+d|0;h=7;break Ue}H[e+16>>2]=n;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!i:i;break Se}c=H[p+4>>2]}if(!c){break ne}}M=f-4|0;t=H[f+4>>2]>>>26&4|(H[M>>2]>>>28&1|(g>>>21&16|(g>>>25&64|g>>>9&170)));j=s+(I[t+24384|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;break oe}Ve:{if(g&2097168){break Ve}j=s+(I[H[e+108>>2]+(g&495)|0]<<2)|0;p=H[j>>2];c=H[p>>2];b=b-c|0;We:{if(d>>>16>>>0>>0){i=H[p+4>>2];n=b>>>0>>0;H[j>>2]=H[p+(n?8:12)>>2];while(1){Xe:{if(h){break Xe}p=H[e+16>>2];b=p+1|0;m=I[p+1|0];if(I[p|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Xe}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Xe}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?i:!i;break We}d=d-(c<<16)|0;if(!(b&32768)){i=H[p+4>>2];c=b>>>0>>0;H[j>>2]=H[p+(c?12:8)>>2];while(1){Ye:{if(h){break Ye}p=H[e+16>>2];n=p+1|0;m=I[p+1|0];if(I[p|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ye}H[e+16>>2]=n;d=(m<<9)+d|0;h=7;break Ye}H[e+16>>2]=n;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!i:i;break We}c=H[p+4>>2]}if(!c){break Ve}o=f-4|0;p=H[f+4>>2]>>>17&4|(H[o>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));j=s+(I[p+24384|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;Ze:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[i+(n?8:12)>>2];while(1){_e:{if(h){break _e}i=H[e+16>>2];b=i+1|0;t=I[i+1|0];if(I[i|0]==255){if(t>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break _e}H[e+16>>2]=b;d=(t<<9)+d|0;h=7;break _e}H[e+16>>2]=b;h=8;d=(t<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=n?m:!m;break Ze}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[i+(c?12:8)>>2];while(1){$e:{if(h){break $e}i=H[e+16>>2];n=i+1|0;t=I[i+1|0];if(I[i|0]==255){if(t>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break $e}H[e+16>>2]=n;d=(t<<9)+d|0;h=7;break $e}H[e+16>>2]=n;h=8;d=(t<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!m:m;break Ze}i=H[i+4>>2]}n=I[p+24640|0];H[k>>2]=(i|0)==(n|0)?v:w;H[o>>2]=H[o>>2]|32;H[f+4>>2]=H[f+4>>2]|8;c=f-268|0;H[c>>2]=H[c>>2]|131072;c=f-260|0;H[c>>2]=H[c>>2]|32768;c=f-264|0;p=c;A=H[c>>2];c=i^n;H[p>>2]=A|c<<31|65536;g=c<<19|g|16}af:{if(g&16777344){break af}p=g>>>3|0;j=s+(I[H[e+108>>2]+(p&495)|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;bf:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[i+(n?8:12)>>2];while(1){cf:{if(h){break cf}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break cf}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break cf}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break bf}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[i+(c?12:8)>>2];while(1){df:{if(h){break df}i=H[e+16>>2];n=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break df}H[e+16>>2]=n;d=(o<<9)+d|0;h=7;break df}H[e+16>>2]=n;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break bf}c=H[i+4>>2]}if(!c){break af}o=f-4|0;p=H[f+4>>2]>>>20&4|(H[o>>2]>>>22&1|(g>>>15&16|(g>>>19&64|p&170)));j=s+(I[p+24384|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;ef:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[i+(n?8:12)>>2];while(1){ff:{if(h){break ff}i=H[e+16>>2];b=i+1|0;t=I[i+1|0];if(I[i|0]==255){if(t>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ff}H[e+16>>2]=b;d=(t<<9)+d|0;h=7;break ff}H[e+16>>2]=b;h=8;d=(t<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break ef}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[i+(c?12:8)>>2];while(1){gf:{if(h){break gf}i=H[e+16>>2];n=i+1|0;t=I[i+1|0];if(I[i|0]==255){if(t>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break gf}H[e+16>>2]=n;d=(t<<9)+d|0;h=7;break gf}H[e+16>>2]=n;h=8;d=(t<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break ef}n=H[i+4>>2]}c=I[p+24640|0];H[k+256>>2]=(n|0)==(c|0)?v:w;H[o>>2]=H[o>>2]|256;H[f+4>>2]=H[f+4>>2]|64;g=(c^n)<<22|g|128}hf:{if(g&134218752){break hf}p=g>>>6|0;j=s+(I[H[e+108>>2]+(p&495)|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;jf:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[i+(n?8:12)>>2];while(1){kf:{if(h){break kf}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break kf}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break kf}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break jf}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[i+(c?12:8)>>2];while(1){lf:{if(h){break lf}i=H[e+16>>2];n=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break lf}H[e+16>>2]=n;d=(o<<9)+d|0;h=7;break lf}H[e+16>>2]=n;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break jf}c=H[i+4>>2]}if(!c){break hf}o=f-4|0;p=H[f+4>>2]>>>23&4|(H[o>>2]>>>25&1|(g>>>18&16|(g>>>22&64|p&170)));j=s+(I[p+24384|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;mf:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[i+(n?8:12)>>2];while(1){nf:{if(h){break nf}i=H[e+16>>2];b=i+1|0;t=I[i+1|0];if(I[i|0]==255){if(t>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break nf}H[e+16>>2]=b;d=(t<<9)+d|0;h=7;break nf}H[e+16>>2]=b;h=8;d=(t<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break mf}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[i+(c?12:8)>>2];while(1){of:{if(h){break of}i=H[e+16>>2];n=i+1|0;t=I[i+1|0];if(I[i|0]==255){if(t>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break of}H[e+16>>2]=n;d=(t<<9)+d|0;h=7;break of}H[e+16>>2]=n;h=8;d=(t<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break mf}n=H[i+4>>2]}c=I[p+24640|0];H[k+512>>2]=(n|0)==(c|0)?v:w;H[o>>2]=H[o>>2]|2048;H[f+4>>2]=H[f+4>>2]|512;g=(c^n)<<25|g|1024}if(g&1073750016){break ne}p=g>>>9|0;j=s+(I[H[e+108>>2]+(p&495)|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;pf:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[i+(n?8:12)>>2];while(1){qf:{if(h){break qf}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break qf}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break qf}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break pf}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[i+(c?12:8)>>2];while(1){rf:{if(h){break rf}i=H[e+16>>2];n=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break rf}H[e+16>>2]=n;d=(o<<9)+d|0;h=7;break rf}H[e+16>>2]=n;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break pf}c=H[i+4>>2]}if(!c){break ne}M=f-4|0;t=H[f+4>>2]>>>26&4|(H[M>>2]>>>28&1|(g>>>21&16|(g>>>25&64|p&170)));j=s+(I[t+24384|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0}sf:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[(n?8:12)+i>>2];while(1){tf:{if(h){break tf}p=H[e+16>>2];b=p+1|0;i=I[p+1|0];if(I[p|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break tf}H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break tf}H[e+16>>2]=b;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break sf}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[(c?12:8)+i>>2];while(1){uf:{if(h){break uf}p=H[e+16>>2];n=p+1|0;i=I[p+1|0];if(I[p|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break uf}H[e+16>>2]=n;d=(i<<9)+d|0;h=7;break uf}H[e+16>>2]=n;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break sf}n=H[i+4>>2]}c=I[t+24640|0];H[k+768>>2]=(n|0)==(c|0)?v:w;H[M>>2]=H[M>>2]|16384;H[f+4>>2]=H[f+4>>2]|4096;H[f+260>>2]=H[f+260>>2]|4;H[f+268>>2]=H[f+268>>2]|1;c=c^n;H[f+264>>2]=H[f+264>>2]|c<<18|2;g=c<<28|g|8192}H[f>>2]=g&-1226833921}g=f+4|0;c=k+4|0;u=u+1|0;if((u|0)!=64){continue}break}g=f+12|0;c=k+772|0;n=r>>>0<60;r=r+4|0;if(n){continue}break}break ke}b=1<>>1|b;l=H[e+120>>2];c=(l+(X<<2)|0)+12|0;g=H[e+128>>2];h=H[e+8>>2];b=H[e+4>>2];d=H[e>>2];j=H[e+104>>2];p=H[e+116>>2];if(Z&8){vf:{if(g>>>0<4){break vf}if(X){n=e+100|0;q=e+96|0;w=N(X,12);u=X<<3;s=0-A|0;D=e+28|0;while(1){v=0;while(1){k=c;c=H[c>>2];wf:{xf:{yf:{if(c){zf:{if(c&2097168){break zf}j=D+(I[H[e+108>>2]+(c&495)|0]<<2)|0;f=H[j>>2];g=H[f>>2];b=b-g|0;Af:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[f+4>>2];if(b&32768){break Af}i=H[f+4>>2];g=b>>>0>>0;H[j>>2]=H[f+(g?12:8)>>2];while(1){Bf:{if(h){break Bf}f=H[e+16>>2];l=f+1|0;m=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(m<<8)+d|0;break Bf}if(m>>>0<=143){H[e+16>>2]=l;d=(m<<9)+d|0;h=7;break Bf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!i:i;break Af}i=H[f+4>>2];l=b>>>0>>0;H[j>>2]=H[f+(l?8:12)>>2];while(1){Cf:{if(h){break Cf}f=H[e+16>>2];b=f+1|0;m=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break Cf}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Cf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?i:!i}if(!l){break zf}o=k-4|0;f=H[k+4>>2]>>>17&4|(H[o>>2]>>>19&1|(c>>>14&16|(c>>>16&64|c&170)));j=D+(I[f+24384|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;Df:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break Df}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[i+(g?12:8)>>2];while(1){Ef:{if(h){break Ef}i=H[e+16>>2];l=i+1|0;t=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(t<<8)+d|0;break Ef}if(t>>>0<=143){H[e+16>>2]=l;d=(t<<9)+d|0;h=7;break Ef}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break Df}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){Ff:{if(h){break Ff}i=H[e+16>>2];b=i+1|0;t=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(t<<8)+d|0;break Ff}if(t>>>0<=143){H[e+16>>2]=b;d=(t<<9)+d|0;h=7;break Ff}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}g=I[f+24640|0];H[p>>2]=(l|0)==(g|0)?A:s;H[o>>2]=H[o>>2]|32;H[k+4>>2]=H[k+4>>2]|8;c=(g^l)<<19|c|16}Gf:{if(c&16777344){break Gf}f=c>>>3|0;j=D+(I[H[e+108>>2]+(f&495)|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;Hf:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break Hf}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[i+(g?12:8)>>2];while(1){If:{if(h){break If}i=H[e+16>>2];l=i+1|0;o=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(o<<8)+d|0;break If}if(o>>>0<=143){H[e+16>>2]=l;d=(o<<9)+d|0;h=7;break If}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break Hf}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){Jf:{if(h){break Jf}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(o<<8)+d|0;break Jf}if(o>>>0<=143){H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Jf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}if(!l){break Gf}o=k-4|0;f=H[k+4>>2]>>>20&4|(H[o>>2]>>>22&1|(c>>>15&16|(c>>>19&64|f&170)));j=D+(I[f+24384|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;Y=(X<<2)+p|0;Kf:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break Kf}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[i+(g?12:8)>>2];while(1){Lf:{if(h){break Lf}i=H[e+16>>2];l=i+1|0;t=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(t<<8)+d|0;break Lf}if(t>>>0<=143){H[e+16>>2]=l;d=(t<<9)+d|0;h=7;break Lf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break Kf}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){Mf:{if(h){break Mf}i=H[e+16>>2];b=i+1|0;t=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(t<<8)+d|0;break Mf}if(t>>>0<=143){H[e+16>>2]=b;d=(t<<9)+d|0;h=7;break Mf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}g=I[f+24640|0];H[Y>>2]=(l|0)==(g|0)?A:s;H[o>>2]=H[o>>2]|256;H[k+4>>2]=H[k+4>>2]|64;c=(g^l)<<22|c|128}Nf:{if(c&134218752){break Nf}f=c>>>6|0;j=D+(I[H[e+108>>2]+(f&495)|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;Of:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break Of}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[i+(g?12:8)>>2];while(1){Pf:{if(h){break Pf}i=H[e+16>>2];l=i+1|0;o=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(o<<8)+d|0;break Pf}if(o>>>0<=143){H[e+16>>2]=l;d=(o<<9)+d|0;h=7;break Pf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break Of}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){Qf:{if(h){break Qf}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(o<<8)+d|0;break Qf}if(o>>>0<=143){H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Qf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}if(!l){break Nf}o=k-4|0;f=H[k+4>>2]>>>23&4|(H[o>>2]>>>25&1|(c>>>18&16|(c>>>22&64|f&170)));j=D+(I[f+24384|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;Y=p+u|0;Rf:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break Rf}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[i+(g?12:8)>>2];while(1){Sf:{if(h){break Sf}i=H[e+16>>2];l=i+1|0;t=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(t<<8)+d|0;break Sf}if(t>>>0<=143){H[e+16>>2]=l;d=(t<<9)+d|0;h=7;break Sf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break Rf}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){Tf:{if(h){break Tf}i=H[e+16>>2];b=i+1|0;t=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(t<<8)+d|0;break Tf}if(t>>>0<=143){H[e+16>>2]=b;d=(t<<9)+d|0;h=7;break Tf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}g=I[f+24640|0];H[Y>>2]=(l|0)==(g|0)?A:s;H[o>>2]=H[o>>2]|2048;H[k+4>>2]=H[k+4>>2]|512;c=(g^l)<<25|c|1024}if(c&1073750016){break xf}f=c>>>9|0;j=D+(I[H[e+108>>2]+(f&495)|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;Uf:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break Uf}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[i+(g?12:8)>>2];while(1){Vf:{if(h){break Vf}i=H[e+16>>2];l=i+1|0;o=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(o<<8)+d|0;break Vf}if(o>>>0<=143){H[e+16>>2]=l;d=(o<<9)+d|0;h=7;break Vf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break Uf}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){Wf:{if(h){break Wf}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(o<<8)+d|0;break Wf}if(o>>>0<=143){H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Wf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}if(!l){break xf}t=k-4|0;o=H[k+4>>2]>>>26&4|(H[t>>2]>>>28&1|(c>>>21&16|(c>>>25&64|f&170)));j=D+(I[o+24384|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;break yf}l=H[q>>2];c=H[l>>2];b=b-c|0;Xf:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[l+4>>2];if(b&32768){break Xf}j=H[l+4>>2];c=b>>>0>>0;H[q>>2]=H[l+(c?12:8)>>2];while(1){Yf:{if(h){break Yf}l=H[e+16>>2];g=l+1|0;f=I[l+1|0];if(I[l|0]!=255){H[e+16>>2]=g;h=8;d=(f<<8)+d|0;break Yf}if(f>>>0<=143){H[e+16>>2]=g;d=(f<<9)+d|0;h=7;break Yf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!j:j;break Xf}j=H[l+4>>2];g=b>>>0>>0;H[q>>2]=H[l+(g?8:12)>>2];while(1){Zf:{if(h){break Zf}l=H[e+16>>2];b=l+1|0;f=I[l+1|0];if(I[l|0]!=255){H[e+16>>2]=b;h=8;d=(f<<8)+d|0;break Zf}if(f>>>0<=143){H[e+16>>2]=b;d=(f<<9)+d|0;h=7;break Zf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=g?j:!j}if(!g){j=q;break wf}g=H[n>>2];c=H[g>>2];b=b-c|0;_f:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;l=H[g+4>>2];if(b&32768){break _f}f=H[g+4>>2];c=b>>>0>>0;g=H[(c?12:8)+g>>2];H[n>>2]=g;while(1){$f:{if(h){break $f}j=H[e+16>>2];l=j+1|0;i=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(i<<8)+d|0;break $f}if(i>>>0<=143){H[e+16>>2]=l;d=(i<<9)+d|0;h=7;break $f}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=c?!f:f;break _f}f=H[g+4>>2];l=b>>>0>>0;g=H[(l?8:12)+g>>2];H[n>>2]=g;while(1){ag:{if(h){break ag}j=H[e+16>>2];b=j+1|0;i=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(i<<8)+d|0;break ag}if(i>>>0<=143){H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break ag}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;l=l?f:!f}c=H[g>>2];b=b-c|0;bg:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;j=H[g+4>>2];if(b&32768){break bg}f=H[g+4>>2];c=b>>>0>>0;H[n>>2]=H[(c?12:8)+g>>2];while(1){cg:{if(h){break cg}j=H[e+16>>2];g=j+1|0;i=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=g;h=8;d=(i<<8)+d|0;break cg}if(i>>>0<=143){H[e+16>>2]=g;d=(i<<9)+d|0;h=7;break cg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}j=c?!f:f;break bg}f=H[g+4>>2];j=g;g=b>>>0>>0;H[n>>2]=H[j+(g?8:12)>>2];while(1){dg:{if(h){break dg}j=H[e+16>>2];b=j+1|0;i=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(i<<8)+d|0;break dg}if(i>>>0<=143){H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break dg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;j=g?f:!f}g=j;c=0;j=n;eg:{fg:{gg:{hg:{ig:{switch(g|l<<1){case 0:i=k-4|0;l=H[k+4>>2]>>>17&4|H[i>>2]>>>19&1;g=D+(I[l+24384|0]<<2)|0;j=H[g>>2];c=H[j>>2];b=b-c|0;jg:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;f=H[j+4>>2];if(b&32768){break jg}f=H[j+4>>2];c=b>>>0>>0;H[g>>2]=H[j+(c?12:8)>>2];while(1){kg:{if(h){break kg}j=H[e+16>>2];g=j+1|0;m=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=g;h=8;d=(m<<8)+d|0;break kg}if(m>>>0<=143){H[e+16>>2]=g;d=(m<<9)+d|0;h=7;break kg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=c?!f:f;break jg}f=H[j+4>>2];m=g;g=b>>>0>>0;H[m>>2]=H[j+(g?8:12)>>2];while(1){lg:{if(h){break lg}j=H[e+16>>2];b=j+1|0;m=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break lg}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break lg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;f=g?f:!f}g=f;c=I[l+24640|0];H[p>>2]=(g|0)==(c|0)?A:s;H[i>>2]=H[i>>2]|32;H[k+4>>2]=H[k+4>>2]|8;l=(c^g)<<19;i=H[e+108>>2];g=D+(I[i+2|0]<<2)|0;j=H[g>>2];c=H[j>>2];b=b-c|0;mg:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;f=H[j+4>>2];if(b&32768){break mg}f=H[j+4>>2];c=b>>>0>>0;H[g>>2]=H[j+(c?12:8)>>2];while(1){ng:{if(h){break ng}j=H[e+16>>2];g=j+1|0;m=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=g;h=8;d=(m<<8)+d|0;break ng}if(m>>>0<=143){H[e+16>>2]=g;d=(m<<9)+d|0;h=7;break ng}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=c?!f:f;break mg}f=H[j+4>>2];m=g;g=b>>>0>>0;H[m>>2]=H[j+(g?8:12)>>2];while(1){og:{if(h){break og}j=H[e+16>>2];b=j+1|0;m=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break og}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break og}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;f=g?f:!f}g=f;c=l|16;if(!g){break hg}break;case 1:break ig;case 2:break gg;case 3:break eg;default:break xf}}m=k-4|0;j=H[k+4>>2]>>>20&4|(H[m>>2]>>>22&1|(c>>>15&16|(c>>>19&64|c>>>3&170)));l=D+(I[j+24384|0]<<2)|0;f=H[l>>2];g=H[f>>2];b=b-g|0;t=(X<<2)+p|0;pg:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;i=H[f+4>>2];if(b&32768){break pg}i=H[f+4>>2];g=b>>>0>>0;H[l>>2]=H[f+(g?12:8)>>2];while(1){qg:{if(h){break qg}f=H[e+16>>2];l=f+1|0;o=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(o<<8)+d|0;break qg}if(o>>>0<=143){H[e+16>>2]=l;d=(o<<9)+d|0;h=7;break qg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=g?!i:i;break pg}i=H[f+4>>2];o=l;l=b>>>0>>0;H[o>>2]=H[f+(l?8:12)>>2];while(1){rg:{if(h){break rg}f=H[e+16>>2];b=f+1|0;o=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(o<<8)+d|0;break rg}if(o>>>0<=143){H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break rg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;i=l?i:!i}l=i;g=I[j+24640|0];H[t>>2]=(l|0)==(g|0)?A:s;H[m>>2]=H[m>>2]|256;H[k+4>>2]=H[k+4>>2]|64;i=H[e+108>>2];c=(g^l)<<22|c|128}l=D+(I[(c>>>6&495)+i|0]<<2)|0;j=H[l>>2];g=H[j>>2];b=b-g|0;sg:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;f=H[j+4>>2];if(b&32768){break sg}f=H[j+4>>2];g=b>>>0>>0;H[l>>2]=H[j+(g?12:8)>>2];while(1){tg:{if(h){break tg}j=H[e+16>>2];l=j+1|0;m=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(m<<8)+d|0;break tg}if(m>>>0<=143){H[e+16>>2]=l;d=(m<<9)+d|0;h=7;break tg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=g?!f:f;break sg}f=H[j+4>>2];m=l;l=b>>>0>>0;H[m>>2]=H[j+(l?8:12)>>2];while(1){ug:{if(h){break ug}j=H[e+16>>2];b=j+1|0;m=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break ug}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break ug}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;f=l?f:!f}if(!f){break fg}}m=k-4|0;j=H[k+4>>2]>>>23&4|(H[m>>2]>>>25&1|(c>>>18&16|(c>>>22&64|c>>>6&170)));l=D+(I[j+24384|0]<<2)|0;f=H[l>>2];g=H[f>>2];b=b-g|0;t=p+u|0;vg:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;i=H[f+4>>2];if(b&32768){break vg}i=H[f+4>>2];g=b>>>0>>0;H[l>>2]=H[f+(g?12:8)>>2];while(1){wg:{if(h){break wg}f=H[e+16>>2];l=f+1|0;o=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(o<<8)+d|0;break wg}if(o>>>0<=143){H[e+16>>2]=l;d=(o<<9)+d|0;h=7;break wg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=g?!i:i;break vg}i=H[f+4>>2];o=l;l=b>>>0>>0;H[o>>2]=H[f+(l?8:12)>>2];while(1){xg:{if(h){break xg}f=H[e+16>>2];b=f+1|0;o=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(o<<8)+d|0;break xg}if(o>>>0<=143){H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break xg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;i=l?i:!i}l=i;g=I[j+24640|0];H[t>>2]=(l|0)==(g|0)?A:s;H[m>>2]=H[m>>2]|2048;H[k+4>>2]=H[k+4>>2]|512;c=(g^l)<<25|c|1024;i=H[e+108>>2]}j=D+(I[(c>>>9&495)+i|0]<<2)|0;f=H[j>>2];g=H[f>>2];b=b-g|0;yg:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[f+4>>2];if(b&32768){break yg}i=H[f+4>>2];g=b>>>0>>0;H[j>>2]=H[f+(g?12:8)>>2];while(1){zg:{if(h){break zg}f=H[e+16>>2];l=f+1|0;m=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(m<<8)+d|0;break zg}if(m>>>0<=143){H[e+16>>2]=l;d=(m<<9)+d|0;h=7;break zg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!i:i;break yg}i=H[f+4>>2];l=b>>>0>>0;H[j>>2]=H[f+(l?8:12)>>2];while(1){Ag:{if(h){break Ag}f=H[e+16>>2];b=f+1|0;m=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break Ag}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Ag}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?i:!i}if(!l){break xf}}t=k-4|0;o=H[k+4>>2]>>>26&4|(H[t>>2]>>>28&1|(c>>>21&16|(c>>>25&64|c>>>9&170)));j=D+(I[o+24384|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0}Y=p+w|0;Bg:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break Bg}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[(g?12:8)+i>>2];while(1){Cg:{if(h){break Cg}f=H[e+16>>2];l=f+1|0;i=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(i<<8)+d|0;break Cg}if(i>>>0<=143){H[e+16>>2]=l;d=(i<<9)+d|0;h=7;break Cg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break Bg}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[(l?8:12)+i>>2];while(1){Dg:{if(h){break Dg}f=H[e+16>>2];b=f+1|0;i=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(i<<8)+d|0;break Dg}if(i>>>0<=143){H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break Dg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}g=I[o+24640|0];H[Y>>2]=(l|0)==(g|0)?A:s;H[t>>2]=H[t>>2]|16384;H[k+4>>2]=H[k+4>>2]|4096;f=k+(H[e+124>>2]<<2)|0;H[f+4>>2]=H[f+4>>2]|4;H[f+12>>2]=H[f+12>>2]|1;g=g^l;H[f+8>>2]=H[f+8>>2]|g<<18|2;c=g<<28|c|8192}H[k>>2]=c&-1226833921}c=k+4|0;p=p+4|0;v=v+1|0;if((X|0)!=(v|0)){continue}break}c=k+12|0;p=p+w|0;r=r+4|0;g=H[e+128>>2];if(r>>>0<(g&-4)>>>0){continue}break}break vf}c=(g&-4)-1|0;r=(c&-4)+4|0;c=(l+(c<<1&-8)|0)+20|0}H[e+8>>2]=h;H[e+4>>2]=b;H[e>>2]=d;H[e+104>>2]=j;if(!X|g>>>0<=r>>>0){break je}while(1){h=0;if(H[e+128>>2]!=(r|0)){while(1){gc(e,c,(N(h,X)<<2)+p|0,A,h,1);h=h+1|0;if(h>>>0>2]-r>>>0){continue}break}}H[c>>2]=H[c>>2]&-1226833921;p=p+4|0;c=c+4|0;M=M+1|0;if((X|0)!=(M|0)){continue}break}break je}Eg:{if(g>>>0<4){break Eg}if(X){n=e+100|0;q=e+96|0;w=N(X,12);u=X<<3;s=0-A|0;D=e+28|0;while(1){v=0;while(1){k=c;c=H[c>>2];Fg:{Gg:{Hg:{if(c){Ig:{if(c&2097168){break Ig}j=D+(I[H[e+108>>2]+(c&495)|0]<<2)|0;f=H[j>>2];g=H[f>>2];b=b-g|0;Jg:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[f+4>>2];if(b&32768){break Jg}i=H[f+4>>2];g=b>>>0>>0;H[j>>2]=H[f+(g?12:8)>>2];while(1){Kg:{if(h){break Kg}f=H[e+16>>2];l=f+1|0;m=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(m<<8)+d|0;break Kg}if(m>>>0<=143){H[e+16>>2]=l;d=(m<<9)+d|0;h=7;break Kg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!i:i;break Jg}i=H[f+4>>2];l=b>>>0>>0;H[j>>2]=H[f+(l?8:12)>>2];while(1){Lg:{if(h){break Lg}f=H[e+16>>2];b=f+1|0;m=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break Lg}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Lg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?i:!i}if(!l){break Ig}o=k-4|0;f=H[k+4>>2]>>>17&4|(H[o>>2]>>>19&1|(c>>>14&16|(c>>>16&64|c&170)));j=D+(I[f+24384|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;Mg:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break Mg}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[i+(g?12:8)>>2];while(1){Ng:{if(h){break Ng}i=H[e+16>>2];l=i+1|0;t=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(t<<8)+d|0;break Ng}if(t>>>0<=143){H[e+16>>2]=l;d=(t<<9)+d|0;h=7;break Ng}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break Mg}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){Og:{if(h){break Og}i=H[e+16>>2];b=i+1|0;t=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(t<<8)+d|0;break Og}if(t>>>0<=143){H[e+16>>2]=b;d=(t<<9)+d|0;h=7;break Og}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}g=I[f+24640|0];H[p>>2]=(l|0)==(g|0)?A:s;H[o>>2]=H[o>>2]|32;H[k+4>>2]=H[k+4>>2]|8;f=k+(-2-H[e+124>>2]<<2)|0;H[f+4>>2]=H[f+4>>2]|32768;l=g^l;H[f>>2]=H[f>>2]|l<<31|65536;g=f-4|0;H[g>>2]=H[g>>2]|131072;c=l<<19|c|16}Pg:{if(c&16777344){break Pg}f=c>>>3|0;j=D+(I[H[e+108>>2]+(f&495)|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;Qg:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break Qg}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[i+(g?12:8)>>2];while(1){Rg:{if(h){break Rg}i=H[e+16>>2];l=i+1|0;o=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(o<<8)+d|0;break Rg}if(o>>>0<=143){H[e+16>>2]=l;d=(o<<9)+d|0;h=7;break Rg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break Qg}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){Sg:{if(h){break Sg}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(o<<8)+d|0;break Sg}if(o>>>0<=143){H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Sg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}if(!l){break Pg}o=k-4|0;f=H[k+4>>2]>>>20&4|(H[o>>2]>>>22&1|(c>>>15&16|(c>>>19&64|f&170)));j=D+(I[f+24384|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;Y=(X<<2)+p|0;Tg:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break Tg}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[i+(g?12:8)>>2];while(1){Ug:{if(h){break Ug}i=H[e+16>>2];l=i+1|0;t=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(t<<8)+d|0;break Ug}if(t>>>0<=143){H[e+16>>2]=l;d=(t<<9)+d|0;h=7;break Ug}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break Tg}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){Vg:{if(h){break Vg}i=H[e+16>>2];b=i+1|0;t=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(t<<8)+d|0;break Vg}if(t>>>0<=143){H[e+16>>2]=b;d=(t<<9)+d|0;h=7;break Vg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}g=I[f+24640|0];H[Y>>2]=(l|0)==(g|0)?A:s;H[o>>2]=H[o>>2]|256;H[k+4>>2]=H[k+4>>2]|64;c=(g^l)<<22|c|128}Wg:{if(c&134218752){break Wg}f=c>>>6|0;j=D+(I[H[e+108>>2]+(f&495)|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;Xg:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break Xg}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[i+(g?12:8)>>2];while(1){Yg:{if(h){break Yg}i=H[e+16>>2];l=i+1|0;o=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(o<<8)+d|0;break Yg}if(o>>>0<=143){H[e+16>>2]=l;d=(o<<9)+d|0;h=7;break Yg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break Xg}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){Zg:{if(h){break Zg}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(o<<8)+d|0;break Zg}if(o>>>0<=143){H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Zg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}if(!l){break Wg}o=k-4|0;f=H[k+4>>2]>>>23&4|(H[o>>2]>>>25&1|(c>>>18&16|(c>>>22&64|f&170)));j=D+(I[f+24384|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;Y=p+u|0;_g:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break _g}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[i+(g?12:8)>>2];while(1){$g:{if(h){break $g}i=H[e+16>>2];l=i+1|0;t=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(t<<8)+d|0;break $g}if(t>>>0<=143){H[e+16>>2]=l;d=(t<<9)+d|0;h=7;break $g}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break _g}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){ah:{if(h){break ah}i=H[e+16>>2];b=i+1|0;t=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(t<<8)+d|0;break ah}if(t>>>0<=143){H[e+16>>2]=b;d=(t<<9)+d|0;h=7;break ah}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}g=I[f+24640|0];H[Y>>2]=(l|0)==(g|0)?A:s;H[o>>2]=H[o>>2]|2048;H[k+4>>2]=H[k+4>>2]|512;c=(g^l)<<25|c|1024}if(c&1073750016){break Gg}f=c>>>9|0;j=D+(I[H[e+108>>2]+(f&495)|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;bh:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break bh}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[i+(g?12:8)>>2];while(1){ch:{if(h){break ch}i=H[e+16>>2];l=i+1|0;o=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(o<<8)+d|0;break ch}if(o>>>0<=143){H[e+16>>2]=l;d=(o<<9)+d|0;h=7;break ch}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break bh}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[i+(l?8:12)>>2];while(1){dh:{if(h){break dh}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(o<<8)+d|0;break dh}if(o>>>0<=143){H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break dh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}if(!l){break Gg}t=k-4|0;o=H[k+4>>2]>>>26&4|(H[t>>2]>>>28&1|(c>>>21&16|(c>>>25&64|f&170)));j=D+(I[o+24384|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0;break Hg}l=H[q>>2];c=H[l>>2];b=b-c|0;eh:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[l+4>>2];if(b&32768){break eh}j=H[l+4>>2];c=b>>>0>>0;H[q>>2]=H[l+(c?12:8)>>2];while(1){fh:{if(h){break fh}l=H[e+16>>2];g=l+1|0;f=I[l+1|0];if(I[l|0]!=255){H[e+16>>2]=g;h=8;d=(f<<8)+d|0;break fh}if(f>>>0<=143){H[e+16>>2]=g;d=(f<<9)+d|0;h=7;break fh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!j:j;break eh}j=H[l+4>>2];g=b>>>0>>0;H[q>>2]=H[l+(g?8:12)>>2];while(1){gh:{if(h){break gh}l=H[e+16>>2];b=l+1|0;f=I[l+1|0];if(I[l|0]!=255){H[e+16>>2]=b;h=8;d=(f<<8)+d|0;break gh}if(f>>>0<=143){H[e+16>>2]=b;d=(f<<9)+d|0;h=7;break gh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=g?j:!j}if(!g){j=q;break Fg}g=H[n>>2];c=H[g>>2];b=b-c|0;hh:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;l=H[g+4>>2];if(b&32768){break hh}f=H[g+4>>2];c=b>>>0>>0;g=H[(c?12:8)+g>>2];H[n>>2]=g;while(1){ih:{if(h){break ih}j=H[e+16>>2];l=j+1|0;i=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(i<<8)+d|0;break ih}if(i>>>0<=143){H[e+16>>2]=l;d=(i<<9)+d|0;h=7;break ih}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=c?!f:f;break hh}f=H[g+4>>2];l=b>>>0>>0;g=H[(l?8:12)+g>>2];H[n>>2]=g;while(1){jh:{if(h){break jh}j=H[e+16>>2];b=j+1|0;i=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(i<<8)+d|0;break jh}if(i>>>0<=143){H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break jh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;l=l?f:!f}c=H[g>>2];b=b-c|0;kh:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;j=H[g+4>>2];if(b&32768){break kh}f=H[g+4>>2];c=b>>>0>>0;H[n>>2]=H[(c?12:8)+g>>2];while(1){lh:{if(h){break lh}j=H[e+16>>2];g=j+1|0;i=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=g;h=8;d=(i<<8)+d|0;break lh}if(i>>>0<=143){H[e+16>>2]=g;d=(i<<9)+d|0;h=7;break lh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}j=c?!f:f;break kh}f=H[g+4>>2];j=g;g=b>>>0>>0;H[n>>2]=H[j+(g?8:12)>>2];while(1){mh:{if(h){break mh}j=H[e+16>>2];b=j+1|0;i=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(i<<8)+d|0;break mh}if(i>>>0<=143){H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break mh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;j=g?f:!f}g=j;c=0;j=n;nh:{oh:{ph:{qh:{rh:{switch(g|l<<1){case 0:i=k-4|0;l=H[k+4>>2]>>>17&4|H[i>>2]>>>19&1;g=D+(I[l+24384|0]<<2)|0;j=H[g>>2];c=H[j>>2];b=b-c|0;sh:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;f=H[j+4>>2];if(b&32768){break sh}f=H[j+4>>2];c=b>>>0>>0;H[g>>2]=H[j+(c?12:8)>>2];while(1){th:{if(h){break th}j=H[e+16>>2];g=j+1|0;m=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=g;h=8;d=(m<<8)+d|0;break th}if(m>>>0<=143){H[e+16>>2]=g;d=(m<<9)+d|0;h=7;break th}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=c?!f:f;break sh}f=H[j+4>>2];m=g;g=b>>>0>>0;H[m>>2]=H[j+(g?8:12)>>2];while(1){uh:{if(h){break uh}j=H[e+16>>2];b=j+1|0;m=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break uh}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break uh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;f=g?f:!f}g=f;c=I[l+24640|0];H[p>>2]=(g|0)==(c|0)?A:s;H[i>>2]=H[i>>2]|32;H[k+4>>2]=H[k+4>>2]|8;l=k+(-2-H[e+124>>2]<<2)|0;H[l+4>>2]=H[l+4>>2]|32768;g=c^g;H[l>>2]=H[l>>2]|g<<31|65536;c=l-4|0;H[c>>2]=H[c>>2]|131072;l=g<<19;i=H[e+108>>2];g=D+(I[i+2|0]<<2)|0;j=H[g>>2];c=H[j>>2];b=b-c|0;vh:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;f=H[j+4>>2];if(b&32768){break vh}f=H[j+4>>2];c=b>>>0>>0;H[g>>2]=H[j+(c?12:8)>>2];while(1){wh:{if(h){break wh}j=H[e+16>>2];g=j+1|0;m=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=g;h=8;d=(m<<8)+d|0;break wh}if(m>>>0<=143){H[e+16>>2]=g;d=(m<<9)+d|0;h=7;break wh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=c?!f:f;break vh}f=H[j+4>>2];m=g;g=b>>>0>>0;H[m>>2]=H[j+(g?8:12)>>2];while(1){xh:{if(h){break xh}j=H[e+16>>2];b=j+1|0;m=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break xh}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break xh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;f=g?f:!f}g=f;c=l|16;if(!g){break qh}break;case 1:break rh;case 2:break ph;case 3:break nh;default:break Gg}}m=k-4|0;j=H[k+4>>2]>>>20&4|(H[m>>2]>>>22&1|(c>>>15&16|(c>>>19&64|c>>>3&170)));l=D+(I[j+24384|0]<<2)|0;f=H[l>>2];g=H[f>>2];b=b-g|0;t=(X<<2)+p|0;yh:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;i=H[f+4>>2];if(b&32768){break yh}i=H[f+4>>2];g=b>>>0>>0;H[l>>2]=H[f+(g?12:8)>>2];while(1){zh:{if(h){break zh}f=H[e+16>>2];l=f+1|0;o=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(o<<8)+d|0;break zh}if(o>>>0<=143){H[e+16>>2]=l;d=(o<<9)+d|0;h=7;break zh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=g?!i:i;break yh}i=H[f+4>>2];o=l;l=b>>>0>>0;H[o>>2]=H[f+(l?8:12)>>2];while(1){Ah:{if(h){break Ah}f=H[e+16>>2];b=f+1|0;o=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(o<<8)+d|0;break Ah}if(o>>>0<=143){H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Ah}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;i=l?i:!i}l=i;g=I[j+24640|0];H[t>>2]=(l|0)==(g|0)?A:s;H[m>>2]=H[m>>2]|256;H[k+4>>2]=H[k+4>>2]|64;i=H[e+108>>2];c=(g^l)<<22|c|128}l=D+(I[(c>>>6&495)+i|0]<<2)|0;j=H[l>>2];g=H[j>>2];b=b-g|0;Bh:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;f=H[j+4>>2];if(b&32768){break Bh}f=H[j+4>>2];g=b>>>0>>0;H[l>>2]=H[j+(g?12:8)>>2];while(1){Ch:{if(h){break Ch}j=H[e+16>>2];l=j+1|0;m=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=l;h=8;d=(m<<8)+d|0;break Ch}if(m>>>0<=143){H[e+16>>2]=l;d=(m<<9)+d|0;h=7;break Ch}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=g?!f:f;break Bh}f=H[j+4>>2];m=l;l=b>>>0>>0;H[m>>2]=H[j+(l?8:12)>>2];while(1){Dh:{if(h){break Dh}j=H[e+16>>2];b=j+1|0;m=I[j+1|0];if(I[j|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break Dh}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Dh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;f=l?f:!f}if(!f){break oh}}m=k-4|0;j=H[k+4>>2]>>>23&4|(H[m>>2]>>>25&1|(c>>>18&16|(c>>>22&64|c>>>6&170)));l=D+(I[j+24384|0]<<2)|0;f=H[l>>2];g=H[f>>2];b=b-g|0;t=p+u|0;Eh:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;i=H[f+4>>2];if(b&32768){break Eh}i=H[f+4>>2];g=b>>>0>>0;H[l>>2]=H[f+(g?12:8)>>2];while(1){Fh:{if(h){break Fh}f=H[e+16>>2];l=f+1|0;o=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(o<<8)+d|0;break Fh}if(o>>>0<=143){H[e+16>>2]=l;d=(o<<9)+d|0;h=7;break Fh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=g?!i:i;break Eh}i=H[f+4>>2];o=l;l=b>>>0>>0;H[o>>2]=H[f+(l?8:12)>>2];while(1){Gh:{if(h){break Gh}f=H[e+16>>2];b=f+1|0;o=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(o<<8)+d|0;break Gh}if(o>>>0<=143){H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Gh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;i=l?i:!i}l=i;g=I[j+24640|0];H[t>>2]=(l|0)==(g|0)?A:s;H[m>>2]=H[m>>2]|2048;H[k+4>>2]=H[k+4>>2]|512;c=(g^l)<<25|c|1024;i=H[e+108>>2]}j=D+(I[(c>>>9&495)+i|0]<<2)|0;f=H[j>>2];g=H[f>>2];b=b-g|0;Hh:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[f+4>>2];if(b&32768){break Hh}i=H[f+4>>2];g=b>>>0>>0;H[j>>2]=H[f+(g?12:8)>>2];while(1){Ih:{if(h){break Ih}f=H[e+16>>2];l=f+1|0;m=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(m<<8)+d|0;break Ih}if(m>>>0<=143){H[e+16>>2]=l;d=(m<<9)+d|0;h=7;break Ih}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!i:i;break Hh}i=H[f+4>>2];l=b>>>0>>0;H[j>>2]=H[f+(l?8:12)>>2];while(1){Jh:{if(h){break Jh}f=H[e+16>>2];b=f+1|0;m=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break Jh}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Jh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?i:!i}if(!l){break Gg}}t=k-4|0;o=H[k+4>>2]>>>26&4|(H[t>>2]>>>28&1|(c>>>21&16|(c>>>25&64|c>>>9&170)));j=D+(I[o+24384|0]<<2)|0;i=H[j>>2];g=H[i>>2];b=b-g|0}Y=p+w|0;Kh:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;l=H[i+4>>2];if(b&32768){break Kh}m=H[i+4>>2];g=b>>>0>>0;H[j>>2]=H[(g?12:8)+i>>2];while(1){Lh:{if(h){break Lh}f=H[e+16>>2];l=f+1|0;i=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=l;h=8;d=(i<<8)+d|0;break Lh}if(i>>>0<=143){H[e+16>>2]=l;d=(i<<9)+d|0;h=7;break Lh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=g?!m:m;break Kh}m=H[i+4>>2];l=b>>>0>>0;H[j>>2]=H[(l?8:12)+i>>2];while(1){Mh:{if(h){break Mh}f=H[e+16>>2];b=f+1|0;i=I[f+1|0];if(I[f|0]!=255){H[e+16>>2]=b;h=8;d=(i<<8)+d|0;break Mh}if(i>>>0<=143){H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break Mh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;l=l?m:!m}g=I[o+24640|0];H[Y>>2]=(l|0)==(g|0)?A:s;H[t>>2]=H[t>>2]|16384;H[k+4>>2]=H[k+4>>2]|4096;f=k+(H[e+124>>2]<<2)|0;H[f+4>>2]=H[f+4>>2]|4;H[f+12>>2]=H[f+12>>2]|1;g=g^l;H[f+8>>2]=H[f+8>>2]|g<<18|2;c=g<<28|c|8192}H[k>>2]=c&-1226833921}c=k+4|0;p=p+4|0;v=v+1|0;if((X|0)!=(v|0)){continue}break}c=k+12|0;p=p+w|0;r=r+4|0;g=H[e+128>>2];if(r>>>0<(g&-4)>>>0){continue}break}break Eg}c=(g&-4)-1|0;r=(c&-4)+4|0;c=(l+(c<<1&-8)|0)+20|0}H[e+8>>2]=h;H[e+4>>2]=b;H[e>>2]=d;H[e+104>>2]=j;if(!X|g>>>0<=r>>>0){break je}while(1){h=0;if(H[e+128>>2]!=(r|0)){while(1){gc(e,c,(N(h,X)<<2)+p|0,A,h,0);h=h+1|0;if(h>>>0>2]-r>>>0){continue}break}}H[c>>2]=H[c>>2]&-1226833921;p=p+4|0;c=c+4|0;M=M+1|0;if((X|0)!=(M|0)){continue}break}break je}while(1){u=0;while(1){k=c;f=g;g=H[g>>2];Nh:{Oh:{Ph:{if(!g){j=H[l>>2];g=H[j>>2];b=b-g|0;Qh:{if(d>>>16>>>0>>0){n=H[j+4>>2];c=b>>>0>>0;H[l>>2]=H[j+(c?8:12)>>2];while(1){Rh:{if(h){break Rh}j=H[e+16>>2];b=j+1|0;p=I[j+1|0];if(I[j|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Rh}H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Rh}H[e+16>>2]=b;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?n:!n;break Qh}d=d-(g<<16)|0;if(!(b&32768)){n=H[j+4>>2];c=b>>>0>>0;H[l>>2]=H[j+(c?12:8)>>2];while(1){Sh:{if(h){break Sh}j=H[e+16>>2];g=j+1|0;p=I[j+1|0];if(I[j|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Sh}H[e+16>>2]=g;d=(p<<9)+d|0;h=7;break Sh}H[e+16>>2]=g;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break Qh}c=H[j+4>>2]}if(!c){j=l;break Nh}c=H[q>>2];g=H[c>>2];b=b-g|0;Th:{if(d>>>16>>>0>>0){p=H[c+4>>2];j=b>>>0>>0;c=H[(j?8:12)+c>>2];H[q>>2]=c;while(1){Uh:{if(h){break Uh}n=H[e+16>>2];b=n+1|0;i=I[n+1|0];if(I[n|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Uh}H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break Uh}H[e+16>>2]=b;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;n=j?p:!p;break Th}d=d-(g<<16)|0;if(!(b&32768)){p=H[c+4>>2];g=b>>>0>>0;c=H[(g?12:8)+c>>2];H[q>>2]=c;while(1){Vh:{if(h){break Vh}n=H[e+16>>2];j=n+1|0;i=I[n+1|0];if(I[n|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Vh}H[e+16>>2]=j;d=(i<<9)+d|0;h=7;break Vh}H[e+16>>2]=j;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=g?!p:p;break Th}n=H[c+4>>2]}g=H[c>>2];b=b-g|0;Wh:{if(d>>>16>>>0>>0){p=H[c+4>>2];j=c;c=b>>>0>>0;H[q>>2]=H[j+(c?8:12)>>2];while(1){Xh:{if(h){break Xh}j=H[e+16>>2];b=j+1|0;i=I[j+1|0];if(I[j|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Xh}H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break Xh}H[e+16>>2]=b;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?p:!p;break Wh}d=d-(g<<16)|0;if(!(b&32768)){p=H[c+4>>2];j=c;c=b>>>0>>0;H[q>>2]=H[j+(c?12:8)>>2];while(1){Yh:{if(h){break Yh}j=H[e+16>>2];g=j+1|0;i=I[j+1|0];if(I[j|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Yh}H[e+16>>2]=g;d=(i<<9)+d|0;h=7;break Yh}H[e+16>>2]=g;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!p:p;break Wh}c=H[c+4>>2]}g=0;j=q;Zh:{_h:{$h:{ai:{bi:{switch(c|n<<1){case 0:i=f-4|0;j=H[f+4>>2]>>>17&4|H[i>>2]>>>19&1;c=s+(I[j+24384|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;ci:{if(d>>>16>>>0>>0){p=H[n+4>>2];A=c;c=b>>>0>>0;H[A>>2]=H[n+(c?8:12)>>2];while(1){di:{if(h){break di}n=H[e+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break di}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break di}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;g=c?p:!p;break ci}d=d-(g<<16)|0;if(!(b&32768)){p=H[n+4>>2];A=c;c=b>>>0>>0;H[A>>2]=H[n+(c?12:8)>>2];while(1){ei:{if(h){break ei}n=H[e+16>>2];g=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ei}H[e+16>>2]=g;d=(m<<9)+d|0;h=7;break ei}H[e+16>>2]=g;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!p:p;break ci}g=H[n+4>>2]}c=I[j+24640|0];H[k>>2]=(g|0)==(c|0)?v:w;H[i>>2]=H[i>>2]|32;H[f+4>>2]=H[f+4>>2]|8;j=(c^g)<<19;i=H[e+108>>2];c=s+(I[i+2|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;fi:{if(d>>>16>>>0>>0){p=H[n+4>>2];A=c;c=b>>>0>>0;H[A>>2]=H[n+(c?8:12)>>2];while(1){gi:{if(h){break gi}n=H[e+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break gi}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break gi}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?p:!p;break fi}d=d-(g<<16)|0;if(!(b&32768)){p=H[n+4>>2];A=c;c=b>>>0>>0;H[A>>2]=H[n+(c?12:8)>>2];while(1){hi:{if(h){break hi}n=H[e+16>>2];g=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break hi}H[e+16>>2]=g;d=(m<<9)+d|0;h=7;break hi}H[e+16>>2]=g;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!p:p;break fi}c=H[n+4>>2]}g=j|16;if(!c){break ai}break;case 1:break bi;case 2:break $h;case 3:break Zh;default:break Oh}}m=f-4|0;n=H[f+4>>2]>>>20&4|(H[m>>2]>>>22&1|(g>>>15&16|(g>>>19&64|g>>>3&170)));j=s+(I[n+24384|0]<<2)|0;p=H[j>>2];c=H[p>>2];b=b-c|0;ii:{if(d>>>16>>>0>>0){i=H[p+4>>2];A=j;j=b>>>0>>0;H[A>>2]=H[p+(j?8:12)>>2];while(1){ji:{if(h){break ji}p=H[e+16>>2];b=p+1|0;o=I[p+1|0];if(I[p|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ji}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break ji}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;j=j?i:!i;break ii}d=d-(c<<16)|0;if(!(b&32768)){i=H[p+4>>2];c=b>>>0>>0;H[j>>2]=H[p+(c?12:8)>>2];while(1){ki:{if(h){break ki}p=H[e+16>>2];j=p+1|0;o=I[p+1|0];if(I[p|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ki}H[e+16>>2]=j;d=(o<<9)+d|0;h=7;break ki}H[e+16>>2]=j;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}j=c?!i:i;break ii}j=H[p+4>>2]}c=I[n+24640|0];H[k+256>>2]=(j|0)==(c|0)?v:w;H[m>>2]=H[m>>2]|256;H[f+4>>2]=H[f+4>>2]|64;i=H[e+108>>2];g=(c^j)<<22|g|128}j=s+(I[(g>>>6&495)+i|0]<<2)|0;n=H[j>>2];c=H[n>>2];b=b-c|0;li:{if(d>>>16>>>0>>0){p=H[n+4>>2];A=j;j=b>>>0>>0;H[A>>2]=H[n+(j?8:12)>>2];while(1){mi:{if(h){break mi}n=H[e+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break mi}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break mi}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=j?p:!p;break li}d=d-(c<<16)|0;if(!(b&32768)){p=H[n+4>>2];c=b>>>0>>0;H[j>>2]=H[n+(c?12:8)>>2];while(1){ni:{if(h){break ni}n=H[e+16>>2];j=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ni}H[e+16>>2]=j;d=(m<<9)+d|0;h=7;break ni}H[e+16>>2]=j;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!p:p;break li}c=H[n+4>>2]}if(!c){break _h}}m=f-4|0;n=H[f+4>>2]>>>23&4|(H[m>>2]>>>25&1|(g>>>18&16|(g>>>22&64|g>>>6&170)));j=s+(I[n+24384|0]<<2)|0;p=H[j>>2];c=H[p>>2];b=b-c|0;oi:{if(d>>>16>>>0>>0){i=H[p+4>>2];A=j;j=b>>>0>>0;H[A>>2]=H[p+(j?8:12)>>2];while(1){pi:{if(h){break pi}p=H[e+16>>2];b=p+1|0;o=I[p+1|0];if(I[p|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break pi}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break pi}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;j=j?i:!i;break oi}d=d-(c<<16)|0;if(!(b&32768)){i=H[p+4>>2];c=b>>>0>>0;H[j>>2]=H[p+(c?12:8)>>2];while(1){qi:{if(h){break qi}p=H[e+16>>2];j=p+1|0;o=I[p+1|0];if(I[p|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break qi}H[e+16>>2]=j;d=(o<<9)+d|0;h=7;break qi}H[e+16>>2]=j;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}j=c?!i:i;break oi}j=H[p+4>>2]}c=I[n+24640|0];H[k+512>>2]=(j|0)==(c|0)?v:w;H[m>>2]=H[m>>2]|2048;H[f+4>>2]=H[f+4>>2]|512;g=(c^j)<<25|g|1024;i=H[e+108>>2]}j=s+(I[(g>>>9&495)+i|0]<<2)|0;p=H[j>>2];c=H[p>>2];b=b-c|0;ri:{if(d>>>16>>>0>>0){i=H[p+4>>2];n=b>>>0>>0;H[j>>2]=H[p+(n?8:12)>>2];while(1){si:{if(h){break si}p=H[e+16>>2];b=p+1|0;m=I[p+1|0];if(I[p|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break si}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break si}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?i:!i;break ri}d=d-(c<<16)|0;if(!(b&32768)){i=H[p+4>>2];c=b>>>0>>0;H[j>>2]=H[p+(c?12:8)>>2];while(1){ti:{if(h){break ti}p=H[e+16>>2];n=p+1|0;m=I[p+1|0];if(I[p|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ti}H[e+16>>2]=n;d=(m<<9)+d|0;h=7;break ti}H[e+16>>2]=n;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!i:i;break ri}c=H[p+4>>2]}if(!c){break Oh}}M=f-4|0;t=H[f+4>>2]>>>26&4|(H[M>>2]>>>28&1|(g>>>21&16|(g>>>25&64|g>>>9&170)));j=s+(I[t+24384|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;break Ph}ui:{if(g&2097168){break ui}j=s+(I[H[e+108>>2]+(g&495)|0]<<2)|0;p=H[j>>2];c=H[p>>2];b=b-c|0;vi:{if(d>>>16>>>0>>0){i=H[p+4>>2];n=b>>>0>>0;H[j>>2]=H[p+(n?8:12)>>2];while(1){wi:{if(h){break wi}p=H[e+16>>2];b=p+1|0;m=I[p+1|0];if(I[p|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break wi}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break wi}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?i:!i;break vi}d=d-(c<<16)|0;if(!(b&32768)){i=H[p+4>>2];c=b>>>0>>0;H[j>>2]=H[p+(c?12:8)>>2];while(1){xi:{if(h){break xi}p=H[e+16>>2];n=p+1|0;m=I[p+1|0];if(I[p|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break xi}H[e+16>>2]=n;d=(m<<9)+d|0;h=7;break xi}H[e+16>>2]=n;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!i:i;break vi}c=H[p+4>>2]}if(!c){break ui}o=f-4|0;p=H[f+4>>2]>>>17&4|(H[o>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));j=s+(I[p+24384|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;yi:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[i+(n?8:12)>>2];while(1){zi:{if(h){break zi}i=H[e+16>>2];b=i+1|0;t=I[i+1|0];if(I[i|0]==255){if(t>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break zi}H[e+16>>2]=b;d=(t<<9)+d|0;h=7;break zi}H[e+16>>2]=b;h=8;d=(t<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break yi}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[i+(c?12:8)>>2];while(1){Ai:{if(h){break Ai}i=H[e+16>>2];n=i+1|0;t=I[i+1|0];if(I[i|0]==255){if(t>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ai}H[e+16>>2]=n;d=(t<<9)+d|0;h=7;break Ai}H[e+16>>2]=n;h=8;d=(t<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break yi}n=H[i+4>>2]}c=I[p+24640|0];H[k>>2]=(n|0)==(c|0)?v:w;H[o>>2]=H[o>>2]|32;H[f+4>>2]=H[f+4>>2]|8;g=(c^n)<<19|g|16}Bi:{if(g&16777344){break Bi}p=g>>>3|0;j=s+(I[H[e+108>>2]+(p&495)|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;Ci:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[i+(n?8:12)>>2];while(1){Di:{if(h){break Di}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Di}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Di}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Ci}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[i+(c?12:8)>>2];while(1){Ei:{if(h){break Ei}i=H[e+16>>2];n=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ei}H[e+16>>2]=n;d=(o<<9)+d|0;h=7;break Ei}H[e+16>>2]=n;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Ci}c=H[i+4>>2]}if(!c){break Bi}o=f-4|0;p=H[f+4>>2]>>>20&4|(H[o>>2]>>>22&1|(g>>>15&16|(g>>>19&64|p&170)));j=s+(I[p+24384|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;Fi:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[i+(n?8:12)>>2];while(1){Gi:{if(h){break Gi}i=H[e+16>>2];b=i+1|0;t=I[i+1|0];if(I[i|0]==255){if(t>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Gi}H[e+16>>2]=b;d=(t<<9)+d|0;h=7;break Gi}H[e+16>>2]=b;h=8;d=(t<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Fi}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[i+(c?12:8)>>2];while(1){Hi:{if(h){break Hi}i=H[e+16>>2];n=i+1|0;t=I[i+1|0];if(I[i|0]==255){if(t>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Hi}H[e+16>>2]=n;d=(t<<9)+d|0;h=7;break Hi}H[e+16>>2]=n;h=8;d=(t<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Fi}n=H[i+4>>2]}c=I[p+24640|0];H[k+256>>2]=(n|0)==(c|0)?v:w;H[o>>2]=H[o>>2]|256;H[f+4>>2]=H[f+4>>2]|64;g=(c^n)<<22|g|128}Ii:{if(g&134218752){break Ii}p=g>>>6|0;j=s+(I[H[e+108>>2]+(p&495)|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;Ji:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[i+(n?8:12)>>2];while(1){Ki:{if(h){break Ki}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ki}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Ki}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Ji}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[i+(c?12:8)>>2];while(1){Li:{if(h){break Li}i=H[e+16>>2];n=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Li}H[e+16>>2]=n;d=(o<<9)+d|0;h=7;break Li}H[e+16>>2]=n;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Ji}c=H[i+4>>2]}if(!c){break Ii}o=f-4|0;p=H[f+4>>2]>>>23&4|(H[o>>2]>>>25&1|(g>>>18&16|(g>>>22&64|p&170)));j=s+(I[p+24384|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;Mi:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[i+(n?8:12)>>2];while(1){Ni:{if(h){break Ni}i=H[e+16>>2];b=i+1|0;t=I[i+1|0];if(I[i|0]==255){if(t>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ni}H[e+16>>2]=b;d=(t<<9)+d|0;h=7;break Ni}H[e+16>>2]=b;h=8;d=(t<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Mi}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[i+(c?12:8)>>2];while(1){Oi:{if(h){break Oi}i=H[e+16>>2];n=i+1|0;t=I[i+1|0];if(I[i|0]==255){if(t>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Oi}H[e+16>>2]=n;d=(t<<9)+d|0;h=7;break Oi}H[e+16>>2]=n;h=8;d=(t<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Mi}n=H[i+4>>2]}c=I[p+24640|0];H[k+512>>2]=(n|0)==(c|0)?v:w;H[o>>2]=H[o>>2]|2048;H[f+4>>2]=H[f+4>>2]|512;g=(c^n)<<25|g|1024}if(g&1073750016){break Oh}p=g>>>9|0;j=s+(I[H[e+108>>2]+(p&495)|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0;Pi:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[i+(n?8:12)>>2];while(1){Qi:{if(h){break Qi}i=H[e+16>>2];b=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Qi}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Qi}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Pi}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[i+(c?12:8)>>2];while(1){Ri:{if(h){break Ri}i=H[e+16>>2];n=i+1|0;o=I[i+1|0];if(I[i|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ri}H[e+16>>2]=n;d=(o<<9)+d|0;h=7;break Ri}H[e+16>>2]=n;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Pi}c=H[i+4>>2]}if(!c){break Oh}M=f-4|0;t=H[f+4>>2]>>>26&4|(H[M>>2]>>>28&1|(g>>>21&16|(g>>>25&64|p&170)));j=s+(I[t+24384|0]<<2)|0;i=H[j>>2];c=H[i>>2];b=b-c|0}Si:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[j>>2]=H[(n?8:12)+i>>2];while(1){Ti:{if(h){break Ti}p=H[e+16>>2];b=p+1|0;i=I[p+1|0];if(I[p|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ti}H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break Ti}H[e+16>>2]=b;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Si}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[j>>2]=H[(c?12:8)+i>>2];while(1){Ui:{if(h){break Ui}p=H[e+16>>2];n=p+1|0;i=I[p+1|0];if(I[p|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ui}H[e+16>>2]=n;d=(i<<9)+d|0;h=7;break Ui}H[e+16>>2]=n;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Si}n=H[i+4>>2]}c=I[t+24640|0];H[k+768>>2]=(n|0)==(c|0)?v:w;H[M>>2]=H[M>>2]|16384;H[f+4>>2]=H[f+4>>2]|4096;H[f+260>>2]=H[f+260>>2]|4;H[f+268>>2]=H[f+268>>2]|1;c=c^n;H[f+264>>2]=H[f+264>>2]|c<<18|2;g=c<<28|g|8192}H[f>>2]=g&-1226833921}g=f+4|0;c=k+4|0;u=u+1|0;if((u|0)!=64){continue}break}g=f+12|0;c=k+772|0;n=r>>>0<60;r=r+4|0;if(n){continue}break}}H[e+8>>2]=h;H[e+4>>2]=b;H[e>>2]=d;H[e+104>>2]=j}Vi:{if(!(Z&32)){break Vi}H[e+104>>2]=e+100;g=H[e+100>>2];b=H[g>>2];d=H[e+4>>2]-b|0;H[e+4>>2]=d;h=H[e>>2];Wi:{if(h>>>16>>>0>>0){H[e+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[e+100>>2]=g;d=H[e+8>>2];while(1){Xi:{if(d){break Xi}l=H[e+16>>2];c=l+1|0;j=I[l+1|0];if(I[l|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;d=8;break Xi}H[e+16>>2]=c;h=(j<<9)+h|0;d=7;break Xi}H[e+16>>2]=c;d=8;h=(j<<8)+h|0}d=d-1|0;H[e+8>>2]=d;h=h<<1;H[e>>2]=h;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break Wi}h=h-(b<<16)|0;H[e>>2]=h;if(d&32768){break Wi}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[e+100>>2]=g;b=H[e+8>>2];while(1){Yi:{if(b){break Yi}c=H[e+16>>2];b=c+1|0;l=I[c+1|0];if(I[c|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;b=8;break Yi}H[e+16>>2]=b;h=(l<<9)+h|0;b=7;break Yi}H[e+16>>2]=b;b=8;h=(l<<8)+h|0}b=b-1|0;H[e+8>>2]=b;h=h<<1;H[e>>2]=h;d=d<<1;H[e+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[e+4>>2]=d;Zi:{if(h>>>16>>>0>>0){H[e+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[e+100>>2]=g;d=H[e+8>>2];while(1){_i:{if(d){break _i}l=H[e+16>>2];c=l+1|0;j=I[l+1|0];if(I[l|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;d=8;break _i}H[e+16>>2]=c;h=(j<<9)+h|0;d=7;break _i}H[e+16>>2]=c;d=8;h=(j<<8)+h|0}d=d-1|0;H[e+8>>2]=d;h=h<<1;H[e>>2]=h;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break Zi}h=h-(b<<16)|0;H[e>>2]=h;if(d&32768){break Zi}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[e+100>>2]=g;b=H[e+8>>2];while(1){$i:{if(b){break $i}c=H[e+16>>2];b=c+1|0;l=I[c+1|0];if(I[c|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;b=8;break $i}H[e+16>>2]=b;h=(l<<9)+h|0;b=7;break $i}H[e+16>>2]=b;b=8;h=(l<<8)+h|0}b=b-1|0;H[e+8>>2]=b;h=h<<1;H[e>>2]=h;d=d<<1;H[e+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[e+4>>2]=d;aj:{if(h>>>16>>>0>>0){H[e+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[e+100>>2]=g;d=H[e+8>>2];while(1){bj:{if(d){break bj}l=H[e+16>>2];c=l+1|0;j=I[l+1|0];if(I[l|0]==255){if(j>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;d=8;break bj}H[e+16>>2]=c;h=(j<<9)+h|0;d=7;break bj}H[e+16>>2]=c;d=8;h=(j<<8)+h|0}d=d-1|0;H[e+8>>2]=d;h=h<<1;H[e>>2]=h;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break aj}h=h-(b<<16)|0;H[e>>2]=h;if(d&32768){break aj}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[e+100>>2]=g;b=H[e+8>>2];while(1){cj:{if(b){break cj}c=H[e+16>>2];b=c+1|0;l=I[c+1|0];if(I[c|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;b=8;break cj}H[e+16>>2]=b;h=(l<<9)+h|0;b=7;break cj}H[e+16>>2]=b;b=8;h=(l<<8)+h|0}b=b-1|0;H[e+8>>2]=b;h=h<<1;H[e>>2]=h;d=d<<1;H[e+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[e+4>>2]=d;if(h>>>16>>>0>>0){H[e+4>>2]=b;H[e+100>>2]=H[(b>>>0>d>>>0?8:12)+g>>2];d=H[e+8>>2];while(1){dj:{if(d){break dj}g=H[e+16>>2];c=g+1|0;l=I[g+1|0];if(I[g|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;d=8;break dj}H[e+16>>2]=c;h=(l<<9)+h|0;d=7;break dj}H[e+16>>2]=c;d=8;h=(l<<8)+h|0}d=d-1|0;H[e+8>>2]=d;h=h<<1;H[e>>2]=h;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}break Vi}c=h-(b<<16)|0;H[e>>2]=c;if(d&32768){break Vi}H[e+100>>2]=H[(b>>>0>d>>>0?12:8)+g>>2];h=H[e+8>>2];while(1){ej:{if(h){break ej}g=H[e+16>>2];b=g+1|0;l=I[g+1|0];if(I[g|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;c=c+65280|0;h=8;break ej}H[e+16>>2]=b;c=(l<<9)+c|0;h=7;break ej}H[e+16>>2]=b;h=8;c=(l<<8)+c|0}h=h-1|0;H[e+8>>2]=h;c=c<<1;H[e>>2]=c;d=d<<1;H[e+4>>2]=d;if(d>>>0<32768){continue}break}}}if(!P){break Za}ic(e);_a(e,18,46);_a(e,17,3);_a(e,0,4)}b=_+1|0;c=(b|0)==3;_=c?0:b;z=z-c|0;T=T+1|0;if(T>>>0>=K[ma+8>>2]){break Ya}if((z|0)>0){continue}break}}U=x+U|0;c=H[e+24>>2];b=J[e+112>>1];F[c|0]=b;F[c+1|0]=b>>>8;S=S+1|0;if(S>>>0>2]){continue}break}}fj:{if(!W){break fj}gj:{c=H[e+24>>2];g=H[e+16>>2];if(c>>>0>g+2>>>0){if(!ba){break gj}g=H[e+16>>2];c=H[e+24>>2];b=H[e+20>>2];H[aa+56>>2]=c-b;H[aa+52>>2]=g-b;H[aa+48>>2]=(c-g|0)-2;Ca(R,2,15235,aa+48|0);break fj}b=H[e+12>>2];if(b>>>0<3){break fj}if(ba){H[aa+80>>2]=H[e+12>>2];Ca(R,2,7107,aa+80|0);break fj}H[aa+64>>2]=b;Ca(R,2,7107,aa- -64|0);break fj}b=H[e+20>>2];H[aa+40>>2]=c-b;H[aa+36>>2]=g-b;H[aa+32>>2]=(c-g|0)-2;Ca(R,2,15235,aa+32|0)}if(!H[E+60>>2]){break i}H[e+116>>2]=$}l=H[ta+4>>2];g=H[E+12>>2];m=H[E+8>>2]-H[ta>>2]|0;c=H[ta+16>>2];if(c&1){b=H[qa+28>>2]+N(va,152)|0;m=(H[b-144>>2]+m|0)-H[b-152>>2]|0}j=g-l|0;if(c&2){b=H[qa+28>>2]+N(va,152)|0;j=(H[b-140>>2]+j|0)-H[b-148>>2]|0}k=H[E+60>>2];i=k;i=i?i:H[e+116>>2];o=H[e+128>>2];P=H[e+124>>2];n=H[ra+808>>2];hj:{if(!n){break hj}b=!o|!P;if((n|0)<=30){if(b){break hj}h=0;while(1){l=(N(h,P)<<2)+i|0;b=0;while(1){g=l+(b<<2)|0;q=H[g>>2];c=q>>31;c=(c^q)-c|0;if(c>>>n|0){c=c>>>H[ra+808>>2]|0;H[g>>2]=(q|0)<0?0-c|0:c}b=b+1|0;if((P|0)!=(b|0)){continue}break}h=h+1|0;if((o|0)!=(h|0)){continue}break}break hj}if(b){break hj}b=N(o,P)<<2;if(!b){break hj}y(i,0,b)}if(k){q=N(o,P);if(H[ra+20>>2]==1){if(!q){break a}b=0;if((q|0)!=1){j=i+4|0;l=q&-2;e=0;while(1){g=b<<2;c=g+i|0;H[c>>2]=H[c>>2]/2;c=g+j|0;H[c>>2]=H[c>>2]/2;b=b+2|0;e=e+2|0;if((l|0)!=(e|0)){continue}break}}if(!(q&1)){break a}b=(b<<2)+i|0;H[b>>2]=H[b>>2]/2;break a}if(!q){break a}ga=O(L[ta+32>>2]*O(.5));if(q>>>0>=4){c=q&-4;b=0;while(1){L[i>>2]=ga*O(H[i>>2]);L[i+4>>2]=ga*O(H[i+4>>2]);L[i+8>>2]=ga*O(H[i+8>>2]);L[i+12>>2]=ga*O(H[i+12>>2]);i=i+16|0;b=b+4|0;if((c|0)!=(b|0)){continue}break}}c=q&3;if(!c){break a}b=0;while(1){L[i>>2]=ga*O(H[i>>2]);i=i+4|0;b=b+1|0;if((c|0)!=(b|0)){continue}break}break a}r=xa-wa|0;if(H[ra+20>>2]==1){if(!o){break a}f=(H[qa+36>>2]+(N(j,r)<<2)|0)+(m<<2)|0;d=P&-4;j=0;while(1){b=0;if(d){k=f+(N(j,r)<<2)|0;n=(N(j,P)<<2)+i|0;while(1){q=b<<2;p=q+n|0;l=H[p+4>>2];g=H[p+8>>2];c=H[p+12>>2];q=k+q|0;H[q>>2]=H[p>>2]/2;H[q+12>>2]=(c|0)/2;H[q+8>>2]=(g|0)/2;H[q+4>>2]=(l|0)/2;b=b+4|0;if(d>>>0>b>>>0){continue}break}}ij:{if(b>>>0>=P>>>0){break ij}c=b+1|0;l=f+(N(j,r)<<2)|0;g=(N(j,P)<<2)+i|0;if(P-b&1){b=b<<2;H[b+l>>2]=H[b+g>>2]/2;b=c}if((c|0)==(P|0)){break ij}while(1){c=b<<2;H[c+l>>2]=H[c+g>>2]/2;c=c+4|0;H[c+l>>2]=H[c+g>>2]/2;b=b+2|0;if((P|0)!=(b|0)){continue}break}}j=j+1|0;if((o|0)!=(j|0)){continue}break}break a}if(!o|!P){break a}ga=O(L[ta+32>>2]*O(.5));j=(H[qa+36>>2]+(N(j,r)<<2)|0)+(m<<2)|0;g=P&-4;l=P&3;f=0;c=P-1>>>0<3;while(1){b=j;e=0;if(!c){while(1){L[b>>2]=ga*O(H[i>>2]);L[b+4>>2]=ga*O(H[i+4>>2]);L[b+8>>2]=ga*O(H[i+8>>2]);L[b+12>>2]=ga*O(H[i+12>>2]);b=b+16|0;i=i+16|0;e=e+4|0;if((g|0)!=(e|0)){continue}break}}e=0;if(l){while(1){L[b>>2]=ga*O(H[i>>2]);b=b+4|0;i=i+4|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}j=(r<<2)+j|0;f=f+1|0;if((o|0)!=(f|0)){continue}break}break a}H[aa>>2]=z;Ca(R,2,8716,aa)}H[H[d>>2]>>2]=0}Da(a);oa=aa+96|0} -function gb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,J=0,M=0,Q=0,R=0,S=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=O(0),ia=0,ja=0,ka=0,la=0,ma=0,na=0,pa=0,qa=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ha=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ta=0,Va=0,Ya=0,Za=0,_a=0,$a=0,bb=0,cb=0,db=0,eb=O(0),fb=O(0),gb=0,jb=0,kb=0,lb=0,nb=0,ob=0,pb=0,sb=O(0),tb=0;Za=oa-16|0;oa=Za;a:{if(!(I[a+8|0]&128)|H[a+228>>2]!=(b|0)){break a}Ya=H[a+180>>2]+N(b,5644)|0;q=H[Ya+5596>>2];if(!q){mb(Ya);break a}j=H[a+100>>2];if(!j){j=H[a+96>>2]}k=H[j>>2];g=H[j+4>>2];r=H[j+8>>2];i=H[j+12>>2];m=H[a+60>>2];l=H[a+64>>2];j=H[Ya+5600>>2];Ha=oa-16|0;oa=Ha;R=H[a+232>>2];H[R+36>>2]=b;h=H[H[R+28>>2]+76>>2];H[R+64>>2]=1;H[R+60>>2]=i;H[R+56>>2]=r;H[R+52>>2]=g;H[R+48>>2]=k;H[R+32>>2]=h+N(b,5644);Da(H[R+68>>2]);r=0;H[R+68>>2]=0;b:{if(m){r=Fa(4,H[H[R+24>>2]+16>>2]);if(!r){break b}if(m>>>0>=4){k=l+12|0;g=l+8|0;i=l+4|0;h=m&-4;b=0;while(1){o=$<<2;H[(H[o+l>>2]<<2)+r>>2]=1;H[(H[i+o>>2]<<2)+r>>2]=1;H[(H[g+o>>2]<<2)+r>>2]=1;H[(H[k+o>>2]<<2)+r>>2]=1;$=$+4|0;b=b+4|0;if((h|0)!=(b|0)){continue}break}}b=m&3;if(b){while(1){H[(H[l+($<<2)>>2]<<2)+r>>2]=1;$=$+1|0;E=E+1|0;if((b|0)!=(E|0)){continue}break}}H[R+68>>2]=r}c:{t=H[R+24>>2];ia=H[t+16>>2];d:{if(!ia){break d}$=0;e:{while(1){f:{if(H[($<<2)+r>>2]?0:r){break f}g=H[t+24>>2]+N($,52)|0;p=H[g+4>>2];o=p-1|0;i=H[R+60>>2];h=o+i|0;l=0-!p|0;b=l;k=Ke(h,h>>>0>>0?b+1|0:b,p,0);s=H[g>>2];g=s-1|0;i=H[R+56>>2];h=g+i|0;m=0-!s|0;b=m;i=Ke(h,h>>>0>>0?b+1|0:b,s,0);h=H[R+52>>2];b=h+o|0;o=Ke(b,b>>>0>>0?l+1|0:l,p,0);p=H[H[H[R+20>>2]>>2]+20>>2]+N($,76)|0;l=H[p+20>>2]-H[p+24>>2]|0;if(l>>>0>31){break f}h=H[R+48>>2];b=h+g|0;h=Ke(b,b>>>0>>0?m+1|0:m,s,0);b=h-H[p>>2]|0;g:{if((b>>>0<=h>>>0?b:0)>>>l|0){break g}b=o-H[p+4>>2]|0;if((b>>>0<=o>>>0?b:0)>>>l|0){break g}h=H[p+8>>2];b=h-i|0;if((b>>>0<=h>>>0?b:0)>>>l|0){break g}h=H[p+12>>2];b=h-k|0;if(!((b>>>0<=h>>>0?b:0)>>>l|0)){break f}}H[R+64>>2]=0;break e}$=$+1|0;if((ia|0)!=($|0)){continue}break}if(!H[R+64>>2]){break e}E=0;while(1){o=H[H[H[R+20>>2]>>2]+20>>2]+N(E,76)|0;b=H[o+28>>2]+N(H[o+24>>2],152)|0;k=H[b-148>>2];g=H[b-140>>2];r=H[b-152>>2];i=H[b-144>>2];b=H[R+68>>2];h:{if(H[b+(E<<2)>>2]?0:b){break h}h=g-k|0;b=i-r|0;Ie(h,0,b);if(!(!ra|(g|0)==(k|0))){$=0;Ca(f,1,2982,0);break b}b=N(b,h);if(b>>>0>=1073741824){$=0;Ca(f,1,2982,0);break b}h=b<<2;H[o+44>>2]=h;i:{j:{k:{b=H[o+36>>2];if(b){if(h>>>0<=K[o+48>>2]){break h}if(H[o+40>>2]){break k}}b=Ja(h);H[o+36>>2]=b;h=b;b=H[o+44>>2];if(!(b?h:1)){break j}H[o+40>>2]=1;H[o+48>>2]=b;break h}Da(b);b=Ja(H[o+44>>2]);H[o+36>>2]=b;if(b){break i}H[o+48>>2]=0;H[o+40>>2]=0;H[o+44>>2]=0}$=0;Ca(f,1,2982,0);break b}H[o+40>>2]=1;H[o+48>>2]=H[o+44>>2]}E=E+1|0;t=H[R+24>>2];if(E>>>0>2]){continue}break}break d}A=H[t+24>>2];Q=H[H[H[R+20>>2]>>2]+20>>2];b=0;while(1){l:{if(H[(b<<2)+r>>2]?0:r){break l}M=Q+N(b,76)|0;o=H[M>>2];k=A+N(b,52)|0;w=H[k>>2];m=w-1|0;g=H[R+48>>2];i=m+g|0;s=0-!w|0;h=s;h=Ke(i,g>>>0>i>>>0?h+1|0:h,w,0);W=h>>>0>>0?o:h;H[M+56>>2]=W;o=H[M+4>>2];p=H[k+4>>2];k=p-1|0;g=H[R+52>>2];i=k+g|0;l=0-!p|0;h=l;h=Ke(i,g>>>0>i>>>0?h+1|0:h,p,0);z=h>>>0>>0?o:h;H[M+60>>2]=z;g=H[M+8>>2];i=H[R+56>>2];h=i+m|0;h=Ke(h,h>>>0>>0?s+1|0:s,w,0);o=g>>>0>>0?g:h;H[M+64>>2]=o;g=H[M+12>>2];i=H[R+60>>2];h=k+i|0;h=Ke(h,h>>>0>>0?l+1|0:l,p,0);h=g>>>0>>0?g:h;H[M+68>>2]=h;if(o>>>0>>0|h>>>0>>0){break c}ca=H[M+20>>2];if(!ca){break l}X=h-1|0;C=0-!h|0;w=o-1|0;p=0-!o|0;Z=z-1|0;s=0-!z|0;z=W-1|0;m=0-!W|0;o=H[M+28>>2];k=0;i=0;while(1){fa=o+N(k,152)|0;D=ca+(k^-1)|0;g=D&31;if((D&63)>>>0>=32){l=1<>>32-g}M=h;h=X+M|0;g=l+C|0;g=h>>>0>>0?g+1|0:g;W=D&31;if((D&63)>>>0>=32){h=g>>>W|0}else{h=((1<>>W}H[fa+148>>2]=h;h=l+p|0;v=h+1|0;g=h;h=w+M|0;g=h>>>0>>0?v:g;W=D&31;if((D&63)>>>0>=32){h=g>>>W|0}else{h=((1<>>W}H[fa+144>>2]=h;h=l+s|0;v=h+1|0;g=h;h=M+Z|0;g=h>>>0>>0?v:g;W=D&31;if((D&63)>>>0>=32){h=g>>>W|0}else{h=((1<>>W}H[fa+140>>2]=h;h=l+m|0;l=h+1|0;g=h;h=z+M|0;g=h>>>0>>0?l:g;l=D&31;if((D&63)>>>0>=32){h=g>>>l|0}else{h=((1<>>l}H[fa+136>>2]=h;k=k+1|0;i=k?i:i+1|0;if(i|(k|0)!=(ca|0)){continue}break}}b=b+1|0;if((ia|0)!=(b|0)){continue}break}}$=0;H[Ha+8>>2]=0;b=H[R+28>>2];da=Fa(1,8);if(da){H[da+4>>2]=b;H[da>>2]=t}if(!da){break b}m=H[H[R+20>>2]>>2];S=oa-144|0;oa=S;Q=H[R+36>>2];b=N(Q,5644);z=H[da+4>>2];va=b+H[z+76>>2]|0;ia=H[va+420>>2];t=0;g=0;Y=oa-32|0;oa=Y;sa=b+H[z+76>>2]|0;ya=H[sa+420>>2];ja=H[da>>2];ka=H[ja+16>>2];o=Ga(N(ka,528));m:{if(!o){break m}r=Ga(ka<<2);n:{if(!r){r=o;break n}s=H[z+76>>2]+N(Q,5644)|0;p=H[s+420>>2];b=p+1|0;h=Fa(b,240);o:{if(h){p:{if(b){ba=H[ja+16>>2];b=h;while(1){H[b+236>>2]=f;i=Fa(ba,16);H[b+200>>2]=i;if(!i){break p}i=H[ja+16>>2];H[b+196>>2]=i;v=0;ba=0;if(i){while(1){l=H[b+200>>2]+(v<<4)|0;k=H[s+5584>>2]+N(v,1080)|0;i=Fa(H[k+4>>2],16);H[l+12>>2]=i;if(!i){break p}H[l+8>>2]=H[k+4>>2];v=v+1|0;ba=H[ja+16>>2];if(v>>>0>>0){continue}break}}b=b+240|0;i=(n|0)==(p|0);n=n+1|0;if(!i){continue}break}}break o}b=H[h+4>>2];if(b){Da(b);H[h+4>>2]=0}b=h;n=0;while(1){v=H[b+200>>2];if(v){ba=0;k=H[b+196>>2];if(k){while(1){i=H[v+12>>2];if(i){Da(i);H[v+12>>2]=0;k=H[b+196>>2]}v=v+16|0;ba=ba+1|0;if(ba>>>0>>0){continue}break}v=H[b+200>>2]}Da(v);H[b+200>>2]=0}b=b+240|0;i=(n|0)==(p|0);n=n+1|0;if(!i){continue}break}Da(h)}h=0}if(h){q:{if(!ka){break q}b=o;if(ka>>>0>=8){C=r+28|0;w=r+24|0;p=r+20|0;s=r+16|0;l=r+12|0;n=r+8|0;k=r+4|0;i=ka&-8;while(1){A=u<<2;H[A+r>>2]=b;H[k+A>>2]=b+528;H[n+A>>2]=b+1056;H[l+A>>2]=b+1584;H[s+A>>2]=b+2112;H[p+A>>2]=b+2640;H[w+A>>2]=b+3168;H[A+C>>2]=b+3696;u=u+8|0;b=b+4224|0;t=t+8|0;if((i|0)!=(t|0)){continue}break}}i=ka&7;if(!i){break q}while(1){H[(u<<2)+r>>2]=b;u=u+1|0;b=b+528|0;V=V+1|0;if((i|0)!=(V|0)){continue}break}}k=r;n=0;s=H[(H[z+76>>2]+N(Q,5644)|0)+5584>>2];v=H[ja+24>>2];b=H[z+24>>2];r=(Q>>>0)/(b>>>0)|0;i=H[z+4>>2]+N(H[z+12>>2],Q-N(b,r)|0)|0;b=H[ja>>2];H[Y+20>>2]=b>>>0>>0?i:b;b=i+H[z+12>>2]|0;i=b>>>0>>0?-1:b;b=H[ja+8>>2];H[Y+16>>2]=b>>>0>i>>>0?i:b;i=H[z+8>>2]+N(r,H[z+16>>2])|0;b=H[ja+4>>2];H[Y+12>>2]=b>>>0>>0?i:b;b=i+H[z+16>>2]|0;i=b>>>0>>0?-1:b;b=H[ja+12>>2];H[Y+8>>2]=b>>>0>i>>>0?i:b;H[Y+24>>2]=0;H[Y+28>>2]=0;H[Y+4>>2]=2147483647;H[Y>>2]=2147483647;if(H[ja+16>>2]){while(1){r=k?H[k+(n<<2)>>2]:0;Z=H[v+4>>2];t=Z-1|0;l=H[Y+8>>2];i=t+l|0;A=0-!Z|0;b=A;Q=Ke(i,i>>>0>>0?b+1|0:b,Z,0);z=H[v>>2];p=z-1|0;l=H[Y+16>>2];i=p+l|0;C=0-!z|0;b=C;w=Ke(i,i>>>0>>0?b+1|0:b,z,0);i=H[Y+12>>2];b=i+t|0;l=Ke(b,b>>>0>>0?A+1|0:A,Z,0);i=H[Y+20>>2];b=i+p|0;b=Ke(b,b>>>0>>0?C+1|0:C,z,0);V=H[s+4>>2];if(V>>>0>K[Y+28>>2]){H[Y+28>>2]=V;V=H[s+4>>2]}if(V){ca=s+944|0;X=s+812|0;na=Q-1|0;Z=0-!Q|0;D=w-1|0;z=0-!w|0;fa=l-1|0;A=0-!l|0;M=b-1|0;Q=0-!b|0;t=0;while(1){b=t<<2;u=H[b+ca>>2];pa=H[b+X>>2];ba=0;if(r){H[r+4>>2]=u;H[r>>2]=pa;ba=r+8|0}V=V-1|0;r=pa+V|0;r:{if(r>>>0>31){break r}b=H[v>>2];if(b>>>0>-1>>>r>>>0){break r}i=H[Y+4>>2];b=b<>2]=b>>>0>i>>>0?i:b}r=u+V|0;s:{if(r>>>0>31){break s}b=H[v+4>>2];if(b>>>0>-1>>>r>>>0){break s}i=H[Y>>2];b=b<>2]=b>>>0>i>>>0?i:b}r=0;i=V&31;if((V&63)>>>0>=32){l=1<>>32-i}_=b;b=na+_|0;i=l;l=Z+i|0;w=b>>>0>>0?l+1|0:l;W=V&31;l=u&31;if((u&63)>>>0>=32){l=1<>>32-l}C=p;if((V&63)>>>0>=32){w=w>>>W|0}else{w=((1<>>W}b=C+w|0;p=b-1|0;C=(b>>>0>>0?l+1|0:l)-!b|0;W=u&31;b=i+A|0;wa=b+1|0;l=b;b=_+fa|0;l=b>>>0>>0?wa:l;if((u&63)>>>0>=32){p=C>>>W|0}else{p=((1<>>W}C=p;p=V&31;if((V&63)>>>0>=32){b=l>>>p|0}else{b=((1<>>p}W=(b|0)!=(w|0)?C-(b>>>u|0)&-1>>>u:0;b=i+z|0;w=b+1|0;l=b;b=D+_|0;C=b>>>0>>0?w:l;u=V&31;l=pa&31;if((pa&63)>>>0>=32){l=1<>>32-l;w=p}if((V&63)>>>0>=32){p=C>>>u|0}else{p=((1<>>u}b=w+p|0;w=(b>>>0>>0?l+1|0:l)-!b|0;l=b-1|0;C=pa&31;b=i+Q|0;wa=b+1|0;i=b;b=M+_|0;i=b>>>0>>0?wa:i;if((pa&63)>>>0>=32){l=w>>>C|0}else{l=((1<>>C}w=l;l=V&31;if((V&63)>>>0>=32){b=i>>>l|0}else{b=((1<>>l}b=(b|0)!=(p|0)?w-(b>>>pa|0)&-1>>>pa:0;if(ba){H[ba+4>>2]=W;H[ba>>2]=b;r=ba+8|0}b=N(b,W);if(b>>>0>K[Y+24>>2]){H[Y+24>>2]=b}t=t+1|0;if(t>>>0>2]){continue}break}}v=v+52|0;s=s+1080|0;n=n+1|0;if(n>>>0>2]){continue}break}}l=ya+1|0;X=H[Y+28>>2];ca=H[Y+24>>2];H[h+4>>2]=0;b=H[sa+8>>2]+1|0;A=N(ca,ka);Z=N(A,X);Ie(b,0,Z);t:{if(!ra){b=N(b,Z);H[h+8>>2]=b;b=Fa(b,2);H[h+4>>2]=b;if(b){break t}}Da(o);Da(k);b=H[h+4>>2];if(b){Da(b);H[h+4>>2]=0}if(!l){r=h;break n}r=0;t=h;while(1){b=H[t+200>>2];if(b){n=0;u=H[t+196>>2];if(u){while(1){i=H[b+12>>2];if(i){Da(i);H[b+12>>2]=0;u=H[t+196>>2]}b=b+16|0;n=n+1|0;if(u>>>0>n>>>0){continue}break}b=H[t+200>>2]}Da(b);H[t+200>>2]=0}t=t+240|0;b=(r|0)==(ya|0);r=r+1|0;if(!b){continue}break}r=h;break n}g=H[ja+24>>2];Q=H[Y+20>>2];H[h+204>>2]=Q;C=H[Y+12>>2];H[h+208>>2]=C;w=H[Y+16>>2];H[h+212>>2]=w;p=H[Y+8>>2];H[h+216>>2]=p;H[h+12>>2]=Z;H[h+16>>2]=A;H[h+20>>2]=ca;v=1;H[h+24>>2]=1;if(ka){t=H[h+200>>2];s=0;r=g;while(1){b=H[k+(s<<2)>>2];H[t>>2]=H[r>>2];H[t+4>>2]=H[r+4>>2];z=H[t+8>>2];u:{if(!z){break u}n=H[t+12>>2];if((z|0)!=1){i=z&-2;u=0;while(1){H[n>>2]=H[b>>2];H[n+4>>2]=H[b+4>>2];H[n+8>>2]=H[b+8>>2];H[n+12>>2]=H[b+12>>2];H[n+16>>2]=H[b+16>>2];H[n+20>>2]=H[b+20>>2];H[n+24>>2]=H[b+24>>2];H[n+28>>2]=H[b+28>>2];n=n+32|0;b=b+32|0;u=u+2|0;if((i|0)!=(u|0)){continue}break}}if(!(z&1)){break u}H[n>>2]=H[b>>2];H[n+4>>2]=H[b+4>>2];H[n+8>>2]=H[b+8>>2];H[n+12>>2]=H[b+12>>2]}r=r+52|0;t=t+16|0;s=s+1|0;if((ka|0)!=(s|0)){continue}break}}if(l>>>0>1){i=h;while(1){H[i+456>>2]=p;H[i+452>>2]=w;H[i+448>>2]=C;H[i+444>>2]=Q;H[i+264>>2]=1;H[i+260>>2]=ca;H[i+256>>2]=A;H[i+252>>2]=Z;if(ka){t=H[i+440>>2];s=0;r=g;while(1){b=H[k+(s<<2)>>2];H[t>>2]=H[r>>2];H[t+4>>2]=H[r+4>>2];z=H[t+8>>2];v:{if(!z){break v}n=H[t+12>>2];if((z|0)!=1){l=z&-2;u=0;while(1){H[n>>2]=H[b>>2];H[n+4>>2]=H[b+4>>2];H[n+8>>2]=H[b+8>>2];H[n+12>>2]=H[b+12>>2];H[n+16>>2]=H[b+16>>2];H[n+20>>2]=H[b+20>>2];H[n+24>>2]=H[b+24>>2];H[n+28>>2]=H[b+28>>2];n=n+32|0;b=b+32|0;u=u+2|0;if((l|0)!=(u|0)){continue}break}}if(!(z&1)){break v}H[n>>2]=H[b>>2];H[n+4>>2]=H[b+4>>2];H[n+8>>2]=H[b+8>>2];H[n+12>>2]=H[b+12>>2]}r=r+52|0;t=t+16|0;s=s+1|0;if((ka|0)!=(s|0)){continue}break}}b=H[i+8>>2];H[i+244>>2]=H[i+4>>2];H[i+248>>2]=b;b=(v|0)!=(ya|0);i=i+240|0;v=v+1|0;if(b){continue}break}}Da(o);Da(k);k=H[sa+420>>2];w:{if(I[sa+5640|0]&4){if((k|0)==-1){break w}n=sa+424|0;r=H[sa+8>>2];u=0;b=h;while(1){i=H[n+36>>2];H[b+44>>2]=1;H[b+84>>2]=i;H[b+48>>2]=H[n>>2];i=H[n+4>>2];H[b+68>>2]=0;H[b+72>>2]=0;H[b+52>>2]=i;H[b+60>>2]=H[n+12>>2];H[b+64>>2]=H[n+16>>2];i=H[n+8>>2];H[b+76>>2]=ca;H[b+56>>2]=i>>>0>>0?i:r;n=n+148|0;b=b+240|0;i=(k|0)==(u|0);u=u+1|0;if(!i){continue}break}break w}if((k|0)==-1){break w}g=H[sa+8>>2];r=H[sa+4>>2];b=h;if(k){i=k+1&-2;V=0;while(1){H[b+68>>2]=0;H[b+72>>2]=0;H[b+52>>2]=0;H[b+44>>2]=1;H[b+48>>2]=0;H[b+84>>2]=r;H[b+60>>2]=X;H[b+324>>2]=r;H[b+76>>2]=ca;H[b+56>>2]=g;H[b+308>>2]=0;H[b+312>>2]=0;H[b+292>>2]=0;H[b+284>>2]=1;H[b+288>>2]=0;H[b+300>>2]=X;H[b+296>>2]=g;H[b+316>>2]=ca;H[b+64>>2]=H[b+196>>2];H[b+304>>2]=H[b+436>>2];b=b+480|0;V=V+2|0;if((i|0)!=(V|0)){continue}break}}if(k&1){break w}H[b+68>>2]=0;H[b+72>>2]=0;H[b+52>>2]=0;H[b+44>>2]=1;H[b+48>>2]=0;H[b+84>>2]=r;H[b+60>>2]=X;H[b+76>>2]=ca;H[b+56>>2]=g;H[b+64>>2]=H[b+196>>2]}g=h;break m}Da(o)}Da(r)}oa=Y+32|0;h=g;x:{y:{if(!g){break y}A=ia+1|0;p=q;k=g;z:{A:{while(1){if(H[k+84>>2]==-1){break z}z=Ga(H[ja+16>>2]<<2);if(!z){break z}b=H[ja+16>>2]<<2;if(b){y(z,1,b)}if(fc(k)){while(1){E=H[m+20>>2];B:{C:{if(K[k+40>>2]>=K[va+12>>2]){break C}i=H[k+32>>2];b=N(H[k+28>>2],76)+E|0;if(i>>>0>=K[b+24>>2]){break C}r=H[b+28>>2]+N(i,152)|0;if(!H[r+24>>2]){break C}i=r+28|0;D=0;D:{while(1){b=i+N(D,36)|0;g=H[b+20>>2]+N(H[k+36>>2],40)|0;if(!Cb(R,H[k+28>>2],H[k+32>>2],H[b+16>>2],H[g>>2],H[g+4>>2],H[g+8>>2],H[g+12>>2])){D=D+1|0;if(D>>>0>2]){continue}break D}break}H[z+(H[k+28>>2]<<2)>>2]=0;H[S+136>>2]=0;if(!ec(H[da+4>>2],H[m+20>>2],va,k,S+140|0,p,S+136|0,j,f)){break A}D=H[k+32>>2];o=H[k+28>>2];u=H[S+136>>2];if(H[S+140>>2]){H[S+136>>2]=0;C=H[(H[m+20>>2]+N(o,76)|0)+28>>2]+N(D,152)|0;E=H[C+24>>2];if(E){Q=j-u|0;w=j+p|0;o=C+28|0;X=0;g=0;l=p+u|0;v=l;while(1){E:{if(H[o+8>>2]==H[o>>2]|H[o+12>>2]==H[o+4>>2]){break E}b=H[o+20>>2]+N(H[k+36>>2],40)|0;r=N(H[b+20>>2],H[b+16>>2]);if(!r){break E}E=H[b+24>>2];V=0;while(1){t=H[E+36>>2];if(t){F:{if(g|H[E+64>>2]){H[E+52>>2]=0;D=1;b=64;break F}D=H[E>>2];b=H[E+40>>2];G:{if(b){D=N(b,24)+D|0;if(H[D-20>>2]!=H[D-12>>2]){D=D-24|0;break G}b=b+1|0}else{b=1}H[E+40>>2]=b}n=H[D+20>>2];H:{I:{if(n>>>0>(v^-1)>>>0){break I}i=D+20|0;while(1){if(w>>>0>>0){break I}s=H[E+4>>2];g=H[E+52>>2];if((g|0)!=H[E+56>>2]){b=t}else{b=g<<1|1;s=Ia(s,b<<3);if(!s){Ca(f,1,1024,0);break A}H[E+56>>2]=b;H[E+4>>2]=s;g=H[E+52>>2];n=H[i>>2];b=H[E+36>>2]}i=(g<<3)+s|0;H[i+4>>2]=n;H[i>>2]=v;H[E+52>>2]=g+1;H[D>>2]=H[D>>2]+n;g=H[D+16>>2];i=g+H[D+4>>2]|0;H[D+4>>2]=i;t=b-g|0;H[E+36>>2]=t;H[D+8>>2]=i;v=n+v|0;i=0;if((b|0)==(g|0)){break H}H[E+40>>2]=H[E+40>>2]+1;i=D+44|0;n=H[D+44>>2];D=D+24|0;if((v^-1)>>>0>=n>>>0){continue}break}}g=H[k+28>>2];i=H[k+32>>2];b=H[k+36>>2];if(H[H[da+4>>2]+104>>2]){H[S+120>>2]=g;H[S+116>>2]=i;H[S+112>>2]=X;H[S+108>>2]=b;H[S+104>>2]=V;H[S+100>>2]=Q;H[S+96>>2]=n;Ca(f,1,14693,S+96|0);break A}H[S+88>>2]=g;H[S+84>>2]=i;H[S+80>>2]=X;H[S+76>>2]=b;H[S+72>>2]=V;H[S+68>>2]=Q;H[S+64>>2]=n;Ca(f,2,14693,S- -64|0);H[E+52>>2]=0;H[E+64>>2]=1;i=1}g=i;D=H[E+40>>2];b=44}H[b+E>>2]=D}E=E+68|0;V=V+1|0;if((r|0)!=(V|0)){continue}break}E=H[C+24>>2]}o=o+36|0;X=X+1|0;if(E>>>0>X>>>0){continue}break}D=H[k+32>>2];o=H[k+28>>2];b=g?Q:v-l|0}else{b=0}u=b+u|0}b=H[ja+24>>2]+N(o,52)|0;i=H[b+36>>2];H[b+36>>2]=i>>>0>>0?D:i;break B}E=H[m+20>>2]}H[S+136>>2]=0;if(!ec(H[da+4>>2],E,va,k,S+140|0,p,S+136|0,j,f)){break A}o=H[k+28>>2];u=H[S+136>>2];if(!H[S+140>>2]){break B}w=H[k+32>>2];b=H[(H[m+20>>2]+N(o,76)|0)+28>>2]+N(w,152)|0;r=H[b+24>>2];if(!r){break B}Q=j-u|0;s=b+28|0;C=H[k+36>>2];D=0;g=0;J:{K:{while(1){L:{if(H[s+8>>2]==H[s>>2]|H[s+12>>2]==H[s+4>>2]){break L}b=H[s+20>>2]+N(C,40)|0;i=N(H[b+20>>2],H[b+16>>2]);if(!i){break L}t=H[b+24>>2];X=0;while(1){n=H[t+36>>2];if(n){E=H[t>>2];V=H[t+40>>2];M:{if(V){E=N(V,24)+E|0;if(H[E-20>>2]!=H[E-12>>2]){E=E-24|0;break M}V=V+1|0}else{V=1}H[t+40>>2]=V}v=H[E+20>>2];D=D+v|0;if(Q>>>0>>0|v>>>0>D>>>0){break J}while(1){N:{l=H[E+16>>2];H[E+4>>2]=l+H[E+4>>2];b=n-l|0;if((l|0)==(n|0)){break N}V=V+1|0;H[t+40>>2]=V;v=H[E+44>>2];D=D+v|0;if(v>>>0>D>>>0){break K}E=E+24|0;n=b;if(D>>>0<=Q>>>0){continue}break K}break}H[t+36>>2]=b}t=t+68|0;X=X+1|0;if((i|0)!=(X|0)){continue}break}}s=s+36|0;g=g+1|0;if((r|0)!=(g|0)){continue}break}u=u+D|0;break B}H[t+36>>2]=b}if(!H[H[da+4>>2]+104>>2]){H[S+24>>2]=o;H[S+20>>2]=w;H[S+16>>2]=g;H[S+12>>2]=C;H[S+8>>2]=X;H[S+4>>2]=Q;H[S>>2]=v;Ca(f,2,14608,S);o=H[k+28>>2];u=u+Q|0;break B}H[S+56>>2]=o;H[S+52>>2]=w;H[S+48>>2]=g;H[S+44>>2]=C;H[S+40>>2]=X;H[S+36>>2]=Q;H[S+32>>2]=v;Ca(f,1,14608,S+32|0);break A}O:{if(!H[z+(o<<2)>>2]){break O}b=H[ja+24>>2]+N(o,52)|0;if(H[b+36>>2]){break O}H[b+36>>2]=H[(H[m+20>>2]+N(o,76)|0)+24>>2]-1}j=j-u|0;p=p+u|0;if(fc(k)){continue}break}}Da(z);k=k+240|0;ma=ma+1|0;if(ma>>>0<=K[va+420>>2]){continue}break}Db(h,A);H[Ha+8>>2]=p-q;b=1;break x}Db(h,A);Da(z);break y}Db(h,A)}b=0}oa=S+144|0;hb(da);if(!b){break b}$=H[H[R+32>>2]+5584>>2];s=H[H[R+20>>2]>>2];p=H[s+20>>2];H[Ha+12>>2]=1;E=0;b=H[R+32>>2];m=H[$+16>>2]>>>4&1&H[b+12>>2]==H[b+8>>2];t=H[s+16>>2];P:{if(!t){break P}while(1){b=H[R+68>>2];if(!(H[b+(E<<2)>>2]?0:b)){r=Ha+12|0;ma=0;qa=H[p+24>>2];Q:{if(!qa){break Q}l=H[R+44>>2];while(1){q=H[p+28>>2]+N(ma,152)|0;n=H[q+24>>2];if(n){j=q+28|0;qa=H[q+20>>2];g=H[q+16>>2];i=0;while(1){if(N(g,qa)){t=j+N(i,36)|0;k=0;while(1){w=H[t+20>>2]+N(k,40)|0;b=Cb(R,H[p+16>>2],ma,H[t+16>>2],H[w>>2],H[w+4>>2],H[w+8>>2],H[w+12>>2]);n=H[w+20>>2];o=H[w+16>>2];h=N(n,o);R:{if(b){if(!h){break R}o=0;while(1){h=H[w+24>>2]+N(o,68)|0;S:{if(!Cb(R,H[p+16>>2],ma,H[t+16>>2],H[h+8>>2],H[h+12>>2],H[h+16>>2],H[h+20>>2])){b=H[h+60>>2];if(!b){break S}Da(b);H[h+60>>2]=0;break S}if(!H[R+64>>2]){if(H[h+60>>2]|H[h+16>>2]==H[h+8>>2]|H[h+20>>2]==H[h+12>>2]){break S}}g=Fa(1,44);if(!g){H[Ha+12>>2]=0;break Q}b=H[R+64>>2];H[g+36>>2]=0;H[g+28>>2]=r;H[g+20>>2]=$;H[g+16>>2]=p;H[g+12>>2]=t;H[g+8>>2]=h;H[g+4>>2]=ma;H[g>>2]=b;H[g+40>>2]=m;H[g+32>>2]=f;H[g+24>>2]=H[l+4>>2]>1;ib(l,14,g);if(!H[Ha+12>>2]){break Q}}o=o+1|0;if(o>>>0>2],H[w+16>>2])>>>0){continue}break}break R}if(!h){break R}g=0;while(1){h=H[w+24>>2]+N(g,68)|0;b=H[h+60>>2];if(b){Da(b);H[h+60>>2]=0;n=H[w+20>>2];o=H[w+16>>2]}g=g+1|0;if(g>>>0>>0){continue}break}}k=k+1|0;g=H[q+16>>2];qa=H[q+20>>2];if(k>>>0>>0){continue}break}n=H[q+24>>2]}i=i+1|0;if(n>>>0>i>>>0){continue}break}qa=H[p+24>>2]}ma=ma+1|0;if(qa>>>0>ma>>>0){continue}break}}if(!H[Ha+12>>2]){break P}t=H[s+16>>2]}$=$+1080|0;p=p+76|0;E=E+1|0;if(E>>>0>>0){continue}break}}$=0;Ua(H[R+44>>2]);if(!H[Ha+12>>2]){break b}T:{if(H[R+64>>2]){break T}E=H[R+24>>2];if(!H[E+16>>2]){break T}p=0;while(1){g=H[H[H[R+20>>2]>>2]+20>>2]+N(p,76)|0;b=H[g+28>>2]+N(H[(H[E+24>>2]+N(p,52)|0)+36>>2],152)|0;r=H[b+136>>2];i=H[b+144>>2];j=H[b+140>>2];h=H[b+148>>2];Da(H[g+52>>2]);H[g+52>>2]=0;U:{b=H[R+68>>2];if((i|0)==(r|0)|(h|0)==(j|0)|(H[b+(p<<2)>>2]?0:b)){break U}h=h-j|0;b=i-r|0;Ie(h,0,b);if(ra){Ca(f,1,2982,0);break b}b=N(b,h);if(b>>>0>=1073741824){Ca(f,1,2982,0);break b}b=Ja(b<<2);H[g+52>>2]=b;if(b){break U}Ca(f,1,2982,0);break b}p=p+1|0;E=H[R+24>>2];if(p>>>0>2]){continue}break}}E=H[R+32>>2];qa=H[H[R+20>>2]>>2];if(H[qa+16>>2]){p=H[qa+20>>2];E=H[E+5584>>2];t=H[H[R+24>>2]+24>>2];r=0;while(1){V:{b=H[R+68>>2];if(H[b+(r<<2)>>2]?0:b){break V}m=H[t+36>>2]+1|0;if(H[E+20>>2]==1){fa=m;j=0;ta=oa-32|0;oa=ta;W:{X:{if(H[R+64>>2]){b=1;if((m|0)==1){break W}i=H[p+28>>2];h=i+N(H[p+24>>2],152)|0;s=H[h-144>>2];l=H[h-152>>2];if((s|0)==(l|0)){break W}g=m-1|0;n=g&1;z=H[R+44>>2];Q=H[z+4>>2];Y:{if((m|0)==2){h=i;break Y}o=g&-2;h=i;b=0;while(1){k=H[h+160>>2]-H[h+152>>2]|0;k=j>>>0>k>>>0?j:k;j=H[h+164>>2]-H[h+156>>2]|0;k=j>>>0>>0?k:j;j=H[h+312>>2]-H[h+304>>2]|0;k=j>>>0>>0?k:j;j=H[h+316>>2]-H[h+308>>2]|0;j=j>>>0>>0?k:j;h=h+304|0;b=b+2|0;if((o|0)!=(b|0)){continue}break}}b=0;if(n){k=H[h+160>>2]-H[h+152>>2]|0;j=j>>>0>k>>>0?j:k;h=H[h+164>>2]-H[h+156>>2]|0;j=h>>>0>>0?j:h}if(j>>>0>134217727){break W}n=H[i+4>>2];o=H[i+12>>2];k=H[i>>2];h=H[i+8>>2];q=j<<5;A=rb(q);H[ta+16>>2]=A;if(!A){break W}C=s-l|0;b=o-n|0;k=h-k|0;H[ta>>2]=A;while(1){w=H[p+36>>2];o=b;H[ta+8>>2]=b;b=k;H[ta+24>>2]=b;l=H[i+156>>2];n=H[i+164>>2];j=H[i+160>>2];h=H[i+152>>2];H[ta+28>>2]=(h|0)%2;k=j-h|0;H[ta+20>>2]=k-b;m=(Q|0)<2;b=n-l|0;Z:{if(!(!m&b>>>0>1)){h=0;if(!b){break Z}while(1){lc(ta+16|0,w+(N(h,C)<<2)|0);h=h+1|0;if((h|0)!=(b|0)){continue}break}break Z}s=b>>>0>>0?b:Q;n=s-1|0;l=(b>>>0)/(s>>>0)|0;j=0;while(1){Z=Ga(36);if(!Z){break X}h=H[ta+20>>2];H[Z>>2]=H[ta+16>>2];H[Z+4>>2]=h;h=H[ta+28>>2];H[Z+8>>2]=H[ta+24>>2];H[Z+12>>2]=h;H[Z+28>>2]=N(j,l);H[Z+24>>2]=w;H[Z+20>>2]=C;H[Z+16>>2]=k;h=(j|0)==(n|0);j=j+1|0;H[Z+32>>2]=h?b:N(l,j);h=rb(q);H[Z>>2]=h;if(!h){b=0;Ua(z);Da(Z);Da(A);break W}ib(z,10,Z);if((j|0)!=(s|0)){continue}break}Ua(z)}H[ta+4>>2]=b-o;H[ta+12>>2]=H[i+156>>2]%2;_:{if(!(!m&k>>>0>1)){j=8;h=0;if(k>>>0>=8){while(1){qb(ta,w+(h<<2)|0,C,8);h=j;j=h+8|0;if(k>>>0>=j>>>0){continue}break}}if(h>>>0>=k>>>0){break _}qb(ta,w+(h<<2)|0,C,k-h|0);break _}m=k>>>0>>0?k:Q;o=m-1|0;n=(k>>>0)/(m>>>0)|0;j=0;while(1){l=Ga(36);if(!l){break X}h=H[ta+4>>2];H[l>>2]=H[ta>>2];H[l+4>>2]=h;h=H[ta+12>>2];H[l+8>>2]=H[ta+8>>2];H[l+12>>2]=h;H[l+28>>2]=N(j,n);H[l+24>>2]=w;H[l+20>>2]=C;H[l+16>>2]=b;h=(j|0)==(o|0);j=j+1|0;H[l+32>>2]=h?k:N(n,j);h=rb(q);H[l>>2]=h;if(!h){b=0;Ua(z);Da(l);Da(A);break W}ib(z,11,l);if((j|0)!=(m|0)){continue}break}Ua(z)}i=i+152|0;g=g-1|0;if(g){continue}break}b=1;Da(A);break W}b=1;o=H[p+28>>2];Ta=o+N(fa,152)|0;jb=Ta-152|0;if(H[jb>>2]==H[Ta-144>>2]){break W}aa=Ta-148|0;if(H[aa>>2]==H[Ta-140>>2]){break W}s=H[o+4>>2];l=H[o+12>>2];m=H[o>>2];n=H[o+8>>2];M=H[p+68>>2];W=H[p+64>>2];ia=H[p+60>>2];ca=H[p+56>>2];Na=kc(p,fa);if(!Na){b=0;break W}$:{aa:{if((fa|0)!=1){b=fa-1|0;k=b&1;ba:{if((fa|0)==2){h=o;break ba}g=b&-2;h=o;b=0;while(1){i=H[h+160>>2]-H[h+152>>2]|0;i=i>>>0>>0?j:i;j=H[h+164>>2]-H[h+156>>2]|0;i=i>>>0>j>>>0?i:j;j=H[h+312>>2]-H[h+304>>2]|0;i=i>>>0>j>>>0?i:j;j=H[h+316>>2]-H[h+308>>2]|0;j=i>>>0>j>>>0?i:j;h=h+304|0;b=b+2|0;if((g|0)!=(b|0)){continue}break}}if(k){b=H[h+160>>2]-H[h+152>>2]|0;j=b>>>0>>0?j:b;b=H[h+164>>2]-H[h+156>>2]|0;j=b>>>0>>0?j:b}if(j>>>0>=268435456){break $}J=rb(j<<4);if(!J){break $}ca:{if(!fa){break ca}u=l-s|0;ba=n-m|0;_a=J-4|0;kb=J+28|0;Q=J+24|0;Va=J+16|0;bb=J-16|0;lb=J-32|0;nb=J-8|0;wa=J+4|0;$a=1;da:while(1){h=H[o+156>>2];cb=(h|0)%2|0;b=H[o+152>>2];ga=(b|0)%2|0;X=H[o+164>>2]-h|0;Ba=X-u|0;Z=H[o+160>>2]-b|0;Aa=Z-ba|0;_=ca;b=ca;i=ia;ma=i;j=W;g=j;h=M;v=h;k=H[p+20>>2];ea:{if((k|0)==($a|0)){break ea}q=k-$a|0;ma=0;b=0;if(ca){h=q&31;if((q&63)>>>0>=32){l=-1<>>32-h}b=ca+(b^-1)|0;h=l^-1;h=b>>>0>>0?h+1|0:h;j=q&31;if((q&63)>>>0>=32){b=h>>>j|0}else{b=((1<>>j}}if(ia){j=q&31;if((q&63)>>>0>=32){l=-1<>>32-j}h=ia+(h^-1)|0;j=l^-1;j=h>>>0>>0?j+1|0:j;i=q&31;if((q&63)>>>0>=32){ma=j>>>i|0}else{ma=((1<>>i}}h=0;j=0;if(W){i=q&31;if((q&63)>>>0>=32){l=-1<>>32-i}j=W+(j^-1)|0;i=l^-1;i=j>>>0>>0?i+1|0:i;g=q&31;if((q&63)>>>0>=32){j=i>>>g|0}else{j=((1<>>g}}if(M){i=q&31;if((q&63)>>>0>=32){l=-1<>>32-i}h=M+(h^-1)|0;i=l^-1;i=h>>>0>>0?i+1|0:i;g=q&31;if((q&63)>>>0>=32){h=i>>>g|0}else{h=((1<>>g}}g=0;_=0;s=1<>>0>>0){k=q&31;if((q&63)>>>0>=32){l=-1<>>32-k}n=i^-1;i=n+(ca-s|0)|0;k=l^-1;k=i>>>0>>0?k+1|0:k;n=q&31;if((q&63)>>>0>=32){_=k>>>n|0}else{_=((1<>>n}}if(s>>>0>>0){g=q&31;if((q&63)>>>0>=32){l=-1<>>32-g}k=i^-1;i=k+(W-s|0)|0;g=l^-1;g=i>>>0>>0?g+1|0:g;k=q&31;if((q&63)>>>0>=32){g=g>>>k|0}else{g=((1<>>k}}v=0;i=0;if(s>>>0>>0){k=q&31;if((q&63)>>>0>=32){l=-1<>>32-k}n=i^-1;i=n+(ia-s|0)|0;k=l^-1;k=i>>>0>>0?k+1|0:k;n=q&31;if((q&63)>>>0>=32){i=k>>>n|0}else{i=((1<>>n}}if(s>>>0>=M>>>0){break ea}n=q&31;if((q&63)>>>0>=32){l=-1<>>32-n}m=k^-1;k=m+(M-s|0)|0;n=l^-1;n=k>>>0>>0?n+1|0:n;m=q&31;if((q&63)>>>0>=32){v=n>>>m|0}else{v=((1<>>m}}n=H[o+180>>2];k=g-n|0;k=g>>>0>=k>>>0?k:0;g=k+2|0;g=g>>>0>>0?-1:g;Oa=g>>>0>>0?g:Aa;k=H[o+216>>2];g=j-k|0;g=g>>>0<=j>>>0?g:0;j=g+2|0;j=g>>>0>j>>>0?-1:j;Pa=j>>>0>>0?j:ba;g=(ga?Oa:Pa)<<1;j=(ga?Pa:Oa)<<1|1;ua=g>>>0>j>>>0?g:j;D=ua>>>0>>0;j=_-n|0;g=j>>>0<=_>>>0?j:0;j=g-2|0;m=g>>>0>=j>>>0?j:0;j=b-k|0;j=b>>>0>=j>>>0?j:0;b=j-2|0;l=b>>>0<=j>>>0?b:0;z=(ga?m:l)<<1;A=(ga?l:m)<<1|1;q=z>>>0>>0;s=H[o+184>>2];b=ma-s|0;j=b>>>0<=ma>>>0?b:0;b=j-2|0;n=b>>>0<=j>>>0?b:0;C=n;g=H[o+220>>2];b=i-g|0;j=b>>>0<=i>>>0?b:0;b=j-2|0;k=b>>>0<=j>>>0?b:0;w=k;b=h-s|0;h=b>>>0<=h>>>0?b:0;b=h+2|0;b=b>>>0>>0?-1:b;Qa=b>>>0>>0?b:u;s=Qa;b=v-g|0;h=b>>>0<=v>>>0?b:0;b=h+2|0;b=b>>>0>>0?-1:b;na=b>>>0>>0?b:Ba;ma=na;if(cb){w=n;C=k;ma=s;s=na}db=D?ua:Z;D=q?z:A;ob=u+na|0;pb=k+u|0;if(X){i=l<<3;j=Aa<<3;la=j+_a|0;h=(l|0)<(Aa|0);x=h?i+wa|0:la;z=(ba|0)>(Oa|0)?Oa:ba-1|0;v=0;ea=(ba|0)>1|(Aa|0)>0;b=ga<<2;S=(wa-b|0)+(m<<3)|0;xa=i+J|0;Y=xa+b|0;A=(Aa|0)>(Pa|0)?Pa:Aa;q=l+1|0;da=ba+Oa|0;ka=m+ba|0;pa=J+(D<<2)|0;b=ba<<3;za=b+nb|0;La=b+_a|0;Ma=j+nb|0;sa=!ba&(Aa|0)==1;b=db<<2;va=b+J|0;ja=b+_a|0;ya=((h?l:Aa)<<3)+_a|0;while(1){fa:{if(!(v>>>0>>0&n>>>0<=v>>>0|v>>>0>>0&v>>>0>=pb>>>0)){V=v+1|0;break fa}if(Z>>>0>ua>>>0){H[ja>>2]=0;H[va>>2]=0}V=v+1|0;Ra(Na,l,v,Pa,V,Y,2,0);Ra(Na,ka,v,da,V,S,2,0);ga:{ha:{ia:{if(!ga){if(!ea){break ga}if((l|0)>=(Pa|0)){break ha}ja:{ka:{if((l|0)>0){j=H[ya>>2];break ka}j=H[wa>>2];b=j;if((l|0)<0){break ja}}b=j;j=H[x>>2]}H[xa>>2]=H[xa>>2]-((b+j|0)+2>>2);h=l;j=q;b=j;if((A|0)<=(b|0)){break ia}while(1){j=J+(b<<3)|0;H[j>>2]=H[j>>2]-((H[wa+(h<<3)>>2]+H[j+4>>2]|0)+2>>2);h=b;b=b+1|0;if((A|0)!=(b|0)){continue}break}j=A;break ia}la:{if(!sa){j=l;if((Pa|0)<=(j|0)){break la}while(1){i=J+(j<<3)|0;h=H[i+4>>2];ma:{na:{if((j|0)>=0){b=j+1|0;g=H[((j|0)<(Aa|0)?i:Ma)>>2];break na}g=H[J>>2];b=0;j=j+1|0;_=J;if(j){break ma}}if((b|0)>=(Aa|0)){j=b;_=Ma;break ma}j=b;_=J+(b<<3)|0}b=_;H[i+4>>2]=h-((H[b>>2]+g|0)+2>>2);if((j|0)<(Pa|0)){continue}break}break la}H[J>>2]=H[J>>2]/2;break ga}j=m;if((Oa|0)<=(j|0)){break ga}while(1){b=j<<3;g=b+J|0;h=H[g>>2];oa:{if((j|0)<0){i=H[wa>>2];_=wa;break oa}i=H[((j|0)<(ba|0)?g+4|0:La)>>2];_=wa;if(!j){break oa}_=(j|0)>(ba|0)?La:b+_a|0}b=_;H[g>>2]=h+(H[b>>2]+i>>1);j=j+1|0;if((Oa|0)!=(j|0)){continue}break}break ga}if((j|0)>=(Pa|0)){break ha}while(1){b=J+(j<<3)|0;g=b;i=H[b>>2];pa:{qa:{if((j|0)>0){h=H[(((j|0)<(Aa|0)?j:Aa)<<3)+_a>>2];break qa}h=H[wa>>2];b=wa;if((j|0)<0){break pa}}b=la;if((j|0)>=(Aa|0)){break pa}b=wa+(j<<3)|0}H[g>>2]=i-((H[b>>2]+h|0)+2>>2);j=j+1|0;if((Pa|0)!=(j|0)){continue}break}}if((m|0)>=(Oa|0)){break ga}b=m;j=b;if((b|0)<(z|0)){while(1){b=J+(j<<3)|0;j=j+1|0;H[b+4>>2]=H[b+4>>2]+(H[J+(j<<3)>>2]+H[b>>2]>>1);if((j|0)!=(z|0)){continue}break}b=z}if((b|0)>=(Oa|0)){break ga}while(1){j=b;ra:{sa:{if((b|0)>=0){_=H[((b|0)<(ba|0)?J+(b<<3)|0:za)>>2];h=b+1|0;break sa}_=H[J>>2];h=0;b=j+1|0;i=J;if(b){break ra}}if((h|0)>=(ba|0)){b=h;i=za;break ra}b=h;i=J+(b<<3)|0}h=wa+(j<<3)|0;H[h>>2]=H[h>>2]+(H[i>>2]+_>>1);if((b|0)<(Oa|0)){continue}break}}if(!ab(Na,D,v,db,V,pa,1,0)){break aa}}v=V;if((X|0)!=(v|0)){continue}break}}o=o+152|0;h=s<<1;b=ma<<1|1;b=b>>>0>>0?h:b;ka=b>>>0>>0?b:X;ua=J+(n<<5)|0;j=Ba<<5;La=j+bb|0;b=(n|0)<(Ba|0);pa=b?ua+28|0:La+12|0;sa=b?ua+24|0:La+8|0;va=b?ua+20|0:La+4|0;ja=(n|0)<0?Va:b?ua+16|0:La;q=(u|0)>(na|0)?na:u-1|0;ea=((b?n:Ba)<<5)+bb|0;ya=(n|0)<=0;v=ya?Va:ea;V=(Ba|0)>0;ba=V|(u|0)>1;_=ua+(cb<<4)|0;ma=(J+(4-(cb<<2)<<2)|0)+(k<<5)|0;s=(Ba|0)>(Qa|0)?Qa:Ba;m=n+1|0;h=C<<1;b=w<<1|1;z=b>>>0>h>>>0?h:b;A=J+(z<<4)|0;b=u<<5;xa=b+lb|0;za=j+lb|0;C=!u&(Ba|0)==1;Ma=b+bb|0;S=Ma+12|0;Y=Ma+8|0;da=Ma+4|0;w=ea+12|0;i=ea+8|0;while(1){ta:{ua:{va:{wa:{l=D;if(db>>>0>l>>>0){b=db-l|0;D=(b>>>0>=4?4:b)+l|0;Ra(Na,l,n,D,Qa,_,1,8);Ra(Na,l,pb,D,ob,ma,1,8);if(!cb){if(!ba){break ta}if((n|0)>=(Qa|0)){break ua}H[ua>>2]=H[ua>>2]-((H[v>>2]+H[ja>>2]|0)+2>>2);xa:{if(!ya){j=H[ea+4>>2];h=i;b=w;break xa}j=H[J+20>>2];if((n|0)<0){break wa}h=Q;b=kb}H[ua+4>>2]=H[ua+4>>2]-((H[va>>2]+j|0)+2>>2);H[ua+8>>2]=H[ua+8>>2]-((H[h>>2]+H[sa>>2]|0)+2>>2);j=H[pa>>2];b=H[b>>2];break va}if(C){H[J>>2]=H[J>>2]/2;H[J+8>>2]=H[J+8>>2]/2;H[J+12>>2]=H[J+12>>2]/2;H[J+4>>2]=H[J+4>>2]/2;break ta}b=n;if((Qa|0)>(b|0)){while(1){g=J+(b<<5)|0;ya:{if((b|0)<0){h=H[J>>2];j=V|(b|0)!=-1;H[g+16>>2]=H[g+16>>2]-(((j?h:H[za>>2])+h|0)+2>>2);h=H[wa>>2];H[g+20>>2]=H[g+20>>2]-(((j?h:H[za+4>>2])+h|0)+2>>2);h=H[J+8>>2];H[g+24>>2]=H[g+24>>2]-(((j?h:H[za+8>>2])+h|0)+2>>2);h=H[J+12>>2];H[g+28>>2]=H[g+28>>2]-(((j?h:H[za+12>>2])+h|0)+2>>2);b=b+1|0;break ya}j=b+1|0;za:{if((j|0)<(Ba|0)){b=J+(j<<5)|0;H[g+16>>2]=H[g+16>>2]-((H[g>>2]+H[b>>2]|0)+2>>2);H[g+20>>2]=H[g+20>>2]-((H[g+4>>2]+H[b+4>>2]|0)+2>>2);H[g+24>>2]=H[g+24>>2]-((H[g+8>>2]+H[b+8>>2]|0)+2>>2);H[g+28>>2]=H[g+28>>2]-((H[g+12>>2]+H[b+12>>2]|0)+2>>2);break za}h=H[g+16>>2];if((b|0)<(Ba|0)){H[g+16>>2]=h-((H[g>>2]+H[za>>2]|0)+2>>2);H[g+20>>2]=H[g+20>>2]-((H[g+4>>2]+H[za+4>>2]|0)+2>>2);H[g+24>>2]=H[g+24>>2]-((H[g+8>>2]+H[za+8>>2]|0)+2>>2);H[g+28>>2]=H[g+28>>2]-((H[g+12>>2]+H[za+12>>2]|0)+2>>2);break za}H[g+16>>2]=h-((H[za>>2]<<1)+2>>2);H[g+20>>2]=H[g+20>>2]-((H[za+4>>2]<<1)+2>>2);H[g+24>>2]=H[g+24>>2]-((H[za+8>>2]<<1)+2>>2);H[g+28>>2]=H[g+28>>2]-((H[za+12>>2]<<1)+2>>2)}b=j}if((Qa|0)!=(b|0)){continue}break}}b=k;if((na|0)<=(b|0)){break ta}while(1){g=J+(b<<5)|0;Aa:{if((b|0)<0){H[g>>2]=H[g>>2]+(H[Va>>2]<<1>>1);H[g+4>>2]=H[g+4>>2]+(H[J+20>>2]<<1>>1);H[g+8>>2]=H[g+8>>2]+(H[J+24>>2]<<1>>1);H[g+12>>2]=H[g+12>>2]+(H[J+28>>2]<<1>>1);break Aa}j=H[g>>2];if(!b){h=(b|0)<(u|0);H[g>>2]=j+(H[Va>>2]+H[(h?g+16|0:Ma)>>2]>>1);H[g+4>>2]=H[g+4>>2]+(H[J+20>>2]+H[(h?g+20|0:da)>>2]>>1);H[g+8>>2]=H[g+8>>2]+(H[J+24>>2]+H[(h?g+24|0:Y)>>2]>>1);H[g+12>>2]=H[g+12>>2]+(H[J+28>>2]+H[(h?g+28|0:S)>>2]>>1);break Aa}if((b|0)<=(u|0)){h=(b|0)<(u|0);H[g>>2]=j+(H[g-16>>2]+H[(h?g+16|0:Ma)>>2]>>1);H[g+4>>2]=H[g+4>>2]+(H[g-12>>2]+H[(h?g+20|0:da)>>2]>>1);H[g+8>>2]=H[g+8>>2]+(H[g-8>>2]+H[(h?g+24|0:Y)>>2]>>1);H[g+12>>2]=H[g+12>>2]+(H[g-4>>2]+H[(h?g+28|0:S)>>2]>>1);break Aa}H[g>>2]=j+(H[Ma>>2]<<1>>1);H[g+4>>2]=H[g+4>>2]+(H[Ma+4>>2]<<1>>1);H[g+8>>2]=H[g+8>>2]+(H[Ma+8>>2]<<1>>1);H[g+12>>2]=H[g+12>>2]+(H[Ma+12>>2]<<1>>1)}b=b+1|0;if((na|0)!=(b|0)){continue}break}break ta}ba=Z;u=X;$a=$a+1|0;if((fa|0)!=($a|0)){continue da}break ca}H[ua+4>>2]=H[ua+4>>2]-((j<<1)+2>>2);H[ua+8>>2]=H[ua+8>>2]-((H[Q>>2]<<1)+2>>2);j=H[kb>>2];b=j}H[ua+12>>2]=H[ua+12>>2]-((b+j|0)+2>>2);g=n;j=m;b=j;if((s|0)>(b|0)){while(1){h=J+(j<<5)|0;b=Va+(g<<5)|0;H[h>>2]=H[h>>2]-((H[b>>2]+H[h+16>>2]|0)+2>>2);H[h+4>>2]=H[h+4>>2]-((H[b+4>>2]+H[h+20>>2]|0)+2>>2);H[h+8>>2]=H[h+8>>2]-((H[b+8>>2]+H[h+24>>2]|0)+2>>2);H[h+12>>2]=H[h+12>>2]-((H[b+12>>2]+H[h+28>>2]|0)+2>>2);g=j;j=g+1|0;if((s|0)!=(j|0)){continue}break}b=s}if((b|0)>=(Qa|0)){break ua}while(1){h=b<<5;x=h+Va|0;ga=h+J|0;g=(b|0)<(Ba|0);Ba:{if((b|0)<=0){h=H[Va>>2];if((b|0)>=0){j=g?x:La;H[ga>>2]=H[ga>>2]-((h+H[j>>2]|0)+2>>2);H[ga+4>>2]=H[ga+4>>2]-((H[J+20>>2]+H[j+4>>2]|0)+2>>2);H[ga+8>>2]=H[ga+8>>2]-((H[J+24>>2]+H[j+8>>2]|0)+2>>2);h=(H[J+28>>2]+H[j+12>>2]|0)+2|0;break Ba}H[ga>>2]=H[ga>>2]-((h<<1)+2>>2);H[ga+4>>2]=H[ga+4>>2]-((H[J+20>>2]<<1)+2>>2);H[ga+8>>2]=H[ga+8>>2]-((H[J+24>>2]<<1)+2>>2);h=(H[J+28>>2]<<1)+2|0;break Ba}la=((g?b:Ba)<<5)+bb|0;j=H[la>>2]+2|0;h=H[ga>>2];if(!g){H[ga>>2]=h-(j+H[La>>2]>>2);H[ga+4>>2]=H[ga+4>>2]-((H[la+4>>2]+H[La+4>>2]|0)+2>>2);H[ga+8>>2]=H[ga+8>>2]-((H[la+8>>2]+H[La+8>>2]|0)+2>>2);h=(H[la+12>>2]+H[La+12>>2]|0)+2|0;break Ba}H[ga>>2]=h-(j+H[x>>2]>>2);H[ga+4>>2]=H[ga+4>>2]-((H[la+4>>2]+H[x+4>>2]|0)+2>>2);H[ga+8>>2]=H[ga+8>>2]-((H[la+8>>2]+H[x+8>>2]|0)+2>>2);h=(H[la+12>>2]+H[x+12>>2]|0)+2|0}H[ga+12>>2]=H[ga+12>>2]-(h>>2);b=b+1|0;if((Qa|0)!=(b|0)){continue}break}}if((k|0)>=(na|0)){break ta}h=k;b=h;if((q|0)>(b|0)){while(1){b=J+(h<<5)|0;H[b+16>>2]=H[b+16>>2]+(H[b+32>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[b+36>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[b+40>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[b+44>>2]+H[b+12>>2]>>1);h=h+1|0;if((q|0)!=(h|0)){continue}break}b=q}if((b|0)>=(na|0)){break ta}while(1){h=b<<5;x=h+Va|0;Ca:{Da:{Ea:{if((b|0)<0){h=H[J>>2];if((b|0)!=-1){break Ea}if((u|0)<=0){H[x>>2]=H[x>>2]+(h+H[xa>>2]>>1);H[x+4>>2]=H[x+4>>2]+(H[xa+4>>2]+H[J+4>>2]>>1);H[x+8>>2]=H[x+8>>2]+(H[xa+8>>2]+H[J+8>>2]>>1);g=H[J+12>>2];h=H[xa+12>>2];break Da}break Ea}j=h+J|0;h=b+1|0;Fa:{if((h|0)<(u|0)){b=J+(h<<5)|0;H[x>>2]=H[x>>2]+(H[b>>2]+H[j>>2]>>1);H[x+4>>2]=H[x+4>>2]+(H[b+4>>2]+H[j+4>>2]>>1);H[x+8>>2]=H[x+8>>2]+(H[b+8>>2]+H[j+8>>2]>>1);H[x+12>>2]=H[x+12>>2]+(H[b+12>>2]+H[j+12>>2]>>1);break Fa}if((b|0)>=(u|0)){H[x>>2]=H[x>>2]+H[xa>>2];H[x+4>>2]=H[x+4>>2]+H[xa+4>>2];H[x+8>>2]=H[x+8>>2]+H[xa+8>>2];H[x+12>>2]=H[x+12>>2]+H[xa+12>>2];break Fa}H[x>>2]=H[x>>2]+(H[xa>>2]+H[j>>2]>>1);H[x+4>>2]=H[x+4>>2]+(H[xa+4>>2]+H[j+4>>2]>>1);H[x+8>>2]=H[x+8>>2]+(H[xa+8>>2]+H[j+8>>2]>>1);H[x+12>>2]=H[x+12>>2]+(H[xa+12>>2]+H[j+12>>2]>>1)}b=h;break Ca}H[x>>2]=h+H[x>>2];H[x+4>>2]=H[x+4>>2]+H[J+4>>2];H[x+8>>2]=H[x+8>>2]+H[J+8>>2];g=H[J+12>>2];h=g}H[x+12>>2]=H[x+12>>2]+(g+h>>1);b=b+1|0}if((na|0)!=(b|0)){continue}break}}if(ab(Na,l,z,D,ka,A,1,4)){continue}break}break}break aa}Da(J);b=1}g=H[Ta-16>>2];i=H[jb>>2];j=H[aa>>2];h=H[Ta-8>>2];Ra(Na,g-i|0,H[Ta-12>>2]-j|0,h-i|0,H[Ta-4>>2]-j|0,H[p+52>>2],1,h-g|0);Xa(Na);break W}Xa(Na);Da(J);b=0;break W}Xa(Na);b=0;break W}b=0;Ua(z);Da(A)}oa=ta+32|0;if(b){break V}break b}k=0;o=0;aa=oa+-64|0;oa=aa;Ga:{Ha:{if(H[R+64>>2]){n=H[p+28>>2];s=n+N(H[p+24>>2],152)|0;l=H[s-152>>2];g=1;S=H[R+44>>2];sa=H[S+4>>2];if((m|0)==1){break Ga}X=m-1|0;o=X&1;Ia:{if((m|0)==2){i=0;b=n;break Ia}g=X&-2;i=0;b=n;while(1){h=H[b+160>>2]-H[b+152>>2]|0;j=h>>>0>>0?i:h;h=H[b+164>>2]-H[b+156>>2]|0;j=h>>>0>>0?j:h;h=H[b+312>>2]-H[b+304>>2]|0;j=h>>>0>>0?j:h;h=H[b+316>>2]-H[b+308>>2]|0;i=h>>>0>>0?j:h;b=b+304|0;k=k+2|0;if((g|0)!=(k|0)){continue}break}}g=0;if(o){h=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>>0?i:h;b=H[b+164>>2]-H[b+156>>2]|0;i=b>>>0>>0?h:b}if(i>>>0>134217727){break Ga}m=H[s-144>>2];k=H[n+4>>2];j=H[n+12>>2];h=H[n>>2];b=H[n+8>>2];V=i<<5;ea=Ja(V);H[aa+32>>2]=ea;if(!ea){break Ga}o=j-k|0;j=b-h|0;b=sa>>>1|0;ba=b>>>0<=2?2:b;x=m-l|0;ma=x<<5;na=N(x,28);D=N(x,24);fa=N(x,20);M=x<<4;W=N(x,12);ia=x<<3;H[aa>>2]=ea;_=ea+32|0;h=H[p+36>>2];while(1){l=o;H[aa+8>>2]=l;b=j;H[aa+40>>2]=b;ka=H[n+156>>2];pa=H[n+164>>2];i=H[n+160>>2];g=H[n+152>>2];H[aa+56>>2]=0;H[aa+52>>2]=b;H[aa+48>>2]=0;s=(g|0)%2|0;H[aa+44>>2]=s;j=i-g|0;Q=j-b|0;H[aa+60>>2]=Q;H[aa+36>>2]=Q;w=(sa|0)<2;o=pa-ka|0;Ja:{if(!(!w&o>>>0>15)){m=0;i=h;if(o>>>0<8){break Ja}v=0;while(1){b=aa+32|0;Eb(b,i,x,8);Wa(b);b=0;if(j){while(1){k=(b<<2)+i|0;g=ea+(b<<5)|0;L[k>>2]=L[g>>2];L[k+(x<<2)>>2]=L[g+4>>2];L[k+ia>>2]=L[g+8>>2];L[k+W>>2]=L[g+12>>2];b=b+1|0;if((j|0)!=(b|0)){continue}break}b=0;while(1){k=(b<<2)+i|0;g=ea+(b<<5)|0;L[k+M>>2]=L[g+16>>2];L[k+fa>>2]=L[g+20>>2];L[k+D>>2]=L[g+24>>2];L[k+na>>2]=L[g+28>>2];b=b+1|0;if((j|0)!=(b|0)){continue}break}}i=i+ma|0;b=v+15|0;m=v+8|0;v=m;if(b>>>0>>0){continue}break}break Ja}i=o>>>3|0;C=i>>>0>>0?i:sa;q=(o>>>0)/(C>>>0)&-8;m=o&-8;k=0;i=h;while(1){A=Ga(48);if(!A){break Ha}g=Ja(V);H[A>>2]=g;if(!g){g=0;Ua(S);Da(A);Da(ea);break Ga}H[A+40>>2]=i;H[A+36>>2]=x;H[A+32>>2]=j;H[A+28>>2]=Q;H[A+24>>2]=0;H[A+20>>2]=b;H[A+16>>2]=0;H[A+12>>2]=s;H[A+8>>2]=b;H[A+4>>2]=Q;g=m-N(k,q)|0;k=k+1|0;g=(C|0)==(k|0)?g:q;H[A+44>>2]=g;ib(S,12,A);i=(N(g,x)<<2)+i|0;if((k|0)!=(C|0)){continue}break}Ua(S)}Ka:{if(m>>>0>=o>>>0){break Ka}b=aa+32|0;g=o-m|0;Eb(b,i,x,g);Wa(b);if(!j){break Ka}q=g&-4;C=g&3;s=0;k=ka+(m-pa|0)>>>0>4294967292;while(1){Q=(s<<2)+i|0;m=ea+(s<<5)|0;b=0;v=0;if(!k){while(1){L[Q+(N(b,x)<<2)>>2]=L[m+(b<<2)>>2];g=b|1;L[Q+(N(g,x)<<2)>>2]=L[m+(g<<2)>>2];g=b|2;L[Q+(N(g,x)<<2)>>2]=L[m+(g<<2)>>2];g=b|3;L[Q+(N(g,x)<<2)>>2]=L[m+(g<<2)>>2];b=b+4|0;v=v+4|0;if((q|0)!=(v|0)){continue}break}}v=0;if(C){while(1){L[Q+(N(b,x)<<2)>>2]=L[m+(b<<2)>>2];b=b+1|0;v=v+1|0;if((C|0)!=(v|0)){continue}break}}s=s+1|0;if((s|0)!=(j|0)){continue}break}}Y=o-l|0;H[aa+4>>2]=Y;b=H[n+156>>2];H[aa+28>>2]=Y;H[aa+24>>2]=0;H[aa+20>>2]=l;H[aa+16>>2]=0;va=(b|0)%2|0;H[aa+12>>2]=va;La:{if(!(!w&j>>>0>15)){k=h;if(j>>>0<8){break La}ca=o&-2;Z=o&1;z=Y&-2;A=Y&1;Q=l&-2;C=l&1;b=va<<5;ja=_-b|0;ya=b+ea|0;w=N(l,x)<<2;q=pa-1|0;s=(q|0)==(l+ka|0);i=j;while(1){b=0;v=0;Ma:{Na:{switch(l|0){default:while(1){u=(N(b,x)<<2)+k|0;g=H[u+4>>2];m=ya+(b<<6)|0;H[m>>2]=H[u>>2];H[m+4>>2]=g;g=H[u+28>>2];H[m+24>>2]=H[u+24>>2];H[m+28>>2]=g;g=H[u+20>>2];H[m+16>>2]=H[u+16>>2];H[m+20>>2]=g;g=H[u+12>>2];H[m+8>>2]=H[u+8>>2];H[m+12>>2]=g;g=b|1;u=ya+(g<<6)|0;m=(N(g,x)<<2)+k|0;g=H[m+28>>2];H[u+24>>2]=H[m+24>>2];H[u+28>>2]=g;g=H[m+20>>2];H[u+16>>2]=H[m+16>>2];H[u+20>>2]=g;g=H[m+12>>2];H[u+8>>2]=H[m+8>>2];H[u+12>>2]=g;g=H[m+4>>2];H[u>>2]=H[m>>2];H[u+4>>2]=g;b=b+2|0;v=v+2|0;if((Q|0)!=(v|0)){continue}break};break;case 0:break Ma;case 1:break Na}}if(!C){break Ma}m=ya+(b<<6)|0;g=(N(b,x)<<2)+k|0;b=H[g+4>>2];H[m>>2]=H[g>>2];H[m+4>>2]=b;b=H[g+28>>2];H[m+24>>2]=H[g+24>>2];H[m+28>>2]=b;b=H[g+20>>2];H[m+16>>2]=H[g+16>>2];H[m+20>>2]=b;b=H[g+12>>2];H[m+8>>2]=H[g+8>>2];H[m+12>>2]=b}Oa:{if((l|0)==(o|0)){break Oa}u=k+w|0;b=0;m=0;if(!s){while(1){da=u+(N(b,x)<<2)|0;g=H[da+4>>2];v=ja+(b<<6)|0;H[v>>2]=H[da>>2];H[v+4>>2]=g;g=H[da+28>>2];H[v+24>>2]=H[da+24>>2];H[v+28>>2]=g;g=H[da+20>>2];H[v+16>>2]=H[da+16>>2];H[v+20>>2]=g;g=H[da+12>>2];H[v+8>>2]=H[da+8>>2];H[v+12>>2]=g;g=b|1;da=ja+(g<<6)|0;v=u+(N(g,x)<<2)|0;g=H[v+28>>2];H[da+24>>2]=H[v+24>>2];H[da+28>>2]=g;g=H[v+20>>2];H[da+16>>2]=H[v+16>>2];H[da+20>>2]=g;g=H[v+12>>2];H[da+8>>2]=H[v+8>>2];H[da+12>>2]=g;g=H[v+4>>2];H[da>>2]=H[v>>2];H[da+4>>2]=g;b=b+2|0;m=m+2|0;if((z|0)!=(m|0)){continue}break}}if(!A){break Oa}m=ja+(b<<6)|0;g=u+(N(b,x)<<2)|0;b=H[g+4>>2];H[m>>2]=H[g>>2];H[m+4>>2]=b;b=H[g+28>>2];H[m+24>>2]=H[g+24>>2];H[m+28>>2]=b;b=H[g+20>>2];H[m+16>>2]=H[g+16>>2];H[m+20>>2]=b;b=H[g+12>>2];H[m+8>>2]=H[g+8>>2];H[m+12>>2]=b}Wa(aa);Pa:{if(!o){break Pa}b=0;v=0;if((q|0)!=(ka|0)){while(1){u=ea+(b<<5)|0;g=H[u+4>>2];m=(N(b,x)<<2)+k|0;H[m>>2]=H[u>>2];H[m+4>>2]=g;g=H[u+28>>2];H[m+24>>2]=H[u+24>>2];H[m+28>>2]=g;g=H[u+20>>2];H[m+16>>2]=H[u+16>>2];H[m+20>>2]=g;g=H[u+12>>2];H[m+8>>2]=H[u+8>>2];H[m+12>>2]=g;g=b|1;u=(N(g,x)<<2)+k|0;m=ea+(g<<5)|0;g=H[m+28>>2];H[u+24>>2]=H[m+24>>2];H[u+28>>2]=g;g=H[m+20>>2];H[u+16>>2]=H[m+16>>2];H[u+20>>2]=g;g=H[m+12>>2];H[u+8>>2]=H[m+8>>2];H[u+12>>2]=g;g=H[m+4>>2];H[u>>2]=H[m>>2];H[u+4>>2]=g;b=b+2|0;v=v+2|0;if((ca|0)!=(v|0)){continue}break}}if(!Z){break Pa}m=(N(b,x)<<2)+k|0;g=ea+(b<<5)|0;b=H[g+4>>2];H[m>>2]=H[g>>2];H[m+4>>2]=b;b=H[g+28>>2];H[m+24>>2]=H[g+24>>2];H[m+28>>2]=b;b=H[g+20>>2];H[m+16>>2]=H[g+16>>2];H[m+20>>2]=b;b=H[g+12>>2];H[m+8>>2]=H[g+8>>2];H[m+12>>2]=b}k=k+32|0;i=i-8|0;if(i>>>0>7){continue}break}break La}b=j>>>3|0;q=b>>>0>>0?b:ba;m=q>>>0<=1?1:q;s=(j>>>0)/(q>>>0)&-8;i=j&-8;g=0;k=h;while(1){w=Ga(48);if(!w){break Ha}b=Ja(V);H[w>>2]=b;if(!b){g=0;Ua(S);Da(w);Da(ea);break Ga}H[w+40>>2]=k;H[w+36>>2]=x;H[w+32>>2]=o;H[w+28>>2]=Y;H[w+24>>2]=0;H[w+20>>2]=l;H[w+16>>2]=0;H[w+12>>2]=va;H[w+8>>2]=l;H[w+4>>2]=Y;b=i-N(g,s)|0;g=g+1|0;b=(q|0)==(g|0)?b:s;H[w+44>>2]=b;ib(S,13,w);k=(b<<2)+k|0;if((g|0)!=(m|0)){continue}break}Ua(S)}w=j&7;Qa:{if(!w){break Qa}s=va<<5;Ra:{if(!l){break Ra}q=s+ea|0;C=w<<2;b=0;if((l|0)!=1){m=l&-2;i=0;while(1){g=!C;if(!g){B(q+(b<<6)|0,(N(b,x)<<2)+k|0,C)}if(!g){g=b|1;B(q+(g<<6)|0,(N(g,x)<<2)+k|0,C)}b=b+2|0;i=i+2|0;if((m|0)!=(i|0)){continue}break}}if(!(l&1)|!C){break Ra}B(q+(b<<6)|0,(N(b,x)<<2)+k|0,C)}Sa:{if((l|0)==(o|0)){break Sa}q=_-s|0;s=(N(l,x)<<2)+k|0;C=w<<2;b=0;if((ka|0)!=(pa+(l^-1)|0)){m=Y&-2;i=0;while(1){g=!C;if(!g){B(q+(b<<6)|0,s+(N(b,x)<<2)|0,C)}if(!g){g=b|1;B(q+(g<<6)|0,s+(N(g,x)<<2)|0,C)}b=b+2|0;i=i+2|0;if((m|0)!=(i|0)){continue}break}}if(!(Y&1)|!C){break Sa}B(q+(b<<6)|0,s+(N(b,x)<<2)|0,C)}Wa(aa);if(!o){break Qa}l=w<<2;b=0;if((pa|0)!=(ka+1|0)){m=o&-2;i=0;while(1){g=!l;if(!g){B((N(b,x)<<2)+k|0,ea+(b<<5)|0,l)}if(!g){g=b|1;B((N(g,x)<<2)+k|0,ea+(g<<5)|0,l)}b=b+2|0;i=i+2|0;if((m|0)!=(i|0)){continue}break}}if(!(o&1)|!l){break Qa}B((N(b,x)<<2)+k|0,ea+(b<<5)|0,l)}n=n+152|0;X=X-1|0;if(X){continue}break}g=1;Da(ea);break Ga}g=1;h=H[p+28>>2];x=h+N(m,152)|0;va=x-152|0;if(H[va>>2]==H[x-144>>2]){break Ga}ja=x-148|0;if(H[ja>>2]==H[x-140>>2]){break Ga}w=H[h+4>>2];q=H[h+12>>2];s=H[h>>2];l=H[h+8>>2];z=H[p+68>>2];A=H[p+64>>2];Q=H[p+60>>2];C=H[p+56>>2];la=kc(p,m);if(!la){g=0;break Ga}if((m|0)==1){i=H[x-16>>2];j=H[va>>2];h=H[ja>>2];b=H[x-8>>2];Ra(la,i-j|0,H[x-12>>2]-h|0,b-j|0,H[x-4>>2]-h|0,H[p+52>>2],1,b-i|0);Xa(la);break Ga}b=m-1|0;n=b&1;Ta:{if((m|0)==2){g=0;b=h;break Ta}k=b&-2;g=0;b=h;while(1){j=H[b+160>>2]-H[b+152>>2]|0;i=g>>>0>j>>>0?g:j;j=H[b+164>>2]-H[b+156>>2]|0;i=i>>>0>j>>>0?i:j;j=H[b+312>>2]-H[b+304>>2]|0;i=i>>>0>j>>>0?i:j;j=H[b+316>>2]-H[b+308>>2]|0;g=i>>>0>j>>>0?i:j;b=b+304|0;o=o+2|0;if((k|0)!=(o|0)){continue}break}}if(n){j=H[b+160>>2]-H[b+152>>2]|0;j=g>>>0>j>>>0?g:j;b=H[b+164>>2]-H[b+156>>2]|0;g=b>>>0>>0?j:b}Ua:{if(g>>>0>=134217728){break Ua}ea=Ja(g<<5);H[aa+32>>2]=ea;if(!ea){break Ua}H[aa>>2]=ea;Va:{if(m){n=q-w|0;b=l-s|0;ya=ea+32|0;s=m;v=H[p+20>>2];S=1;da=0;while(1){H[aa+8>>2]=n;H[aa+40>>2]=b;g=H[h+164>>2];i=H[h+160>>2];k=H[h+156>>2];j=H[h+152>>2];na=(j|0)%2|0;H[aa+44>>2]=na;u=(k|0)%2|0;H[aa+12>>2]=u;w=i-j|0;ia=w-b|0;H[aa+36>>2]=ia;Z=g-k|0;D=Z-n|0;H[aa+4>>2]=D;m=C;o=m;k=Q;i=k;g=A;X=g;j=z;_=j;Wa:{if(!da&(v|0)==(S|0)){break Wa}M=v-S|0;i=0;o=0;if(m){g=M&31;if((M&63)>>>0>=32){l=-1<>>32-g}j=m+(j^-1)|0;g=l^-1;g=j>>>0>>0?g+1|0:g;k=M&31;if((M&63)>>>0>=32){o=g>>>k|0}else{o=((1<>>k}}if(Q){i=M&31;if((M&63)>>>0>=32){l=-1<>>32-i}j=Q+(j^-1)|0;i=l^-1;i=j>>>0>>0?i+1|0:i;g=M&31;if((M&63)>>>0>=32){i=i>>>g|0}else{i=((1<>>g}}j=0;g=0;if(A){k=M&31;if((M&63)>>>0>=32){l=-1<>>32-k}g=A+(g^-1)|0;k=l^-1;k=g>>>0>>0?k+1|0:k;m=M&31;if((M&63)>>>0>=32){g=k>>>m|0}else{g=((1<>>m}}if(z){k=M&31;if((M&63)>>>0>=32){l=-1<>>32-k}j=z+(j^-1)|0;k=l^-1;k=j>>>0>>0?k+1|0:k;m=M&31;if((M&63)>>>0>=32){j=k>>>m|0}else{j=((1<>>m}}X=0;m=0;W=1<>>0>>0){m=M&31;if((M&63)>>>0>=32){l=-1<>>32-m}q=k^-1;k=q+(C-W|0)|0;m=l^-1;m=k>>>0>>0?m+1|0:m;l=M&31;if((M&63)>>>0>=32){m=m>>>l|0}else{m=((1<>>l}}if(A>>>0>W>>>0){l=M&31;if((M&63)>>>0>=32){l=-1<>>32-l}q=k^-1;k=q+(A-W|0)|0;l=l^-1;l=k>>>0>>0?l+1|0:l;q=M&31;if((M&63)>>>0>=32){X=l>>>q|0}else{X=((1<>>q}}_=0;k=0;if(Q>>>0>W>>>0){l=M&31;if((M&63)>>>0>=32){l=-1<>>32-l}q=k^-1;k=q+(Q-W|0)|0;l=l^-1;l=k>>>0>>0?l+1|0:l;q=M&31;if((M&63)>>>0>=32){k=l>>>q|0}else{k=((1<>>q}}if(z>>>0<=W>>>0){break Wa}l=M&31;if((M&63)>>>0>=32){l=-1<>>32-l}ca=q^-1;q=ca+(z-W|0)|0;l=l^-1;ca=q>>>0>>0?l+1|0:l;l=q;q=M&31;if((M&63)>>>0>=32){_=ca>>>q|0}else{_=((1<>>q}}ca=H[h+180>>2];l=X-ca|0;q=l>>>0<=X>>>0?l:0;l=q+4|0;l=l>>>0>>0?-1:l;ba=l>>>0>>0?l:ia;q=H[h+216>>2];l=g-q|0;l=g>>>0>=l>>>0?l:0;g=l+4|0;g=g>>>0>>0?-1:g;sa=b>>>0>g>>>0?g:b;l=(na?ba:sa)<<1;g=(na?sa:ba)<<1|1;fa=g>>>0>>0?l:g;M=fa>>>0>>0;g=m-ca|0;m=g>>>0<=m>>>0?g:0;g=m-4|0;V=g>>>0<=m>>>0?g:0;g=o-q|0;o=g>>>0<=o>>>0?g:0;g=o-4|0;ka=g>>>0<=o>>>0?g:0;W=(na?V:ka)<<1;ia=(na?ka:V)<<1|1;ca=W>>>0>>0;X=H[h+184>>2];g=i-X|0;g=g>>>0<=i>>>0?g:0;i=g-4|0;l=g>>>0>=i>>>0?i:0;m=l;q=H[h+220>>2];i=k-q|0;g=i>>>0<=k>>>0?i:0;i=g-4|0;k=g>>>0>=i>>>0?i:0;o=k;i=j-X|0;i=i>>>0<=j>>>0?i:0;j=i+4|0;j=i>>>0>j>>>0?-1:j;pa=j>>>0>>0?j:n;j=pa;i=_-q|0;g=i>>>0<=_>>>0?i:0;i=g+4|0;i=g>>>0>i>>>0?-1:i;g=i>>>0>>0?i:D;X=g;if(u){X=j;m=k;o=l;j=g}Y=M?fa:w;_=ca?W:ia;H[aa+60>>2]=ba;H[aa+56>>2]=V;H[aa+52>>2]=sa;H[aa+48>>2]=ka;Xa:{if(Z>>>0<8){b=7;i=0;break Xa}i=na<<5;ma=(ya-i|0)+(V<<6)|0;na=(i+ea|0)+(ka<<6)|0;D=b+ba|0;fa=b+V|0;M=g+n|0;W=k+n|0;ia=ea+(_<<5)|0;i=0;while(1){b=i|7;Ya:{if(!(i>>>0>>0&b>>>0>=l>>>0|i>>>0>>0&b>>>0>=W>>>0)){i=i+8|0;break Ya}b=Z-i|0;ca=b>>>0>=8?8:b;b=0;while(1){V=b+i|0;ba=V+1|0;q=b<<2;Ra(la,ka,V,sa,ba,q+na|0,16,0);Ra(la,fa,V,D,ba,q+ma|0,16,0);b=b+1|0;if((ca|0)!=(b|0)){continue}break}Wa(aa+32|0);b=i;i=i+8|0;if(!ab(la,_,b,Y,i,ia,8,1)){break Va}}b=i|7;if(Z>>>0>b>>>0){continue}break}}if(!(!(i>>>0>>0&b>>>0>=l>>>0)&(g+n>>>0<=i>>>0|k+n>>>0>b>>>0)|i>>>0>=Z>>>0)){fa=aa+32|0;D=0;ia=Z-i|0;if(ia){while(1){M=i+D|0;W=M+1|0;b=H[fa+16>>2];ca=D<<2;Ra(la,b,M,H[fa+20>>2],W,ca+((H[fa>>2]+(H[fa+12>>2]<<5)|0)+(b<<6)|0)|0,16,0);q=H[fa+24>>2];b=H[fa+8>>2];Ra(la,q+b|0,M,b+H[fa+28>>2]|0,W,(ca+((H[fa>>2]-(H[fa+12>>2]<<5)|0)+(q<<6)|0)|0)+32|0,16,0);D=D+1|0;if((ia|0)!=(D|0)){continue}break}}Wa(fa);if(!ab(la,_,i,Y,Z,ea+(_<<5)|0,8,1)){break Va}}H[aa+28>>2]=g;H[aa+24>>2]=k;H[aa+20>>2]=pa;H[aa+16>>2]=l;if(Y>>>0>_>>>0){j=j<<1;b=X<<1|1;b=b>>>0>>0?j:b;ia=b>>>0>>0?b:Z;b=u<<5;ca=(ya-b|0)+(k<<6)|0;X=(b+ea|0)+(l<<6)|0;q=g+n|0;g=k+n|0;j=m<<1;b=o<<1|1;i=b>>>0>j>>>0?j:b;j=ea+(i<<5)|0;while(1){b=Y-_|0;b=(b>>>0>=8?8:b)+_|0;Ra(la,_,l,b,pa,X,1,16);Ra(la,_,g,b,q,ca,1,16);Wa(aa);if(!ab(la,_,i,b,ia,j,1,8)){break Va}_=_+8|0;if(Y>>>0>_>>>0){continue}break}}h=h+152|0;b=w;n=Z;S=S+1|0;da=S?da:da+1|0;if(da|(s|0)!=(S|0)){continue}break}}g=1;i=H[x-16>>2];j=H[va>>2];h=H[ja>>2];b=H[x-8>>2];Ra(la,i-j|0,H[x-12>>2]-h|0,b-j|0,H[x-4>>2]-h|0,H[p+52>>2],1,b-i|0);Xa(la);Da(ea);break Ga}Xa(la);Da(ea);g=0;break Ga}Xa(la);g=0;break Ga}g=0;Ua(S);Da(ea)}oa=aa- -64|0;if(g){break V}break b}E=E+1080|0;t=t+52|0;p=p+76|0;r=r+1|0;if(r>>>0>2]){continue}break}E=H[R+32>>2];qa=H[H[R+20>>2]>>2]}i=H[E+16>>2];Za:{if(H[R+68>>2]|!i){break Za}t=H[qa+20>>2];k=H[t+28>>2];_a:{$a:{g=H[R+64>>2];if(g){r=H[qa+16>>2];if(r>>>0<3){break _a}j=H[t+24>>2];if(!((j|0)==H[t+100>>2]&(j|0)==H[t+176>>2])){Ca(f,1,10089,0);break b}h=H[H[R+24>>2]+24>>2];b=H[h+36>>2];ab:{if((b|0)!=H[h+88>>2]|(b|0)!=H[h+140>>2]){break ab}h=N(j,152);b=h+k|0;b=N(H[b-140>>2]-H[b-148>>2]|0,H[b-144>>2]-H[b-152>>2]|0);j=h+H[t+104>>2]|0;if((b|0)!=(N(H[j-140>>2]-H[j-148>>2]|0,H[j-144>>2]-H[j-152>>2]|0)|0)){break ab}h=h+H[t+180>>2]|0;if((N(H[h-140>>2]-H[h-148>>2]|0,H[h-144>>2]-H[h-152>>2]|0)|0)==(b|0)){break $a}}Ca(f,1,10089,0);break b}r=H[qa+16>>2];if(r>>>0<3){break _a}b=H[H[R+24>>2]+24>>2];h=H[b+36>>2];bb:{if((h|0)!=H[b+88>>2]){break bb}j=H[b+140>>2];if((j|0)!=(h|0)){break bb}h=N(h,152);b=k+h|0;b=N(H[b+148>>2]-H[b+140>>2]|0,H[b+144>>2]-H[b+136>>2]|0);h=h+H[t+104>>2]|0;if((b|0)!=(N(H[h+148>>2]-H[h+140>>2]|0,H[h+144>>2]-H[h+136>>2]|0)|0)){break bb}h=H[t+180>>2]+N(j,152)|0;if((N(H[h+148>>2]-H[h+140>>2]|0,H[h+144>>2]-H[h+136>>2]|0)|0)==(b|0)){break $a}}Ca(f,1,10089,0);break b}if((i|0)==2){if(!H[E+5608>>2]){break Za}z=Ga(r<<2);if(!z){break b}A=H[qa+16>>2];cb:{if(!A){break cb}db:{eb:{if(H[R+64>>2]){o=A&3;h=0;if(A>>>0>=4){break eb}p=0;break db}o=A&3;h=0;fb:{if(A>>>0<4){p=0;break fb}k=z+12|0;r=z+8|0;i=z+4|0;j=A&-4;p=0;g=0;while(1){n=p<<2;H[n+z>>2]=H[t+52>>2];H[i+n>>2]=H[t+128>>2];H[n+r>>2]=H[t+204>>2];H[k+n>>2]=H[t+280>>2];p=p+4|0;t=t+304|0;g=g+4|0;if((j|0)!=(g|0)){continue}break}}if(!o){break cb}while(1){H[z+(p<<2)>>2]=H[t+52>>2];p=p+1|0;t=t+76|0;h=h+1|0;if((o|0)!=(h|0)){continue}break}break cb}k=z+12|0;r=z+8|0;i=z+4|0;j=A&-4;p=0;g=0;while(1){n=p<<2;H[n+z>>2]=H[t+36>>2];H[i+n>>2]=H[t+112>>2];H[n+r>>2]=H[t+188>>2];H[k+n>>2]=H[t+264>>2];p=p+4|0;t=t+304|0;g=g+4|0;if((j|0)!=(g|0)){continue}break}}if(!o){break cb}while(1){H[z+(p<<2)>>2]=H[t+36>>2];p=p+1|0;t=t+76|0;h=h+1|0;if((o|0)!=(h|0)){continue}break}}h=H[E+5608>>2];n=0;Q=Ga(A<<3);j=0;gb:{if(!Q){break gb}if(!(!b|!A)){m=Q+(A<<2)|0;o=Q+12|0;r=Q+8|0;i=Q+4|0;t=A&-4;w=A&3;l=A-1|0;while(1){p=0;k=0;if(l>>>0>=3){while(1){g=p<<2;L[g+Q>>2]=L[H[g+z>>2]>>2];j=g|4;L[j+Q>>2]=L[H[j+z>>2]>>2];j=g|8;L[j+Q>>2]=L[H[j+z>>2]>>2];j=g|12;L[j+Q>>2]=L[H[j+z>>2]>>2];p=p+4|0;k=k+4|0;if((t|0)!=(k|0)){continue}break}}s=0;if(w){while(1){j=p<<2;L[j+Q>>2]=L[H[j+z>>2]>>2];p=p+1|0;s=s+1|0;if((w|0)!=(s|0)){continue}break}}g=0;p=h;while(1){j=g<<2;C=j+m|0;H[C>>2]=0;ha=O(0);s=0;k=0;if(l>>>0>2){while(1){q=s<<2;ha=O(O(L[p>>2]*L[q+Q>>2])+ha);L[C>>2]=ha;ha=O(O(L[p+4>>2]*L[i+q>>2])+ha);L[C>>2]=ha;ha=O(O(L[p+8>>2]*L[q+r>>2])+ha);L[C>>2]=ha;ha=O(O(L[p+12>>2]*L[o+q>>2])+ha);L[C>>2]=ha;s=s+4|0;p=p+16|0;k=k+4|0;if((t|0)!=(k|0)){continue}break}}k=0;if(w){while(1){ha=O(O(L[p>>2]*L[Q+(s<<2)>>2])+ha);L[C>>2]=ha;s=s+1|0;p=p+4|0;k=k+1|0;if((w|0)!=(k|0)){continue}break}}j=j+z|0;k=H[j>>2];H[j>>2]=k+4;L[k>>2]=ha;g=g+1|0;if((A|0)!=(g|0)){continue}break}n=n+1|0;if((n|0)!=(b|0)){continue}break}}Da(Q);j=1}b=j;Da(z);if(b){break Za}break b}if(H[H[E+5584>>2]+20>>2]==1){if(g){oc(H[t+36>>2],H[t+112>>2],H[t+188>>2],b);break Za}oc(H[t+52>>2],H[t+128>>2],H[t+204>>2],b);break Za}if(g){nc(H[t+36>>2],H[t+112>>2],H[t+188>>2],b);break Za}nc(H[t+52>>2],H[t+128>>2],H[t+204>>2],b);break Za}H[Ha>>2]=r;Ca(f,1,10150,Ha)}w=H[H[R+20>>2]>>2];if(!H[w+16>>2]){$=1;break b}q=H[R+68>>2];n=H[w+20>>2];b=H[H[R+32>>2]+5584>>2];o=H[H[R+24>>2]+24>>2];j=0;while(1){hb:{if(H[q+(j<<2)>>2]?0:q){break hb}h=H[n+28>>2];i=h+N(H[o+36>>2],152)|0;ib:{if(!H[R+64>>2]){g=H[i+148>>2]-H[i+140>>2]|0;qa=H[i+144>>2]-H[i+136>>2]|0;k=0;r=52;break ib}h=h+N(H[n+24>>2],152)|0;qa=H[i+8>>2]-H[i>>2]|0;k=H[h-144>>2]-(qa+H[h-152>>2]|0)|0;g=H[i+12>>2]-H[i+4>>2]|0;r=36}h=H[o+24>>2];jb:{if(H[o+32>>2]){h=1<>2];if(H[b+20>>2]==1){l=qa&-2;m=qa&1;t=0;h=k<<2;while(1){r=0;if((qa|0)!=1){while(1){k=H[b+1076>>2]+H[$>>2]|0;H[$>>2]=(i|0)>(k|0)?i:(k|0)<(p|0)?k:p;k=H[b+1076>>2]+H[$+4>>2]|0;H[$+4>>2]=(i|0)>(k|0)?i:(k|0)<(p|0)?k:p;$=$+8|0;r=r+2|0;if((l|0)!=(r|0)){continue}break}}if(m){r=H[b+1076>>2]+H[$>>2]|0;H[$>>2]=(i|0)>(r|0)?i:(p|0)>(r|0)?r:p;$=$+4|0}$=$+h|0;t=t+1|0;if((t|0)!=(g|0)){continue}break}break hb}t=i>>31;h=0;while(1){r=0;while(1){ha=L[$>>2];m=p;kb:{if(ha>O(2147483648)){break kb}m=i;if(ha>2];l=m;m=l>>31;eb=O(T(ha));sb=O(ha-eb);if(sbO(.5)){break lb}ha=O(eb*O(.5));fb=O(ha-O(T(ha)))==O(0)?eb:fb}ha=fb}if(O(P(ha))>31)|0;C=m+1|0;v=m;m=l+s|0;l=s>>>0>m>>>0?C:v;m=(l|0)<=(t|0)&i>>>0>m>>>0|(l|0)<(t|0)?i:m>>>0

>>0&(l|0)<=0|(l|0)<0?m:p}H[$>>2]=m;$=$+4|0;r=r+1|0;if((qa|0)!=(r|0)){continue}break}$=(k<<2)+$|0;h=h+1|0;if((g|0)!=(h|0)){continue}break}}n=n+76|0;b=b+1080|0;o=o+52|0;$=1;j=j+1|0;if(j>>>0>2]){continue}break}break b}$=0;Ca(f,1,3372,0)}oa=Ha+16|0;if(!$){mb(Ya);H[a+8>>2]=H[a+8>>2]|32768;Ca(f,1,11451,0);break a}mb:{if(!c){break mb}b=0;m=H[a+232>>2];h=bc(m,1);if(!((h|0)==-1|d>>>0>>0)){nb:{b=1;d=H[m+24>>2];if(!H[d+16>>2]){break nb}i=H[d+24>>2];k=H[H[H[m+20>>2]>>2]+20>>2];while(1){b=H[i+24>>2];g=b&7;j=b>>>3|0;b=H[k+28>>2];o=b+N(H[i+36>>2],152)|0;ob:{if(H[m+64>>2]){b=b+N(H[k+24>>2],152)|0;d=H[o+8>>2]-H[o>>2]|0;r=H[b-144>>2]-(d+H[b-152>>2]|0)|0;h=H[o+12>>2]-H[o+4>>2]|0;b=36;break ob}h=H[o+148>>2]-H[o+140>>2]|0;d=H[o+144>>2]-H[o+136>>2]|0;r=0;b=52}b=H[b+k>>2];pb:{qb:{rb:{sb:{j=j+((g|0)!=0)|0;switch(((j|0)==3?4:j)-1|0){case 0:break rb;case 1:break qb;case 3:break sb;default:break pb}}if(!h){break pb}l=d<<2;if((h|0)!=1){o=h&-2;j=0;while(1){g=!l;if(!g){B(c,b,l)}d=r<<2;n=d+(b+l|0)|0;b=c+l|0;if(!g){B(b,n,l)}c=b+l|0;b=d+(l+n|0)|0;j=j+2|0;if((o|0)!=(j|0)){continue}break}}if(!(h&1)){break pb}if(l){B(c,b,l)}c=c+l|0;break pb}j=!h|!d;if(H[i+32>>2]){if(j){break pb}o=d&-8;n=d&7;j=0;g=d-1>>>0<7;while(1){d=0;if(!g){while(1){F[c|0]=H[b>>2];F[c+1|0]=H[b+4>>2];F[c+2|0]=H[b+8>>2];F[c+3|0]=H[b+12>>2];F[c+4|0]=H[b+16>>2];F[c+5|0]=H[b+20>>2];F[c+6|0]=H[b+24>>2];F[c+7|0]=H[b+28>>2];c=c+8|0;b=b+32|0;d=d+8|0;if((o|0)!=(d|0)){continue}break}}d=0;if(n){while(1){F[c|0]=H[b>>2];c=c+1|0;b=b+4|0;d=d+1|0;if((n|0)!=(d|0)){continue}break}}b=(r<<2)+b|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}break pb}if(j){break pb}o=d&-8;n=d&7;j=0;g=d-1>>>0<7;r=r<<2;while(1){d=0;if(!g){while(1){F[c|0]=H[b>>2];F[c+1|0]=H[b+4>>2];F[c+2|0]=H[b+8>>2];F[c+3|0]=H[b+12>>2];F[c+4|0]=H[b+16>>2];F[c+5|0]=H[b+20>>2];F[c+6|0]=H[b+24>>2];F[c+7|0]=H[b+28>>2];c=c+8|0;b=b+32|0;d=d+8|0;if((o|0)!=(d|0)){continue}break}}d=0;if(n){while(1){F[c|0]=H[b>>2];c=c+1|0;b=b+4|0;d=d+1|0;if((n|0)!=(d|0)){continue}break}}b=b+r|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}break pb}j=!h|!d;if(H[i+32>>2]){if(j){break pb}o=d&-8;n=d&7;j=0;g=d-1>>>0<7;while(1){d=0;if(!g){while(1){G[c>>1]=H[b>>2];G[c+2>>1]=H[b+4>>2];G[c+4>>1]=H[b+8>>2];G[c+6>>1]=H[b+12>>2];G[c+8>>1]=H[b+16>>2];G[c+10>>1]=H[b+20>>2];G[c+12>>1]=H[b+24>>2];G[c+14>>1]=H[b+28>>2];c=c+16|0;b=b+32|0;d=d+8|0;if((o|0)!=(d|0)){continue}break}}d=0;if(n){while(1){G[c>>1]=H[b>>2];c=c+2|0;b=b+4|0;d=d+1|0;if((n|0)!=(d|0)){continue}break}}b=(r<<2)+b|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}break pb}if(j){break pb}o=d&-8;n=d&7;j=0;g=d-1>>>0<7;while(1){d=0;if(!g){while(1){G[c>>1]=H[b>>2];G[c+2>>1]=H[b+4>>2];G[c+4>>1]=H[b+8>>2];G[c+6>>1]=H[b+12>>2];G[c+8>>1]=H[b+16>>2];G[c+10>>1]=H[b+20>>2];G[c+12>>1]=H[b+24>>2];G[c+14>>1]=H[b+28>>2];c=c+16|0;b=b+32|0;d=d+8|0;if((o|0)!=(d|0)){continue}break}}d=0;if(n){while(1){G[c>>1]=H[b>>2];c=c+2|0;b=b+4|0;d=d+1|0;if((n|0)!=(d|0)){continue}break}}b=(r<<2)+b|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}}k=k+76|0;i=i+52|0;b=1;tb=tb+1|0;if(tb>>>0>2]+16>>2]){continue}break}}}if(!b){break a}b=H[Ya+5596>>2];if(!b){break mb}Da(b);H[Ya+5596>>2]=0;H[Ya+5600>>2]=0}F[a+92|0]=I[a+92|0]&254;H[a+8>>2]=H[a+8>>2]&-129;gb=1;c=Sa(e);b=H[a+8>>2];if(!(c|ra)&(b|0)==64|(b|0)==256){break a}if((Ka(e,Za+10|0,2,f)|0)!=2){Ca(f,H[a+208>>2]?1:2,2472,0);gb=!H[a+208>>2];break a}Ea(Za+10|0,Za+12|0,2);b=H[Za+12>>2];if((b|0)==65424){break a}if((b|0)==65497){H[a+8>>2]=256;H[a+228>>2]=0;break a}if(!(Sa(e)|ra)){H[a+8>>2]=64;Ca(f,2,8419,0);break a}gb=0;Ca(f,1,8306,0)}oa=Za+16|0;return gb|0}function Za(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,x=0,z=0,A=0,C=0,D=0,E=0,J=0,M=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=O(0),Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,pa=0,qa=0,ta=0,ua=0,va=0,wa=0,xa=O(0);s=oa-80|0;oa=s;H[s+40>>2]=65424;z=N(H[a+132>>2],H[a+128>>2]);a:{b:{c:{l=H[a+8>>2];d:{if((l|0)!=8){j=0;if((l|0)!=256){break a}H[s+40>>2]=65497;break d}if(F[a+92|0]&1){break d}C=z&-2;E=z&1;R=s+77|0;S=s+76|0;T=s+72|0;n=65424;e:{f:{while(1){g:{h:{i:{j:{k:{l:{m:{n:{l=H[a+84>>2];if(!l){break n}p=l;l=H[a+80>>2];if(p>>>0<=l>>>0){break n}o=H[a+88>>2]+(l<<3)|0;n=H[o>>2];o=H[o+4>>2];H[a+80>>2]=l+1;if(!fb(j,n,o,k)){Ca(k,1,5440,0);j=0;break a}if((Ka(j,H[a+16>>2],2,k)|0)!=2){Ca(k,1,2472,0);j=0;break a}Ea(H[a+16>>2],s+40|0,2);if(H[s+40>>2]==65424){break m}Ca(k,1,4073,0);j=0;break a}if((n|0)==65427){break l}}while(1){if(!(Sa(j)|ra)){H[a+8>>2]=64;break l}if((Ka(j,H[a+16>>2],2,k)|0)!=2){Ca(k,1,2472,0);j=0;break a}Ea(H[a+16>>2],s+36|0,2);if(K[s+36>>2]<=1){Ca(k,1,6048,0);j=0;break a}o:{if(H[s+40>>2]!=32896){break o}if(Sa(j)|ra){break o}H[a+8>>2]=64;break l}r=H[a+8>>2];p:{if(!(r&16)){n=H[s+36>>2];break p}n=H[s+36>>2];l=H[a+24>>2];if(!l){break p}o=n+2|0;if(o>>>0>l>>>0){Ca(k,1,8370,0);j=0;break a}H[a+24>>2]=l-o}o=n-2|0;H[s+36>>2]=o;l=24912;t=H[s+40>>2];while(1){n=l;m=H[l>>2];if(m){l=l+12|0;if((m|0)!=(t|0)){continue}}break}if(!(r&H[n+4>>2])){Ca(k,1,5397,0);j=0;break a}q:{if(K[a+20>>2]>=o>>>0){l=H[a+16>>2];break q}l=Sa(j);r=ra;if((r|0)<0){l=1}else{l=l>>>0>>0&(r|0)<=0}if(l){Ca(k,1,5797,0);j=0;break a}l=Ia(H[a+16>>2],H[s+36>>2]);if(!l){Da(H[a+16>>2]);H[a+16>>2]=0;H[a+20>>2]=0;Ca(k,1,4973,0);j=0;break a}H[a+16>>2]=l;o=H[s+36>>2];H[a+20>>2]=o}l=Ka(j,l,o,k);if((l|0)!=H[s+36>>2]){Ca(k,1,2472,0);j=0;break a}o=H[n+8>>2];if(!o){Ca(k,1,11725,0);j=0;break a}if(!(sa[o|0](a,H[a+16>>2],l,k)|0)){H[s+32>>2]=H[s+40>>2];Ca(k,1,13959,s+32|0);j=0;break a}n=H[j+56>>2];t=H[s+36>>2];A=H[a+224>>2];o=H[A+40>>2];p=H[a+228>>2];x=N(p,40);l=o+x|0;M=H[l+20>>2];r=M+1|0;q=H[l+28>>2];if(r>>>0>q>>>0){X=O(O(q>>>0)+O(100));if(X=O(0)){o=~~X>>>0}else{o=0}H[l+28>>2]=o;r=Ia(H[l+24>>2],N(o,24));o=H[A+40>>2];l=x+o|0;if(!r){break k}H[l+24>>2]=r;M=H[l+20>>2];r=M+1|0}o=o+x|0;l=H[o+24>>2]+N(M,24)|0;H[l+16>>2]=t+4;n=(n-t|0)-4|0;H[l+8>>2]=n;H[l+12>>2]=n>>31;G[l>>1]=m;H[o+20>>2]=r;r:{if((m|0)!=65424){break r}l=H[o+16>>2];s:{if(!l){break s}p=H[o+4>>2];o=H[o+12>>2];if(p>>>0<=o>>>0){break s}l=l+N(o,24)|0;H[l>>2]=n;H[l+4>>2]=0}l=(H[j+56>>2]-H[s+36>>2]|0)-4|0;o=H[a+48>>2];n=H[a+52>>2];if((n|0)>0){p=1}else{p=l>>>0<=o>>>0&(n|0)>=0}if(p){break r}H[a+48>>2]=l;H[a+52>>2]=0}if(I[a+92|0]&4){if((ub(j,H[a+24>>2],k)|0)!=H[a+24>>2]|ra){Ca(k,1,2472,0);j=0;break a}H[s+40>>2]=65427;break l}if((Ka(j,H[a+16>>2],2,k)|0)!=2){Ca(k,1,2472,0);j=0;break a}Ea(H[a+16>>2],s+40|0,2);if(H[s+40>>2]!=65427){continue}break}}if(!(!(Sa(j)|ra)&H[a+8>>2]==64)){l=I[a+92|0];if(!(l&4)){l=N(H[a+228>>2],5644);o=H[a+180>>2];t:{u:{if(H[a+56>>2]){m=Sa(j);break u}m=H[a+24>>2];if(m>>>0<2){break t}}m=m-2|0;H[a+24>>2]=m}A=l+o|0;if(!m){break j}l=Sa(j);o=ra;if((o|0)<0){l=1}else{l=l>>>0>>0&(o|0)<=0}if(l){if(H[a+208>>2]){Ca(k,1,5842,0);j=0;break a}Ca(k,2,5842,0)}l=H[a+24>>2];if(l>>>0>=4294967294){Ca(k,1,1480,0);j=0;break a}o=H[A+5596>>2];v:{if(o){n=H[A+5600>>2];if(n>>>0>-3-l>>>0){Ca(k,1,1211,0);j=0;break a}l=Ia(o,(l+n|0)+2|0);if(l){H[A+5596>>2]=l;break j}Da(H[A+5596>>2]);H[A+5596>>2]=0;break v}l=Ga(l+2|0);H[A+5596>>2]=l;if(l){break j}}Ca(k,1,6176,0);j=0;break a}H[a+8>>2]=8;F[a+92|0]=l&250;break i}n=H[s+40>>2];break g}Da(H[l+24>>2]);a=H[A+40>>2]+N(p,40)|0;H[a+28>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;Ca(k,1,3863,0);j=0;break a}x=H[j+56>>2];n=x-2|0;t=H[j+60>>2];r=t-(x>>>0<2)|0;p=H[a+224>>2];P=H[p+40>>2];D=H[a+228>>2];q=N(D,40);o=P+q|0;l=H[o+16>>2]+N(H[o+12>>2],24)|0;H[l+8>>2]=n;H[l+12>>2]=r;r=l;l=t;v=H[a+24>>2];x=v+x|0;H[r+16>>2]=x;H[r+20>>2]=v>>>0>x>>>0?l+1|0:l;t=H[a+24>>2];M=H[o+20>>2];r=M+1|0;l=H[o+28>>2];w:{if(r>>>0<=l>>>0){l=H[o+24>>2];break w}X=O(O(l>>>0)+O(100));if(X=O(0)){l=~~X>>>0}else{l=0}H[o+28>>2]=l;l=Ia(H[o+24>>2],N(l,24));P=H[p+40>>2];o=q+P|0;if(!l){break f}H[o+24>>2]=l;M=H[o+20>>2];r=M+1|0}l=N(M,24)+l|0;H[l+16>>2]=t+2;H[l+8>>2]=n;H[l+12>>2]=n>>31;G[l>>1]=65427;H[(q+P|0)+20>>2]=r;x:{if(m){m=Ka(j,H[A+5596>>2]+H[A+5600>>2]|0,H[a+24>>2],k);l=8;if((m|0)==H[a+24>>2]){break x}l=64;if((m|0)!=-1){break x}Ca(k,1,2472,0);j=0;break a}m=0;l=H[a+24>>2]?64:8}H[a+8>>2]=l;H[A+5600>>2]=H[A+5600>>2]+m;y:{if(F[a+92|0]&1){break y}l=H[a+44>>2];if(H[a+76>>2]|((l|0)<0|(l|0)!=H[a+228>>2])){break y}if(!Fb(j)){break y}o=H[a+228>>2];n=H[a+180>>2]+N(o,5644)|0;l=H[n+5592>>2];o=H[H[a+224>>2]+40>>2]+N(o,40)|0;if((l|0)!=H[o+4>>2]){break y}p=l;l=H[n+5588>>2]+1|0;if(p>>>0<=l>>>0){break y}z:{o=H[o+16>>2]+N(l,24)|0;l=H[o>>2];o=H[o+4>>2];if((l|0)==H[j+56>>2]&(o|0)==H[j+60>>2]){break z}if(fb(j,l,o,k)){break z}Ca(k,1,5440,0);j=0;break a}if((Ka(j,H[a+16>>2],2,k)|0)!=2){Ca(k,1,2472,0);j=0;break a}Ea(H[a+16>>2],s+40|0,2);if(H[s+40>>2]==65424){break h}Ca(k,1,4073,0);j=0;break a}l=I[a+92|0];if((l&9)!=1){break i}F[a+92|0]=l|8;r=H[a+228>>2];if(H[(H[a+180>>2]+N(r,5644)|0)+5592>>2]==1){break i}if(!Fb(j)){break i}n=H[j+60>>2];t=n;o=H[j+56>>2];if((n&o)==-1){break i}A:{while(1){l=1;n=s+70|0;if((Ka(j,n,2,k)|0)!=2){break A}Ea(n,s- -64|0,2);if(H[s+64>>2]!=65424){break A}m=2472;if((Ka(j,n,2,k)|0)!=2){break c}Ea(n,s+60|0,2);if(H[s+60>>2]!=10){m=6048;break c}H[s+60>>2]=8;n=Ka(j,s+70|0,8,k);if((n|0)!=H[s+60>>2]){break c}if((n|0)!=8){m=4047;break c}Ea(s+70|0,s+56|0,2);Ea(T,s+52|0,4);Ea(S,s+48|0,1);Ea(R,s+44|0,1);if((r|0)!=H[s+56>>2]){n=H[s+52>>2];if(n>>>0<14){break A}n=n-12|0;H[s+52>>2]=n;n=ub(j,n,k);if(!ra&H[s+52>>2]==(n|0)){continue}break A}break}l=H[s+48>>2]!=H[s+44>>2]}if(!zc(j,o,t,k)){break b}if(l){break i}F[a+92|0]=I[a+92|0]&238|16;B:{if(!z){break B}o=H[a+180>>2];n=0;l=0;if((z|0)!=1){while(1){m=o+N(n,5644)|0;r=H[m+5592>>2];if(r){H[m+5592>>2]=r+1}m=o+N(n|1,5644)|0;r=H[m+5592>>2];if(r){H[m+5592>>2]=r+1}n=n+2|0;l=l+2|0;if((C|0)!=(l|0)){continue}break}}if(!E){break B}l=o+N(n,5644)|0;o=H[l+5592>>2];if(!o){break B}H[l+5592>>2]=o+1}Ca(k,2,9035,0)}if(F[a+92|0]&1){break h}if((Ka(j,H[a+16>>2],2,k)|0)!=2){if(!(!z|(z|0)!=(H[a+228>>2]+1|0))){j=H[a+180>>2];n=0;while(1){l=j+N(n,5644)|0;if(!(H[l+5588>>2]|H[l+5592>>2])){break e}n=n+1|0;if((z|0)!=(n|0)){continue}break}}Ca(k,1,2472,0);j=0;break a}Ea(H[a+16>>2],s+40|0,2)}n=H[s+40>>2];if(F[a+92|0]&1){break g}if((n|0)!=65497){continue}}break}if(H[a+8>>2]==256|(n|0)!=65497){break d}H[a+8>>2]=256;H[a+228>>2]=0;break d}Da(H[o+24>>2]);a=H[p+40>>2]+N(D,40)|0;H[a+28>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;Ca(k,1,3863,0);j=0;break a}H[s+16>>2]=n;Ca(k,4,11004,s+16|0);H[a+228>>2]=n;H[s+40>>2]=65497;H[a+8>>2]=256}n=H[a+228>>2];j=H[a+180>>2];C:{D:{if(F[a+92|0]&1){break D}E:{F:{if(n>>>0>=z>>>0){break F}m=j+N(n,5644)|0;while(1){if(H[m+5596>>2]){break F}n=n+1|0;H[a+228>>2]=n;m=m+5644|0;if((n|0)!=(z|0)){continue}break}break E}if((n|0)!=(z|0)){break D}}H[i>>2]=0;break C}G:{H:{l=j+N(n,5644)|0;if(H[l+5172>>2]){a=6837}else{if(!(I[l+5640|0]&2)){break G}r=H[l+5160>>2];I:{if(!r){m=0;break I}z=H[l+5164>>2];j=0;m=0;n=0;if(r>>>0>=4){A=r&-4;o=0;while(1){t=z+(n<<3)|0;m=H[t+28>>2]+(H[t+20>>2]+(H[t+12>>2]+(H[t+4>>2]+m|0)|0)|0)|0;n=n+4|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}}o=r&3;if(!o){break I}while(1){m=H[(z+(n<<3)|0)+4>>2]+m|0;n=n+1|0;j=j+1|0;if((o|0)!=(j|0)){continue}break}}j=Ga(m);H[l+5172>>2]=j;if(j){break H}a=4009}Ca(k,1,a,0);Ca(k,1,8059,0);j=0;break a}H[l+5180>>2]=m;m=H[l+5164>>2];j=H[l+5160>>2];if(j){o=0;n=0;while(1){r=n<<3;t=r+m|0;z=H[t>>2];if(z){j=H[t+4>>2];if(j){B(H[l+5172>>2]+o|0,z,j)}j=r+H[l+5164>>2]|0;t=H[j+4>>2];Da(H[j>>2]);m=H[l+5164>>2];j=r+m|0;H[j>>2]=0;H[j+4>>2]=0;o=o+t|0;j=H[l+5160>>2]}n=n+1|0;if(n>>>0>>0){continue}break}}H[l+5160>>2]=0;Da(m);H[l+5164>>2]=0;H[l+5168>>2]=H[l+5172>>2];H[l+5176>>2]=H[l+5180>>2]}l=H[a+232>>2];Y=H[l+28>>2];o=H[a+228>>2];M=H[(H[Y+76>>2]+N(o,5644)|0)+5584>>2];j=H[l+24>>2];Z=H[j+24>>2];n=H[Y+24>>2];m=(o>>>0)/(n>>>0)|0;U=H[H[l+20>>2]>>2];l=o-N(m,n)|0;n=H[Y+12>>2];l=H[Y+4>>2]+N(l,n)|0;o=H[j>>2];o=l>>>0>o>>>0?l:o;H[U>>2]=o;n=l+n|0;l=l>>>0>n>>>0?-1:n;n=H[j+8>>2];l=l>>>0>>0?l:n;H[U+8>>2]=l;J:{K:{if(!((l|0)>(o|0)&(o|0)>=0)){Ca(k,1,6682,0);break K}n=H[U+20>>2];l=m;m=H[Y+16>>2];l=H[Y+8>>2]+N(l,m)|0;o=H[j+4>>2];o=l>>>0>o>>>0?l:o;H[U+4>>2]=o;m=l+m|0;l=l>>>0>m>>>0?-1:m;j=H[j+12>>2];j=j>>>0>l>>>0?l:j;H[U+12>>2]=j;if(!((j|0)>(o|0)&(o|0)>=0)){Ca(k,1,6644,0);break K}L:{if(H[M+4>>2]){if(H[U+16>>2]){break L}j=1;break J}Ca(k,1,5358,0);break K}M:{N:{while(1){H[Z+36>>2]=0;j=H[Z>>2];m=j>>31;z=j-1|0;l=H[U>>2];r=l;o=z+l|0;x=m-!j|0;l=x+(l>>31)|0;va=n,wa=Je(o,o>>>0>>0?l+1|0:l,j,m),H[va>>2]=wa;o=H[Z+4>>2];t=o>>31;r=o-1|0;l=H[U+4>>2];p=l;A=r+l|0;q=t-!o|0;l=q+(l>>31)|0;va=n,wa=Je(A,p>>>0>A>>>0?l+1|0:l,o,t),H[va+4>>2]=wa;l=H[U+8>>2];A=l;z=l+z|0;l=(l>>31)+x|0;va=n,wa=Je(z,z>>>0>>0?l+1|0:l,j,m),H[va+8>>2]=wa;j=H[U+12>>2];H[n+16>>2]=ga;l=q+(j>>31)|0;j=j+r|0;l=j>>>0>>0?l+1|0:l;va=n,wa=Je(j,l,o,t),H[va+12>>2]=wa;j=H[M+4>>2];H[n+20>>2]=j;l=H[Y+80>>2];H[n+24>>2]=j>>>0>>0?1:j-l|0;Da(H[n+52>>2]);H[n+68>>2]=0;H[n+60>>2]=0;H[n+64>>2]=0;H[n+52>>2]=0;H[n+56>>2]=0;j=N(j,152);l=H[n+28>>2];O:{if(!l){l=Ga(j);H[n+28>>2]=l;if(!l){break K}H[n+32>>2]=j;if(!j){break O}y(l,0,j);break O}if(j>>>0<=K[n+32>>2]){break O}l=Ia(l,j);if(!l){Ca(k,1,3090,0);Da(H[n+28>>2]);H[n+28>>2]=0;H[n+32>>2]=0;break K}H[n+28>>2]=l;o=H[n+32>>2];m=j-o|0;if(m){y(l+o|0,0,m)}H[n+32>>2]=j}j=H[n+20>>2];if(j){ja=M+944|0;ka=M+812|0;ea=M+28|0;o=H[n+28>>2];_=0;while(1){t=j-1|0;m=t&31;if((t&63)>>>0>=32){l=-1<>>32-m}z=r^-1;r=H[n>>2];m=z+r|0;A=l^-1;l=A+(r>>31)|0;l=m>>>0>>0?l+1|0:l;r=m;m=t&31;if((t&63)>>>0>=32){p=l>>m}else{p=((1<>>m}H[o>>2]=p;l=H[n+4>>2];r=l;m=l+z|0;l=(l>>31)+A|0;l=m>>>0>>0?l+1|0:l;r=m;m=t&31;if((t&63)>>>0>=32){q=l>>m}else{q=((1<>>m}H[o+4>>2]=q;l=H[n+8>>2];r=l;m=l+z|0;l=(l>>31)+A|0;l=m>>>0>>0?l+1|0:l;r=m;m=t&31;if((t&63)>>>0>=32){r=l>>m}else{r=((1<>>m}H[o+8>>2]=r;l=H[n+12>>2];x=l;m=l+z|0;l=(l>>31)+A|0;l=m>>>0>>0?l+1|0:l;x=m;m=t&31;if((t&63)>>>0>=32){x=l>>m}else{x=((1<>>m}H[o+12>>2]=x;C=r>>31;E=_<<2;R=H[E+ka>>2];m=R&31;if((R&63)>>>0>=32){l=1<>>32-m}P=v;m=P+r|0;l=l+C|0;C=m-1|0;m=(m>>>0

>>0?l+1|0:l)-!m|0;l=R&31;if((R&63)>>>0>=32){l=m>>l}else{l=((1<>>l}C=l<>31;P=H[E+ja>>2];m=P&31;if((P&63)>>>0>=32){l=-1<>>32-m;m=-1<>>0>>0?l+1|0:l;E=m;m=P&31;if((P&63)>>>0>=32){l=l>>m}else{l=((1<>>m}l=l<>P:0;H[o+20>>2]=x;aa=p&-1<>R:0;H[o+16>>2]=m;Ie(m,0,x);if(!(!m|!ra)){break N}ca=N(m,x);if(ca>>>0>=107374183){break N}V=N(ca,40);if(_){P=P-1|0;R=R-1|0;l=$>>31;m=$+1|0;$=((m?l:l+1|0)&1)<<31|m>>>1;l=aa>>31;m=aa+1|0;aa=((m?l:l+1|0)&1)<<31|m>>>1;l=3}else{l=1}H[o+24>>2]=l;m=o+28|0;x=j;r=j&31;if((j&63)>>>0>=32){l=1<>>32-r}ia=j;r=l;j=H[M+12>>2];S=j>>>0

>>0?j:P;j=S&31;if((S&63)>>>0>=32){l=-1<>>32-j;j=-1<>2];T=j>>>0>>0?j:R;j=T&31;if((T&63)>>>0>=32){l=-1<>>32-j;j=-1<>2];p=l;j=l+z|0;l=(l>>31)+A|0;l=j>>>0

>>0?l+1|0:l;p=j;j=t&31;if((t&63)>>>0>=32){Q=l>>j}else{Q=((1<>>j}l=H[n>>2];p=l;j=l+z|0;l=(l>>31)+A|0;l=j>>>0

>>0?l+1|0:l;p=j;j=t&31;if((t&63)>>>0>=32){ba=l>>j}else{ba=((1<>>j}j=0;p=z;C=p;q=A;E=q;l=t;break P}j=fa+1|0;p=j>>>1|0;q=t&31;if((t&63)>>>0>=32){l=p<>>32-q;p=p<>>0>C>>>0?l+1|0:l;q=H[n+4>>2];p=q+C|0;E=l;l=l+(q>>31)|0;l=p>>>0>>0?l+1|0:l;q=p;p=x&31;if((x&63)>>>0>=32){Q=l>>p}else{Q=((1<>>p}p=j&1;q=t&31;if((t&63)>>>0>=32){l=p<>>32-q;p=p<>2];D=v+p|0;q=p>>>0>>0?l+1|0:l;l=q+(v>>31)|0;l=v>>>0>D>>>0?l+1|0:l;v=D;D=x&31;if((x&63)>>>0>=32){ba=l>>D}else{ba=((1<>>D}l=x}D=l;v=H[n+8>>2];ha=v>>31;J=H[n+12>>2];H[m+4>>2]=Q;H[m>>2]=ba;H[m+16>>2]=j;l=(J>>31)+E|0;C=C+J|0;l=C>>>0>>0?l+1|0:l;E=C;C=D&31;if((D&63)>>>0>=32){l=l>>C}else{l=((1<>>C}H[m+12>>2]=l;l=q+ha|0;p=p+v|0;l=p>>>0>>0?l+1|0:l;q=p;p=D&31;if((D&63)>>>0>=32){l=l>>p}else{l=((1<>>p}H[m+8>>2]=l;da=1;p=H[ea>>2];j=(H[Z+24>>2]+(!H[M+20>>2]|!j?0:(j|0)==3?2:1)|0)-p|0;Q:{if((j|0)>=1024){da=898846567431158e293;if(j>>>0<2047){j=j-1023|0;break Q}da=Infinity;j=(j>>>0>=3069?3069:j)-2046|0;break Q}if((j|0)>-1023){break Q}da=2004168360008973e-307;if(j>>>0>4294965304){j=j+969|0;break Q}da=0;j=(j>>>0<=4294964336?-2960:j)+1938|0}qa=+H[ea+4>>2]*.00048828125+1;u(0,0);u(1,j+1023<<20);va=m,xa=O(qa*(da*+w())),L[va+32>>2]=xa;H[m+28>>2]=(p+H[M+804>>2]|0)-1;j=H[m+20>>2];R:{S:{if(!(j|!ca)){j=Ga(V);H[m+20>>2]=j;if(!j){Ca(k,1,2854,0);break K}if(V){y(j,0,V)}H[m+24>>2]=V;break S}if(V>>>0>K[m+24>>2]){j=Ia(j,V);if(!j){Ca(k,1,2854,0);Da(H[m+20>>2]);H[m+20>>2]=0;H[m+24>>2]=0;break K}H[m+20>>2]=j;l=H[m+24>>2];p=V-l|0;if(p){y(j+l|0,0,p)}H[m+24>>2]=V}if(!ca){break R}}j=H[m+20>>2];C=0;while(1){p=H[o+16>>2];l=(C>>>0)/(p>>>0)|0;p=C-N(l,p)|0;q=(p<>2];E=(q|0)>(E|0)?q:E;H[j>>2]=E;q=(l<>2];D=(q|0)>(D|0)?q:D;H[j+4>>2]=D;p=(p+1<>2];p=(p|0)<(q|0)?p:q;H[j+8>>2]=p;l=(l+1<>2];q=(l|0)<(q|0)?l:q;H[j+12>>2]=q;l=(p>>31)+pa|0;v=p;p=p+na|0;l=v>>>0>p>>>0?l+1|0:l;E=E>>T;v=p;p=T&31;if((T&63)>>>0>=32){l=l>>p}else{l=((1<>>p}v=l-E<>T;H[j+16>>2]=v;l=(q>>31)+ma|0;p=q+la|0;l=p>>>0>>0?l+1|0:l;D=D>>S;q=p;p=S&31;if((S&63)>>>0>=32){l=l>>p}else{l=((1<>>p}l=l-D<>S;H[j+20>>2]=l;p=N(l,v);Ie(p,0,68);if(ra){Ca(k,1,2935,0);break K}l=N(p,68);q=H[j+24>>2];T:{U:{if(!(q|!p)){q=Ga(l);H[j+24>>2]=q;if(!q){break K}if(!l){break U}y(q,0,l);break U}if(l>>>0<=K[j+28>>2]){break T}q=Ia(q,l);if(!q){Da(H[j+24>>2]);H[j+24>>2]=0;H[j+28>>2]=0;Ca(k,1,2549,0);break K}H[j+24>>2]=q;v=H[j+28>>2];J=l-v|0;if(!J){break U}y(q+v|0,0,J)}H[j+28>>2]=l}l=H[j+20>>2];q=H[j+16>>2];v=H[j+32>>2];V:{if(!v){l=sc(q,l,k);break V}l=qc(v,q,l,k)}H[j+32>>2]=l;l=H[j+20>>2];q=H[j+16>>2];v=H[j+36>>2];W:{if(!v){l=sc(q,l,k);break W}l=qc(v,q,l,k)}H[j+36>>2]=l;if(p){ba=D+1|0;ha=E+1|0;q=0;while(1){W=H[j+16>>2];v=(q>>>0)/(W>>>0)|0;l=H[j+24>>2]+N(q,68)|0;Q=H[l>>2];X:{if(Q){ta=H[l+56>>2];J=H[l+48>>2];ua=H[l+4>>2];Da(H[l+60>>2]);H[l+48>>2]=0;H[l+52>>2]=0;H[l- -64>>2]=0;H[l+56>>2]=0;H[l+60>>2]=0;H[l+40>>2]=0;H[l+44>>2]=0;H[l+32>>2]=0;H[l+36>>2]=0;H[l+24>>2]=0;H[l+28>>2]=0;H[l+16>>2]=0;H[l+20>>2]=0;H[l+8>>2]=0;H[l+12>>2]=0;H[l>>2]=Q;H[l+48>>2]=J;Y:{if(!J){break Y}J=N(J,24);if(!J){break Y}y(Q,0,J)}H[l+56>>2]=ta;H[l+4>>2]=ua;break X}J=Fa(10,24);H[l>>2]=J;if(!J){break K}H[l+48>>2]=10}J=q-N(v,W)|0;Q=J+E<>2];H[l+8>>2]=(Q|0)>(W|0)?Q:W;Q=v+D<>2];H[l+12>>2]=(Q|0)>(W|0)?Q:W;J=J+ha<>2];H[l+16>>2]=(J|0)<(Q|0)?J:Q;Q=l;l=v+ba<>2];H[Q+20>>2]=(l|0)<(v|0)?l:v;q=q+1|0;if((p|0)!=(q|0)){continue}break}}j=j+40|0;C=C+1|0;if((C|0)!=(ca|0)){continue}break}}ea=ea+8|0;m=m+36|0;fa=fa+1|0;if(fa>>>0>2]){continue}break}o=o+152|0;j=t;_=_+1|0;if(_>>>0>2]){continue}break}}Z=Z+52|0;n=n+76|0;M=M+1080|0;ga=ga+1|0;if(ga>>>0>2]){continue}break}j=1;break J}Ca(k,1,2982,0);break K}Ca(k,1,2373,0)}j=0}if(!j){Ca(k,1,3668,0);j=0;break a}j=H[a+228>>2];H[s+4>>2]=N(H[a+128>>2],H[a+132>>2]);H[s>>2]=j+1;Ca(k,4,11825,s);H[b>>2]=H[a+228>>2];H[i>>2]=1;if(c){b=bc(H[a+232>>2],0);H[c>>2]=b;j=0;if((b|0)==-1){break a}}b=H[H[H[a+232>>2]+20>>2]>>2];H[d>>2]=H[b>>2];H[e>>2]=H[b+4>>2];H[f>>2]=H[b+8>>2];H[g>>2]=H[b+12>>2];H[h>>2]=H[b+16>>2];H[a+8>>2]=H[a+8>>2]|128}j=1;break a}Ca(k,1,m,0)}Ca(k,1,3702,0);j=0}oa=s+80|0;return j|0}function fc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,L=0,M=0,O=0,P=0,Q=0,R=0,S=0,T=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{switch(H[a+84>>2]){case 0:k:{c=H[a+52>>2];b=H[a+196>>2];if(c>>>0>>0){q=H[a+64>>2];if(q>>>0>>0){break k}}Ca(H[a+236>>2],1,8491,0);break b}if(!H[a+44>>2]){k=H[a+36>>2];b=0;break i}H[a+44>>2]=0;i=H[a+68>>2];b=1;break i;case 1:l:{c=H[a+52>>2];b=H[a+196>>2];if(c>>>0>>0){q=H[a+64>>2];if(q>>>0>>0){break l}}Ca(H[a+236>>2],1,8536,0);break b}if(!H[a+44>>2]){e=H[a+36>>2];b=0;break e}H[a+44>>2]=0;i=H[a+48>>2];b=1;break e;case 2:m:{A=H[a+52>>2];x=H[a+196>>2];if(A>>>0>>0){r=H[a+64>>2];if(r>>>0>>0){break m}}Ca(H[a+236>>2],1,8671,0);break b}if(!H[a+44>>2]){y=H[a+40>>2];break f}H[a+228>>2]=0;H[a+232>>2]=0;H[a+44>>2]=0;j=H[a+200>>2];while(1){O=j+(u<<4)|0;l=H[O+8>>2];if(l){q=H[O+12>>2];b=0;while(1){g=l+(b^-1)|0;d=q+(b<<4)|0;s=g+H[d>>2]|0;n:{if(s>>>0>31){break n}c=H[O>>2];if(c>>>0>-1>>>s>>>0){break n}c=c<>>0>k>>>0?k:c:c;H[a+228>>2]=k}g=g+H[d+4>>2]|0;o:{if(g>>>0>31){break o}c=H[O+4>>2];if(c>>>0>-1>>>g>>>0){break o}c=c<>>0>i>>>0?i:c:c;H[a+232>>2]=i}b=b+1|0;if((l|0)!=(b|0)){continue}break}}u=u+1|0;if((x|0)!=(u|0)){continue}break};if(!k|!i){break d}if(!I[a|0]){H[a+108>>2]=H[a+208>>2];H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}o=H[a+48>>2];b=1;break f;case 3:p:{A=H[a+52>>2];l=H[a+196>>2];if(A>>>0>>0){P=H[a+64>>2];if(P>>>0>>0){break p}}Ca(H[a+236>>2],1,8626,0);break b}if(!H[a+44>>2]){B=H[a+200>>2];e=H[a+28>>2];y=B+(e<<4)|0;E=H[a+40>>2];break g}H[a+228>>2]=0;H[a+232>>2]=0;H[a+44>>2]=0;B=H[a+200>>2];while(1){x=(p<<4)+B|0;s=H[x+8>>2];if(s){q=H[x+12>>2];b=0;while(1){g=s+(b^-1)|0;d=q+(b<<4)|0;j=g+H[d>>2]|0;q:{if(j>>>0>31){break q}c=H[x>>2];if(c>>>0>-1>>>j>>>0){break q}c=c<>>0>k>>>0?k:c:c;H[a+228>>2]=k}g=g+H[d+4>>2]|0;r:{if(g>>>0>31){break r}c=H[x+4>>2];if(c>>>0>-1>>>g>>>0){break r}c=c<>>0>i>>>0?i:c:c;H[a+232>>2]=i}b=b+1|0;if((s|0)!=(b|0)){continue}break}}p=p+1|0;if((l|0)!=(p|0)){continue}break};if(!k|!i){break d}s:{if(I[a|0]){p=H[a+108>>2];break s}p=H[a+208>>2];H[a+108>>2]=p;H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}b=1;break g;case 4:break j;default:break d}}t:{p=H[a+52>>2];b=H[a+196>>2];if(p>>>0>>0){r=H[a+64>>2];if(r>>>0>>0){break t}}Ca(H[a+236>>2],1,8581,0);break d}if(!H[a+44>>2]){p=H[a+28>>2];o=H[a+200>>2]+(p<<4)|0;u=H[a+40>>2];b=0;break h}H[a+28>>2]=p;H[a+44>>2]=0;b=1;break h}u:while(1){v:{w:{if(!b){k=k+1|0;break w}H[a+40>>2]=i;if(K[a+56>>2]<=i>>>0){break b}e=H[a+48>>2];b=0;break v}b=1}x:while(1){y:{z:{A:{B:{if(!b){H[a+32>>2]=e;if(K[a+60>>2]<=e>>>0){break B}H[a+28>>2]=c;b=c;o=0;break y}H[a+36>>2]=k;if(K[a+76>>2]<=k>>>0){b=H[a+28>>2];o=1;break y}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],H[a+40>>2])|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],k)|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break A}break a}i=H[a+40>>2]+1|0;break z}b=0;continue u}b=1;continue u}while(1){C:{D:{E:{if(!o){if(b>>>0>=q>>>0){break E}g=H[a+32>>2];d=H[a+200>>2]+(b<<4)|0;if(g>>>0>=K[d+8>>2]){break C}if(!I[a|0]){b=H[d+12>>2]+(g<<4)|0;H[a+76>>2]=N(H[b+12>>2],H[b+8>>2])}k=H[a+72>>2];b=1;continue x}b=b+1|0;H[a+28>>2]=b;break D}e=H[a+32>>2]+1|0;b=0;continue x}o=0;continue}o=1;continue}}}}F:while(1){G:{H:{if(!b){u=u+1|0;H[a+40>>2]=u;break H}if(p>>>0>=r>>>0){break b}H[a+228>>2]=0;H[a+232>>2]=0;o=H[a+200>>2]+(p<<4)|0;s=H[o+8>>2];if(!s){break b}q=H[o+12>>2];k=0;e=0;b=0;while(1){g=s+(b^-1)|0;d=q+(b<<4)|0;j=g+H[d>>2]|0;I:{if(j>>>0>31){break I}c=H[o>>2];if(c>>>0>-1>>>j>>>0){break I}c=c<>>0>e>>>0?e:c:c;H[a+228>>2]=e}g=g+H[d+4>>2]|0;J:{if(g>>>0>31){break J}c=H[o+4>>2];if(c>>>0>-1>>>g>>>0){break J}c=c<>>0>k>>>0?k:c:c;H[a+232>>2]=k}b=b+1|0;if((s|0)!=(b|0)){continue}break}if(!e|!k){break d}K:{if(I[a|0]){k=H[a+108>>2];break K}k=H[a+208>>2];H[a+108>>2]=k;H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}b=0;break G}b=1}L:while(1){M:{N:{O:{P:{if(!b){H[a+224>>2]=k;if(K[a+112>>2]<=k>>>0){break P}B=H[a+100>>2];b=0;break M}if(K[a+56>>2]<=u>>>0){i=H[a+32>>2];b=1;break M}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],u)|0)+N(H[a+20>>2],p)|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break O}break a}p=p+1|0;H[a+28>>2]=p;break N}b=0;continue F}b=1;continue F}while(1){Q:{R:{S:{T:{if(!b){H[a+220>>2]=B;if(K[a+104>>2]<=B>>>0){break S}i=H[a+48>>2];break T}i=i+1|0}H[a+32>>2]=i;b=H[a+60>>2];d=H[o+8>>2];if((b>>>0>>0?b:d)>>>0>i>>>0){g=H[o>>2];c=g;n=d+(i^-1)|0;m=n;d=m&31;if((m&63)>>>0>=32){b=c<>>32-d;v=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break Q}b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[o+4>>2];if((b&c)!=(c|0)){break Q}d=m&31;if((m&63)>>>0>=32){b=c<>>32-d;w=c<>2];j=F+d|0;O=Ke(j,d>>>0>j>>>0?h+1|0:h,w,b);b=h;L=H[a+208>>2];d=F+L|0;b=L>>>0>d>>>0?b+1|0:b;s=Ke(d,b,w,C);A=v-1|0;j=H[a+212>>2];l=A+j|0;d=f-!v|0;b=d;x=Ke(l,l>>>0>>0?b+1|0:b,v,f);D=H[a+204>>2];j=A+D|0;b=D>>>0>j>>>0?b+1|0:b;j=Ke(j,b,v,f);z=H[o+12>>2]+(i<<4)|0;M=H[z>>2];t=M+n|0;b=t&31;if((t&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break Q}h=c;P=H[z+4>>2];n=P+n|0;e=n&31;if((n&63)>>>0>=32){b=c<>>32-e;e=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break Q}l=H[a+224>>2];e=!!(Le(l,e,b)|ra);b=n&31;if((n&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=n<>>32-e|b<>2];if((t&63)>>>0>=32){b=g<>>32-n;e=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=j<>>32-t|b<>2];if(!n|(!H[z+12>>2]|(j|0)==(x|0))){break Q}if((s|0)==(O|0)){break Q}u=H[a+68>>2];H[a+40>>2]=u;b=d;c=c+A|0;b=c>>>0>>0?b+1|0:b;g=(Ke(c,b,v,f)>>>M)-(j>>>M)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(n,(Ke(c,b,w,C)>>>P)-(s>>>P)|0)+g|0,H[S+36>>2]=T;b=1;continue L}c=H[a+220>>2];b=H[a+228>>2];B=c+b-(c>>>0)%(b>>>0)|0;break R}c=H[a+224>>2];b=H[a+232>>2];k=c+b-(c>>>0)%(b>>>0)|0;b=0;continue L}b=0;continue}b=1;continue}}}}U:while(1){V:{W:{if(!b){E=E+1|0;H[a+40>>2]=E;break W}H[a+224>>2]=p;if(K[a+112>>2]<=p>>>0){break b}v=H[a+100>>2];b=0;break V}b=1}X:while(1){Y:{Z:{_:{$:{if(!b){H[a+220>>2]=v;if(K[a+104>>2]<=v>>>0){break $}H[a+28>>2]=A;e=A;b=0;break Y}if(K[a+56>>2]<=E>>>0){u=H[a+32>>2];b=1;break Y}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],E)|0)+N(H[a+20>>2],e)|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break _}break a}c=H[a+224>>2];b=H[a+232>>2];p=c+b-(c>>>0)%(b>>>0)|0;break Z}b=0;continue U}b=1;continue U}while(1){aa:{ba:{ca:{da:{if(!b){if(e>>>0>=P>>>0){break ca}u=H[a+48>>2];H[a+32>>2]=u;y=(e<<4)+B|0;break da}u=u+1|0;H[a+32>>2]=u}b=H[a+60>>2];d=H[y+8>>2];if((b>>>0>>0?b:d)>>>0>u>>>0){g=H[y>>2];c=g;f=d+(u^-1)|0;i=f;d=f&31;if((f&63)>>>0>=32){b=c<>>32-d;k=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break aa}b=i&31;if((i&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[y+4>>2];if((b&c)!=(c|0)){break aa}d=i&31;if((i&63)>>>0>=32){b=c<>>32-d;o=c<>2];j=F+d|0;O=Ke(j,d>>>0>j>>>0?h+1|0:h,o,b);b=h;w=H[a+208>>2];d=w+F|0;b=w>>>0>d>>>0?b+1|0:b;s=Ke(d,b,o,n);C=k-1|0;j=H[a+212>>2];l=C+j|0;d=t-!k|0;b=d;x=Ke(l,l>>>0>>0?b+1|0:b,k,t);L=H[a+204>>2];j=C+L|0;b=L>>>0>j>>>0?b+1|0:b;j=Ke(j,b,k,t);D=H[y+12>>2]+(u<<4)|0;z=H[D>>2];m=z+f|0;b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break aa}h=c;M=H[D+4>>2];f=M+f|0;r=f&31;if((f&63)>>>0>=32){b=c<>>32-r;r=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break aa}l=H[a+224>>2];r=!!(Le(l,r,b)|ra);b=f&31;if((f&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-r|b<>2];if((m&63)>>>0>=32){b=g<>>32-f;f=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-m|b<>2];if(!f|(!H[D+12>>2]|(j|0)==(x|0))){break aa}if((s|0)==(O|0)){break aa}E=H[a+68>>2];H[a+40>>2]=E;b=d;c=c+C|0;b=c>>>0>>0?b+1|0:b;g=(Ke(c,b,k,t)>>>z)-(j>>>z)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(f,(Ke(c,b,o,n)>>>M)-(s>>>M)|0)+g|0,H[S+36>>2]=T;b=1;continue X}e=e+1|0;H[a+28>>2]=e;break ba}c=H[a+220>>2];b=H[a+228>>2];v=c+b-(c>>>0)%(b>>>0)|0;b=0;continue X}b=0;continue}b=1;continue}}}}ea:while(1){fa:{ga:{if(!b){y=y+1|0;H[a+40>>2]=y;break ga}H[a+32>>2]=o;if(K[a+60>>2]<=o>>>0){break b}E=H[a+108>>2];b=0;break fa}b=1}ha:while(1){ia:{ja:{ka:{la:{if(!b){H[a+224>>2]=E;if(K[a+112>>2]<=E>>>0){break la}B=H[a+100>>2];b=0;break ia}if(K[a+56>>2]<=y>>>0){p=H[a+28>>2];b=1;break ia}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],y)|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break ka}break a}o=H[a+32>>2]+1|0;break ja}b=0;continue ea}b=1;continue ea}while(1){ma:{na:{oa:{pa:{if(!b){H[a+220>>2]=B;if(K[a+104>>2]<=B>>>0){break oa}H[a+28>>2]=A;p=A;break pa}p=p+1|0;H[a+28>>2]=p}if(p>>>0>>0){m=H[a+32>>2];e=H[a+200>>2]+(p<<4)|0;b=H[e+8>>2];if(m>>>0>=b>>>0){break ma}g=H[e>>2];c=g;f=b+(m^-1)|0;i=f;d=f&31;if((f&63)>>>0>=32){b=c<>>32-d;v=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break ma}b=i&31;if((i&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[e+4>>2];if((b&c)!=(c|0)){break ma}d=i&31;if((i&63)>>>0>=32){b=c<>>32-d;w=c<>2];j=F+d|0;O=Ke(j,d>>>0>j>>>0?h+1|0:h,w,b);b=h;L=H[a+208>>2];d=F+L|0;b=L>>>0>d>>>0?b+1|0:b;s=Ke(d,b,w,n);C=v-1|0;j=H[a+212>>2];l=C+j|0;d=t-!v|0;b=d;x=Ke(l,l>>>0>>0?b+1|0:b,v,t);D=H[a+204>>2];j=C+D|0;b=D>>>0>j>>>0?b+1|0:b;j=Ke(j,b,v,t);z=H[e+12>>2]+(m<<4)|0;M=H[z>>2];m=M+f|0;b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break ma}h=c;P=H[z+4>>2];f=P+f|0;e=f&31;if((f&63)>>>0>=32){b=c<>>32-e;e=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break ma}l=H[a+224>>2];e=!!(Le(l,e,b)|ra);b=f&31;if((f&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-e|b<>2];if((m&63)>>>0>=32){b=g<>>32-f;f=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-m|b<>2];if(!f|(!H[z+12>>2]|(j|0)==(x|0))){break ma}if((s|0)==(O|0)){break ma}y=H[a+68>>2];H[a+40>>2]=y;b=d;c=c+C|0;b=c>>>0>>0?b+1|0:b;g=(Ke(c,b,v,t)>>>M)-(j>>>M)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(f,(Ke(c,b,w,n)>>>P)-(s>>>P)|0)+g|0,H[S+36>>2]=T;b=1;continue ha}c=H[a+220>>2];b=H[a+228>>2];B=c+b-(c>>>0)%(b>>>0)|0;break na}c=H[a+224>>2];b=H[a+232>>2];E=c+b-(c>>>0)%(b>>>0)|0;b=0;continue ha}b=0;continue}b=1;continue}}}}qa:while(1){ra:{sa:{if(!b){e=e+1|0;break sa}H[a+32>>2]=i;if(K[a+60>>2]<=i>>>0){break b}k=H[a+68>>2];b=0;break ra}b=1}ta:while(1){ua:{va:{wa:{xa:{if(!b){H[a+40>>2]=k;if(K[a+56>>2]<=k>>>0){break xa}H[a+28>>2]=c;b=c;o=0;break ua}H[a+36>>2]=e;if(K[a+76>>2]<=e>>>0){b=H[a+28>>2];o=1;break ua}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],H[a+40>>2])|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],e)|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break wa}break a}i=H[a+32>>2]+1|0;break va}b=0;continue qa}b=1;continue qa}while(1){ya:{za:{Aa:{if(!o){if(b>>>0>=q>>>0){break Aa}g=H[a+32>>2];d=H[a+200>>2]+(b<<4)|0;if(g>>>0>=K[d+8>>2]){break ya}if(!I[a|0]){b=H[d+12>>2]+(g<<4)|0;H[a+76>>2]=N(H[b+12>>2],H[b+8>>2])}e=H[a+72>>2];b=1;continue ta}b=b+1|0;H[a+28>>2]=b;break za}k=H[a+40>>2]+1|0;b=0;continue ta}o=0;continue}o=1;continue}}}}return 0}Ca(H[a+236>>2],1,1343,0)}return 0}G[b>>1]=1;return 1}function yd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=O(0),t=0,u=0,v=0,w=O(0),x=0,z=0,A=0,C=O(0),D=O(0),E=O(0),G=0,J=0,K=0,L=0,M=0,Q=O(0),R=0,S=0,T=0;n=oa-8320|0;oa=n;H[n+64>>2]=0;j=2;h=H[a>>2];a:{b:{if((h|0)==176622093){break b}if((h|0)!=1375686655){if(!((h|0)!=201326592|H[a+4>>2]!=538988650)&H[a+8>>2]==176622093){break b}Y(1101);j=1;break a}j=0}h=Fa(1,96);g=0;c:{if(!h){break c}H[h+76>>2]=1;d:{e:{f:{switch(j|0){case 0:H[h+88>>2]=68;H[h+84>>2]=69;H[h+80>>2]=70;H[h+16>>2]=71;H[h+4>>2]=72;H[h+28>>2]=73;H[h+24>>2]=74;H[h+20>>2]=75;H[h>>2]=76;H[h+92>>2]=77;H[h+44>>2]=78;H[h+40>>2]=79;H[h+36>>2]=80;H[h+32>>2]=81;H[h+12>>2]=82;H[h+8>>2]=83;g=Ub();H[h+48>>2]=g;if(g){break e}break d;case 2:break f;default:break d}}H[h+88>>2]=84;H[h+84>>2]=85;H[h+80>>2]=86;H[h+16>>2]=87;H[h+4>>2]=88;H[h+92>>2]=89;H[h+44>>2]=90;H[h+40>>2]=91;H[h+36>>2]=92;H[h+32>>2]=93;H[h+28>>2]=94;H[h+24>>2]=95;H[h+20>>2]=96;H[h+12>>2]=97;H[h+8>>2]=98;H[h>>2]=99;g=Fa(1,136);g:{if(g){l=Ub();H[g>>2]=l;h:{if(!l){break h}H[g+108>>2]=0;H[g+112>>2]=0;F[g+124|0]=0;H[g+116>>2]=0;H[g+120>>2]=0;l=tb();H[g+4>>2]=l;if(!l){break h}l=tb();H[g+8>>2]=l;if(!l){break h}break g}Pc(g)}g=0}H[h+48>>2]=g;if(!g){break d}}H[h+72>>2]=1;H[h+64>>2]=1;H[h+60>>2]=0;H[h+52>>2]=0;H[h+56>>2]=0;H[h+68>>2]=1;g=h;break c}Da(h);g=0}if(g){H[g+60>>2]=0;H[g+72>>2]=100}if(g){H[g+56>>2]=0;H[g+68>>2]=101}if(g){H[g+52>>2]=0;H[g+64>>2]=102}h=n+68|0;if(h){y(h,0,8248);H[h+8248>>2]=0;H[h+8200>>2]=-1;H[h+8204>>2]=-1}if(d){H[n+8316>>2]=H[n+8316>>2]|1}H[n+60>>2]=b;H[n+56>>2]=a;H[n+52>>2]=a;j=1;b=0;h=n+52|0;i:{if(!h){break i}a=Fa(1,72);if(a){j:{H[a+64>>2]=1048576;l=Ga(1048576);H[a+32>>2]=l;if(!l){Da(a);a=0;break j}H[a+36>>2]=l;H[a+28>>2]=2;H[a+24>>2]=3;H[a+20>>2]=4;H[a+16>>2]=5;H[a+44>>2]=6;H[a+40>>2]=8;H[a+68>>2]=H[a+68>>2]|2}}else{a=0}if(!a){break i}if(a){H[a+4>>2]=0;H[a>>2]=h}b=H[h+8>>2];if(a){H[a+8>>2]=b;H[a+12>>2]=0}if(!(!a|!(I[a+68|0]&2))){H[a+16>>2]=64}if(a){H[a+24>>2]=66}if(a){H[a+28>>2]=67}b=a}a=n+68|0;if(!g|!a){a=0}else{k:{if(!H[g+76>>2]){Ca(g+52|0,1,9902,0);a=0;break k}sa[H[g+24>>2]](H[g+48>>2],a);a=1}}if(!a){Y(1153);jb(b);lb(g);break a}if(!b|!g){a=0}else{l:{if(!H[g+76>>2]){Ca(g+52|0,1,9983,0);a=0;break l}a=sa[H[g>>2]](b,H[g+48>>2],n- -64|0,g+52|0)|0}}if(!a){Y(1181);jb(b);lb(g);Va(H[n+64>>2]);break a}m:{if(!f){break m}if(g){a=sa[H[g+40>>2]](H[g+48>>2],f,g+52|0)|0}else{a=0}if(a){break m}Y(1116);jb(b);lb(g);Va(H[n+64>>2]);break a}a=H[n+64>>2];f=0;n:{if(!H[g+76>>2]|(!g|!b)){a=f}else{a=sa[H[g+4>>2]](H[g+48>>2],b,a,g+52|0)|0}if(a){if(!(!H[g+76>>2]|(!g|!b))){f=sa[H[g+16>>2]](H[g+48>>2],b,g+52|0)|0}if(f){break n}}Y(1316);lb(g);jb(b);Va(H[n+64>>2]);break a}jb(b);lb(g);k=H[n+64>>2];a=H[k+28>>2];if(a){Da(a);k=H[n+64>>2];H[k+28>>2]=0;H[k+32>>2]=0}v=H[k+16>>2];o:{p:{if(!c){if(!(!e|(v|0)!=4)){p=1;v=4;break o}q:{b=H[k+20>>2];if(!((b|0)==3|(v|0)!=3)){a=H[k+24>>2];if(H[a>>2]!=H[a+4>>2]|H[a+52>>2]==1){break q}H[k+20>>2]=3;break p}if(v>>>0>2){break q}H[k+20>>2]=2;break o}r:{switch(b-3|0){case 2:s:{t:{if(v>>>0<4){break t}f=H[k+24>>2];a=H[f>>2];if((a|0)!=H[f+52>>2]|(a|0)!=H[f+104>>2]|(a|0)!=H[f+156>>2]){break t}a=H[f+4>>2];if((a|0)!=H[f+56>>2]|(a|0)!=H[f+108>>2]){break t}if((a|0)==H[f+160>>2]){break s}}H[n+20>>2]=1053;H[n+16>>2]=1373;Ha(26080,8179,n+16|0);break o}g=N(H[f+12>>2],H[f+8>>2]);C=O(O(1)/O((-1<>2]^-1)>>>0));D=O(O(1)/O((-1<>2]^-1)>>>0));w=O(O(1)/O((-1<>2]^-1)>>>0));Q=O(O(1)/O((-1<>2]^-1)>>>0));a=0;while(1){if((a|0)!=(g|0)){h=a<<2;b=h+H[f+148>>2]|0;l=H[b>>2];c=h+H[f+96>>2]|0;j=H[c>>2];m=h+H[f+44>>2]|0;s=O(O(1)-O(C*O(H[h+H[f+200>>2]>>2])));E=O(O(O(O(1)-O(Q*O(H[m>>2])))*O(255))*s);if(O(P(E))>2]=h;E=O(O(O(O(1)-O(w*O(j|0)))*O(255))*s);if(O(P(E))>2]=h;s=O(O(O(O(1)-O(D*O(l|0)))*O(255))*s);if(O(P(s))>2]=c;a=a+1|0;continue}break};Da(H[f+200>>2]);a=H[k+24>>2];H[a+128>>2]=8;H[a+76>>2]=8;H[a+24>>2]=8;H[a+200>>2]=0;H[k+20>>2]=1;a=H[k+16>>2]-1|0;H[k+16>>2]=a;i=3;while(1){if(a>>>0<=i>>>0){break o}a=H[k+24>>2]+N(i,52)|0;B(a,a+52|0,52);i=i+1|0;a=H[k+16>>2];continue};case 0:break p;case 1:break r;default:break o}}g=H[k+24>>2];a=H[g>>2];u:{v:{if((a|0)!=H[g+52>>2]|(a|0)!=H[g+104>>2]){break v}a=H[g+4>>2];if((a|0)!=H[g+56>>2]){break v}if((a|0)==H[g+108>>2]){break u}}H[n+36>>2]=1115;H[n+32>>2]=1373;Ha(26080,8221,n+32|0);break o}a=H[g+24>>2];b=-1<>2]?0:a;j=H[g+84>>2]?0:a;m=N(H[g+12>>2],H[g+8>>2]);a=0;while(1){if((a|0)!=(m|0)){c=a<<2;i=c+H[g+44>>2]|0;f=c+H[g+148>>2]|0;s=O(H[f>>2]-l|0);h=c+H[g+96>>2]|0;C=O(H[h>>2]-j|0);D=O(H[i>>2]);w=O(O(O(s*O(1.4019900560379028))+O(O(C*O(-3680000008898787e-20))+D))+O(.5));if(O(P(w))>2]=(b|0)<(c|0)?b:(c|0)>0?c:0;w=O(O(O(s*O(-.7141128182411194))+O(O(D*O(1.0003000497817993))+O(C*O(-.34412500262260437))))+O(.5));if(O(P(w))>2]=(b|0)<(c|0)?b:(c|0)>0?c:0;s=O(O(O(s*O(-7999999979801942e-21))+O(O(D*O(.9998229742050171))+O(C*O(1.7720400094985962))))+O(.5));if(O(P(s))>2]=(b|0)<(c|0)?b:(c|0)>0?c:0;a=a+1|0;continue}break}H[k+20>>2]=1;break o}v=c>>>0>v>>>0?v:c;p=1;break o}w:{x:{c=H[k+24>>2];if(H[c>>2]!=1){break x}y:{switch(H[c+52>>2]-1|0){case 1:if(H[c+104>>2]!=2){break x}if(!(H[c+4>>2]!=1|H[c+56>>2]!=2|H[c+108>>2]!=2)){b=H[c+24>>2];i=H[c+148>>2];a=H[c+96>>2];j=H[c+44>>2];G=H[c+60>>2];q=H[c+8>>2];f=H[c+12>>2];c=N(q,f)<<2;h=Ja(c);g=Ja(c);l=Ja(c);if(!(!h|!g|!l)){m=-1<>2]&1;L=f-b|0;K=H[k>>2]&1;x=q-K|0;if(!b){c=l;f=g;b=h;break w}c=l;f=g;b=h;while(1){if((p|0)==(q|0)){break w}La(o,m,H[j>>2],0,0,b,f,c);p=p+1|0;c=c+4|0;f=f+4|0;b=b+4|0;j=j+4|0;continue}}Da(h);Da(g);Da(l);break o}if(H[c+4>>2]!=1|H[c+56>>2]!=1|H[c+108>>2]!=1){break x}a=H[c+24>>2];f=H[c+148>>2];b=H[c+96>>2];i=H[c+44>>2];t=H[c+60>>2];h=H[c+8>>2];x=H[c+12>>2];c=N(h,x)<<2;g=Ja(c);l=Ja(c);m=Ja(c);if(!(!g|!l|!m)){o=-1<>2]&1;a=h-z|0;G=a&1;u=a>>>1|0;J=a&-2;a=m;j=l;c=g;while(1){if((q|0)!=(x|0)){if(z){La(r,o,H[i>>2],0,0,c,j,a);j=j+4|0;c=c+4|0;i=i+4|0;a=a+4|0}h=0;while(1){if(h>>>0>>0){La(r,o,H[i>>2],H[b>>2],H[f>>2],c,j,a);La(r,o,H[i+4>>2],H[b>>2],H[f>>2],c+4|0,j+4|0,a+4|0);h=h+2|0;f=f+4|0;b=b+4|0;a=a+8|0;j=j+8|0;c=c+8|0;i=i+8|0;continue}break}z:{if(!G){break z}h=H[i>>2];A:{if((t|0)==(u|0)){La(r,o,h,0,0,c,j,a);break A}La(r,o,h,H[b>>2],H[f>>2],c,j,a)}a=a+4|0;j=j+4|0;c=c+4|0;i=i+4|0;if(t>>>0<=u>>>0){break z}f=f+4|0;b=b+4|0}q=q+1|0;continue}break}Da(H[H[k+24>>2]+44>>2]);a=H[k+24>>2];H[a+44>>2]=g;Da(H[a+96>>2]);a=H[k+24>>2];H[a+96>>2]=l;Da(H[a+148>>2]);a=H[k+24>>2];H[a+148>>2]=m;b=H[a+8>>2];H[a+112>>2]=b;H[a+60>>2]=b;b=H[a+12>>2];H[a+116>>2]=b;H[a+64>>2]=b;b=H[a>>2];H[a+104>>2]=b;H[a+52>>2]=b;b=H[a+4>>2];H[a+108>>2]=b;H[a+56>>2]=b;H[k+20>>2]=1;break o}Da(g);Da(l);Da(m);break o;case 0:break y;default:break x}}if(H[c+104>>2]!=1|H[c+4>>2]!=1|(H[c+56>>2]!=1|H[c+108>>2]!=1)){break x}b=H[c+24>>2];i=H[c+148>>2];a=H[c+96>>2];j=H[c+44>>2];o=N(H[c+12>>2],H[c+8>>2]);c=o<<2;g=Ja(c);l=Ja(c);m=Ja(c);if(!(!g|!l|!m)){q=-1<>2],H[a>>2],H[i>>2],h,b,f);c=c+1|0;f=f+4|0;b=b+4|0;h=h+4|0;i=i+4|0;a=a+4|0;j=j+4|0;continue}break}Da(H[H[k+24>>2]+44>>2]);a=H[k+24>>2];H[a+44>>2]=g;Da(H[a+96>>2]);a=H[k+24>>2];H[a+96>>2]=l;Da(H[a+148>>2]);H[H[k+24>>2]+148>>2]=m;H[k+20>>2]=1;break o}Da(g);Da(l);Da(m);break o}H[n+4>>2]=463;H[n>>2]=1373;Ha(26080,8264,n);break o}J=x>>>1|0;z=x&-2;R=L&-2;u=q<<2;while(1){if(M>>>0>>0){p=c+u|0;r=f+u|0;q=b+u|0;t=j+u|0;if(K){La(o,m,H[j>>2],0,0,b,f,c);La(o,m,H[t>>2],H[a>>2],H[i>>2],q,r,p);p=p+4|0;r=r+4|0;q=q+4|0;t=t+4|0;c=c+4|0;f=f+4|0;j=j+4|0;b=b+4|0}A=0;while(1){if(z>>>0>A>>>0){La(o,m,H[j>>2],H[a>>2],H[i>>2],b,f,c);La(o,m,H[j+4>>2],H[a>>2],H[i>>2],b+4|0,f+4|0,c+4|0);La(o,m,H[t>>2],H[a>>2],H[i>>2],q,r,p);La(o,m,H[t+4>>2],H[a>>2],H[i>>2],q+4|0,r+4|0,p+4|0);A=A+2|0;i=i+4|0;a=a+4|0;p=p+8|0;r=r+8|0;q=q+8|0;t=t+8|0;c=c+8|0;f=f+8|0;b=b+8|0;j=j+8|0;continue}break}B:{if((x|0)==(z|0)){break B}A=H[j>>2];C:{if((G|0)==(J|0)){La(o,m,A,0,0,b,f,c);La(o,m,H[t>>2],0,0,q,r,p);break C}La(o,m,A,H[a>>2],H[i>>2],b,f,c);La(o,m,H[t>>2],H[a>>2],H[i>>2],q,r,p)}c=c+4|0;f=f+4|0;b=b+4|0;j=j+4|0;if(G>>>0<=J>>>0){break B}i=i+4|0;a=a+4|0}M=M+2|0;c=c+u|0;f=f+u|0;b=b+u|0;j=j+u|0;continue}break}D:{if(!(L&1)){break D}if(K){La(o,m,H[j>>2],0,0,b,f,c);c=c+4|0;f=f+4|0;j=j+4|0;b=b+4|0}p=0;while(1){if(p>>>0>>0){La(o,m,H[j>>2],H[a>>2],H[i>>2],b,f,c);La(o,m,H[j+4>>2],H[a>>2],H[i>>2],b+4|0,f+4|0,c+4|0);p=p+2|0;i=i+4|0;a=a+4|0;c=c+8|0;f=f+8|0;b=b+8|0;j=j+8|0;continue}break}if((x|0)==(z|0)){break D}j=H[j>>2];if((G|0)==(J|0)){La(o,m,j,0,0,b,f,c);break D}La(o,m,j,H[a>>2],H[i>>2],b,f,c)}Da(H[H[k+24>>2]+44>>2]);a=H[k+24>>2];H[a+44>>2]=h;Da(H[a+96>>2]);a=H[k+24>>2];H[a+96>>2]=g;Da(H[a+148>>2]);a=H[k+24>>2];H[a+148>>2]=l;b=H[a+8>>2];H[a+112>>2]=b;H[a+60>>2]=b;b=H[a+12>>2];H[a+116>>2]=b;H[a+64>>2]=b;b=H[a>>2];H[a+104>>2]=b;H[a+52>>2]=b;b=H[a+4>>2];H[a+108>>2]=b;H[a+56>>2]=b;H[k+20>>2]=1;p=0}f=H[n+64>>2];E:{if(d){break E}b=0;while(1){if((b|0)==(v|0)){break E}d=H[f+24>>2]+N(b,52)|0;a=H[d+24>>2];if((a|0)!=8){F:{if(a>>>0<=7){h=N(H[d+12>>2],H[d+8>>2]);g=H[d+44>>2];if(H[d+32>>2]){c=1<>2];j=a>>31<<7|a>>>25;S=l,T=Je(a<<7,j,c,0),H[S>>2]=T;i=i+1|0;continue}}a=-1<>2],0,255),ra,a,0);H[c>>2]=l;i=i+1|0;continue}}a=a-8|0;c=N(H[d+12>>2],H[d+8>>2]);h=H[d+44>>2];i=0;if(H[d+32>>2]){while(1){if((c|0)==(i|0)){break F}g=h+(i<<2)|0;H[g>>2]=H[g>>2]>>a;i=i+1|0;continue}}while(1){if((c|0)==(i|0)){break F}g=h+(i<<2)|0;H[g>>2]=H[g>>2]>>>a;i=i+1|0;continue}}H[d+24>>2]=8}b=b+1|0;continue}}a=H[f+24>>2];b=N(H[a+12>>2],H[a+8>>2]);G:{if(!p){if(H[f+20>>2]==2){if(H[f+16>>2]==1){na(H[a+44>>2],b|0);break G}if(!e){break G}ea(H[a+44>>2],H[a+96>>2],b|0);break G}da(H[a+44>>2],H[a+96>>2],H[a+148>>2],b|0);break G}H:{switch(v-1|0){case 0:ca(H[a+44>>2],b|0);break G;case 2:ba(H[a+44>>2],H[a+96>>2],H[a+148>>2],b|0);break G;case 3:break H;default:break G}}aa(H[a+44>>2],H[a+96>>2],H[a+148>>2],H[a+200>>2],b|0)}Va(H[n+64>>2]);j=0}oa=n+8320|0;return j|0}function mc(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,L=0,M=0;j=H[a>>2];a:{if(j>>>0>>0|b>>>0>=d>>>0|b>>>0>=j>>>0){break a}j=H[a+4>>2];if(j>>>0>>0|c>>>0>=e>>>0|c>>>0>=j>>>0){break a}C=(c>>>0)/K[a+12>>2]|0;s=H[a+8>>2];F=(b>>>0)/(s>>>0)|0;J=(N(s,F)-b|0)+s|0;x=c;while(1){k=H[a+12>>2];j=k;j=(c|0)==(x|0)?j-((c>>>0)%(j>>>0)|0)|0:j;u=e-x|0;r=j>>>0>>0?j:u;z=r&-4;v=r&3;L=r&-8;G=r&7;w=r-1|0;M=(g|0)==2&(r|0)==1;I=N(k-j|0,s);A=(N(x-c|0,h)<<2)+f|0;D=F;u=b;while(1){j=(b|0)==(u|0)?J:s;k=d-u|0;q=j>>>0>>0?j:k;k=s-j|0;l=D<<2;j=H[l+(H[a+24>>2]+(N(H[a+16>>2],C)<<2)|0)>>2];b:{c:{d:{e:{f:{g:{if(i){h:{i:{j:{k:{if(j){l=((I<<2)+j|0)+(k<<2)|0;j=u-b|0;if((g|0)==1){break h}m=(N(g,j)<<2)+A|0;if((q|0)==1){break i}if(M){break j}if((g|0)!=8|q>>>0<=7){break k}if(!r){break b}o=q&-4;k=0;while(1){j=0;while(1){H[(j<<5)+m>>2]=H[(j<<2)+l>>2];n=j|1;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];n=j|2;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];n=j|3;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];j=j+4|0;if(o>>>0>j>>>0){continue}break}if(j>>>0>>0){while(1){H[(j<<5)+m>>2]=H[(j<<2)+l>>2];j=j+1|0;if((q|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}if((g|0)!=1){if(!r){break b}p=q&-4;n=q&3;l=(N(u-b|0,g)<<2)+A|0;o=0;while(1){l:{if(!q){break l}m=0;j=0;k=0;if(q>>>0>=4){while(1){H[(N(g,j)<<2)+l>>2]=0;H[(N(j|1,g)<<2)+l>>2]=0;H[(N(j|2,g)<<2)+l>>2]=0;H[(N(j|3,g)<<2)+l>>2]=0;j=j+4|0;k=k+4|0;if((p|0)!=(k|0)){continue}break}}if(!n){break l}while(1){H[(N(g,j)<<2)+l>>2]=0;j=j+1|0;m=m+1|0;if((n|0)!=(m|0)){continue}break}}l=(h<<2)+l|0;o=o+1|0;if((r|0)!=(o|0)){continue}break}break b}if(!r){break b}l=q<<2;k=(u-b<<2)+A|0;o=0;if(w>>>0>=7){break g}break f}if(!r){break b}E=q&-4;p=q&3;n=0;break c}j=0;k=q&-4;if(k){while(1){H[(j<<3)+m>>2]=H[(j<<2)+l>>2];o=j|1;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];o=j|2;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];o=j|3;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];j=j+4|0;if(k>>>0>j>>>0){continue}break}}if(j>>>0>=q>>>0){break b}o=0;k=j;n=q-j&3;if(n){while(1){H[(k<<3)+m>>2]=H[(k<<2)+l>>2];k=k+1|0;o=o+1|0;if((n|0)!=(o|0)){continue}break}}if(j-q>>>0>4294967292){break b}while(1){H[(k<<3)+m>>2]=H[(k<<2)+l>>2];j=k+1|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];j=k+2|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];j=k+3|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];k=k+4|0;if((q|0)!=(k|0)){continue}break}break b}if(!r){break b}k=0;if(w>>>0>=3){while(1){H[m>>2]=H[l>>2];j=h<<2;m=j+m|0;p=l;l=s<<2;o=p+l|0;H[m>>2]=H[o>>2];m=j+m|0;o=l+o|0;H[m>>2]=H[o>>2];m=j+m|0;o=l+o|0;H[m>>2]=H[o>>2];l=l+o|0;m=j+m|0;k=k+4|0;if((z|0)!=(k|0)){continue}break}}j=0;if(!v){break b}while(1){H[m>>2]=H[l>>2];l=(s<<2)+l|0;m=(h<<2)+m|0;j=j+1|0;if((v|0)!=(j|0)){continue}break}break b}j=(j<<2)+A|0;if((q|0)!=4){if(!r){break b}m=q<<2;o=0;if(w>>>0>=3){break e}break d}if(!r){break b}o=0;if(w>>>0>=3){while(1){k=H[l+4>>2];H[j>>2]=H[l>>2];H[j+4>>2]=k;k=H[l+12>>2];H[j+8>>2]=H[l+8>>2];H[j+12>>2]=k;k=l;l=s<<2;k=k+l|0;n=H[k+12>>2];m=h<<2;j=m+j|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;k=l+k|0;n=H[k+12>>2];j=j+m|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;k=l+k|0;n=H[k+12>>2];j=j+m|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;l=l+k|0;j=j+m|0;o=o+4|0;if((z|0)!=(o|0)){continue}break}}m=0;if(!v){break b}while(1){k=H[l+4>>2];H[j>>2]=H[l>>2];H[j+4>>2]=k;k=H[l+12>>2];H[j+8>>2]=H[l+8>>2];H[j+12>>2]=k;l=(s<<2)+l|0;j=(h<<2)+j|0;m=m+1|0;if((v|0)!=(m|0)){continue}break}break b}if(!j){j=Fa(1,N(H[a+8>>2],H[a+12>>2])<<2);if(!j){return 0}H[l+(H[a+24>>2]+(N(H[a+16>>2],C)<<2)|0)>>2]=j}l=((I<<2)+j|0)+(k<<2)|0;j=u-b|0;m:{n:{o:{p:{q:{r:{if((g|0)!=1){m=(N(g,j)<<2)+A|0;if((q|0)==1){break r}if((g|0)!=8|q>>>0<=7){break q}if(!r){break b}o=q&-4;k=0;while(1){j=0;while(1){H[(j<<2)+l>>2]=H[(j<<5)+m>>2];n=j|1;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];n=j|2;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];n=j|3;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];j=j+4|0;if(o>>>0>j>>>0){continue}break}if(j>>>0>>0){while(1){H[(j<<2)+l>>2]=H[(j<<5)+m>>2];j=j+1|0;if((q|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}j=(j<<2)+A|0;if((q|0)==4){break p}if(!r){break b}m=q<<2;o=0;if(w>>>0>=3){break o}break n}if(!r){break b}o=0;if(w>>>0>=3){while(1){H[l>>2]=H[m>>2];j=s<<2;l=j+l|0;k=h<<2;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;o=o+4|0;if((z|0)!=(o|0)){continue}break}}j=0;if(!v){break b}while(1){H[l>>2]=H[m>>2];l=(s<<2)+l|0;m=(h<<2)+m|0;j=j+1|0;if((v|0)!=(j|0)){continue}break}break b}if(!r){break b}E=q&-4;p=q&3;n=0;break m}if(!r){break b}o=0;if(w>>>0>=3){while(1){k=H[j+4>>2];H[l>>2]=H[j>>2];H[l+4>>2]=k;k=H[j+12>>2];H[l+8>>2]=H[j+8>>2];H[l+12>>2]=k;m=h<<2;j=m+j|0;n=H[j+12>>2];k=l;l=s<<2;k=k+l|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;n=H[j+12>>2];k=l+k|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;n=H[j+12>>2];k=l+k|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;l=l+k|0;o=o+4|0;if((z|0)!=(o|0)){continue}break}}m=0;if(!v){break b}while(1){k=H[j+4>>2];H[l>>2]=H[j>>2];H[l+4>>2]=k;k=H[j+12>>2];H[l+8>>2]=H[j+8>>2];H[l+12>>2]=k;j=(h<<2)+j|0;l=(s<<2)+l|0;m=m+1|0;if((v|0)!=(m|0)){continue}break}break b}while(1){k=!m;if(!k){B(l,j,m)}p=j;j=h<<2;n=p+j|0;p=l;l=s<<2;p=p+l|0;if(!k){B(p,n,m)}n=j+n|0;p=l+p|0;if(!k){B(p,n,m)}n=j+n|0;p=l+p|0;if(!k){B(p,n,m)}j=j+n|0;l=l+p|0;o=o+4|0;if((z|0)!=(o|0)){continue}break}}k=0;if(!v){break b}while(1){if(m){B(l,j,m)}j=(h<<2)+j|0;l=(s<<2)+l|0;k=k+1|0;if((v|0)!=(k|0)){continue}break}break b}while(1){s:{if(!q){break s}k=0;j=0;o=0;if(q>>>0>=4){while(1){H[(j<<2)+l>>2]=H[(N(g,j)<<2)+m>>2];t=j|1;H[(t<<2)+l>>2]=H[(N(g,t)<<2)+m>>2];t=j|2;H[(t<<2)+l>>2]=H[(N(g,t)<<2)+m>>2];t=j|3;H[(t<<2)+l>>2]=H[(N(g,t)<<2)+m>>2];j=j+4|0;o=o+4|0;if((E|0)!=(o|0)){continue}break}}if(!p){break s}while(1){H[(j<<2)+l>>2]=H[(N(g,j)<<2)+m>>2];j=j+1|0;k=k+1|0;if((p|0)!=(k|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;n=n+1|0;if((r|0)!=(n|0)){continue}break}break b}while(1){j=!l;if(!j){y(k,0,l)}p=k;k=h<<2;m=p+k|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}k=k+m|0;o=o+8|0;if((L|0)!=(o|0)){continue}break}}j=0;if(!G){break b}while(1){if(l){y(k,0,l)}k=(h<<2)+k|0;j=j+1|0;if((G|0)!=(j|0)){continue}break}break b}while(1){k=!m;if(!k){B(j,l,m)}p=l;l=s<<2;n=p+l|0;p=j;j=h<<2;p=p+j|0;if(!k){B(p,n,m)}n=l+n|0;p=j+p|0;if(!k){B(p,n,m)}n=l+n|0;p=j+p|0;if(!k){B(p,n,m)}l=l+n|0;j=j+p|0;o=o+4|0;if((z|0)!=(o|0)){continue}break}}k=0;if(!v){break b}while(1){if(m){B(j,l,m)}l=(s<<2)+l|0;j=(h<<2)+j|0;k=k+1|0;if((v|0)!=(k|0)){continue}break}break b}while(1){t:{if(!q){break t}k=0;j=0;o=0;if(q>>>0>=4){while(1){H[(N(g,j)<<2)+m>>2]=H[(j<<2)+l>>2];t=j|1;H[(N(t,g)<<2)+m>>2]=H[(t<<2)+l>>2];t=j|2;H[(N(t,g)<<2)+m>>2]=H[(t<<2)+l>>2];t=j|3;H[(N(t,g)<<2)+m>>2]=H[(t<<2)+l>>2];j=j+4|0;o=o+4|0;if((E|0)!=(o|0)){continue}break}}if(!p){break t}while(1){H[(N(g,j)<<2)+m>>2]=H[(j<<2)+l>>2];j=j+1|0;k=k+1|0;if((p|0)!=(k|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;n=n+1|0;if((r|0)!=(n|0)){continue}break}}D=D+1|0;u=q+u|0;if(u>>>0>>0){continue}break}C=C+1|0;x=r+x|0;if(x>>>0>>0){continue}break}}return 1}function Qc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;h=oa-240|0;oa=h;r=1;a:{if(H[H[a>>2]+60>>2]|H[a+128>>2]){break a}b:{k=H[a+116>>2];c:{if(!k){d=H[a+120>>2];break c}f=H[b+16>>2];g=J[k+4>>1];d=H[a+120>>2];if(!(!d|!H[d+12>>2])){f=I[d+18|0]}d:{if(g){k=H[k>>2];while(1){i=k+N(e,6)|0;j=J[i>>1];if(j>>>0>=f>>>0){H[h+180>>2]=f;H[h+176>>2]=j;Ca(c,1,13715,h+176|0);r=0;break a}e:{i=J[i+4>>1];if(!i|(i|0)==65535){break e}i=i-1|0;if(i>>>0>>0){break e}H[h+164>>2]=f;H[h+160>>2]=i;Ca(c,1,13715,h+160|0);r=0;break a}e=e+1|0;if((g|0)!=(e|0)){continue}break}break d}if(f){break b}break c}while(1){f=f-1|0;e=0;while(1){if(J[k+N(e,6)>>1]!=(f|0)){e=e+1|0;if((g|0)!=(e|0)){continue}break b}break}if(f){continue}break}}f:{if(!d){break f}k=H[d+12>>2];if(!k){break f}g:{d=I[d+18|0];h:{if(d){e=0;j=1;while(1){g=H[b+16>>2];f=J[k+(e<<2)>>1];if(g>>>0<=f>>>0){H[h+148>>2]=g;H[h+144>>2]=f;Ca(c,1,13715,h+144|0);j=0}e=e+1|0;if((d|0)!=(e|0)){continue}break}g=Fa(d,4);if(!g){break h}e=0;while(1){f=k+(e<<2)|0;i=I[f+2|0];i:{if(i>>>0>=2){H[h+68>>2]=i;H[h+64>>2]=e;Ca(c,1,12094,h- -64|0);j=0;break i}f=I[f+3|0];if(f>>>0>=d>>>0){H[h+128>>2]=f;Ca(c,1,12038,h+128|0);j=0;break i}l=(i|0)!=1;m=(f<<2)+g|0;if(!(l|!H[m>>2])){H[h+80>>2]=f;Ca(c,1,11527,h+80|0);j=0;break i}if(!(i|!f)){H[h+100>>2]=f;H[h+96>>2]=e;Ca(c,1,11901,h+96|0);j=0;break i}if(!(l|(e|0)==(f|0))){H[h+120>>2]=f;H[h+116>>2]=e;H[h+112>>2]=e;Ca(c,1,11937,h+112|0);j=0;break i}H[m>>2]=1}e=e+1|0;if((d|0)!=(e|0)){continue}break}j=!j;e=0;while(1){j:{f=e<<2;if(I[(f+k|0)+2|0]?H[f+g>>2]:1){e=e+1|0;if((d|0)!=(e|0)){continue}if(j&1){break j}if(H[b+16>>2]!=1){break g}e=0;while(1){if(H[(e<<2)+g>>2]){e=e+1|0;if((d|0)!=(e|0)){continue}break g}break}i=0;Ca(c,2,9253,0);e=0;if(d>>>0>=4){j=d&252;f=0;while(1){m=k+(e<<2)|0;F[m+3|0]=e;F[m+2|0]=1;m=e|1;l=k+(m<<2)|0;F[l+3|0]=m;F[l+2|0]=1;m=e|2;l=k+(m<<2)|0;F[l+3|0]=m;F[l+2|0]=1;m=e|3;l=k+(m<<2)|0;F[l+3|0]=m;F[l+2|0]=1;e=e+4|0;f=f+4|0;if((j|0)!=(f|0)){continue}break}}d=d&3;if(!d){break g}while(1){f=k+(e<<2)|0;F[f+3|0]=e;F[f+2|0]=1;e=e+1|0;i=i+1|0;if((d|0)!=(i|0)){continue}break}break g}H[h+48>>2]=e;j=1;Ca(c,1,11101,h+48|0);e=e+1|0;if((d|0)!=(e|0)){continue}}break}Da(g);r=0;break a}g=Fa(d,4);if(g){break g}}r=0;Ca(c,1,12285,0);break a}Da(g)}d=H[a+120>>2];k:{if(!d){break k}t=H[d+12>>2];if(!t){Da(H[d+4>>2]);Da(H[H[a+120>>2]+8>>2]);Da(H[H[a+120>>2]>>2]);d=H[a+120>>2];g=H[d+12>>2];if(g){Da(g);d=H[a+120>>2]}Da(d);H[a+120>>2]=0;break k}m=H[b+24>>2];l:{k=I[d+18|0];m:{if(k){v=H[d>>2];j=H[d+4>>2];l=H[d+8>>2];e=0;n:{while(1){if(H[(m+N(J[t+(e<<2)>>1],52)|0)+44>>2]){e=e+1|0;if((k|0)!=(e|0)){continue}break n}break}H[h+32>>2]=e;Ca(c,1,13877,h+32|0);r=0;break a}g=Ga(N(k,52));if(!g){break m}i=0;while(1){d=t+(i<<2)|0;e=J[d>>1];f=N(I[d+2|0]?I[d+3|0]:i,52)+g|0;d=m+N(e,52)|0;e=H[d+4>>2];H[f>>2]=H[d>>2];H[f+4>>2]=e;H[f+48>>2]=H[d+48>>2];e=H[d+44>>2];H[f+40>>2]=H[d+40>>2];H[f+44>>2]=e;e=H[d+36>>2];H[f+32>>2]=H[d+32>>2];H[f+36>>2]=e;e=H[d+28>>2];H[f+24>>2]=H[d+24>>2];H[f+28>>2]=e;e=H[d+20>>2];H[f+16>>2]=H[d+16>>2];H[f+20>>2]=e;e=H[d+12>>2];H[f+8>>2]=H[d+8>>2];H[f+12>>2]=e;f=N(i,52)+g|0;d=Ja(N(H[d+8>>2],H[d+12>>2])<<2);H[f+44>>2]=d;if(!d){if(i){a=i&65535;while(1){Da(H[(N(a,52)+g|0)-8>>2]);a=a-1|0;if(a){continue}break}}Da(g);r=0;Ca(c,1,13825,0);break a}H[f+24>>2]=I[i+l|0];H[f+32>>2]=I[i+j|0];i=i+1|0;if((k|0)!=(i|0)){continue}break}u=J[H[a+120>>2]+16>>1];n=u-1|0;while(1){d=N(o,52)+g|0;i=N(H[d+12>>2],H[d+8>>2]);f=t+(o<<2)|0;e=H[(m+N(J[f>>1],52)|0)+44>>2];o:{if(!I[f+2|0]){if(!i){break o}l=H[d+44>>2];j=0;f=0;if(i>>>0>=4){q=i&-4;d=0;while(1){p=f<<2;H[p+l>>2]=H[e+p>>2];s=p|4;H[s+l>>2]=H[e+s>>2];s=p|8;H[s+l>>2]=H[e+s>>2];p=p|12;H[p+l>>2]=H[e+p>>2];f=f+4|0;d=d+4|0;if((q|0)!=(d|0)){continue}break}}d=i&3;if(!d){break o}while(1){i=f<<2;H[i+l>>2]=H[e+i>>2];f=f+1|0;j=j+1|0;if((d|0)!=(j|0)){continue}break}break o}if(!i){break o}d=I[f+3|0];j=(d<<2)+v|0;l=H[(N(d,52)+g|0)+44>>2];f=0;if((i|0)!=1){s=i&-2;d=0;while(1){q=f<<2;p=H[q+e>>2];H[l+q>>2]=H[j+(N(k,(p|0)>=0?(p|0)<(u|0)?p:n:0)<<2)>>2];q=q|4;p=H[q+e>>2];H[l+q>>2]=H[j+(N(k,(p|0)>=0?(p|0)<(u|0)?p:n:0)<<2)>>2];f=f+2|0;d=d+2|0;if((s|0)!=(d|0)){continue}break}}if(!(i&1)){break o}f=f<<2;d=H[f+e>>2];H[f+l>>2]=H[j+(N(k,(d|0)>=0?(d|0)<(u|0)?d:n:0)<<2)>>2]}o=o+1|0;if((k|0)!=(o|0)){continue}break}break l}g=Ga(N(k,52));if(g){break l}}r=0;Ca(c,1,13825,0);break a}d=H[b+16>>2];if(d){e=0;while(1){f=H[(m+N(e,52)|0)+44>>2];if(f){Da(f)}e=e+1|0;if((d|0)!=(e|0)){continue}break}}Da(m);H[b+16>>2]=k;H[b+24>>2]=g}e=H[a+116>>2];if(!e){break a}j=H[e>>2];l=J[e+4>>1];if(l){t=j+6|0;e=0;u=l-2&65535;i=1;while(1){d=H[b+16>>2];p=N(e,6)+j|0;f=J[p>>1];p:{if(d>>>0<=f>>>0){H[h+20>>2]=d;H[h+16>>2]=f;Ca(c,2,7334,h+16|0);break p}g=J[p+4>>1];if((g+1&65535)>>>0<=1){G[(H[b+24>>2]+N(f,52)|0)+48>>1]=J[p+2>>1];break p}k=g-1|0;m=k&65535;if(m>>>0>=d>>>0){H[h+4>>2]=d;H[h>>2]=m;Ca(c,2,7293,h);break p}q:{if(J[p+2>>1]|(f|0)==(m|0)){break q}g=H[b+24>>2];d=g+N(f,52)|0;H[h+232>>2]=H[d+48>>2];n=H[d+44>>2];H[h+224>>2]=H[d+40>>2];H[h+228>>2]=n;n=H[d+36>>2];H[h+216>>2]=H[d+32>>2];H[h+220>>2]=n;n=H[d+28>>2];H[h+208>>2]=H[d+24>>2];H[h+212>>2]=n;n=H[d+20>>2];H[h+200>>2]=H[d+16>>2];H[h+204>>2]=n;n=H[d+12>>2];H[h+192>>2]=H[d+8>>2];H[h+196>>2]=n;n=H[d+4>>2];H[h+184>>2]=H[d>>2];H[h+188>>2]=n;n=N(m,52);g=n+g|0;H[d+48>>2]=H[g+48>>2];o=H[g+44>>2];H[d+40>>2]=H[g+40>>2];H[d+44>>2]=o;o=H[g+36>>2];H[d+32>>2]=H[g+32>>2];H[d+36>>2]=o;o=H[g+28>>2];H[d+24>>2]=H[g+24>>2];H[d+28>>2]=o;o=H[g+20>>2];H[d+16>>2]=H[g+16>>2];H[d+20>>2]=o;o=H[g+12>>2];H[d+8>>2]=H[g+8>>2];H[d+12>>2]=o;o=H[g+4>>2];H[d>>2]=H[g>>2];H[d+4>>2]=o;g=H[h+188>>2];d=n+H[b+24>>2]|0;H[d>>2]=H[h+184>>2];H[d+4>>2]=g;H[d+48>>2]=H[h+232>>2];g=H[h+228>>2];H[d+40>>2]=H[h+224>>2];H[d+44>>2]=g;g=H[h+220>>2];H[d+32>>2]=H[h+216>>2];H[d+36>>2]=g;g=H[h+212>>2];H[d+24>>2]=H[h+208>>2];H[d+28>>2]=g;g=H[h+204>>2];H[d+16>>2]=H[h+200>>2];H[d+20>>2]=g;g=H[h+196>>2];H[d+8>>2]=H[h+192>>2];H[d+12>>2]=g;if(l>>>0<=e+1>>>0){break q}g=i;if(!(e-l&1)){g=k;d=N(i,6)+j|0;n=J[d>>1];r:{if((n|0)!=(f|0)){g=f;if((n|0)!=(m|0)){break r}}G[d>>1]=g}g=i+1|0}if((u|0)==(e&65535)){break q}while(1){d=k;n=N(g,6);o=n+j|0;q=J[o>>1];s:{if((q|0)!=(f|0)){d=f;if((m|0)!=(q|0)){break s}}G[o>>1]=d}d=k;n=n+t|0;o=J[n>>1];t:{if((o|0)!=(f|0)){d=f;if((m|0)!=(o|0)){break t}}G[n>>1]=d}g=g+2|0;if((l|0)!=(g&65535)){continue}break}}G[(H[b+24>>2]+N(f,52)|0)+48>>1]=J[p+2>>1]}i=i+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}e=H[a+116>>2];j=H[e>>2]}if(j){Da(j);e=H[a+116>>2]}Da(e);H[a+116>>2]=0;break a}r=0;Ca(c,1,9499,0)}oa=h+240|0;return r}function $c(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=O(0),p=0;k=oa-48|0;oa=k;H[a+8>>2]=1;a:{b:{d=k+40|0;c:{if((Ka(b,d,2,c)|0)!=2){break c}Ea(d,k+44|0,2);if(H[k+44>>2]!=65359){break c}H[a+8>>2]=2;d=H[b+56>>2];e=d-2|0;d=H[b+60>>2]-(d>>>0<2)|0;g=H[a+224>>2];H[g>>2]=e;H[g+4>>2]=d;H[k+16>>2]=e;H[k+20>>2]=d;Ca(c,4,12769,k+16|0);f=H[a+224>>2];j=H[f>>2];e=H[f+24>>2];d=e+1|0;g=H[f+32>>2];if(d>>>0<=g>>>0){g=H[f+28>>2];break b}o=O(O(g>>>0)+O(100));if(o=O(0)){d=~~o>>>0}else{d=0}H[f+32>>2]=d;g=Ia(H[f+28>>2],N(d,24));if(g){H[f+28>>2]=g;e=H[f+24>>2];d=e+1|0;break b}Da(H[f+28>>2]);H[f+32>>2]=0;H[f+24>>2]=0;H[f+28>>2]=0;Ca(c,1,3899,0)}Ca(c,1,15656,0);a=0;break a}e=N(e,24)+g|0;H[e+16>>2]=2;H[e+8>>2]=j;H[e+12>>2]=j>>31;G[e>>1]=65359;H[f+24>>2]=d;if((Ka(b,H[a+16>>2],2,c)|0)!=2){Ca(c,1,2472,0);a=0;break a}Ea(H[a+16>>2],k+40|0,2);d:{e:{g=H[k+40>>2];if((g|0)!=65424){while(1){e=24912;if(g>>>0<=65279){H[k>>2]=g;Ca(c,1,2268,k);a=0;break a}while(1){d=e;f=H[d>>2];if(f){e=d+12|0;if((f|0)!=(g|0)){continue}}break}f:{g:{if(f){break g}h=2;Ca(c,2,3847,0);e=2472;h:{i:{if((Ka(b,H[a+16>>2],2,c)|0)!=2){break i}while(1){Ea(H[a+16>>2],k+44|0,2);f=24912;g=H[k+44>>2];if(g>>>0>=65280){while(1){d=f;i=H[d>>2];if(i){f=d+12|0;if((g|0)!=(i|0)){continue}}break}if(!(H[d+4>>2]&H[a+8>>2])){e=5397;break i}if(i){if((i|0)==65424){H[k+40>>2]=65424;break f}j=H[b+56>>2];f=H[a+224>>2];g=H[f+24>>2];e=g+1|0;d=H[f+32>>2];if(e>>>0<=d>>>0){d=H[f+28>>2];break h}o=O(O(d>>>0)+O(100));if(o=O(0)){d=~~o>>>0}else{d=0}H[f+32>>2]=d;d=Ia(H[f+28>>2],N(d,24));if(d){H[f+28>>2]=d;g=H[f+24>>2];e=g+1|0;break h}Da(H[f+28>>2]);H[f+32>>2]=0;H[f+24>>2]=0;H[f+28>>2]=0;e=3899;break i}h=h+2|0}if((Ka(b,H[a+16>>2],2,c)|0)==2){continue}break}}Ca(c,1,e,0);Ca(c,1,9847,0);a=0;break a}d=N(g,24)+d|0;H[d+16>>2]=h;g=j-h|0;H[d+8>>2]=g;H[d+12>>2]=g>>31;G[d>>1]=0;H[f+24>>2]=e;H[k+40>>2]=i;g=24912;if((i|0)==65424){break f}while(1){d=g;f=H[d>>2];if(!f){break g}g=d+12|0;if((f|0)!=(i|0)){continue}break}}if(!(H[d+4>>2]&H[a+8>>2])){Ca(c,1,5397,0);a=0;break a}if((Ka(b,H[a+16>>2],2,c)|0)!=2){Ca(c,1,2472,0);a=0;break a}Ea(H[a+16>>2],k+36|0,2);e=H[k+36>>2];if(e>>>0<=1){Ca(c,1,6074,0);a=0;break a}e=e-2|0;H[k+36>>2]=e;g=H[a+16>>2];if(K[a+20>>2]>>0){g=Ia(g,e);if(!g){Da(H[a+16>>2]);H[a+16>>2]=0;H[a+20>>2]=0;Ca(c,1,4973,0);a=0;break a}H[a+16>>2]=g;e=H[k+36>>2];H[a+20>>2]=e}e=Ka(b,g,e,c);if((e|0)!=H[k+36>>2]){Ca(c,1,2472,0);a=0;break a}if(!(sa[H[d+8>>2]](a,H[a+16>>2],e,c)|0)){Ca(c,1,2490,0);a=0;break a}j=H[b+56>>2];i=H[k+36>>2];d=H[a+224>>2];g=H[d+24>>2];h=g+1|0;e=H[d+32>>2];j:{if(h>>>0<=e>>>0){e=H[d+28>>2];break j}o=O(O(e>>>0)+O(100));if(o=O(0)){e=~~o>>>0}else{e=0}H[d+32>>2]=e;e=Ia(H[d+28>>2],N(e,24));if(!e){break d}H[d+28>>2]=e;g=H[d+24>>2];h=g+1|0}e=N(g,24)+e|0;H[e+16>>2]=i+4;g=(j-i|0)-4|0;H[e+8>>2]=g;H[e+12>>2]=g>>31;G[e>>1]=f;H[d+24>>2]=h;if((Ka(b,H[a+16>>2],2,c)|0)!=2){Ca(c,1,2472,0);a=0;break a}m=(f|0)==65372?1:m;l=(f|0)==65362?1:l;n=(f|0)==65361?1:n;Ea(H[a+16>>2],k+40|0,2);g=H[k+40>>2];if((g|0)!=65424){continue}}break}if(n){break e}}Ca(c,1,4785,0);a=0;break a}if(!l){Ca(c,1,4831,0);a=0;break a}if(!m){Ca(c,1,4877,0);a=0;break a}d=0;e=0;h=0;j=oa-16|0;oa=j;m=1;k:{if(!(F[a+212|0]&1)){break k}l:{f=H[a+136>>2];if(!f){break l}m:{while(1){g=H[a+140>>2]+(h<<3)|0;l=H[g>>2];if(l){i=H[g+4>>2];g=d-i|0;g=d>>>0>=g>>>0?g:0;if(d>>>0>>0){f=i-d|0;l=d+l|0;while(1){if(f>>>0<4){d=5671;break m}Ea(l,j+12|0,4);d=H[j+12>>2];if((d^-1)>>>0>>0){d=5645;break m}i=f-4|0;n=i>>>0>>0;g=n?d-i|0:g;e=d+e|0;f=i-d|0;l=((n?0:d)+l|0)+4|0;if(d>>>0>>0){continue}break}f=H[a+136>>2]}d=g}h=h+1|0;if(h>>>0>>0){continue}break}if(!d){break l}m=0;Ca(c,1,3067,0);break k}m=0;Ca(c,1,d,0);break k}d=Ga(e);H[a+160>>2]=d;if(!d){m=0;Ca(c,1,4337,0);break k}H[a+148>>2]=e;h=H[a+140>>2];n:{f=H[a+136>>2];if(f){e=0;d=0;g=0;while(1){l=g<<3;n=l+h|0;i=H[n>>2];if(i){h=H[a+160>>2]+d|0;f=H[n+4>>2];o:{if(f>>>0<=e>>>0){if(f){B(h,i,f)}d=d+f|0;e=e-f|0;break o}if(e){B(h,i,e)}d=d+e|0;h=f-e|0;e=e+i|0;while(1){if(h>>>0<4){break n}Ea(e,j+8|0,4);e=e+4|0;i=H[a+160>>2]+d|0;f=h-4|0;h=H[j+8>>2];if(f>>>0>>0){if(f){B(i,e,f)}d=d+f|0;e=H[j+8>>2]-f|0;break o}if(h){B(i,e,h)}h=H[j+8>>2];d=h+d|0;e=e+h|0;h=f-h|0;if(h){continue}break}e=0}Da(H[l+H[a+140>>2]>>2]);h=H[a+140>>2];f=l+h|0;H[f>>2]=0;H[f+4>>2]=0;f=H[a+136>>2]}g=g+1|0;if(g>>>0>>0){continue}break}e=H[a+148>>2];d=H[a+160>>2]}H[a+168>>2]=e;H[a+144>>2]=d;H[a+136>>2]=0;Da(h);H[a+140>>2]=0;break k}m=0;Ca(c,1,5671,0)}oa=j+16|0;if(!m){Ca(c,1,8085,0);a=0;break a}Ca(c,4,11754,0);d=H[a+224>>2];e=H[b+56>>2];e=e-2|0;H[d+8>>2]=e;H[d+12>>2]=0;b=0;h=0;i=oa-16|0;oa=i;g=H[a+68>>2];p:{if(!g){H[a+76>>2]=1;break p}if(H[a+76>>2]){break p}d=H[a+72>>2];j=H[a+224>>2];e=H[j+40>>2];if((g|0)!=1){m=d+8|0;l=g&-2;while(1){n=b<<3;p=J[n+d>>1];f=e+N(p,40)|0;H[f>>2]=p;H[f+8>>2]=H[f+8>>2]+1;n=J[m+n>>1];f=e+N(n,40)|0;H[f>>2]=n;H[f+8>>2]=H[f+8>>2]+1;b=b+2|0;h=h+2|0;if((l|0)!=(h|0)){continue}break}}if(g&1){f=J[(b<<3)+d>>1];b=e+N(f,40)|0;H[b>>2]=f;H[b+8>>2]=H[b+8>>2]+1}f=H[j+36>>2];q:{if(f){b=0;while(1){if(!H[(e+N(b,40)|0)+8>>2]){H[i>>2]=b;Ca(c,1,9304,i);break q}b=b+1|0;if((f|0)!=(b|0)){continue}break}}f=H[j+8>>2];b=H[j+12>>2];e=0;while(1){r:{l=e<<3;m=H[H[a+224>>2]+40>>2]+N(J[l+d>>1],40)|0;h=H[m+16>>2];if(!h){h=Fa(H[m+8>>2],24);H[m+16>>2]=h;if(!h){break r}g=H[a+68>>2];d=H[a+72>>2]}p=h;h=H[m+4>>2];j=p+N(h,24)|0;H[j>>2]=f;H[j+4>>2]=b;l=H[(d+l|0)+4>>2];f=l+f|0;H[j+16>>2]=f;b=f>>>0>>0?b+1|0:b;H[j+20>>2]=b;H[m+4>>2]=h+1;e=e+1|0;if(g>>>0>e>>>0){continue}break p}break}Ca(c,1,6882,0)}H[a+76>>2]=1;if(!H[a+68>>2]){break p}d=H[H[a+224>>2]+40>>2];b=0;while(1){c=N(J[H[a+72>>2]+(b<<3)>>1],40);d=c+d|0;H[d+8>>2]=0;Da(H[d+16>>2]);d=H[H[a+224>>2]+40>>2];H[(c+d|0)+16>>2]=0;b=b+1|0;if(b>>>0>2]){continue}break}}oa=i+16|0;H[a+8>>2]=8;a=1;break a}Da(H[d+28>>2]);H[d+32>>2]=0;H[d+24>>2]=0;H[d+28>>2]=0;Ca(c,1,3899,0);a=0}oa=k+48|0;return a|0}function ve(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;f=oa-160|0;oa=f;a:{if(c>>>0<=35){c=0;Ca(d,1,6095,0);break a}c=c-36|0;h=(c>>>0)/3|0;if((N(h,3)|0)!=(c|0)){c=0;Ca(d,1,6095,0);break a}j=H[a+96>>2];c=f+156|0;Ea(b,c,2);G[a+104>>1]=H[f+156>>2];Ea(b+2|0,j+8|0,4);Ea(b+6|0,j+12|0,4);Ea(b+10|0,j,4);Ea(b+14|0,j+4|0,4);Ea(b+18|0,a+116|0,4);Ea(b+22|0,a+120|0,4);Ea(b+26|0,a+108|0,4);Ea(b+30|0,a+112|0,4);Ea(b+34|0,c,2);b:{c:{d:{c=H[f+156>>2];if(c>>>0<=16384){H[j+16>>2]=c;if((c|0)!=(h|0)){H[f+132>>2]=h;H[f+128>>2]=c;Ca(d,1,14980,f+128|0);c=0;break a}c=H[j+4>>2];g=H[j+12>>2];l=H[j+8>>2];e=H[j>>2];if(!(c>>>0>>0&l>>>0>e>>>0)){H[f+120>>2]=g-c;H[f+124>>2]=0-(c>>>0>g>>>0);H[f+112>>2]=l-e;H[f+116>>2]=0-(e>>>0>l>>>0);Ca(d,1,14542,f+112|0);c=0;break a}i=H[a+116>>2];k=H[a+120>>2];if(!(k?i:0)){H[f+4>>2]=k;H[f>>2]=i;Ca(d,1,15094,f);c=0;break a}e:{n=H[a+108>>2];f:{if(n>>>0>e>>>0){break f}i=i+n|0;if(e>>>0>=(i>>>0>>0?-1:i)>>>0){break f}i=H[a+112>>2];if(i>>>0>c>>>0){break f}k=i+k|0;if(c>>>0<(i>>>0>k>>>0?-1:k)>>>0){break e}}c=0;Ca(d,1,2792,0);break a}g:{if(H[a+248>>2]){break g}i=H[a+240>>2];if(!i){break g}k=H[a+244>>2];if(!k){break g}e=l-e|0;c=g-c|0;if((e|0)==(i|0)&(c|0)==(k|0)){break g}H[f+108>>2]=c;H[f+104>>2]=e;H[f+100>>2]=k;H[f+96>>2]=i;Ca(d,1,14006,f+96|0);c=0;break a}e=Fa(h,52);H[j+24>>2]=e;if(!e){break d}h:{if(!H[j+16>>2]){break h}c=f+152|0;Ea(b+36|0,c,1);h=H[f+152>>2];k=h>>>7|0;H[e+32>>2]=k;n=(h&127)+1|0;H[e+24>>2]=n;l=H[a+248>>2];Ea(b+37|0,c,1);H[e>>2]=H[f+152>>2];Ea(b+38|0,c,1);g=H[f+152>>2];H[e+4>>2]=g;c=0;i=H[e>>2];if(i-256>>>0<4294967041){h=0;break b}h=0;if(g-256>>>0<4294967041){break b}g=H[e+24>>2];if(g>>>0>31){break c}H[e+36>>2]=0;H[e+40>>2]=H[a+184>>2];h=1;if(K[j+16>>2]<=1){break h}k=l?0:k;l=l?0:n;b=b+39|0;while(1){Ea(b,f+152|0,1);i=H[f+152>>2];g=i>>>7|0;H[e+84>>2]=g;i=(i&127)+1|0;H[e+76>>2]=i;if(!(H[a+248>>2]|(I[a+212|0]&4|(i|0)==(l|0)&(g|0)==(k|0)))){H[f+84>>2]=g;H[f+80>>2]=i;H[f+76>>2]=h;H[f+72>>2]=k;H[f+68>>2]=l;H[f+64>>2]=h;Ca(d,2,14778,f- -64|0)}g=f+152|0;Ea(b+1|0,g,1);H[e+52>>2]=H[f+152>>2];Ea(b+2|0,g,1);g=H[f+152>>2];H[e+56>>2]=g;i=H[e+52>>2];if(i-256>>>0<4294967041|g-256>>>0<=4294967040){break b}g=H[e+76>>2];if(g>>>0>=32){break c}b=b+3|0;H[e+88>>2]=0;H[e+92>>2]=H[a+184>>2];e=e+52|0;h=h+1|0;if(h>>>0>2]){continue}break}}c=0;h=H[a+116>>2];if(!h){break a}g=H[a+120>>2];if(!g){break a}l=0-!h|0;e=l;p=H[a+108>>2];k=H[j+8>>2]-p|0;i=h-1|0;b=k+i|0;e=k>>>0>b>>>0?e+1|0:e;b=Ke(b,e,h,0);H[a+128>>2]=b;n=0-!g|0;e=n;q=H[a+112>>2];o=H[j+12>>2]-q|0;m=o;k=g-1|0;o=o+k|0;e=m>>>0>o>>>0?e+1|0:e;e=Ke(o,e,g,0);H[a+132>>2]=e;i:{if(!(!b|!e)){if(b>>>0<=65535/(e>>>0)>>>0){break i}}H[f+20>>2]=e;H[f+16>>2]=b;Ca(d,1,14120,f+16|0);break a}o=N(b,e);j:{if(I[a+92|0]&2){H[a+28>>2]=(H[a+28>>2]-p>>>0)/(h>>>0);H[a+32>>2]=(H[a+32>>2]-q>>>0)/(g>>>0);e=l;b=H[a+36>>2]-p|0;m=b;b=b+i|0;e=m>>>0>b>>>0?e+1|0:e;v=a,w=Ke(b,e,h,0),H[v+36>>2]=w;e=n;b=H[a+40>>2]-q|0;m=b;b=b+k|0;e=m>>>0>b>>>0?e+1|0:e;v=a,w=Ke(b,e,g,0),H[v+40>>2]=w;break j}H[a+40>>2]=e;H[a+36>>2]=b;H[a+28>>2]=0;H[a+32>>2]=0}b=Fa(o,5644);H[a+180>>2]=b;if(!b){Ca(d,1,3935,0);break a}b=Fa(H[j+16>>2],1080);H[H[a+12>>2]+5584>>2]=b;if(!H[H[a+12>>2]+5584>>2]){Ca(d,1,3935,0);break a}b=Fa(10,20);H[H[a+12>>2]+5616>>2]=b;b=H[a+12>>2];if(!H[b+5616>>2]){Ca(d,1,3935,0);break a}H[b+5624>>2]=10;b=Fa(10,20);H[H[a+12>>2]+5628>>2]=b;b=H[a+12>>2];if(!H[b+5628>>2]){Ca(d,1,3935,0);break a}H[b+5636>>2]=10;h=H[j+16>>2];k:{if(!h){break k}g=H[j+24>>2];b=0;if((h|0)!=1){l=h&-2;e=0;while(1){i=g+N(b,52)|0;if(!H[i+32>>2]){H[(H[H[a+12>>2]+5584>>2]+N(b,1080)|0)+1076>>2]=1<>2]-1}i=b|1;k=g+N(i,52)|0;if(!H[k+32>>2]){H[(H[H[a+12>>2]+5584>>2]+N(i,1080)|0)+1076>>2]=1<>2]-1}b=b+2|0;e=e+2|0;if((l|0)!=(e|0)){continue}break}}if(!(h&1)){break k}e=g+N(b,52)|0;if(H[e+32>>2]){break k}H[(H[H[a+12>>2]+5584>>2]+N(b,1080)|0)+1076>>2]=1<>2]-1}if(o){b=H[a+180>>2];e=0;while(1){h=Fa(H[j+16>>2],1080);H[b+5584>>2]=h;if(!h){Ca(d,1,3935,0);break a}b=b+5644|0;e=e+1|0;if(o>>>0>e>>>0){continue}break}}b=N(H[a+132>>2],H[a+128>>2]);H[H[a+224>>2]+36>>2]=b;b=Fa(b,40);d=H[a+224>>2];H[d+40>>2]=b;e=0;l:{if(!b){break l}e=1;if(!H[d+36>>2]){break l}d=0;while(1){m:{e=0;g=N(d,40);b=g+b|0;H[b+20>>2]=0;H[b+28>>2]=100;h=Fa(100,24);l=H[a+224>>2];b=H[l+40>>2];H[(g+b|0)+24>>2]=h;if(!h){break m}e=1;d=d+1|0;if(d>>>0>2]){continue}}break}}if(!e){break a}H[a+8>>2]=4;r=H[j+16>>2];if(r){b=H[a+112>>2];d=H[a+120>>2];c=b+N(d,H[a+132>>2]-1|0)|0;d=c+d|0;c=c>>>0>d>>>0?-1:d;d=H[j+12>>2];c=c>>>0>>0?c:d;l=c-1|0;k=0-!c|0;c=H[a+108>>2];d=H[a+116>>2];a=c+N(d,H[a+128>>2]-1|0)|0;d=a+d|0;a=a>>>0>d>>>0?-1:d;d=H[j+8>>2];a=a>>>0>>0?a:d;i=a-1|0;n=0-!a|0;a=H[j+4>>2];b=a>>>0>>0?b:a;o=b-1|0;p=0-!b|0;a=H[j>>2];b=a>>>0>>0?c:a;q=b-1|0;u=0-!b|0;a=H[j+24>>2];b=0;while(1){e=p;d=H[a+4>>2];c=d+o|0;j=Ke(c,c>>>0>>0?e+1|0:e,d,0);H[a+20>>2]=j;e=u;h=H[a>>2];c=h+q|0;s=Ke(c,c>>>0>>0?e+1|0:e,h,0);H[a+16>>2]=s;c=H[a+40>>2];g=c&31;if((c&63)>>>0>=32){e=-1<>>32-g}g=m^-1;e=e^-1;m=e;e=k;t=d+l|0;e=t>>>0>>0?e+1|0:e;e=Ke(t,e,d,0)-j|0;d=m;j=e;e=e+g|0;d=j>>>0>e>>>0?d+1|0:d;j=e;e=c&31;if((c&63)>>>0>=32){d=d>>>e|0}else{d=((1<>>e}H[a+12>>2]=d;e=n;d=h+i|0;e=d>>>0>>0?e+1|0:e;d=Ke(d,e,h,0)-s|0;e=m;d=d+g|0;e=d>>>0>>0?e+1|0:e;h=d;d=c&31;if((c&63)>>>0>=32){c=e>>>d|0}else{c=((1<>>d}H[a+8>>2]=c;a=a+52|0;b=b+1|0;if((r|0)!=(b|0)){continue}break}}c=1;break a}H[f+144>>2]=c;Ca(d,1,7932,f+144|0);c=0;break a}c=0;H[j+16>>2]=0;Ca(d,1,3935,0);break a}H[f+52>>2]=g;H[f+48>>2]=h;Ca(d,1,15402,f+48|0);break a}H[f+40>>2]=g;H[f+36>>2]=i;H[f+32>>2]=h;Ca(d,1,14340,f+32|0)}oa=f+160|0;return c|0}function Fc(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;j=oa+-64|0;oa=j;H[j+60>>2]=b;z=j+39|0;t=j+40|0;a:{b:{c:{d:{e:while(1){h=0;f:while(1){k=b;if((o^2147483647)<(h|0)){break d}o=h+o|0;g:{h:{i:{j:{h=b;i=I[h|0];if(i){while(1){k:{b=i&255;l:{if(!b){b=h;break l}if((b|0)!=37){break k}i=h;while(1){if(I[i+1|0]!=37){b=i;break l}h=h+1|0;n=I[i+2|0];b=i+2|0;i=b;if((n|0)==37){continue}break}}h=h-k|0;y=o^2147483647;if((h|0)>(y|0)){break d}if(a){Ma(a,k,h)}if(h){continue f}H[j+60>>2]=b;h=b+1|0;q=-1;i=F[b+1|0]-48|0;if(!(I[b+2|0]!=36|i>>>0>9)){x=1;q=i;h=b+3|0}H[j+60>>2]=h;l=0;i=F[h|0];b=i-32|0;m:{if(b>>>0>31){n=h;break m}n=h;b=1<>2]=n;l=b|l;i=F[h+1|0];b=i-32|0;if(b>>>0>=32){break m}h=n;b=1<>>0>9)){p:{if(!a){H[(b<<2)+e>>2]=10;b=0;break p}b=H[(b<<3)+d>>2]}p=b;b=n+3|0;i=1;break o}if(x){break j}b=n+1|0;if(!a){H[j+60>>2]=b;x=0;p=0;break n}h=H[c>>2];H[c>>2]=h+4;p=H[h>>2];i=0}x=i;H[j+60>>2]=b;if((p|0)>=0){break n}p=0-p|0;l=l|8192;break n}p=Ec(j+60|0);if((p|0)<0){break d}b=H[j+60>>2]}h=0;m=-1;u=0;q:{if(I[b|0]!=46){break q}if(I[b+1|0]==42){i=F[b+2|0]-48|0;r:{if(!(I[b+3|0]!=36|i>>>0>9)){b=b+4|0;s:{if(!a){H[(i<<2)+e>>2]=10;m=0;break s}m=H[(i<<3)+d>>2]}break r}if(x){break j}b=b+2|0;m=0;if(!a){break r}i=H[c>>2];H[c>>2]=i+4;m=H[i>>2]}H[j+60>>2]=b;u=(m|0)>=0;break q}H[j+60>>2]=b+1;m=Ec(j+60|0);b=H[j+60>>2];u=1}while(1){v=h;n=28;r=b;i=F[b|0];if(i-123>>>0<4294967238){break c}b=b+1|0;h=I[(i+N(h,58)|0)+25263|0];if((h-1&255)>>>0<8){continue}break}H[j+60>>2]=b;t:{if((h|0)!=27){if(!h){break c}if((q|0)>=0){if(!a){H[(q<<2)+e>>2]=h;continue e}h=(q<<3)+d|0;i=H[h+4>>2];H[j+48>>2]=H[h>>2];H[j+52>>2]=i;break t}if(!a){break g}Dc(j+48|0,h,c,g);break t}if((q|0)>=0){break c}h=0;if(!a){continue f}}if(I[a|0]&32){break b}i=l&-65537;l=l&8192?i:l;q=0;w=1072;n=t;u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{r=I[r|0];h=r<<24>>24;h=v?(r&15)==3?h&-45:h:h;switch(h-88|0){case 0:case 32:break G;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 10:case 16:case 18:case 19:case 20:case 21:case 25:case 26:case 28:case 30:case 31:break h;case 9:case 13:case 14:case 15:break u;case 11:break B;case 12:case 17:break E;case 22:break I;case 23:break F;case 24:break H;case 27:break A;case 29:break J;default:break K}}L:{switch(h-65|0){case 1:case 3:break h;case 0:case 4:case 5:case 6:break u;case 2:break z;default:break L}}if((h|0)==83){break y}break h}i=H[j+48>>2];r=H[j+52>>2];w=1072;break D}h=0;M:{switch(v|0){case 0:H[H[j+48>>2]>>2]=o;continue f;case 1:H[H[j+48>>2]>>2]=o;continue f;case 2:k=H[j+48>>2];H[k>>2]=o;H[k+4>>2]=o>>31;continue f;case 3:G[H[j+48>>2]>>1]=o;continue f;case 4:F[H[j+48>>2]]=o;continue f;case 6:H[H[j+48>>2]>>2]=o;continue f;case 7:break M;default:continue f}}k=H[j+48>>2];H[k>>2]=o;H[k+4>>2]=o>>31;continue f}m=m>>>0<=8?8:m;l=l|8;h=120}b=t;k=H[j+52>>2];r=k;i=H[j+48>>2];s=i;if(i|k){A=h&32;while(1){b=b-1|0;F[b|0]=A|I[(s&15)+25792|0];v=!k&s>>>0>15|(k|0)!=0;s=(k&15)<<28|s>>>4;k=k>>>4|0;if(v){continue}break}}k=b;if(!(l&8)|!(i|r)){break C}w=(h>>>4|0)+1072|0;q=2;break C}b=t;k=H[j+52>>2];r=k;i=H[j+48>>2];s=i;if(i|k){while(1){b=b-1|0;F[b|0]=s&7|48;v=!k&s>>>0>7|(k|0)!=0;s=(k&7)<<29|s>>>3;k=k>>>3|0;if(v){continue}break}}k=b;if(!(l&8)){break C}b=t-b|0;m=(b|0)<(m|0)?m:b+1|0;break C}i=H[j+48>>2];b=H[j+52>>2];r=b;if((b|0)<0){h=0-(b+((i|0)!=0)|0)|0;r=h;i=0-i|0;H[j+48>>2]=i;H[j+52>>2]=h;q=1;w=1072;break D}if(l&2048){q=1;w=1073;break D}q=l&1;w=q?1074:1072}k=cb(i,r,t)}if((m|0)<0&u){break d}l=u?l&-65537:l;if(!((i|r)!=0|m)){k=t;m=0;break h}b=!(i|r)+(t-k|0)|0;m=(b|0)<(m|0)?m:b;break h}h=I[j+48|0];break i}h=m>>>0>=2147483647?2147483647:m;l=h;n=(h|0)!=0;b=H[j+48>>2];k=b?b:1686;b=k;N:{O:{P:{Q:{if(!(b&3)|!h){break Q}while(1){if(!I[b|0]){break P}l=l-1|0;n=(l|0)!=0;b=b+1|0;if(!(b&3)){break Q}if(l){continue}break}}if(!n){break O}if(!(!I[b|0]|l>>>0<4)){while(1){n=H[b>>2];if(((16843008-n|n)&-2139062144)!=-2139062144){break P}b=b+4|0;l=l-4|0;if(l>>>0>3){continue}break}}if(!l){break O}}while(1){if(!I[b|0]){break N}b=b+1|0;l=l-1|0;if(l){continue}break}}b=0}b=b?b-k|0:h;n=b+k|0;if((m|0)>=0){l=i;m=b;break h}l=i;m=b;if(I[n|0]){break d}break h}h=H[j+48>>2];if(h|H[j+52>>2]){break x}h=0;break i}if(m){i=H[j+48>>2];break w}h=0;Oa(a,32,p,0,l);break v}H[j+12>>2]=0;H[j+8>>2]=h;i=j+8|0;H[j+48>>2]=i;m=-1}h=0;while(1){R:{k=H[i>>2];if(!k){break R}k=Cc(j+4|0,k);if((k|0)<0){break b}if(k>>>0>m-h>>>0){break R}i=i+4|0;h=h+k|0;if(m>>>0>h>>>0){continue}}break}n=61;if((h|0)<0){break c}Oa(a,32,p,h,l);if(!h){h=0;break v}n=0;i=H[j+48>>2];while(1){k=H[i>>2];if(!k){break v}m=j+4|0;k=Cc(m,k);n=k+n|0;if(n>>>0>h>>>0){break v}Ma(a,m,k);i=i+4|0;if(h>>>0>n>>>0){continue}break}}Oa(a,32,p,h,l^8192);h=(h|0)<(p|0)?p:h;continue f}if((m|0)<0&u){break d}n=61;h=sa[f|0](a,M[j+48>>3],p,m,l,h)|0;if((h|0)>=0){continue f}break c}i=I[h+1|0];h=h+1|0;continue}}if(a){break a}if(!x){break g}h=1;while(1){a=H[(h<<2)+e>>2];if(a){Dc((h<<3)+d|0,a,c,g);o=1;h=h+1|0;if((h|0)!=10){continue}break a}break}if(h>>>0>=10){o=1;break a}while(1){if(H[(h<<2)+e>>2]){break j}o=1;h=h+1|0;if((h|0)!=10){continue}break}break a}n=28;break c}F[j+39|0]=h;m=1;k=z;l=i}i=n-k|0;m=(i|0)<(m|0)?m:i;if((m|0)>(q^2147483647)){break d}n=61;b=m+q|0;h=(b|0)<(p|0)?p:b;if((y|0)<(h|0)){break c}Oa(a,32,h,b,l);Ma(a,w,q);Oa(a,48,h,b,l^65536);Oa(a,48,m,i,0);Ma(a,k,i);Oa(a,32,h,b,l^8192);b=H[j+60>>2];continue}break}break}o=0;break a}n=61}H[6597]=n}o=-1}oa=j- -64|0;return o}function qd(a,b,c,d,e,f){a=a|0;b=+b;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,t=0,u=0,v=0,w=0,y=0,z=0,A=0;m=oa-560|0;oa=m;H[m+44>>2]=0;x(+b);h=s(1)|0;s(0)|0;a:{if((h|0)<0){u=1;z=1082;b=-b;x(+b);h=s(1)|0;s(0)|0;break a}if(e&2048){u=1;z=1085;break a}u=e&1;z=u?1088:1083;A=!u}b:{if((h&2146435072)==2146435072){h=u+3|0;Oa(a,32,c,h,e&-65537);Ma(a,z,u);d=f&32;Ma(a,b!=b?d?1207:1435:d?1312:1476,3);Oa(a,32,c,h,e^8192);n=(c|0)>(h|0)?c:h;break b}w=m+16|0;c:{d:{e:{b=Bc(b,m+44|0);b=b+b;if(b!=0){h=H[m+44>>2];H[m+44>>2]=h-1;y=f|32;if((y|0)!=97){break e}break c}y=f|32;if((y|0)==97){break c}l=H[m+44>>2];break d}l=h-29|0;H[m+44>>2]=l;b=b*268435456}k=(d|0)<0?6:d;r=(m+48|0)+((l|0)>=0?288:0)|0;h=r;while(1){d=b<4294967295&b>=0?~~b>>>0:0;H[h>>2]=d;h=h+4|0;b=(b-+(d>>>0))*1e9;if(b!=0){continue}break}f:{if((l|0)<=0){i=l;g=h;j=r;break f}j=r;i=l;while(1){o=i>>>0>=29?29:i;g=h-4|0;g:{if(j>>>0>g>>>0){break g}p=0;while(1){q=0;d=H[g>>2];i=o&31;n=p;if((o&63)>>>0>=32){p=d<>>32-i;d=d<>>0>i>>>0?q+1|0:q;p=Ke(i,q,1e9,0);n=Ie(p,ra,-1e9);d=q;q=i+n|0;H[g>>2]=q;g=g-4|0;if(j>>>0<=g>>>0){continue}break}if(!d&i>>>0<1e9){break g}j=j-4|0;H[j>>2]=p}while(1){g=h;if(j>>>0>>0){h=g-4|0;if(!H[h>>2]){continue}}break}i=H[m+44>>2]-o|0;H[m+44>>2]=i;h=g;if((i|0)>0){continue}break}}if((i|0)<0){v=((k+25>>>0)/9|0)+1|0;p=(y|0)==102;while(1){d=0-i|0;n=d>>>0>=9?9:d;h:{if(g>>>0<=j>>>0){h=H[j>>2]?0:4;break h}q=1e9>>>n|0;o=-1<>2];H[h>>2]=(d>>>n|0)+i;i=N(q,d&o);h=h+4|0;if(h>>>0>>0){continue}break}h=H[j>>2]?0:4;if(!i){break h}H[g>>2]=i;g=g+4|0}i=n+H[m+44>>2]|0;H[m+44>>2]=i;j=h+j|0;d=p?r:j;g=g-d>>2>(v|0)?d+(v<<2)|0:g;if((i|0)<0){continue}break}}i=0;i:{if(g>>>0<=j>>>0){break i}i=N(r-j>>2,9);h=10;d=H[j>>2];if(d>>>0<10){break i}while(1){i=i+1|0;h=N(h,10);if(d>>>0>=h>>>0){continue}break}}d=(k-((y|0)!=102?i:0)|0)-((y|0)==103&(k|0)!=0)|0;if((d|0)<(N(g-r>>2,9)-9|0)){h=(m+48|0)+((l|0)<0?-4092:-3804)|0;l=d+9216|0;d=(l|0)/9|0;n=h+(d<<2)|0;h=10;d=l+N(d,-9)|0;if((d|0)<=7){while(1){h=N(h,10);d=d+1|0;if((d|0)!=8){continue}break}}l=H[n>>2];v=(l>>>0)/(h>>>0)|0;o=N(v,h);d=n+4|0;j:{if((l|0)==(o|0)&(d|0)==(g|0)){break j}l=l-o|0;k:{if(!(v&1)){b=9007199254740992;if(!(F[n-4|0]&1)|((h|0)!=1e9|j>>>0>=n>>>0)){break k}}b=9007199254740994}t=(d|0)==(g|0)?1:1.5;d=h>>>1|0;t=d>>>0>l>>>0?.5:(d|0)==(l|0)?t:1.5;if(!(I[z|0]!=45|A)){t=-t;b=-b}H[n>>2]=o;if(b+t==b){break j}d=h+o|0;H[n>>2]=d;if(d>>>0>=1e9){while(1){H[n>>2]=0;n=n-4|0;if(n>>>0>>0){j=j-4|0;H[j>>2]=0}d=H[n>>2]+1|0;H[n>>2]=d;if(d>>>0>999999999){continue}break}}i=N(r-j>>2,9);h=10;d=H[j>>2];if(d>>>0<10){break j}while(1){i=i+1|0;h=N(h,10);if(d>>>0>=h>>>0){continue}break}}d=n+4|0;g=d>>>0>>0?d:g}while(1){l=g;o=g>>>0<=j>>>0;if(!o){g=g-4|0;if(!H[g>>2]){continue}}break}l:{if((y|0)!=103){p=e&8;break l}h=k?k:1;d=(h|0)>(i|0)&(i|0)>-5;k=(d?i^-1:-1)+h|0;f=(d?-1:-2)+f|0;p=e&8;if(p){break l}g=-9;m:{if(o){break m}o=H[l-4>>2];if(!o){break m}d=10;g=0;if((o>>>0)%10|0){break m}while(1){h=g;g=g+1|0;d=N(d,10);if(!((o>>>0)%(d>>>0)|0)){continue}break}g=h^-1}d=N(l-r>>2,9);if((f&-33)==70){p=0;d=(d+g|0)-9|0;d=(d|0)>0?d:0;k=(d|0)>(k|0)?k:d;break l}p=0;d=((d+i|0)+g|0)-9|0;d=(d|0)>0?d:0;k=(d|0)>(k|0)?k:d}n=-1;o=k|p;if(((o?2147483645:2147483646)|0)<(k|0)){break b}q=(((o|0)!=0)+k|0)+1|0;h=f&-33;n:{if((h|0)==70){if((q^2147483647)<(i|0)){break b}g=(i|0)>0?i:0;break n}d=i>>31;g=cb((d^i)-d|0,0,w);if((w-g|0)<=1){while(1){g=g-1|0;F[g|0]=48;if((w-g|0)<2){continue}break}}v=g-2|0;F[v|0]=f;F[g-1|0]=(i|0)<0?45:43;g=w-v|0;if((g|0)>(q^2147483647)){break b}}d=g+q|0;if((d|0)>(u^2147483647)){break b}i=d+u|0;Oa(a,32,c,i,e);Ma(a,z,u);Oa(a,48,c,i,e^65536);o:{p:{q:{if((h|0)==70){h=m+16|9;f=j>>>0>r>>>0?r:j;j=f;while(1){g=cb(H[j>>2],0,h);r:{if((f|0)!=(j|0)){if(m+16>>>0>=g>>>0){break r}while(1){g=g-1|0;F[g|0]=48;if(m+16>>>0>>0){continue}break}break r}if((g|0)!=(h|0)){break r}g=g-1|0;F[g|0]=48}Ma(a,g,h-g|0);j=j+4|0;if(r>>>0>=j>>>0){continue}break}if(o){Ma(a,1684,1)}if((k|0)<=0|j>>>0>=l>>>0){break q}while(1){g=cb(H[j>>2],0,h);if(g>>>0>m+16>>>0){while(1){g=g-1|0;F[g|0]=48;if(m+16>>>0>>0){continue}break}}Ma(a,g,(k|0)>=9?9:k);g=k-9|0;j=j+4|0;if(l>>>0<=j>>>0){break p}d=(k|0)>9;k=g;if(d){continue}break}break p}s:{if((k|0)<0){break s}f=j>>>0>>0?l:j+4|0;l=m+16|9;h=j;while(1){g=cb(H[h>>2],0,l);if((l|0)==(g|0)){g=g-1|0;F[g|0]=48}t:{if((h|0)!=(j|0)){if(m+16>>>0>=g>>>0){break t}while(1){g=g-1|0;F[g|0]=48;if(m+16>>>0>>0){continue}break}break t}Ma(a,g,1);g=g+1|0;if(!(k|p)){break t}Ma(a,1684,1)}d=l-g|0;Ma(a,g,(d|0)<(k|0)?d:k);k=k-d|0;h=h+4|0;if(f>>>0<=h>>>0){break s}if((k|0)>=0){continue}break}}Oa(a,48,k+18|0,18,0);Ma(a,v,w-v|0);break o}g=k}Oa(a,48,g+9|0,9,0)}Oa(a,32,c,i,e^8192);n=(c|0)>(i|0)?c:i;break b}k=(f<<26>>31&9)+z|0;u:{if(d>>>0>11){break u}g=12-d|0;t=16;while(1){t=t*16;g=g-1|0;if(g){continue}break}if(I[k|0]==45){b=-(t+(-b-t));break u}b=b+t-t}h=H[m+44>>2];g=h>>31;g=cb((g^h)-g|0,0,w);if((w|0)==(g|0)){g=g-1|0;F[g|0]=48;h=H[m+44>>2]}r=u|2;j=f&32;l=g-2|0;F[l|0]=f+15;F[g-1|0]=(h|0)<0?45:43;g=!(e&8)&(d|0)<=0;h=m+16|0;while(1){f=h;i=P(b)<2147483647?~~b:-2147483648;F[h|0]=j|I[i+25792|0];b=(b-+(i|0))*16;h=h+1|0;if(!(g&b==0|(h-(m+16|0)|0)!=1)){F[f+1|0]=46;h=f+2|0}if(b!=0){continue}break}n=-1;g=w-l|0;f=g+r|0;if((2147483645-f|0)<(d|0)){break b}i=f;f=m+16|0;j=h-f|0;d=d?(j-2|0)<(d|0)?d+2|0:j:j;h=i+d|0;Oa(a,32,c,h,e);Ma(a,k,r);Oa(a,48,c,h,e^65536);Ma(a,f,j);Oa(a,48,d-j|0,0,0);Ma(a,l,g);Oa(a,32,c,h,e^8192);n=(c|0)>(h|0)?c:h}oa=m+560|0;return n|0}function Zc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;j=oa-80|0;oa=j;H[j+76>>2]=1;a:{b:{if(H[a+128>>2]!=1|H[a+132>>2]!=1|(H[a+108>>2]|H[a+112>>2])){break b}k=H[a+100>>2];if(H[k>>2]|H[k+4>>2]|(H[k+8>>2]!=H[a+116>>2]|H[k+12>>2]!=H[a+120>>2])){break b}if(!Za(a,j+72|0,0,j+68|0,j- -64|0,j+60|0,j+56|0,j+52|0,j+76|0,b,c)){break a}c:{d:{if(!H[j+76>>2]){break d}if(!gb(a,H[j+72>>2],0,0,b,c)){break d}b=H[a+100>>2];if(H[b+16>>2]){break c}d=1;break a}Ca(c,1,8776,0);break a}e=H[b+24>>2];while(1){b=N(g,52);Da(H[(b+e|0)+44>>2]);c=H[a+100>>2];e=H[c+24>>2];k=b+e|0;d=H[a+232>>2];n=H[H[H[d+20>>2]>>2]+20>>2]+N(g,76)|0;H[k+44>>2]=H[n+36>>2];H[k+36>>2]=H[(b+H[H[d+24>>2]+24>>2]|0)+36>>2];H[n+36>>2]=0;d=1;g=g+1|0;if(g>>>0>2]){continue}break}break a}H[a+80>>2]=0;H[a+84>>2]=0;Da(H[a+88>>2]);H[a+88>>2]=0;e:{if(!(H[a+28>>2]|H[a+32>>2]|H[a+36>>2]!=H[a+128>>2])){k=2;if(H[a+40>>2]==H[a+132>>2]){break e}}k=2;if(H[a+76>>2]){break e}if(!Fb(b)){break e}r=H[a+128>>2];k=N(r,H[a+132>>2]);if(k){i=k&1;h=H[H[a+224>>2]+40>>2];f:{if((k|0)==1){k=0;break f}l=k&-2;k=0;while(1){d=h+N(g,40)|0;f=H[d+4>>2];if(f){m=(H[d+16>>2]+N(f,24)|0)-8|0;f=H[m>>2];o=f;p=f>>>0>k>>>0;f=H[m+4>>2];m=p&(f|0)>=(n|0)|(f|0)>(n|0);k=m?o:k;n=m?f:n}f=H[d+44>>2];if(f){f=(H[d+56>>2]+N(f,24)|0)-8|0;d=H[f>>2];o=d;m=d>>>0>k>>>0;d=H[f+4>>2];f=m&(d|0)>=(n|0)|(d|0)>(n|0);k=f?o:k;n=f?d:n}g=g+2|0;e=e+2|0;if((l|0)!=(e|0)){continue}break}}g:{if(!i){break g}d=h+N(g,40)|0;h=H[d+4>>2];if(!h){break g}h=(H[d+16>>2]+N(h,24)|0)-8|0;d=H[h>>2];f=d;g=d>>>0>k>>>0;d=H[h+4>>2];h=g&(d|0)>=(n|0)|(d|0)>(n|0);k=h?f:k;n=h?d:n}k=k+2|0;n=k>>>0<2?n+1|0:n}else{k=2;n=0}g=0;f=H[a+32>>2];q=H[a+40>>2];h:{if(f>>>0>=q>>>0){break h}h=H[a+28>>2];i=H[a+36>>2];if(h>>>0>=i>>>0){break h}l=i-h&3;t=H[H[a+224>>2]+40>>2];u=h-i>>>0>4294967292;while(1){m=t+N(N(f,r),40)|0;d=h;e=0;if(l){while(1){g=H[(m+N(d,40)|0)+4>>2]+g|0;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}if(!u){while(1){e=m+N(d,40)|0;g=H[e+124>>2]+(H[e+84>>2]+(H[e+44>>2]+(H[e+4>>2]+g|0)|0)|0)|0;d=d+4|0;if((i|0)!=(d|0)){continue}break}}f=f+1|0;if((q|0)!=(f|0)){continue}break}}f=Ga(g<<3);H[a+88>>2]=f;if(!g|!f){break e}g=0;d=H[a+40>>2];i=H[a+32>>2];i:{if(d>>>0<=i>>>0){break i}e=H[a+36>>2];if(e>>>0<=K[a+28>>2]){break i}while(1){l=H[a+28>>2];if(l>>>0>>0){t=H[H[a+224>>2]+40>>2]+N(N(H[a+128>>2],i),40)|0;while(1){h=t+N(l,40)|0;d=H[h+4>>2];if(d){r=d&3;h=H[h+16>>2];q=0;j:{if(d>>>0<4){d=0;break j}u=h+72|0;v=h+48|0;w=h+24|0;x=d&-4;d=0;f=0;while(1){m=N(d,24);p=m+h|0;s=H[p+4>>2];e=g<<3;o=e+H[a+88>>2]|0;H[o>>2]=H[p>>2];H[o+4>>2]=s;p=m+w|0;s=H[p+4>>2];o=e+H[a+88>>2]|0;H[o+8>>2]=H[p>>2];H[o+12>>2]=s;p=m+v|0;s=H[p+4>>2];o=e+H[a+88>>2]|0;H[o+16>>2]=H[p>>2];H[o+20>>2]=s;m=m+u|0;o=H[m+4>>2];e=e+H[a+88>>2]|0;H[e+24>>2]=H[m>>2];H[e+28>>2]=o;d=d+4|0;g=g+4|0;f=f+4|0;if((x|0)!=(f|0)){continue}break}}if(r){while(1){f=h+N(d,24)|0;m=H[f+4>>2];e=H[a+88>>2]+(g<<3)|0;H[e>>2]=H[f>>2];H[e+4>>2]=m;d=d+1|0;g=g+1|0;q=q+1|0;if((r|0)!=(q|0)){continue}break}}e=H[a+36>>2]}l=l+1|0;if(l>>>0>>0){continue}break}d=H[a+40>>2]}i=i+1|0;if(i>>>0>>0){continue}break}f=H[a+88>>2]}H[a+84>>2]=g;e=oa-208|0;oa=e;H[e+8>>2]=1;H[e+12>>2]=0;l=g<<3;k:{if(!l){break k}H[e+16>>2]=8;H[e+20>>2]=8;d=8;g=8;i=2;while(1){h=d;d=(g+8|0)+d|0;H[(e+16|0)+(i<<2)>>2]=d;i=i+1|0;g=h;if(d>>>0>>0){continue}break}h=(f+l|0)-8|0;l:{if(h>>>0<=f>>>0){g=0;i=1;d=1;h=0;break l}i=1;d=1;while(1){m:{if((i&3)==3){Gb(f,d,e+16|0);xb(e+8|0,2);d=d+2|0;break m}l=e+16|0;g=d-1|0;n:{if(K[l+(g<<2)>>2]>=h-f>>>0){wb(f,i,H[e+12>>2],d,0,l);break n}Gb(f,d,e+16|0)}if((d|0)==1){vb(e+8|0,1);d=0;break m}vb(e+8|0,g);d=1}i=H[e+8>>2]|1;H[e+8>>2]=i;f=f+8|0;if(h>>>0>f>>>0){continue}break}g=H[e+12>>2];h=(g|0)!=0}wb(f,i,g,d,0,e+16|0);i=H[e+8>>2];if(!(h|((d|0)!=1|(i|0)!=1))){break k}while(1){o:{if((d|0)<=1){h=Jc(i,g);xb(e+8|0,h);d=d+h|0;break o}g=e+8|0;vb(g,2);H[e+8>>2]=H[e+8>>2]^7;xb(g,1);l=f-8|0;i=e+16|0;h=d-2|0;wb(l-H[i+(h<<2)>>2]|0,H[e+8>>2],H[e+12>>2],d-1|0,1,i);vb(g,1);d=H[e+8>>2]|1;H[e+8>>2]=d;wb(l,d,H[e+12>>2],h,1,i);d=h}f=f-8|0;g=H[e+12>>2];i=H[e+8>>2];if(g|((d|0)!=1|(i|0)!=1)){continue}break}}oa=e+208|0}d=H[a+128>>2];e=0;p:{while(1){q:{if(!(!H[H[a+180>>2]+5596>>2]|((d|0)!=1|H[a+132>>2]!=1))){H[j+72>>2]=0;H[a+228>>2]=0;H[a+8>>2]=H[a+8>>2]|128;d=0;break q}d=0;if(!Za(a,j+72|0,0,j+68|0,j- -64|0,j+60|0,j+56|0,j+52|0,j+76|0,b,c)){break a}if(!H[j+76>>2]){break p}d=H[j+72>>2]}h=d+1|0;f=gb(a,d,0,0,b,c);g=N(H[a+128>>2],H[a+132>>2]);if(!f){H[j+4>>2]=g;H[j>>2]=h;Ca(c,1,7537,j);d=0;break a}H[j+36>>2]=g;H[j+32>>2]=h;Ca(c,4,11795,j+32|0);if(!Sc(H[a+232>>2],H[H[a+100>>2]+24>>2])){d=0;break a}r:{if(!(H[a+128>>2]!=1|H[a+132>>2]!=1)){g=H[a+100>>2];f=H[a+96>>2];if(H[g>>2]!=H[f>>2]|H[g+4>>2]!=H[f+4>>2]|(H[g+8>>2]!=H[f+8>>2]|H[g+12>>2]!=H[f+12>>2])){break r}}d=H[a+180>>2]+N(d,5644)|0;g=H[d+5596>>2];if(!g){break r}Da(g);H[d+5596>>2]=0;H[d+5600>>2]=0}H[j+16>>2]=h;Ca(c,4,16601,j+16|0);if(!(Sa(b)|ra)&H[a+8>>2]==64){break p}e=e+1|0;d=H[a+128>>2];if((e|0)==(N(d,H[a+132>>2])|0)){break p}h=H[a+84>>2];if(!h|(h|0)!=H[a+80>>2]){continue}break}zc(b,k,n,c)}d=Rc(a,c)}oa=j+80|0;return d|0}function $a(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=H[a+32>>2];a:{if(d){break a}b:{h=H[a+16>>2];if((h|0)>=6){b=H[a+8>>2];f=H[a+12>>2];d=h;break b}b=H[a+20>>2];c:{d:{if((b|0)>=5){c=H[a>>2];d=H[c>>2];H[a>>2]=c+4;g=b-4|0;break d}if((b|0)<=0){d=-1;break c}c=H[a>>2];e:{if((b|0)==1){e=-1;b=0;break e}e=-1;f=b-1|0;k=f&1;f:{if((b|0)==2){d=0;i=b;break f}j=f&-2;d=0;f=c;i=b;while(1){H[a>>2]=f+1;l=I[f|0];c=f+2|0;H[a>>2]=c;H[a+20>>2]=i-1;f=I[f+1|0];i=i-2|0;H[a+20>>2]=i;e=((255<>2]=f;c=I[c|0];H[a+20>>2]=i-1;e=(255<>2]=c+1;d=(255<>2]=g}b=H[a+24>>2];c=d>>>24|0;H[a+24>>2]=(c|0)==255;g=d>>>16&255;k=(g|0)==255;f=d&255;e=(f|0)==255;j=b+e|0;b=d>>>8&255;i=(b|0)==255;j=k+(j+i|0)|0;d=(h-j|0)+32|0;H[a+16>>2]=d;l=H[a+12>>2];b=c|(g|(b|f<<(e?7:8))<<(i?7:8))<<(k?7:8);f=(j-h|0)+32|0;c=f&31;if((f&63)>>>0>=32){i=b<>>32-c;g=b<>2];c=i|l;f=c;H[a+8>>2]=b;H[a+12>>2]=c;if((d|0)>=6){break b}d=0;break a}e=H[a+28>>2];i=H[(e<<2)+20752>>2];g:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break g}g=b;h=63-i|0;c=h&31;if((h&63)>>>0>=32){g=f>>>c|0}else{g=((1<>>c}c=(g&(-1<>2]=d;H[a+28>>2]=e;g=b;h=i&31;if((i&63)>>>0>=32){b=b<>>32-h|f<>2]=g;H[a+12>>2]=b;i=H[a+44>>2]|c>>31;j=H[a+40>>2]&-64|c;H[a+40>>2]=j;H[a+44>>2]=i;if((d|0)<6){d=1;break a}b=H[(e<<2)+20752>>2];h:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break h}k=g;h=63-b|0;c=h&31;if((h&63)>>>0>=32){k=f>>>c|0}else{k=((1<>>c}c=(k&(-1<>2]=d;H[a+28>>2]=e;k=g;h=b&31;if((b&63)>>>0>=32){b=g<>>32-h|f<>2]=k;H[a+12>>2]=b;b=c>>31<<7|c>>>25|i;h=b;j=j&-8065|c<<7;H[a+40>>2]=j;H[a+44>>2]=b;if((d|0)<6){d=2;break a}b=H[(e<<2)+20752>>2];i:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break i}g=k;i=63-b|0;c=i&31;if((i&63)>>>0>=32){g=f>>>c|0}else{g=((1<>>c}c=(g&(-1<>2]=d;H[a+28>>2]=e;l=k;g=b&31;if((b&63)>>>0>=32){i=k<>>32-g|f<>2]=g;f=i;H[a+12>>2]=f;b=c>>31<<14|c>>>18|h;i=b;k=j&-1032193|c<<14;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=3;break a}b=H[(e<<2)+20752>>2];j:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break j}j=g;h=63-b|0;c=h&31;if((h&63)>>>0>=32){j=f>>>c|0}else{j=((1<>>c}c=(j&(-1<>2]=d;H[a+28>>2]=e;j=g;h=b&31;if((b&63)>>>0>=32){b=g<>>32-h|f<>2]=g;H[a+12>>2]=b;b=c>>31<<21|c>>>11|i;j=b;k=k&-132120577|c<<21;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=4;break a}b=H[(e<<2)+20752>>2];k:{if((f|0)<0){c=(-1<=11?11:e)+1|0;d=d-1|0;break k}h=g;i=63-b|0;c=i&31;if((i&63)>>>0>=32){i=f>>>c|0}else{i=((1<>>c}c=(i&(-1<>2]=d;H[a+28>>2]=h;i=g;e=b&31;if((b&63)>>>0>=32){b=g<>>32-e|f<>2]=g;f=b;H[a+12>>2]=b;b=j&-4|(c>>31<<28|c>>>4);j=b;k=k&268435455|c<<28;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=5;break a}b=H[(h<<2)+20752>>2];l:{if((f|0)<0){e=(-1<=11?11:h)+1|0;i=d-1|0;break l}i=g;e=63-b|0;c=e&31;if((e&63)>>>0>=32){i=f>>>c|0}else{i=((1<>>c}e=(i&(-1<>2]=i;H[a+28>>2]=h;d=g;c=b&31;if((b&63)>>>0>=32){b=d<>>32-c|f<>2]=g;H[a+12>>2]=b;b=j&-505|e<<3;l=b;H[a+40>>2]=k;H[a+44>>2]=b;d=6;if((i|0)<6){break a}b=H[(h<<2)+20752>>2];m:{if((c|0)<0){e=(-1<=11?11:h)+1|0;d=i-1|0;break m}d=g;e=63-b|0;f=e&31;if((e&63)>>>0>=32){f=c>>>f|0}else{f=((1<>>f}e=(f&(-1<>2]=d;H[a+28>>2]=h;j=g;f=b&31;if((b&63)>>>0>=32){i=g<>>32-f|c<>2]=g;f=i;H[a+12>>2]=f;i=k;b=l&-64513|e<<10;k=b;H[a+40>>2]=i;H[a+44>>2]=b;if((d|0)<6){d=7;break a}b=H[(h<<2)+20752>>2];n:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:h)+1|0;break n}j=g;e=63-b|0;c=e&31;if((e&63)>>>0>=32){j=f>>>c|0}else{j=((1<>>c}c=(j&(-1<>2]=d;H[a+28>>2]=e;d=g;e=b&31;if((b&63)>>>0>=32){b=d<>>32-e|f<>2]=g;H[a+12>>2]=b;H[a+40>>2]=i;H[a+44>>2]=k&-8257537|c<<17;d=8}H[a+32>>2]=d-1;f=H[a+44>>2];b=f>>>7|0;c=H[a+40>>2];H[a+40>>2]=(f&127)<<25|c>>>7;H[a+44>>2]=b;return c&127}function ec(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;p=oa-32|0;oa=p;H[p+24>>2]=f;r=H[(N(H[d+28>>2],76)+b|0)+28>>2]+N(H[d+32>>2],152)|0;a:{if(!(H[d+40>>2]|!H[r+24>>2])){k=r+28|0;while(1){b:{if(ac(k)){break b}b=H[d+36>>2];if(b>>>0>=K[k+24>>2]/40>>>0){Ca(i,1,2836,0);break a}b=H[k+20>>2]+N(b,40)|0;rc(H[b+32>>2]);rc(H[b+36>>2]);o=N(H[b+20>>2],H[b+16>>2]);if(!o){break b}b=H[b+24>>2];if(o>>>0>=8){q=o&-8;j=0;while(1){H[b+516>>2]=0;H[b+520>>2]=0;H[b+448>>2]=0;H[b+452>>2]=0;H[b+380>>2]=0;H[b+384>>2]=0;H[b+312>>2]=0;H[b+316>>2]=0;H[b+244>>2]=0;H[b+248>>2]=0;H[b+176>>2]=0;H[b+180>>2]=0;H[b+108>>2]=0;H[b+112>>2]=0;H[b+40>>2]=0;H[b+44>>2]=0;b=b+544|0;j=j+8|0;if((q|0)!=(j|0)){continue}break}}j=0;o=o&7;if(!o){break b}while(1){H[b+40>>2]=0;H[b+44>>2]=0;b=b+68|0;j=j+1|0;if((o|0)!=(j|0)){continue}break}}k=k+36|0;n=n+1|0;if(n>>>0>2]){continue}break}}q=f;c:{if(!(I[c|0]&2)){break c}if(h>>>0<=5){Ca(i,2,4196,0);break c}if(!(I[f|0]==255&I[f+1|0]==145)){Ca(i,2,4238,0);break c}q=f+6|0;H[p+24>>2]=q}l=Ga(20);if(!l){break a}d:{if(F[a+108|0]&1){q=H[a+40>>2];o=a+44|0;h=a+40|0;break d}if(I[c+5640|0]&2){q=H[c+5168>>2];o=c+5180|0;h=c+5168|0;break d}H[p+28>>2]=(f+h|0)-q;o=p+28|0;h=p+24|0}a=H[o>>2];H[l+12>>2]=0;H[l+16>>2]=0;H[l+8>>2]=q;H[l>>2]=q;H[l+4>>2]=a+q;if(!Ta(l,1)){tc(l);a=uc(l);hb(l);a=a+q|0;b=H[h>>2];d=H[o>>2];if(I[c|0]&4){if(b+(d-a|0)>>>0<=1){Ca(i,1,4422,0);break a}if(!(I[a|0]==255&I[a+1|0]==146)){Ca(i,1,4401,0);break a}a=a+2|0}a=a-b|0;H[o>>2]=d-a;H[h>>2]=a+b;H[e>>2]=0;H[g>>2]=H[p+24>>2]-f;x=1;break a}if(H[r+24>>2]){t=r+28|0;while(1){a=H[d+36>>2];b=H[t+20>>2];e:{if(ac(t)){break e}u=b+N(a,40)|0;z=N(H[u+20>>2],H[u+16>>2]);if(!z){break e}k=H[u+24>>2];v=0;while(1){f:{g:{if(!H[k+40>>2]){a=pc(l,H[u+32>>2],v,H[d+40>>2]+1|0);break g}a=Ta(l,1)}if(!a){H[k+36>>2]=0;break f}if(!H[k+40>>2]){b=0;while(1){a=b;b=b+1|0;if(!pc(l,H[u+36>>2],v,a)){continue}break}b=H[t+28>>2];H[k+32>>2]=3;H[k+24>>2]=b;H[k+28>>2]=(b-a|0)+1}a=1;h:{if(!Ta(l,1)){break h}a=2;if(!Ta(l,1)){break h}a=Ta(l,2);if((a|0)!=3){a=a+3|0;break h}a=Ta(l,5);if((a|0)!=31){a=a+6|0;break h}a=Ta(l,7)+37|0}H[k+36>>2]=a;b=0;while(1){a=b;b=b+1|0;if(Ta(l,1)){continue}break}H[k+32>>2]=a+H[k+32>>2];i:{a=H[k+40>>2];j:{k:{if(!a){a=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];if(!H[k+48>>2]){b=Ia(H[k>>2],240);if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=10}j=H[k>>2];nb(j);b=a&4?1:a&1?10:109;a=0;break k}b=H[k>>2];n=a-1|0;j=b+N(n,24)|0;if(H[j+4>>2]!=H[j+12>>2]){break j}n=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];j=H[k+48>>2];if(j>>>0>>0){j=j+10|0;b=Ia(b,N(j,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=j;b=H[k>>2]}j=N(a,24)+b|0;nb(j);b=1;l:{if(n&4){break l}b=109;if(!(n&1)){break l}b=H[j-12>>2];b=(b|0)==1?2:(b|0)==10?2:1}}n=a;H[j+12>>2]=b}a=H[k+36>>2];if(I[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16|0]&64){while(1){m=N(n,24);s=n?a:1;H[(m+H[k>>2]|0)+16>>2]=s;w=H[k+32>>2];j=0;b=a;if(s>>>0>=2){while(1){j=j+1|0;s=b>>>0>3;b=b>>>1|0;if(s){continue}break}}b=j+w|0;if(b>>>0>=33){H[p+16>>2]=b;Ca(i,1,15535,p+16|0);break i}j=Ta(l,b);b=H[k>>2];m=m+b|0;H[m+20>>2]=j;a=a-H[m+16>>2]|0;if((a|0)<=0){break f}j=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];m=H[k+48>>2];if(m>>>0>>0){m=m+10|0;b=Ia(b,N(m,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=m;b=H[k>>2]}n=n+1|0;b=b+N(n,24)|0;nb(b);if(j&4){H[b+12>>2]=1;continue}if(j&1){j=b;b=H[b-12>>2];H[j+12>>2]=(b|0)==1?2:(b|0)==10?2:1}else{H[b+12>>2]=109}continue}}while(1){m=N(n,24);j=m+H[k>>2]|0;b=H[j+12>>2]-H[j+4>>2]|0;b=(a|0)>(b|0)?b:a;H[j+16>>2]=b;s=H[k+32>>2];j=0;if(b>>>0>=2){while(1){j=j+1|0;w=b>>>0>3;b=b>>>1|0;if(w){continue}break}}b=j+s|0;if(b>>>0>=33){H[p>>2]=b;Ca(i,1,15535,p);break i}j=Ta(l,b);b=H[k>>2];m=m+b|0;H[m+20>>2]=j;a=a-H[m+16>>2]|0;if((a|0)<=0){break f}j=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];m=H[k+48>>2];if(m>>>0>>0){m=m+10|0;b=Ia(b,N(m,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=m;b=H[k>>2]}n=n+1|0;b=b+N(n,24)|0;nb(b);if(j&4){H[b+12>>2]=1;continue}if(j&1){j=b;b=H[b-12>>2];H[j+12>>2]=(b|0)==1?2:(b|0)==10?2:1}else{H[b+12>>2]=109}continue}}hb(l);break a}k=k+68|0;v=v+1|0;if((z|0)!=(v|0)){continue}break}}t=t+36|0;A=A+1|0;if(A>>>0>2]){continue}break}}if(!tc(l)){hb(l);break a}a=uc(l);hb(l);b=a+q|0;a=H[h>>2];if(I[c|0]&4){if(a+(H[o>>2]-b|0)>>>0<=1){Ca(i,1,4422,0);break a}if(!(I[b|0]==255&I[b+1|0]==146)){Ca(i,1,4401,0);break a}b=b+2|0}if((a|0)==(b|0)){break a}H[o>>2]=H[o>>2]+(a-b|0);H[h>>2]=b;x=1;H[e>>2]=1;H[g>>2]=H[p+24>>2]-f}oa=p+32|0;return x}function Eb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;o=N(c,5);j=(c<<2)+b|0;e=H[a>>2];f=H[a+12>>2]<<5;h=e+f|0;l=e-f|0;e=H[a+16>>2];k=H[a+28>>2];i=H[a+20>>2];q=H[a+8>>2];a:{b:{if(h&15|(b&15|d>>>0<8)){if(e>>>0>=i>>>0){break a}c:{switch(d-1|0){case 1:f=e+1|0;if(i-e&1){g=h+(e<<6)|0;e=(e<<2)+b|0;L[g>>2]=L[e>>2];L[g+4>>2]=L[e+(c<<2)>>2];e=f}if((f|0)==(i|0)){break a}while(1){f=h+(e<<6)|0;g=(e<<2)+b|0;L[f>>2]=L[g>>2];r=f;f=c<<2;L[r+4>>2]=L[f+g>>2];g=e+1|0;j=h+(g<<6)|0;g=(g<<2)+b|0;L[j>>2]=L[g>>2];L[j+4>>2]=L[f+g>>2];e=e+2|0;if((i|0)!=(e|0)){continue}break};break a;case 0:break c;default:break b}}f=e;j=i-e&3;if(j){while(1){L[h+(f<<6)>>2]=L[(f<<2)+b>>2];f=f+1|0;g=g+1|0;if((j|0)!=(g|0)){continue}break}}if(e-i>>>0>4294967292){break a}while(1){L[h+(f<<6)>>2]=L[(f<<2)+b>>2];e=f+1|0;L[h+(e<<6)>>2]=L[(e<<2)+b>>2];e=f+2|0;L[h+(e<<6)>>2]=L[(e<<2)+b>>2];e=f+3|0;L[h+(e<<6)>>2]=L[(e<<2)+b>>2];f=f+4|0;if((i|0)!=(f|0)){continue}break}break a}if(e>>>0>=i>>>0){break a}n=c<<4;m=N(c,12);s=c<<3;while(1){f=h+(e<<6)|0;g=(e<<2)+b|0;L[f>>2]=L[g>>2];p=c<<2;L[f+4>>2]=L[p+g>>2];L[f+8>>2]=L[g+s>>2];L[f+12>>2]=L[g+m>>2];L[f+16>>2]=L[g+n>>2];g=e+o<<2;L[f+20>>2]=L[g+b>>2];g=g+j|0;L[f+24>>2]=L[g>>2];L[f+28>>2]=L[g+p>>2];e=e+1|0;if((i|0)!=(e|0)){continue}break}break a}n=c<<4;m=N(c,12);s=c<<3;p=(d|0)==5;r=(d|0)==7;while(1){f=h+(e<<6)|0;g=(e<<2)+b|0;L[f>>2]=L[g>>2];t=c<<2;L[f+4>>2]=L[g+t>>2];L[f+8>>2]=L[g+s>>2];d:{if((d|0)==3){break d}L[f+12>>2]=L[g+m>>2];if((d|0)==4){break d}L[f+16>>2]=L[g+n>>2];if(p){break d}g=e+o<<2;L[f+20>>2]=L[g+b>>2];if((d|0)==6){break d}g=g+j|0;L[f+24>>2]=L[g>>2];if(r){break d}L[f+28>>2]=L[g+t>>2]}e=e+1|0;if((i|0)!=(e|0)){continue}break}}b=(q<<2)+b|0;i=b+(c<<2)|0;e=H[a+24>>2];h=l+32|0;e:{if(h&15|(b&15|d>>>0<8)){if(e>>>0>=k>>>0){break e}f:{switch(d-1|0){case 1:a=e+1|0;if(k-e&1){d=h+(e<<6)|0;e=b+(e<<2)|0;L[d>>2]=L[e>>2];L[d+4>>2]=L[e+(c<<2)>>2];e=a}if((a|0)==(k|0)){break e}while(1){a=h+(e<<6)|0;d=b+(e<<2)|0;L[a>>2]=L[d>>2];f=a;a=c<<2;L[f+4>>2]=L[a+d>>2];d=e+1|0;f=h+(d<<6)|0;d=b+(d<<2)|0;L[f>>2]=L[d>>2];L[f+4>>2]=L[a+d>>2];e=e+2|0;if((k|0)!=(e|0)){continue}break};break e;case 0:f=e;a=k-e&3;if(a){g=0;while(1){L[h+(f<<6)>>2]=L[b+(f<<2)>>2];f=f+1|0;g=g+1|0;if((a|0)!=(g|0)){continue}break}}if(e-k>>>0>4294967292){break e}while(1){L[h+(f<<6)>>2]=L[b+(f<<2)>>2];a=f+1|0;L[h+(a<<6)>>2]=L[b+(a<<2)>>2];a=f+2|0;L[h+(a<<6)>>2]=L[b+(a<<2)>>2];a=f+3|0;L[h+(a<<6)>>2]=L[b+(a<<2)>>2];f=f+4|0;if((k|0)!=(f|0)){continue}break};break e;default:break f}}g=c<<4;j=N(c,12);l=c<<3;q=(d|0)==5;n=(d|0)==7;while(1){a=h+(e<<6)|0;f=b+(e<<2)|0;L[a>>2]=L[f>>2];m=c<<2;L[a+4>>2]=L[m+f>>2];L[a+8>>2]=L[f+l>>2];g:{if((d|0)==3){break g}L[a+12>>2]=L[f+j>>2];if((d|0)==4){break g}L[a+16>>2]=L[f+g>>2];if(q){break g}f=e+o<<2;L[a+20>>2]=L[f+b>>2];if((d|0)==6){break g}f=f+i|0;L[a+24>>2]=L[f>>2];if(n){break g}L[a+28>>2]=L[f+m>>2]}e=e+1|0;if((k|0)!=(e|0)){continue}break}break e}if(e>>>0>=k>>>0){break e}f=c<<4;g=N(c,12);j=c<<3;while(1){a=h+(e<<6)|0;d=b+(e<<2)|0;L[a>>2]=L[d>>2];l=c<<2;L[a+4>>2]=L[l+d>>2];L[a+8>>2]=L[d+j>>2];L[a+12>>2]=L[d+g>>2];L[a+16>>2]=L[d+f>>2];d=e+o<<2;L[a+20>>2]=L[d+b>>2];d=d+i|0;L[a+24>>2]=L[d>>2];L[a+28>>2]=L[d+l>>2];e=e+1|0;if((k|0)!=(e|0)){continue}break}}}function Tb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=oa-176|0;oa=d;a:{if(b&384){Pa(5943,11,c);break a}b:{if(!(b&1)){break b}e=H[a+96>>2];if(!e){break b}f=oa-80|0;oa=f;Pa(1792,13,c);F[f+79|0]=0;F[f+78|0]=9;g=H[e+4>>2];H[f+68>>2]=H[e>>2];H[f+72>>2]=g;j=f+78|0;H[f+64>>2]=j;Ha(c,7520,f- -64|0);g=H[e+12>>2];H[f+52>>2]=H[e+8>>2];H[f+56>>2]=g;H[f+48>>2]=j;Ha(c,7503,f+48|0);H[f+36>>2]=H[e+16>>2];H[f+32>>2]=j;Ha(c,7277,f+32|0);if(!(!H[e+24>>2]|!H[e+16>>2])){while(1){l=f+78|0;H[f+16>>2]=l;H[f+20>>2]=m;Ha(c,1824,f+16|0);j=H[e+24>>2];g=oa-48|0;oa=g;F[g+46|0]=9;F[g+47|0]=0;F[g+45|0]=9;n=N(m,52)+j|0;j=H[n+4>>2];H[g+36>>2]=H[n>>2];H[g+40>>2]=j;j=g+45|0;H[g+32>>2]=j;Ha(c,7209,g+32|0);H[g+20>>2]=H[n+24>>2];H[g+16>>2]=j;Ha(c,7455,g+16|0);H[g+4>>2]=H[n+32>>2];H[g>>2]=j;Ha(c,7428,g);oa=g+48|0;H[f>>2]=l;Ha(c,1702,f);m=m+1|0;if(m>>>0>2]){continue}break}}Pa(1710,2,c);oa=f+80|0}if(!(!(b&2)|!H[a+96>>2])){Pa(1931,36,c);e=H[a+112>>2];H[d+160>>2]=H[a+108>>2];H[d+164>>2]=e;Ha(c,2425,d+160|0);e=H[a+120>>2];H[d+144>>2]=H[a+116>>2];H[d+148>>2]=e;Ha(c,2391,d+144|0);e=H[a+132>>2];H[d+128>>2]=H[a+128>>2];H[d+132>>2]=e;Ha(c,2409,d+128|0);Sb(H[a+12>>2],H[H[a+96>>2]+16>>2],c);Pa(1710,2,c)}c:{if(!(b&8)|!H[a+96>>2]){break c}e=N(H[a+128>>2],H[a+132>>2]);if(!e){break c}h=H[a+180>>2];while(1){Sb(h,H[H[a+96>>2]+16>>2],c);h=h+5644|0;k=k+1|0;if((e|0)!=(k|0)){continue}break}}if(!(b&16)){break a}i=H[a+224>>2];Pa(1893,37,c);e=H[i>>2];b=H[i+4>>2];a=H[i+12>>2];H[d+120>>2]=H[i+8>>2];H[d+124>>2]=a;H[d+112>>2]=e;H[d+116>>2]=b;Ha(c,5730,d+112|0);Pa(1875,17,c);if(!(!H[i+28>>2]|!H[i+24>>2])){h=0;while(1){a=H[i+28>>2]+N(h,24)|0;g=J[a>>1];e=H[a+8>>2];b=H[a+12>>2];H[d+96>>2]=H[a+16>>2];H[d+88>>2]=e;H[d+92>>2]=b;H[d+80>>2]=g;Ha(c,7397,d+80|0);h=h+1|0;if(h>>>0>2]){continue}break}}Pa(1708,4,c);j=H[i+40>>2];d:{if(!j){break d}g=H[i+36>>2];if(!g){break d}k=0;h=0;while(1){a=j+N(h,40)|0;e=H[a+4>>2];e:{if(!e){break e}l=H[a+16>>2];if(!l){break e}b=H[l>>2];a=H[l+4>>2];if((a|0)<0){a=1}else{a=!b&(a|0)<=0}if(a|(H[l+8>>2]|H[l+12>>2])){break e}if(Kc(1439)){break d}}k=e+k|0;h=h+1|0;if((g|0)!=(h|0)){continue}break}if(!k){break d}Pa(1858,16,c);if(H[i+36>>2]){k=H[i+40>>2];n=0;while(1){f=N(n,40);l=H[(f+k|0)+4>>2];H[d+68>>2]=l;H[d+64>>2]=n;Ha(c,7467,d- -64|0);k=H[i+40>>2];f:{if(!l){break f}h=0;if(!H[(f+k|0)+16>>2]){break f}while(1){m=H[(f+H[i+40>>2]|0)+16>>2]+N(h,24)|0;j=H[m>>2];g=H[m+4>>2];e=H[m+8>>2];b=H[m+12>>2];a=H[m+20>>2];H[d+56>>2]=H[m+16>>2];H[d+60>>2]=a;H[d+48>>2]=e;H[d+52>>2]=b;H[d+40>>2]=j;H[d+44>>2]=g;H[d+32>>2]=h;Ha(c,10938,d+32|0);h=h+1|0;if((l|0)!=(h|0)){continue}break}k=H[i+40>>2]}a=f+k|0;g:{if(!H[a+24>>2]){break g}h=0;if(!H[a+20>>2]){break g}while(1){a=H[(f+k|0)+24>>2]+N(h,24)|0;g=J[a>>1];e=H[a+8>>2];b=H[a+12>>2];H[d+16>>2]=H[a+16>>2];H[d+8>>2]=e;H[d+12>>2]=b;H[d>>2]=g;Ha(c,7397,d);h=h+1|0;k=H[i+40>>2];if(h>>>0>2]){continue}break}}n=n+1|0;if(n>>>0>2]){continue}break}}Pa(1708,4,c)}Pa(1710,2,c)}oa=d+176|0}function De(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=oa-128|0;oa=e;H[e+120>>2]=0;a:{if((c|0)!=8){Ca(d,1,4047,0);Ca(d,1,4047,0);break a}Ea(b,a+228|0,2);Ea(b+2|0,e+124|0,4);Ea(b+6|0,e+116|0,1);Ea(b+7|0,e+120|0,1);c=H[a+228>>2];i=H[a+128>>2];if(c>>>0>=N(i,H[a+132>>2])>>>0){H[e+112>>2]=c;Ca(d,1,7843,e+112|0);break a}h=H[a+180>>2]+N(c,5644)|0;j=(c>>>0)/(i>>>0)|0;b=H[e+116>>2];b:{f=H[a+44>>2];if((f|0)>=0&(c|0)!=(f|0)){break b}f=H[h+5588>>2]+1|0;if((f|0)==(b|0)){break b}H[e+104>>2]=f;H[e+100>>2]=b;H[e+96>>2]=c;Ca(d,1,7867,e+96|0);f=0;break a}H[h+5588>>2]=b;c:{b=H[e+124>>2];if(b-1>>>0<=12){if((b|0)!=12){break c}H[e+64>>2]=12;Ca(d,2,11864,e- -64|0);b=H[e+124>>2]}if(!b){Ca(d,4,10695,0);H[a+56>>2]=1}d:{e:{f:{g:{g=H[h+5592>>2];if(g){b=H[e+116>>2];if(b>>>0>>0){break g}H[e+52>>2]=g;H[e+48>>2]=b;Ca(d,1,5150,e+48|0);H[a+56>>2]=1;f=0;break a}f=H[e+120>>2];if(f){break f}break d}f=H[e+120>>2];if(!f){break e}}g=(I[a+92|0]>>>4&1)+f|0;H[e+120>>2]=g;b=H[e+116>>2];f=H[h+5592>>2];if(b>>>0>f-1>>>0){H[e+20>>2]=f;H[e+16>>2]=b;Ca(d,1,5051,e+16|0);H[a+56>>2]=1;f=0;break a}if(b>>>0>=g>>>0){H[e+36>>2]=g;H[e+32>>2]=b;Ca(d,1,5250,e+32|0);H[a+56>>2]=1;f=0;break a}H[h+5592>>2]=g}if((H[e+116>>2]+1|0)!=(g|0)){break d}F[a+92|0]=I[a+92|0]|1}b=H[e+124>>2];H[a+8>>2]=16;H[a+24>>2]=H[a+56>>2]?0:b-12|0;f=H[a+44>>2];h:{if((f|0)==-1){f=4;b=c-N(j,i)|0;if(!(b>>>0>2]|b>>>0>=K[a+36>>2]|j>>>0>2])){f=j>>>0>=K[a+40>>2]?4:0}F[a+92|0]=I[a+92|0]&251|f;b=H[a+228>>2];break h}b=H[a+228>>2];F[a+92|0]=I[a+92|0]&251|((f|0)!=(b|0)?4:0)}c=H[H[a+224>>2]+40>>2]+N(b,40)|0;H[c>>2]=b;H[c+12>>2]=H[e+116>>2];f=H[e+120>>2];if(!H[a+76>>2]){if(K[c+4>>2]>=f>>>0){f=1;break a}H[e>>2]=b;Ca(d,2,1612,e);H[a+76>>2]=1;f=H[e+120>>2]}b=H[a+228>>2];c=H[H[a+224>>2]+40>>2];if(f){b=N(b,40)+c|0;H[b+4>>2]=f;c=H[e+120>>2];H[b+8>>2]=c;b=H[b+16>>2];if(!b){b=Fa(c,24);H[(H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0)+16>>2]=b;if(b){f=1;break a}f=0;Ca(d,1,6947,0);break a}b=Ia(b,N(c,24));c=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;if(!b){Da(H[c+16>>2]);f=0;H[(H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0)+16>>2]=0;Ca(d,1,6947,0);break a}H[c+16>>2]=b;f=1;break a}i:{f=N(b,40)+c|0;g=H[f+16>>2];if(g){break i}H[f+8>>2]=10;g=Fa(10,24);c=H[H[a+224>>2]+40>>2];b=H[a+228>>2];H[(c+N(b,40)|0)+16>>2]=g;if(g){break i}f=0;H[(N(b,40)+c|0)+8>>2]=0;Ca(d,1,6947,0);break a}b=N(b,40)+c|0;c=H[e+116>>2];if(K[b+8>>2]>c>>>0){f=1;break a}f=1;h=b;b=c+1|0;H[h+8>>2]=b;b=Ia(g,N(b,24));c=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;if(!b){Da(H[c+16>>2]);f=0;a=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;H[a+8>>2]=0;H[a+16>>2]=0;Ca(d,1,6947,0);break a}H[c+16>>2]=b;break a}H[e+80>>2]=b;Ca(d,1,12133,e+80|0);f=0}oa=e+128|0;return f|0}function qb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=H[a+8>>2];e=g+H[a+4>>2]|0;a:{if(!H[a+12>>2]){if((e|0)<2|(d|0)<=0){break a}q=e&2147483644;m=e&3;r=e&1;s=g+1|0;h=H[a>>2];o=h+(e<<2)|0;t=e-4>>>1|0;a=e-1|0;u=h+(a<<2)|0;v=N(c,g)<<2;l=e>>>0<4;w=N(a>>>1|0,c)<<2;while(1){g=H[b+v>>2];e=H[b>>2]-(g+1>>1)|0;i=0;a=0;if(!l){while(1){j=a+1|0;x=H[(N(j,c)<<2)+b>>2];f=H[(N(a+s|0,c)<<2)+b>>2];p=h+(i<<2)|0;H[p>>2]=e;k=e;e=x-((g+f|0)+2>>2)|0;H[p+4>>2]=(k+e>>1)+g;i=i+2|0;k=(a|0)!=(t|0);g=f;a=j;if(k){continue}break}}H[h+(i<<2)>>2]=e;if(r){a=H[b+w>>2]-(g+1>>1)|0;H[u>>2]=a;e=a+e>>1;a=-8}else{a=-4}H[a+o>>2]=e+g;e=0;a=0;g=0;if(!l){while(1){H[(N(a,c)<<2)+b>>2]=H[h+(a<<2)>>2];f=a|1;H[(N(f,c)<<2)+b>>2]=H[h+(f<<2)>>2];f=a|2;H[(N(f,c)<<2)+b>>2]=H[h+(f<<2)>>2];f=a|3;H[(N(f,c)<<2)+b>>2]=H[h+(f<<2)>>2];a=a+4|0;g=g+4|0;if((q|0)!=(g|0)){continue}break}}if(m){while(1){H[(N(a,c)<<2)+b>>2]=H[h+(a<<2)>>2];a=a+1|0;e=e+1|0;if((m|0)!=(e|0)){continue}break}}b=b+4|0;n=n+1|0;if((n|0)!=(d|0)){continue}break}break a}b:{switch(e-1|0){case 0:if((d|0)<=0){break a}if(d>>>0>=4){c=d&2147483644;a=0;while(1){H[b>>2]=H[b>>2]/2;H[b+4>>2]=H[b+4>>2]/2;H[b+8>>2]=H[b+8>>2]/2;H[b+12>>2]=H[b+12>>2]/2;b=b+16|0;a=a+4|0;if((c|0)!=(a|0)){continue}break}}c=d&3;if(!c){break a}a=0;while(1){H[b>>2]=H[b>>2]/2;b=b+4|0;a=a+1|0;if((c|0)!=(a|0)){continue}break};break a;case 1:if((d|0)<=0){break a}a=H[a>>2];e=0;g=N(c,g)<<2;while(1){f=b+g|0;j=H[b>>2]-(H[f>>2]+1>>1)|0;H[a+4>>2]=j;f=j+H[f>>2]|0;H[a>>2]=f;H[b>>2]=f;H[(c<<2)+b>>2]=H[a+4>>2];b=b+4|0;e=e+1|0;if((e|0)!=(d|0)){continue}break};break a;default:break b}}if((e|0)<3|(d|0)<=0){break a}q=e&2147483644;m=e&3;h=H[a>>2];r=(h+(e<<2)|0)-4|0;a=e-2|0;s=h+(a<<2)|0;o=e&1;f=!o;t=((e-f|0)-4>>>1|0)+1|0;u=N(c,g)<<2;v=a-f>>>0<2;w=N((e>>>1|0)-1|0,c)<<2;x=e-1>>>0<3;while(1){l=b+u|0;g=H[l+(c<<2)>>2];a=H[l>>2];e=H[b>>2]-((g+a|0)+2>>2)|0;H[h>>2]=e+a;i=1;a=1;if(!v){while(1){p=H[(N(a,c)<<2)+b>>2];j=a+1|0;f=H[l+(N(j,c)<<2)>>2];y=h+(i<<2)|0;H[y>>2]=e;k=e;e=p-((g+f|0)+2>>2)|0;H[y+4>>2]=(k+e>>1)+g;i=i+2|0;k=(a|0)!=(t|0);a=j;g=f;if(k){continue}break}}H[h+(i<<2)>>2]=e;c:{if(!o){a=H[b+w>>2]-(g+1>>1)|0;H[s>>2]=(e+a>>1)+g;break c}a=e+g|0}H[r>>2]=a;e=0;a=0;g=0;if(!x){while(1){H[(N(a,c)<<2)+b>>2]=H[h+(a<<2)>>2];f=a|1;H[(N(f,c)<<2)+b>>2]=H[h+(f<<2)>>2];f=a|2;H[(N(f,c)<<2)+b>>2]=H[h+(f<<2)>>2];f=a|3;H[(N(f,c)<<2)+b>>2]=H[h+(f<<2)>>2];a=a+4|0;g=g+4|0;if((q|0)!=(g|0)){continue}break}}if(m){while(1){H[(N(a,c)<<2)+b>>2]=H[h+(a<<2)>>2];a=a+1|0;e=e+1|0;if((m|0)!=(e|0)){continue}break}}b=b+4|0;n=n+1|0;if((n|0)!=(d|0)){continue}break}}}function Nb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;r=oa-16|0;oa=r;a:{if(!c){Ca(d,1,11629,0);break a}t=H[c+16>>2];i=H[a+96>>2];if(t>>>0>2]){Ca(d,1,10570,0);break a}f=H[a+128>>2];g=N(f,H[a+132>>2]);if(g>>>0<=e>>>0){H[r>>2]=e;H[r+4>>2]=g-1;Ca(d,1,16362,r);g=0;break a}j=(e>>>0)/(f>>>0)|0;f=e-N(j,f)|0;h=H[a+108>>2]+N(f,H[a+116>>2])|0;H[c>>2]=h;g=H[i>>2];l=g>>>0>>0?h:g;H[c>>2]=l;f=H[a+108>>2]+N(H[a+116>>2],f+1|0)|0;H[c+8>>2]=f;g=H[H[a+96>>2]+8>>2];f=f>>>0>>0?f:g;H[c+8>>2]=f;i=H[a+112>>2]+N(j,H[a+120>>2])|0;H[c+4>>2]=i;g=H[H[a+96>>2]+4>>2];h=g>>>0>>0?i:g;H[c+4>>2]=h;i=H[a+112>>2]+N(H[a+120>>2],j+1|0)|0;H[c+12>>2]=i;g=H[H[a+96>>2]+12>>2];g=g>>>0>i>>>0?i:g;H[c+12>>2]=g;i=H[a+96>>2];m=H[i+16>>2];if(m){u=g-1|0;v=(g>>31)-!g|0;w=f-1|0;x=(f>>31)-!f|0;y=h-1|0;z=0-!h|0;A=l-1|0;B=0-!l|0;C=H[i+24>>2];g=H[c+24>>2];while(1){i=H[(C+N(q,52)|0)+40>>2];H[g+40>>2]=i;f=B;l=H[g>>2];h=l+A|0;f=l>>>0>h>>>0?f+1|0:f;n=Ke(h,f,l,0);H[g+16>>2]=n;f=z;h=H[g+4>>2];j=h+y|0;f=h>>>0>j>>>0?f+1|0:f;f=Ke(j,f,h,0);H[g+20>>2]=f;j=f;p=i;f=i&31;if((i&63)>>>0>=32){k=-1<>>32-f;f=-1<>31)+(i>>>0>>0)|0)|0;j=o;o=p&31;if((p&63)>>>0>=32){o=k>>o}else{o=((1<>>o}k=h>>31;s=k+v|0;j=h+u|0;s=j>>>0>>0?s+1|0:s;j=Je(j,s,h,k);h=i-j|0;j=f-((j>>31)+(i>>>0>>0)|0)|0;k=p&31;if((p&63)>>>0>=32){j=j>>k}else{j=((1<>>k}H[g+12>>2]=o-j;j=f-((n>>31)+(i>>>0>>0)|0)|0;h=i-n|0;n=p&31;if((p&63)>>>0>=32){n=j>>n}else{n=((1<>>n}j=l>>31;k=j+x|0;h=l+w|0;k=h>>>0>>0?k+1|0:k;l=Je(h,k,l,j);h=i-l|0;i=f-((l>>31)+(i>>>0>>0)|0)|0;f=h;h=p&31;if((p&63)>>>0>=32){f=i>>h}else{f=((1<>>h}H[g+8>>2]=n-f;g=g+52|0;q=q+1|0;if((q|0)!=(m|0)){continue}break}}if(m>>>0>>0){g=H[c+24>>2];while(1){f=N(m,52);Da(H[(f+g|0)+44>>2]);g=H[c+24>>2];H[(f+g|0)+44>>2]=0;m=m+1|0;if(m>>>0>2]){continue}break}H[c+16>>2]=H[H[a+96>>2]+16>>2]}g=H[a+100>>2];if(g){Va(g)}f=zb();H[a+100>>2]=f;g=0;if(!f){break a}Lb(c,f);H[a+44>>2]=e;if(!Ya(H[a+216>>2],24,d)){break a}h=H[a+216>>2];e=H[h>>2];m=H[h+8>>2];b:{if(e){g=1;i=e&1;if((e|0)==1){e=0}else{f=e&-2;q=0;while(1){e=0;c:{if(!g){break c}e=0;if(!(sa[H[m>>2]](a,b,d)|0)){break c}e=(sa[H[m+4>>2]](a,b,d)|0)!=0}g=e;m=m+8|0;q=q+2|0;if((f|0)!=(q|0)){continue}break}e=!g}g=i?0:g;if(!(e|!i)){g=(sa[H[m>>2]](a,b,d)|0)!=0}Qa(h);if(g){break b}Va(H[a+96>>2]);g=0;H[a+96>>2]=0;break a}Qa(h)}g=Ob(a,c)}oa=r+16|0;return g|0}function hc(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:{n=N(e,3);h=H[b>>2]>>>n|0;if(h&2097168){break a}h=h&495;if(!h){break a}o=a+28|0;l=o+(I[h+H[a+108>>2]|0]<<2)|0;H[a+104>>2]=l;k=H[l>>2];i=H[k>>2];h=H[a+4>>2]-i|0;H[a+4>>2]=h;j=H[a>>2];b:{if(j>>>16>>>0>>0){m=H[k+4>>2];H[a+4>>2]=i;h=h>>>0>>0;H[l>>2]=H[k+(h?8:12)>>2];k=h?m:!m;h=H[a+8>>2];while(1){c:{if(h){break c}h=H[a+16>>2];m=h+1|0;l=I[h+1|0];if(I[h|0]==255){if(l>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;h=8;break c}H[a+16>>2]=m;j=(l<<9)+j|0;h=7;break c}H[a+16>>2]=m;h=8;j=(l<<8)+j|0}h=h-1|0;H[a+8>>2]=h;j=j<<1;H[a>>2]=j;i=i<<1;H[a+4>>2]=i;if(i>>>0<32768){continue}break}h=i;break b}j=j-(i<<16)|0;H[a>>2]=j;if(!(h&32768)){m=H[k+4>>2];i=h>>>0>>0;H[l>>2]=H[k+(i?12:8)>>2];k=i?!m:m;i=H[a+8>>2];while(1){d:{if(i){break d}i=H[a+16>>2];m=i+1|0;l=I[i+1|0];if(I[i|0]==255){if(l>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;i=8;break d}H[a+16>>2]=m;j=(l<<9)+j|0;i=7;break d}H[a+16>>2]=m;i=8;j=(l<<8)+j|0}i=i-1|0;H[a+8>>2]=i;j=j<<1;H[a>>2]=j;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break b}k=H[k+4>>2]}e:{if(!k){break e}p=b-4|0;i=H[b>>2];k=H[b+4>>2]>>>n+17&4|(H[p>>2]>>>n+19&1|(i>>>n+16&64|i>>>n&170|i>>>(e?n+12|0:14)&16));m=o+(I[k+24384|0]<<2)|0;H[a+104>>2]=m;l=H[m>>2];i=H[l>>2];h=h-i|0;H[a+4>>2]=h;o=I[k+24640|0];f:{if(j>>>16>>>0>>0){k=H[l+4>>2];H[a+4>>2]=i;h=h>>>0>>0;H[m>>2]=H[l+(h?8:12)>>2];l=h?k:!k;h=H[a+8>>2];while(1){g:{if(h){break g}h=H[a+16>>2];m=h+1|0;k=I[h+1|0];if(I[h|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;h=8;break g}H[a+16>>2]=m;j=(k<<9)+j|0;h=7;break g}H[a+16>>2]=m;h=8;j=(k<<8)+j|0}h=h-1|0;H[a+8>>2]=h;j=j<<1;H[a>>2]=j;i=i<<1;H[a+4>>2]=i;if(i>>>0<32768){continue}break}break f}k=j-(i<<16)|0;H[a>>2]=k;if(!(h&32768)){j=H[l+4>>2];i=h>>>0>>0;H[m>>2]=H[l+(i?12:8)>>2];l=i?!j:j;j=H[a+8>>2];while(1){h:{if(j){break h}j=H[a+16>>2];m=j+1|0;i=I[j+1|0];if(I[j|0]==255){if(i>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;k=k+65280|0;j=8;break h}H[a+16>>2]=m;k=(i<<9)+k|0;j=7;break h}H[a+16>>2]=m;j=8;k=(i<<8)+k|0}j=j-1|0;H[a+8>>2]=j;k=k<<1;H[a>>2]=k;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break f}l=H[l+4>>2]}H[c>>2]=(l|0)==(o|0)?d:0-d|0;H[p>>2]=H[p>>2]|32<>2]=H[b>>2]|(c<<19|16)<>2]=H[b+4>>2]|8<>2]=H[a+4>>2]|32768;H[a>>2]=H[a>>2]|c<<31|65536;a=a-4|0;H[a>>2]=H[a>>2]|131072}if((e|0)!=3){break e}a=(f<<2)+b|0;H[a+4>>2]=H[a+4>>2]|1;H[a>>2]=H[a>>2]|c<<18|2;a=a-4|0;H[a>>2]=H[a>>2]|4}H[b>>2]=H[b>>2]|2097152<>2];a:{if(!(!(H[H[a+180>>2]+5596>>2]?H[a+128>>2]!=1|H[a+132>>2]!=1:1)|H[a+8>>2]==8)){Ca(g,1,10614,0);break a}m=H[b+16>>2];b:{if(!m){break b}k=H[a+184>>2];l=H[b+24>>2];if(m>>>0>=8){p=m&-8;while(1){H[(N(i,52)+l|0)+40>>2]=k;H[(N(i|1,52)+l|0)+40>>2]=k;H[(N(i|2,52)+l|0)+40>>2]=k;H[(N(i|3,52)+l|0)+40>>2]=k;H[(N(i|4,52)+l|0)+40>>2]=k;H[(N(i|5,52)+l|0)+40>>2]=k;H[(N(i|6,52)+l|0)+40>>2]=k;H[(N(i|7,52)+l|0)+40>>2]=k;i=i+8|0;n=n+8|0;if((p|0)!=(n|0)){continue}break}}m=m&7;if(!m){break b}while(1){H[(N(i,52)+l|0)+40>>2]=k;i=i+1|0;o=o+1|0;if((m|0)!=(o|0)){continue}break}}if(!(c|d|e|f)){Ca(g,4,6344,0);H[a+28>>2]=0;H[a+32>>2]=0;c=H[a+132>>2];H[a+36>>2]=H[a+128>>2];H[a+40>>2]=c;H[b>>2]=H[j>>2];H[b+4>>2]=H[j+4>>2];H[b+8>>2]=H[j+8>>2];H[b+12>>2]=H[j+12>>2];i=Ab(b,g);break a}if((c|0)<0){H[h>>2]=c;Ca(g,1,12602,h);i=0;break a}i=H[j+8>>2];if(i>>>0>>0){H[h+20>>2]=i;H[h+16>>2]=c;Ca(g,1,13070,h+16|0);i=0;break a}i=H[j>>2];c:{if(i>>>0>c>>>0){H[h+196>>2]=i;H[h+192>>2]=c;Ca(g,2,13422,h+192|0);H[a+28>>2]=0;c=H[j>>2];break c}H[a+28>>2]=(c-H[a+108>>2]>>>0)/K[a+116>>2]}H[b>>2]=c;if((d|0)<0){H[h+32>>2]=d;Ca(g,1,12538,h+32|0);i=0;break a}c=H[j+12>>2];if(c>>>0>>0){H[h+52>>2]=c;H[h+48>>2]=d;Ca(g,1,12897,h+48|0);i=0;break a}c=H[j+4>>2];d:{if(c>>>0>d>>>0){H[h+180>>2]=c;H[h+176>>2]=d;Ca(g,2,13247,h+176|0);H[a+32>>2]=0;d=H[j+4>>2];break d}H[a+32>>2]=(d-H[a+112>>2]>>>0)/K[a+120>>2]}H[b+4>>2]=d;i=0;if((e|0)<=0){H[h+64>>2]=e;Ca(g,1,12472,h- -64|0);break a}c=H[j>>2];if(c>>>0>e>>>0){H[h+84>>2]=c;H[h+80>>2]=e;Ca(g,1,13333,h+80|0);break a}c=H[j+8>>2];e:{if(c>>>0>>0){H[h+164>>2]=c;H[h+160>>2]=e;Ca(g,2,12982,h+160|0);H[a+36>>2]=H[a+128>>2];e=H[j+8>>2];break e}k=0;d=e-H[a+108>>2]|0;l=d;c=H[a+116>>2];d=d+c|0;k=l>>>0>d>>>0?1:k;q=a,r=Ke(d-1|0,k-!d|0,c,0),H[q+36>>2]=r}H[b+8>>2]=e;if((f|0)<=0){H[h+96>>2]=f;Ca(g,1,12405,h+96|0);break a}c=H[j+4>>2];if(c>>>0>f>>>0){H[h+116>>2]=c;H[h+112>>2]=f;Ca(g,1,13157,h+112|0);break a}c=H[j+12>>2];f:{if(c>>>0>>0){H[h+148>>2]=c;H[h+144>>2]=f;Ca(g,2,12808,h+144|0);H[a+40>>2]=H[a+132>>2];f=H[j+12>>2];break f}e=0;d=f-H[a+112>>2]|0;l=d;c=H[a+120>>2];d=d+c|0;e=l>>>0>d>>>0?1:e;q=a,r=Ke(d-1|0,e-!d|0,c,0),H[q+40>>2]=r}H[b+12>>2]=f;F[a+92|0]=I[a+92|0]|2;if(!Ab(b,g)){break a}a=H[b>>2];c=H[b+4>>2];d=H[b+12>>2];H[h+136>>2]=H[b+8>>2];H[h+140>>2]=d;H[h+128>>2]=a;H[h+132>>2]=c;Ca(g,4,7566,h+128|0);i=1}oa=h+208|0;return i|0}function gc(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:{m=N(e,3);g=H[b>>2]>>>m|0;if(g&2097168){break a}n=a+28|0;k=n+(I[H[a+108>>2]+(g&495)|0]<<2)|0;H[a+104>>2]=k;j=H[k>>2];h=H[j>>2];g=H[a+4>>2]-h|0;H[a+4>>2]=g;i=H[a>>2];b:{if(i>>>16>>>0>>0){l=H[j+4>>2];H[a+4>>2]=h;g=g>>>0>>0;H[k>>2]=H[j+(g?8:12)>>2];j=g?l:!l;g=H[a+8>>2];while(1){c:{if(g){break c}g=H[a+16>>2];l=g+1|0;k=I[g+1|0];if(I[g|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;g=8;break c}H[a+16>>2]=l;i=(k<<9)+i|0;g=7;break c}H[a+16>>2]=l;g=8;i=(k<<8)+i|0}g=g-1|0;H[a+8>>2]=g;i=i<<1;H[a>>2]=i;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}g=h;break b}i=i-(h<<16)|0;H[a>>2]=i;if(!(g&32768)){l=H[j+4>>2];h=g>>>0>>0;H[k>>2]=H[j+(h?12:8)>>2];j=h?!l:l;h=H[a+8>>2];while(1){d:{if(h){break d}h=H[a+16>>2];l=h+1|0;k=I[h+1|0];if(I[h|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;h=8;break d}H[a+16>>2]=l;i=(k<<9)+i|0;h=7;break d}H[a+16>>2]=l;h=8;i=(k<<8)+i|0}h=h-1|0;H[a+8>>2]=h;i=i<<1;H[a>>2]=i;g=g<<1;H[a+4>>2]=g;if(g>>>0<32768){continue}break}break b}j=H[j+4>>2]}if(!j){break a}j=n;n=b-4|0;h=H[b>>2];o=H[b+4>>2]>>>m+17&4|(H[n>>2]>>>m+19&1|(h>>>m+16&64|h>>>m&170|h>>>(e?m+12|0:14)&16));l=j+(I[o+24384|0]<<2)|0;H[a+104>>2]=l;k=H[l>>2];h=H[k>>2];g=g-h|0;H[a+4>>2]=g;e:{if(i>>>16>>>0>>0){j=H[k+4>>2];H[a+4>>2]=h;g=g>>>0>>0;H[l>>2]=H[k+(g?8:12)>>2];k=g?j:!j;g=H[a+8>>2];while(1){f:{if(g){break f}g=H[a+16>>2];l=g+1|0;j=I[g+1|0];if(I[g|0]==255){if(j>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;g=8;break f}H[a+16>>2]=l;i=(j<<9)+i|0;g=7;break f}H[a+16>>2]=l;g=8;i=(j<<8)+i|0}g=g-1|0;H[a+8>>2]=g;i=i<<1;H[a>>2]=i;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break e}j=i-(h<<16)|0;H[a>>2]=j;if(!(g&32768)){i=H[k+4>>2];h=g>>>0>>0;H[l>>2]=H[k+(h?12:8)>>2];k=h?!i:i;i=H[a+8>>2];while(1){g:{if(i){break g}i=H[a+16>>2];l=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;i=8;break g}H[a+16>>2]=l;j=(h<<9)+j|0;i=7;break g}H[a+16>>2]=l;i=8;j=(h<<8)+j|0}i=i-1|0;H[a+8>>2]=i;j=j<<1;H[a>>2]=j;g=g<<1;H[a+4>>2]=g;if(g>>>0<32768){continue}break}break e}k=H[k+4>>2]}g=c;c=I[o+24640|0];H[g>>2]=(c|0)==(k|0)?d:0-d|0;H[n>>2]=H[n>>2]|32<>2]=H[b>>2]|(d<<19|16)<>2]=H[b+4>>2]|8<>2]<<2)+b|0;H[c+4>>2]=H[c+4>>2]|32768;H[c>>2]=H[c>>2]|d<<31|65536;c=c-4|0;H[c>>2]=H[c>>2]|131072}if((e|0)!=3){break a}a=(H[a+124>>2]<<2)+b|0;H[a+4>>2]=H[a+4>>2]|4;H[a+12>>2]=H[a+12>>2]|1;H[a+8>>2]=H[a+8>>2]|d<<18|2}}function Zd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=oa-112|0;oa=e;j=1024;a:{b:{h=Fa(1,1024);if(h){l=e+92|0;k=e+108|0;while(1){c:{d:{d=e+104|0;e:{if((Ka(b,d,8,c)|0)!=8){break e}Ea(d,e+88|0,4);Ea(k,l,4);f=8;f:{g:{h:{i:{switch(H[e+88>>2]){case 0:d=Sa(b);g=ra;if((g|0)<0){g=1}else{g=d>>>0<4294967288&(g|0)<=0}if(g){break h}Ca(c,1,8449,0);break e;case 1:break i;default:break f}}d=e+104|0;if((Ka(b,d,8,c)|0)!=8){break e}Ea(d,e+100|0,4);if(!H[e+100>>2]){break g}Ca(c,1,8449,0);break e}H[e+88>>2]=d+8;break f}Ea(k,e+88|0,4);f=16}d=H[e+92>>2];if((d|0)==1785737827){b=H[a+100>>2];if(b&4){H[a+100>>2]=b|8;break e}Ca(c,1,5702,0);Da(h);a=0;break a}i=H[e+88>>2];if(!i){Ca(c,1,3268,0);Da(h);a=0;break a}if(f>>>0>i>>>0){H[e+4>>2]=d;H[e>>2]=i;Ca(c,1,13933,e);break b}j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{if((d|0)<=1668246641){if((d|0)==1651532643){break r}if((d|0)==1667523942){break p}if((d|0)!=1668112752){break s}g=25296;break n}if((d|0)<=1783635999){if((d|0)==1668246642){break o}g=25264;if((d|0)==1768449138){break n}if((d|0)!=1718909296){break s}g=25240;break l}if((d|0)==1885564018){break q}if((d|0)==1783636e3){break m}g=25248;if((d|0)==1785737832){break l}}d=H[a+100>>2];if(d&1){break j}Ca(c,1,2062,0);Da(h);a=0;break a}g=25280;break n}g=25288;break n}g=25304;break n}g=25272}H[e+76>>2]=d&255;H[e+64>>2]=d>>>24;H[e+72>>2]=d>>>8&255;H[e+68>>2]=d>>>16&255;Ca(c,2,2011,e- -64|0);f=i-f|0;if(I[a+100|0]&4){break k}d=H[e+92>>2];H[e+48>>2]=d>>>24;H[e+60>>2]=d&255;H[e+52>>2]=d>>>16&255;H[e+56>>2]=d>>>8&255;Ca(c,2,6771,e+48|0);H[a+100>>2]=H[a+100>>2]|2147483647;d=ub(b,f,c);if(!ra&(d|0)==(f|0)){continue}Ca(c,1,3748,0);Da(h);a=0;break a}g=25232}f=i-f|0}d=f;f=Sa(b);i=ra;if((i|0)<0){f=1}else{f=(i|0)<=0&d>>>0>f>>>0}if(f){f=H[e+88>>2];a=H[e+92>>2];m=e,n=Sa(b),H[m+40>>2]=n;H[e+36>>2]=d;H[e+32>>2]=a&255;H[e+20>>2]=a>>>24;H[e+16>>2]=f;H[e+28>>2]=a>>>8&255;H[e+24>>2]=a>>>16&255;Ca(c,1,15680,e+16|0);break b}if(d>>>0<=j>>>0){f=h;break c}j=d;f=Ia(h,d);if(f){break c}Da(h);Ca(c,1,2193,0);a=0;break a}if(!(d&2)){Ca(c,1,2132,0);Da(h);a=0;break a}H[a+100>>2]=d|2147483647;d=i-f|0;f=ub(b,d,c);if(!ra&(d|0)==(f|0)){continue}if(!(I[a+100|0]&8)){break d}Ca(c,2,3748,0)}Da(h);a=1;break a}Ca(c,1,3748,0);Da(h);a=0;break a}if((Ka(b,f,d,c)|0)!=(d|0)){Ca(c,1,3798,0);Da(f);a=0;break a}h=f;if(sa[H[g+4>>2]](a,f,d,c)|0){continue}break}Da(f);a=0;break a}Ca(c,1,4923,0);a=0;break a}Da(h);a=0}oa=e+112|0;return a|0}function le(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=oa-16|0;oa=g;if(H[a+8>>2]==16){h=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{h=H[a+12>>2]}a:{if(c>>>0<=1){Ca(d,1,4721,0);a=0;break a}Ea(b,g+12|0,2);if(H[g+12>>2]){Ca(d,2,5897,0);a=1;break a}if(c>>>0<=6){Ca(d,1,4721,0);a=0;break a}Ea(b+2|0,g+8|0,1);j=H[h+5628>>2];a=j;b:{c:{d:{e=H[h+5632>>2];if(!e){break d}i=H[g+8>>2];while(1){if((i|0)==H[a>>2]){break d}a=a+20|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}break c}if((e|0)!=(f|0)){break b}}if((e|0)==H[h+5636>>2]){a=e+10|0;H[h+5636>>2]=a;a=Ia(j,N(a,20));if(!a){Da(H[h+5628>>2]);H[h+5636>>2]=0;H[h+5628>>2]=0;H[h+5632>>2]=0;Ca(d,1,4747,0);a=0;break a}H[h+5628>>2]=a;e=H[h+5632>>2];f=N(H[h+5636>>2]-e|0,20);if(f){y(a+N(e,20)|0,0,f)}j=H[h+5628>>2];e=H[h+5632>>2]}a=N(e,20)+j|0;n=1}H[a>>2]=H[g+8>>2];Ea(b+3|0,g+12|0,2);if(H[g+12>>2]){Ca(d,2,5897,0);a=1;break a}Ea(b+5|0,g+4|0,2);f=H[g+4>>2];if(f>>>0>=2){Ca(d,2,3130,0);a=1;break a}e=c-7|0;if(f){c=b+7|0;j=0;while(1){if(e>>>0<=2){Ca(d,1,4721,0);a=0;break a}Ea(c,g+12|0,1);if(H[g+12>>2]!=1){Ca(d,2,5579,0);a=1;break a}Ea(c+1|0,g,2);f=H[g>>2];b=f&32767;H[a+4>>2]=b;i=e-3|0;e=(f>>>15|0)+1|0;k=N(e,b)+2|0;if(i>>>0>>0){Ca(d,1,4721,0);a=0;break a}c=c+3|0;f=0;if(b){while(1){Ea(c,g+12|0,e);if(H[g+12>>2]!=(f|0)){Ca(d,2,6259,0);a=1;break a}c=c+e|0;f=f+1|0;if(f>>>0>2]){continue}break}}Ea(c,g,2);e=H[g>>2];b=e&32767;H[g>>2]=b;if((b|0)!=H[a+4>>2]){Ca(d,2,3306,0);a=1;break a}e=(e>>>15|0)+1|0;l=N(e,b)+3|0;k=i-k|0;if(l>>>0>k>>>0){Ca(d,1,4721,0);a=0;break a}c=c+2|0;f=0;if(b){while(1){Ea(c,g+12|0,e);if(H[g+12>>2]!=(f|0)){Ca(d,2,6259,0);a=1;break a}c=c+e|0;f=f+1|0;if(f>>>0>2]){continue}break}}Ea(c,g+12|0,3);e=H[g+12>>2];H[a+8>>2]=0;H[a+12>>2]=0;F[a+16|0]=!(e&65536)|I[a+16|0]&254;i=e&255;H[g+8>>2]=i;e:{if(!i){break e}m=H[h+5620>>2];if(m){f=H[h+5616>>2];b=0;while(1){if((i|0)==H[f+8>>2]){H[a+8>>2]=f;break e}f=f+20|0;b=b+1|0;if((m|0)!=(b|0)){continue}break}}Ca(d,1,4721,0);a=0;break a}e=e>>>8&255;H[g+8>>2]=e;f:{if(!e){break f}i=H[h+5620>>2];if(i){f=H[h+5616>>2];b=0;while(1){if((e|0)==H[f+8>>2]){H[a+12>>2]=f;break f}f=f+20|0;b=b+1|0;if((i|0)!=(b|0)){continue}break}}Ca(d,1,4721,0);a=0;break a}e=k-l|0;c=c+3|0;j=j+1|0;if(j>>>0>2]){continue}break}}if(e){Ca(d,1,4721,0);a=0;break a}a=1;if(!n){break a}H[h+5632>>2]=H[h+5632>>2]+1;a=1}oa=g+16|0;return a|0}function gd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(K[a+44>>2]>=8){i=H[a+40>>2];l=8;while(1){k=H[a+12>>2]<<5;e=H[a>>2];g=H[a+36>>2];b=H[a+16>>2];h=H[a+20>>2];a:{if(b>>>0>=h>>>0){break a}j=e+k|0;d=b+1|0;if(h-b&1){c=j+(b<<6)|0;b=(N(b,g)<<2)+i|0;f=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=f;f=H[b+28>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=f;f=H[b+20>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=f;f=H[b+12>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=f;b=d}if((d|0)==(h|0)){break a}while(1){d=(N(b,g)<<2)+i|0;f=H[d+4>>2];c=j+(b<<6)|0;H[c>>2]=H[d>>2];H[c+4>>2]=f;f=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=f;f=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=f;f=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=f;d=b+1|0;c=j+(d<<6)|0;d=(N(d,g)<<2)+i|0;f=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=f;f=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=f;f=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=f;f=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=f;b=b+2|0;if((h|0)!=(b|0)){continue}break}}b=H[a+24>>2];h=H[a+28>>2];b:{if(b>>>0>=h>>>0){break b}j=(e-k|0)+32|0;k=(N(g,H[a+8>>2])<<2)+i|0;d=b+1|0;if(h-b&1){c=j+(b<<6)|0;b=k+(N(b,g)<<2)|0;e=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=e;e=H[b+28>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=e;e=H[b+20>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=e;e=H[b+12>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=e;b=d}if((d|0)==(h|0)){break b}while(1){d=k+(N(b,g)<<2)|0;e=H[d+4>>2];c=j+(b<<6)|0;H[c>>2]=H[d>>2];H[c+4>>2]=e;e=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;d=b+1|0;c=j+(d<<6)|0;d=k+(N(d,g)<<2)|0;e=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;e=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=e;b=b+2|0;if((h|0)!=(b|0)){continue}break}}Wa(a);b=0;if(H[a+32>>2]){while(1){d=H[a>>2]+(b<<5)|0;c=H[d+4>>2];g=(N(H[a+36>>2],b)<<2)+i|0;H[g>>2]=H[d>>2];H[g+4>>2]=c;c=H[d+28>>2];H[g+24>>2]=H[d+24>>2];H[g+28>>2]=c;c=H[d+20>>2];H[g+16>>2]=H[d+16>>2];H[g+20>>2]=c;c=H[d+12>>2];H[g+8>>2]=H[d+8>>2];H[g+12>>2]=c;b=b+1|0;if(b>>>0>2]){continue}break}}i=i+32|0;l=l+8|0;if(l>>>0<=K[a+44>>2]){continue}break}}Da(H[a>>2]);Da(a)}function pd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;c=H[b>>2]+7&-8;H[b>>2]=c+16;q=a;b=H[c>>2];a=H[c+4>>2];d=H[c+8>>2];c=H[c+12>>2];r=c;g=oa-32|0;oa=g;f=c&65535;e=d;d=0;c=c>>>16&32767;o=c;a:{if(c-15361>>>0<=2045){c=f<<4|e>>>28;d=e<<4|a>>>28;f=o-15360|0;a=a&268435455;b:{if((a|0)==134217728&(b|0)!=0|a>>>0>134217728){d=d+1|0;c=d?c:c+1|0;break b}if(b|(a|0)!=134217728){break b}a=d;d=d+(d&1)|0;c=a>>>0>d>>>0?c+1|0:c}a=d;d=c>>>0>1048575;b=d?0:a;a=d?0:c;c=0;e=f;f=d+f|0;e=e>>>0>f>>>0?1:c;break a}if(!(!(b|e|(a|f))|((c|0)!=32767|(d|0)!=0))){b=e;e=f<<4|b>>>28;b=b<<4|a>>>28;a=e|524288;f=2047;e=0;break a}if(o>>>0>17406){b=0;a=0;f=2047;e=0;break a}j=!(c|d);p=j?15360:15361;k=p-o|0;if((k|0)>112){b=0;a=0;f=0;e=0;break a}d=b;c=a;l=e;e=j?f:f|65536;f=e;h=l;m=128-k|0;c:{if(m&64){e=d;c=m+-64|0;d=c&31;if((c&63)>>>0>=32){c=b<>>32-d|a<>>0>=32){j=h<>>32-i|e<>>0>=32){e=0;h=c>>>h|0}else{e=c>>>h|0;h=((1<>>h}h=n|h;e=e|j;n=d;i=m&31;if((m&63)>>>0>=32){j=d<>>32-i|c<>2]=d;H[g+20>>2]=c;H[g+24>>2]=h;H[g+28>>2]=e;d:{if(k&64){c=l;b=k+-64|0;a=b&31;if((b&63)>>>0>=32){e=0;b=f>>>a|0}else{e=f>>>a|0;b=((1<>>a}a=e;l=0;f=0;break d}if(!k){break d}e=l;c=64-k|0;d=c&31;if((c&63)>>>0>=32){c=e<>>32-d|f<>>0>=32){j=0;a=a>>>b|0}else{j=a>>>b|0;a=((1<>>b}b=l|a;a=c|j;d=k&31;if((k&63)>>>0>=32){c=0;l=f>>>d|0}else{c=f>>>d|0;l=((1<>>d}f=c}H[g>>2]=b;H[g+4>>2]=a;H[g+8>>2]=l;H[g+12>>2]=f;a=H[g+8>>2];d=a<<4;a=H[g+12>>2]<<4|a>>>28;f=H[g>>2];b=H[g+4>>2];e=b;b=b>>>28|d;c=e&268435455;f=f|(o|0)!=(p|0)&(H[g+16>>2]|H[g+24>>2]|(H[g+20>>2]|H[g+28>>2]))!=0;e:{if((c|0)==134217728&(f|0)!=0|c>>>0>134217728){b=b+1|0;a=b?a:a+1|0;break e}if(f|(c|0)!=134217728){break e}c=a;a=b;b=b+(b&1)|0;a=a>>>0>b>>>0?c+1|0:c}f=a>>>0>1048575;a=f?a^1048576:a;e=0}oa=g+32|0;u(0,b|0);u(1,a|(r&-2147483648|f<<20));s=q,t=+w(),M[s>>3]=t}function Sc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;q=H[a+24>>2];if(!H[q+16>>2]){return 1}r=H[q+24>>2];o=H[H[H[a+20>>2]>>2]+20>>2];while(1){e=H[r+36>>2];H[b+36>>2]=e;c=N(e,152);e=H[o+28>>2];d=c+e|0;u=H[a+64>>2];a:{if(u){e=e+N(H[o+24>>2],152)|0;p=H[e-144>>2]-H[e-152>>2]|0;c=d+12|0;f=d+4|0;e=H[d+8>>2];h=H[d>>2];g=36;break a}c=d+148|0;f=d+140|0;e=H[d+144>>2];h=H[d+136>>2];p=e-h|0;g=52}v=H[g+o>>2];b:{c:{if(!v){break c}l=H[f>>2];n=H[c>>2];i=e-h|0;f=H[b+40>>2];c=f&31;if((f&63)>>>0>=32){d=-1<>>32-c;c=-1<>2];k=m+j|0;g=d^-1;c=g;c=k>>>0>>0?c+1|0:c;d=f&31;if((f&63)>>>0>=32){k=c>>>d|0}else{k=((1<>>d}d=H[b+8>>2];j=H[b+16>>2];m=j+m|0;c=g;c=m>>>0>>0?c+1|0:c;g=f&31;if((f&63)>>>0>=32){f=c>>>g|0}else{f=((1<>>g}c=f+d|0;d:{if(f>>>0>>0){s=h-f|0;g=0;if(c>>>0>=e>>>0){m=0;e=i;break d}e=c-h|0;m=i-e|0;break d}g=f-h|0;if(c>>>0>=e>>>0){e=i-g|0;s=0;m=0;break d}m=e-c|0;s=0;e=d}c=n-l|0;f=H[b+12>>2];i=f+k|0;e:{if(k>>>0>>0){t=l-k|0;k=0;j=0;if(i>>>0>=n>>>0){break e}j=c;c=i-l|0;j=j-c|0;break e}k=k-l|0;if(i>>>0>=n>>>0){c=c-k|0;t=0;j=0;break e}t=0;c=f;j=n-i|0}h=0;if((g|k|(m|j)|(c|e))<0){break b}i=N(k,p)+g|0;g=H[b+44>>2];l=N(d,t)+s|0;f:{g:{if(!(i|g|(l|(d|0)!=(p|0))|(d|0)!=(e|0))){if((c|0)!=(f|0)){break g}e=(u?36:52)+o|0;H[b+44>>2]=H[e>>2];H[e>>2]=0;break c}if(g){break f}}Ie(f,0,d);if(ra|!f){break b}d=N(d,f);if(d>>>0>1073741823){break b}d=Ja(d<<2);H[b+44>>2]=d;if(!d){break b}f=H[b+8>>2];g=H[b+12>>2];if((f|0)==(e|0)&(g|0)==(c|0)){break f}f=N(f,g)<<2;if(!f){break f}y(d,0,f)}if(!c){break c}g=c&1;e=e<<2;h=H[b+44>>2]+(l<<2)|0;d=(i<<2)+v|0;if((c|0)!=1){i=c&2147483646;c=0;while(1){l=!e;if(!l){B(h,d,e)}n=p<<2;d=n+d|0;f=(H[b+8>>2]<<2)+h|0;if(!l){B(f,d,e)}d=d+n|0;h=f+(H[b+8>>2]<<2)|0;c=c+2|0;if((i|0)!=(c|0)){continue}break}}if(!g|!e){break c}B(h,d,e)}o=o+76|0;r=r+52|0;b=b+52|0;h=1;w=w+1|0;if(w>>>0>2]){continue}}break}return h}function Bb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;if(a){a:{if(H[a>>2]){b=H[a+12>>2];if(b){mb(b);Da(H[a+12>>2]);H[a+12>>2]=0}b=H[a+16>>2];if(b){Da(b);H[a+16>>2]=0;H[a+20>>2]=0}Da(H[a+64>>2]);H[a+60>>2]=0;H[a+64>>2]=0;Da(H[a+72>>2]);H[a+72>>2]=0;Da(H[a+88>>2]);H[a+88>>2]=0;break a}b=H[a+44>>2];if(b){Da(b);H[a+44>>2]=0}b=H[a+32>>2];if(b){Da(b);H[a+32>>2]=0;H[a+36>>2]=0}b=H[a+52>>2];if(!b){break a}Da(b);H[a+52>>2]=0;H[a+56>>2]=0}dc(H[a+232>>2]);b=H[a+180>>2];if(b){e=N(H[a+128>>2],H[a+132>>2]);if(e){while(1){mb(b);b=b+5644|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}b=H[a+180>>2]}Da(b);H[a+180>>2]=0}b=H[a+140>>2];if(b){c=H[a+136>>2];if(c){b=0;while(1){e=H[H[a+140>>2]+(b<<3)>>2];if(e){Da(e);c=H[a+136>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+140>>2]}H[a+136>>2]=0;Da(b);H[a+140>>2]=0}Da(H[a+160>>2]);H[a+144>>2]=0;H[a+160>>2]=0;Da(H[a+124>>2]);H[a+124>>2]=0;if(!(I[a+212|0]&2)){Da(H[a+192>>2])}y(a+104|0,0,112);sb(H[a+216>>2]);H[a+216>>2]=0;sb(H[a+220>>2]);H[a+216>>2]=0;d=H[a+224>>2];if(d){b=H[d+28>>2];if(b){Da(b);H[d+28>>2]=0}c=H[d+40>>2];if(c){if(H[d+36>>2]){while(1){e=N(g,40);b=H[(e+c|0)+36>>2];if(b){Da(b);c=H[d+40>>2];H[(e+c|0)+36>>2]=0}b=H[(c+e|0)+16>>2];if(b){Da(b);c=H[d+40>>2];H[(e+c|0)+16>>2]=0}b=H[(c+e|0)+24>>2];if(b){Da(b);c=H[d+40>>2];H[(e+c|0)+24>>2]=0}g=g+1|0;if(g>>>0>2]){continue}break}}Da(c);H[d+40>>2]=0}Da(d)}H[a+224>>2]=0;Va(H[a+96>>2]);H[a+96>>2]=0;Va(H[a+100>>2]);H[a+100>>2]=0;f=H[a+236>>2];if(f){b:{if(!H[f+8>>2]){break b}if(H[f+12>>2]){H[f+40>>2]=0;while(1){if(H[f+24>>2]>0){continue}break}}H[f+16>>2]=1;Da(H[f>>2]);c=H[f+28>>2];if(!c){break b}while(1){b=H[c+4>>2];Da(c);H[f+28>>2]=b;c=b;if(b){continue}break}}d=H[f+36>>2];if(d){g=H[d+4>>2];if((g|0)>0){b=0;while(1){e=H[d>>2]+N(b,12)|0;c=H[e+8>>2];if(c){sa[c|0](H[e+4>>2]);g=H[d+4>>2]}b=b+1|0;if((g|0)>(b|0)){continue}break}}Da(H[d>>2]);Da(d)}Da(f)}H[a+236>>2]=0;Da(a)}}function ke(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=oa-16|0;oa=g;if(H[a+8>>2]==16){h=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{h=H[a+12>>2]}a:{if(!c){Ca(d,1,4259,0);break a}i=H[a+96>>2];e=1;Ea(b,g+8|0,1);f=H[g+8>>2];if(f>>>0>=2){Ca(d,2,9792,0);break a}if((f+1|0)!=(c|0)){e=0;Ca(d,2,4259,0);break a}d=H[i+16>>2];b:{if(!d){break b}e=H[h+5584>>2];if(d>>>0>=8){i=d&-8;c=0;while(1){H[e+8636>>2]=0;H[e+7556>>2]=0;H[e+6476>>2]=0;H[e+5396>>2]=0;H[e+4316>>2]=0;H[e+3236>>2]=0;H[e+2156>>2]=0;H[e+1076>>2]=0;e=e+8640|0;c=c+8|0;if((i|0)!=(c|0)){continue}break}}d=d&7;if(!d){break b}c=0;while(1){H[e+1076>>2]=0;e=e+1080|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}c=H[h+5608>>2];if(c){Da(c);H[h+5608>>2]=0;f=H[g+8>>2]}if(!f){e=1;break a}i=0;while(1){b=b+1|0;Ea(b,g+12|0,1);c:{if(!H[h+5632>>2]){break c}d=H[h+5628>>2];if(H[d>>2]!=H[g+12>>2]){break c}f=H[d+4>>2];j=H[a+96>>2];if((f|0)!=H[j+16>>2]){break c}c=H[d+8>>2];if(c){e=0;f=N(f,f);if(H[c+16>>2]!=(N(f,H[(H[c>>2]<<2)+24896>>2])|0)){break a}k=Ga(f<<2);H[h+5608>>2]=k;if(!k){break a}sa[H[(H[c>>2]<<2)+25200>>2]](H[c+12>>2],k,f)}c=H[d+12>>2];if(!c){break c}e=0;d=H[j+16>>2];if(H[c+16>>2]!=(N(d,H[(H[c>>2]<<2)+24896>>2])|0)){break a}f=Ga(d<<2);if(!f){break a}sa[H[(H[c>>2]<<2)+25216>>2]](H[c+12>>2],f,d);c=H[j+16>>2];d:{if(!c){break d}j=c&7;e=H[h+5584>>2];e:{if(c>>>0<8){c=f;break e}k=c&-8;d=0;c=f;while(1){H[e+1076>>2]=H[c>>2];H[e+2156>>2]=H[c+4>>2];H[e+3236>>2]=H[c+8>>2];H[e+4316>>2]=H[c+12>>2];H[e+5396>>2]=H[c+16>>2];H[e+6476>>2]=H[c+20>>2];H[e+7556>>2]=H[c+24>>2];H[e+8636>>2]=H[c+28>>2];e=e+8640|0;c=c+32|0;d=d+8|0;if((k|0)!=(d|0)){continue}break}}d=0;if(!j){break d}while(1){H[e+1076>>2]=H[c>>2];e=e+1080|0;c=c+4|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}}Da(f)}e=1;i=i+1|0;if(i>>>0>2]){continue}break}}oa=g+16|0;return e|0}function Cb(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=H[H[a+24>>2]+24>>2]+N(b,52)|0;l=H[m+4>>2];k=l-1|0;o=H[a+60>>2];j=k+o|0;p=0-!l|0;i=p;r=H[H[H[a+20>>2]>>2]+20>>2]+N(b,76)|0;n=H[r+12>>2];i=Ke(j,j>>>0>>0?i+1|0:i,l,0);q=i>>>0>n>>>0?n:i;j=H[m>>2];m=j-1|0;s=H[a+56>>2];n=m+s|0;o=0-!j|0;i=o;t=H[r+8>>2];i=Ke(n,n>>>0>>0?i+1|0:i,j,0);n=i>>>0>t>>>0?t:i;i=p;t=H[r+4>>2];s=H[a+52>>2];k=s+k|0;i=Ke(k,k>>>0>>0?i+1|0:i,l,0);k=i>>>0>>0?t:i;i=o;p=H[r>>2];l=m;m=H[a+48>>2];l=l+m|0;i=Ke(l,l>>>0>>0?i+1|0:i,j,0);i=i>>>0

>>0?p:i;l=0;p=H[(H[H[a+32>>2]+5584>>2]+N(b,1080)|0)+20>>2];c=H[r+20>>2]+(c?0-c|0:-1)|0;a:{if(!c){a=n;l=i;b=k;break a}m=c-1|0;j=(d&1)<>>0>>0){a=c&31;l=i-j|0;if((c&63)>>>0>=32){i=-1<>>32-a;a=-1<>>0>>0?i+1|0:i;b=a;a=c&31;if((c&63)>>>0>=32){l=i>>>a|0}else{l=((1<>>a}}a=0;b=0;d=d>>>1<>>0>>0){b=c&31;o=k-d|0;if((c&63)>>>0>=32){i=-1<>>32-b;b=-1<>>0>>0?i+1|0:i;k=b;b=c&31;if((c&63)>>>0>=32){b=i>>>b|0}else{b=((1<>>b}}if(j>>>0>>0){a=c&31;k=n-j|0;if((c&63)>>>0>=32){i=-1<>>32-a;a=-1<>>0>>0?i+1|0:i;j=a;a=c&31;if((c&63)>>>0>=32){a=i>>>a|0}else{a=((1<>>a}}if(d>>>0>=q>>>0){q=0;break a}k=q-d|0;d=c&31;if((c&63)>>>0>=32){i=-1<>>32-d;d=-1<>>0>>0?i+1|0:i;j=d;d=c&31;if((c&63)>>>0>=32){q=i>>>d|0}else{q=((1<>>d}}c=(p|0)==1?2:3;d=c+a|0;d=(a>>>0>d>>>0?-1:d)>>>0>e>>>0;a=c+q|0;d=d&(a>>>0>>0?-1:a)>>>0>f>>>0;a=l-c|0;d=d&(a>>>0<=l>>>0?a:0)>>>0>>0;a=b-c|0;return d&(a>>>0<=b>>>0?a:0)>>>0>>0}function Ee(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=oa-80|0;oa=e;H[e+76>>2]=1;k=H[a+44>>2];d=H[H[a+224>>2]+40>>2];a:{b:{if(!d|!H[d+16>>2]){break b}c:{d=d+N(k,40)|0;if(!H[d+4>>2]){d=H[a+52>>2];f=H[a+48>>2]+2|0;d=f>>>0<2?d+1|0:d;if(fb(b,f,d,c)){break c}Ca(c,1,5440,0);break a}d=H[d+16>>2];if(!fb(b,H[d>>2],H[d+4>>2],c)){Ca(c,1,5440,0);break a}if((Ka(b,H[a+16>>2],2,c)|0)!=2){Ca(c,1,2472,0);break a}Ea(H[a+16>>2],e+72|0,2);if(H[e+72>>2]==65424){break c}Ca(c,1,4073,0);break a}if(H[a+8>>2]!=256){break b}H[a+8>>2]=8}h=N(H[a+132>>2],H[a+128>>2]);d:{if(!h){break d}f=H[a+180>>2];d=0;if(h>>>0>=8){i=h&-8;while(1){H[(f+N(d,5644)|0)+5588>>2]=-1;H[(f+N(d|1,5644)|0)+5588>>2]=-1;H[(f+N(d|2,5644)|0)+5588>>2]=-1;H[(f+N(d|3,5644)|0)+5588>>2]=-1;H[(f+N(d|4,5644)|0)+5588>>2]=-1;H[(f+N(d|5,5644)|0)+5588>>2]=-1;H[(f+N(d|6,5644)|0)+5588>>2]=-1;H[(f+N(d|7,5644)|0)+5588>>2]=-1;d=d+8|0;j=j+8|0;if((i|0)!=(j|0)){continue}break}}h=h&7;if(!h){break d}while(1){H[(f+N(d,5644)|0)+5588>>2]=-1;d=d+1|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}}g=0;if(!Za(a,e+72|0,0,e+68|0,e- -64|0,e+60|0,e+56|0,e+52|0,e+76|0,b,c)){break a}h=k+1|0;while(1){e:{if(!H[e+76>>2]){break e}d=H[e+72>>2];if(!gb(a,d,0,0,b,c)){break a}i=H[a+128>>2];j=H[a+132>>2];f=d+1|0;H[e+32>>2]=f;H[e+36>>2]=N(i,j);Ca(c,4,11795,e+32|0);if(!Sc(H[a+232>>2],H[H[a+100>>2]+24>>2])){break a}g=H[a+180>>2]+N(d,5644)|0;i=H[g+5596>>2];if(i){Da(i);H[g+5596>>2]=0;H[g+5600>>2]=0}H[e+16>>2]=f;Ca(c,4,16601,e+16|0);if((d|0)==(k|0)){d=H[a+224>>2];f=H[d+8>>2];d=H[d+12>>2];f=f+2|0;d=f>>>0<2?d+1|0:d;if(fb(b,f,d,c)){break e}g=0;Ca(c,1,5440,0);break a}H[e+4>>2]=h;H[e>>2]=f;Ca(c,2,13648,e);g=0;if(Za(a,e+72|0,0,e+68|0,e- -64|0,e+60|0,e+56|0,e+52|0,e+76|0,b,c)){continue}break a}break}g=Rc(a,c)}oa=e+80|0;return g|0}function qc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=oa-256|0;oa=j;a:{if(!a){a=0;break a}if(!(H[a>>2]==(b|0)&H[a+4>>2]==(c|0))){H[a+4>>2]=c;H[a>>2]=b;H[j>>2]=c;H[j+128>>2]=b;e=c;g=b;while(1){o=i;i=i+1|0;h=i<<2;n=(e+1|0)/2|0;H[h+j>>2]=n;k=h+(j+128|0)|0;h=(g+1|0)/2|0;H[k>>2]=h;m=N(e,g);f=m+f|0;e=n;g=h;if(m>>>0>1){continue}break}H[a+8>>2]=f;b:{c:{d:{if(!f){b=H[a+12>>2];if(!b){break d}Da(b);H[a+12>>2]=0;break d}e=f<<4;if(e>>>0<=K[a+16>>2]){break b}f=Ia(H[a+12>>2],e);if(f){break c}Ca(d,1,6451,0);b=H[a+12>>2];if(!b){break d}Da(b);H[a+12>>2]=0}Da(a);a=0;break a}H[a+12>>2]=f;c=H[a+16>>2];b=e-c|0;if(b){y(c+f|0,0,b)}H[a+16>>2]=e;c=H[a+4>>2];b=H[a>>2]}g=H[a+12>>2];if(o){d=0;e=(N(b,c)<<4)+g|0;f=e;while(1){b=d<<2;k=H[b+j>>2];e:{if((k|0)<=0){break e}m=k-1|0;l=0;f:{g:{c=H[b+(j+128|0)>>2];if((c|0)<=0){n=k&1;i=0;if((k|0)!=1){break g}b=f;break f}while(1){b=f;f=c;while(1){h:{H[g>>2]=e;if((f|0)==1){g=g+16|0;e=e+16|0;break h}H[g+16>>2]=e;e=e+16|0;g=g+32|0;h=(f|0)>2;f=f-2|0;if(h){continue}}break}h=((l|0)==(m|0)|l)&1;f=h?e:b+(c<<4)|0;e=h?e:b;l=l+1|0;if((k|0)!=(l|0)){continue}break}break e}h=k&2147483646;while(1){b=(i|0)==(m|0);i=i+2|0;e=b?e:f;f=e;b=e;l=l+2|0;if((h|0)!=(l|0)){continue}break}}if(!n){f=e;break e}f=(c<<4)+b|0;c=((i|0)==(m|0)|i)&1;f=c?e:f;e=c?e:b}d=d+1|0;if((o|0)!=(d|0)){continue}break}}H[g>>2]=0}c=H[a+8>>2];if(!c){break a}e=H[a+12>>2];if(c>>>0>=4){b=c&-4;g=0;while(1){H[e+60>>2]=0;H[e+52>>2]=999;H[e+56>>2]=0;H[e+44>>2]=0;H[e+36>>2]=999;H[e+40>>2]=0;H[e+28>>2]=0;H[e+20>>2]=999;H[e+24>>2]=0;H[e+12>>2]=0;H[e+4>>2]=999;H[e+8>>2]=0;e=e- -64|0;g=g+4|0;if((b|0)!=(g|0)){continue}break}}b=c&3;if(!b){break a}g=0;while(1){H[e+12>>2]=0;H[e+4>>2]=999;H[e+8>>2]=0;e=e+16|0;g=g+1|0;if((b|0)!=(g|0)){continue}break}}oa=j+256|0;return a}function ob(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=H[a+16>>2];if(g>>>0>=32){return H[a+8>>2]}d=H[a+20>>2];a:{if((d|0)>=4){b=H[a>>2];c=H[b-3>>2];d=d-4|0;H[a+20>>2]=d;H[a>>2]=b-4;break a}if((d|0)<=0){break a}k=d&1;b=H[a>>2];b:{if((d|0)==1){e=24;break b}j=d&2147483646;e=24;while(1){h=b-1|0;H[a>>2]=h;i=I[b|0];b=b-2|0;H[a>>2]=b;H[a+20>>2]=d-1;h=I[h|0];d=d-2|0;H[a+20>>2]=d;c=i<>2]=b-1;b=I[b|0];H[a+20>>2]=d-1;c=b<>2];j=c&255;H[a+24>>2]=j>>>0>143;b=b?(c&2130706432)==2130706432?7:8:8;h=b+(c>>>0<=2415919103?8:(c&8323072)==8323072?7:8)|0;f=c>>>16&255;i=h+(f>>>0<=143?8:(c&32512)==32512?7:8)|0;e=c>>>8&255;k=i+(g+(e>>>0<=143?8:(c&127)==127?7:8)|0)|0;H[a+16>>2]=k;l=H[a+12>>2];b=f<>>24|e<>>0>=32){e=b<>>32-c;b=b<>2];b=e|l;h=b;H[a+8>>2]=g;H[a+12>>2]=b;if(k>>>0<=31){c:{if((d|0)>=4){b=H[a>>2];c=H[b-3>>2];H[a+20>>2]=d-4;H[a>>2]=b-4;break c}if((d|0)<=0){c=0;break c}i=d&1;b=H[a>>2];d:{if((d|0)==1){e=24;c=0;break d}l=d&2147483646;e=24;c=0;f=0;while(1){m=b-1|0;H[a>>2]=m;n=I[b|0];b=b-2|0;H[a>>2]=b;H[a+20>>2]=d-1;m=I[m|0];d=d-2|0;H[a+20>>2]=d;c=n<>2]=b-1;b=I[b|0];H[a+20>>2]=d-1;c=b<>2]=d>>>0>143;j=j>>>0<=143?8:(c&2130706432)==2130706432?7:8;i=j+(c>>>0<=2415919103?8:(c&8323072)==8323072?7:8)|0;f=c>>>16&255;l=i+(f>>>0<=143?8:(c&32512)==32512?7:8)|0;e=c>>>8&255;H[a+16>>2]=l+((e>>>0<=143?8:(c&127)==127?7:8)+k|0);b=a;a=f<>>24|e<>>0>=32){d=a<>>32-c;a=a<>2]=g;H[b+12>>2]=d|h}return g}function _c(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=H[a+96>>2];l=N(H[a+128>>2],H[a+132>>2]);a:{if(l){b=H[j+16>>2];m=N(b,1080);k=N(b,b)<<2;e=H[a+12>>2];b=H[a+180>>2];while(1){n=H[b+5584>>2];B(b,e,5644);H[b+5608>>2]=0;H[b+5588>>2]=-1;H[b+5168>>2]=0;H[b+5636>>2]=0;H[b+5616>>2]=0;H[b+5624>>2]=0;H[b+5628>>2]=0;H[b+5584>>2]=n;F[b+5640|0]=I[b+5640|0]&252;b:{if(!H[e+5608>>2]){break b}d=Ga(k);H[b+5608>>2]=d;if(!d){return 0}if(!k){break b}B(d,H[e+5608>>2],k)}d=N(H[e+5624>>2],20);f=Ga(d);H[b+5616>>2]=f;i=0;if(!f){break a}if(d){B(f,H[e+5616>>2],d)}g=H[e+5620>>2];if(g){d=H[e+5616>>2];f=H[b+5616>>2];h=0;while(1){if(H[d+12>>2]){g=Ga(H[d+16>>2]);H[f+12>>2]=g;if(!g){return 0}o=H[d+16>>2];if(o){B(g,H[d+12>>2],o)}g=H[e+5620>>2]}H[b+5624>>2]=H[b+5624>>2]+1;f=f+20|0;d=d+20|0;h=h+1|0;if(h>>>0>>0){continue}break}}d=N(H[e+5636>>2],20);f=Ga(d);H[b+5628>>2]=f;if(!f){break a}if(d){B(f,H[e+5628>>2],d)}i=H[e+5636>>2];H[b+5636>>2]=i;if(i){d=H[e+5628>>2];f=H[b+5628>>2];h=0;while(1){g=H[d+8>>2];if(g){H[f+8>>2]=H[b+5616>>2]+(g-H[e+5616>>2]|0)}g=H[d+12>>2];if(g){H[f+12>>2]=H[b+5616>>2]+(g-H[e+5616>>2]|0)}f=f+20|0;d=d+20|0;h=h+1|0;if((i|0)!=(h|0)){continue}break}}if(m){B(n,H[e+5584>>2],m)}b=b+5644|0;p=p+1|0;if((p|0)!=(l|0)){continue}break}}i=1;e=Fa(1,72);b=0;c:{if(!e){break c}F[e+40|0]=I[e+40|0]&254|1;d=Fa(1,4);H[e+20>>2]=d;b=e;if(d){break c}Da(b);b=0}H[a+232>>2]=b;if(!b){return 0}f=H[a+236>>2];e=0;H[b+28>>2]=a+104;H[b+24>>2]=j;d=Fa(1,848);H[H[b+20>>2]>>2]=d;d:{if(!d){break d}d=Fa(H[j+16>>2],76);h=H[H[b+20>>2]>>2];H[h+20>>2]=d;if(!d){break d}H[h+16>>2]=H[j+16>>2];e=H[a+188>>2];H[b+44>>2]=f;H[b>>2]=e;e=1}if(e){break a}dc(H[a+232>>2]);i=0;H[a+232>>2]=0;Ca(c,1,3668,0)}return i|0}function Na(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=H[a+16>>2];if(h>>>0>=32){return H[a+8>>2]}d=H[a+24>>2];a:{if((d|0)>=4){b=H[a>>2];c=H[b>>2];g=d-4|0;H[a+24>>2]=g;H[a>>2]=b+4;break a}c=H[a+28>>2]?-1:0;if((d|0)<=0){g=d;break a}j=d&1;b=H[a>>2];b:{if((d|0)==1){f=b;break b}i=d&2147483646;while(1){H[a>>2]=b+1;k=I[b|0];f=b+2|0;H[a>>2]=f;H[a+24>>2]=d-1;b=I[b+1|0];d=d-2|0;H[a+24>>2]=d;c=((255<>2]=f+1;b=I[f|0];H[a+24>>2]=d-1;c=(255<>2];i=c>>>24|0;H[a+20>>2]=(i|0)==255;f=c>>>16&255;d=c>>>8&255;b=b?7:8;c=c&255;e=b+((c|0)==255?7:8)|0;k=((d|0)==255?7:8)+e|0;j=(h+((f|0)==255?7:8)|0)+k|0;H[a+16>>2]=j;l=H[a+12>>2];b=c|(d<>>0>=32){f=b<>>32-c;b=b<>2];b=f|l;k=b;H[a+8>>2]=h;H[a+12>>2]=b;if(j>>>0<=31){c:{if((g|0)>=4){b=H[a>>2];d=H[b>>2];H[a+24>>2]=g-4;H[a>>2]=b+4;break c}e=0;d=H[a+28>>2]?-1:0;if((g|0)<=0){break c}l=g&1;b=H[a>>2];d:{if((g|0)==1){c=b;break d}m=g&2147483646;f=0;while(1){H[a>>2]=b+1;n=I[b|0];c=b+2|0;H[a>>2]=c;H[a+24>>2]=g-1;b=I[b+1|0];g=g-2|0;H[a+24>>2]=g;d=((255<>2]=c+1;b=I[c|0];H[a+24>>2]=g-1;d=(255<>>24|0;H[a+20>>2]=(c|0)==255;f=d>>>16&255;g=d>>>8&255;e=(i|0)==255?7:8;d=d&255;i=e+((d|0)==255?7:8)|0;l=((g|0)==255?7:8)+i|0;H[a+16>>2]=(((f|0)==255?7:8)+j|0)+l;b=a;a=d|(g<>>0>=32){f=a<>>32-c;a=a<>2]=h;H[b+12>>2]=f|k}return h}function Wc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0;i=oa-32|0;oa=i;if(H[a+8>>2]==16){f=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{f=H[a+12>>2]}a:{if(K[d>>2]<=4){a=0;Ca(e,1,2607,0);break a}f=H[f+5584>>2]+N(b,1080)|0;Ea(c,f+4|0,1);h=H[f+4>>2]+1|0;H[f+4>>2]=h;if(h>>>0>=34){H[i+4>>2]=33;H[i>>2]=h;Ca(e,1,7635,i);a=0;break a}g=H[a+184>>2];if(g>>>0>=h>>>0){H[i+24>>2]=h;H[i+20>>2]=g;H[i+16>>2]=b;Ca(e,1,16423,i+16|0);H[a+8>>2]=H[a+8>>2]|32768;a=0;break a}Ea(c+1|0,f+8|0,1);H[f+8>>2]=H[f+8>>2]+2;Ea(c+2|0,f+12|0,1);a=H[f+12>>2]+2|0;H[f+12>>2]=a;b=H[f+8>>2];if(!(!(b>>>0>10|a>>>0>10)&a+b>>>0<13)){a=0;Ca(e,1,5468,0);break a}Ea(c+3|0,f+16|0,1);if(I[f+16|0]&128){a=0;Ca(e,1,6564,0);break a}Ea(c+4|0,f+20|0,1);if(K[f+20>>2]>=2){a=0;Ca(e,1,6499,0);break a}b=H[d>>2]-5|0;H[d>>2]=b;a=1;h=H[f+4>>2];if(!(F[f|0]&1)){if(!h){break a}d=f+944|0;e=f+812|0;b=0;c=0;if(h>>>0>=4){k=h&-4;g=0;while(1){f=c<<2;H[f+e>>2]=15;H[d+f>>2]=15;j=f|4;H[j+e>>2]=15;H[d+j>>2]=15;j=f|8;H[j+e>>2]=15;H[d+j>>2]=15;f=f|12;H[f+e>>2]=15;H[d+f>>2]=15;c=c+4|0;g=g+4|0;if((k|0)!=(g|0)){continue}break}}f=h&3;if(!f){break a}while(1){a=c<<2;H[a+e>>2]=15;H[a+d>>2]=15;a=1;c=c+1|0;b=b+1|0;if((f|0)!=(b|0)){continue}break}break a}if(b>>>0>=h>>>0){b:{if(!h){g=0;break b}Ea(c+5|0,i+28|0,1);a=H[i+28>>2];H[f+944>>2]=a>>>4;H[f+812>>2]=a&15;g=H[f+4>>2];if(g>>>0>=2){h=f+944|0;k=f+812|0;a=c+6|0;c=1;while(1){Ea(a,i+28|0,1);c:{b=H[i+28>>2];if(b>>>0>=16){g=b&15;if(g){break c}}a=0;Ca(e,1,6025,0);break a}j=c<<2;H[j+k>>2]=g;H[h+j>>2]=b>>>4;a=a+1|0;c=c+1|0;g=H[f+4>>2];if(c>>>0>>0){continue}break}}b=H[d>>2]}H[d>>2]=b-g;a=1;break a}a=0;Ca(e,1,2607,0)}oa=i+32|0;return a}function Ce(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=oa-16|0;oa=f;H[f+12>>2]=c;j=H[a+96>>2];if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}F[e+5640|0]=I[e+5640|0]|1;a:{if(c>>>0<=4){c=0;Ca(d,1,4565,0);break a}Ea(b,e,1);if(K[e>>2]>=8){c=0;Ca(d,1,4531,0);break a}Ea(b+1|0,f+8|0,1);c=H[f+8>>2];H[e+4>>2]=c;if((c|0)>=5){Ca(d,1,4490,0);H[e+4>>2]=-1}Ea(b+2|0,e+8|0,2);l=H[e+8>>2];if(l-65536>>>0<=4294901760){H[f>>2]=l;Ca(d,1,8111,f);c=0;break a}c=H[a+188>>2];H[e+12>>2]=c?c:l;Ea(b+4|0,e+16|0,1);if(K[e+16>>2]>=2){c=0;Ca(d,1,5536,0);break a}o=b+5|0;H[f+12>>2]=H[f+12>>2]-5;m=H[j+16>>2];b:{if(!m){break b}g=H[e>>2]&1;h=H[e+5584>>2];b=0;if(m>>>0>=8){p=h+7560|0;q=h+6480|0;r=h+5400|0;s=h+4320|0;l=h+3240|0;j=h+2160|0;e=h+1080|0;c=m&-8;while(1){i=N(b,1080);H[i+h>>2]=g;H[e+i>>2]=g;H[j+i>>2]=g;H[i+l>>2]=g;H[i+s>>2]=g;H[i+r>>2]=g;H[i+q>>2]=g;H[i+p>>2]=g;b=b+8|0;k=k+8|0;if((c|0)!=(k|0)){continue}break}}c=m&7;if(!c){break b}while(1){H[N(b,1080)+h>>2]=g;b=b+1|0;n=n+1|0;if((c|0)!=(n|0)){continue}break}}c=0;if(!Wc(a,0,o,f+12|0,d)){Ca(d,1,4565,0);break a}if(H[f+12>>2]){Ca(d,1,4565,0);break a}if(H[a+8>>2]==16){b=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{b=H[a+12>>2]}if(K[H[a+96>>2]+16>>2]>=2){b=H[b+5584>>2];j=H[b+4>>2]<<2;n=b+944|0;e=b+812|0;k=1;c=b;while(1){H[c+1084>>2]=H[b+4>>2];H[c+1088>>2]=H[b+8>>2];H[c+1092>>2]=H[b+12>>2];H[c+1096>>2]=H[b+16>>2];H[c+1100>>2]=H[b+20>>2];d=!j;if(!d){B(c+1892|0,e,j)}if(!d){B(c+2024|0,n,j)}c=c+1080|0;k=k+1|0;if(k>>>0>2]+16>>2]){continue}break}}c=1}oa=f+16|0;return c|0}function jc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=b;H[a+28>>2]=d;H[a+16>>2]=0;H[a+20>>2]=0;h=c-1|0;H[a+24>>2]=h;n=b&3;a:{if((c|0)<=0){e=b;b=d;break a}e=b+1|0;H[a>>2]=e;b=I[b|0]}g=b;i=8;H[a+16>>2]=8;j=(g|0)==255;H[a+20>>2]=j;H[a+8>>2]=g;H[a+12>>2]=0;b:{if((n|0)==3){break b}k=c-2|0;H[a+24>>2]=k;c:{if((c|0)<2){b=e;e=d;break c}b=e+1|0;H[a>>2]=b;e=I[e|0]}j=(e|0)==255;H[a+20>>2]=j;i=(g|0)==255?15:16;H[a+16>>2]=i;g=g|e<<8;H[a+8>>2]=g;H[a+12>>2]=0;if((n|0)==2){e=b;c=h;h=k;break b}o=c-3|0;H[a+24>>2]=o;d:{if((c|0)<3){f=b;b=d;break d}f=b+1|0;H[a>>2]=f;b=I[b|0]}j=(b|0)==255;H[a+20>>2]=j;l=((e|0)==255?7:8)+i|0;H[a+16>>2]=l;e=i&31;if((i&63)>>>0>=32){m=b<>>32-e;e=b<>2]=g;H[a+12>>2]=m;if((n|0)==1){e=f;i=l;c=k;h=o;break b}h=c-4|0;H[a+24>>2]=h;e:{if((c|0)<4){e=f;c=d;break e}e=f+1|0;H[a>>2]=e;c=I[f|0]}j=(c|0)==255;H[a+20>>2]=j;i=l+((b|0)==255?7:8)|0;H[a+16>>2]=i;b=l&31;if((l&63)>>>0>=32){f=c<>>32-b;b=c<>2]=g;H[a+12>>2]=b;c=o}f:{if((c|0)>=5){d=H[e>>2];H[a+24>>2]=c-5;H[a>>2]=e+4;break f}b=0;d=d?-1:0;if((c|0)<2){break f}while(1){c=e+1|0;H[a>>2]=c;e=I[e|0];f=h-1|0;H[a+24>>2]=f;d=(255<>>0>1;e=c;h=f;if(k){continue}break}}b=d>>>24|0;H[a+20>>2]=(b|0)==255;c=d>>>16&255;e=d>>>8&255;h=j?7:8;d=d&255;f=h+((d|0)==255?7:8)|0;k=((e|0)==255?7:8)+f|0;H[a+16>>2]=(((c|0)==255?7:8)+i|0)+k;b=d|(e<>>0>=32){d=a<>>32-b;a=a<>2]=a|g;H[c+12>>2]=d|m}function Ab(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;j=oa-32|0;oa=j;p=H[a+16>>2];a:{if(!p){k=1;break a}d=H[a>>2];c=d>>31;h=c;b:{if((c|0)<0){break b}e=H[a+4>>2];c=e>>31;l=c;if((c|0)<0){break b}f=H[a+8>>2];c=f>>31;m=c;if((c|0)<0){break b}i=H[a+12>>2];c=i>>31;if((c|0)<0){break b}a=H[a+24>>2];s=d-1|0;t=h-!d|0;u=e-1|0;v=l-!e|0;w=f-1|0;x=m-!f|0;y=i-1|0;z=c-!i|0;while(1){c=t;d=H[a>>2];e=d+s|0;c=d>>>0>e>>>0?c+1|0:c;h=Ke(e,c,d,0);H[a+16>>2]=h;c=v;e=H[a+4>>2];f=e+u|0;c=e>>>0>f>>>0?c+1|0:c;l=Ke(f,c,e,0);H[a+20>>2]=l;i=H[a+40>>2];f=i&31;if((i&63)>>>0>=32){c=1<>>32-f}n=g;k=c;f=n-1|0;c=c-!n|0;m=c;q=d>>31;g=q+x|0;r=d+w|0;g=r>>>0>>0?g+1|0:g;d=Je(r,g,d,q);c=(d>>31)+c|0;g=d;d=d+f|0;c=g>>>0>d>>>0?c+1|0:c;g=d;d=i&31;if((i&63)>>>0>=32){d=c>>d}else{d=((1<>>d}c=(h>>31)+m|0;g=h;h=f+h|0;c=g>>>0>h>>>0?c+1|0:c;g=d;d=i&31;if((i&63)>>>0>=32){c=c>>d}else{c=((1<>>d}c=g-c|0;if((c|0)<0){H[j+4>>2]=c;H[j>>2]=o;Ca(b,1,13510,j);k=0;break a}H[a+8>>2]=c;d=e>>31;c=d+z|0;h=e+y|0;c=h>>>0>>0?c+1|0:c;d=Je(h,c,e,d);c=(d>>31)+m|0;e=d;d=d+f|0;c=e>>>0>d>>>0?c+1|0:c;e=d;d=i&31;if((i&63)>>>0>=32){e=c>>d}else{e=((1<>>d}c=k+(l>>31)|0;d=l+n|0;c=d>>>0>>0?c+1|0:c;f=d-1|0;h=e;d=c-!d|0;e=f;c=i&31;if((i&63)>>>0>=32){c=d>>c}else{c=((1<>>c}c=h-c|0;if((c|0)<0){H[j+20>>2]=c;H[j+16>>2]=o;Ca(b,1,13579,j+16|0);k=0;break a}H[a+12>>2]=c;a=a+52|0;k=1;o=o+1|0;if((p|0)!=(o|0)){continue}break}break a}Ca(b,1,6720,0)}oa=j+32|0;return k}function sc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=oa-256|0;oa=j;f=Fa(1,20);a:{if(!f){Ca(c,1,6413,0);f=0;break a}H[f+4>>2]=b;H[f>>2]=a;H[j>>2]=b;H[j+128>>2]=a;while(1){p=g;g=g+1|0;h=g<<2;d=(b+1|0)/2|0;H[h+j>>2]=d;m=h+(j+128|0)|0;h=(a+1|0)/2|0;H[m>>2]=h;i=N(a,b);e=i+e|0;b=d;a=h;if(i>>>0>1){continue}break}H[f+8>>2]=e;if(!e){Da(f);f=0;break a}d=Fa(e,16);H[f+12>>2]=d;if(!d){Ca(c,1,3564,0);Da(f);f=0;break a}l=H[f+8>>2];H[f+16>>2]=l<<4;a=d;if(p){e=(N(H[f+4>>2],H[f>>2])<<4)+d|0;b=e;while(1){c=n<<2;i=H[c+j>>2];b:{if((i|0)<=0){break b}o=i-1|0;h=0;c:{c=H[c+(j+128|0)>>2];if((c|0)<=0){g=0;if((i|0)!=1){k=i&2147483646;while(1){m=(g|0)==(o|0);g=g+2|0;e=m?b:e;b=e;h=h+2|0;if((k|0)!=(h|0)){continue}break}}if(i&1){break c}b=e;break b}while(1){g=e;e=c;while(1){d:{H[a>>2]=b;if((e|0)==1){a=a+16|0;b=b+16|0;break d}H[a+16>>2]=b;b=b+16|0;a=a+32|0;k=(e|0)>2;e=e-2|0;if(k){continue}}break}k=((h|0)==(o|0)|h)&1;e=k?b:g+(c<<4)|0;b=k?b:g;h=h+1|0;if((i|0)!=(h|0)){continue}break}break b}g=((g|0)==(o|0)|g)&1;c=g?b:(c<<4)+e|0;b=g?b:e;e=c}n=n+1|0;if((n|0)!=(p|0)){continue}break}}H[a>>2]=0;e:{if(!l){break e}if(l>>>0>=4){a=l&-4;b=0;while(1){H[d+60>>2]=0;H[d+52>>2]=999;H[d+56>>2]=0;H[d+44>>2]=0;H[d+36>>2]=999;H[d+40>>2]=0;H[d+28>>2]=0;H[d+20>>2]=999;H[d+24>>2]=0;H[d+12>>2]=0;H[d+4>>2]=999;H[d+8>>2]=0;d=d- -64|0;b=b+4|0;if((a|0)!=(b|0)){continue}break}}a=l&3;if(!a){break e}b=0;while(1){H[d+12>>2]=0;H[d+4>>2]=999;H[d+8>>2]=0;d=d+16|0;b=b+1|0;if((a|0)!=(b|0)){continue}break}}}oa=j+256|0;return f}function Ia(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(!b){return 0}a:{if(!a){a=kb(8,b);break a}if(!b){Da(a);a=0;break a}b:{if(b>>>0>4294967239){break b}h=b>>>0<=8?8:b+3&-4;b=h+8|0;c:{d:{k=a-4|0;f=k;c=H[f>>2];e=c+f|0;j=H[e>>2];g=j+e|0;e:{f:{if(H[g-4>>2]!=(j|0)){d=b+f|0;if(d+16>>>0<=g>>>0){c=H[e+4>>2];e=H[e+8>>2];H[c+8>>2]=e;H[e+4>>2]=c;c=g-d|0;H[d>>2]=c;H[(d+(c&-4)|0)-4>>2]=c|1;e=H[d>>2]-8|0;g:{if(e>>>0<=127){c=(e>>>3|0)-1|0;break g}g=Q(e);c=((e>>>29-g^4)-(g<<2)|0)+110|0;if(e>>>0<=4095){break g}c=((e>>>30-g^2)-(g<<1)|0)+71|0;c=c>>>0>=63?63:c}e=c<<4;H[d+4>>2]=e+26400;e=e+26408|0;H[d+8>>2]=H[e>>2];H[e>>2]=d;H[H[d+8>>2]+4>>2]=d;e=H[6859];d=c&31;if((c&63)>>>0>=32){c=1<>>32-d}H[6858]=g|H[6858];H[6859]=c|e;H[f>>2]=b;break d}if(d>>>0>g>>>0){break f}b=H[e+4>>2];d=H[e+8>>2];H[b+8>>2]=d;H[d+4>>2]=b;b=c+j|0;H[f>>2]=b;break d}if(c>>>0>=b+16>>>0){H[f>>2]=b;H[(f+(b&-4)|0)-4>>2]=b;d=b+f|0;b=c-b|0;H[d>>2]=b;H[(d+(b&-4)|0)-4>>2]=b|1;c=H[d>>2]-8|0;h:{if(c>>>0<=127){b=(c>>>3|0)-1|0;break h}f=Q(c);b=((c>>>29-f^4)-(f<<2)|0)+110|0;if(c>>>0<=4095){break h}b=((c>>>30-f^2)-(f<<1)|0)+71|0;b=b>>>0>=63?63:b}c=b<<4;H[d+4>>2]=c+26400;c=c+26408|0;H[d+8>>2]=H[c>>2];H[c>>2]=d;H[H[d+8>>2]+4>>2]=d;c=H[6859];d=b&31;if((b&63)>>>0>=32){b=1<>>32-d}H[6858]=e|H[6858];H[6859]=b|c;d=1;break c}d=1;if(b>>>0<=c>>>0){break e}}d=0}break c}H[(f+(b&-4)|0)-4>>2]=b;d=1}if(d){break a}b=kb(8,h);if(!b){break b}i=H[k>>2]-8|0;eb(b,a,h>>>0>>0?h:i);Da(a);i=b}a=i}return a}function Qb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0;a:{d=Fa(1,48);if(d){b=H[a+224>>2];c=H[b+4>>2];H[d>>2]=H[b>>2];H[d+4>>2]=c;c=H[b+12>>2];H[d+8>>2]=H[b+8>>2];H[d+12>>2]=c;c=H[b+20>>2];H[d+16>>2]=H[b+16>>2];H[d+20>>2]=c;c=H[b+24>>2];H[d+24>>2]=c;f=Ga(N(c,24));H[d+28>>2]=f;if(!f){Da(d);return 0}b=H[H[a+224>>2]+28>>2];b:{if(b){c=N(H[d+24>>2],24);if(!c){break b}B(f,b,c);break b}Da(f);H[d+28>>2]=0}c=H[H[a+224>>2]+36>>2];H[d+36>>2]=c;b=Fa(c,40);H[d+40>>2]=b;if(!b){Da(H[d+28>>2]);Da(d);return 0}c:{if(H[H[a+224>>2]+40>>2]){if(!H[d+36>>2]){break c}while(1){e=N(h,40);c=H[(e+H[H[a+224>>2]+40>>2]|0)+20>>2];H[(b+e|0)+20>>2]=c;g=Ga(N(c,24));c=H[d+40>>2];f=c+e|0;H[f+24>>2]=g;if(!g){if(h){b=0;while(1){Da(H[(H[d+40>>2]+N(b,40)|0)+24>>2]);b=b+1|0;if((h|0)!=(b|0)){continue}break}c=H[d+40>>2]}break a}b=H[(e+H[H[a+224>>2]+40>>2]|0)+24>>2];d:{if(b){c=N(H[f+20>>2],24);if(c){B(g,b,c)}b=H[d+40>>2];break d}Da(g);b=H[d+40>>2];H[(e+b|0)+24>>2]=0}c=H[(e+H[H[a+224>>2]+40>>2]|0)+4>>2];H[(b+e|0)+4>>2]=c;g=Ga(N(c,24));c=H[d+40>>2];f=c+e|0;H[f+16>>2]=g;if(!g){if(h){b=0;while(1){a=N(b,40);Da(H[(a+H[d+40>>2]|0)+24>>2]);Da(H[(a+H[d+40>>2]|0)+16>>2]);b=b+1|0;if((h|0)!=(b|0)){continue}break}c=H[d+40>>2]}break a}b=H[(e+H[H[a+224>>2]+40>>2]|0)+16>>2];e:{if(b){c=N(H[f+4>>2],24);if(c){B(g,b,c)}b=H[d+40>>2];break e}Da(g);b=H[d+40>>2];H[(e+b|0)+16>>2]=0}c=b+e|0;H[c+32>>2]=0;H[c+36>>2]=0;h=h+1|0;if(h>>>0>2]){continue}break}break c}Da(b);H[d+40>>2]=0}}else{d=0}return d|0}Da(c);Da(H[d+28>>2]);Da(d);return 0}function kb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{while(1){if(a-1&a|b>>>0>4294967239){break b}j=a>>>0>8;a=j?a:8;d=H[6859];e=d;g=H[6858];b=b>>>0<=8?8:b+3&-4;c:{if(b>>>0<=127){i=(b>>>3|0)-1|0;break c}c=Q(b);i=((b>>>29-c^4)-(c<<2)|0)+110|0;if(b>>>0<=4095){break c}c=((b>>>30-c^2)-(c<<1)|0)+71|0;i=c>>>0>=63?63:c}h=i;f=h&31;if((h&63)>>>0>=32){c=0;d=d>>>f|0}else{c=d>>>f|0;d=((1<>>f}if(d|c){while(1){f=c;d:{if(c|d){e=c-1|0;g=e+1|0;i=e;e=d-1|0;g=(e|0)!=-1?g:i;c=Q(c^g);c=(c|0)==32?Q(d^e)+32|0:c;e=63-c|0;ra=0-(c>>>0>63)|0;break d}ra=0;e=64}g=e;e=g&31;if((g&63)>>>0>=32){c=0;i=f>>>e|0}else{c=f>>>e|0;i=((1<>>e}h=g+h|0;d=h<<4;f=H[d+26408>>2];e=d+26400|0;e:{if((f|0)!=(e|0)){d=Ib(f,a,b);if(d){break a}d=H[f+4>>2];g=H[f+8>>2];H[d+8>>2]=g;H[g+4>>2]=d;H[f+8>>2]=e;H[f+4>>2]=H[e+4>>2];H[e+4>>2]=f;H[H[f+4>>2]+8>>2]=f;h=h+1|0;d=(c&1)<<31|i>>>1;c=c>>>1|0;break e}d=H[6859];k=27432,l=H[6858]&Ne(-2,-1,h),H[k>>2]=l;H[6859]=ra&d;d=i^1}if(c|d){continue}break}g=H[6858];e=H[6859]}c=Q(e);f=63-((c|0)==32?Q(g)+32|0:c)|0;f:{if(!(e|g)){c=0;break f}d=f<<4;c=H[d+26408>>2];if(!e&g>>>0<1073741824){break f}h=99;e=d+26400|0;if((e|0)==(c|0)){break f}while(1){if(!h){break f}d=Ib(c,a,b);if(d){break a}h=h-1|0;c=H[c+8>>2];if((e|0)!=(c|0)){continue}break}}if(Lc((j?a+48|0:48)+b|0)){continue}break}if(!c){break b}f=(f<<4)+26400|0;if((f|0)==(c|0)){break b}while(1){d=Ib(c,a,b);if(d){break a}c=H[c+8>>2];if((f|0)!=(c|0)){continue}break}}d=0}return d}function Fd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+48>>2];if(e>>>0>=b>>>0){H[a+48>>2]=e-b;H[a+36>>2]=H[a+36>>2]+b;e=c+H[a+60>>2]|0;d=b+H[a+56>>2]|0;e=d>>>0>>0?e+1|0:e;H[a+56>>2]=d;H[a+60>>2]=e;ra=c;return b|0}if(I[a+68|0]&4){H[a+48>>2]=0;H[a+36>>2]=e+H[a+36>>2];g=H[a+60>>2];c=H[a+56>>2];b=c+e|0;H[a+56>>2]=b;H[a+60>>2]=b>>>0>>0?g+1|0:g;ra=e?0:-1;return(e?e:-1)|0}if(e){H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];h=b;f=e;b=b-e|0;c=c-(e>>>0>h>>>0)|0}a:{if((c|0)>0){h=1}else{h=!!b&(c|0)>=0}if(h){while(1){h=H[a+12>>2];e=c+g|0;i=b+f|0;e=H[a+60>>2]+(i>>>0>>0?e+1|0:e)|0;j=i;i=i+H[a+56>>2]|0;e=j>>>0>i>>>0?e+1|0:e;if((e|0)==(h|0)&i>>>0>K[a+8>>2]|e>>>0>h>>>0){Ca(d,4,15630,0);H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];b=g+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;d=H[a+8>>2];f=d-c|0;e=H[a+12>>2];g=e-((c>>>0>d>>>0)+b|0)|0;h=sa[H[a+28>>2]](d,e,H[a>>2])|0;i=H[a+68>>2];if(h){H[a+56>>2]=d;H[a+60>>2]=e}H[a+68>>2]=i|4;a=(c|0)==(d|0)&(b|0)==(e|0);b=a?-1:f;break a}e=sa[H[a+24>>2]](b,c,H[a>>2])|0;h=ra;i=h;if((e&i)==-1){Ca(d,4,15630,0);H[a+68>>2]=H[a+68>>2]|4;e=g+H[a+60>>2]|0;b=f+H[a+56>>2]|0;e=b>>>0>>0?e+1|0:e;H[a+56>>2]=b;H[a+60>>2]=e;a=!(g|f);b=a?-1:f;break a}g=g+i|0;f=e+f|0;g=f>>>0>>0?g+1|0:g;h=b;b=b-e|0;c=c-((e>>>0>h>>>0)+i|0)|0;if(!!b&(c|0)>=0|(c|0)>0){continue}break}}b=g+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;ra=g;return f|0}ra=a?-1:g;return b|0}function Jd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=oa-80|0;oa=e;a:{if(c>>>0<=2){Ca(d,1,14478,0);break a}if(I[a+124|0]){Ca(d,4,11193,0);g=1;break a}g=1;Ea(b,a+40|0,1);Ea(b+1|0,a+52|0,1);Ea(b+2|0,a+44|0,1);f=b+3|0;b:{c:{d:{e:{f:{h=H[a+40>>2];switch(h-1|0){case 0:break f;case 1:break e;default:break d}}if(c>>>0<=6){H[e+16>>2]=c;Ca(d,1,15155,e+16|0);g=0;break a}if(!((c|0)==7|H[a+48>>2]==14)){H[e+48>>2]=c;Ca(d,2,15155,e+48|0)}Ea(f,a+48|0,4);if(H[a+48>>2]!=14){break b}f=Ga(36);if(!f){g=0;Ca(d,1,7993,0);break a}H[f>>2]=14;H[e+64>>2]=0;H[e+56>>2]=0;H[e+72>>2]=0;H[e+60>>2]=0;H[e+68>>2]=0;H[e+76>>2]=0;g=4470064;H[e+52>>2]=4470064;H[f+4>>2]=1145390592;g:{if((c|0)!=7){if((c|0)==35){Ea(b+7|0,e+76|0,4);Ea(b+11|0,e+72|0,4);Ea(b+15|0,e+68|0,4);Ea(b+19|0,e- -64|0,4);Ea(b+23|0,e+60|0,4);Ea(b+27|0,e+56|0,4);Ea(b+31|0,e+52|0,4);H[f+4>>2]=0;g=H[e+52>>2];c=H[e+56>>2];d=H[e+64>>2];i=H[e+68>>2];j=H[e+76>>2];h=H[e+72>>2];b=H[e+60>>2];break g}H[e+32>>2]=c;Ca(d,2,15191,e+32|0)}c=0;d=0;h=0;b=0}H[f+24>>2]=b;H[f+16>>2]=i;H[f+8>>2]=j;H[f+32>>2]=g;H[f+28>>2]=c;H[f+20>>2]=d;H[f+12>>2]=h;H[a+112>>2]=0;H[a+108>>2]=f;break b}b=c-3|0;H[a+112>>2]=b;d=Fa(1,b);H[a+108>>2]=d;if(!d){break c}if((c|0)<=3){break b}c=0;while(1){Ea(f,e+76|0,1);F[H[a+108>>2]+c|0]=H[e+76>>2];f=f+1|0;c=c+1|0;if((b|0)!=(c|0)){continue}break}break b}if(h>>>0<3){break a}H[e>>2]=h;Ca(d,4,15950,e);break a}g=0;H[a+112>>2]=0;break a}g=1;F[a+124|0]=1}oa=e+80|0;return g|0}function Ka(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;h=H[a+48>>2];if(h>>>0>=c>>>0){if(c){B(b,H[a+36>>2],c)}H[a+36>>2]=H[a+36>>2]+c;H[a+48>>2]=H[a+48>>2]-c;b=H[a+60>>2];d=H[a+56>>2]+c|0;b=d>>>0>>0?b+1|0:b;H[a+56>>2]=d;H[a+60>>2]=b;return c}if(I[a+68|0]&4){if(h){B(b,H[a+36>>2],h)}b=H[a+48>>2];H[a+48>>2]=0;H[a+36>>2]=b+H[a+36>>2];g=H[a+60>>2];c=b;b=H[a+56>>2]+b|0;g=c>>>0>b>>>0?g+1|0:g;H[a+56>>2]=b;H[a+60>>2]=g;return h?h:-1}a:{if(h){if(h){B(b,H[a+36>>2],h)}i=H[a+32>>2];H[a+36>>2]=i;e=H[a+48>>2];H[a+48>>2]=0;f=H[a+60>>2];g=H[a+56>>2]+e|0;f=g>>>0>>0?f+1|0:f;H[a+56>>2]=g;H[a+60>>2]=f;c=c-e|0;b=b+e|0;break a}i=H[a+32>>2];H[a+36>>2]=i}b:{while(1){c:{e=H[a>>2];f=H[a+16>>2];g=H[a+64>>2];d:{if(g>>>0>c>>>0){f=sa[f|0](i,g,e)|0;H[a+48>>2]=f;if((f|0)==-1){break b}if(c>>>0>f>>>0){if(f){B(b,H[a+36>>2],f)}i=H[a+32>>2];H[a+36>>2]=i;e=H[a+48>>2];break d}if(c){B(b,H[a+36>>2],c)}H[a+36>>2]=H[a+36>>2]+c;H[a+48>>2]=H[a+48>>2]-c;b=H[a+60>>2];d=H[a+56>>2]+c|0;b=d>>>0>>0?b+1|0:b;H[a+56>>2]=d;H[a+60>>2]=b;return c+h|0}e=sa[f|0](b,c,e)|0;H[a+48>>2]=e;if((e|0)==-1){break b}if(c>>>0<=e>>>0){break c}i=H[a+32>>2];H[a+36>>2]=i;f=e}H[a+48>>2]=0;g=H[a+60>>2];j=H[a+56>>2]+e|0;g=j>>>0>>0?g+1|0:g;H[a+56>>2]=j;H[a+60>>2]=g;b=b+e|0;c=c-e|0;h=f+h|0;continue}break}H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];f=H[a+60>>2];b=H[a+56>>2]+e|0;f=b>>>0>>0?f+1|0:f;H[a+56>>2]=b;H[a+60>>2]=f;return e+h|0}Ca(d,4,15630,0);H[a+48>>2]=0;H[a+68>>2]=H[a+68>>2]|4;return h?h:-1}function Rb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=oa-16|0;oa=g;o=H[H[a+96>>2]+16>>2];b=Fa(1,56);H[g+12>>2]=b;a:{if(!b){break a}j=H[H[a+96>>2]+16>>2];H[b+24>>2]=j;H[b>>2]=H[a+108>>2];H[b+4>>2]=H[a+112>>2];H[b+8>>2]=H[a+116>>2];H[b+12>>2]=H[a+120>>2];H[b+16>>2]=H[a+128>>2];h=H[a+132>>2];H[b+52>>2]=0;H[b+20>>2]=h;i=H[a+12>>2];H[b+32>>2]=H[i>>2];H[b+36>>2]=H[i+4>>2];H[b+40>>2]=H[i+8>>2];H[b+44>>2]=H[i+16>>2];a=Fa(j,1080);H[b+48>>2]=a;if(a){if(o){while(1){a=N(k,1080);d=a+H[b+48>>2]|0;c=a+H[i+5584>>2]|0;H[d+4>>2]=H[c>>2];a=H[c+4>>2];H[d+8>>2]=a;H[d+12>>2]=H[c+8>>2];H[d+16>>2]=H[c+12>>2];H[d+20>>2]=H[c+16>>2];H[d+24>>2]=H[c+20>>2];b:{if(a>>>0>32){break b}if(a){B(d+948|0,c+944|0,a)}a=H[c+4>>2];if(!a){break b}B(d+816|0,c+812|0,a)}a=H[c+24>>2];H[d+28>>2]=a;H[d+808>>2]=H[c+804>>2];f=1;c:{if((a|0)!=1){a=N(H[c+4>>2],3);if(a-3>>>0>95){break c}f=a-2|0}p=f&1;l=d+420|0;m=d+32|0;n=c+28|0;a=0;if((f|0)!=1){j=f&-2;f=0;while(1){h=a<<2;e=(a<<3)+n|0;H[h+m>>2]=H[e+4>>2];H[h+l>>2]=H[e>>2];e=a|1;h=e<<2;e=(e<<3)+n|0;H[h+m>>2]=H[e+4>>2];H[h+l>>2]=H[e>>2];a=a+2|0;f=f+2|0;if((j|0)!=(f|0)){continue}break}}if(!p){break c}e=a<<2;a=(a<<3)+n|0;H[e+m>>2]=H[a+4>>2];H[e+l>>2]=H[a>>2]}H[d+812>>2]=H[c+808>>2];k=k+1|0;if((k|0)!=(o|0)){continue}break}}e=b;break a}if(g+12|0){a=H[g+12>>2];b=H[a+48>>2];if(b){Da(b);a=H[g+12>>2]}Da(a);H[g+12>>2]=0}}oa=g+16|0;return e|0}function kc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=H[a+28>>2]+N(b,152)|0;d=H[f-144>>2]-H[f-152>>2]|0;e=H[f-140>>2]-H[f-148>>2]|0;c=e>>>0>=64?64:e;g=d>>>0>=64?64:d;a:{if(!(!d|!e|(!g|!c)|g>>>0>4294967295/(c>>>0)>>>2>>>0)){f=Fa(1,28);H[f+12>>2]=c;H[f+8>>2]=g;H[f+4>>2]=e;H[f>>2]=d;h=e;e=c+e|0;i=h>>>0>e>>>0?1:i;e=Ke(e-1|0,i-!e|0,c,0);H[f+20>>2]=e;c=0;h=d;d=d+g|0;c=h>>>0>d>>>0?1:c;c=Ke(d-1|0,c-!d|0,g,0);H[f+16>>2]=c;Ie(e,0,c);b:{if(ra){break b}c=Fa(4,N(c,e));H[f+24>>2]=c;if(!c){break b}break a}Da(f)}f=0}if(!f){return 0}c:{if(b){while(1){o=N(n,152);e=o+H[a+28>>2]|0;c=H[e+24>>2];if(c){r=e+28|0;d=H[e+20>>2];g=H[e+16>>2];l=0;while(1){if(N(d,g)){i=N(l,36)+r|0;m=0;while(1){k=H[i+20>>2]+N(m,40)|0;c=H[k+20>>2];j=H[k+16>>2];if(N(c,j)){g=0;while(1){d=H[k+24>>2]+N(g,68)|0;p=H[d+60>>2];if(p){j=H[d+12>>2];s=H[d+20>>2];t=H[d+16>>2];q=H[d+8>>2];d=q-H[i>>2]|0;h=H[i+16>>2];if(h&1){c=H[a+28>>2]+o|0;d=(H[c-144>>2]+d|0)-H[c-152>>2]|0}c=j-H[i+4>>2]|0;if(h&2){h=c;c=H[a+28>>2]+o|0;c=(h+H[c-140>>2]|0)-H[c-148>>2]|0}h=d;d=t-q|0;if(!ab(f,h,c,h+d|0,(s-j|0)+c|0,p,1,d)){break c}j=H[k+16>>2];c=H[k+20>>2]}g=g+1|0;if(g>>>0>>0){continue}break}g=H[e+16>>2];d=H[e+20>>2]}m=m+1|0;if(m>>>0>>0){continue}break}c=H[e+24>>2]}l=l+1|0;if(l>>>0>>0){continue}break}}n=n+1|0;if((n|0)!=(b|0)){continue}break}}return f}Xa(f);return 0}function Ob(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{b:{e=H[a+60>>2];if(!e){if(H[b+16>>2]){break b}return 1}i=Ga(N(e,52));if(!i){break a}e=0;if(H[b+16>>2]){d=H[b+24>>2];while(1){e=N(f,52);Da(H[(e+d|0)+44>>2]);d=H[b+24>>2];H[(e+d|0)+44>>2]=0;f=f+1|0;e=H[b+16>>2];if(f>>>0>>0){continue}break}}if(H[a+60>>2]){f=H[H[a+100>>2]+24>>2];e=0;while(1){h=N(H[H[a+64>>2]+(e<<2)>>2],52);d=h+f|0;c=H[d+4>>2];g=i+N(e,52)|0;H[g>>2]=H[d>>2];H[g+4>>2]=c;H[g+48>>2]=H[d+48>>2];c=H[d+44>>2];H[g+40>>2]=H[d+40>>2];H[g+44>>2]=c;c=H[d+36>>2];H[g+32>>2]=H[d+32>>2];H[g+36>>2]=c;c=H[d+28>>2];H[g+24>>2]=H[d+24>>2];H[g+28>>2]=c;c=H[d+20>>2];H[g+16>>2]=H[d+16>>2];H[g+20>>2]=c;c=H[d+12>>2];H[g+8>>2]=H[d+8>>2];H[g+12>>2]=c;f=H[H[a+100>>2]+24>>2];c=h+f|0;H[g+36>>2]=H[c+36>>2];H[g+44>>2]=H[c+44>>2];H[c+44>>2]=0;e=e+1|0;c=H[a+60>>2];if(e>>>0>>0){continue}break}e=H[b+16>>2]}if(e){d=H[H[a+100>>2]+24>>2];f=0;while(1){c=N(f,52);Da(H[(c+d|0)+44>>2]);d=H[H[a+100>>2]+24>>2];H[(c+d|0)+44>>2]=0;f=f+1|0;if(f>>>0>2]){continue}break}c=H[a+60>>2]}H[b+16>>2]=c;Da(H[b+24>>2]);H[b+24>>2]=i;return 1}e=H[b+24>>2];f=H[H[a+100>>2]+24>>2];while(1){h=N(d,52);c=h+e|0;H[c+36>>2]=H[(f+h|0)+36>>2];Da(H[c+44>>2]);e=H[b+24>>2];f=H[H[a+100>>2]+24>>2];c=h+f|0;H[(h+e|0)+44>>2]=H[c+44>>2];H[c+44>>2]=0;d=d+1|0;if(d>>>0>2]){continue}break}return 1}Va(H[a+96>>2]);H[a+96>>2]=0;return 0}function oe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=oa-16|0;oa=h;if(H[a+8>>2]==16){f=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{f=H[a+12>>2]}a:{if(c>>>0<=1){Ca(d,1,4132,0);a=0;break a}Ea(b,h+12|0,2);b:{if(H[h+12>>2]){Ca(d,2,3608,0);break b}if(c>>>0<=6){Ca(d,1,4132,0);a=0;break a}Ea(b+2|0,h+12|0,2);e=H[f+5616>>2];k=I[h+12|0];c:{d:{e:{g=H[f+5620>>2];if(!g){a=e;break e}a=e;while(1){if(H[a+8>>2]==(k|0)){break e}a=a+20|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}break d}if((g|0)!=(i|0)){break c}}if(H[f+5624>>2]==(g|0)){a=g+10|0;H[f+5624>>2]=a;a=Ia(e,N(a,20));e=H[f+5616>>2];if(!a){Da(e);H[f+5624>>2]=0;H[f+5616>>2]=0;H[f+5620>>2]=0;Ca(d,1,4158,0);a=0;break a}f:{if((a|0)==(e|0)){break f}l=H[f+5632>>2];if(!l){break f}m=H[f+5628>>2];i=0;while(1){g=N(i,20)+m|0;j=H[g+8>>2];if(j){H[g+8>>2]=a+(j-e|0)}j=H[g+12>>2];if(j){H[g+12>>2]=a+(j-e|0)}i=i+1|0;if((l|0)!=(i|0)){continue}break}}H[f+5616>>2]=a;e=H[f+5620>>2];g=N(H[f+5624>>2]-e|0,20);if(g){y(a+N(e,20)|0,0,g)}g=H[f+5620>>2];e=H[f+5616>>2]}H[f+5620>>2]=g+1;a=N(g,20)+e|0}e=H[a+12>>2];if(e){Da(e);H[a+12>>2]=0;H[a+16>>2]=0}H[a+8>>2]=k;e=H[h+12>>2];H[a>>2]=e>>>10&3;H[a+4>>2]=e>>>8&3;Ea(b+4|0,h+12|0,2);if(H[h+12>>2]){Ca(d,2,3023,0);break b}c=c-6|0;e=Ga(c);H[a+12>>2]=e;if(!e){Ca(d,1,4132,0);a=0;break a}if(c){B(e,b+6|0,c)}H[a+16>>2]=c}a=1}oa=h+16|0;return a|0}function Wa(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{if(!H[a+12>>2]){k=1;if(H[a+4>>2]>0|H[a+8>>2]>1){break b}break a}e=1;if(H[a+8>>2]>0){break b}if(H[a+4>>2]<2){break a}}b=H[a>>2];f=b+(e<<5)|0;g=H[a+16>>2];h=H[a+20>>2];if(g>>>0>>0){d=g;while(1){c=(d<<6)+f|0;L[c>>2]=L[c>>2]*O(1.2301740646362305);L[c+4>>2]=L[c+4>>2]*O(1.2301740646362305);L[c+8>>2]=L[c+8>>2]*O(1.2301740646362305);L[c+12>>2]=L[c+12>>2]*O(1.2301740646362305);L[c+16>>2]=L[c+16>>2]*O(1.2301740646362305);L[c+20>>2]=L[c+20>>2]*O(1.2301740646362305);L[c+24>>2]=L[c+24>>2]*O(1.2301740646362305);L[c+28>>2]=L[c+28>>2]*O(1.2301740646362305);d=d+1|0;if((h|0)!=(d|0)){continue}break}}i=b+(k<<5)|0;j=H[a+28>>2];c=H[a+24>>2];if(j>>>0>c>>>0){d=c;while(1){b=(d<<6)+i|0;L[b>>2]=L[b>>2]*O(1.625732421875);L[b+4>>2]=L[b+4>>2]*O(1.625732421875);L[b+8>>2]=L[b+8>>2]*O(1.625732421875);L[b+12>>2]=L[b+12>>2]*O(1.625732421875);L[b+16>>2]=L[b+16>>2]*O(1.625732421875);L[b+20>>2]=L[b+20>>2]*O(1.625732421875);L[b+24>>2]=L[b+24>>2]*O(1.625732421875);L[b+28>>2]=L[b+28>>2]*O(1.625732421875);d=d+1|0;if((j|0)!=(d|0)){continue}break}}b=f+32|0;d=H[a+8>>2];a=H[a+4>>2];e=a-e|0;e=(d|0)<(e|0)?d:e;pb(i,b,g,h,e,O(-.4435068666934967));l=i+32|0;d=d-k|0;a=(a|0)<(d|0)?a:d;pb(f,l,c,j,a,O(-.8829110860824585));pb(i,b,g,h,e,O(.05298011749982834));pb(f,l,c,j,a,O(1.5861343145370483))}}function dc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(a){b=H[a+20>>2];if(b){g=H[b>>2];if(g){d=H[g+20>>2];if(H[g+16>>2]){i=F[a+40|0]&1?16:17;while(1){c=H[d+28>>2];if(c){b=H[d+32>>2];l=(b>>>0)/152|0;j=0;if(b>>>0>=152){while(1){b=H[c+48>>2];if(b){f=H[c+52>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){bb(H[b+32>>2]);H[b+32>>2]=0;bb(H[b+36>>2]);H[b+36>>2]=0;sa[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+48>>2]}Da(b);H[c+48>>2]=0}b=H[c+84>>2];if(b){f=H[c+88>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){bb(H[b+32>>2]);H[b+32>>2]=0;bb(H[b+36>>2]);H[b+36>>2]=0;sa[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+84>>2]}Da(b);H[c+84>>2]=0}b=H[c+120>>2];if(b){f=H[c+124>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){bb(H[b+32>>2]);H[b+32>>2]=0;bb(H[b+36>>2]);H[b+36>>2]=0;sa[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+120>>2]}Da(b);H[c+120>>2]=0}c=c+152|0;j=j+1|0;if((l|0)!=(j|0)){continue}break}c=H[d+28>>2]}Da(c);H[d+28>>2]=0}a:{if(!H[d+40>>2]){break a}b=H[d+36>>2];if(!b){break a}Da(b);H[d+44>>2]=0;H[d+48>>2]=0;H[d+36>>2]=0;H[d+40>>2]=0}Da(H[d+52>>2]);d=d+76|0;k=k+1|0;if(k>>>0>2]){continue}break}d=H[g+20>>2]}Da(d);H[g+20>>2]=0;Da(H[H[a+20>>2]>>2]);b=H[a+20>>2];H[b>>2]=0}Da(b);H[a+20>>2]=0}Da(H[a+68>>2]);Da(a)}}function lc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=H[a+8>>2];f=c+H[a+4>>2]|0;a:{if(!H[a+12>>2]){if((f|0)<2){break a}h=(c<<2)+b|0;d=H[h>>2];e=H[b>>2]-(d+1>>1)|0;i=H[a>>2];b:{if(f>>>0<4){c=d;break b}k=(f-4>>>1|0)+1|0;a=1;while(1){c=a<<2;m=H[c+b>>2];c=H[c+h>>2];l=i+(g<<2)|0;H[l>>2]=e;j=e;e=m-((c+d|0)+2>>2)|0;H[l+4>>2]=(j+e>>1)+d;g=g+2|0;j=(a|0)!=(k|0);d=c;a=a+1|0;if(j){continue}break}}H[i+(g<<2)>>2]=e;if(f&1){d=f-1|0;a=H[(d<<1)+b>>2]-(c+1>>1)|0;H[i+(d<<2)>>2]=a;e=a+e>>1;d=-8}else{d=-4}a=f<<2;H[d+(a+i|0)>>2]=c+e;if(!a){break a}B(b,i,a);return}c:{switch(f-1|0){case 0:H[b>>2]=H[b>>2]/2;return;case 1:a=H[a>>2];c=(c<<2)+b|0;d=H[b>>2]-(H[c>>2]+1>>1)|0;H[a+4>>2]=d;H[a>>2]=d+H[c>>2];c=H[a+4>>2];H[b>>2]=H[a>>2];H[b+4>>2]=c;return;default:break c}}if((f|0)<3){break a}h=H[a>>2];k=(c<<2)+b|0;d=H[k+4>>2];a=H[k>>2];e=H[b>>2]-((d+a|0)+2>>2)|0;H[h>>2]=e+a;g=1;m=f-2|0;l=f&1;a=!l;d:{if(m-a>>>0<2){c=d;break d}o=((f-a|0)-4>>>1|0)+1|0;a=1;while(1){p=H[(a<<2)+b>>2];j=a+1|0;c=H[k+(j<<2)>>2];n=h+(g<<2)|0;H[n>>2]=e;i=e;e=p-((c+d|0)+2>>2)|0;H[n+4>>2]=(i+e>>1)+d;g=g+2|0;i=(a|0)!=(o|0);d=c;a=j;if(i){continue}break}}H[h+(g<<2)>>2]=e;e:{if(!l){g=H[((f<<1)+b|0)-4>>2]-(c+1>>1)|0;H[h+(m<<2)>>2]=(g+e>>1)+c;break e}g=c+e|0}a=f<<2;H[(a+h|0)-4>>2]=g;if(!a){break a}B(b,h,a)}}function bc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+24>>2];j=H[e+16>>2];if(!j){return 0}f=H[e+24>>2];e=H[H[H[a+20>>2]>>2]+20>>2];a:{b:{if(!b){b=0;while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-140>>2];g=H[a-144>>2]-H[a-152>>2]|0;a=H[a-148>>2];h=d-a|0;Ie(g,0,h);if(!(!ra|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);Ie(c,0,d);if(!(!ra|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}break b}b=0;if(!H[a+64>>2]){while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-4>>2];g=H[a-8>>2]-H[a-16>>2]|0;a=H[a-12>>2];h=d-a|0;Ie(g,0,h);if(!(!ra|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);Ie(c,0,d);if(!(!ra|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}break b}while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-140>>2];g=H[a-144>>2]-H[a-152>>2]|0;a=H[a-148>>2];h=d-a|0;Ie(g,0,h);if(!(!ra|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);Ie(c,0,d);if(!(!ra|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}}return a}return-1}function Sb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=oa-256|0;oa=d;if(a){Pa(1806,17,c);H[d+240>>2]=H[a>>2];Ha(c,2348,d+240|0);H[d+224>>2]=H[a+4>>2];Ha(c,2361,d+224|0);H[d+208>>2]=H[a+8>>2];Ha(c,7260,d+208|0);H[d+192>>2]=H[a+16>>2];Ha(c,2319,d+192|0);if((b|0)>0){while(1){e=H[a+5584>>2];H[d+176>>2]=h;Ha(c,1844,d+176|0);e=e+N(h,1080)|0;H[d+160>>2]=H[e>>2];Ha(c,2347,d+160|0);H[d+144>>2]=H[e+4>>2];Ha(c,7374,d+144|0);H[d+128>>2]=H[e+8>>2];Ha(c,7162,d+128|0);H[d+112>>2]=H[e+12>>2];Ha(c,7178,d+112|0);H[d+96>>2]=H[e+16>>2];Ha(c,2330,d+96|0);H[d+80>>2]=H[e+20>>2];Ha(c,7440,d+80|0);Pa(1567,23,c);if(H[e+4>>2]){i=e+944|0;j=e+812|0;f=0;while(1){g=f<<2;k=H[j+g>>2];H[d+68>>2]=H[i+g>>2];H[d+64>>2]=k;Ha(c,1693,d- -64|0);f=f+1|0;if(f>>>0>2]){continue}break}}Mc(c);H[d+48>>2]=H[e+24>>2];Ha(c,7194,d+48|0);H[d+32>>2]=H[e+804>>2];Ha(c,7243,d+32|0);i=1;Pa(1591,20,c);a:{if(H[e+24>>2]!=1){f=H[e+4>>2];if((f|0)<=0){break a}i=N(f,3)-2|0}j=e+28|0;f=0;while(1){g=j+(f<<3)|0;l=d,m=Ne(H[g>>2],H[g+4>>2],32),H[l+16>>2]=m;H[d+20>>2]=ra;Ha(c,1693,d+16|0);f=f+1|0;if((i|0)!=(f|0)){continue}break}}Mc(c);H[d>>2]=H[e+808>>2];Ha(c,7226,d);Pa(1707,5,c);h=h+1|0;if((h|0)!=(b|0)){continue}break}}Pa(1708,4,c)}oa=d+256|0}function Ge(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{e=b;if(e){if(!c){break j}if(!d){break i}e=Q(d)-Q(e)|0;if(e>>>0<=31){break h}break b}if((d|0)==1|d>>>0>1){break b}b=(a>>>0)/(c>>>0)|0;pa=a-N(b,c)|0;qa=0;ra=0;return b}if(!a){break g}if(!d){break f}f=d-1|0;if(f&d){break f}pa=a;qa=e&f;a=e>>>He(d)|0;ra=0;return a}f=c-1|0;if(!(f&c)){break e}k=(Q(c)+33|0)-Q(e)|0;g=0-k|0;break c}k=e+1|0;g=63-e|0;break c}pa=0;a=(e>>>0)/(d>>>0)|0;qa=e-N(a,d)|0;ra=0;return a}e=Q(d)-Q(e)|0;if(e>>>0<31){break d}break b}pa=a&f;qa=0;if((c|0)==1){break a}c=He(c);d=c&31;if((c&63)>>>0>=32){e=0;a=b>>>d|0}else{e=b>>>d|0;a=((1<>>d}ra=e;return a}k=e+1|0;g=63-e|0}f=a;e=k&63;h=e&31;if((e&63)>>>0>=32){e=0;f=b>>>h|0}else{e=b>>>h|0;f=((1<>>h}h=g&63;g=a;i=h&31;if((h&63)>>>0>=32){j=a<>>32-i|b<>>31;f=f<<1|b>>>31;l=e;i=g-(e+(f>>>0>h>>>0)|0)|0;m=i>>31;j=m;e=f;i=c&j;f=e-i|0;e=l-((d&j)+(e>>>0>>0)|0)|0;j=b<<1|a>>>31;a=n|a<<1;b=j|o;l=m&1;n=l;k=k-1|0;if(k){continue}break}}pa=f;qa=e;j=b<<1|a>>>31;a=l|a<<1;ra=j|o;return a}pa=a;qa=b;a=0;b=0}ra=b;return a}function Vc(a,b,c,d,e){var f=0,g=0,h=0,i=0;h=oa-16|0;oa=h;if(H[a+8>>2]==16){a=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{a=H[a+12>>2]}f=H[d>>2];a:{if(!f){d=0;Ca(e,1,2642,0);break a}a=H[a+5584>>2];H[d>>2]=f-1;Ea(c,h+12|0,1);g=N(b,1080)+a|0;a=H[h+12>>2];H[g+804>>2]=a>>>5;b=a&31;H[g+24>>2]=b;a=c+1|0;b:{c:{d:{e:{f:{switch(b|0){case 0:f=H[d>>2];break e;case 1:break d;default:break f}}f=H[d>>2]>>>1|0}if(f>>>0>=98){H[h+4>>2]=97;H[h+8>>2]=97;H[h>>2]=f;Ca(e,2,16056,h);b=H[g+24>>2]}if(b){b=f;if(b){break d}a=0;break c}if(f){b=g+28|0;c=0;while(1){Ea(a,h+12|0,1);if(c>>>0<=96){e=H[h+12>>2];i=b+(c<<3)|0;H[i+4>>2]=0;H[i>>2]=e>>>3}a=a+1|0;c=c+1|0;if((f|0)!=(c|0)){continue}break}}a=H[d>>2];if(a>>>0>>0){d=0;break a}a=a-f|0;break b}e=g+28|0;c=0;while(1){Ea(a,h+12|0,2);if(c>>>0<=96){f=e+(c<<3)|0;i=H[h+12>>2];H[f+4>>2]=i&2047;H[f>>2]=i>>>11}a=a+2|0;c=c+1|0;if((c|0)!=(b|0)){continue}break}a=b<<1}b=H[d>>2];if(a>>>0>b>>>0){d=0;break a}a=b-a|0}H[d>>2]=a;d=1;if(H[g+24>>2]!=1){break a}f=g+28|0;c=H[g+32>>2];e=H[g+28>>2];a=1;while(1){b=f+(a<<3)|0;H[b+4>>2]=c;H[b+12>>2]=c;g=e-((a>>>0)/3|0)|0;H[b+8>>2]=(g|0)>0?g:0;g=b;b=e-((a-1>>>0)/3|0)|0;H[g>>2]=(b|0)>0?b:0;a=a+2|0;if((a|0)!=97){continue}break}}oa=h+16|0;return d}function ue(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=oa-32|0;oa=f;g=1;a:{if(c>>>0<=1){g=0;Ca(d,1,10062,0);break a}if(H[a+76>>2]){break a}Ea(b,f+28|0,1);Ea(b+1|0,f+24|0,1);e=H[f+24>>2];i=e>>>4&3;if((i|0)==3){H[a+76>>2]=1;Ca(d,2,11558,0);break a}c=c-2|0;j=(e>>>5&2)+2|0;h=i+j|0;e=(c>>>0)/(h>>>0)|0;if((c|0)!=(N(e,h)|0)){H[a+76>>2]=1;Ca(d,2,11139,0);break a}if(c>>>0>>0){break a}b:{c=H[a+68>>2];if(c>>>0<=(e^-1)>>>0){c=c+e|0;if(c>>>0<536870912){break b}}H[a+76>>2]=1;Ca(d,2,9400,0);break a}h=Ia(H[a+72>>2],c<<3);if(!h){H[a+76>>2]=1;Ca(d,2,9443,0);break a}c=b+2|0;H[a+72>>2]=h;c:{if(i){k=e>>>0<=1?1:e;e=0;while(1){Ea(c,f+20|0,i);b=H[f+20>>2];if(b>>>0>=N(H[a+132>>2],H[a+128>>2])>>>0){break c}b=c+i|0;Ea(b,f+16|0,j);c=H[a+68>>2];g=h+(c<<3)|0;G[g>>1]=H[f+20>>2];H[g+4>>2]=H[f+16>>2];g=1;H[a+68>>2]=c+1;c=b+j|0;e=e+1|0;if((k|0)!=(e|0)){continue}break}break a}i=e>>>0<=1?1:e;b=H[a+68>>2];e=0;while(1){H[f+20>>2]=b;if(N(H[a+132>>2],H[a+128>>2])>>>0<=b>>>0){break c}Ea(c,f+16|0,j);k=H[a+68>>2];g=h+(k<<3)|0;G[g>>1]=b;H[g+4>>2]=H[f+16>>2];g=1;b=k+1|0;H[a+68>>2]=b;c=c+j|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}break a}H[a+76>>2]=1;H[f>>2]=b;Ca(d,2,7799,f)}oa=f+32|0;return g|0}function Ld(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=oa-16|0;oa=h;a:{if(!(I[a+100|0]&2)){Ca(d,1,11356,0);a=0;break a}H[a+104>>2]=0;b:{c:{d:{if(c){while(1){if(c>>>0<=7){Ca(d,1,3403,0);break b}g=h+12|0;Ea(b,g,4);e=H[h+12>>2];Ea(b+4|0,g,4);f=8;g=H[h+12>>2];e:{f:{g:{switch(e|0){case 1:if(c>>>0<16){e=3443;break c}Ea(b+8|0,h+8|0,4);if(H[h+8>>2]){e=8449;break c}Ea(b+12|0,h+12|0,4);e=H[h+12>>2];if(e){break f}e=3268;break c;case 0:break g;default:break e}}Ca(d,1,3268,0);break b}f=16}if(e>>>0>>0){Ca(d,1,9148,0);break b}if(c>>>0>>0){Ca(d,1,9076,0);a=0;break a}h:{i:{j=b+f|0;k=e-f|0;j:{k:{l:{m:{if((g|0)<=1668246641){if((g|0)==1651532643){break m}if((g|0)==1667523942){break k}if((g|0)!=1668112752){break i}f=25296;break j}if((g|0)==1885564018){break l}f=25264;if((g|0)==1768449138){break j}if((g|0)!=1668246642){break i}f=25272;break j}f=25280;break j}f=25288;break j}f=25304}if(sa[H[f+4>>2]](a,j,k,d)|0){break h}a=0;break a}H[a+104>>2]=H[a+104>>2]|2147483647}i=(g|0)==1768449138?1:i;b=b+e|0;c=c-e|0;if(c){continue}break}if(i){break d}}Ca(d,1,8976,0);a=0;break a}F[a+132|0]=1;H[a+100>>2]=H[a+100>>2]|4;a=1;break a}Ca(d,1,e,0)}Ca(d,1,1968,0);a=0}oa=h+16|0;return a|0}function Pb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{if(!c){break a}b:{e=H[a+184>>2];if(!e){break b}g=H[a+96>>2];if(!g|!H[g+16>>2]|(e|0)!=H[H[g+24>>2]+40>>2]){break b}h=H[c+16>>2];if(!h){break b}f=H[c+24>>2];if(H[f+40>>2]|H[f+44>>2]){break b}g=0;if(h>>>0>=8){j=h&-8;while(1){H[(f+N(g,52)|0)+40>>2]=e;H[(f+N(g|1,52)|0)+40>>2]=e;H[(f+N(g|2,52)|0)+40>>2]=e;H[(f+N(g|3,52)|0)+40>>2]=e;H[(f+N(g|4,52)|0)+40>>2]=e;H[(f+N(g|5,52)|0)+40>>2]=e;H[(f+N(g|6,52)|0)+40>>2]=e;H[(f+N(g|7,52)|0)+40>>2]=e;g=g+8|0;k=k+8|0;if((j|0)!=(k|0)){continue}break}}h=h&7;if(h){while(1){H[(f+N(g,52)|0)+40>>2]=e;g=g+1|0;l=l+1|0;if((h|0)!=(l|0)){continue}break}}if(Ab(c,d)){break b}return 0}f=H[a+100>>2];if(!f){f=zb();H[a+100>>2]=f;if(!f){break a}}Lb(c,f);if(!Ya(H[a+216>>2],22,d)){break a}h=H[a+216>>2];e=H[h>>2];f=H[h+8>>2];c:{if(e){i=1;j=e&1;if((e|0)==1){e=0}else{k=e&-2;g=0;while(1){e=0;d:{if(!i){break d}e=0;if(!(sa[H[f>>2]](a,b,d)|0)){break d}e=(sa[H[f+4>>2]](a,b,d)|0)!=0}i=e;f=f+8|0;g=g+2|0;if((k|0)!=(g|0)){continue}break}e=!i}i=j?0:i;if(!(e|!j)){i=(sa[H[f>>2]](a,b,d)|0)!=0}Qa(h);if(i){break c}Va(H[a+96>>2]);H[a+96>>2]=0;return 0}Qa(h)}i=Ob(a,c)}return i|0}function Yd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(!Ya(H[b+8>>2],54,d)){return 0}j=H[b+4>>2];e=H[j>>2];h=H[j+8>>2];a:{if(e){f=1;k=e&1;if((e|0)==1){e=0}else{e=e&-2;while(1){i=0;b:{if(!f){break b}i=0;if(!(sa[H[h>>2]](b,a,d)|0)){break b}i=(sa[H[h+4>>2]](b,a,d)|0)!=0}f=i;h=h+8|0;g=g+2|0;if((e|0)!=(g|0)){continue}break}e=!f}f=k?0:f;if(!(e|!k)){f=(sa[H[h>>2]](b,a,d)|0)!=0}Qa(j);if(f){break a}return 0}Qa(j)}j=H[b+8>>2];e=H[j>>2];h=H[j+8>>2];c:{if(e){f=1;k=e&1;if((e|0)==1){e=0}else{e=e&-2;g=0;while(1){i=0;d:{if(!f){break d}i=0;if(!(sa[H[h>>2]](b,a,d)|0)){break d}i=(sa[H[h+4>>2]](b,a,d)|0)!=0}f=i;h=h+8|0;g=g+2|0;if((e|0)!=(g|0)){continue}break}e=!f}f=k?0:f;if(!(e|!k)){f=(sa[H[h>>2]](b,a,d)|0)!=0}Qa(j);if(f){break c}return 0}Qa(j)}if(!I[b+132|0]){Ca(d,1,11696,0);return 0}if(!I[b+133|0]){Ca(d,1,11667,0);return 0}d=Yb(a,H[b>>2],c,d);e:{if(!c){break e}a=H[c>>2];if(!a){break e}g=1;f:{g:{switch(H[b+48>>2]-12|0){case 5:g=2;break f;case 6:g=3;break f;case 12:g=4;break f;case 0:g=5;break f;case 4:break f;default:break g}}g=-1}H[a+20>>2]=g;c=H[b+108>>2];if(!c){break e}H[a+28>>2]=c;H[a+32>>2]=H[b+112>>2];H[b+108>>2]=0}return d|0}function Lb(a,b){var c=0,d=0,e=0,f=0,g=0;H[b>>2]=H[a>>2];H[b+4>>2]=H[a+4>>2];H[b+8>>2]=H[a+8>>2];H[b+12>>2]=H[a+12>>2];c=H[b+24>>2];if(c){d=H[b+16>>2];if(d){c=0;while(1){f=H[(H[b+24>>2]+N(c,52)|0)+44>>2];if(f){Da(f);d=H[b+16>>2]}c=c+1|0;if(d>>>0>c>>>0){continue}break}c=H[b+24>>2]}Da(c);H[b+24>>2]=0}c=H[a+16>>2];H[b+16>>2]=c;c=Ga(N(c,52));H[b+24>>2]=c;if(c){if(H[b+16>>2]){f=0;while(1){g=N(f,52);c=g+c|0;d=H[a+24>>2]+g|0;e=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=e;H[c+48>>2]=H[d+48>>2];e=H[d+44>>2];H[c+40>>2]=H[d+40>>2];H[c+44>>2]=e;e=H[d+36>>2];H[c+32>>2]=H[d+32>>2];H[c+36>>2]=e;e=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;c=H[b+24>>2];H[(g+c|0)+44>>2]=0;f=f+1|0;if(f>>>0>2]){continue}break}}H[b+20>>2]=H[a+20>>2];c=H[a+32>>2];H[b+32>>2]=c;a:{if(c){c=Ga(c);H[b+28>>2]=c;if(!c){H[b+28>>2]=0;H[b+32>>2]=0;return}b=H[a+32>>2];if(!b){break a}B(c,H[a+28>>2],b);return}H[b+28>>2]=0}return}H[b+16>>2]=0;H[b+24>>2]=0}function Yb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=zb();H[b+96>>2]=f;a:{b:{if(!f){break b}c:{if(Ya(H[b+220>>2],18,d)){if(Ya(H[b+220>>2],19,d)){break c}}break a}i=H[b+220>>2];e=H[i>>2];g=H[i+8>>2];d:{if(e){f=1;k=e&1;if((e|0)==1){e=0}else{e=e&-2;while(1){h=0;e:{if(!f){break e}h=0;if(!(sa[H[g>>2]](b,a,d)|0)){break e}h=(sa[H[g+4>>2]](b,a,d)|0)!=0}f=h;g=g+8|0;j=j+2|0;if((e|0)!=(j|0)){continue}break}e=!f}f=k?0:f;if(!(e|!k)){f=(sa[H[g>>2]](b,a,d)|0)!=0}Qa(i);if(f){break d}break a}Qa(i)}f:{if(Ya(H[b+216>>2],20,d)){if(Ya(H[b+216>>2],21,d)){break f}}break a}i=H[b+216>>2];e=H[i>>2];g=H[i+8>>2];g:{if(e){f=1;k=e&1;if((e|0)==1){e=0}else{e=e&-2;j=0;while(1){h=0;h:{if(!f){break h}h=0;if(!(sa[H[g>>2]](b,a,d)|0)){break h}h=(sa[H[g+4>>2]](b,a,d)|0)!=0}f=h;g=g+8|0;j=j+2|0;if((e|0)!=(j|0)){continue}break}e=!f}f=k?0:f;if(!(e|!k)){f=(sa[H[g>>2]](b,a,d)|0)!=0}Qa(i);if(f){break g}break a}Qa(i)}a=zb();H[c>>2]=a;if(!a){break b}Lb(H[b+96>>2],a);l=1}return l|0}Va(H[b+96>>2]);H[b+96>>2]=0;return 0}function pb(a,b,c,d,e,f){var g=0,h=O(0),i=0,j=O(0);g=(c<<6)+b|0;a=c?g+-64|0:a;i=d>>>0>>0?d:e;a:{if(i>>>0<=c>>>0){b=a;break a}h=L[a>>2];while(1){b=g;g=b-32|0;j=h;h=L[b>>2];L[g>>2]=O(O(j+h)*f)+L[g>>2];g=b-28|0;L[g>>2]=O(O(L[a+4>>2]+L[b+4>>2])*f)+L[g>>2];g=b-24|0;L[g>>2]=O(O(L[a+8>>2]+L[b+8>>2])*f)+L[g>>2];g=b-20|0;L[g>>2]=O(O(L[a+12>>2]+L[b+12>>2])*f)+L[g>>2];g=b-16|0;L[g>>2]=O(O(L[a+16>>2]+L[b+16>>2])*f)+L[g>>2];g=b-12|0;L[g>>2]=O(O(L[a+20>>2]+L[b+20>>2])*f)+L[g>>2];g=b-8|0;L[g>>2]=O(O(L[a+24>>2]+L[b+24>>2])*f)+L[g>>2];g=b-4|0;L[g>>2]=O(O(L[a+28>>2]+L[b+28>>2])*f)+L[g>>2];g=b- -64|0;a=b;c=c+1|0;if((i|0)!=(c|0)){continue}break}}if(d>>>0>e>>>0){a=g-32|0;f=O(f+f);L[a>>2]=O(L[b>>2]*f)+L[a>>2];a=g-28|0;L[a>>2]=O(L[b+4>>2]*f)+L[a>>2];a=g-24|0;L[a>>2]=O(L[b+8>>2]*f)+L[a>>2];a=g-20|0;L[a>>2]=O(L[b+12>>2]*f)+L[a>>2];a=g-16|0;L[a>>2]=O(L[b+16>>2]*f)+L[a>>2];a=g-12|0;L[a>>2]=O(L[b+20>>2]*f)+L[a>>2];a=g-8|0;L[a>>2]=O(L[b+24>>2]*f)+L[a>>2];a=g-4|0;L[a>>2]=O(L[b+28>>2]*f)+L[a>>2]}}function Lc(a){var b=0,c=0,d=0,e=0,f=0;d=H[6518];b=a+7&-8;c=b+7&-8;a=d+c|0;a:{b:{if(!(a>>>0<=d>>>0?c:0)){if(a>>>0<=ta()<<16>>>0){break b}if(ka(a|0)|0){break b}}H[6597]=48;d=-1;break a}H[6518]=a}if((d|0)!=-1){a=b+d|0;H[a-4>>2]=16;c=a-16|0;H[c>>2]=16;b=H[6856];if(b){f=H[b+8>>2]}else{f=0}c:{d:{if((f|0)==(d|0)){e=d-(H[d-4>>2]&-2)|0;f=H[e-4>>2];H[b+8>>2]=a;a=e-(f&-2)|0;if(F[(a+H[a>>2]|0)-4|0]&1){b=H[a+4>>2];e=H[a+8>>2];H[b+8>>2]=e;H[e+4>>2]=b;b=c-a|0;H[a>>2]=b;break c}a=d-16|0;break d}H[d>>2]=16;H[d+8>>2]=a;H[d+4>>2]=b;H[d+12>>2]=16;H[6856]=d;a=d+16|0}b=c-a|0;H[a>>2]=b}H[((b&-4)+a|0)-4>>2]=b|1;c=H[a>>2]-8|0;e:{if(c>>>0<=127){b=(c>>>3|0)-1|0;break e}e=Q(c);b=((c>>>29-e^4)-(e<<2)|0)+110|0;if(c>>>0<=4095){break e}b=((c>>>30-e^2)-(e<<1)|0)+71|0;b=b>>>0>=63?63:b}c=b<<4;H[a+4>>2]=c+26400;c=c+26408|0;H[a+8>>2]=H[c>>2];H[c>>2]=a;H[H[a+8>>2]+4>>2]=a;c=H[6858];e=H[6859];a=b&31;if((b&63)>>>0>=32){b=1<>>32-a}H[6858]=f|c;H[6859]=b|e}return(d|0)!=-1}function Hd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=oa-16|0;oa=f;a:{if(H[a+120>>2]|c>>>0<3){break a}Ea(b,f+12|0,2);k=J[f+12>>1];if(k-1025>>>0<=4294966271){H[f>>2]=k;Ca(d,1,3526,f);break a}Ea(b+2|0,f+12|0,1);i=J[f+12>>1];if(!i){Ca(d,1,3174,0);break a}if(i+3>>>0>c>>>0){break a}h=Ga(N(i,k)<<2);if(!h){break a}j=Ga(i);if(!j){Da(h);break a}l=Ga(i);if(!l){Da(h);Da(j);break a}g=Ga(20);if(!g){Da(h);Da(j);Da(l);break a}d=b+3|0;H[g+8>>2]=j;H[g+4>>2]=l;G[g+16>>1]=k;H[g>>2]=h;m=H[f+12>>2];H[g+12>>2]=0;F[g+18|0]=m;H[a+120>>2]=g;while(1){Ea(d,f+12|0,1);F[e+j|0]=(I[f+12|0]&127)+1;F[e+l|0]=(H[f+12>>2]&128)>>>7;d=d+1|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}g=0;while(1){e=0;a=0;while(1){e=I[e+j|0]+7>>>3|0;e=e>>>0>=4?4:e;if((e+(d-b|0)|0)>(c|0)){e=0;break a}Ea(d,f+12|0,e);H[h>>2]=H[f+12>>2];h=h+4|0;d=d+e|0;a=a+1|0;e=a&65535;if(i>>>0>e>>>0){continue}break}e=1;g=g+1|0;if((g&65535)>>>0>>0){continue}break}}oa=f+16|0;return e|0}function zd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=-1;e=-1;if(!(I[a+68|0]&8)){f=H[a+32>>2];H[a+36>>2]=f;a:{b:{c:{e=H[a+48>>2];if(e){while(1){e=sa[H[a+20>>2]](f,e,H[a>>2])|0;if((e|0)==-1){break c}f=e+H[a+36>>2]|0;H[a+36>>2]=f;e=H[a+48>>2]-e|0;H[a+48>>2]=e;if(e){continue}break}f=H[a+32>>2]}H[a+36>>2]=f;if(!!b&(c|0)>=0|(c|0)>0){break b}f=0;e=0;break a}H[a+68>>2]=H[a+68>>2]|8;Ca(d,4,15604,0);H[a+48>>2]=0;H[a+68>>2]=H[a+68>>2]|8;ra=-1;return-1}f=0;e=0;while(1){g=sa[H[a+24>>2]](b,c,H[a>>2])|0;h=ra;i=h;if((g&h)==-1){Ca(d,4,15589,0);H[a+68>>2]=H[a+68>>2]|8;b=e+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;a=!(e|f);b=a?-1:f;ra=a?-1:e;return b|0}e=e+i|0;f=f+g|0;e=f>>>0>>0?e+1|0:e;h=b;b=b-g|0;c=c-(i+(g>>>0>h>>>0)|0)|0;if(!!b&(c|0)>=0|(c|0)>0){continue}break}}b=e+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b}ra=e;return f|0}function Kc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=a;a:{if(b&3){while(1){c=I[b|0];if(!c|(c|0)==61){break a}b=b+1|0;if(b&3){continue}break}}b:{c:{d=H[b>>2];if(((d|16843008-d)&-2139062144)!=-2139062144){break c}while(1){c=d^1027423549;if(((16843008-c|c)&-2139062144)!=-2139062144){break c}d=H[b+4>>2];c=b+4|0;b=c;if(((16843008-d|d)&-2139062144)==-2139062144){continue}break}break b}c=b}while(1){b=c;d=I[b|0];if(!d){break a}c=b+1|0;if((d|0)!=61){continue}break}}if((a|0)==(b|0)){return 0}g=b-a|0;d:{if(I[g+a|0]){break d}f=H[6860];if(!f){break d}b=H[f>>2];if(!b){break d}while(1){e:{d=a;c=b;h=g;e=0;f:{if(!g){break f}e=I[d|0];if(e){g:{while(1){i=I[c|0];if((i|0)!=(e|0)|!i){break g}h=h-1|0;if(!h){break g}c=c+1|0;e=I[d+1|0];d=d+1|0;if(e){continue}break}e=0}}else{e=0}e=e-I[c|0]|0}if(!e){b=b+g|0;if(I[b|0]==61){break e}}b=H[f+4>>2];f=f+4|0;if(b){continue}break d}break}j=b+1|0}return j}function qe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=oa-16|0;oa=g;a:{if(c>>>0<=1){Ca(d,1,3983,0);a=0;break a}if(F[a+212|0]&1){Ca(d,1,12668,0);a=0;break a}a=H[a+180>>2]+N(H[a+228>>2],5644)|0;F[a+5640|0]=I[a+5640|0]|2;Ea(b,g+12|0,1);e=H[a+5164>>2];b:{if(!e){f=H[g+12>>2]+1|0;e=Fa(f,8);H[a+5164>>2]=e;if(!e){Ca(d,1,4009,0);a=0;break a}H[a+5160>>2]=f;break b}f=H[g+12>>2];if(f>>>0>2]){break b}h=e;e=f+1|0;f=Ia(h,e<<3);if(!f){Ca(d,1,4009,0);a=0;break a}H[a+5164>>2]=f;h=H[a+5160>>2];i=e-h<<3;if(i){y(f+(h<<3)|0,0,i)}H[a+5160>>2]=e;e=H[a+5164>>2]}h=e;e=H[g+12>>2];if(H[h+(e<<3)>>2]){H[g>>2]=e;Ca(d,1,7063,g);a=0;break a}c=c-1|0;e=Ga(c);a=H[a+5164>>2];f=H[g+12>>2];H[a+(f<<3)>>2]=e;if(!e){Ca(d,1,4009,0);a=0;break a}H[(a+(f<<3)|0)+4>>2]=c;if(c){B(H[a+(H[g+12>>2]<<3)>>2],b+1|0,c)}a=1}oa=g+16|0;return a|0}function Ib(a,b,c){var d=0,e=0,f=0,g=0;e=a+4|0;d=(e+b|0)-1&0-b;b=H[a>>2];if(d+c>>>0<=(b+a|0)-4>>>0){f=H[a+4>>2];g=H[a+8>>2];H[f+8>>2]=g;H[g+4>>2]=f;if((d|0)!=(e|0)){d=d-e|0;f=a-(H[a-4>>2]&-2)|0;e=d+H[f>>2]|0;H[f>>2]=e;H[(f+(e&-4)|0)-4>>2]=e;a=a+d|0;b=b-d|0;H[a>>2]=b}a:{if(c+24>>>0<=b>>>0){e=a+c|0;b=(b-c|0)-8|0;H[e+8>>2]=b;g=e+8|0;H[(g+(b&-4)|0)-4>>2]=b|1;d=H[e+8>>2]-8|0;b:{if(d>>>0<=127){b=(d>>>3|0)-1|0;break b}f=Q(d);b=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break b}b=((d>>>30-f^2)-(f<<1)|0)+71|0;b=b>>>0>=63?63:b}d=b<<4;H[e+12>>2]=d+26400;d=d+26408|0;H[e+16>>2]=H[d>>2];H[d>>2]=g;H[H[e+16>>2]+4>>2]=g;d=H[6858];f=H[6859];e=b&31;if((b&63)>>>0>=32){b=1<>>32-e}H[6858]=g|d;H[6859]=b|f;b=c+8|0;H[a>>2]=b;c=(b&-4)+a|0;break a}c=a+b|0}H[c-4>>2]=b;a=a+4|0}else{a=0}return a}function we(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=oa-16|0;oa=g;i=H[H[a+96>>2]+16>>2];h=i>>>0<257?1:2;e=(h<<1)+5|0;f=(c>>>0)/(e>>>0)|0;a:{if(!((N(e,f)|0)==(c|0)&c>>>0>=e>>>0)){Ca(d,1,4643,0);a=0;break a}if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}a=0;c=I[e+5640|0];a=c&4?H[e+420>>2]+1|0:a;f=f+a|0;if(f>>>0>=32){H[g>>2]=f;Ca(d,1,7781,g);a=0;break a}F[e+5640|0]=c|4;if(a>>>0>>0){c=(e+N(a,148)|0)+424|0;while(1){Ea(b,c,1);b=b+1|0;Ea(b,c+4|0,h);b=b+h|0;Ea(b,c+8|0,2);d=H[c+8>>2];j=H[e+8>>2];H[c+8>>2]=d>>>0>>0?d:j;Ea(b+2|0,c+12|0,1);b=b+3|0;Ea(b,c+16|0,h);b=b+h|0;Ea(b,g+12|0,1);H[c+36>>2]=H[g+12>>2];d=H[c+16>>2];H[c+16>>2]=d>>>0>>0?d:i;c=c+148|0;b=b+1|0;a=a+1|0;if((f|0)!=(a|0)){continue}break}}H[e+420>>2]=f-1;a=1}oa=g+16|0;return a|0}function mb(a){var b=0,c=0,d=0,e=0;a:{if(!a){break a}b=H[a+5164>>2];if(b){c=H[a+5160>>2];if(c){b=0;while(1){d=H[H[a+5164>>2]+(b<<3)>>2];if(d){Da(d);c=H[a+5160>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+5164>>2]}H[a+5160>>2]=0;Da(b);H[a+5164>>2]=0}b=H[a+5172>>2];if(b){Da(b);H[a+5172>>2]=0}b=H[a+5584>>2];if(b){Da(b);H[a+5584>>2]=0}b=H[a+5612>>2];if(b){Da(b);H[a+5612>>2]=0}b=H[a+5608>>2];if(b){Da(b);H[a+5608>>2]=0}b=H[a+5628>>2];if(b){Da(b);H[a+5636>>2]=0;H[a+5628>>2]=0;H[a+5632>>2]=0}b=H[a+5616>>2];if(b){e=H[a+5620>>2];if(e){c=0;while(1){d=H[b+12>>2];if(d){Da(d);H[b+12>>2]=0;e=H[a+5620>>2]}b=b+20|0;c=c+1|0;if(e>>>0>c>>>0){continue}break}b=H[a+5616>>2]}Da(b);H[a+5616>>2]=0}b=H[a+5604>>2];if(b){Da(b);H[a+5604>>2]=0}b=H[a+5596>>2];if(!b){break a}Da(b);H[a+5596>>2]=0;H[a+5600>>2]=0}}function Kd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=oa-32|0;oa=e;a:{if(H[a+72>>2]){Ca(d,2,7015,0);c=1;break a}if((c|0)!=14){c=0;Ca(d,1,14445,0);break a}Ea(b,a+16|0,4);Ea(b+4|0,a+12|0,4);Ea(b+8|0,a+20|0,2);f=H[a+12>>2];b:{g=H[a+16>>2];c=H[a+20>>2];c:{if(!g){break c}c=H[a+20>>2];if(!f){break c}if(c){break b}c=0}H[e+8>>2]=c;H[e+4>>2]=g;H[e>>2]=f;Ca(d,1,14289,e);c=0;break a}if(c-16385>>>0<=4294950911){c=0;Ca(d,1,14203,0);break a}c=Fa(c,12);H[a+72>>2]=c;if(!c){c=0;Ca(d,1,14240,0);break a}c=1;Ea(b+10|0,a+24|0,1);Ea(b+11|0,a+28|0,1);f=H[a+28>>2];if((f|0)!=7){H[e+16>>2]=f;Ca(d,4,16272,e+16|0)}Ea(b+12|0,a+32|0,1);Ea(b+13|0,a+36|0,1);b=H[a>>2];F[b+212|0]=I[b+212|0]&251|(H[a+24>>2]==255?4:0);b=H[a>>2];H[b+240>>2]=H[a+12>>2];H[b+244>>2]=H[a+16>>2];F[a+133|0]=1}oa=e+32|0;return c|0}function Dc(a,b,c,d){a:{switch(b-9|0){case 0:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];return;case 6:b=H[c>>2];H[c>>2]=b+4;b=G[b>>1];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 7:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=J[b>>1];H[a+4>>2]=0;return;case 8:b=H[c>>2];H[c>>2]=b+4;b=F[b|0];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 9:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=I[b|0];H[a+4>>2]=0;return;case 16:b=H[c>>2]+7&-8;H[c>>2]=b+8;M[a>>3]=M[b>>3];return;case 17:sa[d|0](a,c);default:return;case 1:case 4:case 14:b=H[c>>2];H[c>>2]=b+4;b=H[b>>2];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 2:case 5:case 11:case 15:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];H[a+4>>2]=0;return;case 3:case 10:case 12:case 13:break a}}b=H[c>>2]+7&-8;H[c>>2]=b+8;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c}function re(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=oa-16|0;oa=g;a:{if(c>>>0<=1){Ca(d,1,4311,0);a=0;break a}F[a+212|0]=I[a+212|0]|1;Ea(b,g+12|0,1);e=H[a+140>>2];b:{if(!e){f=H[g+12>>2]+1|0;e=Fa(f,8);H[a+140>>2]=e;if(!e){Ca(d,1,4337,0);a=0;break a}H[a+136>>2]=f;break b}f=H[g+12>>2];if(f>>>0>2]){break b}h=e;e=f+1|0;f=Ia(h,e<<3);if(!f){Ca(d,1,4337,0);a=0;break a}H[a+140>>2]=f;h=H[a+136>>2];i=e-h<<3;if(i){y(f+(h<<3)|0,0,i)}H[a+136>>2]=e;e=H[a+140>>2]}h=e;e=H[g+12>>2];if(H[h+(e<<3)>>2]){H[g>>2]=e;Ca(d,1,7085,g);a=0;break a}c=c-1|0;e=Ga(c);a=H[a+140>>2];f=H[g+12>>2];H[a+(f<<3)>>2]=e;if(!e){Ca(d,1,4337,0);a=0;break a}H[(a+(f<<3)|0)+4>>2]=c;if(c){B(H[a+(H[g+12>>2]<<3)>>2],b+1|0,c)}a=1}oa=g+16|0;return a|0}function ud(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=oa-32|0;oa=d;e=H[a+28>>2];H[d+16>>2]=e;f=H[a+20>>2];H[d+28>>2]=c;H[d+24>>2]=b;b=f-e|0;H[d+20>>2]=b;f=b+c|0;i=2;b=d+16|0;a:{while(1){b:{c:{d:{if(!Hb(_(H[a+60>>2],b|0,i|0,d+12|0)|0)){g=H[d+12>>2];if((g|0)==(f|0)){break d}if((g|0)>=0){break c}break b}if((f|0)!=-1){break b}}b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];a=c;break a}h=H[b+4>>2];j=h>>>0>>0;e=(j?8:0)+b|0;h=g-(j?h:0)|0;H[e>>2]=h+H[e>>2];b=(j?12:4)+b|0;H[b>>2]=H[b>>2]-h;f=f-g|0;i=i-j|0;b=e;continue}break}H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a>>2]=H[a>>2]|32;a=0;if((i|0)==2){break a}a=c-H[b+4>>2]|0}oa=d+32|0;return a|0}function Da(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;if(a){b=a-4|0;f=H[b>>2];c=f;d=b;e=H[a-8>>2];a=e&-2;if((a|0)!=(e|0)){d=b-a|0;c=H[d+4>>2];e=H[d+8>>2];H[c+8>>2]=e;H[e+4>>2]=c;c=a+f|0}a=b+f|0;b=H[a>>2];if((b|0)!=H[(a+b|0)-4>>2]){f=H[a+4>>2];a=H[a+8>>2];H[f+8>>2]=a;H[a+4>>2]=f;c=b+c|0}H[d>>2]=c;H[((c&-4)+d|0)-4>>2]=c|1;b=H[d>>2]-8|0;a:{if(b>>>0<=127){a=(b>>>3|0)-1|0;break a}c=Q(b);a=((b>>>29-c^4)-(c<<2)|0)+110|0;if(b>>>0<=4095){break a}a=((b>>>30-c^2)-(c<<1)|0)+71|0;a=a>>>0>=63?63:a}b=a<<4;H[d+4>>2]=b+26400;b=b+26408|0;H[d+8>>2]=H[b>>2];H[b>>2]=d;H[H[d+8>>2]+4>>2]=d;b=H[6858];c=H[6859];d=a&31;if((a&63)>>>0>=32){a=1<>>32-d}H[6858]=e|b;H[6859]=a|c}}function hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if(K[a+44>>2]>=8){e=H[a+36>>2];j=e<<5;k=N(e,28);l=N(e,24);m=N(e,20);n=e<<4;o=N(e,12);p=e<<3;f=H[a+40>>2];g=8;while(1){Eb(a,f,H[a+36>>2],8);Wa(a);h=H[a+32>>2];if(h){i=H[a>>2];b=0;while(1){c=(b<<2)+f|0;d=i+(b<<5)|0;L[c>>2]=L[d>>2];L[c+(e<<2)>>2]=L[d+4>>2];L[c+p>>2]=L[d+8>>2];L[c+o>>2]=L[d+12>>2];b=b+1|0;if((h|0)!=(b|0)){continue}break}i=H[a>>2];b=0;while(1){c=(b<<2)+f|0;d=i+(b<<5)|0;L[c+n>>2]=L[d+16>>2];L[c+m>>2]=L[d+20>>2];L[c+l>>2]=L[d+24>>2];L[c+k>>2]=L[d+28>>2];b=b+1|0;if((h|0)!=(b|0)){continue}break}}f=f+j|0;g=g+8|0;if(g>>>0<=K[a+44>>2]){continue}break}}Da(H[a>>2]);Da(a)}function Ed(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=oa-16|0;oa=e;a:{if(H[a+116>>2]){break a}if(c>>>0<=1){Ca(d,1,8882,0);break a}Ea(b,e+12|0,2);f=H[e+12>>2];h=f&65535;if(!h){Ca(d,1,8915,0);break a}if(N(h,6)+2>>>0>c>>>0){Ca(d,1,8882,0);break a}d=Ga(N(f,6));if(!d){break a}c=Ga(8);H[a+116>>2]=c;if(!c){Da(d);break a}H[c>>2]=d;f=c;c=J[e+12>>1];G[f+4>>1]=c;if(!c){g=1;break a}c=0;while(1){g=e+12|0;Ea(b+2|0,g,2);f=d+N(c,6)|0;G[f>>1]=H[e+12>>2];Ea(b+4|0,g,2);G[f+2>>1]=H[e+12>>2];b=b+6|0;Ea(b,g,2);G[f+4>>1]=H[e+12>>2];g=1;c=c+1|0;if(c>>>0>2]+4>>1]){continue}break}}oa=e+16|0;return g|0}function Xb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=oa-32|0;oa=g;f=H[a+96>>2];a:{if(!f){Ca(d,1,13752,0);e=0;break a}f=Fa(4,H[f+16>>2]);e=0;if(!f){break a}if(b){j=H[a+96>>2];while(1){b:{e=H[(h<<2)+c>>2];c:{if(e>>>0>=K[j+16>>2]){H[g+16>>2]=e;Ca(d,1,2443,g+16|0);break c}i=f+(e<<2)|0;if(!H[i>>2]){break b}H[g>>2]=e;Ca(d,1,3487,g)}Da(f);e=0;break a}H[i>>2]=1;h=h+1|0;if((h|0)!=(b|0)){continue}break}}Da(f);Da(H[a+64>>2]);d:{if(b){d=b<<2;e=Ga(d);H[a+64>>2]=e;if(!e){H[a+60>>2]=0;e=0;break a}if(!d){break d}B(e,c,d);break d}H[a+64>>2]=0}H[a+60>>2]=b;e=1}oa=g+32|0;return e|0}function Pc(a){a=a|0;var b=0,c=0;if(a){Bb(H[a>>2]);H[a>>2]=0;b=H[a+72>>2];if(b){Da(b);H[a+72>>2]=0}b=H[a+68>>2];if(b){Da(b);H[a+68>>2]=0}b=H[a+108>>2];if(b){Da(b);H[a+108>>2]=0}b=H[a+116>>2];if(b){c=H[b>>2];if(c){Da(c);b=H[a+116>>2];H[b>>2]=0}Da(b);H[a+116>>2]=0}b=H[a+120>>2];if(b){c=H[b+12>>2];if(c){Da(c);b=H[a+120>>2];H[b+12>>2]=0}c=H[b+4>>2];if(c){Da(c);b=H[a+120>>2];H[b+4>>2]=0}c=H[b+8>>2];if(c){Da(c);b=H[a+120>>2];H[b+8>>2]=0}c=H[b>>2];if(c){Da(c);b=H[a+120>>2];H[b>>2]=0}Da(b);H[a+120>>2]=0}b=H[a+4>>2];if(b){sb(b);H[a+4>>2]=0}b=H[a+8>>2];if(b){sb(b);H[a+8>>2]=0}Da(a)}}function Ub(){var a=0,b=0,c=0;a:{a=Fa(1,256);if(a){H[a>>2]=1;H[a+208>>2]=1;F[a+212|0]=I[a+212|0]|6;b=Fa(1,5644);H[a+12>>2]=b;if(!b){break a}b=Fa(1,1e3);H[a+16>>2]=b;if(!b){break a}H[a+48>>2]=0;H[a+52>>2]=0;H[a+44>>2]=-1;H[a+20>>2]=1e3;b:{c=Fa(1,48);if(c){H[c+24>>2]=0;H[c+32>>2]=100;b=Fa(100,24);H[c+28>>2]=b;if(b){break b}Da(c)}H[a+224>>2]=0;break a}H[c+40>>2]=0;H[a+224>>2]=c;b=tb();H[a+220>>2]=b;if(!b){break a}b=tb();H[a+216>>2]=b;if(!b){break a}c:{if(!Kc(1419)){break c}}b=vc();H[a+236>>2]=b;if(!b){b=vc();H[a+236>>2]=b;if(!b){break a}}}else{a=0}return a}Bb(a);return 0}function wb(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0;g=oa-240|0;oa=g;H[g+236>>2]=c;H[g+232>>2]=b;H[g>>2]=a;l=!e;a:{b:{c:{d:{if((b|0)!=1){h=a;i=1;break d}h=a;i=1;if(c){break d}e=a;break c}while(1){j=(d<<2)+f|0;e=h-H[j>>2]|0;if((db(e,a)|0)<=0){e=h;break c}k=l^-1;l=1;e:{if(!((k|(d|0)<2)&1)){j=H[j-8>>2];k=h-8|0;if((db(k,e)|0)>=0){break e}if((db(k-j|0,e)|0)>=0){break e}}H[(i<<2)+g>>2]=e;b=Jc(b,c);xb(g+232|0,b);i=i+1|0;d=b+d|0;h=e;c=H[g+236>>2];b=H[g+232>>2];if(c|(b|0)!=1){continue}break b}break}e=h;break b}if(!l){break a}}Ic(g,i);Gb(e,d,f)}oa=g+240|0}function Gc(a,b,c,d,e){var f=0,g=0,h=0;f=oa-208|0;oa=f;H[f+204>>2]=c;c=f+160|0;y(c,0,40);H[f+200>>2]=H[f+204>>2];a:{if((Fc(0,b,f+200|0,f+80|0,c,d,e)|0)<0){break a}c=H[a+76>>2]<0;g=H[a>>2];H[a>>2]=g&-33;b:{c:{d:{if(!H[a+48>>2]){H[a+48>>2]=80;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;h=H[a+44>>2];H[a+44>>2]=f;break d}if(H[a+16>>2]){break c}}if(Kb(a)){break b}}Fc(a,b,f+200|0,f+80|0,f+160|0,d,e)}if(h){sa[H[a+36>>2]](a,0,0)|0;H[a+48>>2]=0;H[a+44>>2]=h;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0}H[a>>2]=H[a>>2]|g&32;if(c){break a}}oa=f+208|0}function Be(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=oa-16|0;oa=e;if(H[a+8>>2]==16){g=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{g=H[a+12>>2]}h=H[a+96>>2];f=K[h+16>>2]<257?1:2;a:{if(f>>>0>=c>>>0){c=0;Ca(d,1,4669,0);break a}H[e+12>>2]=(f^-1)+c;Ea(b,e+8|0,f);i=H[e+8>>2];if(i>>>0>=K[h+16>>2]){c=0;Ca(d,1,14067,0);break a}c=1;b=b+f|0;Ea(b,H[g+5584>>2]+N(i,1080)|0,1);if(!Wc(a,H[e+8>>2],b+1|0,e+12|0,d)){c=0;Ca(d,1,4669,0);break a}if(!H[e+12>>2]){break a}c=0;Ca(d,1,4669,0)}oa=e+16|0;return c|0}function Rc(a,b){var c=0,d=0,e=0,f=0,g=0;f=oa-32|0;oa=f;c=H[a+60>>2];a:{b:{if(c){g=1;while(1){e=H[H[a+64>>2]+(d<<2)>>2];if(!H[(H[H[a+100>>2]+24>>2]+N(e,52)|0)+44>>2]){H[f+16>>2]=e;Ca(b,2,7604,f+16|0);g=0;c=H[a+60>>2]}d=d+1|0;if(c>>>0>d>>>0){continue}break}break b}g=1;c=H[a+100>>2];e=1;if(!H[c+16>>2]){break a}while(1){if(!H[(H[c+24>>2]+N(d,52)|0)+44>>2]){H[f>>2]=d;Ca(b,2,7604,f);g=0;c=H[a+100>>2]}d=d+1|0;if(d>>>0>2]){continue}break}}e=1;if(g){break a}Ca(b,1,2897,0);e=0}oa=f+32|0;return e}function Gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=oa-16|0;oa=f;e=H[a+120>>2];a:{if(!e){Ca(d,1,8836,0);c=0;break a}if(H[e+12>>2]){Ca(d,1,11598,0);c=0;break a}e=I[e+18|0];g=e<<2;if(g>>>0>c>>>0){Ca(d,1,8803,0);c=0;break a}g=Ga(g);c=0;if(!g){break a}if(e){d=0;while(1){c=f+12|0;Ea(b,c,2);h=g+(d<<2)|0;G[h>>1]=H[f+12>>2];Ea(b+2|0,c,1);F[h+2|0]=H[f+12>>2];Ea(b+3|0,c,1);F[h+3|0]=H[f+12>>2];b=b+4|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}}H[H[a+120>>2]+12>>2]=g;c=1}oa=f+16|0;return c|0}function me(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=oa-16|0;oa=e;g=H[H[a+96>>2]+16>>2];a:{if((g+2|0)!=(c|0)){Ca(d,1,4617,0);break a}Ea(b,e+12|0,2);if(H[e+12>>2]!=(g|0)){Ca(d,1,4617,0);break a}if(!g){f=1;break a}c=b+2|0;a=H[H[a+96>>2]+24>>2];b=0;while(1){Ea(c,e+8|0,1);f=H[e+8>>2];h=f&127;i=h+1|0;H[a+24>>2]=i;H[a+32>>2]=f>>>7&1;if(h>>>0>=31){H[e+4>>2]=i;H[e>>2]=b;Ca(d,1,15402,e);f=0;break a}a=a+52|0;f=1;c=c+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}oa=e+16|0;return f|0}function ye(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=oa-16|0;oa=e;a:{b:{h=e+8|0;c:{if(K[H[a+96>>2]+16>>2]<=256){if(c){f=-1;g=1;break c}Ca(d,1,4695,0);a=0;break a}if(c>>>0<=1){break b}f=-2;g=2}Ea(b,h,g);H[e+12>>2]=c+f;c=H[e+8>>2];f=H[H[a+96>>2]+16>>2];if(c>>>0>=f>>>0){H[e+4>>2]=f;H[e>>2]=c;Ca(d,1,7712,e);a=0;break a}if(!Vc(a,c,b+g|0,e+12|0,d)){Ca(d,1,4695,0);a=0;break a}a=1;if(!H[e+12>>2]){break a}Ca(d,1,4695,0);a=0;break a}Ca(d,1,4695,0);a=0}oa=e+16|0;return a|0}function pc(a,b,c,d){var e=0,f=0,g=0;g=oa-128|0;oa=g;f=g;c=H[b+12>>2]+(c<<4)|0;e=H[c>>2];a:{if(!e){b=c;break a}while(1){H[f>>2]=c;f=f+4|0;b=e;c=b;e=H[c>>2];if(e){continue}break}}e=0;while(1){c=H[b+8>>2];if((e|0)>(c|0)){H[b+8>>2]=e;c=e}b:{if((c|0)>=(d|0)){break b}while(1){if(H[b+4>>2]<=(c|0)){break b}c:{if(Ta(a,1)){H[b+4>>2]=c;break c}c=c+1|0}if((c|0)<(d|0)){continue}break}}H[b+8>>2]=c;if((f|0)!=(g|0)){f=f-4|0;b=H[f>>2];e=c;continue}break}oa=g+128|0;return H[b+4>>2]<(d|0)}function Qd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=H[a+32>>2];H[a+36>>2]=f;a:{e=H[a+48>>2];if(e){while(1){e=sa[H[a+20>>2]](f,e,H[a>>2])|0;if((e|0)==-1){break a}f=e+H[a+36>>2]|0;H[a+36>>2]=f;e=H[a+48>>2]-e|0;H[a+48>>2]=e;if(e){continue}break}f=H[a+32>>2]}H[a+48>>2]=0;H[a+36>>2]=f;if(!(sa[H[a+28>>2]](b,c,H[a>>2])|0)){H[a+68>>2]=H[a+68>>2]|8;return 0}H[a+56>>2]=b;H[a+60>>2]=c;return 1}H[a+68>>2]=H[a+68>>2]|8;Ca(d,4,15604,0);H[a+68>>2]=H[a+68>>2]|8;return 0}function Ca(a,b,c,d){var e=0,f=0;e=oa-528|0;oa=e;a:{if(!a){break a}b:{c:{switch(b-1|0){case 0:b=a+12|0;break b;case 1:b=a+16|0;a=a+4|0;break b;case 3:break c;default:break a}}b=a+20|0;a=a+8|0}b=H[b>>2];if(!b|!c){break a}f=H[a>>2];y(e,0,512);H[e+524>>2]=d;a=oa-160|0;oa=a;H[a+148>>2]=e;H[a+152>>2]=511;y(a,0,144);H[a+76>>2]=-1;H[a+36>>2]=103;H[a+80>>2]=-1;H[a+44>>2]=a+159;H[a+84>>2]=a+148;F[e|0]=0;Gc(a,c,d,104,105);oa=a+160|0;F[e+511|0]=0;sa[b|0](e,f)}oa=e+528|0}function Md(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(H[a+100>>2]!=1){Ca(d,1,11401,0);return 0}a:{if(c>>>0<=7){break a}Ea(b,a+56|0,4);Ea(b+4|0,a+60|0,4);if(c&3){break a}c=c-8|0;e=c>>>2|0;H[a+64>>2]=e;b:{if(!c){break b}c=Fa(e,4);H[a+68>>2]=c;if(!c){Ca(d,1,2235,0);return 0}if(!H[a+64>>2]){break b}d=b+8|0;c=0;while(1){Ea(d,H[a+68>>2]+(c<<2)|0,4);d=d+4|0;c=c+1|0;if(c>>>0>2]){continue}break}}H[a+100>>2]=H[a+100>>2]|2;return 1}Ca(d,1,5955,0);return 0}function rc(a){var b=0,c=0,d=0;a:{if(!a){break a}b=H[a+8>>2];if(!b){break a}a=H[a+12>>2];if(b>>>0>=4){d=b&-4;while(1){H[a+60>>2]=0;H[a+52>>2]=999;H[a+56>>2]=0;H[a+44>>2]=0;H[a+36>>2]=999;H[a+40>>2]=0;H[a+28>>2]=0;H[a+20>>2]=999;H[a+24>>2]=0;H[a+12>>2]=0;H[a+4>>2]=999;H[a+8>>2]=0;a=a- -64|0;c=c+4|0;if((d|0)!=(c|0)){continue}break}}b=b&3;if(!b){break a}c=0;while(1){H[a+12>>2]=0;H[a+4>>2]=999;H[a+8>>2]=0;a=a+16|0;c=c+1|0;if((b|0)!=(c|0)){continue}break}}} -function ze(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=oa-16|0;oa=e;H[e+12>>2]=c;a:{if(!(!Vc(a,0,b,e+12|0,d)|H[e+12>>2])){if(H[a+8>>2]==16){b=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{b=H[a+12>>2]}f=1;if(K[H[a+96>>2]+16>>2]<2){break a}c=H[b+5584>>2];g=c+28|0;b=1;d=c;while(1){H[d+1104>>2]=H[c+24>>2];H[d+1884>>2]=H[c+804>>2];B(d+1108|0,g,776);d=d+1080|0;b=b+1|0;if(b>>>0>2]+16>>2]){continue}break}break a}Ca(d,1,4591,0)}oa=e+16|0;return f|0}function Cc(a,b){a:{b:{if(b>>>0<=127){break b}c:{if(!H[H[6885]>>2]){if((b&-128)==57216){break b}break c}if(b>>>0<=2047){F[a+1|0]=b&63|128;F[a|0]=b>>>6|192;a=2;break a}if(!((b&-8192)!=57344&b>>>0>=55296)){F[a+2|0]=b&63|128;F[a|0]=b>>>12|224;F[a+1|0]=b>>>6&63|128;a=3;break a}if(b-65536>>>0<=1048575){F[a+3|0]=b&63|128;F[a|0]=b>>>18|240;F[a+2|0]=b>>>6&63|128;F[a+1|0]=b>>>12&63|128;a=4;break a}}H[6597]=25;a=-1;break a}F[a|0]=b;a=1}return a}function _d(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!Ya(H[a+8>>2],54,c)){return 0}h=H[a+8>>2];d=H[h>>2];f=H[h+8>>2];a:{if(d){e=1;i=d&1;if((d|0)==1){d=0}else{d=d&-2;while(1){g=0;b:{if(!e){break b}g=0;if(!(sa[H[f>>2]](a,b,c)|0)){break b}g=(sa[H[f+4>>2]](a,b,c)|0)!=0}e=g;f=f+8|0;j=j+2|0;if((d|0)!=(j|0)){continue}break}d=!e}e=i?0:e;if(!(d|!i)){e=(sa[H[f>>2]](a,b,c)|0)!=0}Qa(h);if(e){break a}return 0}Qa(h)}return 1}function Ae(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=oa-16|0;oa=e;g=H[H[a+96>>2]+16>>2];f=g>>>0<257?1:2;a:{if((f+2|0)!=(c|0)){a=0;Ca(d,1,4285,0);break a}if(H[a+8>>2]==16){c=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{c=H[a+12>>2]}Ea(b,e+12|0,f);a=1;b=b+f|0;Ea(b,e+8|0,1);f=H[e+12>>2];if(f>>>0>=g>>>0){H[e+4>>2]=g;H[e>>2]=f;Ca(d,1,14923,e);a=0;break a}Ea(b+1|0,(H[c+5584>>2]+N(f,1080)|0)+808|0,1)}oa=e+16|0;return a|0}function Fe(){var a=0,b=0,c=0;while(1){b=a<<4;c=b+26400|0;H[b+26404>>2]=c;H[b+26408>>2]=c;a=a+1|0;if((a|0)!=64){continue}break}Lc(48);a=oa-16|0;oa=a;a:{if(ma(a+12|0,a+8|0)|0){break a}b=yb((H[a+12>>2]<<2)+4|0);H[6860]=b;if(!b){break a}b=yb(H[a+8>>2]);if(b){c=H[6860];H[c+(H[a+12>>2]<<2)>>2]=0;if(!(la(c|0,b|0)|0)){break a}}H[6860]=0}oa=a+16|0;H[6876]=8192;H[6874]=94352;H[6867]=42;H[6885]=27608;H[6875]=65536}function Jb(a,b,c){var d=0,e=0,f=0;d=H[c+16>>2];a:{if(!d){if(Kb(c)){break a}d=H[c+16>>2]}e=H[c+20>>2];if(d-e>>>0>>0){return sa[H[c+36>>2]](c,a,b)|0}b:{c:{if(!b|H[c+80>>2]<0){break c}d=b;while(1){f=a+d|0;if(I[f-1|0]!=10){d=d-1|0;if(d){continue}break c}break}e=sa[H[c+36>>2]](c,a,d)|0;if(e>>>0>>0){break a}b=b-d|0;e=H[c+20>>2];break b}f=a;d=0}eb(e,f,b);H[c+20>>2]=H[c+20>>2]+b;e=b+d|0}return e}function Ne(a,b,c){var d=0,e=0,f=0,g=0;g=c&63;f=g;e=f&31;if(f>>>0>=32){f=-1>>>e|0}else{d=-1>>>e|0;f=d|(1<>>0>=32){d=f<>>32-e|d<>>0>=32){d=-1<>>32-d}a=c&a;b=b&d;d=e&31;if(e>>>0>=32){c=0;a=b>>>d|0}else{c=b>>>d|0;a=((1<>>d}a=a|g;ra=c|f;return a} -function ib(a,b,c){var d=0;if(!H[a+12>>2]){sa[b|0](c,H[a+36>>2]);return}d=Ga(8);a:{if(!d){break a}H[d+4>>2]=c;H[d>>2]=b;b=Ga(8);if(!b){Da(d);return}H[b>>2]=d;c=N(H[a+4>>2],100);H[a+40>>2]=c;while(1){if((c|0)>2]){continue}break}H[b+4>>2]=H[a+20>>2];H[a+20>>2]=b;H[a+24>>2]=H[a+24>>2]+1;b=H[a+28>>2];if(!b){break a}H[H[b>>2]+8>>2]=0;H[a+28>>2]=H[b+4>>2];H[a+32>>2]=H[a+32>>2]-1;Da(b)}}function Xc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;H[a+184>>2]=b;d=H[a+96>>2];a:{if(!d){break a}f=H[d+24>>2];if(!f){break a}e=H[a+12>>2];if(!e|!H[e+5584>>2]){break a}e=H[d+16>>2];if(!e){return 1}d=0;while(1){if(K[(H[H[a+12>>2]+5584>>2]+N(d,1080)|0)+4>>2]<=b>>>0){Ca(c,1,9177,0);return 0}H[(N(d,52)+f|0)+40>>2]=b;g=1;d=d+1|0;if((e|0)!=(d|0)){continue}break}}return g|0}function Mc(a){var b=0,c=0;b=H[a+76>>2];if(!((b|0)>=0&(!b|H[6867]!=(b&1073741823)))){a:{if(H[a+80>>2]==10){break a}b=H[a+20>>2];if((b|0)==H[a+16>>2]){break a}H[a+20>>2]=b+1;F[b|0]=10;return}Nc(a);return}b=a+76|0;c=H[b>>2];H[b>>2]=c?c:1073741823;b:{c:{if(H[a+80>>2]==10){break c}c=H[a+20>>2];if((c|0)==H[a+16>>2]){break c}H[a+20>>2]=c+1;F[c|0]=10;break b}Nc(a)}H[b>>2]=0}function La(a,b,c,d,e,f,g,h){var i=0,j=0;i=+O(e-a|0);j=i*1.402;if(P(j)<2147483647){e=~~j}else{e=-2147483648}e=e+c|0;H[f>>2]=(e|0)>=0?(b|0)>(e|0)?e:b:0;j=+O(d-a|0);i=j*.344+i*.714;if(P(i)<2147483647){a=~~i}else{a=-2147483648}a=c-a|0;H[g>>2]=(a|0)>=0?(a|0)<(b|0)?a:b:0;i=j*1.772;if(P(i)<2147483647){a=~~i}else{a=-2147483648}a=a+c|0;H[h>>2]=(a|0)>=0?(a|0)<(b|0)?a:b:0}function od(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=H[a+84>>2];f=H[e>>2];d=H[e+4>>2];h=H[a+28>>2];g=H[a+20>>2]-h|0;g=d>>>0>>0?d:g;if(g){eb(f,h,g);f=g+H[e>>2]|0;H[e>>2]=f;d=H[e+4>>2]-g|0;H[e+4>>2]=d}d=c>>>0>d>>>0?d:c;if(d){eb(f,b,d);f=d+H[e>>2]|0;H[e>>2]=f;H[e+4>>2]=H[e+4>>2]-d}F[f|0]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;return c|0}function Db(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;if(a){c=H[a+4>>2];if(c){Da(c);H[a+4>>2]=0}if(b){c=a;while(1){d=H[c+200>>2];if(d){e=0;f=H[c+196>>2];if(f){while(1){g=H[d+12>>2];if(g){Da(g);H[d+12>>2]=0;f=H[c+196>>2]}d=d+16|0;e=e+1|0;if(e>>>0>>0){continue}break}d=H[c+200>>2]}Da(d);H[c+200>>2]=0}c=c+240|0;h=h+1|0;if((h|0)!=(b|0)){continue}break}}Da(a)}}function Cd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=H[c+8>>2];d=e>>>0<=1?1:e;f=H[c+4>>2];g=f-H[c>>2]|0;while(1){h=d;d=d<<1;if(h-g>>>0>>0){continue}break}if((e|0)!=(h|0)){d=Ga(h);if(!d){return-1}e=H[c>>2];if(e){if(g){B(d,e,g)}Da(H[c>>2])}H[c+8>>2]=h;H[c>>2]=d;f=d+g|0;H[c+4>>2]=f}if(b){B(f,a,b)}H[c+4>>2]=H[c+4>>2]+b;return b|0}function ic(a){H[a+100>>2]=20832;H[a+96>>2]=20832;H[a+92>>2]=20832;H[a+88>>2]=20832;H[a+84>>2]=20832;H[a+80>>2]=20832;H[a+76>>2]=20832;H[a+72>>2]=20832;H[a+68>>2]=20832;H[a+64>>2]=20832;H[a+60>>2]=20832;H[a+56>>2]=20832;H[a+52>>2]=20832;H[a+48>>2]=20832;H[a+44>>2]=20832;H[a+40>>2]=20832;H[a+36>>2]=20832;H[a+32>>2]=20832;H[a+28>>2]=20832}function Ta(a,b){var c=0,d=0,e=0,f=0;if((b|0)<=0){return 0}c=H[a+12>>2];d=H[a+16>>2];while(1){e=b;a:{if(d){break a}c=c<<8&65280;H[a+12>>2]=c;d=(c|0)==65280?7:8;H[a+16>>2]=d;b=H[a+8>>2];if(b>>>0>=K[a+4>>2]){break a}H[a+8>>2]=b+1;c=I[b|0]|c;H[a+12>>2]=c}d=d-1|0;H[a+16>>2]=d;b=e-1|0;f=(c>>>d&1)<>>0>1){continue}break}return f}function Id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=oa-16|0;oa=f;e=H[a+24>>2];if((e|0)!=255){H[f>>2]=e;Ca(d,2,2678,f)}a:{b:{if(H[a+20>>2]==(c|0)){if(c){break b}e=1;break a}e=0;Ca(d,1,14510,0);break a}c=0;while(1){e=1;Ea(b,(H[a+72>>2]+N(c,12)|0)+8|0,1);b=b+1|0;c=c+1|0;if(c>>>0>2]){continue}break}}oa=f+16|0;return e|0}function Ea(a,b,c){var d=0,e=0;H[b>>2]=0;a:{if(!c){break a}d=c&3;b=b+c|0;if(c>>>0>=4){e=c&-4;c=0;while(1){F[b-1|0]=I[a|0];F[b-2|0]=I[a+1|0];F[b-3|0]=I[a+2|0];b=b-4|0;F[b|0]=I[a+3|0];a=a+4|0;c=c+4|0;if((e|0)!=(c|0)){continue}break}}if(!d){break a}c=0;while(1){b=b-1|0;F[b|0]=I[a|0];a=a+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}}function se(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=oa-16|0;oa=e;a:{if(!c){Ca(d,1,4106,0);a=0;break a}Ea(b,e+12|0,1);f=c-1|0;a=1;if(!f){break a}a=0;c=0;while(1){b=b+1|0;Ea(b,e+8|0,1);g=H[e+8>>2];c=g<<24>>31&(g&127|c)<<7;a=a+1|0;if((f|0)!=(a|0)){continue}break}a=1;if(!c){break a}Ca(d,1,4106,0);a=0}oa=e+16|0;return a|0}function nc(a,b,c,d){var e=0,f=0,g=O(0),h=0,i=O(0),j=0,k=O(0);if(d){while(1){e=f<<2;h=e+b|0;i=L[h>>2];j=a+e|0;g=L[j>>2];e=c+e|0;k=L[e>>2];L[j>>2]=O(k*O(1.4019999504089355))+g;L[h>>2]=O(g+O(i*O(-.3441300094127655)))+O(k*O(-.714139997959137));L[e>>2]=g+O(i*O(1.7719999551773071));f=f+1|0;if((f|0)!=(d|0)){continue}break}}}function Gb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;f=oa-240|0;oa=f;H[f>>2]=a;g=1;a:{if((b|0)<2){break a}d=a;while(1){d=d-8|0;h=b-2|0;e=d-H[(h<<2)+c>>2]|0;if((db(a,e)|0)>=0){if((db(a,d)|0)>=0){break a}}i=e;e=(db(e,d)|0)>=0;d=e?i:d;H[(g<<2)+f>>2]=d;g=g+1|0;b=e?b-1|0:h;if((b|0)>1){continue}break}}Ic(f,g);oa=f+240|0}function Ic(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;c=8;f=oa-256|0;oa=f;if((b|0)>=2){h=(b<<2)+a|0;H[h>>2]=f;while(1){e=c>>>0>=256?256:c;eb(H[h>>2],H[a>>2],e);d=0;while(1){g=(d<<2)+a|0;d=d+1|0;eb(H[g>>2],H[(d<<2)+a>>2],e);H[g>>2]=H[g>>2]+e;if((b|0)!=(d|0)){continue}break}c=c-e|0;if(c){continue}break}}oa=f+256|0}function cd(a){a=a|0;var b=0,c=0,d=0,e=0;b=H[a+24>>2];if(b){c=H[a+28>>2];e=(c>>>0)/52|0;if(c>>>0>=52){while(1){c=H[b>>2];if(c){Da(c-1|0);H[b>>2]=0}c=H[b+4>>2];if(c){Da(c);H[b+4>>2]=0}c=H[b+8>>2];if(c){Da(c);H[b+8>>2]=0}b=b+52|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}b=H[a+24>>2]}Da(b);H[a+24>>2]=0}}function dd(a){a=a|0;var b=0,c=0,d=0,e=0;b=H[a+24>>2];if(b){c=H[a+28>>2];e=(c>>>0)/68|0;if(c>>>0>=68){while(1){c=H[b>>2];if(c){Da(c);H[b>>2]=0}c=H[b+4>>2];if(c){Da(c);H[b+4>>2]=0}Da(H[b+60>>2]);H[b+60>>2]=0;b=b+68|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}b=H[a+24>>2]}Da(b);H[a+24>>2]=0}}function id(a,b){a=a|0;b=b|0;var c=0,d=0;c=H[a+32>>2];b=H[a+28>>2];d=b+8|0;if(c>>>0>=d>>>0){while(1){qb(a,H[a+24>>2]+(b<<2)|0,H[a+20>>2],8);c=H[a+32>>2];b=d;d=b+8|0;if(c>>>0>=d>>>0){continue}break}}if(b>>>0>>0){qb(a,H[a+24>>2]+(b<<2)|0,H[a+20>>2],c-b|0)}Da(H[a>>2]);Da(a)}function cb(a,b,c){var d=0,e=0,f=0;a:{if(!b){d=a;e=b;break a}while(1){d=Ke(a,b,10,0);e=ra;a=Ie(d,e,246)+a|0;c=c-1|0;F[c|0]=a|48;f=b>>>0>9;a=d;b=e;if(f){continue}break}}if(d|e){while(1){c=c-1|0;a=(d>>>0)/10|0;F[c|0]=N(a,246)+d|48;b=d>>>0>9;d=a;if(b){continue}break}}return c}function Nd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=oa-16|0;oa=e;a:{if(H[a+100>>2]){Ca(d,1,11302,0);a=0;break a}if((c|0)!=4){Ca(d,1,5991,0);a=0;break a}Ea(b,e+12|0,4);if(H[e+12>>2]!=218793738){Ca(d,1,5007,0);a=0;break a}H[a+100>>2]=H[a+100>>2]|1;a=1}oa=e+16|0;return a|0}function Ya(a,b,c){var d=0,e=0;a:{d=H[a>>2];e=H[a+4>>2];b:{if((d|0)!=(e|0)){e=H[a+8>>2];break b}d=e+10|0;H[a+4>>2]=d;e=Ia(H[a+8>>2],d<<2);if(!e){break a}H[a+8>>2]=e;d=H[a>>2]}H[(d<<2)+e>>2]=b;H[a>>2]=d+1;return 1}Da(H[a+8>>2]);H[a>>2]=0;H[a+4>>2]=0;Ca(c,1,6123,0);return 0}function Nc(a){var b=0,c=0,d=0;c=oa-16|0;oa=c;F[c+15|0]=10;b=H[a+16>>2];a:{if(!b){if(Kb(a)){break a}b=H[a+16>>2]}d=b;b=H[a+20>>2];if(!((d|0)==(b|0)|H[a+80>>2]==10)){H[a+20>>2]=b+1;F[b|0]=10;break a}if((sa[H[a+36>>2]](a,c+15|0,1)|0)!=1){break a}}oa=c+16|0}function Ec(a){var b=0,c=0,d=0,e=0,f=0;d=H[a>>2];b=F[d|0]-48|0;if(b>>>0>9){return 0}while(1){e=-1;if(c>>>0<=214748364){c=N(c,10);e=(c^2147483647)>>>0>>0?-1:c+b|0}b=d+1|0;H[a>>2]=b;f=F[d+1|0];c=e;d=b;b=f-48|0;if(b>>>0<10){continue}break}return c}function Bc(a,b){var c=0,d=0,e=0;x(+a);d=s(1)|0;e=s(0)|0;c=d>>>20&2047;if((c|0)!=2047){if(!c){if(a==0){c=0}else{a=Bc(a*0x10000000000000000,b);c=H[b>>2]+-64|0}H[b>>2]=c;return a}H[b>>2]=c-1022;u(0,e|0);u(1,d&-2146435073|1071644672);a=+w()}return a}function de(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=O(0),f=0,g=0;d=oa-16|0;oa=d;if(c){while(1){Yc(a,d+12|0);e=L[d+12>>2];if(O(P(e))>2]=f;b=b+4|0;a=a+4|0;g=g+1|0;if((g|0)!=(c|0)){continue}break}}oa=d+16|0}function Va(a){var b=0,c=0,d=0;if(a){b=H[a+24>>2];if(b){c=H[a+16>>2];if(c){b=0;while(1){d=H[(H[a+24>>2]+N(b,52)|0)+44>>2];if(d){Da(d);c=H[a+16>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+24>>2]}Da(b)}b=H[a+28>>2];if(b){Da(b)}Da(a)}}function ce(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=oa-16|0;oa=d;if(c){while(1){Vb(a,d+8|0);e=M[d+8>>3];if(P(e)<2147483647){f=~~e}else{f=-2147483648}H[b>>2]=f;b=b+4|0;a=a+8|0;g=g+1|0;if((g|0)!=(c|0)){continue}break}}oa=d+16|0}function Bd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=H[c+4>>2];e=H[c>>2]+H[c+8>>2]|0;if((d|0)==(e|0)){ra=-1;return-1}H[c+4>>2]=a+d;f=a;c=e-d|0;d=c;e=a>>>0>>0;a=c>>31;c=e&(a|0)>=(b|0)|(a|0)>(b|0);d=c?f:d;ra=c?b:a;return d|0}function Je(a,b,c,d){var e=0,f=0,g=0,h=0;f=b^d;g=f>>31;e=b>>31;a=a^e;h=a-e|0;e=(b^e)-((a>>>0>>0)+e|0)|0;a=d>>31;b=c^a;f=f>>31;a=Ke(h,e,b-a|0,(a^d)-((a>>>0>b>>>0)+a|0)|0)^f;b=a-f|0;ra=(g^ra)-((a>>>0>>0)+g|0)|0;return b}function Xa(a){var b=0,c=0,d=0,e=0;if(a){b=H[a+20>>2];c=H[a+16>>2];if(N(b,c)){while(1){e=H[H[a+24>>2]+(d<<2)>>2];if(e){Da(e);c=H[a+16>>2];b=H[a+20>>2]}d=d+1|0;if(d>>>0>>0){continue}break}}Da(H[a+24>>2]);Da(a)}}function oc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(d){while(1){e=f<<2;g=e+a|0;h=c+e|0;i=H[h>>2];j=b+e|0;k=H[j>>2];e=H[g>>2]-(i+k>>2)|0;H[g>>2]=e+i;H[j>>2]=e;H[h>>2]=e+k;f=f+1|0;if((f|0)!=(d|0)){continue}break}}}function fb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];e=sa[H[a+28>>2]](b,c,H[a>>2])|0;d=H[a+68>>2];if(!e){H[a+68>>2]=d|4;return 0}H[a+56>>2]=b;H[a+60>>2]=c;H[a+68>>2]=d&-5;return 1}function Oa(a,b,c,d,e){var f=0;f=oa-256|0;oa=f;if(!(e&73728|(c|0)<=(d|0))){d=c-d|0;c=d>>>0<256;Oc(f,b,c?d:256);if(!c){while(1){Ma(a,f,256);d=d-256|0;if(d>>>0>255){continue}break}}Ma(a,f,d)}oa=f+256|0}function Ie(a,b,c){var d=0,e=0,f=0,g=0,h=0;e=c>>>16|0;d=a>>>16|0;h=N(e,d);f=c&65535;a=a&65535;g=N(f,a);d=(g>>>16|0)+N(d,f)|0;a=(d&65535)+N(a,e)|0;ra=h+N(b,c)+(d>>>16)+(a>>>16)|0;return g&65535|a<<16}function Kb(a){var b=0;b=H[a+72>>2];H[a+72>>2]=b-1|b;b=H[a>>2];if(b&8){H[a>>2]=b|32;return-1}H[a+4>>2]=0;H[a+8>>2]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];return 0}function tc(a){var b=0,c=0;a:{if(I[a+12|0]==255){H[a+12>>2]=65280;H[a+16>>2]=7;b=H[a+8>>2];c=0;if(b>>>0>=K[a+4>>2]){break a}H[a+8>>2]=b+1;H[a+12>>2]=I[b|0]|65280}H[a+16>>2]=0;c=1}return c}function Dd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=H[c+4>>2];d=H[c>>2]+H[c+8>>2]|0;if((e|0)==(d|0)){return-1}d=d-e|0;b=b>>>0>d>>>0?d:b;if(b){B(a,e,b)}H[c+4>>2]=b+H[c+4>>2];return b|0}function he(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=oa-16|0;oa=d;if(c){while(1){Yc(a,d+12|0);L[b>>2]=L[d+12>>2];b=b+4|0;a=a+4|0;e=e+1|0;if((e|0)!=(c|0)){continue}break}}oa=d+16|0}function ge(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=oa-16|0;oa=d;if(c){while(1){Vb(a,d+8|0);L[b>>2]=M[d+8>>3];b=b+4|0;a=a+8|0;e=e+1|0;if((e|0)!=(c|0)){continue}break}}oa=d+16|0}function jd(a,b){a=a|0;b=b|0;b=H[a+28>>2];if(b>>>0>2]){while(1){lc(a,H[a+24>>2]+(N(H[a+20>>2],b)<<2)|0);b=b+1|0;if(b>>>0>2]){continue}break}}Da(H[a>>2]);Da(a)}function nd(a,b){a=a|0;b=+b;var c=0;ja(a|0,0)|0;a=(a|0)==2?27:(a|0)==1?26:14;a:{if(H[7170]>>>a-1&1){H[7202]=H[7202]|1<>2];if(c){sa[c|0](a)}}}function Tc(a,b){a=a|0;b=b|0;var c=0,d=0;c=H[a>>2];d=H[b>>2];a=H[a+4>>2];b=H[b+4>>2];return(c>>>0>d>>>0&(a|0)>=(b|0)|(a|0)>(b|0))-(c>>>0>>0&(a|0)<=(b|0)|(a|0)<(b|0))|0}function vd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=oa-16|0;oa=e;a=Hb(fa(H[a+60>>2],b|0,c|0,d&255,e+8|0)|0);oa=e+16|0;ra=a?-1:H[e+12>>2];return(a?-1:H[e+8>>2])|0}function yc(a,b,c,d){var e=0,f=0;e=oa-16|0;oa=e;if(c){while(1){Ea(a,e+12|0,d);L[b>>2]=K[e+12>>2];b=b+4|0;a=a+d|0;f=f+1|0;if((f|0)!=(c|0)){continue}break}}oa=e+16|0}function xc(a,b,c,d){var e=0,f=0;e=oa-16|0;oa=e;if(c){while(1){Ea(a,e+12|0,d);H[b>>2]=H[e+12>>2];b=b+4|0;a=a+d|0;f=f+1|0;if((f|0)!=(c|0)){continue}break}}oa=e+16|0}function Vb(a,b){F[b+7|0]=I[a|0];F[b+6|0]=I[a+1|0];F[b+5|0]=I[a+2|0];F[b+4|0]=I[a+3|0];F[b+3|0]=I[a+4|0];F[b+2|0]=I[a+5|0];F[b+1|0]=I[a+6|0];F[b|0]=I[a+7|0]}function Td(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(c){Ca(d,2,10224,0);if(!Nb(H[a>>2],b,c,d,e)){Ca(d,1,6210,0);return 0}a=Qc(a,c,d)}else{a=0}return a|0}function Sa(a){var b=0,c=0,d=0,e=0;b=H[a+12>>2];e=b;c=H[a+8>>2];if(!(b|c)){ra=0;return 0}d=H[a+56>>2];b=c-d|0;ra=e-(H[a+60>>2]+(c>>>0>>0)|0)|0;return b}function Xd(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Za(H[a>>2],b,c,d,e,f,g,h,i,j,k)|0}function wc(a,b){var c=0;c=oa-16|0;oa=c;if(a){if(b&3){a=28}else{a=kb(b,a);H[c+12>>2]=a;a=a?0:48}a=a?0:H[c+12>>2]}else{a=0}oa=c+16|0;return a}function ed(a){a=a|0;var b=0;if(a){b=H[a+116>>2];if(b){Da(b);H[a+116>>2]=0}b=H[a+120>>2];if(b){Da(b);H[a+120>>2]=0}Da(H[a+148>>2]);Da(a)}} -function vb(a,b){var c=0,d=0;a:{if(b>>>0<=31){d=H[a>>2];c=a+4|0;break a}b=b-32|0;c=a}c=H[c>>2];H[a>>2]=d<>2]=c<>>32-b}function xb(a,b){var c=0,d=0;c=H[a+4>>2];a:{if(b>>>0<=31){d=H[a>>2];break a}b=b-32|0;d=c;c=0}H[a+4>>2]=c>>>b;H[a>>2]=c<<32-b|d>>>b}function be(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(!c){return 0}if(!Pb(H[a>>2],b,c,d)){Ca(d,1,6210,0);return 0}return Qc(a,c,d)|0}function pe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(H[H[a+96>>2]+16>>2]<<2!=(c|0)){Ca(d,1,4464,0);a=0}else{a=1}return a|0}function vc(){var a=0,b=0;a=Fa(1,44);a:{if(a){H[a+16>>2]=0;b=Fa(1,8);H[a+36>>2]=b;if(b){break a}Da(a)}a=0}return a}function $b(a,b){a=a|0;b=b|0;if(!(!a|!b)){H[a+188>>2]=H[b+4>>2];H[a+184>>2]=H[b>>2];H[a+248>>2]=H[b+8248>>2]&2}}function tb(){var a=0,b=0;a=Fa(1,12);if(a){H[a+4>>2]=10;b=Fa(10,4);H[a+8>>2]=b;if(b){return a}Da(a)}return 0}function Ud(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Wb(H[a>>2],b,c,d,e,f,g)|0}function jb(a){var b=0;if(a){b=H[a+4>>2];if(b){sa[b|0](H[a>>2])}Da(H[a+32>>2]);H[a+32>>2]=0;Da(a)}}function _b(a,b){a=a|0;b=b|0;a:{if(!a){break a}H[a+208>>2]=b;if(!b){break a}F[a+92|0]=I[a+92|0]|8}}function Ad(a,b,c){a=a|0;b=b|0;c=c|0;b=H[c+8>>2];H[c+4>>2]=H[c>>2]+(a>>>0>b>>>0?b:a);return 1}function Wd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return gb(H[a>>2],b,c,d,e,f)|0}function te(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(c){a=1}else{Ca(d,1,4375,0);a=0}return a|0}function nb(a){H[a>>2]=0;H[a+4>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0}function ad(a,b,c){a=a|0;b=b|0;c=c|0;return!H[a+8>>2]&(H[a+216>>2]!=0&H[a+220>>2]!=0)}function Ua(a){if(H[a+12>>2]){H[a+40>>2]=0;while(1){if(H[a+24>>2]>0){continue}break}}}function Yc(a,b){F[b+3|0]=I[a|0];F[b+2|0]=I[a+1|0];F[b+1|0]=I[a+2|0];F[b|0]=I[a+3|0]}function lb(a){if(a){sa[H[(H[a+76>>2]?20:16)+a>>2]](H[a+48>>2]);H[a+48>>2]=0;Da(a)}}function ae(a,b){a=a|0;b=b|0;$b(H[a>>2],b);F[a+124|0]=0;H[a+128>>2]=H[b+8248>>2]&1}function Fa(a,b){if(!a|!b){a=0}else{b=N(a,b);a=kb(8,b);if(a){Oc(a,0,b)}}return a}function Ha(a,b,c){var d=0;d=oa-16|0;oa=d;H[d+12>>2]=c;Gc(a,b,c,0,0);oa=d+16|0}function Me(a){var b=0;while(1){if(a){a=a-1&a;b=b+1|0;continue}break}return b}function bb(a){var b=0;if(a){b=H[a+12>>2];if(b){Da(b);H[a+12>>2]=0}Da(a)}}function Vd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Xb(H[a>>2],b,c,d)|0}function Pa(a,b,c){a:{if(H[c+76>>2]<0){a=Jb(a,b,c);break a}a=Jb(a,b,c)}}function Jc(a,b){a=Hc(a-1|0);if(!a){a=Hc(b);a=a?a|32:0}return a}function ac(a){return H[a+12>>2]==H[a+4>>2]|H[a+8>>2]==H[a>>2]}function Od(a,b,c){a=a|0;b=b|0;c=c|0;return Xc(H[a>>2],b,c)|0}function sb(a){var b=0;if(a){b=H[a+8>>2];if(b){Da(b)}Da(a)}}function Hc(a){var b=0,c=0,d=0;return b=He(a),c=0,d=a,d?b:c}function rd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ra=0;return 0}function ab(a,b,c,d,e,f,g,h){return mc(a,b,c,d,e,f,g,h,0)}function zc(a,b,c,d){return sa[H[a+44>>2]](a,b,c,d)|0}function _a(a,b,c){H[((b<<2)+a|0)+28>>2]=(c<<5)+20832}function Mb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 1}function Sd(a,b,c){a=a|0;b=b|0;c=c|0;Tb(H[a>>2],b,c)}function ub(a,b,c){return sa[H[a+40>>2]](a,b,0,c)|0}function ne(a,b,c){a=a|0;b=b|0;c=c|0;ra=-1;return-1}function He(a){if(a){return 31-Q(a-1^a)|0}return 32}function Ra(a,b,c,d,e,f,g,h){mc(a,b,c,d,e,f,g,h,1)}function td(a){a=a|0;return Hb(Z(H[a+60>>2])|0)|0}function Hb(a){if(!a){return 0}H[6597]=a;return-1}function je(a,b,c){a=a|0;b=b|0;c=c|0;yc(a,b,c,2)}function ie(a,b,c){a=a|0;b=b|0;c=c|0;yc(a,b,c,4)}function fe(a,b,c){a=a|0;b=b|0;c=c|0;xc(a,b,c,2)}function ee(a,b,c){a=a|0;b=b|0;c=c|0;xc(a,b,c,4)}function Ma(a,b,c){if(!(I[a|0]&32)){Jb(b,c,a)}}function Le(a,b,c){Ge(a,0,b,c);ra=qa;return pa}function xe(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Zb(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function Uc(a,b,c){a=a|0;b=b|0;c=c|0;return-1}function Ke(a,b,c,d){a=Ge(a,b,c,d);return a}function Ga(a){if(!a){return 0}return yb(a)}function Oc(a,b,c){if(c){y(a,b<<24>>24,c)}}function $d(a,b){a=a|0;b=b|0;_b(H[a>>2],b)}function uc(a){return H[a+8>>2]-H[a>>2]|0}function ld(a){a=a|0;ha();ga(a+128|0);D()}function Rd(a){a=a|0;return Qb(H[a>>2])|0}function Pd(a){a=a|0;return Rb(H[a>>2])|0}function yb(a){a=a|0;return kb(8,a)|0}function bd(a,b){a=a|0;b=b|0;return 0}function xd(a,b){a=a|0;b=b|0;$(a|0)}function wd(a,b){a=a|0;b=b|0;Y(a|0)}function Fb(a){return H[a+28>>2]!=2}function eb(a,b,c){if(c){B(a,b,c)}}function db(a,b){return Tc(a,b)}function rb(a){return wc(a,32)}function Ja(a){return wc(a,16)}function zb(){return Fa(1,36)}function sd(a){a=a|0;return 0}function md(a){a=a|0;Ac();D()}function cc(a,b){a=a|0;b=b|0}function hb(a){if(a){Da(a)}}function Qa(a){H[a>>2]=0}function kd(){Ac();D()}function Ac(){ia();D()} +function _c(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,M=0,P=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=O(0),ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,sa=0,ta=0,ua=0,va=0,wa=0;$=na-96|0;na=$;E=H[a+8>>2];a:{b:{c:{if(!H[a>>2]){f=N(H[E+16>>2]-H[E+8>>2]|0,H[E+20>>2]-H[E+12>>2]|0)<<2;c=Ia(f);H[E+60>>2]=c;if(!c){Ba(H[a+32>>2],1,8023,0);d=a+28|0;break b}if(!f){break c}y(c,0,f);break c}c=H[E+60>>2];if(!c){break c}Ca(c);H[E+60>>2]=0}if(!H[H[a+28>>2]>>2]){break a}pa=H[a+16>>2];c=H[pa+28>>2]+N(H[pa+24>>2],152)|0;va=H[c-152>>2];wa=H[c-144>>2];qa=H[a+20>>2];sa=H[a+12>>2];ua=H[a+4>>2];d=a+28|0;d:{q=H[b+4>>2];e=0;e:{if((q|0)<=0){break e}l=H[b>>2];c=0;f:{while(1){f=l+N(c,12)|0;if(!H[f>>2]){break f}c=c+1|0;if((q|0)!=(c|0)){continue}break}e=0;break e}e=H[f+4>>2]}if(e){break d}e=Ea(1,156);if(!e){Ba(H[a+32>>2],1,6313,0);break b}H[e+140>>2]=0;c=0;l=H[b+4>>2];g:{if((l|0)==2147483647){break g}f=H[b>>2];if((l|0)>0){while(1){q=f+N(c,12)|0;if(!H[q>>2]){l=H[q+8>>2];if(l){ra[l|0](H[q+4>>2]);f=H[b>>2]}b=f+N(c,12)|0;H[b+8>>2]=15;H[b+4>>2]=e;c=1;break g}c=c+1|0;if((l|0)!=(c|0)){continue}break}}f=Ha(f,N(l,12)+12|0);c=0;if(!f){break g}H[b>>2]=f;c=H[b+4>>2];f=f+N(c,12)|0;H[f+8>>2]=15;H[f+4>>2]=e;H[f>>2]=0;H[b+4>>2]=c+1;c=1}if(c){break d}Ba(H[a+32>>2],1,8338,0);b=H[e+116>>2];if(b){Ca(b);H[e+116>>2]=0}b=H[e+120>>2];if(b){Ca(b);H[e+120>>2]=0}Ca(H[e+148>>2]);Ca(e);break b}H[e+144>>2]=H[a+24>>2];_=H[a+40>>2];ba=H[a+36>>2];T=H[a+32>>2];j=H[qa+808>>2];b=H[sa+16>>2];h:{Z=H[qa+16>>2];i:{if(Z&64){l=na-304|0;na=l;j:{if(j){if(ba){f=0;Ba(T,1,3219,0);break j}f=0;Ba(T,1,3219,0);break j}f=H[e+116>>2];c=H[E+20>>2]-H[E+12>>2]|0;b=H[E+16>>2]-H[E+8>>2]|0;k=N(c,b);k:{l:{if(k>>>0>K[e+132>>2]){Ca(f);g=k<<2;f=Ia(g);H[e+116>>2]=f;if(!f){f=0;break j}H[e+132>>2]=k;break l}if(!f){break k}g=k<<2}if(!g){break k}y(f,0,g)}f=H[e+120>>2];m:{if(K[e+136>>2]>2639){break m}Ca(f);f=Ia(10560);H[e+120>>2]=f;if(f){break m}f=0;break j}H[e+136>>2]=2640;y(f,0,10560);H[e+128>>2]=c;H[e+124>>2]=b;n=H[E+24>>2];if(!n){f=1;break j}q=H[E+28>>2];f=1;n:{o:{p:{q:{g=H[E+52>>2];r:{if(g){c=H[E+4>>2];j=0;f=0;if(g>>>0>=4){b=g&-4;while(1){k=c+(m<<3)|0;f=H[k+28>>2]+(H[k+20>>2]+(H[k+12>>2]+(H[k+4>>2]+f|0)|0)|0)|0;m=m+4|0;w=w+4|0;if((b|0)!=(w|0)){continue}break}}b=g&3;if(b){while(1){f=H[(c+(m<<3)|0)+4>>2]+f|0;m=m+1|0;j=j+1|0;if((b|0)!=(j|0)){continue}break}}if(!H[e+144>>2]&(g|0)==1){break o}if(K[e+152>>2]>=f>>>0){break r}w=Ha(H[e+148>>2],f);if(w){break q}f=0;break j}if(!H[e+144>>2]){break j}}w=H[e+148>>2];if(w){break p}f=0;break j}H[e+152>>2]=f;H[e+148>>2]=w}if(!H[E+52>>2]){f=0;break n}g=H[E+4>>2];f=0;m=0;while(1){k=m<<3;c=k+g|0;b=H[c+4>>2];if(b){B(f+w|0,H[c>>2],b)}g=H[E+4>>2];f=H[(k+g|0)+4>>2]+f|0;m=m+1|0;if(m>>>0>2]){continue}break}break n}w=H[H[E+4>>2]>>2]}m=0;g=0;c=H[E+40>>2];k=0;s:{if(!c){break s}b=H[E>>2];g=H[b+8>>2];k=0;if((c|0)==1){break s}k=H[b+32>>2]}c=n-q|0;g=g+k|0;t:{if(!g){j=0;break t}m=1;b=H[E>>2];s=H[b>>2];j=0;if((g|0)==1){m=0;break t}j=H[b+24>>2]}M=c+1|0;ia=H[e+116>>2];_=H[e+120>>2];V=H[E+12>>2];u=H[E+20>>2];ea=H[E+8>>2];R=H[E+16>>2];u:{v:{w:{x:{y:{z:{A:{B:{if(!(!m|j)){if(!ba){break B}Ba(T,2,10806,0);g=1;break A}if(g>>>0<4){break A}if(ba){H[l+112>>2]=g;Ba(T,1,9590,l+112|0);break u}H[l+96>>2]=g;Ba(T,1,9590,l+96|0);f=0;break j}Ba(T,2,10806,0);m=H[E+24>>2];if(m>>>0>30){break z}P=1;if(m>>>0>=M>>>0){break x}break v}m=H[E+24>>2];if(m>>>0<=30){break y}if(!ba){break z}H[l+32>>2]=H[E+24>>2];Ba(T,1,12302,l+32|0);break u}H[l>>2]=m;Ba(T,1,12302,l);f=0;break j}if(m>>>0>>0){break w}if(g>>>0<2){P=g;break x}if((m|0)!=(M|0)){P=g;break x}P=1;if(I[26384]){break x}if(!ba){F[26384]=1;H[l+64>>2]=g;Ba(T,2,10299,l- -64|0);break x}if(!I[26384]){F[26384]=1;H[l+80>>2]=g;Ba(T,2,10299,l+80|0)}}if(!(!(s>>>0<2|f>>>0>>0)&j+s>>>0<=f>>>0)){if(ba){f=0;Ba(T,1,9532,0);break j}f=0;Ba(T,1,9532,0);break j}S=s+w|0;b=I[S-1|0];f=b<<4|I[S-2|0]&15;if(!(!(f>>>0<2|(b|0)==255)&(f|0)<=(s|0))){if(ba){f=0;Ba(T,1,15305,0);break j}f=0;Ba(T,1,15305,0);break j}ta=H[E+28>>2];H[l+272>>2]=0;H[l+280>>2]=0;H[l+264>>2]=0;H[l+268>>2]=0;H[l+296>>2]=0;H[l+300>>2]=0;H[l+284>>2]=0;H[l+288>>2]=0;b=f-1|0;H[l+276>>2]=b;g=(s+w|0)-f|0;H[l+256>>2]=g;q=I[g|0];k=8;H[l+272>>2]=8;i=g+1|0;H[l+256>>2]=i;c=f-2|0;H[l+276>>2]=c;n=(b|0)==1?q|15:q;b=0;q=b;H[l+264>>2]=n;H[l+268>>2]=b;H[l+280>>2]=!b&(n|0)==255;h=g&3;C:{D:{if((h|0)==3){break D}v=0;if(!((n|0)!=255|(b|0)!=0|I[i|0]<=143)){break C}b=255;b=f>>>0>=3?I[i|0]:b;m=f-3|0;H[l+276>>2]=m;g=!q&(n|0)==255;k=g?15:16;H[l+272>>2]=k;W=i+(f>>>0>2)|0;H[l+256>>2]=W;b=(c|0)==1?b|15:b;c=0;H[l+280>>2]=!c&(b|0)==255;c=b;i=n;b=g?7:8;g=b&31;if((b&63)>>>0>=32){r=i<>>32-g|q<>2]=n;H[l+268>>2]=b;if((h|0)==2){break D}g=255;v=0;if(!((c|0)!=255|(x|0)!=0|I[W|0]<=143)){break C}g=f>>>0>=4?I[W|0]:g;i=f-4|0;H[l+276>>2]=i;t=W+(f>>>0>3)|0;H[l+256>>2]=t;b=(m|0)==1?g|15:g;g=0;W=g;H[l+280>>2]=!g&(b|0)==255;g=!x&(c|0)==255;k=(g?7:8)+k|0;H[l+272>>2]=k;c=b;m=n;b=g?7:8;g=b&31;if((b&63)>>>0>=32){U=m<>>32-g|q<>2]=n;H[l+268>>2]=b;if((h|0)==1){break D}v=0;if(!((c|0)!=255|(W|0)!=0|I[t|0]<=143)){break C}b=255;b=f>>>0>=5?I[t|0]:b;H[l+276>>2]=f-5;H[l+256>>2]=t+(f>>>0>4);g=0;b=(i|0)==1?b|15:b;H[l+280>>2]=1&(b|0)==255;c=!W&(c|0)==255;k=(c?7:8)+k|0;H[l+272>>2]=k;m=n;c=c?7:8;h=c&31;if((c&63)>>>0>=32){i=m<>>32-h|q<>2]=n;H[l+268>>2]=b}b=n;c=64-k|0;k=c&31;if((c&63)>>>0>=32){i=b<>>32-k|q<>2]=b;H[l+268>>2]=i;v=1}if(!v){if(ba){f=0;Ba(T,1,11470,0);break j}f=0;Ba(T,1,11470,0);break j}A=R-ea|0;m=0;g=f;x=f-2|0;H[l+244>>2]=x;b=s+w|0;f=b-3|0;H[l+224>>2]=f;c=I[b-2|0];b=c>>>0>143;H[l+248>>2]=b;q=0;n=c>>>4|0;H[l+232>>2]=n;H[l+236>>2]=0;h=(n&7)==7?3:4;H[l+240>>2]=h;c=(f&3)+1|0;r=c>>>0>>0?c:x;E:{F:{if(x){while(1){i=f;f=f-1|0;H[l+224>>2]=f;c=I[i|0];k=c>>>0>143;H[l+248>>2]=k;W=c&255;t=h&31;if((h&63)>>>0>=32){U=W<>>32-t;v=W<>2]=n;q=q|U;H[l+236>>2]=q;h=(b&1?(c&127)==127?7:8:8)+h|0;H[l+240>>2]=h;b=k;m=m+1|0;if((r|0)!=(m|0)){continue}break}v=x-r|0;H[l+244>>2]=v;if(h>>>0>32){break E}G:{if((v|0)>=4){m=H[i-4>>2];H[l+224>>2]=i-5;H[l+244>>2]=v-4;break G}if((v|0)<=0){m=0;break G}x=v&1;H:{if((r|0)==(g-3|0)){b=24;m=0;break H}t=v&2147483646;b=24;m=0;c=0;while(1){i=f-1|0;H[l+224>>2]=i;W=I[f|0];f=f-2|0;H[l+224>>2]=f;H[l+244>>2]=v-1;i=I[i|0];v=v-2|0;H[l+244>>2]=v;m=W<>2]=f-1;c=I[f|0];H[l+244>>2]=v-1;m=c<>2]=x-r}W=m&255;H[l+248>>2]=W>>>0>143;f=b?(m&2130706432)==2130706432?7:8:8;c=f+(m>>>0<=2415919103?8:(m&8323072)==8323072?7:8)|0;k=m>>>16&255;b=c+(k>>>0<=143?8:(m&32512)==32512?7:8)|0;i=m>>>8&255;H[l+240>>2]=b+((i>>>0<=143?8:(m&127)==127?7:8)+h|0);b=k<>>24|i<>>0>=32){i=b<>>32-c;b=b<>2]=b|n;H[l+236>>2]=i|q}$b(l+192|0,w,s-g|0,255);W=0;I:{if(P>>>0<2){break I}$b(l+160|0,S,j,0);W=0;if((P|0)==2){break I}n=0;q=0;g=0;H[l+152>>2]=1;H[l+144>>2]=0;H[l+136>>2]=0;H[l+140>>2]=0;k=j-1|0;H[l+148>>2]=k;b=(s+w|0)+j|0;c=b-1|0;H[l+128>>2]=c;m=c&3;J:{if((j|0)<=0){b=c;break J}b=b-2|0;H[l+128>>2]=b;n=I[c|0]}H[l+136>>2]=n;H[l+140>>2]=0;h=n>>>0>143;H[l+152>>2]=h;v=(n&127)==127?7:8;H[l+144>>2]=v;K:{if(!m){break K}s=j-2|0;H[l+148>>2]=s;L:{if((j|0)<2){f=b;break L}f=b-1|0;H[l+128>>2]=f;g=I[b|0]}h=g>>>0>143;H[l+152>>2]=h;b=v&31;if((v&63)>>>0>=32){i=g<>>32-b;b=g<>2]=q;b=i;H[l+140>>2]=b;v=(n>>>0<=143?8:(g&127)==127?7:8)+v|0;H[l+144>>2]=v;if((m|0)==1){b=f;n=q;q=i;j=k;k=s;break K}i=j-3|0;H[l+148>>2]=i;M:{if((j|0)<3){c=f;break M}c=f-1|0;H[l+128>>2]=c;p=I[f|0]}h=p>>>0>143;H[l+152>>2]=h;f=v&31;if((v&63)>>>0>=32){U=p<>>32-f;f=p<>2]=n;H[l+140>>2]=b;v=(g>>>0<=143?8:(p&127)==127?7:8)+v|0;H[l+144>>2]=v;if((m|0)==2){b=c;j=s;k=i;break K}k=j-4|0;H[l+148>>2]=k;g=0;N:{if((j|0)<4){b=c;break N}b=c-1|0;H[l+128>>2]=b;g=I[c|0]}h=g>>>0>143;H[l+152>>2]=h;c=v&31;if((v&63)>>>0>=32){r=g<>>32-c;c=g<>2]=n;H[l+140>>2]=c;v=(p>>>0<=143?8:(g&127)==127?7:8)+v|0;H[l+144>>2]=v;j=i}if(v>>>0<=32){O:{if((j|0)>=5){f=H[b-3>>2];H[l+148>>2]=j-5;H[l+128>>2]=b-4;break O}f=0;if((j|0)<2){break O}j=24;while(1){g=b-1|0;H[l+128>>2]=g;b=I[b|0];c=k-1|0;H[l+148>>2]=c;f=b<>>0>1;b=g;j=j-8|0;k=c;if(i){continue}break}}i=f&255;H[l+152>>2]=i>>>0>143;k=h?(f&2130706432)==2130706432?7:8:8;c=k+(f>>>0<=2415919103?8:(f&8323072)==8323072?7:8)|0;j=f>>>16&255;b=c+(j>>>0<=143?8:(f&32512)==32512?7:8)|0;g=f>>>8&255;H[l+144>>2]=b+((g>>>0<=143?8:(f&127)==127?7:8)+v|0);b=j<>>24|g<>>0>=32){i=b<>>32-c;b=b<>2]=b|n;H[l+140>>2]=i|q}W=1}ca=u-V|0;Y=M+1|0;F[_+2112|0]=0;p=_+2112|0;c=Za(l+256|0);if((A|0)>0){S=ta-1|0;b=_;g=p;k=ia;w=0;while(1){s=w;m=J[(o<<8|(mb(l+224|0)&127)<<1)+16656>>1];P:{if(o){break P}f=c-2|0;m=(f|0)==-1?m:0;if((c|0)>1){c=f;break P}c=Za(l+256|0)}q=H[l+236>>2];n=H[l+232>>2];f=H[l+240>>2];x=m>>>4|0;h=H[b>>2]|(x&3|m>>>2&48)<>2]=h;t=m&16;o=m>>>5&7|t>>>4;j=f;f=m&7;w=j-f|0;n=((1<>>f;q=q>>>f|0;j=n;f=0;if((A|0)>(s|2)){f=J[(o<<8|(j&127)<<1)+16656>>1];Q:{if(o){break Q}j=c-2|0;f=(j|0)==-1?f:0;if((c|0)>1){c=j;break Q}c=Za(l+256|0)}o=f>>>4&1|f>>>5&7;j=f&7;w=w-j|0;n=((1<>>j;q=q>>>j|0;j=n}H[b>>2]=h|(f<<2&768|f&48)<>>2&2|m>>>3&1;R:{if((v|0)!=3){break R}i=c-2|0;v=(i|0)==-1?4:3;if((c|0)>1){c=i;break R}c=Za(l+256|0)}S:{if(!v){H[l+120>>2]=1;H[l+124>>2]=1;j=0;break S}if(v>>>0<=2){i=I[(j&7)+20804|0];u=i>>>2&7;h=i&3;i=(((-1<>>h)+(i>>>5|0)|0)+1|0;j=(v|0)==1;H[l+124>>2]=j?1:i;H[l+120>>2]=j?i:1;j=h+u|0;break S}i=j;j=I[(j&7)+20804|0];V=j&3;i=i>>>V|0;if((v|0)==3){v=(j>>>5|0)+1|0;if((V|0)==3){H[l+124>>2]=i&1|2;j=j>>>2&7;H[l+120>>2]=v+((-1<>>1);j=j+4|0;break S}u=I[(i&7)+20804|0];h=u&3;i=i>>>h|0;r=j>>>2&7;H[l+120>>2]=v+(i&(-1<>>2&7;H[l+124>>2]=(((-1<>>r)+(u>>>5|0)|0)+1;j=j+(h+(r+V|0)|0)|0;break S}u=I[(i&7)+20804|0];h=u&3;i=i>>>h|0;r=j>>>2&7;H[l+120>>2]=((i&(-1<>>5|0)|0)+3;j=u>>>2&7;H[l+124>>2]=(((-1<>>r)+(u>>>5|0)|0)+3;j=j+(r+(h+V|0)|0)|0}T:{r=H[l+120>>2];if(r>>>0<=Y>>>0){u=H[l+124>>2];if(u>>>0<=Y>>>0){break T}}if(ba){f=0;Ba(T,1,15756,0);break j}f=0;Ba(T,1,15756,0);break j}H[l+240>>2]=w-j;h=j&31;if((j&63)>>>0>=32){i=0;q=q>>>h|0}else{i=q>>>h|0;q=((1<>>h}H[l+232>>2]=q;H[l+236>>2]=i;w=s+4|0;q=(w|0)<=(A|0)?255:255>>>(w-A<<1)|0;V=(ca|0)>1?q:q&85;if((f&240|x&15)&(V^-1)){if(ba){f=0;Ba(T,1,12194,0);break j}f=0;Ba(T,1,12194,0);break j}U:{V:{if(t){n=Ma(l+192|0);h=r+(m<<19>>31)|0;H[l+208>>2]=H[l+208>>2]-h;j=H[l+204>>2];q=H[l+200>>2];t=h&31;if((h&63)>>>0>=32){i=0;q=j>>>t|0}else{i=j>>>t|0;q=((1<>>t}H[l+200>>2]=q;H[l+204>>2]=i;v=(n&(-1<>>8&1)<>2]=v}W:{if(m&32){n=Ma(l+192|0);h=r+(m<<18>>31)|0;H[l+208>>2]=H[l+208>>2]-h;j=H[l+204>>2];q=H[l+200>>2];t=h&31;if((h&63)>>>0>=32){i=0;q=j>>>t|0}else{i=j>>>t|0;q=((1<>>t}H[l+200>>2]=q;H[l+204>>2]=i;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break W}if(!(V&2)){break W}H[(A<<2)+k>>2]=0}h=k+4|0;X:{Y:{if(m&64){n=Ma(l+192|0);t=r+(m<<17>>31)|0;H[l+208>>2]=H[l+208>>2]-t;j=H[l+204>>2];q=H[l+200>>2];x=t&31;if((t&63)>>>0>=32){i=0;q=j>>>x|0}else{i=j>>>x|0;q=((1<>>x}H[l+200>>2]=q;H[l+204>>2]=i;v=(n&(-1<>>10&1)<>2]=v}F[g+1|0]=0;Z:{if(m&128){n=Ma(l+192|0);t=r-(m>>>15|0)|0;H[l+208>>2]=H[l+208>>2]-t;j=H[l+204>>2];q=H[l+200>>2];x=t&31;if((t&63)>>>0>=32){i=0;q=j>>>x|0}else{i=j>>>x|0;q=((1<>>x}H[l+200>>2]=q;H[l+204>>2]=i;q=n&(-1<>>11&1)<>2]=q+2<>2]=0}m=k+8|0;_:{$:{if(f&16){n=Ma(l+192|0);h=u+(f<<19>>31)|0;H[l+208>>2]=H[l+208>>2]-h;j=H[l+204>>2];q=H[l+200>>2];t=h&31;if((h&63)>>>0>=32){i=0;q=j>>>t|0}else{i=j>>>t|0;q=((1<>>t}H[l+200>>2]=q;H[l+204>>2]=i;v=(n&(-1<>>8&1)<>2]=v}aa:{if(f&32){n=Ma(l+192|0);h=u+(f<<18>>31)|0;H[l+208>>2]=H[l+208>>2]-h;j=H[l+204>>2];q=H[l+200>>2];t=h&31;if((h&63)>>>0>=32){i=0;q=j>>>t|0}else{i=j>>>t|0;q=((1<>>t}H[l+200>>2]=q;H[l+204>>2]=i;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break aa}if(!(V&32)){break aa}H[m+(A<<2)>>2]=0}m=k+12|0;ba:{ca:{if(f&64){n=Ma(l+192|0);h=u+(f<<17>>31)|0;H[l+208>>2]=H[l+208>>2]-h;j=H[l+204>>2];q=H[l+200>>2];t=h&31;if((h&63)>>>0>=32){i=0;q=j>>>t|0}else{i=j>>>t|0;q=((1<>>t}H[l+200>>2]=q;H[l+204>>2]=i;v=(n&(-1<>>10&1)<>2]=v}g=g+2|0;F[g|0]=0;da:{if(f&128){n=Ma(l+192|0);h=u-(f>>>15|0)|0;H[l+208>>2]=H[l+208>>2]-h;j=H[l+204>>2];q=H[l+200>>2];t=h&31;if((h&63)>>>0>=32){i=0;q=j>>>t|0}else{i=j>>>t|0;q=((1<>>t}H[l+200>>2]=q;H[l+204>>2]=i;f=n&(-1<>>11&1)<>2]=f+2<>>0<128){break da}H[m+(A<<2)>>2]=0}aa=aa^16;b=(s&4)+b|0;k=k+16|0;if((w|0)<(A|0)){continue}break}}C=Z&8;ja=_+1584|0;ka=_+1056|0;ga=_+528|0;if((ca|0)>=3){la=N(A,12);ma=A<<3;fa=ta-1|0;b=ta-2|0;z=3<>>1&2147483644)+4|0;t=2;while(1){Z=t;v=I[p|0];F[p|0]=0;aa=aa&-17^2;ea:{if((A|0)<=0){t=t+2|0;break ea}o=Z&4?ga:_;t=Z+2|0;g=ia+(N(A,Z)<<2)|0;u=0;k=p;s=0;while(1){h=s;v=v&255;b=I[k+1|0]>>>5&4|(v>>>7|u);m=J[(b<<8|(mb(l+224|0)&127)<<1)+18704>>1];fa:{if(b){break fa}b=c-2|0;m=(b|0)==-1?m:0;if((c|0)>1){c=b;break fa}c=Za(l+256|0)}f=H[l+236>>2];q=H[l+232>>2];b=H[l+240>>2];j=H[o>>2]|(m>>>4&3|m>>>2&48)<>2]=j;S=m&64;V=m&128;u=S>>>5|V>>>6;n=b;b=m&7;x=n-b|0;n=((1<>>b;q=f>>>b|0;s=n;f=0;if((A|0)>(h|2)){b=I[k+2|0]>>>5&4|I[k+1|0]>>>7|u;f=J[(b<<8|(n&127)<<1)+18704>>1];ga:{if(b){break ga}b=c-2|0;f=(b|0)==-1?f:0;if((c|0)>1){c=b;break ga}c=Za(l+256|0)}b=f&7;x=x-b|0;u=(f>>>5|f>>>6)&2;n=((1<>>b;s=n;q=q>>>b|0}H[o>>2]=j|(f<<2&768|f&48)<>>2&2|m>>>3&1;switch(w|0){case 0:break ha;case 3:break ia;default:break ja}}b=I[(s&7)+20804|0];r=b>>>2&7;j=s;s=b&3;i=(((-1<>>s)+(b>>>5|0)|0)+1|0;b=(w|0)==1;j=b?1:i;b=b?i:1;w=s+r|0;break ha}U=I[(s&7)+20804|0];j=U&3;b=s>>>j|0;M=I[(b&7)+20804|0];r=M&3;i=M>>>2&7;s=U>>>2&7;w=i+(s+(j+r|0)|0)|0;j=b>>>r|0;b=((j&(-1<>>5|0)|0)+1|0;j=(((-1<>>s)+(M>>>5|0)|0)+1|0}H[l+240>>2]=x-w;i=w&31;if((w&63)>>>0>=32){r=0;q=q>>>i|0}else{r=q>>>i|0;q=((1<>>i}H[l+232>>2]=q;H[l+236>>2]=r;s=m&240;if(s-1&s){n=b;q=v&127;b=I[k+1|0]&127;q=b>>>0>>0?q:b;b=q-2|0;b=n+(b>>>0<=q>>>0?b:0)|0}i=f&240;if(i-1&i){n=I[k+1|0]&127;q=I[k+2|0]&127;q=n>>>0>q>>>0?n:q;j=(q>>>0>2?q-2|0:0)+j|0}if(!(b>>>0<=Y>>>0&j>>>0<=Y>>>0)){if(ba){f=0;Ba(T,1,15856,0);break j}f=0;Ba(T,1,15856,0);break j}v=I[k+2|0];F[k+1|0]=0;F[k+2|0]=0;n=i|s>>>4;s=h+4|0;q=(s|0)<=(A|0)?255:255>>>(s-A<<1)|0;M=(t|0)>(ca|0)?q&85:q;if(n&(M^-1)){if(ba){f=0;Ba(T,1,12194,0);break j}f=0;Ba(T,1,12194,0);break j}ka:{la:{if(m&16){n=Ma(l+192|0);x=(m<<19>>31)+b|0;H[l+208>>2]=H[l+208>>2]-x;i=H[l+204>>2];q=H[l+200>>2];w=x&31;if((x&63)>>>0>=32){r=0;q=i>>>w|0}else{r=i>>>w|0;q=((1<>>w}H[l+200>>2]=q;H[l+204>>2]=r;x=(n&(-1<>>8&1)<>2]=x}ma:{if(m&32){n=Ma(l+192|0);x=(m<<18>>31)+b|0;H[l+208>>2]=H[l+208>>2]-x;i=H[l+204>>2];q=H[l+200>>2];w=x&31;if((x&63)>>>0>=32){r=0;q=i>>>w|0}else{r=i>>>w|0;q=((1<>>w}H[l+200>>2]=q;H[l+204>>2]=r;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break ma}if(!(M&2)){break ma}H[(A<<2)+g>>2]=0}x=g+4|0;na:{oa:{if(S){n=Ma(l+192|0);w=(m<<17>>31)+b|0;H[l+208>>2]=H[l+208>>2]-w;i=H[l+204>>2];q=H[l+200>>2];S=w&31;if((w&63)>>>0>=32){r=0;q=i>>>S|0}else{r=i>>>S|0;q=((1<>>S}H[l+200>>2]=q;H[l+204>>2]=r;X=(n&(-1<>>10&1)<>2]=X}pa:{if(V){q=Ma(l+192|0);i=b-(m>>>15|0)|0;H[l+208>>2]=H[l+208>>2]-i;n=H[l+204>>2];b=H[l+200>>2];w=i&31;if((i&63)>>>0>=32){r=0;b=n>>>w|0}else{r=n>>>w|0;b=((1<>>w}H[l+200>>2]=b;H[l+204>>2]=r;b=q&(-1<>>11&1)<>2]=b+2<>2]=0}i=g+8|0;qa:{ra:{if(f&16){q=Ma(l+192|0);m=(f<<19>>31)+j|0;H[l+208>>2]=H[l+208>>2]-m;n=H[l+204>>2];b=H[l+200>>2];x=m&31;if((m&63)>>>0>=32){r=0;b=n>>>x|0}else{r=n>>>x|0;b=((1<>>x}H[l+200>>2]=b;H[l+204>>2]=r;b=(q&(-1<>>8&1)<>2]=b}sa:{if(f&32){q=Ma(l+192|0);m=(f<<18>>31)+j|0;H[l+208>>2]=H[l+208>>2]-m;n=H[l+204>>2];b=H[l+200>>2];x=m&31;if((m&63)>>>0>=32){r=0;b=n>>>x|0}else{r=n>>>x|0;b=((1<>>x}H[l+200>>2]=b;H[l+204>>2]=r;b=q&(-1<>>9&1)<>2]=b+2<>>0>>0?q:b)|128;break sa}if(!(M&32)){break sa}H[i+(A<<2)>>2]=0}i=g+12|0;ta:{ua:{if(f&64){q=Ma(l+192|0);m=(f<<17>>31)+j|0;H[l+208>>2]=H[l+208>>2]-m;n=H[l+204>>2];b=H[l+200>>2];x=m&31;if((m&63)>>>0>=32){r=0;b=n>>>x|0}else{r=n>>>x|0;b=((1<>>x}H[l+200>>2]=b;H[l+204>>2]=r;b=(q&(-1<>>10&1)<>2]=b}k=k+2|0;va:{if(f&128){q=Ma(l+192|0);j=j-(f>>>15|0)|0;H[l+208>>2]=H[l+208>>2]-j;n=H[l+204>>2];b=H[l+200>>2];m=j&31;if((j&63)>>>0>=32){r=0;b=n>>>m|0}else{r=n>>>m|0;b=((1<>>m}H[l+200>>2]=b;H[l+204>>2]=r;b=q&(-1<>>11&1)<>2]=b+2<>>0<128){break va}H[i+(A<<2)>>2]=0}aa=aa^16;o=(h&4)+o|0;g=g+16|0;if((s|0)<(A|0)){continue}break}}wa:{if(!(Z&2)|P>>>0<2){break wa}o=t&4;xa:{ya:{za:{Aa:{Ba:{if(W){x=o?_:ga;w=0;if((A|0)<=0){break Ba}q=ia+(N(A,Z-2|0)<<2)|0;while(1){f=mb(l+128|0);m=0;g=H[x>>2];if(g){m=q+(w<<2)|0;j=0;k=15;while(1){Ca:{if(!(g&k)){break Ca}n=k&286331153;if(n&g){H[m>>2]=D|H[m>>2]^((f^-1)&1)<>>1|0}if(g&n<<1){b=(A<<2)+m|0;H[b>>2]=D|H[b>>2]^((f^-1)&1)<>>1|0}if(g&n<<2){b=m+ma|0;H[b>>2]=D|H[b>>2]^((f^-1)&1)<>>1|0}if(!(g&n<<3)){break Ca}b=m+la|0;H[b>>2]=D|H[b>>2]^((f^-1)&1)<>>1|0}m=m+4|0;k=k<<4;j=j+1|0;if((j|0)!=8){continue}break}m=ze(g)}x=x+4|0;H[l+144>>2]=H[l+144>>2]-m;f=H[l+140>>2];b=H[l+136>>2];k=m&31;if((m&63)>>>0>=32){r=0;b=f>>>k|0}else{r=f>>>k|0;b=((1<>>k}H[l+136>>2]=b;H[l+140>>2]=r;w=w+8|0;if((A|0)>(w|0)){continue}break}}b=0;f=0;da=o?ka:ja;m=da;x=o?_:ga;k=x;if((A|0)>0){break za}b=!o;break Aa}da=o?ka:ja;b=!o}if(Z>>>0<=5){break wa}h=b?_:ga;if((A|0)<=0){break xa}b=b?ka:ja;break ya}while(1){q=f>>>28|0;f=H[k>>2];q=f|(q|f<<4|f>>>4);H[m>>2]=q;q=q|H[k+4>>2]<<28;H[m>>2]=(q>>>1&2004318071|q<<1&-286331154|q)&(f^-1);m=m+4|0;k=k+4|0;b=b+8|0;if((A|0)>(b|0)){continue}break}if(Z>>>0<6){break wa}h=o?ga:_;b=o?ja:ka}j=0;o=0;m=x;v=b;f=b;k=h;while(1){q=m+4|0;b=H[f>>2];n=H[m>>2];if(!C){b=b|(n|(n<<4|o>>>28|n>>>4|H[q>>2]<<28))<<3&-2004318072}H[f>>2]=(H[k>>2]^-1)&b;k=k+4|0;f=f+4|0;o=n;m=q;j=j+8|0;if((A|0)>(j|0)){continue}break}if((A|0)<=0){break xa}V=ia+(N(A,Z-6|0)<<2)|0;X=0;o=h;while(1){g=0;k=H[v>>2];if(k){Z=A-X|0;i=(X<<2)+V|0;f=0;u=0;while(1){q=f;f=Ma(l+160|0);b=u+4|0;S=(A|0)>(b+X|0)?b:Z;Da:{if((S|0)<=(u|0)){m=0;break Da}U=H[o>>2]^-1;r=u<<2;w=i+r|0;m=0;j=u;s=15<>>1|0}n=M<<1;if(n&k){if(f&1){g=g|n;k=U&116<<(j<<2)|k}m=m+1|0;f=f>>>1|0}n=M<<2;if(n&k){if(f&1){g=g|n;k=U&232<<(j<<2)|k}m=m+1|0;f=f>>>1|0}n=M<<3;if(!(n&k)){break Ea}if(f&1){g=g|n;k=U&192<<(j<<2)|k}m=m+1|0;f=f>>>1|0}b=b<<4;j=j+1|0;if((S|0)>(j|0)){continue}break}if(!(g>>>r&65535)){break Da}while(1){Fa:{if(!(g&s)){break Fa}n=s&286331153;if(n&g){H[w>>2]=z|(H[w>>2]|f<<31);m=m+1|0;f=f>>>1|0}if(n<<1&g){b=(A<<2)+w|0;H[b>>2]=z|(H[b>>2]|f<<31);m=m+1|0;f=f>>>1|0}if(n<<2&g){b=w+ma|0;H[b>>2]=z|(H[b>>2]|f<<31);m=m+1|0;f=f>>>1|0}if(!(n<<3&g)){break Fa}b=w+la|0;H[b>>2]=z|(H[b>>2]|f<<31);m=m+1|0;f=f>>>1|0}s=s<<4;w=w+4|0;u=u+1|0;if((S|0)>(u|0)){continue}break}}H[l+176>>2]=H[l+176>>2]-m;f=H[l+172>>2];b=H[l+168>>2];n=m&31;if((m&63)>>>0>=32){r=0;b=f>>>n|0}else{r=f>>>n|0;b=((1<>>n}H[l+168>>2]=b;H[l+172>>2]=r;f=1;u=4;if(!(q&1)){continue}break}H[v+4>>2]=H[v+4>>2]|(g>>>27&14|g>>>29|g>>>28)&(H[o+4>>2]^-1)}k=H[o>>2]|g;q=k>>>3&286331153;f=q>>>4|q<<4|q;if(X){b=da-4|0;H[b>>2]=H[b>>2]|(H[x-4>>2]^-1)&q<<28}H[da>>2]=H[da>>2]|f&(H[x>>2]^-1);H[da+4>>2]=H[da+4>>2]|(H[x+4>>2]^-1)&k>>>31;v=v+4|0;o=o+4|0;da=da+4|0;x=x+4|0;X=X+8|0;if((A|0)>(X|0)){continue}break}}if(!oa){break wa}y(h,0,oa)}if((t|0)<(ca|0)){continue}break}}Ga:{if(P>>>0<2){break Ga}g=(ca&3)-1|0;Ha:{if(W&g>>>0<2){if((A|0)<=0){break Ha}s=1<>2];if(p){m=n+(u<<2)|0;k=15;j=0;while(1){Ia:{if(!(k&p)){break Ia}o=k&286331153;if(o&p){H[m>>2]=s|H[m>>2]^((f^-1)&1)<>>1|0}if(p&o<<1){b=(A<<2)+m|0;H[b>>2]=s|H[b>>2]^((f^-1)&1)<>>1|0}if(p&o<<2){b=c+m|0;H[b>>2]=s|H[b>>2]^((f^-1)&1)<>>1|0}if(!(p&o<<3)){break Ia}b=m+q|0;H[b>>2]=s|H[b>>2]^((f^-1)&1)<>>1|0}m=m+4|0;k=k<<4;j=j+1|0;if((j|0)!=8){continue}break}m=ze(p)}U=U+4|0;H[l+144>>2]=H[l+144>>2]-m;f=H[l+140>>2];b=H[l+136>>2];k=m&31;if((m&63)>>>0>=32){r=0;b=f>>>k|0}else{r=f>>>k|0;b=((1<>>k}H[l+136>>2]=b;H[l+140>>2]=r;u=u+8|0;if((A|0)>(u|0)){continue}break}}if((A|0)<=0|g>>>0>1){break Ha}b=ca&4;m=b?ga:_;k=b?ja:ka;b=0;f=0;while(1){c=f>>>28|0;f=H[m>>2];c=f|(c|f<<4|f>>>4);H[k>>2]=c;c=c|H[m+4>>2]<<28;H[k>>2]=(c>>>1&2004318071|c<<1&-286331154|c)&(f^-1);k=k+4|0;m=m+4|0;b=b+8|0;if((A|0)>(b|0)){continue}break}}o=(ca|0)>6?(ca-(ca+1&3)|0)-3|0:0;if((ca|0)<=(o|0)){break Ga}t=N(A,12);W=A<<3;M=3<>>0>=3){aa=-1;if((c|0)<5){break La}if(V){break Ja}b=o&4;m=b?ga:_;f=b?ja:ka;k=0;if(!C){k=b?_:ga;b=0;g=0;while(1){c=g>>>28|0;aa=-1;g=H[k>>2];H[f>>2]=(H[f>>2]|(g|(c|g<<4|g>>>4|H[k+4>>2]<<28))<<3&-2004318072)&(H[m>>2]^-1);m=m+4|0;f=f+4|0;k=k+4|0;b=b+8|0;if((A|0)>(b|0)){continue}break}break Ka}while(1){aa=-1;H[f>>2]=H[f>>2]&(H[m>>2]^-1);m=m+4|0;f=f+4|0;k=k+8|0;if((A|0)>(k|0)){continue}break}break Ka}aa=H[(b<<2)+20812>>2]}if(V){break Ja}}b=o&4;v=b?ga:_;c=b?ja:ka;h=b?_:ga;X=b?ka:ja;Z=ia+(N(o,A)<<2)|0;P=0;while(1){g=0;k=H[c>>2]&aa;if(k){p=A-P|0;s=Z+(P<<2)|0;f=0;i=0;while(1){q=f;f=Ma(l+160|0);b=i+4|0;u=(A|0)>(b+P|0)?b:p;Ma:{if((u|0)<=(i|0)){m=0;break Ma}x=i<<2;w=x+s|0;S=(H[v>>2]^-1)&aa;m=0;j=i;U=15<>>1|0}n=r<<1;if(n&k){if(f&1){g=g|n;k=S&116<<(j<<2)|k}m=m+1|0;f=f>>>1|0}n=r<<2;if(n&k){if(f&1){g=g|n;k=S&232<<(j<<2)|k}m=m+1|0;f=f>>>1|0}n=r<<3;if(!(n&k)){break Na}if(f&1){g=g|n;k=S&192<<(j<<2)|k}m=m+1|0;f=f>>>1|0}b=b<<4;j=j+1|0;if((u|0)>(j|0)){continue}break}if(!(g>>>x&65535)){break Ma}while(1){Oa:{if(!(g&U)){break Oa}n=U&286331153;if(n&g){H[w>>2]=M|(H[w>>2]|f<<31);m=m+1|0;f=f>>>1|0}if(n<<1&g){b=(A<<2)+w|0;H[b>>2]=M|(H[b>>2]|f<<31);m=m+1|0;f=f>>>1|0}if(n<<2&g){b=w+W|0;H[b>>2]=M|(H[b>>2]|f<<31);m=m+1|0;f=f>>>1|0}if(!(n<<3&g)){break Oa}b=t+w|0;H[b>>2]=M|(H[b>>2]|f<<31);m=m+1|0;f=f>>>1|0}U=U<<4;w=w+4|0;i=i+1|0;if((u|0)>(i|0)){continue}break}}H[l+176>>2]=H[l+176>>2]-m;f=H[l+172>>2];b=H[l+168>>2];n=m&31;if((m&63)>>>0>=32){r=0;b=f>>>n|0}else{r=f>>>n|0;b=((1<>>n}H[l+168>>2]=b;H[l+172>>2]=r;f=1;i=4;if(!(q&1)){continue}break}H[c+4>>2]=H[c+4>>2]|(g>>>27&14|g>>>29|g>>>28)&(H[v+4>>2]^-1)}k=H[v>>2]|g;q=k>>>3&286331153;f=q>>>4|q<<4|q;if(P){b=X-4|0;H[b>>2]=H[b>>2]|(H[h-4>>2]^-1)&q<<28}H[X>>2]=H[X>>2]|f&(H[h>>2]^-1);H[X+4>>2]=H[X+4>>2]|(H[h+4>>2]^-1)&k>>>31;c=c+4|0;v=v+4|0;X=X+4|0;h=h+4|0;P=P+8|0;if((A|0)>(P|0)){continue}break}}o=o+4|0;if((ca|0)>(o|0)){continue}break}}f=1;if((ca|0)<=0|(A|0)<=0){break j}q=A&2147483644;n=A&3;k=ea-R>>>0>4294967292;o=0;while(1){f=ia+(N(o,A)<<2)|0;m=0;if(!k){while(1){c=H[f>>2];b=c&2147483647;H[f>>2]=(c|0)<0?0-b|0:b;c=H[f+4>>2];b=c&2147483647;H[f+4>>2]=(c|0)<0?0-b|0:b;c=H[f+8>>2];b=c&2147483647;H[f+8>>2]=(c|0)<0?0-b|0:b;c=H[f+12>>2];b=c&2147483647;H[f+12>>2]=(c|0)<0?0-b|0:b;f=f+16|0;m=m+4|0;if((q|0)!=(m|0)){continue}break}}m=0;if(n){while(1){c=H[f>>2];b=c&2147483647;H[f>>2]=(c|0)<0?0-b|0:b;f=f+4|0;m=m+1|0;if((n|0)!=(m|0)){continue}break}}f=1;o=o+1|0;if((ca|0)!=(o|0)){continue}break}break j}if(!ba){break v}H[l+52>>2]=H[E+24>>2];H[l+48>>2]=M;Ba(T,1,9686,l+48|0);break u}H[l+20>>2]=m;H[l+16>>2]=M;Ba(T,1,9686,l+16|0);f=0;break j}f=0}na=l+304|0;if(f){break i}break b}H[e+108>>2]=(b<<9)+22336;c=0;b=H[e+116>>2];Pa:{Qa:{s=H[E+16>>2]-H[E+8>>2]|0;o=H[E+20>>2]-H[E+12>>2]|0;f=N(s,o);Ra:{Sa:{Ta:{if(f>>>0>K[e+132>>2]){Ca(b);b=Ia(f<<2);H[e+116>>2]=b;if(!b){break Ra}H[e+132>>2]=f;break Ta}if(!b){break Sa}}f=f<<2;if(!f){break Sa}y(b,0,f)}b=H[e+120>>2];m=s+2|0;n=o+3>>>2|0;f=N(m,n+2|0);if(f>>>0<=K[e+136>>2]){w=f<<2;break Qa}Ca(b);w=f<<2;b=Ia(w);H[e+120>>2]=b;if(b){break Qa}}b=0;break Pa}H[e+136>>2]=f;if(w){y(b,0,w)}Ua:{if(!m){break Ua}q=H[e+120>>2];b=q;l=s+1|0;if(l>>>0>=7){f=m&-8;while(1){H[b+24>>2]=1226833920;H[b+28>>2]=1226833920;H[b+16>>2]=1226833920;H[b+20>>2]=1226833920;H[b+8>>2]=1226833920;H[b+12>>2]=1226833920;H[b>>2]=1226833920;H[b+4>>2]=1226833920;b=b+32|0;c=c+8|0;if((f|0)!=(c|0)){continue}break}}f=m&7;if(f){c=0;while(1){H[b>>2]=1226833920;b=b+4|0;c=c+1|0;if((f|0)!=(c|0)){continue}break}}b=q+(N(m,n+1|0)<<2)|0;if(l>>>0>=7){f=m&-8;c=0;while(1){H[b+24>>2]=1226833920;H[b+28>>2]=1226833920;H[b+16>>2]=1226833920;H[b+20>>2]=1226833920;H[b+8>>2]=1226833920;H[b+12>>2]=1226833920;H[b>>2]=1226833920;H[b+4>>2]=1226833920;b=b+32|0;c=c+8|0;if((f|0)!=(c|0)){continue}break}}f=m&7;if(f){c=0;while(1){H[b>>2]=1226833920;b=b+4|0;c=c+1|0;if((f|0)!=(c|0)){continue}break}}b=o&3;if(!b){break Ua}f=(b|0)==1?1224736768:(b|0)==2?1207959552:1073741824;b=q+(N(m,n)<<2)|0;if(l>>>0>=7){c=m&-8;w=0;while(1){H[b+28>>2]=f;H[b+24>>2]=f;H[b+20>>2]=f;H[b+16>>2]=f;H[b+12>>2]=f;H[b+8>>2]=f;H[b+4>>2]=f;H[b>>2]=f;b=b+32|0;w=w+8|0;if((c|0)!=(w|0)){continue}break}}c=m&7;if(!c){break Ua}w=0;while(1){H[b>>2]=f;b=b+4|0;w=w+1|0;if((c|0)!=(w|0)){continue}break}}H[e+128>>2]=o;H[e+124>>2]=s;b=1}if(!b){break b}w=j+H[E+28>>2]|0;if((w|0)>=31){if(!ba){break h}H[$+16>>2]=w;Ba(T,2,8716,$+16|0);break b}_b(e);Ya(e,18,46);Ya(e,17,3);Ya(e,0,4);if(H[E+64>>2]){break i}q=H[E+52>>2];Va:{if(!(q>>>0<=1&(!H[e+144>>2]|(q|0)!=1))){b=H[E+4>>2];f=0;if(q-1>>>0>=3){c=q&-4;while(1){l=(i<<3)+b|0;f=H[l+28>>2]+(H[l+20>>2]+(H[l+12>>2]+(H[l+4>>2]+f|0)|0)|0)|0;i=i+4|0;g=g+4|0;if((c|0)!=(g|0)){continue}break}}c=q&3;if(c){while(1){f=H[((i<<3)+b|0)+4>>2]+f|0;i=i+1|0;k=k+1|0;if((c|0)!=(k|0)){continue}break}}la=H[e+148>>2];c=f+2|0;if(c>>>0>K[e+152>>2]){b=Ha(la,c);if(!b){break b}H[e+148>>2]=b;b=b+f|0;F[b|0]=0;F[b+1|0]=0;H[e+152>>2]=c;la=H[e+148>>2];if(!H[E+52>>2]){break Va}b=H[E+4>>2]}f=0;i=0;while(1){l=i<<3;c=l+b|0;b=H[c+4>>2];if(b){B(f+la|0,H[c>>2],b)}b=H[E+4>>2];f=H[(l+b|0)+4>>2]+f|0;i=i+1|0;if(i>>>0>2]){continue}break}break Va}if((q|0)!=1){break i}la=H[H[E+4>>2]>>2]}b=H[E+60>>2];if(b){x=H[e+116>>2];H[e+116>>2]=b}if(H[E+44>>2]){aa=Z&2;M=Z&8;ea=e+28|0;ia=!(Z&1);ma=2;while(1){l=S+la|0;oa=H[E>>2]+N(V,24)|0;c=H[oa>>2];U=ia|((H[E+28>>2]-4|0)<(w|0)|ma>>>0>1);Wa:{if(!U){H[e+20>>2]=l;b=c+l|0;H[e+24>>2]=b;G[e+112>>1]=I[b|0]|I[b+1|0]<<8;F[b|0]=255;F[H[e+24>>2]+1|0]=255;H[e+8>>2]=0;H[e>>2]=0;H[e+16>>2]=l;break Wa}H[e+20>>2]=l;b=c+l|0;H[e+24>>2]=b;G[e+112>>1]=I[b|0]|I[b+1|0]<<8;F[b|0]=255;F[H[e+24>>2]+1|0]=255;H[e+104>>2]=e+28;H[e+16>>2]=l;H[e+12>>2]=0;b=c?I[l|0]<<16:16711680;H[e>>2]=b;k=1;c=l+1|0;f=I[l+1|0];Xa:{if(I[l|0]==255){if(f>>>0>=144){H[e+12>>2]=1;b=b|65280;break Xa}H[e+16>>2]=c;k=0;b=b+(f<<9)|0;break Xa}H[e+16>>2]=c;b=b|f<<8}H[e+8>>2]=k;H[e+4>>2]=32768;H[e>>2]=b<<7}W=H[oa>>2];Ya:{if(!H[oa+8>>2]|(w|0)<=0){break Ya}da=0;P=U&(aa|0)!=0;while(1){Za:{_a:{$a:{switch(ma-1|0){default:if(!U){b=1<>>1|b;s=H[e+124>>2];n=s<<2;b=(n+H[e+120>>2]|0)+12|0;f=H[e+116>>2];m=0;c=H[e+128>>2];if(c>>>0>=4){if(!s){break Za}d=N(s,12);q=s<<3;g=0-p|0;while(1){c=0;while(1){l=b;b=H[b>>2];ab:{if(!b){break ab}if(!(!(b&495)|b&2097168)){b=H[e>>2];k=H[e+8>>2];bb:{if(k){break bb}k=(b|0)==255;j=H[e+16>>2];b=I[j|0];cb:{if(!k){H[e>>2]=b;H[e+16>>2]=j+1;break cb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=j+1;k=7;break bb}b=255;H[e>>2]=255}k=8}k=k-1|0;H[e+8>>2]=k;db:{if(!(b>>>k&1)){break db}eb:{if(k){break eb}k=(b|0)==255;j=H[e+16>>2];b=I[j|0];fb:{if(!k){H[e>>2]=b;H[e+16>>2]=j+1;break fb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=j+1;k=7;break eb}b=255;H[e>>2]=255}k=8}k=k-1|0;H[e+8>>2]=k;j=b>>>k&1;H[f>>2]=j?g:p;k=H[e+124>>2];b=l-4|0;H[b>>2]=H[b>>2]|32;H[l+4>>2]=H[l+4>>2]|8;H[l>>2]=H[l>>2]|j<<19|16;if(M){break db}b=l+(-2-k<<2)|0;H[b+4>>2]=H[b+4>>2]|32768;H[b>>2]=H[b>>2]|j<<31|65536;b=b-4|0;H[b>>2]=H[b>>2]|131072}b=H[l>>2]|2097152;H[l>>2]=b}if(!(!(b&3960)|b&16777344)){b=H[e>>2];k=H[e+8>>2];gb:{if(k){break gb}k=(b|0)==255;j=H[e+16>>2];b=I[j|0];hb:{if(!k){H[e>>2]=b;H[e+16>>2]=j+1;break hb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=j+1;k=7;break gb}b=255;H[e>>2]=255}k=8}k=k-1|0;H[e+8>>2]=k;if(b>>>k&1){ib:{if(k){break ib}k=(b|0)==255;j=H[e+16>>2];b=I[j|0];jb:{if(!k){H[e>>2]=b;H[e+16>>2]=j+1;break jb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=j+1;k=7;break ib}b=255;H[e>>2]=255}k=8}k=k-1|0;H[e+8>>2]=k;k=b>>>k&1;H[f+n>>2]=k?g:p;b=l-4|0;H[b>>2]=H[b>>2]|256;H[l+4>>2]=H[l+4>>2]|64;b=H[l>>2]|k<<22|128}else{b=H[l>>2]}b=b|16777216;H[l>>2]=b}if(!(!(b&31680)|b&134218752)){b=H[e>>2];k=H[e+8>>2];kb:{if(k){break kb}k=(b|0)==255;j=H[e+16>>2];b=I[j|0];lb:{if(!k){H[e>>2]=b;H[e+16>>2]=j+1;break lb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=j+1;k=7;break kb}b=255;H[e>>2]=255}k=8}k=k-1|0;H[e+8>>2]=k;if(b>>>k&1){mb:{if(k){break mb}k=(b|0)==255;j=H[e+16>>2];b=I[j|0];nb:{if(!k){H[e>>2]=b;H[e+16>>2]=j+1;break nb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=j+1;k=7;break mb}b=255;H[e>>2]=255}k=8}k=k-1|0;H[e+8>>2]=k;k=b>>>k&1;H[f+q>>2]=k?g:p;b=l-4|0;H[b>>2]=H[b>>2]|2048;H[l+4>>2]=H[l+4>>2]|512;b=H[l>>2]|k<<25|1024}else{b=H[l>>2]}b=b|134217728;H[l>>2]=b}if(!(b&253440)|b&1073750016){break ab}b=H[e>>2];k=H[e+8>>2];ob:{if(k){break ob}k=(b|0)==255;j=H[e+16>>2];b=I[j|0];pb:{if(!k){H[e>>2]=b;H[e+16>>2]=j+1;break pb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=j+1;k=7;break ob}b=255;H[e>>2]=255}k=8}k=k-1|0;H[e+8>>2]=k;if(b>>>k&1){qb:{if(k){break qb}k=(b|0)==255;j=H[e+16>>2];b=I[j|0];rb:{if(!k){H[e>>2]=b;H[e+16>>2]=j+1;break rb}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=j+1;k=7;break qb}b=255;H[e>>2]=255}k=8}k=k-1|0;H[e+8>>2]=k;j=b>>>k&1;H[d+f>>2]=j?g:p;k=H[e+124>>2];b=l-4|0;H[b>>2]=H[b>>2]|16384;H[l+4>>2]=H[l+4>>2]|4096;H[l>>2]=H[l>>2]|j<<28|8192;b=l+(k<<2)|0;H[b+4>>2]=H[b+4>>2]|4;H[b+12>>2]=H[b+12>>2]|1;H[b+8>>2]=H[b+8>>2]|j<<18|2}H[l>>2]=H[l>>2]|1073741824}f=f+4|0;b=l+4|0;c=c+1|0;if((s|0)!=(c|0)){continue}break}f=d+f|0;b=l+12|0;m=m+4|0;c=H[e+128>>2];if(m>>>0<(c&-4)>>>0){continue}break}}if(!s|c>>>0<=m>>>0){break _a}v=0;q=0-p|0;k=c;while(1){sb:{if((m|0)==(k|0)){k=m;break sb}d=b-4|0;j=H[b>>2];i=0;while(1){o=N(i,3);l=j>>>o|0;if(!(l&2097168|!(l&495))){c=H[e>>2];g=H[e+8>>2];tb:{if(g){break tb}l=(c|0)!=255;k=H[e+16>>2];c=I[k|0];ub:{if(!l){if(c>>>0>=144){c=255;H[e>>2]=255;break ub}H[e>>2]=c;H[e+16>>2]=k+1;g=7;break tb}H[e>>2]=c;H[e+16>>2]=k+1}g=8}g=g-1|0;H[e+8>>2]=g;vb:{if(!(c>>>g&1)){break vb}k=(N(i,s)<<2)+f|0;wb:{if(g){break wb}l=(c|0)!=255;n=H[e+16>>2];c=I[n|0];xb:{if(!l){if(c>>>0>=144){c=255;H[e>>2]=255;break xb}H[e>>2]=c;H[e+16>>2]=n+1;g=7;break wb}H[e>>2]=c;H[e+16>>2]=n+1}g=8}l=g-1|0;H[e+8>>2]=l;j=k;k=c>>>l&1;H[j>>2]=k?q:p;l=H[e+124>>2];H[d>>2]=H[d>>2]|32<>2]=H[b>>2]|(k<<19|16)<>2]=H[b+4>>2]|8<>2]=H[c+4>>2]|32768;H[c>>2]=H[c>>2]|k<<31|65536;c=c-4|0;H[c>>2]=H[c>>2]|131072}if((i|0)!=3){break vb}c=(l<<2)+b|0;H[c+4>>2]=H[c+4>>2]|4;H[c+12>>2]=H[c+12>>2]|1;H[c+8>>2]=H[c+8>>2]|k<<18|2}j=H[b>>2]|2097152<>2]=j;c=H[e+128>>2]}k=c;i=i+1|0;if(i>>>0>>0){continue}break}}f=f+4|0;b=b+4|0;v=v+1|0;if((s|0)!=(v|0)){continue}break}break _a}k=0;s=0;v=0;yb:{zb:{Ab:{D=H[e+124>>2];if(!((D|0)!=64|H[e+128>>2]!=64)){b=1<>>1|b;l=0-k|0;t=e+28|0;f=H[e+120>>2]+268|0;g=H[e+8>>2];c=H[e+4>>2];j=H[e>>2];m=H[e+104>>2];b=H[e+116>>2];if(Z&8){break Ab}while(1){v=0;while(1){q=b;n=f;f=H[f>>2];if(f){Bb:{if(f&2097168){break Bb}b=f&495;if(!b){break Bb}m=t+(I[b+H[e+108>>2]|0]<<2)|0;i=H[m>>2];b=H[i>>2];c=c-b|0;Cb:{if(j>>>16>>>0>>0){o=H[i+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[i+(d?8:12)>>2];while(1){Db:{if(g){break Db}g=H[e+16>>2];c=g+1|0;i=I[g+1|0];if(I[g|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Db}H[e+16>>2]=c;j=(i<<9)+j|0;g=7;break Db}H[e+16>>2]=c;g=8;j=(i<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?o:!o;break Cb}j=j-(b<<16)|0;if(!(c&32768)){o=H[i+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[i+(b?12:8)>>2];while(1){Eb:{if(g){break Eb}g=H[e+16>>2];d=g+1|0;i=I[g+1|0];if(I[g|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Eb}H[e+16>>2]=d;j=(i<<9)+j|0;g=7;break Eb}H[e+16>>2]=d;g=8;j=(i<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!o:o;break Cb}b=H[i+4>>2]}if(b){p=n-4|0;d=H[n+4>>2]>>>17&4|(H[p>>2]>>>19&1|(f>>>14&16|(f>>>16&64|f&170)));m=t+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;o=I[d+24640|0];Fb:{if(j>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Gb:{if(g){break Gb}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Gb}H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break Gb}H[e+16>>2]=c;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?i:!i;break Fb}j=j-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Hb:{if(g){break Hb}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Hb}H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break Hb}H[e+16>>2]=d;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!i:i;break Fb}d=H[h+4>>2]}H[q>>2]=(o|0)==(d|0)?k:l;H[p>>2]=H[p>>2]|32;H[n+4>>2]=H[n+4>>2]|8;b=n-268|0;H[b>>2]=H[b>>2]|131072;b=n-260|0;H[b>>2]=H[b>>2]|32768;b=n-264|0;i=b;r=H[b>>2];b=d^o;H[i>>2]=r|b<<31|65536;f=b<<19|f|16}f=f|2097152}if(!(!(f&3960)|f&16777344)){o=f>>>3|0;m=t+(I[H[e+108>>2]+(o&495)|0]<<2)|0;p=H[m>>2];b=H[p>>2];c=c-b|0;Ib:{if(j>>>16>>>0>>0){i=H[p+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[p+(d?8:12)>>2];while(1){Jb:{if(g){break Jb}g=H[e+16>>2];c=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Jb}H[e+16>>2]=c;j=(p<<9)+j|0;g=7;break Jb}H[e+16>>2]=c;g=8;j=(p<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break Ib}j=j-(b<<16)|0;if(!(c&32768)){i=H[p+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[p+(b?12:8)>>2];while(1){Kb:{if(g){break Kb}g=H[e+16>>2];d=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Kb}H[e+16>>2]=d;j=(p<<9)+j|0;g=7;break Kb}H[e+16>>2]=d;g=8;j=(p<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break Ib}b=H[p+4>>2]}if(b){p=n-4|0;d=H[n+4>>2]>>>20&4|(H[p>>2]>>>22&1|(f>>>15&16|(f>>>19&64|o&170)));m=t+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;o=I[d+24640|0];Lb:{if(j>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Mb:{if(g){break Mb}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Mb}H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break Mb}H[e+16>>2]=c;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break Lb}j=j-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Nb:{if(g){break Nb}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Nb}H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break Nb}H[e+16>>2]=d;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break Lb}b=H[h+4>>2]}H[q+256>>2]=(o|0)==(b|0)?k:l;H[p>>2]=H[p>>2]|256;H[n+4>>2]=H[n+4>>2]|64;f=(b^o)<<22|f|128}f=f|16777216}if(!(!(f&31680)|f&134218752)){o=f>>>6|0;m=t+(I[H[e+108>>2]+(o&495)|0]<<2)|0;p=H[m>>2];b=H[p>>2];c=c-b|0;Ob:{if(j>>>16>>>0>>0){i=H[p+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[p+(d?8:12)>>2];while(1){Pb:{if(g){break Pb}g=H[e+16>>2];c=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Pb}H[e+16>>2]=c;j=(p<<9)+j|0;g=7;break Pb}H[e+16>>2]=c;g=8;j=(p<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break Ob}j=j-(b<<16)|0;if(!(c&32768)){i=H[p+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[p+(b?12:8)>>2];while(1){Qb:{if(g){break Qb}g=H[e+16>>2];d=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Qb}H[e+16>>2]=d;j=(p<<9)+j|0;g=7;break Qb}H[e+16>>2]=d;g=8;j=(p<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break Ob}b=H[p+4>>2]}if(b){p=n-4|0;d=H[n+4>>2]>>>23&4|(H[p>>2]>>>25&1|(f>>>18&16|(f>>>22&64|o&170)));m=t+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;o=I[d+24640|0];Rb:{if(j>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Sb:{if(g){break Sb}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Sb}H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break Sb}H[e+16>>2]=c;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break Rb}j=j-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Tb:{if(g){break Tb}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Tb}H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break Tb}H[e+16>>2]=d;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break Rb}b=H[h+4>>2]}H[q+512>>2]=(o|0)==(b|0)?k:l;H[p>>2]=H[p>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;f=(b^o)<<25|f|1024}f=f|134217728}if(!(!(f&253440)|f&1073750016)){o=f>>>9|0;m=t+(I[H[e+108>>2]+(o&495)|0]<<2)|0;p=H[m>>2];b=H[p>>2];c=c-b|0;Ub:{if(j>>>16>>>0>>0){i=H[p+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[p+(d?8:12)>>2];while(1){Vb:{if(g){break Vb}g=H[e+16>>2];c=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Vb}H[e+16>>2]=c;j=(p<<9)+j|0;g=7;break Vb}H[e+16>>2]=c;g=8;j=(p<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break Ub}j=j-(b<<16)|0;if(!(c&32768)){i=H[p+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[p+(b?12:8)>>2];while(1){Wb:{if(g){break Wb}g=H[e+16>>2];d=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Wb}H[e+16>>2]=d;j=(p<<9)+j|0;g=7;break Wb}H[e+16>>2]=d;g=8;j=(p<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break Ub}b=H[p+4>>2]}if(b){p=n-4|0;d=H[n+4>>2]>>>26&4|(H[p>>2]>>>28&1|(f>>>21&16|(f>>>25&64|o&170)));m=t+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;o=I[d+24640|0];Xb:{if(j>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Yb:{if(g){break Yb}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Yb}H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break Yb}H[e+16>>2]=c;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break Xb}j=j-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Zb:{if(g){break Zb}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break Zb}H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break Zb}H[e+16>>2]=d;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break Xb}b=H[h+4>>2]}H[q+768>>2]=(o|0)==(b|0)?k:l;H[p>>2]=H[p>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;H[n+260>>2]=H[n+260>>2]|4;H[n+268>>2]=H[n+268>>2]|1;b=b^o;H[n+264>>2]=H[n+264>>2]|b<<18|2;f=b<<28|f|8192}f=f|1073741824}H[n>>2]=f}f=n+4|0;b=q+4|0;v=v+1|0;if((v|0)!=64){continue}break}f=n+12|0;b=q+772|0;q=s>>>0<60;s=s+4|0;if(q){continue}break}break zb}b=1<>>1|b;q=H[e+120>>2];f=(q+(D<<2)|0)+12|0;b=H[e+128>>2];g=H[e+8>>2];c=H[e+4>>2];j=H[e>>2];m=H[e+104>>2];o=H[e+116>>2];_b:{if(Z&8){$b:{if(b>>>0<4){break $b}if(D){u=N(D,12);p=D<<3;q=0-l|0;C=e+28|0;while(1){R=0;while(1){n=f;f=H[f>>2];if(f){ac:{if(f&2097168){break ac}b=f&495;if(!b){break ac}m=C+(I[b+H[e+108>>2]|0]<<2)|0;s=H[m>>2];b=H[s>>2];c=c-b|0;bc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;i=H[s+4>>2];if(c&32768){break bc}i=H[s+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[s+(b?12:8)>>2];while(1){cc:{if(g){break cc}g=H[e+16>>2];d=g+1|0;s=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(s<<8)+j|0;break cc}if(s>>>0<=143){H[e+16>>2]=d;j=(s<<9)+j|0;g=7;break cc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}i=b?!i:i;break bc}i=H[s+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[s+(d?8:12)>>2];while(1){dc:{if(g){break dc}g=H[e+16>>2];c=g+1|0;s=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(s<<8)+j|0;break dc}if(s>>>0<=143){H[e+16>>2]=c;j=(s<<9)+j|0;g=7;break dc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;i=d?i:!i}if(i){h=n-4|0;d=H[n+4>>2]>>>17&4|(H[h>>2]>>>19&1|(f>>>14&16|(f>>>16&64|f&170)));m=C+(I[d+24384|0]<<2)|0;t=H[m>>2];b=H[t>>2];c=c-b|0;i=I[d+24640|0];ec:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;r=H[t+4>>2];if(c&32768){break ec}s=H[t+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[t+(b?12:8)>>2];while(1){fc:{if(g){break fc}g=H[e+16>>2];d=g+1|0;t=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(t<<8)+j|0;break fc}if(t>>>0<=143){H[e+16>>2]=d;j=(t<<9)+j|0;g=7;break fc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}r=b?!s:s;break ec}s=H[t+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[t+(d?8:12)>>2];while(1){gc:{if(g){break gc}g=H[e+16>>2];c=g+1|0;t=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(t<<8)+j|0;break gc}if(t>>>0<=143){H[e+16>>2]=c;j=(t<<9)+j|0;g=7;break gc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;r=d?s:!s}b=r;H[o>>2]=(i|0)==(b|0)?l:q;H[h>>2]=H[h>>2]|32;H[n+4>>2]=H[n+4>>2]|8;f=(b^i)<<19|f|16}f=f|2097152}if(!(!(f&3960)|f&16777344)){i=f>>>3|0;m=C+(I[H[e+108>>2]+(i&495)|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;hc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;r=H[h+4>>2];if(c&32768){break hc}s=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){ic:{if(g){break ic}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(h<<8)+j|0;break ic}if(h>>>0<=143){H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break ic}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}r=b?!s:s;break hc}s=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){jc:{if(g){break jc}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(h<<8)+j|0;break jc}if(h>>>0<=143){H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break jc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;r=d?s:!s}if(r){t=n-4|0;d=H[n+4>>2]>>>20&4|(H[t>>2]>>>22&1|(f>>>15&16|(f>>>19&64|i&170)));m=C+(I[d+24384|0]<<2)|0;r=H[m>>2];b=H[r>>2];c=c-b|0;s=(D<<2)+o|0;i=I[d+24640|0];kc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;z=H[r+4>>2];if(c&32768){break kc}h=H[r+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[r+(b?12:8)>>2];while(1){lc:{if(g){break lc}g=H[e+16>>2];d=g+1|0;r=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(r<<8)+j|0;break lc}if(r>>>0<=143){H[e+16>>2]=d;j=(r<<9)+j|0;g=7;break lc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}z=b?!h:h;break kc}h=H[r+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[r+(d?8:12)>>2];while(1){mc:{if(g){break mc}g=H[e+16>>2];c=g+1|0;r=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(r<<8)+j|0;break mc}if(r>>>0<=143){H[e+16>>2]=c;j=(r<<9)+j|0;g=7;break mc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;z=d?h:!h}b=z;H[s>>2]=(i|0)==(b|0)?l:q;H[t>>2]=H[t>>2]|256;H[n+4>>2]=H[n+4>>2]|64;f=(b^i)<<22|f|128}f=f|16777216}if(!(!(f&31680)|f&134218752)){i=f>>>6|0;m=C+(I[H[e+108>>2]+(i&495)|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;nc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;r=H[h+4>>2];if(c&32768){break nc}s=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){oc:{if(g){break oc}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(h<<8)+j|0;break oc}if(h>>>0<=143){H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break oc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}r=b?!s:s;break nc}s=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){pc:{if(g){break pc}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(h<<8)+j|0;break pc}if(h>>>0<=143){H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break pc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;r=d?s:!s}if(r){t=n-4|0;d=H[n+4>>2]>>>23&4|(H[t>>2]>>>25&1|(f>>>18&16|(f>>>22&64|i&170)));m=C+(I[d+24384|0]<<2)|0;r=H[m>>2];b=H[r>>2];c=c-b|0;s=p+o|0;i=I[d+24640|0];qc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;z=H[r+4>>2];if(c&32768){break qc}h=H[r+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[r+(b?12:8)>>2];while(1){rc:{if(g){break rc}g=H[e+16>>2];d=g+1|0;r=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(r<<8)+j|0;break rc}if(r>>>0<=143){H[e+16>>2]=d;j=(r<<9)+j|0;g=7;break rc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}z=b?!h:h;break qc}h=H[r+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[r+(d?8:12)>>2];while(1){sc:{if(g){break sc}g=H[e+16>>2];c=g+1|0;r=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(r<<8)+j|0;break sc}if(r>>>0<=143){H[e+16>>2]=c;j=(r<<9)+j|0;g=7;break sc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;z=d?h:!h}b=z;H[s>>2]=(i|0)==(b|0)?l:q;H[t>>2]=H[t>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;f=(b^i)<<25|f|1024}f=f|134217728}if(!(!(f&253440)|f&1073750016)){i=f>>>9|0;m=C+(I[H[e+108>>2]+(i&495)|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;tc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;r=H[h+4>>2];if(c&32768){break tc}s=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){uc:{if(g){break uc}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(h<<8)+j|0;break uc}if(h>>>0<=143){H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break uc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}r=b?!s:s;break tc}s=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){vc:{if(g){break vc}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(h<<8)+j|0;break vc}if(h>>>0<=143){H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break vc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;r=d?s:!s}if(r){t=n-4|0;d=H[n+4>>2]>>>26&4|(H[t>>2]>>>28&1|(f>>>21&16|(f>>>25&64|i&170)));m=C+(I[d+24384|0]<<2)|0;r=H[m>>2];b=H[r>>2];c=c-b|0;s=o+u|0;i=I[d+24640|0];wc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;z=H[r+4>>2];if(c&32768){break wc}h=H[r+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[r+(b?12:8)>>2];while(1){xc:{if(g){break xc}g=H[e+16>>2];d=g+1|0;r=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(r<<8)+j|0;break xc}if(r>>>0<=143){H[e+16>>2]=d;j=(r<<9)+j|0;g=7;break xc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}z=b?!h:h;break wc}h=H[r+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[r+(d?8:12)>>2];while(1){yc:{if(g){break yc}g=H[e+16>>2];c=g+1|0;r=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(r<<8)+j|0;break yc}if(r>>>0<=143){H[e+16>>2]=c;j=(r<<9)+j|0;g=7;break yc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;z=d?h:!h}b=z;H[s>>2]=(i|0)==(b|0)?l:q;H[t>>2]=H[t>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;d=n+(H[e+124>>2]<<2)|0;H[d+4>>2]=H[d+4>>2]|4;H[d+12>>2]=H[d+12>>2]|1;b=b^i;H[d+8>>2]=H[d+8>>2]|b<<18|2;f=b<<28|f|8192}f=f|1073741824}H[n>>2]=f}f=n+4|0;o=o+4|0;R=R+1|0;if((D|0)!=(R|0)){continue}break}f=n+12|0;o=o+u|0;k=k+4|0;b=H[e+128>>2];if(k>>>0<(b&-4)>>>0){continue}break}break $b}f=(b&-4)-1|0;k=(f&-4)+4|0;f=(q+(f<<1&-8)|0)+20|0}H[e+8>>2]=g;H[e+4>>2]=c;H[e>>2]=j;H[e+104>>2]=m;if(!D|b>>>0<=k>>>0){break _b}while(1){c=(b|0)==(k|0);g=0;b=k;if(!c){while(1){Zb(e,f,(N(g,D)<<2)+o|0,l,g,H[e+124>>2]+2|0,1);g=g+1|0;b=H[e+128>>2];if(g>>>0>>0){continue}break}}f=f+4|0;o=o+4|0;v=v+1|0;if((D|0)!=(v|0)){continue}break}break _b}zc:{if(b>>>0<4){break zc}if(D){u=N(D,12);p=D<<3;q=0-l|0;C=e+28|0;while(1){R=0;while(1){n=f;f=H[f>>2];if(f){Ac:{if(f&2097168){break Ac}b=f&495;if(!b){break Ac}m=C+(I[b+H[e+108>>2]|0]<<2)|0;s=H[m>>2];b=H[s>>2];c=c-b|0;Bc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;i=H[s+4>>2];if(c&32768){break Bc}i=H[s+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[s+(b?12:8)>>2];while(1){Cc:{if(g){break Cc}g=H[e+16>>2];d=g+1|0;s=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(s<<8)+j|0;break Cc}if(s>>>0<=143){H[e+16>>2]=d;j=(s<<9)+j|0;g=7;break Cc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}i=b?!i:i;break Bc}i=H[s+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[s+(d?8:12)>>2];while(1){Dc:{if(g){break Dc}g=H[e+16>>2];c=g+1|0;s=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(s<<8)+j|0;break Dc}if(s>>>0<=143){H[e+16>>2]=c;j=(s<<9)+j|0;g=7;break Dc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;i=d?i:!i}if(i){h=n-4|0;d=H[n+4>>2]>>>17&4|(H[h>>2]>>>19&1|(f>>>14&16|(f>>>16&64|f&170)));m=C+(I[d+24384|0]<<2)|0;t=H[m>>2];b=H[t>>2];c=c-b|0;i=I[d+24640|0];Ec:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[t+4>>2];if(c&32768){break Ec}s=H[t+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[t+(b?12:8)>>2];while(1){Fc:{if(g){break Fc}g=H[e+16>>2];d=g+1|0;t=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(t<<8)+j|0;break Fc}if(t>>>0<=143){H[e+16>>2]=d;j=(t<<9)+j|0;g=7;break Fc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!s:s;break Ec}s=H[t+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[t+(d?8:12)>>2];while(1){Gc:{if(g){break Gc}g=H[e+16>>2];c=g+1|0;t=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(t<<8)+j|0;break Gc}if(t>>>0<=143){H[e+16>>2]=c;j=(t<<9)+j|0;g=7;break Gc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?s:!s}H[o>>2]=(i|0)==(d|0)?l:q;H[h>>2]=H[h>>2]|32;H[n+4>>2]=H[n+4>>2]|8;b=n+(-2-H[e+124>>2]<<2)|0;H[b+4>>2]=H[b+4>>2]|32768;d=d^i;H[b>>2]=H[b>>2]|d<<31|65536;b=b-4|0;H[b>>2]=H[b>>2]|131072;f=d<<19|f|16}f=f|2097152}if(!(!(f&3960)|f&16777344)){i=f>>>3|0;m=C+(I[H[e+108>>2]+(i&495)|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;Hc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;r=H[h+4>>2];if(c&32768){break Hc}s=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Ic:{if(g){break Ic}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(h<<8)+j|0;break Ic}if(h>>>0<=143){H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break Ic}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}r=b?!s:s;break Hc}s=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Jc:{if(g){break Jc}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(h<<8)+j|0;break Jc}if(h>>>0<=143){H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break Jc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;r=d?s:!s}if(r){t=n-4|0;d=H[n+4>>2]>>>20&4|(H[t>>2]>>>22&1|(f>>>15&16|(f>>>19&64|i&170)));m=C+(I[d+24384|0]<<2)|0;r=H[m>>2];b=H[r>>2];c=c-b|0;s=(D<<2)+o|0;i=I[d+24640|0];Kc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;z=H[r+4>>2];if(c&32768){break Kc}h=H[r+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[r+(b?12:8)>>2];while(1){Lc:{if(g){break Lc}g=H[e+16>>2];d=g+1|0;r=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(r<<8)+j|0;break Lc}if(r>>>0<=143){H[e+16>>2]=d;j=(r<<9)+j|0;g=7;break Lc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}z=b?!h:h;break Kc}h=H[r+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[r+(d?8:12)>>2];while(1){Mc:{if(g){break Mc}g=H[e+16>>2];c=g+1|0;r=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(r<<8)+j|0;break Mc}if(r>>>0<=143){H[e+16>>2]=c;j=(r<<9)+j|0;g=7;break Mc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;z=d?h:!h}b=z;H[s>>2]=(i|0)==(b|0)?l:q;H[t>>2]=H[t>>2]|256;H[n+4>>2]=H[n+4>>2]|64;f=(b^i)<<22|f|128}f=f|16777216}if(!(!(f&31680)|f&134218752)){i=f>>>6|0;m=C+(I[H[e+108>>2]+(i&495)|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;Nc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;r=H[h+4>>2];if(c&32768){break Nc}s=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Oc:{if(g){break Oc}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(h<<8)+j|0;break Oc}if(h>>>0<=143){H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break Oc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}r=b?!s:s;break Nc}s=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Pc:{if(g){break Pc}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(h<<8)+j|0;break Pc}if(h>>>0<=143){H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break Pc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;r=d?s:!s}if(r){t=n-4|0;d=H[n+4>>2]>>>23&4|(H[t>>2]>>>25&1|(f>>>18&16|(f>>>22&64|i&170)));m=C+(I[d+24384|0]<<2)|0;r=H[m>>2];b=H[r>>2];c=c-b|0;s=p+o|0;i=I[d+24640|0];Qc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;z=H[r+4>>2];if(c&32768){break Qc}h=H[r+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[r+(b?12:8)>>2];while(1){Rc:{if(g){break Rc}g=H[e+16>>2];d=g+1|0;r=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(r<<8)+j|0;break Rc}if(r>>>0<=143){H[e+16>>2]=d;j=(r<<9)+j|0;g=7;break Rc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}z=b?!h:h;break Qc}h=H[r+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[r+(d?8:12)>>2];while(1){Sc:{if(g){break Sc}g=H[e+16>>2];c=g+1|0;r=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(r<<8)+j|0;break Sc}if(r>>>0<=143){H[e+16>>2]=c;j=(r<<9)+j|0;g=7;break Sc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;z=d?h:!h}b=z;H[s>>2]=(i|0)==(b|0)?l:q;H[t>>2]=H[t>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;f=(b^i)<<25|f|1024}f=f|134217728}if(!(!(f&253440)|f&1073750016)){i=f>>>9|0;m=C+(I[H[e+108>>2]+(i&495)|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;Tc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;r=H[h+4>>2];if(c&32768){break Tc}s=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){Uc:{if(g){break Uc}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(h<<8)+j|0;break Uc}if(h>>>0<=143){H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break Uc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}r=b?!s:s;break Tc}s=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){Vc:{if(g){break Vc}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(h<<8)+j|0;break Vc}if(h>>>0<=143){H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break Vc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;r=d?s:!s}if(r){t=n-4|0;d=H[n+4>>2]>>>26&4|(H[t>>2]>>>28&1|(f>>>21&16|(f>>>25&64|i&170)));m=C+(I[d+24384|0]<<2)|0;r=H[m>>2];b=H[r>>2];c=c-b|0;s=o+u|0;i=I[d+24640|0];Wc:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;z=H[r+4>>2];if(c&32768){break Wc}h=H[r+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[r+(b?12:8)>>2];while(1){Xc:{if(g){break Xc}g=H[e+16>>2];d=g+1|0;r=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=d;g=8;j=(r<<8)+j|0;break Xc}if(r>>>0<=143){H[e+16>>2]=d;j=(r<<9)+j|0;g=7;break Xc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}z=b?!h:h;break Wc}h=H[r+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[r+(d?8:12)>>2];while(1){Yc:{if(g){break Yc}g=H[e+16>>2];c=g+1|0;r=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=c;g=8;j=(r<<8)+j|0;break Yc}if(r>>>0<=143){H[e+16>>2]=c;j=(r<<9)+j|0;g=7;break Yc}H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;z=d?h:!h}b=z;H[s>>2]=(i|0)==(b|0)?l:q;H[t>>2]=H[t>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;d=n+(H[e+124>>2]<<2)|0;H[d+4>>2]=H[d+4>>2]|4;H[d+12>>2]=H[d+12>>2]|1;b=b^i;H[d+8>>2]=H[d+8>>2]|b<<18|2;f=b<<28|f|8192}f=f|1073741824}H[n>>2]=f}f=n+4|0;o=o+4|0;R=R+1|0;if((D|0)!=(R|0)){continue}break}f=n+12|0;o=o+u|0;k=k+4|0;b=H[e+128>>2];if(k>>>0<(b&-4)>>>0){continue}break}break zc}f=(b&-4)-1|0;k=(f&-4)+4|0;f=(q+(f<<1&-8)|0)+20|0}H[e+8>>2]=g;H[e+4>>2]=c;H[e>>2]=j;H[e+104>>2]=m;if(!D|b>>>0<=k>>>0){break _b}while(1){c=(b|0)==(k|0);g=0;b=k;if(!c){while(1){Zb(e,f,(N(g,D)<<2)+o|0,l,g,H[e+124>>2]+2|0,0);g=g+1|0;b=H[e+128>>2];if(g>>>0>>0){continue}break}}f=f+4|0;o=o+4|0;v=v+1|0;if((D|0)!=(v|0)){continue}break}}break yb}while(1){v=0;while(1){q=b;n=f;f=H[f>>2];if(f){Zc:{if(f&2097168){break Zc}b=f&495;if(!b){break Zc}m=t+(I[b+H[e+108>>2]|0]<<2)|0;i=H[m>>2];b=H[i>>2];c=c-b|0;_c:{if(j>>>16>>>0>>0){o=H[i+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[i+(d?8:12)>>2];while(1){$c:{if(g){break $c}g=H[e+16>>2];c=g+1|0;i=I[g+1|0];if(I[g|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break $c}H[e+16>>2]=c;j=(i<<9)+j|0;g=7;break $c}H[e+16>>2]=c;g=8;j=(i<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?o:!o;break _c}j=j-(b<<16)|0;if(!(c&32768)){o=H[i+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[i+(b?12:8)>>2];while(1){ad:{if(g){break ad}g=H[e+16>>2];d=g+1|0;i=I[g+1|0];if(I[g|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break ad}H[e+16>>2]=d;j=(i<<9)+j|0;g=7;break ad}H[e+16>>2]=d;g=8;j=(i<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!o:o;break _c}b=H[i+4>>2]}if(b){p=n-4|0;d=H[n+4>>2]>>>17&4|(H[p>>2]>>>19&1|(f>>>14&16|(f>>>16&64|f&170)));m=t+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;o=I[d+24640|0];bd:{if(j>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){cd:{if(g){break cd}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break cd}H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break cd}H[e+16>>2]=c;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break bd}j=j-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){dd:{if(g){break dd}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break dd}H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break dd}H[e+16>>2]=d;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break bd}b=H[h+4>>2]}H[q>>2]=(o|0)==(b|0)?k:l;H[p>>2]=H[p>>2]|32;H[n+4>>2]=H[n+4>>2]|8;f=(b^o)<<19|f|16}f=f|2097152}if(!(!(f&3960)|f&16777344)){o=f>>>3|0;m=t+(I[H[e+108>>2]+(o&495)|0]<<2)|0;p=H[m>>2];b=H[p>>2];c=c-b|0;ed:{if(j>>>16>>>0>>0){i=H[p+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[p+(d?8:12)>>2];while(1){fd:{if(g){break fd}g=H[e+16>>2];c=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break fd}H[e+16>>2]=c;j=(p<<9)+j|0;g=7;break fd}H[e+16>>2]=c;g=8;j=(p<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break ed}j=j-(b<<16)|0;if(!(c&32768)){i=H[p+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[p+(b?12:8)>>2];while(1){gd:{if(g){break gd}g=H[e+16>>2];d=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break gd}H[e+16>>2]=d;j=(p<<9)+j|0;g=7;break gd}H[e+16>>2]=d;g=8;j=(p<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break ed}b=H[p+4>>2]}if(b){p=n-4|0;d=H[n+4>>2]>>>20&4|(H[p>>2]>>>22&1|(f>>>15&16|(f>>>19&64|o&170)));m=t+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;o=I[d+24640|0];hd:{if(j>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){id:{if(g){break id}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break id}H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break id}H[e+16>>2]=c;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break hd}j=j-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){jd:{if(g){break jd}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break jd}H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break jd}H[e+16>>2]=d;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break hd}b=H[h+4>>2]}H[q+256>>2]=(o|0)==(b|0)?k:l;H[p>>2]=H[p>>2]|256;H[n+4>>2]=H[n+4>>2]|64;f=(b^o)<<22|f|128}f=f|16777216}if(!(!(f&31680)|f&134218752)){o=f>>>6|0;m=t+(I[H[e+108>>2]+(o&495)|0]<<2)|0;p=H[m>>2];b=H[p>>2];c=c-b|0;kd:{if(j>>>16>>>0>>0){i=H[p+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[p+(d?8:12)>>2];while(1){ld:{if(g){break ld}g=H[e+16>>2];c=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break ld}H[e+16>>2]=c;j=(p<<9)+j|0;g=7;break ld}H[e+16>>2]=c;g=8;j=(p<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break kd}j=j-(b<<16)|0;if(!(c&32768)){i=H[p+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[p+(b?12:8)>>2];while(1){md:{if(g){break md}g=H[e+16>>2];d=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break md}H[e+16>>2]=d;j=(p<<9)+j|0;g=7;break md}H[e+16>>2]=d;g=8;j=(p<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break kd}b=H[p+4>>2]}if(b){p=n-4|0;d=H[n+4>>2]>>>23&4|(H[p>>2]>>>25&1|(f>>>18&16|(f>>>22&64|o&170)));m=t+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;o=I[d+24640|0];nd:{if(j>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){od:{if(g){break od}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break od}H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break od}H[e+16>>2]=c;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break nd}j=j-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){pd:{if(g){break pd}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break pd}H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break pd}H[e+16>>2]=d;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break nd}b=H[h+4>>2]}H[q+512>>2]=(o|0)==(b|0)?k:l;H[p>>2]=H[p>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;f=(b^o)<<25|f|1024}f=f|134217728}if(!(!(f&253440)|f&1073750016)){o=f>>>9|0;m=t+(I[H[e+108>>2]+(o&495)|0]<<2)|0;p=H[m>>2];b=H[p>>2];c=c-b|0;qd:{if(j>>>16>>>0>>0){i=H[p+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[p+(d?8:12)>>2];while(1){rd:{if(g){break rd}g=H[e+16>>2];c=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break rd}H[e+16>>2]=c;j=(p<<9)+j|0;g=7;break rd}H[e+16>>2]=c;g=8;j=(p<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break qd}j=j-(b<<16)|0;if(!(c&32768)){i=H[p+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[p+(b?12:8)>>2];while(1){sd:{if(g){break sd}g=H[e+16>>2];d=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break sd}H[e+16>>2]=d;j=(p<<9)+j|0;g=7;break sd}H[e+16>>2]=d;g=8;j=(p<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break qd}b=H[p+4>>2]}if(b){p=n-4|0;d=H[n+4>>2]>>>26&4|(H[p>>2]>>>28&1|(f>>>21&16|(f>>>25&64|o&170)));m=t+(I[d+24384|0]<<2)|0;h=H[m>>2];b=H[h>>2];c=c-b|0;o=I[d+24640|0];td:{if(j>>>16>>>0>>0){i=H[h+4>>2];d=b>>>0>c>>>0;H[m>>2]=H[h+(d?8:12)>>2];while(1){ud:{if(g){break ud}g=H[e+16>>2];c=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break ud}H[e+16>>2]=c;j=(h<<9)+j|0;g=7;break ud}H[e+16>>2]=c;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?i:!i;break td}j=j-(b<<16)|0;if(!(c&32768)){i=H[h+4>>2];b=b>>>0>c>>>0;H[m>>2]=H[h+(b?12:8)>>2];while(1){vd:{if(g){break vd}g=H[e+16>>2];d=g+1|0;h=I[g+1|0];if(I[g|0]==255){if(h>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;j=j+65280|0;g=8;break vd}H[e+16>>2]=d;j=(h<<9)+j|0;g=7;break vd}H[e+16>>2]=d;g=8;j=(h<<8)+j|0}g=g-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!i:i;break td}b=H[h+4>>2]}H[q+768>>2]=(o|0)==(b|0)?k:l;H[p>>2]=H[p>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;H[n+260>>2]=H[n+260>>2]|4;H[n+268>>2]=H[n+268>>2]|1;b=b^o;H[n+264>>2]=H[n+264>>2]|b<<18|2;f=b<<28|f|8192}f=f|1073741824}H[n>>2]=f}f=n+4|0;b=q+4|0;v=v+1|0;if((v|0)!=64){continue}break}f=n+12|0;b=q+772|0;q=s>>>0<60;s=s+4|0;if(q){continue}break}}H[e+8>>2]=g;H[e+4>>2]=c;H[e>>2]=j;H[e+104>>2]=m}break _a;case 0:if(!U){p=1<>>1|0;s=H[e+124>>2];d=s<<2;b=(d+H[e+120>>2]|0)+12|0;f=H[e+116>>2];j=0;c=H[e+128>>2];if(c>>>0>=4){if(!s){break Za}o=N(s,12);n=s<<3;i=0-p|0;while(1){c=0;while(1){l=b;b=H[b>>2];wd:{if(!b){break wd}if((b&2097168)==16){b=H[e>>2];h=H[e+8>>2];xd:{if(h){break xd}k=(b|0)==255;q=H[e+16>>2];b=I[q|0];yd:{if(!k){H[e>>2]=b;H[e+16>>2]=q+1;break yd}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=q+1;h=7;break xd}b=255;H[e>>2]=255}h=8}k=h-1|0;H[e+8>>2]=k;k=b>>>k&1;b=H[f>>2];H[f>>2]=((k|0)==(b>>>31|0)?i:p)+b;b=H[l>>2]|1048576;H[l>>2]=b}if((b&16777344)==128){b=H[e>>2];h=H[e+8>>2];zd:{if(h){break zd}k=(b|0)==255;q=H[e+16>>2];b=I[q|0];Ad:{if(!k){H[e>>2]=b;H[e+16>>2]=q+1;break Ad}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=q+1;h=7;break zd}b=255;H[e>>2]=255}h=8}q=h-1|0;H[e+8>>2]=q;k=d+f|0;g=H[k>>2];H[k>>2]=g+((b>>>q&1)==(g>>>31|0)?i:p);b=H[l>>2]|8388608;H[l>>2]=b}if((b&134218752)==1024){b=H[e>>2];h=H[e+8>>2];Bd:{if(h){break Bd}k=(b|0)==255;q=H[e+16>>2];b=I[q|0];Cd:{if(!k){H[e>>2]=b;H[e+16>>2]=q+1;break Cd}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=q+1;h=7;break Bd}b=255;H[e>>2]=255}h=8}q=h-1|0;H[e+8>>2]=q;k=f+n|0;g=H[k>>2];H[k>>2]=g+((b>>>q&1)==(g>>>31|0)?i:p);b=H[l>>2]|67108864;H[l>>2]=b}if((b&1073750016)!=8192){break wd}b=H[e>>2];h=H[e+8>>2];Dd:{if(h){break Dd}k=(b|0)==255;q=H[e+16>>2];b=I[q|0];Ed:{if(!k){H[e>>2]=b;H[e+16>>2]=q+1;break Ed}if(b>>>0<=143){H[e>>2]=b;H[e+16>>2]=q+1;h=7;break Dd}b=255;H[e>>2]=255}h=8}q=h-1|0;H[e+8>>2]=q;k=f+o|0;g=H[k>>2];H[k>>2]=g+((b>>>q&1)==(g>>>31|0)?i:p);H[l>>2]=H[l>>2]|536870912}f=f+4|0;b=l+4|0;c=c+1|0;if((s|0)!=(c|0)){continue}break}f=f+o|0;b=l+12|0;j=j+4|0;c=H[e+128>>2];if(j>>>0<(c&-4)>>>0){continue}break}}if(!s|c>>>0<=j>>>0){break _a}v=0;k=0-p|0;d=c;while(1){Fd:{if((d|0)==(j|0)){d=j;break Fd}h=H[b>>2];i=0;while(1){d=N(i,3);if((2097168<>2];m=H[e+8>>2];Gd:{if(m){break Gd}l=(c|0)!=255;q=H[e+16>>2];c=I[q|0];Hd:{if(!l){if(c>>>0>=144){c=255;H[e>>2]=255;break Hd}H[e>>2]=c;H[e+16>>2]=q+1;m=7;break Gd}H[e>>2]=c;H[e+16>>2]=q+1}m=8}l=m-1|0;H[e+8>>2]=l;l=c>>>l&1;c=H[n>>2];H[n>>2]=((l|0)==(c>>>31|0)?k:p)+c;h=H[b>>2]|1048576<>2]=h;c=H[e+128>>2]}i=i+1|0;d=c;if(i>>>0>>0){continue}break}}f=f+4|0;b=b+4|0;v=v+1|0;if((s|0)!=(v|0)){continue}break}break _a}k=H[e+120>>2];d=H[e+116>>2];v=H[e+124>>2];c=H[e+128>>2];if(!((v|0)!=64|(c|0)!=64)){c=k+268|0;s=0;t=1<>>1|0;h=0-t|0;i=H[e+8>>2];f=H[e+4>>2];b=H[e>>2];j=H[e+104>>2];while(1){m=0;while(1){q=d;k=c;d=H[c>>2];if(d){l=c;if((d&2097168)==16){j=ea+((d&1048576?16:d&495?15:14)<<2)|0;g=H[j>>2];c=H[g>>2];f=f-c|0;Id:{if(b>>>16>>>0>>0){o=H[g+4>>2];n=c>>>0>f>>>0;H[j>>2]=H[g+(n?8:12)>>2];while(1){Jd:{if(i){break Jd}g=H[e+16>>2];f=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Jd}H[e+16>>2]=f;b=(p<<9)+b|0;i=7;break Jd}H[e+16>>2]=f;i=8;b=(p<<8)+b|0}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}f=c;n=n?o:!o;break Id}b=b-(c<<16)|0;if(!(f&32768)){o=H[g+4>>2];c=c>>>0>f>>>0;H[j>>2]=H[g+(c?12:8)>>2];while(1){Kd:{if(i){break Kd}g=H[e+16>>2];n=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Kd}H[e+16>>2]=n;b=(p<<9)+b|0;i=7;break Kd}H[e+16>>2]=n;i=8;b=(p<<8)+b|0}i=i-1|0;b=b<<1;f=f<<1;if(f>>>0<32768){continue}break}n=c?!o:o;break Id}n=H[g+4>>2]}c=H[q>>2];H[q>>2]=((n|0)==(c>>>31|0)?h:t)+c;d=d|1048576}if((d&16777344)==128){j=ea+((d&8388608?16:d&3960?15:14)<<2)|0;g=H[j>>2];c=H[g>>2];f=f-c|0;Ld:{if(b>>>16>>>0>>0){o=H[g+4>>2];n=c>>>0>f>>>0;H[j>>2]=H[g+(n?8:12)>>2];while(1){Md:{if(i){break Md}g=H[e+16>>2];f=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Md}H[e+16>>2]=f;b=(p<<9)+b|0;i=7;break Md}H[e+16>>2]=f;i=8;b=(p<<8)+b|0}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}f=c;n=n?o:!o;break Ld}b=b-(c<<16)|0;if(!(f&32768)){o=H[g+4>>2];c=c>>>0>f>>>0;H[j>>2]=H[g+(c?12:8)>>2];while(1){Nd:{if(i){break Nd}g=H[e+16>>2];n=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Nd}H[e+16>>2]=n;b=(p<<9)+b|0;i=7;break Nd}H[e+16>>2]=n;i=8;b=(p<<8)+b|0}i=i-1|0;b=b<<1;f=f<<1;if(f>>>0<32768){continue}break}n=c?!o:o;break Ld}n=H[g+4>>2]}c=H[q+256>>2];H[q+256>>2]=((n|0)==(c>>>31|0)?h:t)+c;d=d|8388608}if((d&134218752)==1024){j=ea+((d&67108864?16:d&31680?15:14)<<2)|0;g=H[j>>2];c=H[g>>2];f=f-c|0;Od:{if(b>>>16>>>0>>0){o=H[g+4>>2];n=c>>>0>f>>>0;H[j>>2]=H[g+(n?8:12)>>2];while(1){Pd:{if(i){break Pd}g=H[e+16>>2];f=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Pd}H[e+16>>2]=f;b=(p<<9)+b|0;i=7;break Pd}H[e+16>>2]=f;i=8;b=(p<<8)+b|0}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}f=c;n=n?o:!o;break Od}b=b-(c<<16)|0;if(!(f&32768)){o=H[g+4>>2];c=c>>>0>f>>>0;H[j>>2]=H[g+(c?12:8)>>2];while(1){Qd:{if(i){break Qd}g=H[e+16>>2];n=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Qd}H[e+16>>2]=n;b=(p<<9)+b|0;i=7;break Qd}H[e+16>>2]=n;i=8;b=(p<<8)+b|0}i=i-1|0;b=b<<1;f=f<<1;if(f>>>0<32768){continue}break}n=c?!o:o;break Od}n=H[g+4>>2]}c=H[q+512>>2];H[q+512>>2]=((n|0)==(c>>>31|0)?h:t)+c;d=d|67108864}if((d&1073750016)==8192){j=ea+((d&536870912?16:d&253440?15:14)<<2)|0;g=H[j>>2];c=H[g>>2];f=f-c|0;Rd:{if(b>>>16>>>0>>0){o=H[g+4>>2];n=c>>>0>f>>>0;H[j>>2]=H[g+(n?8:12)>>2];while(1){Sd:{if(i){break Sd}g=H[e+16>>2];f=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Sd}H[e+16>>2]=f;b=(p<<9)+b|0;i=7;break Sd}H[e+16>>2]=f;i=8;b=(p<<8)+b|0}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}f=c;n=n?o:!o;break Rd}b=b-(c<<16)|0;if(!(f&32768)){o=H[g+4>>2];c=c>>>0>f>>>0;H[j>>2]=H[g+(c?12:8)>>2];while(1){Td:{if(i){break Td}g=H[e+16>>2];n=g+1|0;p=I[g+1|0];if(I[g|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8;break Td}H[e+16>>2]=n;b=(p<<9)+b|0;i=7;break Td}H[e+16>>2]=n;i=8;b=(p<<8)+b|0}i=i-1|0;b=b<<1;f=f<<1;if(f>>>0<32768){continue}break}n=c?!o:o;break Rd}n=H[g+4>>2]}c=H[q+768>>2];H[q+768>>2]=((n|0)==(c>>>31|0)?h:t)+c;d=d|536870912}H[l>>2]=d}c=k+4|0;d=q+4|0;m=m+1|0;if((m|0)!=64){continue}break}c=k+12|0;d=q+772|0;l=s>>>0<60;s=s+4|0;if(l){continue}break}H[e+8>>2]=i;H[e+4>>2]=f;H[e>>2]=b;H[e+104>>2]=j;break _a}r=1<>>1|0;s=v<<2;g=(s+k|0)+12|0;i=H[e+8>>2];f=H[e+4>>2];b=H[e>>2];j=H[e+104>>2];o=0;Ud:{if(c>>>0<4){break Ud}if(v){h=N(v,12);n=v<<3;u=0-r|0;while(1){m=0;while(1){l=g;k=H[g>>2];if(k){if((k&2097168)==16){j=ea+((k&1048576?16:k&495?15:14)<<2)|0;g=H[j>>2];c=H[g>>2];f=f-c|0;Vd:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[g+4>>2];if(f&32768){break Vd}p=H[g+4>>2];c=c>>>0>f>>>0;H[j>>2]=H[g+(c?12:8)>>2];while(1){Wd:{if(i){break Wd}g=H[e+16>>2];q=g+1|0;t=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=q;i=8;b=(t<<8)+b|0;break Wd}if(t>>>0<=143){H[e+16>>2]=q;b=(t<<9)+b|0;i=7;break Wd}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;f=f<<1;if(f>>>0<32768){continue}break}q=c?!p:p;break Vd}p=H[g+4>>2];q=c>>>0>f>>>0;H[j>>2]=H[g+(q?8:12)>>2];while(1){Xd:{if(i){break Xd}g=H[e+16>>2];f=g+1|0;t=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=f;i=8;b=(t<<8)+b|0;break Xd}if(t>>>0<=143){H[e+16>>2]=f;b=(t<<9)+b|0;i=7;break Xd}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}f=c;q=q?p:!p}c=H[d>>2];H[d>>2]=((q|0)==(c>>>31|0)?u:r)+c;k=k|1048576}if((k&16777344)==128){j=ea+((k&8388608?16:k&3960?15:14)<<2)|0;g=H[j>>2];c=H[g>>2];f=f-c|0;Yd:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[g+4>>2];if(f&32768){break Yd}p=H[g+4>>2];c=c>>>0>f>>>0;H[j>>2]=H[g+(c?12:8)>>2];while(1){Zd:{if(i){break Zd}g=H[e+16>>2];q=g+1|0;t=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=q;i=8;b=(t<<8)+b|0;break Zd}if(t>>>0<=143){H[e+16>>2]=q;b=(t<<9)+b|0;i=7;break Zd}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;f=f<<1;if(f>>>0<32768){continue}break}q=c?!p:p;break Yd}p=H[g+4>>2];q=c>>>0>f>>>0;H[j>>2]=H[g+(q?8:12)>>2];while(1){_d:{if(i){break _d}g=H[e+16>>2];f=g+1|0;t=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=f;i=8;b=(t<<8)+b|0;break _d}if(t>>>0<=143){H[e+16>>2]=f;b=(t<<9)+b|0;i=7;break _d}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}f=c;q=q?p:!p}g=q;c=d+s|0;q=H[c>>2];H[c>>2]=q+((g|0)==(q>>>31|0)?u:r);k=k|8388608}if((k&134218752)==1024){j=ea+((k&67108864?16:k&31680?15:14)<<2)|0;g=H[j>>2];c=H[g>>2];f=f-c|0;$d:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[g+4>>2];if(f&32768){break $d}p=H[g+4>>2];c=c>>>0>f>>>0;H[j>>2]=H[g+(c?12:8)>>2];while(1){ae:{if(i){break ae}g=H[e+16>>2];q=g+1|0;t=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=q;i=8;b=(t<<8)+b|0;break ae}if(t>>>0<=143){H[e+16>>2]=q;b=(t<<9)+b|0;i=7;break ae}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;f=f<<1;if(f>>>0<32768){continue}break}q=c?!p:p;break $d}p=H[g+4>>2];q=c>>>0>f>>>0;H[j>>2]=H[g+(q?8:12)>>2];while(1){be:{if(i){break be}g=H[e+16>>2];f=g+1|0;t=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=f;i=8;b=(t<<8)+b|0;break be}if(t>>>0<=143){H[e+16>>2]=f;b=(t<<9)+b|0;i=7;break be}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}f=c;q=q?p:!p}g=q;c=d+n|0;q=H[c>>2];H[c>>2]=q+((g|0)==(q>>>31|0)?u:r);k=k|67108864}if((k&1073750016)==8192){j=ea+((k&536870912?16:k&253440?15:14)<<2)|0;g=H[j>>2];c=H[g>>2];f=f-c|0;ce:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[g+4>>2];if(f&32768){break ce}p=H[g+4>>2];c=c>>>0>f>>>0;H[j>>2]=H[g+(c?12:8)>>2];while(1){de:{if(i){break de}g=H[e+16>>2];q=g+1|0;t=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=q;i=8;b=(t<<8)+b|0;break de}if(t>>>0<=143){H[e+16>>2]=q;b=(t<<9)+b|0;i=7;break de}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;f=f<<1;if(f>>>0<32768){continue}break}q=c?!p:p;break ce}p=H[g+4>>2];q=c>>>0>f>>>0;H[j>>2]=H[g+(q?8:12)>>2];while(1){ee:{if(i){break ee}g=H[e+16>>2];f=g+1|0;t=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=f;i=8;b=(t<<8)+b|0;break ee}if(t>>>0<=143){H[e+16>>2]=f;b=(t<<9)+b|0;i=7;break ee}H[e+12>>2]=H[e+12>>2]+1;b=b+65280|0;i=8}i=i-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}f=c;q=q?p:!p}g=q;c=d+h|0;q=H[c>>2];H[c>>2]=q+((g|0)==(q>>>31|0)?u:r);k=k|536870912}H[l>>2]=k}g=l+4|0;d=d+4|0;m=m+1|0;if((v|0)!=(m|0)){continue}break}g=l+12|0;d=d+h|0;o=o+4|0;c=H[e+128>>2];if(o>>>0<(c&-4)>>>0){continue}break}break Ud}l=(c&-4)-1|0;o=(l&-4)+4|0;g=(k+(l<<1&-8)|0)+20|0}H[e+8>>2]=i;H[e+4>>2]=f;H[e>>2]=b;H[e+104>>2]=j;if(!v|c>>>0<=o>>>0){break _a}R=0;l=0-r|0;b=c;while(1){fe:{if((b|0)==(o|0)){b=o;break fe}i=H[g>>2];h=0;while(1){m=N(h,3);if((2097168<>>m|0;k=ea+((b&1048576?16:b&495?15:14)<<2)|0;H[e+104>>2]=k;q=H[k>>2];b=H[q>>2];c=H[e+4>>2]-b|0;H[e+4>>2]=c;f=H[e>>2];ge:{if(f>>>16>>>0>>0){n=H[q+4>>2];H[e+4>>2]=b;c=b>>>0>c>>>0;H[k>>2]=H[q+(c?8:12)>>2];i=H[e+8>>2];while(1){he:{if(i){break he}q=H[e+16>>2];k=q+1|0;s=I[q+1|0];if(I[q|0]==255){if(s>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;f=f+65280|0;i=8;break he}H[e+16>>2]=k;f=(s<<9)+f|0;i=7;break he}H[e+16>>2]=k;i=8;f=(s<<8)+f|0}i=i-1|0;H[e+8>>2]=i;f=f<<1;H[e>>2]=f;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}c=c?n:!n;break ge}f=f-(b<<16)|0;H[e>>2]=f;if(!(c&32768)){n=H[q+4>>2];b=b>>>0>c>>>0;H[k>>2]=H[q+(b?12:8)>>2];i=H[e+8>>2];while(1){ie:{if(i){break ie}q=H[e+16>>2];k=q+1|0;s=I[q+1|0];if(I[q|0]==255){if(s>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;f=f+65280|0;i=8;break ie}H[e+16>>2]=k;f=(s<<9)+f|0;i=7;break ie}H[e+16>>2]=k;i=8;f=(s<<8)+f|0}i=i-1|0;H[e+8>>2]=i;f=f<<1;H[e>>2]=f;c=c<<1;H[e+4>>2]=c;if(c>>>0<32768){continue}break}c=b?!n:n;break ge}c=H[q+4>>2]}b=H[j>>2];H[j>>2]=((c|0)==(b>>>31|0)?l:r)+b;i=H[g>>2]|1048576<>2]=i;c=H[e+128>>2]}h=h+1|0;b=c;if(h>>>0>>0){continue}break}}g=g+4|0;d=d+4|0;R=R+1|0;if((v|0)!=(R|0)){continue}break};break _a;case 1:break $a}}R=0;s=0;je:{ke:{le:{Y=H[e+124>>2];if(!((Y|0)!=64|H[e+128>>2]!=64)){b=1<>>1|b;r=0-v|0;q=e+100|0;l=e+96|0;C=e+28|0;f=H[e+120>>2]+268|0;h=H[e+8>>2];b=H[e+4>>2];d=H[e>>2];k=H[e+104>>2];c=H[e+116>>2];if(Z&8){break le}while(1){t=0;while(1){j=c;g=f;f=H[f>>2];me:{ne:{oe:{if(!f){k=H[l>>2];f=H[k>>2];b=b-f|0;pe:{if(d>>>16>>>0>>0){n=H[k+4>>2];c=b>>>0>>0;H[l>>2]=H[k+(c?8:12)>>2];while(1){qe:{if(h){break qe}k=H[e+16>>2];b=k+1|0;o=I[k+1|0];if(I[k|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break qe}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break qe}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;c=c?n:!n;break pe}d=d-(f<<16)|0;if(!(b&32768)){n=H[k+4>>2];c=b>>>0>>0;H[l>>2]=H[k+(c?12:8)>>2];while(1){re:{if(h){break re}k=H[e+16>>2];f=k+1|0;o=I[k+1|0];if(I[k|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break re}H[e+16>>2]=f;d=(o<<9)+d|0;h=7;break re}H[e+16>>2]=f;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break pe}c=H[k+4>>2]}if(!c){k=l;break me}c=H[q>>2];f=H[c>>2];b=b-f|0;se:{if(d>>>16>>>0>>0){o=H[c+4>>2];k=b>>>0>>0;c=H[(k?8:12)+c>>2];H[q>>2]=c;while(1){te:{if(h){break te}n=H[e+16>>2];b=n+1|0;i=I[n+1|0];if(I[n|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break te}H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break te}H[e+16>>2]=b;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;n=k?o:!o;break se}d=d-(f<<16)|0;if(!(b&32768)){o=H[c+4>>2];f=b>>>0>>0;c=H[(f?12:8)+c>>2];H[q>>2]=c;while(1){ue:{if(h){break ue}n=H[e+16>>2];k=n+1|0;i=I[n+1|0];if(I[n|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ue}H[e+16>>2]=k;d=(i<<9)+d|0;h=7;break ue}H[e+16>>2]=k;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=f?!o:o;break se}n=H[c+4>>2]}f=H[c>>2];b=b-f|0;ve:{if(d>>>16>>>0>>0){o=H[c+4>>2];k=c;c=b>>>0>>0;H[q>>2]=H[k+(c?8:12)>>2];while(1){we:{if(h){break we}k=H[e+16>>2];b=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break we}H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break we}H[e+16>>2]=b;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;c=c?o:!o;break ve}d=d-(f<<16)|0;if(!(b&32768)){o=H[c+4>>2];k=c;c=b>>>0>>0;H[q>>2]=H[k+(c?12:8)>>2];while(1){xe:{if(h){break xe}k=H[e+16>>2];f=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break xe}H[e+16>>2]=f;d=(i<<9)+d|0;h=7;break xe}H[e+16>>2]=f;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!o:o;break ve}c=H[c+4>>2]}f=0;k=q;ye:{ze:{Ae:{Be:{Ce:{switch(c|n<<1){case 0:i=g-4|0;k=H[g+4>>2]>>>17&4|H[i>>2]>>>19&1;c=C+(I[k+24384|0]<<2)|0;n=H[c>>2];f=H[n>>2];b=b-f|0;De:{if(d>>>16>>>0>>0){o=H[n+4>>2];z=c;c=b>>>0>>0;H[z>>2]=H[n+(c?8:12)>>2];while(1){Ee:{if(h){break Ee}n=H[e+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ee}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Ee}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;n=c?o:!o;break De}d=d-(f<<16)|0;if(!(b&32768)){o=H[n+4>>2];z=c;c=b>>>0>>0;H[z>>2]=H[n+(c?12:8)>>2];while(1){Fe:{if(h){break Fe}n=H[e+16>>2];f=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Fe}H[e+16>>2]=f;d=(m<<9)+d|0;h=7;break Fe}H[e+16>>2]=f;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!o:o;break De}n=H[n+4>>2]}f=I[k+24640|0];H[j>>2]=(n|0)==(f|0)?v:r;H[i>>2]=H[i>>2]|32;H[g+4>>2]=H[g+4>>2]|8;c=g-268|0;H[c>>2]=H[c>>2]|131072;c=g-260|0;H[c>>2]=H[c>>2]|32768;c=g-264|0;k=c;i=H[c>>2];c=f^n;H[k>>2]=i|c<<31|65536;k=c<<19;i=H[e+108>>2];c=C+(I[i+2|0]<<2)|0;n=H[c>>2];f=H[n>>2];b=b-f|0;Ge:{if(d>>>16>>>0>>0){o=H[n+4>>2];z=c;c=b>>>0>>0;H[z>>2]=H[n+(c?8:12)>>2];while(1){He:{if(h){break He}n=H[e+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break He}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break He}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;c=c?o:!o;break Ge}d=d-(f<<16)|0;if(!(b&32768)){o=H[n+4>>2];z=c;c=b>>>0>>0;H[z>>2]=H[n+(c?12:8)>>2];while(1){Ie:{if(h){break Ie}n=H[e+16>>2];f=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ie}H[e+16>>2]=f;d=(m<<9)+d|0;h=7;break Ie}H[e+16>>2]=f;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!o:o;break Ge}c=H[n+4>>2]}f=k|16;if(!c){break Be}break;case 1:break Ce;case 2:break Ae;case 3:break ye;default:break ne}}m=g-4|0;n=H[g+4>>2]>>>20&4|(H[m>>2]>>>22&1|(f>>>15&16|(f>>>19&64|f>>>3&170)));k=C+(I[n+24384|0]<<2)|0;o=H[k>>2];c=H[o>>2];b=b-c|0;Je:{if(d>>>16>>>0>>0){i=H[o+4>>2];z=k;k=b>>>0>>0;H[z>>2]=H[o+(k?8:12)>>2];while(1){Ke:{if(h){break Ke}o=H[e+16>>2];b=o+1|0;p=I[o+1|0];if(I[o|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ke}H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Ke}H[e+16>>2]=b;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;k=k?i:!i;break Je}d=d-(c<<16)|0;if(!(b&32768)){i=H[o+4>>2];c=b>>>0>>0;H[k>>2]=H[o+(c?12:8)>>2];while(1){Le:{if(h){break Le}o=H[e+16>>2];k=o+1|0;p=I[o+1|0];if(I[o|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Le}H[e+16>>2]=k;d=(p<<9)+d|0;h=7;break Le}H[e+16>>2]=k;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=c?!i:i;break Je}k=H[o+4>>2]}c=I[n+24640|0];H[j+256>>2]=(k|0)==(c|0)?v:r;H[m>>2]=H[m>>2]|256;H[g+4>>2]=H[g+4>>2]|64;i=H[e+108>>2];f=(c^k)<<22|f|128}k=C+(I[(f>>>6&495)+i|0]<<2)|0;n=H[k>>2];c=H[n>>2];b=b-c|0;Me:{if(d>>>16>>>0>>0){o=H[n+4>>2];z=k;k=b>>>0>>0;H[z>>2]=H[n+(k?8:12)>>2];while(1){Ne:{if(h){break Ne}n=H[e+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ne}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Ne}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=k?o:!o;break Me}d=d-(c<<16)|0;if(!(b&32768)){o=H[n+4>>2];c=b>>>0>>0;H[k>>2]=H[n+(c?12:8)>>2];while(1){Oe:{if(h){break Oe}n=H[e+16>>2];k=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Oe}H[e+16>>2]=k;d=(m<<9)+d|0;h=7;break Oe}H[e+16>>2]=k;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!o:o;break Me}c=H[n+4>>2]}if(!c){break ze}}m=g-4|0;n=H[g+4>>2]>>>23&4|(H[m>>2]>>>25&1|(f>>>18&16|(f>>>22&64|f>>>6&170)));k=C+(I[n+24384|0]<<2)|0;o=H[k>>2];c=H[o>>2];b=b-c|0;Pe:{if(d>>>16>>>0>>0){i=H[o+4>>2];z=k;k=b>>>0>>0;H[z>>2]=H[o+(k?8:12)>>2];while(1){Qe:{if(h){break Qe}o=H[e+16>>2];b=o+1|0;p=I[o+1|0];if(I[o|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Qe}H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Qe}H[e+16>>2]=b;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;k=k?i:!i;break Pe}d=d-(c<<16)|0;if(!(b&32768)){i=H[o+4>>2];c=b>>>0>>0;H[k>>2]=H[o+(c?12:8)>>2];while(1){Re:{if(h){break Re}o=H[e+16>>2];k=o+1|0;p=I[o+1|0];if(I[o|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Re}H[e+16>>2]=k;d=(p<<9)+d|0;h=7;break Re}H[e+16>>2]=k;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=c?!i:i;break Pe}k=H[o+4>>2]}c=I[n+24640|0];H[j+512>>2]=(k|0)==(c|0)?v:r;H[m>>2]=H[m>>2]|2048;H[g+4>>2]=H[g+4>>2]|512;f=(c^k)<<25|f|1024;i=H[e+108>>2]}k=C+(I[(f>>>9&495)+i|0]<<2)|0;o=H[k>>2];c=H[o>>2];b=b-c|0;Se:{if(d>>>16>>>0>>0){i=H[o+4>>2];n=b>>>0>>0;H[k>>2]=H[o+(n?8:12)>>2];while(1){Te:{if(h){break Te}o=H[e+16>>2];b=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Te}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Te}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?i:!i;break Se}d=d-(c<<16)|0;if(!(b&32768)){i=H[o+4>>2];c=b>>>0>>0;H[k>>2]=H[o+(c?12:8)>>2];while(1){Ue:{if(h){break Ue}o=H[e+16>>2];n=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ue}H[e+16>>2]=n;d=(m<<9)+d|0;h=7;break Ue}H[e+16>>2]=n;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!i:i;break Se}c=H[o+4>>2]}if(!c){break ne}}R=g-4|0;u=H[g+4>>2]>>>26&4|(H[R>>2]>>>28&1|(f>>>21&16|(f>>>25&64|f>>>9&170)));k=C+(I[u+24384|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;break oe}Ve:{if(f&2097168){break Ve}k=C+(I[H[e+108>>2]+(f&495)|0]<<2)|0;o=H[k>>2];c=H[o>>2];b=b-c|0;We:{if(d>>>16>>>0>>0){i=H[o+4>>2];n=b>>>0>>0;H[k>>2]=H[o+(n?8:12)>>2];while(1){Xe:{if(h){break Xe}o=H[e+16>>2];b=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Xe}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Xe}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?i:!i;break We}d=d-(c<<16)|0;if(!(b&32768)){i=H[o+4>>2];c=b>>>0>>0;H[k>>2]=H[o+(c?12:8)>>2];while(1){Ye:{if(h){break Ye}o=H[e+16>>2];n=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ye}H[e+16>>2]=n;d=(m<<9)+d|0;h=7;break Ye}H[e+16>>2]=n;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!i:i;break We}c=H[o+4>>2]}if(!c){break Ve}p=g-4|0;o=H[g+4>>2]>>>17&4|(H[p>>2]>>>19&1|(f>>>14&16|(f>>>16&64|f&170)));k=C+(I[o+24384|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;Ze:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[i+(n?8:12)>>2];while(1){_e:{if(h){break _e}i=H[e+16>>2];b=i+1|0;u=I[i+1|0];if(I[i|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break _e}H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break _e}H[e+16>>2]=b;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=n?m:!m;break Ze}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){$e:{if(h){break $e}i=H[e+16>>2];n=i+1|0;u=I[i+1|0];if(I[i|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break $e}H[e+16>>2]=n;d=(u<<9)+d|0;h=7;break $e}H[e+16>>2]=n;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!m:m;break Ze}i=H[i+4>>2]}n=I[o+24640|0];H[j>>2]=(i|0)==(n|0)?v:r;H[p>>2]=H[p>>2]|32;H[g+4>>2]=H[g+4>>2]|8;c=g-268|0;H[c>>2]=H[c>>2]|131072;c=g-260|0;H[c>>2]=H[c>>2]|32768;c=g-264|0;o=c;z=H[c>>2];c=i^n;H[o>>2]=z|c<<31|65536;f=c<<19|f|16}af:{if(f&16777344){break af}o=f>>>3|0;k=C+(I[H[e+108>>2]+(o&495)|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;bf:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[i+(n?8:12)>>2];while(1){cf:{if(h){break cf}i=H[e+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break cf}H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break cf}H[e+16>>2]=b;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break bf}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){df:{if(h){break df}i=H[e+16>>2];n=i+1|0;p=I[i+1|0];if(I[i|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break df}H[e+16>>2]=n;d=(p<<9)+d|0;h=7;break df}H[e+16>>2]=n;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break bf}c=H[i+4>>2]}if(!c){break af}p=g-4|0;o=H[g+4>>2]>>>20&4|(H[p>>2]>>>22&1|(f>>>15&16|(f>>>19&64|o&170)));k=C+(I[o+24384|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;ef:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[i+(n?8:12)>>2];while(1){ff:{if(h){break ff}i=H[e+16>>2];b=i+1|0;u=I[i+1|0];if(I[i|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ff}H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break ff}H[e+16>>2]=b;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break ef}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){gf:{if(h){break gf}i=H[e+16>>2];n=i+1|0;u=I[i+1|0];if(I[i|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break gf}H[e+16>>2]=n;d=(u<<9)+d|0;h=7;break gf}H[e+16>>2]=n;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break ef}n=H[i+4>>2]}c=I[o+24640|0];H[j+256>>2]=(n|0)==(c|0)?v:r;H[p>>2]=H[p>>2]|256;H[g+4>>2]=H[g+4>>2]|64;f=(c^n)<<22|f|128}hf:{if(f&134218752){break hf}o=f>>>6|0;k=C+(I[H[e+108>>2]+(o&495)|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;jf:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[i+(n?8:12)>>2];while(1){kf:{if(h){break kf}i=H[e+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break kf}H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break kf}H[e+16>>2]=b;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break jf}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){lf:{if(h){break lf}i=H[e+16>>2];n=i+1|0;p=I[i+1|0];if(I[i|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break lf}H[e+16>>2]=n;d=(p<<9)+d|0;h=7;break lf}H[e+16>>2]=n;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break jf}c=H[i+4>>2]}if(!c){break hf}p=g-4|0;o=H[g+4>>2]>>>23&4|(H[p>>2]>>>25&1|(f>>>18&16|(f>>>22&64|o&170)));k=C+(I[o+24384|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;mf:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[i+(n?8:12)>>2];while(1){nf:{if(h){break nf}i=H[e+16>>2];b=i+1|0;u=I[i+1|0];if(I[i|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break nf}H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break nf}H[e+16>>2]=b;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break mf}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){of:{if(h){break of}i=H[e+16>>2];n=i+1|0;u=I[i+1|0];if(I[i|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break of}H[e+16>>2]=n;d=(u<<9)+d|0;h=7;break of}H[e+16>>2]=n;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break mf}n=H[i+4>>2]}c=I[o+24640|0];H[j+512>>2]=(n|0)==(c|0)?v:r;H[p>>2]=H[p>>2]|2048;H[g+4>>2]=H[g+4>>2]|512;f=(c^n)<<25|f|1024}if(f&1073750016){break ne}o=f>>>9|0;k=C+(I[H[e+108>>2]+(o&495)|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;pf:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[i+(n?8:12)>>2];while(1){qf:{if(h){break qf}i=H[e+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break qf}H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break qf}H[e+16>>2]=b;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break pf}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){rf:{if(h){break rf}i=H[e+16>>2];n=i+1|0;p=I[i+1|0];if(I[i|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break rf}H[e+16>>2]=n;d=(p<<9)+d|0;h=7;break rf}H[e+16>>2]=n;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break pf}c=H[i+4>>2]}if(!c){break ne}R=g-4|0;u=H[g+4>>2]>>>26&4|(H[R>>2]>>>28&1|(f>>>21&16|(f>>>25&64|o&170)));k=C+(I[u+24384|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0}sf:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[(n?8:12)+i>>2];while(1){tf:{if(h){break tf}o=H[e+16>>2];b=o+1|0;i=I[o+1|0];if(I[o|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break tf}H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break tf}H[e+16>>2]=b;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break sf}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[(c?12:8)+i>>2];while(1){uf:{if(h){break uf}o=H[e+16>>2];n=o+1|0;i=I[o+1|0];if(I[o|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break uf}H[e+16>>2]=n;d=(i<<9)+d|0;h=7;break uf}H[e+16>>2]=n;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break sf}n=H[i+4>>2]}c=I[u+24640|0];H[j+768>>2]=(n|0)==(c|0)?v:r;H[R>>2]=H[R>>2]|16384;H[g+4>>2]=H[g+4>>2]|4096;H[g+260>>2]=H[g+260>>2]|4;H[g+268>>2]=H[g+268>>2]|1;c=c^n;H[g+264>>2]=H[g+264>>2]|c<<18|2;f=c<<28|f|8192}H[g>>2]=f&-1226833921}f=g+4|0;c=j+4|0;t=t+1|0;if((t|0)!=64){continue}break}f=g+12|0;c=j+772|0;n=s>>>0<60;s=s+4|0;if(n){continue}break}break ke}b=1<>>1|b;l=H[e+120>>2];c=(l+(Y<<2)|0)+12|0;f=H[e+128>>2];h=H[e+8>>2];b=H[e+4>>2];d=H[e>>2];k=H[e+104>>2];o=H[e+116>>2];if(Z&8){vf:{if(f>>>0<4){break vf}if(Y){n=e+100|0;q=e+96|0;r=N(Y,12);t=Y<<3;C=0-z|0;D=e+28|0;while(1){v=0;while(1){j=c;c=H[c>>2];wf:{xf:{yf:{if(c){zf:{if(c&2097168){break zf}k=D+(I[H[e+108>>2]+(c&495)|0]<<2)|0;g=H[k>>2];f=H[g>>2];b=b-f|0;Af:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[g+4>>2];if(b&32768){break Af}i=H[g+4>>2];f=b>>>0>>0;H[k>>2]=H[g+(f?12:8)>>2];while(1){Bf:{if(h){break Bf}g=H[e+16>>2];l=g+1|0;m=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=l;h=8;d=(m<<8)+d|0;break Bf}if(m>>>0<=143){H[e+16>>2]=l;d=(m<<9)+d|0;h=7;break Bf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!i:i;break Af}i=H[g+4>>2];l=b>>>0>>0;H[k>>2]=H[g+(l?8:12)>>2];while(1){Cf:{if(h){break Cf}g=H[e+16>>2];b=g+1|0;m=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break Cf}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Cf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?i:!i}if(!l){break zf}p=j-4|0;g=H[j+4>>2]>>>17&4|(H[p>>2]>>>19&1|(c>>>14&16|(c>>>16&64|c&170)));k=D+(I[g+24384|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;Df:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break Df}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[i+(f?12:8)>>2];while(1){Ef:{if(h){break Ef}i=H[e+16>>2];l=i+1|0;u=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(u<<8)+d|0;break Ef}if(u>>>0<=143){H[e+16>>2]=l;d=(u<<9)+d|0;h=7;break Ef}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break Df}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[i+(l?8:12)>>2];while(1){Ff:{if(h){break Ff}i=H[e+16>>2];b=i+1|0;u=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(u<<8)+d|0;break Ff}if(u>>>0<=143){H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break Ff}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}f=I[g+24640|0];H[o>>2]=(l|0)==(f|0)?z:C;H[p>>2]=H[p>>2]|32;H[j+4>>2]=H[j+4>>2]|8;c=(f^l)<<19|c|16}Gf:{if(c&16777344){break Gf}g=c>>>3|0;k=D+(I[H[e+108>>2]+(g&495)|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;Hf:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break Hf}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[i+(f?12:8)>>2];while(1){If:{if(h){break If}i=H[e+16>>2];l=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(p<<8)+d|0;break If}if(p>>>0<=143){H[e+16>>2]=l;d=(p<<9)+d|0;h=7;break If}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break Hf}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[i+(l?8:12)>>2];while(1){Jf:{if(h){break Jf}i=H[e+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(p<<8)+d|0;break Jf}if(p>>>0<=143){H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Jf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}if(!l){break Gf}p=j-4|0;g=H[j+4>>2]>>>20&4|(H[p>>2]>>>22&1|(c>>>15&16|(c>>>19&64|g&170)));k=D+(I[g+24384|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;A=(Y<<2)+o|0;Kf:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break Kf}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[i+(f?12:8)>>2];while(1){Lf:{if(h){break Lf}i=H[e+16>>2];l=i+1|0;u=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(u<<8)+d|0;break Lf}if(u>>>0<=143){H[e+16>>2]=l;d=(u<<9)+d|0;h=7;break Lf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break Kf}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[i+(l?8:12)>>2];while(1){Mf:{if(h){break Mf}i=H[e+16>>2];b=i+1|0;u=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(u<<8)+d|0;break Mf}if(u>>>0<=143){H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break Mf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}f=I[g+24640|0];H[A>>2]=(l|0)==(f|0)?z:C;H[p>>2]=H[p>>2]|256;H[j+4>>2]=H[j+4>>2]|64;c=(f^l)<<22|c|128}Nf:{if(c&134218752){break Nf}g=c>>>6|0;k=D+(I[H[e+108>>2]+(g&495)|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;Of:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break Of}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[i+(f?12:8)>>2];while(1){Pf:{if(h){break Pf}i=H[e+16>>2];l=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(p<<8)+d|0;break Pf}if(p>>>0<=143){H[e+16>>2]=l;d=(p<<9)+d|0;h=7;break Pf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break Of}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[i+(l?8:12)>>2];while(1){Qf:{if(h){break Qf}i=H[e+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(p<<8)+d|0;break Qf}if(p>>>0<=143){H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Qf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}if(!l){break Nf}p=j-4|0;g=H[j+4>>2]>>>23&4|(H[p>>2]>>>25&1|(c>>>18&16|(c>>>22&64|g&170)));k=D+(I[g+24384|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;A=o+t|0;Rf:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break Rf}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[i+(f?12:8)>>2];while(1){Sf:{if(h){break Sf}i=H[e+16>>2];l=i+1|0;u=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(u<<8)+d|0;break Sf}if(u>>>0<=143){H[e+16>>2]=l;d=(u<<9)+d|0;h=7;break Sf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break Rf}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[i+(l?8:12)>>2];while(1){Tf:{if(h){break Tf}i=H[e+16>>2];b=i+1|0;u=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(u<<8)+d|0;break Tf}if(u>>>0<=143){H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break Tf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}f=I[g+24640|0];H[A>>2]=(l|0)==(f|0)?z:C;H[p>>2]=H[p>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(f^l)<<25|c|1024}if(c&1073750016){break xf}g=c>>>9|0;k=D+(I[H[e+108>>2]+(g&495)|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;Uf:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break Uf}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[i+(f?12:8)>>2];while(1){Vf:{if(h){break Vf}i=H[e+16>>2];l=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(p<<8)+d|0;break Vf}if(p>>>0<=143){H[e+16>>2]=l;d=(p<<9)+d|0;h=7;break Vf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break Uf}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[i+(l?8:12)>>2];while(1){Wf:{if(h){break Wf}i=H[e+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(p<<8)+d|0;break Wf}if(p>>>0<=143){H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Wf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}if(!l){break xf}u=j-4|0;X=H[j+4>>2]>>>26&4|(H[u>>2]>>>28&1|(c>>>21&16|(c>>>25&64|g&170)));k=D+(I[X+24384|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;break yf}l=H[q>>2];c=H[l>>2];b=b-c|0;Xf:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;f=H[l+4>>2];if(b&32768){break Xf}k=H[l+4>>2];c=b>>>0>>0;H[q>>2]=H[l+(c?12:8)>>2];while(1){Yf:{if(h){break Yf}l=H[e+16>>2];f=l+1|0;g=I[l+1|0];if(I[l|0]!=255){H[e+16>>2]=f;h=8;d=(g<<8)+d|0;break Yf}if(g>>>0<=143){H[e+16>>2]=f;d=(g<<9)+d|0;h=7;break Yf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=c?!k:k;break Xf}k=H[l+4>>2];f=b>>>0>>0;H[q>>2]=H[l+(f?8:12)>>2];while(1){Zf:{if(h){break Zf}l=H[e+16>>2];b=l+1|0;g=I[l+1|0];if(I[l|0]!=255){H[e+16>>2]=b;h=8;d=(g<<8)+d|0;break Zf}if(g>>>0<=143){H[e+16>>2]=b;d=(g<<9)+d|0;h=7;break Zf}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;f=f?k:!k}if(!f){k=q;break wf}f=H[n>>2];c=H[f>>2];b=b-c|0;_f:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;l=H[f+4>>2];if(b&32768){break _f}g=H[f+4>>2];c=b>>>0>>0;f=H[(c?12:8)+f>>2];H[n>>2]=f;while(1){$f:{if(h){break $f}k=H[e+16>>2];l=k+1|0;i=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=l;h=8;d=(i<<8)+d|0;break $f}if(i>>>0<=143){H[e+16>>2]=l;d=(i<<9)+d|0;h=7;break $f}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=c?!g:g;break _f}g=H[f+4>>2];l=b>>>0>>0;f=H[(l?8:12)+f>>2];H[n>>2]=f;while(1){ag:{if(h){break ag}k=H[e+16>>2];b=k+1|0;i=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=b;h=8;d=(i<<8)+d|0;break ag}if(i>>>0<=143){H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break ag}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;l=l?g:!g}c=H[f>>2];b=b-c|0;bg:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;k=H[f+4>>2];if(b&32768){break bg}g=H[f+4>>2];c=b>>>0>>0;H[n>>2]=H[(c?12:8)+f>>2];while(1){cg:{if(h){break cg}k=H[e+16>>2];f=k+1|0;i=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=f;h=8;d=(i<<8)+d|0;break cg}if(i>>>0<=143){H[e+16>>2]=f;d=(i<<9)+d|0;h=7;break cg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=c?!g:g;break bg}g=H[f+4>>2];k=f;f=b>>>0>>0;H[n>>2]=H[k+(f?8:12)>>2];while(1){dg:{if(h){break dg}k=H[e+16>>2];b=k+1|0;i=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=b;h=8;d=(i<<8)+d|0;break dg}if(i>>>0<=143){H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break dg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;k=f?g:!g}f=k;c=0;k=n;eg:{fg:{gg:{hg:{ig:{switch(f|l<<1){case 0:i=j-4|0;l=H[j+4>>2]>>>17&4|H[i>>2]>>>19&1;f=D+(I[l+24384|0]<<2)|0;k=H[f>>2];c=H[k>>2];b=b-c|0;jg:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[k+4>>2];if(b&32768){break jg}g=H[k+4>>2];c=b>>>0>>0;H[f>>2]=H[k+(c?12:8)>>2];while(1){kg:{if(h){break kg}k=H[e+16>>2];f=k+1|0;m=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=f;h=8;d=(m<<8)+d|0;break kg}if(m>>>0<=143){H[e+16>>2]=f;d=(m<<9)+d|0;h=7;break kg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!g:g;break jg}g=H[k+4>>2];m=f;f=b>>>0>>0;H[m>>2]=H[k+(f?8:12)>>2];while(1){lg:{if(h){break lg}k=H[e+16>>2];b=k+1|0;m=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break lg}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break lg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=f?g:!g}f=g;c=I[l+24640|0];H[o>>2]=(f|0)==(c|0)?z:C;H[i>>2]=H[i>>2]|32;H[j+4>>2]=H[j+4>>2]|8;l=(c^f)<<19;i=H[e+108>>2];f=D+(I[i+2|0]<<2)|0;k=H[f>>2];c=H[k>>2];b=b-c|0;mg:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[k+4>>2];if(b&32768){break mg}g=H[k+4>>2];c=b>>>0>>0;H[f>>2]=H[k+(c?12:8)>>2];while(1){ng:{if(h){break ng}k=H[e+16>>2];f=k+1|0;m=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=f;h=8;d=(m<<8)+d|0;break ng}if(m>>>0<=143){H[e+16>>2]=f;d=(m<<9)+d|0;h=7;break ng}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!g:g;break mg}g=H[k+4>>2];m=f;f=b>>>0>>0;H[m>>2]=H[k+(f?8:12)>>2];while(1){og:{if(h){break og}k=H[e+16>>2];b=k+1|0;m=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break og}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break og}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=f?g:!g}f=g;c=l|16;if(!f){break hg}break;case 1:break ig;case 2:break gg;case 3:break eg;default:break xf}}m=j-4|0;k=H[j+4>>2]>>>20&4|(H[m>>2]>>>22&1|(c>>>15&16|(c>>>19&64|c>>>3&170)));l=D+(I[k+24384|0]<<2)|0;g=H[l>>2];f=H[g>>2];b=b-f|0;u=(Y<<2)+o|0;pg:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;i=H[g+4>>2];if(b&32768){break pg}i=H[g+4>>2];f=b>>>0>>0;H[l>>2]=H[g+(f?12:8)>>2];while(1){qg:{if(h){break qg}g=H[e+16>>2];l=g+1|0;p=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=l;h=8;d=(p<<8)+d|0;break qg}if(p>>>0<=143){H[e+16>>2]=l;d=(p<<9)+d|0;h=7;break qg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=f?!i:i;break pg}i=H[g+4>>2];p=l;l=b>>>0>>0;H[p>>2]=H[g+(l?8:12)>>2];while(1){rg:{if(h){break rg}g=H[e+16>>2];b=g+1|0;p=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=b;h=8;d=(p<<8)+d|0;break rg}if(p>>>0<=143){H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break rg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;i=l?i:!i}l=i;f=I[k+24640|0];H[u>>2]=(l|0)==(f|0)?z:C;H[m>>2]=H[m>>2]|256;H[j+4>>2]=H[j+4>>2]|64;i=H[e+108>>2];c=(f^l)<<22|c|128}l=D+(I[(c>>>6&495)+i|0]<<2)|0;k=H[l>>2];f=H[k>>2];b=b-f|0;sg:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;g=H[k+4>>2];if(b&32768){break sg}g=H[k+4>>2];f=b>>>0>>0;H[l>>2]=H[k+(f?12:8)>>2];while(1){tg:{if(h){break tg}k=H[e+16>>2];l=k+1|0;m=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=l;h=8;d=(m<<8)+d|0;break tg}if(m>>>0<=143){H[e+16>>2]=l;d=(m<<9)+d|0;h=7;break tg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=f?!g:g;break sg}g=H[k+4>>2];m=l;l=b>>>0>>0;H[m>>2]=H[k+(l?8:12)>>2];while(1){ug:{if(h){break ug}k=H[e+16>>2];b=k+1|0;m=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break ug}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break ug}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;g=l?g:!g}if(!g){break fg}}m=j-4|0;k=H[j+4>>2]>>>23&4|(H[m>>2]>>>25&1|(c>>>18&16|(c>>>22&64|c>>>6&170)));l=D+(I[k+24384|0]<<2)|0;g=H[l>>2];f=H[g>>2];b=b-f|0;u=o+t|0;vg:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;i=H[g+4>>2];if(b&32768){break vg}i=H[g+4>>2];f=b>>>0>>0;H[l>>2]=H[g+(f?12:8)>>2];while(1){wg:{if(h){break wg}g=H[e+16>>2];l=g+1|0;p=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=l;h=8;d=(p<<8)+d|0;break wg}if(p>>>0<=143){H[e+16>>2]=l;d=(p<<9)+d|0;h=7;break wg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=f?!i:i;break vg}i=H[g+4>>2];p=l;l=b>>>0>>0;H[p>>2]=H[g+(l?8:12)>>2];while(1){xg:{if(h){break xg}g=H[e+16>>2];b=g+1|0;p=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=b;h=8;d=(p<<8)+d|0;break xg}if(p>>>0<=143){H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break xg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;i=l?i:!i}l=i;f=I[k+24640|0];H[u>>2]=(l|0)==(f|0)?z:C;H[m>>2]=H[m>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(f^l)<<25|c|1024;i=H[e+108>>2]}k=D+(I[(c>>>9&495)+i|0]<<2)|0;g=H[k>>2];f=H[g>>2];b=b-f|0;yg:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[g+4>>2];if(b&32768){break yg}i=H[g+4>>2];f=b>>>0>>0;H[k>>2]=H[g+(f?12:8)>>2];while(1){zg:{if(h){break zg}g=H[e+16>>2];l=g+1|0;m=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=l;h=8;d=(m<<8)+d|0;break zg}if(m>>>0<=143){H[e+16>>2]=l;d=(m<<9)+d|0;h=7;break zg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!i:i;break yg}i=H[g+4>>2];l=b>>>0>>0;H[k>>2]=H[g+(l?8:12)>>2];while(1){Ag:{if(h){break Ag}g=H[e+16>>2];b=g+1|0;m=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break Ag}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Ag}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?i:!i}if(!l){break xf}}u=j-4|0;X=H[j+4>>2]>>>26&4|(H[u>>2]>>>28&1|(c>>>21&16|(c>>>25&64|c>>>9&170)));k=D+(I[X+24384|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0}p=o+r|0;Bg:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break Bg}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[(f?12:8)+i>>2];while(1){Cg:{if(h){break Cg}g=H[e+16>>2];l=g+1|0;i=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=l;h=8;d=(i<<8)+d|0;break Cg}if(i>>>0<=143){H[e+16>>2]=l;d=(i<<9)+d|0;h=7;break Cg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break Bg}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[(l?8:12)+i>>2];while(1){Dg:{if(h){break Dg}g=H[e+16>>2];b=g+1|0;i=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=b;h=8;d=(i<<8)+d|0;break Dg}if(i>>>0<=143){H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break Dg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}f=I[X+24640|0];H[p>>2]=(l|0)==(f|0)?z:C;H[u>>2]=H[u>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;g=j+(H[e+124>>2]<<2)|0;H[g+4>>2]=H[g+4>>2]|4;H[g+12>>2]=H[g+12>>2]|1;f=f^l;H[g+8>>2]=H[g+8>>2]|f<<18|2;c=f<<28|c|8192}H[j>>2]=c&-1226833921}c=j+4|0;o=o+4|0;v=v+1|0;if((Y|0)!=(v|0)){continue}break}c=j+12|0;o=o+r|0;s=s+4|0;f=H[e+128>>2];if(s>>>0<(f&-4)>>>0){continue}break}break vf}c=(f&-4)-1|0;s=(c&-4)+4|0;c=(l+(c<<1&-8)|0)+20|0}H[e+8>>2]=h;H[e+4>>2]=b;H[e>>2]=d;H[e+104>>2]=k;if(!Y|f>>>0<=s>>>0){break je}while(1){h=0;if(H[e+128>>2]!=(s|0)){while(1){Yb(e,c,(N(h,Y)<<2)+o|0,z,h,1);h=h+1|0;if(h>>>0>2]-s>>>0){continue}break}}H[c>>2]=H[c>>2]&-1226833921;o=o+4|0;c=c+4|0;R=R+1|0;if((Y|0)!=(R|0)){continue}break}break je}Eg:{if(f>>>0<4){break Eg}if(Y){n=e+100|0;q=e+96|0;r=N(Y,12);t=Y<<3;C=0-z|0;D=e+28|0;while(1){v=0;while(1){j=c;c=H[c>>2];Fg:{Gg:{Hg:{if(c){Ig:{if(c&2097168){break Ig}k=D+(I[H[e+108>>2]+(c&495)|0]<<2)|0;g=H[k>>2];f=H[g>>2];b=b-f|0;Jg:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[g+4>>2];if(b&32768){break Jg}i=H[g+4>>2];f=b>>>0>>0;H[k>>2]=H[g+(f?12:8)>>2];while(1){Kg:{if(h){break Kg}g=H[e+16>>2];l=g+1|0;m=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=l;h=8;d=(m<<8)+d|0;break Kg}if(m>>>0<=143){H[e+16>>2]=l;d=(m<<9)+d|0;h=7;break Kg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!i:i;break Jg}i=H[g+4>>2];l=b>>>0>>0;H[k>>2]=H[g+(l?8:12)>>2];while(1){Lg:{if(h){break Lg}g=H[e+16>>2];b=g+1|0;m=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break Lg}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Lg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?i:!i}if(!l){break Ig}p=j-4|0;g=H[j+4>>2]>>>17&4|(H[p>>2]>>>19&1|(c>>>14&16|(c>>>16&64|c&170)));k=D+(I[g+24384|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;Mg:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break Mg}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[i+(f?12:8)>>2];while(1){Ng:{if(h){break Ng}i=H[e+16>>2];l=i+1|0;u=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(u<<8)+d|0;break Ng}if(u>>>0<=143){H[e+16>>2]=l;d=(u<<9)+d|0;h=7;break Ng}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break Mg}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[i+(l?8:12)>>2];while(1){Og:{if(h){break Og}i=H[e+16>>2];b=i+1|0;u=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(u<<8)+d|0;break Og}if(u>>>0<=143){H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break Og}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}f=I[g+24640|0];H[o>>2]=(l|0)==(f|0)?z:C;H[p>>2]=H[p>>2]|32;H[j+4>>2]=H[j+4>>2]|8;g=j+(-2-H[e+124>>2]<<2)|0;H[g+4>>2]=H[g+4>>2]|32768;l=f^l;H[g>>2]=H[g>>2]|l<<31|65536;f=g-4|0;H[f>>2]=H[f>>2]|131072;c=l<<19|c|16}Pg:{if(c&16777344){break Pg}g=c>>>3|0;k=D+(I[H[e+108>>2]+(g&495)|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;Qg:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break Qg}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[i+(f?12:8)>>2];while(1){Rg:{if(h){break Rg}i=H[e+16>>2];l=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(p<<8)+d|0;break Rg}if(p>>>0<=143){H[e+16>>2]=l;d=(p<<9)+d|0;h=7;break Rg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break Qg}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[i+(l?8:12)>>2];while(1){Sg:{if(h){break Sg}i=H[e+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(p<<8)+d|0;break Sg}if(p>>>0<=143){H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Sg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}if(!l){break Pg}p=j-4|0;g=H[j+4>>2]>>>20&4|(H[p>>2]>>>22&1|(c>>>15&16|(c>>>19&64|g&170)));k=D+(I[g+24384|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;A=(Y<<2)+o|0;Tg:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break Tg}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[i+(f?12:8)>>2];while(1){Ug:{if(h){break Ug}i=H[e+16>>2];l=i+1|0;u=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(u<<8)+d|0;break Ug}if(u>>>0<=143){H[e+16>>2]=l;d=(u<<9)+d|0;h=7;break Ug}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break Tg}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[i+(l?8:12)>>2];while(1){Vg:{if(h){break Vg}i=H[e+16>>2];b=i+1|0;u=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(u<<8)+d|0;break Vg}if(u>>>0<=143){H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break Vg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}f=I[g+24640|0];H[A>>2]=(l|0)==(f|0)?z:C;H[p>>2]=H[p>>2]|256;H[j+4>>2]=H[j+4>>2]|64;c=(f^l)<<22|c|128}Wg:{if(c&134218752){break Wg}g=c>>>6|0;k=D+(I[H[e+108>>2]+(g&495)|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;Xg:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break Xg}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[i+(f?12:8)>>2];while(1){Yg:{if(h){break Yg}i=H[e+16>>2];l=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(p<<8)+d|0;break Yg}if(p>>>0<=143){H[e+16>>2]=l;d=(p<<9)+d|0;h=7;break Yg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break Xg}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[i+(l?8:12)>>2];while(1){Zg:{if(h){break Zg}i=H[e+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(p<<8)+d|0;break Zg}if(p>>>0<=143){H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Zg}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}if(!l){break Wg}p=j-4|0;g=H[j+4>>2]>>>23&4|(H[p>>2]>>>25&1|(c>>>18&16|(c>>>22&64|g&170)));k=D+(I[g+24384|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;A=o+t|0;_g:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break _g}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[i+(f?12:8)>>2];while(1){$g:{if(h){break $g}i=H[e+16>>2];l=i+1|0;u=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(u<<8)+d|0;break $g}if(u>>>0<=143){H[e+16>>2]=l;d=(u<<9)+d|0;h=7;break $g}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break _g}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[i+(l?8:12)>>2];while(1){ah:{if(h){break ah}i=H[e+16>>2];b=i+1|0;u=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(u<<8)+d|0;break ah}if(u>>>0<=143){H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break ah}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}f=I[g+24640|0];H[A>>2]=(l|0)==(f|0)?z:C;H[p>>2]=H[p>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(f^l)<<25|c|1024}if(c&1073750016){break Gg}g=c>>>9|0;k=D+(I[H[e+108>>2]+(g&495)|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;bh:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break bh}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[i+(f?12:8)>>2];while(1){ch:{if(h){break ch}i=H[e+16>>2];l=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=l;h=8;d=(p<<8)+d|0;break ch}if(p>>>0<=143){H[e+16>>2]=l;d=(p<<9)+d|0;h=7;break ch}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break bh}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[i+(l?8:12)>>2];while(1){dh:{if(h){break dh}i=H[e+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[e+16>>2]=b;h=8;d=(p<<8)+d|0;break dh}if(p>>>0<=143){H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break dh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}if(!l){break Gg}u=j-4|0;X=H[j+4>>2]>>>26&4|(H[u>>2]>>>28&1|(c>>>21&16|(c>>>25&64|g&170)));k=D+(I[X+24384|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0;break Hg}l=H[q>>2];c=H[l>>2];b=b-c|0;eh:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;f=H[l+4>>2];if(b&32768){break eh}k=H[l+4>>2];c=b>>>0>>0;H[q>>2]=H[l+(c?12:8)>>2];while(1){fh:{if(h){break fh}l=H[e+16>>2];f=l+1|0;g=I[l+1|0];if(I[l|0]!=255){H[e+16>>2]=f;h=8;d=(g<<8)+d|0;break fh}if(g>>>0<=143){H[e+16>>2]=f;d=(g<<9)+d|0;h=7;break fh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=c?!k:k;break eh}k=H[l+4>>2];f=b>>>0>>0;H[q>>2]=H[l+(f?8:12)>>2];while(1){gh:{if(h){break gh}l=H[e+16>>2];b=l+1|0;g=I[l+1|0];if(I[l|0]!=255){H[e+16>>2]=b;h=8;d=(g<<8)+d|0;break gh}if(g>>>0<=143){H[e+16>>2]=b;d=(g<<9)+d|0;h=7;break gh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;f=f?k:!k}if(!f){k=q;break Fg}f=H[n>>2];c=H[f>>2];b=b-c|0;hh:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;l=H[f+4>>2];if(b&32768){break hh}g=H[f+4>>2];c=b>>>0>>0;f=H[(c?12:8)+f>>2];H[n>>2]=f;while(1){ih:{if(h){break ih}k=H[e+16>>2];l=k+1|0;i=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=l;h=8;d=(i<<8)+d|0;break ih}if(i>>>0<=143){H[e+16>>2]=l;d=(i<<9)+d|0;h=7;break ih}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=c?!g:g;break hh}g=H[f+4>>2];l=b>>>0>>0;f=H[(l?8:12)+f>>2];H[n>>2]=f;while(1){jh:{if(h){break jh}k=H[e+16>>2];b=k+1|0;i=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=b;h=8;d=(i<<8)+d|0;break jh}if(i>>>0<=143){H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break jh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;l=l?g:!g}c=H[f>>2];b=b-c|0;kh:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;k=H[f+4>>2];if(b&32768){break kh}g=H[f+4>>2];c=b>>>0>>0;H[n>>2]=H[(c?12:8)+f>>2];while(1){lh:{if(h){break lh}k=H[e+16>>2];f=k+1|0;i=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=f;h=8;d=(i<<8)+d|0;break lh}if(i>>>0<=143){H[e+16>>2]=f;d=(i<<9)+d|0;h=7;break lh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=c?!g:g;break kh}g=H[f+4>>2];k=f;f=b>>>0>>0;H[n>>2]=H[k+(f?8:12)>>2];while(1){mh:{if(h){break mh}k=H[e+16>>2];b=k+1|0;i=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=b;h=8;d=(i<<8)+d|0;break mh}if(i>>>0<=143){H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break mh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;k=f?g:!g}f=k;c=0;k=n;nh:{oh:{ph:{qh:{rh:{switch(f|l<<1){case 0:i=j-4|0;l=H[j+4>>2]>>>17&4|H[i>>2]>>>19&1;f=D+(I[l+24384|0]<<2)|0;k=H[f>>2];c=H[k>>2];b=b-c|0;sh:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[k+4>>2];if(b&32768){break sh}g=H[k+4>>2];c=b>>>0>>0;H[f>>2]=H[k+(c?12:8)>>2];while(1){th:{if(h){break th}k=H[e+16>>2];f=k+1|0;m=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=f;h=8;d=(m<<8)+d|0;break th}if(m>>>0<=143){H[e+16>>2]=f;d=(m<<9)+d|0;h=7;break th}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!g:g;break sh}g=H[k+4>>2];m=f;f=b>>>0>>0;H[m>>2]=H[k+(f?8:12)>>2];while(1){uh:{if(h){break uh}k=H[e+16>>2];b=k+1|0;m=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break uh}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break uh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=f?g:!g}f=g;c=I[l+24640|0];H[o>>2]=(f|0)==(c|0)?z:C;H[i>>2]=H[i>>2]|32;H[j+4>>2]=H[j+4>>2]|8;l=j+(-2-H[e+124>>2]<<2)|0;H[l+4>>2]=H[l+4>>2]|32768;f=c^f;H[l>>2]=H[l>>2]|f<<31|65536;c=l-4|0;H[c>>2]=H[c>>2]|131072;l=f<<19;i=H[e+108>>2];f=D+(I[i+2|0]<<2)|0;k=H[f>>2];c=H[k>>2];b=b-c|0;vh:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[k+4>>2];if(b&32768){break vh}g=H[k+4>>2];c=b>>>0>>0;H[f>>2]=H[k+(c?12:8)>>2];while(1){wh:{if(h){break wh}k=H[e+16>>2];f=k+1|0;m=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=f;h=8;d=(m<<8)+d|0;break wh}if(m>>>0<=143){H[e+16>>2]=f;d=(m<<9)+d|0;h=7;break wh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!g:g;break vh}g=H[k+4>>2];m=f;f=b>>>0>>0;H[m>>2]=H[k+(f?8:12)>>2];while(1){xh:{if(h){break xh}k=H[e+16>>2];b=k+1|0;m=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break xh}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break xh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=f?g:!g}f=g;c=l|16;if(!f){break qh}break;case 1:break rh;case 2:break ph;case 3:break nh;default:break Gg}}m=j-4|0;k=H[j+4>>2]>>>20&4|(H[m>>2]>>>22&1|(c>>>15&16|(c>>>19&64|c>>>3&170)));l=D+(I[k+24384|0]<<2)|0;g=H[l>>2];f=H[g>>2];b=b-f|0;u=(Y<<2)+o|0;yh:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;i=H[g+4>>2];if(b&32768){break yh}i=H[g+4>>2];f=b>>>0>>0;H[l>>2]=H[g+(f?12:8)>>2];while(1){zh:{if(h){break zh}g=H[e+16>>2];l=g+1|0;p=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=l;h=8;d=(p<<8)+d|0;break zh}if(p>>>0<=143){H[e+16>>2]=l;d=(p<<9)+d|0;h=7;break zh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=f?!i:i;break yh}i=H[g+4>>2];p=l;l=b>>>0>>0;H[p>>2]=H[g+(l?8:12)>>2];while(1){Ah:{if(h){break Ah}g=H[e+16>>2];b=g+1|0;p=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=b;h=8;d=(p<<8)+d|0;break Ah}if(p>>>0<=143){H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Ah}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;i=l?i:!i}l=i;f=I[k+24640|0];H[u>>2]=(l|0)==(f|0)?z:C;H[m>>2]=H[m>>2]|256;H[j+4>>2]=H[j+4>>2]|64;i=H[e+108>>2];c=(f^l)<<22|c|128}l=D+(I[(c>>>6&495)+i|0]<<2)|0;k=H[l>>2];f=H[k>>2];b=b-f|0;Bh:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;g=H[k+4>>2];if(b&32768){break Bh}g=H[k+4>>2];f=b>>>0>>0;H[l>>2]=H[k+(f?12:8)>>2];while(1){Ch:{if(h){break Ch}k=H[e+16>>2];l=k+1|0;m=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=l;h=8;d=(m<<8)+d|0;break Ch}if(m>>>0<=143){H[e+16>>2]=l;d=(m<<9)+d|0;h=7;break Ch}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=f?!g:g;break Bh}g=H[k+4>>2];m=l;l=b>>>0>>0;H[m>>2]=H[k+(l?8:12)>>2];while(1){Dh:{if(h){break Dh}k=H[e+16>>2];b=k+1|0;m=I[k+1|0];if(I[k|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break Dh}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Dh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;g=l?g:!g}if(!g){break oh}}m=j-4|0;k=H[j+4>>2]>>>23&4|(H[m>>2]>>>25&1|(c>>>18&16|(c>>>22&64|c>>>6&170)));l=D+(I[k+24384|0]<<2)|0;g=H[l>>2];f=H[g>>2];b=b-f|0;u=o+t|0;Eh:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;i=H[g+4>>2];if(b&32768){break Eh}i=H[g+4>>2];f=b>>>0>>0;H[l>>2]=H[g+(f?12:8)>>2];while(1){Fh:{if(h){break Fh}g=H[e+16>>2];l=g+1|0;p=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=l;h=8;d=(p<<8)+d|0;break Fh}if(p>>>0<=143){H[e+16>>2]=l;d=(p<<9)+d|0;h=7;break Fh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=f?!i:i;break Eh}i=H[g+4>>2];p=l;l=b>>>0>>0;H[p>>2]=H[g+(l?8:12)>>2];while(1){Gh:{if(h){break Gh}g=H[e+16>>2];b=g+1|0;p=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=b;h=8;d=(p<<8)+d|0;break Gh}if(p>>>0<=143){H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Gh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;i=l?i:!i}l=i;f=I[k+24640|0];H[u>>2]=(l|0)==(f|0)?z:C;H[m>>2]=H[m>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(f^l)<<25|c|1024;i=H[e+108>>2]}k=D+(I[(c>>>9&495)+i|0]<<2)|0;g=H[k>>2];f=H[g>>2];b=b-f|0;Hh:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[g+4>>2];if(b&32768){break Hh}i=H[g+4>>2];f=b>>>0>>0;H[k>>2]=H[g+(f?12:8)>>2];while(1){Ih:{if(h){break Ih}g=H[e+16>>2];l=g+1|0;m=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=l;h=8;d=(m<<8)+d|0;break Ih}if(m>>>0<=143){H[e+16>>2]=l;d=(m<<9)+d|0;h=7;break Ih}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!i:i;break Hh}i=H[g+4>>2];l=b>>>0>>0;H[k>>2]=H[g+(l?8:12)>>2];while(1){Jh:{if(h){break Jh}g=H[e+16>>2];b=g+1|0;m=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=b;h=8;d=(m<<8)+d|0;break Jh}if(m>>>0<=143){H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break Jh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?i:!i}if(!l){break Gg}}u=j-4|0;X=H[j+4>>2]>>>26&4|(H[u>>2]>>>28&1|(c>>>21&16|(c>>>25&64|c>>>9&170)));k=D+(I[X+24384|0]<<2)|0;i=H[k>>2];f=H[i>>2];b=b-f|0}p=o+r|0;Kh:{if(d>>>16>>>0>=f>>>0){d=d-(f<<16)|0;l=H[i+4>>2];if(b&32768){break Kh}m=H[i+4>>2];f=b>>>0>>0;H[k>>2]=H[(f?12:8)+i>>2];while(1){Lh:{if(h){break Lh}g=H[e+16>>2];l=g+1|0;i=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=l;h=8;d=(i<<8)+d|0;break Lh}if(i>>>0<=143){H[e+16>>2]=l;d=(i<<9)+d|0;h=7;break Lh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}l=f?!m:m;break Kh}m=H[i+4>>2];l=b>>>0>>0;H[k>>2]=H[(l?8:12)+i>>2];while(1){Mh:{if(h){break Mh}g=H[e+16>>2];b=g+1|0;i=I[g+1|0];if(I[g|0]!=255){H[e+16>>2]=b;h=8;d=(i<<8)+d|0;break Mh}if(i>>>0<=143){H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break Mh}H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;l=l?m:!m}f=I[X+24640|0];H[p>>2]=(l|0)==(f|0)?z:C;H[u>>2]=H[u>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;g=j+(H[e+124>>2]<<2)|0;H[g+4>>2]=H[g+4>>2]|4;H[g+12>>2]=H[g+12>>2]|1;f=f^l;H[g+8>>2]=H[g+8>>2]|f<<18|2;c=f<<28|c|8192}H[j>>2]=c&-1226833921}c=j+4|0;o=o+4|0;v=v+1|0;if((Y|0)!=(v|0)){continue}break}c=j+12|0;o=o+r|0;s=s+4|0;f=H[e+128>>2];if(s>>>0<(f&-4)>>>0){continue}break}break Eg}c=(f&-4)-1|0;s=(c&-4)+4|0;c=(l+(c<<1&-8)|0)+20|0}H[e+8>>2]=h;H[e+4>>2]=b;H[e>>2]=d;H[e+104>>2]=k;if(!Y|f>>>0<=s>>>0){break je}while(1){h=0;if(H[e+128>>2]!=(s|0)){while(1){Yb(e,c,(N(h,Y)<<2)+o|0,z,h,0);h=h+1|0;if(h>>>0>2]-s>>>0){continue}break}}H[c>>2]=H[c>>2]&-1226833921;o=o+4|0;c=c+4|0;R=R+1|0;if((Y|0)!=(R|0)){continue}break}break je}while(1){t=0;while(1){j=c;g=f;f=H[f>>2];Nh:{Oh:{Ph:{if(!f){k=H[l>>2];f=H[k>>2];b=b-f|0;Qh:{if(d>>>16>>>0>>0){n=H[k+4>>2];c=b>>>0>>0;H[l>>2]=H[k+(c?8:12)>>2];while(1){Rh:{if(h){break Rh}k=H[e+16>>2];b=k+1|0;o=I[k+1|0];if(I[k|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Rh}H[e+16>>2]=b;d=(o<<9)+d|0;h=7;break Rh}H[e+16>>2]=b;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;c=c?n:!n;break Qh}d=d-(f<<16)|0;if(!(b&32768)){n=H[k+4>>2];c=b>>>0>>0;H[l>>2]=H[k+(c?12:8)>>2];while(1){Sh:{if(h){break Sh}k=H[e+16>>2];f=k+1|0;o=I[k+1|0];if(I[k|0]==255){if(o>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Sh}H[e+16>>2]=f;d=(o<<9)+d|0;h=7;break Sh}H[e+16>>2]=f;h=8;d=(o<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break Qh}c=H[k+4>>2]}if(!c){k=l;break Nh}c=H[q>>2];f=H[c>>2];b=b-f|0;Th:{if(d>>>16>>>0>>0){o=H[c+4>>2];k=b>>>0>>0;c=H[(k?8:12)+c>>2];H[q>>2]=c;while(1){Uh:{if(h){break Uh}n=H[e+16>>2];b=n+1|0;i=I[n+1|0];if(I[n|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Uh}H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break Uh}H[e+16>>2]=b;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;n=k?o:!o;break Th}d=d-(f<<16)|0;if(!(b&32768)){o=H[c+4>>2];f=b>>>0>>0;c=H[(f?12:8)+c>>2];H[q>>2]=c;while(1){Vh:{if(h){break Vh}n=H[e+16>>2];k=n+1|0;i=I[n+1|0];if(I[n|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Vh}H[e+16>>2]=k;d=(i<<9)+d|0;h=7;break Vh}H[e+16>>2]=k;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=f?!o:o;break Th}n=H[c+4>>2]}f=H[c>>2];b=b-f|0;Wh:{if(d>>>16>>>0>>0){o=H[c+4>>2];k=c;c=b>>>0>>0;H[q>>2]=H[k+(c?8:12)>>2];while(1){Xh:{if(h){break Xh}k=H[e+16>>2];b=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Xh}H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break Xh}H[e+16>>2]=b;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;c=c?o:!o;break Wh}d=d-(f<<16)|0;if(!(b&32768)){o=H[c+4>>2];k=c;c=b>>>0>>0;H[q>>2]=H[k+(c?12:8)>>2];while(1){Yh:{if(h){break Yh}k=H[e+16>>2];f=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Yh}H[e+16>>2]=f;d=(i<<9)+d|0;h=7;break Yh}H[e+16>>2]=f;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!o:o;break Wh}c=H[c+4>>2]}f=0;k=q;Zh:{_h:{$h:{ai:{bi:{switch(c|n<<1){case 0:i=g-4|0;k=H[g+4>>2]>>>17&4|H[i>>2]>>>19&1;c=C+(I[k+24384|0]<<2)|0;n=H[c>>2];f=H[n>>2];b=b-f|0;ci:{if(d>>>16>>>0>>0){o=H[n+4>>2];z=c;c=b>>>0>>0;H[z>>2]=H[n+(c?8:12)>>2];while(1){di:{if(h){break di}n=H[e+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break di}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break di}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;f=c?o:!o;break ci}d=d-(f<<16)|0;if(!(b&32768)){o=H[n+4>>2];z=c;c=b>>>0>>0;H[z>>2]=H[n+(c?12:8)>>2];while(1){ei:{if(h){break ei}n=H[e+16>>2];f=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ei}H[e+16>>2]=f;d=(m<<9)+d|0;h=7;break ei}H[e+16>>2]=f;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}f=c?!o:o;break ci}f=H[n+4>>2]}c=I[k+24640|0];H[j>>2]=(f|0)==(c|0)?v:r;H[i>>2]=H[i>>2]|32;H[g+4>>2]=H[g+4>>2]|8;k=(c^f)<<19;i=H[e+108>>2];c=C+(I[i+2|0]<<2)|0;n=H[c>>2];f=H[n>>2];b=b-f|0;fi:{if(d>>>16>>>0>>0){o=H[n+4>>2];z=c;c=b>>>0>>0;H[z>>2]=H[n+(c?8:12)>>2];while(1){gi:{if(h){break gi}n=H[e+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break gi}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break gi}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;f=f<<1;if(f>>>0<32768){continue}break}b=f;c=c?o:!o;break fi}d=d-(f<<16)|0;if(!(b&32768)){o=H[n+4>>2];z=c;c=b>>>0>>0;H[z>>2]=H[n+(c?12:8)>>2];while(1){hi:{if(h){break hi}n=H[e+16>>2];f=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break hi}H[e+16>>2]=f;d=(m<<9)+d|0;h=7;break hi}H[e+16>>2]=f;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!o:o;break fi}c=H[n+4>>2]}f=k|16;if(!c){break ai}break;case 1:break bi;case 2:break $h;case 3:break Zh;default:break Oh}}m=g-4|0;n=H[g+4>>2]>>>20&4|(H[m>>2]>>>22&1|(f>>>15&16|(f>>>19&64|f>>>3&170)));k=C+(I[n+24384|0]<<2)|0;o=H[k>>2];c=H[o>>2];b=b-c|0;ii:{if(d>>>16>>>0>>0){i=H[o+4>>2];z=k;k=b>>>0>>0;H[z>>2]=H[o+(k?8:12)>>2];while(1){ji:{if(h){break ji}o=H[e+16>>2];b=o+1|0;p=I[o+1|0];if(I[o|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ji}H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break ji}H[e+16>>2]=b;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;k=k?i:!i;break ii}d=d-(c<<16)|0;if(!(b&32768)){i=H[o+4>>2];c=b>>>0>>0;H[k>>2]=H[o+(c?12:8)>>2];while(1){ki:{if(h){break ki}o=H[e+16>>2];k=o+1|0;p=I[o+1|0];if(I[o|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ki}H[e+16>>2]=k;d=(p<<9)+d|0;h=7;break ki}H[e+16>>2]=k;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=c?!i:i;break ii}k=H[o+4>>2]}c=I[n+24640|0];H[j+256>>2]=(k|0)==(c|0)?v:r;H[m>>2]=H[m>>2]|256;H[g+4>>2]=H[g+4>>2]|64;i=H[e+108>>2];f=(c^k)<<22|f|128}k=C+(I[(f>>>6&495)+i|0]<<2)|0;n=H[k>>2];c=H[n>>2];b=b-c|0;li:{if(d>>>16>>>0>>0){o=H[n+4>>2];z=k;k=b>>>0>>0;H[z>>2]=H[n+(k?8:12)>>2];while(1){mi:{if(h){break mi}n=H[e+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break mi}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break mi}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=k?o:!o;break li}d=d-(c<<16)|0;if(!(b&32768)){o=H[n+4>>2];c=b>>>0>>0;H[k>>2]=H[n+(c?12:8)>>2];while(1){ni:{if(h){break ni}n=H[e+16>>2];k=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ni}H[e+16>>2]=k;d=(m<<9)+d|0;h=7;break ni}H[e+16>>2]=k;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!o:o;break li}c=H[n+4>>2]}if(!c){break _h}}m=g-4|0;n=H[g+4>>2]>>>23&4|(H[m>>2]>>>25&1|(f>>>18&16|(f>>>22&64|f>>>6&170)));k=C+(I[n+24384|0]<<2)|0;o=H[k>>2];c=H[o>>2];b=b-c|0;oi:{if(d>>>16>>>0>>0){i=H[o+4>>2];z=k;k=b>>>0>>0;H[z>>2]=H[o+(k?8:12)>>2];while(1){pi:{if(h){break pi}o=H[e+16>>2];b=o+1|0;p=I[o+1|0];if(I[o|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break pi}H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break pi}H[e+16>>2]=b;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;k=k?i:!i;break oi}d=d-(c<<16)|0;if(!(b&32768)){i=H[o+4>>2];c=b>>>0>>0;H[k>>2]=H[o+(c?12:8)>>2];while(1){qi:{if(h){break qi}o=H[e+16>>2];k=o+1|0;p=I[o+1|0];if(I[o|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break qi}H[e+16>>2]=k;d=(p<<9)+d|0;h=7;break qi}H[e+16>>2]=k;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=c?!i:i;break oi}k=H[o+4>>2]}c=I[n+24640|0];H[j+512>>2]=(k|0)==(c|0)?v:r;H[m>>2]=H[m>>2]|2048;H[g+4>>2]=H[g+4>>2]|512;f=(c^k)<<25|f|1024;i=H[e+108>>2]}k=C+(I[(f>>>9&495)+i|0]<<2)|0;o=H[k>>2];c=H[o>>2];b=b-c|0;ri:{if(d>>>16>>>0>>0){i=H[o+4>>2];n=b>>>0>>0;H[k>>2]=H[o+(n?8:12)>>2];while(1){si:{if(h){break si}o=H[e+16>>2];b=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break si}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break si}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?i:!i;break ri}d=d-(c<<16)|0;if(!(b&32768)){i=H[o+4>>2];c=b>>>0>>0;H[k>>2]=H[o+(c?12:8)>>2];while(1){ti:{if(h){break ti}o=H[e+16>>2];n=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break ti}H[e+16>>2]=n;d=(m<<9)+d|0;h=7;break ti}H[e+16>>2]=n;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!i:i;break ri}c=H[o+4>>2]}if(!c){break Oh}}R=g-4|0;u=H[g+4>>2]>>>26&4|(H[R>>2]>>>28&1|(f>>>21&16|(f>>>25&64|f>>>9&170)));k=C+(I[u+24384|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;break Ph}ui:{if(f&2097168){break ui}k=C+(I[H[e+108>>2]+(f&495)|0]<<2)|0;o=H[k>>2];c=H[o>>2];b=b-c|0;vi:{if(d>>>16>>>0>>0){i=H[o+4>>2];n=b>>>0>>0;H[k>>2]=H[o+(n?8:12)>>2];while(1){wi:{if(h){break wi}o=H[e+16>>2];b=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break wi}H[e+16>>2]=b;d=(m<<9)+d|0;h=7;break wi}H[e+16>>2]=b;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?i:!i;break vi}d=d-(c<<16)|0;if(!(b&32768)){i=H[o+4>>2];c=b>>>0>>0;H[k>>2]=H[o+(c?12:8)>>2];while(1){xi:{if(h){break xi}o=H[e+16>>2];n=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break xi}H[e+16>>2]=n;d=(m<<9)+d|0;h=7;break xi}H[e+16>>2]=n;h=8;d=(m<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!i:i;break vi}c=H[o+4>>2]}if(!c){break ui}p=g-4|0;o=H[g+4>>2]>>>17&4|(H[p>>2]>>>19&1|(f>>>14&16|(f>>>16&64|f&170)));k=C+(I[o+24384|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;yi:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[i+(n?8:12)>>2];while(1){zi:{if(h){break zi}i=H[e+16>>2];b=i+1|0;u=I[i+1|0];if(I[i|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break zi}H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break zi}H[e+16>>2]=b;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break yi}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){Ai:{if(h){break Ai}i=H[e+16>>2];n=i+1|0;u=I[i+1|0];if(I[i|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ai}H[e+16>>2]=n;d=(u<<9)+d|0;h=7;break Ai}H[e+16>>2]=n;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break yi}n=H[i+4>>2]}c=I[o+24640|0];H[j>>2]=(n|0)==(c|0)?v:r;H[p>>2]=H[p>>2]|32;H[g+4>>2]=H[g+4>>2]|8;f=(c^n)<<19|f|16}Bi:{if(f&16777344){break Bi}o=f>>>3|0;k=C+(I[H[e+108>>2]+(o&495)|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;Ci:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[i+(n?8:12)>>2];while(1){Di:{if(h){break Di}i=H[e+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Di}H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Di}H[e+16>>2]=b;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Ci}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){Ei:{if(h){break Ei}i=H[e+16>>2];n=i+1|0;p=I[i+1|0];if(I[i|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ei}H[e+16>>2]=n;d=(p<<9)+d|0;h=7;break Ei}H[e+16>>2]=n;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Ci}c=H[i+4>>2]}if(!c){break Bi}p=g-4|0;o=H[g+4>>2]>>>20&4|(H[p>>2]>>>22&1|(f>>>15&16|(f>>>19&64|o&170)));k=C+(I[o+24384|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;Fi:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[i+(n?8:12)>>2];while(1){Gi:{if(h){break Gi}i=H[e+16>>2];b=i+1|0;u=I[i+1|0];if(I[i|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Gi}H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break Gi}H[e+16>>2]=b;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Fi}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){Hi:{if(h){break Hi}i=H[e+16>>2];n=i+1|0;u=I[i+1|0];if(I[i|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Hi}H[e+16>>2]=n;d=(u<<9)+d|0;h=7;break Hi}H[e+16>>2]=n;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Fi}n=H[i+4>>2]}c=I[o+24640|0];H[j+256>>2]=(n|0)==(c|0)?v:r;H[p>>2]=H[p>>2]|256;H[g+4>>2]=H[g+4>>2]|64;f=(c^n)<<22|f|128}Ii:{if(f&134218752){break Ii}o=f>>>6|0;k=C+(I[H[e+108>>2]+(o&495)|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;Ji:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[i+(n?8:12)>>2];while(1){Ki:{if(h){break Ki}i=H[e+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ki}H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Ki}H[e+16>>2]=b;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Ji}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){Li:{if(h){break Li}i=H[e+16>>2];n=i+1|0;p=I[i+1|0];if(I[i|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Li}H[e+16>>2]=n;d=(p<<9)+d|0;h=7;break Li}H[e+16>>2]=n;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Ji}c=H[i+4>>2]}if(!c){break Ii}p=g-4|0;o=H[g+4>>2]>>>23&4|(H[p>>2]>>>25&1|(f>>>18&16|(f>>>22&64|o&170)));k=C+(I[o+24384|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;Mi:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[i+(n?8:12)>>2];while(1){Ni:{if(h){break Ni}i=H[e+16>>2];b=i+1|0;u=I[i+1|0];if(I[i|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ni}H[e+16>>2]=b;d=(u<<9)+d|0;h=7;break Ni}H[e+16>>2]=b;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Mi}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){Oi:{if(h){break Oi}i=H[e+16>>2];n=i+1|0;u=I[i+1|0];if(I[i|0]==255){if(u>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Oi}H[e+16>>2]=n;d=(u<<9)+d|0;h=7;break Oi}H[e+16>>2]=n;h=8;d=(u<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Mi}n=H[i+4>>2]}c=I[o+24640|0];H[j+512>>2]=(n|0)==(c|0)?v:r;H[p>>2]=H[p>>2]|2048;H[g+4>>2]=H[g+4>>2]|512;f=(c^n)<<25|f|1024}if(f&1073750016){break Oh}o=f>>>9|0;k=C+(I[H[e+108>>2]+(o&495)|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0;Pi:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[i+(n?8:12)>>2];while(1){Qi:{if(h){break Qi}i=H[e+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Qi}H[e+16>>2]=b;d=(p<<9)+d|0;h=7;break Qi}H[e+16>>2]=b;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Pi}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){Ri:{if(h){break Ri}i=H[e+16>>2];n=i+1|0;p=I[i+1|0];if(I[i|0]==255){if(p>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ri}H[e+16>>2]=n;d=(p<<9)+d|0;h=7;break Ri}H[e+16>>2]=n;h=8;d=(p<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Pi}c=H[i+4>>2]}if(!c){break Oh}R=g-4|0;u=H[g+4>>2]>>>26&4|(H[R>>2]>>>28&1|(f>>>21&16|(f>>>25&64|o&170)));k=C+(I[u+24384|0]<<2)|0;i=H[k>>2];c=H[i>>2];b=b-c|0}Si:{if(d>>>16>>>0>>0){m=H[i+4>>2];n=b>>>0>>0;H[k>>2]=H[(n?8:12)+i>>2];while(1){Ti:{if(h){break Ti}o=H[e+16>>2];b=o+1|0;i=I[o+1|0];if(I[o|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ti}H[e+16>>2]=b;d=(i<<9)+d|0;h=7;break Ti}H[e+16>>2]=b;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Si}d=d-(c<<16)|0;if(!(b&32768)){m=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[(c?12:8)+i>>2];while(1){Ui:{if(h){break Ui}o=H[e+16>>2];n=o+1|0;i=I[o+1|0];if(I[o|0]==255){if(i>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;d=d+65280|0;h=8;break Ui}H[e+16>>2]=n;d=(i<<9)+d|0;h=7;break Ui}H[e+16>>2]=n;h=8;d=(i<<8)+d|0}h=h-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Si}n=H[i+4>>2]}c=I[u+24640|0];H[j+768>>2]=(n|0)==(c|0)?v:r;H[R>>2]=H[R>>2]|16384;H[g+4>>2]=H[g+4>>2]|4096;H[g+260>>2]=H[g+260>>2]|4;H[g+268>>2]=H[g+268>>2]|1;c=c^n;H[g+264>>2]=H[g+264>>2]|c<<18|2;f=c<<28|f|8192}H[g>>2]=f&-1226833921}f=g+4|0;c=j+4|0;t=t+1|0;if((t|0)!=64){continue}break}f=g+12|0;c=j+772|0;n=s>>>0<60;s=s+4|0;if(n){continue}break}}H[e+8>>2]=h;H[e+4>>2]=b;H[e>>2]=d;H[e+104>>2]=k}Vi:{if(!(Z&32)){break Vi}H[e+104>>2]=e+100;f=H[e+100>>2];b=H[f>>2];d=H[e+4>>2]-b|0;H[e+4>>2]=d;h=H[e>>2];Wi:{if(h>>>16>>>0>>0){H[e+4>>2]=b;f=H[(b>>>0>d>>>0?8:12)+f>>2];H[e+100>>2]=f;d=H[e+8>>2];while(1){Xi:{if(d){break Xi}l=H[e+16>>2];c=l+1|0;k=I[l+1|0];if(I[l|0]==255){if(k>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;d=8;break Xi}H[e+16>>2]=c;h=(k<<9)+h|0;d=7;break Xi}H[e+16>>2]=c;d=8;h=(k<<8)+h|0}d=d-1|0;H[e+8>>2]=d;h=h<<1;H[e>>2]=h;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break Wi}h=h-(b<<16)|0;H[e>>2]=h;if(d&32768){break Wi}f=H[(b>>>0>d>>>0?12:8)+f>>2];H[e+100>>2]=f;b=H[e+8>>2];while(1){Yi:{if(b){break Yi}c=H[e+16>>2];b=c+1|0;l=I[c+1|0];if(I[c|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;b=8;break Yi}H[e+16>>2]=b;h=(l<<9)+h|0;b=7;break Yi}H[e+16>>2]=b;b=8;h=(l<<8)+h|0}b=b-1|0;H[e+8>>2]=b;h=h<<1;H[e>>2]=h;d=d<<1;H[e+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[f>>2];d=d-b|0;H[e+4>>2]=d;Zi:{if(h>>>16>>>0>>0){H[e+4>>2]=b;f=H[(b>>>0>d>>>0?8:12)+f>>2];H[e+100>>2]=f;d=H[e+8>>2];while(1){_i:{if(d){break _i}l=H[e+16>>2];c=l+1|0;k=I[l+1|0];if(I[l|0]==255){if(k>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;d=8;break _i}H[e+16>>2]=c;h=(k<<9)+h|0;d=7;break _i}H[e+16>>2]=c;d=8;h=(k<<8)+h|0}d=d-1|0;H[e+8>>2]=d;h=h<<1;H[e>>2]=h;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break Zi}h=h-(b<<16)|0;H[e>>2]=h;if(d&32768){break Zi}f=H[(b>>>0>d>>>0?12:8)+f>>2];H[e+100>>2]=f;b=H[e+8>>2];while(1){$i:{if(b){break $i}c=H[e+16>>2];b=c+1|0;l=I[c+1|0];if(I[c|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;b=8;break $i}H[e+16>>2]=b;h=(l<<9)+h|0;b=7;break $i}H[e+16>>2]=b;b=8;h=(l<<8)+h|0}b=b-1|0;H[e+8>>2]=b;h=h<<1;H[e>>2]=h;d=d<<1;H[e+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[f>>2];d=d-b|0;H[e+4>>2]=d;aj:{if(h>>>16>>>0>>0){H[e+4>>2]=b;f=H[(b>>>0>d>>>0?8:12)+f>>2];H[e+100>>2]=f;d=H[e+8>>2];while(1){bj:{if(d){break bj}l=H[e+16>>2];c=l+1|0;k=I[l+1|0];if(I[l|0]==255){if(k>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;d=8;break bj}H[e+16>>2]=c;h=(k<<9)+h|0;d=7;break bj}H[e+16>>2]=c;d=8;h=(k<<8)+h|0}d=d-1|0;H[e+8>>2]=d;h=h<<1;H[e>>2]=h;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break aj}h=h-(b<<16)|0;H[e>>2]=h;if(d&32768){break aj}f=H[(b>>>0>d>>>0?12:8)+f>>2];H[e+100>>2]=f;b=H[e+8>>2];while(1){cj:{if(b){break cj}c=H[e+16>>2];b=c+1|0;l=I[c+1|0];if(I[c|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;b=8;break cj}H[e+16>>2]=b;h=(l<<9)+h|0;b=7;break cj}H[e+16>>2]=b;b=8;h=(l<<8)+h|0}b=b-1|0;H[e+8>>2]=b;h=h<<1;H[e>>2]=h;d=d<<1;H[e+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[f>>2];d=d-b|0;H[e+4>>2]=d;if(h>>>16>>>0>>0){H[e+4>>2]=b;H[e+100>>2]=H[(b>>>0>d>>>0?8:12)+f>>2];d=H[e+8>>2];while(1){dj:{if(d){break dj}f=H[e+16>>2];c=f+1|0;l=I[f+1|0];if(I[f|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;h=h+65280|0;d=8;break dj}H[e+16>>2]=c;h=(l<<9)+h|0;d=7;break dj}H[e+16>>2]=c;d=8;h=(l<<8)+h|0}d=d-1|0;H[e+8>>2]=d;h=h<<1;H[e>>2]=h;b=b<<1;H[e+4>>2]=b;if(b>>>0<32768){continue}break}break Vi}c=h-(b<<16)|0;H[e>>2]=c;if(d&32768){break Vi}H[e+100>>2]=H[(b>>>0>d>>>0?12:8)+f>>2];h=H[e+8>>2];while(1){ej:{if(h){break ej}f=H[e+16>>2];b=f+1|0;l=I[f+1|0];if(I[f|0]==255){if(l>>>0>=144){H[e+12>>2]=H[e+12>>2]+1;c=c+65280|0;h=8;break ej}H[e+16>>2]=b;c=(l<<9)+c|0;h=7;break ej}H[e+16>>2]=b;h=8;c=(l<<8)+c|0}h=h-1|0;H[e+8>>2]=h;c=c<<1;H[e>>2]=c;d=d<<1;H[e+4>>2]=d;if(d>>>0<32768){continue}break}}}if(!P){break Za}_b(e);Ya(e,18,46);Ya(e,17,3);Ya(e,0,4)}b=ma+1|0;c=(b|0)==3;ma=c?0:b;w=w-c|0;da=da+1|0;if(da>>>0>=K[oa+8>>2]){break Ya}if((w|0)>0){continue}break}}S=S+W|0;c=H[e+24>>2];b=J[e+112>>1];F[c|0]=b;F[c+1|0]=b>>>8;V=V+1|0;if(V>>>0>2]){continue}break}}fj:{if(!_){break fj}gj:{c=H[e+24>>2];f=H[e+16>>2];if(c>>>0>f+2>>>0){if(!ba){break gj}f=H[e+16>>2];c=H[e+24>>2];b=H[e+20>>2];H[$+56>>2]=c-b;H[$+52>>2]=f-b;H[$+48>>2]=(c-f|0)-2;Ba(T,2,15235,$+48|0);break fj}b=H[e+12>>2];if(b>>>0<3){break fj}if(ba){H[$+80>>2]=H[e+12>>2];Ba(T,2,7107,$+80|0);break fj}H[$+64>>2]=b;Ba(T,2,7107,$- -64|0);break fj}b=H[e+20>>2];H[$+40>>2]=c-b;H[$+36>>2]=f-b;H[$+32>>2]=(c-f|0)-2;Ba(T,2,15235,$+32|0)}if(!H[E+60>>2]){break i}H[e+116>>2]=x}l=H[sa+4>>2];f=H[E+12>>2];m=H[E+8>>2]-H[sa>>2]|0;c=H[sa+16>>2];if(c&1){b=H[pa+28>>2]+N(ua,152)|0;m=(H[b-144>>2]+m|0)-H[b-152>>2]|0}k=f-l|0;if(c&2){b=H[pa+28>>2]+N(ua,152)|0;k=(H[b-140>>2]+k|0)-H[b-148>>2]|0}j=H[E+60>>2];i=j;i=i?i:H[e+116>>2];p=H[e+128>>2];P=H[e+124>>2];n=H[qa+808>>2];hj:{if(!n){break hj}b=!p|!P;if((n|0)<=30){if(b){break hj}h=0;while(1){l=(N(h,P)<<2)+i|0;b=0;while(1){f=l+(b<<2)|0;q=H[f>>2];c=q>>31;c=(c^q)-c|0;if(c>>>n|0){c=c>>>H[qa+808>>2]|0;H[f>>2]=(q|0)<0?0-c|0:c}b=b+1|0;if((P|0)!=(b|0)){continue}break}h=h+1|0;if((p|0)!=(h|0)){continue}break}break hj}if(b){break hj}b=N(p,P)<<2;if(!b){break hj}y(i,0,b)}if(j){l=N(p,P);if(H[qa+20>>2]==1){if(!l){break a}e=0;if((l|0)!=1){b=l&-2;f=0;while(1){c=(e<<2)+i|0;H[c>>2]=H[c>>2]/2;H[c+4>>2]=H[c+4>>2]/2;e=e+2|0;f=f+2|0;if((b|0)!=(f|0)){continue}break}}if(!(l&1)){break a}b=(e<<2)+i|0;H[b>>2]=H[b>>2]/2;break a}if(!l){break a}ha=O(L[sa+32>>2]*O(.5));if(l>>>0>=4){c=l&-4;b=0;while(1){L[i>>2]=ha*O(H[i>>2]);L[i+4>>2]=ha*O(H[i+4>>2]);L[i+8>>2]=ha*O(H[i+8>>2]);L[i+12>>2]=ha*O(H[i+12>>2]);i=i+16|0;b=b+4|0;if((c|0)!=(b|0)){continue}break}}c=l&3;if(!c){break a}b=0;while(1){L[i>>2]=ha*O(H[i>>2]);i=i+4|0;b=b+1|0;if((c|0)!=(b|0)){continue}break}break a}s=wa-va|0;if(H[qa+20>>2]==1){if(!p){break a}g=(H[pa+36>>2]+(N(k,s)<<2)|0)+(m<<2)|0;d=P&-4;k=0;while(1){b=0;if(d){j=g+(N(k,s)<<2)|0;n=(N(k,P)<<2)+i|0;while(1){q=b<<2;o=q+n|0;l=H[o+4>>2];f=H[o+8>>2];c=H[o+12>>2];q=j+q|0;H[q>>2]=H[o>>2]/2;H[q+12>>2]=(c|0)/2;H[q+8>>2]=(f|0)/2;H[q+4>>2]=(l|0)/2;b=b+4|0;if(d>>>0>b>>>0){continue}break}}ij:{if(b>>>0>=P>>>0){break ij}c=b+1|0;l=g+(N(k,s)<<2)|0;f=(N(k,P)<<2)+i|0;if(P-b&1){b=b<<2;H[b+l>>2]=H[b+f>>2]/2;b=c}if((c|0)==(P|0)){break ij}while(1){c=b<<2;H[c+l>>2]=H[c+f>>2]/2;c=c+4|0;H[c+l>>2]=H[c+f>>2]/2;b=b+2|0;if((P|0)!=(b|0)){continue}break}}k=k+1|0;if((p|0)!=(k|0)){continue}break}break a}if(!p|!P){break a}ha=O(L[sa+32>>2]*O(.5));k=(H[pa+36>>2]+(N(k,s)<<2)|0)+(m<<2)|0;f=P&-4;l=P&3;g=0;c=P-1>>>0<3;while(1){b=k;e=0;if(!c){while(1){L[b>>2]=ha*O(H[i>>2]);L[b+4>>2]=ha*O(H[i+4>>2]);L[b+8>>2]=ha*O(H[i+8>>2]);L[b+12>>2]=ha*O(H[i+12>>2]);b=b+16|0;i=i+16|0;e=e+4|0;if((f|0)!=(e|0)){continue}break}}e=0;if(l){while(1){L[b>>2]=ha*O(H[i>>2]);b=b+4|0;i=i+4|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}k=(s<<2)+k|0;g=g+1|0;if((p|0)!=(g|0)){continue}break}break a}H[$>>2]=w;Ba(T,2,8716,$)}H[H[d>>2]>>2]=0}Ca(a);na=$+96|0} +function jb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,J=0,M=0,Q=0,R=0,S=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=O(0),ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ga=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Qa=0,Sa=0,Va=0,Xa=0,Ya=0,Za=0,$a=0,ab=0,bb=0,cb=O(0),db=O(0),gb=0,hb=0,ib=0,jb=0,lb=0,mb=0,nb=0,qb=0,rb=0,sb=0,tb=O(0),ub=0;Xa=na-16|0;na=Xa;a:{if(!(I[a+8|0]&128)|H[a+228>>2]!=(b|0)){break a}Qa=H[a+180>>2]+N(b,5644)|0;s=H[Qa+5596>>2];if(!s){kb(Qa);break a}g=H[a+100>>2];if(!g){g=H[a+96>>2]}n=H[g>>2];i=H[g+4>>2];l=H[g+8>>2];h=H[g+12>>2];k=H[a+60>>2];m=H[a+64>>2];g=H[Qa+5600>>2];Ga=na-16|0;na=Ga;Q=H[a+232>>2];H[Q+36>>2]=b;j=H[H[Q+28>>2]+76>>2];H[Q+64>>2]=1;H[Q+60>>2]=h;H[Q+56>>2]=l;H[Q+52>>2]=i;H[Q+48>>2]=n;H[Q+32>>2]=j+N(b,5644);Ca(H[Q+68>>2]);H[Q+68>>2]=0;b:{if(k){q=Ea(4,H[H[Q+24>>2]+16>>2]);if(!q){break b}if(k>>>0>=4){j=k&-4;b=0;while(1){h=m+($<<2)|0;H[(H[h>>2]<<2)+q>>2]=1;H[(H[h+4>>2]<<2)+q>>2]=1;H[(H[h+8>>2]<<2)+q>>2]=1;H[(H[h+12>>2]<<2)+q>>2]=1;$=$+4|0;b=b+4|0;if((j|0)!=(b|0)){continue}break}}b=k&3;if(b){while(1){H[(H[m+($<<2)>>2]<<2)+q>>2]=1;$=$+1|0;u=u+1|0;if((b|0)!=(u|0)){continue}break}}H[Q+68>>2]=q}c:{D=H[Q+24>>2];da=H[D+16>>2];d:{if(!da){break d}$=0;e:{while(1){f:{if(H[($<<2)+q>>2]?0:q){break f}l=H[D+24>>2]+N($,52)|0;o=H[l+4>>2];n=o-1|0;h=H[Q+60>>2];j=n+h|0;k=0-!o|0;b=k;i=xe(j,h>>>0>j>>>0?b+1|0:b,o,0);p=H[l>>2];l=p-1|0;h=H[Q+56>>2];j=l+h|0;m=0-!p|0;b=m;h=xe(j,h>>>0>j>>>0?b+1|0:b,p,0);j=H[Q+52>>2];b=j+n|0;n=xe(b,b>>>0>>0?k+1|0:k,o,0);o=H[H[H[Q+20>>2]>>2]+20>>2]+N($,76)|0;k=H[o+20>>2]-H[o+24>>2]|0;if(k>>>0>31){break f}j=H[Q+48>>2];b=j+l|0;j=xe(b,b>>>0>>0?m+1|0:m,p,0);b=j-H[o>>2]|0;g:{if((b>>>0<=j>>>0?b:0)>>>k|0){break g}b=n-H[o+4>>2]|0;if((b>>>0<=n>>>0?b:0)>>>k|0){break g}j=H[o+8>>2];b=j-h|0;if((b>>>0<=j>>>0?b:0)>>>k|0){break g}j=H[o+12>>2];b=j-i|0;if(!((b>>>0<=j>>>0?b:0)>>>k|0)){break f}}H[Q+64>>2]=0;break e}$=$+1|0;if((da|0)!=($|0)){continue}break}if(!H[Q+64>>2]){break e}u=0;while(1){m=H[H[H[Q+20>>2]>>2]+20>>2]+N(u,76)|0;b=H[m+28>>2]+N(H[m+24>>2],152)|0;n=H[b-148>>2];i=H[b-140>>2];l=H[b-152>>2];h=H[b-144>>2];b=H[Q+68>>2];h:{if(H[b+(u<<2)>>2]?0:b){break h}j=i-n|0;b=h-l|0;te(j,0,b);if(!(!qa|(i|0)==(n|0))){$=0;Ba(f,1,2982,0);break b}b=N(b,j);if(b>>>0>=1073741824){$=0;Ba(f,1,2982,0);break b}j=b<<2;H[m+44>>2]=j;i:{j:{k:{b=H[m+36>>2];if(b){if(j>>>0<=K[m+48>>2]){break h}if(H[m+40>>2]){break k}}b=Ia(j);H[m+36>>2]=b;j=b;b=H[m+44>>2];if(!(b?j:1)){break j}H[m+40>>2]=1;H[m+48>>2]=b;break h}Ca(b);b=Ia(H[m+44>>2]);H[m+36>>2]=b;if(b){break i}H[m+48>>2]=0;H[m+40>>2]=0;H[m+44>>2]=0}$=0;Ba(f,1,2982,0);break b}H[m+40>>2]=1;H[m+48>>2]=H[m+44>>2]}u=u+1|0;D=H[Q+24>>2];if(u>>>0>2]){continue}break}break d}x=H[D+24>>2];w=H[H[H[Q+20>>2]>>2]+20>>2];b=0;while(1){l:{if(H[(b<<2)+q>>2]?0:q){break l}aa=w+N(b,76)|0;n=H[aa>>2];i=x+N(b,52)|0;v=H[i>>2];m=v-1|0;l=H[Q+48>>2];h=m+l|0;p=0-!v|0;j=p;j=xe(h,h>>>0>>0?j+1|0:j,v,0);_=j>>>0>>0?n:j;H[aa+56>>2]=_;n=H[aa+4>>2];u=H[i+4>>2];i=u-1|0;l=H[Q+52>>2];h=i+l|0;k=0-!u|0;j=k;j=xe(h,h>>>0>>0?j+1|0:j,u,0);o=j>>>0>>0?n:j;H[aa+60>>2]=o;l=H[aa+8>>2];h=H[Q+56>>2];j=h+m|0;j=xe(j,h>>>0>j>>>0?p+1|0:p,v,0);n=j>>>0>l>>>0?l:j;H[aa+64>>2]=n;l=H[aa+12>>2];h=H[Q+60>>2];j=i+h|0;j=xe(j,h>>>0>j>>>0?k+1|0:k,u,0);j=j>>>0>l>>>0?l:j;H[aa+68>>2]=j;if(n>>>0<_>>>0|j>>>0>>0){break c}ba=H[aa+20>>2];if(!ba){break l}fa=j-1|0;v=0-!j|0;u=n-1|0;p=0-!n|0;Y=o-1|0;k=0-!o|0;S=_-1|0;m=0-!_|0;n=H[aa+28>>2];l=0;j=0;while(1){J=n+N(l,152)|0;ja=ba+(l^-1)|0;i=ja&31;if((ja&63)>>>0>=32){o=1<>>32-i}aa=h;h=fa+aa|0;i=o+v|0;i=h>>>0>>0?i+1|0:i;_=ja&31;if((ja&63)>>>0>=32){h=i>>>_|0}else{h=((1<<_)-1&i)<<32-_|h>>>_}H[J+148>>2]=h;h=o+p|0;A=h+1|0;i=h;h=u+aa|0;i=h>>>0>>0?A:i;_=ja&31;if((ja&63)>>>0>=32){h=i>>>_|0}else{h=((1<<_)-1&i)<<32-_|h>>>_}H[J+144>>2]=h;h=k+o|0;A=h+1|0;i=h;h=Y+aa|0;i=h>>>0>>0?A:i;_=ja&31;if((ja&63)>>>0>=32){h=i>>>_|0}else{h=((1<<_)-1&i)<<32-_|h>>>_}H[J+140>>2]=h;h=m+o|0;A=h+1|0;i=h;h=S+aa|0;i=h>>>0>>0?A:i;o=ja&31;if((ja&63)>>>0>=32){h=i>>>o|0}else{h=((1<>>o}H[J+136>>2]=h;l=l+1|0;j=l?j:j+1|0;if(j|(l|0)!=(ba|0)){continue}break}}b=b+1|0;if((da|0)!=(b|0)){continue}break}}$=0;H[Ga+8>>2]=0;b=H[Q+28>>2];ka=Ea(1,8);if(ka){H[ka+4>>2]=b;H[ka>>2]=D}if(!ka){break b}v=H[H[Q+20>>2]>>2];R=na-144|0;na=R;w=H[Q+36>>2];b=N(w,5644);x=H[ka+4>>2];ea=b+H[x+76>>2]|0;aa=H[ea+420>>2];h=0;l=0;W=na-32|0;na=W;ua=b+H[x+76>>2]|0;D=H[ua+420>>2];C=H[ka>>2];la=H[C+16>>2];p=Fa(N(la,528));m:{if(!p){break m}b=Fa(la<<2);n:{if(!b){b=p;break n}q=H[x+76>>2]+N(w,5644)|0;o=H[q+420>>2];i=o+1|0;j=Ea(i,240);o:{if(j){p:{if(i){X=H[C+16>>2];u=j;while(1){H[u+236>>2]=f;i=Ea(X,16);H[u+200>>2]=i;if(!i){break p}i=H[C+16>>2];H[u+196>>2]=i;m=0;X=0;if(i){while(1){k=H[u+200>>2]+(m<<4)|0;n=H[q+5584>>2]+N(m,1080)|0;i=Ea(H[n+4>>2],16);H[k+12>>2]=i;if(!i){break p}H[k+8>>2]=H[n+4>>2];m=m+1|0;X=H[C+16>>2];if(m>>>0>>0){continue}break}}u=u+240|0;i=(o|0)==(M|0);M=M+1|0;if(!i){continue}break}}break o}i=H[j+4>>2];if(i){Ca(i);H[j+4>>2]=0}u=j;q=0;while(1){m=H[u+200>>2];if(m){X=0;M=H[u+196>>2];if(M){while(1){i=H[m+12>>2];if(i){Ca(i);H[m+12>>2]=0;M=H[u+196>>2]}m=m+16|0;X=X+1|0;if(X>>>0>>0){continue}break}m=H[u+200>>2]}Ca(m);H[u+200>>2]=0}u=u+240|0;i=(o|0)==(q|0);q=q+1|0;if(!i){continue}break}Ca(j)}j=0}if(j){q:{if(!la){break q}q=p;if(la>>>0>=8){i=la&-8;while(1){n=(r<<2)+b|0;H[n+28>>2]=q+3696;H[n+24>>2]=q+3168;H[n+20>>2]=q+2640;H[n+16>>2]=q+2112;H[n+12>>2]=q+1584;H[n+8>>2]=q+1056;H[n+4>>2]=q+528;H[n>>2]=q;r=r+8|0;q=q+4224|0;h=h+8|0;if((i|0)!=(h|0)){continue}break}}h=la&7;if(!h){break q}while(1){H[(r<<2)+b>>2]=q;r=r+1|0;q=q+528|0;E=E+1|0;if((h|0)!=(E|0)){continue}break}}m=b;X=0;u=H[(H[x+76>>2]+N(w,5644)|0)+5584>>2];q=H[C+24>>2];b=H[x+24>>2];i=(w>>>0)/(b>>>0)|0;h=H[x+4>>2]+N(H[x+12>>2],w-N(b,i)|0)|0;b=H[C>>2];H[W+20>>2]=b>>>0>>0?h:b;b=h+H[x+12>>2]|0;h=b>>>0>>0?-1:b;b=H[C+8>>2];H[W+16>>2]=b>>>0>h>>>0?h:b;h=H[x+8>>2]+N(i,H[x+16>>2])|0;b=H[C+4>>2];H[W+12>>2]=b>>>0>>0?h:b;b=h+H[x+16>>2]|0;h=b>>>0>>0?-1:b;b=H[C+12>>2];H[W+8>>2]=b>>>0>h>>>0?h:b;H[W+24>>2]=0;H[W+28>>2]=0;H[W+4>>2]=2147483647;H[W>>2]=2147483647;if(H[C+16>>2]){while(1){b=m?H[m+(X<<2)>>2]:0;fa=H[q+4>>2];r=fa-1|0;n=H[W+8>>2];i=r+n|0;S=0-!fa|0;h=S;x=xe(i,i>>>0>>0?h+1|0:h,fa,0);Y=H[q>>2];k=Y-1|0;n=H[W+16>>2];i=k+n|0;w=0-!Y|0;h=w;o=xe(i,i>>>0>>0?h+1|0:h,Y,0);i=H[W+12>>2];h=i+r|0;n=xe(h,i>>>0>h>>>0?S+1|0:S,fa,0);i=H[W+20>>2];h=i+k|0;h=xe(h,i>>>0>h>>>0?w+1|0:w,Y,0);i=H[u+4>>2];if(i>>>0>K[W+28>>2]){H[W+28>>2]=i;i=H[u+4>>2]}if(i){_=u+944|0;da=u+812|0;ga=x-1|0;ba=0-!x|0;E=o-1|0;fa=0-!o|0;ja=n-1|0;Y=0-!n|0;J=h-1|0;S=0-!h|0;M=0;while(1){h=M<<2;pa=H[h+_>>2];sa=H[h+da>>2];r=0;if(b){H[b+4>>2]=pa;H[b>>2]=sa;r=b+8|0}i=i-1|0;n=sa+i|0;r:{if(n>>>0>31){break r}b=H[q>>2];if(b>>>0>-1>>>n>>>0){break r}h=H[W+4>>2];b=b<>2]=b>>>0>h>>>0?h:b}n=i+pa|0;s:{if(n>>>0>31){break s}b=H[q+4>>2];if(b>>>0>-1>>>n>>>0){break s}h=H[W>>2];b=b<>2]=b>>>0>h>>>0?h:b}b=0;n=i&31;if((i&63)>>>0>=32){o=1<>>32-n}A=h;h=ga+A|0;n=o;k=ba+n|0;w=h>>>0>>0?k+1|0:k;t=i&31;o=pa&31;if((pa&63)>>>0>=32){o=1<>>32-o}x=k;if((i&63)>>>0>=32){w=w>>>t|0}else{w=((1<>>t}h=x+w|0;k=h-1|0;x=(h>>>0>>0?o+1|0:o)-!h|0;t=pa&31;h=n+Y|0;xa=h+1|0;o=h;h=A+ja|0;o=h>>>0>>0?xa:o;if((pa&63)>>>0>=32){x=x>>>t|0}else{x=((1<>>t}k=i&31;if((i&63)>>>0>=32){h=o>>>k|0}else{h=((1<>>k}x=(h|0)!=(w|0)?x-(h>>>pa|0)&-1>>>pa:0;h=n+fa|0;w=h+1|0;k=h;h=E+A|0;w=h>>>0>>0?w:k;t=i&31;o=sa&31;if((sa&63)>>>0>=32){o=1<>>32-o}if((i&63)>>>0>=32){w=w>>>t|0}else{w=((1<>>t}h=k+w|0;o=(h>>>0>>0?o+1|0:o)-!h|0;k=h-1|0;t=sa&31;h=n+S|0;xa=h+1|0;n=h;h=J+A|0;n=h>>>0>>0?xa:n;if((sa&63)>>>0>=32){A=o>>>t|0}else{A=((1<>>t}k=i&31;if((i&63)>>>0>=32){h=n>>>k|0}else{h=((1<>>k}h=(h|0)!=(w|0)?A-(h>>>sa|0)&-1>>>sa:0;if(r){H[r+4>>2]=x;H[r>>2]=h;b=r+8|0}h=N(h,x);if(h>>>0>K[W+24>>2]){H[W+24>>2]=h}M=M+1|0;if(M>>>0>2]){continue}break}}q=q+52|0;u=u+1080|0;X=X+1|0;if(X>>>0>2]){continue}break}}o=D+1|0;_=H[W+28>>2];J=H[W+24>>2];H[j+4>>2]=0;b=H[ua+8>>2]+1|0;fa=N(J,la);da=N(fa,_);te(b,0,da);t:{if(!qa){b=N(b,da);H[j+8>>2]=b;b=Ea(b,2);H[j+4>>2]=b;if(b){break t}}Ca(p);Ca(m);b=H[j+4>>2];if(b){Ca(b);H[j+4>>2]=0}if(!o){b=j;break n}b=0;h=j;while(1){q=H[h+200>>2];if(q){k=0;r=H[h+196>>2];if(r){while(1){i=H[q+12>>2];if(i){Ca(i);H[q+12>>2]=0;r=H[h+196>>2]}q=q+16|0;k=k+1|0;if(r>>>0>k>>>0){continue}break}q=H[h+200>>2]}Ca(q);H[h+200>>2]=0}h=h+240|0;i=(b|0)==(D|0);b=b+1|0;if(!i){continue}break}b=j;break n}n=H[C+24>>2];Y=H[W+20>>2];H[j+204>>2]=Y;S=H[W+12>>2];H[j+208>>2]=S;x=H[W+16>>2];H[j+212>>2]=x;w=H[W+8>>2];H[j+216>>2]=w;H[j+12>>2]=da;H[j+16>>2]=fa;H[j+20>>2]=J;l=1;H[j+24>>2]=1;if(la){h=H[j+200>>2];u=0;b=n;while(1){q=H[m+(u<<2)>>2];H[h>>2]=H[b>>2];H[h+4>>2]=H[b+4>>2];ba=H[h+8>>2];u:{if(!ba){break u}k=H[h+12>>2];if((ba|0)!=1){i=ba&-2;r=0;while(1){H[k>>2]=H[q>>2];H[k+4>>2]=H[q+4>>2];H[k+8>>2]=H[q+8>>2];H[k+12>>2]=H[q+12>>2];H[k+16>>2]=H[q+16>>2];H[k+20>>2]=H[q+20>>2];H[k+24>>2]=H[q+24>>2];H[k+28>>2]=H[q+28>>2];k=k+32|0;q=q+32|0;r=r+2|0;if((i|0)!=(r|0)){continue}break}}if(!(ba&1)){break u}H[k>>2]=H[q>>2];H[k+4>>2]=H[q+4>>2];H[k+8>>2]=H[q+8>>2];H[k+12>>2]=H[q+12>>2]}b=b+52|0;h=h+16|0;u=u+1|0;if((la|0)!=(u|0)){continue}break}}if(o>>>0>1){i=j;while(1){H[i+456>>2]=w;H[i+452>>2]=x;H[i+448>>2]=S;H[i+444>>2]=Y;H[i+264>>2]=1;H[i+260>>2]=J;H[i+256>>2]=fa;H[i+252>>2]=da;if(la){h=H[i+440>>2];u=0;b=n;while(1){q=H[m+(u<<2)>>2];H[h>>2]=H[b>>2];H[h+4>>2]=H[b+4>>2];ba=H[h+8>>2];v:{if(!ba){break v}k=H[h+12>>2];if((ba|0)!=1){o=ba&-2;r=0;while(1){H[k>>2]=H[q>>2];H[k+4>>2]=H[q+4>>2];H[k+8>>2]=H[q+8>>2];H[k+12>>2]=H[q+12>>2];H[k+16>>2]=H[q+16>>2];H[k+20>>2]=H[q+20>>2];H[k+24>>2]=H[q+24>>2];H[k+28>>2]=H[q+28>>2];k=k+32|0;q=q+32|0;r=r+2|0;if((o|0)!=(r|0)){continue}break}}if(!(ba&1)){break v}H[k>>2]=H[q>>2];H[k+4>>2]=H[q+4>>2];H[k+8>>2]=H[q+8>>2];H[k+12>>2]=H[q+12>>2]}b=b+52|0;h=h+16|0;u=u+1|0;if((la|0)!=(u|0)){continue}break}}b=H[i+8>>2];H[i+244>>2]=H[i+4>>2];H[i+248>>2]=b;b=(l|0)!=(D|0);i=i+240|0;l=l+1|0;if(b){continue}break}}Ca(p);Ca(m);i=H[ua+420>>2];w:{if(I[ua+5640|0]&4){if((i|0)==-1){break w}k=ua+424|0;h=H[ua+8>>2];r=0;q=j;while(1){b=H[k+36>>2];H[q+44>>2]=1;H[q+84>>2]=b;H[q+48>>2]=H[k>>2];b=H[k+4>>2];H[q+68>>2]=0;H[q+72>>2]=0;H[q+52>>2]=b;H[q+60>>2]=H[k+12>>2];H[q+64>>2]=H[k+16>>2];b=H[k+8>>2];H[q+76>>2]=J;H[q+56>>2]=b>>>0>>0?b:h;k=k+148|0;q=q+240|0;b=(i|0)==(r|0);r=r+1|0;if(!b){continue}break}break w}if((i|0)==-1){break w}l=H[ua+8>>2];h=H[ua+4>>2];q=j;if(i){b=i+1&-2;E=0;while(1){H[q+68>>2]=0;H[q+72>>2]=0;H[q+52>>2]=0;H[q+44>>2]=1;H[q+48>>2]=0;H[q+84>>2]=h;H[q+60>>2]=_;H[q+324>>2]=h;H[q+76>>2]=J;H[q+56>>2]=l;H[q+308>>2]=0;H[q+312>>2]=0;H[q+292>>2]=0;H[q+284>>2]=1;H[q+288>>2]=0;H[q+300>>2]=_;H[q+296>>2]=l;H[q+316>>2]=J;H[q+64>>2]=H[q+196>>2];H[q+304>>2]=H[q+436>>2];q=q+480|0;E=E+2|0;if((b|0)!=(E|0)){continue}break}}if(i&1){break w}H[q+68>>2]=0;H[q+72>>2]=0;H[q+52>>2]=0;H[q+44>>2]=1;H[q+48>>2]=0;H[q+84>>2]=h;H[q+60>>2]=_;H[q+76>>2]=J;H[q+56>>2]=l;H[q+64>>2]=H[q+196>>2]}l=j;break m}Ca(p)}Ca(b)}na=W+32|0;j=l;x:{y:{if(!j){break y}fa=aa+1|0;q=v;v=s;i=j;z:{A:{while(1){if(H[i+84>>2]==-1){break z}ba=Fa(H[C+16>>2]<<2);if(!ba){break z}b=H[C+16>>2]<<2;if(b){y(ba,1,b)}if(Xb(i)){while(1){M=H[q+20>>2];B:{C:{if(K[i+40>>2]>=K[ea+12>>2]){break C}h=H[i+32>>2];b=N(H[i+28>>2],76)+M|0;if(h>>>0>=K[b+24>>2]){break C}l=H[b+28>>2]+N(h,152)|0;if(!H[l+24>>2]){break C}h=l+28|0;E=0;D:{while(1){b=h+N(E,36)|0;n=H[b+20>>2]+N(H[i+36>>2],40)|0;if(!yb(Q,H[i+28>>2],H[i+32>>2],H[b+16>>2],H[n>>2],H[n+4>>2],H[n+8>>2],H[n+12>>2])){E=E+1|0;if(E>>>0>2]){continue}break D}break}H[ba+(H[i+28>>2]<<2)>>2]=0;H[R+136>>2]=0;if(!Wb(H[ka+4>>2],H[q+20>>2],ea,i,R+140|0,v,R+136|0,g,f)){break A}E=H[i+32>>2];u=H[i+28>>2];o=H[R+136>>2];if(H[R+140>>2]){H[R+136>>2]=0;S=H[(H[q+20>>2]+N(u,76)|0)+28>>2]+N(E,152)|0;M=H[S+24>>2];if(M){Y=g-o|0;x=g+v|0;u=S+28|0;n=0;k=0;w=o+v|0;m=w;while(1){E:{if(H[u+8>>2]==H[u>>2]|H[u+12>>2]==H[u+4>>2]){break E}b=H[u+20>>2]+N(H[i+36>>2],40)|0;p=N(H[b+20>>2],H[b+16>>2]);if(!p){break E}M=H[b+24>>2];A=0;while(1){D=H[M+36>>2];if(D){F:{if(k|H[M+64>>2]){H[M+52>>2]=0;E=1;b=64;break F}E=H[M>>2];b=H[M+40>>2];G:{if(b){E=N(b,24)+E|0;if(H[E-20>>2]!=H[E-12>>2]){E=E-24|0;break G}b=b+1|0}else{b=1}H[M+40>>2]=b}h=H[E+20>>2];H:{I:{if(h>>>0>(m^-1)>>>0){break I}l=E+20|0;while(1){if(x>>>0>>0){break I}r=H[M+4>>2];k=H[M+52>>2];if((k|0)!=H[M+56>>2]){b=D}else{b=k<<1|1;r=Ha(r,b<<3);if(!r){Ba(f,1,1024,0);break A}H[M+56>>2]=b;H[M+4>>2]=r;k=H[M+52>>2];h=H[l>>2];b=H[M+36>>2]}l=(k<<3)+r|0;H[l+4>>2]=h;H[l>>2]=m;H[M+52>>2]=k+1;H[E>>2]=H[E>>2]+h;k=H[E+16>>2];l=k+H[E+4>>2]|0;H[E+4>>2]=l;D=b-k|0;H[M+36>>2]=D;H[E+8>>2]=l;m=h+m|0;h=0;if((b|0)==(k|0)){break H}H[M+40>>2]=H[M+40>>2]+1;l=E+44|0;h=H[E+44>>2];E=E+24|0;if((m^-1)>>>0>=h>>>0){continue}break}}k=H[i+28>>2];l=H[i+32>>2];b=H[i+36>>2];if(H[H[ka+4>>2]+104>>2]){H[R+120>>2]=k;H[R+116>>2]=l;H[R+112>>2]=n;H[R+108>>2]=b;H[R+104>>2]=A;H[R+100>>2]=Y;H[R+96>>2]=h;Ba(f,1,14693,R+96|0);break A}H[R+88>>2]=k;H[R+84>>2]=l;H[R+80>>2]=n;H[R+76>>2]=b;H[R+72>>2]=A;H[R+68>>2]=Y;H[R+64>>2]=h;Ba(f,2,14693,R- -64|0);H[M+52>>2]=0;H[M+64>>2]=1;h=1}k=h;E=H[M+40>>2];b=44}H[b+M>>2]=E}M=M+68|0;A=A+1|0;if((p|0)!=(A|0)){continue}break}M=H[S+24>>2]}u=u+36|0;n=n+1|0;if(M>>>0>n>>>0){continue}break}E=H[i+32>>2];u=H[i+28>>2];b=k?Y:m-w|0}else{b=0}o=b+o|0}b=H[C+24>>2]+N(u,52)|0;h=H[b+36>>2];H[b+36>>2]=h>>>0>>0?E:h;break B}M=H[q+20>>2]}H[R+136>>2]=0;if(!Wb(H[ka+4>>2],M,ea,i,R+140|0,v,R+136|0,g,f)){break A}u=H[i+28>>2];o=H[R+136>>2];if(!H[R+140>>2]){break B}w=H[i+32>>2];b=H[(H[q+20>>2]+N(u,76)|0)+28>>2]+N(w,152)|0;p=H[b+24>>2];if(!p){break B}S=g-o|0;r=b+28|0;x=H[i+36>>2];E=0;k=0;J:{K:{while(1){L:{if(H[r+8>>2]==H[r>>2]|H[r+12>>2]==H[r+4>>2]){break L}b=H[r+20>>2]+N(x,40)|0;l=N(H[b+20>>2],H[b+16>>2]);if(!l){break L}D=H[b+24>>2];n=0;while(1){h=H[D+36>>2];if(h){M=H[D>>2];A=H[D+40>>2];M:{if(A){M=N(A,24)+M|0;if(H[M-20>>2]!=H[M-12>>2]){M=M-24|0;break M}A=A+1|0}else{A=1}H[D+40>>2]=A}m=H[M+20>>2];E=E+m|0;if(S>>>0>>0|m>>>0>E>>>0){break J}while(1){N:{m=H[M+16>>2];H[M+4>>2]=m+H[M+4>>2];b=h-m|0;if((h|0)==(m|0)){break N}A=A+1|0;H[D+40>>2]=A;m=H[M+44>>2];E=E+m|0;if(m>>>0>E>>>0){break K}M=M+24|0;h=b;if(E>>>0<=S>>>0){continue}break K}break}H[D+36>>2]=b}D=D+68|0;n=n+1|0;if((l|0)!=(n|0)){continue}break}}r=r+36|0;k=k+1|0;if((p|0)!=(k|0)){continue}break}o=o+E|0;break B}H[D+36>>2]=b}if(!H[H[ka+4>>2]+104>>2]){H[R+24>>2]=u;H[R+20>>2]=w;H[R+16>>2]=k;H[R+12>>2]=x;H[R+8>>2]=n;H[R+4>>2]=S;H[R>>2]=m;Ba(f,2,14608,R);u=H[i+28>>2];o=o+S|0;break B}H[R+56>>2]=u;H[R+52>>2]=w;H[R+48>>2]=k;H[R+44>>2]=x;H[R+40>>2]=n;H[R+36>>2]=S;H[R+32>>2]=m;Ba(f,1,14608,R+32|0);break A}O:{if(!H[ba+(u<<2)>>2]){break O}b=H[C+24>>2]+N(u,52)|0;if(H[b+36>>2]){break O}H[b+36>>2]=H[(H[q+20>>2]+N(u,76)|0)+24>>2]-1}g=g-o|0;v=o+v|0;if(Xb(i)){continue}break}}Ca(ba);i=i+240|0;ma=ma+1|0;if(ma>>>0<=K[ea+420>>2]){continue}break}zb(j,fa);H[Ga+8>>2]=v-s;b=1;break x}zb(j,fa);Ca(ba);break y}zb(j,fa)}b=0}na=R+144|0;eb(ka);if(!b){break b}$=H[H[Q+32>>2]+5584>>2];r=H[H[Q+20>>2]>>2];v=H[r+20>>2];H[Ga+12>>2]=1;u=0;b=H[Q+32>>2];q=H[$+16>>2]>>>4&1&H[b+12>>2]==H[b+8>>2];D=H[r+16>>2];P:{if(!D){break P}while(1){b=H[Q+68>>2];if(!(H[b+(u<<2)>>2]?0:b)){h=Ga+12|0;ma=0;ra=H[v+24>>2];Q:{if(!ra){break Q}p=H[Q+44>>2];while(1){s=H[v+28>>2]+N(ma,152)|0;n=H[s+24>>2];if(n){g=s+28|0;ra=H[s+20>>2];k=H[s+16>>2];l=0;while(1){if(N(k,ra)){o=g+N(l,36)|0;i=0;while(1){w=H[o+20>>2]+N(i,40)|0;b=yb(Q,H[v+16>>2],ma,H[o+16>>2],H[w>>2],H[w+4>>2],H[w+8>>2],H[w+12>>2]);m=H[w+16>>2];n=H[w+20>>2];j=N(m,n);R:{if(b){if(!j){break R}m=0;while(1){j=H[w+24>>2]+N(m,68)|0;S:{if(!yb(Q,H[v+16>>2],ma,H[o+16>>2],H[j+8>>2],H[j+12>>2],H[j+16>>2],H[j+20>>2])){b=H[j+60>>2];if(!b){break S}Ca(b);H[j+60>>2]=0;break S}if(!H[Q+64>>2]){if(H[j+60>>2]|H[j+16>>2]==H[j+8>>2]|H[j+20>>2]==H[j+12>>2]){break S}}n=Ea(1,44);if(!n){H[Ga+12>>2]=0;break Q}b=H[Q+64>>2];H[n+36>>2]=0;H[n+28>>2]=h;H[n+20>>2]=$;H[n+16>>2]=v;H[n+12>>2]=o;H[n+8>>2]=j;H[n+4>>2]=ma;H[n>>2]=b;H[n+40>>2]=q;H[n+32>>2]=f;H[n+24>>2]=H[p+4>>2]>1;fb(p,14,n);if(!H[Ga+12>>2]){break Q}}m=m+1|0;if(m>>>0>2],H[w+16>>2])>>>0){continue}break}break R}if(!j){break R}k=0;while(1){j=H[w+24>>2]+N(k,68)|0;b=H[j+60>>2];if(b){Ca(b);H[j+60>>2]=0;m=H[w+16>>2];n=H[w+20>>2]}k=k+1|0;if(k>>>0>>0){continue}break}}i=i+1|0;k=H[s+16>>2];ra=H[s+20>>2];if(i>>>0>>0){continue}break}n=H[s+24>>2]}l=l+1|0;if(n>>>0>l>>>0){continue}break}ra=H[v+24>>2]}ma=ma+1|0;if(ra>>>0>ma>>>0){continue}break}}if(!H[Ga+12>>2]){break P}D=H[r+16>>2]}$=$+1080|0;v=v+76|0;u=u+1|0;if(u>>>0>>0){continue}break}}$=0;Ta(H[Q+44>>2]);if(!H[Ga+12>>2]){break b}T:{if(H[Q+64>>2]){break T}u=H[Q+24>>2];if(!H[u+16>>2]){break T}v=0;while(1){i=H[H[H[Q+20>>2]>>2]+20>>2]+N(v,76)|0;b=H[i+28>>2]+N(H[(H[u+24>>2]+N(v,52)|0)+36>>2],152)|0;l=H[b+136>>2];h=H[b+144>>2];g=H[b+140>>2];j=H[b+148>>2];Ca(H[i+52>>2]);H[i+52>>2]=0;U:{b=H[Q+68>>2];if((h|0)==(l|0)|(g|0)==(j|0)|(H[b+(v<<2)>>2]?0:b)){break U}j=j-g|0;b=h-l|0;te(j,0,b);if(qa){Ba(f,1,2982,0);break b}b=N(b,j);if(b>>>0>=1073741824){Ba(f,1,2982,0);break b}b=Ia(b<<2);H[i+52>>2]=b;if(b){break U}Ba(f,1,2982,0);break b}v=v+1|0;u=H[Q+24>>2];if(v>>>0>2]){continue}break}}u=H[Q+32>>2];ra=H[H[Q+20>>2]>>2];if(H[ra+16>>2]){v=H[ra+20>>2];u=H[u+5584>>2];D=H[H[Q+24>>2]+24>>2];q=0;while(1){V:{b=H[Q+68>>2];if(H[b+(q<<2)>>2]?0:b){break V}g=H[D+36>>2]+1|0;if(H[u+20>>2]==1){ja=g;b=0;ta=na-32|0;na=ta;W:{X:{if(H[Q+64>>2]){h=1;if((g|0)==1){break W}j=H[v+28>>2];b=j+N(H[v+24>>2],152)|0;k=H[b-144>>2];m=H[b-152>>2];if((k|0)==(m|0)){break W}X=g-1|0;n=X&1;S=H[Q+44>>2];w=H[S+4>>2];Y:{if((g|0)==2){b=0;g=j;break Y}i=X&-2;b=0;g=j;h=0;while(1){l=H[g+160>>2]-H[g+152>>2]|0;l=b>>>0>l>>>0?b:l;b=H[g+164>>2]-H[g+156>>2]|0;l=b>>>0>>0?l:b;b=H[g+312>>2]-H[g+304>>2]|0;l=b>>>0>>0?l:b;b=H[g+316>>2]-H[g+308>>2]|0;b=b>>>0>>0?l:b;g=g+304|0;h=h+2|0;if((i|0)!=(h|0)){continue}break}}h=0;if(n){l=H[g+160>>2]-H[g+152>>2]|0;l=b>>>0>l>>>0?b:l;b=H[g+164>>2]-H[g+156>>2]|0;b=b>>>0>>0?l:b}if(b>>>0>134217727){break W}n=H[j+4>>2];i=H[j+12>>2];l=H[j>>2];g=H[j+8>>2];r=b<<5;x=pb(r);H[ta+16>>2]=x;if(!x){break W}s=k-m|0;i=i-n|0;l=g-l|0;H[ta>>2]=x;while(1){o=H[v+36>>2];h=i;H[ta+8>>2]=i;b=l;H[ta+24>>2]=b;n=H[j+156>>2];i=H[j+164>>2];l=H[j+160>>2];g=H[j+152>>2];H[ta+28>>2]=(g|0)%2;l=l-g|0;H[ta+20>>2]=l-b;m=(w|0)<2;i=i-n|0;Z:{if(!(!m&i>>>0>1)){g=0;if(!i){break Z}while(1){bc(ta+16|0,o+(N(g,s)<<2)|0);g=g+1|0;if((i|0)!=(g|0)){continue}break}break Z}p=i>>>0>>0?i:w;n=p-1|0;k=(i>>>0)/(p>>>0)|0;b=0;while(1){Y=Fa(36);if(!Y){break X}g=H[ta+20>>2];H[Y>>2]=H[ta+16>>2];H[Y+4>>2]=g;g=H[ta+28>>2];H[Y+8>>2]=H[ta+24>>2];H[Y+12>>2]=g;H[Y+28>>2]=N(b,k);H[Y+24>>2]=o;H[Y+20>>2]=s;H[Y+16>>2]=l;g=(b|0)==(n|0);b=b+1|0;H[Y+32>>2]=g?i:N(k,b);g=pb(r);H[Y>>2]=g;if(!g){h=0;Ta(S);Ca(Y);Ca(x);break W}fb(S,10,Y);if((b|0)!=(p|0)){continue}break}Ta(S)}H[ta+4>>2]=i-h;H[ta+12>>2]=H[j+156>>2]%2;_:{if(!(!m&l>>>0>1)){b=8;g=0;if(l>>>0>=8){while(1){ob(ta,o+(g<<2)|0,s,8);g=b;b=b+8|0;if(l>>>0>=b>>>0){continue}break}}if(g>>>0>=l>>>0){break _}ob(ta,o+(g<<2)|0,s,l-g|0);break _}m=l>>>0>>0?l:w;h=m-1|0;n=(l>>>0)/(m>>>0)|0;b=0;while(1){k=Fa(36);if(!k){break X}g=H[ta+4>>2];H[k>>2]=H[ta>>2];H[k+4>>2]=g;g=H[ta+12>>2];H[k+8>>2]=H[ta+8>>2];H[k+12>>2]=g;H[k+28>>2]=N(b,n);H[k+24>>2]=o;H[k+20>>2]=s;H[k+16>>2]=i;g=(b|0)==(h|0);b=b+1|0;H[k+32>>2]=g?l:N(n,b);g=pb(r);H[k>>2]=g;if(!g){h=0;Ta(S);Ca(k);Ca(x);break W}fb(S,11,k);if((b|0)!=(m|0)){continue}break}Ta(S)}j=j+152|0;X=X-1|0;if(X){continue}break}h=1;Ca(x);break W}h=1;m=H[v+28>>2];Na=m+N(ja,152)|0;mb=Na-152|0;if(H[mb>>2]==H[Na-144>>2]){break W}nb=Na-148|0;if(H[nb>>2]==H[Na-140>>2]){break W}r=H[m+4>>2];p=H[m+12>>2];k=H[m>>2];n=H[m+8>>2];J=H[v+68>>2];aa=H[v+64>>2];_=H[v+60>>2];da=H[v+56>>2];Ka=ac(v,ja);if(!Ka){h=0;break W}$:{aa:{if((ja|0)!=1){j=ja-1|0;i=j&1;ba:{if((ja|0)==2){g=m;break ba}l=j&-2;g=m;h=0;while(1){j=H[g+160>>2]-H[g+152>>2]|0;j=b>>>0>j>>>0?b:j;b=H[g+164>>2]-H[g+156>>2]|0;j=b>>>0>>0?j:b;b=H[g+312>>2]-H[g+304>>2]|0;j=b>>>0>>0?j:b;b=H[g+316>>2]-H[g+308>>2]|0;b=b>>>0>>0?j:b;g=g+304|0;h=h+2|0;if((l|0)!=(h|0)){continue}break}}if(i){j=H[g+160>>2]-H[g+152>>2]|0;j=b>>>0>j>>>0?b:j;b=H[g+164>>2]-H[g+156>>2]|0;b=b>>>0>>0?j:b}if(b>>>0>=268435456){break $}t=pb(b<<4);if(!t){break $}ca:{if(!ja){break ca}X=p-r|0;A=n-k|0;qb=t+28|0;S=t+24|0;gb=t+16|0;xa=t+4|0;$a=1;da:while(1){j=H[m+156>>2];ab=(j|0)%2|0;b=H[m+152>>2];La=(b|0)%2|0;ba=H[m+164>>2]-j|0;Aa=ba-X|0;fa=H[m+160>>2]-b|0;va=fa-A|0;i=da;h=i;g=_;l=g;b=aa;ea=b;j=J;ga=j;n=H[v+20>>2];ea:{if((n|0)==($a|0)){break ea}s=n-$a|0;l=0;h=0;if(i){j=s&31;if((s&63)>>>0>=32){o=-1<>>32-j}b=i+(b^-1)|0;j=o^-1;j=b>>>0>>0?j+1|0:j;g=s&31;if((s&63)>>>0>=32){h=j>>>g|0}else{h=((1<>>g}}if(_){j=s&31;if((s&63)>>>0>=32){o=-1<>>32-j}b=_+(b^-1)|0;j=o^-1;j=b>>>0<_>>>0?j+1|0:j;g=s&31;if((s&63)>>>0>=32){l=j>>>g|0}else{l=((1<>>g}}j=0;b=0;if(aa){g=s&31;if((s&63)>>>0>=32){o=-1<>>32-g}b=aa+(b^-1)|0;g=o^-1;g=b>>>0>>0?g+1|0:g;i=s&31;if((s&63)>>>0>=32){b=g>>>i|0}else{b=((1<>>i}}if(J){g=s&31;if((s&63)>>>0>=32){o=-1<>>32-g}j=J+(j^-1)|0;g=o^-1;g=j>>>0>>0?g+1|0:g;i=s&31;if((s&63)>>>0>=32){j=g>>>i|0}else{j=((1<>>i}}ea=0;i=0;r=1<>>0>>0){i=s&31;if((s&63)>>>0>=32){o=-1<>>32-i}n=g^-1;g=n+(da-r|0)|0;i=o^-1;i=g>>>0>>0?i+1|0:i;n=s&31;if((s&63)>>>0>=32){i=i>>>n|0}else{i=((1<>>n}}if(r>>>0>>0){n=s&31;if((s&63)>>>0>=32){o=-1<>>32-n}k=g^-1;g=k+(aa-r|0)|0;n=o^-1;n=g>>>0>>0?n+1|0:n;k=s&31;if((s&63)>>>0>=32){ea=n>>>k|0}else{ea=((1<>>k}}ga=0;g=0;if(r>>>0<_>>>0){n=s&31;if((s&63)>>>0>=32){o=-1<>>32-n}k=g^-1;g=k+(_-r|0)|0;n=o^-1;n=g>>>0>>0?n+1|0:n;k=s&31;if((s&63)>>>0>=32){g=n>>>k|0}else{g=((1<>>k}}if(r>>>0>=J>>>0){break ea}k=s&31;if((s&63)>>>0>=32){o=-1<>>32-k}p=n^-1;n=p+(J-r|0)|0;k=o^-1;k=n>>>0

>>0?k+1|0:k;p=s&31;if((s&63)>>>0>=32){ga=k>>>p|0}else{ga=((1<>>p}}p=H[m+180>>2];n=ea-p|0;k=n>>>0<=ea>>>0?n:0;n=k+2|0;n=k>>>0>n>>>0?-1:n;ya=n>>>0>>0?n:va;k=H[m+216>>2];n=b-k|0;n=b>>>0>=n>>>0?n:0;b=n+2|0;b=b>>>0>>0?-1:b;za=b>>>0>>0?b:A;n=(La?ya:za)<<1;b=(La?za:ya)<<1|1;Sa=b>>>0>>0?n:b;M=Sa>>>0>>0;b=i-p|0;i=b>>>0<=i>>>0?b:0;b=i-2|0;p=b>>>0<=i>>>0?b:0;b=h-k|0;h=b>>>0<=h>>>0?b:0;b=h-2|0;r=b>>>0<=h>>>0?b:0;Y=(La?p:r)<<1;w=(La?r:p)<<1|1;s=Y>>>0>>0;n=H[m+184>>2];b=l-n|0;h=b>>>0<=l>>>0?b:0;b=h-2|0;i=b>>>0<=h>>>0?b:0;o=i;h=H[m+220>>2];b=g-h|0;g=b>>>0<=g>>>0?b:0;b=g-2|0;l=b>>>0<=g>>>0?b:0;x=l;b=j-n|0;j=b>>>0<=j>>>0?b:0;b=j+2|0;b=b>>>0>>0?-1:b;Ma=b>>>0>>0?b:X;k=Ma;b=ga-h|0;j=b>>>0<=ga>>>0?b:0;b=j+2|0;b=b>>>0>>0?-1:b;E=b>>>0>>0?b:Aa;ma=E;if(ab){x=i;o=l;ma=k;k=E}bb=M?Sa:fa;M=s?Y:w;rb=E+X|0;sb=l+X|0;if(ba){Oa=t+(r<<3)|0;g=t+(va<<3)|0;Z=g-4|0;j=(r|0)<(va|0);ia=j?Oa+4|0:Z;Va=A-1|0;V=(ya|0)<(Va|0)?ya:Va;ga=0;ca=(A|0)>1|(va|0)>0;b=La<<2;oa=(xa-b|0)+(p<<3)|0;R=b+Oa|0;Y=(va|0)>(za|0)?za:va;w=r+1|0;W=A+ya|0;C=p+A|0;ka=t+(M<<2)|0;la=!A&(va|0)==1;b=t+(A<<3)|0;s=b-8|0;Ya=b-4|0;Za=g-8|0;pa=t+(bb<<2)|0;sa=pa-4|0;ua=(t+((j?r:va)<<3)|0)-4|0;while(1){fa:{if(!(ga>>>0>>0&i>>>0<=ga>>>0|ga>>>0>>0&ga>>>0>=sb>>>0)){n=ga+1|0;break fa}if(fa>>>0>Sa>>>0){H[sa>>2]=0;H[pa>>2]=0}n=ga+1|0;Pa(Ka,r,ga,za,n,R,2,0);Pa(Ka,C,ga,W,n,oa,2,0);ga:{ha:{ia:{if(!La){if(!ca){break ga}if((r|0)>=(za|0)){break ha}ja:{ka:{if((r|0)>0){b=H[ua>>2];break ka}b=H[xa>>2];h=b;if((r|0)<0){break ja}}h=b;b=H[ia>>2]}H[Oa>>2]=H[Oa>>2]-((b+h|0)+2>>2);b=w;h=b;j=r;if((b|0)>=(Y|0)){break ia}while(1){b=t+(h<<3)|0;H[b>>2]=H[b>>2]-((H[(t+(j<<3)|0)+4>>2]+H[b+4>>2]|0)+2>>2);j=h;h=h+1|0;if((Y|0)!=(h|0)){continue}break}b=Y;break ia}la:{if(!la){b=r;if((za|0)<=(b|0)){break la}while(1){h=t+(b<<3)|0;g=H[h+4>>2];j=Za;ma:{na:{if((b|0)>=0){ea=H[((b|0)<(va|0)?h:Za)>>2];b=b+1|0;break na}ea=H[t>>2];if((b|0)!=-1){b=b+1|0;j=t;break ma}b=0}if((b|0)>=(va|0)){break ma}j=t+(b<<3)|0}H[h+4>>2]=g-((H[j>>2]+ea|0)+2>>2);if((b|0)<(za|0)){continue}break}break la}H[t>>2]=H[t>>2]/2;break ga}b=p;if((ya|0)<=(b|0)){break ga}while(1){ea=t+(b<<3)|0;h=H[ea>>2];oa:{if((b|0)<0){g=H[xa>>2];j=xa;break oa}g=H[((b|0)<(A|0)?ea+4|0:Ya)>>2];j=xa;if(!b){break oa}j=(b|0)>(A|0)?Ya:ea-4|0}H[ea>>2]=h+(H[j>>2]+g>>1);b=b+1|0;if((ya|0)!=(b|0)){continue}break}break ga}if((b|0)>=(za|0)){break ha}while(1){j=t+(b<<3)|0;ea=j;h=H[j>>2];pa:{qa:{if((b|0)>0){j=H[(t+(((b|0)<(va|0)?b:va)<<3)|0)-4>>2];break qa}j=H[xa>>2];g=xa;if((b|0)<0){break pa}}g=Z;if((b|0)>=(va|0)){break pa}g=(t+(b<<3)|0)+4|0}H[ea>>2]=h-((H[g>>2]+j|0)+2>>2);b=b+1|0;if((za|0)!=(b|0)){continue}break}}if((p|0)>=(ya|0)){break ga}b=p;if((Va|0)>(b|0)){while(1){j=t+(b<<3)|0;b=b+1|0;H[j+4>>2]=H[j+4>>2]+(H[t+(b<<3)>>2]+H[j>>2]>>1);if((b|0)<(V|0)){continue}break}}if((b|0)>=(ya|0)){break ga}while(1){h=s;g=b;ra:{sa:{if((b|0)>=0){j=H[((b|0)<(A|0)?t+(b<<3)|0:h)>>2];b=b+1|0;break sa}j=H[t>>2];if((g|0)!=-1){b=g+1|0;h=t;break ra}b=0}if((A|0)<=(b|0)){break ra}h=t+(b<<3)|0}g=t+(g<<3)|0;H[g+4>>2]=H[g+4>>2]+(H[h>>2]+j>>1);if((b|0)<(ya|0)){continue}break}}if(!_a(Ka,M,ga,bb,n,ka,1,0)){break aa}}ga=n;if((n|0)!=(ba|0)){continue}break}}m=m+152|0;j=k<<1;b=ma<<1|1;b=b>>>0>>0?j:b;R=b>>>0>>0?b:ba;wa=t+(i<<5)|0;h=t+(Aa<<5)|0;Z=h-4|0;b=(i|0)<(Aa|0);W=b?wa+28|0:Z;ia=h-8|0;C=b?wa+24|0:ia;V=h-12|0;ka=b?wa+20|0:V;ca=h-16|0;la=(i|0)<0?gb:b?wa+16|0:ca;oa=X-1|0;pa=(E|0)<(oa|0)?E:oa;g=t+((b?i:Aa)<<5)|0;sa=(i|0)<=0;ua=sa?gb:g-16|0;ea=(Aa|0)>0;A=ea|(X|0)>1;ga=wa+(ab<<4)|0;ma=(t+(4-(ab<<2)<<2)|0)+(l<<5)|0;r=(Aa|0)>(Ma|0)?Ma:Aa;k=i+1|0;j=o<<1;b=x<<1|1;Y=b>>>0>j>>>0?j:b;x=t+(Y<<4)|0;w=!X&(Aa|0)==1;b=t+(X<<5)|0;hb=b-20|0;ib=b-24|0;jb=b-28|0;va=b-32|0;ya=b-4|0;za=b-8|0;La=b-12|0;Oa=b-16|0;Sa=h-20|0;Va=h-24|0;Ya=h-28|0;Za=h-32|0;s=g-4|0;n=g-8|0;o=g-12|0;while(1){ta:{ua:{va:{wa:{p=M;if(p>>>0>>0){b=bb-p|0;M=p+(b>>>0>=4?4:b)|0;Pa(Ka,p,i,M,Ma,ga,1,8);Pa(Ka,p,sb,M,rb,ma,1,8);if(!ab){if(!A){break ta}if((i|0)>=(Ma|0)){break ua}H[wa>>2]=H[wa>>2]-((H[ua>>2]+H[la>>2]|0)+2>>2);xa:{if(!sa){b=H[o>>2];j=n;g=s;break xa}b=H[t+20>>2];if((i|0)<0){break wa}j=S;g=qb}H[wa+4>>2]=H[wa+4>>2]-((H[ka>>2]+b|0)+2>>2);H[wa+8>>2]=H[wa+8>>2]-((H[j>>2]+H[C>>2]|0)+2>>2);b=H[W>>2];j=H[g>>2];break va}if(w){H[t>>2]=H[t>>2]/2;H[t+4>>2]=H[t+4>>2]/2;H[t+8>>2]=H[t+8>>2]/2;H[t+12>>2]=H[t+12>>2]/2;break ta}h=i;if((Ma|0)>(i|0)){while(1){g=t+(h<<5)|0;ya:{if((h|0)<0){b=H[t>>2];j=ea|(h|0)!=-1;H[g+16>>2]=H[g+16>>2]-(((j?b:H[Za>>2])+b|0)+2>>2);b=H[xa>>2];H[g+20>>2]=H[g+20>>2]-(((j?b:H[Ya>>2])+b|0)+2>>2);b=H[t+8>>2];H[g+24>>2]=H[g+24>>2]-(((j?b:H[Va>>2])+b|0)+2>>2);b=H[t+12>>2];H[g+28>>2]=H[g+28>>2]-(((j?b:H[Sa>>2])+b|0)+2>>2);j=h+1|0;break ya}j=h+1|0;za:{if((j|0)<(Aa|0)){b=t+(j<<5)|0;H[g+16>>2]=H[g+16>>2]-((H[g>>2]+H[b>>2]|0)+2>>2);H[g+20>>2]=H[g+20>>2]-((H[g+4>>2]+H[b+4>>2]|0)+2>>2);H[g+24>>2]=H[g+24>>2]-((H[g+8>>2]+H[b+8>>2]|0)+2>>2);H[g+28>>2]=H[g+28>>2]-((H[g+12>>2]+H[b+12>>2]|0)+2>>2);break za}b=H[g+16>>2];if((h|0)>=(Aa|0)){H[g+16>>2]=b-((H[Za>>2]<<1)+2>>2);H[g+20>>2]=H[g+20>>2]-((H[Ya>>2]<<1)+2>>2);H[g+24>>2]=H[g+24>>2]-((H[Va>>2]<<1)+2>>2);H[g+28>>2]=H[g+28>>2]-((H[Sa>>2]<<1)+2>>2);break za}H[g+16>>2]=b-((H[g>>2]+H[Za>>2]|0)+2>>2);H[g+20>>2]=H[g+20>>2]-((H[g+4>>2]+H[Ya>>2]|0)+2>>2);H[g+24>>2]=H[g+24>>2]-((H[g+8>>2]+H[Va>>2]|0)+2>>2);H[g+28>>2]=H[g+28>>2]-((H[g+12>>2]+H[Sa>>2]|0)+2>>2)}}h=j;if((Ma|0)!=(h|0)){continue}break}}h=l;if((E|0)<=(h|0)){break ta}while(1){g=t+(h<<5)|0;Aa:{if((h|0)<0){H[g>>2]=H[g>>2]+(H[t+16>>2]<<1>>1);H[g+4>>2]=H[g+4>>2]+(H[t+20>>2]<<1>>1);H[g+8>>2]=H[g+8>>2]+(H[t+24>>2]<<1>>1);H[g+12>>2]=H[g+12>>2]+(H[t+28>>2]<<1>>1);break Aa}j=H[g>>2];if(!h){b=(h|0)<(X|0);H[g>>2]=j+(H[t+16>>2]+H[(b?g+16|0:Oa)>>2]>>1);H[g+4>>2]=H[g+4>>2]+(H[t+20>>2]+H[(b?g+20|0:La)>>2]>>1);H[g+8>>2]=H[g+8>>2]+(H[t+24>>2]+H[(b?g+24|0:za)>>2]>>1);H[g+12>>2]=H[g+12>>2]+(H[t+28>>2]+H[(b?g+28|0:ya)>>2]>>1);break Aa}if((h|0)<=(X|0)){b=(h|0)<(X|0);H[g>>2]=j+(H[g-16>>2]+H[(b?g+16|0:Oa)>>2]>>1);H[g+4>>2]=H[g+4>>2]+(H[g-12>>2]+H[(b?g+20|0:La)>>2]>>1);H[g+8>>2]=H[g+8>>2]+(H[g-8>>2]+H[(b?g+24|0:za)>>2]>>1);H[g+12>>2]=H[g+12>>2]+(H[g-4>>2]+H[(b?g+28|0:ya)>>2]>>1);break Aa}H[g>>2]=j+(H[Oa>>2]<<1>>1);H[g+4>>2]=H[g+4>>2]+(H[La>>2]<<1>>1);H[g+8>>2]=H[g+8>>2]+(H[za>>2]<<1>>1);H[g+12>>2]=H[g+12>>2]+(H[ya>>2]<<1>>1)}h=h+1|0;if((E|0)!=(h|0)){continue}break}break ta}A=fa;X=ba;$a=$a+1|0;if((ja|0)!=($a|0)){continue da}break ca}H[wa+4>>2]=H[wa+4>>2]-((b<<1)+2>>2);H[wa+8>>2]=H[wa+8>>2]-((H[S>>2]<<1)+2>>2);b=H[qb>>2];j=b}H[wa+12>>2]=H[wa+12>>2]-((b+j|0)+2>>2);g=i;b=k;h=b;if((b|0)<(r|0)){while(1){h=t+(b<<5)|0;j=t+(g<<5)|0;H[h>>2]=H[h>>2]-((H[j+16>>2]+H[h+16>>2]|0)+2>>2);H[h+4>>2]=H[h+4>>2]-((H[j+20>>2]+H[h+20>>2]|0)+2>>2);H[h+8>>2]=H[h+8>>2]-((H[j+24>>2]+H[h+24>>2]|0)+2>>2);H[h+12>>2]=H[h+12>>2]-((H[j+28>>2]+H[h+28>>2]|0)+2>>2);g=b;b=b+1|0;if((r|0)!=(b|0)){continue}break}h=r}if((h|0)>=(Ma|0)){break ua}while(1){z=t+(h<<5)|0;g=(h|0)<(Aa|0);Ba:{if((h|0)<=0){b=H[gb>>2];if((h|0)>=0){H[z>>2]=H[z>>2]-((b+H[(g?z+16|0:ca)>>2]|0)+2>>2);H[z+4>>2]=H[z+4>>2]-((H[t+20>>2]+H[(g?z+20|0:V)>>2]|0)+2>>2);H[z+8>>2]=H[z+8>>2]-((H[t+24>>2]+H[(g?z+24|0:ia)>>2]|0)+2>>2);H[z+12>>2]=H[z+12>>2]-((H[t+28>>2]+H[(g?z+28|0:Z)>>2]|0)+2>>2);break Ba}H[z>>2]=H[z>>2]-((b<<1)+2>>2);H[z+4>>2]=H[z+4>>2]-((H[t+20>>2]<<1)+2>>2);H[z+8>>2]=H[z+8>>2]-((H[t+24>>2]<<1)+2>>2);H[z+12>>2]=H[z+12>>2]-((H[t+28>>2]<<1)+2>>2);break Ba}j=t+((g?h:Aa)<<5)|0;b=H[j-16>>2];if(!g){H[z>>2]=H[z>>2]-((b+H[ca>>2]|0)+2>>2);H[z+4>>2]=H[z+4>>2]-((H[j-12>>2]+H[V>>2]|0)+2>>2);H[z+8>>2]=H[z+8>>2]-((H[j-8>>2]+H[ia>>2]|0)+2>>2);H[z+12>>2]=H[z+12>>2]-((H[j-4>>2]+H[Z>>2]|0)+2>>2);break Ba}H[z>>2]=H[z>>2]-((b+H[z+16>>2]|0)+2>>2);H[z+4>>2]=H[z+4>>2]-((H[j-12>>2]+H[z+20>>2]|0)+2>>2);H[z+8>>2]=H[z+8>>2]-((H[j-8>>2]+H[z+24>>2]|0)+2>>2);H[z+12>>2]=H[z+12>>2]-((H[j-4>>2]+H[z+28>>2]|0)+2>>2)}h=h+1|0;if((Ma|0)!=(h|0)){continue}break}}if((l|0)>=(E|0)){break ta}h=l;if((oa|0)>(h|0)){while(1){b=t+(h<<5)|0;H[b+16>>2]=H[b+16>>2]+(H[b+32>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[b+36>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[b+40>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[b+44>>2]+H[b+12>>2]>>1);h=h+1|0;if((pa|0)>(h|0)){continue}break}}if((h|0)>=(E|0)){break ta}while(1){z=t+(h<<5)|0;Ca:{Da:{Ea:{if((h|0)<0){b=H[t>>2];if((h|0)!=-1){break Ea}if((X|0)<=0){H[z+16>>2]=H[z+16>>2]+(b+H[va>>2]>>1);H[z+20>>2]=H[z+20>>2]+(H[jb>>2]+H[t+4>>2]>>1);H[z+24>>2]=H[z+24>>2]+(H[ib>>2]+H[t+8>>2]>>1);g=H[t+12>>2];b=H[hb>>2];break Da}break Ea}b=h+1|0;Fa:{if((b|0)<(X|0)){j=t+(b<<5)|0;H[z+16>>2]=H[z+16>>2]+(H[j>>2]+H[z>>2]>>1);H[z+20>>2]=H[z+20>>2]+(H[j+4>>2]+H[z+4>>2]>>1);H[z+24>>2]=H[z+24>>2]+(H[j+8>>2]+H[z+8>>2]>>1);H[z+28>>2]=H[z+28>>2]+(H[j+12>>2]+H[z+12>>2]>>1);break Fa}if((h|0)>=(X|0)){H[z+16>>2]=H[z+16>>2]+H[va>>2];H[z+20>>2]=H[z+20>>2]+H[jb>>2];H[z+24>>2]=H[z+24>>2]+H[ib>>2];H[z+28>>2]=H[z+28>>2]+H[hb>>2];break Fa}H[z+16>>2]=H[z+16>>2]+(H[va>>2]+H[z>>2]>>1);H[z+20>>2]=H[z+20>>2]+(H[jb>>2]+H[z+4>>2]>>1);H[z+24>>2]=H[z+24>>2]+(H[ib>>2]+H[z+8>>2]>>1);H[z+28>>2]=H[z+28>>2]+(H[hb>>2]+H[z+12>>2]>>1)}break Ca}H[z+16>>2]=b+H[z+16>>2];H[z+20>>2]=H[z+20>>2]+H[t+4>>2];H[z+24>>2]=H[z+24>>2]+H[t+8>>2];g=H[t+12>>2];b=g}H[z+28>>2]=H[z+28>>2]+(b+g>>1);b=h+1|0}h=b;if((E|0)!=(h|0)){continue}break}}if(_a(Ka,p,Y,M,R,x,1,4)){continue}break}break}break aa}Ca(t);h=1}l=H[Na-16>>2];g=H[mb>>2];j=H[nb>>2];b=H[Na-8>>2];Pa(Ka,l-g|0,H[Na-12>>2]-j|0,b-g|0,H[Na-4>>2]-j|0,H[v+52>>2],1,b-l|0);Wa(Ka);break W}Wa(Ka);Ca(t);h=0;break W}Wa(Ka);h=0;break W}h=0;Ta(S);Ca(x)}na=ta+32|0;if(h){break V}break b}i=0;n=0;Z=na+-64|0;na=Z;Ga:{Ha:{if(H[Q+64>>2]){h=H[v+28>>2];r=h+N(H[v+24>>2],152)|0;p=H[r-152>>2];k=1;oa=H[Q+44>>2];pa=H[oa+4>>2];if((g|0)==1){break Ga}o=g-1|0;m=o&1;Ia:{if((g|0)==2){l=0;b=h;break Ia}n=o&-2;l=0;b=h;while(1){j=H[b+160>>2]-H[b+152>>2]|0;g=j>>>0>>0?l:j;j=H[b+164>>2]-H[b+156>>2]|0;g=g>>>0>j>>>0?g:j;j=H[b+312>>2]-H[b+304>>2]|0;g=g>>>0>j>>>0?g:j;j=H[b+316>>2]-H[b+308>>2]|0;l=g>>>0>j>>>0?g:j;b=b+304|0;i=i+2|0;if((n|0)!=(i|0)){continue}break}}k=0;if(m){j=H[b+160>>2]-H[b+152>>2]|0;j=j>>>0>>0?l:j;b=H[b+164>>2]-H[b+156>>2]|0;l=b>>>0>>0?j:b}if(l>>>0>134217727){break Ga}m=H[r-144>>2];i=H[h+4>>2];g=H[h+12>>2];j=H[h>>2];b=H[h+8>>2];X=l<<5;ca=Ia(X);H[Z+32>>2]=ca;if(!ca){break Ga}n=g-i|0;g=b-j|0;b=pa>>>1|0;ga=b>>>0<=2?2:b;V=m-p|0;E=V<<5;ja=N(V,28);J=N(V,24);aa=N(V,20);_=V<<4;sa=N(V,12);ua=V<<3;H[Z>>2]=ca;ma=ca+32|0;j=H[v+36>>2];while(1){p=n;H[Z+8>>2]=n;b=g;H[Z+40>>2]=b;ka=H[h+156>>2];la=H[h+164>>2];i=H[h+160>>2];m=H[h+152>>2];H[Z+56>>2]=0;H[Z+52>>2]=b;H[Z+48>>2]=0;k=(m|0)%2|0;H[Z+44>>2]=k;g=i-m|0;x=g-b|0;H[Z+60>>2]=x;H[Z+36>>2]=x;w=(pa|0)<2;n=la-ka|0;Ja:{if(!(!w&n>>>0>15)){A=0;l=j;if(n>>>0<8){break Ja}s=g&-2;r=g&1;ia=0;k=(i|0)==(m+1|0);while(1){b=Z+32|0;Ab(b,l,V,8);Ua(b);if(g){b=0;A=0;if(!k){while(1){x=(b<<2)+l|0;i=ca+(b<<5)|0;L[x>>2]=L[i>>2];m=V<<2;L[m+x>>2]=L[i+4>>2];L[x+ua>>2]=L[i+8>>2];L[x+sa>>2]=L[i+12>>2];i=b|1;x=(i<<2)+l|0;i=ca+(i<<5)|0;L[x>>2]=L[i>>2];L[m+x>>2]=L[i+4>>2];L[x+ua>>2]=L[i+8>>2];L[x+sa>>2]=L[i+12>>2];b=b+2|0;A=A+2|0;if((s|0)!=(A|0)){continue}break}}if(r){i=(b<<2)+l|0;b=ca+(b<<5)|0;L[i>>2]=L[b>>2];L[i+(V<<2)>>2]=L[b+4>>2];L[i+ua>>2]=L[b+8>>2];L[i+sa>>2]=L[b+12>>2]}b=0;while(1){m=(b<<2)+l|0;i=ca+(b<<5)|0;L[m+_>>2]=L[i+16>>2];L[m+aa>>2]=L[i+20>>2];L[m+J>>2]=L[i+24>>2];L[m+ja>>2]=L[i+28>>2];b=b+1|0;if((g|0)!=(b|0)){continue}break}}l=l+E|0;b=ia+15|0;A=ia+8|0;ia=A;if(b>>>0>>0){continue}break}break Ja}l=n>>>3|0;s=l>>>0>>0?l:pa;r=(n>>>0)/(s>>>0)&-8;A=n&-8;i=0;l=j;while(1){S=Fa(48);if(!S){break Ha}m=Ia(X);H[S>>2]=m;if(!m){k=0;Ta(oa);Ca(S);Ca(ca);break Ga}H[S+40>>2]=l;H[S+36>>2]=V;H[S+32>>2]=g;H[S+28>>2]=x;H[S+24>>2]=0;H[S+20>>2]=b;H[S+16>>2]=0;H[S+12>>2]=k;H[S+8>>2]=b;H[S+4>>2]=x;m=A-N(i,r)|0;i=i+1|0;m=(s|0)==(i|0)?m:r;H[S+44>>2]=m;fb(oa,12,S);l=(N(m,V)<<2)+l|0;if((i|0)!=(s|0)){continue}break}Ta(oa)}Ka:{if(n>>>0<=A>>>0){break Ka}b=Z+32|0;i=n-A|0;Ab(b,l,V,i);Ua(b);if(!g){break Ka}r=i&-4;s=i&3;m=0;k=ka+(A-la|0)>>>0>4294967292;while(1){S=(m<<2)+l|0;x=ca+(m<<5)|0;b=0;A=0;if(!k){while(1){L[S+(N(b,V)<<2)>>2]=L[x+(b<<2)>>2];i=b|1;L[S+(N(i,V)<<2)>>2]=L[x+(i<<2)>>2];i=b|2;L[S+(N(i,V)<<2)>>2]=L[x+(i<<2)>>2];i=b|3;L[S+(N(i,V)<<2)>>2]=L[x+(i<<2)>>2];b=b+4|0;A=A+4|0;if((r|0)!=(A|0)){continue}break}}A=0;if(s){while(1){L[S+(N(b,V)<<2)>>2]=L[x+(b<<2)>>2];b=b+1|0;A=A+1|0;if((s|0)!=(A|0)){continue}break}}m=m+1|0;if((m|0)!=(g|0)){continue}break}}R=n-p|0;H[Z+4>>2]=R;b=H[h+156>>2];H[Z+28>>2]=R;H[Z+24>>2]=0;H[Z+20>>2]=p;H[Z+16>>2]=0;ea=(b|0)%2|0;H[Z+12>>2]=ea;La:{if(!(!w&g>>>0>15)){i=j;if(g>>>0<8){break La}da=n&-2;ba=n&1;fa=R&-2;Y=R&1;S=p&-2;x=p&1;b=ea<<5;t=ma-b|0;M=b+ca|0;w=N(p,V)<<2;s=la-1|0;r=(s|0)==(p+ka|0);l=g;while(1){b=0;A=0;Ma:{Na:{switch(p|0){default:while(1){C=(N(b,V)<<2)+i|0;m=H[C+4>>2];k=M+(b<<6)|0;H[k>>2]=H[C>>2];H[k+4>>2]=m;m=H[C+28>>2];H[k+24>>2]=H[C+24>>2];H[k+28>>2]=m;m=H[C+20>>2];H[k+16>>2]=H[C+16>>2];H[k+20>>2]=m;m=H[C+12>>2];H[k+8>>2]=H[C+8>>2];H[k+12>>2]=m;m=b|1;C=M+(m<<6)|0;k=(N(m,V)<<2)+i|0;m=H[k+28>>2];H[C+24>>2]=H[k+24>>2];H[C+28>>2]=m;m=H[k+20>>2];H[C+16>>2]=H[k+16>>2];H[C+20>>2]=m;m=H[k+12>>2];H[C+8>>2]=H[k+8>>2];H[C+12>>2]=m;m=H[k+4>>2];H[C>>2]=H[k>>2];H[C+4>>2]=m;b=b+2|0;A=A+2|0;if((S|0)!=(A|0)){continue}break};break;case 0:break Ma;case 1:break Na}}if(!x){break Ma}k=M+(b<<6)|0;m=(N(b,V)<<2)+i|0;b=H[m+4>>2];H[k>>2]=H[m>>2];H[k+4>>2]=b;b=H[m+28>>2];H[k+24>>2]=H[m+24>>2];H[k+28>>2]=b;b=H[m+20>>2];H[k+16>>2]=H[m+16>>2];H[k+20>>2]=b;b=H[m+12>>2];H[k+8>>2]=H[m+8>>2];H[k+12>>2]=b}Oa:{if((n|0)==(p|0)){break Oa}A=i+w|0;b=0;m=0;if(!r){while(1){W=A+(N(b,V)<<2)|0;k=H[W+4>>2];C=t+(b<<6)|0;H[C>>2]=H[W>>2];H[C+4>>2]=k;k=H[W+28>>2];H[C+24>>2]=H[W+24>>2];H[C+28>>2]=k;k=H[W+20>>2];H[C+16>>2]=H[W+16>>2];H[C+20>>2]=k;k=H[W+12>>2];H[C+8>>2]=H[W+8>>2];H[C+12>>2]=k;k=b|1;W=t+(k<<6)|0;C=A+(N(k,V)<<2)|0;k=H[C+28>>2];H[W+24>>2]=H[C+24>>2];H[W+28>>2]=k;k=H[C+20>>2];H[W+16>>2]=H[C+16>>2];H[W+20>>2]=k;k=H[C+12>>2];H[W+8>>2]=H[C+8>>2];H[W+12>>2]=k;k=H[C+4>>2];H[W>>2]=H[C>>2];H[W+4>>2]=k;b=b+2|0;m=m+2|0;if((fa|0)!=(m|0)){continue}break}}if(!Y){break Oa}k=t+(b<<6)|0;m=A+(N(b,V)<<2)|0;b=H[m+4>>2];H[k>>2]=H[m>>2];H[k+4>>2]=b;b=H[m+28>>2];H[k+24>>2]=H[m+24>>2];H[k+28>>2]=b;b=H[m+20>>2];H[k+16>>2]=H[m+16>>2];H[k+20>>2]=b;b=H[m+12>>2];H[k+8>>2]=H[m+8>>2];H[k+12>>2]=b}Ua(Z);Pa:{if(!n){break Pa}b=0;A=0;if((s|0)!=(ka|0)){while(1){C=ca+(b<<5)|0;m=H[C+4>>2];k=(N(b,V)<<2)+i|0;H[k>>2]=H[C>>2];H[k+4>>2]=m;m=H[C+28>>2];H[k+24>>2]=H[C+24>>2];H[k+28>>2]=m;m=H[C+20>>2];H[k+16>>2]=H[C+16>>2];H[k+20>>2]=m;m=H[C+12>>2];H[k+8>>2]=H[C+8>>2];H[k+12>>2]=m;m=b|1;C=(N(m,V)<<2)+i|0;k=ca+(m<<5)|0;m=H[k+28>>2];H[C+24>>2]=H[k+24>>2];H[C+28>>2]=m;m=H[k+20>>2];H[C+16>>2]=H[k+16>>2];H[C+20>>2]=m;m=H[k+12>>2];H[C+8>>2]=H[k+8>>2];H[C+12>>2]=m;m=H[k+4>>2];H[C>>2]=H[k>>2];H[C+4>>2]=m;b=b+2|0;A=A+2|0;if((da|0)!=(A|0)){continue}break}}if(!ba){break Pa}k=(N(b,V)<<2)+i|0;m=ca+(b<<5)|0;b=H[m+4>>2];H[k>>2]=H[m>>2];H[k+4>>2]=b;b=H[m+28>>2];H[k+24>>2]=H[m+24>>2];H[k+28>>2]=b;b=H[m+20>>2];H[k+16>>2]=H[m+16>>2];H[k+20>>2]=b;b=H[m+12>>2];H[k+8>>2]=H[m+8>>2];H[k+12>>2]=b}i=i+32|0;l=l-8|0;if(l>>>0>7){continue}break}break La}b=g>>>3|0;r=b>>>0>>0?b:ga;m=(g>>>0)/(r>>>0)&-8;l=g&-8;k=0;i=j;while(1){s=Fa(48);if(!s){break Ha}b=Ia(X);H[s>>2]=b;if(!b){k=0;Ta(oa);Ca(s);Ca(ca);break Ga}H[s+40>>2]=i;H[s+36>>2]=V;H[s+32>>2]=n;H[s+28>>2]=R;H[s+24>>2]=0;H[s+20>>2]=p;H[s+16>>2]=0;H[s+12>>2]=ea;H[s+8>>2]=p;H[s+4>>2]=R;b=l-N(k,m)|0;k=k+1|0;b=(r|0)==(k|0)?b:m;H[s+44>>2]=b;fb(oa,13,s);i=(b<<2)+i|0;if((k|0)!=(r|0)){continue}break}Ta(oa)}w=g&7;Qa:{if(!w){break Qa}r=ea<<5;Ra:{if(!p){break Ra}s=r+ca|0;x=w<<2;b=0;if((p|0)!=1){k=p&-2;l=0;while(1){m=!x;if(!m){B(s+(b<<6)|0,(N(b,V)<<2)+i|0,x)}if(!m){m=b|1;B(s+(m<<6)|0,(N(m,V)<<2)+i|0,x)}b=b+2|0;l=l+2|0;if((k|0)!=(l|0)){continue}break}}if(!(p&1)|!x){break Ra}B(s+(b<<6)|0,(N(b,V)<<2)+i|0,x)}Sa:{if((n|0)==(p|0)){break Sa}s=ma-r|0;r=(N(p,V)<<2)+i|0;x=w<<2;b=0;if((ka|0)!=(la+(p^-1)|0)){k=R&-2;l=0;while(1){m=!x;if(!m){B(s+(b<<6)|0,r+(N(b,V)<<2)|0,x)}if(!m){m=b|1;B(s+(m<<6)|0,r+(N(m,V)<<2)|0,x)}b=b+2|0;l=l+2|0;if((k|0)!=(l|0)){continue}break}}if(!(R&1)|!x){break Sa}B(s+(b<<6)|0,r+(N(b,V)<<2)|0,x)}Ua(Z);if(!n){break Qa}p=w<<2;b=0;if((la|0)!=(ka+1|0)){k=n&-2;l=0;while(1){m=!p;if(!m){B((N(b,V)<<2)+i|0,ca+(b<<5)|0,p)}if(!m){m=b|1;B((N(m,V)<<2)+i|0,ca+(m<<5)|0,p)}b=b+2|0;l=l+2|0;if((k|0)!=(l|0)){continue}break}}if(!(n&1)|!p){break Qa}B((N(b,V)<<2)+i|0,ca+(b<<5)|0,p)}h=h+152|0;o=o-1|0;if(o){continue}break}k=1;Ca(ca);break Ga}k=1;j=H[v+28>>2];ca=j+N(g,152)|0;ua=ca-152|0;if(H[ua>>2]==H[ca-144>>2]){break Ga}ea=ca-148|0;if(H[ea>>2]==H[ca-140>>2]){break Ga}s=H[j+4>>2];o=H[j+12>>2];r=H[j>>2];p=H[j+8>>2];fa=H[v+68>>2];Y=H[v+64>>2];S=H[v+60>>2];x=H[v+56>>2];V=ac(v,g);if(!V){k=0;break Ga}if((g|0)==1){h=H[ca-16>>2];g=H[ua>>2];j=H[ea>>2];b=H[ca-8>>2];Pa(V,h-g|0,H[ca-12>>2]-j|0,b-g|0,H[ca-4>>2]-j|0,H[v+52>>2],1,b-h|0);Wa(V);break Ga}b=g-1|0;m=b&1;Ta:{if((g|0)==2){k=0;b=j;break Ta}i=b&-2;k=0;b=j;while(1){h=H[b+160>>2]-H[b+152>>2]|0;l=h>>>0>>0?k:h;h=H[b+164>>2]-H[b+156>>2]|0;l=h>>>0>>0?l:h;h=H[b+312>>2]-H[b+304>>2]|0;l=h>>>0>>0?l:h;h=H[b+316>>2]-H[b+308>>2]|0;k=h>>>0>>0?l:h;b=b+304|0;n=n+2|0;if((i|0)!=(n|0)){continue}break}}if(m){h=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>>0?k:h;b=H[b+164>>2]-H[b+156>>2]|0;k=b>>>0>>0?h:b}Ua:{if(k>>>0>=134217728){break Ua}oa=Ia(k<<5);H[Z+32>>2]=oa;if(!oa){break Ua}H[Z>>2]=oa;Va:{if(g){h=o-s|0;b=p-r|0;t=oa+32|0;s=g;M=H[v+20>>2];R=1;ka=0;while(1){H[Z+8>>2]=h;H[Z+40>>2]=b;i=H[j+164>>2];l=H[j+160>>2];n=H[j+156>>2];g=H[j+152>>2];ma=(g|0)%2|0;H[Z+44>>2]=ma;A=(n|0)%2|0;H[Z+12>>2]=A;w=l-g|0;_=w-b|0;H[Z+36>>2]=_;ba=i-n|0;E=ba-h|0;H[Z+4>>2]=E;g=x;n=g;i=S;l=i;k=Y;ia=k;m=fa;r=m;Wa:{if(!ka&(M|0)==(R|0)){break Wa}J=M-R|0;l=0;n=0;if(g){i=J&31;k=g;if((J&63)>>>0>=32){o=-1<>>32-i}g=k+(g^-1)|0;i=o^-1;i=g>>>0>>0?i+1|0:i;n=J&31;if((J&63)>>>0>=32){n=i>>>n|0}else{n=((1<>>n}}if(S){l=J&31;if((J&63)>>>0>=32){o=-1<>>32-l}g=S+(g^-1)|0;l=o^-1;l=g>>>0>>0?l+1|0:l;i=J&31;if((J&63)>>>0>=32){l=l>>>i|0}else{l=((1<>>i}}m=0;k=0;if(Y){i=J&31;if((J&63)>>>0>=32){o=-1<>>32-i}g=Y+(g^-1)|0;i=o^-1;i=g>>>0>>0?i+1|0:i;k=J&31;if((J&63)>>>0>=32){k=i>>>k|0}else{k=((1<>>k}}if(fa){i=J&31;if((J&63)>>>0>=32){o=-1<>>32-i}g=fa+(g^-1)|0;i=o^-1;i=g>>>0>>0?i+1|0:i;m=J&31;if((J&63)>>>0>=32){m=i>>>m|0}else{m=((1<>>m}}ia=0;g=0;aa=1<>>0>>0){i=J&31;if((J&63)>>>0>=32){o=-1<>>32-i}p=g^-1;g=p+(x-aa|0)|0;i=o^-1;i=g>>>0

>>0?i+1|0:i;p=J&31;if((J&63)>>>0>=32){g=i>>>p|0}else{g=((1<>>p}}if(Y>>>0>aa>>>0){p=J&31;if((J&63)>>>0>=32){o=-1<>>32-p}r=i^-1;i=r+(Y-aa|0)|0;p=o^-1;p=i>>>0>>0?p+1|0:p;r=J&31;if((J&63)>>>0>=32){ia=p>>>r|0}else{ia=((1<>>r}}r=0;i=0;if(S>>>0>aa>>>0){p=J&31;if((J&63)>>>0>=32){o=-1<>>32-p}da=i^-1;i=da+(S-aa|0)|0;p=o^-1;p=i>>>0>>0?p+1|0:p;o=J&31;if((J&63)>>>0>=32){i=p>>>o|0}else{i=((1<>>o}}if(aa>>>0>=fa>>>0){break Wa}r=J&31;if((J&63)>>>0>=32){o=-1<>>32-r}da=p^-1;p=da+(fa-aa|0)|0;r=o^-1;r=p>>>0>>0?r+1|0:r;o=J&31;if((J&63)>>>0>=32){r=r>>>o|0}else{r=((1<>>o}}da=H[j+180>>2];p=ia-da|0;o=p>>>0<=ia>>>0?p:0;p=o+4|0;p=o>>>0>p>>>0?-1:p;ga=p>>>0<_>>>0?p:_;o=H[j+216>>2];p=k-o|0;p=k>>>0>=p>>>0?p:0;k=p+4|0;k=k>>>0

>>0?-1:k;sa=b>>>0>k>>>0?k:b;p=(ma?ga:sa)<<1;k=(ma?sa:ga)<<1|1;ja=k>>>0

>>0?p:k;J=ja>>>0>>0;k=g-da|0;k=g>>>0>=k>>>0?k:0;g=k-4|0;X=g>>>0<=k>>>0?g:0;g=n-o|0;n=g>>>0<=n>>>0?g:0;g=n-4|0;la=g>>>0<=n>>>0?g:0;aa=(ma?X:la)<<1;_=(ma?la:X)<<1|1;da=aa>>>0<_>>>0;o=H[j+184>>2];g=l-o|0;l=g>>>0<=l>>>0?g:0;g=l-4|0;W=g>>>0<=l>>>0?g:0;g=W;p=H[j+220>>2];l=i-p|0;i=i>>>0>=l>>>0?l:0;l=i-4|0;k=i>>>0>=l>>>0?l:0;n=k;l=m-o|0;i=l>>>0<=m>>>0?l:0;l=i+4|0;l=i>>>0>l>>>0?-1:l;i=h>>>0>l>>>0?l:h;o=i;l=r-p|0;m=l>>>0<=r>>>0?l:0;l=m+4|0;l=l>>>0>>0?-1:l;pa=l>>>0>>0?l:E;r=pa;if(A){o=r;r=i;n=g;g=k}C=J?ja:w;ia=da?aa:_;H[Z+60>>2]=ga;H[Z+56>>2]=X;H[Z+52>>2]=sa;H[Z+48>>2]=la;Xa:{if(ba>>>0<8){b=7;l=0;break Xa}l=ma<<5;ma=(t-l|0)+(X<<6)|0;E=(l+oa|0)+(la<<6)|0;ja=b+ga|0;J=b+X|0;aa=h+pa|0;_=h+k|0;da=oa+(ia<<5)|0;l=0;while(1){b=l|7;Ya:{if(!(i>>>0>l>>>0&b>>>0>=W>>>0|l>>>0>>0&b>>>0>=_>>>0)){l=l+8|0;break Ya}b=ba-l|0;p=b>>>0>=8?8:b;b=0;while(1){X=b+l|0;ga=X+1|0;m=b<<2;Pa(V,la,X,sa,ga,m+E|0,16,0);Pa(V,J,X,ja,ga,m+ma|0,16,0);b=b+1|0;if((p|0)!=(b|0)){continue}break}Ua(Z+32|0);b=l;l=l+8|0;if(!_a(V,ia,b,C,l,da,8,1)){break Va}}b=l|7;if(ba>>>0>b>>>0){continue}break}}if(!(!(i>>>0>l>>>0&b>>>0>=W>>>0)&(h+pa>>>0<=l>>>0|h+k>>>0>b>>>0)|l>>>0>=ba>>>0)){J=Z+32|0;E=0;da=ba-l|0;if(da){while(1){aa=l+E|0;_=aa+1|0;b=H[J+16>>2];p=E<<2;Pa(V,b,aa,H[J+20>>2],_,p+((H[J>>2]+(H[J+12>>2]<<5)|0)+(b<<6)|0)|0,16,0);m=H[J+24>>2];b=H[J+8>>2];Pa(V,m+b|0,aa,b+H[J+28>>2]|0,_,(p+((H[J>>2]-(H[J+12>>2]<<5)|0)+(m<<6)|0)|0)+32|0,16,0);E=E+1|0;if((da|0)!=(E|0)){continue}break}}Ua(J);if(!_a(V,ia,l,C,ba,oa+(ia<<5)|0,8,1)){break Va}}H[Z+28>>2]=pa;H[Z+24>>2]=k;H[Z+20>>2]=i;H[Z+16>>2]=W;if(C>>>0>ia>>>0){l=o<<1;b=r<<1|1;b=b>>>0>>0?l:b;o=b>>>0>>0?b:ba;b=A<<5;r=(t-b|0)+(k<<6)|0;p=(b+oa|0)+(W<<6)|0;m=h+pa|0;l=h+k|0;g=g<<1;b=n<<1|1;h=b>>>0>g>>>0?g:b;g=oa+(h<<5)|0;while(1){b=C-ia|0;b=(b>>>0>=8?8:b)+ia|0;Pa(V,ia,W,b,i,p,1,16);Pa(V,ia,l,b,m,r,1,16);Ua(Z);if(!_a(V,ia,h,b,o,g,1,8)){break Va}ia=ia+8|0;if(C>>>0>ia>>>0){continue}break}}j=j+152|0;b=w;h=ba;R=R+1|0;ka=R?ka:ka+1|0;if(ka|(s|0)!=(R|0)){continue}break}}k=1;h=H[ca-16>>2];g=H[ua>>2];j=H[ea>>2];b=H[ca-8>>2];Pa(V,h-g|0,H[ca-12>>2]-j|0,b-g|0,H[ca-4>>2]-j|0,H[v+52>>2],1,b-h|0);Wa(V);Ca(oa);break Ga}Wa(V);Ca(oa);k=0;break Ga}Wa(V);k=0;break Ga}k=0;Ta(oa);Ca(ca)}na=Z- -64|0;if(k){break V}break b}u=u+1080|0;D=D+52|0;v=v+76|0;q=q+1|0;if(q>>>0>2]){continue}break}ra=H[H[Q+20>>2]>>2];u=H[Q+32>>2]}h=H[u+16>>2];Za:{if(H[Q+68>>2]|!h){break Za}D=H[ra+20>>2];i=H[D+28>>2];_a:{$a:{l=H[Q+64>>2];if(l){q=H[ra+16>>2];if(q>>>0<3){break _a}g=H[D+24>>2];if(!((g|0)==H[D+100>>2]&(g|0)==H[D+176>>2])){Ba(f,1,10089,0);break b}j=H[H[Q+24>>2]+24>>2];b=H[j+36>>2];ab:{if((b|0)!=H[j+88>>2]|(b|0)!=H[j+140>>2]){break ab}j=N(g,152);b=j+i|0;b=N(H[b-140>>2]-H[b-148>>2]|0,H[b-144>>2]-H[b-152>>2]|0);g=j+H[D+104>>2]|0;if((b|0)!=(N(H[g-140>>2]-H[g-148>>2]|0,H[g-144>>2]-H[g-152>>2]|0)|0)){break ab}j=j+H[D+180>>2]|0;if((N(H[j-140>>2]-H[j-148>>2]|0,H[j-144>>2]-H[j-152>>2]|0)|0)==(b|0)){break $a}}Ba(f,1,10089,0);break b}q=H[ra+16>>2];if(q>>>0<3){break _a}b=H[H[Q+24>>2]+24>>2];j=H[b+36>>2];bb:{if((j|0)!=H[b+88>>2]){break bb}g=H[b+140>>2];if((g|0)!=(j|0)){break bb}j=N(j,152);b=i+j|0;b=N(H[b+148>>2]-H[b+140>>2]|0,H[b+144>>2]-H[b+136>>2]|0);j=j+H[D+104>>2]|0;if((b|0)!=(N(H[j+148>>2]-H[j+140>>2]|0,H[j+144>>2]-H[j+136>>2]|0)|0)){break bb}j=H[D+180>>2]+N(g,152)|0;if((N(H[j+148>>2]-H[j+140>>2]|0,H[j+144>>2]-H[j+136>>2]|0)|0)==(b|0)){break $a}}Ba(f,1,10089,0);break b}if((h|0)==2){if(!H[u+5608>>2]){break Za}s=Fa(q<<2);if(!s){break b}w=H[ra+16>>2];cb:{if(!w){break cb}db:{eb:{if(H[Q+64>>2]){h=w&3;j=0;if(w>>>0>=4){break eb}v=0;break db}h=w&3;j=0;fb:{if(w>>>0<4){v=0;break fb}g=w&-4;v=0;k=0;while(1){l=s+(v<<2)|0;H[l>>2]=H[D+52>>2];H[l+4>>2]=H[D+128>>2];H[l+8>>2]=H[D+204>>2];H[l+12>>2]=H[D+280>>2];v=v+4|0;D=D+304|0;k=k+4|0;if((g|0)!=(k|0)){continue}break}}if(!h){break cb}while(1){H[s+(v<<2)>>2]=H[D+52>>2];v=v+1|0;D=D+76|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}break cb}g=w&-4;v=0;k=0;while(1){l=s+(v<<2)|0;H[l>>2]=H[D+36>>2];H[l+4>>2]=H[D+112>>2];H[l+8>>2]=H[D+188>>2];H[l+12>>2]=H[D+264>>2];v=v+4|0;D=D+304|0;k=k+4|0;if((g|0)!=(k|0)){continue}break}}if(!h){break cb}while(1){H[s+(v<<2)>>2]=H[D+36>>2];v=v+1|0;D=D+76|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}}j=H[u+5608>>2];i=0;u=Fa(w<<3);h=0;gb:{if(!u){break gb}if(!(!b|!w)){n=u+(w<<2)|0;q=w&-4;r=w&3;m=w-1|0;while(1){v=0;g=0;if(m>>>0>=3){while(1){l=v<<2;L[l+u>>2]=L[H[l+s>>2]>>2];h=l|4;L[h+u>>2]=L[H[h+s>>2]>>2];h=l|8;L[h+u>>2]=L[H[h+s>>2]>>2];h=l|12;L[h+u>>2]=L[H[h+s>>2]>>2];v=v+4|0;g=g+4|0;if((q|0)!=(g|0)){continue}break}}k=0;if(r){while(1){g=v<<2;L[g+u>>2]=L[H[g+s>>2]>>2];v=v+1|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}}l=0;v=j;while(1){h=l<<2;o=h+n|0;H[o>>2]=0;ha=O(0);k=0;g=0;if(m>>>0>2){while(1){p=u+(k<<2)|0;ha=O(O(L[v>>2]*L[p>>2])+ha);L[o>>2]=ha;ha=O(O(L[v+4>>2]*L[p+4>>2])+ha);L[o>>2]=ha;ha=O(O(L[v+8>>2]*L[p+8>>2])+ha);L[o>>2]=ha;ha=O(O(L[v+12>>2]*L[p+12>>2])+ha);L[o>>2]=ha;k=k+4|0;v=v+16|0;g=g+4|0;if((q|0)!=(g|0)){continue}break}}g=0;if(r){while(1){ha=O(O(L[v>>2]*L[u+(k<<2)>>2])+ha);L[o>>2]=ha;k=k+1|0;v=v+4|0;g=g+1|0;if((r|0)!=(g|0)){continue}break}}g=h+s|0;h=H[g>>2];H[g>>2]=h+4;L[h>>2]=ha;l=l+1|0;if((w|0)!=(l|0)){continue}break}i=i+1|0;if((i|0)!=(b|0)){continue}break}}Ca(u);h=1}b=h;Ca(s);if(b){break Za}break b}if(H[H[u+5584>>2]+20>>2]==1){if(l){ec(H[D+36>>2],H[D+112>>2],H[D+188>>2],b);break Za}ec(H[D+52>>2],H[D+128>>2],H[D+204>>2],b);break Za}if(l){dc(H[D+36>>2],H[D+112>>2],H[D+188>>2],b);break Za}dc(H[D+52>>2],H[D+128>>2],H[D+204>>2],b);break Za}H[Ga>>2]=q;Ba(f,1,10150,Ga)}s=H[H[Q+20>>2]>>2];if(!H[s+16>>2]){$=1;break b}u=H[Q+68>>2];n=H[s+20>>2];b=H[H[Q+32>>2]+5584>>2];h=H[H[Q+24>>2]+24>>2];g=0;while(1){hb:{if(H[u+(g<<2)>>2]?0:u){break hb}j=H[n+28>>2];l=j+N(H[h+36>>2],152)|0;ib:{if(!H[Q+64>>2]){k=H[l+148>>2]-H[l+140>>2]|0;ra=H[l+144>>2]-H[l+136>>2]|0;i=0;m=52;break ib}j=j+N(H[n+24>>2],152)|0;ra=H[l+8>>2]-H[l>>2]|0;i=H[j-144>>2]-(ra+H[j-152>>2]|0)|0;k=H[l+12>>2]-H[l+4>>2]|0;m=36}j=H[h+24>>2];jb:{if(H[h+32>>2]){j=1<>2];if(H[b+20>>2]==1){p=ra&-2;m=ra&1;D=0;j=i<<2;while(1){q=0;if((ra|0)!=1){while(1){i=H[b+1076>>2]+H[$>>2]|0;H[$>>2]=(i|0)<(l|0)?l:(i|0)<(v|0)?i:v;i=H[b+1076>>2]+H[$+4>>2]|0;H[$+4>>2]=(i|0)<(l|0)?l:(i|0)<(v|0)?i:v;$=$+8|0;q=q+2|0;if((p|0)!=(q|0)){continue}break}}if(m){i=H[b+1076>>2]+H[$>>2]|0;H[$>>2]=(i|0)<(l|0)?l:(i|0)<(v|0)?i:v;$=$+4|0}$=$+j|0;D=D+1|0;if((D|0)!=(k|0)){continue}break}break hb}o=l>>31;j=0;while(1){q=0;while(1){ha=L[$>>2];m=v;kb:{if(ha>O(2147483648)){break kb}m=l;if(ha>2];p=m;m=m>>31;cb=O(T(ha));tb=O(ha-cb);if(tbO(.5)){break lb}ha=O(cb*O(.5));db=O(ha-O(T(ha)))==O(0)?cb:db}}ha=db;if(O(P(ha))>31)|0;w=m+1|0;J=m;m=p+r|0;p=r>>>0>m>>>0?w:J;m=l>>>0>m>>>0&(o|0)>=(p|0)|(o|0)>(p|0)?l:m>>>0>>0&(p|0)<=0|(p|0)<0?m:v}H[$>>2]=m;$=$+4|0;q=q+1|0;if((ra|0)!=(q|0)){continue}break}$=(i<<2)+$|0;j=j+1|0;if((j|0)!=(k|0)){continue}break}}n=n+76|0;b=b+1080|0;h=h+52|0;$=1;g=g+1|0;if(g>>>0>2]){continue}break}break b}$=0;Ba(f,1,3372,0)}na=Ga+16|0;if(!$){kb(Qa);H[a+8>>2]=H[a+8>>2]|32768;Ba(f,1,11451,0);break a}mb:{if(!c){break mb}b=0;q=H[a+232>>2];j=Tb(q,1);if(!((j|0)==-1|d>>>0>>0)){nb:{b=1;d=H[q+24>>2];if(!H[d+16>>2]){break nb}j=H[d+24>>2];l=H[H[H[q+20>>2]>>2]+20>>2];while(1){b=H[j+24>>2];n=b&7;g=b>>>3|0;b=H[l+28>>2];m=b+N(H[j+36>>2],152)|0;ob:{if(H[q+64>>2]){b=b+N(H[l+24>>2],152)|0;d=H[m+8>>2]-H[m>>2]|0;i=H[b-144>>2]-(d+H[b-152>>2]|0)|0;h=H[m+12>>2]-H[m+4>>2]|0;b=36;break ob}h=H[m+148>>2]-H[m+140>>2]|0;d=H[m+144>>2]-H[m+136>>2]|0;i=0;b=52}b=H[b+l>>2];pb:{qb:{rb:{sb:{g=g+((n|0)!=0)|0;switch(((g|0)==3?4:g)-1|0){case 0:break rb;case 1:break qb;case 3:break sb;default:break pb}}if(!h){break pb}p=d<<2;if((h|0)!=1){m=h&-2;g=0;while(1){n=!p;if(!n){B(c,b,p)}d=i<<2;k=d+(b+p|0)|0;b=c+p|0;if(!n){B(b,k,p)}c=b+p|0;b=d+(k+p|0)|0;g=g+2|0;if((m|0)!=(g|0)){continue}break}}if(!(h&1)){break pb}if(p){B(c,b,p)}c=c+p|0;break pb}g=!h|!d;if(H[j+32>>2]){if(g){break pb}m=d&-8;k=d&7;g=0;n=d-1>>>0<7;while(1){d=0;if(!n){while(1){F[c|0]=H[b>>2];F[c+1|0]=H[b+4>>2];F[c+2|0]=H[b+8>>2];F[c+3|0]=H[b+12>>2];F[c+4|0]=H[b+16>>2];F[c+5|0]=H[b+20>>2];F[c+6|0]=H[b+24>>2];F[c+7|0]=H[b+28>>2];c=c+8|0;b=b+32|0;d=d+8|0;if((m|0)!=(d|0)){continue}break}}d=0;if(k){while(1){F[c|0]=H[b>>2];c=c+1|0;b=b+4|0;d=d+1|0;if((k|0)!=(d|0)){continue}break}}b=(i<<2)+b|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}break pb}if(g){break pb}m=d&-8;k=d&7;g=0;n=d-1>>>0<7;i=i<<2;while(1){d=0;if(!n){while(1){F[c|0]=H[b>>2];F[c+1|0]=H[b+4>>2];F[c+2|0]=H[b+8>>2];F[c+3|0]=H[b+12>>2];F[c+4|0]=H[b+16>>2];F[c+5|0]=H[b+20>>2];F[c+6|0]=H[b+24>>2];F[c+7|0]=H[b+28>>2];c=c+8|0;b=b+32|0;d=d+8|0;if((m|0)!=(d|0)){continue}break}}d=0;if(k){while(1){F[c|0]=H[b>>2];c=c+1|0;b=b+4|0;d=d+1|0;if((k|0)!=(d|0)){continue}break}}b=b+i|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}break pb}g=!h|!d;if(H[j+32>>2]){if(g){break pb}m=d&-8;k=d&7;g=0;n=d-1>>>0<7;while(1){d=0;if(!n){while(1){G[c>>1]=H[b>>2];G[c+2>>1]=H[b+4>>2];G[c+4>>1]=H[b+8>>2];G[c+6>>1]=H[b+12>>2];G[c+8>>1]=H[b+16>>2];G[c+10>>1]=H[b+20>>2];G[c+12>>1]=H[b+24>>2];G[c+14>>1]=H[b+28>>2];c=c+16|0;b=b+32|0;d=d+8|0;if((m|0)!=(d|0)){continue}break}}d=0;if(k){while(1){G[c>>1]=H[b>>2];c=c+2|0;b=b+4|0;d=d+1|0;if((k|0)!=(d|0)){continue}break}}b=(i<<2)+b|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}break pb}if(g){break pb}m=d&-8;k=d&7;g=0;n=d-1>>>0<7;while(1){d=0;if(!n){while(1){G[c>>1]=H[b>>2];G[c+2>>1]=H[b+4>>2];G[c+4>>1]=H[b+8>>2];G[c+6>>1]=H[b+12>>2];G[c+8>>1]=H[b+16>>2];G[c+10>>1]=H[b+20>>2];G[c+12>>1]=H[b+24>>2];G[c+14>>1]=H[b+28>>2];c=c+16|0;b=b+32|0;d=d+8|0;if((m|0)!=(d|0)){continue}break}}d=0;if(k){while(1){G[c>>1]=H[b>>2];c=c+2|0;b=b+4|0;d=d+1|0;if((k|0)!=(d|0)){continue}break}}b=(i<<2)+b|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}}l=l+76|0;j=j+52|0;b=1;ub=ub+1|0;if(ub>>>0>2]+16>>2]){continue}break}}}if(!b){break a}b=H[Qa+5596>>2];if(!b){break mb}Ca(b);H[Qa+5596>>2]=0;H[Qa+5600>>2]=0}F[a+92|0]=I[a+92|0]&254;H[a+8>>2]=H[a+8>>2]&-129;lb=1;c=Ra(e);b=H[a+8>>2];if(!(c|qa)&(b|0)==64|(b|0)==256){break a}if((Ja(e,Xa+10|0,2,f)|0)!=2){Ba(f,H[a+208>>2]?1:2,2472,0);lb=!H[a+208>>2];break a}Da(Xa+10|0,Xa+12|0,2);b=H[Xa+12>>2];if((b|0)==65424){break a}if((b|0)==65497){H[a+8>>2]=256;H[a+228>>2]=0;break a}if(!(Ra(e)|qa)){H[a+8>>2]=64;Ba(f,2,8419,0);break a}lb=0;Ba(f,1,8306,0)}na=Xa+16|0;return lb|0}function db(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,x=0,z=0,A=0,C=0,D=0,E=0,J=0,M=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=O(0),Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,sa=0,ta=0,ua=0,va=O(0);t=na-80|0;na=t;H[t+40>>2]=65424;v=N(H[a+132>>2],H[a+128>>2]);a:{b:{c:{l=H[a+8>>2];d:{if((l|0)!=8){j=0;if((l|0)!=256){break a}H[t+40>>2]=65497;break d}if(F[a+92|0]&1){break d}Q=v&-2;V=v&1;D=t+77|0;R=t+76|0;U=t+72|0;l=65424;e:{f:{while(1){g:{h:{i:{j:{k:{l:{m:{n:{p=H[a+84>>2];if(!p){break n}n=H[a+80>>2];if(p>>>0<=n>>>0){break n}l=H[a+88>>2]+(n<<3)|0;p=H[l>>2];l=H[l+4>>2];H[a+80>>2]=n+1;if(!cb(j,p,l,k)){Ba(k,1,5440,0);j=0;break a}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2);if(H[t+40>>2]==65424){break m}Ba(k,1,4073,0);j=0;break a}if((l|0)==65427){break l}}while(1){if(!(Ra(j)|qa)){H[a+8>>2]=64;break l}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+36|0,2);if(K[t+36>>2]<=1){Ba(k,1,6048,0);j=0;break a}o:{if(H[t+40>>2]!=32896){break o}if(Ra(j)|qa){break o}H[a+8>>2]=64;break l}m=H[a+8>>2];p:{if(!(m&16)){l=H[t+36>>2];break p}l=H[t+36>>2];n=H[a+24>>2];if(!n){break p}p=l+2|0;if(p>>>0>n>>>0){Ba(k,1,8370,0);j=0;break a}H[a+24>>2]=n-p}p=l-2|0;H[t+36>>2]=p;l=24912;A=H[t+40>>2];while(1){n=l;o=H[l>>2];if(o){l=l+12|0;if((o|0)!=(A|0)){continue}}break}if(!(m&H[n+4>>2])){Ba(k,1,5397,0);j=0;break a}q:{if(K[a+20>>2]>=p>>>0){l=H[a+16>>2];break q}l=Ra(j);m=qa;if((m|0)<0){l=1}else{l=l>>>0

>>0&(m|0)<=0}if(l){Ba(k,1,5797,0);j=0;break a}l=Ha(H[a+16>>2],H[t+36>>2]);if(!l){Ca(H[a+16>>2]);H[a+16>>2]=0;H[a+20>>2]=0;Ba(k,1,4973,0);j=0;break a}H[a+16>>2]=l;p=H[t+36>>2];H[a+20>>2]=p}l=Ja(j,l,p,k);if((l|0)!=H[t+36>>2]){Ba(k,1,2472,0);j=0;break a}n=H[n+8>>2];if(!n){Ba(k,1,11725,0);j=0;break a}if(!(ra[n|0](a,H[a+16>>2],l,k)|0)){H[t+32>>2]=H[t+40>>2];Ba(k,1,13959,t+32|0);j=0;break a}q=H[j+56>>2];m=H[t+36>>2];A=H[a+224>>2];p=H[A+40>>2];x=H[a+228>>2];r=N(x,40);l=p+r|0;z=H[l+20>>2];E=z+1|0;n=H[l+28>>2];r:{if(E>>>0<=n>>>0){l=H[l+24>>2];break r}X=O(O(n>>>0)+O(100));if(X=O(0)){n=~~X>>>0}else{n=0}H[l+28>>2]=n;l=Ha(H[l+24>>2],N(n,24));p=H[A+40>>2];n=r+p|0;if(!l){break k}H[n+24>>2]=l;z=H[n+20>>2];E=z+1|0}l=N(z,24)+l|0;H[l+16>>2]=m+4;n=(q-m|0)-4|0;H[l+8>>2]=n;H[l+12>>2]=n>>31;G[l>>1]=o;l=p+r|0;H[l+20>>2]=E;s:{if((o|0)!=65424){break s}p=H[l+16>>2];t:{if(!p){break t}o=H[l+12>>2];if(o>>>0>=K[l+4>>2]){break t}l=p+N(o,24)|0;H[l>>2]=n;H[l+4>>2]=0}l=(H[j+56>>2]-H[t+36>>2]|0)-4|0;n=H[a+48>>2];p=H[a+52>>2];if((p|0)>0){m=1}else{m=l>>>0<=n>>>0&(p|0)>=0}if(m){break s}H[a+48>>2]=l;H[a+52>>2]=0}if(I[a+92|0]&4){if((sb(j,H[a+24>>2],k)|0)!=H[a+24>>2]|qa){Ba(k,1,2472,0);j=0;break a}H[t+40>>2]=65427;break l}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2);if(H[t+40>>2]!=65427){continue}break}}if(!(!(Ra(j)|qa)&H[a+8>>2]==64)){l=I[a+92|0];if(!(l&4)){l=N(H[a+228>>2],5644);n=H[a+180>>2];u:{v:{if(H[a+56>>2]){q=Ra(j);break v}q=H[a+24>>2];if(q>>>0<2){break u}}q=q-2|0;H[a+24>>2]=q}n=l+n|0;if(!q){break j}l=Ra(j);p=qa;if((p|0)<0){l=1}else{l=l>>>0>>0&(p|0)<=0}if(l){if(H[a+208>>2]){Ba(k,1,5842,0);j=0;break a}Ba(k,2,5842,0)}l=H[a+24>>2];if(l>>>0>=4294967294){Ba(k,1,1480,0);j=0;break a}p=H[n+5596>>2];w:{if(p){o=H[n+5600>>2];if(o>>>0>-3-l>>>0){Ba(k,1,1211,0);j=0;break a}l=Ha(p,(l+o|0)+2|0);if(l){H[n+5596>>2]=l;break j}Ca(H[n+5596>>2]);H[n+5596>>2]=0;break w}l=Fa(l+2|0);H[n+5596>>2]=l;if(l){break j}}Ba(k,1,6176,0);j=0;break a}H[a+8>>2]=8;F[a+92|0]=l&250;break i}l=H[t+40>>2];break g}Ca(H[n+24>>2]);a=H[A+40>>2]+N(x,40)|0;H[a+28>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;Ba(k,1,3863,0);j=0;break a}m=H[j+56>>2];p=m-2|0;A=H[j+60>>2];z=A-(m>>>0<2)|0;r=H[a+224>>2];J=H[r+40>>2];M=H[a+228>>2];x=N(M,40);l=J+x|0;o=H[l+16>>2]+N(H[l+12>>2],24)|0;H[o+8>>2]=p;H[o+12>>2]=z;z=m;m=H[a+24>>2];z=z+m|0;H[o+16>>2]=z;H[o+20>>2]=m>>>0>z>>>0?A+1|0:A;m=H[a+24>>2];z=H[l+20>>2];E=z+1|0;o=H[l+28>>2];x:{if(E>>>0<=o>>>0){l=H[l+24>>2];break x}X=O(O(o>>>0)+O(100));if(X=O(0)){o=~~X>>>0}else{o=0}H[l+28>>2]=o;l=Ha(H[l+24>>2],N(o,24));J=H[r+40>>2];o=x+J|0;if(!l){break f}H[o+24>>2]=l;z=H[o+20>>2];E=z+1|0}l=N(z,24)+l|0;H[l+16>>2]=m+2;H[l+8>>2]=p;H[l+12>>2]=p>>31;G[l>>1]=65427;H[(x+J|0)+20>>2]=E;y:{if(q){q=Ja(j,H[n+5596>>2]+H[n+5600>>2]|0,H[a+24>>2],k);l=8;if((q|0)==H[a+24>>2]){break y}l=64;if((q|0)!=-1){break y}Ba(k,1,2472,0);j=0;break a}q=0;l=H[a+24>>2]?64:8}H[a+8>>2]=l;H[n+5600>>2]=H[n+5600>>2]+q;z:{if(F[a+92|0]&1){break z}l=H[a+44>>2];if(H[a+76>>2]|((l|0)<0|(l|0)!=H[a+228>>2])){break z}if(!Bb(j)){break z}n=H[a+228>>2];p=H[a+180>>2]+N(n,5644)|0;l=H[p+5592>>2];n=H[H[a+224>>2]+40>>2]+N(n,40)|0;if((l|0)!=H[n+4>>2]){break z}p=H[p+5588>>2]+1|0;if(l>>>0<=p>>>0){break z}A:{l=H[n+16>>2]+N(p,24)|0;n=H[l>>2];l=H[l+4>>2];if((n|0)==H[j+56>>2]&(l|0)==H[j+60>>2]){break A}if(cb(j,n,l,k)){break A}Ba(k,1,5440,0);j=0;break a}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2);if(H[t+40>>2]==65424){break h}Ba(k,1,4073,0);j=0;break a}l=I[a+92|0];if((l&9)!=1){break i}F[a+92|0]=l|8;p=H[a+228>>2];if(H[(H[a+180>>2]+N(p,5644)|0)+5592>>2]==1){break i}if(!Bb(j)){break i}l=H[j+60>>2];o=l;m=H[j+56>>2];if((l&m)==-1){break i}B:{while(1){l=1;n=t+70|0;if((Ja(j,n,2,k)|0)!=2){break B}Da(n,t- -64|0,2);if(H[t+64>>2]!=65424){break B}q=2472;if((Ja(j,n,2,k)|0)!=2){break c}Da(n,t+60|0,2);if(H[t+60>>2]!=10){q=6048;break c}H[t+60>>2]=8;n=Ja(j,t+70|0,8,k);if((n|0)!=H[t+60>>2]){break c}if((n|0)!=8){q=4047;break c}Da(t+70|0,t+56|0,2);Da(U,t+52|0,4);Da(R,t+48|0,1);Da(D,t+44|0,1);if((p|0)!=H[t+56>>2]){n=H[t+52>>2];if(n>>>0<14){break B}n=n-12|0;H[t+52>>2]=n;n=sb(j,n,k);if(!qa&H[t+52>>2]==(n|0)){continue}break B}break}l=H[t+48>>2]!=H[t+44>>2]}if(!pc(j,m,o,k)){break b}if(l){break i}F[a+92|0]=I[a+92|0]&238|16;C:{if(!v){break C}p=H[a+180>>2];q=0;l=0;if((v|0)!=1){while(1){n=p+N(q,5644)|0;o=H[n+5592>>2];if(o){H[n+5592>>2]=o+1}o=H[n+11236>>2];if(o){H[n+11236>>2]=o+1}q=q+2|0;l=l+2|0;if((Q|0)!=(l|0)){continue}break}}if(!V){break C}l=p+N(q,5644)|0;n=H[l+5592>>2];if(!n){break C}H[l+5592>>2]=n+1}Ba(k,2,9035,0)}if(F[a+92|0]&1){break h}if((Ja(j,H[a+16>>2],2,k)|0)!=2){if(!(!v|(v|0)!=(H[a+228>>2]+1|0))){j=H[a+180>>2];l=0;while(1){n=j+N(l,5644)|0;if(!(H[n+5588>>2]|H[n+5592>>2])){break e}l=l+1|0;if((v|0)!=(l|0)){continue}break}}Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2)}l=H[t+40>>2];if(F[a+92|0]&1){break g}if((l|0)!=65497){continue}}break}if(H[a+8>>2]==256|(l|0)!=65497){break d}H[a+8>>2]=256;H[a+228>>2]=0;break d}Ca(H[o+24>>2]);a=H[r+40>>2]+N(M,40)|0;H[a+28>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;Ba(k,1,3863,0);j=0;break a}H[t+16>>2]=l;Ba(k,4,11004,t+16|0);H[a+228>>2]=l;H[t+40>>2]=65497;H[a+8>>2]=256}l=H[a+228>>2];j=H[a+180>>2];D:{E:{if(F[a+92|0]&1){break E}F:{G:{if(l>>>0>=v>>>0){break G}q=j+N(l,5644)|0;while(1){if(H[q+5596>>2]){break G}l=l+1|0;H[a+228>>2]=l;q=q+5644|0;if((l|0)!=(v|0)){continue}break}break F}if((l|0)!=(v|0)){break E}}H[i>>2]=0;break D}H:{I:{n=j+N(l,5644)|0;if(H[n+5172>>2]){a=6837}else{if(!(I[n+5640|0]&2)){break H}v=H[n+5160>>2];J:{if(!v){q=0;break J}m=H[n+5164>>2];j=0;q=0;l=0;if(v>>>0>=4){A=v&-4;p=0;while(1){o=m+(l<<3)|0;q=H[o+28>>2]+(H[o+20>>2]+(H[o+12>>2]+(H[o+4>>2]+q|0)|0)|0)|0;l=l+4|0;p=p+4|0;if((A|0)!=(p|0)){continue}break}}p=v&3;if(!p){break J}while(1){q=H[(m+(l<<3)|0)+4>>2]+q|0;l=l+1|0;j=j+1|0;if((p|0)!=(j|0)){continue}break}}j=Fa(q);H[n+5172>>2]=j;if(j){break I}a=4009}Ba(k,1,a,0);Ba(k,1,8059,0);j=0;break a}H[n+5180>>2]=q;q=H[n+5164>>2];j=H[n+5160>>2];if(j){p=0;l=0;while(1){v=l<<3;o=v+q|0;m=H[o>>2];if(m){j=H[o+4>>2];if(j){B(H[n+5172>>2]+p|0,m,j)}j=v+H[n+5164>>2]|0;o=H[j+4>>2];Ca(H[j>>2]);q=H[n+5164>>2];j=v+q|0;H[j>>2]=0;H[j+4>>2]=0;p=o+p|0;j=H[n+5160>>2]}l=l+1|0;if(l>>>0>>0){continue}break}}H[n+5160>>2]=0;Ca(q);H[n+5164>>2]=0;H[n+5168>>2]=H[n+5172>>2];H[n+5176>>2]=H[n+5180>>2]}l=H[a+232>>2];Y=H[l+28>>2];n=H[a+228>>2];E=H[(H[Y+76>>2]+N(n,5644)|0)+5584>>2];j=H[l+24>>2];Z=H[j+24>>2];v=H[Y+24>>2];p=(n>>>0)/(v>>>0)|0;V=H[H[l+20>>2]>>2];o=H[Y+12>>2];l=H[Y+4>>2]+N(o,n-N(p,v)|0)|0;n=H[j>>2];n=l>>>0>n>>>0?l:n;H[V>>2]=n;v=l+o|0;l=l>>>0>v>>>0?-1:v;v=H[j+8>>2];l=l>>>0>>0?l:v;H[V+8>>2]=l;K:{L:{if(!((l|0)>(n|0)&(n|0)>=0)){Ba(k,1,6682,0);break L}q=H[V+20>>2];l=p;p=H[Y+16>>2];l=H[Y+8>>2]+N(l,p)|0;n=H[j+4>>2];n=l>>>0>n>>>0?l:n;H[V+4>>2]=n;p=l+p|0;l=l>>>0>p>>>0?-1:p;j=H[j+12>>2];j=j>>>0>l>>>0?l:j;H[V+12>>2]=j;if(!((j|0)>(n|0)&(n|0)>=0)){Ba(k,1,6644,0);break L}M:{if(H[E+4>>2]){if(H[V+16>>2]){break M}j=1;break K}Ba(k,1,5358,0);break L}N:{O:{while(1){H[Z+36>>2]=0;j=H[Z>>2];n=j>>31;o=j-1|0;l=H[V>>2];p=o+l|0;m=n-!j|0;v=m+(l>>31)|0;ta=q,ua=we(p,l>>>0>p>>>0?v+1|0:v,j,n),H[ta>>2]=ua;l=H[Z+4>>2];p=l>>31;v=l-1|0;A=H[V+4>>2];r=v+A|0;x=p-!l|0;z=x+(A>>31)|0;ta=q,ua=we(r,r>>>0>>0?z+1|0:z,l,p),H[ta+4>>2]=ua;z=o;o=H[V+8>>2];A=z+o|0;m=(o>>31)+m|0;ta=q,ua=we(A,o>>>0>A>>>0?m+1|0:m,j,n),H[ta+8>>2]=ua;j=H[V+12>>2];H[q+16>>2]=fa;n=x+(j>>31)|0;j=j+v|0;n=j>>>0>>0?n+1|0:n;ta=q,ua=we(j,n,l,p),H[ta+12>>2]=ua;j=H[E+4>>2];H[q+20>>2]=j;l=H[Y+80>>2];H[q+24>>2]=j>>>0>>0?1:j-l|0;Ca(H[q+52>>2]);H[q+68>>2]=0;H[q+60>>2]=0;H[q+64>>2]=0;H[q+52>>2]=0;H[q+56>>2]=0;j=N(j,152);l=H[q+28>>2];P:{if(!l){l=Fa(j);H[q+28>>2]=l;if(!l){break L}H[q+32>>2]=j;if(!j){break P}y(l,0,j);break P}if(j>>>0<=K[q+32>>2]){break P}l=Ha(l,j);if(!l){Ba(k,1,3090,0);Ca(H[q+28>>2]);H[q+28>>2]=0;H[q+32>>2]=0;break L}H[q+28>>2]=l;n=H[q+32>>2];p=j-n|0;if(p){y(l+n|0,0,p)}H[q+32>>2]=j}j=H[q+20>>2];if(j){ha=E+944|0;ia=E+812|0;da=E+28|0;z=H[q+28>>2];_=0;while(1){n=j-1|0;l=n&31;if((n&63)>>>0>=32){l=-1<>>32-l}p=p^-1;m=H[q>>2];o=p+m|0;v=l^-1;l=v+(m>>31)|0;m=m>>>0>o>>>0?l+1|0:l;l=n&31;if((n&63)>>>0>=32){r=m>>l}else{r=((1<>>l}H[z>>2]=r;o=H[q+4>>2];l=o+p|0;m=(o>>31)+v|0;m=l>>>0>>0?m+1|0:m;o=n&31;if((n&63)>>>0>=32){x=m>>o}else{x=((1<>>o}H[z+4>>2]=x;o=H[q+8>>2];l=o+p|0;m=(o>>31)+v|0;m=l>>>0>>0?m+1|0:m;o=n&31;if((n&63)>>>0>=32){m=m>>o}else{m=((1<>>o}H[z+8>>2]=m;o=H[q+12>>2];l=o+p|0;A=(o>>31)+v|0;A=l>>>0>>0?A+1|0:A;o=n&31;if((n&63)>>>0>=32){A=A>>o}else{A=((1<>>o}H[z+12>>2]=A;Q=m>>31;D=_<<2;J=H[D+ia>>2];l=J&31;if((J&63)>>>0>=32){l=1<>>32-l}R=o;o=R+m|0;U=o-1|0;l=l+Q|0;o=(o>>>0>>0?l+1|0:l)-!o|0;l=J&31;if((J&63)>>>0>=32){l=o>>l}else{l=((1<>>l}R=l<>31;Q=H[D+ha>>2];l=Q&31;if((Q&63)>>>0>=32){l=-1<>>32-l}D=o^-1;o=D+A|0;l=(l^-1)+U|0;D=o>>>0>>0?l+1|0:l;l=Q&31;if((Q&63)>>>0>=32){l=D>>l}else{l=((1<>>l}l=l<>Q:0;H[z+20>>2]=o;aa=r&-1<>J:0;H[z+16>>2]=l;te(l,0,o);if(!(!l|!qa)){break O}ba=N(l,o);if(ba>>>0>=107374183){break O}D=N(ba,40);if(_){Q=Q-1|0;J=J-1|0;l=$>>31;m=l;o=l+1|0;l=$+1|0;$=((l?m:o)&1)<<31|l>>>1;l=aa>>31;m=l;o=l+1|0;l=aa+1|0;aa=((l?m:o)&1)<<31|l>>>1;l=3}else{l=1}H[z+24>>2]=l;x=z+28|0;o=j;l=j&31;if((j&63)>>>0>=32){l=1<>>32-l}ga=j;A=l;j=H[E+12>>2];R=j>>>0>>0?j:Q;j=R&31;if((R&63)>>>0>=32){l=-1<>>32-j}ja=m^-1;ka=l^-1;j=H[E+8>>2];U=j>>>0>>0?j:J;j=U&31;if((U&63)>>>0>=32){l=-1<>>32-j}la=m^-1;ma=l^-1;ea=0;while(1){Q:{if(!_){l=H[q+4>>2];j=l+p|0;m=(l>>31)+v|0;m=j>>>0>>0?m+1|0:m;l=n&31;if((n&63)>>>0>=32){S=m>>l}else{S=((1<>>l}l=H[q>>2];j=l+p|0;m=(l>>31)+v|0;m=j>>>0>>0?m+1|0:m;l=n&31;if((n&63)>>>0>=32){C=m>>l}else{C=((1<>>l}j=0;m=p;M=m;l=v;T=l;r=n;break Q}j=ea+1|0;r=j>>>1|0;m=n&31;if((n&63)>>>0>=32){l=r<>>32-m;m=r<>2];m=M+r|0;l=(l^-1)+A|0;T=s>>>0>M>>>0?l+1|0:l;l=T+(r>>31)|0;r=m>>>0>>0?l+1|0:l;l=o&31;if((o&63)>>>0>=32){S=r>>l}else{S=((1<>>l}r=j&1;m=n&31;if((n&63)>>>0>=32){l=r<>>32-m;m=r<>2];r=m+s|0;l=(l^-1)+A|0;l=m>>>0>>0?l+1|0:l;C=l+(s>>31)|0;C=r>>>0>>0?C+1|0:C;s=o&31;if((o&63)>>>0>=32){C=C>>s}else{C=((1<>>s}r=o}s=r;P=H[q+8>>2];W=P>>31;r=H[q+12>>2];H[x+4>>2]=S;H[x>>2]=C;H[x+16>>2]=j;S=(r>>31)+T|0;C=r;r=r+M|0;S=C>>>0>r>>>0?S+1|0:S;M=s&31;if((s&63)>>>0>=32){r=S>>M}else{r=((1<>>M}H[x+12>>2]=r;l=l+W|0;C=l+1|0;r=l;l=m+P|0;r=l>>>0

>>0?C:r;m=s&31;if((s&63)>>>0>=32){l=r>>m}else{l=((1<>>m}H[x+8>>2]=l;ca=1;l=H[da>>2];j=(H[Z+24>>2]+(!H[E+20>>2]|!j?0:(j|0)==3?2:1)|0)-l|0;R:{if((j|0)>=1024){ca=898846567431158e293;if(j>>>0<2047){j=j-1023|0;break R}ca=Infinity;j=(j>>>0>=3069?3069:j)-2046|0;break R}if((j|0)>-1023){break R}ca=2004168360008973e-307;if(j>>>0>4294965304){j=j+969|0;break R}ca=0;j=(j>>>0<=4294964336?-2960:j)+1938|0}oa=+H[da+4>>2]*.00048828125+1;u(0,0);u(1,j+1023<<20);ta=x,va=O(oa*(ca*+w())),L[ta+32>>2]=va;H[x+28>>2]=(l+H[E+804>>2]|0)-1;j=H[x+20>>2];S:{T:{if(!(j|!ba)){j=Fa(D);H[x+20>>2]=j;if(!j){Ba(k,1,2854,0);break L}if(D){y(j,0,D)}H[x+24>>2]=D;break T}if(D>>>0>K[x+24>>2]){j=Ha(j,D);if(!j){Ba(k,1,2854,0);Ca(H[x+20>>2]);H[x+20>>2]=0;H[x+24>>2]=0;break L}H[x+20>>2]=j;l=H[x+24>>2];m=D-l|0;if(m){y(j+l|0,0,m)}H[x+24>>2]=D}if(!ba){break S}}j=H[x+20>>2];M=0;while(1){m=H[z+16>>2];l=(M>>>0)/(m>>>0)|0;m=M-N(l,m)|0;r=(m<>2];S=(r|0)>(s|0)?r:s;H[j>>2]=S;r=(l<>2];C=(r|0)>(s|0)?r:s;H[j+4>>2]=C;m=(m+1<>2];m=(m|0)<(r|0)?m:r;H[j+8>>2]=m;l=(l+1<>2];r=(l|0)<(r|0)?l:r;H[j+12>>2]=r;l=(m>>31)+ma|0;T=l+1|0;s=l;l=m+la|0;s=m>>>0>l>>>0?T:s;S=S>>U;m=U&31;if((U&63)>>>0>=32){l=s>>m}else{l=((1<>>m}s=l-S<>U;H[j+16>>2]=s;l=(r>>31)+ka|0;T=l+1|0;m=l;l=r+ja|0;r=l>>>0>>0?T:m;C=C>>R;m=R&31;if((R&63)>>>0>=32){l=r>>m}else{l=((1<>>m}l=l-C<>R;H[j+20>>2]=l;r=N(l,s);te(r,0,68);if(qa){Ba(k,1,2935,0);break L}l=N(r,68);m=H[j+24>>2];U:{V:{if(!(m|!r)){m=Fa(l);H[j+24>>2]=m;if(!m){break L}if(!l){break V}y(m,0,l);break V}if(l>>>0<=K[j+28>>2]){break U}m=Ha(m,l);if(!m){Ca(H[j+24>>2]);H[j+24>>2]=0;H[j+28>>2]=0;Ba(k,1,2549,0);break L}H[j+24>>2]=m;s=H[j+28>>2];T=l-s|0;if(!T){break V}y(m+s|0,0,T)}H[j+28>>2]=l}l=H[j+20>>2];m=H[j+16>>2];s=H[j+32>>2];W:{if(!s){l=ic(m,l,k);break W}l=gc(s,m,l,k)}H[j+32>>2]=l;l=H[j+20>>2];m=H[j+16>>2];s=H[j+36>>2];X:{if(!s){l=ic(m,l,k);break X}l=gc(s,m,l,k)}H[j+36>>2]=l;if(r){l=0;while(1){W=H[j+16>>2];T=(l>>>0)/(W>>>0)|0;m=H[j+24>>2]+N(l,68)|0;P=H[m>>2];Y:{if(P){pa=H[m+56>>2];s=H[m+48>>2];sa=H[m+4>>2];Ca(H[m+60>>2]);H[m+48>>2]=0;H[m+52>>2]=0;H[m- -64>>2]=0;H[m+56>>2]=0;H[m+60>>2]=0;H[m+40>>2]=0;H[m+44>>2]=0;H[m+32>>2]=0;H[m+36>>2]=0;H[m+24>>2]=0;H[m+28>>2]=0;H[m+16>>2]=0;H[m+20>>2]=0;H[m+8>>2]=0;H[m+12>>2]=0;H[m>>2]=P;H[m+48>>2]=s;Z:{if(!s){break Z}s=N(s,24);if(!s){break Z}y(P,0,s)}H[m+56>>2]=pa;H[m+4>>2]=sa;break Y}s=Ea(10,24);H[m>>2]=s;if(!s){break L}H[m+48>>2]=10}s=(l-N(T,W)|0)+S|0;P=s<>2];H[m+8>>2]=(P|0)>(W|0)?P:W;T=C+T|0;P=T<>2];H[m+12>>2]=(P|0)>(W|0)?P:W;s=s+1<>2];H[m+16>>2]=(s|0)<(P|0)?s:P;P=m;m=T+1<>2];H[P+20>>2]=(m|0)<(s|0)?m:s;l=l+1|0;if((r|0)!=(l|0)){continue}break}}j=j+40|0;M=M+1|0;if((M|0)!=(ba|0)){continue}break}}da=da+8|0;x=x+36|0;ea=ea+1|0;if(ea>>>0>2]){continue}break}z=z+152|0;j=n;_=_+1|0;if(_>>>0>2]){continue}break}}Z=Z+52|0;q=q+76|0;E=E+1080|0;fa=fa+1|0;if(fa>>>0>2]){continue}break}j=1;break K}Ba(k,1,2982,0);break L}Ba(k,1,2373,0)}j=0}if(!j){Ba(k,1,3668,0);j=0;break a}j=H[a+228>>2];H[t+4>>2]=N(H[a+128>>2],H[a+132>>2]);H[t>>2]=j+1;Ba(k,4,11825,t);H[b>>2]=H[a+228>>2];H[i>>2]=1;if(c){b=Tb(H[a+232>>2],0);H[c>>2]=b;j=0;if((b|0)==-1){break a}}b=H[H[H[a+232>>2]+20>>2]>>2];H[d>>2]=H[b>>2];H[e>>2]=H[b+4>>2];H[f>>2]=H[b+8>>2];H[g>>2]=H[b+12>>2];H[h>>2]=H[b+16>>2];H[a+8>>2]=H[a+8>>2]|128}j=1;break a}Ba(k,1,q,0)}Ba(k,1,3702,0);j=0}a=j;na=t+80|0;return a|0}function Xb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,L=0,M=0,O=0,P=0,Q=0,R=0,S=0,T=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{switch(H[a+84>>2]){case 0:k:{c=H[a+52>>2];b=H[a+196>>2];if(c>>>0>>0){q=H[a+64>>2];if(q>>>0>>0){break k}}Ba(H[a+236>>2],1,8491,0);break b}if(!H[a+44>>2]){k=H[a+36>>2];b=0;break i}H[a+44>>2]=0;i=H[a+68>>2];b=1;break i;case 1:l:{c=H[a+52>>2];b=H[a+196>>2];if(c>>>0>>0){q=H[a+64>>2];if(q>>>0>>0){break l}}Ba(H[a+236>>2],1,8536,0);break b}if(!H[a+44>>2]){e=H[a+36>>2];b=0;break e}H[a+44>>2]=0;i=H[a+48>>2];b=1;break e;case 2:m:{A=H[a+52>>2];x=H[a+196>>2];if(A>>>0>>0){r=H[a+64>>2];if(r>>>0>>0){break m}}Ba(H[a+236>>2],1,8671,0);break b}if(!H[a+44>>2]){y=H[a+40>>2];break f}H[a+228>>2]=0;H[a+232>>2]=0;H[a+44>>2]=0;j=H[a+200>>2];while(1){O=j+(u<<4)|0;l=H[O+8>>2];if(l){q=H[O+12>>2];b=0;while(1){g=l+(b^-1)|0;d=q+(b<<4)|0;s=g+H[d>>2]|0;n:{if(s>>>0>31){break n}c=H[O>>2];if(c>>>0>-1>>>s>>>0){break n}c=c<>>0>k>>>0?k:c:c;H[a+228>>2]=k}g=g+H[d+4>>2]|0;o:{if(g>>>0>31){break o}c=H[O+4>>2];if(c>>>0>-1>>>g>>>0){break o}c=c<>>0>i>>>0?i:c:c;H[a+232>>2]=i}b=b+1|0;if((l|0)!=(b|0)){continue}break}}u=u+1|0;if((x|0)!=(u|0)){continue}break};if(!k|!i){break d}if(!I[a|0]){H[a+108>>2]=H[a+208>>2];H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}o=H[a+48>>2];b=1;break f;case 3:p:{A=H[a+52>>2];l=H[a+196>>2];if(A>>>0>>0){P=H[a+64>>2];if(P>>>0>>0){break p}}Ba(H[a+236>>2],1,8626,0);break b}if(!H[a+44>>2]){B=H[a+200>>2];e=H[a+28>>2];y=B+(e<<4)|0;E=H[a+40>>2];break g}H[a+228>>2]=0;H[a+232>>2]=0;H[a+44>>2]=0;B=H[a+200>>2];while(1){x=(p<<4)+B|0;s=H[x+8>>2];if(s){q=H[x+12>>2];b=0;while(1){g=s+(b^-1)|0;d=q+(b<<4)|0;j=g+H[d>>2]|0;q:{if(j>>>0>31){break q}c=H[x>>2];if(c>>>0>-1>>>j>>>0){break q}c=c<>>0>k>>>0?k:c:c;H[a+228>>2]=k}g=g+H[d+4>>2]|0;r:{if(g>>>0>31){break r}c=H[x+4>>2];if(c>>>0>-1>>>g>>>0){break r}c=c<>>0>i>>>0?i:c:c;H[a+232>>2]=i}b=b+1|0;if((s|0)!=(b|0)){continue}break}}p=p+1|0;if((l|0)!=(p|0)){continue}break};if(!k|!i){break d}s:{if(I[a|0]){p=H[a+108>>2];break s}p=H[a+208>>2];H[a+108>>2]=p;H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}b=1;break g;case 4:break j;default:break d}}t:{p=H[a+52>>2];b=H[a+196>>2];if(p>>>0>>0){r=H[a+64>>2];if(r>>>0>>0){break t}}Ba(H[a+236>>2],1,8581,0);break d}if(!H[a+44>>2]){p=H[a+28>>2];o=H[a+200>>2]+(p<<4)|0;u=H[a+40>>2];b=0;break h}H[a+28>>2]=p;H[a+44>>2]=0;b=1;break h}u:while(1){v:{w:{if(!b){k=k+1|0;break w}H[a+40>>2]=i;if(K[a+56>>2]<=i>>>0){break b}e=H[a+48>>2];b=0;break v}b=1}x:while(1){y:{z:{A:{B:{if(!b){H[a+32>>2]=e;if(K[a+60>>2]<=e>>>0){break B}H[a+28>>2]=c;b=c;o=0;break y}H[a+36>>2]=k;if(K[a+76>>2]<=k>>>0){b=H[a+28>>2];o=1;break y}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],H[a+40>>2])|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],k)|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break A}break a}i=H[a+40>>2]+1|0;break z}b=0;continue u}b=1;continue u}while(1){C:{D:{E:{if(!o){if(b>>>0>=q>>>0){break E}g=H[a+32>>2];d=H[a+200>>2]+(b<<4)|0;if(g>>>0>=K[d+8>>2]){break C}if(!I[a|0]){b=H[d+12>>2]+(g<<4)|0;H[a+76>>2]=N(H[b+12>>2],H[b+8>>2])}k=H[a+72>>2];b=1;continue x}b=b+1|0;H[a+28>>2]=b;break D}e=H[a+32>>2]+1|0;b=0;continue x}o=0;continue}o=1;continue}}}}F:while(1){G:{H:{if(!b){u=u+1|0;H[a+40>>2]=u;break H}if(p>>>0>=r>>>0){break b}H[a+228>>2]=0;H[a+232>>2]=0;o=H[a+200>>2]+(p<<4)|0;s=H[o+8>>2];if(!s){break b}q=H[o+12>>2];k=0;e=0;b=0;while(1){g=s+(b^-1)|0;d=q+(b<<4)|0;j=g+H[d>>2]|0;I:{if(j>>>0>31){break I}c=H[o>>2];if(c>>>0>-1>>>j>>>0){break I}c=c<>>0>e>>>0?e:c:c;H[a+228>>2]=e}g=g+H[d+4>>2]|0;J:{if(g>>>0>31){break J}c=H[o+4>>2];if(c>>>0>-1>>>g>>>0){break J}c=c<>>0>k>>>0?k:c:c;H[a+232>>2]=k}b=b+1|0;if((s|0)!=(b|0)){continue}break}if(!e|!k){break d}K:{if(I[a|0]){k=H[a+108>>2];break K}k=H[a+208>>2];H[a+108>>2]=k;H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}b=0;break G}b=1}L:while(1){M:{N:{O:{P:{if(!b){H[a+224>>2]=k;if(K[a+112>>2]<=k>>>0){break P}B=H[a+100>>2];b=0;break M}if(K[a+56>>2]<=u>>>0){i=H[a+32>>2];b=1;break M}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],u)|0)+N(H[a+20>>2],p)|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break O}break a}p=p+1|0;H[a+28>>2]=p;break N}b=0;continue F}b=1;continue F}while(1){Q:{R:{S:{T:{if(!b){H[a+220>>2]=B;if(K[a+104>>2]<=B>>>0){break S}i=H[a+48>>2];break T}i=i+1|0}H[a+32>>2]=i;b=H[a+60>>2];d=H[o+8>>2];if((b>>>0>>0?b:d)>>>0>i>>>0){g=H[o>>2];c=g;n=d+(i^-1)|0;m=n;d=m&31;if((m&63)>>>0>=32){b=c<>>32-d;v=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break Q}b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[o+4>>2];if((b&c)!=(c|0)){break Q}d=m&31;if((m&63)>>>0>=32){b=c<>>32-d;w=c<>2];j=F+d|0;O=xe(j,d>>>0>j>>>0?h+1|0:h,w,b);b=h;L=H[a+208>>2];d=F+L|0;b=L>>>0>d>>>0?b+1|0:b;s=xe(d,b,w,C);A=v-1|0;j=H[a+212>>2];l=A+j|0;d=f-!v|0;b=d;x=xe(l,l>>>0>>0?b+1|0:b,v,f);D=H[a+204>>2];j=A+D|0;b=D>>>0>j>>>0?b+1|0:b;j=xe(j,b,v,f);z=H[o+12>>2]+(i<<4)|0;M=H[z>>2];t=M+n|0;b=t&31;if((t&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break Q}h=c;P=H[z+4>>2];n=P+n|0;e=n&31;if((n&63)>>>0>=32){b=c<>>32-e;e=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break Q}l=H[a+224>>2];e=!!(ye(l,e,b)|qa);b=n&31;if((n&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=n<>>32-e|b<>2];if((t&63)>>>0>=32){b=g<>>32-n;e=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=j<>>32-t|b<>2];if(!n|(!H[z+12>>2]|(j|0)==(x|0))){break Q}if((s|0)==(O|0)){break Q}u=H[a+68>>2];H[a+40>>2]=u;b=d;c=c+A|0;b=c>>>0>>0?b+1|0:b;g=(xe(c,b,v,f)>>>M)-(j>>>M)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(n,(xe(c,b,w,C)>>>P)-(s>>>P)|0)+g|0,H[S+36>>2]=T;b=1;continue L}c=H[a+220>>2];b=H[a+228>>2];B=c+b-(c>>>0)%(b>>>0)|0;break R}c=H[a+224>>2];b=H[a+232>>2];k=c+b-(c>>>0)%(b>>>0)|0;b=0;continue L}b=0;continue}b=1;continue}}}}U:while(1){V:{W:{if(!b){E=E+1|0;H[a+40>>2]=E;break W}H[a+224>>2]=p;if(K[a+112>>2]<=p>>>0){break b}v=H[a+100>>2];b=0;break V}b=1}X:while(1){Y:{Z:{_:{$:{if(!b){H[a+220>>2]=v;if(K[a+104>>2]<=v>>>0){break $}H[a+28>>2]=A;e=A;b=0;break Y}if(K[a+56>>2]<=E>>>0){u=H[a+32>>2];b=1;break Y}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],E)|0)+N(H[a+20>>2],e)|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break _}break a}c=H[a+224>>2];b=H[a+232>>2];p=c+b-(c>>>0)%(b>>>0)|0;break Z}b=0;continue U}b=1;continue U}while(1){aa:{ba:{ca:{da:{if(!b){if(e>>>0>=P>>>0){break ca}u=H[a+48>>2];H[a+32>>2]=u;y=(e<<4)+B|0;break da}u=u+1|0;H[a+32>>2]=u}b=H[a+60>>2];d=H[y+8>>2];if((b>>>0>>0?b:d)>>>0>u>>>0){g=H[y>>2];c=g;f=d+(u^-1)|0;i=f;d=f&31;if((f&63)>>>0>=32){b=c<>>32-d;k=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break aa}b=i&31;if((i&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[y+4>>2];if((b&c)!=(c|0)){break aa}d=i&31;if((i&63)>>>0>=32){b=c<>>32-d;o=c<>2];j=F+d|0;O=xe(j,d>>>0>j>>>0?h+1|0:h,o,b);b=h;w=H[a+208>>2];d=w+F|0;b=w>>>0>d>>>0?b+1|0:b;s=xe(d,b,o,n);C=k-1|0;j=H[a+212>>2];l=C+j|0;d=t-!k|0;b=d;x=xe(l,l>>>0>>0?b+1|0:b,k,t);L=H[a+204>>2];j=C+L|0;b=L>>>0>j>>>0?b+1|0:b;j=xe(j,b,k,t);D=H[y+12>>2]+(u<<4)|0;z=H[D>>2];m=z+f|0;b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break aa}h=c;M=H[D+4>>2];f=M+f|0;r=f&31;if((f&63)>>>0>=32){b=c<>>32-r;r=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break aa}l=H[a+224>>2];r=!!(ye(l,r,b)|qa);b=f&31;if((f&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-r|b<>2];if((m&63)>>>0>=32){b=g<>>32-f;f=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-m|b<>2];if(!f|(!H[D+12>>2]|(j|0)==(x|0))){break aa}if((s|0)==(O|0)){break aa}E=H[a+68>>2];H[a+40>>2]=E;b=d;c=c+C|0;b=c>>>0>>0?b+1|0:b;g=(xe(c,b,k,t)>>>z)-(j>>>z)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(f,(xe(c,b,o,n)>>>M)-(s>>>M)|0)+g|0,H[S+36>>2]=T;b=1;continue X}e=e+1|0;H[a+28>>2]=e;break ba}c=H[a+220>>2];b=H[a+228>>2];v=c+b-(c>>>0)%(b>>>0)|0;b=0;continue X}b=0;continue}b=1;continue}}}}ea:while(1){fa:{ga:{if(!b){y=y+1|0;H[a+40>>2]=y;break ga}H[a+32>>2]=o;if(K[a+60>>2]<=o>>>0){break b}E=H[a+108>>2];b=0;break fa}b=1}ha:while(1){ia:{ja:{ka:{la:{if(!b){H[a+224>>2]=E;if(K[a+112>>2]<=E>>>0){break la}B=H[a+100>>2];b=0;break ia}if(K[a+56>>2]<=y>>>0){p=H[a+28>>2];b=1;break ia}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],y)|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break ka}break a}o=H[a+32>>2]+1|0;break ja}b=0;continue ea}b=1;continue ea}while(1){ma:{na:{oa:{pa:{if(!b){H[a+220>>2]=B;if(K[a+104>>2]<=B>>>0){break oa}H[a+28>>2]=A;p=A;break pa}p=p+1|0;H[a+28>>2]=p}if(p>>>0>>0){m=H[a+32>>2];e=H[a+200>>2]+(p<<4)|0;b=H[e+8>>2];if(m>>>0>=b>>>0){break ma}g=H[e>>2];c=g;f=b+(m^-1)|0;i=f;d=f&31;if((f&63)>>>0>=32){b=c<>>32-d;v=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break ma}b=i&31;if((i&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[e+4>>2];if((b&c)!=(c|0)){break ma}d=i&31;if((i&63)>>>0>=32){b=c<>>32-d;w=c<>2];j=F+d|0;O=xe(j,d>>>0>j>>>0?h+1|0:h,w,b);b=h;L=H[a+208>>2];d=F+L|0;b=L>>>0>d>>>0?b+1|0:b;s=xe(d,b,w,n);C=v-1|0;j=H[a+212>>2];l=C+j|0;d=t-!v|0;b=d;x=xe(l,l>>>0>>0?b+1|0:b,v,t);D=H[a+204>>2];j=C+D|0;b=D>>>0>j>>>0?b+1|0:b;j=xe(j,b,v,t);z=H[e+12>>2]+(m<<4)|0;M=H[z>>2];m=M+f|0;b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break ma}h=c;P=H[z+4>>2];f=P+f|0;e=f&31;if((f&63)>>>0>=32){b=c<>>32-e;e=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break ma}l=H[a+224>>2];e=!!(ye(l,e,b)|qa);b=f&31;if((f&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-e|b<>2];if((m&63)>>>0>=32){b=g<>>32-f;f=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-m|b<>2];if(!f|(!H[z+12>>2]|(j|0)==(x|0))){break ma}if((s|0)==(O|0)){break ma}y=H[a+68>>2];H[a+40>>2]=y;b=d;c=c+C|0;b=c>>>0>>0?b+1|0:b;g=(xe(c,b,v,t)>>>M)-(j>>>M)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(f,(xe(c,b,w,n)>>>P)-(s>>>P)|0)+g|0,H[S+36>>2]=T;b=1;continue ha}c=H[a+220>>2];b=H[a+228>>2];B=c+b-(c>>>0)%(b>>>0)|0;break na}c=H[a+224>>2];b=H[a+232>>2];E=c+b-(c>>>0)%(b>>>0)|0;b=0;continue ha}b=0;continue}b=1;continue}}}}qa:while(1){ra:{sa:{if(!b){e=e+1|0;break sa}H[a+32>>2]=i;if(K[a+60>>2]<=i>>>0){break b}k=H[a+68>>2];b=0;break ra}b=1}ta:while(1){ua:{va:{wa:{xa:{if(!b){H[a+40>>2]=k;if(K[a+56>>2]<=k>>>0){break xa}H[a+28>>2]=c;b=c;o=0;break ua}H[a+36>>2]=e;if(K[a+76>>2]<=e>>>0){b=H[a+28>>2];o=1;break ua}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],H[a+40>>2])|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],e)|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break wa}break a}i=H[a+32>>2]+1|0;break va}b=0;continue qa}b=1;continue qa}while(1){ya:{za:{Aa:{if(!o){if(b>>>0>=q>>>0){break Aa}g=H[a+32>>2];d=H[a+200>>2]+(b<<4)|0;if(g>>>0>=K[d+8>>2]){break ya}if(!I[a|0]){b=H[d+12>>2]+(g<<4)|0;H[a+76>>2]=N(H[b+12>>2],H[b+8>>2])}e=H[a+72>>2];b=1;continue ta}b=b+1|0;H[a+28>>2]=b;break za}k=H[a+40>>2]+1|0;b=0;continue ta}o=0;continue}o=1;continue}}}}return 0}Ba(H[a+236>>2],1,1343,0)}return 0}G[b>>1]=1;return 1}function pd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=O(0),t=0,u=0,v=0,w=O(0),x=0,z=0,A=0,C=O(0),D=O(0),E=O(0),G=0,J=0,K=0,L=0,M=0,Q=O(0),R=0,S=0,T=0;n=na-8320|0;na=n;H[n+64>>2]=0;j=2;g=H[a>>2];a:{b:{if((g|0)==176622093){break b}if((g|0)!=1375686655){if(!((g|0)!=201326592|H[a+4>>2]!=538988650)&H[a+8>>2]==176622093){break b}Y(1101);j=1;break a}j=0}g=Ea(1,96);k=0;c:{if(!g){break c}H[g+76>>2]=1;d:{e:{f:{switch(j|0){case 0:H[g+88>>2]=68;H[g+84>>2]=69;H[g+80>>2]=70;H[g+16>>2]=71;H[g+4>>2]=72;H[g+28>>2]=73;H[g+24>>2]=74;H[g+20>>2]=75;H[g>>2]=76;H[g+92>>2]=77;H[g+44>>2]=78;H[g+40>>2]=79;H[g+36>>2]=80;H[g+32>>2]=81;H[g+12>>2]=82;H[g+8>>2]=83;i=Lb();H[g+48>>2]=i;if(i){break e}break d;case 2:break f;default:break d}}H[g+88>>2]=84;H[g+84>>2]=85;H[g+80>>2]=86;H[g+16>>2]=87;H[g+4>>2]=88;H[g+92>>2]=89;H[g+44>>2]=90;H[g+40>>2]=91;H[g+36>>2]=92;H[g+32>>2]=93;H[g+28>>2]=94;H[g+24>>2]=95;H[g+20>>2]=96;H[g+12>>2]=97;H[g+8>>2]=98;H[g>>2]=99;i=Ea(1,136);g:{if(i){k=Lb();H[i>>2]=k;h:{if(!k){break h}H[i+108>>2]=0;H[i+112>>2]=0;F[i+124|0]=0;H[i+116>>2]=0;H[i+120>>2]=0;k=rb();H[i+4>>2]=k;if(!k){break h}k=rb();H[i+8>>2]=k;if(!k){break h}break g}Gc(i)}i=0}H[g+48>>2]=i;if(!i){break d}}H[g+72>>2]=1;H[g+64>>2]=1;H[g+60>>2]=0;H[g+52>>2]=0;H[g+56>>2]=0;H[g+68>>2]=1;k=g;break c}Ca(g);k=0}g=k;if(g){H[g+60>>2]=0;H[g+72>>2]=100}if(g){H[g+56>>2]=0;H[g+68>>2]=101}if(g){H[g+52>>2]=0;H[g+64>>2]=102}i=n+68|0;if(i){y(i,0,8248);H[i+8248>>2]=0;H[i+8200>>2]=-1;H[i+8204>>2]=-1}if(d){H[n+8316>>2]=H[n+8316>>2]|1}H[n+60>>2]=b;H[n+56>>2]=a;H[n+52>>2]=a;j=1;b=0;i=n+52|0;i:{if(!i){break i}a=Ea(1,72);if(a){j:{H[a+64>>2]=1048576;k=Fa(1048576);H[a+32>>2]=k;if(!k){Ca(a);a=0;break j}H[a+36>>2]=k;H[a+28>>2]=2;H[a+24>>2]=3;H[a+20>>2]=4;H[a+16>>2]=5;H[a+44>>2]=6;H[a+40>>2]=8;H[a+68>>2]=H[a+68>>2]|2}}else{a=0}if(!a){break i}if(a){H[a+4>>2]=0;H[a>>2]=i}if(a){H[a+8>>2]=H[i+8>>2];H[a+12>>2]=0}if(!(!a|!(I[a+68|0]&2))){H[a+16>>2]=64}if(a){H[a+24>>2]=66}if(a){H[a+28>>2]=67}b=a}a=n+68|0;if(!g|!a){a=0}else{k:{if(!H[g+76>>2]){Ba(g+52|0,1,9902,0);a=0;break k}ra[H[g+24>>2]](H[g+48>>2],a);a=1}}if(!a){Y(1153);gb(b);ib(g);break a}if(!b|!g){a=0}else{l:{if(!H[g+76>>2]){Ba(g+52|0,1,9983,0);a=0;break l}a=ra[H[g>>2]](b,H[g+48>>2],n- -64|0,g+52|0)|0}}if(!a){Y(1181);gb(b);ib(g);Va(H[n+64>>2]);break a}m:{if(!f){break m}if(g){a=ra[H[g+40>>2]](H[g+48>>2],f,g+52|0)|0}else{a=0}if(a){break m}Y(1116);gb(b);ib(g);Va(H[n+64>>2]);break a}a=H[n+64>>2];n:{if(!H[g+76>>2]|(!g|!b)){a=0}else{a=ra[H[g+4>>2]](H[g+48>>2],b,a,g+52|0)|0}if(a){if(!H[g+76>>2]|(!g|!b)){a=0}else{a=ra[H[g+16>>2]](H[g+48>>2],b,g+52|0)|0}if(a){break n}}Y(1316);ib(g);gb(b);Va(H[n+64>>2]);break a}gb(b);ib(g);l=H[n+64>>2];a=H[l+28>>2];if(a){Ca(a);l=H[n+64>>2];H[l+28>>2]=0;H[l+32>>2]=0}v=H[l+16>>2];o:{p:{if(!c){if(!(!e|(v|0)!=4)){p=1;v=4;break o}q:{b=H[l+20>>2];if(!((b|0)==3|(v|0)!=3)){a=H[l+24>>2];if(H[a>>2]!=H[a+4>>2]|H[a+52>>2]==1){break q}H[l+20>>2]=3;break p}if(v>>>0>2){break q}H[l+20>>2]=2;break o}r:{switch(b-3|0){case 2:s:{t:{if(v>>>0<4){break t}b=H[l+24>>2];a=H[b>>2];if((a|0)!=H[b+52>>2]|(a|0)!=H[b+104>>2]|(a|0)!=H[b+156>>2]){break t}a=H[b+4>>2];if((a|0)!=H[b+56>>2]|(a|0)!=H[b+108>>2]){break t}if((a|0)==H[b+160>>2]){break s}}H[n+20>>2]=1053;H[n+16>>2]=1373;Ga(26080,8179,n+16|0);break o}f=N(H[b+12>>2],H[b+8>>2]);C=O(O(1)/O((-1<>2]^-1)>>>0));D=O(O(1)/O((-1<>2]^-1)>>>0));w=O(O(1)/O((-1<>2]^-1)>>>0));Q=O(O(1)/O((-1<>2]^-1)>>>0));a=0;while(1){if((a|0)!=(f|0)){c=a<<2;g=c+H[b+148>>2]|0;i=H[g>>2];k=c+H[b+96>>2]|0;j=H[k>>2];m=c+H[b+44>>2]|0;s=O(O(1)-O(C*O(H[c+H[b+200>>2]>>2])));E=O(O(O(O(1)-O(Q*O(H[m>>2])))*O(255))*s);if(O(P(E))>2]=c;E=O(O(O(O(1)-O(w*O(j|0)))*O(255))*s);if(O(P(E))>2]=c;s=O(O(O(O(1)-O(D*O(i|0)))*O(255))*s);if(O(P(s))>2]=c;a=a+1|0;continue}break};Ca(H[b+200>>2]);a=H[l+24>>2];H[a+128>>2]=8;H[a+76>>2]=8;H[a+24>>2]=8;H[a+200>>2]=0;H[l+20>>2]=1;a=H[l+16>>2]-1|0;H[l+16>>2]=a;h=3;while(1){if(a>>>0<=h>>>0){break o}a=H[l+24>>2]+N(h,52)|0;B(a,a+52|0,52);h=h+1|0;a=H[l+16>>2];continue};case 0:break p;case 1:break r;default:break o}}b=H[l+24>>2];a=H[b>>2];u:{v:{if((a|0)!=H[b+52>>2]|(a|0)!=H[b+104>>2]){break v}a=H[b+4>>2];if((a|0)!=H[b+56>>2]){break v}if((a|0)==H[b+108>>2]){break u}}H[n+36>>2]=1115;H[n+32>>2]=1373;Ga(26080,8221,n+32|0);break o}a=H[b+24>>2];c=-1<>2]?0:a;i=H[b+84>>2]?0:a;k=N(H[b+12>>2],H[b+8>>2]);a=0;while(1){if((a|0)!=(k|0)){f=a<<2;j=f+H[b+44>>2]|0;m=f+H[b+148>>2]|0;s=O(H[m>>2]-g|0);h=f+H[b+96>>2]|0;C=O(H[h>>2]-i|0);D=O(H[j>>2]);w=O(O(O(s*O(1.4019900560379028))+O(O(C*O(-3680000008898787e-20))+D))+O(.5));if(O(P(w))>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;w=O(O(O(s*O(-.7141128182411194))+O(O(D*O(1.0003000497817993))+O(C*O(-.34412500262260437))))+O(.5));if(O(P(w))>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;s=O(O(O(s*O(-7999999979801942e-21))+O(O(D*O(.9998229742050171))+O(C*O(1.7720400094985962))))+O(.5));if(O(P(s))>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;a=a+1|0;continue}break}H[l+20>>2]=1;break o}v=c>>>0>v>>>0?v:c;p=1;break o}w:{x:{c=H[l+24>>2];if(H[c>>2]!=1){break x}y:{switch(H[c+52>>2]-1|0){case 1:if(H[c+104>>2]!=2){break x}if(!(H[c+4>>2]!=1|H[c+56>>2]!=2|H[c+108>>2]!=2)){b=H[c+24>>2];h=H[c+148>>2];a=H[c+96>>2];j=H[c+44>>2];G=H[c+60>>2];q=H[c+8>>2];f=H[c+12>>2];c=N(q,f)<<2;g=Ia(c);i=Ia(c);k=Ia(c);if(!(!g|!i|!k)){m=-1<>2]&1;L=f-b|0;K=H[l>>2]&1;x=q-K|0;if(!b){c=k;f=i;b=g;break w}c=k;f=i;b=g;while(1){if((p|0)==(q|0)){break w}Ka(o,m,H[j>>2],0,0,b,f,c);p=p+1|0;c=c+4|0;f=f+4|0;b=b+4|0;j=j+4|0;continue}}Ca(g);Ca(i);Ca(k);break o}if(H[c+4>>2]!=1|H[c+56>>2]!=1|H[c+108>>2]!=1){break x}a=H[c+24>>2];f=H[c+148>>2];b=H[c+96>>2];h=H[c+44>>2];t=H[c+60>>2];g=H[c+8>>2];x=H[c+12>>2];c=N(g,x)<<2;i=Ia(c);k=Ia(c);m=Ia(c);if(!(!i|!k|!m)){o=-1<>2]&1;a=g-z|0;G=a&1;u=a>>>1|0;J=a&-2;a=m;j=k;c=i;while(1){if((q|0)!=(x|0)){if(z){Ka(r,o,H[h>>2],0,0,c,j,a);j=j+4|0;c=c+4|0;h=h+4|0;a=a+4|0}g=0;while(1){if(g>>>0>>0){Ka(r,o,H[h>>2],H[b>>2],H[f>>2],c,j,a);Ka(r,o,H[h+4>>2],H[b>>2],H[f>>2],c+4|0,j+4|0,a+4|0);g=g+2|0;f=f+4|0;b=b+4|0;a=a+8|0;j=j+8|0;c=c+8|0;h=h+8|0;continue}break}z:{if(!G){break z}g=H[h>>2];A:{if((t|0)==(u|0)){Ka(r,o,g,0,0,c,j,a);break A}Ka(r,o,g,H[b>>2],H[f>>2],c,j,a)}a=a+4|0;j=j+4|0;c=c+4|0;h=h+4|0;if(t>>>0<=u>>>0){break z}f=f+4|0;b=b+4|0}q=q+1|0;continue}break}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=i;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=k;Ca(H[a+148>>2]);a=H[l+24>>2];H[a+148>>2]=m;b=H[a+8>>2];H[a+112>>2]=b;H[a+60>>2]=b;b=H[a+12>>2];H[a+116>>2]=b;H[a+64>>2]=b;b=H[a>>2];H[a+104>>2]=b;H[a+52>>2]=b;b=H[a+4>>2];H[a+108>>2]=b;H[a+56>>2]=b;H[l+20>>2]=1;break o}Ca(i);Ca(k);Ca(m);break o;case 0:break y;default:break x}}if(H[c+104>>2]!=1|H[c+4>>2]!=1|(H[c+56>>2]!=1|H[c+108>>2]!=1)){break x}b=H[c+24>>2];h=H[c+148>>2];a=H[c+96>>2];j=H[c+44>>2];o=N(H[c+12>>2],H[c+8>>2]);c=o<<2;i=Ia(c);k=Ia(c);m=Ia(c);if(!(!i|!k|!m)){q=-1<>2],H[a>>2],H[h>>2],g,b,f);c=c+1|0;f=f+4|0;b=b+4|0;g=g+4|0;h=h+4|0;a=a+4|0;j=j+4|0;continue}break}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=i;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=k;Ca(H[a+148>>2]);H[H[l+24>>2]+148>>2]=m;H[l+20>>2]=1;break o}Ca(i);Ca(k);Ca(m);break o}H[n+4>>2]=463;H[n>>2]=1373;Ga(26080,8264,n);break o}J=x>>>1|0;z=x&-2;R=L&-2;u=q<<2;while(1){if(M>>>0>>0){p=c+u|0;r=f+u|0;q=b+u|0;t=j+u|0;if(K){Ka(o,m,H[j>>2],0,0,b,f,c);Ka(o,m,H[t>>2],H[a>>2],H[h>>2],q,r,p);p=p+4|0;r=r+4|0;q=q+4|0;t=t+4|0;c=c+4|0;f=f+4|0;j=j+4|0;b=b+4|0}A=0;while(1){if(z>>>0>A>>>0){Ka(o,m,H[j>>2],H[a>>2],H[h>>2],b,f,c);Ka(o,m,H[j+4>>2],H[a>>2],H[h>>2],b+4|0,f+4|0,c+4|0);Ka(o,m,H[t>>2],H[a>>2],H[h>>2],q,r,p);Ka(o,m,H[t+4>>2],H[a>>2],H[h>>2],q+4|0,r+4|0,p+4|0);A=A+2|0;h=h+4|0;a=a+4|0;p=p+8|0;r=r+8|0;q=q+8|0;t=t+8|0;c=c+8|0;f=f+8|0;b=b+8|0;j=j+8|0;continue}break}B:{if((x|0)==(z|0)){break B}A=H[j>>2];C:{if((G|0)==(J|0)){Ka(o,m,A,0,0,b,f,c);Ka(o,m,H[t>>2],0,0,q,r,p);break C}Ka(o,m,A,H[a>>2],H[h>>2],b,f,c);Ka(o,m,H[t>>2],H[a>>2],H[h>>2],q,r,p)}c=c+4|0;f=f+4|0;b=b+4|0;j=j+4|0;if(G>>>0<=J>>>0){break B}h=h+4|0;a=a+4|0}M=M+2|0;c=c+u|0;f=f+u|0;b=b+u|0;j=j+u|0;continue}break}D:{if(!(L&1)){break D}if(K){Ka(o,m,H[j>>2],0,0,b,f,c);c=c+4|0;f=f+4|0;j=j+4|0;b=b+4|0}p=0;while(1){if(p>>>0>>0){Ka(o,m,H[j>>2],H[a>>2],H[h>>2],b,f,c);Ka(o,m,H[j+4>>2],H[a>>2],H[h>>2],b+4|0,f+4|0,c+4|0);p=p+2|0;h=h+4|0;a=a+4|0;c=c+8|0;f=f+8|0;b=b+8|0;j=j+8|0;continue}break}if((x|0)==(z|0)){break D}j=H[j>>2];if((G|0)==(J|0)){Ka(o,m,j,0,0,b,f,c);break D}Ka(o,m,j,H[a>>2],H[h>>2],b,f,c)}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=g;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=i;Ca(H[a+148>>2]);a=H[l+24>>2];H[a+148>>2]=k;b=H[a+8>>2];H[a+112>>2]=b;H[a+60>>2]=b;b=H[a+12>>2];H[a+116>>2]=b;H[a+64>>2]=b;b=H[a>>2];H[a+104>>2]=b;H[a+52>>2]=b;b=H[a+4>>2];H[a+108>>2]=b;H[a+56>>2]=b;H[l+20>>2]=1;p=0}c=H[n+64>>2];E:{if(d){break E}b=0;while(1){if((b|0)==(v|0)){break E}a=H[c+24>>2]+N(b,52)|0;d=H[a+24>>2];if((d|0)!=8){F:{if(d>>>0<=7){f=N(H[a+12>>2],H[a+8>>2]);g=H[a+44>>2];if(H[a+32>>2]){i=1<>2];k=d>>31<<7|d>>>25;S=m,T=we(d<<7,k,i,0),H[S>>2]=T;h=h+1|0;continue}}d=-1<>2],0,255),qa,d,0);H[i>>2]=k;h=h+1|0;continue}}d=d-8|0;f=N(H[a+12>>2],H[a+8>>2]);g=H[a+44>>2];h=0;if(H[a+32>>2]){while(1){if((f|0)==(h|0)){break F}i=g+(h<<2)|0;H[i>>2]=H[i>>2]>>d;h=h+1|0;continue}}while(1){if((f|0)==(h|0)){break F}i=g+(h<<2)|0;H[i>>2]=H[i>>2]>>>d;h=h+1|0;continue}}H[a+24>>2]=8}b=b+1|0;continue}}a=H[c+24>>2];b=N(H[a+12>>2],H[a+8>>2]);G:{if(!p){if(H[c+20>>2]==2){if(H[c+16>>2]==1){ma(H[a+44>>2],b|0);break G}if(!e){break G}da(H[a+44>>2],H[a+96>>2],b|0);break G}ca(H[a+44>>2],H[a+96>>2],H[a+148>>2],b|0);break G}H:{switch(v-1|0){case 0:ba(H[a+44>>2],b|0);break G;case 2:aa(H[a+44>>2],H[a+96>>2],H[a+148>>2],b|0);break G;case 3:break H;default:break G}}$(H[a+44>>2],H[a+96>>2],H[a+148>>2],H[a+200>>2],b|0)}Va(H[n+64>>2]);j=0}na=n+8320|0;return j|0}function cc(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,L=0,M=0,O=0;j=H[a>>2];a:{if(j>>>0>>0|b>>>0>=d>>>0|b>>>0>=j>>>0){break a}j=H[a+4>>2];if(j>>>0>>0|c>>>0>=e>>>0|c>>>0>=j>>>0){break a}E=(c>>>0)/K[a+12>>2]|0;s=H[a+8>>2];G=(b>>>0)/(s>>>0)|0;L=(N(s,G)-b|0)+s|0;z=c;while(1){k=H[a+12>>2];j=k;j=(c|0)==(z|0)?j-((c>>>0)%(j>>>0)|0)|0:j;t=e-z|0;r=j>>>0>>0?j:t;A=r&-4;u=r&3;M=r&-8;I=r&7;x=r-1|0;O=(g|0)==2&(r|0)==1;J=N(k-j|0,s);C=(N(z-c|0,h)<<2)+f|0;F=G;t=b;while(1){j=(b|0)==(t|0)?L:s;k=d-t|0;q=j>>>0>>0?j:k;k=s-j|0;l=F<<2;j=H[l+(H[a+24>>2]+(N(H[a+16>>2],E)<<2)|0)>>2];b:{c:{d:{e:{f:{g:{if(i){h:{i:{j:{k:{if(j){l=((J<<2)+j|0)+(k<<2)|0;j=t-b|0;if((g|0)==1){break h}m=(N(g,j)<<2)+C|0;if((q|0)==1){break i}if(O){break j}if((g|0)!=8|q>>>0<=7){break k}if(!r){break b}o=q&-4;k=0;while(1){j=0;while(1){H[(j<<5)+m>>2]=H[(j<<2)+l>>2];n=j|1;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];n=j|2;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];n=j|3;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];j=j+4|0;if(o>>>0>j>>>0){continue}break}if(j>>>0>>0){while(1){H[(j<<5)+m>>2]=H[(j<<2)+l>>2];j=j+1|0;if((q|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}if((g|0)!=1){if(!r){break b}p=q&-4;n=q&3;l=(N(t-b|0,g)<<2)+C|0;o=0;D=q-1>>>0<3;while(1){l:{if(!q){break l}m=0;j=0;k=0;if(!D){while(1){H[(N(g,j)<<2)+l>>2]=0;H[(N(j|1,g)<<2)+l>>2]=0;H[(N(j|2,g)<<2)+l>>2]=0;H[(N(j|3,g)<<2)+l>>2]=0;j=j+4|0;k=k+4|0;if((p|0)!=(k|0)){continue}break}}if(!n){break l}while(1){H[(N(g,j)<<2)+l>>2]=0;j=j+1|0;m=m+1|0;if((n|0)!=(m|0)){continue}break}}l=(h<<2)+l|0;o=o+1|0;if((r|0)!=(o|0)){continue}break}break b}if(!r){break b}l=q<<2;k=(t-b<<2)+C|0;o=0;if(x>>>0>=7){break g}break f}if(!r){break b}D=q&-4;p=q&3;n=0;v=q-1>>>0<3;break c}j=0;k=q&-4;if(k){while(1){H[(j<<3)+m>>2]=H[(j<<2)+l>>2];o=j|1;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];o=j|2;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];o=j|3;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];j=j+4|0;if(k>>>0>j>>>0){continue}break}}if(j>>>0>=q>>>0){break b}o=0;k=j;n=q-j&3;if(n){while(1){H[(k<<3)+m>>2]=H[(k<<2)+l>>2];k=k+1|0;o=o+1|0;if((n|0)!=(o|0)){continue}break}}if(j-q>>>0>4294967292){break b}while(1){H[(k<<3)+m>>2]=H[(k<<2)+l>>2];j=k+1|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];j=k+2|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];j=k+3|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];k=k+4|0;if((q|0)!=(k|0)){continue}break}break b}if(!r){break b}k=0;if(x>>>0>=3){while(1){H[m>>2]=H[l>>2];j=h<<2;m=j+m|0;p=l;l=s<<2;o=p+l|0;H[m>>2]=H[o>>2];m=j+m|0;o=l+o|0;H[m>>2]=H[o>>2];m=j+m|0;o=l+o|0;H[m>>2]=H[o>>2];l=l+o|0;m=j+m|0;k=k+4|0;if((A|0)!=(k|0)){continue}break}}j=0;if(!u){break b}while(1){H[m>>2]=H[l>>2];l=(s<<2)+l|0;m=(h<<2)+m|0;j=j+1|0;if((u|0)!=(j|0)){continue}break}break b}j=(j<<2)+C|0;if((q|0)!=4){if(!r){break b}m=q<<2;o=0;if(x>>>0>=3){break e}break d}if(!r){break b}o=0;if(x>>>0>=3){while(1){k=H[l+4>>2];H[j>>2]=H[l>>2];H[j+4>>2]=k;k=H[l+12>>2];H[j+8>>2]=H[l+8>>2];H[j+12>>2]=k;k=l;l=s<<2;k=k+l|0;n=H[k+12>>2];m=h<<2;j=m+j|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;k=l+k|0;n=H[k+12>>2];j=j+m|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;k=l+k|0;n=H[k+12>>2];j=j+m|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;l=l+k|0;j=j+m|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}}m=0;if(!u){break b}while(1){k=H[l+4>>2];H[j>>2]=H[l>>2];H[j+4>>2]=k;k=H[l+12>>2];H[j+8>>2]=H[l+8>>2];H[j+12>>2]=k;l=(s<<2)+l|0;j=(h<<2)+j|0;m=m+1|0;if((u|0)!=(m|0)){continue}break}break b}if(!j){j=Ea(1,N(H[a+8>>2],H[a+12>>2])<<2);if(!j){return 0}H[l+(H[a+24>>2]+(N(H[a+16>>2],E)<<2)|0)>>2]=j}l=((J<<2)+j|0)+(k<<2)|0;j=t-b|0;m:{n:{o:{p:{q:{r:{if((g|0)!=1){m=(N(g,j)<<2)+C|0;if((q|0)==1){break r}if((g|0)!=8|q>>>0<=7){break q}if(!r){break b}o=q&-4;k=0;while(1){j=0;while(1){H[(j<<2)+l>>2]=H[(j<<5)+m>>2];n=j|1;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];n=j|2;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];n=j|3;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];j=j+4|0;if(o>>>0>j>>>0){continue}break}if(j>>>0>>0){while(1){H[(j<<2)+l>>2]=H[(j<<5)+m>>2];j=j+1|0;if((q|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}j=(j<<2)+C|0;if((q|0)==4){break p}if(!r){break b}m=q<<2;o=0;if(x>>>0>=3){break o}break n}if(!r){break b}o=0;if(x>>>0>=3){while(1){H[l>>2]=H[m>>2];j=s<<2;l=j+l|0;k=h<<2;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}}j=0;if(!u){break b}while(1){H[l>>2]=H[m>>2];l=(s<<2)+l|0;m=(h<<2)+m|0;j=j+1|0;if((u|0)!=(j|0)){continue}break}break b}if(!r){break b}D=q&-4;p=q&3;n=0;break m}if(!r){break b}o=0;if(x>>>0>=3){while(1){k=H[j+4>>2];H[l>>2]=H[j>>2];H[l+4>>2]=k;k=H[j+12>>2];H[l+8>>2]=H[j+8>>2];H[l+12>>2]=k;m=h<<2;j=m+j|0;n=H[j+12>>2];k=l;l=s<<2;k=k+l|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;n=H[j+12>>2];k=l+k|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;n=H[j+12>>2];k=l+k|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;l=l+k|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}}m=0;if(!u){break b}while(1){k=H[j+4>>2];H[l>>2]=H[j>>2];H[l+4>>2]=k;k=H[j+12>>2];H[l+8>>2]=H[j+8>>2];H[l+12>>2]=k;j=(h<<2)+j|0;l=(s<<2)+l|0;m=m+1|0;if((u|0)!=(m|0)){continue}break}break b}while(1){k=!m;if(!k){B(l,j,m)}p=j;j=h<<2;n=p+j|0;p=l;l=s<<2;p=p+l|0;if(!k){B(p,n,m)}n=j+n|0;p=l+p|0;if(!k){B(p,n,m)}n=j+n|0;p=l+p|0;if(!k){B(p,n,m)}j=j+n|0;l=l+p|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}}k=0;if(!u){break b}while(1){if(m){B(l,j,m)}j=(h<<2)+j|0;l=(s<<2)+l|0;k=k+1|0;if((u|0)!=(k|0)){continue}break}break b}while(1){s:{if(!q){break s}k=0;j=0;o=0;if(q>>>0>=4){while(1){H[(j<<2)+l>>2]=H[(N(g,j)<<2)+m>>2];v=j|1;H[(v<<2)+l>>2]=H[(N(g,v)<<2)+m>>2];v=j|2;H[(v<<2)+l>>2]=H[(N(g,v)<<2)+m>>2];v=j|3;H[(v<<2)+l>>2]=H[(N(g,v)<<2)+m>>2];j=j+4|0;o=o+4|0;if((D|0)!=(o|0)){continue}break}}if(!p){break s}while(1){H[(j<<2)+l>>2]=H[(N(g,j)<<2)+m>>2];j=j+1|0;k=k+1|0;if((p|0)!=(k|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;n=n+1|0;if((r|0)!=(n|0)){continue}break}break b}while(1){j=!l;if(!j){y(k,0,l)}p=k;k=h<<2;m=p+k|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}k=k+m|0;o=o+8|0;if((M|0)!=(o|0)){continue}break}}j=0;if(!I){break b}while(1){if(l){y(k,0,l)}k=(h<<2)+k|0;j=j+1|0;if((I|0)!=(j|0)){continue}break}break b}while(1){k=!m;if(!k){B(j,l,m)}p=l;l=s<<2;n=p+l|0;p=j;j=h<<2;p=p+j|0;if(!k){B(p,n,m)}n=l+n|0;p=j+p|0;if(!k){B(p,n,m)}n=l+n|0;p=j+p|0;if(!k){B(p,n,m)}l=l+n|0;j=j+p|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}}k=0;if(!u){break b}while(1){if(m){B(j,l,m)}l=(s<<2)+l|0;j=(h<<2)+j|0;k=k+1|0;if((u|0)!=(k|0)){continue}break}break b}while(1){t:{if(!q){break t}k=0;j=0;o=0;if(!v){while(1){H[(N(g,j)<<2)+m>>2]=H[(j<<2)+l>>2];w=j|1;H[(N(w,g)<<2)+m>>2]=H[(w<<2)+l>>2];w=j|2;H[(N(w,g)<<2)+m>>2]=H[(w<<2)+l>>2];w=j|3;H[(N(w,g)<<2)+m>>2]=H[(w<<2)+l>>2];j=j+4|0;o=o+4|0;if((D|0)!=(o|0)){continue}break}}if(!p){break t}while(1){H[(N(g,j)<<2)+m>>2]=H[(j<<2)+l>>2];j=j+1|0;k=k+1|0;if((p|0)!=(k|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;n=n+1|0;if((r|0)!=(n|0)){continue}break}}F=F+1|0;t=q+t|0;if(t>>>0>>0){continue}break}E=E+1|0;z=r+z|0;if(z>>>0>>0){continue}break}}return 1}function Qd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(!c){return 0}if(!Ib(H[a>>2],b,c,d)){Ba(d,1,6210,0);return 0}p=c;g=na-240|0;na=g;r=1;q=a;a:{if(H[H[a>>2]+60>>2]|H[a+128>>2]){break a}b:{c=H[a+116>>2];c:{if(!c){a=H[a+120>>2];break c}b=H[p+16>>2];a=H[q+120>>2];if(!(!a|!H[a+12>>2])){b=I[a+18|0]}d:{f=J[c+4>>1];if(f){c=H[c>>2];while(1){h=c+N(e,6)|0;i=J[h>>1];if(i>>>0>=b>>>0){H[g+180>>2]=b;H[g+176>>2]=i;Ba(d,1,13715,g+176|0);r=0;break a}e:{h=J[h+4>>1];if(!h|(h|0)==65535){break e}h=h-1|0;if(h>>>0>>0){break e}H[g+164>>2]=b;H[g+160>>2]=h;Ba(d,1,13715,g+160|0);r=0;break a}e=e+1|0;if((f|0)!=(e|0)){continue}break}break d}if(b){break b}break c}while(1){b=b-1|0;e=0;while(1){if(J[c+N(e,6)>>1]!=(b|0)){e=e+1|0;if((f|0)!=(e|0)){continue}break b}break}if(b){continue}break}}f:{if(!a){break f}h=H[a+12>>2];if(!h){break f}g:{c=I[a+18|0];h:{if(c){e=0;i=1;while(1){a=H[p+16>>2];b=J[h+(e<<2)>>1];if(a>>>0<=b>>>0){H[g+148>>2]=a;H[g+144>>2]=b;Ba(d,1,13715,g+144|0);i=0}e=e+1|0;if((c|0)!=(e|0)){continue}break}a=Ea(c,4);if(!a){break h}e=0;while(1){b=h+(e<<2)|0;f=I[b+2|0];i:{if(f>>>0>=2){H[g+68>>2]=f;H[g+64>>2]=e;Ba(d,1,12094,g- -64|0);i=0;break i}b=I[b+3|0];if(b>>>0>=c>>>0){H[g+128>>2]=b;Ba(d,1,12038,g+128|0);i=0;break i}k=(f|0)!=1;j=(b<<2)+a|0;if(!(k|!H[j>>2])){H[g+80>>2]=b;Ba(d,1,11527,g+80|0);i=0;break i}if(!(f|!b)){H[g+100>>2]=b;H[g+96>>2]=e;Ba(d,1,11901,g+96|0);i=0;break i}if(!(k|(b|0)==(e|0))){H[g+120>>2]=b;H[g+116>>2]=e;H[g+112>>2]=e;Ba(d,1,11937,g+112|0);i=0;break i}H[j>>2]=1}e=e+1|0;if((c|0)!=(e|0)){continue}break}i=!i;e=0;while(1){j:{b=e<<2;if(I[(b+h|0)+2|0]?H[b+a>>2]:1){e=e+1|0;if((c|0)!=(e|0)){continue}if(i&1){break j}if(H[p+16>>2]!=1){break g}e=0;while(1){if(H[(e<<2)+a>>2]){e=e+1|0;if((c|0)!=(e|0)){continue}break g}break}f=0;Ba(d,2,9253,0);e=0;if(c>>>0>=4){i=c&252;b=0;while(1){k=h+(e<<2)|0;F[k+3|0]=e;F[k+2|0]=1;k=e|1;j=h+(k<<2)|0;F[j+3|0]=k;F[j+2|0]=1;k=e|2;j=h+(k<<2)|0;F[j+3|0]=k;F[j+2|0]=1;k=e|3;j=h+(k<<2)|0;F[j+3|0]=k;F[j+2|0]=1;e=e+4|0;b=b+4|0;if((i|0)!=(b|0)){continue}break}}b=c&3;if(!b){break g}while(1){c=h+(e<<2)|0;F[c+3|0]=e;F[c+2|0]=1;e=e+1|0;f=f+1|0;if((b|0)!=(f|0)){continue}break}break g}H[g+48>>2]=e;i=1;Ba(d,1,11101,g+48|0);e=e+1|0;if((c|0)!=(e|0)){continue}}break}Ca(a);r=0;break a}a=Ea(c,4);if(a){break g}}r=0;Ba(d,1,12285,0);break a}Ca(a)}a=H[q+120>>2];k:{if(!a){break k}m=H[a+12>>2];if(!m){Ca(H[a+4>>2]);Ca(H[H[q+120>>2]+8>>2]);Ca(H[H[q+120>>2]>>2]);a=H[q+120>>2];b=H[a+12>>2];if(b){Ca(b);a=H[q+120>>2]}Ca(a);H[q+120>>2]=0;break k}k=H[p+24>>2];l:{c=I[a+18|0];m:{if(c){u=H[a>>2];i=H[a+4>>2];j=H[a+8>>2];e=0;n:{while(1){if(H[(k+N(J[m+(e<<2)>>1],52)|0)+44>>2]){e=e+1|0;if((c|0)!=(e|0)){continue}break n}break}H[g+32>>2]=e;Ba(d,1,13877,g+32|0);r=0;break a}f=Fa(N(c,52));if(!f){break m}h=0;while(1){a=m+(h<<2)|0;e=J[a>>1];b=N(I[a+2|0]?I[a+3|0]:h,52)+f|0;a=k+N(e,52)|0;e=H[a+4>>2];H[b>>2]=H[a>>2];H[b+4>>2]=e;H[b+48>>2]=H[a+48>>2];e=H[a+44>>2];H[b+40>>2]=H[a+40>>2];H[b+44>>2]=e;e=H[a+36>>2];H[b+32>>2]=H[a+32>>2];H[b+36>>2]=e;e=H[a+28>>2];H[b+24>>2]=H[a+24>>2];H[b+28>>2]=e;e=H[a+20>>2];H[b+16>>2]=H[a+16>>2];H[b+20>>2]=e;e=H[a+12>>2];H[b+8>>2]=H[a+8>>2];H[b+12>>2]=e;b=N(h,52)+f|0;a=Ia(N(H[a+8>>2],H[a+12>>2])<<2);H[b+44>>2]=a;if(!a){if(h){a=h&65535;while(1){Ca(H[(N(a,52)+f|0)-8>>2]);a=a-1|0;if(a){continue}break}}Ca(f);r=0;Ba(d,1,13825,0);break a}H[b+24>>2]=I[h+j|0];H[b+32>>2]=I[h+i|0];h=h+1|0;if((c|0)!=(h|0)){continue}break}i=J[H[q+120>>2]+16>>1]-1|0;while(1){a=N(l,52)+f|0;h=N(H[a+12>>2],H[a+8>>2]);b=m+(l<<2)|0;e=H[(k+N(J[b>>1],52)|0)+44>>2];o:{if(!I[b+2|0]){if(!h){break o}j=H[a+44>>2];a=0;b=0;if(h>>>0>=4){s=h&-4;o=0;while(1){n=b<<2;H[n+j>>2]=H[e+n>>2];t=n|4;H[t+j>>2]=H[e+t>>2];t=n|8;H[t+j>>2]=H[e+t>>2];n=n|12;H[n+j>>2]=H[e+n>>2];b=b+4|0;o=o+4|0;if((s|0)!=(o|0)){continue}break}}h=h&3;if(!h){break o}while(1){o=b<<2;H[o+j>>2]=H[e+o>>2];b=b+1|0;a=a+1|0;if((h|0)!=(a|0)){continue}break}break o}if(!h){break o}b=I[b+3|0];a=(b<<2)+u|0;j=H[(N(b,52)+f|0)+44>>2];b=0;if((h|0)!=1){t=h&-2;o=0;while(1){s=b<<2;n=H[s+e>>2];H[j+s>>2]=H[a+(N(c,(n|0)>=0?(i|0)>(n|0)?n:i:0)<<2)>>2];s=s|4;n=H[s+e>>2];H[j+s>>2]=H[a+(N(c,(n|0)>=0?(i|0)>(n|0)?n:i:0)<<2)>>2];b=b+2|0;o=o+2|0;if((t|0)!=(o|0)){continue}break}}if(!(h&1)){break o}h=b<<2;b=H[h+e>>2];H[h+j>>2]=H[a+(N(c,(b|0)>=0?(b|0)<(i|0)?b:i:0)<<2)>>2]}l=l+1|0;if((c|0)!=(l|0)){continue}break}break l}f=Fa(N(c,52));if(f){break l}}r=0;Ba(d,1,13825,0);break a}a=H[p+16>>2];if(a){e=0;while(1){b=H[(k+N(e,52)|0)+44>>2];if(b){Ca(b)}e=e+1|0;if((a|0)!=(e|0)){continue}break}}Ca(k);H[p+16>>2]=c;H[p+24>>2]=f}e=H[q+116>>2];if(!e){break a}i=H[e>>2];j=J[e+4>>1];if(j){e=0;n=j-2&65535;h=1;while(1){a=H[p+16>>2];o=N(e,6)+i|0;b=J[o>>1];p:{if(a>>>0<=b>>>0){H[g+20>>2]=a;H[g+16>>2]=b;Ba(d,2,7334,g+16|0);break p}c=J[o+4>>1];if((c+1&65535)>>>0<=1){G[(H[p+24>>2]+N(b,52)|0)+48>>1]=J[o+2>>1];break p}c=c-1|0;k=c&65535;if(k>>>0>=a>>>0){H[g+4>>2]=a;H[g>>2]=k;Ba(d,2,7293,g);break p}q:{if(J[o+2>>1]|(b|0)==(k|0)){break q}f=H[p+24>>2];a=f+N(b,52)|0;H[g+232>>2]=H[a+48>>2];l=H[a+44>>2];H[g+224>>2]=H[a+40>>2];H[g+228>>2]=l;l=H[a+36>>2];H[g+216>>2]=H[a+32>>2];H[g+220>>2]=l;l=H[a+28>>2];H[g+208>>2]=H[a+24>>2];H[g+212>>2]=l;l=H[a+20>>2];H[g+200>>2]=H[a+16>>2];H[g+204>>2]=l;l=H[a+12>>2];H[g+192>>2]=H[a+8>>2];H[g+196>>2]=l;l=H[a+4>>2];H[g+184>>2]=H[a>>2];H[g+188>>2]=l;l=N(k,52);f=l+f|0;H[a+48>>2]=H[f+48>>2];m=H[f+44>>2];H[a+40>>2]=H[f+40>>2];H[a+44>>2]=m;m=H[f+36>>2];H[a+32>>2]=H[f+32>>2];H[a+36>>2]=m;m=H[f+28>>2];H[a+24>>2]=H[f+24>>2];H[a+28>>2]=m;m=H[f+20>>2];H[a+16>>2]=H[f+16>>2];H[a+20>>2]=m;m=H[f+12>>2];H[a+8>>2]=H[f+8>>2];H[a+12>>2]=m;m=H[f+4>>2];H[a>>2]=H[f>>2];H[a+4>>2]=m;f=H[g+188>>2];a=l+H[p+24>>2]|0;H[a>>2]=H[g+184>>2];H[a+4>>2]=f;H[a+48>>2]=H[g+232>>2];f=H[g+228>>2];H[a+40>>2]=H[g+224>>2];H[a+44>>2]=f;f=H[g+220>>2];H[a+32>>2]=H[g+216>>2];H[a+36>>2]=f;f=H[g+212>>2];H[a+24>>2]=H[g+208>>2];H[a+28>>2]=f;f=H[g+204>>2];H[a+16>>2]=H[g+200>>2];H[a+20>>2]=f;f=H[g+196>>2];H[a+8>>2]=H[g+192>>2];H[a+12>>2]=f;if(j>>>0<=e+1>>>0){break q}f=h;if(!(e-j&1)){a=c;f=N(f,6)+i|0;l=J[f>>1];r:{if((l|0)!=(b|0)){a=b;if((l|0)!=(k|0)){break r}}G[f>>1]=a}f=h+1|0}if((n|0)==(e&65535)){break q}while(1){a=c;l=N(f,6)+i|0;m=J[l>>1];s:{if((m|0)!=(b|0)){a=b;if((k|0)!=(m|0)){break s}}G[l>>1]=a}a=c;m=J[l+6>>1];t:{if((m|0)!=(b|0)){a=b;if((k|0)!=(m|0)){break t}}G[l+6>>1]=a}f=f+2|0;if((j|0)!=(f&65535)){continue}break}}G[(H[p+24>>2]+N(b,52)|0)+48>>1]=J[o+2>>1]}h=h+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break}e=H[q+116>>2];i=H[e>>2]}if(i){Ca(i);e=H[q+116>>2]}Ca(e);H[q+116>>2]=0;break a}r=0;Ba(d,1,9499,0)}na=g+240|0;return r|0}function Uc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=O(0);l=na-48|0;na=l;H[a+8>>2]=1;a:{b:{d=l+40|0;c:{if((Ja(b,d,2,c)|0)!=2){break c}Da(d,l+44|0,2);if(H[l+44>>2]!=65359){break c}H[a+8>>2]=2;d=H[b+56>>2];e=d-2|0;d=H[b+60>>2]-(d>>>0<2)|0;g=H[a+224>>2];H[g>>2]=e;H[g+4>>2]=d;H[l+16>>2]=e;H[l+20>>2]=d;Ba(c,4,12769,l+16|0);f=H[a+224>>2];j=H[f>>2];e=H[f+24>>2];d=e+1|0;g=H[f+32>>2];if(d>>>0<=g>>>0){g=H[f+28>>2];break b}o=O(O(g>>>0)+O(100));if(o=O(0)){d=~~o>>>0}else{d=0}H[f+32>>2]=d;g=Ha(H[f+28>>2],N(d,24));if(g){H[f+28>>2]=g;e=H[f+24>>2];d=e+1|0;break b}Ca(H[f+28>>2]);H[f+32>>2]=0;H[f+24>>2]=0;H[f+28>>2]=0;Ba(c,1,3899,0)}Ba(c,1,15656,0);a=0;break a}e=N(e,24)+g|0;H[e+16>>2]=2;H[e+8>>2]=j;H[e+12>>2]=j>>31;G[e>>1]=65359;H[f+24>>2]=d;if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}Da(H[a+16>>2],l+40|0,2);d:{e:{g=H[l+40>>2];if((g|0)!=65424){while(1){e=24912;if(g>>>0<=65279){H[l>>2]=g;Ba(c,1,2268,l);a=0;break a}while(1){d=e;f=H[d>>2];if(f){e=d+12|0;if((f|0)!=(g|0)){continue}}break}f:{g:{if(f){break g}h=2;Ba(c,2,3847,0);e=2472;h:{i:{if((Ja(b,H[a+16>>2],2,c)|0)!=2){break i}while(1){Da(H[a+16>>2],l+44|0,2);f=24912;g=H[l+44>>2];if(g>>>0>=65280){while(1){d=f;i=H[d>>2];if(i){f=d+12|0;if((g|0)!=(i|0)){continue}}break}if(!(H[d+4>>2]&H[a+8>>2])){e=5397;break i}if(i){if((i|0)==65424){H[l+40>>2]=65424;break f}j=H[b+56>>2];f=H[a+224>>2];g=H[f+24>>2];e=g+1|0;d=H[f+32>>2];if(e>>>0<=d>>>0){d=H[f+28>>2];break h}o=O(O(d>>>0)+O(100));if(o=O(0)){d=~~o>>>0}else{d=0}H[f+32>>2]=d;d=Ha(H[f+28>>2],N(d,24));if(d){H[f+28>>2]=d;g=H[f+24>>2];e=g+1|0;break h}Ca(H[f+28>>2]);H[f+32>>2]=0;H[f+24>>2]=0;H[f+28>>2]=0;e=3899;break i}h=h+2|0}if((Ja(b,H[a+16>>2],2,c)|0)==2){continue}break}}Ba(c,1,e,0);Ba(c,1,9847,0);a=0;break a}d=N(g,24)+d|0;H[d+16>>2]=h;g=j-h|0;H[d+8>>2]=g;H[d+12>>2]=g>>31;G[d>>1]=0;H[f+24>>2]=e;H[l+40>>2]=i;g=24912;if((i|0)==65424){break f}while(1){d=g;f=H[d>>2];if(!f){break g}g=d+12|0;if((f|0)!=(i|0)){continue}break}}if(!(H[d+4>>2]&H[a+8>>2])){Ba(c,1,5397,0);a=0;break a}if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}Da(H[a+16>>2],l+36|0,2);e=H[l+36>>2];if(e>>>0<=1){Ba(c,1,6074,0);a=0;break a}e=e-2|0;H[l+36>>2]=e;g=H[a+16>>2];if(K[a+20>>2]>>0){g=Ha(g,e);if(!g){Ca(H[a+16>>2]);H[a+16>>2]=0;H[a+20>>2]=0;Ba(c,1,4973,0);a=0;break a}H[a+16>>2]=g;e=H[l+36>>2];H[a+20>>2]=e}e=Ja(b,g,e,c);if((e|0)!=H[l+36>>2]){Ba(c,1,2472,0);a=0;break a}if(!(ra[H[d+8>>2]](a,H[a+16>>2],e,c)|0)){Ba(c,1,2490,0);a=0;break a}j=H[b+56>>2];i=H[l+36>>2];d=H[a+224>>2];g=H[d+24>>2];h=g+1|0;e=H[d+32>>2];j:{if(h>>>0<=e>>>0){e=H[d+28>>2];break j}o=O(O(e>>>0)+O(100));if(o=O(0)){e=~~o>>>0}else{e=0}H[d+32>>2]=e;e=Ha(H[d+28>>2],N(e,24));if(!e){break d}H[d+28>>2]=e;g=H[d+24>>2];h=g+1|0}e=N(g,24)+e|0;H[e+16>>2]=i+4;g=(j-i|0)-4|0;H[e+8>>2]=g;H[e+12>>2]=g>>31;G[e>>1]=f;H[d+24>>2]=h;if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}m=(f|0)==65372?1:m;k=(f|0)==65362?1:k;n=(f|0)==65361?1:n;Da(H[a+16>>2],l+40|0,2);g=H[l+40>>2];if((g|0)!=65424){continue}}break}if(n){break e}}Ba(c,1,4785,0);a=0;break a}if(!k){Ba(c,1,4831,0);a=0;break a}if(!m){Ba(c,1,4877,0);a=0;break a}d=0;e=0;h=0;j=na-16|0;na=j;m=1;k:{if(!(F[a+212|0]&1)){break k}l:{f=H[a+136>>2];if(!f){break l}m:{while(1){g=H[a+140>>2]+(h<<3)|0;k=H[g>>2];if(k){i=H[g+4>>2];g=d-i|0;g=d>>>0>=g>>>0?g:0;if(d>>>0>>0){f=i-d|0;k=d+k|0;while(1){if(f>>>0<4){d=5671;break m}Da(k,j+12|0,4);d=H[j+12>>2];if((d^-1)>>>0>>0){d=5645;break m}i=f-4|0;n=i>>>0>>0;g=n?d-i|0:g;e=d+e|0;f=i-d|0;k=((n?0:d)+k|0)+4|0;if(d>>>0>>0){continue}break}f=H[a+136>>2]}d=g}h=h+1|0;if(h>>>0>>0){continue}break}if(!d){break l}m=0;Ba(c,1,3067,0);break k}m=0;Ba(c,1,d,0);break k}d=Fa(e);H[a+160>>2]=d;if(!d){m=0;Ba(c,1,4337,0);break k}H[a+148>>2]=e;h=H[a+140>>2];f=H[a+136>>2];if(f){e=0;d=0;g=0;while(1){k=g<<3;n=k+h|0;i=H[n>>2];if(i){h=H[a+160>>2]+d|0;f=H[n+4>>2];n:{if(f>>>0<=e>>>0){if(f){B(h,i,f)}d=d+f|0;e=e-f|0;break n}if(e){B(h,i,e)}d=d+e|0;h=f-e|0;e=e+i|0;while(1){if(h>>>0<=3){m=0;Ba(c,1,5671,0);break k}Da(e,j+8|0,4);e=e+4|0;i=H[a+160>>2]+d|0;f=h-4|0;h=H[j+8>>2];if(f>>>0>>0){if(f){B(i,e,f)}d=d+f|0;e=H[j+8>>2]-f|0;break n}if(h){B(i,e,h)}h=H[j+8>>2];d=h+d|0;e=e+h|0;h=f-h|0;if(h){continue}break}e=0}Ca(H[k+H[a+140>>2]>>2]);h=H[a+140>>2];f=k+h|0;H[f>>2]=0;H[f+4>>2]=0;f=H[a+136>>2]}g=g+1|0;if(g>>>0>>0){continue}break}e=H[a+148>>2];d=H[a+160>>2]}H[a+168>>2]=e;H[a+144>>2]=d;H[a+136>>2]=0;Ca(h);H[a+140>>2]=0}na=j+16|0;if(!m){Ba(c,1,8085,0);a=0;break a}Ba(c,4,11754,0);d=H[a+224>>2];e=H[b+56>>2];e=e-2|0;H[d+8>>2]=e;H[d+12>>2]=0;b=0;h=0;i=na-16|0;na=i;g=H[a+68>>2];o:{if(!g){H[a+76>>2]=1;break o}if(H[a+76>>2]){break o}d=H[a+72>>2];j=H[a+224>>2];e=H[j+40>>2];if((g|0)!=1){m=g&-2;while(1){k=(b<<3)+d|0;n=J[k>>1];f=e+N(n,40)|0;H[f>>2]=n;H[f+8>>2]=H[f+8>>2]+1;k=J[k+8>>1];f=e+N(k,40)|0;H[f>>2]=k;H[f+8>>2]=H[f+8>>2]+1;b=b+2|0;h=h+2|0;if((m|0)!=(h|0)){continue}break}}if(g&1){f=J[(b<<3)+d>>1];b=e+N(f,40)|0;H[b>>2]=f;H[b+8>>2]=H[b+8>>2]+1}f=H[j+36>>2];p:{if(f){b=0;while(1){if(!H[(e+N(b,40)|0)+8>>2]){H[i>>2]=b;Ba(c,1,9304,i);break p}b=b+1|0;if((f|0)!=(b|0)){continue}break}}f=H[j+8>>2];b=H[j+12>>2];e=0;while(1){q:{k=e<<3;m=H[H[a+224>>2]+40>>2]+N(J[k+d>>1],40)|0;h=H[m+16>>2];if(!h){h=Ea(H[m+8>>2],24);H[m+16>>2]=h;if(!h){break q}g=H[a+68>>2];d=H[a+72>>2]}n=h;h=H[m+4>>2];j=n+N(h,24)|0;H[j>>2]=f;H[j+4>>2]=b;k=H[(d+k|0)+4>>2];f=k+f|0;H[j+16>>2]=f;b=f>>>0>>0?b+1|0:b;H[j+20>>2]=b;H[m+4>>2]=h+1;e=e+1|0;if(g>>>0>e>>>0){continue}break o}break}Ba(c,1,6882,0)}H[a+76>>2]=1;if(!H[a+68>>2]){break o}d=H[H[a+224>>2]+40>>2];b=0;while(1){c=N(J[H[a+72>>2]+(b<<3)>>1],40);d=c+d|0;H[d+8>>2]=0;Ca(H[d+16>>2]);d=H[H[a+224>>2]+40>>2];H[(c+d|0)+16>>2]=0;b=b+1|0;if(b>>>0>2]){continue}break}}na=i+16|0;H[a+8>>2]=8;a=1;break a}Ca(H[d+28>>2]);H[d+32>>2]=0;H[d+24>>2]=0;H[d+28>>2]=0;Ba(c,1,3899,0);a=0}na=l+48|0;return a|0}function ie(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=na-160|0;na=g;a:{if(c>>>0<=35){b=0;Ba(d,1,6095,0);break a}c=c-36|0;f=(c>>>0)/3|0;if((N(f,3)|0)!=(c|0)){b=0;Ba(d,1,6095,0);break a}h=H[a+96>>2];c=g+156|0;Da(b,c,2);G[a+104>>1]=H[g+156>>2];Da(b+2|0,h+8|0,4);Da(b+6|0,h+12|0,4);Da(b+10|0,h,4);Da(b+14|0,h+4|0,4);Da(b+18|0,a+116|0,4);Da(b+22|0,a+120|0,4);Da(b+26|0,a+108|0,4);Da(b+30|0,a+112|0,4);Da(b+34|0,c,2);b:{c:{d:{e:{c=H[g+156>>2];if(c>>>0<=16384){H[h+16>>2]=c;if((c|0)!=(f|0)){H[g+132>>2]=f;H[g+128>>2]=c;Ba(d,1,14980,g+128|0);break b}c=H[h+4>>2];i=H[h+12>>2];k=H[h+8>>2];e=H[h>>2];if(!(c>>>0>>0&k>>>0>e>>>0)){H[g+120>>2]=i-c;H[g+124>>2]=0-(c>>>0>i>>>0);H[g+112>>2]=k-e;H[g+116>>2]=0-(e>>>0>k>>>0);Ba(d,1,14542,g+112|0);break b}j=H[a+116>>2];l=H[a+120>>2];if(!(l?j:0)){H[g+4>>2]=l;H[g>>2]=j;Ba(d,1,15094,g);break b}f:{o=H[a+108>>2];g:{if(o>>>0>e>>>0){break g}j=j+o|0;if(e>>>0>=(j>>>0>>0?-1:j)>>>0){break g}j=H[a+112>>2];if(j>>>0>c>>>0){break g}l=j+l|0;if(c>>>0<(j>>>0>l>>>0?-1:l)>>>0){break f}}b=0;Ba(d,1,2792,0);break a}h:{if(H[a+248>>2]){break h}j=H[a+240>>2];if(!j){break h}l=H[a+244>>2];if(!l){break h}e=k-e|0;c=i-c|0;if((e|0)==(j|0)&(c|0)==(l|0)){break h}H[g+108>>2]=c;H[g+104>>2]=e;H[g+100>>2]=l;H[g+96>>2]=j;Ba(d,1,14006,g+96|0);break b}c=Ea(f,52);H[h+24>>2]=c;if(!c){break e}i:{if(!H[h+16>>2]){break i}e=g+152|0;Da(b+36|0,e,1);f=H[g+152>>2];j=f>>>7|0;H[c+32>>2]=j;l=(f&127)+1|0;H[c+24>>2]=l;i=H[a+248>>2];Da(b+37|0,e,1);H[c>>2]=H[g+152>>2];Da(b+38|0,e,1);f=H[g+152>>2];H[c+4>>2]=f;e=0;k=H[c>>2];if(k-256>>>0<4294967041|f-256>>>0<4294967041){break c}f=H[c+24>>2];if(f>>>0>31){break d}H[c+36>>2]=0;H[c+40>>2]=H[a+184>>2];e=1;if(K[h+16>>2]<=1){break i}j=i?0:j;i=i?0:l;b=b+39|0;while(1){Da(b,g+152|0,1);k=H[g+152>>2];f=k>>>7|0;H[c+84>>2]=f;k=(k&127)+1|0;H[c+76>>2]=k;if(!(H[a+248>>2]|(I[a+212|0]&4|(i|0)==(k|0)&(f|0)==(j|0)))){H[g+84>>2]=f;H[g+80>>2]=k;H[g+76>>2]=e;H[g+72>>2]=j;H[g+68>>2]=i;H[g+64>>2]=e;Ba(d,2,14778,g- -64|0)}f=g+152|0;Da(b+1|0,f,1);H[c+52>>2]=H[g+152>>2];Da(b+2|0,f,1);f=H[g+152>>2];H[c+56>>2]=f;k=H[c+52>>2];if(!(f-256>>>0>4294967040&k-256>>>0>=4294967041)){break c}f=H[c+76>>2];if(f>>>0>=32){break d}b=b+3|0;H[c+88>>2]=0;H[c+92>>2]=H[a+184>>2];c=c+52|0;e=e+1|0;if(e>>>0>2]){continue}break}}b=0;f=H[a+116>>2];if(!f){break a}i=H[a+120>>2];if(!i){break a}k=0-!f|0;c=k;p=H[a+108>>2];l=H[h+8>>2]-p|0;j=f-1|0;e=l+j|0;c=l>>>0>e>>>0?c+1|0:c;e=xe(e,c,f,0);H[a+128>>2]=e;o=0-!i|0;c=o;q=H[a+112>>2];n=H[h+12>>2]-q|0;m=n;l=i-1|0;n=n+l|0;c=m>>>0>n>>>0?c+1|0:c;c=xe(n,c,i,0);H[a+132>>2]=c;j:{if(!(!e|!c)){if(e>>>0<=65535/(c>>>0)>>>0){break j}}H[g+20>>2]=c;H[g+16>>2]=e;Ba(d,1,14120,g+16|0);break a}n=N(c,e);k:{if(I[a+92|0]&2){H[a+28>>2]=(H[a+28>>2]-p>>>0)/(f>>>0);H[a+32>>2]=(H[a+32>>2]-q>>>0)/(i>>>0);c=k;e=H[a+36>>2]-p|0;m=e;e=e+j|0;c=m>>>0>e>>>0?c+1|0:c;v=a,w=xe(e,c,f,0),H[v+36>>2]=w;c=o;e=H[a+40>>2]-q|0;m=e;e=e+l|0;c=m>>>0>e>>>0?c+1|0:c;v=a,w=xe(e,c,i,0),H[v+40>>2]=w;break k}H[a+40>>2]=c;H[a+36>>2]=e;H[a+28>>2]=0;H[a+32>>2]=0}c=Ea(n,5644);H[a+180>>2]=c;if(!c){Ba(d,1,3935,0);break a}c=Ea(H[h+16>>2],1080);H[H[a+12>>2]+5584>>2]=c;if(!H[H[a+12>>2]+5584>>2]){Ba(d,1,3935,0);break a}c=Ea(10,20);H[H[a+12>>2]+5616>>2]=c;c=H[a+12>>2];if(!H[c+5616>>2]){Ba(d,1,3935,0);break a}H[c+5624>>2]=10;c=Ea(10,20);H[H[a+12>>2]+5628>>2]=c;c=H[a+12>>2];if(!H[c+5628>>2]){Ba(d,1,3935,0);break a}H[c+5636>>2]=10;f=H[h+16>>2];l:{if(!f){break l}i=H[h+24>>2];c=0;if((f|0)!=1){k=f&-2;e=0;while(1){j=i+N(c,52)|0;if(!H[j+32>>2]){H[(H[H[a+12>>2]+5584>>2]+N(c,1080)|0)+1076>>2]=1<>2]-1}j=c|1;l=i+N(j,52)|0;if(!H[l+32>>2]){H[(H[H[a+12>>2]+5584>>2]+N(j,1080)|0)+1076>>2]=1<>2]-1}c=c+2|0;e=e+2|0;if((k|0)!=(e|0)){continue}break}}if(!(f&1)){break l}e=i+N(c,52)|0;if(H[e+32>>2]){break l}H[(H[H[a+12>>2]+5584>>2]+N(c,1080)|0)+1076>>2]=1<>2]-1}if(n){c=H[a+180>>2];e=0;while(1){f=Ea(H[h+16>>2],1080);H[c+5584>>2]=f;if(!f){Ba(d,1,3935,0);break a}c=c+5644|0;e=e+1|0;if(n>>>0>e>>>0){continue}break}}c=N(H[a+132>>2],H[a+128>>2]);H[H[a+224>>2]+36>>2]=c;c=Ea(c,40);d=H[a+224>>2];H[d+40>>2]=c;e=0;m:{if(!c){break m}e=1;if(!H[d+36>>2]){break m}d=0;while(1){n:{e=0;i=N(d,40);c=i+c|0;H[c+20>>2]=0;H[c+28>>2]=100;f=Ea(100,24);k=H[a+224>>2];c=H[k+40>>2];H[(i+c|0)+24>>2]=f;if(!f){break n}e=1;d=d+1|0;if(d>>>0>2]){continue}}break}}if(!e){break a}H[a+8>>2]=4;r=H[h+16>>2];if(r){b=H[a+112>>2];d=H[a+120>>2];c=b+N(d,H[a+132>>2]-1|0)|0;d=c+d|0;c=c>>>0>d>>>0?-1:d;d=H[h+12>>2];c=c>>>0>>0?c:d;k=c-1|0;l=0-!c|0;c=H[a+108>>2];d=H[a+116>>2];a=c+N(d,H[a+128>>2]-1|0)|0;d=a+d|0;a=a>>>0>d>>>0?-1:d;d=H[h+8>>2];a=a>>>0>>0?a:d;j=a-1|0;o=0-!a|0;a=H[h+4>>2];b=a>>>0>>0?b:a;n=b-1|0;p=0-!b|0;a=H[h>>2];b=a>>>0>>0?c:a;q=b-1|0;u=0-!b|0;a=H[h+24>>2];b=0;while(1){c=p;e=H[a+4>>2];d=e+n|0;h=xe(d,d>>>0>>0?c+1|0:c,e,0);H[a+20>>2]=h;c=u;f=H[a>>2];d=f+q|0;s=xe(d,d>>>0>>0?c+1|0:c,f,0);H[a+16>>2]=s;d=H[a+40>>2];i=d&31;if((d&63)>>>0>=32){c=-1<>>32-i}i=m^-1;c=c^-1;m=c;c=l;t=e+k|0;c=t>>>0>>0?c+1|0:c;e=xe(t,c,e,0)-h|0;c=m;h=e;e=e+i|0;c=h>>>0>e>>>0?c+1|0:c;h=e;e=d&31;if((d&63)>>>0>=32){c=c>>>e|0}else{c=((1<>>e}H[a+12>>2]=c;c=o;e=f+j|0;c=e>>>0>>0?c+1|0:c;e=xe(e,c,f,0)-s|0;c=m;e=e+i|0;c=e>>>0>>0?c+1|0:c;f=e;e=d&31;if((d&63)>>>0>=32){c=c>>>e|0}else{c=((1<>>e}H[a+8>>2]=c;a=a+52|0;b=b+1|0;if((r|0)!=(b|0)){continue}break}}b=1;break a}H[g+144>>2]=c;Ba(d,1,7932,g+144|0);break b}b=0;H[h+16>>2]=0;Ba(d,1,3935,0);break a}H[g+52>>2]=f;H[g+48>>2]=e;Ba(d,1,15402,g+48|0);break b}H[g+40>>2]=f;H[g+36>>2]=k;H[g+32>>2]=e;Ba(d,1,14340,g+32|0)}b=0}na=g+160|0;return b|0}function uc(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;j=na+-64|0;na=j;H[j+60>>2]=b;z=j+41|0;A=j+39|0;t=j+40|0;a:{b:{c:{d:{e:while(1){h=0;f:while(1){k=b;if((o^2147483647)<(h|0)){break d}o=h+o|0;g:{h:{i:{j:{h=b;i=I[h|0];if(i){while(1){k:{b=i&255;l:{if(!b){b=h;break l}if((b|0)!=37){break k}i=h;while(1){if(I[i+1|0]!=37){b=i;break l}h=h+1|0;n=I[i+2|0];b=i+2|0;i=b;if((n|0)==37){continue}break}}h=h-k|0;y=o^2147483647;if((h|0)>(y|0)){break d}if(a){La(a,k,h)}if(h){continue f}H[j+60>>2]=b;h=b+1|0;q=-1;i=F[b+1|0]-48|0;if(!(I[b+2|0]!=36|i>>>0>9)){x=1;q=i;h=b+3|0}H[j+60>>2]=h;l=0;i=F[h|0];b=i-32|0;m:{if(b>>>0>31){n=h;break m}n=h;b=1<>2]=n;l=b|l;i=F[h+1|0];b=i-32|0;if(b>>>0>=32){break m}h=n;b=1<>>0>9)){p:{if(!a){H[(b<<2)+e>>2]=10;b=0;break p}b=H[(b<<3)+d>>2]}p=b;b=n+3|0;i=1;break o}if(x){break j}b=n+1|0;if(!a){H[j+60>>2]=b;x=0;p=0;break n}h=H[c>>2];H[c>>2]=h+4;p=H[h>>2];i=0}x=i;H[j+60>>2]=b;if((p|0)>=0){break n}p=0-p|0;l=l|8192;break n}p=tc(j+60|0);if((p|0)<0){break d}b=H[j+60>>2]}h=0;m=-1;u=0;q:{if(I[b|0]!=46){break q}if(I[b+1|0]==42){i=F[b+2|0]-48|0;r:{if(!(I[b+3|0]!=36|i>>>0>9)){b=b+4|0;s:{if(!a){H[(i<<2)+e>>2]=10;m=0;break s}m=H[(i<<3)+d>>2]}break r}if(x){break j}b=b+2|0;m=0;if(!a){break r}i=H[c>>2];H[c>>2]=i+4;m=H[i>>2]}H[j+60>>2]=b;u=(m|0)>=0;break q}H[j+60>>2]=b+1;m=tc(j+60|0);b=H[j+60>>2];u=1}while(1){v=h;n=28;r=b;i=F[b|0];if(i-123>>>0<4294967238){break c}b=b+1|0;h=I[(i+N(h,58)|0)+25263|0];if((h-1&255)>>>0<8){continue}break}H[j+60>>2]=b;t:{if((h|0)!=27){if(!h){break c}if((q|0)>=0){if(!a){H[(q<<2)+e>>2]=h;continue e}h=(q<<3)+d|0;i=H[h+4>>2];H[j+48>>2]=H[h>>2];H[j+52>>2]=i;break t}if(!a){break g}sc(j+48|0,h,c,g);break t}if((q|0)>=0){break c}h=0;if(!a){continue f}}if(I[a|0]&32){break b}i=l&-65537;l=l&8192?i:l;q=0;w=1072;n=t;u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{r=I[r|0];h=r<<24>>24;h=v?(r&15)==3?h&-45:h:h;switch(h-88|0){case 0:case 32:break G;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 10:case 16:case 18:case 19:case 20:case 21:case 25:case 26:case 28:case 30:case 31:break h;case 9:case 13:case 14:case 15:break u;case 11:break B;case 12:case 17:break E;case 22:break I;case 23:break F;case 24:break H;case 27:break A;case 29:break J;default:break K}}L:{switch(h-65|0){case 1:case 3:break h;case 0:case 4:case 5:case 6:break u;case 2:break z;default:break L}}if((h|0)==83){break y}break h}i=H[j+48>>2];r=H[j+52>>2];w=1072;break D}h=0;M:{switch(v|0){case 0:H[H[j+48>>2]>>2]=o;continue f;case 1:H[H[j+48>>2]>>2]=o;continue f;case 2:k=H[j+48>>2];H[k>>2]=o;H[k+4>>2]=o>>31;continue f;case 3:G[H[j+48>>2]>>1]=o;continue f;case 4:F[H[j+48>>2]]=o;continue f;case 6:H[H[j+48>>2]>>2]=o;continue f;case 7:break M;default:continue f}}k=H[j+48>>2];H[k>>2]=o;H[k+4>>2]=o>>31;continue f}m=m>>>0<=8?8:m;l=l|8;h=120}b=t;k=H[j+52>>2];r=k;i=H[j+48>>2];s=i;if(i|k){B=h&32;while(1){b=b-1|0;F[b|0]=B|I[(s&15)+25792|0];v=!k&s>>>0>15|(k|0)!=0;s=(k&15)<<28|s>>>4;k=k>>>4|0;if(v){continue}break}}k=b;if(!(l&8)|!(i|r)){break C}w=(h>>>4|0)+1072|0;q=2;break C}b=t;k=H[j+52>>2];r=k;i=H[j+48>>2];s=i;if(i|k){while(1){b=b-1|0;F[b|0]=s&7|48;v=!k&s>>>0>7|(k|0)!=0;s=(k&7)<<29|s>>>3;k=k>>>3|0;if(v){continue}break}}k=b;if(!(l&8)){break C}b=z-b|0;m=(b|0)<(m|0)?m:b;break C}i=H[j+48>>2];b=H[j+52>>2];r=b;if((b|0)<0){h=0-(b+((i|0)!=0)|0)|0;r=h;i=0-i|0;H[j+48>>2]=i;H[j+52>>2]=h;q=1;w=1072;break D}if(l&2048){q=1;w=1073;break D}q=l&1;w=q?1074:1072}k=ab(i,r,t)}if((m|0)<0&u){break d}l=u?l&-65537:l;if(!((i|r)!=0|m)){k=t;m=0;break h}b=!(i|r)+(t-k|0)|0;m=(b|0)<(m|0)?m:b;break h}h=I[j+48|0];break i}h=m>>>0>=2147483647?2147483647:m;l=h;n=(h|0)!=0;b=H[j+48>>2];k=b?b:1686;b=k;N:{O:{P:{Q:{if(!(b&3)|!h){break Q}while(1){if(!I[b|0]){break P}l=l-1|0;n=(l|0)!=0;b=b+1|0;if(!(b&3)){break Q}if(l){continue}break}}if(!n){break O}if(!(!I[b|0]|l>>>0<4)){while(1){n=H[b>>2];if(((16843008-n|n)&-2139062144)!=-2139062144){break P}b=b+4|0;l=l-4|0;if(l>>>0>3){continue}break}}if(!l){break O}}while(1){if(!I[b|0]){break N}b=b+1|0;l=l-1|0;if(l){continue}break}}b=0}b=b?b-k|0:h;n=b+k|0;if((m|0)>=0){l=i;m=b;break h}l=i;m=b;if(I[n|0]){break d}break h}h=H[j+48>>2];if(h|H[j+52>>2]){break x}h=0;break i}if(m){i=H[j+48>>2];break w}h=0;Na(a,32,p,0,l);break v}H[j+12>>2]=0;H[j+8>>2]=h;i=j+8|0;H[j+48>>2]=i;m=-1}h=0;while(1){R:{k=H[i>>2];if(!k){break R}k=qc(j+4|0,k);if((k|0)<0){break b}if(k>>>0>m-h>>>0){break R}i=i+4|0;h=h+k|0;if(m>>>0>h>>>0){continue}}break}n=61;if((h|0)<0){break c}Na(a,32,p,h,l);if(!h){h=0;break v}n=0;i=H[j+48>>2];while(1){k=H[i>>2];if(!k){break v}m=j+4|0;k=qc(m,k);n=k+n|0;if(n>>>0>h>>>0){break v}La(a,m,k);i=i+4|0;if(h>>>0>n>>>0){continue}break}}Na(a,32,p,h,l^8192);h=(h|0)<(p|0)?p:h;continue f}if((m|0)<0&u){break d}n=61;h=ra[f|0](a,M[j+48>>3],p,m,l,h)|0;if((h|0)>=0){continue f}break c}i=I[h+1|0];h=h+1|0;continue}}if(a){break a}if(!x){break g}h=1;while(1){a=H[(h<<2)+e>>2];if(a){sc((h<<3)+d|0,a,c,g);o=1;h=h+1|0;if((h|0)!=10){continue}break a}break}if(h>>>0>=10){o=1;break a}while(1){if(H[(h<<2)+e>>2]){break j}o=1;h=h+1|0;if((h|0)!=10){continue}break}break a}n=28;break c}F[j+39|0]=h;m=1;k=A;l=i}i=n-k|0;m=(i|0)<(m|0)?m:i;if((m|0)>(q^2147483647)){break d}n=61;b=m+q|0;h=(b|0)<(p|0)?p:b;if(y>>>0>>0){break c}Na(a,32,h,b,l);La(a,w,q);Na(a,48,h,b,l^65536);Na(a,48,m,i,0);La(a,k,i);Na(a,32,h,b,l^8192);b=H[j+60>>2];continue}break}break}o=0;break a}n=61}H[6597]=n}o=-1}na=j- -64|0;return o}function jd(a,b,c,d,e,f){a=a|0;b=+b;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,t=0,u=0,v=0,w=0,y=0,z=0,A=0,B=0,C=0;n=na-560|0;na=n;H[n+44>>2]=0;x(+b);i=s(1)|0;s(0)|0;a:{if((i|0)<0){t=1;y=1082;b=-b;x(+b);i=s(1)|0;s(0)|0;break a}if(e&2048){t=1;y=1085;break a}t=e&1;y=t?1088:1083;A=!t}b:{if((i&2146435072)==2146435072){d=t+3|0;Na(a,32,c,d,e&-65537);La(a,y,t);f=f&32;La(a,b!=b?f?1207:1435:f?1312:1476,3);Na(a,32,c,d,e^8192);m=(c|0)>(d|0)?c:d;break b}v=n+16|0;c:{d:{e:{b=rc(b,n+44|0);b=b+b;if(b!=0){g=H[n+44>>2];H[n+44>>2]=g-1;r=f|32;if((r|0)!=97){break e}break c}r=f|32;if((r|0)==97){break c}k=H[n+44>>2];break d}k=g-29|0;H[n+44>>2]=k;b=b*268435456}l=(d|0)<0?6:d;p=(n+48|0)+((k|0)>=0?288:0)|0;h=p;while(1){d=b<4294967295&b>=0?~~b>>>0:0;H[h>>2]=d;h=h+4|0;b=(b-+(d>>>0))*1e9;if(b!=0){continue}break}f:{if((k|0)<=0){i=k;g=h;j=p;break f}j=p;i=k;while(1){z=i>>>0>=29?29:i;g=h-4|0;g:{if(j>>>0>g>>>0){break g}d=0;i=0;while(1){w=H[g>>2];o=z&31;if((z&63)>>>0>=32){m=w<>>32-o;w=w<>>0>o>>>0?i+1|0:i;d=xe(o,m,1e9,0);i=qa;B=g,C=o+te(d,i,-1e9)|0,H[B>>2]=C;g=g-4|0;if(j>>>0<=g>>>0){continue}break}if(!m&o>>>0<1e9){break g}j=j-4|0;H[j>>2]=d}while(1){g=h;if(j>>>0>>0){h=g-4|0;if(!H[h>>2]){continue}}break}i=H[n+44>>2]-z|0;H[n+44>>2]=i;h=g;if((i|0)>0){continue}break}}if((i|0)<0){u=((l+25>>>0)/9|0)+1|0;m=(r|0)==102;while(1){d=0-i|0;d=d>>>0>=9?9:d;h:{if(g>>>0<=j>>>0){h=H[j>>2]?0:4;break h}o=1e9>>>d|0;z=-1<>2];H[h>>2]=w+(i>>>d|0);i=N(o,i&z);h=h+4|0;if(h>>>0>>0){continue}break}h=H[j>>2]?0:4;if(!i){break h}H[g>>2]=i;g=g+4|0}i=d+H[n+44>>2]|0;H[n+44>>2]=i;j=h+j|0;d=m?p:j;g=g-d>>2>(u|0)?d+(u<<2)|0:g;if((i|0)<0){continue}break}}i=0;i:{if(g>>>0<=j>>>0){break i}i=N(p-j>>2,9);h=10;d=H[j>>2];if(d>>>0<10){break i}while(1){i=i+1|0;h=N(h,10);if(d>>>0>=h>>>0){continue}break}}d=(l-((r|0)!=102?i:0)|0)-((r|0)==103&(l|0)!=0)|0;if((d|0)<(N(g-p>>2,9)-9|0)){h=(n+48|0)+((k|0)<0?-4092:-3804)|0;d=d+9216|0;k=(d|0)/9|0;m=h+(k<<2)|0;h=10;d=d+N(k,-9)|0;if((d|0)<=7){while(1){h=N(h,10);d=d+1|0;if((d|0)!=8){continue}break}}k=H[m>>2];u=(k>>>0)/(h>>>0)|0;d=N(u,h);o=m+4|0;j:{if((d|0)==(k|0)&(o|0)==(g|0)){break j}k=k-d|0;k:{if(!(u&1)){b=9007199254740992;if(!(F[m-4|0]&1)|((h|0)!=1e9|j>>>0>=m>>>0)){break k}}b=9007199254740994}q=(g|0)==(o|0)?1:1.5;o=h>>>1|0;q=k>>>0>>0?.5:(o|0)==(k|0)?q:1.5;if(!(I[y|0]!=45|A)){q=-q;b=-b}H[m>>2]=d;if(b+q==b){break j}d=d+h|0;H[m>>2]=d;if(d>>>0>=1e9){while(1){H[m>>2]=0;m=m-4|0;if(m>>>0>>0){j=j-4|0;H[j>>2]=0}d=H[m>>2]+1|0;H[m>>2]=d;if(d>>>0>999999999){continue}break}}i=N(p-j>>2,9);h=10;d=H[j>>2];if(d>>>0<10){break j}while(1){i=i+1|0;h=N(h,10);if(d>>>0>=h>>>0){continue}break}}d=m+4|0;g=d>>>0>>0?d:g}while(1){h=g;k=g>>>0<=j>>>0;if(!k){g=g-4|0;if(!H[g>>2]){continue}}break}l:{if((r|0)!=103){d=e&8;break l}d=l?l:1;g=(d|0)>(i|0)&(i|0)>-5;l=(g?i^-1:-1)+d|0;f=(g?-1:-2)+f|0;d=e&8;if(d){break l}g=-9;m:{if(k){break m}m=H[h-4>>2];if(!m){break m}d=10;g=0;if((m>>>0)%10|0){break m}while(1){k=g;g=g+1|0;d=N(d,10);if(!((m>>>0)%(d>>>0)|0)){continue}break}g=k^-1}k=N(h-p>>2,9);if((f&-33)==70){d=0;g=(g+k|0)-9|0;g=(g|0)>0?g:0;l=(g|0)>(l|0)?l:g;break l}d=0;g=((i+k|0)+g|0)-9|0;g=(g|0)>0?g:0;l=(g|0)>(l|0)?l:g}m=-1;r=d|l;if(((r?2147483645:2147483646)|0)<(l|0)){break b}k=(((r|0)!=0)+l|0)+1|0;o=f&-33;n:{if((o|0)==70){if((k^2147483647)<(i|0)){break b}g=(i|0)>0?i:0;break n}g=i>>31;g=ab((g^i)-g|0,0,v);if((v-g|0)<=1){while(1){g=g-1|0;F[g|0]=48;if((v-g|0)<2){continue}break}}u=g-2|0;F[u|0]=f;F[g-1|0]=(i|0)<0?45:43;g=v-u|0;if((g|0)>(k^2147483647)){break b}}f=g+k|0;if((f|0)>(t^2147483647)){break b}f=f+t|0;Na(a,32,c,f,e);La(a,y,t);Na(a,48,c,f,e^65536);o:{p:{q:{if((o|0)==70){d=n+16|9;i=j>>>0>p>>>0?p:j;j=i;while(1){g=ab(H[j>>2],0,d);r:{if((i|0)!=(j|0)){if(n+16>>>0>=g>>>0){break r}while(1){g=g-1|0;F[g|0]=48;if(n+16>>>0>>0){continue}break}break r}if((d|0)!=(g|0)){break r}g=g-1|0;F[g|0]=48}La(a,g,d-g|0);j=j+4|0;if(p>>>0>=j>>>0){continue}break}if(r){La(a,1684,1)}if((l|0)<=0|h>>>0<=j>>>0){break q}while(1){g=ab(H[j>>2],0,d);if(g>>>0>n+16>>>0){while(1){g=g-1|0;F[g|0]=48;if(n+16>>>0>>0){continue}break}}La(a,g,(l|0)>=9?9:l);g=l-9|0;j=j+4|0;if(h>>>0<=j>>>0){break p}i=(l|0)>9;l=g;if(i){continue}break}break p}s:{if((l|0)<0){break s}p=h>>>0>j>>>0?h:j+4|0;i=n+16|9;h=j;while(1){g=ab(H[h>>2],0,i);if((i|0)==(g|0)){g=g-1|0;F[g|0]=48}t:{if((h|0)!=(j|0)){if(n+16>>>0>=g>>>0){break t}while(1){g=g-1|0;F[g|0]=48;if(n+16>>>0>>0){continue}break}break t}La(a,g,1);g=g+1|0;if(!(d|l)){break t}La(a,1684,1)}k=g;g=i-g|0;La(a,k,(g|0)<(l|0)?g:l);l=l-g|0;h=h+4|0;if(p>>>0<=h>>>0){break s}if((l|0)>=0){continue}break}}Na(a,48,l+18|0,18,0);La(a,u,v-u|0);break o}g=l}Na(a,48,g+9|0,9,0)}Na(a,32,c,f,e^8192);m=(c|0)>(f|0)?c:f;break b}j=(f<<26>>31&9)+y|0;u:{if(d>>>0>11){break u}g=12-d|0;q=16;while(1){q=q*16;g=g-1|0;if(g){continue}break}if(I[j|0]==45){b=-(q+(-b-q));break u}b=b+q-q}h=H[n+44>>2];g=h>>31;g=ab((g^h)-g|0,0,v);if((v|0)==(g|0)){g=g-1|0;F[g|0]=48;h=H[n+44>>2]}i=t|2;p=f&32;l=g-2|0;F[l|0]=f+15;F[g-1|0]=(h|0)<0?45:43;g=!(e&8)&(d|0)<=0;h=n+16|0;while(1){f=h;k=P(b)<2147483647?~~b:-2147483648;F[h|0]=p|I[k+25792|0];b=(b-+(k|0))*16;h=h+1|0;if(!(g&b==0|(h-(n+16|0)|0)!=1)){F[f+1|0]=46;h=f+2|0}if(b!=0){continue}break}m=-1;g=v-l|0;p=g+i|0;if((2147483645-p|0)<(d|0)){break b}f=h;h=n+16|0;f=f-h|0;k=d?(f-2|0)<(d|0)?d+2|0:f:f;d=p+k|0;Na(a,32,c,d,e);La(a,j,i);Na(a,48,c,d,e^65536);La(a,h,f);Na(a,48,k-f|0,0,0);La(a,l,g);Na(a,32,c,d,e^8192);m=(c|0)>(d|0)?c:d}na=n+560|0;return m|0}function Qc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;i=na-80|0;na=i;H[i+76>>2]=1;a:{b:{if(H[a+128>>2]!=1|H[a+132>>2]!=1|(H[a+108>>2]|H[a+112>>2])){break b}j=H[a+100>>2];if(H[j>>2]|H[j+4>>2]|(H[j+8>>2]!=H[a+116>>2]|H[j+12>>2]!=H[a+120>>2])){break b}if(!db(a,i+72|0,0,i+68|0,i- -64|0,i+60|0,i+56|0,i+52|0,i+76|0,b,c)){break a}c:{d:{if(!H[i+76>>2]){break d}if(!jb(a,H[i+72>>2],0,0,b,c)){break d}b=H[a+100>>2];if(H[b+16>>2]){break c}d=1;break a}Ba(c,1,8776,0);break a}e=H[b+24>>2];while(1){b=N(g,52);Ca(H[(b+e|0)+44>>2]);c=H[a+100>>2];e=H[c+24>>2];j=b+e|0;m=H[a+232>>2];d=H[H[H[m+20>>2]>>2]+20>>2]+N(g,76)|0;H[j+44>>2]=H[d+36>>2];H[j+36>>2]=H[(b+H[H[m+24>>2]+24>>2]|0)+36>>2];H[d+36>>2]=0;d=1;g=g+1|0;if(g>>>0>2]){continue}break}break a}H[a+80>>2]=0;H[a+84>>2]=0;Ca(H[a+88>>2]);H[a+88>>2]=0;e:{if(!(H[a+28>>2]|H[a+32>>2]|H[a+36>>2]!=H[a+128>>2])){j=2;if(H[a+40>>2]==H[a+132>>2]){break e}}j=2;if(H[a+76>>2]){break e}if(!Bb(b)){break e}q=H[a+128>>2];j=N(q,H[a+132>>2]);if(j){k=j&1;h=H[H[a+224>>2]+40>>2];f:{if((j|0)==1){j=0;break f}n=j&-2;j=0;while(1){d=h+N(g,40)|0;f=H[d+4>>2];if(f){l=(H[d+16>>2]+N(f,24)|0)-8|0;f=H[l>>2];o=f;p=f>>>0>j>>>0;f=H[l+4>>2];l=p&(f|0)>=(m|0)|(f|0)>(m|0);j=l?o:j;m=l?f:m}f=H[d+44>>2];if(f){f=(H[d+56>>2]+N(f,24)|0)-8|0;d=H[f>>2];o=d;l=d>>>0>j>>>0;d=H[f+4>>2];f=l&(d|0)>=(m|0)|(d|0)>(m|0);j=f?o:j;m=f?d:m}g=g+2|0;e=e+2|0;if((n|0)!=(e|0)){continue}break}}g:{if(!k){break g}d=h+N(g,40)|0;h=H[d+4>>2];if(!h){break g}h=(H[d+16>>2]+N(h,24)|0)-8|0;d=H[h>>2];f=d;k=d>>>0>j>>>0;d=H[h+4>>2];h=k&(d|0)>=(m|0)|(d|0)>(m|0);j=h?f:j;m=h?d:m}j=j+2|0;m=j>>>0<2?m+1|0:m}else{j=2;m=0}g=0;k=H[a+32>>2];p=H[a+40>>2];h:{if(k>>>0>=p>>>0){break h}h=H[a+28>>2];f=H[a+36>>2];if(h>>>0>=f>>>0){break h}n=f-h&3;s=H[H[a+224>>2]+40>>2];t=h-f>>>0>4294967292;while(1){l=s+N(N(k,q),40)|0;d=h;e=0;if(n){while(1){g=H[(l+N(d,40)|0)+4>>2]+g|0;d=d+1|0;e=e+1|0;if((n|0)!=(e|0)){continue}break}}if(!t){while(1){e=l+N(d,40)|0;g=H[e+124>>2]+(H[e+84>>2]+(H[e+44>>2]+(H[e+4>>2]+g|0)|0)|0)|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}}k=k+1|0;if((p|0)!=(k|0)){continue}break}}f=Fa(g<<3);H[a+88>>2]=f;if(!g|!f){break e}g=0;d=H[a+40>>2];n=H[a+32>>2];i:{if(d>>>0<=n>>>0){break i}e=H[a+36>>2];if(e>>>0<=K[a+28>>2]){break i}while(1){f=H[a+28>>2];if(e>>>0>f>>>0){s=H[H[a+224>>2]+40>>2]+N(N(H[a+128>>2],n),40)|0;while(1){h=s+N(f,40)|0;d=H[h+4>>2];if(d){q=d&3;p=H[h+16>>2];h=0;j:{if(d>>>0<4){d=0;break j}t=d&-4;d=0;k=0;while(1){e=p+N(d,24)|0;r=H[e+4>>2];l=g<<3;o=l+H[a+88>>2]|0;H[o>>2]=H[e>>2];H[o+4>>2]=r;r=H[e+28>>2];o=l+H[a+88>>2]|0;H[o+8>>2]=H[e+24>>2];H[o+12>>2]=r;r=H[e+52>>2];o=l+H[a+88>>2]|0;H[o+16>>2]=H[e+48>>2];H[o+20>>2]=r;o=H[e+76>>2];l=l+H[a+88>>2]|0;H[l+24>>2]=H[e+72>>2];H[l+28>>2]=o;d=d+4|0;g=g+4|0;k=k+4|0;if((t|0)!=(k|0)){continue}break}}if(q){while(1){k=p+N(d,24)|0;l=H[k+4>>2];e=H[a+88>>2]+(g<<3)|0;H[e>>2]=H[k>>2];H[e+4>>2]=l;d=d+1|0;g=g+1|0;h=h+1|0;if((q|0)!=(h|0)){continue}break}}e=H[a+36>>2]}f=f+1|0;if(e>>>0>f>>>0){continue}break}d=H[a+40>>2]}n=n+1|0;if(n>>>0>>0){continue}break}f=H[a+88>>2]}H[a+84>>2]=g;e=na-208|0;na=e;H[e+8>>2]=1;H[e+12>>2]=0;h=g<<3;k:{if(!h){break k}H[e+16>>2]=8;H[e+20>>2]=8;d=2;while(1){g=(e+16|0)+(d<<2)|0;k=H[g-4>>2]+(H[g-8>>2]+8|0)|0;H[g>>2]=k;d=d+1|0;if(h>>>0>k>>>0){continue}break}d=h-8|0;l:{if((d|0)<=0){g=0;h=1;d=1;k=0;break l}g=d+f|0;h=1;d=1;while(1){m:{if((h&3)==3){Cb(f,d,e+16|0);vb(e+8|0,2);d=d+2|0;break m}n=e+16|0;k=d-1|0;n:{if(K[n+(k<<2)>>2]>=g-f>>>0){ub(f,h,H[e+12>>2],d,0,n);break n}Cb(f,d,e+16|0)}if((d|0)==1){tb(e+8|0,1);d=0;break m}tb(e+8|0,k);d=1}h=H[e+8>>2]|1;H[e+8>>2]=h;f=f+8|0;if(g>>>0>f>>>0){continue}break}g=H[e+12>>2];k=(g|0)!=0}ub(f,h,g,d,0,e+16|0);h=H[e+8>>2];if(!(k|((d|0)!=1|(h|0)!=1))){break k}while(1){o:{if((d|0)<=1){h=yc(h,g);vb(e+8|0,h);d=d+h|0;break o}g=e+8|0;tb(g,2);H[e+8>>2]=H[e+8>>2]^7;vb(g,1);n=f-8|0;k=e+16|0;h=d-2|0;ub(n-H[k+(h<<2)>>2]|0,H[e+8>>2],H[e+12>>2],d-1|0,1,k);tb(g,1);d=H[e+8>>2]|1;H[e+8>>2]=d;ub(n,d,H[e+12>>2],h,1,k);d=h}f=f-8|0;g=H[e+12>>2];h=H[e+8>>2];if(g|((d|0)!=1|(h|0)!=1)){continue}break}}na=e+208|0}d=H[a+128>>2];e=0;p:{while(1){q:{if(!(!H[H[a+180>>2]+5596>>2]|((d|0)!=1|H[a+132>>2]!=1))){H[i+72>>2]=0;H[a+228>>2]=0;H[a+8>>2]=H[a+8>>2]|128;d=0;break q}d=0;if(!db(a,i+72|0,0,i+68|0,i- -64|0,i+60|0,i+56|0,i+52|0,i+76|0,b,c)){break a}if(!H[i+76>>2]){break p}d=H[i+72>>2]}h=d+1|0;f=jb(a,d,0,0,b,c);g=N(H[a+128>>2],H[a+132>>2]);if(!f){H[i+4>>2]=g;H[i>>2]=h;Ba(c,1,7537,i);d=0;break a}H[i+36>>2]=g;H[i+32>>2]=h;Ba(c,4,11795,i+32|0);if(!Ic(H[a+232>>2],H[H[a+100>>2]+24>>2])){d=0;break a}r:{if(!(H[a+128>>2]!=1|H[a+132>>2]!=1)){g=H[a+100>>2];f=H[a+96>>2];if(H[g>>2]!=H[f>>2]|H[g+4>>2]!=H[f+4>>2]|(H[g+8>>2]!=H[f+8>>2]|H[g+12>>2]!=H[f+12>>2])){break r}}d=H[a+180>>2]+N(d,5644)|0;g=H[d+5596>>2];if(!g){break r}Ca(g);H[d+5596>>2]=0;H[d+5600>>2]=0}H[i+16>>2]=h;Ba(c,4,16601,i+16|0);if(!(Ra(b)|qa)&H[a+8>>2]==64){break p}e=e+1|0;d=H[a+128>>2];if((e|0)==(N(d,H[a+132>>2])|0)){break p}h=H[a+84>>2];if(!h|(h|0)!=H[a+80>>2]){continue}break}pc(b,j,m,c)}d=Hc(a,c)}na=i+80|0;return d|0}function Za(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=H[a+32>>2];a:{if(d){break a}b:{h=H[a+16>>2];if((h|0)>=6){b=H[a+8>>2];f=H[a+12>>2];d=h;break b}b=H[a+20>>2];c:{d:{if((b|0)>=5){c=H[a>>2];d=H[c>>2];H[a>>2]=c+4;g=b-4|0;break d}if((b|0)<=0){d=-1;break c}c=H[a>>2];e:{if((b|0)==1){e=-1;b=0;break e}e=-1;f=b-1|0;k=f&1;f:{if((b|0)==2){d=0;i=b;break f}j=f&-2;d=0;f=c;i=b;while(1){H[a>>2]=f+1;l=I[f|0];c=f+2|0;H[a>>2]=c;H[a+20>>2]=i-1;f=I[f+1|0];i=i-2|0;H[a+20>>2]=i;e=((255<>2]=f;c=I[c|0];H[a+20>>2]=i-1;e=(255<>2]=c+1;d=(255<>2]=g}b=H[a+24>>2];c=d>>>24|0;H[a+24>>2]=(c|0)==255;g=d>>>16&255;k=(g|0)==255;f=d&255;e=(f|0)==255;j=b+e|0;b=d>>>8&255;i=(b|0)==255;j=k+(j+i|0)|0;d=(h-j|0)+32|0;H[a+16>>2]=d;l=H[a+12>>2];b=c|(g|(b|f<<(e?7:8))<<(i?7:8))<<(k?7:8);f=(j-h|0)+32|0;c=f&31;if((f&63)>>>0>=32){i=b<>>32-c;g=b<>2];c=i|l;f=c;H[a+8>>2]=b;H[a+12>>2]=c;if((d|0)>=6){break b}d=0;break a}e=H[a+28>>2];i=H[(e<<2)+20752>>2];g:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break g}g=b;h=63-i|0;c=h&31;if((h&63)>>>0>=32){g=f>>>c|0}else{g=((1<>>c}c=(g&(-1<>2]=d;H[a+28>>2]=e;g=b;h=i&31;if((i&63)>>>0>=32){b=b<>>32-h|f<>2]=g;H[a+12>>2]=b;i=H[a+44>>2]|c>>31;j=H[a+40>>2]&-64|c;H[a+40>>2]=j;H[a+44>>2]=i;if((d|0)<6){d=1;break a}b=H[(e<<2)+20752>>2];h:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break h}k=g;h=63-b|0;c=h&31;if((h&63)>>>0>=32){k=f>>>c|0}else{k=((1<>>c}c=(k&(-1<>2]=d;H[a+28>>2]=e;k=g;h=b&31;if((b&63)>>>0>=32){b=g<>>32-h|f<>2]=k;H[a+12>>2]=b;b=c>>31<<7|c>>>25|i;h=b;j=j&-8065|c<<7;H[a+40>>2]=j;H[a+44>>2]=b;if((d|0)<6){d=2;break a}b=H[(e<<2)+20752>>2];i:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break i}g=k;i=63-b|0;c=i&31;if((i&63)>>>0>=32){g=f>>>c|0}else{g=((1<>>c}c=(g&(-1<>2]=d;H[a+28>>2]=e;l=k;g=b&31;if((b&63)>>>0>=32){i=k<>>32-g|f<>2]=g;f=i;H[a+12>>2]=f;b=c>>31<<14|c>>>18|h;i=b;k=j&-1032193|c<<14;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=3;break a}b=H[(e<<2)+20752>>2];j:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break j}j=g;h=63-b|0;c=h&31;if((h&63)>>>0>=32){j=f>>>c|0}else{j=((1<>>c}c=(j&(-1<>2]=d;H[a+28>>2]=e;j=g;h=b&31;if((b&63)>>>0>=32){b=g<>>32-h|f<>2]=g;H[a+12>>2]=b;b=c>>31<<21|c>>>11|i;j=b;k=k&-132120577|c<<21;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=4;break a}b=H[(e<<2)+20752>>2];k:{if((f|0)<0){c=(-1<=11?11:e)+1|0;d=d-1|0;break k}h=g;i=63-b|0;c=i&31;if((i&63)>>>0>=32){i=f>>>c|0}else{i=((1<>>c}c=(i&(-1<>2]=d;H[a+28>>2]=h;i=g;e=b&31;if((b&63)>>>0>=32){b=g<>>32-e|f<>2]=g;f=b;H[a+12>>2]=b;b=j&-4|(c>>31<<28|c>>>4);j=b;k=k&268435455|c<<28;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=5;break a}b=H[(h<<2)+20752>>2];l:{if((f|0)<0){e=(-1<=11?11:h)+1|0;i=d-1|0;break l}i=g;e=63-b|0;c=e&31;if((e&63)>>>0>=32){i=f>>>c|0}else{i=((1<>>c}e=(i&(-1<>2]=i;H[a+28>>2]=h;d=g;c=b&31;if((b&63)>>>0>=32){b=d<>>32-c|f<>2]=g;H[a+12>>2]=b;b=j&-505|e<<3;l=b;H[a+40>>2]=k;H[a+44>>2]=b;d=6;if((i|0)<6){break a}b=H[(h<<2)+20752>>2];m:{if((c|0)<0){e=(-1<=11?11:h)+1|0;d=i-1|0;break m}d=g;e=63-b|0;f=e&31;if((e&63)>>>0>=32){f=c>>>f|0}else{f=((1<>>f}e=(f&(-1<>2]=d;H[a+28>>2]=h;j=g;f=b&31;if((b&63)>>>0>=32){i=g<>>32-f|c<>2]=g;f=i;H[a+12>>2]=f;i=k;b=l&-64513|e<<10;k=b;H[a+40>>2]=i;H[a+44>>2]=b;if((d|0)<6){d=7;break a}b=H[(h<<2)+20752>>2];n:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:h)+1|0;break n}j=g;e=63-b|0;c=e&31;if((e&63)>>>0>=32){j=f>>>c|0}else{j=((1<>>c}c=(j&(-1<>2]=d;H[a+28>>2]=e;d=g;e=b&31;if((b&63)>>>0>=32){b=d<>>32-e|f<>2]=g;H[a+12>>2]=b;H[a+40>>2]=i;H[a+44>>2]=k&-8257537|c<<17;d=8}H[a+32>>2]=d-1;f=H[a+44>>2];b=f>>>7|0;c=H[a+40>>2];H[a+40>>2]=(f&127)<<25|c>>>7;H[a+44>>2]=b;return c&127}function Wb(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;p=na-32|0;na=p;H[p+24>>2]=f;r=H[(N(H[d+28>>2],76)+b|0)+28>>2]+N(H[d+32>>2],152)|0;a:{if(!(H[d+40>>2]|!H[r+24>>2])){k=r+28|0;while(1){b:{if(Sb(k)){break b}b=H[d+36>>2];if(b>>>0>=K[k+24>>2]/40>>>0){Ba(i,1,2836,0);break a}b=H[k+20>>2]+N(b,40)|0;hc(H[b+32>>2]);hc(H[b+36>>2]);o=N(H[b+20>>2],H[b+16>>2]);if(!o){break b}b=H[b+24>>2];if(o>>>0>=8){q=o&-8;j=0;while(1){H[b+516>>2]=0;H[b+520>>2]=0;H[b+448>>2]=0;H[b+452>>2]=0;H[b+380>>2]=0;H[b+384>>2]=0;H[b+312>>2]=0;H[b+316>>2]=0;H[b+244>>2]=0;H[b+248>>2]=0;H[b+176>>2]=0;H[b+180>>2]=0;H[b+108>>2]=0;H[b+112>>2]=0;H[b+40>>2]=0;H[b+44>>2]=0;b=b+544|0;j=j+8|0;if((q|0)!=(j|0)){continue}break}}j=0;o=o&7;if(!o){break b}while(1){H[b+40>>2]=0;H[b+44>>2]=0;b=b+68|0;j=j+1|0;if((o|0)!=(j|0)){continue}break}}k=k+36|0;n=n+1|0;if(n>>>0>2]){continue}break}}q=f;c:{if(!(I[c|0]&2)){break c}if(h>>>0<=5){Ba(i,2,4196,0);break c}if(!(I[f|0]==255&I[f+1|0]==145)){Ba(i,2,4238,0);break c}q=f+6|0;H[p+24>>2]=q}l=Fa(20);if(!l){break a}d:{if(F[a+108|0]&1){q=H[a+40>>2];o=a+44|0;h=a+40|0;break d}if(I[c+5640|0]&2){q=H[c+5168>>2];o=c+5180|0;h=c+5168|0;break d}H[p+28>>2]=(f+h|0)-q;o=p+28|0;h=p+24|0}a=H[o>>2];H[l+12>>2]=0;H[l+16>>2]=0;H[l+8>>2]=q;H[l>>2]=q;H[l+4>>2]=a+q;if(!Sa(l,1)){jc(l);a=kc(l);eb(l);a=a+q|0;b=H[h>>2];d=H[o>>2];if(I[c|0]&4){if(b+(d-a|0)>>>0<=1){Ba(i,1,4422,0);break a}if(!(I[a|0]==255&I[a+1|0]==146)){Ba(i,1,4401,0);break a}a=a+2|0}a=a-b|0;H[o>>2]=d-a;H[h>>2]=a+b;H[e>>2]=0;H[g>>2]=H[p+24>>2]-f;x=1;break a}if(H[r+24>>2]){t=r+28|0;while(1){a=H[d+36>>2];b=H[t+20>>2];e:{if(Sb(t)){break e}u=b+N(a,40)|0;z=N(H[u+20>>2],H[u+16>>2]);if(!z){break e}k=H[u+24>>2];v=0;while(1){f:{g:{if(!H[k+40>>2]){a=fc(l,H[u+32>>2],v,H[d+40>>2]+1|0);break g}a=Sa(l,1)}if(!a){H[k+36>>2]=0;break f}if(!H[k+40>>2]){b=0;while(1){a=b;b=b+1|0;if(!fc(l,H[u+36>>2],v,a)){continue}break}b=H[t+28>>2];H[k+32>>2]=3;H[k+24>>2]=b;H[k+28>>2]=(b-a|0)+1}a=1;h:{if(!Sa(l,1)){break h}a=2;if(!Sa(l,1)){break h}a=Sa(l,2);if((a|0)!=3){a=a+3|0;break h}a=Sa(l,5);if((a|0)!=31){a=a+6|0;break h}a=Sa(l,7)+37|0}H[k+36>>2]=a;b=0;while(1){a=b;b=b+1|0;if(Sa(l,1)){continue}break}H[k+32>>2]=a+H[k+32>>2];i:{a=H[k+40>>2];j:{k:{if(!a){a=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];if(!H[k+48>>2]){b=Ha(H[k>>2],240);if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=10}j=H[k>>2];lb(j);b=a&4?1:a&1?10:109;a=0;break k}b=H[k>>2];n=a-1|0;j=b+N(n,24)|0;if(H[j+4>>2]!=H[j+12>>2]){break j}n=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];j=H[k+48>>2];if(j>>>0>>0){j=j+10|0;b=Ha(b,N(j,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=j;b=H[k>>2]}j=N(a,24)+b|0;lb(j);b=1;l:{if(n&4){break l}b=109;if(!(n&1)){break l}b=H[j-12>>2];b=(b|0)==1?2:(b|0)==10?2:1}}n=a;H[j+12>>2]=b}a=H[k+36>>2];if(I[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16|0]&64){while(1){m=N(n,24);s=n?a:1;H[(m+H[k>>2]|0)+16>>2]=s;w=H[k+32>>2];j=0;b=a;if(s>>>0>=2){while(1){j=j+1|0;s=b>>>0>3;b=b>>>1|0;if(s){continue}break}}b=j+w|0;if(b>>>0>=33){H[p+16>>2]=b;Ba(i,1,15535,p+16|0);break i}j=Sa(l,b);b=H[k>>2];m=m+b|0;H[m+20>>2]=j;a=a-H[m+16>>2]|0;if((a|0)<=0){break f}j=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];m=H[k+48>>2];if(m>>>0>>0){m=m+10|0;b=Ha(b,N(m,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=m;b=H[k>>2]}n=n+1|0;b=b+N(n,24)|0;lb(b);if(j&4){H[b+12>>2]=1;continue}if(j&1){j=b;b=H[b-12>>2];H[j+12>>2]=(b|0)==1?2:(b|0)==10?2:1}else{H[b+12>>2]=109}continue}}while(1){m=N(n,24);j=m+H[k>>2]|0;b=H[j+12>>2]-H[j+4>>2]|0;b=(a|0)>(b|0)?b:a;H[j+16>>2]=b;s=H[k+32>>2];j=0;if(b>>>0>=2){while(1){j=j+1|0;w=b>>>0>3;b=b>>>1|0;if(w){continue}break}}b=j+s|0;if(b>>>0>=33){H[p>>2]=b;Ba(i,1,15535,p);break i}j=Sa(l,b);b=H[k>>2];m=m+b|0;H[m+20>>2]=j;a=a-H[m+16>>2]|0;if((a|0)<=0){break f}j=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];m=H[k+48>>2];if(m>>>0>>0){m=m+10|0;b=Ha(b,N(m,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=m;b=H[k>>2]}n=n+1|0;b=b+N(n,24)|0;lb(b);if(j&4){H[b+12>>2]=1;continue}if(j&1){j=b;b=H[b-12>>2];H[j+12>>2]=(b|0)==1?2:(b|0)==10?2:1}else{H[b+12>>2]=109}continue}}eb(l);break a}k=k+68|0;v=v+1|0;if((z|0)!=(v|0)){continue}break}}t=t+36|0;A=A+1|0;if(A>>>0>2]){continue}break}}if(!jc(l)){eb(l);break a}a=kc(l);eb(l);b=a+q|0;a=H[h>>2];if(I[c|0]&4){if(a+(H[o>>2]-b|0)>>>0<=1){Ba(i,1,4422,0);break a}if(!(I[b|0]==255&I[b+1|0]==146)){Ba(i,1,4401,0);break a}b=b+2|0}if((a|0)==(b|0)){break a}H[o>>2]=H[o>>2]+(a-b|0);H[h>>2]=b;x=1;H[e>>2]=1;H[g>>2]=H[p+24>>2]-f}na=p+32|0;return x}function Ib(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;a:{if(!c){break a}b:{e=H[a+184>>2];if(!e){break b}f=H[a+96>>2];if(!f|!H[f+16>>2]|(e|0)!=H[H[f+24>>2]+40>>2]){break b}n=H[c+16>>2];if(!n){break b}i=H[c+24>>2];if(H[i+40>>2]|H[i+44>>2]){break b}if(n>>>0>=8){p=n&-8;while(1){f=i+N(h,52)|0;H[f+404>>2]=e;H[f+352>>2]=e;H[f+300>>2]=e;H[f+248>>2]=e;H[f+196>>2]=e;H[f+144>>2]=e;H[f+92>>2]=e;H[f+40>>2]=e;h=h+8|0;g=g+8|0;if((g|0)!=(p|0)){continue}break}}f=n&7;if(f){while(1){H[(i+N(h,52)|0)+40>>2]=e;h=h+1|0;k=k+1|0;if((f|0)!=(k|0)){continue}break}}e=0;p=0;n=na-32|0;na=n;v=H[c+16>>2];c:{if(!v){e=1;break c}h=H[c>>2];f=h>>31;q=f;d:{if((f|0)<0){break d}i=H[c+4>>2];f=i>>31;m=f;if((f|0)<0){break d}g=H[c+8>>2];f=g>>31;s=f;if((f|0)<0){break d}k=H[c+12>>2];r=k>>31;if((r|0)<0){break d}f=H[c+24>>2];y=h-1|0;w=q-!h|0;z=i-1|0;x=m-!i|0;A=g-1|0;B=s-!g|0;C=k-1|0;D=r-!k|0;while(1){e=H[f>>2];h=e+y|0;i=e>>>0>h>>>0?w+1|0:w;k=xe(h,i,e,0);H[f+16>>2]=k;i=H[f+4>>2];h=i+z|0;g=i>>>0>h>>>0?x+1|0:x;r=xe(h,g,i,0);H[f+20>>2]=r;h=H[f+40>>2];g=h&31;if((h&63)>>>0>=32){q=1<>>32-g}s=m-1|0;g=q-!m|0;u=g;t=e>>31;l=t+B|0;o=l+1|0;g=l;l=e+A|0;g=we(l,l>>>0>>0?o:g,e,t);e=u+(g>>31)|0;o=e+1|0;l=e;e=g+s|0;t=g>>>0>e>>>0?o:l;g=h&31;l=(k>>31)+u|0;E=l+1|0;o=l;l=k+s|0;k=k>>>0>l>>>0?E:o;if((h&63)>>>0>=32){g=t>>g}else{g=((1<>>g}e=h&31;if((h&63)>>>0>=32){e=k>>e}else{e=((1<>>e}e=g-e|0;if((e|0)<0){H[n+4>>2]=e;H[n>>2]=p;Ba(d,1,13510,n);e=0;break c}H[f+8>>2]=e;e=i>>31;g=e+D|0;o=g+1|0;l=g;g=i+C|0;k=g>>>0>>0?o:l;i=we(g,k,i,e);e=(i>>31)+u|0;g=e+1|0;l=e;e=i+s|0;g=i>>>0>e>>>0?g:l;i=h&31;k=q+(r>>31)|0;o=k+1|0;l=k;k=m+r|0;q=k>>>0>>0?o:l;m=k-1|0;if((h&63)>>>0>=32){l=g>>i}else{l=((1<>>i}i=q-!k|0;e=h&31;if((h&63)>>>0>=32){m=i>>e}else{m=((1<>>e}e=l-m|0;if((e|0)<0){H[n+20>>2]=e;H[n+16>>2]=p;Ba(d,1,13579,n+16|0);e=0;break c}H[f+12>>2]=e;f=f+52|0;e=1;p=p+1|0;if((v|0)!=(p|0)){continue}break}break c}Ba(d,1,6720,0)}na=n+32|0;if(e){break b}return 0}e=H[a+100>>2];if(!e){e=Gb();H[a+100>>2]=e;if(!e){break a}}Fc(c,e);if(!Xa(H[a+216>>2],22,d)){break a}h=H[a+216>>2];f=H[h>>2];e=H[h+8>>2];e:{if(f){j=1;n=f&1;if((f|0)==1){f=0}else{i=f&-2;f=0;while(1){m=0;f:{if(!j){break f}m=0;if(!(ra[H[e>>2]](a,b,d)|0)){break f}m=(ra[H[e+4>>2]](a,b,d)|0)!=0}j=m;e=e+8|0;f=f+2|0;if((i|0)!=(f|0)){continue}break}f=!j}j=n?0:j;if(!(f|!n)){j=(ra[H[e>>2]](a,b,d)|0)!=0}Qa(h);if(j){break e}Va(H[a+96>>2]);H[a+96>>2]=0;return 0}Qa(h)}f=0;b=0;d=0;g:{h:{i:{e=H[a+60>>2];if(!e){if(H[c+16>>2]){break i}j=1;break g}h=Fa(N(e,52));if(!h){break h}e=0;if(H[c+16>>2]){b=H[c+24>>2];while(1){e=N(d,52);Ca(H[(e+b|0)+44>>2]);b=H[c+24>>2];H[(e+b|0)+44>>2]=0;d=d+1|0;e=H[c+16>>2];if(d>>>0>>0){continue}break}}if(H[a+60>>2]){d=H[H[a+100>>2]+24>>2];e=0;while(1){f=N(H[H[a+64>>2]+(e<<2)>>2],52);d=f+d|0;j=H[d+4>>2];b=h+N(e,52)|0;H[b>>2]=H[d>>2];H[b+4>>2]=j;H[b+48>>2]=H[d+48>>2];j=H[d+44>>2];H[b+40>>2]=H[d+40>>2];H[b+44>>2]=j;j=H[d+36>>2];H[b+32>>2]=H[d+32>>2];H[b+36>>2]=j;j=H[d+28>>2];H[b+24>>2]=H[d+24>>2];H[b+28>>2]=j;j=H[d+20>>2];H[b+16>>2]=H[d+16>>2];H[b+20>>2]=j;j=H[d+12>>2];H[b+8>>2]=H[d+8>>2];H[b+12>>2]=j;d=H[H[a+100>>2]+24>>2];f=f+d|0;H[b+36>>2]=H[f+36>>2];H[b+44>>2]=H[f+44>>2];H[f+44>>2]=0;e=e+1|0;f=H[a+60>>2];if(e>>>0>>0){continue}break}e=H[c+16>>2]}if(e){b=H[H[a+100>>2]+24>>2];d=0;while(1){e=N(d,52);Ca(H[(e+b|0)+44>>2]);b=H[H[a+100>>2]+24>>2];H[(e+b|0)+44>>2]=0;d=d+1|0;if(d>>>0>2]){continue}break}f=H[a+60>>2]}H[c+16>>2]=f;Ca(H[c+24>>2]);H[c+24>>2]=h;j=1;break g}e=H[c+24>>2];d=H[H[a+100>>2]+24>>2];while(1){f=N(b,52);e=f+e|0;H[e+36>>2]=H[(d+f|0)+36>>2];Ca(H[e+44>>2]);e=H[c+24>>2];m=f+e|0;d=H[H[a+100>>2]+24>>2];f=f+d|0;H[m+44>>2]=H[f+44>>2];H[f+44>>2]=0;b=b+1|0;if(b>>>0>2]){continue}break}j=1;break g}Va(H[a+96>>2]);H[a+96>>2]=0;j=0}}return j|0}function Ab(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=(c<<2)+b|0;e=H[a>>2];f=H[a+12>>2]<<5;i=e+f|0;l=e-f|0;e=H[a+16>>2];k=H[a+28>>2];h=H[a+20>>2];m=H[a+8>>2];a:{b:{if(i&15|(b&15|d>>>0<8)){if(e>>>0>=h>>>0){break a}c:{switch(d-1|0){case 1:f=e+1|0;if(h-e&1){j=i+(e<<6)|0;e=(e<<2)+b|0;L[j>>2]=L[e>>2];L[j+4>>2]=L[e+(c<<2)>>2];e=f}if((f|0)==(h|0)){break a}while(1){f=i+(e<<6)|0;j=(e<<2)+b|0;L[f>>2]=L[j>>2];g=f;f=c<<2;L[g+4>>2]=L[f+j>>2];j=e+1|0;g=i+(j<<6)|0;j=(j<<2)+b|0;L[g>>2]=L[j>>2];L[g+4>>2]=L[f+j>>2];e=e+2|0;if((h|0)!=(e|0)){continue}break};break a;case 0:break c;default:break b}}f=e;g=h-e&3;if(g){j=0;while(1){L[i+(f<<6)>>2]=L[(f<<2)+b>>2];f=f+1|0;j=j+1|0;if((g|0)!=(j|0)){continue}break}}if(e-h>>>0>4294967292){break a}while(1){L[i+(f<<6)>>2]=L[(f<<2)+b>>2];e=f+1|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];e=f+2|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];e=f+3|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];f=f+4|0;if((h|0)!=(f|0)){continue}break}break a}if(e>>>0>=h>>>0){break a}while(1){f=i+(e<<6)|0;L[f>>2]=L[(e<<2)+b>>2];g=c+e|0;L[f+4>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+8>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+12>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+16>>2]=L[(g<<2)+b>>2];g=c+g<<2;L[f+20>>2]=L[g+b>>2];g=g+j|0;L[f+24>>2]=L[g>>2];L[f+28>>2]=L[g+(c<<2)>>2];e=e+1|0;if((h|0)!=(e|0)){continue}break}break a}while(1){f=i+(e<<6)|0;L[f>>2]=L[(e<<2)+b>>2];g=c+e|0;L[f+4>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+8>>2]=L[(g<<2)+b>>2];d:{if((d|0)==3){break d}g=c+g|0;L[f+12>>2]=L[(g<<2)+b>>2];if((d|0)==4){break d}g=c+g|0;L[f+16>>2]=L[(g<<2)+b>>2];if((d|0)==5){break d}g=c+g|0;L[f+20>>2]=L[(g<<2)+b>>2];if((d|0)==6){break d}g=j+(g<<2)|0;L[f+24>>2]=L[g>>2];if((d|0)==7){break d}L[f+28>>2]=L[g+(c<<2)>>2]}e=e+1|0;if((h|0)!=(e|0)){continue}break}}b=(m<<2)+b|0;f=b+(c<<2)|0;e=H[a+24>>2];i=l+32|0;e:{if(i&15|(b&15|d>>>0<8)){if(e>>>0>=k>>>0){break e}f:{switch(d-1|0){case 1:a=e+1|0;if(k-e&1){d=i+(e<<6)|0;e=b+(e<<2)|0;L[d>>2]=L[e>>2];L[d+4>>2]=L[e+(c<<2)>>2];e=a}if((a|0)==(k|0)){break e}while(1){a=i+(e<<6)|0;d=b+(e<<2)|0;L[a>>2]=L[d>>2];f=a;a=c<<2;L[f+4>>2]=L[a+d>>2];d=e+1|0;f=i+(d<<6)|0;d=b+(d<<2)|0;L[f>>2]=L[d>>2];L[f+4>>2]=L[a+d>>2];e=e+2|0;if((k|0)!=(e|0)){continue}break};break e;case 0:c=e;a=k-e&3;if(a){f=0;while(1){L[i+(c<<6)>>2]=L[b+(c<<2)>>2];c=c+1|0;f=f+1|0;if((a|0)!=(f|0)){continue}break}}if(e-k>>>0>4294967292){break e}while(1){L[i+(c<<6)>>2]=L[b+(c<<2)>>2];a=c+1|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];a=c+2|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];a=c+3|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];c=c+4|0;if((k|0)!=(c|0)){continue}break};break e;default:break f}}while(1){a=i+(e<<6)|0;L[a>>2]=L[b+(e<<2)>>2];h=c+e|0;L[a+4>>2]=L[b+(h<<2)>>2];h=c+h|0;L[a+8>>2]=L[b+(h<<2)>>2];g:{if((d|0)==3){break g}h=c+h|0;L[a+12>>2]=L[b+(h<<2)>>2];if((d|0)==4){break g}h=c+h|0;L[a+16>>2]=L[b+(h<<2)>>2];if((d|0)==5){break g}h=c+h|0;L[a+20>>2]=L[b+(h<<2)>>2];if((d|0)==6){break g}h=f+(h<<2)|0;L[a+24>>2]=L[h>>2];if((d|0)==7){break g}L[a+28>>2]=L[h+(c<<2)>>2]}e=e+1|0;if((k|0)!=(e|0)){continue}break}break e}if(e>>>0>=k>>>0){break e}while(1){a=i+(e<<6)|0;L[a>>2]=L[b+(e<<2)>>2];d=c+e|0;L[a+4>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+8>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+12>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+16>>2]=L[b+(d<<2)>>2];d=c+d<<2;L[a+20>>2]=L[d+b>>2];d=d+f|0;L[a+24>>2]=L[d>>2];L[a+28>>2]=L[d+(c<<2)>>2];e=e+1|0;if((k|0)!=(e|0)){continue}break}}}function Kb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=na-176|0;na=d;a:{if(b&384){Oa(5943,11,c);break a}b:{if(!(b&1)){break b}e=H[a+96>>2];if(!e){break b}f=na-80|0;na=f;Oa(1792,13,c);F[f+79|0]=0;F[f+78|0]=9;g=H[e+4>>2];H[f+68>>2]=H[e>>2];H[f+72>>2]=g;j=f+78|0;H[f+64>>2]=j;Ga(c,7520,f- -64|0);g=H[e+12>>2];H[f+52>>2]=H[e+8>>2];H[f+56>>2]=g;H[f+48>>2]=j;Ga(c,7503,f+48|0);H[f+36>>2]=H[e+16>>2];H[f+32>>2]=j;Ga(c,7277,f+32|0);if(!(!H[e+24>>2]|!H[e+16>>2])){while(1){l=f+78|0;H[f+16>>2]=l;H[f+20>>2]=m;Ga(c,1824,f+16|0);j=H[e+24>>2];g=na-48|0;na=g;F[g+46|0]=9;F[g+47|0]=0;F[g+45|0]=9;n=N(m,52)+j|0;j=H[n+4>>2];H[g+36>>2]=H[n>>2];H[g+40>>2]=j;j=g+45|0;H[g+32>>2]=j;Ga(c,7209,g+32|0);H[g+20>>2]=H[n+24>>2];H[g+16>>2]=j;Ga(c,7455,g+16|0);H[g+4>>2]=H[n+32>>2];H[g>>2]=j;Ga(c,7428,g);na=g+48|0;H[f>>2]=l;Ga(c,1702,f);m=m+1|0;if(m>>>0>2]){continue}break}}Oa(1710,2,c);na=f+80|0}if(!(!(b&2)|!H[a+96>>2])){Oa(1931,36,c);e=H[a+112>>2];H[d+160>>2]=H[a+108>>2];H[d+164>>2]=e;Ga(c,2425,d+160|0);e=H[a+120>>2];H[d+144>>2]=H[a+116>>2];H[d+148>>2]=e;Ga(c,2391,d+144|0);e=H[a+132>>2];H[d+128>>2]=H[a+128>>2];H[d+132>>2]=e;Ga(c,2409,d+128|0);Jb(H[a+12>>2],H[H[a+96>>2]+16>>2],c);Oa(1710,2,c)}c:{if(!(b&8)|!H[a+96>>2]){break c}e=N(H[a+128>>2],H[a+132>>2]);if(!e){break c}h=H[a+180>>2];while(1){Jb(h,H[H[a+96>>2]+16>>2],c);h=h+5644|0;k=k+1|0;if((e|0)!=(k|0)){continue}break}}if(!(b&16)){break a}i=H[a+224>>2];Oa(1893,37,c);e=H[i>>2];b=H[i+4>>2];a=H[i+12>>2];H[d+120>>2]=H[i+8>>2];H[d+124>>2]=a;H[d+112>>2]=e;H[d+116>>2]=b;Ga(c,5730,d+112|0);Oa(1875,17,c);if(!(!H[i+28>>2]|!H[i+24>>2])){h=0;while(1){a=H[i+28>>2]+N(h,24)|0;g=J[a>>1];e=H[a+8>>2];b=H[a+12>>2];H[d+96>>2]=H[a+16>>2];H[d+88>>2]=e;H[d+92>>2]=b;H[d+80>>2]=g;Ga(c,7397,d+80|0);h=h+1|0;if(h>>>0>2]){continue}break}}Oa(1708,4,c);j=H[i+40>>2];d:{if(!j){break d}g=H[i+36>>2];if(!g){break d}k=0;h=0;while(1){a=j+N(h,40)|0;e=H[a+4>>2];e:{if(!e){break e}l=H[a+16>>2];if(!l){break e}b=H[l>>2];a=H[l+4>>2];if((a|0)<0){a=1}else{a=!b&(a|0)<=0}if(a|(H[l+8>>2]|H[l+12>>2])){break e}if(zc(1439)){break d}}k=e+k|0;h=h+1|0;if((g|0)!=(h|0)){continue}break}if(!k){break d}Oa(1858,16,c);if(H[i+36>>2]){k=H[i+40>>2];n=0;while(1){f=N(n,40);l=H[(f+k|0)+4>>2];H[d+68>>2]=l;H[d+64>>2]=n;Ga(c,7467,d- -64|0);k=H[i+40>>2];f:{if(!l){break f}h=0;if(!H[(f+k|0)+16>>2]){break f}while(1){m=H[(f+H[i+40>>2]|0)+16>>2]+N(h,24)|0;j=H[m>>2];g=H[m+4>>2];e=H[m+8>>2];b=H[m+12>>2];a=H[m+20>>2];H[d+56>>2]=H[m+16>>2];H[d+60>>2]=a;H[d+48>>2]=e;H[d+52>>2]=b;H[d+40>>2]=j;H[d+44>>2]=g;H[d+32>>2]=h;Ga(c,10938,d+32|0);h=h+1|0;if((l|0)!=(h|0)){continue}break}k=H[i+40>>2]}a=f+k|0;g:{if(!H[a+24>>2]){break g}h=0;if(!H[a+20>>2]){break g}while(1){a=H[(f+k|0)+24>>2]+N(h,24)|0;g=J[a>>1];e=H[a+8>>2];b=H[a+12>>2];H[d+16>>2]=H[a+16>>2];H[d+8>>2]=e;H[d+12>>2]=b;H[d>>2]=g;Ga(c,7397,d);h=h+1|0;k=H[i+40>>2];if(h>>>0>2]){continue}break}}n=n+1|0;if(n>>>0>2]){continue}break}}Oa(1708,4,c)}Oa(1710,2,c)}na=d+176|0}function qe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=na-128|0;na=e;H[e+120>>2]=0;a:{if((c|0)!=8){Ba(d,1,4047,0);Ba(d,1,4047,0);break a}Da(b,a+228|0,2);Da(b+2|0,e+124|0,4);Da(b+6|0,e+116|0,1);Da(b+7|0,e+120|0,1);c=H[a+228>>2];i=H[a+128>>2];if(c>>>0>=N(i,H[a+132>>2])>>>0){H[e+112>>2]=c;Ba(d,1,7843,e+112|0);break a}f=H[a+180>>2]+N(c,5644)|0;h=(c>>>0)/(i>>>0)|0;b=H[e+116>>2];b:{g=H[a+44>>2];if((g|0)>=0&(c|0)!=(g|0)){break b}g=H[f+5588>>2]+1|0;if((g|0)==(b|0)){break b}H[e+104>>2]=g;H[e+100>>2]=b;H[e+96>>2]=c;Ba(d,1,7867,e+96|0);f=0;break a}H[f+5588>>2]=b;c:{b=H[e+124>>2];if(b-1>>>0<=12){if((b|0)!=12){break c}H[e+64>>2]=12;Ba(d,2,11864,e- -64|0);b=H[e+124>>2]}if(!b){Ba(d,4,10695,0);H[a+56>>2]=1}d:{e:{f:{g:{b=H[f+5592>>2];if(b){g=H[e+116>>2];if(g>>>0>>0){break g}H[e+52>>2]=b;H[e+48>>2]=g;Ba(d,1,5150,e+48|0);H[a+56>>2]=1;f=0;break a}g=H[e+120>>2];if(g){break f}break d}g=H[e+120>>2];if(!g){break e}}b=(I[a+92|0]>>>4&1)+g|0;H[e+120>>2]=b;g=H[e+116>>2];j=H[f+5592>>2];if(g>>>0>j-1>>>0){H[e+20>>2]=j;H[e+16>>2]=g;Ba(d,1,5051,e+16|0);H[a+56>>2]=1;f=0;break a}if(b>>>0<=g>>>0){H[e+36>>2]=b;H[e+32>>2]=g;Ba(d,1,5250,e+32|0);H[a+56>>2]=1;f=0;break a}H[f+5592>>2]=b}if((H[e+116>>2]+1|0)!=(b|0)){break d}F[a+92|0]=I[a+92|0]|1}b=H[e+124>>2];H[a+8>>2]=16;H[a+24>>2]=H[a+56>>2]?0:b-12|0;f=H[a+44>>2];h:{if((f|0)==-1){f=4;b=c-N(h,i)|0;if(!(b>>>0>2]|b>>>0>=K[a+36>>2]|h>>>0>2])){f=h>>>0>=K[a+40>>2]?4:0}F[a+92|0]=I[a+92|0]&251|f;b=H[a+228>>2];break h}b=H[a+228>>2];F[a+92|0]=I[a+92|0]&251|((f|0)!=(b|0)?4:0)}c=H[H[a+224>>2]+40>>2]+N(b,40)|0;H[c>>2]=b;H[c+12>>2]=H[e+116>>2];f=H[e+120>>2];if(!H[a+76>>2]){if(K[c+4>>2]>=f>>>0){f=1;break a}H[e>>2]=b;Ba(d,2,1612,e);H[a+76>>2]=1;f=H[e+120>>2]}c=H[H[a+224>>2]+40>>2];b=H[a+228>>2];h=c+N(b,40)|0;if(f){H[h+4>>2]=f;b=H[e+120>>2];H[h+8>>2]=b;c=H[h+16>>2];if(!c){b=Ea(b,24);H[(H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0)+16>>2]=b;if(b){f=1;break a}f=0;Ba(d,1,6947,0);break a}b=Ha(c,N(b,24));c=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;if(!b){Ca(H[c+16>>2]);f=0;H[(H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0)+16>>2]=0;Ba(d,1,6947,0);break a}H[c+16>>2]=b;f=1;break a}i:{g=H[h+16>>2];if(g){break i}H[h+8>>2]=10;g=Ea(10,24);c=H[H[a+224>>2]+40>>2];b=H[a+228>>2];h=c+N(b,40)|0;H[h+16>>2]=g;if(g){break i}f=0;H[h+8>>2]=0;Ba(d,1,6947,0);break a}f=1;b=N(b,40)+c|0;c=H[e+116>>2];if(K[b+8>>2]>c>>>0){break a}h=b;b=c+1|0;H[h+8>>2]=b;b=Ha(g,N(b,24));c=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;if(!b){Ca(H[c+16>>2]);f=0;a=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;H[a+8>>2]=0;H[a+16>>2]=0;Ba(d,1,6947,0);break a}H[c+16>>2]=b;break a}H[e+80>>2]=b;Ba(d,1,12133,e+80|0);f=0}na=e+128|0;return f|0}function ob(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;g=H[a+8>>2];e=g+H[a+4>>2]|0;a:{if(!H[a+12>>2]){if((e|0)<2|(d|0)<=0){break a}q=e&2147483644;m=e&3;r=e&1;s=g+1|0;h=H[a>>2];o=h+(e<<2)|0;t=e-4>>>1|0;a=e-1|0;u=h+(a<<2)|0;v=N(c,g)<<2;l=e>>>0<4;w=N(a>>>1|0,c)<<2;while(1){g=H[b+v>>2];e=H[b>>2]-(g+1>>1)|0;i=0;a=0;if(!l){while(1){j=a+1|0;x=H[(N(j,c)<<2)+b>>2];f=H[(N(a+s|0,c)<<2)+b>>2];p=h+(i<<2)|0;H[p>>2]=e;k=e;e=x-((g+f|0)+2>>2)|0;H[p+4>>2]=(k+e>>1)+g;i=i+2|0;k=(a|0)!=(t|0);g=f;a=j;if(k){continue}break}}H[h+(i<<2)>>2]=e;if(r){a=H[b+w>>2]-(g+1>>1)|0;H[u>>2]=a;e=a+e>>1;a=-8}else{a=-4}H[a+o>>2]=e+g;e=0;a=0;g=0;if(!l){while(1){H[(N(a,c)<<2)+b>>2]=H[h+(a<<2)>>2];f=a|1;H[(N(f,c)<<2)+b>>2]=H[h+(f<<2)>>2];f=a|2;H[(N(f,c)<<2)+b>>2]=H[h+(f<<2)>>2];f=a|3;H[(N(f,c)<<2)+b>>2]=H[h+(f<<2)>>2];a=a+4|0;g=g+4|0;if((q|0)!=(g|0)){continue}break}}if(m){while(1){H[(N(a,c)<<2)+b>>2]=H[h+(a<<2)>>2];a=a+1|0;e=e+1|0;if((m|0)!=(e|0)){continue}break}}b=b+4|0;n=n+1|0;if((n|0)!=(d|0)){continue}break}break a}b:{switch(e-1|0){case 0:if((d|0)<=0){break a}if(d>>>0>=4){c=d&2147483644;a=0;while(1){H[b>>2]=H[b>>2]/2;H[b+4>>2]=H[b+4>>2]/2;H[b+8>>2]=H[b+8>>2]/2;H[b+12>>2]=H[b+12>>2]/2;b=b+16|0;a=a+4|0;if((c|0)!=(a|0)){continue}break}}c=d&3;if(!c){break a}a=0;while(1){H[b>>2]=H[b>>2]/2;b=b+4|0;a=a+1|0;if((c|0)!=(a|0)){continue}break};break a;case 1:if((d|0)<=0){break a}a=H[a>>2];e=0;g=N(c,g)<<2;while(1){f=b+g|0;j=H[b>>2]-(H[f>>2]+1>>1)|0;H[a+4>>2]=j;f=j+H[f>>2]|0;H[a>>2]=f;H[b>>2]=f;H[(c<<2)+b>>2]=H[a+4>>2];b=b+4|0;e=e+1|0;if((e|0)!=(d|0)){continue}break};break a;default:break b}}if((e|0)<3|(d|0)<=0){break a}q=e&2147483644;m=e&3;h=H[a>>2];r=(h+(e<<2)|0)-4|0;a=e-2|0;s=h+(a<<2)|0;o=e&1;f=!o;t=((e-f|0)-4>>>1|0)+1|0;u=N(c,g)<<2;v=a-f>>>0<2;w=N((e>>>1|0)-1|0,c)<<2;x=e-1>>>0<3;while(1){l=b+u|0;g=H[l+(c<<2)>>2];a=H[l>>2];e=H[b>>2]-((g+a|0)+2>>2)|0;H[h>>2]=e+a;i=1;a=1;if(!v){while(1){p=H[(N(a,c)<<2)+b>>2];j=a+1|0;f=H[l+(N(j,c)<<2)>>2];y=h+(i<<2)|0;H[y>>2]=e;k=e;e=p-((g+f|0)+2>>2)|0;H[y+4>>2]=(k+e>>1)+g;i=i+2|0;k=(a|0)!=(t|0);a=j;g=f;if(k){continue}break}}H[h+(i<<2)>>2]=e;c:{if(!o){a=H[b+w>>2]-(g+1>>1)|0;H[s>>2]=(e+a>>1)+g;break c}a=e+g|0}H[r>>2]=a;e=0;a=0;g=0;if(!x){while(1){H[(N(a,c)<<2)+b>>2]=H[h+(a<<2)>>2];f=a|1;H[(N(f,c)<<2)+b>>2]=H[h+(f<<2)>>2];f=a|2;H[(N(f,c)<<2)+b>>2]=H[h+(f<<2)>>2];f=a|3;H[(N(f,c)<<2)+b>>2]=H[h+(f<<2)>>2];a=a+4|0;g=g+4|0;if((q|0)!=(g|0)){continue}break}}if(m){while(1){H[(N(a,c)<<2)+b>>2]=H[h+(a<<2)>>2];a=a+1|0;e=e+1|0;if((m|0)!=(e|0)){continue}break}}b=b+4|0;n=n+1|0;if((n|0)!=(d|0)){continue}break}}}function Zb(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:{n=N(e,3);h=H[b>>2]>>>n|0;if(h&2097168){break a}h=h&495;if(!h){break a}o=a+28|0;l=o+(I[h+H[a+108>>2]|0]<<2)|0;H[a+104>>2]=l;k=H[l>>2];i=H[k>>2];h=H[a+4>>2]-i|0;H[a+4>>2]=h;j=H[a>>2];b:{if(j>>>16>>>0>>0){m=H[k+4>>2];H[a+4>>2]=i;h=h>>>0>>0;H[l>>2]=H[k+(h?8:12)>>2];k=h?m:!m;h=H[a+8>>2];while(1){c:{if(h){break c}h=H[a+16>>2];m=h+1|0;l=I[h+1|0];if(I[h|0]==255){if(l>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;h=8;break c}H[a+16>>2]=m;j=(l<<9)+j|0;h=7;break c}H[a+16>>2]=m;h=8;j=(l<<8)+j|0}h=h-1|0;H[a+8>>2]=h;j=j<<1;H[a>>2]=j;i=i<<1;H[a+4>>2]=i;if(i>>>0<32768){continue}break}h=i;break b}j=j-(i<<16)|0;H[a>>2]=j;if(!(h&32768)){m=H[k+4>>2];i=h>>>0>>0;H[l>>2]=H[k+(i?12:8)>>2];k=i?!m:m;i=H[a+8>>2];while(1){d:{if(i){break d}i=H[a+16>>2];m=i+1|0;l=I[i+1|0];if(I[i|0]==255){if(l>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;i=8;break d}H[a+16>>2]=m;j=(l<<9)+j|0;i=7;break d}H[a+16>>2]=m;i=8;j=(l<<8)+j|0}i=i-1|0;H[a+8>>2]=i;j=j<<1;H[a>>2]=j;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break b}k=H[k+4>>2]}e:{if(!k){break e}p=b-4|0;i=H[b>>2];k=H[b+4>>2]>>>n+17&4|(H[p>>2]>>>n+19&1|(i>>>n+16&64|i>>>n&170|i>>>(e?n+12|0:14)&16));m=o+(I[k+24384|0]<<2)|0;H[a+104>>2]=m;l=H[m>>2];i=H[l>>2];h=h-i|0;H[a+4>>2]=h;o=I[k+24640|0];f:{if(j>>>16>>>0>>0){k=H[l+4>>2];H[a+4>>2]=i;h=h>>>0>>0;H[m>>2]=H[l+(h?8:12)>>2];l=h?k:!k;h=H[a+8>>2];while(1){g:{if(h){break g}h=H[a+16>>2];m=h+1|0;k=I[h+1|0];if(I[h|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;h=8;break g}H[a+16>>2]=m;j=(k<<9)+j|0;h=7;break g}H[a+16>>2]=m;h=8;j=(k<<8)+j|0}h=h-1|0;H[a+8>>2]=h;j=j<<1;H[a>>2]=j;i=i<<1;H[a+4>>2]=i;if(i>>>0<32768){continue}break}break f}k=j-(i<<16)|0;H[a>>2]=k;if(!(h&32768)){j=H[l+4>>2];i=h>>>0>>0;H[m>>2]=H[l+(i?12:8)>>2];l=i?!j:j;j=H[a+8>>2];while(1){h:{if(j){break h}j=H[a+16>>2];m=j+1|0;i=I[j+1|0];if(I[j|0]==255){if(i>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;k=k+65280|0;j=8;break h}H[a+16>>2]=m;k=(i<<9)+k|0;j=7;break h}H[a+16>>2]=m;j=8;k=(i<<8)+k|0}j=j-1|0;H[a+8>>2]=j;k=k<<1;H[a>>2]=k;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break f}l=H[l+4>>2]}H[c>>2]=(l|0)==(o|0)?d:0-d|0;H[p>>2]=H[p>>2]|32<>2]=H[b>>2]|(c<<19|16)<>2]=H[b+4>>2]|8<>2]=H[a+4>>2]|32768;H[a>>2]=H[a>>2]|c<<31|65536;a=a-4|0;H[a>>2]=H[a>>2]|131072}if((e|0)!=3){break e}a=(f<<2)+b|0;H[a+4>>2]=H[a+4>>2]|1;H[a>>2]=H[a>>2]|c<<18|2;a=a-4|0;H[a>>2]=H[a>>2]|4}H[b>>2]=H[b>>2]|2097152<>2]>>>m|0;if(g&2097168){break a}n=a+28|0;k=n+(I[H[a+108>>2]+(g&495)|0]<<2)|0;H[a+104>>2]=k;j=H[k>>2];h=H[j>>2];g=H[a+4>>2]-h|0;H[a+4>>2]=g;i=H[a>>2];b:{if(i>>>16>>>0>>0){l=H[j+4>>2];H[a+4>>2]=h;g=g>>>0>>0;H[k>>2]=H[j+(g?8:12)>>2];j=g?l:!l;g=H[a+8>>2];while(1){c:{if(g){break c}g=H[a+16>>2];l=g+1|0;k=I[g+1|0];if(I[g|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;g=8;break c}H[a+16>>2]=l;i=(k<<9)+i|0;g=7;break c}H[a+16>>2]=l;g=8;i=(k<<8)+i|0}g=g-1|0;H[a+8>>2]=g;i=i<<1;H[a>>2]=i;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}g=h;break b}i=i-(h<<16)|0;H[a>>2]=i;if(!(g&32768)){l=H[j+4>>2];h=g>>>0>>0;H[k>>2]=H[j+(h?12:8)>>2];j=h?!l:l;h=H[a+8>>2];while(1){d:{if(h){break d}h=H[a+16>>2];l=h+1|0;k=I[h+1|0];if(I[h|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;h=8;break d}H[a+16>>2]=l;i=(k<<9)+i|0;h=7;break d}H[a+16>>2]=l;h=8;i=(k<<8)+i|0}h=h-1|0;H[a+8>>2]=h;i=i<<1;H[a>>2]=i;g=g<<1;H[a+4>>2]=g;if(g>>>0<32768){continue}break}break b}j=H[j+4>>2]}if(!j){break a}j=n;n=b-4|0;h=H[b>>2];o=H[b+4>>2]>>>m+17&4|(H[n>>2]>>>m+19&1|(h>>>m+16&64|h>>>m&170|h>>>(e?m+12|0:14)&16));l=j+(I[o+24384|0]<<2)|0;H[a+104>>2]=l;k=H[l>>2];h=H[k>>2];g=g-h|0;H[a+4>>2]=g;e:{if(i>>>16>>>0>>0){j=H[k+4>>2];H[a+4>>2]=h;g=g>>>0>>0;H[l>>2]=H[k+(g?8:12)>>2];k=g?j:!j;g=H[a+8>>2];while(1){f:{if(g){break f}g=H[a+16>>2];l=g+1|0;j=I[g+1|0];if(I[g|0]==255){if(j>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;g=8;break f}H[a+16>>2]=l;i=(j<<9)+i|0;g=7;break f}H[a+16>>2]=l;g=8;i=(j<<8)+i|0}g=g-1|0;H[a+8>>2]=g;i=i<<1;H[a>>2]=i;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break e}j=i-(h<<16)|0;H[a>>2]=j;if(!(g&32768)){i=H[k+4>>2];h=g>>>0>>0;H[l>>2]=H[k+(h?12:8)>>2];k=h?!i:i;i=H[a+8>>2];while(1){g:{if(i){break g}i=H[a+16>>2];l=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;i=8;break g}H[a+16>>2]=l;j=(h<<9)+j|0;i=7;break g}H[a+16>>2]=l;i=8;j=(h<<8)+j|0}i=i-1|0;H[a+8>>2]=i;j=j<<1;H[a>>2]=j;g=g<<1;H[a+4>>2]=g;if(g>>>0<32768){continue}break}break e}k=H[k+4>>2]}g=c;c=I[o+24640|0];H[g>>2]=(c|0)==(k|0)?d:0-d|0;H[n>>2]=H[n>>2]|32<>2]=H[b>>2]|(d<<19|16)<>2]=H[b+4>>2]|8<>2]<<2)+b|0;H[c+4>>2]=H[c+4>>2]|32768;H[c>>2]=H[c>>2]|d<<31|65536;c=c-4|0;H[c>>2]=H[c>>2]|131072}if((e|0)!=3){break a}a=(H[a+124>>2]<<2)+b|0;H[a+4>>2]=H[a+4>>2]|4;H[a+12>>2]=H[a+12>>2]|1;H[a+8>>2]=H[a+8>>2]|d<<18|2}}function Md(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=na-112|0;na=e;j=1024;a:{b:{h=Ea(1,1024);if(h){l=e+92|0;k=e+108|0;while(1){c:{d:{d=e+104|0;e:{if((Ja(b,d,8,c)|0)!=8){break e}Da(d,e+88|0,4);Da(k,l,4);f=8;f:{g:{h:{i:{switch(H[e+88>>2]){case 0:d=Ra(b);g=qa;if((g|0)<0){g=1}else{g=d>>>0<4294967288&(g|0)<=0}if(g){break h}Ba(c,1,8449,0);break e;case 1:break i;default:break f}}d=e+104|0;if((Ja(b,d,8,c)|0)!=8){break e}Da(d,e+100|0,4);if(!H[e+100>>2]){break g}Ba(c,1,8449,0);break e}H[e+88>>2]=d+8;break f}Da(k,e+88|0,4);f=16}d=H[e+92>>2];if((d|0)==1785737827){b=H[a+100>>2];if(b&4){H[a+100>>2]=b|8;break e}Ba(c,1,5702,0);Ca(h);a=0;break a}i=H[e+88>>2];if(!i){Ba(c,1,3268,0);Ca(h);a=0;break a}if(f>>>0>i>>>0){H[e+4>>2]=d;H[e>>2]=i;Ba(c,1,13933,e);break b}j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{if((d|0)<=1668246641){if((d|0)==1651532643){break r}if((d|0)==1667523942){break p}if((d|0)!=1668112752){break s}g=25296;break n}if((d|0)<=1783635999){if((d|0)==1668246642){break o}g=25264;if((d|0)==1768449138){break n}if((d|0)!=1718909296){break s}g=25240;break l}if((d|0)==1885564018){break q}if((d|0)==1783636e3){break m}g=25248;if((d|0)==1785737832){break l}}d=H[a+100>>2];if(d&1){break j}Ba(c,1,2062,0);Ca(h);a=0;break a}g=25280;break n}g=25288;break n}g=25304;break n}g=25272}H[e+76>>2]=d&255;H[e+64>>2]=d>>>24;H[e+72>>2]=d>>>8&255;H[e+68>>2]=d>>>16&255;Ba(c,2,2011,e- -64|0);f=i-f|0;if(I[a+100|0]&4){break k}d=H[e+92>>2];H[e+48>>2]=d>>>24;H[e+60>>2]=d&255;H[e+52>>2]=d>>>16&255;H[e+56>>2]=d>>>8&255;Ba(c,2,6771,e+48|0);H[a+100>>2]=H[a+100>>2]|2147483647;d=sb(b,f,c);if(!qa&(d|0)==(f|0)){continue}Ba(c,1,3748,0);Ca(h);a=0;break a}g=25232}f=i-f|0}d=f;f=Ra(b);i=qa;if((i|0)<0){f=1}else{f=(i|0)<=0&d>>>0>f>>>0}if(f){f=H[e+88>>2];a=H[e+92>>2];m=e,n=Ra(b),H[m+40>>2]=n;H[e+36>>2]=d;H[e+32>>2]=a&255;H[e+20>>2]=a>>>24;H[e+16>>2]=f;H[e+28>>2]=a>>>8&255;H[e+24>>2]=a>>>16&255;Ba(c,1,15680,e+16|0);break b}if(d>>>0<=j>>>0){f=h;break c}j=d;f=Ha(h,d);if(f){break c}Ca(h);Ba(c,1,2193,0);a=0;break a}if(!(d&2)){Ba(c,1,2132,0);Ca(h);a=0;break a}H[a+100>>2]=d|2147483647;d=i-f|0;f=sb(b,d,c);if(!qa&(d|0)==(f|0)){continue}if(!(I[a+100|0]&8)){break d}Ba(c,2,3748,0)}Ca(h);a=1;break a}Ba(c,1,3748,0);Ca(h);a=0;break a}if((Ja(b,f,d,c)|0)!=(d|0)){Ba(c,1,3798,0);Ca(f);a=0;break a}h=f;if(ra[H[g+4>>2]](a,f,d,c)|0){continue}break}Ca(f);a=0;break a}Ba(c,1,4923,0);a=0;break a}Ca(h);a=0}na=e+112|0;return a|0}function _d(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=na-16|0;na=f;if(H[a+8>>2]==16){i=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{i=H[a+12>>2]}a:{if(c>>>0<=1){Ba(d,1,4721,0);a=0;break a}Da(b,f+12|0,2);if(H[f+12>>2]){Ba(d,2,5897,0);a=1;break a}if(c>>>0<=6){Ba(d,1,4721,0);a=0;break a}Da(b+2|0,f+8|0,1);e=H[i+5628>>2];h=H[i+5632>>2];b:{c:{if(!h){break c}j=H[f+8>>2];a=e;while(1){if((j|0)!=H[a>>2]){a=a+20|0;g=g+1|0;if((h|0)!=(g|0)){continue}break c}break}j=0;if((g|0)!=(h|0)){break b}}if(H[i+5636>>2]==(h|0)){a=h+10|0;H[i+5636>>2]=a;a=Ha(e,N(a,20));if(!a){Ca(H[i+5628>>2]);H[i+5636>>2]=0;H[i+5628>>2]=0;H[i+5632>>2]=0;Ba(d,1,4747,0);a=0;break a}H[i+5628>>2]=a;e=H[i+5632>>2];j=N(H[i+5636>>2]-e|0,20);if(j){y(a+N(e,20)|0,0,j)}h=H[i+5632>>2];e=H[i+5628>>2]}a=e+N(h,20)|0;j=1}H[a>>2]=H[f+8>>2];Da(b+3|0,f+12|0,2);if(H[f+12>>2]){Ba(d,2,5897,0);a=1;break a}Da(b+5|0,f+4|0,2);e=H[f+4>>2];if(e>>>0>=2){Ba(d,2,3130,0);a=1;break a}h=c-7|0;if(e){c=b+7|0;while(1){if(h>>>0<=2){Ba(d,1,4721,0);a=0;break a}Da(c,f+12|0,1);if(H[f+12>>2]!=1){Ba(d,2,5579,0);a=1;break a}Da(c+1|0,f,2);e=H[f>>2];b=e&32767;H[a+4>>2]=b;h=h-3|0;e=(e>>>15|0)+1|0;k=N(e,b)+2|0;if(h>>>0>>0){Ba(d,1,4721,0);a=0;break a}c=c+3|0;g=0;if(b){while(1){Da(c,f+12|0,e);if(H[f+12>>2]!=(g|0)){Ba(d,2,6259,0);a=1;break a}c=c+e|0;g=g+1|0;if(g>>>0>2]){continue}break}}Da(c,f,2);e=H[f>>2];b=e&32767;H[f>>2]=b;if((b|0)!=H[a+4>>2]){Ba(d,2,3306,0);a=1;break a}e=(e>>>15|0)+1|0;l=N(e,b)+3|0;k=h-k|0;if(l>>>0>k>>>0){Ba(d,1,4721,0);a=0;break a}c=c+2|0;g=0;if(b){while(1){Da(c,f+12|0,e);if(H[f+12>>2]!=(g|0)){Ba(d,2,6259,0);a=1;break a}c=c+e|0;g=g+1|0;if(g>>>0>2]){continue}break}}Da(c,f+12|0,3);e=H[f+12>>2];H[a+8>>2]=0;H[a+12>>2]=0;F[a+16|0]=!(e&65536)|I[a+16|0]&254;h=e&255;H[f+8>>2]=h;d:{if(!h){break d}m=H[i+5620>>2];if(m){g=H[i+5616>>2];b=0;while(1){if((h|0)==H[g+8>>2]){H[a+8>>2]=g;break d}g=g+20|0;b=b+1|0;if((m|0)!=(b|0)){continue}break}}Ba(d,1,4721,0);a=0;break a}e=e>>>8&255;H[f+8>>2]=e;e:{if(!e){break e}h=H[i+5620>>2];if(h){g=H[i+5616>>2];b=0;while(1){if((e|0)==H[g+8>>2]){H[a+12>>2]=g;break e}g=g+20|0;b=b+1|0;if((h|0)!=(b|0)){continue}break}}Ba(d,1,4721,0);a=0;break a}h=k-l|0;c=c+3|0;n=n+1|0;if(n>>>0>2]){continue}break}}if(h){Ba(d,1,4721,0);a=0;break a}a=1;if(!j){break a}H[i+5632>>2]=H[i+5632>>2]+1;a=1}na=f+16|0;return a|0}function $c(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(K[a+44>>2]>=8){i=H[a+40>>2];l=8;while(1){k=H[a+12>>2]<<5;e=H[a>>2];g=H[a+36>>2];b=H[a+16>>2];h=H[a+20>>2];a:{if(b>>>0>=h>>>0){break a}j=e+k|0;d=b+1|0;if(h-b&1){c=j+(b<<6)|0;b=(N(b,g)<<2)+i|0;f=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=f;f=H[b+28>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=f;f=H[b+20>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=f;f=H[b+12>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=f;b=d}if((d|0)==(h|0)){break a}while(1){d=(N(b,g)<<2)+i|0;f=H[d+4>>2];c=j+(b<<6)|0;H[c>>2]=H[d>>2];H[c+4>>2]=f;f=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=f;f=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=f;f=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=f;d=b+1|0;c=j+(d<<6)|0;d=(N(d,g)<<2)+i|0;f=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=f;f=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=f;f=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=f;f=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=f;b=b+2|0;if((h|0)!=(b|0)){continue}break}}b=H[a+24>>2];h=H[a+28>>2];b:{if(b>>>0>=h>>>0){break b}j=(e-k|0)+32|0;k=(N(g,H[a+8>>2])<<2)+i|0;d=b+1|0;if(h-b&1){c=j+(b<<6)|0;b=k+(N(b,g)<<2)|0;e=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=e;e=H[b+28>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=e;e=H[b+20>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=e;e=H[b+12>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=e;b=d}if((d|0)==(h|0)){break b}while(1){d=k+(N(b,g)<<2)|0;e=H[d+4>>2];c=j+(b<<6)|0;H[c>>2]=H[d>>2];H[c+4>>2]=e;e=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;d=b+1|0;c=j+(d<<6)|0;d=k+(N(d,g)<<2)|0;e=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;e=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=e;b=b+2|0;if((h|0)!=(b|0)){continue}break}}Ua(a);b=0;if(H[a+32>>2]){while(1){d=H[a>>2]+(b<<5)|0;c=H[d+4>>2];g=(N(H[a+36>>2],b)<<2)+i|0;H[g>>2]=H[d>>2];H[g+4>>2]=c;c=H[d+28>>2];H[g+24>>2]=H[d+24>>2];H[g+28>>2]=c;c=H[d+20>>2];H[g+16>>2]=H[d+16>>2];H[g+20>>2]=c;c=H[d+12>>2];H[g+8>>2]=H[d+8>>2];H[g+12>>2]=c;b=b+1|0;if(b>>>0>2]){continue}break}}i=i+32|0;l=l+8|0;if(l>>>0<=K[a+44>>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function id(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;b=H[b>>2]+7&-8;H[d>>2]=b+16;o=a;f=H[b>>2];a=H[b+4>>2];d=H[b+8>>2];c=H[b+12>>2];p=c;h=na-32|0;na=h;b=c&65535;e=c;c=d;d=e>>>16&32767;g=d;a:{if(d-15361>>>0<=2045){b=b<<4|c>>>28;d=c<<4|a>>>28;e=g-15360|0;a=a&268435455;b:{if((a|0)==134217728&(f|0)!=0|a>>>0>134217728){c=b;d=d+1|0;b=d?c:c+1|0;break b}if(f|(a|0)!=134217728){break b}a=d;d=d+(d&1)|0;b=a>>>0>d>>>0?b+1|0:b}c=b>>>0>1048575;f=c?0:d;a=c?0:b;b=0;c=c+e|0;b=c>>>0>>0?1:b;break a}if(!(!(c|f|(a|b))|((d|0)!=32767|(k|0)!=0))){e=b<<4|c>>>28;f=c<<4|a>>>28;a=e|524288;c=2047;b=0;break a}if(g>>>0>17406){f=0;a=0;c=2047;b=0;break a}e=!(d|k);l=e?15360:15361;k=l-g|0;if((k|0)>112){f=0;a=0;c=0;b=0;break a}d=c;b=e?b:b|65536;if((g|0)!=(l|0)){m=f;c=a;i=d;e=b;l=128-k|0;c:{if(l&64){g=f;e=l+-64|0;c=e&31;if((e&63)>>>0>=32){e=f<>>32-c|a<>>0>=32){g=i<>>32-j|e<>>0>=32){e=0;i=c>>>i|0}else{e=c>>>i|0;i=((1<>>i}i=n|i;e=e|g;n=m;j=l&31;if((l&63)>>>0>=32){g=m<>>32-j|c<>2]=m;H[h+20>>2]=c;H[h+24>>2]=i;H[h+28>>2]=e;m=(H[h+16>>2]|H[h+24>>2]|(H[h+20>>2]|H[h+28>>2]))!=0}d:{if(k&64){c=d;f=k+-64|0;a=f&31;if((f&63)>>>0>=32){e=0;f=b>>>a|0}else{e=b>>>a|0;f=((1<>>a}a=e;d=0;b=0;break d}if(!k){break d}g=d;c=64-k|0;e=c&31;if((c&63)>>>0>=32){c=d<>>32-e|b<>>0>=32){g=0;a=a>>>f|0}else{g=a>>>f|0;a=((1<>>f}f=i|a;a=c|g;e=d;d=k&31;if((k&63)>>>0>=32){c=0;d=b>>>d|0}else{c=b>>>d|0;d=((1<>>d}b=c}H[h>>2]=f;H[h+4>>2]=a;H[h+8>>2]=d;H[h+12>>2]=b;a=H[h+8>>2];d=H[h+4>>2];f=a<<4|d>>>28;a=H[h+12>>2]<<4|a>>>28;c=d&268435455;b=H[h>>2]|m;e:{if((c|0)==134217728&(b|0)!=0|c>>>0>134217728){f=f+1|0;a=f?a:a+1|0;break e}if(b|(c|0)!=134217728){break e}b=a;a=f;f=f+(f&1)|0;a=a>>>0>f>>>0?b+1|0:b}c=a>>>0>1048575;a=c?a^1048576:a;b=0}na=h+32|0;u(0,f|0);u(1,a|(p&-2147483648|c<<20));q=o,r=+w(),M[q>>3]=r}function Ic(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;q=H[a+24>>2];if(!H[q+16>>2]){return 1}r=H[q+24>>2];o=H[H[H[a+20>>2]>>2]+20>>2];while(1){d=H[r+36>>2];H[b+36>>2]=d;f=H[o+28>>2];c=f+N(d,152)|0;t=H[a+64>>2];a:{if(t){d=f+N(H[o+24>>2],152)|0;p=H[d-144>>2]-H[d-152>>2]|0;f=c+12|0;e=c+4|0;d=H[c+8>>2];g=H[c>>2];c=36;break a}f=c+148|0;e=c+140|0;d=H[c+144>>2];g=H[c+136>>2];p=d-g|0;c=52}u=H[c+o>>2];b:{c:{if(!u){break c}k=H[e>>2];l=H[f>>2];f=d-g|0;e=H[b+40>>2];c=e&31;if((e&63)>>>0>=32){c=-1<>>32-c}m=h^-1;j=H[b+20>>2];h=m+j|0;i=c^-1;c=i;j=h>>>0>>0?c+1|0:c;c=e&31;if((e&63)>>>0>=32){h=j>>>c|0}else{h=((1<>>c}c=H[b+16>>2];j=c+m|0;m=c>>>0>j>>>0?i+1|0:i;i=e&31;c=H[b+8>>2];if((e&63)>>>0>=32){i=m>>>i|0}else{i=((1<>>i}e=c+i|0;d:{if(g>>>0>i>>>0){m=g-i|0;i=0;if(e>>>0>=d>>>0){j=0;d=f;break d}d=e-g|0;j=f-d|0;break d}i=i-g|0;if(e>>>0>=d>>>0){d=f-i|0;m=0;j=0;break d}j=d-e|0;m=0;d=c}f=l-k|0;e=H[b+12>>2];g=e+h|0;e:{if(h>>>0>>0){s=k-h|0;h=0;n=0;if(g>>>0>=l>>>0){break e}n=f;f=g-k|0;n=n-f|0;break e}h=h-k|0;if(g>>>0>=l>>>0){f=f-h|0;s=0;n=0;break e}s=0;f=e;n=l-g|0}k=n;g=0;if((h|i|(j|k)|(d|f))<0){break b}k=N(h,p)+i|0;l=H[b+44>>2];h=N(c,s)+m|0;f:{g:{if(!(k|l|(h|(c|0)!=(p|0))|(c|0)!=(d|0))){if((e|0)!=(f|0)){break g}d=(t?36:52)+o|0;H[b+44>>2]=H[d>>2];H[d>>2]=0;break c}if(l){break f}}te(e,0,c);if(qa|!e){break b}c=N(c,e);if(c>>>0>1073741823){break b}c=Ia(c<<2);H[b+44>>2]=c;if(!c){break b}e=H[b+8>>2];g=H[b+12>>2];if((e|0)==(d|0)&(g|0)==(f|0)){break f}e=N(e,g)<<2;if(!e){break f}y(c,0,e)}if(!f){break c}l=f&1;d=d<<2;g=H[b+44>>2]+(h<<2)|0;c=(k<<2)+u|0;if((f|0)!=1){k=f&2147483646;f=0;while(1){h=!d;if(!h){B(g,c,d)}i=p<<2;c=i+c|0;e=(H[b+8>>2]<<2)+g|0;if(!h){B(e,c,d)}c=c+i|0;g=e+(H[b+8>>2]<<2)|0;f=f+2|0;if((k|0)!=(f|0)){continue}break}}if(!l|!d){break c}B(g,c,d)}o=o+76|0;r=r+52|0;b=b+52|0;g=1;v=v+1|0;if(v>>>0>2]){continue}}break}return g}function xb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;if(a){a:{if(H[a>>2]){b=H[a+12>>2];if(b){kb(b);Ca(H[a+12>>2]);H[a+12>>2]=0}b=H[a+16>>2];if(b){Ca(b);H[a+16>>2]=0;H[a+20>>2]=0}Ca(H[a+64>>2]);H[a+60>>2]=0;H[a+64>>2]=0;Ca(H[a+72>>2]);H[a+72>>2]=0;Ca(H[a+88>>2]);H[a+88>>2]=0;break a}b=H[a+44>>2];if(b){Ca(b);H[a+44>>2]=0}b=H[a+32>>2];if(b){Ca(b);H[a+32>>2]=0;H[a+36>>2]=0}b=H[a+52>>2];if(!b){break a}Ca(b);H[a+52>>2]=0;H[a+56>>2]=0}Vb(H[a+232>>2]);b=H[a+180>>2];if(b){e=N(H[a+128>>2],H[a+132>>2]);if(e){while(1){kb(b);b=b+5644|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}b=H[a+180>>2]}Ca(b);H[a+180>>2]=0}b=H[a+140>>2];if(b){c=H[a+136>>2];if(c){b=0;while(1){e=H[H[a+140>>2]+(b<<3)>>2];if(e){Ca(e);c=H[a+136>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+140>>2]}H[a+136>>2]=0;Ca(b);H[a+140>>2]=0}Ca(H[a+160>>2]);H[a+144>>2]=0;H[a+160>>2]=0;Ca(H[a+124>>2]);H[a+124>>2]=0;if(!(I[a+212|0]&2)){Ca(H[a+192>>2])}y(a+104|0,0,112);qb(H[a+216>>2]);H[a+216>>2]=0;qb(H[a+220>>2]);H[a+216>>2]=0;d=H[a+224>>2];if(d){b=H[d+28>>2];if(b){Ca(b);H[d+28>>2]=0}c=H[d+40>>2];if(c){if(H[d+36>>2]){while(1){e=N(g,40);b=H[(e+c|0)+36>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+36>>2]=0}b=H[(c+e|0)+16>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+16>>2]=0}b=H[(c+e|0)+24>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+24>>2]=0}g=g+1|0;if(g>>>0>2]){continue}break}}Ca(c);H[d+40>>2]=0}Ca(d)}H[a+224>>2]=0;Va(H[a+96>>2]);H[a+96>>2]=0;Va(H[a+100>>2]);H[a+100>>2]=0;f=H[a+236>>2];if(f){b:{if(!H[f+8>>2]){break b}if(H[f+12>>2]){H[f+40>>2]=0;while(1){if(H[f+24>>2]>0){continue}break}}H[f+16>>2]=1;Ca(H[f>>2]);c=H[f+28>>2];if(!c){break b}while(1){b=H[c+4>>2];Ca(c);H[f+28>>2]=b;c=b;if(b){continue}break}}d=H[f+36>>2];if(d){g=H[d+4>>2];if((g|0)>0){b=0;while(1){e=H[d>>2]+N(b,12)|0;c=H[e+8>>2];if(c){ra[c|0](H[e+4>>2]);g=H[d+4>>2]}b=b+1|0;if((g|0)>(b|0)){continue}break}}Ca(H[d>>2]);Ca(d)}Ca(f)}H[a+236>>2]=0;Ca(a)}}function Zd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=na-16|0;na=g;if(H[a+8>>2]==16){h=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{h=H[a+12>>2]}a:{if(!c){Ba(d,1,4259,0);break a}i=H[a+96>>2];e=1;Da(b,g+8|0,1);f=H[g+8>>2];if(f>>>0>=2){Ba(d,2,9792,0);break a}if((f+1|0)!=(c|0)){e=0;Ba(d,2,4259,0);break a}d=H[i+16>>2];b:{if(!d){break b}e=H[h+5584>>2];if(d>>>0>=8){i=d&-8;c=0;while(1){H[e+8636>>2]=0;H[e+7556>>2]=0;H[e+6476>>2]=0;H[e+5396>>2]=0;H[e+4316>>2]=0;H[e+3236>>2]=0;H[e+2156>>2]=0;H[e+1076>>2]=0;e=e+8640|0;c=c+8|0;if((i|0)!=(c|0)){continue}break}}d=d&7;if(!d){break b}c=0;while(1){H[e+1076>>2]=0;e=e+1080|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}c=H[h+5608>>2];if(c){Ca(c);H[h+5608>>2]=0;f=H[g+8>>2]}if(!f){e=1;break a}i=0;while(1){b=b+1|0;Da(b,g+12|0,1);c:{if(!H[h+5632>>2]){break c}d=H[h+5628>>2];if(H[d>>2]!=H[g+12>>2]){break c}f=H[d+4>>2];j=H[a+96>>2];if((f|0)!=H[j+16>>2]){break c}c=H[d+8>>2];if(c){e=0;f=N(f,f);if(H[c+16>>2]!=(N(f,H[(H[c>>2]<<2)+24896>>2])|0)){break a}k=Fa(f<<2);H[h+5608>>2]=k;if(!k){break a}ra[H[(H[c>>2]<<2)+25200>>2]](H[c+12>>2],k,f)}c=H[d+12>>2];if(!c){break c}e=0;d=H[j+16>>2];if(H[c+16>>2]!=(N(d,H[(H[c>>2]<<2)+24896>>2])|0)){break a}f=Fa(d<<2);if(!f){break a}ra[H[(H[c>>2]<<2)+25216>>2]](H[c+12>>2],f,d);c=H[j+16>>2];d:{if(!c){break d}j=c&7;e=H[h+5584>>2];e:{if(c>>>0<8){c=f;break e}k=c&-8;d=0;c=f;while(1){H[e+1076>>2]=H[c>>2];H[e+2156>>2]=H[c+4>>2];H[e+3236>>2]=H[c+8>>2];H[e+4316>>2]=H[c+12>>2];H[e+5396>>2]=H[c+16>>2];H[e+6476>>2]=H[c+20>>2];H[e+7556>>2]=H[c+24>>2];H[e+8636>>2]=H[c+28>>2];e=e+8640|0;c=c+32|0;d=d+8|0;if((k|0)!=(d|0)){continue}break}}d=0;if(!j){break d}while(1){H[e+1076>>2]=H[c>>2];e=e+1080|0;c=c+4|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}}Ca(f)}e=1;i=i+1|0;if(i>>>0>2]){continue}break}}na=g+16|0;return e|0}function yb(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=H[H[a+24>>2]+24>>2]+N(b,52)|0;l=H[m+4>>2];k=l-1|0;o=H[a+60>>2];j=k+o|0;p=0-!l|0;i=p;r=H[H[H[a+20>>2]>>2]+20>>2]+N(b,76)|0;n=H[r+12>>2];i=xe(j,j>>>0>>0?i+1|0:i,l,0);q=i>>>0>n>>>0?n:i;j=H[m>>2];m=j-1|0;s=H[a+56>>2];n=m+s|0;o=0-!j|0;i=o;t=H[r+8>>2];i=xe(n,n>>>0>>0?i+1|0:i,j,0);n=i>>>0>t>>>0?t:i;i=p;t=H[r+4>>2];s=H[a+52>>2];k=s+k|0;i=xe(k,k>>>0>>0?i+1|0:i,l,0);k=i>>>0>>0?t:i;i=o;p=H[r>>2];l=m;m=H[a+48>>2];l=l+m|0;i=xe(l,l>>>0>>0?i+1|0:i,j,0);i=i>>>0

>>0?p:i;l=0;p=H[(H[H[a+32>>2]+5584>>2]+N(b,1080)|0)+20>>2];c=H[r+20>>2]+(c?0-c|0:-1)|0;a:{if(!c){a=n;l=i;b=k;break a}m=c-1|0;j=(d&1)<>>0>>0){a=c&31;l=i-j|0;if((c&63)>>>0>=32){i=-1<>>32-a;a=-1<>>0>>0?i+1|0:i;b=a;a=c&31;if((c&63)>>>0>=32){l=i>>>a|0}else{l=((1<>>a}}a=0;b=0;d=d>>>1<>>0>>0){b=c&31;o=k-d|0;if((c&63)>>>0>=32){i=-1<>>32-b;b=-1<>>0>>0?i+1|0:i;k=b;b=c&31;if((c&63)>>>0>=32){b=i>>>b|0}else{b=((1<>>b}}if(j>>>0>>0){a=c&31;k=n-j|0;if((c&63)>>>0>=32){i=-1<>>32-a;a=-1<>>0>>0?i+1|0:i;j=a;a=c&31;if((c&63)>>>0>=32){a=i>>>a|0}else{a=((1<>>a}}if(d>>>0>=q>>>0){q=0;break a}k=q-d|0;d=c&31;if((c&63)>>>0>=32){i=-1<>>32-d;d=-1<>>0>>0?i+1|0:i;j=d;d=c&31;if((c&63)>>>0>=32){q=i>>>d|0}else{q=((1<>>d}}c=(p|0)==1?2:3;d=c+a|0;d=(a>>>0>d>>>0?-1:d)>>>0>e>>>0;a=c+q|0;d=d&(a>>>0>>0?-1:a)>>>0>f>>>0;a=l-c|0;d=d&(a>>>0<=l>>>0?a:0)>>>0>>0;a=b-c|0;return d&(a>>>0<=b>>>0?a:0)>>>0>>0}function gc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;j=na-256|0;na=j;a:{if(!a){a=0;break a}if(!(H[a>>2]==(b|0)&H[a+4>>2]==(c|0))){H[a+4>>2]=c;H[a>>2]=b;H[j>>2]=c;H[j+128>>2]=b;e=c;g=b;while(1){o=i;i=i+1|0;h=i<<2;n=(e+1|0)/2|0;H[h+j>>2]=n;k=h+(j+128|0)|0;h=(g+1|0)/2|0;H[k>>2]=h;m=N(e,g);f=m+f|0;e=n;g=h;if(m>>>0>1){continue}break}H[a+8>>2]=f;b:{c:{d:{if(!f){b=H[a+12>>2];if(!b){break d}Ca(b);H[a+12>>2]=0;break d}e=f<<4;if(e>>>0<=K[a+16>>2]){break b}f=Ha(H[a+12>>2],e);if(f){break c}Ba(d,1,6451,0);b=H[a+12>>2];if(!b){break d}Ca(b);H[a+12>>2]=0}Ca(a);a=0;break a}H[a+12>>2]=f;c=H[a+16>>2];b=e-c|0;if(b){y(c+f|0,0,b)}H[a+16>>2]=e;c=H[a+4>>2];b=H[a>>2]}g=H[a+12>>2];if(o){d=0;e=(N(b,c)<<4)+g|0;f=e;while(1){b=d<<2;k=H[b+j>>2];e:{if((k|0)<=0){break e}m=k-1|0;l=0;f:{g:{c=H[b+(j+128|0)>>2];if((c|0)<=0){n=k&1;i=0;if((k|0)!=1){break g}b=f;break f}while(1){b=f;f=c;while(1){h:{H[g>>2]=e;if((f|0)==1){g=g+16|0;e=e+16|0;break h}H[g+16>>2]=e;e=e+16|0;g=g+32|0;h=(f|0)>2;f=f-2|0;if(h){continue}}break}h=((l|0)==(m|0)|l)&1;f=h?e:b+(c<<4)|0;e=h?e:b;l=l+1|0;if((k|0)!=(l|0)){continue}break}break e}h=k&2147483646;while(1){b=(i|0)==(m|0);i=i+2|0;e=b?e:f;f=e;b=e;l=l+2|0;if((h|0)!=(l|0)){continue}break}}if(!n){f=e;break e}f=(c<<4)+b|0;c=((i|0)==(m|0)|i)&1;f=c?e:f;e=c?e:b}d=d+1|0;if((o|0)!=(d|0)){continue}break}}H[g>>2]=0}c=H[a+8>>2];if(!c){break a}e=H[a+12>>2];if(c>>>0>=4){b=c&-4;g=0;while(1){H[e+60>>2]=0;H[e+52>>2]=999;H[e+56>>2]=0;H[e+44>>2]=0;H[e+36>>2]=999;H[e+40>>2]=0;H[e+28>>2]=0;H[e+20>>2]=999;H[e+24>>2]=0;H[e+12>>2]=0;H[e+4>>2]=999;H[e+8>>2]=0;e=e- -64|0;g=g+4|0;if((b|0)!=(g|0)){continue}break}}b=c&3;if(!b){break a}g=0;while(1){H[e+12>>2]=0;H[e+4>>2]=999;H[e+8>>2]=0;e=e+16|0;g=g+1|0;if((b|0)!=(g|0)){continue}break}}na=j+256|0;return a}function mb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=H[a+16>>2];if(g>>>0>=32){return H[a+8>>2]}d=H[a+20>>2];a:{if((d|0)>=4){b=H[a>>2];c=H[b-3>>2];d=d-4|0;H[a+20>>2]=d;H[a>>2]=b-4;break a}if((d|0)<=0){break a}k=d&1;b=H[a>>2];b:{if((d|0)==1){e=24;break b}j=d&2147483646;e=24;while(1){h=b-1|0;H[a>>2]=h;i=I[b|0];b=b-2|0;H[a>>2]=b;H[a+20>>2]=d-1;h=I[h|0];d=d-2|0;H[a+20>>2]=d;c=i<>2]=b-1;b=I[b|0];H[a+20>>2]=d-1;c=b<>2];j=c&255;H[a+24>>2]=j>>>0>143;b=b?(c&2130706432)==2130706432?7:8:8;h=b+(c>>>0<=2415919103?8:(c&8323072)==8323072?7:8)|0;f=c>>>16&255;i=h+(f>>>0<=143?8:(c&32512)==32512?7:8)|0;e=c>>>8&255;k=i+(g+(e>>>0<=143?8:(c&127)==127?7:8)|0)|0;H[a+16>>2]=k;l=H[a+12>>2];b=f<>>24|e<>>0>=32){e=b<>>32-c;b=b<>2];b=e|l;h=b;H[a+8>>2]=g;H[a+12>>2]=b;if(k>>>0<=31){c:{if((d|0)>=4){b=H[a>>2];c=H[b-3>>2];H[a+20>>2]=d-4;H[a>>2]=b-4;break c}if((d|0)<=0){c=0;break c}i=d&1;b=H[a>>2];d:{if((d|0)==1){e=24;c=0;break d}l=d&2147483646;e=24;c=0;f=0;while(1){m=b-1|0;H[a>>2]=m;n=I[b|0];b=b-2|0;H[a>>2]=b;H[a+20>>2]=d-1;m=I[m|0];d=d-2|0;H[a+20>>2]=d;c=n<>2]=b-1;b=I[b|0];H[a+20>>2]=d-1;c=b<>2]=d>>>0>143;j=j>>>0<=143?8:(c&2130706432)==2130706432?7:8;i=j+(c>>>0<=2415919103?8:(c&8323072)==8323072?7:8)|0;f=c>>>16&255;l=i+(f>>>0<=143?8:(c&32512)==32512?7:8)|0;e=c>>>8&255;H[a+16>>2]=l+((e>>>0<=143?8:(c&127)==127?7:8)+k|0);b=a;a=f<>>24|e<>>0>=32){d=a<>>32-c;a=a<>2]=g;H[b+12>>2]=d|h}return g}function Tc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=H[a+96>>2];l=N(H[a+128>>2],H[a+132>>2]);a:{if(l){b=H[j+16>>2];m=N(b,1080);k=N(b,b)<<2;e=H[a+12>>2];b=H[a+180>>2];while(1){n=H[b+5584>>2];B(b,e,5644);H[b+5608>>2]=0;H[b+5588>>2]=-1;H[b+5168>>2]=0;H[b+5636>>2]=0;H[b+5616>>2]=0;H[b+5624>>2]=0;H[b+5628>>2]=0;H[b+5584>>2]=n;F[b+5640|0]=I[b+5640|0]&252;b:{if(!H[e+5608>>2]){break b}d=Fa(k);H[b+5608>>2]=d;if(!d){return 0}if(!k){break b}B(d,H[e+5608>>2],k)}d=N(H[e+5624>>2],20);f=Fa(d);H[b+5616>>2]=f;i=0;if(!f){break a}if(d){B(f,H[e+5616>>2],d)}g=H[e+5620>>2];if(g){d=H[e+5616>>2];f=H[b+5616>>2];h=0;while(1){if(H[d+12>>2]){g=Fa(H[d+16>>2]);H[f+12>>2]=g;if(!g){return 0}o=H[d+16>>2];if(o){B(g,H[d+12>>2],o)}g=H[e+5620>>2]}H[b+5624>>2]=H[b+5624>>2]+1;f=f+20|0;d=d+20|0;h=h+1|0;if(h>>>0>>0){continue}break}}d=N(H[e+5636>>2],20);f=Fa(d);H[b+5628>>2]=f;if(!f){break a}if(d){B(f,H[e+5628>>2],d)}i=H[e+5636>>2];H[b+5636>>2]=i;if(i){d=H[e+5628>>2];f=H[b+5628>>2];h=0;while(1){g=H[d+8>>2];if(g){H[f+8>>2]=H[b+5616>>2]+(g-H[e+5616>>2]|0)}g=H[d+12>>2];if(g){H[f+12>>2]=H[b+5616>>2]+(g-H[e+5616>>2]|0)}f=f+20|0;d=d+20|0;h=h+1|0;if((i|0)!=(h|0)){continue}break}}if(m){B(n,H[e+5584>>2],m)}b=b+5644|0;p=p+1|0;if((p|0)!=(l|0)){continue}break}}i=1;e=Ea(1,72);b=0;c:{if(!e){break c}F[e+40|0]=I[e+40|0]&254|1;d=Ea(1,4);H[e+20>>2]=d;b=e;if(d){break c}Ca(b);b=0}H[a+232>>2]=b;if(!b){return 0}f=H[a+236>>2];e=0;H[b+28>>2]=a+104;H[b+24>>2]=j;d=Ea(1,848);H[H[b+20>>2]>>2]=d;d:{if(!d){break d}d=Ea(H[j+16>>2],76);h=H[H[b+20>>2]>>2];H[h+20>>2]=d;if(!d){break d}H[h+16>>2]=H[j+16>>2];e=H[a+188>>2];H[b+44>>2]=f;H[b>>2]=e;e=1}if(e){break a}Vb(H[a+232>>2]);i=0;H[a+232>>2]=0;Ba(c,1,3668,0)}return i|0}function re(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=na-80|0;na=e;H[e+76>>2]=1;j=H[a+44>>2];d=H[H[a+224>>2]+40>>2];a:{b:{if(!d|!H[d+16>>2]){break b}c:{d=d+N(j,40)|0;if(!H[d+4>>2]){d=H[a+52>>2];f=H[a+48>>2]+2|0;d=f>>>0<2?d+1|0:d;if(cb(b,f,d,c)){break c}d=0;Ba(c,1,5440,0);break a}d=H[d+16>>2];if(!cb(b,H[d>>2],H[d+4>>2],c)){Ba(c,1,5440,0);d=0;break a}if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);d=0;break a}Da(H[a+16>>2],e+72|0,2);if(H[e+72>>2]==65424){break c}Ba(c,1,4073,0);d=0;break a}if(H[a+8>>2]!=256){break b}H[a+8>>2]=8}i=N(H[a+132>>2],H[a+128>>2]);d:{if(!i){break d}h=H[a+180>>2];d=0;if(i>>>0>=8){k=i&-8;while(1){f=h+N(g,5644)|0;H[f+45096>>2]=-1;H[f+39452>>2]=-1;H[f+33808>>2]=-1;H[f+28164>>2]=-1;H[f+22520>>2]=-1;H[f+16876>>2]=-1;H[f+11232>>2]=-1;H[f+5588>>2]=-1;g=g+8|0;l=l+8|0;if((k|0)!=(l|0)){continue}break}}f=i&7;if(!f){break d}while(1){H[(h+N(g,5644)|0)+5588>>2]=-1;g=g+1|0;d=d+1|0;if((f|0)!=(d|0)){continue}break}}d=0;if(!db(a,e+72|0,0,e+68|0,e- -64|0,e+60|0,e+56|0,e+52|0,e+76|0,b,c)){break a}i=j+1|0;while(1){e:{if(!H[e+76>>2]){break e}f=H[e+72>>2];if(!jb(a,f,0,0,b,c)){break a}h=H[a+128>>2];k=H[a+132>>2];g=f+1|0;H[e+32>>2]=g;H[e+36>>2]=N(h,k);Ba(c,4,11795,e+32|0);if(!Ic(H[a+232>>2],H[H[a+100>>2]+24>>2])){break a}d=H[a+180>>2]+N(f,5644)|0;h=H[d+5596>>2];if(h){Ca(h);H[d+5596>>2]=0;H[d+5600>>2]=0}H[e+16>>2]=g;Ba(c,4,16601,e+16|0);if((f|0)==(j|0)){d=H[a+224>>2];f=H[d+8>>2];d=H[d+12>>2];f=f+2|0;d=f>>>0<2?d+1|0:d;if(cb(b,f,d,c)){break e}d=0;Ba(c,1,5440,0);break a}H[e+4>>2]=i;H[e>>2]=g;Ba(c,2,13648,e);d=0;if(db(a,e+72|0,0,e+68|0,e- -64|0,e+60|0,e+56|0,e+52|0,e+76|0,b,c)){continue}break a}break}d=Hc(a,c)}na=e+80|0;return d|0}function Ma(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=H[a+16>>2];if(h>>>0>=32){return H[a+8>>2]}d=H[a+24>>2];a:{if((d|0)>=4){b=H[a>>2];c=H[b>>2];g=d-4|0;H[a+24>>2]=g;H[a>>2]=b+4;break a}c=H[a+28>>2]?-1:0;if((d|0)<=0){g=d;break a}j=d&1;b=H[a>>2];b:{if((d|0)==1){f=b;break b}i=d&2147483646;while(1){H[a>>2]=b+1;k=I[b|0];f=b+2|0;H[a>>2]=f;H[a+24>>2]=d-1;b=I[b+1|0];d=d-2|0;H[a+24>>2]=d;c=((255<>2]=f+1;b=I[f|0];H[a+24>>2]=d-1;c=(255<>2];i=c>>>24|0;H[a+20>>2]=(i|0)==255;f=c>>>16&255;d=c>>>8&255;b=b?7:8;c=c&255;e=b+((c|0)==255?7:8)|0;k=((d|0)==255?7:8)+e|0;j=(h+((f|0)==255?7:8)|0)+k|0;H[a+16>>2]=j;l=H[a+12>>2];b=c|(d<>>0>=32){f=b<>>32-c;b=b<>2];b=f|l;k=b;H[a+8>>2]=h;H[a+12>>2]=b;if(j>>>0<=31){c:{if((g|0)>=4){b=H[a>>2];d=H[b>>2];H[a+24>>2]=g-4;H[a>>2]=b+4;break c}e=0;d=H[a+28>>2]?-1:0;if((g|0)<=0){break c}l=g&1;b=H[a>>2];d:{if((g|0)==1){c=b;break d}m=g&2147483646;f=0;while(1){H[a>>2]=b+1;n=I[b|0];c=b+2|0;H[a>>2]=c;H[a+24>>2]=g-1;b=I[b+1|0];g=g-2|0;H[a+24>>2]=g;d=((255<>2]=c+1;b=I[c|0];H[a+24>>2]=g-1;d=(255<>>24|0;H[a+20>>2]=(c|0)==255;f=d>>>16&255;g=d>>>8&255;e=(i|0)==255?7:8;d=d&255;i=e+((d|0)==255?7:8)|0;l=((g|0)==255?7:8)+i|0;H[a+16>>2]=(((f|0)==255?7:8)+j|0)+l;b=a;a=d|(g<>>0>=32){f=a<>>32-c;a=a<>2]=h;H[b+12>>2]=f|k}return h}function Mc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0;i=na-32|0;na=i;if(H[a+8>>2]==16){f=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{f=H[a+12>>2]}a:{if(K[d>>2]<=4){a=0;Ba(e,1,2607,0);break a}f=H[f+5584>>2]+N(b,1080)|0;Da(c,f+4|0,1);h=H[f+4>>2]+1|0;H[f+4>>2]=h;if(h>>>0>=34){H[i+4>>2]=33;H[i>>2]=h;Ba(e,1,7635,i);a=0;break a}g=H[a+184>>2];if(g>>>0>=h>>>0){H[i+24>>2]=h;H[i+20>>2]=g;H[i+16>>2]=b;Ba(e,1,16423,i+16|0);H[a+8>>2]=H[a+8>>2]|32768;a=0;break a}Da(c+1|0,f+8|0,1);H[f+8>>2]=H[f+8>>2]+2;Da(c+2|0,f+12|0,1);a=H[f+12>>2]+2|0;H[f+12>>2]=a;b=H[f+8>>2];if(!(!(b>>>0>10|a>>>0>10)&a+b>>>0<13)){a=0;Ba(e,1,5468,0);break a}Da(c+3|0,f+16|0,1);if(I[f+16|0]&128){a=0;Ba(e,1,6564,0);break a}Da(c+4|0,f+20|0,1);if(K[f+20>>2]>=2){a=0;Ba(e,1,6499,0);break a}b=H[d>>2]-5|0;H[d>>2]=b;a=1;h=H[f+4>>2];if(!(F[f|0]&1)){if(!h){break a}d=f+944|0;e=f+812|0;b=0;c=0;if(h>>>0>=4){k=h&-4;g=0;while(1){f=c<<2;H[f+e>>2]=15;H[d+f>>2]=15;j=f|4;H[j+e>>2]=15;H[d+j>>2]=15;j=f|8;H[j+e>>2]=15;H[d+j>>2]=15;f=f|12;H[f+e>>2]=15;H[d+f>>2]=15;c=c+4|0;g=g+4|0;if((k|0)!=(g|0)){continue}break}}f=h&3;if(!f){break a}while(1){a=c<<2;H[a+e>>2]=15;H[a+d>>2]=15;a=1;c=c+1|0;b=b+1|0;if((f|0)!=(b|0)){continue}break}break a}if(b>>>0>=h>>>0){b:{if(!h){g=0;break b}Da(c+5|0,i+28|0,1);a=H[i+28>>2];H[f+944>>2]=a>>>4;H[f+812>>2]=a&15;g=H[f+4>>2];if(g>>>0>=2){h=f+944|0;k=f+812|0;a=c+6|0;c=1;while(1){Da(a,i+28|0,1);c:{b=H[i+28>>2];if(b>>>0>=16){g=b&15;if(g){break c}}a=0;Ba(e,1,6025,0);break a}j=c<<2;H[j+k>>2]=g;H[h+j>>2]=b>>>4;a=a+1|0;c=c+1|0;g=H[f+4>>2];if(c>>>0>>0){continue}break}}b=H[d>>2]}H[d>>2]=b-g;a=1;break a}a=0;Ba(e,1,2607,0)}na=i+32|0;return a}function $b(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=b;H[a+28>>2]=d;H[a+16>>2]=0;H[a+20>>2]=0;h=c-1|0;H[a+24>>2]=h;n=b&3;a:{if((c|0)<=0){e=b;b=d;break a}e=b+1|0;H[a>>2]=e;b=I[b|0]}g=b;i=8;H[a+16>>2]=8;j=(g|0)==255;H[a+20>>2]=j;H[a+8>>2]=g;H[a+12>>2]=0;b:{if((n|0)==3){break b}k=c-2|0;H[a+24>>2]=k;c:{if((c|0)<2){b=e;e=d;break c}b=e+1|0;H[a>>2]=b;e=I[e|0]}j=(e|0)==255;H[a+20>>2]=j;i=(g|0)==255?15:16;H[a+16>>2]=i;g=g|e<<8;H[a+8>>2]=g;H[a+12>>2]=0;if((n|0)==2){e=b;c=h;h=k;break b}o=c-3|0;H[a+24>>2]=o;d:{if((c|0)<3){f=b;b=d;break d}f=b+1|0;H[a>>2]=f;b=I[b|0]}j=(b|0)==255;H[a+20>>2]=j;l=((e|0)==255?7:8)+i|0;H[a+16>>2]=l;e=i&31;if((i&63)>>>0>=32){m=b<>>32-e;e=b<>2]=g;H[a+12>>2]=m;if((n|0)==1){e=f;i=l;c=k;h=o;break b}h=c-4|0;H[a+24>>2]=h;e:{if((c|0)<4){e=f;c=d;break e}e=f+1|0;H[a>>2]=e;c=I[f|0]}j=(c|0)==255;H[a+20>>2]=j;i=l+((b|0)==255?7:8)|0;H[a+16>>2]=i;b=l&31;if((l&63)>>>0>=32){f=c<>>32-b;b=c<>2]=g;H[a+12>>2]=b;c=o}f:{if((c|0)>=5){d=H[e>>2];H[a+24>>2]=c-5;H[a>>2]=e+4;break f}b=0;d=d?-1:0;if((c|0)<2){break f}while(1){c=e+1|0;H[a>>2]=c;e=I[e|0];f=h-1|0;H[a+24>>2]=f;d=(255<>>0>1;e=c;h=f;if(k){continue}break}}b=d>>>24|0;H[a+20>>2]=(b|0)==255;c=d>>>16&255;e=d>>>8&255;h=j?7:8;d=d&255;f=h+((d|0)==255?7:8)|0;k=((e|0)==255?7:8)+f|0;H[a+16>>2]=(((c|0)==255?7:8)+i|0)+k;b=d|(e<>>0>=32){d=a<>>32-b;a=a<>2]=a|g;H[c+12>>2]=d|m}function Ha(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!b){return 0}a:{if(!a){a=hb(8,b);break a}if(!b){Ca(a);a=0;break a}b:{if(b>>>0>4294967239){break b}h=b>>>0<=8?8:b+3&-4;d=h+8|0;j=a-4|0;f=j;e=H[f>>2];b=e+f|0;c=H[b>>2];c:{d:{e:{if((c|0)!=H[(b+c|0)-4>>2]){c=c+e|0;if(c>>>0>=d+16>>>0){e=H[b+4>>2];b=H[b+8>>2];H[e+8>>2]=b;H[b+4>>2]=e;b=d+f|0;c=c-d|0;H[b>>2]=c;H[(b+(c&-4)|0)-4>>2]=c|1;e=H[b>>2]-8|0;f:{if(e>>>0<=127){g=(e>>>3|0)-1|0;break f}c=Q(e);g=((e>>>29-c^4)-(c<<2)|0)+110|0;if(e>>>0<=4095){break f}c=((e>>>30-c^2)-(c<<1)|0)+71|0;g=c>>>0>=63?63:c}c=g;e=c<<4;H[b+4>>2]=e+26400;e=e+26408|0;H[b+8>>2]=H[e>>2];H[e>>2]=b;H[H[b+8>>2]+4>>2]=b;e=H[6859];b=c&31;if((c&63)>>>0>=32){c=1<>>32-b}H[6858]=g|H[6858];H[6859]=c|e;H[f>>2]=d;H[(f+(d&-4)|0)-4>>2]=d;c=1;break c}if(c>>>0>>0){break e}d=H[b+4>>2];b=H[b+8>>2];H[d+8>>2]=b;H[b+4>>2]=d;H[f>>2]=c;H[(f+(c&-4)|0)-4>>2]=c;c=1;break c}if(e>>>0>=d+16>>>0){H[f>>2]=d;H[(f+(d&-4)|0)-4>>2]=d;b=d+f|0;c=e-d|0;H[b>>2]=c;H[(b+(c&-4)|0)-4>>2]=c|1;d=H[b>>2]-8|0;g:{if(d>>>0<=127){c=(d>>>3|0)-1|0;break g}f=Q(d);c=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break g}c=((d>>>30-f^2)-(f<<1)|0)+71|0;c=c>>>0>=63?63:c}d=c<<4;H[b+4>>2]=d+26400;d=d+26408|0;H[b+8>>2]=H[d>>2];H[d>>2]=b;H[H[b+8>>2]+4>>2]=b;d=H[6859];b=c&31;if((c&63)>>>0>=32){c=1<>>32-b;b=e}H[6858]=b|H[6858];H[6859]=c|d;c=1;break c}c=1;if(d>>>0<=e>>>0){break d}}c=0}}if(c){break a}b=hb(8,h);if(!b){break b}i=H[j>>2]-8|0;bb(b,a,h>>>0>>0?h:i);Ca(a);i=b}a=i}return a}function pe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=na-16|0;na=f;H[f+12>>2]=c;j=H[a+96>>2];if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}F[e+5640|0]=I[e+5640|0]|1;a:{if(c>>>0<=4){c=0;Ba(d,1,4565,0);break a}Da(b,e,1);if(K[e>>2]>=8){c=0;Ba(d,1,4531,0);break a}Da(b+1|0,f+8|0,1);c=H[f+8>>2];H[e+4>>2]=c;if((c|0)>=5){Ba(d,1,4490,0);H[e+4>>2]=-1}Da(b+2|0,e+8|0,2);g=H[e+8>>2];if(g-65536>>>0<=4294901760){H[f>>2]=g;Ba(d,1,8111,f);c=0;break a}c=H[a+188>>2];H[e+12>>2]=c?c:g;Da(b+4|0,e+16|0,1);if(K[e+16>>2]>=2){c=0;Ba(d,1,5536,0);break a}g=b+5|0;H[f+12>>2]=H[f+12>>2]-5;j=H[j+16>>2];b:{if(!j){break b}h=H[e>>2]&1;e=H[e+5584>>2];b=0;if(j>>>0>=8){c=j&-8;while(1){i=e+N(b,1080)|0;H[i+7560>>2]=h;H[i+6480>>2]=h;H[i+5400>>2]=h;H[i+4320>>2]=h;H[i+3240>>2]=h;H[i+2160>>2]=h;H[i+1080>>2]=h;H[i>>2]=h;b=b+8|0;k=k+8|0;if((c|0)!=(k|0)){continue}break}}c=j&7;if(!c){break b}while(1){H[e+N(b,1080)>>2]=h;b=b+1|0;l=l+1|0;if((c|0)!=(l|0)){continue}break}}c=0;if(!Mc(a,0,g,f+12|0,d)){Ba(d,1,4565,0);break a}if(H[f+12>>2]){Ba(d,1,4565,0);break a}if(H[a+8>>2]==16){b=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{b=H[a+12>>2]}if(K[H[a+96>>2]+16>>2]>=2){b=H[b+5584>>2];g=H[b+4>>2]<<2;l=b+944|0;e=b+812|0;k=1;c=b;while(1){H[c+1084>>2]=H[b+4>>2];H[c+1088>>2]=H[b+8>>2];H[c+1092>>2]=H[b+12>>2];H[c+1096>>2]=H[b+16>>2];H[c+1100>>2]=H[b+20>>2];d=!g;if(!d){B(c+1892|0,e,g)}if(!d){B(c+2024|0,l,g)}c=c+1080|0;k=k+1|0;if(k>>>0>2]+16>>2]){continue}break}}c=1}na=f+16|0;return c|0}function ic(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=na-256|0;na=j;f=Ea(1,20);a:{if(!f){Ba(c,1,6413,0);f=0;break a}H[f+4>>2]=b;H[f>>2]=a;H[j>>2]=b;H[j+128>>2]=a;while(1){p=g;g=g+1|0;h=g<<2;d=(b+1|0)/2|0;H[h+j>>2]=d;m=h+(j+128|0)|0;h=(a+1|0)/2|0;H[m>>2]=h;i=N(a,b);e=i+e|0;b=d;a=h;if(i>>>0>1){continue}break}H[f+8>>2]=e;if(!e){Ca(f);f=0;break a}d=Ea(e,16);H[f+12>>2]=d;if(!d){Ba(c,1,3564,0);Ca(f);f=0;break a}l=H[f+8>>2];H[f+16>>2]=l<<4;a=d;if(p){e=(N(H[f+4>>2],H[f>>2])<<4)+d|0;b=e;while(1){c=n<<2;i=H[c+j>>2];b:{if((i|0)<=0){break b}o=i-1|0;h=0;c:{c=H[c+(j+128|0)>>2];if((c|0)<=0){g=0;if((i|0)!=1){k=i&2147483646;while(1){m=(g|0)==(o|0);g=g+2|0;e=m?b:e;b=e;h=h+2|0;if((k|0)!=(h|0)){continue}break}}if(i&1){break c}b=e;break b}while(1){g=e;e=c;while(1){d:{H[a>>2]=b;if((e|0)==1){a=a+16|0;b=b+16|0;break d}H[a+16>>2]=b;b=b+16|0;a=a+32|0;k=(e|0)>2;e=e-2|0;if(k){continue}}break}k=((h|0)==(o|0)|h)&1;e=k?b:g+(c<<4)|0;b=k?b:g;h=h+1|0;if((i|0)!=(h|0)){continue}break}break b}g=((g|0)==(o|0)|g)&1;c=g?b:(c<<4)+e|0;b=g?b:e;e=c}n=n+1|0;if((n|0)!=(p|0)){continue}break}}H[a>>2]=0;e:{if(!l){break e}if(l>>>0>=4){a=l&-4;b=0;while(1){H[d+60>>2]=0;H[d+52>>2]=999;H[d+56>>2]=0;H[d+44>>2]=0;H[d+36>>2]=999;H[d+40>>2]=0;H[d+28>>2]=0;H[d+20>>2]=999;H[d+24>>2]=0;H[d+12>>2]=0;H[d+4>>2]=999;H[d+8>>2]=0;d=d- -64|0;b=b+4|0;if((a|0)!=(b|0)){continue}break}}a=l&3;if(!a){break e}b=0;while(1){H[d+12>>2]=0;H[d+4>>2]=999;H[d+8>>2]=0;d=d+16|0;b=b+1|0;if((a|0)!=(b|0)){continue}break}}}na=j+256|0;return f}function hb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=a>>>0<=8?8:a;k=j+48|0;a:{b:{while(1){if(a-1&a|b>>>0>4294967239){break b}d=H[6859];e=d;g=H[6858];b=b>>>0<=8?8:b+3&-4;c:{if(b>>>0<=127){i=(b>>>3|0)-1|0;break c}c=Q(b);i=((b>>>29-c^4)-(c<<2)|0)+110|0;if(b>>>0<=4095){break c}c=((b>>>30-c^2)-(c<<1)|0)+71|0;i=c>>>0>=63?63:c}h=i;f=h&31;if((h&63)>>>0>=32){c=0;d=d>>>f|0}else{c=d>>>f|0;d=((1<>>f}if(d|c){while(1){f=c;d:{if(c|d){e=c-1|0;g=e+1|0;i=e;e=d-1|0;g=(e|0)!=-1?g:i;c=Q(c^g);c=(c|0)==32?Q(d^e)+32|0:c;e=63-c|0;qa=0-(c>>>0>63)|0;break d}qa=0;e=64}g=e;e=g&31;if((g&63)>>>0>=32){c=0;i=f>>>e|0}else{c=f>>>e|0;i=((1<>>e}h=g+h|0;d=h<<4;f=H[d+26408>>2];e=d+26400|0;e:{if((f|0)!=(e|0)){d=Db(f,j,b);if(d){break a}d=H[f+4>>2];g=H[f+8>>2];H[d+8>>2]=g;H[g+4>>2]=d;H[f+8>>2]=e;H[f+4>>2]=H[e+4>>2];H[e+4>>2]=f;H[H[f+4>>2]+8>>2]=f;h=h+1|0;d=(c&1)<<31|i>>>1;c=c>>>1|0;break e}d=H[6859];l=27432,m=H[6858]&Ae(-2,-1,h),H[l>>2]=m;H[6859]=qa&d;d=i^1}if(c|d){continue}break}g=H[6858];e=H[6859]}c=Q(e);f=63-((c|0)==32?Q(g)+32|0:c)|0;f:{if(!(e|g)){c=0;break f}d=f<<4;c=H[d+26408>>2];if(!e&g>>>0<1073741824){break f}h=99;e=d+26400|0;if((e|0)==(c|0)){break f}while(1){if(!h){break f}d=Db(c,j,b);if(d){break a}h=h-1|0;c=H[c+8>>2];if((e|0)!=(c|0)){continue}break}}d=a>>>0>8;a=j;if(Bc((d?k:48)+b|0)){continue}break}if(!c){break b}a=(f<<4)+26400|0;if((a|0)==(c|0)){break b}while(1){d=Db(c,j,b);if(d){break a}c=H[c+8>>2];if((a|0)!=(c|0)){continue}break}}d=0}return d}function wd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+48>>2];if(e>>>0>=b>>>0){H[a+48>>2]=e-b;H[a+36>>2]=H[a+36>>2]+b;e=c+H[a+60>>2]|0;d=b+H[a+56>>2]|0;e=d>>>0>>0?e+1|0:e;H[a+56>>2]=d;H[a+60>>2]=e;qa=c;return b|0}if(I[a+68|0]&4){H[a+48>>2]=0;H[a+36>>2]=e+H[a+36>>2];g=H[a+60>>2];c=H[a+56>>2];b=c+e|0;H[a+56>>2]=b;H[a+60>>2]=b>>>0>>0?g+1|0:g;qa=e?0:-1;return(e?e:-1)|0}if(e){H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];h=b;f=e;b=b-e|0;c=c-(e>>>0>h>>>0)|0}a:{if((c|0)>0){h=1}else{h=!!b&(c|0)>=0}if(h){while(1){h=H[a+12>>2];e=c+g|0;i=b+f|0;e=H[a+60>>2]+(i>>>0>>0?e+1|0:e)|0;j=i;i=i+H[a+56>>2]|0;e=j>>>0>i>>>0?e+1|0:e;if((e|0)==(h|0)&i>>>0>K[a+8>>2]|e>>>0>h>>>0){Ba(d,4,15630,0);H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];b=g+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;d=H[a+8>>2];f=d-c|0;e=H[a+12>>2];g=e-((c>>>0>d>>>0)+b|0)|0;h=ra[H[a+28>>2]](d,e,H[a>>2])|0;i=H[a+68>>2];if(h){H[a+56>>2]=d;H[a+60>>2]=e}H[a+68>>2]=i|4;a=(c|0)==(d|0)&(b|0)==(e|0);b=a?-1:f;break a}e=ra[H[a+24>>2]](b,c,H[a>>2])|0;h=qa;i=h;if((e&i)==-1){Ba(d,4,15630,0);H[a+68>>2]=H[a+68>>2]|4;e=g+H[a+60>>2]|0;b=f+H[a+56>>2]|0;e=b>>>0>>0?e+1|0:e;H[a+56>>2]=b;H[a+60>>2]=e;a=!(g|f);b=a?-1:f;break a}g=g+i|0;f=e+f|0;g=f>>>0>>0?g+1|0:g;h=b;b=b-e|0;c=c-((e>>>0>h>>>0)+i|0)|0;if(!!b&(c|0)>=0|(c|0)>0){continue}break}}b=g+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;qa=g;return f|0}qa=a?-1:g;return b|0}function Ad(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=na-80|0;na=e;a:{if(c>>>0<=2){Ba(d,1,14478,0);break a}if(I[a+124|0]){Ba(d,4,11193,0);g=1;break a}g=1;Da(b,a+40|0,1);Da(b+1|0,a+52|0,1);Da(b+2|0,a+44|0,1);f=b+3|0;b:{c:{d:{e:{f:{h=H[a+40>>2];switch(h-1|0){case 0:break f;case 1:break e;default:break d}}if(c>>>0<=6){H[e+16>>2]=c;Ba(d,1,15155,e+16|0);g=0;break a}if(!((c|0)==7|H[a+48>>2]==14)){H[e+48>>2]=c;Ba(d,2,15155,e+48|0)}Da(f,a+48|0,4);if(H[a+48>>2]!=14){break b}f=Fa(36);if(!f){g=0;Ba(d,1,7993,0);break a}H[f>>2]=14;H[e+64>>2]=0;H[e+56>>2]=0;H[e+72>>2]=0;H[e+60>>2]=0;H[e+68>>2]=0;H[e+76>>2]=0;g=4470064;H[e+52>>2]=4470064;H[f+4>>2]=1145390592;g:{if((c|0)!=7){if((c|0)==35){Da(b+7|0,e+76|0,4);Da(b+11|0,e+72|0,4);Da(b+15|0,e+68|0,4);Da(b+19|0,e- -64|0,4);Da(b+23|0,e+60|0,4);Da(b+27|0,e+56|0,4);Da(b+31|0,e+52|0,4);H[f+4>>2]=0;g=H[e+52>>2];c=H[e+56>>2];d=H[e+64>>2];i=H[e+68>>2];j=H[e+76>>2];h=H[e+72>>2];b=H[e+60>>2];break g}H[e+32>>2]=c;Ba(d,2,15191,e+32|0)}c=0;d=0;h=0;b=0}H[f+24>>2]=b;H[f+16>>2]=i;H[f+8>>2]=j;H[f+32>>2]=g;H[f+28>>2]=c;H[f+20>>2]=d;H[f+12>>2]=h;H[a+112>>2]=0;H[a+108>>2]=f;break b}b=c-3|0;H[a+112>>2]=b;d=Ea(1,b);H[a+108>>2]=d;if(!d){break c}if((c|0)<=3){break b}c=0;while(1){Da(f,e+76|0,1);F[H[a+108>>2]+c|0]=H[e+76>>2];f=f+1|0;c=c+1|0;if((b|0)!=(c|0)){continue}break}break b}if(h>>>0<3){break a}H[e>>2]=h;Ba(d,4,15950,e);break a}g=0;H[a+112>>2]=0;break a}g=1;F[a+124|0]=1}na=e+80|0;return g|0}function Ja(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;h=H[a+48>>2];if(h>>>0>=c>>>0){if(c){B(b,H[a+36>>2],c)}H[a+36>>2]=H[a+36>>2]+c;H[a+48>>2]=H[a+48>>2]-c;b=H[a+60>>2];d=H[a+56>>2]+c|0;b=d>>>0>>0?b+1|0:b;H[a+56>>2]=d;H[a+60>>2]=b;return c}if(I[a+68|0]&4){if(h){B(b,H[a+36>>2],h)}b=H[a+48>>2];H[a+48>>2]=0;H[a+36>>2]=b+H[a+36>>2];g=H[a+60>>2];c=b;b=H[a+56>>2]+b|0;g=c>>>0>b>>>0?g+1|0:g;H[a+56>>2]=b;H[a+60>>2]=g;return h?h:-1}a:{if(h){if(h){B(b,H[a+36>>2],h)}i=H[a+32>>2];H[a+36>>2]=i;e=H[a+48>>2];H[a+48>>2]=0;f=H[a+60>>2];g=H[a+56>>2]+e|0;f=g>>>0>>0?f+1|0:f;H[a+56>>2]=g;H[a+60>>2]=f;c=c-e|0;b=b+e|0;break a}i=H[a+32>>2];H[a+36>>2]=i}b:{while(1){c:{e=H[a>>2];f=H[a+16>>2];g=H[a+64>>2];d:{if(g>>>0>c>>>0){f=ra[f|0](i,g,e)|0;H[a+48>>2]=f;if((f|0)==-1){break b}if(c>>>0>f>>>0){if(f){B(b,H[a+36>>2],f)}i=H[a+32>>2];H[a+36>>2]=i;e=H[a+48>>2];break d}if(c){B(b,H[a+36>>2],c)}H[a+36>>2]=H[a+36>>2]+c;H[a+48>>2]=H[a+48>>2]-c;b=H[a+60>>2];d=H[a+56>>2]+c|0;b=d>>>0>>0?b+1|0:b;H[a+56>>2]=d;H[a+60>>2]=b;return c+h|0}e=ra[f|0](b,c,e)|0;H[a+48>>2]=e;if((e|0)==-1){break b}if(c>>>0<=e>>>0){break c}i=H[a+32>>2];H[a+36>>2]=i;f=e}H[a+48>>2]=0;g=H[a+60>>2];j=H[a+56>>2]+e|0;g=j>>>0>>0?g+1|0:g;H[a+56>>2]=j;H[a+60>>2]=g;b=b+e|0;c=c-e|0;h=f+h|0;continue}break}H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];f=H[a+60>>2];b=H[a+56>>2]+e|0;f=b>>>0>>0?f+1|0:f;H[a+56>>2]=b;H[a+60>>2]=f;return e+h|0}Ba(d,4,15630,0);H[a+48>>2]=0;H[a+68>>2]=H[a+68>>2]|4;return h?h:-1}function Ua(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{if(!H[a+12>>2]){k=1;if(H[a+4>>2]>0|H[a+8>>2]>1){break b}break a}e=1;if(H[a+8>>2]>0){break b}if(H[a+4>>2]<2){break a}}b=H[a>>2];f=b+(e<<5)|0;g=H[a+16>>2];h=H[a+20>>2];if(g>>>0>>0){d=g;while(1){c=(d<<6)+f|0;L[c>>2]=L[c>>2]*O(1.2301740646362305);L[c+4>>2]=L[c+4>>2]*O(1.2301740646362305);L[c+8>>2]=L[c+8>>2]*O(1.2301740646362305);L[c+12>>2]=L[c+12>>2]*O(1.2301740646362305);L[c+16>>2]=L[c+16>>2]*O(1.2301740646362305);L[c+20>>2]=L[c+20>>2]*O(1.2301740646362305);L[c+24>>2]=L[c+24>>2]*O(1.2301740646362305);L[c+28>>2]=L[c+28>>2]*O(1.2301740646362305);d=d+1|0;if((h|0)!=(d|0)){continue}break}}i=b+(k<<5)|0;j=H[a+28>>2];c=H[a+24>>2];if(j>>>0>c>>>0){d=c;while(1){b=(d<<6)+i|0;L[b>>2]=L[b>>2]*O(1.625732421875);L[b+4>>2]=L[b+4>>2]*O(1.625732421875);L[b+8>>2]=L[b+8>>2]*O(1.625732421875);L[b+12>>2]=L[b+12>>2]*O(1.625732421875);L[b+16>>2]=L[b+16>>2]*O(1.625732421875);L[b+20>>2]=L[b+20>>2]*O(1.625732421875);L[b+24>>2]=L[b+24>>2]*O(1.625732421875);L[b+28>>2]=L[b+28>>2]*O(1.625732421875);d=d+1|0;if((j|0)!=(d|0)){continue}break}}b=f+32|0;d=H[a+8>>2];a=H[a+4>>2];e=a-e|0;e=(d|0)<(e|0)?d:e;nb(i,b,g,h,e,O(-.4435068666934967));l=i+32|0;d=d-k|0;a=(a|0)<(d|0)?a:d;nb(f,l,c,j,a,O(-.8829110860824585));nb(i,b,g,h,e,O(.05298011749982834));nb(f,l,c,j,a,O(1.5861343145370483))}}function ac(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=H[a+28>>2]+N(b,152)|0;c=H[e-144>>2]-H[e-152>>2]|0;d=H[e-140>>2]-H[e-148>>2]|0;f=d>>>0>=64?64:d;g=c>>>0>=64?64:c;a:{if(!(!c|!d|(!g|!f)|g>>>0>4294967295/(f>>>0)>>>2>>>0)){e=Ea(1,28);H[e+12>>2]=f;H[e+8>>2]=g;H[e+4>>2]=d;H[e>>2]=c;j=d;d=d+f|0;i=j>>>0>d>>>0;d=xe(d-1|0,i-!d|0,f,0);H[e+20>>2]=d;j=c;c=c+g|0;f=j>>>0>c>>>0;c=xe(c-1|0,f-!c|0,g,0);H[e+16>>2]=c;te(d,0,c);b:{if(qa){break b}c=Ea(4,N(c,d));H[e+24>>2]=c;if(!c){break b}break a}Ca(e)}e=0}if(!e){return 0}c:{if(b){while(1){q=N(p,152);g=q+H[a+28>>2]|0;c=H[g+24>>2];if(c){j=g+28|0;d=H[g+20>>2];f=H[g+16>>2];n=0;while(1){if(N(d,f)){i=N(n,36)+j|0;o=0;while(1){k=H[i+20>>2]+N(o,40)|0;c=H[k+20>>2];h=H[k+16>>2];if(N(c,h)){f=0;while(1){l=H[k+24>>2]+N(f,68)|0;r=H[l+60>>2];if(r){h=H[l+8>>2];d=h-H[i>>2]|0;m=H[i+16>>2];if(m&1){c=H[a+28>>2]+q|0;d=(H[c-144>>2]+d|0)-H[c-152>>2]|0}s=H[l+12>>2];c=s-H[i+4>>2]|0;if(m&2){m=H[a+28>>2]+q|0;c=(c+H[m-140>>2]|0)-H[m-148>>2]|0}h=H[l+16>>2]-h|0;if(!_a(e,d,c,d+h|0,(H[l+20>>2]-s|0)+c|0,r,1,h)){break c}h=H[k+16>>2];c=H[k+20>>2]}f=f+1|0;if(f>>>0>>0){continue}break}f=H[g+16>>2];d=H[g+20>>2]}o=o+1|0;if(o>>>0>>0){continue}break}c=H[g+24>>2]}n=n+1|0;if(n>>>0>>0){continue}break}}p=p+1|0;if((p|0)!=(b|0)){continue}break}}return e}Wa(e);return 0}function be(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=na-16|0;na=h;if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}a:{if(c>>>0<=1){Ba(d,1,4132,0);a=0;break a}Da(b,h+12|0,2);b:{if(H[h+12>>2]){Ba(d,2,3608,0);break b}if(c>>>0<=6){Ba(d,1,4132,0);a=0;break a}Da(b+2|0,h+12|0,2);g=H[e+5616>>2];k=I[h+12|0];f=H[e+5620>>2];c:{d:{if(!f){break d}a=g;while(1){if(H[a+8>>2]!=(k|0)){a=a+20|0;i=i+1|0;if((i|0)!=(f|0)){continue}break d}break}if((f|0)!=(i|0)){break c}}if(H[e+5624>>2]==(f|0)){a=f+10|0;H[e+5624>>2]=a;a=Ha(g,N(a,20));g=H[e+5616>>2];if(!a){Ca(g);H[e+5624>>2]=0;H[e+5616>>2]=0;H[e+5620>>2]=0;Ba(d,1,4158,0);a=0;break a}e:{if((a|0)==(g|0)){break e}l=H[e+5632>>2];if(!l){break e}m=H[e+5628>>2];i=0;while(1){f=N(i,20)+m|0;j=H[f+8>>2];if(j){H[f+8>>2]=a+(j-g|0)}j=H[f+12>>2];if(j){H[f+12>>2]=a+(j-g|0)}i=i+1|0;if((l|0)!=(i|0)){continue}break}}H[e+5616>>2]=a;g=H[e+5620>>2];f=N(H[e+5624>>2]-g|0,20);if(f){y(a+N(g,20)|0,0,f)}f=H[e+5620>>2];g=H[e+5616>>2]}H[e+5620>>2]=f+1;a=N(f,20)+g|0}e=H[a+12>>2];if(e){Ca(e);H[a+12>>2]=0;H[a+16>>2]=0}H[a+8>>2]=k;e=H[h+12>>2];H[a>>2]=e>>>10&3;H[a+4>>2]=e>>>8&3;Da(b+4|0,h+12|0,2);if(H[h+12>>2]){Ba(d,2,3023,0);break b}c=c-6|0;e=Fa(c);H[a+12>>2]=e;if(!e){Ba(d,1,4132,0);a=0;break a}if(c){B(e,b+6|0,c)}H[a+16>>2]=c}a=1}na=h+16|0;return a|0}function Vb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(a){b=H[a+20>>2];if(b){g=H[b>>2];if(g){d=H[g+20>>2];if(H[g+16>>2]){i=F[a+40|0]&1?16:17;while(1){c=H[d+28>>2];if(c){b=H[d+32>>2];l=(b>>>0)/152|0;j=0;if(b>>>0>=152){while(1){b=H[c+48>>2];if(b){f=H[c+52>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){$a(H[b+32>>2]);H[b+32>>2]=0;$a(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+48>>2]}Ca(b);H[c+48>>2]=0}b=H[c+84>>2];if(b){f=H[c+88>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){$a(H[b+32>>2]);H[b+32>>2]=0;$a(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+84>>2]}Ca(b);H[c+84>>2]=0}b=H[c+120>>2];if(b){f=H[c+124>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){$a(H[b+32>>2]);H[b+32>>2]=0;$a(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+120>>2]}Ca(b);H[c+120>>2]=0}c=c+152|0;j=j+1|0;if((l|0)!=(j|0)){continue}break}c=H[d+28>>2]}Ca(c);H[d+28>>2]=0}a:{if(!H[d+40>>2]){break a}b=H[d+36>>2];if(!b){break a}Ca(b);H[d+44>>2]=0;H[d+48>>2]=0;H[d+36>>2]=0;H[d+40>>2]=0}Ca(H[d+52>>2]);d=d+76|0;k=k+1|0;if(k>>>0>2]){continue}break}d=H[g+20>>2]}Ca(d);H[g+20>>2]=0;Ca(H[H[a+20>>2]>>2]);b=H[a+20>>2];H[b>>2]=0}Ca(b);H[a+20>>2]=0}Ca(H[a+68>>2]);Ca(a)}}function bc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=H[a+8>>2];f=c+H[a+4>>2]|0;a:{if(!H[a+12>>2]){if((f|0)<2){break a}h=(c<<2)+b|0;d=H[h>>2];e=H[b>>2]-(d+1>>1)|0;i=H[a>>2];b:{if(f>>>0<4){c=d;break b}k=(f-4>>>1|0)+1|0;a=1;while(1){c=a<<2;m=H[c+b>>2];c=H[c+h>>2];l=i+(g<<2)|0;H[l>>2]=e;j=e;e=m-((c+d|0)+2>>2)|0;H[l+4>>2]=(j+e>>1)+d;g=g+2|0;j=(a|0)!=(k|0);d=c;a=a+1|0;if(j){continue}break}}H[i+(g<<2)>>2]=e;if(f&1){d=f-1|0;a=H[(d<<1)+b>>2]-(c+1>>1)|0;H[i+(d<<2)>>2]=a;e=a+e>>1;d=-8}else{d=-4}a=f<<2;H[d+(a+i|0)>>2]=c+e;if(!a){break a}B(b,i,a);return}c:{switch(f-1|0){case 0:H[b>>2]=H[b>>2]/2;return;case 1:a=H[a>>2];c=(c<<2)+b|0;d=H[b>>2]-(H[c>>2]+1>>1)|0;H[a+4>>2]=d;H[a>>2]=d+H[c>>2];c=H[a+4>>2];H[b>>2]=H[a>>2];H[b+4>>2]=c;return;default:break c}}if((f|0)<3){break a}h=H[a>>2];k=(c<<2)+b|0;d=H[k+4>>2];a=H[k>>2];e=H[b>>2]-((d+a|0)+2>>2)|0;H[h>>2]=e+a;g=1;m=f-2|0;l=f&1;a=!l;d:{if(m-a>>>0<2){c=d;break d}o=((f-a|0)-4>>>1|0)+1|0;a=1;while(1){p=H[(a<<2)+b>>2];j=a+1|0;c=H[k+(j<<2)>>2];n=h+(g<<2)|0;H[n>>2]=e;i=e;e=p-((c+d|0)+2>>2)|0;H[n+4>>2]=(i+e>>1)+d;g=g+2|0;i=(a|0)!=(o|0);d=c;a=j;if(i){continue}break}}H[h+(g<<2)>>2]=e;e:{if(!l){g=H[((f<<1)+b|0)-4>>2]-(c+1>>1)|0;H[h+(m<<2)>>2]=(g+e>>1)+c;break e}g=c+e|0}a=f<<2;H[(a+h|0)-4>>2]=g;if(!a){break a}B(b,h,a)}}function Tb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+24>>2];j=H[e+16>>2];if(!j){return 0}f=H[e+24>>2];e=H[H[H[a+20>>2]>>2]+20>>2];a:{b:{if(!b){b=0;while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-140>>2];g=H[a-144>>2]-H[a-152>>2]|0;a=H[a-148>>2];h=d-a|0;te(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);te(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}break b}b=0;if(!H[a+64>>2]){while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-4>>2];g=H[a-8>>2]-H[a-16>>2]|0;a=H[a-12>>2];h=d-a|0;te(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);te(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}break b}while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-140>>2];g=H[a-144>>2]-H[a-152>>2]|0;a=H[a-148>>2];h=d-a|0;te(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);te(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}}return a}return-1}function Jb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=na-256|0;na=d;if(a){Oa(1806,17,c);H[d+240>>2]=H[a>>2];Ga(c,2348,d+240|0);H[d+224>>2]=H[a+4>>2];Ga(c,2361,d+224|0);H[d+208>>2]=H[a+8>>2];Ga(c,7260,d+208|0);H[d+192>>2]=H[a+16>>2];Ga(c,2319,d+192|0);if((b|0)>0){while(1){e=H[a+5584>>2];H[d+176>>2]=h;Ga(c,1844,d+176|0);e=e+N(h,1080)|0;H[d+160>>2]=H[e>>2];Ga(c,2347,d+160|0);H[d+144>>2]=H[e+4>>2];Ga(c,7374,d+144|0);H[d+128>>2]=H[e+8>>2];Ga(c,7162,d+128|0);H[d+112>>2]=H[e+12>>2];Ga(c,7178,d+112|0);H[d+96>>2]=H[e+16>>2];Ga(c,2330,d+96|0);H[d+80>>2]=H[e+20>>2];Ga(c,7440,d+80|0);Oa(1567,23,c);if(H[e+4>>2]){i=e+944|0;j=e+812|0;f=0;while(1){g=f<<2;k=H[j+g>>2];H[d+68>>2]=H[i+g>>2];H[d+64>>2]=k;Ga(c,1693,d- -64|0);f=f+1|0;if(f>>>0>2]){continue}break}}Cc(c);H[d+48>>2]=H[e+24>>2];Ga(c,7194,d+48|0);H[d+32>>2]=H[e+804>>2];Ga(c,7243,d+32|0);i=1;Oa(1591,20,c);a:{if(H[e+24>>2]!=1){f=H[e+4>>2];if((f|0)<=0){break a}i=N(f,3)-2|0}j=e+28|0;f=0;while(1){g=j+(f<<3)|0;l=d,m=Ae(H[g>>2],H[g+4>>2],32),H[l+16>>2]=m;H[d+20>>2]=qa;Ga(c,1693,d+16|0);f=f+1|0;if((i|0)!=(f|0)){continue}break}}Cc(c);H[d>>2]=H[e+808>>2];Ga(c,7226,d);Oa(1707,5,c);h=h+1|0;if((h|0)!=(b|0)){continue}break}}Oa(1708,4,c)}na=d+256|0}function ue(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{e=b;if(e){if(!c){break j}if(!d){break i}e=Q(d)-Q(e)|0;if(e>>>0<=31){break h}break b}if((d|0)==1|d>>>0>1){break b}b=(a>>>0)/(c>>>0)|0;oa=a-N(b,c)|0;pa=0;qa=0;return b}if(!a){break g}if(!d){break f}f=d-1|0;if(f&d){break f}oa=a;pa=e&f;a=e>>>ve(d)|0;qa=0;return a}f=c-1|0;if(!(f&c)){break e}k=(Q(c)+33|0)-Q(e)|0;g=0-k|0;break c}k=e+1|0;g=63-e|0;break c}oa=0;a=(e>>>0)/(d>>>0)|0;pa=e-N(a,d)|0;qa=0;return a}e=Q(d)-Q(e)|0;if(e>>>0<31){break d}break b}oa=a&f;pa=0;if((c|0)==1){break a}c=ve(c);d=c&31;if((c&63)>>>0>=32){e=0;a=b>>>d|0}else{e=b>>>d|0;a=((1<>>d}qa=e;return a}k=e+1|0;g=63-e|0}f=a;e=k&63;h=e&31;if((e&63)>>>0>=32){e=0;f=b>>>h|0}else{e=b>>>h|0;f=((1<>>h}h=g&63;g=a;i=h&31;if((h&63)>>>0>=32){j=a<>>32-i|b<>>31;f=f<<1|b>>>31;l=e;i=g-(e+(f>>>0>h>>>0)|0)|0;m=i>>31;j=m;e=f;i=c&j;f=e-i|0;e=l-((d&j)+(e>>>0>>0)|0)|0;j=b<<1|a>>>31;a=n|a<<1;b=j|o;l=m&1;n=l;k=k-1|0;if(k){continue}break}}oa=f;pa=e;j=b<<1|a>>>31;a=l|a<<1;qa=j|o;return a}oa=a;pa=b;a=0;b=0}qa=b;return a}function Lc(a,b,c,d,e){var f=0,g=0,h=0,i=0;h=na-16|0;na=h;if(H[a+8>>2]==16){a=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{a=H[a+12>>2]}f=H[d>>2];a:{if(!f){d=0;Ba(e,1,2642,0);break a}a=H[a+5584>>2];H[d>>2]=f-1;Da(c,h+12|0,1);g=N(b,1080)+a|0;a=H[h+12>>2];H[g+804>>2]=a>>>5;b=a&31;H[g+24>>2]=b;a=c+1|0;b:{c:{d:{e:{f:{switch(b|0){case 0:f=H[d>>2];break e;case 1:break d;default:break f}}f=H[d>>2]>>>1|0}if(f>>>0>=98){H[h+4>>2]=97;H[h+8>>2]=97;H[h>>2]=f;Ba(e,2,16056,h);b=H[g+24>>2]}if(b){b=f;if(b){break d}a=0;break c}if(f){b=g+28|0;c=0;while(1){Da(a,h+12|0,1);if(c>>>0<=96){e=H[h+12>>2];i=b+(c<<3)|0;H[i+4>>2]=0;H[i>>2]=e>>>3}a=a+1|0;c=c+1|0;if((f|0)!=(c|0)){continue}break}}a=H[d>>2];if(a>>>0>>0){d=0;break a}a=a-f|0;break b}e=g+28|0;c=0;while(1){Da(a,h+12|0,2);if(c>>>0<=96){f=e+(c<<3)|0;i=H[h+12>>2];H[f+4>>2]=i&2047;H[f>>2]=i>>>11}a=a+2|0;c=c+1|0;if((c|0)!=(b|0)){continue}break}a=b<<1}b=H[d>>2];if(a>>>0>b>>>0){d=0;break a}a=b-a|0}H[d>>2]=a;d=1;if(H[g+24>>2]!=1){break a}f=g+28|0;c=H[g+32>>2];e=H[g+28>>2];a=1;while(1){b=f+(a<<3)|0;H[b+12>>2]=c;H[b+4>>2]=c;g=e-((a>>>0)/3|0)|0;H[b+8>>2]=(g|0)>0?g:0;g=b;b=e-((a-1>>>0)/3|0)|0;H[g>>2]=(b|0)>0?b:0;a=a+2|0;if((a|0)!=97){continue}break}}na=h+16|0;return d}function he(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=na-32|0;na=f;g=1;a:{if(c>>>0<=1){g=0;Ba(d,1,10062,0);break a}if(H[a+76>>2]){break a}Da(b,f+28|0,1);Da(b+1|0,f+24|0,1);e=H[f+24>>2];i=e>>>4&3;if((i|0)==3){H[a+76>>2]=1;Ba(d,2,11558,0);break a}c=c-2|0;j=(e>>>5&2)+2|0;h=i+j|0;e=(c>>>0)/(h>>>0)|0;if((c|0)!=(N(e,h)|0)){H[a+76>>2]=1;Ba(d,2,11139,0);break a}if(c>>>0>>0){break a}b:{c=H[a+68>>2];if(c>>>0<=(e^-1)>>>0){c=c+e|0;if(c>>>0<536870912){break b}}H[a+76>>2]=1;Ba(d,2,9400,0);break a}h=Ha(H[a+72>>2],c<<3);if(!h){H[a+76>>2]=1;Ba(d,2,9443,0);break a}c=b+2|0;H[a+72>>2]=h;c:{if(i){k=e>>>0<=1?1:e;e=0;while(1){Da(c,f+20|0,i);b=H[f+20>>2];if(b>>>0>=N(H[a+132>>2],H[a+128>>2])>>>0){break c}b=c+i|0;Da(b,f+16|0,j);c=H[a+68>>2];g=h+(c<<3)|0;G[g>>1]=H[f+20>>2];H[g+4>>2]=H[f+16>>2];g=1;H[a+68>>2]=c+1;c=b+j|0;e=e+1|0;if((k|0)!=(e|0)){continue}break}break a}i=e>>>0<=1?1:e;b=H[a+68>>2];e=0;while(1){H[f+20>>2]=b;if(N(H[a+132>>2],H[a+128>>2])>>>0<=b>>>0){break c}Da(c,f+16|0,j);k=H[a+68>>2];g=h+(k<<3)|0;G[g>>1]=b;H[g+4>>2]=H[f+16>>2];g=1;b=k+1|0;H[a+68>>2]=b;c=c+j|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}break a}H[a+76>>2]=1;H[f>>2]=b;Ba(d,2,7799,f)}na=f+32|0;return g|0}function Cd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=na-16|0;na=h;a:{if(!(I[a+100|0]&2)){Ba(d,1,11356,0);a=0;break a}H[a+104>>2]=0;b:{c:{d:{if(c){while(1){if(c>>>0<=7){Ba(d,1,3403,0);break b}g=h+12|0;Da(b,g,4);e=H[h+12>>2];Da(b+4|0,g,4);f=8;g=H[h+12>>2];e:{f:{g:{switch(e|0){case 1:if(c>>>0<16){e=3443;break c}Da(b+8|0,h+8|0,4);if(H[h+8>>2]){e=8449;break c}Da(b+12|0,h+12|0,4);e=H[h+12>>2];if(e){break f}e=3268;break c;case 0:break g;default:break e}}Ba(d,1,3268,0);break b}f=16}if(e>>>0>>0){Ba(d,1,9148,0);break b}if(c>>>0>>0){Ba(d,1,9076,0);a=0;break a}h:{i:{j=b+f|0;k=e-f|0;j:{k:{l:{m:{if((g|0)<=1668246641){if((g|0)==1651532643){break m}if((g|0)==1667523942){break k}if((g|0)!=1668112752){break i}f=25296;break j}if((g|0)==1885564018){break l}f=25264;if((g|0)==1768449138){break j}if((g|0)!=1668246642){break i}f=25272;break j}f=25280;break j}f=25288;break j}f=25304}if(ra[H[f+4>>2]](a,j,k,d)|0){break h}a=0;break a}H[a+104>>2]=H[a+104>>2]|2147483647}i=(g|0)==1768449138?1:i;b=b+e|0;c=c-e|0;if(c){continue}break}if(i){break d}}Ba(d,1,8976,0);a=0;break a}F[a+132|0]=1;H[a+100>>2]=H[a+100>>2]|4;a=1;break a}Ba(d,1,e,0)}Ba(d,1,1968,0);a=0}na=h+16|0;return a|0}function Ld(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(!Xa(H[b+8>>2],54,d)){return 0}j=H[b+4>>2];e=H[j>>2];h=H[j+8>>2];a:{if(e){f=1;k=e&1;if((e|0)==1){e=0}else{e=e&-2;while(1){i=0;b:{if(!f){break b}i=0;if(!(ra[H[h>>2]](b,a,d)|0)){break b}i=(ra[H[h+4>>2]](b,a,d)|0)!=0}f=i;h=h+8|0;g=g+2|0;if((e|0)!=(g|0)){continue}break}e=!f}f=k?0:f;if(!(e|!k)){f=(ra[H[h>>2]](b,a,d)|0)!=0}Qa(j);if(f){break a}return 0}Qa(j)}j=H[b+8>>2];e=H[j>>2];h=H[j+8>>2];c:{if(e){f=1;k=e&1;if((e|0)==1){e=0}else{e=e&-2;g=0;while(1){i=0;d:{if(!f){break d}i=0;if(!(ra[H[h>>2]](b,a,d)|0)){break d}i=(ra[H[h+4>>2]](b,a,d)|0)!=0}f=i;h=h+8|0;g=g+2|0;if((e|0)!=(g|0)){continue}break}e=!f}f=k?0:f;if(!(e|!k)){f=(ra[H[h>>2]](b,a,d)|0)!=0}Qa(j);if(f){break c}return 0}Qa(j)}if(!I[b+132|0]){Ba(d,1,11696,0);return 0}if(!I[b+133|0]){Ba(d,1,11667,0);return 0}d=Ob(a,H[b>>2],c,d);e:{if(!c|!d){break e}a=H[c>>2];if(!a){break e}g=1;f:{g:{switch(H[b+48>>2]-12|0){case 5:g=2;break f;case 6:g=3;break f;case 12:g=4;break f;case 0:g=5;break f;case 4:break f;default:break g}}g=-1}H[a+20>>2]=g;c=H[b+108>>2];if(!c){break e}H[a+28>>2]=c;H[a+32>>2]=H[b+112>>2];H[b+108>>2]=0}return d|0}function Bc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0;b=H[6518];c=a+7&-8;a=c+7|0;d=a>>>0<7?1:d;e=a&-8;a=e+b|0;a:{b:{if(!(a>>>0>>0?d+1|0:d)){if(a>>>0<=sa()<<16>>>0){break b}if(ja(a|0)|0){break b}}H[6597]=48;b=-1;break a}H[6518]=a}d=b;if((d|0)!=-1){a=d+c|0;H[a-4>>2]=16;f=a-16|0;H[f>>2]=16;b=H[6856];if(b){e=H[b+8>>2]}else{e=0}c:{d:{if((e|0)==(d|0)){e=H[d-4>>2]&-2;g=d-e|0;h=H[g-4>>2];H[b+8>>2]=a;b=h&-2;a=g-b|0;if(F[(a+H[a>>2]|0)-4|0]&1){f=H[a+4>>2];g=H[a+8>>2];H[f+8>>2]=g;H[g+4>>2]=f;b=(b+(c+e|0)|0)-16|0;H[a>>2]=b;break c}a=d-16|0;break d}H[d>>2]=16;H[d+8>>2]=a;H[d+4>>2]=b;H[d+12>>2]=16;H[6856]=d;a=d+16|0}b=f-a|0;H[a>>2]=b}H[((b&-4)+a|0)-4>>2]=b|1;c=H[a>>2]-8|0;e:{if(c>>>0<=127){b=(c>>>3|0)-1|0;break e}e=Q(c);b=((c>>>29-e^4)-(e<<2)|0)+110|0;if(c>>>0<=4095){break e}b=((c>>>30-e^2)-(e<<1)|0)+71|0;b=b>>>0>=63?63:b}c=b<<4;H[a+4>>2]=c+26400;c=c+26408|0;H[a+8>>2]=H[c>>2];H[c>>2]=a;H[H[a+8>>2]+4>>2]=a;c=H[6859];a=b&31;if((b&63)>>>0>=32){b=1<>>32-a}H[6858]=e|H[6858];H[6859]=b|c}return(d|0)!=-1}function Fc(a,b){var c=0,d=0,e=0,f=0,g=0;H[b>>2]=H[a>>2];H[b+4>>2]=H[a+4>>2];H[b+8>>2]=H[a+8>>2];H[b+12>>2]=H[a+12>>2];c=H[b+24>>2];if(c){d=H[b+16>>2];if(d){c=0;while(1){f=H[(H[b+24>>2]+N(c,52)|0)+44>>2];if(f){Ca(f);d=H[b+16>>2]}c=c+1|0;if(d>>>0>c>>>0){continue}break}c=H[b+24>>2]}Ca(c);H[b+24>>2]=0}c=H[a+16>>2];H[b+16>>2]=c;c=Fa(N(c,52));H[b+24>>2]=c;if(c){if(H[b+16>>2]){f=0;while(1){g=N(f,52);c=g+c|0;d=H[a+24>>2]+g|0;e=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=e;H[c+48>>2]=H[d+48>>2];e=H[d+44>>2];H[c+40>>2]=H[d+40>>2];H[c+44>>2]=e;e=H[d+36>>2];H[c+32>>2]=H[d+32>>2];H[c+36>>2]=e;e=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;c=H[b+24>>2];H[(g+c|0)+44>>2]=0;f=f+1|0;if(f>>>0>2]){continue}break}}H[b+20>>2]=H[a+20>>2];c=H[a+32>>2];H[b+32>>2]=c;a:{if(c){c=Fa(c);H[b+28>>2]=c;if(!c){H[b+28>>2]=0;H[b+32>>2]=0;return}b=H[a+32>>2];if(!b){break a}B(c,H[a+28>>2],b);return}H[b+28>>2]=0}return}H[b+16>>2]=0;H[b+24>>2]=0}function Ob(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=Gb();H[b+96>>2]=f;a:{b:{if(!f){break b}c:{if(Xa(H[b+220>>2],18,d)){if(Xa(H[b+220>>2],19,d)){break c}}break a}i=H[b+220>>2];e=H[i>>2];g=H[i+8>>2];d:{if(e){f=1;k=e&1;if((e|0)==1){e=0}else{e=e&-2;while(1){h=0;e:{if(!f){break e}h=0;if(!(ra[H[g>>2]](b,a,d)|0)){break e}h=(ra[H[g+4>>2]](b,a,d)|0)!=0}f=h;g=g+8|0;j=j+2|0;if((e|0)!=(j|0)){continue}break}e=!f}f=k?0:f;if(!(e|!k)){f=(ra[H[g>>2]](b,a,d)|0)!=0}Qa(i);if(f){break d}break a}Qa(i)}f:{if(Xa(H[b+216>>2],20,d)){if(Xa(H[b+216>>2],21,d)){break f}}break a}i=H[b+216>>2];e=H[i>>2];g=H[i+8>>2];g:{if(e){f=1;k=e&1;if((e|0)==1){e=0}else{e=e&-2;j=0;while(1){h=0;h:{if(!f){break h}h=0;if(!(ra[H[g>>2]](b,a,d)|0)){break h}h=(ra[H[g+4>>2]](b,a,d)|0)!=0}f=h;g=g+8|0;j=j+2|0;if((e|0)!=(j|0)){continue}break}e=!f}f=k?0:f;if(!(e|!k)){f=(ra[H[g>>2]](b,a,d)|0)!=0}Qa(i);if(f){break g}break a}Qa(i)}a=Gb();H[c>>2]=a;if(!a){break b}Fc(H[b+96>>2],a);l=1}return l|0}Va(H[b+96>>2]);H[b+96>>2]=0;return 0}function nb(a,b,c,d,e,f){var g=0,h=O(0),i=0,j=O(0);g=(c<<6)+b|0;a=c?g+-64|0:a;i=d>>>0>>0?d:e;a:{if(i>>>0<=c>>>0){b=a;break a}h=L[a>>2];while(1){b=g;g=b-32|0;j=h;h=L[b>>2];L[g>>2]=O(O(j+h)*f)+L[g>>2];g=b-28|0;L[g>>2]=O(O(L[a+4>>2]+L[b+4>>2])*f)+L[g>>2];g=b-24|0;L[g>>2]=O(O(L[a+8>>2]+L[b+8>>2])*f)+L[g>>2];g=b-20|0;L[g>>2]=O(O(L[a+12>>2]+L[b+12>>2])*f)+L[g>>2];g=b-16|0;L[g>>2]=O(O(L[a+16>>2]+L[b+16>>2])*f)+L[g>>2];g=b-12|0;L[g>>2]=O(O(L[a+20>>2]+L[b+20>>2])*f)+L[g>>2];g=b-8|0;L[g>>2]=O(O(L[a+24>>2]+L[b+24>>2])*f)+L[g>>2];g=b-4|0;L[g>>2]=O(O(L[a+28>>2]+L[b+28>>2])*f)+L[g>>2];g=b- -64|0;a=b;c=c+1|0;if((i|0)!=(c|0)){continue}break}}if(d>>>0>e>>>0){a=g-32|0;f=O(f+f);L[a>>2]=O(L[b>>2]*f)+L[a>>2];a=g-28|0;L[a>>2]=O(L[b+4>>2]*f)+L[a>>2];a=g-24|0;L[a>>2]=O(L[b+8>>2]*f)+L[a>>2];a=g-20|0;L[a>>2]=O(L[b+12>>2]*f)+L[a>>2];a=g-16|0;L[a>>2]=O(L[b+16>>2]*f)+L[a>>2];a=g-12|0;L[a>>2]=O(L[b+20>>2]*f)+L[a>>2];a=g-8|0;L[a>>2]=O(L[b+24>>2]*f)+L[a>>2];a=g-4|0;L[a>>2]=O(L[b+28>>2]*f)+L[a>>2]}}function yd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=na-16|0;na=f;a:{if(H[a+120>>2]|c>>>0<3){break a}Da(b,f+12|0,2);k=J[f+12>>1];if(k-1025>>>0<=4294966271){H[f>>2]=k;Ba(d,1,3526,f);break a}Da(b+2|0,f+12|0,1);i=J[f+12>>1];if(!i){Ba(d,1,3174,0);break a}if(i+3>>>0>c>>>0){break a}h=Fa(N(i,k)<<2);if(!h){break a}j=Fa(i);if(!j){Ca(h);break a}l=Fa(i);if(!l){Ca(h);Ca(j);break a}g=Fa(20);if(!g){Ca(h);Ca(j);Ca(l);break a}d=b+3|0;H[g+8>>2]=j;H[g+4>>2]=l;G[g+16>>1]=k;H[g>>2]=h;m=H[f+12>>2];H[g+12>>2]=0;F[g+18|0]=m;H[a+120>>2]=g;while(1){Da(d,f+12|0,1);F[e+j|0]=(I[f+12|0]&127)+1;F[e+l|0]=(H[f+12>>2]&128)>>>7;d=d+1|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}g=0;while(1){e=0;a=0;while(1){e=I[e+j|0]+7>>>3|0;e=e>>>0>=4?4:e;if((e+(d-b|0)|0)>(c|0)){e=0;break a}Da(d,f+12|0,e);H[h>>2]=H[f+12>>2];h=h+4|0;d=d+e|0;a=a+1|0;e=a&65535;if(i>>>0>e>>>0){continue}break}e=1;g=g+1|0;if((g&65535)>>>0>>0){continue}break}}na=f+16|0;return e|0}function ad(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if(K[a+44>>2]>=8){e=H[a+36>>2];n=e<<5;o=N(e,28);p=N(e,24);q=N(e,20);r=e<<4;i=N(e,12);j=e<<3;g=H[a+40>>2];k=8;while(1){Ab(a,g,H[a+36>>2],8);Ua(a);h=H[a+32>>2];if(h){f=H[a>>2];b=0;if((h|0)!=1){s=h&-2;l=0;while(1){c=(b<<2)+g|0;d=f+(b<<5)|0;L[c>>2]=L[d>>2];m=e<<2;L[c+m>>2]=L[d+4>>2];L[c+j>>2]=L[d+8>>2];L[c+i>>2]=L[d+12>>2];d=b|1;c=(d<<2)+g|0;d=f+(d<<5)|0;L[c>>2]=L[d>>2];L[c+m>>2]=L[d+4>>2];L[c+j>>2]=L[d+8>>2];L[c+i>>2]=L[d+12>>2];b=b+2|0;l=l+2|0;if((s|0)!=(l|0)){continue}break}}if(h&1){c=(b<<2)+g|0;b=f+(b<<5)|0;L[c>>2]=L[b>>2];L[c+(e<<2)>>2]=L[b+4>>2];L[c+j>>2]=L[b+8>>2];L[c+i>>2]=L[b+12>>2]}d=H[a>>2];b=0;while(1){f=(b<<2)+g|0;c=d+(b<<5)|0;L[f+r>>2]=L[c+16>>2];L[f+q>>2]=L[c+20>>2];L[f+p>>2]=L[c+24>>2];L[f+o>>2]=L[c+28>>2];b=b+1|0;if((h|0)!=(b|0)){continue}break}}g=g+n|0;k=k+8|0;if(k>>>0<=K[a+44>>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function qd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=-1;e=-1;if(!(I[a+68|0]&8)){f=H[a+32>>2];H[a+36>>2]=f;a:{b:{c:{e=H[a+48>>2];if(e){while(1){e=ra[H[a+20>>2]](f,e,H[a>>2])|0;if((e|0)==-1){break c}f=e+H[a+36>>2]|0;H[a+36>>2]=f;e=H[a+48>>2]-e|0;H[a+48>>2]=e;if(e){continue}break}f=H[a+32>>2]}H[a+36>>2]=f;if(!!b&(c|0)>=0|(c|0)>0){break b}f=0;e=0;break a}H[a+68>>2]=H[a+68>>2]|8;Ba(d,4,15604,0);H[a+48>>2]=0;H[a+68>>2]=H[a+68>>2]|8;qa=-1;return-1}f=0;e=0;while(1){g=ra[H[a+24>>2]](b,c,H[a>>2])|0;h=qa;i=h;if((g&h)==-1){Ba(d,4,15589,0);H[a+68>>2]=H[a+68>>2]|8;b=e+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;a=!(e|f);b=a?-1:f;qa=a?-1:e;return b|0}e=e+i|0;f=f+g|0;e=f>>>0>>0?e+1|0:e;h=b;b=b-g|0;c=c-(i+(g>>>0>h>>>0)|0)|0;if(!!b&(c|0)>=0|(c|0)>0){continue}break}}b=e+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b}qa=e;return f|0}function zc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=a;a:{if(b&3){while(1){c=I[b|0];if(!c|(c|0)==61){break a}b=b+1|0;if(b&3){continue}break}}b:{c:{d=H[b>>2];if(((d|16843008-d)&-2139062144)!=-2139062144){break c}while(1){c=d^1027423549;if(((16843008-c|c)&-2139062144)!=-2139062144){break c}d=H[b+4>>2];c=b+4|0;b=c;if(((16843008-d|d)&-2139062144)==-2139062144){continue}break}break b}c=b}while(1){b=c;d=I[b|0];if(!d){break a}c=b+1|0;if((d|0)!=61){continue}break}}if((a|0)==(b|0)){return 0}g=b-a|0;d:{if(I[g+a|0]){break d}f=H[6860];if(!f){break d}b=H[f>>2];if(!b){break d}while(1){e:{d=a;c=b;h=g;e=0;f:{if(!g){break f}e=I[d|0];if(e){g:{while(1){i=I[c|0];if((i|0)!=(e|0)|!i){break g}h=h-1|0;if(!h){break g}c=c+1|0;e=I[d+1|0];d=d+1|0;if(e){continue}break}e=0}}else{e=0}e=e-I[c|0]|0}if(!e){b=b+g|0;if(I[b|0]==61){break e}}b=H[f+4>>2];f=f+4|0;if(b){continue}break d}break}j=b+1|0}return j}function de(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=na-16|0;na=g;a:{if(c>>>0<=1){Ba(d,1,3983,0);a=0;break a}if(F[a+212|0]&1){Ba(d,1,12668,0);a=0;break a}a=H[a+180>>2]+N(H[a+228>>2],5644)|0;F[a+5640|0]=I[a+5640|0]|2;Da(b,g+12|0,1);e=H[a+5164>>2];b:{if(!e){f=H[g+12>>2]+1|0;e=Ea(f,8);H[a+5164>>2]=e;if(!e){Ba(d,1,4009,0);a=0;break a}H[a+5160>>2]=f;break b}f=H[g+12>>2];if(f>>>0>2]){break b}h=e;e=f+1|0;f=Ha(h,e<<3);if(!f){Ba(d,1,4009,0);a=0;break a}H[a+5164>>2]=f;h=H[a+5160>>2];i=e-h<<3;if(i){y(f+(h<<3)|0,0,i)}H[a+5160>>2]=e;e=H[a+5164>>2]}h=e;e=H[g+12>>2];if(H[h+(e<<3)>>2]){H[g>>2]=e;Ba(d,1,7063,g);a=0;break a}c=c-1|0;e=Fa(c);a=H[a+5164>>2];f=a+(H[g+12>>2]<<3)|0;H[f>>2]=e;if(!e){Ba(d,1,4009,0);a=0;break a}H[f+4>>2]=c;if(c){B(H[a+(H[g+12>>2]<<3)>>2],b+1|0,c)}a=1}na=g+16|0;return a|0}function Db(a,b,c){var d=0,e=0,f=0,g=0;e=a+4|0;d=(e+b|0)-1&0-b;b=H[a>>2];if(d+c>>>0<=(b+a|0)-4>>>0){f=H[a+4>>2];g=H[a+8>>2];H[f+8>>2]=g;H[g+4>>2]=f;if((d|0)!=(e|0)){d=d-e|0;f=a-(H[a-4>>2]&-2)|0;e=d+H[f>>2]|0;H[f>>2]=e;H[(f+(e&-4)|0)-4>>2]=e;a=a+d|0;b=b-d|0;H[a>>2]=b}a:{if(c+24>>>0<=b>>>0){e=a+c|0;b=(b-c|0)-8|0;H[e+8>>2]=b;g=e+8|0;H[(g+(b&-4)|0)-4>>2]=b|1;d=H[e+8>>2]-8|0;b:{if(d>>>0<=127){b=(d>>>3|0)-1|0;break b}f=Q(d);b=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break b}b=((d>>>30-f^2)-(f<<1)|0)+71|0;b=b>>>0>=63?63:b}d=b<<4;H[e+12>>2]=d+26400;d=d+26408|0;H[e+16>>2]=H[d>>2];H[d>>2]=g;H[H[e+16>>2]+4>>2]=g;d=H[6858];f=H[6859];e=b&31;if((b&63)>>>0>=32){b=1<>>32-e}H[6858]=g|d;H[6859]=b|f;b=c+8|0;H[a>>2]=b;c=(b&-4)+a|0;break a}c=a+b|0}H[c-4>>2]=b;a=a+4|0}else{a=0}return a}function je(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=na-16|0;na=g;i=H[H[a+96>>2]+16>>2];h=i>>>0<257?1:2;e=(h<<1)+5|0;f=(c>>>0)/(e>>>0)|0;a:{if(!((N(e,f)|0)==(c|0)&c>>>0>=e>>>0)){Ba(d,1,4643,0);a=0;break a}if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}a=0;c=I[e+5640|0];a=c&4?H[e+420>>2]+1|0:a;f=f+a|0;if(f>>>0>=32){H[g>>2]=f;Ba(d,1,7781,g);a=0;break a}F[e+5640|0]=c|4;if(a>>>0>>0){c=(e+N(a,148)|0)+424|0;while(1){Da(b,c,1);b=b+1|0;Da(b,c+4|0,h);b=b+h|0;Da(b,c+8|0,2);d=H[c+8>>2];j=H[e+8>>2];H[c+8>>2]=d>>>0>>0?d:j;Da(b+2|0,c+12|0,1);b=b+3|0;Da(b,c+16|0,h);b=b+h|0;Da(b,g+12|0,1);H[c+36>>2]=H[g+12>>2];d=H[c+16>>2];H[c+16>>2]=d>>>0>>0?d:i;c=c+148|0;b=b+1|0;a=a+1|0;if((f|0)!=(a|0)){continue}break}}H[e+420>>2]=f-1;a=1}na=g+16|0;return a|0}function kb(a){var b=0,c=0,d=0,e=0;a:{if(!a){break a}b=H[a+5164>>2];if(b){c=H[a+5160>>2];if(c){b=0;while(1){d=H[H[a+5164>>2]+(b<<3)>>2];if(d){Ca(d);c=H[a+5160>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+5164>>2]}H[a+5160>>2]=0;Ca(b);H[a+5164>>2]=0}b=H[a+5172>>2];if(b){Ca(b);H[a+5172>>2]=0}b=H[a+5584>>2];if(b){Ca(b);H[a+5584>>2]=0}b=H[a+5612>>2];if(b){Ca(b);H[a+5612>>2]=0}b=H[a+5608>>2];if(b){Ca(b);H[a+5608>>2]=0}b=H[a+5628>>2];if(b){Ca(b);H[a+5636>>2]=0;H[a+5628>>2]=0;H[a+5632>>2]=0}b=H[a+5616>>2];if(b){e=H[a+5620>>2];if(e){c=0;while(1){d=H[b+12>>2];if(d){Ca(d);H[b+12>>2]=0;e=H[a+5620>>2]}b=b+20|0;c=c+1|0;if(e>>>0>c>>>0){continue}break}b=H[a+5616>>2]}Ca(b);H[a+5616>>2]=0}b=H[a+5604>>2];if(b){Ca(b);H[a+5604>>2]=0}b=H[a+5596>>2];if(!b){break a}Ca(b);H[a+5596>>2]=0;H[a+5600>>2]=0}}function Bd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-32|0;na=e;a:{if(H[a+72>>2]){Ba(d,2,7015,0);c=1;break a}if((c|0)!=14){c=0;Ba(d,1,14445,0);break a}Da(b,a+16|0,4);Da(b+4|0,a+12|0,4);Da(b+8|0,a+20|0,2);f=H[a+12>>2];b:{g=H[a+16>>2];c=H[a+20>>2];c:{if(!g){break c}c=H[a+20>>2];if(!f){break c}if(c){break b}c=0}H[e+8>>2]=c;H[e+4>>2]=g;H[e>>2]=f;Ba(d,1,14289,e);c=0;break a}if(c-16385>>>0<=4294950911){c=0;Ba(d,1,14203,0);break a}c=Ea(c,12);H[a+72>>2]=c;if(!c){c=0;Ba(d,1,14240,0);break a}c=1;Da(b+10|0,a+24|0,1);Da(b+11|0,a+28|0,1);f=H[a+28>>2];if((f|0)!=7){H[e+16>>2]=f;Ba(d,4,16272,e+16|0)}Da(b+12|0,a+32|0,1);Da(b+13|0,a+36|0,1);b=H[a>>2];F[b+212|0]=I[b+212|0]&251|(H[a+24>>2]==255?4:0);b=H[a>>2];H[b+240>>2]=H[a+12>>2];H[b+244>>2]=H[a+16>>2];F[a+133|0]=1}na=e+32|0;return c|0}function sc(a,b,c,d){a:{switch(b-9|0){case 0:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];return;case 6:b=H[c>>2];H[c>>2]=b+4;b=G[b>>1];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 7:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=J[b>>1];H[a+4>>2]=0;return;case 8:b=H[c>>2];H[c>>2]=b+4;b=F[b|0];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 9:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=I[b|0];H[a+4>>2]=0;return;case 16:b=H[c>>2]+7&-8;H[c>>2]=b+8;M[a>>3]=M[b>>3];return;case 17:ra[d|0](a,c);default:return;case 1:case 4:case 14:b=H[c>>2];H[c>>2]=b+4;b=H[b>>2];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 2:case 5:case 11:case 15:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];H[a+4>>2]=0;return;case 3:case 10:case 12:case 13:break a}}b=H[c>>2]+7&-8;H[c>>2]=b+8;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c}function ee(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=na-16|0;na=g;a:{if(c>>>0<=1){Ba(d,1,4311,0);a=0;break a}F[a+212|0]=I[a+212|0]|1;Da(b,g+12|0,1);e=H[a+140>>2];b:{if(!e){f=H[g+12>>2]+1|0;e=Ea(f,8);H[a+140>>2]=e;if(!e){Ba(d,1,4337,0);a=0;break a}H[a+136>>2]=f;break b}f=H[g+12>>2];if(f>>>0>2]){break b}h=e;e=f+1|0;f=Ha(h,e<<3);if(!f){Ba(d,1,4337,0);a=0;break a}H[a+140>>2]=f;h=H[a+136>>2];i=e-h<<3;if(i){y(f+(h<<3)|0,0,i)}H[a+136>>2]=e;e=H[a+140>>2]}h=e;e=H[g+12>>2];if(H[h+(e<<3)>>2]){H[g>>2]=e;Ba(d,1,7085,g);a=0;break a}c=c-1|0;e=Fa(c);a=H[a+140>>2];f=a+(H[g+12>>2]<<3)|0;H[f>>2]=e;if(!e){Ba(d,1,4337,0);a=0;break a}H[f+4>>2]=c;if(c){B(H[a+(H[g+12>>2]<<3)>>2],b+1|0,c)}a=1}na=g+16|0;return a|0}function ld(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=na-32|0;na=d;e=H[a+28>>2];H[d+16>>2]=e;f=H[a+20>>2];H[d+28>>2]=c;H[d+24>>2]=b;b=f-e|0;H[d+20>>2]=b;f=b+c|0;i=2;b=d+16|0;a:{while(1){b:{c:{d:{if(!Ac(Z(H[a+60>>2],b|0,i|0,d+12|0)|0)){g=H[d+12>>2];if((g|0)==(f|0)){break d}if((g|0)>=0){break c}break b}if((f|0)!=-1){break b}}b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];a=c;break a}h=H[b+4>>2];j=h>>>0>>0;e=(j?8:0)+b|0;h=g-(j?h:0)|0;H[e>>2]=h+H[e>>2];b=(j?12:4)+b|0;H[b>>2]=H[b>>2]-h;f=f-g|0;i=i-j|0;b=e;continue}break}H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a>>2]=H[a>>2]|32;a=0;if((i|0)==2){break a}a=c-H[b+4>>2]|0}na=d+32|0;return a|0}function Ca(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;if(a){b=a-4|0;f=H[b>>2];c=f;d=b;e=H[a-8>>2];a=e&-2;if((a|0)!=(e|0)){d=b-a|0;c=H[d+4>>2];e=H[d+8>>2];H[c+8>>2]=e;H[e+4>>2]=c;c=a+f|0}a=b+f|0;b=H[a>>2];if((b|0)!=H[(a+b|0)-4>>2]){f=H[a+4>>2];a=H[a+8>>2];H[f+8>>2]=a;H[a+4>>2]=f;c=b+c|0}H[d>>2]=c;H[((c&-4)+d|0)-4>>2]=c|1;b=H[d>>2]-8|0;a:{if(b>>>0<=127){a=(b>>>3|0)-1|0;break a}c=Q(b);a=((b>>>29-c^4)-(c<<2)|0)+110|0;if(b>>>0<=4095){break a}a=((b>>>30-c^2)-(c<<1)|0)+71|0;a=a>>>0>=63?63:a}b=a<<4;H[d+4>>2]=b+26400;b=b+26408|0;H[d+8>>2]=H[b>>2];H[b>>2]=d;H[H[d+8>>2]+4>>2]=d;b=H[6858];c=H[6859];d=a&31;if((a&63)>>>0>=32){a=1<>>32-d}H[6858]=e|b;H[6859]=a|c}}function vd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=na-16|0;na=e;a:{if(H[a+116>>2]){break a}if(c>>>0<=1){Ba(d,1,8882,0);break a}Da(b,e+12|0,2);f=H[e+12>>2];h=f&65535;if(!h){Ba(d,1,8915,0);break a}if(N(h,6)+2>>>0>c>>>0){Ba(d,1,8882,0);break a}d=Fa(N(f,6));if(!d){break a}c=Fa(8);H[a+116>>2]=c;if(!c){Ca(d);break a}H[c>>2]=d;f=c;c=J[e+12>>1];G[f+4>>1]=c;if(!c){g=1;break a}c=0;while(1){g=e+12|0;Da(b+2|0,g,2);f=d+N(c,6)|0;G[f>>1]=H[e+12>>2];Da(b+4|0,g,2);G[f+2>>1]=H[e+12>>2];b=b+6|0;Da(b,g,2);G[f+4>>1]=H[e+12>>2];g=1;c=c+1|0;if(c>>>0>2]+4>>1]){continue}break}}na=e+16|0;return g|0}function Nb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=na-32|0;na=g;f=H[a+96>>2];a:{if(!f){Ba(d,1,13752,0);e=0;break a}f=Ea(4,H[f+16>>2]);e=0;if(!f){break a}if(b){j=H[a+96>>2];while(1){b:{e=H[(h<<2)+c>>2];c:{if(e>>>0>=K[j+16>>2]){H[g+16>>2]=e;Ba(d,1,2443,g+16|0);break c}i=f+(e<<2)|0;if(!H[i>>2]){break b}H[g>>2]=e;Ba(d,1,3487,g)}Ca(f);e=0;break a}H[i>>2]=1;h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ca(f);Ca(H[a+64>>2]);d:{if(b){d=b<<2;e=Fa(d);H[a+64>>2]=e;if(!e){H[a+60>>2]=0;e=0;break a}if(!d){break d}B(e,c,d);break d}H[a+64>>2]=0}H[a+60>>2]=b;e=1}na=g+32|0;return e|0}function Gc(a){a=a|0;var b=0,c=0;if(a){xb(H[a>>2]);H[a>>2]=0;b=H[a+72>>2];if(b){Ca(b);H[a+72>>2]=0}b=H[a+68>>2];if(b){Ca(b);H[a+68>>2]=0}b=H[a+108>>2];if(b){Ca(b);H[a+108>>2]=0}b=H[a+116>>2];if(b){c=H[b>>2];if(c){Ca(c);b=H[a+116>>2];H[b>>2]=0}Ca(b);H[a+116>>2]=0}b=H[a+120>>2];if(b){c=H[b+12>>2];if(c){Ca(c);b=H[a+120>>2];H[b+12>>2]=0}c=H[b+4>>2];if(c){Ca(c);b=H[a+120>>2];H[b+4>>2]=0}c=H[b+8>>2];if(c){Ca(c);b=H[a+120>>2];H[b+8>>2]=0}c=H[b>>2];if(c){Ca(c);b=H[a+120>>2];H[b>>2]=0}Ca(b);H[a+120>>2]=0}b=H[a+4>>2];if(b){qb(b);H[a+4>>2]=0}b=H[a+8>>2];if(b){qb(b);H[a+8>>2]=0}Ca(a)}}function Lb(){var a=0,b=0,c=0;a:{a=Ea(1,256);if(a){H[a>>2]=1;H[a+208>>2]=1;F[a+212|0]=I[a+212|0]|6;b=Ea(1,5644);H[a+12>>2]=b;if(!b){break a}b=Ea(1,1e3);H[a+16>>2]=b;if(!b){break a}H[a+48>>2]=0;H[a+52>>2]=0;H[a+44>>2]=-1;H[a+20>>2]=1e3;b:{c=Ea(1,48);if(c){H[c+24>>2]=0;H[c+32>>2]=100;b=Ea(100,24);H[c+28>>2]=b;if(b){break b}Ca(c)}H[a+224>>2]=0;break a}H[c+40>>2]=0;H[a+224>>2]=c;b=rb();H[a+220>>2]=b;if(!b){break a}b=rb();H[a+216>>2]=b;if(!b){break a}c:{if(!zc(1419)){break c}}b=lc();H[a+236>>2]=b;if(!b){b=lc();H[a+236>>2]=b;if(!b){break a}}}else{a=0}return a}xb(a);return 0}function ub(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0;g=na-240|0;na=g;H[g+236>>2]=c;H[g+232>>2]=b;H[g>>2]=a;l=!e;a:{b:{c:{d:{if((b|0)!=1){h=a;i=1;break d}h=a;i=1;if(c){break d}e=a;break c}while(1){j=(d<<2)+f|0;e=h-H[j>>2]|0;if((Jc(e,a)|0)<=0){e=h;break c}k=l^-1;l=1;e:{if(!((k|(d|0)<2)&1)){j=H[j-8>>2];k=h-8|0;if((Jc(k,e)|0)>=0){break e}if((Jc(k-j|0,e)|0)>=0){break e}}H[(i<<2)+g>>2]=e;b=yc(b,c);vb(g+232|0,b);i=i+1|0;d=b+d|0;h=e;c=H[g+236>>2];b=H[g+232>>2];if(c|(b|0)!=1){continue}break b}break}e=h;break b}if(!l){break a}}xc(g,i);Cb(e,d,f)}na=g+240|0}function vc(a,b,c,d,e){var f=0,g=0,h=0;f=na-208|0;na=f;H[f+204>>2]=c;c=f+160|0;y(c,0,40);H[f+200>>2]=H[f+204>>2];a:{if((uc(0,b,f+200|0,f+80|0,c,d,e)|0)<0){break a}c=H[a+76>>2]<0;g=H[a>>2];H[a>>2]=g&-33;b:{c:{d:{if(!H[a+48>>2]){H[a+48>>2]=80;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;h=H[a+44>>2];H[a+44>>2]=f;break d}if(H[a+16>>2]){break c}}if(Fb(a)){break b}}uc(a,b,f+200|0,f+80|0,f+160|0,d,e)}if(h){ra[H[a+36>>2]](a,0,0)|0;H[a+48>>2]=0;H[a+44>>2]=h;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0}H[a>>2]=H[a>>2]|g&32;if(c){break a}}na=f+208|0}function oe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=na-16|0;na=e;if(H[a+8>>2]==16){g=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{g=H[a+12>>2]}h=H[a+96>>2];f=K[h+16>>2]<257?1:2;a:{if(f>>>0>=c>>>0){c=0;Ba(d,1,4669,0);break a}H[e+12>>2]=(f^-1)+c;Da(b,e+8|0,f);i=H[e+8>>2];if(i>>>0>=K[h+16>>2]){c=0;Ba(d,1,14067,0);break a}c=1;b=b+f|0;Da(b,H[g+5584>>2]+N(i,1080)|0,1);if(!Mc(a,H[e+8>>2],b+1|0,e+12|0,d)){c=0;Ba(d,1,4669,0);break a}if(!H[e+12>>2]){break a}c=0;Ba(d,1,4669,0)}na=e+16|0;return c|0}function Hc(a,b){var c=0,d=0,e=0,f=0,g=0;f=na-32|0;na=f;c=H[a+60>>2];a:{b:{if(c){g=1;while(1){e=H[H[a+64>>2]+(d<<2)>>2];if(!H[(H[H[a+100>>2]+24>>2]+N(e,52)|0)+44>>2]){H[f+16>>2]=e;Ba(b,2,7604,f+16|0);g=0;c=H[a+60>>2]}d=d+1|0;if(c>>>0>d>>>0){continue}break}break b}g=1;c=H[a+100>>2];e=1;if(!H[c+16>>2]){break a}while(1){if(!H[(H[c+24>>2]+N(d,52)|0)+44>>2]){H[f>>2]=d;Ba(b,2,7604,f);g=0;c=H[a+100>>2]}d=d+1|0;if(d>>>0>2]){continue}break}}e=1;if(g){break a}Ba(b,1,2897,0);e=0}na=f+32|0;return e}function xd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=na-16|0;na=f;e=H[a+120>>2];a:{if(!e){Ba(d,1,8836,0);c=0;break a}if(H[e+12>>2]){Ba(d,1,11598,0);c=0;break a}e=I[e+18|0];g=e<<2;if(g>>>0>c>>>0){Ba(d,1,8803,0);c=0;break a}g=Fa(g);c=0;if(!g){break a}if(e){d=0;while(1){c=f+12|0;Da(b,c,2);h=g+(d<<2)|0;G[h>>1]=H[f+12>>2];Da(b+2|0,c,1);F[h+2|0]=H[f+12>>2];Da(b+3|0,c,1);F[h+3|0]=H[f+12>>2];b=b+4|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}}H[H[a+120>>2]+12>>2]=g;c=1}na=f+16|0;return c|0}function $d(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=na-16|0;na=e;g=H[H[a+96>>2]+16>>2];a:{if((g+2|0)!=(c|0)){Ba(d,1,4617,0);break a}Da(b,e+12|0,2);if(H[e+12>>2]!=(g|0)){Ba(d,1,4617,0);break a}if(!g){f=1;break a}c=b+2|0;a=H[H[a+96>>2]+24>>2];b=0;while(1){Da(c,e+8|0,1);f=H[e+8>>2];h=f&127;i=h+1|0;H[a+24>>2]=i;H[a+32>>2]=f>>>7&1;if(h>>>0>=31){H[e+4>>2]=i;H[e>>2]=b;Ba(d,1,15402,e);f=0;break a}a=a+52|0;f=1;c=c+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}na=e+16|0;return f|0}function le(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=na-16|0;na=e;a:{b:{h=e+8|0;c:{if(K[H[a+96>>2]+16>>2]<=256){if(c){f=-1;g=1;break c}Ba(d,1,4695,0);a=0;break a}if(c>>>0<=1){break b}f=-2;g=2}Da(b,h,g);H[e+12>>2]=c+f;c=H[e+8>>2];f=H[H[a+96>>2]+16>>2];if(c>>>0>=f>>>0){H[e+4>>2]=f;H[e>>2]=c;Ba(d,1,7712,e);a=0;break a}if(!Lc(a,c,b+g|0,e+12|0,d)){Ba(d,1,4695,0);a=0;break a}a=1;if(!H[e+12>>2]){break a}Ba(d,1,4695,0);a=0;break a}Ba(d,1,4695,0);a=0}na=e+16|0;return a|0}function fc(a,b,c,d){var e=0,f=0,g=0;g=na-128|0;na=g;f=g;c=H[b+12>>2]+(c<<4)|0;e=H[c>>2];a:{if(!e){b=c;break a}while(1){H[f>>2]=c;f=f+4|0;b=e;c=b;e=H[c>>2];if(e){continue}break}}e=0;while(1){c=H[b+8>>2];if((e|0)>(c|0)){H[b+8>>2]=e;c=e}b:{if((c|0)>=(d|0)){break b}while(1){if(H[b+4>>2]<=(c|0)){break b}c:{if(Sa(a,1)){H[b+4>>2]=c;break c}c=c+1|0}if((c|0)<(d|0)){continue}break}}H[b+8>>2]=c;if((f|0)!=(g|0)){f=f-4|0;b=H[f>>2];e=c;continue}break}na=g+128|0;return H[b+4>>2]<(d|0)}function Gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=H[a+32>>2];H[a+36>>2]=f;a:{e=H[a+48>>2];if(e){while(1){e=ra[H[a+20>>2]](f,e,H[a>>2])|0;if((e|0)==-1){break a}f=e+H[a+36>>2]|0;H[a+36>>2]=f;e=H[a+48>>2]-e|0;H[a+48>>2]=e;if(e){continue}break}f=H[a+32>>2]}H[a+48>>2]=0;H[a+36>>2]=f;if(!(ra[H[a+28>>2]](b,c,H[a>>2])|0)){H[a+68>>2]=H[a+68>>2]|8;return 0}H[a+56>>2]=b;H[a+60>>2]=c;return 1}H[a+68>>2]=H[a+68>>2]|8;Ba(d,4,15604,0);H[a+68>>2]=H[a+68>>2]|8;return 0}function Ba(a,b,c,d){var e=0,f=0;e=na-528|0;na=e;a:{if(!a){break a}b:{c:{switch(b-1|0){case 0:b=a+12|0;break b;case 1:b=a+16|0;a=a+4|0;break b;case 3:break c;default:break a}}b=a+20|0;a=a+8|0}b=H[b>>2];if(!b|!c){break a}f=H[a>>2];y(e,0,512);H[e+524>>2]=d;a=na-160|0;na=a;H[a+148>>2]=e;H[a+152>>2]=511;y(a,0,144);H[a+76>>2]=-1;H[a+36>>2]=103;H[a+80>>2]=-1;H[a+44>>2]=a+159;H[a+84>>2]=a+148;F[e|0]=0;vc(a,c,d,104,105);na=a+160|0;F[e+511|0]=0;ra[b|0](e,f)}na=e+528|0}function Dd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(H[a+100>>2]!=1){Ba(d,1,11401,0);return 0}a:{if(c>>>0<=7){break a}Da(b,a+56|0,4);Da(b+4|0,a+60|0,4);if(c&3){break a}c=c-8|0;e=c>>>2|0;H[a+64>>2]=e;b:{if(!c){break b}c=Ea(e,4);H[a+68>>2]=c;if(!c){Ba(d,1,2235,0);return 0}if(!H[a+64>>2]){break b}d=b+8|0;c=0;while(1){Da(d,H[a+68>>2]+(c<<2)|0,4);d=d+4|0;c=c+1|0;if(c>>>0>2]){continue}break}}H[a+100>>2]=H[a+100>>2]|2;return 1}Ba(d,1,5955,0);return 0}function me(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;H[e+12>>2]=c;a:{if(!(!Lc(a,0,b,e+12|0,d)|H[e+12>>2])){if(H[a+8>>2]==16){b=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{b=H[a+12>>2]}f=1;if(K[H[a+96>>2]+16>>2]<2){break a}c=H[b+5584>>2];g=c+28|0;b=1;d=c;while(1){H[d+1104>>2]=H[c+24>>2];H[d+1884>>2]=H[c+804>>2];B(d+1108|0,g,776);d=d+1080|0;b=b+1|0;if(b>>>0>2]+16>>2]){continue}break}break a}Ba(d,1,4591,0)}na=e+16|0;return f|0}function hc(a){var b=0,c=0,d=0;a:{if(!a){break a}b=H[a+8>>2];if(!b){break a}a=H[a+12>>2];if(b>>>0>=4){d=b&-4;while(1){H[a+60>>2]=0;H[a+52>>2]=999;H[a+56>>2]=0;H[a+44>>2]=0;H[a+36>>2]=999;H[a+40>>2]=0;H[a+28>>2]=0;H[a+20>>2]=999;H[a+24>>2]=0;H[a+12>>2]=0;H[a+4>>2]=999;H[a+8>>2]=0;a=a- -64|0;c=c+4|0;if((d|0)!=(c|0)){continue}break}}b=b&3;if(!b){break a}c=0;while(1){H[a+12>>2]=0;H[a+4>>2]=999;H[a+8>>2]=0;a=a+16|0;c=c+1|0;if((b|0)!=(c|0)){continue}break}}}function Nd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!Xa(H[a+8>>2],54,c)){return 0}h=H[a+8>>2];d=H[h>>2];f=H[h+8>>2];a:{if(d){e=1;i=d&1;if((d|0)==1){d=0}else{d=d&-2;while(1){g=0;b:{if(!e){break b}g=0;if(!(ra[H[f>>2]](a,b,c)|0)){break b}g=(ra[H[f+4>>2]](a,b,c)|0)!=0}e=g;f=f+8|0;j=j+2|0;if((d|0)!=(j|0)){continue}break}d=!e}e=i?0:e;if(!(d|!i)){e=(ra[H[f>>2]](a,b,c)|0)!=0}Qa(h);if(e){break a}return 0}Qa(h)}return 1}function ne(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;g=H[H[a+96>>2]+16>>2];f=g>>>0<257?1:2;a:{if((f+2|0)!=(c|0)){a=0;Ba(d,1,4285,0);break a}if(H[a+8>>2]==16){c=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{c=H[a+12>>2]}Da(b,e+12|0,f);a=1;b=b+f|0;Da(b,e+8|0,1);f=H[e+12>>2];if(f>>>0>=g>>>0){H[e+4>>2]=g;H[e>>2]=f;Ba(d,1,14923,e);a=0;break a}Da(b+1|0,(H[c+5584>>2]+N(f,1080)|0)+808|0,1)}na=e+16|0;return a|0}function qc(a,b){a:{if(b>>>0<=127){break a}b:{if(!H[H[6885]>>2]){if((b&-128)==57216){break a}break b}if(b>>>0<=2047){F[a+1|0]=b&63|128;F[a|0]=b>>>6|192;return 2}if(!((b&-8192)!=57344&b>>>0>=55296)){F[a+2|0]=b&63|128;F[a|0]=b>>>12|224;F[a+1|0]=b>>>6&63|128;return 3}if(b-65536>>>0<=1048575){F[a+3|0]=b&63|128;F[a|0]=b>>>18|240;F[a+2|0]=b>>>6&63|128;F[a+1|0]=b>>>12&63|128;return 4}}H[6597]=25;return-1}F[a|0]=b;return 1}function se(){var a=0,b=0,c=0;while(1){b=a<<4;c=b+26400|0;H[b+26404>>2]=c;H[b+26408>>2]=c;a=a+1|0;if((a|0)!=64){continue}break}Bc(48);a=na-16|0;na=a;a:{if(la(a+12|0,a+8|0)|0){break a}b=wb((H[a+12>>2]<<2)+4|0);H[6860]=b;if(!b){break a}b=wb(H[a+8>>2]);if(b){c=H[6860];H[c+(H[a+12>>2]<<2)>>2]=0;if(!(ka(c|0,b|0)|0)){break a}}H[6860]=0}na=a+16|0;H[6876]=8192;H[6874]=94352;H[6867]=42;H[6885]=27608;H[6875]=65536}function Eb(a,b,c){var d=0,e=0,f=0;d=H[c+16>>2];a:{if(!d){if(Fb(c)){break a}d=H[c+16>>2]}e=H[c+20>>2];if(d-e>>>0>>0){return ra[H[c+36>>2]](c,a,b)|0}b:{c:{if(!b|H[c+80>>2]<0){break c}d=b;while(1){f=a+d|0;if(I[f-1|0]!=10){d=d-1|0;if(d){continue}break c}break}e=ra[H[c+36>>2]](c,a,d)|0;if(e>>>0>>0){break a}b=b-d|0;e=H[c+20>>2];break b}f=a;d=0}bb(e,f,b);H[c+20>>2]=H[c+20>>2]+b;e=b+d|0}return e}function Ae(a,b,c){var d=0,e=0,f=0,g=0;g=c&63;f=g;e=f&31;if(f>>>0>=32){f=-1>>>e|0}else{d=-1>>>e|0;f=d|(1<>>0>=32){d=f<>>32-e|d<>>0>=32){d=-1<>>32-d}a=c&a;b=b&d;d=e&31;if(e>>>0>=32){c=0;a=b>>>d|0}else{c=b>>>d|0;a=((1<>>d}a=a|g;qa=c|f;return a} +function fb(a,b,c){var d=0;if(!H[a+12>>2]){ra[b|0](c,H[a+36>>2]);return}d=Fa(8);a:{if(!d){break a}H[d+4>>2]=c;H[d>>2]=b;b=Fa(8);if(!b){Ca(d);return}H[b>>2]=d;c=N(H[a+4>>2],100);H[a+40>>2]=c;while(1){if((c|0)>2]){continue}break}H[b+4>>2]=H[a+20>>2];H[a+20>>2]=b;H[a+24>>2]=H[a+24>>2]+1;b=H[a+28>>2];if(!b){break a}H[H[b>>2]+8>>2]=0;H[a+28>>2]=H[b+4>>2];H[a+32>>2]=H[a+32>>2]-1;Ca(b)}}function Nc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;H[a+184>>2]=b;d=H[a+96>>2];a:{if(!d){break a}f=H[d+24>>2];if(!f){break a}e=H[a+12>>2];if(!e|!H[e+5584>>2]){break a}e=H[d+16>>2];if(!e){return 1}d=0;while(1){if(K[(H[H[a+12>>2]+5584>>2]+N(d,1080)|0)+4>>2]<=b>>>0){Ba(c,1,9177,0);return 0}H[(N(d,52)+f|0)+40>>2]=b;g=1;d=d+1|0;if((e|0)!=(d|0)){continue}break}}return g|0}function Cc(a){var b=0,c=0;b=H[a+76>>2];if(!((b|0)>=0&(!b|H[6867]!=(b&1073741823)))){a:{if(H[a+80>>2]==10){break a}b=H[a+20>>2];if((b|0)==H[a+16>>2]){break a}H[a+20>>2]=b+1;F[b|0]=10;return}Dc(a);return}b=a+76|0;c=H[b>>2];H[b>>2]=c?c:1073741823;b:{c:{if(H[a+80>>2]==10){break c}c=H[a+20>>2];if((c|0)==H[a+16>>2]){break c}H[a+20>>2]=c+1;F[c|0]=10;break b}Dc(a)}H[b>>2]=0}function Ka(a,b,c,d,e,f,g,h){var i=0,j=0;i=+O(e-a|0);j=i*1.402;if(P(j)<2147483647){e=~~j}else{e=-2147483648}e=e+c|0;H[f>>2]=(e|0)>=0?(b|0)>(e|0)?e:b:0;j=+O(d-a|0);i=j*.344+i*.714;if(P(i)<2147483647){a=~~i}else{a=-2147483648}a=c-a|0;H[g>>2]=(a|0)>=0?(a|0)<(b|0)?a:b:0;i=j*1.772;if(P(i)<2147483647){a=~~i}else{a=-2147483648}a=a+c|0;H[h>>2]=(a|0)>=0?(a|0)<(b|0)?a:b:0}function zb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;if(a){c=H[a+4>>2];if(c){Ca(c);H[a+4>>2]=0}if(b){c=a;while(1){d=H[c+200>>2];if(d){e=0;f=H[c+196>>2];if(f){while(1){g=H[d+12>>2];if(g){Ca(g);H[d+12>>2]=0;f=H[c+196>>2]}d=d+16|0;e=e+1|0;if(e>>>0>>0){continue}break}d=H[c+200>>2]}Ca(d);H[c+200>>2]=0}c=c+240|0;h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ca(a)}}function hd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=H[a+84>>2];f=H[e>>2];d=H[e+4>>2];h=H[a+28>>2];g=H[a+20>>2]-h|0;g=d>>>0>>0?d:g;if(g){bb(f,h,g);f=g+H[e>>2]|0;H[e>>2]=f;d=H[e+4>>2]-g|0;H[e+4>>2]=d}d=c>>>0>d>>>0?d:c;if(d){bb(f,b,d);f=d+H[e>>2]|0;H[e>>2]=f;H[e+4>>2]=H[e+4>>2]-d}F[f|0]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;return c|0}function td(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=H[c+8>>2];d=e>>>0<=1?1:e;f=H[c+4>>2];g=f-H[c>>2]|0;while(1){h=d;d=d<<1;if(h-g>>>0>>0){continue}break}if((e|0)!=(h|0)){d=Fa(h);if(!d){return-1}e=H[c>>2];if(e){if(g){B(d,e,g)}Ca(H[c>>2])}H[c+8>>2]=h;H[c>>2]=d;f=d+g|0;H[c+4>>2]=f}if(b){B(f,a,b)}H[c+4>>2]=H[c+4>>2]+b;return b|0}function _b(a){H[a+100>>2]=20832;H[a+96>>2]=20832;H[a+92>>2]=20832;H[a+88>>2]=20832;H[a+84>>2]=20832;H[a+80>>2]=20832;H[a+76>>2]=20832;H[a+72>>2]=20832;H[a+68>>2]=20832;H[a+64>>2]=20832;H[a+60>>2]=20832;H[a+56>>2]=20832;H[a+52>>2]=20832;H[a+48>>2]=20832;H[a+44>>2]=20832;H[a+40>>2]=20832;H[a+36>>2]=20832;H[a+32>>2]=20832;H[a+28>>2]=20832}function Sa(a,b){var c=0,d=0,e=0,f=0;if((b|0)<=0){return 0}c=H[a+12>>2];d=H[a+16>>2];while(1){e=b;a:{if(d){break a}c=c<<8&65280;H[a+12>>2]=c;d=(c|0)==65280?7:8;H[a+16>>2]=d;b=H[a+8>>2];if(b>>>0>=K[a+4>>2]){break a}H[a+8>>2]=b+1;c=I[b|0]|c;H[a+12>>2]=c}d=d-1|0;H[a+16>>2]=d;b=e-1|0;f=(c>>>d&1)<>>0>1){continue}break}return f}function zd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=na-16|0;na=f;e=H[a+24>>2];if((e|0)!=255){H[f>>2]=e;Ba(d,2,2678,f)}a:{b:{if(H[a+20>>2]==(c|0)){if(c){break b}e=1;break a}e=0;Ba(d,1,14510,0);break a}c=0;while(1){e=1;Da(b,(H[a+72>>2]+N(c,12)|0)+8|0,1);b=b+1|0;c=c+1|0;if(c>>>0>2]){continue}break}}na=f+16|0;return e|0}function Da(a,b,c){var d=0,e=0;H[b>>2]=0;a:{if(!c){break a}d=c&3;b=b+c|0;if(c>>>0>=4){e=c&-4;c=0;while(1){F[b-1|0]=I[a|0];F[b-2|0]=I[a+1|0];F[b-3|0]=I[a+2|0];b=b-4|0;F[b|0]=I[a+3|0];a=a+4|0;c=c+4|0;if((e|0)!=(c|0)){continue}break}}if(!d){break a}c=0;while(1){b=b-1|0;F[b|0]=I[a|0];a=a+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}}function fe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;a:{if(!c){Ba(d,1,4106,0);a=0;break a}Da(b,e+12|0,1);f=c-1|0;a=1;if(!f){break a}a=0;c=0;while(1){b=b+1|0;Da(b,e+8|0,1);g=H[e+8>>2];c=g<<24>>31&(g&127|c)<<7;a=a+1|0;if((f|0)!=(a|0)){continue}break}a=1;if(!c){break a}Ba(d,1,4106,0);a=0}na=e+16|0;return a|0}function dc(a,b,c,d){var e=0,f=0,g=O(0),h=0,i=O(0),j=0,k=O(0);if(d){while(1){e=f<<2;h=e+b|0;i=L[h>>2];j=a+e|0;g=L[j>>2];e=c+e|0;k=L[e>>2];L[j>>2]=O(k*O(1.4019999504089355))+g;L[h>>2]=O(g+O(i*O(-.3441300094127655)))+O(k*O(-.714139997959137));L[e>>2]=g+O(i*O(1.7719999551773071));f=f+1|0;if((f|0)!=(d|0)){continue}break}}}function Cb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;f=na-240|0;na=f;H[f>>2]=a;g=1;a:{if((b|0)<2){break a}d=a;while(1){d=d-8|0;h=b-2|0;e=d-H[(h<<2)+c>>2]|0;if((Jc(a,e)|0)>=0){if((Jc(a,d)|0)>=0){break a}}i=e;e=(Jc(e,d)|0)>=0;d=e?i:d;H[(g<<2)+f>>2]=d;g=g+1|0;b=e?b-1|0:h;if((b|0)>1){continue}break}}xc(f,g);na=f+240|0}function xc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;c=8;f=na-256|0;na=f;if((b|0)>=2){h=(b<<2)+a|0;H[h>>2]=f;while(1){e=c>>>0>=256?256:c;bb(H[h>>2],H[a>>2],e);d=0;while(1){g=(d<<2)+a|0;d=d+1|0;bb(H[g>>2],H[(d<<2)+a>>2],e);H[g>>2]=H[g>>2]+e;if((b|0)!=(d|0)){continue}break}c=c-e|0;if(c){continue}break}}na=f+256|0}function Xc(a){a=a|0;var b=0,c=0,d=0,e=0;b=H[a+24>>2];if(b){c=H[a+28>>2];e=(c>>>0)/52|0;if(c>>>0>=52){while(1){c=H[b>>2];if(c){Ca(c-1|0);H[b>>2]=0}c=H[b+4>>2];if(c){Ca(c);H[b+4>>2]=0}c=H[b+8>>2];if(c){Ca(c);H[b+8>>2]=0}b=b+52|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}b=H[a+24>>2]}Ca(b);H[a+24>>2]=0}}function Yc(a){a=a|0;var b=0,c=0,d=0,e=0;b=H[a+24>>2];if(b){c=H[a+28>>2];e=(c>>>0)/68|0;if(c>>>0>=68){while(1){c=H[b>>2];if(c){Ca(c);H[b>>2]=0}c=H[b+4>>2];if(c){Ca(c);H[b+4>>2]=0}Ca(H[b+60>>2]);H[b+60>>2]=0;b=b+68|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}b=H[a+24>>2]}Ca(b);H[a+24>>2]=0}}function ab(a,b,c){var d=0,e=0,f=0,g=0,h=0;a:{if(!b){d=a;e=b;break a}while(1){c=c-1|0;d=xe(a,b,10,0);e=qa;g=c,h=te(d,e,246)+a|48,F[g|0]=h;f=b>>>0>9;a=d;b=e;if(f){continue}break}}if(d|e){while(1){c=c-1|0;a=(d>>>0)/10|0;F[c|0]=N(a,246)+d|48;b=d>>>0>9;d=a;if(b){continue}break}}return c}function bd(a,b){a=a|0;b=b|0;var c=0,d=0;c=H[a+32>>2];b=H[a+28>>2];d=b+8|0;if(c>>>0>=d>>>0){while(1){ob(a,H[a+24>>2]+(b<<2)|0,H[a+20>>2],8);c=H[a+32>>2];b=d;d=b+8|0;if(c>>>0>=d>>>0){continue}break}}if(b>>>0>>0){ob(a,H[a+24>>2]+(b<<2)|0,H[a+20>>2],c-b|0)}Ca(H[a>>2]);Ca(a)}function Ed(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=na-16|0;na=e;a:{if(H[a+100>>2]){Ba(d,1,11302,0);a=0;break a}if((c|0)!=4){Ba(d,1,5991,0);a=0;break a}Da(b,e+12|0,4);if(H[e+12>>2]!=218793738){Ba(d,1,5007,0);a=0;break a}H[a+100>>2]=H[a+100>>2]|1;a=1}na=e+16|0;return a|0}function Xa(a,b,c){var d=0,e=0;a:{d=H[a>>2];e=H[a+4>>2];b:{if((d|0)!=(e|0)){e=H[a+8>>2];break b}d=e+10|0;H[a+4>>2]=d;e=Ha(H[a+8>>2],d<<2);if(!e){break a}H[a+8>>2]=e;d=H[a>>2]}H[(d<<2)+e>>2]=b;H[a>>2]=d+1;return 1}Ca(H[a+8>>2]);H[a>>2]=0;H[a+4>>2]=0;Ba(c,1,6123,0);return 0}function Dc(a){var b=0,c=0,d=0;c=na-16|0;na=c;F[c+15|0]=10;b=H[a+16>>2];a:{if(!b){if(Fb(a)){break a}b=H[a+16>>2]}d=b;b=H[a+20>>2];if(!((d|0)==(b|0)|H[a+80>>2]==10)){H[a+20>>2]=b+1;F[b|0]=10;break a}if((ra[H[a+36>>2]](a,c+15|0,1)|0)!=1){break a}}na=c+16|0}function tc(a){var b=0,c=0,d=0,e=0,f=0;d=H[a>>2];b=F[d|0]-48|0;if(b>>>0>9){return 0}while(1){e=-1;if(c>>>0<=214748364){c=N(c,10);e=(c^2147483647)>>>0>>0?-1:c+b|0}b=d+1|0;H[a>>2]=b;f=F[d+1|0];c=e;d=b;b=f-48|0;if(b>>>0<10){continue}break}return c} +function rc(a,b){var c=0,d=0,e=0;x(+a);d=s(1)|0;e=s(0)|0;c=d>>>20&2047;if((c|0)!=2047){if(!c){if(a==0){c=0}else{a=rc(a*0x10000000000000000,b);c=H[b>>2]+-64|0}H[b>>2]=c;return a}H[b>>2]=c-1022;u(0,e|0);u(1,d&-2146435073|1071644672);a=+w()}return a}function Sd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=O(0),f=0,g=0;d=na-16|0;na=d;if(c){while(1){Oc(a,d+12|0);e=L[d+12>>2];if(O(P(e))>2]=f;b=b+4|0;a=a+4|0;g=g+1|0;if((g|0)!=(c|0)){continue}break}}na=d+16|0}function Va(a){var b=0,c=0,d=0;if(a){b=H[a+24>>2];if(b){c=H[a+16>>2];if(c){b=0;while(1){d=H[(H[a+24>>2]+N(b,52)|0)+44>>2];if(d){Ca(d);c=H[a+16>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+24>>2]}Ca(b)}b=H[a+28>>2];if(b){Ca(b)}Ca(a)}}function Rd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=na-16|0;na=d;if(c){while(1){Mb(a,d+8|0);e=M[d+8>>3];if(P(e)<2147483647){f=~~e}else{f=-2147483648}H[b>>2]=f;b=b+4|0;a=a+8|0;g=g+1|0;if((g|0)!=(c|0)){continue}break}}na=d+16|0}function sd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=H[c+4>>2];e=H[c>>2]+H[c+8>>2]|0;if((d|0)==(e|0)){qa=-1;return-1}H[c+4>>2]=a+d;f=a;c=e-d|0;d=c;e=a>>>0>>0;a=c>>31;c=e&(a|0)>=(b|0)|(a|0)>(b|0);d=c?f:d;qa=c?b:a;return d|0}function we(a,b,c,d){var e=0,f=0,g=0,h=0;f=b^d;g=f>>31;e=b>>31;a=a^e;h=a-e|0;e=(b^e)-((a>>>0>>0)+e|0)|0;a=d>>31;b=c^a;f=f>>31;a=xe(h,e,b-a|0,(a^d)-((a>>>0>b>>>0)+a|0)|0)^f;b=a-f|0;qa=(g^qa)-((a>>>0>>0)+g|0)|0;return b}function Wa(a){var b=0,c=0,d=0,e=0;if(a){b=H[a+20>>2];c=H[a+16>>2];if(N(b,c)){while(1){e=H[H[a+24>>2]+(d<<2)>>2];if(e){Ca(e);c=H[a+16>>2];b=H[a+20>>2]}d=d+1|0;if(d>>>0>>0){continue}break}}Ca(H[a+24>>2]);Ca(a)}}function ec(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(d){while(1){e=f<<2;g=e+a|0;h=c+e|0;i=H[h>>2];j=b+e|0;k=H[j>>2];e=H[g>>2]-(i+k>>2)|0;H[g>>2]=e+i;H[j>>2]=e;H[h>>2]=e+k;f=f+1|0;if((f|0)!=(d|0)){continue}break}}}function cb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];e=ra[H[a+28>>2]](b,c,H[a>>2])|0;d=H[a+68>>2];if(!e){H[a+68>>2]=d|4;return 0}H[a+56>>2]=b;H[a+60>>2]=c;H[a+68>>2]=d&-5;return 1}function Na(a,b,c,d,e){var f=0;f=na-256|0;na=f;if(!(e&73728|(c|0)<=(d|0))){d=c-d|0;c=d>>>0<256;Ec(f,b,c?d:256);if(!c){while(1){La(a,f,256);d=d-256|0;if(d>>>0>255){continue}break}}La(a,f,d)}na=f+256|0}function te(a,b,c){var d=0,e=0,f=0,g=0,h=0;e=c>>>16|0;d=a>>>16|0;h=N(e,d);f=c&65535;a=a&65535;g=N(f,a);d=(g>>>16|0)+N(d,f)|0;a=(d&65535)+N(a,e)|0;qa=h+N(b,c)+(d>>>16)+(a>>>16)|0;return g&65535|a<<16}function Fb(a){var b=0;b=H[a+72>>2];H[a+72>>2]=b-1|b;b=H[a>>2];if(b&8){H[a>>2]=b|32;return-1}H[a+4>>2]=0;H[a+8>>2]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];return 0}function jc(a){var b=0,c=0;a:{if(I[a+12|0]==255){H[a+12>>2]=65280;H[a+16>>2]=7;b=H[a+8>>2];c=0;if(b>>>0>=K[a+4>>2]){break a}H[a+8>>2]=b+1;H[a+12>>2]=I[b|0]|65280}H[a+16>>2]=0;c=1}return c}function ud(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=H[c+4>>2];d=H[c>>2]+H[c+8>>2]|0;if((e|0)==(d|0)){return-1}d=d-e|0;b=b>>>0>d>>>0?d:b;if(b){B(a,e,b)}H[c+4>>2]=b+H[c+4>>2];return b|0}function Wd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=na-16|0;na=d;if(c){while(1){Oc(a,d+12|0);L[b>>2]=L[d+12>>2];b=b+4|0;a=a+4|0;e=e+1|0;if((e|0)!=(c|0)){continue}break}}na=d+16|0}function Vd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=na-16|0;na=d;if(c){while(1){Mb(a,d+8|0);L[b>>2]=M[d+8>>3];b=b+4|0;a=a+8|0;e=e+1|0;if((e|0)!=(c|0)){continue}break}}na=d+16|0}function cd(a,b){a=a|0;b=b|0;b=H[a+28>>2];if(b>>>0>2]){while(1){bc(a,H[a+24>>2]+(N(H[a+20>>2],b)<<2)|0);b=b+1|0;if(b>>>0>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function gd(a,b){a=a|0;b=+b;var c=0;ia(a|0,0)|0;a=(a|0)==2?27:(a|0)==1?26:14;a:{if(H[7170]>>>a-1&1){H[7202]=H[7202]|1<>2];if(c){ra[c|0](a)}}}function Jc(a,b){a=a|0;b=b|0;var c=0,d=0;c=H[a>>2];d=H[b>>2];a=H[a+4>>2];b=H[b+4>>2];return(c>>>0>d>>>0&(a|0)>=(b|0)|(a|0)>(b|0))-(c>>>0>>0&(a|0)<=(b|0)|(a|0)<(b|0))|0}function md(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=na-16|0;na=e;a=Ac(ea(H[a+60>>2],b|0,c|0,d&255,e+8|0)|0);na=e+16|0;qa=a?-1:H[e+12>>2];return(a?-1:H[e+8>>2])|0}function oc(a,b,c,d){var e=0,f=0;e=na-16|0;na=e;if(c){while(1){Da(a,e+12|0,d);L[b>>2]=K[e+12>>2];b=b+4|0;a=a+d|0;f=f+1|0;if((f|0)!=(c|0)){continue}break}}na=e+16|0}function nc(a,b,c,d){var e=0,f=0;e=na-16|0;na=e;if(c){while(1){Da(a,e+12|0,d);H[b>>2]=H[e+12>>2];b=b+4|0;a=a+d|0;f=f+1|0;if((f|0)!=(c|0)){continue}break}}na=e+16|0}function Mb(a,b){F[b+7|0]=I[a|0];F[b+6|0]=I[a+1|0];F[b+5|0]=I[a+2|0];F[b+4|0]=I[a+3|0];F[b+3|0]=I[a+4|0];F[b+2|0]=I[a+5|0];F[b+1|0]=I[a+6|0];F[b|0]=I[a+7|0]}function Ra(a){var b=0,c=0,d=0,e=0;b=H[a+12>>2];e=b;c=H[a+8>>2];if(!(b|c)){qa=0;return 0}d=H[a+56>>2];b=c-d|0;qa=e-(H[a+60>>2]+(c>>>0>>0)|0)|0;return b}function mc(a,b){var c=0;c=na-16|0;na=c;if(a){if(b&3){a=28}else{a=hb(b,a);H[c+12>>2]=a;a=a?0:48}a=a?0:H[c+12>>2]}else{a=0}na=c+16|0;return a}function Zc(a){a=a|0;var b=0;if(a){b=H[a+116>>2];if(b){Ca(b);H[a+116>>2]=0}b=H[a+120>>2];if(b){Ca(b);H[a+120>>2]=0}Ca(H[a+148>>2]);Ca(a)}} +function tb(a,b){var c=0,d=0;a:{if(b>>>0<=31){d=H[a>>2];c=a+4|0;break a}b=b-32|0;c=a}c=H[c>>2];H[a>>2]=d<>2]=c<>>32-b}function vb(a,b){var c=0,d=0;c=H[a+4>>2];a:{if(b>>>0<=31){d=H[a>>2];break a}b=b-32|0;d=c;c=0}H[a+4>>2]=c>>>b;H[a>>2]=c<<32-b|d>>>b}function ce(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(H[H[a+96>>2]+16>>2]<<2!=(c|0)){Ba(d,1,4464,0);a=0}else{a=1}return a|0}function lc(){var a=0,b=0;a=Ea(1,44);a:{if(a){H[a+16>>2]=0;b=Ea(1,8);H[a+36>>2]=b;if(b){break a}Ca(a)}a=0}return a}function Rb(a,b){a=a|0;b=b|0;if(!(!a|!b)){H[a+188>>2]=H[b+4>>2];H[a+184>>2]=H[b>>2];H[a+248>>2]=H[b+8248>>2]&2}}function rb(){var a=0,b=0;a=Ea(1,12);if(a){H[a+4>>2]=10;b=Ea(10,4);H[a+8>>2]=b;if(b){return a}Ca(a)}return 0}function Kd(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;D()}function gb(a){var b=0;if(a){b=H[a+4>>2];if(b){ra[b|0](H[a>>2])}Ca(H[a+32>>2]);H[a+32>>2]=0;Ca(a)}}function Qb(a,b){a=a|0;b=b|0;a:{if(!a){break a}H[a+208>>2]=b;if(!b){break a}F[a+92|0]=I[a+92|0]|8}}function rd(a,b,c){a=a|0;b=b|0;c=c|0;b=H[c+8>>2];H[c+4>>2]=H[c>>2]+(a>>>0>b>>>0?b:a);return 1}function ge(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(c){a=1}else{Ba(d,1,4375,0);a=0}return a|0}function lb(a){H[a>>2]=0;H[a+4>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0}function Vc(a,b,c){a=a|0;b=b|0;c=c|0;return!H[a+8>>2]&(H[a+216>>2]!=0&H[a+220>>2]!=0)}function Ta(a){if(H[a+12>>2]){H[a+40>>2]=0;while(1){if(H[a+24>>2]>0){continue}break}}}function Oc(a,b){F[b+3|0]=I[a|0];F[b+2|0]=I[a+1|0];F[b+1|0]=I[a+2|0];F[b|0]=I[a+3|0]}function ib(a){if(a){ra[H[(H[a+76>>2]?20:16)+a>>2]](H[a+48>>2]);H[a+48>>2]=0;Ca(a)}}function Pd(a,b){a=a|0;b=b|0;Rb(H[a>>2],b);F[a+124|0]=0;H[a+128>>2]=H[b+8248>>2]&1}function Ea(a,b){if(!a|!b){a=0}else{b=N(a,b);a=hb(8,b);if(a){Ec(a,0,b)}}return a}function Ga(a,b,c){var d=0;d=na-16|0;na=d;H[d+12>>2]=c;vc(a,b,c,0,0);na=d+16|0}function ze(a){var b=0;while(1){if(a){a=a-1&a;b=b+1|0;continue}break}return b}function $a(a){var b=0;if(a){b=H[a+12>>2];if(b){Ca(b);H[a+12>>2]=0}Ca(a)}}function Sc(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;D()}function Oa(a,b,c){a:{if(H[c+76>>2]<0){a=Eb(a,b,c);break a}a=Eb(a,b,c)}}function Id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Nb(H[a>>2],b,c,d)|0}function Jd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;D()}function yc(a,b){a=wc(a-1|0);if(!a){a=wc(b);a=a?a|32:0}return a}function Sb(a){return H[a+12>>2]==H[a+4>>2]|H[a+8>>2]==H[a>>2]}function Fd(a,b,c){a=a|0;b=b|0;c=c|0;return Nc(H[a>>2],b,c)|0}function wc(a){var b=0,c=0,d=0;return b=ve(a),c=0,d=a,d?b:c}function qb(a){var b=0;if(a){b=H[a+8>>2];if(b){Ca(b)}Ca(a)}}function kd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;qa=0;return 0}function _a(a,b,c,d,e,f,g,h){return cc(a,b,c,d,e,f,g,h,0)}function Pc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;D()}function pc(a,b,c,d){return ra[H[a+44>>2]](a,b,c,d)|0}function Ya(a,b,c){H[((b<<2)+a|0)+28>>2]=(c<<5)+20832}function Hb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 1}function Hd(a,b,c){a=a|0;b=b|0;c=c|0;Kb(H[a>>2],b,c)}function ve(a){if(a){return 31-Q(a-1^a)|0}return 32}function sb(a,b,c){return ra[H[a+40>>2]](a,b,0,c)|0}function ae(a,b,c){a=a|0;b=b|0;c=c|0;qa=-1;return-1}function Pa(a,b,c,d,e,f,g,h){cc(a,b,c,d,e,f,g,h,1)}function Ac(a){if(!a){return 0}H[6597]=a;return-1}function Yd(a,b,c){a=a|0;b=b|0;c=c|0;oc(a,b,c,2)}function Xd(a,b,c){a=a|0;b=b|0;c=c|0;oc(a,b,c,4)}function Ud(a,b,c){a=a|0;b=b|0;c=c|0;nc(a,b,c,2)}function Td(a,b,c){a=a|0;b=b|0;c=c|0;nc(a,b,c,4)}function ye(a,b,c){ue(a,0,b,c);qa=pa;return oa}function La(a,b,c){if(!(I[a|0]&32)){Eb(b,c,a)}}function ke(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Pb(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function Kc(a,b,c){a=a|0;b=b|0;c=c|0;return-1}function xe(a,b,c,d){a=ue(a,b,c,d);return a}function Fa(a){if(!a){return 0}return wb(a)}function Od(a,b){a=a|0;b=b|0;Qb(H[a>>2],b)}function Ec(a,b,c){if(c){y(a,b<<24>>24,c)}}function kc(a){return H[a+8>>2]-H[a>>2]|0}function ed(a){a=a|0;ga();fa(a+128|0);D()}function wb(a){a=a|0;return hb(8,a)|0}function od(a,b){a=a|0;b=b|0;_(a|0)}function nd(a,b){a=a|0;b=b|0;Y(a|0)}function Bb(a){return H[a+28>>2]!=2}function bb(a,b,c){if(c){B(a,b,c)}}function Wc(a,b){a=a|0;b=b|0;D()}function pb(a){return mc(a,32)}function Ia(a){return mc(a,16)}function fd(a){a=a|0;ha();D()}function Gb(){return Ea(1,36)}function Ub(a,b){a=a|0;b=b|0}function eb(a){if(a){Ca(a)}}function Rc(a){a=a|0;D()}function Qa(a){H[a>>2]=0}function dd(){D()} // EMSCRIPTEN_END_FUNCS -a=I;m(n);var sa=[null,cc,xe,ne,Uc,Uc,fb,Qd,Fd,zd,jd,id,hd,gd,fd,ed,dd,cd,Zb,ad,$c,_c,Zc,Tc,Ee,De,Ce,Be,Ae,ze,ye,we,ve,ue,te,se,re,qe,pe,Mb,oe,me,Mb,Mb,le,ke,je,ie,he,ge,fe,ee,de,ce,Zd,Nd,Md,Ld,Kd,Jd,Id,Hd,Gd,Ed,Dd,Cd,Bd,Ad,Qb,Rb,Tb,Zb,Pb,_b,$b,Bb,Yb,bd,Xb,Xc,Nb,Wb,gb,Za,Rd,Pd,Sd,_d,be,bd,Vd,Od,Td,Ud,$d,ae,Pc,Wd,Xd,Yd,cc,xd,wd,od,qd,pd,kd,td,ud,vd,sd,rd,ld,md];function ta(){return E.byteLength/65536|0}function ya(za){za=za|0;var ua=ta()|0;var va=ua+za|0;if(ua{Module["instantiateWasm"](info,(mod,inst)=>{resolve(receiveInstance(mod,inst))})})}wasmBinaryFile??=findWasmBinary();var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};function _copy_pixels_1(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);imageData.set(compG)}function _copy_pixels_3(compR_ptr,compG_ptr,compB_ptr,nb_pixels){compR_ptr>>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*3);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var _fd_close=fd=>52;var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);return 70}var printCharBuffers=[null,[],[]];var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead=NaN)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer));buffer.length=0}else{buffer.push(curr)}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0};function _gray_to_rgba(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);for(let i=0;i>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"]}Module["writeArrayToMemory"]=writeArrayToMemory;var wasmImports={m:__abort_js,l:__emscripten_runtime_keepalive_clear,n:__setitimer_js,g:_copy_pixels_1,f:_copy_pixels_3,e:_copy_pixels_4,o:_emscripten_resize_heap,p:_environ_get,q:_environ_sizes_get,b:_fd_close,j:_fd_seek,c:_fd_write,r:_gray_to_rgba,i:_graya_to_rgba,d:_jsPrintWarning,k:_proc_exit,h:_rgb_to_rgba,a:_storeErrorMessage};var wasmExports=createWasm();var ___wasm_call_ctors=wasmExports["t"];var _malloc=Module["_malloc"]=wasmExports["u"];var _free=Module["_free"]=wasmExports["v"];var _jp2_decode=Module["_jp2_decode"]=wasmExports["w"];var __emscripten_timeout=wasmExports["x"];var dynCall_iji=Module["dynCall_iji"]=wasmExports["dynCall_iji"];var dynCall_jji=Module["dynCall_jji"]=wasmExports["dynCall_jji"];var dynCall_iiji=Module["dynCall_iiji"]=wasmExports["dynCall_iiji"];var dynCall_jiji=Module["dynCall_jiji"]=wasmExports["dynCall_jiji"];function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}function preInit(){if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}preInit();run();moduleRtn=Module; - - - return moduleRtn; -} -); -})(); -export default OpenJPEG; +)(info)},instantiate:function(binary,info){return{then:function(ok){var module=new WebAssembly.Module(binary);ok({instance:new WebAssembly.Instance(module,info)})}}},RuntimeError:Error,isWasm2js:true};if(WebAssembly.isWasm2js){wasmBinary=[]}var ABORT=false;var EXITSTATUS;var readyPromiseResolve,readyPromiseReject;var wasmMemory;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["s"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(file){}function getBinarySync(file){}function instantiateSync(file,info){var module;var binary=getBinarySync(file);module=new WebAssembly.Module(binary);var instance=new WebAssembly.Instance(module,info);return[instance,module]}function getWasmImports(){return{a:wasmImports}}function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["r"];updateMemoryViews();assignWasmExports(wasmExports);return wasmExports}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{resolve(receiveInstance(mod,inst))})})}wasmBinaryFile??=findWasmBinary();var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};function _copy_pixels_1(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);imageData.set(compG)}function _copy_pixels_3(compR_ptr,compG_ptr,compB_ptr,nb_pixels){compR_ptr>>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*3);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.language||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);return 70}var printCharBuffers=[null,[],[]];var UTF8Decoder=new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(heapOrArray.buffer?heapOrArray.subarray(idx,endPtr):new Uint8Array(heapOrArray.slice(idx,endPtr)))};var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer));buffer.length=0}else{buffer.push(curr)}};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>{if(!ptr)return"";var end=findStringEnd(HEAPU8,ptr,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(HEAPU8.subarray(ptr,end))};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0};function _gray_to_rgba(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);for(let i=0;i>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jp2_decode,__emscripten_timeout,dynCall_iji,dynCall_jji,dynCall_iiji,dynCall_jiji;function assignWasmExports(wasmExports){Module["_malloc"]=_malloc=wasmExports["t"];Module["_free"]=_free=wasmExports["u"];Module["_jp2_decode"]=_jp2_decode=wasmExports["v"];__emscripten_timeout=wasmExports["w"];dynCall_iji=wasmExports["dynCall_iji"];dynCall_jji=wasmExports["dynCall_jji"];dynCall_iiji=wasmExports["dynCall_iiji"];dynCall_jiji=wasmExports["dynCall_jiji"]}var wasmImports={l:__abort_js,k:__emscripten_runtime_keepalive_clear,m:__setitimer_js,f:_copy_pixels_1,e:_copy_pixels_3,d:_copy_pixels_4,n:_emscripten_resize_heap,o:_environ_get,p:_environ_sizes_get,i:_fd_seek,b:_fd_write,q:_gray_to_rgba,h:_graya_to_rgba,c:_jsPrintWarning,j:_proc_exit,g:_rgb_to_rgba,a:_storeErrorMessage};function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=createWasm();run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} +;return moduleRtn}export default OpenJPEG; diff --git a/external/stylelint/no-unused-custom-properties.mjs b/external/stylelint/no-unused-custom-properties.mjs new file mode 100644 index 0000000000000..39a31d2693057 --- /dev/null +++ b/external/stylelint/no-unused-custom-properties.mjs @@ -0,0 +1,108 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { parse, registerWalkers, Root } from "postcss-values-parser"; +import { isString } from "stylelint/lib/utils/validateTypes.mjs"; +import stylelint from "stylelint"; + +const { + createPlugin, + utils: { report, validateOptions }, +} = stylelint; + +registerWalkers(Root); + +const ruleName = "pdfjs/no-unused-custom-properties"; + +// It's a very basic linter: we don't take into account scopes. +// But it should be enough for our use case. + +/** @type {import('stylelint').Plugin} */ +const ruleFunction = + (enabled, { ignoreList = [] } = {}, context = {}) => + (root, result) => { + const validOptions = validateOptions( + result, + ruleName, + { + actual: enabled, + possible: [true], + }, + { + actual: ignoreList, + possible: [isString], + optional: true, + } + ); + + if (!validOptions) { + return; + } + + ignoreList = ignoreList.map(s => (s.startsWith("--") ? s : `--${s}`)); + + const usedCustomProperties = new Set(ignoreList); + const definedCustomProperties = new Set(); + const usedBy = new Map(); + root.walkDecls(decl => { + let definingProperty = null; + if (decl.prop.startsWith("--")) { + // This is a custom property definition. + definingProperty = decl.prop; + definedCustomProperties.add(definingProperty); + } + // Parse the declaration value to find var() usages. + const parsedValue = parse(decl.value); + parsedValue.walkFuncs(node => { + if (!node.isVar || node.nodes.length === 0) { + return; + } + // This is a var() function; get the custom property name. + const property = node.nodes[0].value; + if (!definingProperty) { + // This is a usage of a custom property but not in a definition. + // width: var(--foo); + usedCustomProperties.add(property); + return; + } + let usages = usedBy.get(property); + if (!usages) { + usages = []; + usedBy.set(property, usages); + } + // Record that this custom property is used by the defining property. + // --foo: var(--bar); + // bar is really used only if foo is. + usages.push(definingProperty); + }); + }); + const isUsed = p => + usedCustomProperties.has(p) || (usedBy.get(p) || []).some(isUsed); + for (const customProperty of definedCustomProperties) { + if (isUsed(customProperty)) { + continue; + } + report({ + message: `Custom property "${customProperty}" is defined but never used.`, + node: root, + result, + ruleName, + }); + } + }; + +ruleFunction.ruleName = ruleName; + +export default createPlugin(ruleName, ruleFunction); diff --git a/gulpfile.mjs b/gulpfile.mjs index ba7db132f80c8..4e4d1b740314e 100644 --- a/gulpfile.mjs +++ b/gulpfile.mjs @@ -21,6 +21,7 @@ import { exec, execSync, spawn, spawnSync } from "child_process"; import artifactoryUpload from "gulp-artifactory-upload"; import autoprefixer from "autoprefixer"; import babel from "@babel/core"; +import { buildPrefsSchema } from "./external/chromium/prefs.mjs"; import crypto from "crypto"; import fs from "fs"; import gulp from "gulp"; @@ -70,6 +71,7 @@ const GH_PAGES_DIR = BUILD_DIR + "gh-pages/"; const DIST_DIR = BUILD_DIR + "dist/"; const TYPES_DIR = BUILD_DIR + "types/"; const TMP_DIR = BUILD_DIR + "tmp/"; +const PREFSTEST_DIR = BUILD_DIR + "prefstest/"; const TYPESTEST_DIR = BUILD_DIR + "typestest/"; const COMMON_WEB_FILES = [ "web/images/*.{png,svg,gif}", @@ -104,7 +106,7 @@ const AUTOPREFIXER_CONFIG = { const BABEL_TARGETS = ENV_TARGETS.join(", "); const BABEL_PRESET_ENV_OPTS = Object.freeze({ - corejs: "3.45.0", + corejs: "3.47.0", exclude: ["web.structured-clone"], shippedProposals: true, useBuiltIns: "usage", @@ -219,13 +221,13 @@ function createWebpackAlias(defines) { "web-pdf_layer_viewer": "web/pdf_layer_viewer.js", "web-pdf_outline_viewer": "web/pdf_outline_viewer.js", "web-pdf_presentation_mode": "web/pdf_presentation_mode.js", - "web-pdf_sidebar": "web/pdf_sidebar.js", "web-pdf_thumbnail_viewer": "web/pdf_thumbnail_viewer.js", "web-preferences": "", "web-print_service": "", "web-secondary_toolbar": "web/secondary_toolbar.js", "web-signature_manager": "web/signature_manager.js", "web-toolbar": "web/toolbar.js", + "web-views_manager": "web/views_manager.js", }; if (defines.CHROME) { @@ -291,7 +293,6 @@ function createWebpackConfig( disableVersionInfo = false, disableSourceMaps = false, disableLicenseHeader = false, - defaultPreferencesDir = null, } = {} ) { const versionInfo = !disableVersionInfo @@ -302,9 +303,6 @@ function createWebpackConfig( BUNDLE_VERSION: versionInfo.version, BUNDLE_BUILD: versionInfo.commit, TESTING: defines.TESTING ?? process.env.TESTING === "true", - DEFAULT_PREFERENCES: defaultPreferencesDir - ? getDefaultPreferences(defaultPreferencesDir) - : {}, DEFAULT_FTL: defines.GENERIC ? getDefaultFtl() : "", }; const licenseHeaderLibre = fs @@ -494,51 +492,6 @@ function getDeployUrl(isRelease = false) { return repoURL + "com/mastercontrol/mcPDFjs/" + version; } -function checkChromePreferencesFile(chromePrefsPath, webPrefs) { - const chromePrefs = JSON.parse(fs.readFileSync(chromePrefsPath).toString()); - const chromePrefsKeys = Object.keys(chromePrefs.properties).filter(key => { - const description = chromePrefs.properties[key].description; - // Deprecated keys are allowed in the managed preferences file. - // The code maintainer is responsible for adding migration logic to - // extensions/chromium/options/migration.js and web/chromecom.js . - return !description?.startsWith("DEPRECATED."); - }); - - let ret = true; - // Verify that every entry in webPrefs is also in preferences_schema.json. - for (const [key, value] of Object.entries(webPrefs)) { - if (!chromePrefsKeys.includes(key)) { - // Note: this would also reject keys that are present but marked as - // DEPRECATED. A key should not be marked as DEPRECATED if it is still - // listed in webPrefs. - ret = false; - console.log( - `Warning: ${chromePrefsPath} does not contain an entry for pref: ${key}` - ); - } else if (chromePrefs.properties[key].default !== value) { - ret = false; - console.log( - `Warning: not the same values (for "${key}"): ` + - `${chromePrefs.properties[key].default} !== ${value}` - ); - } - } - - // Verify that preferences_schema.json does not contain entries that are not - // in webPrefs (app_options.js). - for (const key of chromePrefsKeys) { - if (!(key in webPrefs)) { - ret = false; - console.log( - `Warning: ${chromePrefsPath} contains an unrecognized pref: ${key}. ` + - `Remove it, or prepend "DEPRECATED. " and add migration logic to ` + - `extensions/chromium/options/migration.js and web/chromecom.js.` - ); - } - } - return ret; -} - function createMainBundle(defines) { const mainFileConfig = createWebpackConfig(defines, { filename: defines.MINIFIED ? "pdf.min.mjs" : "pdf.mjs", @@ -632,36 +585,24 @@ function createWorkerBundle(defines) { } function createWebBundle(defines, options) { - const viewerFileConfig = createWebpackConfig( - defines, - { - filename: "viewer.mjs", - library: { - type: "module", - }, + const viewerFileConfig = createWebpackConfig(defines, { + filename: "viewer.mjs", + library: { + type: "module", }, - { - defaultPreferencesDir: options.defaultPreferencesDir, - } - ); + }); return gulp .src("./web/viewer.js", { encoding: false }) .pipe(webpack2Stream(viewerFileConfig)); } function createGVWebBundle(defines, options) { - const viewerFileConfig = createWebpackConfig( - defines, - { - filename: "viewer-geckoview.mjs", - library: { - type: "module", - }, + const viewerFileConfig = createWebpackConfig(defines, { + filename: "viewer-geckoview.mjs", + library: { + type: "module", }, - { - defaultPreferencesDir: options.defaultPreferencesDir, - } - ); + }); return gulp .src("./web/viewer-geckoview.js", { encoding: false }) .pipe(webpack2Stream(viewerFileConfig)); @@ -738,6 +679,10 @@ function createWasmBundle() { base: "external/qcms", encoding: false, }), + gulp.src(["external/jbig2/*.wasm", "external/jbig2/LICENSE_*"], { + base: "external/jbig2", + encoding: false, + }), ]); } @@ -775,8 +720,7 @@ function getTempFile(prefix, suffix) { function runTests(testsName, { bot = false, xfaOnly = false } = {}) { return new Promise((resolve, reject) => { - console.log(); - console.log("### Running " + testsName + " tests"); + console.log("\n### Running " + testsName + " tests"); const PDF_TEST = process.env.PDF_TEST || "test_manifest.json"; let forceNoChrome = false; @@ -861,8 +805,7 @@ function collectArgs(options, args) { } function makeRef(done, bot) { - console.log(); - console.log("### Creating reference images"); + console.log("\n### Creating reference images"); let forceNoChrome = false; const args = ["test.mjs", "--masterMode"]; @@ -913,8 +856,7 @@ gulp.task("default", function (done) { }); function createBuildNumber(done) { - console.log(); - console.log("### Getting extension build number"); + console.log("\n### Getting extension build number"); exec( "git log --format=oneline " + config.baseVersion + "..", @@ -959,8 +901,7 @@ function createBuildNumber(done) { } function buildDefaultPreferences(defines, dir) { - console.log(); - console.log("### Building default preferences"); + console.log(`\n### Building default preferences (${dir})`); const bundleDefines = { ...defines, @@ -986,12 +927,14 @@ function buildDefaultPreferences(defines, dir) { .pipe(gulp.dest(DEFAULT_PREFERENCES_DIR + dir)); } -async function parseDefaultPreferences(dir) { - console.log(); - console.log("### Parsing default preferences"); +function getDefaultPreferences(dir) { + console.log(`\n### Parsing default preferences (${dir})`); + + const require = process + .getBuiltinModule("module") + .createRequire(import.meta.url); - // eslint-disable-next-line no-unsanitized/method - const { AppOptions, OptionKind } = await import( + const { AppOptions, OptionKind } = require( "./" + DEFAULT_PREFERENCES_DIR + dir + "app_options.mjs" ); @@ -1000,20 +943,9 @@ async function parseDefaultPreferences(dir) { /* defaultOnly = */ true ); if (Object.keys(prefs).length === 0) { - throw new Error("No default preferences found."); + throw new Error(`No default preferences found in "${dir}".`); } - - fs.writeFileSync( - DEFAULT_PREFERENCES_DIR + dir + "default_preferences.json", - JSON.stringify(prefs) - ); -} - -function getDefaultPreferences(dir) { - const str = fs - .readFileSync(DEFAULT_PREFERENCES_DIR + dir + "default_preferences.json") - .toString(); - return JSON.parse(str); + return prefs; } function getDefaultFtl() { @@ -1034,8 +966,7 @@ function getDefaultFtl() { gulp.task("locale", function () { const VIEWER_LOCALE_OUTPUT = "web/locale/"; - console.log(); - console.log("### Building localization files"); + console.log("\n### Building localization files"); fs.rmSync(VIEWER_LOCALE_OUTPUT, { recursive: true, force: true }); fs.mkdirSync(VIEWER_LOCALE_OUTPUT, { recursive: true }); @@ -1083,8 +1014,7 @@ gulp.task("cmaps", async function () { const CMAP_INPUT = "external/cmaps"; const VIEWER_CMAP_OUTPUT = "external/bcmaps"; - console.log(); - console.log("### Building cmaps"); + console.log("\n### Building cmaps"); // Testing a file that usually present. if (!checkFile(CMAP_INPUT + "/UniJIS-UCS2-H")) { @@ -1100,9 +1030,8 @@ gulp.task("cmaps", async function () { } }); - const { compressCmaps } = await import( - "./external/cmapscompress/compress.mjs" - ); + const { compressCmaps } = + await import("./external/cmapscompress/compress.mjs"); compressCmaps(CMAP_INPUT, VIEWER_CMAP_OUTPUT, true); }); @@ -1146,11 +1075,7 @@ function buildGeneric(defines, dir) { createMainBundle(defines).pipe(gulp.dest(dir + "build")), createWorkerBundle(defines).pipe(gulp.dest(dir + "build")), createSandboxBundle(defines).pipe(gulp.dest(dir + "build")), - createWebBundle(defines, { - defaultPreferencesDir: defines.SKIP_BABEL - ? "generic/" - : "generic-legacy/", - }).pipe(gulp.dest(dir + "web")), + createWebBundle(defines).pipe(gulp.dest(dir + "web")), gulp .src(COMMON_WEB_FILES, { base: "web/", encoding: false }) .pipe(gulp.dest(dir + "web")), @@ -1194,17 +1119,10 @@ gulp.task( "locale", function scriptingGeneric() { const defines = { ...DEFINES, GENERIC: true }; - return ordered([ - buildDefaultPreferences(defines, "generic/"), - createTemporaryScriptingBundle(defines), - ]); - }, - async function prefsGeneric() { - await parseDefaultPreferences("generic/"); + return createTemporaryScriptingBundle(defines); }, function createGeneric() { - console.log(); - console.log("### Creating generic viewer"); + console.log("\n### Creating generic viewer"); const defines = { ...DEFINES, GENERIC: true }; return buildGeneric(defines, GENERIC_DIR); @@ -1221,17 +1139,10 @@ gulp.task( "locale", function scriptingGenericLegacy() { const defines = { ...DEFINES, GENERIC: true, SKIP_BABEL: false }; - return ordered([ - buildDefaultPreferences(defines, "generic-legacy/"), - createTemporaryScriptingBundle(defines), - ]); - }, - async function prefsGenericLegacy() { - await parseDefaultPreferences("generic-legacy/"); + return createTemporaryScriptingBundle(defines); }, function createGenericLegacy() { - console.log(); - console.log("### Creating generic (legacy) viewer"); + console.log("\n### Creating generic (legacy) viewer"); const defines = { ...DEFINES, GENERIC: true, SKIP_BABEL: false }; return buildGeneric(defines, GENERIC_LEGACY_DIR); @@ -1242,16 +1153,7 @@ gulp.task( function buildComponents(defines, dir) { fs.rmSync(dir, { recursive: true, force: true }); - const COMPONENTS_IMAGES = [ - "web/images/annotation-*.svg", - "web/images/loading-icon.gif", - "web/images/altText_*.svg", - "web/images/editor-toolbar-*.svg", - "web/images/messageBar_*.svg", - "web/images/toolbarButton-{editorHighlight,menuArrow}.svg", - "web/images/cursor-*.svg", - "web/images/comment-*.svg", - ]; + const COMPONENTS_IMAGES = ["web/images/*.svg", "web/images/*.gif"]; return ordered([ createComponentsBundle(defines).pipe(gulp.dest(dir)), @@ -1275,8 +1177,7 @@ function buildComponents(defines, dir) { gulp.task( "components", gulp.series(createBuildNumber, function createComponents() { - console.log(); - console.log("### Creating generic components"); + console.log("\n### Creating generic components"); const defines = { ...DEFINES, COMPONENTS: true, GENERIC: true }; return buildComponents(defines, COMPONENTS_DIR); @@ -1286,8 +1187,7 @@ gulp.task( gulp.task( "components-legacy", gulp.series(createBuildNumber, function createComponentsLegacy() { - console.log(); - console.log("### Creating generic (legacy) components"); + console.log("\n### Creating generic (legacy) components"); const defines = { ...DEFINES, COMPONENTS: true, @@ -1302,8 +1202,7 @@ gulp.task( gulp.task( "image_decoders", gulp.series(createBuildNumber, function createImageDecoders() { - console.log(); - console.log("### Creating image decoders"); + console.log("\n### Creating image decoders"); const defines = { ...DEFINES, GENERIC: true, IMAGE_DECODERS: true }; return createImageDecodersBundle(defines).pipe( @@ -1315,8 +1214,7 @@ gulp.task( gulp.task( "image_decoders-legacy", gulp.series(createBuildNumber, function createImageDecodersLegacy() { - console.log(); - console.log("### Creating (legacy) image decoders"); + console.log("\n### Creating (legacy) image decoders"); const defines = { ...DEFINES, GENERIC: true, @@ -1350,17 +1248,10 @@ gulp.task( "locale", function scriptingMinified() { const defines = { ...DEFINES, MINIFIED: true, GENERIC: true }; - return ordered([ - buildDefaultPreferences(defines, "minified/"), - createTemporaryScriptingBundle(defines), - ]); - }, - async function prefsMinified() { - await parseDefaultPreferences("minified/"); + return createTemporaryScriptingBundle(defines); }, function createMinified() { - console.log(); - console.log("### Creating minified viewer"); + console.log("\n### Creating minified viewer"); const defines = { ...DEFINES, MINIFIED: true, GENERIC: true }; return buildMinified(defines, MINIFIED_DIR); @@ -1380,17 +1271,10 @@ gulp.task( GENERIC: true, SKIP_BABEL: false, }; - return ordered([ - buildDefaultPreferences(defines, "minified-legacy/"), - createTemporaryScriptingBundle(defines), - ]); - }, - async function prefsMinifiedLegacy() { - await parseDefaultPreferences("minified-legacy/"); + return createTemporaryScriptingBundle(defines); }, function createMinifiedLegacy() { - console.log(); - console.log("### Creating minified (legacy) viewer"); + console.log("\n### Creating minified (legacy) viewer"); const defines = { ...DEFINES, MINIFIED: true, @@ -1404,6 +1288,8 @@ gulp.task( ); function createDefaultPrefsFile() { + console.log("\n### Building mozilla-central preferences file"); + const defaultFileName = "PdfJsDefaultPrefs.js", overrideFileName = "PdfJsOverridePrefs.js"; const licenseHeader = fs.readFileSync("./src/license_header.js").toString(); @@ -1442,12 +1328,8 @@ gulp.task( const defines = { ...DEFINES, MOZCENTRAL: true }; return buildDefaultPreferences(defines, "mozcentral/"); }, - async function prefsMozcentral() { - await parseDefaultPreferences("mozcentral/"); - }, function createMozcentral() { - console.log(); - console.log("### Building mozilla-central extension"); + console.log("\n### Building mozilla-central extension"); const defines = { ...DEFINES, MOZCENTRAL: true }; const gvDefines = { ...defines, GECKOVIEW: true }; @@ -1481,12 +1363,12 @@ gulp.task( createWorkerBundle(defines).pipe( gulp.dest(MOZCENTRAL_CONTENT_DIR + "build") ), - createWebBundle(defines, { defaultPreferencesDir: "mozcentral/" }).pipe( + createWebBundle(defines).pipe( + gulp.dest(MOZCENTRAL_CONTENT_DIR + "web") + ), + createGVWebBundle(gvDefines).pipe( gulp.dest(MOZCENTRAL_CONTENT_DIR + "web") ), - createGVWebBundle(gvDefines, { - defaultPreferencesDir: "mozcentral/", - }).pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR + "web")), gulp .src(MOZCENTRAL_WEB_FILES, { base: "web/", encoding: false }) .pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR + "web")), @@ -1538,6 +1420,18 @@ gulp.task( ) ); +function createChromiumPrefsSchema() { + console.log("\n### Building Chromium preferences file"); + + const prefs = getDefaultPreferences("chromium/"); + const chromiumPrefs = buildPrefsSchema(prefs); + + return createStringSource( + "preferences_schema.json", + JSON.stringify(chromiumPrefs, null, 2) + ); +} + gulp.task( "chromium", gulp.series( @@ -1550,12 +1444,8 @@ gulp.task( createTemporaryScriptingBundle(defines), ]); }, - async function prefsChromium() { - await parseDefaultPreferences("chromium/"); - }, function createChromium() { - console.log(); - console.log("### Building Chromium extension"); + console.log("\n### Building Chromium extension"); const defines = { ...DEFINES, CHROME: true, SKIP_BABEL: false }; const CHROME_BUILD_DIR = BUILD_DIR + "/chromium/", @@ -1581,7 +1471,7 @@ gulp.task( createSandboxBundle(defines).pipe( gulp.dest(CHROME_BUILD_CONTENT_DIR + "build") ), - createWebBundle(defines, { defaultPreferencesDir: "chromium/" }).pipe( + createWebBundle(defines).pipe( gulp.dest(CHROME_BUILD_CONTENT_DIR + "web") ), gulp @@ -1630,22 +1520,19 @@ gulp.task( .pipe(replace(/\bPDFJSSCRIPT_VERSION\b/g, version)) .pipe(gulp.dest(CHROME_BUILD_DIR)), gulp - .src( - [ - "extensions/chromium/**/*.{html,js,css,png}", - "extensions/chromium/preferences_schema.json", - ], - { base: "extensions/chromium/", encoding: false } - ) + .src(["extensions/chromium/**/*.{html,js,css,png}"], { + base: "extensions/chromium/", + encoding: false, + }) .pipe(gulp.dest(CHROME_BUILD_DIR)), + createChromiumPrefsSchema().pipe(gulp.dest(CHROME_BUILD_DIR)), ]); } ) ); gulp.task("jsdoc", function (done) { - console.log(); - console.log("### Generating documentation (JSDoc)"); + console.log("\n### Generating documentation (JSDoc)"); fs.rmSync(JSDOC_BUILD_DIR, { recursive: true, force: true }); fs.mkdirSync(JSDOC_BUILD_DIR, { recursive: true }); @@ -1718,9 +1605,6 @@ function buildLib(defines, dir) { BUNDLE_VERSION: versionInfo.version, BUNDLE_BUILD: versionInfo.commit, TESTING: defines.TESTING ?? process.env.TESTING === "true", - DEFAULT_PREFERENCES: getDefaultPreferences( - defines.SKIP_BABEL ? "lib/" : "lib-legacy/" - ), DEFAULT_FTL: getDefaultFtl(), }; @@ -1739,6 +1623,7 @@ function buildLib(defines, dir) { gulp.src("test/unit/*.js", { base: ".", encoding: false }), gulp.src("external/openjpeg/*.js", { base: "openjpeg/", encoding: false }), gulp.src("external/qcms/*.js", { base: "qcms/", encoding: false }), + gulp.src("external/jbig2/*.js", { base: "jbig2/", encoding: false }), ]); return buildLibHelper(bundleDefines, inputStream, dir); @@ -1750,13 +1635,7 @@ gulp.task( createBuildNumber, function scriptingLib() { const defines = { ...DEFINES, GENERIC: true, LIB: true }; - return ordered([ - buildDefaultPreferences(defines, "lib/"), - createTemporaryScriptingBundle(defines), - ]); - }, - async function prefsLib() { - await parseDefaultPreferences("lib/"); + return createTemporaryScriptingBundle(defines); }, function createLib() { const defines = { ...DEFINES, GENERIC: true, LIB: true }; @@ -1780,13 +1659,7 @@ gulp.task( LIB: true, SKIP_BABEL: false, }; - return ordered([ - buildDefaultPreferences(defines, "lib-legacy/"), - createTemporaryScriptingBundle(defines), - ]); - }, - async function prefsLibLegacy() { - await parseDefaultPreferences("lib-legacy/"); + return createTemporaryScriptingBundle(defines); }, function createLibLegacy() { const defines = { @@ -1969,6 +1842,49 @@ gulp.task( ) ); +gulp.task( + "prefstest", + gulp.series( + setTestEnv, + function genericPrefs() { + const defines = { ...DEFINES, GENERIC: true }; + return buildDefaultPreferences(defines, "generic/"); + }, + function genericLegacyPrefs() { + const defines = { ...DEFINES, GENERIC: true, SKIP_BABEL: false }; + return buildDefaultPreferences(defines, "generic-legacy/"); + }, + function chromiumPrefs() { + const defines = { ...DEFINES, CHROME: true, SKIP_BABEL: false }; + return buildDefaultPreferences(defines, "chromium/"); + }, + function mozcentralPrefs() { + const defines = { ...DEFINES, MOZCENTRAL: true }; + return buildDefaultPreferences(defines, "mozcentral/"); + }, + function checkPrefs() { + console.log("\n### Checking preference generation"); + + // Check that the preferences were correctly generated, + // for all the relevant builds. + for (const dir of [ + "generic/", + "generic-legacy/", + "chromium/", + "mozcentral/", + ]) { + getDefaultPreferences(dir); + } + + // Check that all the relevant files can be generated. + return ordered([ + createChromiumPrefsSchema().pipe(gulp.dest(PREFSTEST_DIR)), + createDefaultPrefsFile().pipe(gulp.dest(PREFSTEST_DIR)), + ]); + } + ) +); + gulp.task( "typestest", gulp.series( @@ -2002,8 +1918,7 @@ gulp.task( ); function createBaseline(done) { - console.log(); - console.log("### Creating baseline environment"); + console.log("\n### Creating baseline environment"); const baselineCommit = process.env.BASELINE; if (!baselineCommit) { @@ -2064,8 +1979,7 @@ gulp.task( ); gulp.task("lint", function (done) { - console.log(); - console.log("### Linting JS/CSS/JSON/SVG files"); + console.log("\n### Linting JS/CSS/JSON/SVG/HTML files"); // Ensure that we lint the Firefox specific *.jsm files too. const esLintOptions = [ @@ -2089,9 +2003,10 @@ gulp.task("lint", function (done) { const prettierOptions = [ "node_modules/prettier/bin/prettier.cjs", "**/*.json", + "**/*.html", ]; if (process.argv.includes("--fix")) { - prettierOptions.push("--log-level", "silent", "--write"); + prettierOptions.push("--log-level", "error", "--write"); } else { prettierOptions.push("--log-level", "warn", "--check"); } @@ -2142,36 +2057,31 @@ gulp.task("lint", function (done) { }); gulp.task( - "lint-chromium", - gulp.series( - function scriptingLintChromium() { - const defines = { - ...DEFINES, - CHROME: true, - SKIP_BABEL: false, - TESTING: false, - }; - return buildDefaultPreferences(defines, "lint-chromium/"); - }, - async function prefsLintChromium() { - await parseDefaultPreferences("lint-chromium/"); - }, - function runLintChromium(done) { - console.log(); - console.log("### Checking supplemental Chromium files"); - - if ( - !checkChromePreferencesFile( - "extensions/chromium/preferences_schema.json", - getDefaultPreferences("lint-chromium/") - ) - ) { - done(new Error("chromium/preferences_schema is not in sync.")); + "lint-mozcentral", + gulp.series("mozcentral", function runLintMozcentral(done) { + console.log("\n### Checking mozilla-central files"); + + const styleLintOptions = [ + "../../node_modules/stylelint/bin/stylelint.mjs", + "**/*.css", + "--report-needless-disables", + "--config", + "../../stylelint-mozcentral.json", + ]; + + const styleLintProcess = startNode(styleLintOptions, { + stdio: "inherit", + cwd: BUILD_DIR + "mozcentral/", + }); + styleLintProcess.on("close", function (styleLintCode) { + if (styleLintCode !== 0) { + done(new Error("Stylelint failed.")); return; } + console.log("files checked, no errors found"); done(); - } - ) + }); + }) ); gulp.task("dev-wasm", function () { @@ -2193,8 +2103,7 @@ gulp.task( }); }, function createDevSandbox() { - console.log(); - console.log("### Building development sandbox"); + console.log("\n### Building development sandbox"); const defines = { ...DEFINES, GENERIC: true, TESTING: true }; const sandboxDir = BUILD_DIR + "dev-sandbox/"; @@ -2220,7 +2129,7 @@ gulp.task( }, function watchWasm() { gulp.watch( - ["external/openjpeg/*", "external/qcms/*"], + ["external/openjpeg/*", "external/qcms/*", "external/jbig2/*"], { ignoreInitial: false }, gulp.series("dev-wasm") ); @@ -2238,8 +2147,7 @@ gulp.task( ); }, async function createServer() { - console.log(); - console.log("### Starting local server"); + console.log("\n### Starting local server"); let port = 8888; const i = process.argv.indexOf("--port"); @@ -2260,8 +2168,7 @@ gulp.task( ); gulp.task("clean", function (done) { - console.log(); - console.log("### Cleaning up project builds"); + console.log("\n### Cleaning up project builds"); fs.rmSync(BUILD_DIR, { recursive: true, force: true }); done(); @@ -2325,8 +2232,7 @@ function mcDeploy(deployUrl, done) { gulp.task("importl10n", async function () { const { downloadL10n } = await import("./external/importL10n/locales.mjs"); - console.log(); - console.log("### Importing translations from mozilla-central"); + console.log("\n### Importing translations from mozilla-central"); if (!fs.existsSync(L10N_DIR)) { fs.mkdirSync(L10N_DIR); @@ -2335,8 +2241,7 @@ gulp.task("importl10n", async function () { }); function ghPagesPrepare() { - console.log(); - console.log("### Creating web site"); + console.log("\n### Creating web site"); fs.rmSync(GH_PAGES_DIR, { recursive: true, force: true }); @@ -2437,7 +2342,8 @@ function packageJson() { bugs: DIST_BUGS_URL, license: DIST_LICENSE, optionalDependencies: { - "@napi-rs/canvas": "^0.1.77", + "@napi-rs/canvas": "^0.1.88", + "node-readable-to-web-readable-stream": "^0.4.2", }, browser: { canvas: false, @@ -2604,8 +2510,7 @@ gulp.task( gulp.task( "mozcentralbaseline", gulp.series(createBaseline, function createMozcentralBaseline(done) { - console.log(); - console.log("### Creating mozcentral baseline environment"); + console.log("\n### Creating mozcentral baseline environment"); // Create a mozcentral build. fs.rmSync(BASELINE_DIR + BUILD_DIR, { recursive: true, force: true }); @@ -2642,8 +2547,7 @@ gulp.task( "mozcentral", "mozcentralbaseline", function createMozcentralDiff(done) { - console.log(); - console.log("### Creating mozcentral diff"); + console.log("\n### Creating mozcentral diff"); // Create the diff between the current mozcentral build and the // baseline mozcentral build, which both exist at this point. @@ -2685,14 +2589,12 @@ gulp.task( ); gulp.task("externaltest", function (done) { - console.log(); - console.log("### Running test-fixtures.js"); + console.log("\n### Running test-fixtures.js"); safeSpawnSync("node", ["external/builder/test-fixtures.mjs"], { stdio: "inherit", }); - console.log(); - console.log("### Running test-fixtures_babel.js"); + console.log("\n### Running test-fixtures_babel.js"); safeSpawnSync("node", ["external/builder/test-fixtures_babel.mjs"], { stdio: "inherit", }); diff --git a/l10n/ach/viewer.ftl b/l10n/ach/viewer.ftl index 7eda039ba22b2..8f101454057ea 100644 --- a/l10n/ach/viewer.ftl +++ b/l10n/ach/viewer.ftl @@ -71,24 +71,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Jami me gin acoya… pdfjs-document-properties-file-name = Nying pwail: pdfjs-document-properties-file-size = Dit pa pwail: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Wiye: pdfjs-document-properties-author = Ngat mucoyo: pdfjs-document-properties-subject = Subjek: pdfjs-document-properties-keywords = Lok mapire tek: pdfjs-document-properties-creation-date = Nino dwe me cwec: pdfjs-document-properties-modification-date = Nino dwe me yub: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Lacwec: pdfjs-document-properties-producer = Layub PDF: pdfjs-document-properties-version = Kit PDF: diff --git a/l10n/af/viewer.ftl b/l10n/af/viewer.ftl index 6407e51c28e47..577888cc8b8a7 100644 --- a/l10n/af/viewer.ftl +++ b/l10n/af/viewer.ftl @@ -71,24 +71,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Dokumenteienskappe… pdfjs-document-properties-file-name = Lêernaam: pdfjs-document-properties-file-size = Lêergrootte: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kG ({ $size_b } grepe) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MG ({ $size_b } grepe) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Outeur: pdfjs-document-properties-subject = Onderwerp: pdfjs-document-properties-keywords = Sleutelwoorde: pdfjs-document-properties-creation-date = Skeppingsdatum: pdfjs-document-properties-modification-date = Wysigingsdatum: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Skepper: pdfjs-document-properties-producer = PDF-vervaardiger: pdfjs-document-properties-version = PDF-weergawe: diff --git a/l10n/an/viewer.ftl b/l10n/an/viewer.ftl index 538dcfdfc9c49..ad5d2fe81a135 100644 --- a/l10n/an/viewer.ftl +++ b/l10n/an/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Propiedatz d'o documento... pdfjs-document-properties-file-name = Nombre de fichero: pdfjs-document-properties-file-size = Grandaria d'o fichero: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Titol: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Afer: pdfjs-document-properties-keywords = Parolas clau: pdfjs-document-properties-creation-date = Calendata de creyación: pdfjs-document-properties-modification-date = Calendata de modificación: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creyador: pdfjs-document-properties-producer = Creyador de PDF: pdfjs-document-properties-version = Versión de PDF: @@ -223,10 +211,6 @@ pdfjs-rendering-error = Ha ocurriu una error en renderizar a pachina. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/ar/viewer.ftl b/l10n/ar/viewer.ftl index 458dbc18f763a..b55b88cba6a5b 100644 --- a/l10n/ar/viewer.ftl +++ b/l10n/ar/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } م.بايت ({ $b } بايتات) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } ك.بايت ({ $size_b } بايت) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } م.بايت ({ $size_b } بايت) pdfjs-document-properties-title = العنوان: pdfjs-document-properties-author = المؤلف: pdfjs-document-properties-subject = الموضوع: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = تاريخ التعديل: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }، { $time } pdfjs-document-properties-creator = المنشئ: pdfjs-document-properties-producer = منتج PDF: pdfjs-document-properties-version = إصدارة PDF: @@ -283,10 +271,6 @@ pdfjs-rendering-error = حدث خطأ أثناء عرض الصفحة. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }، { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -386,20 +370,12 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = محرِّر النص .default-content = ابدأ في كتابة… -pdfjs-free-text = - .aria-label = محرِّر النص -pdfjs-free-text-default-content = ابدأ الكتابة… -pdfjs-ink = - .aria-label = محرِّر الرسم -pdfjs-ink-canvas = - .aria-label = صورة أنشأها المستخدم ## Alt-text dialog pdfjs-editor-alt-text-button-label = نص بديل pdfjs-editor-alt-text-edit-button = .aria-label = حرّر النص البديل -pdfjs-editor-alt-text-edit-button-label = تحرير النص البديل pdfjs-editor-alt-text-dialog-label = اختر خيار pdfjs-editor-alt-text-dialog-description = يساعد النص البديل عندما لا يتمكن الأشخاص من رؤية الصورة أو عندما لا يتم تحميلها. pdfjs-editor-alt-text-add-description-label = أضِف وصف @@ -419,14 +395,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = الزاوية اليُسرى العُليا — غيّر الحجم -pdfjs-editor-resizer-label-top-middle = أعلى الوسط - غيّر الحجم -pdfjs-editor-resizer-label-top-right = الزاوية اليُمنى العُليا - غيّر الحجم -pdfjs-editor-resizer-label-middle-right = اليمين الأوسط - غيّر الحجم -pdfjs-editor-resizer-label-bottom-right = الزاوية اليُمنى السُفلى - غيّر الحجم -pdfjs-editor-resizer-label-bottom-middle = أسفل الوسط - غيّر الحجم -pdfjs-editor-resizer-label-bottom-left = الزاوية اليُسرى السُفلية - غيّر الحجم -pdfjs-editor-resizer-label-middle-left = مُنتصف اليسار - غيّر الحجم pdfjs-editor-resizer-top-left = .aria-label = الزاوية اليُسرى العُليا — غيّر الحجم pdfjs-editor-resizer-top-middle = diff --git a/l10n/ast/viewer.ftl b/l10n/ast/viewer.ftl index 0c0b4e3067331..2993916ade249 100644 --- a/l10n/ast/viewer.ftl +++ b/l10n/ast/viewer.ftl @@ -77,22 +77,10 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Propiedaes del documentu… pdfjs-document-properties-file-name = Nome del ficheru: pdfjs-document-properties-file-size = Tamañu del ficheru: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Títulu: pdfjs-document-properties-keywords = Pallabres clave: pdfjs-document-properties-creation-date = Data de creación: pdfjs-document-properties-modification-date = Data de modificación: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-producer = Productor del PDF: pdfjs-document-properties-version = Versión del PDF: pdfjs-document-properties-page-count = Númberu de páxines: @@ -178,13 +166,6 @@ pdfjs-page-landmark = pdfjs-loading-error = Asocedió un fallu mentanto se cargaba'l PDF. -## Annotations - -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } - ## Password pdfjs-password-ok-button = Aceptar diff --git a/l10n/az/viewer.ftl b/l10n/az/viewer.ftl index 0185778534c31..a2d8c1962a0cb 100644 --- a/l10n/az/viewer.ftl +++ b/l10n/az/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Sənəd xüsusiyyətləri… pdfjs-document-properties-file-name = Fayl adı: pdfjs-document-properties-file-size = Fayl ölçüsü: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bayt) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bayt) pdfjs-document-properties-title = Başlık: pdfjs-document-properties-author = Müəllif: pdfjs-document-properties-subject = Mövzu: pdfjs-document-properties-keywords = Açar sözlər: pdfjs-document-properties-creation-date = Yaradılış Tarixi : pdfjs-document-properties-modification-date = Dəyişdirilmə Tarixi : -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Yaradan: pdfjs-document-properties-producer = PDF yaradıcısı: pdfjs-document-properties-version = PDF versiyası: @@ -223,10 +211,6 @@ pdfjs-rendering-error = Səhifə göstərilərkən səhv yarandı. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/be/viewer.ftl b/l10n/be/viewer.ftl index f7a86e72acb9e..e84d61487eab0 100644 --- a/l10n/be/viewer.ftl +++ b/l10n/be/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байтаў) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байт) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байт) pdfjs-document-properties-title = Загаловак: pdfjs-document-properties-author = Аўтар: pdfjs-document-properties-subject = Тэма: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Дата змянення: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Стваральнік: pdfjs-document-properties-producer = Вырабнік PDF: pdfjs-document-properties-version = Версія PDF: @@ -277,10 +265,6 @@ pdfjs-rendering-error = Здарылася памылка падчас адлю ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -326,6 +310,10 @@ pdfjs-comment-floating-button = .title = Каментаваць .aria-label = Каментаваць pdfjs-comment-floating-button-label = Каментаваць +pdfjs-editor-comment-button = + .title = Каментарый + .aria-label = Каментарый +pdfjs-editor-comment-button-label = Каментарый pdfjs-editor-signature-button = .title = Дадаць подпіс pdfjs-editor-signature-button-label = Дадаць подпіс @@ -388,20 +376,28 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Тэкставы рэдактар .default-content = Пачніце ўводзіць… -pdfjs-free-text = - .aria-label = Тэкставы рэдактар -pdfjs-free-text-default-content = Пачніце набор тэксту… -pdfjs-ink = - .aria-label = Графічны рэдактар -pdfjs-ink-canvas = - .aria-label = Выява, створаная карыстальнікам +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Каментарый + [few] Каментарыі + *[many] Каментарыі + } +pdfjs-editor-comments-sidebar-close-button = + .title = Закрыць бакавую панэль + .aria-label = Закрыць бакавую панэль +pdfjs-editor-comments-sidebar-close-button-label = Закрыць бакавую панэль +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Бачыце штосьці вартае ўвагі? Вылучыце і пакіньце каментарый. +pdfjs-editor-comments-sidebar-no-comments-link = Падрабязней ## Alt-text dialog pdfjs-editor-alt-text-button-label = Альтэрнатыўны тэкст pdfjs-editor-alt-text-edit-button = .aria-label = Змяніць альтэрнатыўны тэкст -pdfjs-editor-alt-text-edit-button-label = Змяніць альтэрнатыўны тэкст pdfjs-editor-alt-text-dialog-label = Выберыце варыянт pdfjs-editor-alt-text-dialog-description = Альтэрнатыўны тэкст дапамагае, калі людзі не бачаць выяву або калі яна не загружаецца. pdfjs-editor-alt-text-add-description-label = Дадаць апісанне @@ -421,14 +417,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Верхні левы кут — змяніць памер -pdfjs-editor-resizer-label-top-middle = Уверсе пасярэдзіне — змяніць памер -pdfjs-editor-resizer-label-top-right = Верхні правы кут — змяніць памер -pdfjs-editor-resizer-label-middle-right = Пасярэдзіне справа — змяніць памер -pdfjs-editor-resizer-label-bottom-right = Правы ніжні кут — змяніць памер -pdfjs-editor-resizer-label-bottom-middle = Пасярэдзіне ўнізе — змяніць памер -pdfjs-editor-resizer-label-bottom-left = Левы ніжні кут — змяніць памер -pdfjs-editor-resizer-label-middle-left = Пасярэдзіне злева — змяніць памер pdfjs-editor-resizer-top-left = .aria-label = Верхні левы кут — змяніць памер pdfjs-editor-resizer-top-middle = @@ -621,25 +609,33 @@ pdfjs-editor-add-signature-cancel-button = Скасаваць pdfjs-editor-add-signature-add-button = Дадаць pdfjs-editor-edit-signature-update-button = Абнавіць +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Змяніць каментарый +pdfjs-editor-edit-comment-popup-button = + .title = Змяніць каментарый +pdfjs-editor-delete-comment-popup-button-label = Выдаліць каментарый +pdfjs-editor-delete-comment-popup-button = + .title = Выдаліць каментарый +pdfjs-show-comment-button = + .title = Паказаць каментарый + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Дзеянні -pdfjs-editor-edit-comment-actions-button = - .title = Дзеянні -pdfjs-editor-edit-comment-close-button-label = Закрыць -pdfjs-editor-edit-comment-close-button = - .title = Закрыць -pdfjs-editor-edit-comment-actions-edit-button-label = Праўка -pdfjs-editor-edit-comment-actions-delete-button-label = Выдаліць -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Увядзіце свой каментарый -pdfjs-editor-edit-comment-manager-cancel-button = Скасаваць -pdfjs-editor-edit-comment-manager-save-button = Захаваць +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Змяніць каментарый +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Абнавіць +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Дадаць каментарый +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Дадаць +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Пачніце набор тэксту… +pdfjs-editor-edit-comment-dialog-cancel-button = Скасаваць ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Змяніць каментарый +pdfjs-editor-add-comment-button = + .title = Дадаць каментарый ## Main menu for adding/removing signatures diff --git a/l10n/bg/viewer.ftl b/l10n/bg/viewer.ftl index f2b483aa1dff5..90cdbeaaf29d8 100644 --- a/l10n/bg/viewer.ftl +++ b/l10n/bg/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байта) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байта) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байта) pdfjs-document-properties-title = Заглавие: pdfjs-document-properties-author = Автор: pdfjs-document-properties-subject = Тема: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Дата на промяна: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Създател: pdfjs-document-properties-producer = PDF произведен от: pdfjs-document-properties-version = Издание на PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Грешка при изчертаване на стра ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -336,18 +320,11 @@ pdfjs-editor-stamp-add-image-button-label = Добавяне на изображ pdfjs-free-text2 = .aria-label = Текстов редактор .default-content = Започнете да пишете… -pdfjs-free-text = - .aria-label = Текстов редактор -pdfjs-free-text-default-content = Започнете да пишете… -pdfjs-ink = - .aria-label = Промяна на рисунка -pdfjs-ink-canvas = - .aria-label = Изображение, създадено от потребител +pdfjs-editor-comments-sidebar-close-button-label = Затваряне на страничната лента ## Alt-text dialog pdfjs-editor-alt-text-button-label = Алтернативен текст -pdfjs-editor-alt-text-edit-button-label = Промяна на алтернативния текст pdfjs-editor-alt-text-dialog-label = Изберете от възможностите pdfjs-editor-alt-text-dialog-description = Алтернативният текст помага на потребителите, когато не могат да видят изображението или то не се зарежда. pdfjs-editor-alt-text-add-description-label = Добавяне на описание @@ -364,14 +341,6 @@ pdfjs-editor-alt-text-textarea = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Горен ляв ъгъл — преоразмеряване -pdfjs-editor-resizer-label-top-middle = Горе в средата — преоразмеряване -pdfjs-editor-resizer-label-top-right = Горен десен ъгъл — преоразмеряване -pdfjs-editor-resizer-label-middle-right = Дясно в средата — преоразмеряване -pdfjs-editor-resizer-label-bottom-right = Долен десен ъгъл — преоразмеряване -pdfjs-editor-resizer-label-bottom-middle = Долу в средата — преоразмеряване -pdfjs-editor-resizer-label-bottom-left = Долен ляв ъгъл — преоразмеряване -pdfjs-editor-resizer-label-middle-left = Ляво в средата — преоразмеряване pdfjs-editor-resizer-top-left = .aria-label = Горен ляв ъгъл — преоразмеряване pdfjs-editor-resizer-top-middle = @@ -411,4 +380,9 @@ pdfjs-editor-colorpicker-red = ## New alt-text dialog ## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Научете повече pdfjs-editor-new-alt-text-not-now-button = Не сега + +## Image alt-text settings + +pdfjs-editor-alt-text-settings-delete-model-button = Изтриване diff --git a/l10n/bn/viewer.ftl b/l10n/bn/viewer.ftl index 813ff19f5afdb..7ca2c1d2b7603 100644 --- a/l10n/bn/viewer.ftl +++ b/l10n/bn/viewer.ftl @@ -85,24 +85,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = নথি বৈশিষ্ট্য… pdfjs-document-properties-file-name = ফাইলের নাম: pdfjs-document-properties-file-size = ফাইলের আকার: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } কেবি ({ $size_b } বাইট) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } এমবি ({ $size_b } বাইট) pdfjs-document-properties-title = শিরোনাম: pdfjs-document-properties-author = লেখক: pdfjs-document-properties-subject = বিষয়: pdfjs-document-properties-keywords = কীওয়ার্ড: pdfjs-document-properties-creation-date = তৈরির তারিখ: pdfjs-document-properties-modification-date = পরিবর্তনের তারিখ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = প্রস্তুতকারক: pdfjs-document-properties-producer = পিডিএফ প্রস্তুতকারক: pdfjs-document-properties-version = পিডিএফ সংষ্করণ: @@ -213,10 +201,6 @@ pdfjs-rendering-error = পাতা উপস্থাপনার সময় ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/bo/viewer.ftl b/l10n/bo/viewer.ftl index 2d5a4ecf92f53..4bea89761fe31 100644 --- a/l10n/bo/viewer.ftl +++ b/l10n/bo/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Document Properties… pdfjs-document-properties-file-name = File name: pdfjs-document-properties-file-size = File size: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Title: pdfjs-document-properties-author = Author: pdfjs-document-properties-subject = Subject: pdfjs-document-properties-keywords = Keywords: pdfjs-document-properties-creation-date = Creation Date: pdfjs-document-properties-modification-date = Modification Date: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creator: pdfjs-document-properties-producer = PDF Producer: pdfjs-document-properties-version = PDF Version: diff --git a/l10n/br/viewer.ftl b/l10n/br/viewer.ftl index 7dc2a1142aa98..1f86d469d21c8 100644 --- a/l10n/br/viewer.ftl +++ b/l10n/br/viewer.ftl @@ -99,24 +99,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Perzhioù an teul… pdfjs-document-properties-file-name = Anv restr: pdfjs-document-properties-file-size = Ment ar restr: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } Ke ({ $size_b } eizhbit) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } Me ({ $size_b } eizhbit) pdfjs-document-properties-title = Titl: pdfjs-document-properties-author = Aozer: pdfjs-document-properties-subject = Danvez: pdfjs-document-properties-keywords = Gerioù-alc'hwez: pdfjs-document-properties-creation-date = Deiziad krouiñ: pdfjs-document-properties-modification-date = Deiziad kemmañ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Krouer: pdfjs-document-properties-producer = Kenderc'her PDF: pdfjs-document-properties-version = Handelv PDF: @@ -241,10 +229,6 @@ pdfjs-rendering-error = Degouezhet ez eus bet ur fazi e-pad skrammañ ar bajenna ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -293,12 +277,6 @@ pdfjs-editor-stamp-add-image-button = pdfjs-editor-stamp-add-image-button-label = Ouzhpennañ ur skeudenn # This refers to the thickness of the line used for free highlighting (not bound to text) pdfjs-editor-free-highlight-thickness-input = Tevded -pdfjs-free-text = - .aria-label = Aozer testennoù -pdfjs-ink = - .aria-label = Aozer tresoù -pdfjs-ink-canvas = - .aria-label = Skeudenn bet krouet gant an implijer·ez ## Alt-text dialog diff --git a/l10n/brx/viewer.ftl b/l10n/brx/viewer.ftl index 982f849e7de65..bd4440395b345 100644 --- a/l10n/brx/viewer.ftl +++ b/l10n/brx/viewer.ftl @@ -65,24 +65,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = फोरमान बिलाइनि आखुथाय... pdfjs-document-properties-file-name = फाइलनि मुं: pdfjs-document-properties-file-size = फाइलनि महर: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } बाइट) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } बाइट) pdfjs-document-properties-title = बिमुं: pdfjs-document-properties-author = लिरगिरि: pdfjs-document-properties-subject = आयदा: pdfjs-document-properties-keywords = गाहाय सोदोब: pdfjs-document-properties-creation-date = सोरजिनाय अक्ट': pdfjs-document-properties-modification-date = सुद्रायनाय अक्ट': -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = सोरजिग्रा: pdfjs-document-properties-producer = PDF दिहुनग्रा: pdfjs-document-properties-version = PDF बिसान: @@ -184,10 +172,6 @@ pdfjs-rendering-error = बिलाइखौ राव सोलायनाय ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/bs/viewer.ftl b/l10n/bs/viewer.ftl index 7f44d97a54474..f0a67cafb6bef 100644 --- a/l10n/bs/viewer.ftl +++ b/l10n/bs/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtova) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajta) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajta) pdfjs-document-properties-title = Naslov: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Predmet: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Datum promjene: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Kreator: pdfjs-document-properties-producer = PDF stvaratelj: pdfjs-document-properties-version = PDF verzija: @@ -277,10 +265,6 @@ pdfjs-rendering-error = Došlo je do greške prilikom renderiranja strane. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -380,20 +364,12 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Uređivač teksta .default-content = Počnite kucati… -pdfjs-free-text = - .aria-label = Uređivač teksta -pdfjs-free-text-default-content = Počnite kucati… -pdfjs-ink = - .aria-label = Uređivač crtanja -pdfjs-ink-canvas = - .aria-label = Slika koju je kreirao korisnik ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternativni tekst pdfjs-editor-alt-text-edit-button = .aria-label = Uredi alternativni tekst -pdfjs-editor-alt-text-edit-button-label = Uredi alternativni tekst pdfjs-editor-alt-text-dialog-label = Odaberite opciju pdfjs-editor-alt-text-dialog-description = Alternativni tekst (Alt tekst) pomaže kada ljudi ne mogu vidjeti sliku ili kada se ona ne učitava. pdfjs-editor-alt-text-add-description-label = Dodajte opis @@ -413,14 +389,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Gornji lijevi ugao — promjena veličine -pdfjs-editor-resizer-label-top-middle = Gore u sredini — promijeni veličinu -pdfjs-editor-resizer-label-top-right = Gornji desni ugao — promijeni veličinu -pdfjs-editor-resizer-label-middle-right = Sredina desno — promijeni veličinu -pdfjs-editor-resizer-label-bottom-right = Donji desni ugao — promijeni veličinu -pdfjs-editor-resizer-label-bottom-middle = Donji srednji dio — promijeni veličinu -pdfjs-editor-resizer-label-bottom-left = Donji lijevi ugao — promijeni veličinu -pdfjs-editor-resizer-label-middle-left = Sredina lijevo — promijeni veličinu pdfjs-editor-resizer-top-left = .aria-label = Gornji lijevi ugao — promjena veličine pdfjs-editor-resizer-top-middle = @@ -605,26 +573,6 @@ pdfjs-editor-add-signature-cancel-button = Otkaži pdfjs-editor-add-signature-add-button = Dodaj pdfjs-editor-edit-signature-update-button = Ažuriraj -## Edit a comment dialog - -pdfjs-editor-edit-comment-actions-button-label = Radnje -pdfjs-editor-edit-comment-actions-button = - .title = Radnje -pdfjs-editor-edit-comment-close-button-label = Zatvori -pdfjs-editor-edit-comment-close-button = - .title = Zatvori -pdfjs-editor-edit-comment-actions-edit-button-label = Uredi -pdfjs-editor-edit-comment-actions-delete-button-label = Izbriši -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Unesite svoj komentar -pdfjs-editor-edit-comment-manager-cancel-button = Otkaži -pdfjs-editor-edit-comment-manager-save-button = Sačuvaj - -## Edit a comment button in the editor toolbar - -pdfjs-editor-edit-comment-button = - .title = Uredi komentar - ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/ca/viewer.ftl b/l10n/ca/viewer.ftl index 92b370e675155..4e0d9cbb7fc1f 100644 --- a/l10n/ca/viewer.ftl +++ b/l10n/ca/viewer.ftl @@ -98,24 +98,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Propietats del document… pdfjs-document-properties-file-name = Nom del fitxer: pdfjs-document-properties-file-size = Mida del fitxer: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Títol: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Assumpte: pdfjs-document-properties-keywords = Paraules clau: pdfjs-document-properties-creation-date = Data de creació: pdfjs-document-properties-modification-date = Data de modificació: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creador: pdfjs-document-properties-producer = Generador de PDF: pdfjs-document-properties-version = Versió de PDF: @@ -243,10 +231,6 @@ pdfjs-rendering-error = S'ha produït un error mentre es renderitzava la pàgina ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -280,10 +264,11 @@ pdfjs-editor-free-text-size-input = Mida pdfjs-editor-ink-color-input = Color pdfjs-editor-ink-thickness-input = Gruix pdfjs-editor-ink-opacity-input = Opacitat -pdfjs-free-text = - .aria-label = Editor de text -pdfjs-free-text-default-content = Escriviu… -pdfjs-ink = - .aria-label = Editor de dibuix -pdfjs-ink-canvas = - .aria-label = Imatge creada per l'usuari + +## Alt-text dialog + +pdfjs-editor-alt-text-cancel-button = Cancel·la + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Cancel·la diff --git a/l10n/cak/viewer.ftl b/l10n/cak/viewer.ftl index 495c944e7fde9..3f9c6a231e761 100644 --- a/l10n/cak/viewer.ftl +++ b/l10n/cak/viewer.ftl @@ -96,24 +96,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Taq richinil wuj… pdfjs-document-properties-file-name = Rub'i' yakb'äl: pdfjs-document-properties-file-size = Runimilem yakb'äl: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = B'i'aj: pdfjs-document-properties-author = B'anel: pdfjs-document-properties-subject = Taqikil: pdfjs-document-properties-keywords = Kixe'el taq tzij: pdfjs-document-properties-creation-date = Ruq'ijul xtz'uk: pdfjs-document-properties-modification-date = Ruq'ijul xjalwachïx: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Q'inonel: pdfjs-document-properties-producer = PDF b'anöy: pdfjs-document-properties-version = PDF ruwäch: @@ -241,10 +229,6 @@ pdfjs-rendering-error = Xk'ulwachitäj jun sachoj toq ninuk'wachij ri ruxaq. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -278,10 +262,3 @@ pdfjs-editor-free-text-size-input = Nimilem pdfjs-editor-ink-color-input = B'onil pdfjs-editor-ink-thickness-input = Rupimil pdfjs-editor-ink-opacity-input = Q'equmal -pdfjs-free-text = - .aria-label = Nuk'unel tz'ib'atzij -pdfjs-free-text-default-content = Titikitisäx rutz'ib'axik… -pdfjs-ink = - .aria-label = Nuk'unel wachib'äl -pdfjs-ink-canvas = - .aria-label = Wachib'äl nuk'un ruma okisaxel diff --git a/l10n/ckb/viewer.ftl b/l10n/ckb/viewer.ftl index e8f5e9b8814a9..73f9e860a888d 100644 --- a/l10n/ckb/viewer.ftl +++ b/l10n/ckb/viewer.ftl @@ -80,24 +80,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = تایبەتمەندییەکانی بەڵگەنامە... pdfjs-document-properties-file-name = ناوی پەڕگە: pdfjs-document-properties-file-size = قەبارەی پەڕگە: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } کب ({ $size_b } بایت) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } مب ({ $size_b } بایت) pdfjs-document-properties-title = سەردێڕ: pdfjs-document-properties-author = نووسەر pdfjs-document-properties-subject = بابەت: pdfjs-document-properties-keywords = کلیلەوشە: pdfjs-document-properties-creation-date = بەرواری درووستکردن: pdfjs-document-properties-modification-date = بەرواری دەستکاریکردن: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = درووستکەر: pdfjs-document-properties-producer = بەرهەمهێنەری PDF: pdfjs-document-properties-version = وەشانی PDF: @@ -208,10 +196,6 @@ pdfjs-rendering-error = هەڵەیەک ڕوویدا لە کاتی پوختەکر ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/cs/viewer.ftl b/l10n/cs/viewer.ftl index 9d783fea6f392..1754ba8ca5281 100644 --- a/l10n/cs/viewer.ftl +++ b/l10n/cs/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtů) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtů) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtů) pdfjs-document-properties-title = Název stránky: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Předmět: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Datum úpravy: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Vytvořil: pdfjs-document-properties-producer = Tvůrce PDF: pdfjs-document-properties-version = Verze PDF: @@ -279,10 +267,6 @@ pdfjs-rendering-error = Při vykreslování stránky nastala chyba. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -328,6 +312,10 @@ pdfjs-comment-floating-button = .title = Komentář .aria-label = Komentář pdfjs-comment-floating-button-label = Komentář +pdfjs-editor-comment-button = + .title = Komentář + .aria-label = Komentář +pdfjs-editor-comment-button-label = Komentář pdfjs-editor-signature-button = .title = Přidat podpis pdfjs-editor-signature-button-label = Přidat podpis @@ -390,20 +378,29 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Textový editor .default-content = Začněte psát... -pdfjs-free-text = - .aria-label = Textový editor -pdfjs-free-text-default-content = Začněte psát… -pdfjs-ink = - .aria-label = Editor kreslení -pdfjs-ink-canvas = - .aria-label = Uživatelem vytvořený obrázek +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Komentář + [few] Komentáře + [many] Komentáře + *[other] Komentáře + } +pdfjs-editor-comments-sidebar-close-button = + .title = Zavřít postranní lištu + .aria-label = Zavřít postranní lištu +pdfjs-editor-comments-sidebar-close-button-label = Zavřít postranní lištu +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vidíte něco pozoruhodného? Zvýrazněte to a zanechte komentář. +pdfjs-editor-comments-sidebar-no-comments-link = Zjistit více ## Alt-text dialog pdfjs-editor-alt-text-button-label = Náhradní popis pdfjs-editor-alt-text-edit-button = .aria-label = Upravit alternativní text -pdfjs-editor-alt-text-edit-button-label = Upravit náhradní popis pdfjs-editor-alt-text-dialog-label = Vyberte možnost pdfjs-editor-alt-text-dialog-description = Náhradní popis pomáhá, když lidé obrázek nevidí nebo když se nenačítá. pdfjs-editor-alt-text-add-description-label = Přidat popis @@ -423,14 +420,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Levý horní roh — změna velikosti -pdfjs-editor-resizer-label-top-middle = Horní střed — změna velikosti -pdfjs-editor-resizer-label-top-right = Pravý horní roh — změna velikosti -pdfjs-editor-resizer-label-middle-right = Vpravo uprostřed — změna velikosti -pdfjs-editor-resizer-label-bottom-right = Pravý dolní roh — změna velikosti -pdfjs-editor-resizer-label-bottom-middle = Střed dole — změna velikosti -pdfjs-editor-resizer-label-bottom-left = Levý dolní roh — změna velikosti -pdfjs-editor-resizer-label-middle-left = Vlevo uprostřed — změna velikosti pdfjs-editor-resizer-top-left = .aria-label = Levý horní roh — změna velikosti pdfjs-editor-resizer-top-middle = @@ -575,8 +564,8 @@ pdfjs-editor-add-signature-dialog-title = Přidat podpis ## Tab names # Type is a verb (you can type your name as signature) -pdfjs-editor-add-signature-type-button = Typ - .title = Typ +pdfjs-editor-add-signature-type-button = Psát + .title = Psát # Draw is a verb (you can draw your signature) pdfjs-editor-add-signature-draw-button = Kreslit .title = Kreslit @@ -594,11 +583,11 @@ pdfjs-editor-add-signature-draw-thickness-range-label = Tloušťka # $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. pdfjs-editor-add-signature-draw-thickness-range = .title = Tloušťka kresby: { $thickness } -pdfjs-editor-add-signature-image-placeholder = Pro nahrání přetáhněte soubor sem +pdfjs-editor-add-signature-image-placeholder = Přetáhněte sem soubor, který chcete nahrát pdfjs-editor-add-signature-image-browse-link = { PLATFORM() -> - [macos] Nebo vyberte soubory s obrázky - *[other] Nebo vyberte soubory s obrázky + [macos] Nebo vyberte soubory obrazu + *[other] Nebo vyberte soubory obrazu } ## Controls @@ -611,7 +600,7 @@ pdfjs-editor-add-signature-clear-button-label = Vymazání podpisu pdfjs-editor-add-signature-clear-button = .title = Vymazání podpisu pdfjs-editor-add-signature-save-checkbox = Uložit podpis -pdfjs-editor-add-signature-save-warning-message = Dosáhli jste limitu 5 uložených podpisů. Odstraňte jeden a uložte další. +pdfjs-editor-add-signature-save-warning-message = Dosáhli jste limitu 5 uložených podpisů. Chcete-li uložit další, jeden odstraňte. pdfjs-editor-add-signature-image-upload-error-title = Obrázek se nepodařilo nahrát pdfjs-editor-add-signature-image-upload-error-description = Zkontrolujte připojení k síti nebo zkuste jiný obrázek. pdfjs-editor-add-signature-image-no-data-error-title = Nelze převést tento obrázek na podpis @@ -624,25 +613,33 @@ pdfjs-editor-add-signature-cancel-button = Zrušit pdfjs-editor-add-signature-add-button = Přidat pdfjs-editor-edit-signature-update-button = Aktualizovat +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Upravit komentář +pdfjs-editor-edit-comment-popup-button = + .title = Upravit komentář +pdfjs-editor-delete-comment-popup-button-label = Odebrat komentář +pdfjs-editor-delete-comment-popup-button = + .title = Odebrat komentář +pdfjs-show-comment-button = + .title = Zobrazit komentář + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Akce -pdfjs-editor-edit-comment-actions-button = - .title = Akce -pdfjs-editor-edit-comment-close-button-label = Zavřít -pdfjs-editor-edit-comment-close-button = - .title = Zavřít -pdfjs-editor-edit-comment-actions-edit-button-label = Upravit -pdfjs-editor-edit-comment-actions-delete-button-label = Smazat -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Zadejte komentář -pdfjs-editor-edit-comment-manager-cancel-button = Zrušit -pdfjs-editor-edit-comment-manager-save-button = Uložit +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Upravit komentář +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizovat +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Přidání komentáře +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Přidat +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Začněte psát… +pdfjs-editor-edit-comment-dialog-cancel-button = Zrušit ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Upravit komentář +pdfjs-editor-add-comment-button = + .title = Přidání komentáře ## Main menu for adding/removing signatures diff --git a/l10n/cy/viewer.ftl b/l10n/cy/viewer.ftl index d4a3fced227ab..fe5b477741d0e 100644 --- a/l10n/cy/viewer.ftl +++ b/l10n/cy/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } beit) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } beit) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } beit) pdfjs-document-properties-title = Teitl: pdfjs-document-properties-author = Awdur: pdfjs-document-properties-subject = Pwnc: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Dyddiad Addasu: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Crewr: pdfjs-document-properties-producer = Cynhyrchydd PDF: pdfjs-document-properties-version = Fersiwn PDF: @@ -283,10 +271,6 @@ pdfjs-rendering-error = Digwyddodd gwall wrth adeiladu'r dudalen. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -332,6 +316,10 @@ pdfjs-comment-floating-button = .title = Sylw .aria-label = Sylw pdfjs-comment-floating-button-label = Sylw +pdfjs-editor-comment-button = + .title = Sylw + .aria-label = Sylw +pdfjs-editor-comment-button-label = Sylw pdfjs-editor-signature-button = .title = Ychwanegu llofnod pdfjs-editor-signature-button-label = Ychwanegu llofnod @@ -394,20 +382,31 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Golygydd Testun .default-content = Cychwyn teipio… -pdfjs-free-text = - .aria-label = Golygydd Testun -pdfjs-free-text-default-content = Cychwyn teipio… -pdfjs-ink = - .aria-label = Golygydd Lluniadu -pdfjs-ink-canvas = - .aria-label = Delwedd wedi'i chreu gan ddefnyddwyr +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [zero] Sylwadau + [one] Sylw + [two] Sylw + [few] Sylw + [many] Sylw + *[other] Sylw + } +pdfjs-editor-comments-sidebar-close-button = + .title = Cau'r bar ochr + .aria-label = Cau'r bar ochr +pdfjs-editor-comments-sidebar-close-button-label = Cau'r bar ochr +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Gweld rhywbeth nodedig? Amlygwch ef a gadael sylw. +pdfjs-editor-comments-sidebar-no-comments-link = Dysgu rhagor ## Alt-text dialog pdfjs-editor-alt-text-button-label = Testun amgen (alt) pdfjs-editor-alt-text-edit-button = .aria-label = Golygu testun amgen -pdfjs-editor-alt-text-edit-button-label = Golygu testun amgen pdfjs-editor-alt-text-dialog-label = Dewisiadau pdfjs-editor-alt-text-dialog-description = Mae testun amgen (testun alt) yn helpu pan na all pobl weld y ddelwedd neu pan nad yw'n llwytho. pdfjs-editor-alt-text-add-description-label = Ychwanegu disgrifiad @@ -427,14 +426,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Y gornel chwith uchaf — newid maint -pdfjs-editor-resizer-label-top-middle = Canol uchaf - newid maint -pdfjs-editor-resizer-label-top-right = Y gornel dde uchaf - newid maint -pdfjs-editor-resizer-label-middle-right = De canol - newid maint -pdfjs-editor-resizer-label-bottom-right = Y gornel dde isaf — newid maint -pdfjs-editor-resizer-label-bottom-middle = Canol gwaelod — newid maint -pdfjs-editor-resizer-label-bottom-left = Y gornel chwith isaf — newid maint -pdfjs-editor-resizer-label-middle-left = Chwith canol — newid maint pdfjs-editor-resizer-top-left = .aria-label = Y gornel chwith uchaf — newid maint pdfjs-editor-resizer-top-middle = @@ -630,25 +621,33 @@ pdfjs-editor-add-signature-cancel-button = Diddymu pdfjs-editor-add-signature-add-button = Ychwanegu pdfjs-editor-edit-signature-update-button = Diweddaru +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Golygu sylw +pdfjs-editor-edit-comment-popup-button = + .title = Golygu sylw +pdfjs-editor-delete-comment-popup-button-label = Tynnu sylw +pdfjs-editor-delete-comment-popup-button = + .title = Tynnu sylw +pdfjs-show-comment-button = + .title = Dangos sylw + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Gweithredoedd -pdfjs-editor-edit-comment-actions-button = - .title = Gweithredoedd -pdfjs-editor-edit-comment-close-button-label = Cau -pdfjs-editor-edit-comment-close-button = - .title = Cau -pdfjs-editor-edit-comment-actions-edit-button-label = Golygu -pdfjs-editor-edit-comment-actions-delete-button-label = Dileu -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Rhowch eich sylw -pdfjs-editor-edit-comment-manager-cancel-button = Diddymu -pdfjs-editor-edit-comment-manager-save-button = Cadw +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Golygu sylw +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Diweddaru +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Ychwanegu sylw +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Ychwanegu +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Cychwyn teipio… +pdfjs-editor-edit-comment-dialog-cancel-button = Diddymu ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Golygu sylw +pdfjs-editor-add-comment-button = + .title = Ychwanegu sylw ## Main menu for adding/removing signatures diff --git a/l10n/da/viewer.ftl b/l10n/da/viewer.ftl index 533d8d86cc563..a2463d5f92636 100644 --- a/l10n/da/viewer.ftl +++ b/l10n/da/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Forfatter: pdfjs-document-properties-subject = Emne: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Redigeret: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Program: pdfjs-document-properties-producer = PDF-producent: pdfjs-document-properties-version = PDF-version: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Der opstod en fejl ved generering af siden. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -321,9 +305,13 @@ pdfjs-highlight-floating-button1 = .aria-label = Fremhæv pdfjs-highlight-floating-button-label = Fremhæv pdfjs-comment-floating-button = + .title = Kommenter + .aria-label = Kommenter +pdfjs-comment-floating-button-label = Kommenter +pdfjs-editor-comment-button = .title = Kommentar .aria-label = Kommentar -pdfjs-comment-floating-button-label = Kommentar +pdfjs-editor-comment-button-label = Kommentar pdfjs-editor-signature-button = .title = Tilføj signatur pdfjs-editor-signature-button-label = Tilføj signatur @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Teksteditor .default-content = Begynd at skrive… -pdfjs-free-text = - .aria-label = Teksteditor -pdfjs-free-text-default-content = Begynd at skrive… -pdfjs-ink = - .aria-label = Tegnings-editor -pdfjs-ink-canvas = - .aria-label = Brugeroprettet billede +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Kommentar + *[other] Kommentarer + } +pdfjs-editor-comments-sidebar-close-button = + .title = Luk sidepanelet + .aria-label = Luk sidepanelet +pdfjs-editor-comments-sidebar-close-button-label = Luk sidepanelet +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Har du fundet noget interessant? Fremhæv det og gem en kommentar. +pdfjs-editor-comments-sidebar-no-comments-link = Læs mere ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternativ tekst pdfjs-editor-alt-text-edit-button = .aria-label = Rediger alternativ tekst -pdfjs-editor-alt-text-edit-button-label = Rediger alternativ tekst pdfjs-editor-alt-text-dialog-label = Vælg en indstilling pdfjs-editor-alt-text-dialog-description = Alternativ tekst hjælper folk, som ikke kan se billedet eller når det ikke indlæses. pdfjs-editor-alt-text-add-description-label = Tilføj en beskrivelse @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Øverste venstre hjørne — tilpas størrelse -pdfjs-editor-resizer-label-top-middle = Øverste i midten — tilpas størrelse -pdfjs-editor-resizer-label-top-right = Øverste højre hjørne — tilpas størrelse -pdfjs-editor-resizer-label-middle-right = Midten til højre — tilpas størrelse -pdfjs-editor-resizer-label-bottom-right = Nederste højre hjørne - tilpas størrelse -pdfjs-editor-resizer-label-bottom-middle = Nederst i midten - tilpas størrelse -pdfjs-editor-resizer-label-bottom-left = Nederste venstre hjørne - tilpas størrelse -pdfjs-editor-resizer-label-middle-left = Midten til venstre — tilpas størrelse pdfjs-editor-resizer-top-left = .aria-label = Øverste venstre hjørne — tilpas størrelse pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Annuller pdfjs-editor-add-signature-add-button = Tilføj pdfjs-editor-edit-signature-update-button = Opdater +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Rediger kommentar +pdfjs-editor-edit-comment-popup-button = + .title = Rediger kommentar +pdfjs-editor-delete-comment-popup-button-label = Fjern kommentar +pdfjs-editor-delete-comment-popup-button = + .title = Fjern kommentar +pdfjs-show-comment-button = + .title = Vis kommentar + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Handlinger -pdfjs-editor-edit-comment-actions-button = - .title = Handlinger -pdfjs-editor-edit-comment-close-button-label = Luk -pdfjs-editor-edit-comment-close-button = - .title = Luk -pdfjs-editor-edit-comment-actions-edit-button-label = Rediger -pdfjs-editor-edit-comment-actions-delete-button-label = Slet -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Indtast din kommentar -pdfjs-editor-edit-comment-manager-cancel-button = Annuller -pdfjs-editor-edit-comment-manager-save-button = Gem +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Rediger kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Opdater +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Tilføj kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Tilføj +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Begynd at skrive… +pdfjs-editor-edit-comment-dialog-cancel-button = Annuller ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Rediger kommentar +pdfjs-editor-add-comment-button = + .title = Tilføj kommentar ## Main menu for adding/removing signatures diff --git a/l10n/de/viewer.ftl b/l10n/de/viewer.ftl index ae9baeaebc020..8c1ab811558da 100644 --- a/l10n/de/viewer.ftl +++ b/l10n/de/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } Bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } Bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } Bytes) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Thema: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Bearbeitungsdatum: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date } { $time } pdfjs-document-properties-creator = Anwendung: pdfjs-document-properties-producer = PDF erstellt mit: pdfjs-document-properties-version = PDF-Version: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Beim Darstellen der Seite trat ein Fehler auf. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Kommentieren .aria-label = Kommentieren pdfjs-comment-floating-button-label = Kommentieren +pdfjs-editor-comment-button = + .title = Kommentar + .aria-label = Kommentar +pdfjs-editor-comment-button-label = Kommentar pdfjs-editor-signature-button = .title = Unterschrift hinzufügen pdfjs-editor-signature-button-label = Unterschrift hinzufügen @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Texteditor .default-content = Schreiben beginnen… -pdfjs-free-text = - .aria-label = Texteditor -pdfjs-free-text-default-content = Schreiben beginnen… -pdfjs-ink = - .aria-label = Zeichnungseditor -pdfjs-ink-canvas = - .aria-label = Vom Benutzer erstelltes Bild +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Kommentar + *[other] Kommentare + } +pdfjs-editor-comments-sidebar-close-button = + .title = Sidebar schließen + .aria-label = Sidebar schließen +pdfjs-editor-comments-sidebar-close-button-label = Sidebar schließen +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Haben Sie etwas Bemerkenswertes entdeckt? Heben Sie es hervor und hinterlassen Sie einen Kommentar. +pdfjs-editor-comments-sidebar-no-comments-link = Weitere Informationen ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternativ-Text pdfjs-editor-alt-text-edit-button = .aria-label = Alternativ-Text bearbeiten -pdfjs-editor-alt-text-edit-button-label = Alternativ-Text bearbeiten pdfjs-editor-alt-text-dialog-label = Option wählen pdfjs-editor-alt-text-dialog-description = Alt-Text (Alternativtext) hilft, wenn Personen die Grafik nicht sehen können oder wenn sie nicht geladen wird. pdfjs-editor-alt-text-add-description-label = Beschreibung hinzufügen @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Linke obere Ecke - Größe ändern -pdfjs-editor-resizer-label-top-middle = Oben mittig - Größe ändern -pdfjs-editor-resizer-label-top-right = Rechts oben - Größe ändern -pdfjs-editor-resizer-label-middle-right = Mitte rechts - Größe ändern -pdfjs-editor-resizer-label-bottom-right = Rechte untere Ecke - Größe ändern -pdfjs-editor-resizer-label-bottom-middle = Unten mittig - Größe ändern -pdfjs-editor-resizer-label-bottom-left = Linke untere Ecke - Größe ändern -pdfjs-editor-resizer-label-middle-left = Mitte links - Größe ändern pdfjs-editor-resizer-top-left = .aria-label = Linke obere Ecke - Größe ändern pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Abbrechen pdfjs-editor-add-signature-add-button = Hinzufügen pdfjs-editor-edit-signature-update-button = Aktualisieren +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Kommentar bearbeiten +pdfjs-editor-edit-comment-popup-button = + .title = Kommentar bearbeiten +pdfjs-editor-delete-comment-popup-button-label = Kommentar entfernen +pdfjs-editor-delete-comment-popup-button = + .title = Kommentar entfernen +pdfjs-show-comment-button = + .title = Kommentar anzeigen + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Aktionen -pdfjs-editor-edit-comment-actions-button = - .title = Aktionen -pdfjs-editor-edit-comment-close-button-label = Schließen -pdfjs-editor-edit-comment-close-button = - .title = Schließen -pdfjs-editor-edit-comment-actions-edit-button-label = Bearbeiten -pdfjs-editor-edit-comment-actions-delete-button-label = Löschen -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Kommentar eingeben -pdfjs-editor-edit-comment-manager-cancel-button = Abbrechen -pdfjs-editor-edit-comment-manager-save-button = Speichern +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Kommentar bearbeiten +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualisieren +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Kommentar hinzufügen +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Hinzufügen +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Schreiben beginnen… +pdfjs-editor-edit-comment-dialog-cancel-button = Abbrechen ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Kommentar bearbeiten +pdfjs-editor-add-comment-button = + .title = Kommentar hinzufügen ## Main menu for adding/removing signatures diff --git a/l10n/dsb/viewer.ftl b/l10n/dsb/viewer.ftl index 29d9d9a65fcbe..3deccc162809c 100644 --- a/l10n/dsb/viewer.ftl +++ b/l10n/dsb/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtow) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtow) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtow) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Awtor: pdfjs-document-properties-subject = Tema: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Datum změny: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Awtor: pdfjs-document-properties-producer = PDF-gótowaŕ: pdfjs-document-properties-version = PDF-wersija: @@ -179,10 +167,10 @@ pdfjs-printing-not-ready = Warnowanje: PDF njejo se za śišćanje dopołnje zac ## Tooltips and alt text for side panel toolbar buttons pdfjs-toggle-sidebar-button = - .title = Bócnicu pokazaś/schowaś + .title = Bocnicu pokazaś/schowaś pdfjs-toggle-sidebar-notification-button = .title = Bocnicu pśešaltowaś (dokument rozrědowanje/pśipiski/warstwy wopśimujo) -pdfjs-toggle-sidebar-button-label = Bócnicu pokazaś/schowaś +pdfjs-toggle-sidebar-button-label = Bocnicu pokazaś/schowaś pdfjs-document-outline-button = .title = Dokumentowe naraźenje pokazaś (dwójne kliknjenje, aby se wšykne zapiski pokazali/schowali) pdfjs-document-outline-button-label = Dokumentowa struktura @@ -279,10 +267,6 @@ pdfjs-rendering-error = Pśi zwobraznjanju boka jo zmólka nastała. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -328,6 +312,10 @@ pdfjs-comment-floating-button = .title = Komentěrowaś .aria-label = Komentěrowaś pdfjs-comment-floating-button-label = Komentěrowaś +pdfjs-editor-comment-button = + .title = Komentěrowaś + .aria-label = Komentěrowaś +pdfjs-editor-comment-button-label = Komentar pdfjs-editor-signature-button = .title = Signaturu pśidaś pdfjs-editor-signature-button-label = Signaturu pśidaś @@ -390,20 +378,29 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Tekstowy editor .default-content = Zachopśo pisaś … -pdfjs-free-text = - .aria-label = Tekstowy editor -pdfjs-free-text-default-content = Zachopśo pisaś… -pdfjs-ink = - .aria-label = Kresleński editor -pdfjs-ink-canvas = - .aria-label = Wobraz napórany wót wužywarja +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] { $count } komentar + [two] { $count } komentara + [few] { $count } komentary + *[other] { $count } komentarow + } +pdfjs-editor-comments-sidebar-close-button = + .title = Bocnicu zacyniś + .aria-label = Bocnicu zacyniś +pdfjs-editor-comments-sidebar-close-button-label = Bocnicu zacyniś +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Wiźiśo něco wobspomnjeśa gódnego? Wuzwigniśo to a zawóstajśo komentar. +pdfjs-editor-comments-sidebar-no-comments-link = Dalšne informacije ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternatiwny tekst pdfjs-editor-alt-text-edit-button = .aria-label = Alternatiwny tekst wobźěłaś -pdfjs-editor-alt-text-edit-button-label = Alternatiwny tekst wobźěłaś pdfjs-editor-alt-text-dialog-label = Nastajenje wubraś pdfjs-editor-alt-text-dialog-description = Alternatiwny tekst pomaga, gaž luźe njamógu wobraz wiźeś abo gaž se wobraz njezacytajo. pdfjs-editor-alt-text-add-description-label = Wopisanje pśidaś @@ -423,14 +420,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Górjejce nalěwo – wjelikosć změniś -pdfjs-editor-resizer-label-top-middle = Górjejce wesrjejź – wjelikosć změniś -pdfjs-editor-resizer-label-top-right = Górjejce napšawo – wjelikosć změniś -pdfjs-editor-resizer-label-middle-right = Wesrjejź napšawo – wjelikosć změniś -pdfjs-editor-resizer-label-bottom-right = Dołojce napšawo – wjelikosć změniś -pdfjs-editor-resizer-label-bottom-middle = Dołojce wesrjejź – wjelikosć změniś -pdfjs-editor-resizer-label-bottom-left = Dołojce nalěwo – wjelikosć změniś -pdfjs-editor-resizer-label-middle-left = Wesrjejź nalěwo – wjelikosć změniś pdfjs-editor-resizer-top-left = .aria-label = Górjejce nalěwo – wjelikosć změniś pdfjs-editor-resizer-top-middle = @@ -624,25 +613,33 @@ pdfjs-editor-add-signature-cancel-button = Pśetergnuś pdfjs-editor-add-signature-add-button = Pśidaś pdfjs-editor-edit-signature-update-button = Aktualizěrowaś +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Komentar wobźěłaś +pdfjs-editor-edit-comment-popup-button = + .title = Komentar wobźěłaś +pdfjs-editor-delete-comment-popup-button-label = Komentar wótwónoźeś +pdfjs-editor-delete-comment-popup-button = + .title = Komentar wótwónoźeś +pdfjs-show-comment-button = + .title = Komentar pokazaś + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Akcije -pdfjs-editor-edit-comment-actions-button = - .title = Akcije -pdfjs-editor-edit-comment-close-button-label = Zacyniś -pdfjs-editor-edit-comment-close-button = - .title = Zacyniś -pdfjs-editor-edit-comment-actions-edit-button-label = Wobźěłaś -pdfjs-editor-edit-comment-actions-delete-button-label = Lašowaś -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Zapódajśo swój komentar -pdfjs-editor-edit-comment-manager-cancel-button = Pśetergnuś -pdfjs-editor-edit-comment-manager-save-button = Składowaś +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Komentar wobźěłaś +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizěrowaś +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Komentar pśidaś +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Pśidaś +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Zachopśo pisaś… +pdfjs-editor-edit-comment-dialog-cancel-button = Pśetergnuś ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Komentar wobźěłaś +pdfjs-editor-add-comment-button = + .title = Komentar pśidaś ## Main menu for adding/removing signatures diff --git a/l10n/el/viewer.ftl b/l10n/el/viewer.ftl index 1638f1cedef57..8dc07fd1600b6 100644 --- a/l10n/el/viewer.ftl +++ b/l10n/el/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Τίτλος: pdfjs-document-properties-author = Συγγραφέας: pdfjs-document-properties-subject = Θέμα: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Ημερομηνία τροποπ # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Δημιουργός: pdfjs-document-properties-producer = Παραγωγός PDF: pdfjs-document-properties-version = Έκδοση PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Προέκυψε σφάλμα κατά την εμφάν ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Σχόλιο .aria-label = Σχόλιο pdfjs-comment-floating-button-label = Σχόλιο +pdfjs-editor-comment-button = + .title = Σχόλιο + .aria-label = Σχόλιο +pdfjs-editor-comment-button-label = Σχόλιο pdfjs-editor-signature-button = .title = Προσθήκη υπογραφής pdfjs-editor-signature-button-label = Προσθήκη υπογραφής @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Επεξεργασία κειμένου .default-content = Ξεκινήστε να πληκτρολογείτε… -pdfjs-free-text = - .aria-label = Επεξεργασία κειμένου -pdfjs-free-text-default-content = Ξεκινήστε να πληκτρολογείτε… -pdfjs-ink = - .aria-label = Επεξεργασία σχεδίων -pdfjs-ink-canvas = - .aria-label = Εικόνα από τον χρήστη +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Σχόλια + *[other] Σχόλια + } +pdfjs-editor-comments-sidebar-close-button = + .title = Κλείσιμο πλευρικής στήλης + .aria-label = Κλείσιμο πλευρικής στήλης +pdfjs-editor-comments-sidebar-close-button-label = Κλείσιμο πλευρικής στήλης +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Βλέπετε κάτι αξιοσημείωτο; Επισημάνετε το και αφήστε ένα σχόλιο. +pdfjs-editor-comments-sidebar-no-comments-link = Μάθετε περισσότερα ## Alt-text dialog pdfjs-editor-alt-text-button-label = Εναλλακτικό κείμενο pdfjs-editor-alt-text-edit-button = .aria-label = Επεξεργασία εναλλακτικού κειμένου -pdfjs-editor-alt-text-edit-button-label = Επεξεργασία εναλλακτικού κειμένου pdfjs-editor-alt-text-dialog-label = Διαλέξτε μια επιλογή pdfjs-editor-alt-text-dialog-description = Το εναλλακτικό κείμενο είναι χρήσιμο όταν οι άνθρωποι δεν μπορούν να δουν την εικόνα ή όταν αυτή δεν φορτώνεται. pdfjs-editor-alt-text-add-description-label = Προσθήκη περιγραφής @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Επάνω αριστερή γωνία — αλλαγή μεγέθους -pdfjs-editor-resizer-label-top-middle = Μέσο επάνω πλευράς — αλλαγή μεγέθους -pdfjs-editor-resizer-label-top-right = Επάνω δεξιά γωνία — αλλαγή μεγέθους -pdfjs-editor-resizer-label-middle-right = Μέσο δεξιάς πλευράς — αλλαγή μεγέθους -pdfjs-editor-resizer-label-bottom-right = Κάτω δεξιά γωνία — αλλαγή μεγέθους -pdfjs-editor-resizer-label-bottom-middle = Μέσο κάτω πλευράς — αλλαγή μεγέθους -pdfjs-editor-resizer-label-bottom-left = Κάτω αριστερή γωνία — αλλαγή μεγέθους -pdfjs-editor-resizer-label-middle-left = Μέσο αριστερής πλευράς — αλλαγή μεγέθους pdfjs-editor-resizer-top-left = .aria-label = Επάνω αριστερή γωνία — αλλαγή μεγέθους pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Ακύρωση pdfjs-editor-add-signature-add-button = Προσθήκη pdfjs-editor-edit-signature-update-button = Ενημέρωση +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Επεξεργασία σχολίου +pdfjs-editor-edit-comment-popup-button = + .title = Επεξεργασία σχολίου +pdfjs-editor-delete-comment-popup-button-label = Αφαίρεση σχολίου +pdfjs-editor-delete-comment-popup-button = + .title = Αφαίρεση σχολίου +pdfjs-show-comment-button = + .title = Εμφάνιση σχολίου + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Ενέργειες -pdfjs-editor-edit-comment-actions-button = - .title = Ενέργειες -pdfjs-editor-edit-comment-close-button-label = Κλείσιμο -pdfjs-editor-edit-comment-close-button = - .title = Κλείσιμο -pdfjs-editor-edit-comment-actions-edit-button-label = Επεξεργασία -pdfjs-editor-edit-comment-actions-delete-button-label = Διαγραφή -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Εισαγάγετε το σχόλιό σας -pdfjs-editor-edit-comment-manager-cancel-button = Ακύρωση -pdfjs-editor-edit-comment-manager-save-button = Αποθήκευση +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Επεξεργασία σχολίου +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Ενημέρωση +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Προσθήκη σχολίου +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Προσθήκη +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Ξεκινήστε να πληκτρολογείτε… +pdfjs-editor-edit-comment-dialog-cancel-button = Ακύρωση ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Επεξεργασία σχολίου +pdfjs-editor-add-comment-button = + .title = Προσθήκη σχολίου ## Main menu for adding/removing signatures diff --git a/l10n/en-CA/viewer.ftl b/l10n/en-CA/viewer.ftl index 206dd4f0c5ac9..ececeb9c0e9fd 100644 --- a/l10n/en-CA/viewer.ftl +++ b/l10n/en-CA/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Title: pdfjs-document-properties-author = Author: pdfjs-document-properties-subject = Subject: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Modification Date: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creator: pdfjs-document-properties-producer = PDF Producer: pdfjs-document-properties-version = PDF Version: @@ -275,10 +263,6 @@ pdfjs-rendering-error = An error occurred while rendering the page. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Comment .aria-label = Comment pdfjs-comment-floating-button-label = Comment +pdfjs-editor-comment-button = + .title = Comment + .aria-label = Comment +pdfjs-editor-comment-button-label = Comment pdfjs-editor-signature-button = .title = Add signature pdfjs-editor-signature-button-label = Add signature @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Text Editor .default-content = Start typing… -pdfjs-free-text = - .aria-label = Text Editor -pdfjs-free-text-default-content = Start typing… -pdfjs-ink = - .aria-label = Draw Editor -pdfjs-ink-canvas = - .aria-label = User-created image +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comment + *[other] Comments + } +pdfjs-editor-comments-sidebar-close-button = + .title = Close the sidebar + .aria-label = Close the sidebar +pdfjs-editor-comments-sidebar-close-button-label = Close the sidebar +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment. +pdfjs-editor-comments-sidebar-no-comments-link = Learn more ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alt text pdfjs-editor-alt-text-edit-button = .aria-label = Edit alt text -pdfjs-editor-alt-text-edit-button-label = Edit alt text pdfjs-editor-alt-text-dialog-label = Choose an option pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can’t see the image or when it doesn’t load. pdfjs-editor-alt-text-add-description-label = Add a description @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Top left corner — resize -pdfjs-editor-resizer-label-top-middle = Top middle — resize -pdfjs-editor-resizer-label-top-right = Top right corner — resize -pdfjs-editor-resizer-label-middle-right = Middle right — resize -pdfjs-editor-resizer-label-bottom-right = Bottom right corner — resize -pdfjs-editor-resizer-label-bottom-middle = Bottom middle — resize -pdfjs-editor-resizer-label-bottom-left = Bottom left corner — resize -pdfjs-editor-resizer-label-middle-left = Middle left — resize pdfjs-editor-resizer-top-left = .aria-label = Top left corner — resize pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Cancel pdfjs-editor-add-signature-add-button = Add pdfjs-editor-edit-signature-update-button = Update +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Edit comment +pdfjs-editor-edit-comment-popup-button = + .title = Edit comment +pdfjs-editor-delete-comment-popup-button-label = Remove comment +pdfjs-editor-delete-comment-popup-button = + .title = Remove comment +pdfjs-show-comment-button = + .title = Show comment + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Actions -pdfjs-editor-edit-comment-actions-button = - .title = Actions -pdfjs-editor-edit-comment-close-button-label = Close -pdfjs-editor-edit-comment-close-button = - .title = Close -pdfjs-editor-edit-comment-actions-edit-button-label = Edit -pdfjs-editor-edit-comment-actions-delete-button-label = Delete -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Enter your comment -pdfjs-editor-edit-comment-manager-cancel-button = Cancel -pdfjs-editor-edit-comment-manager-save-button = Save +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Update +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Add comment +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Add +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Start typing… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancel ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Edit comment +pdfjs-editor-add-comment-button = + .title = Add comment ## Main menu for adding/removing signatures diff --git a/l10n/en-GB/viewer.ftl b/l10n/en-GB/viewer.ftl index 533a602631f1f..a3ff755179c5c 100644 --- a/l10n/en-GB/viewer.ftl +++ b/l10n/en-GB/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Title: pdfjs-document-properties-author = Author: pdfjs-document-properties-subject = Subject: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Modification Date: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creator: pdfjs-document-properties-producer = PDF Producer: pdfjs-document-properties-version = PDF Version: @@ -275,10 +263,6 @@ pdfjs-rendering-error = An error occurred while rendering the page. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Comment .aria-label = Comment pdfjs-comment-floating-button-label = Comment +pdfjs-editor-comment-button = + .title = Comment + .aria-label = Comment +pdfjs-editor-comment-button-label = Comment pdfjs-editor-signature-button = .title = Add signature pdfjs-editor-signature-button-label = Add signature @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Text Editor .default-content = Start typing… -pdfjs-free-text = - .aria-label = Text Editor -pdfjs-free-text-default-content = Start typing… -pdfjs-ink = - .aria-label = Draw Editor -pdfjs-ink-canvas = - .aria-label = User-created image +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comment + *[other] Comments + } +pdfjs-editor-comments-sidebar-close-button = + .title = Close the sidebar + .aria-label = Close the sidebar +pdfjs-editor-comments-sidebar-close-button-label = Close the sidebar +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment. +pdfjs-editor-comments-sidebar-no-comments-link = Learn more ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alt text pdfjs-editor-alt-text-edit-button = .aria-label = Edit alt text -pdfjs-editor-alt-text-edit-button-label = Edit alt text pdfjs-editor-alt-text-dialog-label = Choose an option pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can’t see the image or when it doesn’t load. pdfjs-editor-alt-text-add-description-label = Add a description @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Top left corner — resize -pdfjs-editor-resizer-label-top-middle = Top middle — resize -pdfjs-editor-resizer-label-top-right = Top right corner — resize -pdfjs-editor-resizer-label-middle-right = Middle right — resize -pdfjs-editor-resizer-label-bottom-right = Bottom right corner — resize -pdfjs-editor-resizer-label-bottom-middle = Bottom middle — resize -pdfjs-editor-resizer-label-bottom-left = Bottom left corner — resize -pdfjs-editor-resizer-label-middle-left = Middle left — resize pdfjs-editor-resizer-top-left = .aria-label = Top left corner — resize pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Cancel pdfjs-editor-add-signature-add-button = Add pdfjs-editor-edit-signature-update-button = Update +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Edit comment +pdfjs-editor-edit-comment-popup-button = + .title = Edit comment +pdfjs-editor-delete-comment-popup-button-label = Remove comment +pdfjs-editor-delete-comment-popup-button = + .title = Remove comment +pdfjs-show-comment-button = + .title = Show comment + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Actions -pdfjs-editor-edit-comment-actions-button = - .title = Actions -pdfjs-editor-edit-comment-close-button-label = Close -pdfjs-editor-edit-comment-close-button = - .title = Close -pdfjs-editor-edit-comment-actions-edit-button-label = Edit -pdfjs-editor-edit-comment-actions-delete-button-label = Delete -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Enter your comment -pdfjs-editor-edit-comment-manager-cancel-button = Cancel -pdfjs-editor-edit-comment-manager-save-button = Save +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Update +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Add comment +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Add +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Start typing… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancel ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Edit comment +pdfjs-editor-add-comment-button = + .title = Add comment ## Main menu for adding/removing signatures diff --git a/l10n/en-US/viewer.ftl b/l10n/en-US/viewer.ftl index df44ab339fed1..9c6636de7829a 100644 --- a/l10n/en-US/viewer.ftl +++ b/l10n/en-US/viewer.ftl @@ -180,23 +180,6 @@ pdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing. ## Tooltips and alt text for side panel toolbar buttons -pdfjs-toggle-sidebar-button = - .title = Toggle Sidebar -pdfjs-toggle-sidebar-notification-button = - .title = Toggle Sidebar (document contains outline/attachments/layers) -pdfjs-toggle-sidebar-button-label = Toggle Sidebar -pdfjs-document-outline-button = - .title = Show Document Outline (double-click to expand/collapse all items) -pdfjs-document-outline-button-label = Document Outline -pdfjs-attachments-button = - .title = Show Attachments -pdfjs-attachments-button-label = Attachments -pdfjs-layers-button = - .title = Show Layers (double-click to reset all layers to the default state) -pdfjs-layers-button-label = Layers -pdfjs-thumbs-button = - .title = Show Thumbnails -pdfjs-thumbs-button-label = Thumbnails pdfjs-current-outline-item-button = .title = Find Current Outline Item pdfjs-current-outline-item-button-label = Current Outline Item @@ -414,7 +397,8 @@ pdfjs-editor-comments-sidebar-close-button = pdfjs-editor-comments-sidebar-close-button-label = Close the sidebar # Instructional copy to add a comment by selecting text or an annotations. -pdfjs-editor-comments-sidebar-no-comments = Add a comment by selecting text or an annotation. +pdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment. +pdfjs-editor-comments-sidebar-no-comments-link = Learn more ## Alt-text dialog @@ -577,6 +561,7 @@ pdfjs-editor-undo-bar-message-freetext = Text removed pdfjs-editor-undo-bar-message-ink = Drawing removed pdfjs-editor-undo-bar-message-stamp = Image removed pdfjs-editor-undo-bar-message-signature = Signature removed +pdfjs-editor-undo-bar-message-comment = Comment removed # Variables: # $count (Number) - the number of removed annotations. pdfjs-editor-undo-bar-message-multiple = @@ -670,23 +655,116 @@ pdfjs-editor-edit-signature-dialog-title = Edit description pdfjs-editor-edit-signature-update-button = Update +## Comment popup + +pdfjs-show-comment-button = + .title = Show comment + +pdfjs-editor-edit-comment-popup-button-label = Edit comment +pdfjs-editor-edit-comment-popup-button = + .title = Edit comment +pdfjs-editor-delete-comment-popup-button-label = Remove comment +pdfjs-editor-delete-comment-popup-button = + .title = Remove comment + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Actions -pdfjs-editor-edit-comment-actions-button = - .title = Actions -pdfjs-editor-edit-comment-close-button-label = Close -pdfjs-editor-edit-comment-close-button = - .title = Close -pdfjs-editor-edit-comment-actions-edit-button-label = Edit -pdfjs-editor-edit-comment-actions-delete-button-label = Delete -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Enter your comment +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Update + +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Add comment +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Add + +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Start typing… -pdfjs-editor-edit-comment-manager-cancel-button = Cancel -pdfjs-editor-edit-comment-manager-save-button = Save +pdfjs-editor-edit-comment-dialog-cancel-button = Cancel ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Edit comment +pdfjs-editor-add-comment-button = + .title = Add comment + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-button = + .title = Toggle Sidebar +pdfjs-toggle-views-manager-notification-button = + .title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers) +pdfjs-toggle-views-manager-button-label = Toggle Sidebar + +pdfjs-views-manager-sidebar = + .aria-label = Sidebar +pdfjs-views-manager-view-selector-button = + .title = Views +pdfjs-views-manager-view-selector-button-label = Views +pdfjs-views-manager-pages-title = Pages +pdfjs-views-manager-outlines-title = Document outline +pdfjs-views-manager-attachments-title = Attachments +pdfjs-views-manager-layers-title = Layers + +pdfjs-views-manager-pages-option-label = Pages +pdfjs-views-manager-outlines-option-label = Document outline +pdfjs-views-manager-attachments-option-label = Attachments +pdfjs-views-manager-layers-option-label = Layers + +pdfjs-views-manager-add-file-button = + .title = Add file +pdfjs-views-manager-add-file-button-label = Add file + +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } selected + *[other] { $count } selected + } +pdfjs-views-manager-pages-status-none-action-label = Select pages +pdfjs-views-manager-pages-status-action-button-label = Manage +pdfjs-views-manager-pages-status-copy-button-label = Copy +pdfjs-views-manager-pages-status-cut-button-label = Cut +pdfjs-views-manager-pages-status-delete-button-label = Delete +pdfjs-views-manager-pages-status-save-as-button-label = Save as… + +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 page cut + *[other] { $count } pages cut + } + +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 page copied + *[other] { $count } pages copied + } + +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 page deleted + *[other] { $count } pages deleted + } + +pdfjs-views-manager-pages-status-waiting-ready-label = Getting your file ready… +pdfjs-views-manager-pages-status-waiting-uploading-label = Uploading file… + +pdfjs-views-manager-status-warning-cut-label = Couldn’t cut. Refresh page and try again. +pdfjs-views-manager-status-warning-copy-label = Couldn’t copy. Refresh page and try again. +pdfjs-views-manager-status-warning-delete-label = Couldn’t delete. Refresh page and try again. +pdfjs-views-manager-status-warning-save-label = Couldn’t save. Refresh page and try again. +pdfjs-views-manager-status-undo-button-label = Undo +pdfjs-views-manager-status-close-button = + .title = Close +pdfjs-views-manager-status-close-button-label = Close diff --git a/l10n/eo/viewer.ftl b/l10n/eo/viewer.ftl index 68ec1b46a050c..bb459e8d7096d 100644 --- a/l10n/eo/viewer.ftl +++ b/l10n/eo/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } Mo ({ $b } oktetoj) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KO ({ $size_b } oktetoj) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MO ({ $size_b } oktetoj) pdfjs-document-properties-title = Titolo: pdfjs-document-properties-author = Aŭtoro: pdfjs-document-properties-subject = Temo: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Dato de modifo: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Kreinto: pdfjs-document-properties-producer = Produktinto de PDF: pdfjs-document-properties-version = Versio de PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Okazis eraro dum la montro de la paĝo. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Komenti .aria-label = Komenti pdfjs-comment-floating-button-label = Komenti +pdfjs-editor-comment-button = + .title = Komenti + .aria-label = Komenti +pdfjs-editor-comment-button-label = Komenti pdfjs-editor-signature-button = .title = Aldoni subskribon pdfjs-editor-signature-button-label = Aldoni subskribon @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Teksta redaktilo .default-content = Komencu tajpi… -pdfjs-free-text = - .aria-label = Teksta redaktilo -pdfjs-free-text-default-content = Ektajpi… -pdfjs-ink = - .aria-label = Desegnan redaktilon -pdfjs-ink-canvas = - .aria-label = Bildo kreita de uzanto +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Komenti + *[other] Komentoj + } +pdfjs-editor-comments-sidebar-close-button = + .title = Fermi la flankan strion + .aria-label = Fermi la flankan strion +pdfjs-editor-comments-sidebar-close-button-label = Fermi la flankan strion +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Ĉu vi rimarkas ion interesan? Elstarigu tion kaj aldonu komenton. +pdfjs-editor-comments-sidebar-no-comments-link = Pli da informo ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternativa teksto pdfjs-editor-alt-text-edit-button = .aria-label = Redakti alternativan tekston -pdfjs-editor-alt-text-edit-button-label = Redakti alternativan tekston pdfjs-editor-alt-text-dialog-label = Elektu eblon pdfjs-editor-alt-text-dialog-description = Alternativa teksto helpas personojn, en la okazoj kiam ili ne povas vidi aŭ ŝargi la bildon. pdfjs-editor-alt-text-add-description-label = Aldoni priskribon @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Supra maldekstra angulo — ŝangi grandon -pdfjs-editor-resizer-label-top-middle = Supra mezo — ŝanĝi grandon -pdfjs-editor-resizer-label-top-right = Supran dekstran angulon — ŝanĝi grandon -pdfjs-editor-resizer-label-middle-right = Dekstra mezo — ŝanĝi grandon -pdfjs-editor-resizer-label-bottom-right = Malsupra deksta angulo — ŝanĝi grandon -pdfjs-editor-resizer-label-bottom-middle = Malsupra mezo — ŝanĝi grandon -pdfjs-editor-resizer-label-bottom-left = Malsupra maldekstra angulo — ŝanĝi grandon -pdfjs-editor-resizer-label-middle-left = Maldekstra mezo — ŝanĝi grandon pdfjs-editor-resizer-top-left = .aria-label = Supra maldekstra angulo — ŝangi grandon pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Nuligi pdfjs-editor-add-signature-add-button = Aldoni pdfjs-editor-edit-signature-update-button = Ĝisdatigi +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Modifi komenton +pdfjs-editor-edit-comment-popup-button = + .title = Modifi komenton +pdfjs-editor-delete-comment-popup-button-label = Forigi komenton +pdfjs-editor-delete-comment-popup-button = + .title = Forigi komenton +pdfjs-show-comment-button = + .title = Montri komenton + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Agoj -pdfjs-editor-edit-comment-actions-button = - .title = Agoj -pdfjs-editor-edit-comment-close-button-label = Fermi -pdfjs-editor-edit-comment-close-button = - .title = Fermi -pdfjs-editor-edit-comment-actions-edit-button-label = Modifi -pdfjs-editor-edit-comment-actions-delete-button-label = Forigi -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Tajpu vian komenton -pdfjs-editor-edit-comment-manager-cancel-button = Nuligi -pdfjs-editor-edit-comment-manager-save-button = Konservi +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Modifi komenton +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Ĝisdatigi +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Aldoni komenton +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Aldoni +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Ektajpi… +pdfjs-editor-edit-comment-dialog-cancel-button = Nuligi ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Modifi komenton +pdfjs-editor-add-comment-button = + .title = Aldoni komenton ## Main menu for adding/removing signatures diff --git a/l10n/es-AR/viewer.ftl b/l10n/es-AR/viewer.ftl index 463b0d89123b7..e7e362817e761 100644 --- a/l10n/es-AR/viewer.ftl +++ b/l10n/es-AR/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Asunto: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Fecha de modificación: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creador: pdfjs-document-properties-producer = PDF Productor: pdfjs-document-properties-version = Versión de PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Ocurrió un error al dibujar la página. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Comentar .aria-label = Comentar pdfjs-comment-floating-button-label = Comentar +pdfjs-editor-comment-button = + .title = Comentar + .aria-label = Comentar +pdfjs-editor-comment-button-label = Comentar pdfjs-editor-signature-button = .title = Agregar firma pdfjs-editor-signature-button-label = Agregar firma @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Editor de texto .default-content = Comenzar a tipear… -pdfjs-free-text = - .aria-label = Editor de texto -pdfjs-free-text-default-content = Empezar a tipear… -pdfjs-ink = - .aria-label = Editor de dibujos -pdfjs-ink-canvas = - .aria-label = Imagen creada por el usuario +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentario + *[other] Comentarios + } +pdfjs-editor-comments-sidebar-close-button = + .title = Cerrar la barra lateral + .aria-label = Cerrar la barra lateral +pdfjs-editor-comments-sidebar-close-button-label = Cerrar la barra lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ¿Ve algo digno de mención? Resáltelo y deje un comentario. +pdfjs-editor-comments-sidebar-no-comments-link = Conocer más ## Alt-text dialog pdfjs-editor-alt-text-button-label = Texto alternativo pdfjs-editor-alt-text-edit-button = .aria-label = Editar texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar el texto alternativo pdfjs-editor-alt-text-dialog-label = Eligir una opción pdfjs-editor-alt-text-dialog-description = El texto alternativo (texto alternativo) ayuda cuando las personas no pueden ver la imagen o cuando no se carga. pdfjs-editor-alt-text-add-description-label = Agregar una descripción @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Esquina superior izquierda — cambiar el tamaño -pdfjs-editor-resizer-label-top-middle = Arriba en el medio — cambiar el tamaño -pdfjs-editor-resizer-label-top-right = Esquina superior derecha — cambiar el tamaño -pdfjs-editor-resizer-label-middle-right = Al centro a la derecha — cambiar el tamaño -pdfjs-editor-resizer-label-bottom-right = Esquina inferior derecha — cambiar el tamaño -pdfjs-editor-resizer-label-bottom-middle = Abajo en el medio — cambiar el tamaño -pdfjs-editor-resizer-label-bottom-left = Esquina inferior izquierda — cambiar el tamaño -pdfjs-editor-resizer-label-middle-left = Al centro a la izquierda — cambiar el tamaño pdfjs-editor-resizer-top-left = .aria-label = Esquina superior izquierda — cambiar el tamaño pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Cancelar pdfjs-editor-add-signature-add-button = Agregar pdfjs-editor-edit-signature-update-button = Actualizar +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editar comentario +pdfjs-editor-edit-comment-popup-button = + .title = Editar comentario +pdfjs-editor-delete-comment-popup-button-label = Eliminar comentario +pdfjs-editor-delete-comment-popup-button = + .title = Eliminar comentario +pdfjs-show-comment-button = + .title = Mostrar comentario + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Acciones -pdfjs-editor-edit-comment-actions-button = - .title = Acciones -pdfjs-editor-edit-comment-close-button-label = Cerrar -pdfjs-editor-edit-comment-close-button = - .title = Cerrar -pdfjs-editor-edit-comment-actions-edit-button-label = Editar -pdfjs-editor-edit-comment-actions-delete-button-label = Borrar -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Ingresar un comentario -pdfjs-editor-edit-comment-manager-cancel-button = Cancelar -pdfjs-editor-edit-comment-manager-save-button = Guardar +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentario +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Agregar comentario +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Agregar +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Empezar a tipear… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Editar comentario +pdfjs-editor-add-comment-button = + .title = Agregar comentario ## Main menu for adding/removing signatures diff --git a/l10n/es-CL/viewer.ftl b/l10n/es-CL/viewer.ftl index 667305ba307b4..6eb18e27c8e28 100644 --- a/l10n/es-CL/viewer.ftl +++ b/l10n/es-CL/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Asunto: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Fecha de modificación: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creador: pdfjs-document-properties-producer = Productor del PDF: pdfjs-document-properties-version = Versión de PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Ocurrió un error al renderizar la página. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Comentario .aria-label = Comentario pdfjs-comment-floating-button-label = Comentario +pdfjs-editor-comment-button = + .title = Comentar + .aria-label = Comentar +pdfjs-editor-comment-button-label = Comentar pdfjs-editor-signature-button = .title = Añadir firma pdfjs-editor-signature-button-label = Añadir firma @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Editor de texto .default-content = Empieza a escribir… -pdfjs-free-text = - .aria-label = Editor de texto -pdfjs-free-text-default-content = Empieza a escribir… -pdfjs-ink = - .aria-label = Editor de dibujos -pdfjs-ink-canvas = - .aria-label = Imagen creada por el usuario +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentario + *[other] Comentarios + } +pdfjs-editor-comments-sidebar-close-button = + .title = Cerrar la barra lateral + .aria-label = Cerrar la barra lateral +pdfjs-editor-comments-sidebar-close-button-label = Cerrar la barra lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ¿Ves algo interesante? Resáltalo y deja un comentario. +pdfjs-editor-comments-sidebar-no-comments-link = Más información ## Alt-text dialog pdfjs-editor-alt-text-button-label = Texto alternativo pdfjs-editor-alt-text-edit-button = .aria-label = Editar texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar texto alternativo pdfjs-editor-alt-text-dialog-label = Elige una opción pdfjs-editor-alt-text-dialog-description = El texto alternativo (alt text) ayuda cuando las personas no pueden ver la imagen o cuando no se carga. pdfjs-editor-alt-text-add-description-label = Añade una descripción @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Esquina superior izquierda — cambiar el tamaño -pdfjs-editor-resizer-label-top-middle = Borde superior en el medio — cambiar el tamaño -pdfjs-editor-resizer-label-top-right = Esquina superior derecha — cambiar el tamaño -pdfjs-editor-resizer-label-middle-right = Borde derecho en el medio — cambiar el tamaño -pdfjs-editor-resizer-label-bottom-right = Esquina inferior derecha — cambiar el tamaño -pdfjs-editor-resizer-label-bottom-middle = Borde inferior en el medio — cambiar el tamaño -pdfjs-editor-resizer-label-bottom-left = Esquina inferior izquierda — cambiar el tamaño -pdfjs-editor-resizer-label-middle-left = Borde izquierdo en el medio — cambiar el tamaño pdfjs-editor-resizer-top-left = .aria-label = Esquina superior izquierda — cambiar el tamaño pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Cancelar pdfjs-editor-add-signature-add-button = Añadir pdfjs-editor-edit-signature-update-button = Actualizar +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editar comentario +pdfjs-editor-edit-comment-popup-button = + .title = Editar comentario +pdfjs-editor-delete-comment-popup-button-label = Eliminar comentario +pdfjs-editor-delete-comment-popup-button = + .title = Eliminar comentario +pdfjs-show-comment-button = + .title = Mostrar comentario + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Acciones -pdfjs-editor-edit-comment-actions-button = - .title = Acciones -pdfjs-editor-edit-comment-close-button-label = Cerrar -pdfjs-editor-edit-comment-close-button = - .title = Cerrar -pdfjs-editor-edit-comment-actions-edit-button-label = Editar -pdfjs-editor-edit-comment-actions-delete-button-label = Eliminar -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Ingresa tu comentario -pdfjs-editor-edit-comment-manager-cancel-button = Cancelar -pdfjs-editor-edit-comment-manager-save-button = Guardar +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentario +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Añadir comentario +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Añadir +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Empieza a escribir… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Editar comentario +pdfjs-editor-add-comment-button = + .title = Añadir comentario ## Main menu for adding/removing signatures diff --git a/l10n/es-ES/viewer.ftl b/l10n/es-ES/viewer.ftl index 432df09ff9740..51ac6b055765c 100644 --- a/l10n/es-ES/viewer.ftl +++ b/l10n/es-ES/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Asunto: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Fecha de modificación: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creador: pdfjs-document-properties-producer = Productor PDF: pdfjs-document-properties-version = Versión PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Ocurrió un error al renderizar la página. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -302,9 +286,13 @@ pdfjs-web-fonts-disabled = Las tipografías web están desactivadas: es imposibl pdfjs-editor-free-text-button = .title = Texto +pdfjs-editor-color-picker-free-text-input = + .title = Cambiar el color del texto pdfjs-editor-free-text-button-label = Texto pdfjs-editor-ink-button = .title = Dibujar +pdfjs-editor-color-picker-ink-input = + .title = Cambiar el color del dibujo pdfjs-editor-ink-button-label = Dibujar pdfjs-editor-stamp-button = .title = Añadir o editar imágenes @@ -316,6 +304,14 @@ pdfjs-highlight-floating-button1 = .title = Resaltar .aria-label = Resaltar pdfjs-highlight-floating-button-label = Resaltar +pdfjs-comment-floating-button = + .title = Comentario + .aria-label = Comentario +pdfjs-comment-floating-button-label = Comentario +pdfjs-editor-comment-button = + .title = Comentario + .aria-label = Comentario +pdfjs-editor-comment-button-label = Comentario pdfjs-editor-signature-button = .title = Añadir firma pdfjs-editor-signature-button-label = Añadir firma @@ -378,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Editor de texto .default-content = Empiece a escribir… -pdfjs-free-text = - .aria-label = Editor de texto -pdfjs-free-text-default-content = Empezar a escribir… -pdfjs-ink = - .aria-label = Editor de dibujos -pdfjs-ink-canvas = - .aria-label = Imagen creada por el usuario +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentario + *[other] Comentarios + } +pdfjs-editor-comments-sidebar-close-button = + .title = Cerrar la barra lateral + .aria-label = Cerrar la barra lateral +pdfjs-editor-comments-sidebar-close-button-label = Cerrar la barra lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ¿Ve algo interesante? Resáltelo y deje un comentario. +pdfjs-editor-comments-sidebar-no-comments-link = Saber más ## Alt-text dialog pdfjs-editor-alt-text-button-label = Texto alternativo pdfjs-editor-alt-text-edit-button = .aria-label = Editar el texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar el texto alternativo pdfjs-editor-alt-text-dialog-label = Eligir una opción pdfjs-editor-alt-text-dialog-description = El texto alternativo (texto alternativo) ayuda cuando las personas no pueden ver la imagen o cuando no se carga. pdfjs-editor-alt-text-add-description-label = Añadir una descripción @@ -411,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Esquina superior izquierda — redimensionar -pdfjs-editor-resizer-label-top-middle = Borde superior en el medio — redimensionar -pdfjs-editor-resizer-label-top-right = Esquina superior derecha — redimensionar -pdfjs-editor-resizer-label-middle-right = Borde derecho en el medio — redimensionar -pdfjs-editor-resizer-label-bottom-right = Esquina inferior derecha — redimensionar -pdfjs-editor-resizer-label-bottom-middle = Borde inferior en el medio — redimensionar -pdfjs-editor-resizer-label-bottom-left = Esquina inferior izquierda — redimensionar -pdfjs-editor-resizer-label-middle-left = Borde izquierdo en el medio — redimensionar pdfjs-editor-resizer-top-left = .aria-label = Esquina superior izquierda — redimensionar pdfjs-editor-resizer-top-middle = @@ -524,6 +519,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de t pdfjs-editor-alt-text-settings-show-dialog-description = Le ayuda a asegurarse de que todas sus imágenes tengan texto alternativo. pdfjs-editor-alt-text-settings-close-button = Cerrar +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Resaltado añadido +pdfjs-editor-freetext-added-alert = Texto añadido +pdfjs-editor-ink-added-alert = Dibujo añadido +pdfjs-editor-stamp-added-alert = Imagen añadida +pdfjs-editor-signature-added-alert = Firma añadida + ## "Annotations removed" bar pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado @@ -592,6 +595,8 @@ pdfjs-editor-add-signature-save-checkbox = Guardar firma pdfjs-editor-add-signature-save-warning-message = Ha alcanzado el límite de 5 firmas guardadas. Elimine una para guardar más. pdfjs-editor-add-signature-image-upload-error-title = No se ha podido subir la imagen pdfjs-editor-add-signature-image-upload-error-description = Compruebe su conexión de red o pruebe con otra imagen. +pdfjs-editor-add-signature-image-no-data-error-title = No se puede convertir esta imagen en una firma +pdfjs-editor-add-signature-image-no-data-error-description = Por favor, intente cargar una imagen diferente. pdfjs-editor-add-signature-error-close-button = Cerrar ## Dialog buttons @@ -600,6 +605,34 @@ pdfjs-editor-add-signature-cancel-button = Cancelar pdfjs-editor-add-signature-add-button = Añadir pdfjs-editor-edit-signature-update-button = Actualizar +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editar comentario +pdfjs-editor-edit-comment-popup-button = + .title = Editar comentario +pdfjs-editor-delete-comment-popup-button-label = Eliminar comentario +pdfjs-editor-delete-comment-popup-button = + .title = Eliminar comentario +pdfjs-show-comment-button = + .title = Mostrar comentario + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentario +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Añadir comentario +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Añadir +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Empezar a escribir… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Añadir comentario + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/es-MX/viewer.ftl b/l10n/es-MX/viewer.ftl index 8cfc2bb69bb3f..0a3f50f0f56df 100644 --- a/l10n/es-MX/viewer.ftl +++ b/l10n/es-MX/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Asunto: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Fecha de modificación: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creador: pdfjs-document-properties-producer = Productor PDF: pdfjs-document-properties-version = Versión PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Un error ocurrió al renderizar la página. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -302,9 +286,13 @@ pdfjs-web-fonts-disabled = Las fuentes web están desactivadas: es imposible usa pdfjs-editor-free-text-button = .title = Texto +pdfjs-editor-color-picker-free-text-input = + .title = Cambiar el color del texto pdfjs-editor-free-text-button-label = Texto pdfjs-editor-ink-button = .title = Dibujar +pdfjs-editor-color-picker-ink-input = + .title = Cambiar el color del dibujo pdfjs-editor-ink-button-label = Dibujar pdfjs-editor-stamp-button = .title = Agregar o editar imágenes @@ -316,10 +304,34 @@ pdfjs-highlight-floating-button1 = .title = Destacados .aria-label = Destacados pdfjs-highlight-floating-button-label = Destacados +pdfjs-comment-floating-button = + .title = Comentario + .aria-label = Comentario +pdfjs-comment-floating-button-label = Comentario +pdfjs-editor-comment-button = + .title = Comentario + .aria-label = Comentario +pdfjs-editor-comment-button-label = Comentario pdfjs-editor-signature-button = .title = Agregar firma pdfjs-editor-signature-button-label = Añadir firma +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor de destacados +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor de dibujos +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor de firmas: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor de imágenes + ## Remove button for the various kind of editor. pdfjs-editor-remove-ink-button = @@ -348,27 +360,41 @@ pdfjs-editor-stamp-add-image-button-label = Agregar imagen pdfjs-editor-free-highlight-thickness-input = Espesor pdfjs-editor-free-highlight-thickness-title = .title = Cambiar el grosor al resaltar elementos que no sean texto +pdfjs-editor-add-signature-container = + .aria-label = Controles de firma y firmas guardadas pdfjs-editor-signature-add-signature-button = .title = Agregar nueva firma pdfjs-editor-signature-add-signature-button-label = Agregar nueva firma +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Firma guardada: { $description } # .default-content is used as a placeholder in an empty text editor. pdfjs-free-text2 = .aria-label = Editor de texto .default-content = Comenzar a escribir… -pdfjs-free-text = - .aria-label = Editor de texto -pdfjs-free-text-default-content = Empieza a escribir… -pdfjs-ink = - .aria-label = Editor de dibujo -pdfjs-ink-canvas = - .aria-label = Imagen creada por el usuario +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentario + *[other] Comentarios + } +pdfjs-editor-comments-sidebar-close-button = + .title = Cerrar la barra lateral + .aria-label = Cerrar la barra lateral +pdfjs-editor-comments-sidebar-close-button-label = Cerrar la barra lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ¿Ves algo interesante? Resáltalo y deja un comentario. +pdfjs-editor-comments-sidebar-no-comments-link = Saber más ## Alt-text dialog pdfjs-editor-alt-text-button-label = Texto alternativo pdfjs-editor-alt-text-edit-button = .aria-label = Editar texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar texto alternativo pdfjs-editor-alt-text-dialog-label = Elige una opción pdfjs-editor-alt-text-dialog-description = El texto alternativo (texto alternativo) ayuda cuando las personas no pueden ver la imagen o cuando no se carga. pdfjs-editor-alt-text-add-description-label = Añadir una descripción @@ -388,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Esquina superior izquierda: cambiar el tamaño -pdfjs-editor-resizer-label-top-middle = Arriba en el medio: cambiar el tamaño -pdfjs-editor-resizer-label-top-right = Esquina superior derecha: cambiar el tamaño -pdfjs-editor-resizer-label-middle-right = Centro derecha: cambiar el tamaño -pdfjs-editor-resizer-label-bottom-right = Esquina inferior derecha: cambiar el tamaño -pdfjs-editor-resizer-label-bottom-middle = Abajo en el medio: cambiar el tamaño -pdfjs-editor-resizer-label-bottom-left = Esquina inferior izquierda: cambiar el tamaño -pdfjs-editor-resizer-label-middle-left = Centro izquierda: cambiar el tamaño pdfjs-editor-resizer-top-left = .aria-label = Esquina superior izquierda — redimensionar pdfjs-editor-resizer-top-middle = @@ -501,6 +519,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de t pdfjs-editor-alt-text-settings-show-dialog-description = Te ayuda a asegurarte de que todas tus imágenes tengan texto alternativo. pdfjs-editor-alt-text-settings-close-button = Cerrar +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Destacado añadido +pdfjs-editor-freetext-added-alert = Texto agregado +pdfjs-editor-ink-added-alert = Dibujo agregado +pdfjs-editor-stamp-added-alert = Imagen agregada +pdfjs-editor-signature-added-alert = Firma agregada + ## "Annotations removed" bar pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado @@ -524,6 +550,7 @@ pdfjs-editor-undo-bar-close-button-label = Cerrar ## Add a signature dialog +pdfjs-editor-add-signature-dialog-label = Este modal permite al usuario crear una firma para añadirla a un documento PDF. El usuario puede editar el nombre (que también sirve como texto alternativo) y, opcionalmente, guardar la firma para utilizarla en otras ocasiones. pdfjs-editor-add-signature-dialog-title = Agregar una firma ## Tab names @@ -544,6 +571,16 @@ pdfjs-editor-add-signature-type-input = .placeholder = Escribe tu firma pdfjs-editor-add-signature-draw-placeholder = Dibuja tu firma pdfjs-editor-add-signature-draw-thickness-range-label = Grossor +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Grosor del dibujo: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Arrastra un archivo aquí para cargarlo +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] O elegir archivos de imagen + *[other] O buscar archivos de imagen + } ## Controls @@ -558,12 +595,49 @@ pdfjs-editor-add-signature-save-checkbox = Guardar firma pdfjs-editor-add-signature-save-warning-message = Has alcanzado el límite de 5 firmas guardadas. Elimina una para guardar más. pdfjs-editor-add-signature-image-upload-error-title = No se pudo cargar la imagen pdfjs-editor-add-signature-image-upload-error-description = Verifica tu conexión de red o prueba con otra imagen. +pdfjs-editor-add-signature-image-no-data-error-title = No se puede convertir esta imagen en una firma +pdfjs-editor-add-signature-image-no-data-error-description = Intenta cargar una imagen diferente. pdfjs-editor-add-signature-error-close-button = Cerrar ## Dialog buttons pdfjs-editor-add-signature-cancel-button = Cancelar pdfjs-editor-add-signature-add-button = Agregar +pdfjs-editor-edit-signature-update-button = Actualizar + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editar comentario +pdfjs-editor-edit-comment-popup-button = + .title = Editar comentario +pdfjs-editor-delete-comment-popup-button-label = Eliminar comentario +pdfjs-editor-delete-comment-popup-button = + .title = Eliminar comentario +pdfjs-show-comment-button = + .title = Mostrar comentario + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentario +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Agregar comentario +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Agregar +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Empieza a escribir… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Añadir comentario + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Eliminar la firma guardada +pdfjs-editor-delete-signature-button-label1 = Eliminar la firma guardada ## Editor toolbar diff --git a/l10n/et/viewer.ftl b/l10n/et/viewer.ftl index 7bea931a73b29..e0212b77d48f7 100644 --- a/l10n/et/viewer.ftl +++ b/l10n/et/viewer.ftl @@ -92,24 +92,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Dokumendi omadused… pdfjs-document-properties-file-name = Faili nimi: pdfjs-document-properties-file-size = Faili suurus: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KiB ({ $size_b } baiti) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MiB ({ $size_b } baiti) pdfjs-document-properties-title = Pealkiri: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Teema: pdfjs-document-properties-keywords = Märksõnad: pdfjs-document-properties-creation-date = Loodud: pdfjs-document-properties-modification-date = Muudetud: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date } { $time } pdfjs-document-properties-creator = Looja: pdfjs-document-properties-producer = Generaator: pdfjs-document-properties-version = Generaatori versioon: @@ -237,10 +225,6 @@ pdfjs-rendering-error = Lehe renderdamisel esines viga. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/eu/viewer.ftl b/l10n/eu/viewer.ftl index 5d6463cac1a8b..2c554328cc4de 100644 --- a/l10n/eu/viewer.ftl +++ b/l10n/eu/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } byte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) pdfjs-document-properties-title = Izenburua: pdfjs-document-properties-author = Egilea: pdfjs-document-properties-subject = Gaia: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Aldatze-data: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Sortzailea: pdfjs-document-properties-producer = PDFaren ekoizlea: pdfjs-document-properties-version = PDF bertsioa: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Errorea gertatu da orria errendatzean. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -302,9 +286,13 @@ pdfjs-web-fonts-disabled = Webeko letra-tipoak desgaituta daude: ezin dira kapsu pdfjs-editor-free-text-button = .title = Testua +pdfjs-editor-color-picker-free-text-input = + .title = Aldatu testuaren kolorea pdfjs-editor-free-text-button-label = Testua pdfjs-editor-ink-button = .title = Marrazkia +pdfjs-editor-color-picker-ink-input = + .title = Aldatu marrazteko kolorea pdfjs-editor-ink-button-label = Marrazkia pdfjs-editor-stamp-button = .title = Gehitu edo editatu irudiak @@ -316,6 +304,14 @@ pdfjs-highlight-floating-button1 = .title = Nabarmendu .aria-label = Nabarmendu pdfjs-highlight-floating-button-label = Nabarmendu +pdfjs-comment-floating-button = + .title = Iruzkina + .aria-label = Iruzkina +pdfjs-comment-floating-button-label = Iruzkina +pdfjs-editor-comment-button = + .title = Iruzkina + .aria-label = Iruzkina +pdfjs-editor-comment-button-label = Iruzkina pdfjs-editor-signature-button = .title = Gehitu sinadura pdfjs-editor-signature-button-label = Gehitu sinadura @@ -378,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Testu-editorea .default-content = Hasi idazten… -pdfjs-free-text = - .aria-label = Testu-editorea -pdfjs-free-text-default-content = Hasi idazten… -pdfjs-ink = - .aria-label = Marrazki-editorea -pdfjs-ink-canvas = - .aria-label = Erabiltzaileak sortutako irudia +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Iruzkina + *[other] Iruzkinak + } +pdfjs-editor-comments-sidebar-close-button = + .title = Itxi alboko barra + .aria-label = Itxi alboko barra +pdfjs-editor-comments-sidebar-close-button-label = Itxi alboko barra +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Azpimarratzeko zerbait ikusi duzu? Nabarmen ezazu eta utzi iruzkina. +pdfjs-editor-comments-sidebar-no-comments-link = Argibide gehiago ## Alt-text dialog pdfjs-editor-alt-text-button-label = Testu alternatiboa pdfjs-editor-alt-text-edit-button = .aria-label = Editatu testu alternatiboa -pdfjs-editor-alt-text-edit-button-label = Editatu testu alternatiboa pdfjs-editor-alt-text-dialog-label = Aukeratu aukera pdfjs-editor-alt-text-dialog-description = Testu alternatiboak laguntzen du jendeak ezin duenean irudia ikusi edo ez denean kargatzen. pdfjs-editor-alt-text-add-description-label = Gehitu azalpena @@ -411,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Goiko ezkerreko izkina — aldatu tamaina -pdfjs-editor-resizer-label-top-middle = Goian erdian — aldatu tamaina -pdfjs-editor-resizer-label-top-right = Goiko eskuineko izkina — aldatu tamaina -pdfjs-editor-resizer-label-middle-right = Erdian eskuinean — aldatu tamaina -pdfjs-editor-resizer-label-bottom-right = Beheko eskuineko izkina — aldatu tamaina -pdfjs-editor-resizer-label-bottom-middle = Behean erdian — aldatu tamaina -pdfjs-editor-resizer-label-bottom-left = Beheko ezkerreko izkina — aldatu tamaina -pdfjs-editor-resizer-label-middle-left = Erdian ezkerrean — aldatu tamaina pdfjs-editor-resizer-top-left = .aria-label = Goiko ezkerreko izkina — aldatu tamaina pdfjs-editor-resizer-top-middle = @@ -524,6 +519,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Erakutsi testu alterna pdfjs-editor-alt-text-settings-show-dialog-description = Zure irudiek testu alternatiboa duela ziurtatzen laguntzen dizu. pdfjs-editor-alt-text-settings-close-button = Itxi +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Nabarmentzea gehituta +pdfjs-editor-freetext-added-alert = Testua gehituta +pdfjs-editor-ink-added-alert = Marrazkia gehituta +pdfjs-editor-stamp-added-alert = Irudia gehituta +pdfjs-editor-signature-added-alert = Sinadura gehituta + ## "Annotations removed" bar pdfjs-editor-undo-bar-message-highlight = Nabarmentzea kenduta @@ -596,6 +599,8 @@ pdfjs-editor-add-signature-save-checkbox = Gorde sinadura pdfjs-editor-add-signature-save-warning-message = Gordetako sinadura kopuruaren mugara heldu zara (5). Gehiago gorde ahal izateko, ken ezazu bat. pdfjs-editor-add-signature-image-upload-error-title = Ezin da irudia igo pdfjs-editor-add-signature-image-upload-error-description = Egiaztatu zure sareko konexioa edo saiatu beste irudi batekin. +pdfjs-editor-add-signature-image-no-data-error-title = Ezin da irudia sinaduran bihurtu +pdfjs-editor-add-signature-image-no-data-error-description = Saiatu beste irudi bat igotzen. pdfjs-editor-add-signature-error-close-button = Itxi ## Dialog buttons @@ -604,6 +609,34 @@ pdfjs-editor-add-signature-cancel-button = Utzi pdfjs-editor-add-signature-add-button = Gehitu pdfjs-editor-edit-signature-update-button = Eguneratu +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editatu iruzkina +pdfjs-editor-edit-comment-popup-button = + .title = Editatu iruzkina +pdfjs-editor-delete-comment-popup-button-label = Kendu iruzkina +pdfjs-editor-delete-comment-popup-button = + .title = Kendu iruzkina +pdfjs-show-comment-button = + .title = Erakutsi iruzkina + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editatu iruzkina +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Eguneratu +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Gehitu iruzkina +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Gehitu +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Hasi idazten… +pdfjs-editor-edit-comment-dialog-cancel-button = Utzi + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Gehitu iruzkina + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/fa/viewer.ftl b/l10n/fa/viewer.ftl index 37c411909c179..edff37cf89db8 100644 --- a/l10n/fa/viewer.ftl +++ b/l10n/fa/viewer.ftl @@ -103,14 +103,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } مگابایت ({ $b } بایت) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } کیلوبایت ({ $size_b } بایت) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } مگابایت ({ $size_b } بایت) pdfjs-document-properties-title = عنوان: pdfjs-document-properties-author = نویسنده: pdfjs-document-properties-subject = موضوع: @@ -120,10 +112,6 @@ pdfjs-document-properties-modification-date = تاریخ ویرایش: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }، { $time } pdfjs-document-properties-creator = ایجاد کننده: pdfjs-document-properties-producer = ایجاد کننده PDF: pdfjs-document-properties-version = نسخه PDF: @@ -237,10 +225,6 @@ pdfjs-rendering-error = هنگام بارگیری صفحه خطایی رخ دا ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }، { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -292,9 +276,6 @@ pdfjs-editor-stamp-add-image-button-label = افزودن تصویر pdfjs-free-text2 = .aria-label = ویرایشگر متن .default-content = شروع به نوشتن کنید… -pdfjs-free-text = - .aria-label = ویرایشگر متن -pdfjs-free-text-default-content = شروع به نوشتن کنید… ## Alt-text dialog diff --git a/l10n/ff/viewer.ftl b/l10n/ff/viewer.ftl index 8e0e2efa5fd65..e7cc1d705bf44 100644 --- a/l10n/ff/viewer.ftl +++ b/l10n/ff/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Keeroraaɗi Winndannde… pdfjs-document-properties-file-name = Innde fiilde: pdfjs-document-properties-file-size = Ɓetol fiilde: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bite) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bite) pdfjs-document-properties-title = Tiitoonde: pdfjs-document-properties-author = Binnduɗo: pdfjs-document-properties-subject = Toɓɓere: pdfjs-document-properties-keywords = Kelmekele jiytirɗe: pdfjs-document-properties-creation-date = Ñalnde Sosaa: pdfjs-document-properties-modification-date = Ñalnde Waylaa: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Cosɗo: pdfjs-document-properties-producer = Paggiiɗo PDF: pdfjs-document-properties-version = Yamre PDF: diff --git a/l10n/fi/viewer.ftl b/l10n/fi/viewer.ftl index 0e218d25cc1e6..1d940f4686452 100644 --- a/l10n/fi/viewer.ftl +++ b/l10n/fi/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } Mt ({ $b } tavua) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kt ({ $size_b } tavua) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } Mt ({ $size_b } tavua) pdfjs-document-properties-title = Otsikko: pdfjs-document-properties-author = Tekijä: pdfjs-document-properties-subject = Aihe: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Muokkauspäivämäärä: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Luoja: pdfjs-document-properties-producer = PDF-tuottaja: pdfjs-document-properties-version = PDF-versio: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Tapahtui virhe piirrettäessä sivua. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Kommentti .aria-label = Kommentti pdfjs-comment-floating-button-label = Kommentti +pdfjs-editor-comment-button = + .title = Kommentti + .aria-label = Kommentti +pdfjs-editor-comment-button-label = Kommentti pdfjs-editor-signature-button = .title = Lisää allekirjoitus pdfjs-editor-signature-button-label = Lisää allekirjoitus @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Tekstimuokkain .default-content = Aloita kirjoittaminen… -pdfjs-free-text = - .aria-label = Tekstimuokkain -pdfjs-free-text-default-content = Aloita kirjoittaminen… -pdfjs-ink = - .aria-label = Piirrustusmuokkain -pdfjs-ink-canvas = - .aria-label = Käyttäjän luoma kuva +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Kommentti + *[other] Kommenttia + } +pdfjs-editor-comments-sidebar-close-button = + .title = Sulje sivupaneeli + .aria-label = Sulje sivupaneeli +pdfjs-editor-comments-sidebar-close-button-label = Sulje sivupaneeli +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Näetkö jotain huomionarvoista? Korosta se ja jätä kommentti. +pdfjs-editor-comments-sidebar-no-comments-link = Lue lisää ## Alt-text dialog pdfjs-editor-alt-text-button-label = Vaihtoehtoinen teksti pdfjs-editor-alt-text-edit-button = .aria-label = Muokkaa vaihtoehtoista tekstiä -pdfjs-editor-alt-text-edit-button-label = Muokkaa vaihtoehtoista tekstiä pdfjs-editor-alt-text-dialog-label = Valitse vaihtoehto pdfjs-editor-alt-text-dialog-description = Vaihtoehtoinen teksti ("alt-teksti") auttaa ihmisiä, jotka eivät näe kuvaa tai kun kuva ei lataudu. pdfjs-editor-alt-text-add-description-label = Lisää kuvaus @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Vasen yläkulma - muuta kokoa -pdfjs-editor-resizer-label-top-middle = Ylhäällä keskellä - muuta kokoa -pdfjs-editor-resizer-label-top-right = Oikea yläkulma - muuta kokoa -pdfjs-editor-resizer-label-middle-right = Keskellä oikealla - muuta kokoa -pdfjs-editor-resizer-label-bottom-right = Oikea alakulma - muuta kokoa -pdfjs-editor-resizer-label-bottom-middle = Alhaalla keskellä - muuta kokoa -pdfjs-editor-resizer-label-bottom-left = Vasen alakulma - muuta kokoa -pdfjs-editor-resizer-label-middle-left = Keskellä vasemmalla - muuta kokoa pdfjs-editor-resizer-top-left = .aria-label = Vasen yläkulma - muuta kokoa pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Peruuta pdfjs-editor-add-signature-add-button = Lisää pdfjs-editor-edit-signature-update-button = Päivitä +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Muokkaa kommenttia +pdfjs-editor-edit-comment-popup-button = + .title = Muokkaa kommenttia +pdfjs-editor-delete-comment-popup-button-label = Poista kommentti +pdfjs-editor-delete-comment-popup-button = + .title = Poista kommentti +pdfjs-show-comment-button = + .title = Näytä kommentti + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Toiminnot -pdfjs-editor-edit-comment-actions-button = - .title = Toiminnot -pdfjs-editor-edit-comment-close-button-label = Sulje -pdfjs-editor-edit-comment-close-button = - .title = Sulje -pdfjs-editor-edit-comment-actions-edit-button-label = Muokkaa -pdfjs-editor-edit-comment-actions-delete-button-label = Poista -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Kirjoita kommenttisi -pdfjs-editor-edit-comment-manager-cancel-button = Peruuta -pdfjs-editor-edit-comment-manager-save-button = Tallenna +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Muokkaa kommenttia +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Päivitä +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Lisää kommentti +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Lisää +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Aloita kirjoittaminen… +pdfjs-editor-edit-comment-dialog-cancel-button = Peruuta ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Muokkaa kommenttia +pdfjs-editor-add-comment-button = + .title = Lisää kommentti ## Main menu for adding/removing signatures diff --git a/l10n/fr/viewer.ftl b/l10n/fr/viewer.ftl index a022ec89b5fe4..00e185d5fef61 100644 --- a/l10n/fr/viewer.ftl +++ b/l10n/fr/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } Mo ({ $b } octets) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } Ko ({ $size_b } octets) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } Mo ({ $size_b } octets) pdfjs-document-properties-title = Titre : pdfjs-document-properties-author = Auteur : pdfjs-document-properties-subject = Sujet : @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Modifié le : # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date } à { $time } pdfjs-document-properties-creator = Créé par : pdfjs-document-properties-producer = Outil de conversion PDF : pdfjs-document-properties-version = Version PDF : @@ -271,10 +259,6 @@ pdfjs-rendering-error = Une erreur s’est produite lors de l’affichage de la ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } à { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -320,6 +304,10 @@ pdfjs-comment-floating-button = .title = Commenter .aria-label = Commenter pdfjs-comment-floating-button-label = Commenter +pdfjs-editor-comment-button = + .title = Commenter + .aria-label = Commenter +pdfjs-editor-comment-button-label = Commenter pdfjs-editor-signature-button = .title = Ajouter une signature pdfjs-editor-signature-button-label = Ajouter une signature @@ -382,20 +370,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Éditeur de texte .default-content = Commencez à écrire… -pdfjs-free-text = - .aria-label = Éditeur de texte -pdfjs-free-text-default-content = Commencer à écrire… -pdfjs-ink = - .aria-label = Éditeur de dessin -pdfjs-ink-canvas = - .aria-label = Image créée par l’utilisateur·trice +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Commentaire + *[other] Commentaires + } +pdfjs-editor-comments-sidebar-close-button = + .title = Fermer le panneau latéral + .aria-label = Fermer le panneau latéral +pdfjs-editor-comments-sidebar-close-button-label = Fermer le panneau latéral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vous remarquez quelque chose d’intéressant ? Mettez-le en surbrillance et ajoutez un commentaire. +pdfjs-editor-comments-sidebar-no-comments-link = En savoir plus ## Alt-text dialog pdfjs-editor-alt-text-button-label = Texte alternatif pdfjs-editor-alt-text-edit-button = .aria-label = Modifier le texte alternatif -pdfjs-editor-alt-text-edit-button-label = Modifier le texte alternatif pdfjs-editor-alt-text-dialog-label = Sélectionnez une option pdfjs-editor-alt-text-dialog-description = Le texte alternatif est utile lorsque des personnes ne peuvent pas voir l’image ou que l’image ne se charge pas. pdfjs-editor-alt-text-add-description-label = Ajouter une description @@ -415,14 +410,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Coin supérieur gauche — redimensionner -pdfjs-editor-resizer-label-top-middle = Milieu haut — redimensionner -pdfjs-editor-resizer-label-top-right = Coin supérieur droit — redimensionner -pdfjs-editor-resizer-label-middle-right = Milieu droit — redimensionner -pdfjs-editor-resizer-label-bottom-right = Coin inférieur droit — redimensionner -pdfjs-editor-resizer-label-bottom-middle = Centre bas — redimensionner -pdfjs-editor-resizer-label-bottom-left = Coin inférieur gauche — redimensionner -pdfjs-editor-resizer-label-middle-left = Milieu gauche — redimensionner pdfjs-editor-resizer-top-left = .aria-label = Coin supérieur gauche — redimensionner pdfjs-editor-resizer-top-middle = @@ -614,25 +601,33 @@ pdfjs-editor-add-signature-cancel-button = Annuler pdfjs-editor-add-signature-add-button = Ajouter pdfjs-editor-edit-signature-update-button = Mettre à jour +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Modifier le commentaire +pdfjs-editor-edit-comment-popup-button = + .title = Modifier le commentaire +pdfjs-editor-delete-comment-popup-button-label = Supprimer le commentaire +pdfjs-editor-delete-comment-popup-button = + .title = Supprimer le commentaire +pdfjs-show-comment-button = + .title = Voir les commentaires + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Actions -pdfjs-editor-edit-comment-actions-button = - .title = Actions -pdfjs-editor-edit-comment-close-button-label = Fermer -pdfjs-editor-edit-comment-close-button = - .title = Fermer -pdfjs-editor-edit-comment-actions-edit-button-label = Modifier -pdfjs-editor-edit-comment-actions-delete-button-label = Supprimer -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Saisissez votre commentaire -pdfjs-editor-edit-comment-manager-cancel-button = Annuler -pdfjs-editor-edit-comment-manager-save-button = Enregistrer +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Modifier le commentaire +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Mettre à jour +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Ajouter un commentaire +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Ajouter +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Commencer à écrire… +pdfjs-editor-edit-comment-dialog-cancel-button = Annuler ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Modifier le commentaire +pdfjs-editor-add-comment-button = + .title = Ajouter un commentaire ## Main menu for adding/removing signatures diff --git a/l10n/fur/viewer.ftl b/l10n/fur/viewer.ftl index bf8db139f1a8f..ed942244bce23 100644 --- a/l10n/fur/viewer.ftl +++ b/l10n/fur/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Titul: pdfjs-document-properties-author = Autôr: pdfjs-document-properties-subject = Ogjet: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Date di modifiche: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creatôr pdfjs-document-properties-producer = Gjeneradôr PDF: pdfjs-document-properties-version = Version PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Al è vignût fûr un erôr tal realizâ la visualizazio ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -302,9 +286,13 @@ pdfjs-web-fonts-disabled = I caratars dal Web a son disativâts: Impussibil dopr pdfjs-editor-free-text-button = .title = Test +pdfjs-editor-color-picker-free-text-input = + .title = Cambie colôr dal test pdfjs-editor-free-text-button-label = Test pdfjs-editor-ink-button = .title = Dissen +pdfjs-editor-color-picker-ink-input = + .title = Cambie colôr dal dissen pdfjs-editor-ink-button-label = Dissen pdfjs-editor-stamp-button = .title = Zonte o modifiche imagjins @@ -316,6 +304,14 @@ pdfjs-highlight-floating-button1 = .title = Evidenzie .aria-label = Evidenzie pdfjs-highlight-floating-button-label = Evidenzie +pdfjs-comment-floating-button = + .title = Comente + .aria-label = Comente +pdfjs-comment-floating-button-label = Comente +pdfjs-editor-comment-button = + .title = Comente + .aria-label = Comente +pdfjs-editor-comment-button-label = Comente pdfjs-editor-signature-button = .title = Zonte firme pdfjs-editor-signature-button-label = Zonte firme @@ -378,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Editôr di test .default-content = Scomence a scrivi… -pdfjs-free-text = - .aria-label = Editôr di test -pdfjs-free-text-default-content = Scomence a scrivi… -pdfjs-ink = - .aria-label = Editôr dissens -pdfjs-ink-canvas = - .aria-label = Imagjin creade dal utent +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Coment + *[other] Coments + } +pdfjs-editor-comments-sidebar-close-button = + .title = Siere la sbare laterâl + .aria-label = Siere la sbare laterâl +pdfjs-editor-comments-sidebar-close-button-label = Siere la sbare laterâl +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Âstu cjatât alc di interessant? Evidenzilu e lasse un coment. +pdfjs-editor-comments-sidebar-no-comments-link = Plui informazions ## Alt-text dialog pdfjs-editor-alt-text-button-label = Test alternatîf pdfjs-editor-alt-text-edit-button = .aria-label = Modifiche test alternatîf -pdfjs-editor-alt-text-edit-button-label = Modifiche test alternatîf pdfjs-editor-alt-text-dialog-label = Sielç une opzion pdfjs-editor-alt-text-dialog-description = Il test alternatîf (“alt text”) al jude cuant che lis personis no puedin viodi la imagjin o cuant che la imagjine no ven cjariade. pdfjs-editor-alt-text-add-description-label = Zonte une descrizion @@ -411,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Cjanton in alt a çampe — ridimensione -pdfjs-editor-resizer-label-top-middle = Bande superiôr tal mieç — ridimensione -pdfjs-editor-resizer-label-top-right = Cjanton in alt a diestre — ridimensione -pdfjs-editor-resizer-label-middle-right = Bande diestre tal mieç — ridimensione -pdfjs-editor-resizer-label-bottom-right = Cjanton in bas a diestre — ridimensione -pdfjs-editor-resizer-label-bottom-middle = Bande inferiôr tal mieç — ridimensione -pdfjs-editor-resizer-label-bottom-left = Cjanton in bas a çampe — ridimensione -pdfjs-editor-resizer-label-middle-left = Bande di çampe tal mieç — ridimensione pdfjs-editor-resizer-top-left = .aria-label = Cjanton in alt a çampe — ridimensione pdfjs-editor-resizer-top-middle = @@ -524,6 +519,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostre l'editôr dal t pdfjs-editor-alt-text-settings-show-dialog-description = Ti jude a sigurâti che dutis lis tôs imagjins a vedin il test alternatîf. pdfjs-editor-alt-text-settings-close-button = Siere +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Evidenziazion zontade +pdfjs-editor-freetext-added-alert = Test zontât +pdfjs-editor-ink-added-alert = Dissen zontât +pdfjs-editor-stamp-added-alert = Imagjin zontade +pdfjs-editor-signature-added-alert = Firme zontade + ## "Annotations removed" bar pdfjs-editor-undo-bar-message-highlight = Evidenziazion gjavade @@ -592,6 +595,8 @@ pdfjs-editor-add-signature-save-checkbox = Salve firme pdfjs-editor-add-signature-save-warning-message = Tu sês rivât/rivade al limit di 5 firmis salvadis. Gjave une par salvânt une altre. pdfjs-editor-add-signature-image-upload-error-title = Impussibil cjariâ la imagjin pdfjs-editor-add-signature-image-upload-error-description = Controle la conession di rêt o prove cuntune altre imagjin. +pdfjs-editor-add-signature-image-no-data-error-title = Impussibil convertî cheste imagjin intune firme +pdfjs-editor-add-signature-image-no-data-error-description = Prove a cjariâ une altre imagjin. pdfjs-editor-add-signature-error-close-button = Siere ## Dialog buttons @@ -600,6 +605,34 @@ pdfjs-editor-add-signature-cancel-button = Anule pdfjs-editor-add-signature-add-button = Zonte pdfjs-editor-edit-signature-update-button = Inzorne +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Modifiche coment +pdfjs-editor-edit-comment-popup-button = + .title = Modifiche coment +pdfjs-editor-delete-comment-popup-button-label = Gjave coment +pdfjs-editor-delete-comment-popup-button = + .title = Gjave coment +pdfjs-show-comment-button = + .title = Mostre coment + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Modifiche coment +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Inzorne +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Zonte coment +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Zonte +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Scomence a scrivi… +pdfjs-editor-edit-comment-dialog-cancel-button = Anule + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Zonte coment + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/fy-NL/viewer.ftl b/l10n/fy-NL/viewer.ftl index 5e9b16ca19001..4fd0c5fea5a5e 100644 --- a/l10n/fy-NL/viewer.ftl +++ b/l10n/fy-NL/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Auteur: pdfjs-document-properties-subject = Underwerp: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Bewurkingsdatum: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Makker: pdfjs-document-properties-producer = PDF-makker: pdfjs-document-properties-version = PDF-ferzje: @@ -193,8 +181,8 @@ pdfjs-layers-button = .title = Lagen toane (dûbelklik om alle lagen nei de standertsteat werom te setten) pdfjs-layers-button-label = Lagen pdfjs-thumbs-button = - .title = Foarbylden toane -pdfjs-thumbs-button-label = Foarbylden + .title = Miniatueren toane +pdfjs-thumbs-button-label = Miniatueren pdfjs-current-outline-item-button = .title = Aktueel item yn ynhâldsopjefte sykje pdfjs-current-outline-item-button-label = Aktueel item yn ynhâldsopjefte @@ -212,7 +200,7 @@ pdfjs-thumb-page-title = # Variables: # $page (Number) - the page number pdfjs-thumb-page-canvas = - .aria-label = Foarbyld fan side { $page } + .aria-label = Miniatuer fan side { $page } ## Find panel button title and messages @@ -275,10 +263,6 @@ pdfjs-rendering-error = Der is in flater bard by it renderjen fan de side. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Opmerking .aria-label = Opmerking pdfjs-comment-floating-button-label = Opmerking +pdfjs-editor-comment-button = + .title = Opmerking + .aria-label = Opmerking +pdfjs-editor-comment-button-label = Opmerking pdfjs-editor-signature-button = .title = Hantekening tafoegje pdfjs-editor-signature-button-label = Hantekening tafoegje @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Tekstbewurker .default-content = Start mei typen… -pdfjs-free-text = - .aria-label = Tekstbewurker -pdfjs-free-text-default-content = Begjin mei typen… -pdfjs-ink = - .aria-label = Tekeningbewurker -pdfjs-ink-canvas = - .aria-label = Troch brûker makke ôfbylding +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Opmerking + *[other] Opmerkingen + } +pdfjs-editor-comments-sidebar-close-button = + .title = De sydbalke slute + .aria-label = De sydbalke slute +pdfjs-editor-comments-sidebar-close-button-label = De sydbalke slute +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Sjogge jo wat it neamen wurdich? Markearje it en lit in opmerking efter. +pdfjs-editor-comments-sidebar-no-comments-link = Mear ynfo ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternative tekst pdfjs-editor-alt-text-edit-button = .aria-label = Alternative tekst bewurkje -pdfjs-editor-alt-text-edit-button-label = Alternative tekst bewurkje pdfjs-editor-alt-text-dialog-label = Kies in opsje pdfjs-editor-alt-text-dialog-description = Alternative tekst helpt wannear’t minsken de ôfbylding net sjen kinne of wannear’t dizze net laden wurdt. pdfjs-editor-alt-text-add-description-label = Foegje in beskriuwing ta @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Linkerboppehoek – formaat wizigje -pdfjs-editor-resizer-label-top-middle = Midden boppe – formaat wizigje -pdfjs-editor-resizer-label-top-right = Rjochterboppehoek – formaat wizigje -pdfjs-editor-resizer-label-middle-right = Midden rjochts – formaat wizigje -pdfjs-editor-resizer-label-bottom-right = Rjochterûnderhoek – formaat wizigje -pdfjs-editor-resizer-label-bottom-middle = Midden ûnder – formaat wizigje -pdfjs-editor-resizer-label-bottom-left = Linkerûnderhoek – formaat wizigje -pdfjs-editor-resizer-label-middle-left = Links midden – formaat wizigje pdfjs-editor-resizer-top-left = .aria-label = Linkerboppehoek – formaat wizigje pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Annulearje pdfjs-editor-add-signature-add-button = Tafoegje pdfjs-editor-edit-signature-update-button = Bywurkje +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Opmerking bewurkje +pdfjs-editor-edit-comment-popup-button = + .title = Opmerking bewurkje +pdfjs-editor-delete-comment-popup-button-label = Opmerking fuortsmite +pdfjs-editor-delete-comment-popup-button = + .title = Opmerking fuortsmite +pdfjs-show-comment-button = + .title = Opmerking toane + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Aksjes -pdfjs-editor-edit-comment-actions-button = - .title = Aksjes -pdfjs-editor-edit-comment-close-button-label = Slute -pdfjs-editor-edit-comment-close-button = - .title = Slute -pdfjs-editor-edit-comment-actions-edit-button-label = Bewurkje -pdfjs-editor-edit-comment-actions-delete-button-label = Fuortsmite -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Fier jo opmerking yn -pdfjs-editor-edit-comment-manager-cancel-button = Annulearje -pdfjs-editor-edit-comment-manager-save-button = Bewarje +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Opmerking bewurkje +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Bywurkje +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Opmerking tafoegje +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Tafoegje +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Begjin mei typen… +pdfjs-editor-edit-comment-dialog-cancel-button = Annulearje ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Opmerking bewurkje +pdfjs-editor-add-comment-button = + .title = Opmerking tafoegje ## Main menu for adding/removing signatures diff --git a/l10n/ga-IE/viewer.ftl b/l10n/ga-IE/viewer.ftl index 8a438522114ea..680d5bf67e6b2 100644 --- a/l10n/ga-IE/viewer.ftl +++ b/l10n/ga-IE/viewer.ftl @@ -71,24 +71,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Airíonna na Cáipéise… pdfjs-document-properties-file-name = Ainm an chomhaid: pdfjs-document-properties-file-size = Méid an chomhaid: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } beart) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } beart) pdfjs-document-properties-title = Teideal: pdfjs-document-properties-author = Údar: pdfjs-document-properties-subject = Ábhar: pdfjs-document-properties-keywords = Eochairfhocail: pdfjs-document-properties-creation-date = Dáta Cruthaithe: pdfjs-document-properties-modification-date = Dáta Athraithe: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Cruthaitheoir: pdfjs-document-properties-producer = Cruthaitheoir an PDF: pdfjs-document-properties-version = Leagan PDF: diff --git a/l10n/gd/viewer.ftl b/l10n/gd/viewer.ftl index 6b94818e4bb34..a15bc9eea9c26 100644 --- a/l10n/gd/viewer.ftl +++ b/l10n/gd/viewer.ftl @@ -98,24 +98,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Roghainnean na sgrìobhainne… pdfjs-document-properties-file-name = Ainm an fhaidhle: pdfjs-document-properties-file-size = Meud an fhaidhle: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Tiotal: pdfjs-document-properties-author = Ùghdar: pdfjs-document-properties-subject = Cuspair: pdfjs-document-properties-keywords = Faclan-luirg: pdfjs-document-properties-creation-date = Latha a chruthachaidh: pdfjs-document-properties-modification-date = Latha atharrachaidh: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Cruthadair: pdfjs-document-properties-producer = Saothraiche a' PDF: pdfjs-document-properties-version = Tionndadh a' PDF: @@ -243,10 +231,6 @@ pdfjs-rendering-error = Thachair mearachd rè reandaradh na duilleige. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -280,10 +264,3 @@ pdfjs-editor-free-text-size-input = Meud pdfjs-editor-ink-color-input = Dath pdfjs-editor-ink-thickness-input = Tighead pdfjs-editor-ink-opacity-input = Trìd-dhoilleireachd -pdfjs-free-text = - .aria-label = An deasaiche teacsa -pdfjs-free-text-default-content = Tòisich air sgrìobhadh… -pdfjs-ink = - .aria-label = An deasaiche tharraingean -pdfjs-ink-canvas = - .aria-label = Dealbh a chruthaich cleachdaiche diff --git a/l10n/gl/viewer.ftl b/l10n/gl/viewer.ftl index 9eb07cb6a4ef9..b77dda354ba8c 100644 --- a/l10n/gl/viewer.ftl +++ b/l10n/gl/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Asunto: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Data de modificación: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creado por: pdfjs-document-properties-producer = Xenerador do PDF: pdfjs-document-properties-version = Versión de PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Produciuse un erro ao representar a páxina. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -378,20 +362,12 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Editor de texto .default-content = Empeza a escribir... -pdfjs-free-text = - .aria-label = Editor de texto -pdfjs-free-text-default-content = Comezar a teclear… -pdfjs-ink = - .aria-label = Editor de debuxos -pdfjs-ink-canvas = - .aria-label = Imaxe creada por unha usuaria ## Alt-text dialog pdfjs-editor-alt-text-button-label = Texto alternativo pdfjs-editor-alt-text-edit-button = .aria-label = Editar o texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar o texto alternativo pdfjs-editor-alt-text-dialog-label = Escoller unha opción pdfjs-editor-alt-text-dialog-description = O texto alternativo (texto alt) axuda cando as persoas non poden ver a imaxe ou cando non se carga. pdfjs-editor-alt-text-add-description-label = Engadir unha descrición @@ -411,14 +387,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Esquina superior esquerda: cambia o tamaño -pdfjs-editor-resizer-label-top-middle = Medio superior: cambia o tamaño -pdfjs-editor-resizer-label-top-right = Esquina superior dereita: cambia o tamaño -pdfjs-editor-resizer-label-middle-right = Medio dereito: cambia o tamaño -pdfjs-editor-resizer-label-bottom-right = Esquina inferior dereita: cambia o tamaño -pdfjs-editor-resizer-label-bottom-middle = Abaixo medio: cambia o tamaño -pdfjs-editor-resizer-label-bottom-left = Esquina inferior esquerda: cambia o tamaño -pdfjs-editor-resizer-label-middle-left = Medio esquerdo: cambia o tamaño pdfjs-editor-resizer-top-left = .aria-label = Esquina superior esquerda: cambia o tamaño pdfjs-editor-resizer-top-middle = diff --git a/l10n/gn/viewer.ftl b/l10n/gn/viewer.ftl index efb44be83b424..06960ebeb2f75 100644 --- a/l10n/gn/viewer.ftl +++ b/l10n/gn/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Teratee: pdfjs-document-properties-author = Apohára: pdfjs-document-properties-subject = Mba’egua: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Iñambue hague arange: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Apo’ypyha: pdfjs-document-properties-producer = PDF mbosako’iha: pdfjs-document-properties-version = PDF mbojuehegua: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Oiko jejavy ehechaukasévo kuatiarogue. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Je’erei .aria-label = Je’erei pdfjs-comment-floating-button-label = Je’erei +pdfjs-editor-comment-button = + .title = Je’erei + .aria-label = Je’erei +pdfjs-editor-comment-button-label = Je’erei pdfjs-editor-signature-button = .title = Embojuaju teraguapy pdfjs-editor-signature-button-label = Embojuaju teraguapy @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Moñe’ẽrã moheñoiha .default-content = Eñepyrũ ehai… -pdfjs-free-text = - .aria-label = Moñe’ẽrã moheñoiha -pdfjs-free-text-default-content = Ehai ñepyrũ… -pdfjs-ink = - .aria-label = Ta’ãnga moheñoiha -pdfjs-ink-canvas = - .aria-label = Ta’ãnga omoheñóiva poruhára +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Je’erei + *[other] Je’ereieta + } +pdfjs-editor-comments-sidebar-close-button = + .title = Emboty ta'ãngarupa yke + .aria-label = Emboty ta'ãngarupa yke +pdfjs-editor-comments-sidebar-close-button-label = Emboty ta'ãngarupa yke +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ¿Ehechápa peteĩ mbaʼe iporãva? Emomba’e ha eheja jehaipy. +pdfjs-editor-comments-sidebar-no-comments-link = Kuaave ## Alt-text dialog pdfjs-editor-alt-text-button-label = Moñe’ẽrã mokõiháva pdfjs-editor-alt-text-edit-button = .aria-label = Embojuruja moñe’ẽrã mokõiháva -pdfjs-editor-alt-text-edit-button-label = Embojuruja moñe’ẽrã mokõiháva pdfjs-editor-alt-text-dialog-label = Eiporavo poravorã pdfjs-editor-alt-text-dialog-description = Moñe’ẽrã ykepegua (moñe’ẽrã ykepegua) nepytyvõ nderehecháiramo ta’ãnga térã nahenyhẽiramo. pdfjs-editor-alt-text-add-description-label = Embojuaju ñemoha’ãnga @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Yvate asu gotyo — emoambue tuichakue -pdfjs-editor-resizer-label-top-middle = Yvate mbytépe — emoambue tuichakue -pdfjs-editor-resizer-label-top-right = Yvate akatúape — emoambue tuichakue -pdfjs-editor-resizer-label-middle-right = Mbyte akatúape — emoambue tuichakue -pdfjs-editor-resizer-label-bottom-right = Yvy gotyo akatúape — emoambue tuichakue -pdfjs-editor-resizer-label-bottom-middle = Yvy gotyo mbytépe — emoambue tuichakue -pdfjs-editor-resizer-label-bottom-left = Iguýpe asu gotyo — emoambue tuichakue -pdfjs-editor-resizer-label-middle-left = Mbyte asu gotyo — emoambue tuichakue pdfjs-editor-resizer-top-left = .aria-label = Yvate asu gotyo — emoambue tuichakue pdfjs-editor-resizer-top-middle = @@ -617,25 +604,33 @@ pdfjs-editor-add-signature-cancel-button = Heja pdfjs-editor-add-signature-add-button = Mbojuaju pdfjs-editor-edit-signature-update-button = Mbohekopyahu +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Je’erei mbosako’i +pdfjs-editor-edit-comment-popup-button = + .title = Je’erei mbosako’i +pdfjs-editor-delete-comment-popup-button-label = Je’erei mboguete +pdfjs-editor-delete-comment-popup-button = + .title = Je’erei mboguete +pdfjs-show-comment-button = + .title = Ehechauka je’epy + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Ñemongu’e -pdfjs-editor-edit-comment-actions-button = - .title = Ñemongu’e -pdfjs-editor-edit-comment-close-button-label = Mboty -pdfjs-editor-edit-comment-close-button = - .title = Mboty -pdfjs-editor-edit-comment-actions-edit-button-label = Mbosako’i -pdfjs-editor-edit-comment-actions-delete-button-label = Mboguete -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Ehai peteĩ je’erei -pdfjs-editor-edit-comment-manager-cancel-button = Heja -pdfjs-editor-edit-comment-manager-save-button = Ñongatu +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Je’erei mbosako’i +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Mbohekopyahu +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Je’erei mbojuaju +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Mbojuaju +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Ehai ñepyrũ… +pdfjs-editor-edit-comment-dialog-cancel-button = Eheja ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Je’erei mbosako’i +pdfjs-editor-add-comment-button = + .title = Je’erei mbojuaju ## Main menu for adding/removing signatures diff --git a/l10n/gu-IN/viewer.ftl b/l10n/gu-IN/viewer.ftl index 9d0c11847fcc6..5ad3db15629f2 100644 --- a/l10n/gu-IN/viewer.ftl +++ b/l10n/gu-IN/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = દસ્તાવેજ ગુણધર્મો… pdfjs-document-properties-file-name = ફાઇલ નામ: pdfjs-document-properties-file-size = ફાઇલ માપ: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } બાઇટ) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } બાઇટ) pdfjs-document-properties-title = શીર્ષક: pdfjs-document-properties-author = લેખક: pdfjs-document-properties-subject = વિષય: pdfjs-document-properties-keywords = કિવર્ડ: pdfjs-document-properties-creation-date = નિર્માણ તારીખ: pdfjs-document-properties-modification-date = ફેરફાર તારીખ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = નિર્માતા: pdfjs-document-properties-producer = PDF નિર્માતા: pdfjs-document-properties-version = PDF આવૃત્તિ: diff --git a/l10n/he/viewer.ftl b/l10n/he/viewer.ftl index e641856c94ee5..44c620a931355 100644 --- a/l10n/he/viewer.ftl +++ b/l10n/he/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } מ״ב ({ $b } בתים) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } ק״ב ({ $size_b } בתים) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } מ״ב ({ $size_b } בתים) pdfjs-document-properties-title = כותרת: pdfjs-document-properties-author = מחבר: pdfjs-document-properties-subject = נושא: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = תאריך שינוי: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = יוצר: pdfjs-document-properties-producer = יצרן PDF: pdfjs-document-properties-version = גרסת PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = אירעה שגיאה בעת עיבוד הדף. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = הערה .aria-label = הערה pdfjs-comment-floating-button-label = הערה +pdfjs-editor-comment-button = + .title = הערה + .aria-label = הערה +pdfjs-editor-comment-button-label = הערה pdfjs-editor-signature-button = .title = הוספת חתימה pdfjs-editor-signature-button-label = הוספת חתימה @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = עורך טקסט .default-content = נא להתחיל להקליד… -pdfjs-free-text = - .aria-label = עורך טקסט -pdfjs-free-text-default-content = להתחיל להקליד… -pdfjs-ink = - .aria-label = עורך ציור -pdfjs-ink-canvas = - .aria-label = תמונה שנוצרה על־ידי משתמש +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] הערה + *[other] הערות + } +pdfjs-editor-comments-sidebar-close-button = + .title = סגירת סרגל הצד + .aria-label = סגירת סרגל הצד +pdfjs-editor-comments-sidebar-close-button-label = סגירת סרגל הצד +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ראית משהו ראוי לציון? ניתן לסמן אותו ולהשאיר הערה. +pdfjs-editor-comments-sidebar-no-comments-link = מידע נוסף ## Alt-text dialog pdfjs-editor-alt-text-button-label = טקסט חלופי pdfjs-editor-alt-text-edit-button = .aria-label = עריכת טקסט חלופי -pdfjs-editor-alt-text-edit-button-label = עריכת טקסט חלופי pdfjs-editor-alt-text-dialog-label = בחירת אפשרות pdfjs-editor-alt-text-dialog-description = טקסט חלופי עוזר כשאנשים לא יכולים לראות את התמונה או כשהיא לא נטענת. pdfjs-editor-alt-text-add-description-label = הוספת תיאור @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = פינה שמאלית עליונה - שינוי גודל -pdfjs-editor-resizer-label-top-middle = למעלה באמצע - שינוי גודל -pdfjs-editor-resizer-label-top-right = פינה ימנית עליונה - שינוי גודל -pdfjs-editor-resizer-label-middle-right = ימינה באמצע - שינוי גודל -pdfjs-editor-resizer-label-bottom-right = פינה ימנית תחתונה - שינוי גודל -pdfjs-editor-resizer-label-bottom-middle = למטה באמצע - שינוי גודל -pdfjs-editor-resizer-label-bottom-left = פינה שמאלית תחתונה - שינוי גודל -pdfjs-editor-resizer-label-middle-left = שמאלה באמצע - שינוי גודל pdfjs-editor-resizer-top-left = .aria-label = פינה שמאלית עליונה - שינוי גודל pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = ביטול pdfjs-editor-add-signature-add-button = הוספה pdfjs-editor-edit-signature-update-button = עדכון +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = עריכת הערה +pdfjs-editor-edit-comment-popup-button = + .title = עריכת הערה +pdfjs-editor-delete-comment-popup-button-label = הסרת הערה +pdfjs-editor-delete-comment-popup-button = + .title = הסרת הערה +pdfjs-show-comment-button = + .title = הצגת הערה + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = פעולות -pdfjs-editor-edit-comment-actions-button = - .title = פעולות -pdfjs-editor-edit-comment-close-button-label = סגירה -pdfjs-editor-edit-comment-close-button = - .title = סגירה -pdfjs-editor-edit-comment-actions-edit-button-label = עריכה -pdfjs-editor-edit-comment-actions-delete-button-label = מחיקה -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = נא להכניס את ההערה שלך -pdfjs-editor-edit-comment-manager-cancel-button = ביטול -pdfjs-editor-edit-comment-manager-save-button = שמירה +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = עריכת הערה +pdfjs-editor-edit-comment-dialog-save-button-when-editing = עדכון +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = הוספת הערה +pdfjs-editor-edit-comment-dialog-save-button-when-adding = הוספה +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = להתחיל להקליד… +pdfjs-editor-edit-comment-dialog-cancel-button = ביטול ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = עריכת הערה +pdfjs-editor-add-comment-button = + .title = הוספת הערה ## Main menu for adding/removing signatures diff --git a/l10n/hi-IN/viewer.ftl b/l10n/hi-IN/viewer.ftl index d5ac31de69596..91459ebf2d4db 100644 --- a/l10n/hi-IN/viewer.ftl +++ b/l10n/hi-IN/viewer.ftl @@ -83,24 +83,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = दस्तावेज़ विशेषता... pdfjs-document-properties-file-name = फ़ाइल नाम: pdfjs-document-properties-file-size = फाइल आकारः -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = शीर्षक: pdfjs-document-properties-author = लेखकः pdfjs-document-properties-subject = विषय: pdfjs-document-properties-keywords = कुंजी-शब्द: pdfjs-document-properties-creation-date = निर्माण दिनांक: pdfjs-document-properties-modification-date = संशोधन दिनांक: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = निर्माता: pdfjs-document-properties-producer = PDF उत्पादक: pdfjs-document-properties-version = PDF संस्करण: @@ -211,10 +199,6 @@ pdfjs-rendering-error = पृष्ठ रेंडरिंग के दौ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/hr/viewer.ftl b/l10n/hr/viewer.ftl index 415e0e03b4bf2..886317652c8fc 100644 --- a/l10n/hr/viewer.ftl +++ b/l10n/hr/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtova) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtova) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtova) pdfjs-document-properties-title = Naslov: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Predmet: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Datum promjene: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Stvaratelj: pdfjs-document-properties-producer = PDF stvaratelj: pdfjs-document-properties-version = PDF verzija: @@ -277,10 +265,6 @@ pdfjs-rendering-error = Došlo je do greške prilikom iscrtavanja stranice. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -304,9 +288,13 @@ pdfjs-web-fonts-disabled = Web fontovi su deaktivirani: nije moguće koristiti u pdfjs-editor-free-text-button = .title = Tekst +pdfjs-editor-color-picker-free-text-input = + .title = Promijeni boju teksta pdfjs-editor-free-text-button-label = Tekst pdfjs-editor-ink-button = .title = Crtanje +pdfjs-editor-color-picker-ink-input = + .title = Promijeni boju crteža pdfjs-editor-ink-button-label = Crtanje pdfjs-editor-stamp-button = .title = Dodaj ili uredi slike @@ -318,6 +306,14 @@ pdfjs-highlight-floating-button1 = .title = Istakni .aria-label = Istakni pdfjs-highlight-floating-button-label = Istakni +pdfjs-comment-floating-button = + .title = Komentiraj + .aria-label = Komentiraj +pdfjs-comment-floating-button-label = Komentiraj +pdfjs-editor-comment-button = + .title = Komentar + .aria-label = Komentar +pdfjs-editor-comment-button-label = Komentar pdfjs-editor-signature-button = .title = Dodaj potpis pdfjs-editor-signature-button-label = Dodaj potpis @@ -380,20 +376,28 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Uređivač teksta .default-content = Počni tipkati … -pdfjs-free-text = - .aria-label = Uređivač teksta -pdfjs-free-text-default-content = Počni tipkati … -pdfjs-ink = - .aria-label = Uređivač crteža -pdfjs-ink-canvas = - .aria-label = Slika koju je izradio korisnik +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Komentar + [few] Komentara + *[other] Komentara + } +pdfjs-editor-comments-sidebar-close-button = + .title = Zatvori bočnu traku + .aria-label = Zatvori bočnu traku +pdfjs-editor-comments-sidebar-close-button-label = Zatvori bočnu traku +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vidiš nešto vrijedno pažnje? Istakni to i ostavi komentar. +pdfjs-editor-comments-sidebar-no-comments-link = Saznaj više ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternativni tekst pdfjs-editor-alt-text-edit-button = .aria-label = Uredi alternativni tekst -pdfjs-editor-alt-text-edit-button-label = Uredi alternativni tekst pdfjs-editor-alt-text-dialog-label = Odaberi jednu opciju pdfjs-editor-alt-text-dialog-description = Alternativni tekst pomaže slijepim osobama ili kada se slika ne učita. pdfjs-editor-alt-text-add-description-label = Dodaj opis @@ -413,14 +417,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Gornji lijevi kut – promijeni veličinu -pdfjs-editor-resizer-label-top-middle = Sredina gore – promijeni veličinu -pdfjs-editor-resizer-label-top-right = Gornji desni kut – promijeni veličinu -pdfjs-editor-resizer-label-middle-right = Sredina desno – promijeni veličinu -pdfjs-editor-resizer-label-bottom-right = Donji desni kut – promijeni veličinu -pdfjs-editor-resizer-label-bottom-middle = Sredina dolje – promjeni veličinu -pdfjs-editor-resizer-label-bottom-left = Donji lijevi kut – promijeni veličinu -pdfjs-editor-resizer-label-middle-left = Sredina lijevo – promijeni veličinu pdfjs-editor-resizer-top-left = .aria-label = Gornji lijevi kut – promijeni veličinu pdfjs-editor-resizer-top-middle = @@ -526,6 +522,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Prikaži uređivač al pdfjs-editor-alt-text-settings-show-dialog-description = Pomaže osigurati da sve tvoje slike imaju alternativni tekst. pdfjs-editor-alt-text-settings-close-button = Zatvori +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Isticanje je dodano +pdfjs-editor-freetext-added-alert = Tekst je dodan +pdfjs-editor-ink-added-alert = Crtež je dodan +pdfjs-editor-stamp-added-alert = Slika je dodana +pdfjs-editor-signature-added-alert = Potpis je dodan + ## "Annotations removed" bar pdfjs-editor-undo-bar-message-highlight = Isticanje uklonjeno @@ -595,6 +599,8 @@ pdfjs-editor-add-signature-save-checkbox = Spremi potpis pdfjs-editor-add-signature-save-warning-message = Dosegnuto je ograničenje od 5 spremljenih potpisa. Za spremanje novih ukloni jedan potpis. pdfjs-editor-add-signature-image-upload-error-title = Nije moguće prenijeti sliku pdfjs-editor-add-signature-image-upload-error-description = Provjeri mrežnu vezu ili pokušaj s jednom drugom slikom. +pdfjs-editor-add-signature-image-no-data-error-title = Ova se slika ne može pretvoriti u potpis +pdfjs-editor-add-signature-image-no-data-error-description = Probaj prenijeti jednu drugu sliku. pdfjs-editor-add-signature-error-close-button = Zatvori ## Dialog buttons @@ -603,6 +609,34 @@ pdfjs-editor-add-signature-cancel-button = Odustani pdfjs-editor-add-signature-add-button = Dodaj pdfjs-editor-edit-signature-update-button = Aktualiziraj +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Uredi komentar +pdfjs-editor-edit-comment-popup-button = + .title = Uredi komentar +pdfjs-editor-delete-comment-popup-button-label = Ukloni komentar +pdfjs-editor-delete-comment-popup-button = + .title = Ukloni komentar +pdfjs-show-comment-button = + .title = Prikaži komentar + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Uredi komentar +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualiziraj +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Dodaj komentar +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Dodaj +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Počni tipkati … +pdfjs-editor-edit-comment-dialog-cancel-button = Odustani + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Dodaj komentar + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/hsb/viewer.ftl b/l10n/hsb/viewer.ftl index abe346634889b..9281401a88686 100644 --- a/l10n/hsb/viewer.ftl +++ b/l10n/hsb/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtow) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtow) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtow) pdfjs-document-properties-title = Titul: pdfjs-document-properties-author = Awtor: pdfjs-document-properties-subject = Předmjet: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Datum změny: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Awtor: pdfjs-document-properties-producer = PDF-zhotowjer: pdfjs-document-properties-version = PDF-wersija: @@ -279,10 +267,6 @@ pdfjs-rendering-error = Při zwobraznjenju strony je zmylk wustupił. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -328,6 +312,10 @@ pdfjs-comment-floating-button = .title = Komentować .aria-label = Komentować pdfjs-comment-floating-button-label = Komentować +pdfjs-editor-comment-button = + .title = Komentować + .aria-label = Komentować +pdfjs-editor-comment-button-label = Komentować pdfjs-editor-signature-button = .title = Signaturu přidać pdfjs-editor-signature-button-label = Signaturu přidać @@ -390,20 +378,29 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Tekstowy editor .default-content = Započńće pisać … -pdfjs-free-text = - .aria-label = Tekstowy editor -pdfjs-free-text-default-content = Započńće pisać… -pdfjs-ink = - .aria-label = Rysowanski editor -pdfjs-ink-canvas = - .aria-label = Wobraz wutworjeny wot wužiwarja +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] { $count } komentar + [two] { $count } komentaraj + [few] { $count } komentary + *[other] { $count } komentarow + } +pdfjs-editor-comments-sidebar-close-button = + .title = Bóčnicu začinić + .aria-label = Bóčnicu začinić +pdfjs-editor-comments-sidebar-close-button-label = Bóčnicu začinić +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Widźiće něšto přispomnjenja hódneho? Wuzběhńće to a zawostajće komentar. +pdfjs-editor-comments-sidebar-no-comments-link = Dalše informacije ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternatiwny tekst pdfjs-editor-alt-text-edit-button = .aria-label = Alternatiwny tekst wobdźěłać -pdfjs-editor-alt-text-edit-button-label = Alternatiwny tekst wobdźěłać pdfjs-editor-alt-text-dialog-label = Nastajenje wubrać pdfjs-editor-alt-text-dialog-description = Alternatiwny tekst pomha, hdyž ludźo njemóža wobraz widźeć abo hdyž so wobraz njezačita. pdfjs-editor-alt-text-add-description-label = Wopisanje přidać @@ -423,14 +420,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Horjeka nalěwo – wulkosć změnić -pdfjs-editor-resizer-label-top-middle = Horjeka wosrjedź – wulkosć změnić -pdfjs-editor-resizer-label-top-right = Horjeka naprawo – wulkosć změnić -pdfjs-editor-resizer-label-middle-right = Wosrjedź naprawo – wulkosć změnić -pdfjs-editor-resizer-label-bottom-right = Deleka naprawo – wulkosć změnić -pdfjs-editor-resizer-label-bottom-middle = Deleka wosrjedź – wulkosć změnić -pdfjs-editor-resizer-label-bottom-left = Deleka nalěwo – wulkosć změnić -pdfjs-editor-resizer-label-middle-left = Wosrjedź nalěwo – wulkosć změnić pdfjs-editor-resizer-top-left = .aria-label = Horjeka nalěwo – wulkosć změnić pdfjs-editor-resizer-top-middle = @@ -624,25 +613,33 @@ pdfjs-editor-add-signature-cancel-button = Přetorhnyć pdfjs-editor-add-signature-add-button = Přidać pdfjs-editor-edit-signature-update-button = Aktualizować +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Komentar wobdźěłać +pdfjs-editor-edit-comment-popup-button = + .title = Komentar wobdźěłać +pdfjs-editor-delete-comment-popup-button-label = Komentar wotstronić +pdfjs-editor-delete-comment-popup-button = + .title = Komentar wotstronić +pdfjs-show-comment-button = + .title = Komentar pokazać + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Akcije -pdfjs-editor-edit-comment-actions-button = - .title = Akcije -pdfjs-editor-edit-comment-close-button-label = Začinić -pdfjs-editor-edit-comment-close-button = - .title = Začinić -pdfjs-editor-edit-comment-actions-edit-button-label = Wobdźěłać -pdfjs-editor-edit-comment-actions-delete-button-label = Zhašeć -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Zapodajće swój komentar -pdfjs-editor-edit-comment-manager-cancel-button = Přetorhnyć -pdfjs-editor-edit-comment-manager-save-button = Składować +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Komentar wobdźěłać +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizować +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Komentar přidać +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Přidać +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Započńće pisać… +pdfjs-editor-edit-comment-dialog-cancel-button = Přetorhnyć ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Komentar wobdźěłać +pdfjs-editor-add-comment-button = + .title = Komentar přidać ## Main menu for adding/removing signatures diff --git a/l10n/hu/viewer.ftl b/l10n/hu/viewer.ftl index 68b3993e8e0a1..dee471e38830a 100644 --- a/l10n/hu/viewer.ftl +++ b/l10n/hu/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bájt) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bájt) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bájt) pdfjs-document-properties-title = Cím: pdfjs-document-properties-author = Szerző: pdfjs-document-properties-subject = Tárgy: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Módosítás dátuma: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Létrehozta: pdfjs-document-properties-producer = PDF előállító: pdfjs-document-properties-version = PDF verzió: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Hiba történt az oldal feldolgozása közben. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Megjegyzés .aria-label = Megjegyzés pdfjs-comment-floating-button-label = Megjegyzés +pdfjs-editor-comment-button = + .title = Megjegyzés + .aria-label = Megjegyzés +pdfjs-editor-comment-button-label = Megjegyzés pdfjs-editor-signature-button = .title = Aláírás hozzáadása pdfjs-editor-signature-button-label = Aláírás hozzáadása @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Szövegszerkesztő .default-content = Kezdjen gépelni… -pdfjs-free-text = - .aria-label = Szövegszerkesztő -pdfjs-free-text-default-content = Kezdjen el gépelni… -pdfjs-ink = - .aria-label = Rajzszerkesztő -pdfjs-ink-canvas = - .aria-label = Felhasználó által készített kép +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Megjegyzés + *[other] Megjegyzések + } +pdfjs-editor-comments-sidebar-close-button = + .title = Oldalsáv bezárása + .aria-label = Oldalsáv bezárása +pdfjs-editor-comments-sidebar-close-button-label = Oldalsáv bezárása +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Lát valami figyelemre méltót? Jelölje ki és írjon megjegyzést. +pdfjs-editor-comments-sidebar-no-comments-link = További tudnivalók ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternatív szöveg pdfjs-editor-alt-text-edit-button = .aria-label = Alternatív szöveg szerkesztése -pdfjs-editor-alt-text-edit-button-label = Alternatív szöveg szerkesztése pdfjs-editor-alt-text-dialog-label = Válasszon egy lehetőséget pdfjs-editor-alt-text-dialog-description = Az alternatív szöveg segít, ha az emberek nem látják a képet, vagy ha az nem töltődik be. pdfjs-editor-alt-text-add-description-label = Leírás hozzáadása @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Bal felső sarok – átméretezés -pdfjs-editor-resizer-label-top-middle = Felül középen – átméretezés -pdfjs-editor-resizer-label-top-right = Jobb felső sarok – átméretezés -pdfjs-editor-resizer-label-middle-right = Jobbra középen – átméretezés -pdfjs-editor-resizer-label-bottom-right = Jobb alsó sarok – átméretezés -pdfjs-editor-resizer-label-bottom-middle = Alul középen – átméretezés -pdfjs-editor-resizer-label-bottom-left = Bal alsó sarok – átméretezés -pdfjs-editor-resizer-label-middle-left = Balra középen – átméretezés pdfjs-editor-resizer-top-left = .aria-label = Bal felső sarok – átméretezés pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Mégse pdfjs-editor-add-signature-add-button = Hozzáadás pdfjs-editor-edit-signature-update-button = Frissítés +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Megjegyzés szerkesztése +pdfjs-editor-edit-comment-popup-button = + .title = Megjegyzés szerkesztése +pdfjs-editor-delete-comment-popup-button-label = Megjegyzés eltávolítása +pdfjs-editor-delete-comment-popup-button = + .title = Megjegyzés eltávolítása +pdfjs-show-comment-button = + .title = Megjegyzés megjelenítése + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Műveletek -pdfjs-editor-edit-comment-actions-button = - .title = Műveletek -pdfjs-editor-edit-comment-close-button-label = Bezárás -pdfjs-editor-edit-comment-close-button = - .title = Bezárás -pdfjs-editor-edit-comment-actions-edit-button-label = Szerkesztés -pdfjs-editor-edit-comment-actions-delete-button-label = Törlés -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Írja be a megjegyzését -pdfjs-editor-edit-comment-manager-cancel-button = Mégse -pdfjs-editor-edit-comment-manager-save-button = Mentés +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Megjegyzés szerkesztése +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Frissítés +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Megjegyzés hozzáadása +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Hozzáadás +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Kezdjen el gépelni… +pdfjs-editor-edit-comment-dialog-cancel-button = Mégse ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Megjegyzés szerkesztése +pdfjs-editor-add-comment-button = + .title = Megjegyzés hozzáadása ## Main menu for adding/removing signatures diff --git a/l10n/hy-AM/viewer.ftl b/l10n/hy-AM/viewer.ftl index 5ced081e414d5..62b15a0471e4b 100644 --- a/l10n/hy-AM/viewer.ftl +++ b/l10n/hy-AM/viewer.ftl @@ -34,7 +34,7 @@ pdfjs-presentation-mode-button = .title = Անցնել Ներկայացման եղանակին pdfjs-presentation-mode-button-label = Ներկայացման եղանակ pdfjs-open-file-button = - .title = Բացել նիշք + .title = Բացել ֆայլ pdfjs-open-file-button-label = Բացել pdfjs-print-button = .title = Տպել @@ -42,9 +42,14 @@ pdfjs-print-button-label = Տպել pdfjs-save-button = .title = Պահպանել pdfjs-save-button-label = Պահպանել +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Ներբեռնել # Used in Firefox for Android as a label for the download button (“download” is a verb). # Length of the translation matters since we are in a mobile context, with limited screen estate. pdfjs-download-button-label = Ներբեռնել +pdfjs-bookmark-button = + .title = Ընթացիկ էջ (Դիտել URL-ը ընթացիկ էջից) pdfjs-bookmark-button-label = Ընթացիկ էջ ## Secondary toolbar and context menu @@ -70,6 +75,9 @@ pdfjs-cursor-text-select-tool-button-label = Գրույթը ընտրելու գ pdfjs-cursor-hand-tool-button = .title = Միացնել Ձեռքի գործիքը pdfjs-cursor-hand-tool-button-label = Ձեռքի գործիք +pdfjs-scroll-page-button = + .title = Օգտագործեք էջի գլորումը +pdfjs-scroll-page-button-label = Էջի գլորում pdfjs-scroll-vertical-button = .title = Օգտագործել ուղղահայաց ոլորում pdfjs-scroll-vertical-button-label = Ուղղահայաց ոլորում @@ -94,16 +102,16 @@ pdfjs-spread-even-button-label = Զույգ վերածածկեր pdfjs-document-properties-button = .title = Փաստաթղթի հատկությունները… pdfjs-document-properties-button-label = Փաստաթղթի հատկությունները… -pdfjs-document-properties-file-name = Նիշքի անունը. -pdfjs-document-properties-file-size = Նիշք չափը. +pdfjs-document-properties-file-name = Ֆայլի անունը. +pdfjs-document-properties-file-size = Ֆայլի չափը. # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } ԿԲ ({ $size_b } բայթ) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } ԿԲ ({ $b } բայթ) # Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } ՄԲ ({ $size_b } բայթ) +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } ՄԲ ({ $b } բայթ) pdfjs-document-properties-title = Վերնագիր. pdfjs-document-properties-author = Հեղինակ․ pdfjs-document-properties-subject = Վերնագիր. @@ -111,9 +119,8 @@ pdfjs-document-properties-keywords = Հիմնաբառ. pdfjs-document-properties-creation-date = Ստեղծելու ամսաթիվը. pdfjs-document-properties-modification-date = Փոփոխելու ամսաթիվը. # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Ստեղծող. pdfjs-document-properties-producer = PDF-ի հեղինակը. pdfjs-document-properties-version = PDF-ի տարբերակը. @@ -160,20 +167,29 @@ pdfjs-printing-not-ready = Զգուշացում. PDF-ը ամբողջությամ ## Tooltips and alt text for side panel toolbar buttons pdfjs-toggle-sidebar-button = - .title = Բացել/Փակել Կողային վահանակը -pdfjs-toggle-sidebar-button-label = Բացել/Փակել Կողային վահանակը + .title = Բացել/Փակել կողագոտին +pdfjs-toggle-sidebar-notification-button = + .title = Փոխարկել Կողագոտին (փաստաթուղթը պարունակում է ուրվագիծ/կցորդներ) +pdfjs-toggle-sidebar-button-label = Բացել/Փակել կողագոտին pdfjs-document-outline-button = .title = Ցուցադրել փաստաթղթի ուրվագիծը (կրկնակի սեղմեք՝ միավորները ընդարձակելու/կոծկելու համար) pdfjs-document-outline-button-label = Փաստաթղթի բովանդակությունը pdfjs-attachments-button = .title = Ցուցադրել կցորդները pdfjs-attachments-button-label = Կցորդներ +pdfjs-layers-button = + .title = Ցուցադրել շերտերը (կրկնակի սեղմեք բոլոր շերտերը սկզբնական վիճակին վերականգնելու համար) +pdfjs-layers-button-label = Շերտեր pdfjs-thumbs-button = - .title = Ցուցադրել Մանրապատկերը + .title = Ցուցադրել մանրապատկերը pdfjs-thumbs-button-label = Մանրապատկերը +pdfjs-current-outline-item-button = + .title = Գտեք ընթացիկ ուրվագծային տարրը +pdfjs-current-outline-item-button-label = Ընթացիկ ուրվագծային տարր pdfjs-findbar-button = .title = Գտնել փաստաթղթում pdfjs-findbar-button-label = Որոնում +pdfjs-additional-layers = Լրացուցիչ շերտեր ## Thumbnails panel item (tooltip and alt text for images) @@ -199,9 +215,25 @@ pdfjs-find-next-button = pdfjs-find-next-button-label = Հաջորդը pdfjs-find-highlight-checkbox = Գունանշել բոլորը pdfjs-find-match-case-checkbox-label = Մեծ(փոքր)ատառ հաշվի առնել +pdfjs-find-match-diacritics-checkbox-label = Համապատասխանեցնել տարբերիչները pdfjs-find-entire-word-checkbox-label = Ամբողջ բառերը pdfjs-find-reached-top = Հասել եք փաստաթղթի վերևին, կշարունակվի ներքևից pdfjs-find-reached-bottom = Հասել եք փաստաթղթի վերջին, կշարունակվի վերևից +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current }՝ { $total } համընկնումից + *[other] { $current } of { $total } համընկնումներից + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Ավելի քան { $limit } համընկնում + *[other] Ավելի քան { $limit } համընկնումներ + } pdfjs-find-not-found = Արտահայտությունը չգտնվեց ## Predefined zoom values @@ -214,6 +246,13 @@ pdfjs-page-scale-actual = Իրական չափը # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Էջ { $page } + ## Loading indicator messages pdfjs-loading-error = Սխալ՝ PDF ֆայլը բացելիս։ @@ -224,10 +263,6 @@ pdfjs-rendering-error = Սխալ՝ էջը ստեղծելիս: ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -235,6 +270,9 @@ pdfjs-annotation-date-string = { $date }, { $time } # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } Ծանոթություն] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -244,13 +282,154 @@ pdfjs-password-ok-button = Լավ pdfjs-password-cancel-button = Չեղարկել pdfjs-web-fonts-disabled = Վեբ-տառատեսակները անջատված են. հնարավոր չէ օգտագործել ներկառուցված PDF տառատեսակները: +## Editing + +pdfjs-editor-free-text-button = + .title = Գրվածք +pdfjs-editor-color-picker-free-text-input = + .title = Փոխել տեքստի գույնը +pdfjs-editor-free-text-button-label = Գրվածք +pdfjs-editor-ink-button = + .title = Նկարել +pdfjs-editor-color-picker-ink-input = + .title = Փոխել նկարելու գույնը +pdfjs-editor-ink-button-label = Նկարել +pdfjs-editor-stamp-button = + .title = Հավելել կամ խմբագրել պատկերներ +pdfjs-editor-stamp-button-label = Հավելել կամ խմբագրել պատկերներ +pdfjs-editor-highlight-button = + .title = Գունանշում +pdfjs-editor-highlight-button-label = Գունանշում +pdfjs-highlight-floating-button1 = + .title = Գունանշում + .aria-label = Գունանշում +pdfjs-highlight-floating-button-label = Գունանշում +pdfjs-comment-floating-button = + .title = Մեկնաբանություն + .aria-label = Մեկնաբանություն +pdfjs-comment-floating-button-label = Մեկնաբանություն +pdfjs-editor-signature-button = + .title = Ավելացնել ստորագրություն +pdfjs-editor-signature-button-label = Ավելացնել ստորագրություն + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Գունանշել խմբագիրը +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Նկարելու խմբագիր +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Ստորագրության խմբագիր՝ { $description } +pdfjs-editor-stamp-editor = + .aria-label = Պատկերի խմբագիր + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Հեռացնել նկարումը +pdfjs-editor-remove-freetext-button = + .title = Հեռացնել գրվածքը +pdfjs-editor-remove-stamp-button = + .title = Հեռացնել պատկերը +pdfjs-editor-remove-highlight-button = + .title = Հեռացնել գունանշումը +pdfjs-editor-remove-signature-button = + .title = Հեռացնել ստորագրությունը + ## -pdfjs-free-text-default-content = Սկսել մուտքագրումը… +# Editor Parameters +pdfjs-editor-free-text-color-input = Գույն +pdfjs-editor-free-text-size-input = Չափ +pdfjs-editor-ink-color-input = Գույն +pdfjs-editor-ink-thickness-input = Հաստություն +pdfjs-editor-ink-opacity-input = Մգություն +pdfjs-editor-stamp-add-image-button = + .title = Հավելել պատկեր +pdfjs-editor-stamp-add-image-button-label = Հավելել պատկեր +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Հաստություն +pdfjs-editor-free-highlight-thickness-title = + .title = Փոխել հաստությունը տեքստից բացի այլ տարրեր նշելիս +pdfjs-editor-add-signature-container = + .aria-label = Ստորագրության կառավարման տարրեր և պահպանված ստորագրություններ +pdfjs-editor-signature-add-signature-button = + .title = Ավելացնել նոր ստորագրություն +pdfjs-editor-signature-add-signature-button-label = Ավելացնել նոր ստորագրություն +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Պահպանված ստորագրություն՝ { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Գրվածքի խմբագիր + .default-content = Սկսեք մուտքագրել... ## Alt-text dialog +pdfjs-editor-alt-text-button-label = Այլընտրանքային գրվածք +pdfjs-editor-alt-text-edit-button = + .aria-label = Խմբագրել այլընտրանքային գրվածքը +pdfjs-editor-alt-text-dialog-label = Ընտրեք տառատեսակը +pdfjs-editor-alt-text-dialog-description = Այլընտրանքային տեքստը (alternative text) օգնում է, երբ մարդիկ չեն կարողանում տեսնել պատկերը կամ երբ այն չի բեռնվում։ +pdfjs-editor-alt-text-add-description-label = Հավելել նկարագրություն +pdfjs-editor-alt-text-add-description-description = Ձգտեք գրել 1-2 նախադասություն, որոնք նկարագրում են թեման, միջավայրը կամ գործողությունները։ +pdfjs-editor-alt-text-mark-decorative-label = Նշել որպես դեկորատիվ +pdfjs-editor-alt-text-mark-decorative-description = Սա օգտագործվում է դեկորատիվ պատկերների համար, ինչպիսիք են եզրագծերը կամ ջրանիշերը։ +pdfjs-editor-alt-text-cancel-button = Չեղարկել pdfjs-editor-alt-text-save-button = Պահպանել +pdfjs-editor-alt-text-decorative-tooltip = Նշել որպես դեկորատիվ +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Օրինակ՝ «Մի երիտասարդ նստում է սեղանի շուրջ՝ ուտելու» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Այլընտրանքային գրվածք + +## Editor resizers +## This is used in an aria label to help to understand the role of the resizer. + +pdfjs-editor-resizer-top-left = + .aria-label = Վերին ձախ անկյուն՝ չափափոխել +pdfjs-editor-resizer-top-middle = + .aria-label = Վերևի մեջտեղում՝ չափափոխել +pdfjs-editor-resizer-top-right = + .aria-label = Վերին ձախ անկյուն՝ չափափոխել +pdfjs-editor-resizer-middle-right = + .aria-label = Մեջտեղի աջ կողմում՝ չափափոխել +pdfjs-editor-resizer-bottom-right = + .aria-label = Վերին ձախ անկյուն՝ չափափոխել +pdfjs-editor-resizer-bottom-middle = + .aria-label = Վերևի մեջտեղում՝ չափափոխել +pdfjs-editor-resizer-bottom-left = + .aria-label = Վերին ձախ անկյուն՝ չափափոխել +pdfjs-editor-resizer-middle-left = + .aria-label = Մեջտեղի ձախ կողմում՝ չափափոխել + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Գունանշման գույն +pdfjs-editor-colorpicker-button = + .title = Փոխել գույնը +pdfjs-editor-colorpicker-dropdown = + .aria-label = Գույների ընտրություն +pdfjs-editor-colorpicker-yellow = + .title = Դեղին +pdfjs-editor-colorpicker-green = + .title = Կանաչ +pdfjs-editor-colorpicker-blue = + .title = Կապույտ +pdfjs-editor-colorpicker-pink = + .title = Վարդագույն +pdfjs-editor-colorpicker-red = + .title = Կարմիր ## Show all highlights ## This is a toggle button to show/hide all the highlights. @@ -262,4 +441,161 @@ pdfjs-editor-highlight-show-all-button = ## New alt-text dialog ## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Խմբագրել այլընտրանքային տեքստը (պատկերի նկարագրությունը) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Ավելացնել այլընտրանքային գրվածք (պատկերի նկարագրություն) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Գրեք ձեր նկարագրությունն այստեղ… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Կարճ նկարագրություն նրանց համար, ովքեր չեն կարող տեսնել պատկերը կամ երբ պատկերը չի բեռնվում։ +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Այս այլընտրանքային տեքստը ստեղծվել է ինքնաշխատ և կարող է սխալ լինել։ +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Իմանալ ավելին +pdfjs-editor-new-alt-text-create-automatically-button-label = Ինքնաշխատ ստեղծել այլընտրանքային գրվածք pdfjs-editor-new-alt-text-not-now-button = Ոչ հիմա +pdfjs-editor-new-alt-text-error-title = Հնարավոր չէ ինքնաշխատ ստեղծել այլընտրանքային գրվածք +pdfjs-editor-new-alt-text-error-description = Խնդրում ենք գրել ձեր սեփական այլընտրանքային տեքստը կամ փորձել կրկին ավելի ուշ։ +pdfjs-editor-new-alt-text-error-close-button = Փակել +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Ներբեռնվում է այլընտրանքային գրվածքի ահեստական բանականության մոդելը ({ $downloadedSize }՝ { $totalSize } ՄԲ-ից) + .aria-valuetext = Ներբեռնվում է այլընտրանքային գրվածքի ահեստական բանականության մոդելը ({ $downloadedSize }՝ { $totalSize } ՄԲ-ից) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Այլընտրանքային գրվածքն ավելացված է +pdfjs-editor-new-alt-text-added-button-label = Այլընտրանքային գրվածքն ավելացված է +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Այլընտրանքային գրվածքը բացակայում է +pdfjs-editor-new-alt-text-missing-button-label = Այլընտրանքային գրվածքը բացակայում է +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Վերանայել այլընտրանքային գրվածքը +pdfjs-editor-new-alt-text-to-review-button-label = Վերանայել այլընտրանքային գրվածքը +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Ստեղծվել է ինքնաշխատվ՝ { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Պատկերի այլընտրանքային գրվածքի կարգավորումներ +pdfjs-image-alt-text-settings-button-label = Պատկերի այլընտրանքային գրվածքի կարգավորումներ +pdfjs-editor-alt-text-settings-dialog-label = Պատկերի այլընտրանքային գրվածքի կարգավորումներ +pdfjs-editor-alt-text-settings-automatic-title = Ինքնաշխատ այլընտրանքային գրվածք +pdfjs-editor-alt-text-settings-create-model-button-label = Ինքնաշխատ ստեղծել այլընտրանքային գրվածք +pdfjs-editor-alt-text-settings-create-model-description = Կարճ նկարագրություն նրանց համար, ովքեր չեն կարող տեսնել պատկերը կամ երբ պատկերը չի բեռնվում։ +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Այլընտրանքային գրվածքի արհեստական բանականության մոդել ({ $totalSize } ՄԲ) +pdfjs-editor-alt-text-settings-ai-model-description = Աշխատում է տեղայնորեն ձեր սարքի վրա, որպեսզի ձեր տվյալները մնան գաղտնի: Պահանջվում է ինքնաշխատ այլընտրանքային գրվածքի համար: +pdfjs-editor-alt-text-settings-delete-model-button = Ջնջել +pdfjs-editor-alt-text-settings-download-model-button = Ներբեռնել +pdfjs-editor-alt-text-settings-downloading-model-button = Ներբեռնվում է… +pdfjs-editor-alt-text-settings-editor-title = Այլընտրանքային գրվածքի խմբագիր +pdfjs-editor-alt-text-settings-show-dialog-button-label = Պատկեր ավելացնելիս անմիջապես ցուցադրել այլընտրանքային գրվածքի խմբագիրը +pdfjs-editor-alt-text-settings-show-dialog-description = Օգնում է համոզվել, որ ձեր բոլոր պատկերներն ունեն այլընտրանքային գրվածք։ +pdfjs-editor-alt-text-settings-close-button = Փակել + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Գունանշումը ավելացվել է +pdfjs-editor-freetext-added-alert = Գրվածքը ավելացվել է +pdfjs-editor-ink-added-alert = Նկարումը ավելացվել է +pdfjs-editor-stamp-added-alert = Պատկերն ավելացված է +pdfjs-editor-signature-added-alert = Ստորագրությունն ավելացված է + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Գունանշումը հեռացված է +pdfjs-editor-undo-bar-message-freetext = Գրվածքը հեռացվել է +pdfjs-editor-undo-bar-message-ink = Նկարվածը հեռացվել է +pdfjs-editor-undo-bar-message-stamp = Պատկերը հեռացվել է +pdfjs-editor-undo-bar-message-signature = Ստորագրությունը հեռացված է +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } մեկնաբանությունը հեռացվել է + *[other] { $count } մեկնաբանությունները հեռացվել են + } +pdfjs-editor-undo-bar-undo-button = + .title = Հետարկել +pdfjs-editor-undo-bar-undo-button-label = Հետարկել +pdfjs-editor-undo-bar-close-button = + .title = Փակել +pdfjs-editor-undo-bar-close-button-label = Փակել + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Այս յուրահատկությունը հնարավորություն է տալիս օգտվողին ստեղծել ստորագրություն՝ PDF փաստաթղթում ավելացնելու համար: Օգտվողը կարող է խմբագրել անունը (որը նաև ծառայում է որպես alt տեքստ) և լրացուցիչ պահպանել այն՝ հետագա օգտագործման համար: +pdfjs-editor-add-signature-dialog-title = Ավելացնել ստորագրություն + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Տեսակ + .title = Տեսակ +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Նկարել + .title = Նկարել +pdfjs-editor-add-signature-image-button = Պատկեր + .title = Պատկեր + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Մուտքագրեք ձեր ստորագրությունը + .placeholder = Մուտքագրեք ձեր ստորագրությունը +pdfjs-editor-add-signature-draw-placeholder = Նկարեք ձեր ստորագրությունը +pdfjs-editor-add-signature-draw-thickness-range-label = Հաստություն +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Նկաելու հաստությունը՝ { $thickness } +pdfjs-editor-add-signature-image-placeholder = Քաշեք ֆայլը այստեղ՝ վերբեռնելու համար +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Կամ ընտրեք պատկերի ֆայլը + *[other] Կամ ընտրեք պատկերի ֆայլերը + } + +## Controls + +pdfjs-editor-add-signature-description-label = Նկարագրություն (այլընտրանքային գրվածք) +pdfjs-editor-add-signature-description-input = + .title = Նկարագրություն (այլընտրանքային գրվածք) +pdfjs-editor-add-signature-description-default-when-drawing = Ստորագրություն +pdfjs-editor-add-signature-clear-button-label = Մաքրել ստորագրությունը +pdfjs-editor-add-signature-clear-button = + .title = Մաքրել ստորագրությունը +pdfjs-editor-add-signature-save-checkbox = Պահպանել ստորագրությունը +pdfjs-editor-add-signature-save-warning-message = Դուք հասել եք պահպանված ստորագրությունների 5 սահմանաչափին։ Հեռացրեք մեկը՝ ավելին պահպանելու համար։ +pdfjs-editor-add-signature-image-upload-error-title = Չհաջողվեց վերբեռնել պատկերը +pdfjs-editor-add-signature-image-upload-error-description = Ստուգեք ձեր ցանցային կապակցումը կամ փորձեք մեկ այլ պատկեր։ +pdfjs-editor-add-signature-image-no-data-error-title = Այս պատկերը հնարավոր չէ վերածել ստորագրության +pdfjs-editor-add-signature-image-no-data-error-description = Խնդրում եմ փորձեք վերբեռնել այլ պատկեր։ +pdfjs-editor-add-signature-error-close-button = Փակել + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Չեղարկել +pdfjs-editor-add-signature-add-button = Ավելացնել +pdfjs-editor-edit-signature-update-button = Թարմացնել + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Հեռացնել պահպանված ստորագրությունը +pdfjs-editor-delete-signature-button-label1 = Հեռացնել պահպանված ստորագրությունը + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Խմբագրել նկարագրությունը + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Խմբագրել նկարագրությունը diff --git a/l10n/hye/viewer.ftl b/l10n/hye/viewer.ftl index 3e627180aa5fe..4625bfec5b445 100644 --- a/l10n/hye/viewer.ftl +++ b/l10n/hye/viewer.ftl @@ -92,24 +92,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Փաստաթղթի յատկութիւնները… pdfjs-document-properties-file-name = Նիշքի անունը․ pdfjs-document-properties-file-size = Նիշք չափը. -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } ԿԲ ({ $size_b } բայթ) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } ՄԲ ({ $size_b } բայթ) pdfjs-document-properties-title = Վերնագիր pdfjs-document-properties-author = Հեղինակ․ pdfjs-document-properties-subject = առարկայ pdfjs-document-properties-keywords = Հիմնաբառեր pdfjs-document-properties-creation-date = Ստեղծման ամսաթիւ pdfjs-document-properties-modification-date = Փոփոխութեան ամսաթիւ. -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Ստեղծող pdfjs-document-properties-producer = PDF-ի Արտադրողը. pdfjs-document-properties-version = PDF-ի տարբերակը. @@ -237,10 +225,6 @@ pdfjs-rendering-error = Սխալ է տեղի ունեցել էջի մեկնաբ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/ia/viewer.ftl b/l10n/ia/viewer.ftl index 9f61d03bfbd2a..3b7c63ec9f4b5 100644 --- a/l10n/ia/viewer.ftl +++ b/l10n/ia/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Titulo: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Subjecto: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Data de modification: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creator: pdfjs-document-properties-producer = Productor PDF: pdfjs-document-properties-version = Version PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Un error occurreva durante que on processava le pagina. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Commento .aria-label = Commento pdfjs-comment-floating-button-label = Commento +pdfjs-editor-comment-button = + .title = Commento + .aria-label = Commento +pdfjs-editor-comment-button-label = Commento pdfjs-editor-signature-button = .title = Adder signatura pdfjs-editor-signature-button-label = Adder signatura @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Editor de texto .default-content = Initiar a inserer… -pdfjs-free-text = - .aria-label = Editor de texto -pdfjs-free-text-default-content = Comenciar a scriber… -pdfjs-ink = - .aria-label = Editor de designos -pdfjs-ink-canvas = - .aria-label = Imagine create per le usator +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Commento + *[other] Commentos + } +pdfjs-editor-comments-sidebar-close-button = + .title = Clauder le barra lateral + .aria-label = Clauder le barra lateral +pdfjs-editor-comments-sidebar-close-button-label = Clauder le barra lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vide tu alco notabile? Evidentia lo e lassa un commentario. +pdfjs-editor-comments-sidebar-no-comments-link = Pro saper plus ## Alt-text dialog pdfjs-editor-alt-text-button-label = Texto alternative pdfjs-editor-alt-text-edit-button = .aria-label = Rediger texto alternative -pdfjs-editor-alt-text-edit-button-label = Rediger texto alternative pdfjs-editor-alt-text-dialog-label = Elige un option pdfjs-editor-alt-text-dialog-description = Le texto alternative (alt text) adjuta quando le personas non pote vider le imagine o quando illo non carga. pdfjs-editor-alt-text-add-description-label = Adder un description @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Angulo superior sinistre — redimensionar -pdfjs-editor-resizer-label-top-middle = Medio superior — redimensionar -pdfjs-editor-resizer-label-top-right = Angulo superior dextre — redimensionar -pdfjs-editor-resizer-label-middle-right = Medio dextre — redimensionar -pdfjs-editor-resizer-label-bottom-right = Angulo inferior dextre — redimensionar -pdfjs-editor-resizer-label-bottom-middle = Medio inferior — redimensionar -pdfjs-editor-resizer-label-bottom-left = Angulo inferior sinistre — redimensionar -pdfjs-editor-resizer-label-middle-left = Medio sinistre — redimensionar pdfjs-editor-resizer-top-left = .aria-label = Angulo superior sinistre — redimensionar pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Cancellar pdfjs-editor-add-signature-add-button = Adder pdfjs-editor-edit-signature-update-button = Actualisar +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Rediger commento +pdfjs-editor-edit-comment-popup-button = + .title = Rediger commento +pdfjs-editor-delete-comment-popup-button-label = Remover commento +pdfjs-editor-delete-comment-popup-button = + .title = Remover commento +pdfjs-show-comment-button = + .title = Monstrar commento + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Actiones -pdfjs-editor-edit-comment-actions-button = - .title = Actiones -pdfjs-editor-edit-comment-close-button-label = Clauder -pdfjs-editor-edit-comment-close-button = - .title = Clauder -pdfjs-editor-edit-comment-actions-edit-button-label = Rediger -pdfjs-editor-edit-comment-actions-delete-button-label = Deler -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Insere tu commento -pdfjs-editor-edit-comment-manager-cancel-button = Cancellar -pdfjs-editor-edit-comment-manager-save-button = Salvar +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Rediger commento +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualisar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Adder commento +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Adder +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Comenciar a scriber… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancellar ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Rediger commento +pdfjs-editor-add-comment-button = + .title = Adder commento ## Main menu for adding/removing signatures diff --git a/l10n/id/viewer.ftl b/l10n/id/viewer.ftl index 36fe1235e75ef..f5b84af0c60eb 100644 --- a/l10n/id/viewer.ftl +++ b/l10n/id/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } byte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) pdfjs-document-properties-title = Judul: pdfjs-document-properties-author = Penyusun: pdfjs-document-properties-subject = Subjek: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Tanggal Dimodifikasi: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Pembuat: pdfjs-document-properties-producer = Pemroduksi PDF: pdfjs-document-properties-version = Versi PDF: @@ -267,10 +255,6 @@ pdfjs-rendering-error = Galat terjadi saat merender laman. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -294,9 +278,13 @@ pdfjs-web-fonts-disabled = Font web dinonaktifkan: tidak dapat menggunakan font pdfjs-editor-free-text-button = .title = Teks +pdfjs-editor-color-picker-free-text-input = + .title = Ubah warna teks pdfjs-editor-free-text-button-label = Teks pdfjs-editor-ink-button = .title = Gambar +pdfjs-editor-color-picker-ink-input = + .title = Ubah warna gambar pdfjs-editor-ink-button-label = Gambar pdfjs-editor-stamp-button = .title = Tambah atau edit gambar @@ -308,6 +296,10 @@ pdfjs-highlight-floating-button1 = .title = Sorot .aria-label = Sorot pdfjs-highlight-floating-button-label = Sorot +pdfjs-comment-floating-button = + .title = Komentar + .aria-label = Komentar +pdfjs-comment-floating-button-label = Komentar pdfjs-editor-signature-button = .title = Tambahkan tanda tangan pdfjs-editor-signature-button-label = Tambahkan tanda tangan @@ -370,20 +362,12 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Editor Teks .default-content = Mulai mengetik… -pdfjs-free-text = - .aria-label = Editor Teks -pdfjs-free-text-default-content = Mulai mengetik… -pdfjs-ink = - .aria-label = Editor Gambar -pdfjs-ink-canvas = - .aria-label = Gambar yang dibuat pengguna ## Alt-text dialog pdfjs-editor-alt-text-button-label = Teks alternatif pdfjs-editor-alt-text-edit-button = .aria-label = Edit teks alternatif -pdfjs-editor-alt-text-edit-button-label = Edit teks alternatif pdfjs-editor-alt-text-dialog-label = Pilih opsi pdfjs-editor-alt-text-dialog-description = Teks alternatif membantu ketika orang tidak dapat melihat gambar atau ketika tidak termuat. pdfjs-editor-alt-text-add-description-label = Tambahkan deskripsi @@ -403,14 +387,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Pojok kiri atas — ubah ukuran -pdfjs-editor-resizer-label-top-middle = Tengah atas — ubah ukuran -pdfjs-editor-resizer-label-top-right = Pojok kanan atas — ubah ukuran -pdfjs-editor-resizer-label-middle-right = Kanan tengah — ubah ukuran -pdfjs-editor-resizer-label-bottom-right = Pojok kanan bawah — ubah ukuran -pdfjs-editor-resizer-label-bottom-middle = Tengah bawah — ubah ukuran -pdfjs-editor-resizer-label-bottom-left = Pojok kiri bawah — ubah ukuran -pdfjs-editor-resizer-label-middle-left = Kiri tengah — ubah ukuran pdfjs-editor-resizer-top-left = .aria-label = Pojok kiri atas — ubah ukuran pdfjs-editor-resizer-top-middle = @@ -516,6 +492,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Tampilkan editor teks pdfjs-editor-alt-text-settings-show-dialog-description = Membantu Anda memastikan semua gambar Anda memiliki teks alternatif. pdfjs-editor-alt-text-settings-close-button = Tutup +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Sorotan ditambahkan +pdfjs-editor-freetext-added-alert = Teks ditambahkan +pdfjs-editor-ink-added-alert = Gambar ditambahkan +pdfjs-editor-stamp-added-alert = Citra ditambahkan +pdfjs-editor-signature-added-alert = Tanda tangan ditambahkan + ## "Annotations removed" bar pdfjs-editor-undo-bar-message-highlight = Sorotan dihapus @@ -580,6 +564,8 @@ pdfjs-editor-add-signature-save-checkbox = Simpan tanda tangan pdfjs-editor-add-signature-save-warning-message = Anda telah mencapai batas 5 tanda tangan tersimpan. Hapus untuk menyimpan lebih banyak. pdfjs-editor-add-signature-image-upload-error-title = Tidak dapat mengunggah gambar pdfjs-editor-add-signature-image-upload-error-description = Periksa sambungan jaringan Anda atau coba gambar lain. +pdfjs-editor-add-signature-image-no-data-error-title = Tak bisa mengonversi citra ini menjadi tanda tangan +pdfjs-editor-add-signature-image-no-data-error-description = Coba unggah gambar lain. pdfjs-editor-add-signature-error-close-button = Tutup ## Dialog buttons diff --git a/l10n/is/viewer.ftl b/l10n/is/viewer.ftl index 650028e9bf958..11b6d1b450596 100644 --- a/l10n/is/viewer.ftl +++ b/l10n/is/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bæti) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Titill: pdfjs-document-properties-author = Hönnuður: pdfjs-document-properties-subject = Efni: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Dags breytingar: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Höfundur: pdfjs-document-properties-producer = PDF framleiðandi: pdfjs-document-properties-version = PDF útgáfa: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Upp kom villa við að birta síðuna. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -360,20 +344,12 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Textaritill .default-content = Byrjaðu að skrifa… -pdfjs-free-text = - .aria-label = Textaritill -pdfjs-free-text-default-content = Byrjaðu að skrifa… -pdfjs-ink = - .aria-label = Teikniritill -pdfjs-ink-canvas = - .aria-label = Mynd gerð af notanda ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alt-varatexti pdfjs-editor-alt-text-edit-button = .aria-label = Breyta alt-myndatexta -pdfjs-editor-alt-text-edit-button-label = Breyta alt-varatexta pdfjs-editor-alt-text-dialog-label = Veldu valkost pdfjs-editor-alt-text-dialog-description = Alt-varatexti (auka-myndatexti) hjálpar þegar fólk getur ekki séð myndina eða þegar hún hleðst ekki inn. pdfjs-editor-alt-text-add-description-label = Bættu við lýsingu @@ -393,14 +369,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Efst í vinstra horni - breyta stærð -pdfjs-editor-resizer-label-top-middle = Efst á miðju - breyta stærð -pdfjs-editor-resizer-label-top-right = Efst í hægra horni - breyta stærð -pdfjs-editor-resizer-label-middle-right = Miðja til hægri - breyta stærð -pdfjs-editor-resizer-label-bottom-right = Neðst í hægra horni - breyta stærð -pdfjs-editor-resizer-label-bottom-middle = Neðst á miðju - breyta stærð -pdfjs-editor-resizer-label-bottom-left = Neðst í vinstra horni - breyta stærð -pdfjs-editor-resizer-label-middle-left = Miðja til vinstri - breyta stærð pdfjs-editor-resizer-top-left = .aria-label = Efst í vinstra horni - breyta stærð pdfjs-editor-resizer-top-middle = @@ -506,6 +474,11 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Sýna alt-myndatextari pdfjs-editor-alt-text-settings-show-dialog-description = Hjálpar þér að tryggja að allar myndirnar þínar séu með alt-myndatexta. pdfjs-editor-alt-text-settings-close-button = Loka +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-stamp-added-alert = Mynd bætt við +pdfjs-editor-signature-added-alert = Undirritun bætt við + ## "Annotations removed" bar pdfjs-editor-undo-bar-message-highlight = Áherslulitun fjarlægð @@ -574,6 +547,8 @@ pdfjs-editor-add-signature-save-checkbox = Vista undirskrift pdfjs-editor-add-signature-save-warning-message = Þú hefur náð hámarki 5 vistaðra undirskrifta. Fjarlægðu eina til að geta vistað fleiri. pdfjs-editor-add-signature-image-upload-error-title = Ekki tókst að senda inn mynd pdfjs-editor-add-signature-image-upload-error-description = Athugaðu nettenginguna þína eða prófaðu aðra mynd. +pdfjs-editor-add-signature-image-no-data-error-title = Get ekki breytt þessari mynd í undirskrift +pdfjs-editor-add-signature-image-no-data-error-description = Reyndu að senda inn aðra mynd. pdfjs-editor-add-signature-error-close-button = Loka ## Dialog buttons diff --git a/l10n/it/viewer.ftl b/l10n/it/viewer.ftl index 36bdc9ed46577..0a0c956740450 100644 --- a/l10n/it/viewer.ftl +++ b/l10n/it/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } byte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) pdfjs-document-properties-title = Titolo: pdfjs-document-properties-author = Autore: pdfjs-document-properties-subject = Oggetto: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Data modifica: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Autore originale: pdfjs-document-properties-producer = Produttore PDF: pdfjs-document-properties-version = Versione PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Si è verificato un errore durante il rendering della pa ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -306,10 +290,10 @@ pdfjs-editor-color-picker-free-text-input = .title = Cambia colore del testo pdfjs-editor-free-text-button-label = Testo pdfjs-editor-ink-button = - .title = Disegno + .title = Disegna pdfjs-editor-color-picker-ink-input = .title = Cambia colore del disegno -pdfjs-editor-ink-button-label = Disegno +pdfjs-editor-ink-button-label = Disegna pdfjs-editor-stamp-button = .title = Aggiungi o rimuovi immagine pdfjs-editor-stamp-button-label = Aggiungi o rimuovi immagine @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Commenta .aria-label = Commenta pdfjs-comment-floating-button-label = Commenta +pdfjs-editor-comment-button = + .title = Commenta + .aria-label = Commenta +pdfjs-editor-comment-button-label = Commenta pdfjs-editor-signature-button = .title = Aggiungi firma pdfjs-editor-signature-button-label = Aggiungi firma @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Editor di testo .default-content = Inizia a digitare… -pdfjs-free-text = - .aria-label = Editor di testo -pdfjs-free-text-default-content = Inizia a digitare… -pdfjs-ink = - .aria-label = Editor disegni -pdfjs-ink-canvas = - .aria-label = Immagine creata dall’utente +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Commento + *[other] Commenti + } +pdfjs-editor-comments-sidebar-close-button = + .title = Chiudi la barra laterale + .aria-label = Chiudi la barra laterale +pdfjs-editor-comments-sidebar-close-button-label = Chiudi la barra laterale +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Hai notato qualcosa di interessante? Evidenzialo e aggiungi un commento. +pdfjs-editor-comments-sidebar-no-comments-link = Ulteriori informazioni ## Alt-text dialog pdfjs-editor-alt-text-button-label = Testo alternativo pdfjs-editor-alt-text-edit-button = .aria-label = Modifica testo alternativo -pdfjs-editor-alt-text-edit-button-label = Modifica testo alternativo pdfjs-editor-alt-text-dialog-label = Scegli un’opzione pdfjs-editor-alt-text-dialog-description = Il testo alternativo (“alt text”) aiuta quando le persone non possono vedere l’immagine o quando l’immagine non viene caricata. pdfjs-editor-alt-text-add-description-label = Aggiungi una descrizione @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Angolo in alto a sinistra — ridimensiona -pdfjs-editor-resizer-label-top-middle = Lato superiore nel mezzo — ridimensiona -pdfjs-editor-resizer-label-top-right = Angolo in alto a destra — ridimensiona -pdfjs-editor-resizer-label-middle-right = Lato destro nel mezzo — ridimensiona -pdfjs-editor-resizer-label-bottom-right = Angolo in basso a destra — ridimensiona -pdfjs-editor-resizer-label-bottom-middle = Lato inferiore nel mezzo — ridimensiona -pdfjs-editor-resizer-label-bottom-left = Angolo in basso a sinistra — ridimensiona -pdfjs-editor-resizer-label-middle-left = Lato sinistro nel mezzo — ridimensiona pdfjs-editor-resizer-top-left = .aria-label = Angolo in alto a sinistra — ridimensiona pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Annulla pdfjs-editor-add-signature-add-button = Aggiungi pdfjs-editor-edit-signature-update-button = Aggiorna +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Modifica commento +pdfjs-editor-edit-comment-popup-button = + .title = Modifica commento +pdfjs-editor-delete-comment-popup-button-label = Elimina commento +pdfjs-editor-delete-comment-popup-button = + .title = Elimina commento +pdfjs-show-comment-button = + .title = Mostra commento + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Azioni -pdfjs-editor-edit-comment-actions-button = - .title = Azioni -pdfjs-editor-edit-comment-close-button-label = Chiudi -pdfjs-editor-edit-comment-close-button = - .title = Chiudi -pdfjs-editor-edit-comment-actions-edit-button-label = Modifica -pdfjs-editor-edit-comment-actions-delete-button-label = Elimina -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Inserisci il tuo commento -pdfjs-editor-edit-comment-manager-cancel-button = Annulla -pdfjs-editor-edit-comment-manager-save-button = Salva +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Modifica commento +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aggiorna +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Aggiungi commento +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Aggiungi +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Inizia a digitare… +pdfjs-editor-edit-comment-dialog-cancel-button = Annulla ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Modifica commento +pdfjs-editor-add-comment-button = + .title = Aggiungi commento ## Main menu for adding/removing signatures @@ -651,4 +646,3 @@ pdfjs-editor-add-signature-edit-button-label = Modifica descrizione ## Edit signature description dialog pdfjs-editor-edit-signature-dialog-title = Modifica descrizione - diff --git a/l10n/ja/viewer.ftl b/l10n/ja/viewer.ftl index 9341678476342..ca877f688dece 100644 --- a/l10n/ja/viewer.ftl +++ b/l10n/ja/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } バイト) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } バイト) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } バイト) pdfjs-document-properties-title = タイトル: pdfjs-document-properties-author = 作成者: pdfjs-document-properties-subject = 件名: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = 更新日: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = アプリケーション: pdfjs-document-properties-producer = PDF 作成: pdfjs-document-properties-version = PDF のバージョン: @@ -267,10 +255,6 @@ pdfjs-rendering-error = ページのレンダリング中にエラーが発生 ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -294,9 +278,13 @@ pdfjs-web-fonts-disabled = ウェブフォントが無効になっています: pdfjs-editor-free-text-button = .title = フリーテキスト注釈を追加します +pdfjs-editor-color-picker-free-text-input = + .title = テキスト色を変更します pdfjs-editor-free-text-button-label = フリーテキスト注釈 pdfjs-editor-ink-button = .title = インク注釈を追加します +pdfjs-editor-color-picker-ink-input = + .title = インク色を変更します pdfjs-editor-ink-button-label = インク注釈 pdfjs-editor-stamp-button = .title = 画像を追加または編集します @@ -305,9 +293,17 @@ pdfjs-editor-highlight-button = .title = 強調します pdfjs-editor-highlight-button-label = 強調 pdfjs-highlight-floating-button1 = - .title = 強調 + .title = 強調します .aria-label = 強調します pdfjs-highlight-floating-button-label = 強調 +pdfjs-comment-floating-button = + .title = コメントを追加します + .aria-label = コメントを追加します +pdfjs-comment-floating-button-label = コメント +pdfjs-editor-comment-button = + .title = コメントを編集します + .aria-label = コメントを編集します +pdfjs-editor-comment-button-label = コメント pdfjs-editor-signature-button = .title = 署名を追加します pdfjs-editor-signature-button-label = 署名を追加 @@ -370,20 +366,23 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = フリーテキスト注釈エディター .default-content = テキストを入力してください... -pdfjs-free-text = - .aria-label = フリーテキスト注釈エディター -pdfjs-free-text-default-content = テキストを入力してください... -pdfjs-ink = - .aria-label = インク注釈エディター -pdfjs-ink-canvas = - .aria-label = ユーザー作成画像 +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = コメント +pdfjs-editor-comments-sidebar-close-button = + .title = サイドバーを閉じます + .aria-label = サイドバーを閉じる +pdfjs-editor-comments-sidebar-close-button-label = サイドバーを閉じる +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = 気になることがあれば、選択してコメントを残してください。 +pdfjs-editor-comments-sidebar-no-comments-link = 詳細情報 ## Alt-text dialog pdfjs-editor-alt-text-button-label = 代替テキスト pdfjs-editor-alt-text-edit-button = .aria-label = 代替テキストを編集 -pdfjs-editor-alt-text-edit-button-label = 代替テキストを編集 pdfjs-editor-alt-text-dialog-label = オプションの選択 pdfjs-editor-alt-text-dialog-description = 代替テキストは画像が表示されない場合や読み込まれない場合にユーザーの助けになります。 pdfjs-editor-alt-text-add-description-label = 説明を追加 @@ -403,14 +402,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = 左上隅 — サイズ変更 -pdfjs-editor-resizer-label-top-middle = 上中央 — サイズ変更 -pdfjs-editor-resizer-label-top-right = 右上隅 — サイズ変更 -pdfjs-editor-resizer-label-middle-right = 右中央 — サイズ変更 -pdfjs-editor-resizer-label-bottom-right = 右下隅 — サイズ変更 -pdfjs-editor-resizer-label-bottom-middle = 下中央 — サイズ変更 -pdfjs-editor-resizer-label-bottom-left = 左下隅 — サイズ変更 -pdfjs-editor-resizer-label-middle-left = 左中央 — サイズ変更 pdfjs-editor-resizer-top-left = .aria-label = 左上隅 — サイズ変更 pdfjs-editor-resizer-top-middle = @@ -588,6 +579,8 @@ pdfjs-editor-add-signature-save-checkbox = 署名を保存 pdfjs-editor-add-signature-save-warning-message = 保存された署名が上限の 5 個に達しました。さらに保存するにはいずれかを削除してください。 pdfjs-editor-add-signature-image-upload-error-title = 画像をアップロードできません pdfjs-editor-add-signature-image-upload-error-description = ネットワーク接続を確認するか別の画像を試してください。 +pdfjs-editor-add-signature-image-no-data-error-title = この画像は署名に変換できません +pdfjs-editor-add-signature-image-no-data-error-description = 別の画像をアップロードしてください。 pdfjs-editor-add-signature-error-close-button = 閉じる ## Dialog buttons @@ -596,6 +589,34 @@ pdfjs-editor-add-signature-cancel-button = キャンセル pdfjs-editor-add-signature-add-button = 追加 pdfjs-editor-edit-signature-update-button = 更新 +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = コメントを編集 +pdfjs-editor-edit-comment-popup-button = + .title = コメントを編集します +pdfjs-editor-delete-comment-popup-button-label = コメントを削除 +pdfjs-editor-delete-comment-popup-button = + .title = コメントを削除します +pdfjs-show-comment-button = + .title = コメントを表示します + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = コメントを編集 +pdfjs-editor-edit-comment-dialog-save-button-when-editing = 更新 +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = コメントを追加 +pdfjs-editor-edit-comment-dialog-save-button-when-adding = 追加 +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = コメントを入力してください... +pdfjs-editor-edit-comment-dialog-cancel-button = キャンセル + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = コメントを追加します + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/ka/viewer.ftl b/l10n/ka/viewer.ftl index 8f82a5929a10f..171d289a5e253 100644 --- a/l10n/ka/viewer.ftl +++ b/l10n/ka/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } მბაიტი ({ $b } ბაიტი) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } კბ ({ $size_b } ბაიტი) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } მბ ({ $size_b } ბაიტი) pdfjs-document-properties-title = სათაური: pdfjs-document-properties-author = შემქმნელი: pdfjs-document-properties-subject = თემა: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = ჩასწორების დ # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = შემდგენელი: pdfjs-document-properties-producer = PDF-შემდგენელი: pdfjs-document-properties-version = PDF-ვერსია: @@ -275,10 +263,6 @@ pdfjs-rendering-error = შეცდომა, გვერდის ჩვე ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = შენიშვნა .aria-label = შენიშვნა pdfjs-comment-floating-button-label = შენიშვნა +pdfjs-editor-comment-button = + .title = შენიშვნა + .aria-label = შენიშვნა +pdfjs-editor-comment-button-label = შენიშვნა pdfjs-editor-signature-button = .title = ხელმოწერის დამატება pdfjs-editor-signature-button-label = ხელმოწერის დამატება @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = წარწერის ჩასწორება .default-content = დაიწყეთ აკრეფა… -pdfjs-free-text = - .aria-label = წარწერის ჩასწორება -pdfjs-free-text-default-content = აკრიფეთ… -pdfjs-ink = - .aria-label = მოხაზულის შესწორება -pdfjs-ink-canvas = - .aria-label = მომხმარებლის შექმნილი სურათი +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] შენიშვნა + *[other] შენიშვნა + } +pdfjs-editor-comments-sidebar-close-button = + .title = გვერდითი ზოლის დახურვა + .aria-label = გვერდითი ზოლის დახურვა +pdfjs-editor-comments-sidebar-close-button-label = გვერდითი ზოლის დახურვა +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = რამე საყურადღებოს წააწყდით? გააფერადეთ და დაურთეთ შენიშვნა. +pdfjs-editor-comments-sidebar-no-comments-link = ვრცლად ## Alt-text dialog pdfjs-editor-alt-text-button-label = თანდართული წარწერა pdfjs-editor-alt-text-edit-button = .aria-label = დართული წარწერის ჩასწორება -pdfjs-editor-alt-text-edit-button-label = თანდართული წარწერის ჩასწორება pdfjs-editor-alt-text-dialog-label = არჩევა pdfjs-editor-alt-text-dialog-description = თანდართული (შემნაცვლებელი) წარწერა გამოსადეგია მათთვის, ვინც ვერ ხედავს სურათებს ან გამოისახება მაშინ, როცა სურათი ვერ ჩაიტვირთება. pdfjs-editor-alt-text-add-description-label = აღწერილობის მითითება @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = ზევით მარცხნივ — ზომაცვლა -pdfjs-editor-resizer-label-top-middle = ზევით შუაში — ზომაცვლა -pdfjs-editor-resizer-label-top-right = ზევით მარჯვნივ — ზომაცვლა -pdfjs-editor-resizer-label-middle-right = შუაში მარჯვნივ — ზომაცვლა -pdfjs-editor-resizer-label-bottom-right = ქვევით მარჯვნივ — ზომაცვლა -pdfjs-editor-resizer-label-bottom-middle = ქვევით შუაში — ზომაცვლა -pdfjs-editor-resizer-label-bottom-left = ზვევით მარცხნივ — ზომაცვლა -pdfjs-editor-resizer-label-middle-left = შუაში მარცხნივ — ზომაცვლა pdfjs-editor-resizer-top-left = .aria-label = ზევით მარცხნივ — ზომაცვლა pdfjs-editor-resizer-top-middle = @@ -478,13 +465,13 @@ pdfjs-editor-new-alt-text-dialog-edit-label = დართული წარწ # Modal header positioned above a text box where users can add the alt text. pdfjs-editor-new-alt-text-dialog-add-label = დართული წარწერის დამატება (სურათის აღწერის) pdfjs-editor-new-alt-text-textarea = - .placeholder = დაწერეთ თქვენი აღწერა აქ… + .placeholder = დაწერეთ თქვენი აღწერილობა აქ… # This text refers to the alt text box above this description. It offers a definition of alt text. pdfjs-editor-new-alt-text-description = მოკლე აღწერა მათთვის, ვინც ვერ ხედავს სურათს ან ვისთანაც ვერ ჩაიტვირთება სურათი. # This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. pdfjs-editor-new-alt-text-disclaimer1 = ეს დართული წარწერა ავტომატურადაა შედგენილი და შესაძლოა, უმართებულო იყოს. pdfjs-editor-new-alt-text-disclaimer-learn-more-url = ვრცლად -pdfjs-editor-new-alt-text-create-automatically-button-label = დართული წარწერის ავტომატური შედგენა +pdfjs-editor-new-alt-text-create-automatically-button-label = დართული წარწერის თვითშედგენა pdfjs-editor-new-alt-text-not-now-button = ახლა არა pdfjs-editor-new-alt-text-error-title = დართული წარწერის შედგენა ვერ მოხერხდა pdfjs-editor-new-alt-text-error-description = გთხოვთ დაწეროთ საკუთარი დანართი და კვლავ სცადოთ მოგვიანებით. @@ -518,12 +505,12 @@ pdfjs-image-alt-text-settings-button = pdfjs-image-alt-text-settings-button-label = სურათის დართული წარწერის პარამეტრები pdfjs-editor-alt-text-settings-dialog-label = სურათის დართული წარწერის პარამეტრები pdfjs-editor-alt-text-settings-automatic-title = ავტომატურად დართული წარწერა -pdfjs-editor-alt-text-settings-create-model-button-label = დართული წარწერის ავტომატური შედგენა +pdfjs-editor-alt-text-settings-create-model-button-label = დართული წარწერის თვითშედგენა pdfjs-editor-alt-text-settings-create-model-description = აღწერს სურათს მათთვის, ვინც ვერ ხედავს ან ვისთანაც ვერ ჩაიტვირთება. # Variables: # $totalSize (Number) - the total size (in MB) of the AI model. pdfjs-editor-alt-text-settings-download-model-label = დართული წარწერის შესადგენი AI-მოდელი ({ $totalSize } მბაიტი) -pdfjs-editor-alt-text-settings-ai-model-description = ეშვება ადგილობრივად თქვენს მოწყობილობასა, ასე რომ მონაცემები დარჩება პირადი. საჭიროა წარწერის ავტომატურად დართვისთვის. +pdfjs-editor-alt-text-settings-ai-model-description = ეშვება ადგილობრივად თქვენს მოწყობილობაზე, ასე რომ მონაცემები დარჩება პირადი. საჭიროა დართული წარწერების თვითშედგენისთვის. pdfjs-editor-alt-text-settings-delete-model-button = წაშლა pdfjs-editor-alt-text-settings-download-model-button = ჩამოტვირთვა pdfjs-editor-alt-text-settings-downloading-model-button = ჩამოიტვრითება... @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = გაუქმება pdfjs-editor-add-signature-add-button = დამატება pdfjs-editor-edit-signature-update-button = განახლება +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = შენიშვნის ჩასწორება +pdfjs-editor-edit-comment-popup-button = + .title = შენიშვნის ჩასწორება +pdfjs-editor-delete-comment-popup-button-label = შენიშვნის მოცილება +pdfjs-editor-delete-comment-popup-button = + .title = შენიშვნის მოცილება +pdfjs-show-comment-button = + .title = შენიშვნის გამოჩენა + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = მოქმედებები -pdfjs-editor-edit-comment-actions-button = - .title = მოქმედებები -pdfjs-editor-edit-comment-close-button-label = დახურვა -pdfjs-editor-edit-comment-close-button = - .title = დახურვა -pdfjs-editor-edit-comment-actions-edit-button-label = ჩასწორება -pdfjs-editor-edit-comment-actions-delete-button-label = წაშლა -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = შეიყვანეთ დასართავი შენიშვნა -pdfjs-editor-edit-comment-manager-cancel-button = გაუქმება -pdfjs-editor-edit-comment-manager-save-button = შენახვა +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = შენიშვნის ჩასწორება +pdfjs-editor-edit-comment-dialog-save-button-when-editing = განახლება +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = შენიშვნის დამატება +pdfjs-editor-edit-comment-dialog-save-button-when-adding = დამატება +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = აკრიფეთ… +pdfjs-editor-edit-comment-dialog-cancel-button = გაუქმება ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = შენიშვნის ჩასწორება +pdfjs-editor-add-comment-button = + .title = შენიშვნის დამატება ## Main menu for adding/removing signatures diff --git a/l10n/kab/viewer.ftl b/l10n/kab/viewer.ftl index 0b5e7341706ce..c1a7957ca377c 100644 --- a/l10n/kab/viewer.ftl +++ b/l10n/kab/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } yibiten) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KAṬ ({ $size_b } ibiten) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MAṬ ({ $size_b } iṭamḍanen) pdfjs-document-properties-title = Azwel: pdfjs-document-properties-author = Ameskar: pdfjs-document-properties-subject = Amgay: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Azemz n usnifel: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Yerna-t: pdfjs-document-properties-producer = Afecku n uselket PDF: pdfjs-document-properties-version = Lqem PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Teḍra-d tuccḍa deg uskan n usebter. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -302,9 +286,13 @@ pdfjs-web-fonts-disabled = Tisefsiyin web ttwassensent; D awezɣi useqdec n tsef pdfjs-editor-free-text-button = .title = Aḍris +pdfjs-editor-color-picker-free-text-input = + .title = Senfel ini n uḍris pdfjs-editor-free-text-button-label = Aḍris pdfjs-editor-ink-button = .title = Suneɣ +pdfjs-editor-color-picker-ink-input = + .title = Senfel ini n usuneɣ pdfjs-editor-ink-button-label = Suneɣ pdfjs-editor-stamp-button = .title = Rnu neɣ ẓreg tugniwin @@ -316,6 +304,14 @@ pdfjs-highlight-floating-button1 = .title = Derrer .aria-label = Derrer pdfjs-highlight-floating-button-label = Derrer +pdfjs-comment-floating-button = + .title = Wennet + .aria-label = Wennet +pdfjs-comment-floating-button-label = Awennit +pdfjs-editor-comment-button = + .title = Wennet + .aria-label = Wennet +pdfjs-editor-comment-button-label = Awennit pdfjs-editor-signature-button = .title = Rnu azmul pdfjs-editor-signature-button-label = Rnu azmul @@ -378,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Amaẓrag n uḍris .default-content = Bdu tira… -pdfjs-free-text = - .aria-label = Amaẓrag n uḍris -pdfjs-free-text-default-content = Bdu tira... -pdfjs-ink = - .aria-label = Amaẓrag n usuneɣ -pdfjs-ink-canvas = - .aria-label = Tugna yettwarnan sɣur useqdac +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Awennit + *[other] Iwenniten + } +pdfjs-editor-comments-sidebar-close-button = + .title = Mdel agalis adisan + .aria-label = Mdel agalis adisan +pdfjs-editor-comments-sidebar-close-button-label = Mdel agalis adisan +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Twalaḍ ayen i ak⋅akem-iɛeǧben? Sebrureq-it, ternuḍ eǧǧ awennit. +pdfjs-editor-comments-sidebar-no-comments-link = Issin ugar ## Alt-text dialog pdfjs-editor-alt-text-button-label = Aḍris amaskal pdfjs-editor-alt-text-edit-button = .aria-label = Ẓreg aḍris amaskal -pdfjs-editor-alt-text-edit-button-label = Ẓreg aḍris amaskal pdfjs-editor-alt-text-dialog-label = Fren taxtirt pdfjs-editor-alt-text-dialog-description = Aḍris amaskal yettallel mi ara yili imdanen ur ttwalin ara tugna neɣ mi ara yili ur d-tuli ara. pdfjs-editor-alt-text-add-description-label = Rnu aglam @@ -411,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Tiɣmert n ufella n zelmeḍ — semsawi teɣzi -pdfjs-editor-resizer-label-top-middle = Talemmat n ufella — semsawi teɣzi -pdfjs-editor-resizer-label-top-right = Tiɣmert n ufella n yeffus — semsawi teɣzi -pdfjs-editor-resizer-label-middle-right = Talemmast tayeffust — semsawi teɣzi -pdfjs-editor-resizer-label-bottom-right = Tiɣmert n wadda n yeffus — semsawi teɣzi -pdfjs-editor-resizer-label-bottom-middle = Talemmat n wadda — semsawi teɣzi -pdfjs-editor-resizer-label-bottom-left = Tiɣmert n wadda n zelmeḍ — semsawi teɣzi -pdfjs-editor-resizer-label-middle-left = Talemmast tazelmdaḍt — semsawi teɣzi pdfjs-editor-resizer-top-left = .aria-label = Tiɣmert n ufella n zelmeḍ — semsawi teɣzi pdfjs-editor-resizer-top-middle = @@ -475,6 +470,7 @@ pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Issin ugar pdfjs-editor-new-alt-text-create-automatically-button-label = Rnu aḍris niḍen s wudem awurman pdfjs-editor-new-alt-text-not-now-button = Mačči tura pdfjs-editor-new-alt-text-error-title = D awezɣi timerna n uḍris niḍen s wudem awurman +pdfjs-editor-new-alt-text-error-description = Ttxil-k⋅m aru aḍris-ik⋅im niḍen neɣ ɛreḍ tikkelt niḍen. pdfjs-editor-new-alt-text-error-close-button = Mdel # Variables: # $totalSize (Number) - the total size (in MB) of the AI model. @@ -519,6 +515,9 @@ pdfjs-editor-alt-text-settings-close-button = Mdel ## Accessibility labels (announced by screen readers) for objects added to the editor. +pdfjs-editor-highlight-added-alert = Yettwarna usebrureq +pdfjs-editor-freetext-added-alert = Yettwarna uḍris +pdfjs-editor-ink-added-alert = Yettwarna usuneɣ pdfjs-editor-stamp-added-alert = Tugna tettwarna pdfjs-editor-signature-added-alert = Azmul yettwarna @@ -558,6 +557,10 @@ pdfjs-editor-add-signature-type-input = .placeholder = Zru azmul-ik pdfjs-editor-add-signature-draw-placeholder = Suneɣ azmul-ik pdfjs-editor-add-signature-draw-thickness-range-label = Tuzert +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Tuzert n usuneɣ: { $thickness } pdfjs-editor-add-signature-image-placeholder = Seḥnucceḍ afaylu da akken ad t-saliṭ pdfjs-editor-add-signature-image-browse-link = { PLATFORM() -> @@ -577,6 +580,8 @@ pdfjs-editor-add-signature-clear-button = pdfjs-editor-add-signature-save-checkbox = Sekles azmul pdfjs-editor-add-signature-image-upload-error-title = Ur izmir ara ad yessali tugna pdfjs-editor-add-signature-image-upload-error-description = Ssefqed tuqqna-inek⋅inem n uẓeṭṭa neɣ ɛreḍ tugna-nniḍen. +pdfjs-editor-add-signature-image-no-data-error-title = D awezɣi aselket n tugna-a ɣer uzmul +pdfjs-editor-add-signature-image-no-data-error-description = Ttxil-k⋅m ɛreḍ ad tzedmeḍ tugna niḍen pdfjs-editor-add-signature-error-close-button = Mdel ## Dialog buttons @@ -585,6 +590,25 @@ pdfjs-editor-add-signature-cancel-button = Semmet pdfjs-editor-add-signature-add-button = Rnu pdfjs-editor-edit-signature-update-button = Leqqem +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Ẓreg awennit +pdfjs-editor-edit-comment-popup-button = + .title = Ẓreg awennit +pdfjs-editor-delete-comment-popup-button-label = Kkes awennit +pdfjs-editor-delete-comment-popup-button = + .title = Kkes awennit + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Ẓreg awennit +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Rnu awennit +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Bdu tira... +pdfjs-editor-edit-comment-dialog-cancel-button = Sefsex + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/kk/viewer.ftl b/l10n/kk/viewer.ftl index 779fc89cd842f..e5f1d05bee614 100644 --- a/l10n/kk/viewer.ftl +++ b/l10n/kk/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байт) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байт) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байт) pdfjs-document-properties-title = Тақырыбы: pdfjs-document-properties-author = Авторы: pdfjs-document-properties-subject = Тақырыбы: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Түзету күні: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Жасаған: pdfjs-document-properties-producer = PDF өндірген: pdfjs-document-properties-version = PDF нұсқасы: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Парақты өңдеу кезінде қате кет ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -302,9 +286,13 @@ pdfjs-web-fonts-disabled = Веб қаріптері сөндірілген: қ pdfjs-editor-free-text-button = .title = Мәтін +pdfjs-editor-color-picker-free-text-input = + .title = Мәтін түсін өзгерту pdfjs-editor-free-text-button-label = Мәтін pdfjs-editor-ink-button = .title = Сурет салу +pdfjs-editor-color-picker-ink-input = + .title = Сызба түсін өзгерту pdfjs-editor-ink-button-label = Сурет салу pdfjs-editor-stamp-button = .title = Суреттерді қосу немесе түзету @@ -316,12 +304,31 @@ pdfjs-highlight-floating-button1 = .title = Ерекшелеу .aria-label = Ерекшелеу pdfjs-highlight-floating-button-label = Ерекшелеу +pdfjs-comment-floating-button = + .title = Түсіндірме + .aria-label = Түсіндірме +pdfjs-comment-floating-button-label = Түсіндірме +pdfjs-editor-comment-button = + .title = Түсіндірме + .aria-label = Түсіндірме +pdfjs-editor-comment-button-label = Түсіндірме pdfjs-editor-signature-button = .title = Қолтаңбаны қосу pdfjs-editor-signature-button-label = Қолтаңбаны қосу ## Default editor aria labels +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Ерекшелеу түзеткіші +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Сурет салу түзеткіші +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Қолтаңба түзеткіші: { $description } pdfjs-editor-stamp-editor = .aria-label = Сурет редакторы @@ -367,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Мәтін түзеткіші .default-content = Теріп бастаңыз… -pdfjs-free-text = - .aria-label = Мәтін түзеткіші -pdfjs-free-text-default-content = Теруді бастау… -pdfjs-ink = - .aria-label = Сурет түзеткіші -pdfjs-ink-canvas = - .aria-label = Пайдаланушы жасаған сурет +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Түсіндірмелер + *[other] Түсіндірмелер + } +pdfjs-editor-comments-sidebar-close-button = + .title = Бүйір панелін жабу + .aria-label = Бүйір панелін жабу +pdfjs-editor-comments-sidebar-close-button-label = Бүйір панелін жабу +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Назар аударарлық бірдеңе көрдіңіз бе? Оны ерекшелеп, түсіндірме қалдырыңыз. +pdfjs-editor-comments-sidebar-no-comments-link = Көбірек білу ## Alt-text dialog pdfjs-editor-alt-text-button-label = Балама мәтін pdfjs-editor-alt-text-edit-button = .aria-label = Балама мәтінді өңдеу -pdfjs-editor-alt-text-edit-button-label = Балама мәтінді өңдеу pdfjs-editor-alt-text-dialog-label = Опцияны таңдау pdfjs-editor-alt-text-dialog-description = Балама мәтін адамдар суретті көре алмағанда немесе ол жүктелмегенде көмектеседі. pdfjs-editor-alt-text-add-description-label = Сипаттаманы қосу @@ -400,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Жоғарғы сол жақ бұрыш — өлшемін өзгерту -pdfjs-editor-resizer-label-top-middle = Жоғарғы ортасы — өлшемін өзгерту -pdfjs-editor-resizer-label-top-right = Жоғарғы оң жақ бұрыш — өлшемін өзгерту -pdfjs-editor-resizer-label-middle-right = Ортаңғы оң жақ — өлшемін өзгерту -pdfjs-editor-resizer-label-bottom-right = Төменгі оң жақ бұрыш — өлшемін өзгерту -pdfjs-editor-resizer-label-bottom-middle = Төменгі ортасы — өлшемін өзгерту -pdfjs-editor-resizer-label-bottom-left = Төменгі сол жақ бұрыш — өлшемін өзгерту -pdfjs-editor-resizer-label-middle-left = Ортаңғы сол жақ — өлшемін өзгерту pdfjs-editor-resizer-top-left = .aria-label = Жоғарғы сол жақ бұрыш — өлшемін өзгерту pdfjs-editor-resizer-top-middle = @@ -515,6 +521,7 @@ pdfjs-editor-alt-text-settings-close-button = Жабу ## Accessibility labels (announced by screen readers) for objects added to the editor. +pdfjs-editor-highlight-added-alert = Ерекшелеу қосылды pdfjs-editor-freetext-added-alert = Мәтін қосылды pdfjs-editor-ink-added-alert = Сызба қосылды pdfjs-editor-stamp-added-alert = Сурет қосылды @@ -588,6 +595,8 @@ pdfjs-editor-add-signature-save-checkbox = Қолтаңбаны сақтау pdfjs-editor-add-signature-save-warning-message = Сақталған 5 қолтаңбаның шегіне жеттіңіз. Көбірек сақтау үшін біреуін алып тастаңыз. pdfjs-editor-add-signature-image-upload-error-title = Суретті жүктеп жіберу мүмкін емес. pdfjs-editor-add-signature-image-upload-error-description = Желі байланысын тексеріңіз немесе басқа бейнені қолданып көріңіз. +pdfjs-editor-add-signature-image-no-data-error-title = Бұл суретті қолтаңбаға түрлендіру мүмкін емес +pdfjs-editor-add-signature-image-no-data-error-description = Басқа суретті жүктеп салып көріңіз. pdfjs-editor-add-signature-error-close-button = Жабу ## Dialog buttons @@ -596,6 +605,34 @@ pdfjs-editor-add-signature-cancel-button = Бас тарту pdfjs-editor-add-signature-add-button = Қосу pdfjs-editor-edit-signature-update-button = Жаңарту +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Түсіндірмені түзету +pdfjs-editor-edit-comment-popup-button = + .title = Түсіндірмені түзету +pdfjs-editor-delete-comment-popup-button-label = Түсіндірмені өшіру +pdfjs-editor-delete-comment-popup-button = + .title = Түсіндірмені өшіру +pdfjs-show-comment-button = + .title = Түсіндірмені көрсету + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Түсіндірмені түзету +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Жаңарту +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Түсіндірмені қосу +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Қосу +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Теріп бастаңыз… +pdfjs-editor-edit-comment-dialog-cancel-button = Бас тарту + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Пікір қосу + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/km/viewer.ftl b/l10n/km/viewer.ftl index 86441a8010002..9cdd042998b48 100644 --- a/l10n/km/viewer.ftl +++ b/l10n/km/viewer.ftl @@ -71,24 +71,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = លក្ខណ​សម្បត្តិ​ឯកសារ… pdfjs-document-properties-file-name = ឈ្មោះ​ឯកសារ៖ pdfjs-document-properties-file-size = ទំហំ​ឯកសារ៖ -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } បៃ) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } បៃ) pdfjs-document-properties-title = ចំណងជើង៖ pdfjs-document-properties-author = អ្នក​និពន្ធ៖ pdfjs-document-properties-subject = ប្រធានបទ៖ pdfjs-document-properties-keywords = ពាក្យ​គន្លឹះ៖ pdfjs-document-properties-creation-date = កាលបរិច្ឆេទ​បង្កើត៖ pdfjs-document-properties-modification-date = កាលបរិច្ឆេទ​កែប្រែ៖ -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = អ្នក​បង្កើត៖ pdfjs-document-properties-producer = កម្មវិធី​បង្កើត PDF ៖ pdfjs-document-properties-version = កំណែ PDF ៖ diff --git a/l10n/kn/viewer.ftl b/l10n/kn/viewer.ftl index 4548231b18ef7..0da25c5152375 100644 --- a/l10n/kn/viewer.ftl +++ b/l10n/kn/viewer.ftl @@ -71,24 +71,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು... pdfjs-document-properties-file-name = ಕಡತದ ಹೆಸರು: pdfjs-document-properties-file-size = ಕಡತದ ಗಾತ್ರ: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ಬೈಟ್‍ಗಳು) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ಬೈಟ್‍ಗಳು) pdfjs-document-properties-title = ಶೀರ್ಷಿಕೆ: pdfjs-document-properties-author = ಕರ್ತೃ: pdfjs-document-properties-subject = ವಿಷಯ: pdfjs-document-properties-keywords = ಮುಖ್ಯಪದಗಳು: pdfjs-document-properties-creation-date = ರಚಿಸಿದ ದಿನಾಂಕ: pdfjs-document-properties-modification-date = ಮಾರ್ಪಡಿಸಲಾದ ದಿನಾಂಕ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = ರಚಿಸಿದವರು: pdfjs-document-properties-producer = PDF ಉತ್ಪಾದಕ: pdfjs-document-properties-version = PDF ಆವೃತ್ತಿ: diff --git a/l10n/ko/viewer.ftl b/l10n/ko/viewer.ftl index 7e16251891e91..2c6c821cb3ff7 100644 --- a/l10n/ko/viewer.ftl +++ b/l10n/ko/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } 바이트) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b }바이트) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b }바이트) pdfjs-document-properties-title = 제목: pdfjs-document-properties-author = 작성자: pdfjs-document-properties-subject = 주제: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = 수정 날짜: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = 작성 프로그램: pdfjs-document-properties-producer = PDF 변환 소프트웨어: pdfjs-document-properties-version = PDF 버전: @@ -267,10 +255,6 @@ pdfjs-rendering-error = 페이지를 렌더링하는 동안 오류가 발생했 ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -316,6 +300,10 @@ pdfjs-comment-floating-button = .title = 주석 .aria-label = 주석 pdfjs-comment-floating-button-label = 주석 +pdfjs-editor-comment-button = + .title = 주석 + .aria-label = 주석 +pdfjs-editor-comment-button-label = 주석 pdfjs-editor-signature-button = .title = 서명 추가 pdfjs-editor-signature-button-label = 서명 추가 @@ -377,21 +365,24 @@ pdfjs-editor-add-saved-signature-button = # .default-content is used as a placeholder in an empty text editor. pdfjs-free-text2 = .aria-label = 텍스트 편집기 - .default-content = 입력을 시작하세요… -pdfjs-free-text = - .aria-label = 텍스트 편집기 -pdfjs-free-text-default-content = 입력하세요… -pdfjs-ink = - .aria-label = 그리기 편집기 -pdfjs-ink-canvas = - .aria-label = 사용자 생성 이미지 + .default-content = 입력하세요… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = 주석 +pdfjs-editor-comments-sidebar-close-button = + .title = 사이드바 닫기 + .aria-label = 사이드바 닫기 +pdfjs-editor-comments-sidebar-close-button-label = 사이드바 닫기 +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = 눈에 띄는 내용이 있나요? 해당 부분을 강조 표시하고 주석을 남겨주세요. +pdfjs-editor-comments-sidebar-no-comments-link = 더 알아보기 ## Alt-text dialog pdfjs-editor-alt-text-button-label = 대체 텍스트 pdfjs-editor-alt-text-edit-button = .aria-label = 대체 텍스트 편집 -pdfjs-editor-alt-text-edit-button-label = 대체 텍스트 편집 pdfjs-editor-alt-text-dialog-label = 옵션을 선택하세요 pdfjs-editor-alt-text-dialog-description = 대체 텍스트는 사람들이 이미지를 볼 수 없거나 이미지가 로드되지 않을 때 도움이 됩니다. pdfjs-editor-alt-text-add-description-label = 설명 추가 @@ -411,14 +402,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = 왼쪽 위 — 크기 조정 -pdfjs-editor-resizer-label-top-middle = 가운데 위 - 크기 조정 -pdfjs-editor-resizer-label-top-right = 오른쪽 위 — 크기 조정 -pdfjs-editor-resizer-label-middle-right = 오른쪽 가운데 — 크기 조정 -pdfjs-editor-resizer-label-bottom-right = 오른쪽 아래 - 크기 조정 -pdfjs-editor-resizer-label-bottom-middle = 가운데 아래 — 크기 조정 -pdfjs-editor-resizer-label-bottom-left = 왼쪽 아래 - 크기 조정 -pdfjs-editor-resizer-label-middle-left = 왼쪽 가운데 — 크기 조정 pdfjs-editor-resizer-top-left = .aria-label = 왼쪽 위 — 크기 조정 pdfjs-editor-resizer-top-middle = @@ -606,25 +589,33 @@ pdfjs-editor-add-signature-cancel-button = 취소 pdfjs-editor-add-signature-add-button = 추가 pdfjs-editor-edit-signature-update-button = 업데이트 +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = 주석 편집 +pdfjs-editor-edit-comment-popup-button = + .title = 주석 편집 +pdfjs-editor-delete-comment-popup-button-label = 주석 제거 +pdfjs-editor-delete-comment-popup-button = + .title = 주석 제거 +pdfjs-show-comment-button = + .title = 주석 보기 + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = 동작 -pdfjs-editor-edit-comment-actions-button = - .title = 동작 -pdfjs-editor-edit-comment-close-button-label = 닫기 -pdfjs-editor-edit-comment-close-button = - .title = 닫기 -pdfjs-editor-edit-comment-actions-edit-button-label = 편집 -pdfjs-editor-edit-comment-actions-delete-button-label = 삭제 -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = 주석을 입력하세요 -pdfjs-editor-edit-comment-manager-cancel-button = 취소 -pdfjs-editor-edit-comment-manager-save-button = 저장 +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = 주석 편집 +pdfjs-editor-edit-comment-dialog-save-button-when-editing = 업데이트 +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = 주석 추가 +pdfjs-editor-edit-comment-dialog-save-button-when-adding = 추가 +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = 입력하세요… +pdfjs-editor-edit-comment-dialog-cancel-button = 취소 ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = 주석 편집 +pdfjs-editor-add-comment-button = + .title = 주석 추가 ## Main menu for adding/removing signatures diff --git a/l10n/lij/viewer.ftl b/l10n/lij/viewer.ftl index fd503ced8e805..8847b258dfa9e 100644 --- a/l10n/lij/viewer.ftl +++ b/l10n/lij/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Propietæ do documento… pdfjs-document-properties-file-name = Nomme schedaio: pdfjs-document-properties-file-size = Dimenscion schedaio: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } byte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) pdfjs-document-properties-title = Titolo: pdfjs-document-properties-author = Aoto: pdfjs-document-properties-subject = Ogetto: pdfjs-document-properties-keywords = Paròlle ciave: pdfjs-document-properties-creation-date = Dæta creaçion: pdfjs-document-properties-modification-date = Dæta cangiamento: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Aotô originale: pdfjs-document-properties-producer = Produtô PDF: pdfjs-document-properties-version = Verscion PDF: diff --git a/l10n/lo/viewer.ftl b/l10n/lo/viewer.ftl index fbce8d024a446..492c8cf1c8779 100644 --- a/l10n/lo/viewer.ftl +++ b/l10n/lo/viewer.ftl @@ -98,24 +98,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = ຄຸນສົມບັດເອກະສານ... pdfjs-document-properties-file-name = ຊື່ໄຟລ໌: pdfjs-document-properties-file-size = ຂະຫນາດໄຟລ໌: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ໄບຕ໌) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ໄບຕ໌) pdfjs-document-properties-title = ຫົວຂໍ້: pdfjs-document-properties-author = ຜູ້ຂຽນ: pdfjs-document-properties-subject = ຫົວຂໍ້: pdfjs-document-properties-keywords = ຄໍາທີ່ຕ້ອງການຄົ້ນຫາ: pdfjs-document-properties-creation-date = ວັນທີສ້າງ: pdfjs-document-properties-modification-date = ວັນທີແກ້ໄຂ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = ຜູ້ສ້າງ: pdfjs-document-properties-producer = ຜູ້ຜະລິດ PDF: pdfjs-document-properties-version = ເວີຊັ່ນ PDF: @@ -243,10 +231,6 @@ pdfjs-rendering-error = ມີຂໍ້ຜິດພາດເກີດຂື້ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -280,10 +264,3 @@ pdfjs-editor-free-text-size-input = ຂະຫນາດ pdfjs-editor-ink-color-input = ສີ pdfjs-editor-ink-thickness-input = ຄວາມຫນາ pdfjs-editor-ink-opacity-input = ຄວາມໂປ່ງໃສ -pdfjs-free-text = - .aria-label = ຕົວແກ້ໄຂຂໍ້ຄວາມ -pdfjs-free-text-default-content = ເລີ່ມພິມ... -pdfjs-ink = - .aria-label = ຕົວແກ້ໄຂຮູບແຕ້ມ -pdfjs-ink-canvas = - .aria-label = ຮູບພາບທີ່ຜູ້ໃຊ້ສ້າງ diff --git a/l10n/lt/viewer.ftl b/l10n/lt/viewer.ftl index ee082181a1492..f15d1f9dd9579 100644 --- a/l10n/lt/viewer.ftl +++ b/l10n/lt/viewer.ftl @@ -92,24 +92,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Dokumento savybės… pdfjs-document-properties-file-name = Failo vardas: pdfjs-document-properties-file-size = Failo dydis: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } B) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } B) pdfjs-document-properties-title = Antraštė: pdfjs-document-properties-author = Autorius: pdfjs-document-properties-subject = Tema: pdfjs-document-properties-keywords = Reikšminiai žodžiai: pdfjs-document-properties-creation-date = Sukūrimo data: pdfjs-document-properties-modification-date = Modifikavimo data: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Kūrėjas: pdfjs-document-properties-producer = PDF generatorius: pdfjs-document-properties-version = PDF versija: @@ -237,10 +225,6 @@ pdfjs-rendering-error = Atvaizduojant puslapį įvyko klaida. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/ltg/viewer.ftl b/l10n/ltg/viewer.ftl index b10bf59d0cb5b..d837f92d449bf 100644 --- a/l10n/ltg/viewer.ftl +++ b/l10n/ltg/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Dokumenta īstatiejumi… pdfjs-document-properties-file-name = Faila nūsaukums: pdfjs-document-properties-file-size = Faila izmārs: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } biti) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } biti) pdfjs-document-properties-title = Nūsaukums: pdfjs-document-properties-author = Autors: pdfjs-document-properties-subject = Tema: pdfjs-document-properties-keywords = Atslāgi vuordi: pdfjs-document-properties-creation-date = Izveides datums: pdfjs-document-properties-modification-date = lobuošonys datums: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Radeituojs: pdfjs-document-properties-producer = PDF producents: pdfjs-document-properties-version = PDF verseja: diff --git a/l10n/lv/viewer.ftl b/l10n/lv/viewer.ftl index ffec0bcca8777..e82433af296a9 100644 --- a/l10n/lv/viewer.ftl +++ b/l10n/lv/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Dokumenta iestatījumi… pdfjs-document-properties-file-name = Faila nosaukums: pdfjs-document-properties-file-size = Faila izmērs: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } biti) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } biti) pdfjs-document-properties-title = Nosaukums: pdfjs-document-properties-author = Autors: pdfjs-document-properties-subject = Tēma: pdfjs-document-properties-keywords = Atslēgas vārdi: pdfjs-document-properties-creation-date = Izveides datums: pdfjs-document-properties-modification-date = LAbošanas datums: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Radītājs: pdfjs-document-properties-producer = PDF producents: pdfjs-document-properties-version = PDF versija: diff --git a/l10n/meh/viewer.ftl b/l10n/meh/viewer.ftl index 1a6922a2c9b3b..43f1fef928e22 100644 --- a/l10n/meh/viewer.ftl +++ b/l10n/meh/viewer.ftl @@ -11,13 +11,6 @@ pdfjs-zoom-select = .title = Nasa´a ka´nu/Nasa´a luli pdfjs-open-file-button-label = Síne -## Document properties dialog - -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } - ## Variables: ## $width (Number) - the width of the (current) page ## $height (Number) - the height of the (current) page @@ -50,13 +43,6 @@ pdfjs-findbar-button-label = Nánuku # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## Annotations - -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } - ## Password pdfjs-password-cancel-button = Nkuvi-ka diff --git a/l10n/mk/viewer.ftl b/l10n/mk/viewer.ftl index 775f7f9984b43..2daeb8fec3b85 100644 --- a/l10n/mk/viewer.ftl +++ b/l10n/mk/viewer.ftl @@ -68,24 +68,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Својства на документот… pdfjs-document-properties-file-name = Име на датотека: pdfjs-document-properties-file-size = Големина на датотеката: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } бајти) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } бајти) pdfjs-document-properties-title = Наслов: pdfjs-document-properties-author = Автор: pdfjs-document-properties-subject = Тема: pdfjs-document-properties-keywords = Клучни зборови: pdfjs-document-properties-creation-date = Датум на создавање: pdfjs-document-properties-modification-date = Датум на промена: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Креатор: pdfjs-document-properties-version = Верзија на PDF: pdfjs-document-properties-page-count = Број на страници: @@ -186,13 +174,6 @@ pdfjs-missing-file-error = Недостасува PDF документ. pdfjs-unexpected-response-error = Неочекуван одговор од серверот. pdfjs-rendering-error = Настана грешка при прикажувањето на страницата. -## Annotations - -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } - ## Password pdfjs-password-label = Внесете ја лозинката за да ја отворите оваа датотека. diff --git a/l10n/ml/viewer.ftl b/l10n/ml/viewer.ftl index 8b887e0efbf34..9476c8d489a23 100644 --- a/l10n/ml/viewer.ftl +++ b/l10n/ml/viewer.ftl @@ -91,14 +91,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } ബൈറ്റുകൾ) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } കെബി ({ $size_b } ബൈറ്റുകള്‍) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } എംബി ({ $size_b } ബൈറ്റുകള്‍) pdfjs-document-properties-title = തലക്കെട്ട്‌ pdfjs-document-properties-author = രചയിതാവ്: pdfjs-document-properties-subject = വിഷയം: @@ -108,10 +100,6 @@ pdfjs-document-properties-modification-date = മാറ്റം വരുത് # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = സൃഷ്ടികര്‍ത്താവ്: pdfjs-document-properties-producer = പിഡിഎഫ് പ്രൊഡ്യൂസര്‍: pdfjs-document-properties-version = പിഡിഎഫ് പതിപ്പ്: @@ -246,10 +234,6 @@ pdfjs-rendering-error = താള്‍ റെണ്ടര്‍ ചെയ്യ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -325,16 +309,16 @@ pdfjs-editor-signature-add-signature-button-label = പുതിയ ഒപ്പ # $description (String) - a string describing/labeling the signature. pdfjs-editor-add-saved-signature-button = .title = കരുതിവച്ച ഒപ്പു് : { $description } -pdfjs-free-text-default-content = എഴുതാൻ തുടങ്ങുക… -pdfjs-ink-canvas = - .aria-label = ഉപയോക്താവ് ഉണ്ടാക്കിയ ചിത്രം +pdfjs-editor-comments-sidebar-close-button = + .title = അണിവക്കം അടയ്ക്കുക + .aria-label = അണിവക്കം അടയ്ക്കുക +pdfjs-editor-comments-sidebar-close-button-label = അണിവക്കം അടയ്ക്കുക ## Alt-text dialog pdfjs-editor-alt-text-button-label = മറുയെഴുത്തു് pdfjs-editor-alt-text-edit-button = .aria-label = മറുയെഴുത്തു് തിരുത്തുക -pdfjs-editor-alt-text-edit-button-label = മറുയെഴുത്തു് തിരുത്തുക pdfjs-editor-alt-text-dialog-label = സാധ്യത തിരഞ്ഞെടുക്കൂ pdfjs-editor-alt-text-add-description-label = ഒരു വിവരണം ചേർക്കുക pdfjs-editor-alt-text-cancel-button = റദ്ദാക്കുക @@ -346,17 +330,6 @@ pdfjs-editor-alt-text-textarea = pdfjs-editor-alt-text-button = .aria-label = മറുയെഴുത്തു് -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - -pdfjs-editor-resizer-label-top-left = ഇടതു മീത്ത മുക്ക് — വലുപ്പം മാറ്റുക -pdfjs-editor-resizer-label-top-middle = നടുവിൽ മീത്ത മുക്ക് - വലുപ്പം മാറ്റുക -pdfjs-editor-resizer-label-top-right = വലതു മീത്ത മുക്ക് — വലുപ്പം മാറ്റുക -pdfjs-editor-resizer-label-middle-right = വലതു നടുവിലുള്ള മുക്ക് — വലുപ്പം മാറ്റുക -pdfjs-editor-resizer-label-bottom-right = വലതു കീഴിലുള്ള മുക്ക് — വലുപ്പം മാറ്റുക -pdfjs-editor-resizer-label-bottom-middle = നടുവെ കീഴിലുള്ള മുക്ക് — വലുപ്പം മാറ്റുക -pdfjs-editor-resizer-label-bottom-left = ഇടതു കീഴിലുള്ള മുക്ക് — വലുപ്പം മാറ്റുക - ## Color picker # This means "Color used to highlight text" diff --git a/l10n/mr/viewer.ftl b/l10n/mr/viewer.ftl index 55b885864183e..fbb9698e69e1e 100644 --- a/l10n/mr/viewer.ftl +++ b/l10n/mr/viewer.ftl @@ -77,24 +77,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = दस्तऐवज गुणधर्म… pdfjs-document-properties-file-name = फाइलचे नाव: pdfjs-document-properties-file-size = फाइल आकार: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } बाइट्स) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } बाइट्स) pdfjs-document-properties-title = शिर्षक: pdfjs-document-properties-author = लेखक: pdfjs-document-properties-subject = विषय: pdfjs-document-properties-keywords = मुख्यशब्द: pdfjs-document-properties-creation-date = निर्माण दिनांक: pdfjs-document-properties-modification-date = दुरूस्ती दिनांक: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = निर्माता: pdfjs-document-properties-producer = PDF निर्माता: pdfjs-document-properties-version = PDF आवृत्ती: @@ -205,10 +193,6 @@ pdfjs-rendering-error = पृष्ठ दाखवतेवेळी त्र ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/ms/viewer.ftl b/l10n/ms/viewer.ftl index 4cbf58f871852..e5e8b1ec13d2e 100644 --- a/l10n/ms/viewer.ftl +++ b/l10n/ms/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Sifat Dokumen… pdfjs-document-properties-file-name = Nama fail: pdfjs-document-properties-file-size = Saiz fail: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bait) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bait) pdfjs-document-properties-title = Tajuk: pdfjs-document-properties-author = Pengarang: pdfjs-document-properties-subject = Subjek: pdfjs-document-properties-keywords = Kata kunci: pdfjs-document-properties-creation-date = Masa Dicipta: pdfjs-document-properties-modification-date = Tarikh Ubahsuai: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Pencipta: pdfjs-document-properties-producer = Pengeluar PDF: pdfjs-document-properties-version = Versi PDF: diff --git a/l10n/my/viewer.ftl b/l10n/my/viewer.ftl index 563bf965b665f..e6c6c35239343 100644 --- a/l10n/my/viewer.ftl +++ b/l10n/my/viewer.ftl @@ -65,24 +65,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ pdfjs-document-properties-file-name = ဖိုင် : pdfjs-document-properties-file-size = ဖိုင်ဆိုဒ် : -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } ကီလိုဘိုတ် ({ $size_b }ဘိုတ်) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = ခေါင်းစဉ်‌ - pdfjs-document-properties-author = ရေးသားသူ: pdfjs-document-properties-subject = အကြောင်းအရာ: pdfjs-document-properties-keywords = သော့ချက် စာလုံး: pdfjs-document-properties-creation-date = ထုတ်လုပ်ရက်စွဲ: pdfjs-document-properties-modification-date = ပြင်ဆင်ရက်စွဲ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = ဖန်တီးသူ: pdfjs-document-properties-producer = PDF ထုတ်လုပ်သူ: pdfjs-document-properties-version = PDF ဗားရှင်း: diff --git a/l10n/nb-NO/viewer.ftl b/l10n/nb-NO/viewer.ftl index 58e039d24a1e7..d960b866b0f1b 100644 --- a/l10n/nb-NO/viewer.ftl +++ b/l10n/nb-NO/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Dokumentegenskaper … pdfjs-document-properties-author = Forfatter: pdfjs-document-properties-subject = Emne: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Endret dato: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Opprettet av: pdfjs-document-properties-producer = PDF-verktøy: pdfjs-document-properties-version = PDF-versjon: @@ -275,10 +263,6 @@ pdfjs-rendering-error = En feil oppstod ved opptegning av siden. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Kommenter .aria-label = Kommenter pdfjs-comment-floating-button-label = Kommenter +pdfjs-editor-comment-button = + .title = Kommentar + .aria-label = Kommentar +pdfjs-editor-comment-button-label = Kommentar pdfjs-editor-signature-button = .title = Legg til signatur pdfjs-editor-signature-button-label = Legg til signatur @@ -364,7 +352,7 @@ pdfjs-editor-free-text-color-input = Farge pdfjs-editor-free-text-size-input = Størrelse pdfjs-editor-ink-color-input = Farge pdfjs-editor-ink-thickness-input = Tykkelse -pdfjs-editor-ink-opacity-input = Ugjennomsiktighet +pdfjs-editor-ink-opacity-input = Opasitet pdfjs-editor-stamp-add-image-button = .title = Legg til bilde pdfjs-editor-stamp-add-image-button-label = Legg til bilde @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Tekstredigering .default-content = Begynn å skrive… -pdfjs-free-text = - .aria-label = Tekstredigering -pdfjs-free-text-default-content = Begynn å skrive… -pdfjs-ink = - .aria-label = Tegneredigering -pdfjs-ink-canvas = - .aria-label = Brukerskapt bilde +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Kommentar + *[other] Kommentarer + } +pdfjs-editor-comments-sidebar-close-button = + .title = Lukk sidestolpen + .aria-label = Lukk sidestolpen +pdfjs-editor-comments-sidebar-close-button-label = Lukk sidestolpen +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Ser du noe verdt å merke seg? Marker det og legg igjen en kommentar. +pdfjs-editor-comments-sidebar-no-comments-link = Les mer ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternativ tekst pdfjs-editor-alt-text-edit-button = .aria-label = Rediger alternativ tekst -pdfjs-editor-alt-text-edit-button-label = Rediger alternativ tekst pdfjs-editor-alt-text-dialog-label = Velg et alternativ pdfjs-editor-alt-text-dialog-description = Alt-tekst (alternativ tekst) hjelper når folk ikke kan se bildet eller når det ikke lastes inn. pdfjs-editor-alt-text-add-description-label = Legg til en beskrivelse @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Øverste venstre hjørne – endre størrelse -pdfjs-editor-resizer-label-top-middle = Øverst i midten — endre størrelse -pdfjs-editor-resizer-label-top-right = Øverste høyre hjørne – endre størrelse -pdfjs-editor-resizer-label-middle-right = Midt til høyre – endre størrelse -pdfjs-editor-resizer-label-bottom-right = Nederste høyre hjørne – endre størrelse -pdfjs-editor-resizer-label-bottom-middle = Nederst i midten — endre størrelse -pdfjs-editor-resizer-label-bottom-left = Nederste venstre hjørne – endre størrelse -pdfjs-editor-resizer-label-middle-left = Midt til venstre — endre størrelse pdfjs-editor-resizer-top-left = .aria-label = Øverste venstre hjørne – endre størrelse pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Avbryt pdfjs-editor-add-signature-add-button = Legg til pdfjs-editor-edit-signature-update-button = Oppdater +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Rediger kommentar +pdfjs-editor-edit-comment-popup-button = + .title = Rediger kommentar +pdfjs-editor-delete-comment-popup-button-label = Fjern kommentar +pdfjs-editor-delete-comment-popup-button = + .title = Fjern kommentar +pdfjs-show-comment-button = + .title = Vis kommentar + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Handlinger -pdfjs-editor-edit-comment-actions-button = - .title = Handlinger -pdfjs-editor-edit-comment-close-button-label = Lukk -pdfjs-editor-edit-comment-close-button = - .title = Lukk -pdfjs-editor-edit-comment-actions-edit-button-label = Rediger -pdfjs-editor-edit-comment-actions-delete-button-label = Slett -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Skriv inn kommentaren din -pdfjs-editor-edit-comment-manager-cancel-button = Avbryt -pdfjs-editor-edit-comment-manager-save-button = Lagre +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Rediger kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Oppdater +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Legg til kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Legg til +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Begynn å skrive… +pdfjs-editor-edit-comment-dialog-cancel-button = Avbryt ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Rediger kommentar +pdfjs-editor-add-comment-button = + .title = Legg til kommentar ## Main menu for adding/removing signatures diff --git a/l10n/ne-NP/viewer.ftl b/l10n/ne-NP/viewer.ftl index b49096c0e42d2..38dac7a563cff 100644 --- a/l10n/ne-NP/viewer.ftl +++ b/l10n/ne-NP/viewer.ftl @@ -83,24 +83,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = कागजात विशेषताहरू... pdfjs-document-properties-file-name = फाइल नाम: pdfjs-document-properties-file-size = फाइल आकार: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = शीर्षक: pdfjs-document-properties-author = लेखक: pdfjs-document-properties-subject = विषयः pdfjs-document-properties-keywords = शब्दकुञ्जीः pdfjs-document-properties-creation-date = सिर्जना गरिएको मिति: pdfjs-document-properties-modification-date = परिमार्जित मिति: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = सर्जक: pdfjs-document-properties-producer = PDF निर्माता: pdfjs-document-properties-version = PDF संस्करण diff --git a/l10n/nl/viewer.ftl b/l10n/nl/viewer.ftl index f2a27ad0e3ec6..16c75bdeb4fa3 100644 --- a/l10n/nl/viewer.ftl +++ b/l10n/nl/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Auteur: pdfjs-document-properties-subject = Onderwerp: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Wijzigingsdatum: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Maker: pdfjs-document-properties-producer = PDF-producent: pdfjs-document-properties-version = PDF-versie: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Er is een fout opgetreden bij het weergeven van de pagin ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Opmerking .aria-label = Opmerking pdfjs-comment-floating-button-label = Opmerking +pdfjs-editor-comment-button = + .title = Opmerking + .aria-label = Opmerking +pdfjs-editor-comment-button-label = Opmerking pdfjs-editor-signature-button = .title = Handtekening toevoegen pdfjs-editor-signature-button-label = Handtekening toevoegen @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Tekstbewerker .default-content = Start met typen… -pdfjs-free-text = - .aria-label = Tekstbewerker -pdfjs-free-text-default-content = Begin met typen… -pdfjs-ink = - .aria-label = Tekeningbewerker -pdfjs-ink-canvas = - .aria-label = Door gebruiker gemaakte afbeelding +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Opmerking + *[other] Opmerkingen + } +pdfjs-editor-comments-sidebar-close-button = + .title = De zijbalk sluiten + .aria-label = De zijbalk sluiten +pdfjs-editor-comments-sidebar-close-button-label = De zijbalk sluiten +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Ziet u iets noemenswaardigs? Markeer het en laat een opmerking achter. +pdfjs-editor-comments-sidebar-no-comments-link = Meer info ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternatieve tekst pdfjs-editor-alt-text-edit-button = .aria-label = Alternatieve tekst bewerken -pdfjs-editor-alt-text-edit-button-label = Alternatieve tekst bewerken pdfjs-editor-alt-text-dialog-label = Kies een optie pdfjs-editor-alt-text-dialog-description = Alternatieve tekst helpt wanneer mensen de afbeelding niet kunnen zien of wanneer deze niet wordt geladen. pdfjs-editor-alt-text-add-description-label = Voeg een beschrijving toe @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Linkerbovenhoek – formaat wijzigen -pdfjs-editor-resizer-label-top-middle = Midden boven – formaat wijzigen -pdfjs-editor-resizer-label-top-right = Rechterbovenhoek – formaat wijzigen -pdfjs-editor-resizer-label-middle-right = Midden rechts – formaat wijzigen -pdfjs-editor-resizer-label-bottom-right = Rechterbenedenhoek – formaat wijzigen -pdfjs-editor-resizer-label-bottom-middle = Midden onder – formaat wijzigen -pdfjs-editor-resizer-label-bottom-left = Linkerbenedenhoek – formaat wijzigen -pdfjs-editor-resizer-label-middle-left = Links midden – formaat wijzigen pdfjs-editor-resizer-top-left = .aria-label = Linkerbovenhoek – formaat wijzigen pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Annuleren pdfjs-editor-add-signature-add-button = Toevoegen pdfjs-editor-edit-signature-update-button = Bijwerken +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Opmerking bewerken +pdfjs-editor-edit-comment-popup-button = + .title = Opmerking bewerken +pdfjs-editor-delete-comment-popup-button-label = Opmerking verwijderen +pdfjs-editor-delete-comment-popup-button = + .title = Opmerking verwijderen +pdfjs-show-comment-button = + .title = Opmerking tonen + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Acties -pdfjs-editor-edit-comment-actions-button = - .title = Acties -pdfjs-editor-edit-comment-close-button-label = Sluiten -pdfjs-editor-edit-comment-close-button = - .title = Sluiten -pdfjs-editor-edit-comment-actions-edit-button-label = Bewerken -pdfjs-editor-edit-comment-actions-delete-button-label = Verwijderen -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Voer uw opmerking in -pdfjs-editor-edit-comment-manager-cancel-button = Annuleren -pdfjs-editor-edit-comment-manager-save-button = Opslaan +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Opmerking bewerken +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Bijwerken +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Opmerking toevoegen +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Toevoegen +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Begin met typen… +pdfjs-editor-edit-comment-dialog-cancel-button = Annuleren ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Opmerking bewerken +pdfjs-editor-add-comment-button = + .title = Opmerking toevoegen ## Main menu for adding/removing signatures diff --git a/l10n/nn-NO/viewer.ftl b/l10n/nn-NO/viewer.ftl index 09145eee7b52f..574722678c46e 100644 --- a/l10n/nn-NO/viewer.ftl +++ b/l10n/nn-NO/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Tittel: pdfjs-document-properties-author = Forfattar: pdfjs-document-properties-subject = Emne: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Dato endra: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Oppretta av: pdfjs-document-properties-producer = PDF-verktøy: pdfjs-document-properties-version = PDF-versjon: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Ein feil oppstod under vising av sida. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Kommenter .aria-label = Kommenter pdfjs-comment-floating-button-label = Kommenter +pdfjs-editor-comment-button = + .title = Kommentar + .aria-label = Kommentar +pdfjs-editor-comment-button-label = Kommentar pdfjs-editor-signature-button = .title = Legg til signatur pdfjs-editor-signature-button-label = Legg til signatur @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Tekstredigering .default-content = Begynn å skrive… -pdfjs-free-text = - .aria-label = Tekstredigering -pdfjs-free-text-default-content = Byrje å skrive… -pdfjs-ink = - .aria-label = Teikneredigering -pdfjs-ink-canvas = - .aria-label = Brukarskapt bilde +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Kommentarar + *[other] Kommentararar + } +pdfjs-editor-comments-sidebar-close-button = + .title = Lat att sidestolpen + .aria-label = Lat att sidestolpen +pdfjs-editor-comments-sidebar-close-button-label = Lat att sidestolpen +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Ser du noko som er verdt å merke seg? Marker det og legg igjen ein kommentar. +pdfjs-editor-comments-sidebar-no-comments-link = Les meir ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alt-tekst pdfjs-editor-alt-text-edit-button = .aria-label = Rediger alt-tekst tekst -pdfjs-editor-alt-text-edit-button-label = Rediger alternativ tekst pdfjs-editor-alt-text-dialog-label = Vel eit alternativ pdfjs-editor-alt-text-dialog-description = Alt-tekst (alternativ tekst) hjelper når folk ikkje kan sjå bildet eller når det ikkje vert lasta inn. pdfjs-editor-alt-text-add-description-label = Legg til ei skildring @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Øvste venstre hjørne – endre størrelse -pdfjs-editor-resizer-label-top-middle = Øvst i midten — endre størrelse -pdfjs-editor-resizer-label-top-right = Øvste høgre hjørne – endre størrelse -pdfjs-editor-resizer-label-middle-right = Midt til høgre – endre størrelse -pdfjs-editor-resizer-label-bottom-right = Nedste høgre hjørne – endre størrelse -pdfjs-editor-resizer-label-bottom-middle = Nedst i midten — endre størrelse -pdfjs-editor-resizer-label-bottom-left = Nedste venstre hjørne – endre størrelse -pdfjs-editor-resizer-label-middle-left = Midt til venstre — endre størrelse pdfjs-editor-resizer-top-left = .aria-label = Øvste venstre hjørne – endre størrelse pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Avbryt pdfjs-editor-add-signature-add-button = Legg til pdfjs-editor-edit-signature-update-button = Oppdater +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Rediger kommentar +pdfjs-editor-edit-comment-popup-button = + .title = Rediger kommentar +pdfjs-editor-delete-comment-popup-button-label = Fjern kommentar +pdfjs-editor-delete-comment-popup-button = + .title = Fjern kommentar +pdfjs-show-comment-button = + .title = Vis kommentar + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Handlingar -pdfjs-editor-edit-comment-actions-button = - .title = Handlingar -pdfjs-editor-edit-comment-close-button-label = Lat att -pdfjs-editor-edit-comment-close-button = - .title = Lat att -pdfjs-editor-edit-comment-actions-edit-button-label = Rediger -pdfjs-editor-edit-comment-actions-delete-button-label = Slett -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Skriv inn kommentaren din -pdfjs-editor-edit-comment-manager-cancel-button = Avbryt -pdfjs-editor-edit-comment-manager-save-button = Lagre +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Rediger kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Oppdater +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Legg til kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Legg til +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Byrje å skrive… +pdfjs-editor-edit-comment-dialog-cancel-button = Avbryt ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Rediger kommentar +pdfjs-editor-add-comment-button = + .title = Legg til kommentar ## Main menu for adding/removing signatures diff --git a/l10n/oc/viewer.ftl b/l10n/oc/viewer.ftl index 5f73201cb3387..eb18c13694fcc 100644 --- a/l10n/oc/viewer.ftl +++ b/l10n/oc/viewer.ftl @@ -104,24 +104,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Proprietats del document… pdfjs-document-properties-file-name = Nom del fichièr : pdfjs-document-properties-file-size = Talha del fichièr : -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } Ko ({ $size_b } octets) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } Mo ({ $size_b } octets) pdfjs-document-properties-title = Títol : pdfjs-document-properties-author = Autor : pdfjs-document-properties-subject = Subjècte : pdfjs-document-properties-keywords = Mots claus : pdfjs-document-properties-creation-date = Data de creacion : pdfjs-document-properties-modification-date = Data de modificacion : -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, a { $time } pdfjs-document-properties-creator = Creator : pdfjs-document-properties-producer = Aisina de conversion PDF : pdfjs-document-properties-version = Version PDF : @@ -264,10 +252,6 @@ pdfjs-rendering-error = Una error s'es producha pendent l'afichatge de la pagina ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } a { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -334,18 +318,10 @@ pdfjs-editor-free-highlight-thickness-input = Espessor pdfjs-free-text2 = .aria-label = Editor de tèxte .default-content = Començatz de picar… -pdfjs-free-text = - .aria-label = Editor de tèxte -pdfjs-free-text-default-content = Començatz d’escriure… -pdfjs-ink = - .aria-label = Editor de dessenh -pdfjs-ink-canvas = - .aria-label = Imatge creat per l’utilizaire ## Alt-text dialog pdfjs-editor-alt-text-button-label = Tèxt alternatiu -pdfjs-editor-alt-text-edit-button-label = Modificar lo tèxt alternatiu pdfjs-editor-alt-text-dialog-label = Causir una opcion pdfjs-editor-alt-text-add-description-label = Apondre una descripcion pdfjs-editor-alt-text-cancel-button = Anullar diff --git a/l10n/pa-IN/viewer.ftl b/l10n/pa-IN/viewer.ftl index 1cb2690d5a86d..3bc17e2cce20c 100644 --- a/l10n/pa-IN/viewer.ftl +++ b/l10n/pa-IN/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } ਬਾਈਟ) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ਬਾਈਟ) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ਬਾਈਟ) pdfjs-document-properties-title = ਟਾਈਟਲ: pdfjs-document-properties-author = ਲੇਖਕ: pdfjs-document-properties-subject = ਵਿਸ਼ਾ: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = ਸੋਧ ਦੀ ਮਿਤੀ: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = ਨਿਰਮਾਤਾ: pdfjs-document-properties-producer = PDF ਪ੍ਰੋਡਿਊਸਰ: pdfjs-document-properties-version = PDF ਵਰਜਨ: @@ -275,10 +263,6 @@ pdfjs-rendering-error = ਸਫ਼ਾ ਰੈਡਰ ਕਰਨ ਦੇ ਦੌਰਾ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = ਟਿੱਪਣੀ .aria-label = ਟਿੱਪਣੀ pdfjs-comment-floating-button-label = ਟਿੱਪਣੀ +pdfjs-editor-comment-button = + .title = ਟਿੱਪਣੀ + .aria-label = ਟਿੱਪਣੀ +pdfjs-editor-comment-button-label = ਟਿੱਪਣੀ pdfjs-editor-signature-button = .title = ਦਸਤਖ਼ਤ ਜੋੜੋ pdfjs-editor-signature-button-label = ਦਸਤਖ਼ਤ ਜੋੜੋ @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = ਲਿਖਤ ਐਡੀਟਰ .default-content = …ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰੋ -pdfjs-free-text = - .aria-label = ਲਿਖਤ ਐਡੀਟਰ -pdfjs-free-text-default-content = …ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰੋ -pdfjs-ink = - .aria-label = ਵਹਾਉਣ ਐਡੀਟਰ -pdfjs-ink-canvas = - .aria-label = ਵਰਤੋਂਕਾਰ ਵਲੋਂ ਬਣਾਇਆ ਚਿੱਤਰ +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] ਟਿੱਪਣੀ + *[other] ਟਿੱਪਣੀਆਂ + } +pdfjs-editor-comments-sidebar-close-button = + .title = ਬਾਹੀ ਨੂੰ ਬੰਦ ਕਰੋ + .aria-label = ਬਾਹੀ ਨੂੰ ਬੰਦ ਕਰੋ +pdfjs-editor-comments-sidebar-close-button-label = ਬਾਹੀ ਨੂੰ ਬੰਦ ਕਰੋ +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ਕੀ ਕੁਝ ਧਿਆਨ ਦੇਣ ਯੋਗ ਵੇਖਿਆ ਹੈ? ਇਸ ਨੂੰ ਉਘਾੜੋ ਅਤੇ ਟਿੱਪਣੀ ਦਿਓ। +pdfjs-editor-comments-sidebar-no-comments-link = ਹੋਰ ਜਾਣੋ ## Alt-text dialog pdfjs-editor-alt-text-button-label = ਬਦਲਵੀਂ ਲਿਖਤ pdfjs-editor-alt-text-edit-button = .aria-label = ਬਦਲਵੀ ਲਿਖਤ ਨੂੰ ਸੋਧੋ -pdfjs-editor-alt-text-edit-button-label = ਬਦਲਵੀ ਲਿਖਤ ਨੂੰ ਸੋਧੋ pdfjs-editor-alt-text-dialog-label = ਚੋਣ ਕਰੋ pdfjs-editor-alt-text-dialog-description = ਚਿੱਤਰ ਨਾ ਦਿੱਸਣ ਜਾਂ ਲੋਡ ਨਾ ਹੋਣ ਦੀ ਹਾਲਤ ਵਿੱਚ Alt ਲਿਖਤ (ਬਦਲਵੀਂ ਲਿਖਤ) ਲੋਕਾਂ ਲਈ ਮਦਦਗਾਰ ਹੁੰਦੀ ਹੈ। pdfjs-editor-alt-text-add-description-label = ਵਰਣਨ ਜੋੜੋ @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = ਉੱਤੇ ਖੱਬਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-top-middle = ਉੱਤੇ ਮੱਧ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-top-right = ਉੱਤੇ ਸੱਜਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-middle-right = ਮੱਧ ਸੱਜਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-bottom-right = ਹੇਠਾਂ ਸੱਜਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-bottom-middle = ਹੇਠਾਂ ਮੱਧ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-bottom-left = ਹੇਠਾਂ ਖੱਬਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-middle-left = ਮੱਧ ਖੱਬਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ pdfjs-editor-resizer-top-left = .aria-label = ਉੱਤੇ ਖੱਬਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = ਰੱਦ ਕਰੋ pdfjs-editor-add-signature-add-button = ਜੋੜੋ pdfjs-editor-edit-signature-update-button = ਅੱਪਡੇਟ +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = ਟਿੱਪਣੀ ਨੂੰ ਸੋਧੋ +pdfjs-editor-edit-comment-popup-button = + .title = ਟਿੱਪਣੀ ਨੂੰ ਸੋਧੋ +pdfjs-editor-delete-comment-popup-button-label = ਟਿੱਪਣੀ ਨੂੰ ਹਟਾਓ +pdfjs-editor-delete-comment-popup-button = + .title = ਟਿੱਪਣੀ ਨੂੰ ਹਟਾਓ +pdfjs-show-comment-button = + .title = ਟਿੱਪਣੀ ਨੂੰ ਵੇਖਾਓ + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = ਕਾਰਵਾਈਆਂ -pdfjs-editor-edit-comment-actions-button = - .title = ਕਾਰਵਾਈਆਂ -pdfjs-editor-edit-comment-close-button-label = ਬੰਦ ਕਰੋ -pdfjs-editor-edit-comment-close-button = - .title = ਬੰਦ ਕਰੋ -pdfjs-editor-edit-comment-actions-edit-button-label = ਸੋਧੋ -pdfjs-editor-edit-comment-actions-delete-button-label = ਹਟਾਓ -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = ਆਪਣੀ ਟਿੱਪਣੀ ਦਿਓ -pdfjs-editor-edit-comment-manager-cancel-button = ਰੱਦ ਕਰੋ -pdfjs-editor-edit-comment-manager-save-button = ਸੰਭਾਲੋ +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = ਟਿੱਪਣੀ ਨੂੰ ਸੋਧੋ +pdfjs-editor-edit-comment-dialog-save-button-when-editing = ਅੱਪਡੇਟ ਕਰੋ +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = ਟਿੱਪਣੀ ਜੋੜੋ +pdfjs-editor-edit-comment-dialog-save-button-when-adding = ਜੋੜੋ +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = …ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰੋ +pdfjs-editor-edit-comment-dialog-cancel-button = ਰੱਦ ਕਰੋ ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = ਟਿੱਪਣੀ ਨੂੰ ਸੋਧੋ +pdfjs-editor-add-comment-button = + .title = ਟਿੱਪਣੀ ਜੋੜੋ ## Main menu for adding/removing signatures diff --git a/l10n/pl/viewer.ftl b/l10n/pl/viewer.ftl index 64833736e67b8..eba66a55bf68c 100644 --- a/l10n/pl/viewer.ftl +++ b/l10n/pl/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } B) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } B) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } B) pdfjs-document-properties-title = Tytuł: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Temat: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Data modyfikacji: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Utworzony przez: pdfjs-document-properties-producer = PDF wyprodukowany przez: pdfjs-document-properties-version = Wersja PDF: @@ -277,10 +265,6 @@ pdfjs-rendering-error = Podczas renderowania strony wystąpił błąd. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -326,6 +310,10 @@ pdfjs-comment-floating-button = .title = Dodaj komentarz .aria-label = Dodaj komentarz pdfjs-comment-floating-button-label = Dodaj komentarz +pdfjs-editor-comment-button = + .title = Dodaj komentarz + .aria-label = Dodaj komentarz +pdfjs-editor-comment-button-label = Dodaj komentarz pdfjs-editor-signature-button = .title = Dodaj podpis pdfjs-editor-signature-button-label = Dodaj podpis @@ -388,20 +376,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Edytor tekstu .default-content = Zacznij pisać… -pdfjs-free-text = - .aria-label = Edytor tekstu -pdfjs-free-text-default-content = Zacznij pisać… -pdfjs-ink = - .aria-label = Edytor rysunku -pdfjs-ink-canvas = - .aria-label = Obraz utworzony przez użytkownika +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Komentarz + *[other] Komentarze + } +pdfjs-editor-comments-sidebar-close-button = + .title = Zamknij panel boczny + .aria-label = Zamknij panel boczny +pdfjs-editor-comments-sidebar-close-button-label = Zamknij panel boczny +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Widzisz coś godnego uwagi? Wyróżnij to i zostaw komentarz. +pdfjs-editor-comments-sidebar-no-comments-link = Więcej informacji ## Alt-text dialog pdfjs-editor-alt-text-button-label = Tekst alternatywny pdfjs-editor-alt-text-edit-button = .aria-label = Edytuj tekst alternatywny -pdfjs-editor-alt-text-edit-button-label = Edytuj tekst alternatywny pdfjs-editor-alt-text-dialog-label = Wybierz opcję pdfjs-editor-alt-text-dialog-description = Tekst alternatywny pomaga, kiedy ktoś nie może zobaczyć obrazu lub gdy się nie wczytuje. pdfjs-editor-alt-text-add-description-label = Dodaj opis @@ -421,14 +416,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Lewy górny róg — zmień rozmiar -pdfjs-editor-resizer-label-top-middle = Górny środkowy — zmień rozmiar -pdfjs-editor-resizer-label-top-right = Prawy górny róg — zmień rozmiar -pdfjs-editor-resizer-label-middle-right = Prawy środkowy — zmień rozmiar -pdfjs-editor-resizer-label-bottom-right = Prawy dolny róg — zmień rozmiar -pdfjs-editor-resizer-label-bottom-middle = Dolny środkowy — zmień rozmiar -pdfjs-editor-resizer-label-bottom-left = Lewy dolny róg — zmień rozmiar -pdfjs-editor-resizer-label-middle-left = Lewy środkowy — zmień rozmiar pdfjs-editor-resizer-top-left = .aria-label = Lewy górny róg — zmień rozmiar pdfjs-editor-resizer-top-middle = @@ -621,25 +608,33 @@ pdfjs-editor-add-signature-cancel-button = Anuluj pdfjs-editor-add-signature-add-button = Dodaj pdfjs-editor-edit-signature-update-button = Aktualizuj +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Edytuj komentarz +pdfjs-editor-edit-comment-popup-button = + .title = Edytuj komentarz +pdfjs-editor-delete-comment-popup-button-label = Usuń komentarz +pdfjs-editor-delete-comment-popup-button = + .title = Usuń komentarz +pdfjs-show-comment-button = + .title = Wyświetl komentarz + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Działania -pdfjs-editor-edit-comment-actions-button = - .title = Działania -pdfjs-editor-edit-comment-close-button-label = Zamknij -pdfjs-editor-edit-comment-close-button = - .title = Zamknij -pdfjs-editor-edit-comment-actions-edit-button-label = Edytuj -pdfjs-editor-edit-comment-actions-delete-button-label = Usuń -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Napisz komentarz -pdfjs-editor-edit-comment-manager-cancel-button = Anuluj -pdfjs-editor-edit-comment-manager-save-button = Zapisz +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Edytuj komentarz +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizuj +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Dodaj komentarz +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Dodaj +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Zacznij pisać… +pdfjs-editor-edit-comment-dialog-cancel-button = Anuluj ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Edytuj komentarz +pdfjs-editor-add-comment-button = + .title = Dodaj komentarz ## Main menu for adding/removing signatures diff --git a/l10n/pt-BR/viewer.ftl b/l10n/pt-BR/viewer.ftl index 932f011edb6b3..cfca256ddbad6 100644 --- a/l10n/pt-BR/viewer.ftl +++ b/l10n/pt-BR/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Assunto: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Data da modificação: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Criação: pdfjs-document-properties-producer = Criador do PDF: pdfjs-document-properties-version = Versão do PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Ocorreu um erro ao renderizar a página. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Comentário .aria-label = Comentário pdfjs-comment-floating-button-label = Comentário +pdfjs-editor-comment-button = + .title = Comentar + .aria-label = Comentar +pdfjs-editor-comment-button-label = Comentar pdfjs-editor-signature-button = .title = Adicionar assinatura pdfjs-editor-signature-button-label = Adicionar assinatura @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Editor de texto .default-content = Comece a digitar… -pdfjs-free-text = - .aria-label = Editor de texto -pdfjs-free-text-default-content = Comece digitando… -pdfjs-ink = - .aria-label = Editor de desenho -pdfjs-ink-canvas = - .aria-label = Imagem criada pelo usuário +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentário + *[other] Comentários + } +pdfjs-editor-comments-sidebar-close-button = + .title = Fechar painel lateral + .aria-label = Fechar painel lateral +pdfjs-editor-comments-sidebar-close-button-label = Fechar painel lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Viu algo digno de atenção? Destaque e deixe um comentário. +pdfjs-editor-comments-sidebar-no-comments-link = Saiba mais ## Alt-text dialog pdfjs-editor-alt-text-button-label = Texto alternativo pdfjs-editor-alt-text-edit-button = .aria-label = Editar texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar texto alternativo pdfjs-editor-alt-text-dialog-label = Escolha uma opção pdfjs-editor-alt-text-dialog-description = O texto alternativo ajuda quando uma imagem não aparece ou não é carregada. pdfjs-editor-alt-text-add-description-label = Adicionar uma descrição @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Canto superior esquerdo — redimensionar -pdfjs-editor-resizer-label-top-middle = No centro do topo — redimensionar -pdfjs-editor-resizer-label-top-right = Canto superior direito — redimensionar -pdfjs-editor-resizer-label-middle-right = No meio à direita — redimensionar -pdfjs-editor-resizer-label-bottom-right = Canto inferior direito — redimensionar -pdfjs-editor-resizer-label-bottom-middle = No centro da base — redimensionar -pdfjs-editor-resizer-label-bottom-left = Canto inferior esquerdo — redimensionar -pdfjs-editor-resizer-label-middle-left = No meio à esquerda — redimensionar pdfjs-editor-resizer-top-left = .aria-label = Canto superior esquerdo — redimensionar pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Cancelar pdfjs-editor-add-signature-add-button = Adicionar pdfjs-editor-edit-signature-update-button = Atualizar +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editar comentário +pdfjs-editor-edit-comment-popup-button = + .title = Editar comentário +pdfjs-editor-delete-comment-popup-button-label = Remover comentário +pdfjs-editor-delete-comment-popup-button = + .title = Remover comentário +pdfjs-show-comment-button = + .title = Mostrar comentário + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Ações -pdfjs-editor-edit-comment-actions-button = - .title = Ações -pdfjs-editor-edit-comment-close-button-label = Fechar -pdfjs-editor-edit-comment-close-button = - .title = Fechar -pdfjs-editor-edit-comment-actions-edit-button-label = Editar -pdfjs-editor-edit-comment-actions-delete-button-label = Excluir -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Digite seu comentário -pdfjs-editor-edit-comment-manager-cancel-button = Cancelar -pdfjs-editor-edit-comment-manager-save-button = Salvar +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentário +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Atualizar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Adicionar comentário +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Adicionar +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Começar a digitar… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Editar comentário +pdfjs-editor-add-comment-button = + .title = Adicionar comentário ## Main menu for adding/removing signatures diff --git a/l10n/pt-PT/viewer.ftl b/l10n/pt-PT/viewer.ftl index d7974fa1440c4..e362fb7015f9b 100644 --- a/l10n/pt-PT/viewer.ftl +++ b/l10n/pt-PT/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Assunto: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Data de modificação: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Criador: pdfjs-document-properties-producer = Produtor de PDF: pdfjs-document-properties-version = Versão do PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Ocorreu um erro ao processar a página. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -378,20 +362,12 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Editor de texto .default-content = Comece a escrever… -pdfjs-free-text = - .aria-label = Editor de texto -pdfjs-free-text-default-content = Começar a digitar… -pdfjs-ink = - .aria-label = Editor de desenho -pdfjs-ink-canvas = - .aria-label = Imagem criada pelo utilizador ## Alt-text dialog pdfjs-editor-alt-text-button-label = Texto alternativo pdfjs-editor-alt-text-edit-button = .aria-label = Editar texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar texto alternativo pdfjs-editor-alt-text-dialog-label = Escolher uma opção pdfjs-editor-alt-text-dialog-description = O texto alternativo (texto alternativo) ajuda quando as pessoas não conseguem ver a imagem ou quando a mesma não é carregada. pdfjs-editor-alt-text-add-description-label = Adicionar uma descrição @@ -411,14 +387,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Canto superior esquerdo — redimensionar -pdfjs-editor-resizer-label-top-middle = Superior ao centro — redimensionar -pdfjs-editor-resizer-label-top-right = Canto superior direito — redimensionar -pdfjs-editor-resizer-label-middle-right = Centro à direita — redimensionar -pdfjs-editor-resizer-label-bottom-right = Canto inferior direito — redimensionar -pdfjs-editor-resizer-label-bottom-middle = Inferior ao centro — redimensionar -pdfjs-editor-resizer-label-bottom-left = Canto inferior esquerdo — redimensionar -pdfjs-editor-resizer-label-middle-left = Centro à esquerda — redimensionar pdfjs-editor-resizer-top-left = .aria-label = Canto superior esquerdo — redimensionar pdfjs-editor-resizer-top-middle = @@ -524,6 +492,11 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar editor de text pdfjs-editor-alt-text-settings-show-dialog-description = Ajuda a garantir que todas as suas imagens tenham um texto alternativo. pdfjs-editor-alt-text-settings-close-button = Fechar +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-stamp-added-alert = Imagem adicionada +pdfjs-editor-signature-added-alert = Assinatura adicionada + ## "Annotations removed" bar pdfjs-editor-undo-bar-message-highlight = Destaque removido @@ -592,6 +565,8 @@ pdfjs-editor-add-signature-save-checkbox = Guardar assinatura pdfjs-editor-add-signature-save-warning-message = Atingiu o limite de 5 assinaturas guardadas. Remova uma para guardar mais. pdfjs-editor-add-signature-image-upload-error-title = Não foi possível carregar a imagem pdfjs-editor-add-signature-image-upload-error-description = Verifique a sua ligação à rede ou tente outra imagem. +pdfjs-editor-add-signature-image-no-data-error-title = Não é possível converter esta imagem para uma assinatura +pdfjs-editor-add-signature-image-no-data-error-description = Tente enviar uma imagem diferente. pdfjs-editor-add-signature-error-close-button = Fechar ## Dialog buttons @@ -600,6 +575,34 @@ pdfjs-editor-add-signature-cancel-button = Cancelar pdfjs-editor-add-signature-add-button = Adicionar pdfjs-editor-edit-signature-update-button = Atualizar +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editar comentário +pdfjs-editor-edit-comment-popup-button = + .title = Editar comentário +pdfjs-editor-delete-comment-popup-button-label = Remover comentário +pdfjs-editor-delete-comment-popup-button = + .title = Remover comentário +pdfjs-show-comment-button = + .title = Mostrar comentário + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentário +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Atualizar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Adicionar comentário +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Adicionar +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Comece a digitar… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Adicionar comentário + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/rm/viewer.ftl b/l10n/rm/viewer.ftl index 50b888bc9695e..e632848e06918 100644 --- a/l10n/rm/viewer.ftl +++ b/l10n/rm/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Autur: pdfjs-document-properties-subject = Tema: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Data da modificaziun: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date } { $time } pdfjs-document-properties-creator = Creà da: pdfjs-document-properties-producer = Creà il PDF cun: pdfjs-document-properties-version = Versiun da PDF: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Ina errur è cumparida cun visualisar questa pagina. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -302,9 +286,13 @@ pdfjs-web-fonts-disabled = Scrittiras dal web èn deactivadas: impussibel dad ut pdfjs-editor-free-text-button = .title = Text +pdfjs-editor-color-picker-free-text-input = + .title = Midar la colur dal text pdfjs-editor-free-text-button-label = Text pdfjs-editor-ink-button = .title = Dissegnar +pdfjs-editor-color-picker-ink-input = + .title = Midar la colur per dissegnar pdfjs-editor-ink-button-label = Dissegnar pdfjs-editor-stamp-button = .title = Agiuntar u modifitgar maletgs @@ -316,6 +304,14 @@ pdfjs-highlight-floating-button1 = .title = Marcar .aria-label = Marcar pdfjs-highlight-floating-button-label = Marcar +pdfjs-comment-floating-button = + .title = Commentar + .aria-label = Commentar +pdfjs-comment-floating-button-label = Commentar +pdfjs-editor-comment-button = + .title = Commentari + .aria-label = Commentari +pdfjs-editor-comment-button-label = Commentari pdfjs-editor-signature-button = .title = Agiuntar ina signatura pdfjs-editor-signature-button-label = Agiuntar ina signatura @@ -378,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Editur da text .default-content = Cumenza a tippar… -pdfjs-free-text = - .aria-label = Editur da text -pdfjs-free-text-default-content = Cumenzar a tippar… -pdfjs-ink = - .aria-label = Editur dissegn -pdfjs-ink-canvas = - .aria-label = Maletg creà da l'utilisader +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Commentari + *[other] Commentaris + } +pdfjs-editor-comments-sidebar-close-button = + .title = Serrar la trav laterala + .aria-label = Serrar la trav laterala +pdfjs-editor-comments-sidebar-close-button-label = Serrar la trav laterala +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vesas insatge interessant? Marchescha la passascha ed agiuntescha in commentari. +pdfjs-editor-comments-sidebar-no-comments-link = Ulteriuras infurmaziuns ## Alt-text dialog pdfjs-editor-alt-text-button-label = Text alternativ pdfjs-editor-alt-text-edit-button = .aria-label = Modifitgar il text alternativ -pdfjs-editor-alt-text-edit-button-label = Modifitgar il text alternativ pdfjs-editor-alt-text-dialog-label = Tscherner ina opziun pdfjs-editor-alt-text-dialog-description = Il text alternativ (alt text) gida en cas che persunas na vesan betg il maletg u sch'i na reussescha betg d'al chargiar. pdfjs-editor-alt-text-add-description-label = Agiuntar ina descripziun @@ -411,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Chantun sura a sanestra — redimensiunar -pdfjs-editor-resizer-label-top-middle = Sura amez — redimensiunar -pdfjs-editor-resizer-label-top-right = Chantun sura a dretga — redimensiunar -pdfjs-editor-resizer-label-middle-right = Da vart dretga amez — redimensiunar -pdfjs-editor-resizer-label-bottom-right = Chantun sut a dretga — redimensiunar -pdfjs-editor-resizer-label-bottom-middle = Sutvart amez — redimensiunar -pdfjs-editor-resizer-label-bottom-left = Chantun sut a sanestra — redimensiunar -pdfjs-editor-resizer-label-middle-left = Vart sanestra amez — redimensiunar pdfjs-editor-resizer-top-left = .aria-label = Chantun sura a sanestra — redimensiunar pdfjs-editor-resizer-top-middle = @@ -524,6 +519,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Mussar l’editur per pdfjs-editor-alt-text-settings-show-dialog-description = Ta gida a garantir che tut tes maletgs hajan in text alternativ. pdfjs-editor-alt-text-settings-close-button = Serrar +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Agiuntà ina emfasa +pdfjs-editor-freetext-added-alert = Agiuntà in text +pdfjs-editor-ink-added-alert = Agiuntà in dissegn +pdfjs-editor-stamp-added-alert = Agiuntà in maletg +pdfjs-editor-signature-added-alert = Agiuntà ina signatura + ## "Annotations removed" bar pdfjs-editor-undo-bar-message-highlight = Allontanà la marcaziun @@ -592,6 +595,8 @@ pdfjs-editor-add-signature-save-checkbox = Memorisar la signatura pdfjs-editor-add-signature-save-warning-message = Ti has cuntanschì il dumber maximal da 5 signaturas memorisadas. Allontanar ina per memorisar in’autra. pdfjs-editor-add-signature-image-upload-error-title = Impussibel da transferir il maletg pdfjs-editor-add-signature-image-upload-error-description = Controllescha tia connexiun cun la rait u emprova cun in’auter maletg. +pdfjs-editor-add-signature-image-no-data-error-title = Impussibel da convertir quest maletg en ina signatura +pdfjs-editor-add-signature-image-no-data-error-description = Emprova per plaschair da transferir in auter maletg. pdfjs-editor-add-signature-error-close-button = Serrar ## Dialog buttons @@ -600,6 +605,25 @@ pdfjs-editor-add-signature-cancel-button = Interrumper pdfjs-editor-add-signature-add-button = Agiuntar pdfjs-editor-edit-signature-update-button = Actualisar +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Modifitgar il commentari +pdfjs-editor-edit-comment-popup-button = + .title = Modifitgar il commentari +pdfjs-editor-delete-comment-popup-button-label = Allontanar il commentari +pdfjs-editor-delete-comment-popup-button = + .title = Allontanar il commentari + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Modifitgar il commentari +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Agiuntar in commentari +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Cumenzar a tippar… +pdfjs-editor-edit-comment-dialog-cancel-button = Interrumper + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/ro/viewer.ftl b/l10n/ro/viewer.ftl index 72d87dd361a08..a55e21f477d70 100644 --- a/l10n/ro/viewer.ftl +++ b/l10n/ro/viewer.ftl @@ -37,8 +37,8 @@ pdfjs-open-file-button = .title = Deschide un fișier pdfjs-open-file-button-label = Deschide pdfjs-print-button = - .title = Tipărește -pdfjs-print-button-label = Tipărește + .title = Printează +pdfjs-print-button-label = Printează pdfjs-save-button = .title = Salvează pdfjs-save-button-label = Salvează @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } octeți) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } byți) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byți) pdfjs-document-properties-title = Titlu: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Subiect: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Data modificării: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Autor: pdfjs-document-properties-producer = Producător PDF: pdfjs-document-properties-version = Versiune PDF: @@ -168,13 +156,13 @@ pdfjs-document-properties-close-button = Închide ## Print -pdfjs-print-progress-message = Se pregătește documentul pentru tipărire… +pdfjs-print-progress-message = Se pregătește documentul pentru printare… # Variables: # $progress (Number) - percent value pdfjs-print-progress-percent = { $progress }% pdfjs-print-progress-close-button = Anulează -pdfjs-printing-not-supported = Avertisment: Tipărirea nu este suportată în totalitate de acest browser. -pdfjs-printing-not-ready = Avertisment: PDF-ul nu este încărcat complet pentru tipărire. +pdfjs-printing-not-supported = Avertisment: Printarea nu este suportată complet de acest browser. +pdfjs-printing-not-ready = Avertisment: PDF-ul nu este încărcat complet pentru printare. ## Tooltips and alt text for side panel toolbar buttons @@ -184,7 +172,7 @@ pdfjs-toggle-sidebar-notification-button = .title = Comută bara laterală (documentul conține schițe/atașamente/straturi) pdfjs-toggle-sidebar-button-label = Comută bara laterală pdfjs-document-outline-button = - .title = Afișează schița documentului (dublu-clic pentru a extinde/restrânge toate elementele) + .title = Afișează schița documentului (dă dublu clic pentru a extinde/restrânge toate elementele) pdfjs-document-outline-button-label = Schiță a documentului pdfjs-attachments-button = .title = Afișează atașamentele @@ -277,10 +265,6 @@ pdfjs-rendering-error = A intervenit o eroare la randarea paginii. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -326,6 +310,10 @@ pdfjs-comment-floating-button = .title = Comentează .aria-label = Comentariu pdfjs-comment-floating-button-label = Comentează +pdfjs-editor-comment-button = + .title = Comentariu + .aria-label = Comentează +pdfjs-editor-comment-button-label = Comentariu pdfjs-editor-signature-button = .title = Adaugă semnătură pdfjs-editor-signature-button-label = Adaugă semnătură @@ -388,20 +376,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Editor de text .default-content = Începe să tastezi... -pdfjs-free-text = - .aria-label = Editor de text -pdfjs-free-text-default-content = Începe să tastezi… -pdfjs-ink = - .aria-label = Editor de desene -pdfjs-ink-canvas = - .aria-label = Imagine creată de utilizator +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentariu + *[other] Comentarii + } +pdfjs-editor-comments-sidebar-close-button = + .title = Închide bara laterală + .aria-label = Închide bara laterală +pdfjs-editor-comments-sidebar-close-button-label = Închide bara laterală +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vezi ceva care merită comentat? Evidențiază-l și lasă un comentariu. +pdfjs-editor-comments-sidebar-no-comments-link = Află mai multe ## Alt-text dialog pdfjs-editor-alt-text-button-label = Text alternativ pdfjs-editor-alt-text-edit-button = .aria-label = Editează textul alternativ -pdfjs-editor-alt-text-edit-button-label = Editează textul alternativ pdfjs-editor-alt-text-dialog-label = Alege o opțiune pdfjs-editor-alt-text-dialog-description = Textul alternativ (alt text) ajută când oamenii nu pot vedea imaginea sau când nu se încarcă. pdfjs-editor-alt-text-add-description-label = Adaugă o descriere @@ -421,14 +416,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Colțul din stânga sus — redimensionează -pdfjs-editor-resizer-label-top-middle = Mijloc de sus — redimensionează -pdfjs-editor-resizer-label-top-right = Colțul din dreapta sus — redimensionează -pdfjs-editor-resizer-label-middle-right = Mijloc dreapta — redimensionează -pdfjs-editor-resizer-label-bottom-right = Colțul din dreapta jos — redimensionează -pdfjs-editor-resizer-label-bottom-middle = Mijloc de jos - redimensionează -pdfjs-editor-resizer-label-bottom-left = Colțul din stânga jos — redimensionează -pdfjs-editor-resizer-label-middle-left = Mijloc stânga — redimensionează pdfjs-editor-resizer-top-left = .aria-label = Colțul din stânga sus — redimensionează pdfjs-editor-resizer-top-middle = @@ -621,25 +608,33 @@ pdfjs-editor-add-signature-cancel-button = Anulează pdfjs-editor-add-signature-add-button = Adaugă pdfjs-editor-edit-signature-update-button = Actualizează +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editează comentariul +pdfjs-editor-edit-comment-popup-button = + .title = Editează comentariul +pdfjs-editor-delete-comment-popup-button-label = Șterge comentariul +pdfjs-editor-delete-comment-popup-button = + .title = Șterge comentariul +pdfjs-show-comment-button = + .title = Afișează comentariul + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Acțiuni -pdfjs-editor-edit-comment-actions-button = - .title = Acțiuni -pdfjs-editor-edit-comment-close-button-label = Închide -pdfjs-editor-edit-comment-close-button = - .title = Închide -pdfjs-editor-edit-comment-actions-edit-button-label = Editează -pdfjs-editor-edit-comment-actions-delete-button-label = Șterge -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Introdu comentariul -pdfjs-editor-edit-comment-manager-cancel-button = Anulează -pdfjs-editor-edit-comment-manager-save-button = Salvează +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editează comentariul +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizează +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Adaugă un comentariu +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Adaugă +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Începe să tastezi… +pdfjs-editor-edit-comment-dialog-cancel-button = Anulează ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Editează comentariul +pdfjs-editor-add-comment-button = + .title = Adaugă un comentariu ## Main menu for adding/removing signatures diff --git a/l10n/ru/viewer.ftl b/l10n/ru/viewer.ftl index 5a1ea21eb94be..1632adab26697 100644 --- a/l10n/ru/viewer.ftl +++ b/l10n/ru/viewer.ftl @@ -44,10 +44,10 @@ pdfjs-save-button = pdfjs-save-button-label = Сохранить # Used in Firefox for Android as a tooltip for the download button (“download” is a verb). pdfjs-download-button = - .title = Загрузить + .title = Скачать # Used in Firefox for Android as a label for the download button (“download” is a verb). # Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-download-button-label = Загрузить +pdfjs-download-button-label = Скачать pdfjs-bookmark-button = .title = Текущая страница (просмотр URL-адреса с текущей страницы) pdfjs-bookmark-button-label = Текущая страница @@ -70,10 +70,10 @@ pdfjs-page-rotate-ccw-button = .title = Повернуть против часовой стрелки pdfjs-page-rotate-ccw-button-label = Повернуть против часовой стрелки pdfjs-cursor-text-select-tool-button = - .title = Включить Инструмент «Выделение текста» + .title = Включить инструмент «Выделение текста» pdfjs-cursor-text-select-tool-button-label = Инструмент «Выделение текста» pdfjs-cursor-hand-tool-button = - .title = Включить Инструмент «Рука» + .title = Включить инструмент «Рука» pdfjs-cursor-hand-tool-button-label = Инструмент «Рука» pdfjs-scroll-page-button = .title = Использовать прокрутку страниц @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байт) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байт) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байт) pdfjs-document-properties-title = Заголовок: pdfjs-document-properties-author = Автор: pdfjs-document-properties-subject = Тема: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Дата изменения: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Приложение: pdfjs-document-properties-producer = Производитель PDF: pdfjs-document-properties-version = Версия PDF: @@ -277,10 +265,6 @@ pdfjs-rendering-error = При создании страницы произош ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -326,6 +310,10 @@ pdfjs-comment-floating-button = .title = Комментировать .aria-label = Комментировать pdfjs-comment-floating-button-label = Комментировать +pdfjs-editor-comment-button = + .title = Комментарий + .aria-label = Комментарий +pdfjs-editor-comment-button-label = Комментарий pdfjs-editor-signature-button = .title = Добавить подпись pdfjs-editor-signature-button-label = Добавить подпись @@ -375,7 +363,7 @@ pdfjs-editor-free-highlight-thickness-input = Толщина pdfjs-editor-free-highlight-thickness-title = .title = Изменить толщину при выделении элементов, кроме текста pdfjs-editor-add-signature-container = - .aria-label = Управление подписями и сохраненные подписи + .aria-label = Управление подписями и сохранённые подписи pdfjs-editor-signature-add-signature-button = .title = Добавить новую подпись pdfjs-editor-signature-add-signature-button-label = Добавить новую подпись @@ -388,20 +376,28 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Текстовый редактор .default-content = Начните ввод... -pdfjs-free-text = - .aria-label = Текстовый редактор -pdfjs-free-text-default-content = Начните вводить… -pdfjs-ink = - .aria-label = Редактор рисования -pdfjs-ink-canvas = - .aria-label = Созданное пользователем изображение +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Комментарий + [few] Комментарии + *[many] Комментарии + } +pdfjs-editor-comments-sidebar-close-button = + .title = Закрыть боковую панель + .aria-label = Закрыть боковую панель +pdfjs-editor-comments-sidebar-close-button-label = Закрыть боковую панель +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Увидели что-то интересное? Выделите и оставьте комментарий. +pdfjs-editor-comments-sidebar-no-comments-link = Подробнее ## Alt-text dialog pdfjs-editor-alt-text-button-label = Альтернативный текст pdfjs-editor-alt-text-edit-button = .aria-label = Изменить альтернативный текст -pdfjs-editor-alt-text-edit-button-label = Изменить альтернативный текст pdfjs-editor-alt-text-dialog-label = Выберите вариант pdfjs-editor-alt-text-dialog-description = Альтернативный текст помогает, когда люди не видят изображение или оно не загружается. pdfjs-editor-alt-text-add-description-label = Добавить описание @@ -421,14 +417,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Левый верхний угол — изменить размер -pdfjs-editor-resizer-label-top-middle = Вверху посередине — изменить размер -pdfjs-editor-resizer-label-top-right = Верхний правый угол — изменить размер -pdfjs-editor-resizer-label-middle-right = В центре справа — изменить размер -pdfjs-editor-resizer-label-bottom-right = Нижний правый угол — изменить размер -pdfjs-editor-resizer-label-bottom-middle = Внизу посередине — изменить размер -pdfjs-editor-resizer-label-bottom-left = Нижний левый угол — изменить размер -pdfjs-editor-resizer-label-middle-left = В центре слева — изменить размер pdfjs-editor-resizer-top-left = .aria-label = Левый верхний угол — изменить размер pdfjs-editor-resizer-top-middle = @@ -527,7 +515,7 @@ pdfjs-editor-alt-text-settings-create-model-description = Предлагает pdfjs-editor-alt-text-settings-download-model-label = ИИ-модель альтернативного текста ({ $totalSize } МБ) pdfjs-editor-alt-text-settings-ai-model-description = Запускается локально на вашем устройстве, поэтому ваши данные остаются конфиденциальными. Требуется для автоматического альтернативного текста. pdfjs-editor-alt-text-settings-delete-model-button = Удалить -pdfjs-editor-alt-text-settings-download-model-button = Загрузить +pdfjs-editor-alt-text-settings-download-model-button = Скачать pdfjs-editor-alt-text-settings-downloading-model-button = Загрузка… pdfjs-editor-alt-text-settings-editor-title = Редактор альтернативного текста pdfjs-editor-alt-text-settings-show-dialog-button-label = Сразу показывать редактор альтернативного текста при добавлении изображения @@ -621,25 +609,33 @@ pdfjs-editor-add-signature-cancel-button = Отмена pdfjs-editor-add-signature-add-button = Добавить pdfjs-editor-edit-signature-update-button = Обновить +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Редактировать комментарий +pdfjs-editor-edit-comment-popup-button = + .title = Редактировать комментарий +pdfjs-editor-delete-comment-popup-button-label = Удалить комментарий +pdfjs-editor-delete-comment-popup-button = + .title = Удалить комментарий +pdfjs-show-comment-button = + .title = Показать комментарий + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Действия -pdfjs-editor-edit-comment-actions-button = - .title = Действия -pdfjs-editor-edit-comment-close-button-label = Закрыть -pdfjs-editor-edit-comment-close-button = - .title = Закрыть -pdfjs-editor-edit-comment-actions-edit-button-label = Изменить -pdfjs-editor-edit-comment-actions-delete-button-label = Удалить -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Введите ваш комментарий -pdfjs-editor-edit-comment-manager-cancel-button = Отмена -pdfjs-editor-edit-comment-manager-save-button = Сохранить +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Редактировать комментарий +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Обновить +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Добавить комментарий +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Добавить +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Начните ввод… +pdfjs-editor-edit-comment-dialog-cancel-button = Отмена ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Редактировать комментарий +pdfjs-editor-add-comment-button = + .title = Добавить комментарий ## Main menu for adding/removing signatures diff --git a/l10n/sat/viewer.ftl b/l10n/sat/viewer.ftl index 6b910a073dbaa..e2e3140966a73 100644 --- a/l10n/sat/viewer.ftl +++ b/l10n/sat/viewer.ftl @@ -104,24 +104,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = ᱫᱚᱞᱤᱞ ᱜᱩᱱᱠᱚ … pdfjs-document-properties-file-name = ᱨᱮᱫᱽ ᱧᱩᱛᱩᱢ : pdfjs-document-properties-file-size = ᱨᱮᱫᱽ ᱢᱟᱯ : -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ᱵᱟᱭᱤᱴ ᱠᱚ) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ᱵᱟᱭᱤᱴ ᱠᱚ) pdfjs-document-properties-title = ᱧᱩᱛᱩᱢ : pdfjs-document-properties-author = ᱚᱱᱚᱞᱤᱭᱟᱹ : pdfjs-document-properties-subject = ᱵᱤᱥᱚᱭ : pdfjs-document-properties-keywords = ᱠᱟᱹᱴᱷᱤ ᱥᱟᱵᱟᱫᱽ : pdfjs-document-properties-creation-date = ᱛᱮᱭᱟᱨ ᱢᱟᱸᱦᱤᱛ : pdfjs-document-properties-modification-date = ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱢᱟᱹᱦᱤᱛ : -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = ᱵᱮᱱᱟᱣᱤᱡ : pdfjs-document-properties-producer = PDF ᱛᱮᱭᱟᱨ ᱚᱰᱚᱠᱤᱡ : pdfjs-document-properties-version = PDF ᱵᱷᱟᱹᱨᱥᱚᱱ : @@ -249,10 +237,6 @@ pdfjs-rendering-error = ᱥᱟᱦᱴᱟ ᱮᱢ ᱡᱚᱦᱚᱠ ᱢᱤᱫ ᱵᱷ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -292,10 +276,3 @@ pdfjs-editor-ink-opacity-input = ᱟᱨᱯᱟᱨ pdfjs-editor-stamp-add-image-button = .title = ᱪᱤᱛᱟᱹᱨ ᱥᱮᱞᱮᱫ ᱢᱮ pdfjs-editor-stamp-add-image-button-label = ᱪᱤᱛᱟᱹᱨ ᱥᱮᱞᱮᱫ ᱢᱮ -pdfjs-free-text = - .aria-label = ᱚᱞ ᱥᱟᱯᱲᱟᱣᱤᱭᱟᱹ -pdfjs-free-text-default-content = ᱚᱞ ᱮᱛᱦᱚᱵ ᱢᱮ … -pdfjs-ink = - .aria-label = ᱛᱮᱭᱟᱨ ᱥᱟᱯᱲᱟᱣᱤᱭᱟᱹ -pdfjs-ink-canvas = - .aria-label = ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱛᱮᱭᱟᱨ ᱠᱟᱫ ᱪᱤᱛᱟᱹᱨ diff --git a/l10n/sc/viewer.ftl b/l10n/sc/viewer.ftl index 0429734a9934d..c8a732735d383 100644 --- a/l10n/sc/viewer.ftl +++ b/l10n/sc/viewer.ftl @@ -95,24 +95,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Propiedades de su documentu… pdfjs-document-properties-file-name = Nòmine de s'archìviu: pdfjs-document-properties-file-size = Mannària de s'archìviu: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Tìtulu: pdfjs-document-properties-author = Autoria: pdfjs-document-properties-subject = Ogetu: pdfjs-document-properties-keywords = Faeddos crae: pdfjs-document-properties-creation-date = Data de creatzione: pdfjs-document-properties-modification-date = Data de modìfica: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creatzione: pdfjs-document-properties-producer = Produtore de PDF: pdfjs-document-properties-version = Versione de PDF: @@ -234,13 +222,6 @@ pdfjs-missing-file-error = Ammancat s'archìviu PDF. pdfjs-unexpected-response-error = Risposta imprevista de su serbidore. pdfjs-rendering-error = Faddina in sa visualizatzione de sa pàgina. -## Annotations - -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } - ## Password pdfjs-password-label = Inserta sa crae pro abèrrere custu archìviu PDF. @@ -291,18 +272,14 @@ pdfjs-editor-stamp-add-image-button = pdfjs-editor-stamp-add-image-button-label = Agiunghe un’immàgine # This refers to the thickness of the line used for free highlighting (not bound to text) pdfjs-editor-free-highlight-thickness-input = Grussària -pdfjs-free-text = +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editore de testu -pdfjs-free-text-default-content = Cumintza a iscrìere… -pdfjs-ink = - .aria-label = Editore de disinnos -pdfjs-ink-canvas = - .aria-label = Immàgine creada dae s’utente + .default-content = Cumintza a iscrìere… ## Alt-text dialog pdfjs-editor-alt-text-button-label = Testu alternativu -pdfjs-editor-alt-text-edit-button-label = Modifica su testu alternativu pdfjs-editor-alt-text-dialog-label = Sèbera un’optzione pdfjs-editor-alt-text-dialog-description = Su testu alternativu (“alt text”) est ùtile pro persones chi non podent bìdere s’immàgine o cando non benit carrigada. pdfjs-editor-alt-text-add-description-label = Agiunghe una descritzione @@ -354,3 +331,12 @@ pdfjs-editor-alt-text-settings-editor-title = Editore de testu alternativu pdfjs-editor-alt-text-settings-show-dialog-button-label = Mustra deretu s’editore de testu alternativu cando siat agiunta un’immàgine pdfjs-editor-alt-text-settings-show-dialog-description = T’agiudat a assegurare chi totu is immàgines tuas tèngiant unu testu alternativu. pdfjs-editor-alt-text-settings-close-button = Serra + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Annulla + +## Edit a comment dialog + +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Cumintza a iscrìere… diff --git a/l10n/sco/viewer.ftl b/l10n/sco/viewer.ftl index 76e529d5c93da..ed4c3bb04ba5f 100644 --- a/l10n/sco/viewer.ftl +++ b/l10n/sco/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Document Properties… pdfjs-document-properties-file-name = File nemme: pdfjs-document-properties-file-size = File size: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Title: pdfjs-document-properties-author = Author: pdfjs-document-properties-subject = Subjeck: pdfjs-document-properties-keywords = Keywirds: pdfjs-document-properties-creation-date = Date o Makkin: pdfjs-document-properties-modification-date = Date o Chynges: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Makker: pdfjs-document-properties-producer = PDF Producer: pdfjs-document-properties-version = PDF Version: @@ -233,10 +221,6 @@ pdfjs-rendering-error = A mishanter tuik place while renderin the page. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/si/viewer.ftl b/l10n/si/viewer.ftl index e14d93dce744a..28d53f3276405 100644 --- a/l10n/si/viewer.ftl +++ b/l10n/si/viewer.ftl @@ -80,24 +80,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = ලේඛනයේ ගුණාංග… pdfjs-document-properties-file-name = ගොනුවේ නම: pdfjs-document-properties-file-size = ගොනුවේ ප්‍රමාණය: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = කි.බ. { $size_kb } (බයිට { $size_b }) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = මෙ.බ. { $size_mb } (බයිට { $size_b }) pdfjs-document-properties-title = සිරැසිය: pdfjs-document-properties-author = කතෘ: pdfjs-document-properties-subject = මාතෘකාව: pdfjs-document-properties-keywords = මූල පද: pdfjs-document-properties-creation-date = සෑදූ දිනය: pdfjs-document-properties-modification-date = සංශෝධිත දිනය: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = නිර්මාතෘ: pdfjs-document-properties-producer = පීඩීඑෆ් සම්පාදක: pdfjs-document-properties-version = පීඩීඑෆ් අනුවාදය: @@ -207,13 +195,6 @@ pdfjs-invalid-file-error = වලංගු නොවන හෝ හානිව pdfjs-missing-file-error = මඟහැරුණු පීඩීඑෆ් ගොනුවකි. pdfjs-unexpected-response-error = අනපේක්‍ෂිත සේවාදායක ප්‍රතිචාරයකි. -## Annotations - -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } - ## Password pdfjs-password-label = මෙම පීඩීඑෆ් ගොනුව විවෘත කිරීමට මුරපදය යොදන්න. @@ -241,9 +222,6 @@ pdfjs-editor-free-text-color-input = වර්ණය pdfjs-editor-free-text-size-input = තරම pdfjs-editor-ink-color-input = වර්ණය pdfjs-editor-ink-thickness-input = ඝණකම -pdfjs-free-text = - .aria-label = වදන් සකසනය -pdfjs-free-text-default-content = ලිවීීම අරඹන්න… ## Alt-text dialog diff --git a/l10n/sk/viewer.ftl b/l10n/sk/viewer.ftl index 4fd946838baad..662638e1e47ad 100644 --- a/l10n/sk/viewer.ftl +++ b/l10n/sk/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtov) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } bajtov) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtov) pdfjs-document-properties-title = Názov: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Predmet: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Dátum úpravy: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Aplikácia: pdfjs-document-properties-producer = Tvorca PDF: pdfjs-document-properties-version = Verzia PDF: @@ -279,10 +267,6 @@ pdfjs-rendering-error = Pri vykresľovaní stránky sa vyskytla chyba. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -328,6 +312,10 @@ pdfjs-comment-floating-button = .title = Pridať komentár .aria-label = Pridať komentár pdfjs-comment-floating-button-label = Pridať komentár +pdfjs-editor-comment-button = + .title = Pridať komentár + .aria-label = Pridať komentár +pdfjs-editor-comment-button-label = Pridať komentár pdfjs-editor-signature-button = .title = Pridať podpis pdfjs-editor-signature-button-label = Pridať podpis @@ -390,20 +378,29 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Textový editor .default-content = Začnite písať… -pdfjs-free-text = - .aria-label = Textový editor -pdfjs-free-text-default-content = Začnite písať… -pdfjs-ink = - .aria-label = Editor kreslenia -pdfjs-ink-canvas = - .aria-label = Obrázok vytvorený používateľom +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Komentár + [few] Komentáre + [many] Komentárov + *[other] Komentárov + } +pdfjs-editor-comments-sidebar-close-button = + .title = Zavrieť bočný panel + .aria-label = Zavrieť bočný panel +pdfjs-editor-comments-sidebar-close-button-label = Zavrieť bočný panel +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vidíte niečo pozoruhodné? Zvýraznite to a zanechajte komentár. +pdfjs-editor-comments-sidebar-no-comments-link = Ďalšie informácie ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternatívny text pdfjs-editor-alt-text-edit-button = .aria-label = Upraviť alternatívny text -pdfjs-editor-alt-text-edit-button-label = Upraviť alternatívny text pdfjs-editor-alt-text-dialog-label = Vyberte možnosť pdfjs-editor-alt-text-dialog-description = Alternatívny text (alt text) pomáha, keď ľudia obrázok nevidia alebo sa nenačítava. pdfjs-editor-alt-text-add-description-label = Pridať popis @@ -423,14 +420,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Ľavý horný roh – zmena veľkosti -pdfjs-editor-resizer-label-top-middle = Horný stred – zmena veľkosti -pdfjs-editor-resizer-label-top-right = Pravý horný roh – zmena veľkosti -pdfjs-editor-resizer-label-middle-right = Vpravo uprostred – zmena veľkosti -pdfjs-editor-resizer-label-bottom-right = Pravý dolný roh – zmena veľkosti -pdfjs-editor-resizer-label-bottom-middle = Stred dole – zmena veľkosti -pdfjs-editor-resizer-label-bottom-left = Ľavý dolný roh – zmena veľkosti -pdfjs-editor-resizer-label-middle-left = Vľavo uprostred – zmena veľkosti pdfjs-editor-resizer-top-left = .aria-label = Ľavý horný roh – zmena veľkosti pdfjs-editor-resizer-top-middle = @@ -624,25 +613,33 @@ pdfjs-editor-add-signature-cancel-button = Zrušiť pdfjs-editor-add-signature-add-button = Pridať pdfjs-editor-edit-signature-update-button = Aktualizovať +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Upraviť komentár +pdfjs-editor-edit-comment-popup-button = + .title = Upraviť komentár +pdfjs-editor-delete-comment-popup-button-label = Odstrániť komentár +pdfjs-editor-delete-comment-popup-button = + .title = Odstrániť komentár +pdfjs-show-comment-button = + .title = Zobraziť komentár + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Akcie -pdfjs-editor-edit-comment-actions-button = - .title = Akcie -pdfjs-editor-edit-comment-close-button-label = Zavrieť -pdfjs-editor-edit-comment-close-button = - .title = Zavrieť -pdfjs-editor-edit-comment-actions-edit-button-label = Upraviť -pdfjs-editor-edit-comment-actions-delete-button-label = Odstrániť -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Zadajte svoj komentár -pdfjs-editor-edit-comment-manager-cancel-button = Zrušiť -pdfjs-editor-edit-comment-manager-save-button = Uložiť +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Upraviť komentár +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizovať +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Pridať komentár +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Pridať +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Začnite písať… +pdfjs-editor-edit-comment-dialog-cancel-button = Zrušiť ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Upraviť komentár +pdfjs-editor-add-comment-button = + .title = Pridať komentár ## Main menu for adding/removing signatures diff --git a/l10n/skr/viewer.ftl b/l10n/skr/viewer.ftl index 7492b4647493d..6136dfcbe80fe 100644 --- a/l10n/skr/viewer.ftl +++ b/l10n/skr/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } بائٹاں) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } کے بی ({ $size_b } بائٹس) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } ایم بی ({ $size_b } بائٹس) pdfjs-document-properties-title = عنوان: pdfjs-document-properties-author = تخلیق کار: pdfjs-document-properties-subject = موضوع: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = ترمیم دی تاریخ: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = تخلیق کار: pdfjs-document-properties-producer = PDF پیدا کار: pdfjs-document-properties-version = PDF ورژن: @@ -275,10 +263,6 @@ pdfjs-rendering-error = ورقہ رینڈر کریندے ویلھے ہک خرا ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -343,18 +327,10 @@ pdfjs-editor-stamp-add-image-button-label = تصویر شامل کرو pdfjs-editor-free-highlight-thickness-input = مُٹاݨ pdfjs-editor-free-highlight-thickness-title = .title = متن توں ان٘ج ٻئے شئیں کوں نمایاں کرݨ ویلے مُٹاݨ کوں بدلو -pdfjs-free-text = - .aria-label = ٹیکسٹ ایڈیٹر -pdfjs-free-text-default-content = ٹائپنگ شروع کرو … -pdfjs-ink = - .aria-label = ڈرا ایڈیٹر -pdfjs-ink-canvas = - .aria-label = صارف دی بݨائی ہوئی تصویر ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alt متن -pdfjs-editor-alt-text-edit-button-label = alt متن وِچ ترمیم کرو pdfjs-editor-alt-text-dialog-label = ہِک اختیار چُݨو pdfjs-editor-alt-text-dialog-description = Alt متن (متبادل متن) اِیں ویلے مَدَت کرین٘دا ہِے جہڑیلے لوک تصویر کوں نِھیں ݙیکھ سڳدے یا جہڑیلے اِیہ لوڈ کائنی تِھین٘دا۔ pdfjs-editor-alt-text-add-description-label = تفصیل شامل کرو @@ -374,14 +350,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = اُتلی کَھٻّی نُکّڑ — سائز بدلو -pdfjs-editor-resizer-label-top-middle = اُتلا وِچلا — سائز بدلو -pdfjs-editor-resizer-label-top-right = اُتلی سَڄّی نُکَّڑ — سائز بدلو -pdfjs-editor-resizer-label-middle-right = وِچلا سڄّا — سائز بدلو -pdfjs-editor-resizer-label-bottom-right = تلوِیں سَڄّی نُکَّڑ — سائز بدلو -pdfjs-editor-resizer-label-bottom-middle = تلواں وِچلا — سائز بدلو -pdfjs-editor-resizer-label-bottom-left = تلوِیں کَھٻّی نُکّڑ — سائز بدلو -pdfjs-editor-resizer-label-middle-left = وِچلا کَھٻّا — سائز بدلو pdfjs-editor-resizer-top-left = .aria-label = اُتلی کَھٻّی نُکّڑ — سائز بدلو pdfjs-editor-resizer-top-middle = diff --git a/l10n/sl/viewer.ftl b/l10n/sl/viewer.ftl index 48527040d5b11..10ad8d09ff42c 100644 --- a/l10n/sl/viewer.ftl +++ b/l10n/sl/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtov) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtov) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtov) pdfjs-document-properties-title = Ime: pdfjs-document-properties-author = Avtor: pdfjs-document-properties-subject = Tema: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Datum spremembe: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Ustvaril: pdfjs-document-properties-producer = Izdelovalec PDF: pdfjs-document-properties-version = Različica PDF: @@ -230,7 +218,7 @@ pdfjs-find-match-case-checkbox-label = Razlikuj velike/male črke pdfjs-find-match-diacritics-checkbox-label = Razlikuj diakritične znake pdfjs-find-entire-word-checkbox-label = Cele besede pdfjs-find-reached-top = Dosežen začetek dokumenta iz smeri konca -pdfjs-find-reached-bottom = Doseženo konec dokumenta iz smeri začetka +pdfjs-find-reached-bottom = Dosežen konec dokumenta, nadaljevanje od začetka # Variables: # $current (Number) - the index of the currently active find result # $total (Number) - the total number of matches in the document @@ -279,10 +267,6 @@ pdfjs-rendering-error = Med pripravljanjem strani je prišlo do napake! ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -306,9 +290,13 @@ pdfjs-web-fonts-disabled = Spletne pisave so onemogočene: vgradnih pisav za PDF pdfjs-editor-free-text-button = .title = Besedilo +pdfjs-editor-color-picker-free-text-input = + .title = Spremeni barvo besedila pdfjs-editor-free-text-button-label = Besedilo pdfjs-editor-ink-button = .title = Riši +pdfjs-editor-color-picker-ink-input = + .title = Spremeni barvo risbe pdfjs-editor-ink-button-label = Riši pdfjs-editor-stamp-button = .title = Dodajanje ali urejanje slik @@ -320,6 +308,14 @@ pdfjs-highlight-floating-button1 = .title = Označi .aria-label = Označi pdfjs-highlight-floating-button-label = Označi +pdfjs-comment-floating-button = + .title = Komentiraj + .aria-label = Komentiraj +pdfjs-comment-floating-button-label = Komentiraj +pdfjs-editor-comment-button = + .title = Komentiraj + .aria-label = Komentiraj +pdfjs-editor-comment-button-label = Komentiraj pdfjs-editor-signature-button = .title = Dodaj podpis pdfjs-editor-signature-button-label = Dodaj podpis @@ -382,20 +378,29 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Urejevalnik besedila .default-content = Začnite tipkati … -pdfjs-free-text = - .aria-label = Urejevalnik besedila -pdfjs-free-text-default-content = Začnite tipkati … -pdfjs-ink = - .aria-label = Urejevalnik risanja -pdfjs-ink-canvas = - .aria-label = Uporabnikova slika +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Komentar + [two] Komentarja + [few] Komentarji + *[other] Komentarji + } +pdfjs-editor-comments-sidebar-close-button = + .title = Zapri stransko vrstico + .aria-label = Zapri stransko vrstico +pdfjs-editor-comments-sidebar-close-button-label = Zapri stransko vrstico +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Ste zasledili kaj omembe vrednega? Narišite oznako in dopišite komentar. +pdfjs-editor-comments-sidebar-no-comments-link = Več o tem ## Alt-text dialog pdfjs-editor-alt-text-button-label = Nadomestno besedilo pdfjs-editor-alt-text-edit-button = .aria-label = Uredi nadomestno besedilo -pdfjs-editor-alt-text-edit-button-label = Uredi nadomestno besedilo pdfjs-editor-alt-text-dialog-label = Izberite možnost pdfjs-editor-alt-text-dialog-description = Nadomestno besedilo se prikaže tistim, ki ne vidijo slike, ali če se ta ne naloži. pdfjs-editor-alt-text-add-description-label = Dodaj opis @@ -415,14 +420,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Zgornji levi kot – spremeni velikost -pdfjs-editor-resizer-label-top-middle = Zgoraj na sredini – spremeni velikost -pdfjs-editor-resizer-label-top-right = Zgornji desni kot – spremeni velikost -pdfjs-editor-resizer-label-middle-right = Desno na sredini – spremeni velikost -pdfjs-editor-resizer-label-bottom-right = Spodnji desni kot – spremeni velikost -pdfjs-editor-resizer-label-bottom-middle = Spodaj na sredini – spremeni velikost -pdfjs-editor-resizer-label-bottom-left = Spodnji levi kot – spremeni velikost -pdfjs-editor-resizer-label-middle-left = Levo na sredini – spremeni velikost pdfjs-editor-resizer-top-left = .aria-label = Zgornji levi kot – spremeni velikost pdfjs-editor-resizer-top-middle = @@ -606,6 +603,8 @@ pdfjs-editor-add-signature-save-checkbox = Shrani podpis pdfjs-editor-add-signature-save-warning-message = Dosegli ste omejitev 5 shranjenih podpisov. Če želite shraniti novega, enega odstranite. pdfjs-editor-add-signature-image-upload-error-title = Slike ni bilo mogoče naložiti pdfjs-editor-add-signature-image-upload-error-description = Preverite svojo povezavo z omrežjem ali poskusite z drugo sliko. +pdfjs-editor-add-signature-image-no-data-error-title = Te slike ni mogoče pretvoriti v podpis +pdfjs-editor-add-signature-image-no-data-error-description = Poskusite naložiti drugo sliko. pdfjs-editor-add-signature-error-close-button = Zapri ## Dialog buttons @@ -614,6 +613,34 @@ pdfjs-editor-add-signature-cancel-button = Prekliči pdfjs-editor-add-signature-add-button = Dodaj pdfjs-editor-edit-signature-update-button = Spremeni +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Uredi komentar +pdfjs-editor-edit-comment-popup-button = + .title = Uredi komentar +pdfjs-editor-delete-comment-popup-button-label = Odstrani komentar +pdfjs-editor-delete-comment-popup-button = + .title = Odstrani komentar +pdfjs-show-comment-button = + .title = Pokaži komentar + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Uredi komentar +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Spremeni +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Dodaj komentar +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Dodaj +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Začnite tipkati … +pdfjs-editor-edit-comment-dialog-cancel-button = Prekliči + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Dodaj komentar + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/son/viewer.ftl b/l10n/son/viewer.ftl index 4497655a54ff5..ecbe86d2396af 100644 --- a/l10n/son/viewer.ftl +++ b/l10n/son/viewer.ftl @@ -65,24 +65,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Takadda mayrawey… pdfjs-document-properties-file-name = Tuku maa: pdfjs-document-properties-file-size = Tuku adadu: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = KB { $size_kb } (cebsu-ize { $size_b }) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = MB { $size_mb } (cebsu-ize { $size_b }) pdfjs-document-properties-title = Tiiramaa: pdfjs-document-properties-author = Hantumkaw: pdfjs-document-properties-subject = Dalil: pdfjs-document-properties-keywords = Kufalkalimawey: pdfjs-document-properties-creation-date = Teeyan han: pdfjs-document-properties-modification-date = Barmayan han: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Teekaw: pdfjs-document-properties-producer = PDF berandikaw: pdfjs-document-properties-version = PDF dumi: diff --git a/l10n/sq/viewer.ftl b/l10n/sq/viewer.ftl index dc402cc754232..cca7268da9a7e 100644 --- a/l10n/sq/viewer.ftl +++ b/l10n/sq/viewer.ftl @@ -103,14 +103,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajte) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajte) pdfjs-document-properties-title = Titull: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Subjekt: @@ -120,10 +112,6 @@ pdfjs-document-properties-modification-date = Datë Ndryshimi: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Krijues: pdfjs-document-properties-producer = Prodhues PDF-je: pdfjs-document-properties-version = Version PDF-je: @@ -266,10 +254,6 @@ pdfjs-rendering-error = Ndodhi një gabim gjatë riprodhimit të faqes. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -293,9 +277,13 @@ pdfjs-web-fonts-disabled = Shkronjat Web janë të çaktivizuara: s’arrihet t pdfjs-editor-free-text-button = .title = Tekst +pdfjs-editor-color-picker-free-text-input = + .title = Ndryshoni ngjyrë teksti pdfjs-editor-free-text-button-label = Tekst pdfjs-editor-ink-button = .title = Vizatoni +pdfjs-editor-color-picker-ink-input = + .title = Ndryshoni ngjyrë vizatimi pdfjs-editor-ink-button-label = Vizatoni pdfjs-editor-stamp-button = .title = Shtoni ose përpunoni figura @@ -307,6 +295,14 @@ pdfjs-highlight-floating-button1 = .title = Theksim .aria-label = Theksim pdfjs-highlight-floating-button-label = Theksim +pdfjs-comment-floating-button = + .title = Komentoni + .aria-label = Komentoni +pdfjs-comment-floating-button-label = Komentoni +pdfjs-editor-comment-button = + .title = Koment + .aria-label = Koment +pdfjs-editor-comment-button-label = Komentoni pdfjs-editor-signature-button = .title = Shtoni nënshkrim pdfjs-editor-signature-button-label = Shtoni nënshkrim @@ -369,20 +365,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Përpunues Tekstesh .default-content = Filloni të shtypni… -pdfjs-free-text = - .aria-label = Përpunues Tekstesh -pdfjs-free-text-default-content = Filloni të shtypni… -pdfjs-ink = - .aria-label = Përpunues Vizatimesh -pdfjs-ink-canvas = - .aria-label = Figurë e krijuar nga përdoruesi +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Koment + *[other] Komente + } +pdfjs-editor-comments-sidebar-close-button = + .title = Mbylleni anështyllën + .aria-label = Mbylleni anështyllën +pdfjs-editor-comments-sidebar-close-button-label = Mbylleni anështyllën +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Shihni diçka që ia vlen. Theksojeni dhe lini një koment. +pdfjs-editor-comments-sidebar-no-comments-link = Mësoni më tepër ## Alt-text dialog pdfjs-editor-alt-text-button-label = Tekst alternativ pdfjs-editor-alt-text-edit-button = .aria-label = Përpunoni tekst alternativ -pdfjs-editor-alt-text-edit-button-label = Përpunoni tekst alternativ pdfjs-editor-alt-text-dialog-label = Zgjidhni një mundësi pdfjs-editor-alt-text-dialog-description = Teksti alt (tekst alternativ) vjen në ndihmë kur njerëzit s’mund të shohin figurën, ose kur ajo nuk ngarkohet. pdfjs-editor-alt-text-add-description-label = Shtoni një përshkrim @@ -402,14 +405,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Cepi i sipërm majtas — ripërmasojeni -pdfjs-editor-resizer-label-top-middle = Mesi i pjesës sipër — ripërmasojeni -pdfjs-editor-resizer-label-top-right = Cepi i sipërm djathtas — ripërmasojeni -pdfjs-editor-resizer-label-middle-right = Djathtas në mes — ripërmasojeni -pdfjs-editor-resizer-label-bottom-right = Cepi i poshtëm djathtas — ripërmasojeni -pdfjs-editor-resizer-label-bottom-middle = Mesi i pjesës poshtë — ripërmasojeni -pdfjs-editor-resizer-label-bottom-left = Cepi i poshtëm — ripërmasojeni -pdfjs-editor-resizer-label-middle-left = Majtas në mes — ripërmasojeni pdfjs-editor-resizer-top-left = .aria-label = Cepi i sipërm majtas — ripërmasojeni pdfjs-editor-resizer-top-middle = @@ -515,6 +510,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Shfaq menjëherë për pdfjs-editor-alt-text-settings-show-dialog-description = Ju ndihmon të siguroheni se krejt figurat tuaja kanë tekst alternativ. pdfjs-editor-alt-text-settings-close-button = Mbylle +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = U shtua theksim +pdfjs-editor-freetext-added-alert = U shtua tekst +pdfjs-editor-ink-added-alert = U shtua vizatim +pdfjs-editor-stamp-added-alert = U shtua figurë +pdfjs-editor-signature-added-alert = U shtua nënshkrim + ## "Annotations removed" bar pdfjs-editor-undo-bar-message-highlight = U hoq theksimi @@ -583,6 +586,8 @@ pdfjs-editor-add-signature-save-checkbox = Ruaje nënshkrimin pdfjs-editor-add-signature-save-warning-message = Keni mbërritur në kufirin e 5 nënshkrimeve të ruajtura. Që të ruani tjetër, hiqni një. pdfjs-editor-add-signature-image-upload-error-title = S’u ngarkua dot figurë pdfjs-editor-add-signature-image-upload-error-description = Kontrolloni lidhjen tuaj në rrjet, ose provoni figurë tjetër. +pdfjs-editor-add-signature-image-no-data-error-title = S’shndërrohet dot kjo figurë në një nënshkrim +pdfjs-editor-add-signature-image-no-data-error-description = Ju lutemi, provoni të ngarkoni një figurë tjetër. pdfjs-editor-add-signature-error-close-button = Mbylle ## Dialog buttons @@ -591,6 +596,34 @@ pdfjs-editor-add-signature-cancel-button = Anuloje pdfjs-editor-add-signature-add-button = Shtoje pdfjs-editor-edit-signature-update-button = Përditësoje +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Përpunoni koment +pdfjs-editor-edit-comment-popup-button = + .title = Përpunoni koment +pdfjs-editor-delete-comment-popup-button-label = Hiqe komentin +pdfjs-editor-delete-comment-popup-button = + .title = Hiqe komentin +pdfjs-show-comment-button = + .title = Shfaqe komentin + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Përpunoni koment +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Përditësojeni +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Shtoni koment +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Shtoje +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Filloni të shtypni… +pdfjs-editor-edit-comment-dialog-cancel-button = Anuloje + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Shtoni koment + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/sr/viewer.ftl b/l10n/sr/viewer.ftl index b49a633cdd7ae..d4861fb326d16 100644 --- a/l10n/sr/viewer.ftl +++ b/l10n/sr/viewer.ftl @@ -98,14 +98,6 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Параметри документа… pdfjs-document-properties-file-name = Име датотеке: pdfjs-document-properties-file-size = Величина датотеке: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } B) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } B) pdfjs-document-properties-title = Наслов: pdfjs-document-properties-author = Аутор: pdfjs-document-properties-subject = Тема: @@ -115,10 +107,6 @@ pdfjs-document-properties-modification-date = Датум модификациј # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Стваралац: pdfjs-document-properties-producer = PDF произвођач: pdfjs-document-properties-version = PDF верзија: @@ -246,10 +234,6 @@ pdfjs-rendering-error = Дошло је до грешке приликом ре ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -316,20 +300,12 @@ pdfjs-editor-free-highlight-thickness-title = pdfjs-free-text2 = .aria-label = Уређивач текста .default-content = Почни куцати… -pdfjs-free-text = - .aria-label = Уређивач текста -pdfjs-free-text-default-content = Почни куцање… -pdfjs-ink = - .aria-label = Уређивач цртежа -pdfjs-ink-canvas = - .aria-label = Кориснички направљена слика ## Alt-text dialog pdfjs-editor-alt-text-button-label = Алтернативни текст pdfjs-editor-alt-text-edit-button = .aria-label = Уреди алтернативни текст -pdfjs-editor-alt-text-edit-button-label = Уреди алтернативни текст pdfjs-editor-alt-text-dialog-label = Одабери опцију pdfjs-editor-alt-text-dialog-description = Алтернативни текст помаже слепим и слабовидим особама или када се слика не учита. pdfjs-editor-alt-text-add-description-label = Додај опис @@ -349,14 +325,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Горњи леви угао — промени величину -pdfjs-editor-resizer-label-top-middle = Средина горе — промени величину -pdfjs-editor-resizer-label-top-right = Горњи десни угао — промени величину -pdfjs-editor-resizer-label-middle-right = Средина десно — промени величину -pdfjs-editor-resizer-label-bottom-right = Доњи десни угао — промени величину -pdfjs-editor-resizer-label-bottom-middle = Средина доле — промени величину -pdfjs-editor-resizer-label-bottom-left = Доњи леви угао — промени величину -pdfjs-editor-resizer-label-middle-left = Средина лево — промени величину pdfjs-editor-resizer-top-left = .aria-label = Горњи леви угао — промени величину pdfjs-editor-resizer-top-middle = diff --git a/l10n/sv-SE/viewer.ftl b/l10n/sv-SE/viewer.ftl index fa47535bf0116..0dc238a758105 100644 --- a/l10n/sv-SE/viewer.ftl +++ b/l10n/sv-SE/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } byte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Författare: pdfjs-document-properties-subject = Ämne: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Ändrades: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Skapare: pdfjs-document-properties-producer = PDF-producent: pdfjs-document-properties-version = PDF-version: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Ett fel uppstod vid visning av sidan. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Kommentar .aria-label = Kommentar pdfjs-comment-floating-button-label = Kommentar +pdfjs-editor-comment-button = + .title = Kommentar + .aria-label = Kommentar +pdfjs-editor-comment-button-label = Kommentar pdfjs-editor-signature-button = .title = Lägg till signatur pdfjs-editor-signature-button-label = Lägg till signatur @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Textredigerare .default-content = Börja skriva… -pdfjs-free-text = - .aria-label = Textredigerare -pdfjs-free-text-default-content = Börja skriva… -pdfjs-ink = - .aria-label = Ritredigerare -pdfjs-ink-canvas = - .aria-label = Användarskapad bild +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Kommentar + *[other] Kommentarer + } +pdfjs-editor-comments-sidebar-close-button = + .title = Stäng sidofältet + .aria-label = Stäng sidofältet +pdfjs-editor-comments-sidebar-close-button-label = Stäng sidofältet +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Ser du något anmärkningsvärt? Markera det och lämna en kommentar. +pdfjs-editor-comments-sidebar-no-comments-link = Läs mer ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternativ text pdfjs-editor-alt-text-edit-button = .aria-label = Redigera alternativ text -pdfjs-editor-alt-text-edit-button-label = Redigera alternativ text pdfjs-editor-alt-text-dialog-label = Välj ett alternativ pdfjs-editor-alt-text-dialog-description = Alt text (alternativ text) hjälper till när människor inte kan se bilden eller när den inte laddas. pdfjs-editor-alt-text-add-description-label = Lägg till en beskrivning @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Det övre vänstra hörnet — ändra storlek -pdfjs-editor-resizer-label-top-middle = Överst i mitten — ändra storlek -pdfjs-editor-resizer-label-top-right = Det övre högra hörnet — ändra storlek -pdfjs-editor-resizer-label-middle-right = Mitten höger — ändra storlek -pdfjs-editor-resizer-label-bottom-right = Nedre högra hörnet — ändra storlek -pdfjs-editor-resizer-label-bottom-middle = Nedre mitten — ändra storlek -pdfjs-editor-resizer-label-bottom-left = Nedre vänstra hörnet — ändra storlek -pdfjs-editor-resizer-label-middle-left = Mitten till vänster — ändra storlek pdfjs-editor-resizer-top-left = .aria-label = Det övre vänstra hörnet — ändra storlek pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Avbryt pdfjs-editor-add-signature-add-button = Lägg till pdfjs-editor-edit-signature-update-button = Uppdatera +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Redigera kommentar +pdfjs-editor-edit-comment-popup-button = + .title = Redigera kommentar +pdfjs-editor-delete-comment-popup-button-label = Ta bort kommentar +pdfjs-editor-delete-comment-popup-button = + .title = Ta bort kommentar +pdfjs-show-comment-button = + .title = Visa kommentar + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Åtgärder -pdfjs-editor-edit-comment-actions-button = - .title = Åtgärder -pdfjs-editor-edit-comment-close-button-label = Stäng -pdfjs-editor-edit-comment-close-button = - .title = Stäng -pdfjs-editor-edit-comment-actions-edit-button-label = Redigera -pdfjs-editor-edit-comment-actions-delete-button-label = Ta bort -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Ange din kommentar -pdfjs-editor-edit-comment-manager-cancel-button = Avbryt -pdfjs-editor-edit-comment-manager-save-button = Spara +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Redigera kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Uppdatera +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Lägg till kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Lägg till +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Börja skriva… +pdfjs-editor-edit-comment-dialog-cancel-button = Avbryt ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Redigera kommentar +pdfjs-editor-add-comment-button = + .title = Lägg till kommentar ## Main menu for adding/removing signatures diff --git a/l10n/szl/viewer.ftl b/l10n/szl/viewer.ftl index afad92224eb1b..4ab6c8f815c90 100644 --- a/l10n/szl/viewer.ftl +++ b/l10n/szl/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Włosności dokumyntu… pdfjs-document-properties-file-name = Miano zbioru: pdfjs-document-properties-file-size = Srogość zbioru: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } B) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } B) pdfjs-document-properties-title = Tytuł: pdfjs-document-properties-author = Autōr: pdfjs-document-properties-subject = Tymat: pdfjs-document-properties-keywords = Kluczowe słowa: pdfjs-document-properties-creation-date = Data zrychtowanio: pdfjs-document-properties-modification-date = Data zmiany: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Zrychtowane ôd: pdfjs-document-properties-producer = PDF ôd: pdfjs-document-properties-version = Wersyjo PDF: @@ -223,10 +211,6 @@ pdfjs-rendering-error = Przi renderowaniu strōny pokozoł sie feler. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/ta/viewer.ftl b/l10n/ta/viewer.ftl index 7442339e3582e..fe1c34775770b 100644 --- a/l10n/ta/viewer.ftl +++ b/l10n/ta/viewer.ftl @@ -71,24 +71,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = ஆவண பண்புகள்... pdfjs-document-properties-file-name = கோப்பு பெயர்: pdfjs-document-properties-file-size = கோப்பின் அளவு: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } கிபை ({ $size_b } பைட்டுகள்) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } மெபை ({ $size_b } பைட்டுகள்) pdfjs-document-properties-title = தலைப்பு: pdfjs-document-properties-author = எழுதியவர் pdfjs-document-properties-subject = பொருள்: pdfjs-document-properties-keywords = முக்கிய வார்த்தைகள்: pdfjs-document-properties-creation-date = படைத்த தேதி : pdfjs-document-properties-modification-date = திருத்திய தேதி: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = உருவாக்குபவர்: pdfjs-document-properties-producer = பிடிஎஃப் தயாரிப்பாளர்: pdfjs-document-properties-version = PDF பதிப்பு: diff --git a/l10n/te/viewer.ftl b/l10n/te/viewer.ftl index 3fd778ef8275d..24838bc89f0dd 100644 --- a/l10n/te/viewer.ftl +++ b/l10n/te/viewer.ftl @@ -72,24 +72,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = పత్రము లక్షణాలు... pdfjs-document-properties-file-name = దస్త్రం పేరు: pdfjs-document-properties-file-size = దస్త్రం పరిమాణం: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = శీర్షిక: pdfjs-document-properties-author = మూలకర్త: pdfjs-document-properties-subject = విషయం: pdfjs-document-properties-keywords = కీ పదాలు: pdfjs-document-properties-creation-date = సృష్టించిన తేదీ: pdfjs-document-properties-modification-date = సవరించిన తేదీ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = సృష్టికర్త: pdfjs-document-properties-producer = PDF ఉత్పాదకి: pdfjs-document-properties-version = PDF వర్షన్: @@ -199,10 +187,6 @@ pdfjs-rendering-error = పేజీను రెండర్ చేయుటల ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/tg/viewer.ftl b/l10n/tg/viewer.ftl index 131a51d6cb855..dd55ff94b72a5 100644 --- a/l10n/tg/viewer.ftl +++ b/l10n/tg/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байт) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байт) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байт) pdfjs-document-properties-title = Сарлавҳа: pdfjs-document-properties-author = Муаллиф: pdfjs-document-properties-subject = Мавзуъ: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Санаи тағйирот: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Эҷодкунанда: pdfjs-document-properties-producer = Таҳиякунандаи «PDF»: pdfjs-document-properties-version = Версияи «PDF»: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Ҳангоми шаклсозии саҳифа хато ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Шарҳ .aria-label = Шарҳ pdfjs-comment-floating-button-label = Шарҳ +pdfjs-editor-comment-button = + .title = Шарҳ + .aria-label = Шарҳ +pdfjs-editor-comment-button-label = Шарҳ pdfjs-editor-signature-button = .title = Илова кардани имзо pdfjs-editor-signature-button-label = Илова кардани имзо @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Муҳаррири матн .default-content = Матнро ворид кунед… -pdfjs-free-text = - .aria-label = Муҳаррири матн -pdfjs-free-text-default-content = Нависед… -pdfjs-ink = - .aria-label = Муҳаррири расмкашӣ -pdfjs-ink-canvas = - .aria-label = Тасвири эҷодкардаи корбар +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Шарҳ + *[other] Шарҳҳо + } +pdfjs-editor-comments-sidebar-close-button = + .title = Пӯшидани навори ҷонибӣ + .aria-label = Пӯшидани навори ҷонибӣ +pdfjs-editor-comments-sidebar-close-button-label = Пӯшидани навори ҷонибӣ +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Чизи диққатангезро мушоҳида кардед? Онро қайд кунед ва ба он шарҳ гузоред. +pdfjs-editor-comments-sidebar-no-comments-link = Маълумоти бештар ## Alt-text dialog pdfjs-editor-alt-text-button-label = Матни иловагӣ pdfjs-editor-alt-text-edit-button = .aria-label = Таҳрир кардани матни ивазкунанда -pdfjs-editor-alt-text-edit-button-label = Таҳрир кардани матни иловагӣ pdfjs-editor-alt-text-dialog-label = Имконеро интихоб намоед pdfjs-editor-alt-text-dialog-description = Вақте ки одамон тасвирро дида наметавонанд ё вақте ки тасвир бор карда намешавад, матни иловагӣ (Alt text) кумак мерасонад. pdfjs-editor-alt-text-add-description-label = Илова кардани тавсиф @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Кунҷи чапи боло — тағйир додани андоза -pdfjs-editor-resizer-label-top-middle = Канори миёнаи боло — тағйир додани андоза -pdfjs-editor-resizer-label-top-right = Кунҷи рости боло — тағйир додани андоза -pdfjs-editor-resizer-label-middle-right = Канори миёнаи рост — тағйир додани андоза -pdfjs-editor-resizer-label-bottom-right = Кунҷи рости поён — тағйир додани андоза -pdfjs-editor-resizer-label-bottom-middle = Канори миёнаи поён — тағйир додани андоза -pdfjs-editor-resizer-label-bottom-left = Кунҷи чапи поён — тағйир додани андоза -pdfjs-editor-resizer-label-middle-left = Канори миёнаи чап — тағйир додани андоза pdfjs-editor-resizer-top-left = .aria-label = Кунҷи чапи боло — тағйир додани андоза pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Бекор кардан pdfjs-editor-add-signature-add-button = Илова кардан pdfjs-editor-edit-signature-update-button = Навсозӣ кардан +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Таҳрир кардани шарҳ +pdfjs-editor-edit-comment-popup-button = + .title = Таҳрир кардани шарҳ +pdfjs-editor-delete-comment-popup-button-label = Тоза кардани шарҳ +pdfjs-editor-delete-comment-popup-button = + .title = Тоза кардани шарҳ +pdfjs-show-comment-button = + .title = Нишон додани шарҳ + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Амалҳо -pdfjs-editor-edit-comment-actions-button = - .title = Амалҳо -pdfjs-editor-edit-comment-close-button-label = Пӯшидан -pdfjs-editor-edit-comment-close-button = - .title = Пӯшидан -pdfjs-editor-edit-comment-actions-edit-button-label = Таҳрир кардан -pdfjs-editor-edit-comment-actions-delete-button-label = Нест кардан -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Шарҳи худро ворид кунед -pdfjs-editor-edit-comment-manager-cancel-button = Бекор кардан -pdfjs-editor-edit-comment-manager-save-button = Нигоҳ доштан +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Таҳрир кардани шарҳ +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Навсозӣ кардан +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Илова кардани шарҳ +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Илова кардан +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Нависед… +pdfjs-editor-edit-comment-dialog-cancel-button = Бекор кардан ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Таҳрир кардани шарҳ +pdfjs-editor-add-comment-button = + .title = Илова кардани шарҳ ## Main menu for adding/removing signatures diff --git a/l10n/th/viewer.ftl b/l10n/th/viewer.ftl index 4a1ac76e1766d..56f44522ee228 100644 --- a/l10n/th/viewer.ftl +++ b/l10n/th/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } ไบต์) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ไบต์) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ไบต์) pdfjs-document-properties-title = ชื่อเรื่อง: pdfjs-document-properties-author = ผู้สร้าง: pdfjs-document-properties-subject = ชื่อเรื่อง: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = วันที่แก้ไข: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = ผู้สร้าง: pdfjs-document-properties-producer = ผู้ผลิต PDF: pdfjs-document-properties-version = รุ่น PDF: @@ -267,10 +255,6 @@ pdfjs-rendering-error = เกิดข้อผิดพลาดขณะเ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -294,9 +278,13 @@ pdfjs-web-fonts-disabled = แบบอักษรเว็บถูกปิ pdfjs-editor-free-text-button = .title = ข้อความ +pdfjs-editor-color-picker-free-text-input = + .title = เปลี่ยนสีข้อความ pdfjs-editor-free-text-button-label = ข้อความ pdfjs-editor-ink-button = .title = รูปวาด +pdfjs-editor-color-picker-ink-input = + .title = เปลี่ยนสีรูปวาด pdfjs-editor-ink-button-label = รูปวาด pdfjs-editor-stamp-button = .title = เพิ่มหรือแก้ไขภาพ @@ -308,6 +296,14 @@ pdfjs-highlight-floating-button1 = .title = เน้นสี .aria-label = เน้นสี pdfjs-highlight-floating-button-label = เน้นสี +pdfjs-comment-floating-button = + .title = แสดงความคิดเห็น + .aria-label = แสดงความคิดเห็น +pdfjs-comment-floating-button-label = แสดงความคิดเห็น +pdfjs-editor-comment-button = + .title = แสดงความคิดเห็น + .aria-label = แสดงความคิดเห็น +pdfjs-editor-comment-button-label = ความคิดเห็น pdfjs-editor-signature-button = .title = เพิ่มลายเซ็น pdfjs-editor-signature-button-label = เพิ่มลายเซ็น @@ -370,20 +366,23 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = ตัวแก้ไขข้อความ .default-content = เริ่มพิมพ์ได้เลย… -pdfjs-free-text = - .aria-label = ตัวแก้ไขข้อความ -pdfjs-free-text-default-content = เริ่มพิมพ์… -pdfjs-ink = - .aria-label = ตัวแก้ไขรูปวาด -pdfjs-ink-canvas = - .aria-label = ภาพที่ผู้ใช้สร้างขึ้น +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = ความคิดเห็น +pdfjs-editor-comments-sidebar-close-button = + .title = ปิดแถบข้าง + .aria-label = ปิดแถบข้าง +pdfjs-editor-comments-sidebar-close-button-label = ปิดแถบข้าง +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = เห็นอะไรที่น่าสนใจใช่ไหม? เน้นสีไว้และแสดงความคิดเห็นได้เลย +pdfjs-editor-comments-sidebar-no-comments-link = เรียนรู้เพิ่มเติม ## Alt-text dialog pdfjs-editor-alt-text-button-label = ข้อความทดแทน pdfjs-editor-alt-text-edit-button = .aria-label = แก้ไขข้อความทดแทน -pdfjs-editor-alt-text-edit-button-label = แก้ไขข้อความทดแทน pdfjs-editor-alt-text-dialog-label = เลือกตัวเลือก pdfjs-editor-alt-text-dialog-description = ข้อความทดแทนสามารถช่วยเหลือได้เมื่อผู้ใช้มองไม่เห็นภาพ หรือภาพไม่โหลด pdfjs-editor-alt-text-add-description-label = เพิ่มคำอธิบาย @@ -403,14 +402,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = มุมซ้ายบน — ปรับขนาด -pdfjs-editor-resizer-label-top-middle = ตรงกลางด้านบน — ปรับขนาด -pdfjs-editor-resizer-label-top-right = มุมขวาบน — ปรับขนาด -pdfjs-editor-resizer-label-middle-right = ตรงกลางด้านขวา — ปรับขนาด -pdfjs-editor-resizer-label-bottom-right = มุมขวาล่าง — ปรับขนาด -pdfjs-editor-resizer-label-bottom-middle = ตรงกลางด้านล่าง — ปรับขนาด -pdfjs-editor-resizer-label-bottom-left = มุมซ้ายล่าง — ปรับขนาด -pdfjs-editor-resizer-label-middle-left = ตรงกลางด้านซ้าย — ปรับขนาด pdfjs-editor-resizer-top-left = .aria-label = มุมซ้ายบน — ปรับขนาด pdfjs-editor-resizer-top-middle = @@ -516,6 +507,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = แสดงตัว pdfjs-editor-alt-text-settings-show-dialog-description = ช่วยให้คุณแน่ใจว่าภาพทั้งหมดของคุณมีข้อความทดแทน pdfjs-editor-alt-text-settings-close-button = ปิด +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = เพิ่มการเน้นสีแล้ว +pdfjs-editor-freetext-added-alert = เพิ่มข้อความแล้ว +pdfjs-editor-ink-added-alert = เพิ่มรูปวาดแล้ว +pdfjs-editor-stamp-added-alert = เพิ่มภาพแล้ว +pdfjs-editor-signature-added-alert = เพิ่มลายเซ็นแล้ว + ## "Annotations removed" bar pdfjs-editor-undo-bar-message-highlight = เอาการเน้นสีออกแล้ว @@ -580,6 +579,8 @@ pdfjs-editor-add-signature-save-checkbox = บันทึกลายเซ็ pdfjs-editor-add-signature-save-warning-message = คุณมีลายเซ็นที่บันทึกถึงจำนวนสูงสุด 5 รายการแล้ว โปรดลบรายการหนึ่งออกเมื่อจะบันทึกเพิ่ม pdfjs-editor-add-signature-image-upload-error-title = ไม่สามารถอัปโหลดภาพได้ pdfjs-editor-add-signature-image-upload-error-description = ตรวจสอบการเชื่อมต่อเครือข่ายของคุณหรือลองใช้ภาพอื่น +pdfjs-editor-add-signature-image-no-data-error-title = ไม่สามารถแปลงภาพนี้ให้เป็นลายเซ็นได้ +pdfjs-editor-add-signature-image-no-data-error-description = โปรดลองอัปโหลดภาพอื่น pdfjs-editor-add-signature-error-close-button = ปิด ## Dialog buttons @@ -588,6 +589,34 @@ pdfjs-editor-add-signature-cancel-button = ยกเลิก pdfjs-editor-add-signature-add-button = เพิ่ม pdfjs-editor-edit-signature-update-button = อัปเดต +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = แก้ไขความคิดเห็น +pdfjs-editor-edit-comment-popup-button = + .title = แก้ไขความคิดเห็น +pdfjs-editor-delete-comment-popup-button-label = เอาความคิดเห็นออก +pdfjs-editor-delete-comment-popup-button = + .title = เอาความคิดเห็นออก +pdfjs-show-comment-button = + .title = แสดงความคิดเห็น + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = แก้ไขความคิดเห็น +pdfjs-editor-edit-comment-dialog-save-button-when-editing = อัปเดต +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = เพิ่มความคิดเห็น +pdfjs-editor-edit-comment-dialog-save-button-when-adding = เพิ่ม +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = เริ่มพิมพ์… +pdfjs-editor-edit-comment-dialog-cancel-button = ยกเลิก + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = เพิ่มความคิดเห็น + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/tl/viewer.ftl b/l10n/tl/viewer.ftl index 3fa7ae280deb0..628ef97b1b425 100644 --- a/l10n/tl/viewer.ftl +++ b/l10n/tl/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Mga Katangian ng Dokumento… pdfjs-document-properties-file-name = File name: pdfjs-document-properties-file-size = File size: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Pamagat: pdfjs-document-properties-author = May-akda: pdfjs-document-properties-subject = Paksa: pdfjs-document-properties-keywords = Mga keyword: pdfjs-document-properties-creation-date = Petsa ng Pagkakagawa: pdfjs-document-properties-modification-date = Petsa ng Pagkakabago: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Tagalikha: pdfjs-document-properties-producer = PDF Producer: pdfjs-document-properties-version = PDF Version: @@ -223,10 +211,6 @@ pdfjs-rendering-error = Nagkaproblema habang nirerender ang pahina. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/tr/viewer.ftl b/l10n/tr/viewer.ftl index 8d83db16f5914..4fa8a67bc5027 100644 --- a/l10n/tr/viewer.ftl +++ b/l10n/tr/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bayt) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bayt) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bayt) pdfjs-document-properties-title = Başlık: pdfjs-document-properties-author = Yazar: pdfjs-document-properties-subject = Konu: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Değiştirme tarihi: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date } { $time } pdfjs-document-properties-creator = Oluşturan: pdfjs-document-properties-producer = PDF üreticisi: pdfjs-document-properties-version = PDF sürümü: @@ -275,10 +263,6 @@ pdfjs-rendering-error = Sayfa yorumlanırken bir hata oluştu. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -324,6 +308,10 @@ pdfjs-comment-floating-button = .title = Yorum ekle .aria-label = Yorum ekle pdfjs-comment-floating-button-label = Yorum ekle +pdfjs-editor-comment-button = + .title = Yorum ekle + .aria-label = Yorum ekle +pdfjs-editor-comment-button-label = Yorum ekle pdfjs-editor-signature-button = .title = İmza ekle pdfjs-editor-signature-button-label = İmza ekle @@ -386,20 +374,27 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Metin düzenleyicisi .default-content = Yazmaya başlayın… -pdfjs-free-text = - .aria-label = Metin düzenleyicisi -pdfjs-free-text-default-content = Yazmaya başlayın… -pdfjs-ink = - .aria-label = Çizim düzenleyicisi -pdfjs-ink-canvas = - .aria-label = Kullanıcı tarafından oluşturulan resim +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Yorum + *[other] Yorumlar + } +pdfjs-editor-comments-sidebar-close-button = + .title = Kenar çubuğunu kapat + .aria-label = Kenar çubuğunu kapat +pdfjs-editor-comments-sidebar-close-button-label = Kenar çubuğunu kapat +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Not almaya değer bir şey mi gördünüz? Onu işaretleyip yorum yazabilirsiniz. +pdfjs-editor-comments-sidebar-no-comments-link = Daha fazla bilgi alın ## Alt-text dialog pdfjs-editor-alt-text-button-label = Alternatif metin pdfjs-editor-alt-text-edit-button = .aria-label = Alternatif metni düzenle -pdfjs-editor-alt-text-edit-button-label = Alternatif metni düzenle pdfjs-editor-alt-text-dialog-label = Bir seçenek seçin pdfjs-editor-alt-text-dialog-description = Alternatif metin, insanlar resmi göremediğinde veya resim yüklenmediğinde işe yarar. pdfjs-editor-alt-text-add-description-label = Açıklama ekle @@ -419,14 +414,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Sol üst köşe — yeniden boyutlandır -pdfjs-editor-resizer-label-top-middle = Üst orta — yeniden boyutlandır -pdfjs-editor-resizer-label-top-right = Sağ üst köşe — yeniden boyutlandır -pdfjs-editor-resizer-label-middle-right = Orta sağ — yeniden boyutlandır -pdfjs-editor-resizer-label-bottom-right = Sağ alt köşe — yeniden boyutlandır -pdfjs-editor-resizer-label-bottom-middle = Alt orta — yeniden boyutlandır -pdfjs-editor-resizer-label-bottom-left = Sol alt köşe — yeniden boyutlandır -pdfjs-editor-resizer-label-middle-left = Orta sol — yeniden boyutlandır pdfjs-editor-resizer-top-left = .aria-label = Sol üst köşe — yeniden boyutlandır pdfjs-editor-resizer-top-middle = @@ -618,25 +605,33 @@ pdfjs-editor-add-signature-cancel-button = Vazgeç pdfjs-editor-add-signature-add-button = Ekle pdfjs-editor-edit-signature-update-button = Güncelle +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Yorumu düzenle +pdfjs-editor-edit-comment-popup-button = + .title = Yorumu düzenle +pdfjs-editor-delete-comment-popup-button-label = Yorumu sil +pdfjs-editor-delete-comment-popup-button = + .title = Yorumu sil +pdfjs-show-comment-button = + .title = Yorumu göster + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Eylemler -pdfjs-editor-edit-comment-actions-button = - .title = Eylemler -pdfjs-editor-edit-comment-close-button-label = Kapat -pdfjs-editor-edit-comment-close-button = - .title = Kapat -pdfjs-editor-edit-comment-actions-edit-button-label = Düzenle -pdfjs-editor-edit-comment-actions-delete-button-label = Sil -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Yorumunuzu yazın -pdfjs-editor-edit-comment-manager-cancel-button = Vazgeç -pdfjs-editor-edit-comment-manager-save-button = Kaydet +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Yorumu düzenle +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Güncelle +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Yorum ekle +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Ekle +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Yazmaya başlayın… +pdfjs-editor-edit-comment-dialog-cancel-button = Vazgeç ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Yorumu düzenle +pdfjs-editor-add-comment-button = + .title = Yorum ekle ## Main menu for adding/removing signatures diff --git a/l10n/trs/viewer.ftl b/l10n/trs/viewer.ftl index 1b864cd3967d4..de1e8cbf31b96 100644 --- a/l10n/trs/viewer.ftl +++ b/l10n/trs/viewer.ftl @@ -89,24 +89,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Nej sa nikāj ñanj… pdfjs-document-properties-file-name = Si yugui archîbo: pdfjs-document-properties-file-size = Dàj yachìj archîbo: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Si yugui: pdfjs-document-properties-author = Sí girirà: pdfjs-document-properties-subject = Dugui': pdfjs-document-properties-keywords = Nej nuguan' huìi: pdfjs-document-properties-creation-date = Gui gurugui' man: pdfjs-document-properties-modification-date = Nuguan' nahuin nakà: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Guiri ro' pdfjs-document-properties-producer = Sa ri PDF: pdfjs-document-properties-version = PDF Version: diff --git a/l10n/uk/viewer.ftl b/l10n/uk/viewer.ftl index b61da6d6bd3de..2eca9e4250ec7 100644 --- a/l10n/uk/viewer.ftl +++ b/l10n/uk/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байтів) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } кБ ({ $size_b } байтів) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байтів) pdfjs-document-properties-title = Заголовок: pdfjs-document-properties-author = Автор: pdfjs-document-properties-subject = Тема: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Дата зміни: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Створено: pdfjs-document-properties-producer = Виробник PDF: pdfjs-document-properties-version = Версія PDF: @@ -277,10 +265,6 @@ pdfjs-rendering-error = Під час виведення сторінки ста ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -380,20 +364,12 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Текстовий редактор .default-content = Напишіть щось… -pdfjs-free-text = - .aria-label = Текстовий редактор -pdfjs-free-text-default-content = Почніть вводити… -pdfjs-ink = - .aria-label = Графічний редактор -pdfjs-ink-canvas = - .aria-label = Зображення, створене користувачем ## Alt-text dialog pdfjs-editor-alt-text-button-label = Альтернативний текст pdfjs-editor-alt-text-edit-button = .aria-label = Редагувати альтернативний текст -pdfjs-editor-alt-text-edit-button-label = Змінити альтернативний текст pdfjs-editor-alt-text-dialog-label = Вибрати варіант pdfjs-editor-alt-text-dialog-description = Альтернативний текст допомагає, коли зображення не видно або коли воно не завантажується. pdfjs-editor-alt-text-add-description-label = Додати опис @@ -413,14 +389,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Верхній лівий кут – зміна розміру -pdfjs-editor-resizer-label-top-middle = Вгорі посередині – зміна розміру -pdfjs-editor-resizer-label-top-right = Верхній правий кут – зміна розміру -pdfjs-editor-resizer-label-middle-right = Праворуч посередині – зміна розміру -pdfjs-editor-resizer-label-bottom-right = Нижній правий кут – зміна розміру -pdfjs-editor-resizer-label-bottom-middle = Внизу посередині – зміна розміру -pdfjs-editor-resizer-label-bottom-left = Нижній лівий кут – зміна розміру -pdfjs-editor-resizer-label-middle-left = Ліворуч посередині – зміна розміру pdfjs-editor-resizer-top-left = .aria-label = Верхній лівий кут – зміна розміру pdfjs-editor-resizer-top-middle = diff --git a/l10n/ur/viewer.ftl b/l10n/ur/viewer.ftl index dba94d8ed84ac..1d2e92de03554 100644 --- a/l10n/ur/viewer.ftl +++ b/l10n/ur/viewer.ftl @@ -82,24 +82,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = دستاویز خواص… pdfjs-document-properties-file-name = نام مسل: pdfjs-document-properties-file-size = مسل سائز: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = عنوان: pdfjs-document-properties-author = تخلیق کار: pdfjs-document-properties-subject = موضوع: pdfjs-document-properties-keywords = کلیدی الفاظ: pdfjs-document-properties-creation-date = تخلیق کی تاریخ: pdfjs-document-properties-modification-date = ترمیم کی تاریخ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }، { $time } pdfjs-document-properties-creator = تخلیق کار: pdfjs-document-properties-producer = PDF پیدا کار: pdfjs-document-properties-version = PDF ورژن: @@ -217,10 +205,6 @@ pdfjs-rendering-error = صفحہ بناتے ہوئے نقص آ گیا۔ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }.{ $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec diff --git a/l10n/uz/viewer.ftl b/l10n/uz/viewer.ftl index 32001c6ae97e1..8bc38e6433bd6 100644 --- a/l10n/uz/viewer.ftl +++ b/l10n/uz/viewer.ftl @@ -58,24 +58,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Hujjat xossalari pdfjs-document-properties-file-name = Fayl nomi: pdfjs-document-properties-file-size = Fayl hajmi: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Nomi: pdfjs-document-properties-author = Muallifi: pdfjs-document-properties-subject = Mavzusi: pdfjs-document-properties-keywords = Kalit so‘zlar pdfjs-document-properties-creation-date = Yaratilgan sanasi: pdfjs-document-properties-modification-date = O‘zgartirilgan sanasi -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Yaratuvchi: pdfjs-document-properties-producer = PDF ishlab chiqaruvchi: pdfjs-document-properties-version = PDF versiyasi: diff --git a/l10n/vi/viewer.ftl b/l10n/vi/viewer.ftl index 93f6c51057b05..1722fd75e8075 100644 --- a/l10n/vi/viewer.ftl +++ b/l10n/vi/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } byte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) pdfjs-document-properties-title = Tiêu đề: pdfjs-document-properties-author = Tác giả: pdfjs-document-properties-subject = Chủ đề: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = Ngày sửa đổi: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Người tạo: pdfjs-document-properties-producer = Phần mềm tạo PDF: pdfjs-document-properties-version = Phiên bản PDF: @@ -267,10 +255,6 @@ pdfjs-rendering-error = Lỗi khi hiển thị trang. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -313,9 +297,13 @@ pdfjs-highlight-floating-button1 = .aria-label = Đánh dấu pdfjs-highlight-floating-button-label = Đánh dấu pdfjs-comment-floating-button = - .title = Bình luận - .aria-label = Bình luận -pdfjs-comment-floating-button-label = Bình luận + .title = Chú thích + .aria-label = Chú thích +pdfjs-comment-floating-button-label = Chú thích +pdfjs-editor-comment-button = + .title = Chú thích + .aria-label = Chú thích +pdfjs-editor-comment-button-label = Chú thích pdfjs-editor-signature-button = .title = Thêm chữ ký pdfjs-editor-signature-button-label = Thêm chữ ký @@ -378,20 +366,23 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Trình chỉnh sửa văn bản .default-content = Bắt đầu nhập… -pdfjs-free-text = - .aria-label = Trình sửa văn bản -pdfjs-free-text-default-content = Bắt đầu nhập… -pdfjs-ink = - .aria-label = Trình sửa nét vẽ -pdfjs-ink-canvas = - .aria-label = Hình ảnh do người dùng tạo +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = Chú thích +pdfjs-editor-comments-sidebar-close-button = + .title = Đóng thanh lề + .aria-label = Đóng thanh lề +pdfjs-editor-comments-sidebar-close-button-label = Đóng thanh lề +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Bạn thấy điều gì đáng chú ý? Hãy đánh dấu và để lại chú thích. +pdfjs-editor-comments-sidebar-no-comments-link = Tìm hiểu thêm ## Alt-text dialog pdfjs-editor-alt-text-button-label = Văn bản thay thế pdfjs-editor-alt-text-edit-button = .aria-label = Chỉnh sửa văn bản thay thế -pdfjs-editor-alt-text-edit-button-label = Chỉnh sửa văn bản thay thế pdfjs-editor-alt-text-dialog-label = Chọn một lựa chọn pdfjs-editor-alt-text-dialog-description = Văn bản thay thế sẽ hữu ích khi mọi người không thể thấy hình ảnh hoặc khi hình ảnh không tải. pdfjs-editor-alt-text-add-description-label = Thêm một mô tả @@ -411,14 +402,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Trên cùng bên trái — thay đổi kích thước -pdfjs-editor-resizer-label-top-middle = Trên cùng ở giữa — thay đổi kích thước -pdfjs-editor-resizer-label-top-right = Trên cùng bên phải — thay đổi kích thước -pdfjs-editor-resizer-label-middle-right = Ở giữa bên phải — thay đổi kích thước -pdfjs-editor-resizer-label-bottom-right = Dưới cùng bên phải — thay đổi kích thước -pdfjs-editor-resizer-label-bottom-middle = Ở giữa dưới cùng — thay đổi kích thước -pdfjs-editor-resizer-label-bottom-left = Góc dưới bên trái — thay đổi kích thước -pdfjs-editor-resizer-label-middle-left = Ở giữa bên trái — thay đổi kích thước pdfjs-editor-resizer-top-left = .aria-label = Trên cùng bên trái — thay đổi kích thước pdfjs-editor-resizer-top-middle = @@ -606,25 +589,33 @@ pdfjs-editor-add-signature-cancel-button = Hủy bỏ pdfjs-editor-add-signature-add-button = Thêm pdfjs-editor-edit-signature-update-button = Cập nhật +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Chỉnh sửa chú thích +pdfjs-editor-edit-comment-popup-button = + .title = Chỉnh sửa chú thích +pdfjs-editor-delete-comment-popup-button-label = Xoá chú thích +pdfjs-editor-delete-comment-popup-button = + .title = Xoá chú thích +pdfjs-show-comment-button = + .title = Hiển thị chú thích + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Hành động -pdfjs-editor-edit-comment-actions-button = - .title = Hành động -pdfjs-editor-edit-comment-close-button-label = Đóng -pdfjs-editor-edit-comment-close-button = - .title = Đóng -pdfjs-editor-edit-comment-actions-edit-button-label = Chỉnh sửa -pdfjs-editor-edit-comment-actions-delete-button-label = Xóa -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Nhập bình luận của bạn -pdfjs-editor-edit-comment-manager-cancel-button = Hủy bỏ -pdfjs-editor-edit-comment-manager-save-button = Lưu +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Chỉnh sửa chú thích +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Cập nhật +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Thêm chú thích +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Thêm +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Bắt đầu nhập… +pdfjs-editor-edit-comment-dialog-cancel-button = Hủy bỏ ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = Chỉnh sửa bình luận +pdfjs-editor-add-comment-button = + .title = Thêm chú thích ## Main menu for adding/removing signatures diff --git a/l10n/xh/viewer.ftl b/l10n/xh/viewer.ftl index b57f62d0073ee..a55157ad3e1aa 100644 --- a/l10n/xh/viewer.ftl +++ b/l10n/xh/viewer.ftl @@ -71,24 +71,12 @@ pdfjs-document-properties-button = pdfjs-document-properties-button-label = Iipropati zoxwebhu… pdfjs-document-properties-file-name = Igama lefayile: pdfjs-document-properties-file-size = Isayizi yefayile: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB (iibhayiti{ $size_b }) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB (iibhayithi{ $size_b }) pdfjs-document-properties-title = Umxholo: pdfjs-document-properties-author = Umbhali: pdfjs-document-properties-subject = Umbandela: pdfjs-document-properties-keywords = Amagama aphambili: pdfjs-document-properties-creation-date = Umhla wokwenziwa kwayo: pdfjs-document-properties-modification-date = Umhla wokulungiswa kwayo: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Umntu oyenzileyo: pdfjs-document-properties-producer = Umvelisi we-PDF: pdfjs-document-properties-version = Uhlelo lwe-PDF: diff --git a/l10n/zh-CN/viewer.ftl b/l10n/zh-CN/viewer.ftl index 8ce3d955cf072..cf868ed816c63 100644 --- a/l10n/zh-CN/viewer.ftl +++ b/l10n/zh-CN/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB({ $b } 字节) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } 字节) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } 字节) pdfjs-document-properties-title = 标题: pdfjs-document-properties-author = 作者: pdfjs-document-properties-subject = 主题: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = 修改日期: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = 创建者: pdfjs-document-properties-producer = PDF 生成器: pdfjs-document-properties-version = PDF 版本: @@ -267,10 +255,6 @@ pdfjs-rendering-error = 渲染页面时发生错误。 ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date },{ $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -316,6 +300,10 @@ pdfjs-comment-floating-button = .title = 批注 .aria-label = 批注 pdfjs-comment-floating-button-label = 批注 +pdfjs-editor-comment-button = + .title = 批注 + .aria-label = 批注 +pdfjs-editor-comment-button-label = 批注 pdfjs-editor-signature-button = .title = 添加签名 pdfjs-editor-signature-button-label = 添加签名 @@ -378,20 +366,23 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = 文本编辑器 .default-content = 在此键入… -pdfjs-free-text = - .aria-label = 文本编辑器 -pdfjs-free-text-default-content = 开始输入… -pdfjs-ink = - .aria-label = 绘图编辑器 -pdfjs-ink-canvas = - .aria-label = 用户创建图像 +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = 批注 +pdfjs-editor-comments-sidebar-close-button = + .title = 关闭侧栏 + .aria-label = 关闭侧栏 +pdfjs-editor-comments-sidebar-close-button-label = 关闭侧栏 +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = 发现值得注意的地方?可为其添加高亮并批注。 +pdfjs-editor-comments-sidebar-no-comments-link = 详细了解 ## Alt-text dialog pdfjs-editor-alt-text-button-label = 替换文字 pdfjs-editor-alt-text-edit-button = .aria-label = 编辑替换文字 -pdfjs-editor-alt-text-edit-button-label = 编辑替换文字 pdfjs-editor-alt-text-dialog-label = 选择一项 pdfjs-editor-alt-text-dialog-description = 替换文字可在用户无法看到或加载图像时,描述其内容。 pdfjs-editor-alt-text-add-description-label = 添加描述 @@ -411,14 +402,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = 调整尺寸 - 左上角 -pdfjs-editor-resizer-label-top-middle = 调整尺寸 - 顶部中间 -pdfjs-editor-resizer-label-top-right = 调整尺寸 - 右上角 -pdfjs-editor-resizer-label-middle-right = 调整尺寸 - 右侧中间 -pdfjs-editor-resizer-label-bottom-right = 调整尺寸 - 右下角 -pdfjs-editor-resizer-label-bottom-middle = 调整大小 - 底部中间 -pdfjs-editor-resizer-label-bottom-left = 调整尺寸 - 左下角 -pdfjs-editor-resizer-label-middle-left = 调整尺寸 - 左侧中间 pdfjs-editor-resizer-top-left = .aria-label = 调整尺寸 - 左上角 pdfjs-editor-resizer-top-middle = @@ -606,25 +589,33 @@ pdfjs-editor-add-signature-cancel-button = 取消 pdfjs-editor-add-signature-add-button = 添加 pdfjs-editor-edit-signature-update-button = 更新 +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = 编辑批注 +pdfjs-editor-edit-comment-popup-button = + .title = 编辑批注 +pdfjs-editor-delete-comment-popup-button-label = 移除批注 +pdfjs-editor-delete-comment-popup-button = + .title = 移除批注 +pdfjs-show-comment-button = + .title = 显示批注 + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = 操作 -pdfjs-editor-edit-comment-actions-button = - .title = 操作 -pdfjs-editor-edit-comment-close-button-label = 关闭 -pdfjs-editor-edit-comment-close-button = - .title = 关闭 -pdfjs-editor-edit-comment-actions-edit-button-label = 编辑 -pdfjs-editor-edit-comment-actions-delete-button-label = 删除 -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = 输入批注 -pdfjs-editor-edit-comment-manager-cancel-button = 取消 -pdfjs-editor-edit-comment-manager-save-button = 保存 +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = 编辑批注 +pdfjs-editor-edit-comment-dialog-save-button-when-editing = 更新 +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = 添加批注 +pdfjs-editor-edit-comment-dialog-save-button-when-adding = 添加 +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = 开始键入… +pdfjs-editor-edit-comment-dialog-cancel-button = 取消 ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = 编辑批注 +pdfjs-editor-add-comment-button = + .title = 添加批注 ## Main menu for adding/removing signatures diff --git a/l10n/zh-TW/viewer.ftl b/l10n/zh-TW/viewer.ftl index 312d27a713ca3..4a79d68e4de37 100644 --- a/l10n/zh-TW/viewer.ftl +++ b/l10n/zh-TW/viewer.ftl @@ -112,14 +112,6 @@ pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } # $mb (Number) - the PDF file size in megabytes # $b (Number) - the PDF file size in bytes pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB({ $b } 位元組) -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB({ $size_b } 位元組) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB({ $size_b } 位元組) pdfjs-document-properties-title = 標題: pdfjs-document-properties-author = 作者: pdfjs-document-properties-subject = 主旨: @@ -129,10 +121,6 @@ pdfjs-document-properties-modification-date = 修改日期: # Variables: # $dateObj (Date) - the creation/modification date and time of the PDF file pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date } { $time } pdfjs-document-properties-creator = 建立者: pdfjs-document-properties-producer = PDF 產生器: pdfjs-document-properties-version = PDF 版本: @@ -267,10 +255,6 @@ pdfjs-rendering-error = 描繪頁面時發生錯誤。 ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -316,6 +300,10 @@ pdfjs-comment-floating-button = .title = 註解 .aria-label = 註解 pdfjs-comment-floating-button-label = 註解 +pdfjs-editor-comment-button = + .title = 註解 + .aria-label = 註解 +pdfjs-editor-comment-button-label = 註解 pdfjs-editor-signature-button = .title = 加入簽章 pdfjs-editor-signature-button-label = 加入簽章 @@ -378,20 +366,23 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = 文字編輯器 .default-content = 請打字… -pdfjs-free-text = - .aria-label = 文本編輯器 -pdfjs-free-text-default-content = 在此打字… -pdfjs-ink = - .aria-label = 圖形編輯器 -pdfjs-ink-canvas = - .aria-label = 使用者建立的圖片 +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = 註解 +pdfjs-editor-comments-sidebar-close-button = + .title = 關閉側邊欄 + .aria-label = 關閉側邊欄 +pdfjs-editor-comments-sidebar-close-button-label = 關閉側邊欄 +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = 想把哪個部分記下來?可以畫螢光強調,並且留下註解。 +pdfjs-editor-comments-sidebar-no-comments-link = 更多資訊 ## Alt-text dialog pdfjs-editor-alt-text-button-label = 替代文字 pdfjs-editor-alt-text-edit-button = .aria-label = 編輯替代文字 -pdfjs-editor-alt-text-edit-button-label = 編輯替代文字 pdfjs-editor-alt-text-dialog-label = 挑選一種 pdfjs-editor-alt-text-dialog-description = 替代文字可協助盲人,或於圖片無法載入時提供說明。 pdfjs-editor-alt-text-add-description-label = 新增描述 @@ -411,14 +402,6 @@ pdfjs-editor-alt-text-button = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = 左上角 — 調整大小 -pdfjs-editor-resizer-label-top-middle = 頂部中間 — 調整大小 -pdfjs-editor-resizer-label-top-right = 右上角 — 調整大小 -pdfjs-editor-resizer-label-middle-right = 中間右方 — 調整大小 -pdfjs-editor-resizer-label-bottom-right = 右下角 — 調整大小 -pdfjs-editor-resizer-label-bottom-middle = 底部中間 — 調整大小 -pdfjs-editor-resizer-label-bottom-left = 左下角 — 調整大小 -pdfjs-editor-resizer-label-middle-left = 中間左方 — 調整大小 pdfjs-editor-resizer-top-left = .aria-label = 左上角 — 調整大小 pdfjs-editor-resizer-top-middle = @@ -606,25 +589,33 @@ pdfjs-editor-add-signature-cancel-button = 取消 pdfjs-editor-add-signature-add-button = 新增 pdfjs-editor-edit-signature-update-button = 更新 +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = 編輯註解 +pdfjs-editor-edit-comment-popup-button = + .title = 編輯註解 +pdfjs-editor-delete-comment-popup-button-label = 移除註解 +pdfjs-editor-delete-comment-popup-button = + .title = 移除註解 +pdfjs-show-comment-button = + .title = 顯示註解 + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = 動作 -pdfjs-editor-edit-comment-actions-button = - .title = 動作 -pdfjs-editor-edit-comment-close-button-label = 關閉 -pdfjs-editor-edit-comment-close-button = - .title = 關閉 -pdfjs-editor-edit-comment-actions-edit-button-label = 編輯 -pdfjs-editor-edit-comment-actions-delete-button-label = 刪除 -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = 輸入您的註解 -pdfjs-editor-edit-comment-manager-cancel-button = 取消 -pdfjs-editor-edit-comment-manager-save-button = 儲存 +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = 編輯註解 +pdfjs-editor-edit-comment-dialog-save-button-when-editing = 更新 +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = 新增註解 +pdfjs-editor-edit-comment-dialog-save-button-when-adding = 新增 +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = 在此打字… +pdfjs-editor-edit-comment-dialog-cancel-button = 取消 ## Edit a comment button in the editor toolbar -pdfjs-editor-edit-comment-button = - .title = 編輯註解 +pdfjs-editor-add-comment-button = + .title = 新增註解 ## Main menu for adding/removing signatures diff --git a/package-lock.json b/package-lock.json index aaebb41609325..5091ca8a266ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,30 +10,31 @@ "dompurify": "^3.2.4" }, "devDependencies": { - "@babel/core": "^7.28.3", - "@babel/preset-env": "^7.28.3", - "@babel/runtime": "^7.28.3", - "@csstools/postcss-light-dark-function": "^2.0.9", + "@babel/core": "^7.28.5", + "@babel/preset-env": "^7.28.5", + "@babel/runtime": "^7.28.4", + "@csstools/postcss-light-dark-function": "^2.0.11", "@fluent/bundle": "^0.19.1", "@fluent/dom": "^0.10.2", "@metalsmith/layouts": "^3.0.0", "@metalsmith/markdown": "^1.10.0", - "@napi-rs/canvas": "^0.1.77", - "@types/node": "^24.3.0", - "autoprefixer": "^10.4.21", + "@napi-rs/canvas": "^0.1.88", + "@types/node": "^25.0.3", + "autoprefixer": "^10.4.23", "babel-loader": "^10.0.0", - "caniuse-lite": "^1.0.30001735", - "core-js": "^3.45.0", - "eslint": "^9.33.0", + "cached-iterable": "^0.3.0", + "caniuse-lite": "^1.0.30001762", + "core-js": "^3.47.0", + "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jasmine": "^4.2.2", "eslint-plugin-json": "^4.0.1", - "eslint-plugin-no-unsanitized": "^4.1.2", - "eslint-plugin-perfectionist": "^4.15.0", + "eslint-plugin-no-unsanitized": "^4.1.4", + "eslint-plugin-perfectionist": "^5.2.0", "eslint-plugin-prettier": "^5.5.4", - "eslint-plugin-unicorn": "^60.0.0", - "globals": "^16.3.0", + "eslint-plugin-unicorn": "^62.0.0", + "globals": "^17.0.0", "gulp": "^5.0.1", "gulp-artifactory-upload": "^1.3.0", "gulp-cli": "^3.1.0", @@ -42,28 +43,30 @@ "gulp-replace": "^1.1.4", "gulp-zip": "^6.1.0", "highlight.js": "^11.11.1", - "jasmine": "^5.9.0", - "jsdoc": "^4.0.4", + "jasmine": "^5.13.0", + "jsdoc": "^4.0.5", "jstransformer-nunjucks": "^1.2.0", "metalsmith": "^2.6.3", - "metalsmith-html-relative": "^2.0.7", + "metalsmith-html-relative": "^2.0.9", + "node-readable-to-web-readable-stream": "^0.4.2", "ordered-read-streams": "^2.0.0", "pngjs": "^7.0.0", "postcss": "^8.5.6", "postcss-dir-pseudo-class": "^9.0.1", - "postcss-discard-comments": "^7.0.4", + "postcss-discard-comments": "^7.0.5", "postcss-nesting": "^13.0.2", - "prettier": "^3.6.2", - "puppeteer": "^24.17.0", - "stylelint": "^16.23.1", + "postcss-values-parser": "^7.0.0", + "prettier": "^3.7.4", + "puppeteer": "^24.34.0", + "stylelint": "^16.26.1", "stylelint-prettier": "^5.0.3", - "svglint": "^4.1.0", - "terser-webpack-plugin": "^5.3.14", + "svglint": "^4.1.2", + "terser-webpack-plugin": "^5.3.16", "tsc-alias": "^1.8.16", "ttest": "^4.0.0", - "typescript": "^5.9.2", + "typescript": "^5.9.3", "vinyl": "^3.0.1", - "webpack": "^5.101.2", + "webpack": "^5.104.1", "webpack-stream": "^7.0.0", "yargs": "^18.0.0" }, @@ -71,41 +74,6 @@ "node": ">=20.16.0 || >=22.3.0" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -122,9 +90,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -132,22 +100,22 @@ } }, "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -162,24 +130,15 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -218,24 +177,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", @@ -258,16 +199,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", @@ -286,15 +217,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", @@ -452,9 +374,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -472,42 +394,42 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -517,14 +439,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -605,6 +527,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -649,6 +572,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -729,9 +653,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", "dev": true, "license": "MIT", "dependencies": { @@ -779,9 +703,9 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", - "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "dev": true, "license": "MIT", "dependencies": { @@ -790,7 +714,7 @@ "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -817,14 +741,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -917,9 +841,9 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", "dev": true, "license": "MIT", "dependencies": { @@ -1016,9 +940,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", "dev": true, "license": "MIT", "dependencies": { @@ -1082,16 +1006,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1183,9 +1107,9 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "dev": true, "license": "MIT", "dependencies": { @@ -1193,7 +1117,7 @@ "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1236,9 +1160,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1320,9 +1244,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", - "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "dev": true, "license": "MIT", "dependencies": { @@ -1517,17 +1441,17 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", - "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.0", + "@babel/compat-data": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", @@ -1540,42 +1464,42 @@ "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-block-scoping": "^7.28.5", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regenerator": "^7.28.4", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1601,20 +1525,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -1625,9 +1541,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", - "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "dev": true, "license": "MIT", "engines": { @@ -1650,18 +1566,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -1669,19 +1585,80 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@cacheable/memory": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.6.tgz", + "integrity": "sha512-7e8SScMocHxcAb8YhtkbMhGG+EKLRIficb1F5sjvhSYsWTZGxvg4KIDp8kgxnV2PUJ3ddPe6J9QESjKvBWRDkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.3.2", + "@keyv/bigmap": "^1.3.0", + "hookified": "^1.13.0", + "keyv": "^5.5.4" + } + }, + "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.0.tgz", + "integrity": "sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.2.0", + "hookified": "^1.13.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.5.4" + } + }, + "node_modules/@cacheable/memory/node_modules/keyv": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", + "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.3.2.tgz", + "integrity": "sha512-8kGE2P+HjfY8FglaOiW+y8qxcaQAfAhVML+i66XJR3YX5FtyDqn6Txctr3K2FrbxLKixRRYYBWMbuGciOhYNDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.2.0", + "keyv": "^5.5.4" + } + }, + "node_modules/@cacheable/utils/node_modules/keyv": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", + "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, "node_modules/@csstools/css-parser-algorithms": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", @@ -1705,6 +1682,26 @@ "@csstools/css-tokenizer": "^3.0.4" } }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.20.tgz", + "integrity": "sha512-8BHsjXfSciZxjmHQOuVdW2b8WLUPts9a+mfL13/PzEviufUEW2xnvQuOlKs9dRBHgRqJ53SF/DUoK9+MZk72oQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "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/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, "node_modules/@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", @@ -1750,9 +1747,9 @@ } }, "node_modules/@csstools/postcss-light-dark-function": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.9.tgz", - "integrity": "sha512-1tCZH5bla0EAkFAI2r0H33CDnIBeLUaJh1p+hvvsylJ4svsv2wOmJjJn+OXwUZLXef37GYbRIVKX+X+g6m+3CQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", "dev": true, "funding": [ { @@ -1768,7 +1765,7 @@ "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -1779,9 +1776,9 @@ } }, "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.1.0.tgz", - "integrity": "sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "dev": true, "funding": [ { @@ -1827,6 +1824,29 @@ "postcss-selector-parser": "^7.0.0" } }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "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/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, "node_modules/@csstools/utilities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", @@ -1850,21 +1870,82 @@ "postcss": "^8.4" } }, + "node_modules/@dot/log": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@dot/log/-/log-0.1.5.tgz", + "integrity": "sha512-ECraEVJWv2f2mWK93lYiefUkphStVlKD6yKDzisuoEmxuLKrxO9iGetHK2DoEAkj7sxjE886n0OUVVCUx0YPNg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "chalk": "^4.1.2", + "loglevelnext": "^6.0.0", + "p-defer": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@dot/versioner": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@dot/versioner/-/versioner-0.4.2.tgz", + "integrity": "sha512-4P79BJ30WmHm4J2ZfAT7bRBgVFmzoNHoxyvc+dguL/k2k/+iFVXrUxDhxAsyNbYw1iixuBb5MiuQTfR7l3NvhQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@dot/log": "^0.1.5", + "chalk": "^4.1.2", + "conventional-commits-parser": "^3.2.4", + "execa": "^5.1.1", + "semver": "^7.5.1", + "source-map-support": "^0.5.21", + "write-pkg": "^4.0.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "versioner": "dist/versioner.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@dot/versioner/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@dot/versioner/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/@dual-bundle/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", "dev": true, "license": "MIT", "funding": { "type": "github", - "url": "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/sponsors/wooorm" + "url": "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/sponsors/JounQin" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -1880,6 +1961,19 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", @@ -1891,13 +1985,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -1906,19 +2000,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1952,13 +2049,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -1972,23 +2062,10 @@ "url": "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/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/js": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", - "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -1999,9 +2076,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2009,13 +2086,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { @@ -2081,38 +2158,25 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "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/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -2122,9 +2186,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2135,11 +2199,35 @@ "url": "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/sponsors/nzakas" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -2152,41 +2240,19 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "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/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "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/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -2199,42 +2265,10 @@ "url": "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/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "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/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "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/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { @@ -2242,28 +2276,31 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, - "engines": { - "node": ">=6.0.0" + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", "dependencies": { @@ -2272,16 +2309,16 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2290,10 +2327,11 @@ } }, "node_modules/@jsdoc/salty": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.1.tgz", - "integrity": "sha512-JXwylDNSHa549N9uceDYu8D4GMXwSo3H8CCPYEQqxhhHpxD28+lRl2b3bS/caaPj5w1YD3SWtrficJNTnUjGpg==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz", + "integrity": "sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "lodash": "^4.17.21" }, @@ -2302,9 +2340,9 @@ } }, "node_modules/@keyv/serialize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.0.tgz", - "integrity": "sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", "dev": true, "license": "MIT" }, @@ -2344,9 +2382,9 @@ } }, "node_modules/@napi-rs/canvas": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.77.tgz", - "integrity": "sha512-N9w2DkEKE1AXGp3q55GBOP6BEoFrqChDiFqJtKViTpQCWNOSVuMz7LkoGehbnpxtidppbsC36P0kCZNqJKs29w==", + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.88.tgz", + "integrity": "sha512-/p08f93LEbsL5mDZFQ3DBxcPv/I4QG9EDYRRq1WNlCOXVfAHBTHMSVMwxlqG/AtnSfUr9+vgfN7MKiyDo0+Weg==", "dev": true, "license": "MIT", "workspaces": [ @@ -2355,23 +2393,28 @@ "engines": { "node": ">= 10" }, + "funding": { + "type": "github", + "url": "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/sponsors/Brooooooklyn" + }, "optionalDependencies": { - "@napi-rs/canvas-android-arm64": "0.1.77", - "@napi-rs/canvas-darwin-arm64": "0.1.77", - "@napi-rs/canvas-darwin-x64": "0.1.77", - "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.77", - "@napi-rs/canvas-linux-arm64-gnu": "0.1.77", - "@napi-rs/canvas-linux-arm64-musl": "0.1.77", - "@napi-rs/canvas-linux-riscv64-gnu": "0.1.77", - "@napi-rs/canvas-linux-x64-gnu": "0.1.77", - "@napi-rs/canvas-linux-x64-musl": "0.1.77", - "@napi-rs/canvas-win32-x64-msvc": "0.1.77" + "@napi-rs/canvas-android-arm64": "0.1.88", + "@napi-rs/canvas-darwin-arm64": "0.1.88", + "@napi-rs/canvas-darwin-x64": "0.1.88", + "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.88", + "@napi-rs/canvas-linux-arm64-gnu": "0.1.88", + "@napi-rs/canvas-linux-arm64-musl": "0.1.88", + "@napi-rs/canvas-linux-riscv64-gnu": "0.1.88", + "@napi-rs/canvas-linux-x64-gnu": "0.1.88", + "@napi-rs/canvas-linux-x64-musl": "0.1.88", + "@napi-rs/canvas-win32-arm64-msvc": "0.1.88", + "@napi-rs/canvas-win32-x64-msvc": "0.1.88" } }, "node_modules/@napi-rs/canvas-android-arm64": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.77.tgz", - "integrity": "sha512-jC8YX0rbAnu9YrLK1A52KM2HX9EDjrJSCLVuBf9Dsov4IC6GgwMLS2pwL9GFLJnSZBFgdwnA84efBehHT9eshA==", + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.88.tgz", + "integrity": "sha512-KEaClPnZuVxJ8smUWjV1wWFkByBO/D+vy4lN+Dm5DFH514oqwukxKGeck9xcKJhaWJGjfruGmYGiwRe//+/zQQ==", "cpu": [ "arm64" ], @@ -2383,12 +2426,16 @@ ], "engines": { "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "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/sponsors/Brooooooklyn" } }, "node_modules/@napi-rs/canvas-darwin-arm64": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.77.tgz", - "integrity": "sha512-VFaCaCgAV0+hPwXajDIiHaaGx4fVCuUVYp/CxCGXmTGz699ngIEBx3Sa2oDp0uk3X+6RCRLueb7vD44BKBiPIg==", + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.88.tgz", + "integrity": "sha512-Xgywz0dDxOKSgx3eZnK85WgGMmGrQEW7ZLA/E7raZdlEE+xXCozobgqz2ZvYigpB6DJFYkqnwHjqCOTSDGlFdg==", "cpu": [ "arm64" ], @@ -2400,12 +2447,16 @@ ], "engines": { "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "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/sponsors/Brooooooklyn" } }, "node_modules/@napi-rs/canvas-darwin-x64": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.77.tgz", - "integrity": "sha512-uD2NSkf6I4S3o0POJDwweK85FE4rfLNA2N714MgiEEMMw5AmupfSJGgpYzcyEXtPzdaca6rBfKcqNvzR1+EyLQ==", + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.88.tgz", + "integrity": "sha512-Yz4wSCIQOUgNucgk+8NFtQxQxZV5NO8VKRl9ePKE6XoNyNVC8JDqtvhh3b3TPqKK8W5p2EQpAr1rjjm0mfBxdg==", "cpu": [ "x64" ], @@ -2417,12 +2468,16 @@ ], "engines": { "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "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/sponsors/Brooooooklyn" } }, "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.77.tgz", - "integrity": "sha512-03GxMMZGhHRQxiA4gyoKT6iQSz8xnA6T9PAfg/WNJnbkVMFZG782DwUJUb39QIZ1uE1euMCPnDgWAJ092MmgJQ==", + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.88.tgz", + "integrity": "sha512-9gQM2SlTo76hYhxHi2XxWTAqpTOb+JtxMPEIr+H5nAhHhyEtNmTSDRtz93SP7mGd2G3Ojf2oF5tP9OdgtgXyKg==", "cpu": [ "arm" ], @@ -2434,12 +2489,16 @@ ], "engines": { "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "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/sponsors/Brooooooklyn" } }, "node_modules/@napi-rs/canvas-linux-arm64-gnu": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.77.tgz", - "integrity": "sha512-ZO+d2gRU9JU1Bb7SgJcJ1k9wtRMCpSWjJAJ+2phhu0Lw5As8jYXXXmLKmMTGs1bOya2dBMYDLzwp7KS/S/+aCA==", + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.88.tgz", + "integrity": "sha512-7qgaOBMXuVRk9Fzztzr3BchQKXDxGbY+nwsovD3I/Sx81e+sX0ReEDYHTItNb0Je4NHbAl7D0MKyd4SvUc04sg==", "cpu": [ "arm64" ], @@ -2451,12 +2510,16 @@ ], "engines": { "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "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/sponsors/Brooooooklyn" } }, "node_modules/@napi-rs/canvas-linux-arm64-musl": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.77.tgz", - "integrity": "sha512-S1KtnP1+nWs2RApzNkdNf8X4trTLrHaY7FivV61ZRaL8NvuGOkSkKa+gWN2iedIGFEDz6gecpl/JAUSewwFXYg==", + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.88.tgz", + "integrity": "sha512-kYyNrUsHLkoGHBc77u4Unh067GrfiCUMbGHC2+OTxbeWfZkPt2o32UOQkhnSswKd9Fko/wSqqGkY956bIUzruA==", "cpu": [ "arm64" ], @@ -2468,12 +2531,16 @@ ], "engines": { "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "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/sponsors/Brooooooklyn" } }, "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.77.tgz", - "integrity": "sha512-A4YIKFYUwDtrSzCtdCAO5DYmRqlhCVKHdpq0+dBGPnIEhOQDFkPBTfoTAjO3pjlEnorlfKmNMOH21sKQg2esGA==", + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.88.tgz", + "integrity": "sha512-HVuH7QgzB0yavYdNZDRyAsn/ejoXB0hn8twwFnOqUbCCdkV+REna7RXjSR7+PdfW0qMQ2YYWsLvVBT5iL/mGpw==", "cpu": [ "riscv64" ], @@ -2485,12 +2552,16 @@ ], "engines": { "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "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/sponsors/Brooooooklyn" } }, "node_modules/@napi-rs/canvas-linux-x64-gnu": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.77.tgz", - "integrity": "sha512-Lt6Sef5l0+5O1cSZ8ysO0JI+x+rSrqZyXs5f7+kVkCAOVq8X5WTcDVbvWvEs2aRhrWTp5y25Jf2Bn+3IcNHOuQ==", + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.88.tgz", + "integrity": "sha512-hvcvKIcPEQrvvJtJnwD35B3qk6umFJ8dFIr8bSymfrSMem0EQsfn1ztys8ETIFndTwdNWJKWluvxztA41ivsEw==", "cpu": [ "x64" ], @@ -2502,12 +2573,16 @@ ], "engines": { "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "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/sponsors/Brooooooklyn" } }, "node_modules/@napi-rs/canvas-linux-x64-musl": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.77.tgz", - "integrity": "sha512-NiNFvC+D+omVeJ3IjYlIbyt/igONSABVe9z0ZZph29epHgZYu4eHwV9osfpRt1BGGOAM8LkFrHk4LBdn2EDymA==", + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.88.tgz", + "integrity": "sha512-eSMpGYY2xnZSQ6UxYJ6plDboxq4KeJ4zT5HaVkUnbObNN6DlbJe0Mclh3wifAmquXfrlgTZt6zhHsUgz++AK6g==", "cpu": [ "x64" ], @@ -2519,12 +2594,37 @@ ], "engines": { "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "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/sponsors/Brooooooklyn" + } + }, + "node_modules/@napi-rs/canvas-win32-arm64-msvc": { + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.88.tgz", + "integrity": "sha512-qcIFfEgHrchyYqRrxsCeTQgpJZ/GqHiqPcU/Fvw/ARVlQeDX1VyFH+X+0gCR2tca6UJrq96vnW+5o7buCq+erA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "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/sponsors/Brooooooklyn" } }, "node_modules/@napi-rs/canvas-win32-x64-msvc": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.77.tgz", - "integrity": "sha512-fP6l0hZiWykyjvpZTS3sI46iib8QEflbPakNoUijtwyxRuOPTTBfzAWZUz5z2vKpJJ/8r305wnZeZ8lhsBHY5A==", + "version": "0.1.88", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.88.tgz", + "integrity": "sha512-ROVqbfS4QyZxYkqmaIBBpbz/BQvAR+05FXM5PAtTYVc0uyY8Y4BHJSMdGAaMf6TdIVRsQsiq+FG/dH9XhvWCFQ==", "cpu": [ "x64" ], @@ -2536,6 +2636,10 @@ ], "engines": { "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "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/sponsors/Brooooooklyn" } }, "node_modules/@nodelib/fs.scandir": { @@ -2543,6 +2647,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2556,6 +2661,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -2565,6 +2671,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2578,15 +2685,16 @@ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" } }, "node_modules/@pkgr/core": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz", - "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "license": "MIT", "engines": { @@ -2597,18 +2705,18 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "2.10.7", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.7.tgz", - "integrity": "sha512-wHWLkQWBjHtajZeqCB74nsa/X70KheyOhySYBRmVQDJiNj0zjZR/naPCvdWjMhcG1LmjaMV/9WtTo5mpe8qWLw==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.11.0.tgz", + "integrity": "sha512-n6oQX6mYkG8TRPuPXmbPidkUbsSRalhmaaVAQxvH1IkQy63cwsH+kOjB3e4cpCDHg0aSvsiX9bQ4s2VB6mGWUQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "debug": "^4.4.1", + "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", - "semver": "^7.7.2", - "tar-fs": "^3.1.0", + "semver": "^7.7.3", + "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, "bin": { @@ -2618,6 +2726,16 @@ "node": ">=18" } }, + "node_modules/@puppeteer/browsers/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@puppeteer/browsers/node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -2633,6 +2751,50 @@ "node": ">=12" } }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@puppeteer/browsers/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "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/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@puppeteer/browsers/node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -2652,6 +2814,16 @@ "node": ">=12" } }, + "node_modules/@puppeteer/browsers/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -2674,10 +2846,11 @@ "license": "MIT" }, "node_modules/@types/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -2705,7 +2878,8 @@ "version": "1.20.4", "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -2718,19 +2892,22 @@ "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "dev": true, + "license": "MIT", "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" @@ -2740,18 +2917,33 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.16.0" } }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -2782,14 +2974,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", - "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.51.0.tgz", + "integrity": "sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.1", - "@typescript-eslint/types": "^8.39.1", + "@typescript-eslint/tsconfig-utils": "^8.51.0", + "@typescript-eslint/types": "^8.51.0", "debug": "^4.3.4" }, "engines": { @@ -2804,14 +2996,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", - "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.51.0.tgz", + "integrity": "sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1" + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2822,9 +3014,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", - "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.51.0.tgz", + "integrity": "sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==", "dev": true, "license": "MIT", "engines": { @@ -2839,9 +3031,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", - "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.51.0.tgz", + "integrity": "sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==", "dev": true, "license": "MIT", "engines": { @@ -2853,22 +3045,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", - "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.51.0.tgz", + "integrity": "sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.39.1", - "@typescript-eslint/tsconfig-utils": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", + "@typescript-eslint/project-service": "8.51.0", + "@typescript-eslint/tsconfig-utils": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2907,17 +3098,30 @@ "url": "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/sponsors/isaacs" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.1.tgz", - "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.51.0.tgz", + "integrity": "sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1" + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2932,13 +3136,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", - "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.51.0.tgz", + "integrity": "sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/types": "8.51.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -2949,23 +3153,10 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3158,9 +3349,9 @@ } }, "node_modules/acorn-import-phases": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.3.tgz", - "integrity": "sha512-jtKLnfoOzm28PazuQ4dVBcE9Jeo6ha1GAJvq3N0LlNOszmTfx+wSycBehn+FN0RnyeR77IBxN/qVYMw0Rlj0Xw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, "license": "MIT", "engines": { @@ -3212,6 +3403,7 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -3225,15 +3417,16 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -3244,13 +3437,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ansi-colors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-wrap": "^0.1.0" }, @@ -3259,9 +3454,9 @@ } }, "node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", + "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3277,8 +3472,9 @@ "node_modules/ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", "dev": true, + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -3287,13 +3483,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "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/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -3315,8 +3514,9 @@ "node_modules/ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3336,19 +3536,18 @@ } }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } + "license": "Python-2.0" }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3356,8 +3555,9 @@ "node_modules/arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3427,6 +3627,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3513,11 +3714,22 @@ "url": "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/sponsors/ljharb" } }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" }, "node_modules/asn1": { "version": "0.2.6", @@ -3542,8 +3754,9 @@ "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3617,9 +3830,9 @@ "license": "MIT" }, "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", "dev": true, "funding": [ { @@ -3637,10 +3850,9 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -3688,11 +3900,19 @@ "license": "MIT" }, "node_modules/b4a": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/babel-loader": { "version": "10.0.0", @@ -3726,16 +3946,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", @@ -3779,30 +3989,32 @@ } }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" }, "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", "dev": true, - "license": "Apache-2.0", - "optional": true + "license": "Apache-2.0" }, "node_modules/bare-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.1.tgz", - "integrity": "sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.2.tgz", + "integrity": "sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==", "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" }, "engines": { "bare": ">=1.16.0" @@ -3861,6 +4073,17 @@ } } }, + "node_modules/bare-url": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", + "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -3882,10 +4105,20 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz", + "integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==", "dev": true, "license": "MIT", "engines": { @@ -3902,11 +4135,25 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, "node_modules/binaryextensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" }, @@ -3945,7 +4192,8 @@ "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/boolbase": { "version": "1.0.0", @@ -3979,9 +4227,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -3999,10 +4247,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -4047,10 +4296,11 @@ } }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" }, "node_modules/builtin-modules": { "version": "5.0.0", @@ -4066,24 +4316,27 @@ } }, "node_modules/cacheable": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.3.tgz", - "integrity": "sha512-M6p10iJ/VT0wT7TLIGUnm958oVrU2cUK8pQAVU21Zu7h8rbk/PeRtRWrvHJBql97Bhzk3g1N6+2VKC+Rjxna9Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.3.0.tgz", + "integrity": "sha512-HHiAvOBmlcR2f3SQ7kdlYD8+AUJG+wlFZ/Ze8tl1Vzvz0MdOh8IYA/EFU4ve8t1/sZ0j4MGi7ST5MoTwHessQA==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.10.0", - "keyv": "^5.4.0" + "@cacheable/memory": "^2.0.6", + "@cacheable/utils": "^2.3.2", + "hookified": "^1.13.0", + "keyv": "^5.5.4", + "qified": "^0.5.2" } }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.0.tgz", - "integrity": "sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", + "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", "dev": true, "license": "MIT", "dependencies": { - "@keyv/serialize": "^1.1.0" + "@keyv/serialize": "^1.1.1" } }, "node_modules/cached-iterable": { @@ -4150,14 +4403,43 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001735", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz", - "integrity": "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { @@ -4187,6 +4469,7 @@ "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.15" }, @@ -4195,19 +4478,24 @@ } }, "node_modules/cephes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cephes/-/cephes-1.2.0.tgz", - "integrity": "sha512-twuUuJRrIrsELHz6foJtZlqrz6FC36zoHZJvvThsrM1UWPKxyoilw1Rka6Hk0AmPFKHKUoGwGfAtvNZNtNZu0g==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cephes/-/cephes-2.0.0.tgz", + "integrity": "sha512-4GMUzkcXHZ0HMZ3gZdBrv8pQs1/zkJh2Q9rQOF8NJZHanM359y3XOSdeqmDBPfxQKYQpJt58R3dUpofrIXJ2mg==", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "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/chalk/chalk?sponsor=1" @@ -4221,9 +4509,9 @@ "license": "MIT" }, "node_modules/cheerio": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.0.tgz", - "integrity": "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", "dev": true, "license": "MIT", "dependencies": { @@ -4231,16 +4519,16 @@ "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.0", + "encoding-sniffer": "^0.2.1", "htmlparser2": "^10.0.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", - "undici": "^7.10.0", + "undici": "^7.12.0", "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">=18.17" + "node": ">=20.18.1" }, "funding": { "url": "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/cheeriojs/cheerio?sponsor=1" @@ -4264,19 +4552,58 @@ "url": "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/sponsors/fb55" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } }, "node_modules/chromium-bidi": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-8.0.0.tgz", - "integrity": "sha512-d1VmE0FD7lxZQHzcDUCKZSNRtRwISXDsdg4HjdTR5+Ll5nQ/vzU12JeNmupD6VWffrPSlrnGhEWlLESKH3VO+g==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-12.0.1.tgz", + "integrity": "sha512-fGg+6jr0xjQhzpy5N4ErZxQ4wF7KLEvhGZXD6EgvZKDhu7iOhZXnZhcDxPJDcwTcrD48NPzOCo84RP2lv3Z+Cg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4288,9 +4615,9 @@ } }, "node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -4306,8 +4633,9 @@ "node_modules/clean-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -4315,6 +4643,16 @@ "node": ">=4" } }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -4332,46 +4670,109 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "dev": true, "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true, + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, "engines": { - "node": ">=0.8" + "node": ">=20" } }, - "node_modules/clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", + "node_modules/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=12" + }, + "funding": { + "url": "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/chalk/ansi-styles?sponsor=1" } }, - "node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true + "node_modules/cliui/node_modules/emoji-regex": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", + "dev": true, + "license": "MIT" }, - "node_modules/cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "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/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "process-nextick-args": "^2.0.0", @@ -4410,6 +4811,7 @@ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, + "license": "ISC", "bin": { "color-support": "bin.js" } @@ -4418,7 +4820,8 @@ "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -4434,17 +4837,91 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=14" + } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, + "node_modules/conventional-commits-parser/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, + "node_modules/conventional-commits-parser/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } }, "node_modules/convert-source-map": { "version": "2.0.0", @@ -4467,20 +4944,10 @@ "node": ">= 10.13.0" } }, - "node_modules/copy-props/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/core-js": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", - "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4490,13 +4957,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz", - "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", + "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.1" + "browserslist": "^4.26.3" }, "funding": { "type": "opencollective", @@ -4504,16 +4971,18 @@ } }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -4535,24 +5004,6 @@ } } }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -4568,51 +5019,6 @@ "node": ">= 8" } }, - "node_modules/cross-spawn/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/css-functions-list": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", @@ -4624,9 +5030,9 @@ } }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4655,9 +5061,9 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -4672,6 +5078,7 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -4757,9 +5164,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -4774,11 +5181,49 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", @@ -4861,10 +5306,20 @@ "node": ">=0.10.0" } }, + "node_modules/detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/devtools-protocol": { - "version": "0.0.1475386", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1475386.tgz", - "integrity": "sha512-RQ809ykTfJ+dgj9bftdeL2vRVxASAuGU+I9LEx9Ij5TXU5HrgAQVmzi72VA+mkzscE12uzlRv5/tWWv9R9J1SA==", + "version": "0.0.1534754", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1534754.tgz", + "integrity": "sha512-26T91cV5dbOYnXdJi5qQHoTtUoNEqwkHcAyu/IKtjIAxiEqPMrDiRkDOPWVsGfNZGmlQVHQbZRSjD8sxagWVsQ==", "dev": true, "license": "BSD-3-Clause" }, @@ -4873,6 +5328,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -4881,12 +5337,13 @@ } }, "node_modules/distributions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/distributions/-/distributions-2.1.0.tgz", - "integrity": "sha512-4eov7WXRip5Tu0K7Y51W1oVt+DcvkoE0EzsvbLzgedC/n4PUpYXHqk6vo/OH1HteBHp5Vm6cmfnInf9NAXM4qQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/distributions/-/distributions-2.2.0.tgz", + "integrity": "sha512-n7ybud+CRAOZlpg+ETuA0PTiSBfyVNt8Okns5gSK4NvHwj7RamQoufptOucvVcTn9CV4DZ38p1k6TgwMexUNkQ==", "dev": true, + "license": "MIT", "dependencies": { - "cephes": "^1.1.2" + "cephes": "^2.0.0" } }, "node_modules/dlv": { @@ -4896,11 +5353,25 @@ "dev": true, "license": "MIT" }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -4910,18 +5381,6 @@ "url": "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/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "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/fb55/entities?sponsor=1" - } - }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -4932,13 +5391,15 @@ "type": "github", "url": "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/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -4950,9 +5411,9 @@ } }, "node_modules/dompurify": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", - "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -4978,6 +5439,7 @@ "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -5011,21 +5473,12 @@ "node": ">= 10.13.0" } }, - "node_modules/each-props/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/easy-transform-stream": { "version": "1.0.1", @@ -5052,9 +5505,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.182", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.182.tgz", - "integrity": "sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==", + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "dev": true, "license": "ISC" }, @@ -5062,12 +5515,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/encoding-sniffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", - "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", "dev": true, "license": "MIT", "dependencies": { @@ -5079,9 +5533,9 @@ } }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "dev": true, "license": "MIT", "dependencies": { @@ -5089,9 +5543,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", - "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, "license": "MIT", "dependencies": { @@ -5103,11 +5557,11 @@ } }, "node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "peer": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -5120,6 +5574,7 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5142,6 +5597,7 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, + "license": "MIT", "dependencies": { "prr": "~1.0.1" }, @@ -5150,10 +5606,11 @@ } }, "node_modules/error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -5248,10 +5705,11 @@ } }, "node_modules/es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -5324,12 +5782,16 @@ } }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "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/sponsors/sindresorhus" } }, "node_modules/escodegen": { @@ -5354,36 +5816,25 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", - "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.33.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -5446,6 +5897,7 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -5457,6 +5909,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -5528,31 +5981,11 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-jasmine": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.2.2.tgz", @@ -5579,9 +6012,9 @@ } }, "node_modules/eslint-plugin-no-unsanitized": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.2.tgz", - "integrity": "sha512-ydF3PMFKEIkP71ZbLHFvu6/FW8SvRv6VV/gECfrQkqyD5+5oCAtPz8ZHy0GRuMDtNe2jsNdPCQXX4LSbkapAVQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.4.tgz", + "integrity": "sha512-cjAoZoq3J+5KJuycYYOWrc0/OpZ7pl2Z3ypfFq4GtaAgheg+L7YGxUo2YS3avIvo/dYU5/zR2hXu3v81M9NxhQ==", "dev": true, "license": "MPL-2.0", "peerDependencies": { @@ -5589,18 +6022,17 @@ } }, "node_modules/eslint-plugin-perfectionist": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.15.0.tgz", - "integrity": "sha512-pC7PgoXyDnEXe14xvRUhBII8A3zRgggKqJFx2a82fjrItDs1BSI7zdZnQtM2yQvcyod6/ujmzb7ejKPx8lZTnw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-5.2.0.tgz", + "integrity": "sha512-rLD4VyA6sxcCPlG/koqjp0D46JTNRURSDs22Jr1JeVbOiu1BoeRdROnJoqDoGESuXbwxvGEnMSqClX/Q3HSMig==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "^8.34.1", - "@typescript-eslint/utils": "^8.34.1", + "@typescript-eslint/utils": "^8.51.0", "natural-orderby": "^5.0.0" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.0.0 || >=22.0.0" }, "peerDependencies": { "eslint": ">=8.45.0" @@ -5638,30 +6070,30 @@ } }, "node_modules/eslint-plugin-unicorn": { - "version": "60.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz", - "integrity": "sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==", + "version": "62.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-62.0.0.tgz", + "integrity": "sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "@eslint-community/eslint-utils": "^4.7.0", - "@eslint/plugin-kit": "^0.3.3", + "@babel/helper-validator-identifier": "^7.28.5", + "@eslint-community/eslint-utils": "^4.9.0", + "@eslint/plugin-kit": "^0.4.0", "change-case": "^5.4.4", - "ci-info": "^4.3.0", + "ci-info": "^4.3.1", "clean-regexp": "^1.0.0", - "core-js-compat": "^3.44.0", + "core-js-compat": "^3.46.0", "esquery": "^1.6.0", "find-up-simple": "^1.0.1", - "globals": "^16.3.0", + "globals": "^16.4.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regexp-tree": "^0.1.27", - "regjsparser": "^0.12.0", - "semver": "^7.7.2", - "strip-indent": "^4.0.0" + "regjsparser": "^0.13.0", + "semver": "^7.7.3", + "strip-indent": "^4.1.1" }, "engines": { "node": "^20.10.0 || >=21.0.0" @@ -5670,76 +6102,36 @@ "url": "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/sindresorhus/eslint-plugin-unicorn?sponsor=1" }, "peerDependencies": { - "eslint": ">=9.29.0" + "eslint": ">=9.38.0" } }, - "node_modules/eslint-plugin-unicorn/node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "node_modules/eslint-plugin-unicorn/node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "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/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/eslint-plugin-unicorn/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "url": "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/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "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/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { + "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", @@ -5756,7 +6148,7 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { + "node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", @@ -5769,33 +6161,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -5814,24 +6179,12 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -5853,20 +6206,12 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -5874,29 +6219,22 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -5906,10 +6244,94 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "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/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -5931,25 +6353,13 @@ "license": "MIT" }, "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, + "license": "MIT", "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" + "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" @@ -6003,31 +6413,31 @@ "license": "MIT" }, "node_modules/fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-2.0.0.tgz", + "integrity": "sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" + "color-support": "^1.1.3" }, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-fifo": { "version": "1.3.2", @@ -6058,6 +6468,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -6075,14 +6486,25 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "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/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "BSD-3-Clause" }, "node_modules/fast-xml-parser": { @@ -6109,15 +6531,17 @@ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -6221,16 +6645,6 @@ "node": ">= 10.13.0" } }, - "node_modules/fined/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/flagged-respawn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", @@ -6302,12 +6716,13 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -6343,15 +6758,16 @@ } }, "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "patreon", + "type": "github", "url": "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/sponsors/rawify" } }, @@ -6375,6 +6791,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -6388,6 +6805,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "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/sponsors/ljharb" } @@ -6428,6 +6846,7 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -6437,14 +6856,15 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "dev": true, "license": "MIT", "engines": { @@ -6529,9 +6949,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6567,25 +6987,22 @@ } }, "node_modules/glob": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", - "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": "20 || >=22" - }, "funding": { "url": "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/sponsors/isaacs" } @@ -6627,7 +7044,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/glob-watcher": { "version": "6.0.0", @@ -6643,83 +7061,6 @@ "node": ">= 10.13.0" } }, - "node_modules/glob-watcher/node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "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/sponsors/sindresorhus" - } - }, - "node_modules/glob-watcher/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/glob-watcher/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-watcher/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/glob-watcher/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -6730,50 +7071,17 @@ "balanced-match": "^1.0.0" } }, - "node_modules/glob/node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "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/sponsors/isaacs" - } - }, "node_modules/glob/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "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/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "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/sponsors/isaacs" @@ -6811,10 +7119,23 @@ "node": ">=0.10.0" } }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.0.0.tgz", + "integrity": "sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw==", "dev": true, "license": "MIT", "engines": { @@ -6846,6 +7167,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -6864,8 +7186,9 @@ "node_modules/globjoin": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", - "dev": true + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" }, "node_modules/glogg": { "version": "2.2.0", @@ -6897,7 +7220,8 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/gray-matter": { "version": "4.0.3", @@ -6915,6 +7239,30 @@ "node": ">=6.0" } }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/gulp": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/gulp/-/gulp-5.0.1.tgz", @@ -6950,48 +7298,138 @@ "node": ">= 0.10.0" } }, - "node_modules/gulp-cli": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-3.1.0.tgz", - "integrity": "sha512-zZzwlmEsTfXcxRKiCHsdyjZZnFvXWM4v1NqBJSYbuApkvVKivjcmOS2qruAJ+PkEHLFavcDKH40DPc1+t12a9Q==", + "node_modules/gulp-artifactory-upload/node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", "dev": true, "license": "MIT", "dependencies": { - "@gulpjs/messages": "^1.1.0", - "chalk": "^4.1.2", - "copy-props": "^4.0.0", - "gulplog": "^2.2.0", - "interpret": "^3.1.1", - "liftoff": "^5.0.1", - "mute-stdout": "^2.0.0", - "replace-homedir": "^2.0.0", - "semver-greatest-satisfied-range": "^2.0.0", - "string-width": "^4.2.3", - "v8flags": "^4.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "gulp": "bin/gulp.js" + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.10" } }, - "node_modules/gulp-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/gulp-artifactory-upload/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "license": "MIT" + }, + "node_modules/gulp-artifactory-upload/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/gulp-artifactory-upload/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp-artifactory-upload/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/gulp-cli": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-3.1.0.tgz", + "integrity": "sha512-zZzwlmEsTfXcxRKiCHsdyjZZnFvXWM4v1NqBJSYbuApkvVKivjcmOS2qruAJ+PkEHLFavcDKH40DPc1+t12a9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@gulpjs/messages": "^1.1.0", + "chalk": "^4.1.2", + "copy-props": "^4.0.0", + "gulplog": "^2.2.0", + "interpret": "^3.1.1", + "liftoff": "^5.0.1", + "mute-stdout": "^2.0.0", + "replace-homedir": "^2.0.0", + "semver-greatest-satisfied-range": "^2.0.0", + "string-width": "^4.2.3", + "v8flags": "^4.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp-cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/gulp-cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "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/chalk/chalk?sponsor=1" + "url": "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/chalk/wrap-ansi?sponsor=1" } }, "node_modules/gulp-cli/node_modules/yargs": { @@ -7041,11 +7479,25 @@ "url": "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/sponsors/sindresorhus" } }, + "node_modules/gulp-plugin-extras/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "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/chalk/chalk?sponsor=1" + } + }, "node_modules/gulp-postcss": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/gulp-postcss/-/gulp-postcss-10.0.0.tgz", "integrity": "sha512-z1RF2RJEX/BvFsKN11PXai8lRmihZTiHnlJf7Zu8uHaA/Q7Om4IeN8z1NtMAW5OiLwUY02H0DIFl9tHl0CNSgA==", "dev": true, + "license": "MIT", "dependencies": { "fancy-log": "^2.0.0", "plugin-error": "^2.0.1", @@ -7059,30 +7511,6 @@ "postcss": "^8.0.0" } }, - "node_modules/gulp-postcss/node_modules/fancy-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-2.0.0.tgz", - "integrity": "sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==", - "dev": true, - "dependencies": { - "color-support": "^1.1.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/gulp-postcss/node_modules/plugin-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-2.0.1.tgz", - "integrity": "sha512-zMakqvIDyY40xHOvzXka0kUvf40nYIuwRE8dWhti2WtjQZ31xAgBZBhxsK7vK3QbRXS1Xms/LO7B5cuAsfB2Gg==", - "dev": true, - "dependencies": { - "ansi-colors": "^1.0.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/gulp-rename": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.1.0.tgz", @@ -7098,6 +7526,7 @@ "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.1.4.tgz", "integrity": "sha512-SVSF7ikuWKhpAW4l4wapAqPPSToJoiNKsbDoUnRrSgwZHH7lH8pbPeQj1aOVYQrbZKhfSVBxVW+Py7vtulRktw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/vinyl": "^2.0.4", @@ -7174,6 +7603,16 @@ "node": ">=6" } }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -7255,6 +7694,19 @@ "url": "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/sponsors/ljharb" } }, + "node_modules/hashery": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.3.0.tgz", + "integrity": "sha512-fWltioiy5zsSAs9ouEnvhsVJeAXRybGCNNv0lvzpzNOSDbULXRy7ivFWwCCv4I5Am6kSo75hmbsCduOoc2/K4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.13.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -7292,17 +7744,51 @@ } }, "node_modules/hookified": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.11.0.tgz", - "integrity": "sha512-aDdIN3GyU5I6wextPplYdfmWCo+aLmjjVbntmX6HLD5RCi/xKsivYEBhnRD+d9224zFf008ZpLMPlWF0ZodYZw==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.13.0.tgz", + "integrity": "sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==", "dev": true, "license": "MIT" }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/html-tags": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -7387,6 +7873,32 @@ "node": ">= 14" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "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/sponsors/typicode" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -7432,10 +7944,11 @@ } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7450,8 +7963,9 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -7473,13 +7987,15 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.1.0", @@ -7507,9 +8023,9 @@ } }, "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "dev": true, "license": "MIT", "engines": { @@ -7551,8 +8067,9 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", @@ -7590,6 +8107,19 @@ "url": "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/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", @@ -7690,8 +8220,9 @@ "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7699,8 +8230,9 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7826,14 +8358,22 @@ "url": "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/sponsors/ljharb" } }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7842,7 +8382,8 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", @@ -7953,6 +8494,19 @@ "url": "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/sponsors/ljharb" } }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", @@ -7989,14 +8543,27 @@ "node": ">=0.10.0" } }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "node_modules/is-url-superb": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", + "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", "dev": true, - "license": "MIT" - }, - "node_modules/is-valid-glob": { + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-valid-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", @@ -8065,20 +8632,23 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8095,6 +8665,7 @@ "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-3.3.0.tgz", "integrity": "sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==", "dev": true, + "license": "MIT", "dependencies": { "binaryextensions": "^2.2.0", "textextensions": "^3.2.0" @@ -8107,16 +8678,14 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "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/sponsors/isaacs" }, @@ -8125,87 +8694,32 @@ } }, "node_modules/jasmine": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.9.0.tgz", - "integrity": "sha512-SspK51QMnuC92z5zpF4kOkWN+MyZZDOBv8zgzlMAYvMD0UoGwcq5yYaDe1mrpN7wXZ2CFXh5y8Ua2ugwE4OmXQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.13.0.tgz", + "integrity": "sha512-oLCXIhEb5e0zzjn9GyuvcuisvLBwUjmgz7a0RNGWKwQtJCDld4m+vwKUpAIJVLB5vbmQFdtKhT86/tIZlJ5gYw==", "dev": true, "license": "MIT", "dependencies": { "glob": "^10.2.2", - "jasmine-core": "~5.9.0" + "jasmine-core": "~5.13.0" }, "bin": { "jasmine": "bin/jasmine.js" } }, "node_modules/jasmine-core": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.9.0.tgz", - "integrity": "sha512-OMUvF1iI6+gSRYOhMrH4QYothVLN9C3EJ6wm4g7zLJlnaTl8zbaPOr0bTw70l7QxkoM7sVFOWo83u9B2Fe2Zng==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.13.0.tgz", + "integrity": "sha512-vsYjfh7lyqvZX5QgqKc4YH8phs7g96Z8bsdIFNEU3VqXhlHaq+vov/Fgn/sr6MiUczdZkyXRC3TX369Ll4Nzbw==", "dev": true, "license": "MIT" }, - "node_modules/jasmine/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/jasmine/node_modules/glob": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.3.tgz", - "integrity": "sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.0", - "minipass": "^5.0.0", - "path-scurry": "^1.7.0" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "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/sponsors/isaacs" - } - }, - "node_modules/jasmine/node_modules/minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "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/sponsors/isaacs" - } - }, - "node_modules/jasmine/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -8220,6 +8734,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8238,13 +8753,13 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -8255,6 +8770,7 @@ "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "xmlcreate": "^2.0.4" } @@ -8267,9 +8783,9 @@ "license": "MIT" }, "node_modules/jsdoc": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz", - "integrity": "sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.5.tgz", + "integrity": "sha512-P4C6MWP9yIlMiK8nwoZvxN84vb6MsnXcHuy7XzVOvQoCizWX5JFCBsWIIWKXBltpoRZXddUOVQmCTOZt9yDj9g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8296,87 +8812,20 @@ "node": ">=12.0.0" } }, - "node_modules/jsdoc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/jsdoc/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "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/fb55/entities?sponsor=1" - } - }, "node_modules/jsdoc/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/jsdoc/node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/jsdoc/node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/jsdoc/node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true - }, - "node_modules/jsdoc/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsdoc/node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true - }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -8390,13 +8839,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema": { "version": "0.4.0", @@ -8415,8 +8866,9 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -8430,6 +8882,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -8438,10 +8891,38 @@ } }, "node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "dev": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } }, "node_modules/jsprim": { "version": "1.4.2", @@ -8462,8 +8943,9 @@ "node_modules/jstransformer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", "dev": true, + "license": "MIT", "dependencies": { "is-promise": "^2.0.0", "promise": "^7.0.1" @@ -8482,47 +8964,12 @@ "node": ">=8.0.0" } }, - "node_modules/jstransformer-nunjucks/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/jstransformer-nunjucks/node_modules/nunjucks": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", - "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - }, - "bin": { - "nunjucks-precompile": "bin/precompile" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "chokidar": "^3.3.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -8532,6 +8979,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8541,6 +8989,7 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.9" } @@ -8605,48 +9054,48 @@ "node": ">=10.13.0" } }, - "node_modules/liftoff/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" + }, + "funding": { + "url": "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/sponsors/antonk52" } }, "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" }, "node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/locate-path": { @@ -8666,16 +9115,19 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" }, "node_modules/lodash.clone": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", - "dev": true + "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==", + "deprecated": "This package is deprecated. Use structuredClone instead.", + "dev": true, + "license": "MIT" }, "node_modules/lodash.clonedeepwith": { "version": "4.5.0", @@ -8695,13 +9147,15 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", - "dev": true + "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", + "dev": true, + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", @@ -8730,23 +9184,10 @@ "url": "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/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "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/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -8757,20 +9198,22 @@ } }, "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", "dev": true, "license": "MIT" }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.0.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { "node": ">=18" @@ -8779,83 +9222,66 @@ "url": "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/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { "node": ">=18" }, "funding": { - "url": "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/chalk/slice-ansi?sponsor=1" + "url": "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/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/loglevelnext": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-6.0.0.tgz", + "integrity": "sha512-FDl1AI2sJGjHHG3XKJd6sG3/6ncgiGCQ0YkW46nxe7SfqQq6hujd9CvFXIXtkGBUN83KPZ2KSOJK8q5P0bSSRQ==", "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, + "license": "MPL-2.0", "engines": { - "node": ">=18" - }, - "funding": { - "url": "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/sponsors/sindresorhus" + "node": ">= 18" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "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/chalk/strip-ansi?sponsor=1" + "yallist": "^3.0.2" } }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "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/chalk/wrap-ansi?sponsor=1" + "node": ">=6" } }, - "node_modules/lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", - "engines": { - "node": "20 || >=22" + "bin": { + "semver": "bin/semver" } }, "node_modules/map-cache": { @@ -8868,21 +9294,35 @@ "node": ">=0.10.0" } }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, "node_modules/markdown-it": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", - "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, "bin": { - "markdown-it": "bin/markdown-it.js" + "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/markdown-it-anchor": { @@ -8890,18 +9330,12 @@ "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", "dev": true, + "license": "Unlicense", "peerDependencies": { "@types/markdown-it": "*", "markdown-it": "*" } }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "peer": true - }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -8930,6 +9364,7 @@ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "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/sponsors/wooorm" @@ -8943,17 +9378,18 @@ "license": "CC0-1.0" }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/memory-fs": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "dev": true, + "license": "MIT", "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -8967,6 +9403,7 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -8978,13 +9415,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -9015,41 +9454,31 @@ } }, "node_modules/metalsmith-html-relative": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/metalsmith-html-relative/-/metalsmith-html-relative-2.0.7.tgz", - "integrity": "sha512-VNkKK+vkiYR2HYnvcHH9q1hZ3BeLg+ouVkbS/sPthDC/UqaixAnXTCcZGvjzP53+LowZ1TzjD2thazQ8Klfwaw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/metalsmith-html-relative/-/metalsmith-html-relative-2.0.9.tgz", + "integrity": "sha512-r5QnNNtoNoLuxCcfGeqxGgxrmzeIdnt+ikUbRXtVD6EGqYG78f9fpjqAjvh1y8ao4NUgUJAJiQWdTFIl03D78w==", "dev": true, "license": "GPL-3.0-or-later", "dependencies": { - "cheerio": "^1.1.0", + "cheerio": "^1.1.2", "deepmerge": "^4.3.1", - "minimatch": "^10.0.1" + "minimatch": "^10.1.1" }, "engines": { - "node": ">=18.17.0" + "node": ">=20.18.1" }, "peerDependencies": { "metalsmith": "^2.5.0" } }, - "node_modules/metalsmith-html-relative/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/metalsmith-html-relative/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { "node": "20 || >=22" @@ -9058,93 +9487,6 @@ "url": "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/sponsors/isaacs" } }, - "node_modules/metalsmith/node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "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/sponsors/sindresorhus" - } - }, - "node_modules/metalsmith/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/metalsmith/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/metalsmith/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/metalsmith/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/metalsmith/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -9160,26 +9502,38 @@ } }, "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", @@ -9198,6 +9552,7 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -9207,6 +9562,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9219,10 +9575,26 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "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/sponsors/ljharb" } }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -9240,6 +9612,19 @@ "dev": true, "license": "MIT" }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -9262,6 +9647,7 @@ "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz", "integrity": "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -9292,8 +9678,9 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" }, "node_modules/natural-orderby": { "version": "5.0.0", @@ -9309,7 +9696,8 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netmask": { "version": "2.0.2", @@ -9321,28 +9709,55 @@ "node": ">= 0.4.0" } }, + "node_modules/node-readable-to-web-readable-stream": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/node-readable-to-web-readable-stream/-/node-readable-to-web-readable-stream-0.4.2.tgz", + "integrity": "sha512-/cMZNI34v//jUTrI+UIo4ieHAB5EZRY/+7OmXZgBxaWBMcW2tGdceIw06RFxWxrKZ5Jp3sI2i5TsRo+CBhtVLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9360,6 +9775,19 @@ "node": ">= 10.13.0" } }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -9373,6 +9801,42 @@ "url": "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/fb55/nth-check?sponsor=1" } }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -9386,8 +9850,9 @@ "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9410,6 +9875,7 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -9520,8 +9986,9 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -9542,6 +10009,24 @@ "url": "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/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/ordered-read-streams": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-2.0.0.tgz", @@ -9573,6 +10058,16 @@ "url": "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/sponsors/ljharb" } }, + "node_modules/p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -9605,6 +10100,16 @@ "url": "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/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/pac-proxy-agent": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", @@ -9651,6 +10156,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -9678,6 +10184,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -9692,10 +10199,11 @@ } }, "node_modules/parse-node-version": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.0.tgz", - "integrity": "sha512-02GTVHD1u0nWc20n2G7WX/PgdhNFG04j5fi1OkaJzPWLTcf6vh6229Lta1wTmXG/7Dg42tCssgkccVt7qvd8Kg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -9773,11 +10281,22 @@ "node": ">=8" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-root": { "version": "0.1.1", @@ -9803,35 +10322,35 @@ } }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "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/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "license": "ISC" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9862,6 +10381,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -9869,28 +10389,40 @@ "url": "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/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/plimit-lit": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.5.0.tgz", - "integrity": "sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", + "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", "dev": true, + "license": "MIT", "dependencies": { - "queue-lit": "^1.5.0" + "queue-lit": "^1.5.1" + }, + "engines": { + "node": ">=12" } }, "node_modules/plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-2.0.1.tgz", + "integrity": "sha512-zMakqvIDyY40xHOvzXka0kUvf40nYIuwRE8dWhti2WtjQZ31xAgBZBhxsK7vK3QbRXS1Xms/LO7B5cuAsfB2Gg==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" + "ansi-colors": "^1.0.1" }, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, "node_modules/pluralize": { @@ -9898,6 +10430,7 @@ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -9907,6 +10440,7 @@ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.19.0" } @@ -9977,9 +10511,9 @@ } }, "node_modules/postcss-discard-comments": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz", - "integrity": "sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.5.tgz", + "integrity": "sha512-IR2Eja8WfYgN5n32vEGSctVQ1+JARfu4UH8M7bgGh1bC+xI/obsPJXaBpQF7MAByvgwZinhpHpdrmXtvVVlKcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9993,9 +10527,9 @@ } }, "node_modules/postcss-load-config": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.0.2.tgz", - "integrity": "sha512-Q8QR3FYbqOKa0bnC1UQ2bFq9/ulHX5Bi34muzitMr8aDtUelO5xKeJEYC/5smE0jNE9zdB/NBnOwXKexELbRlw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", "dev": true, "funding": [ { @@ -10007,16 +10541,18 @@ "url": "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/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" }, "engines": { "node": ">= 18" }, "peerDependencies": { "jiti": ">=1.21.0", - "postcss": ">=8.0.9" + "postcss": ">=8.0.9", + "tsx": "^4.8.1" }, "peerDependenciesMeta": { "jiti": { @@ -10024,6 +10560,9 @@ }, "postcss": { "optional": true + }, + "tsx": { + "optional": true } } }, @@ -10055,29 +10594,6 @@ "postcss": "^8.4" } }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "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/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, "node_modules/postcss-resolve-nested-selector": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", @@ -10130,7 +10646,29 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-values-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-7.0.0.tgz", + "integrity": "sha512-LYGsPzgkfF2n6FNbp4wS5mVtk2gFPxfVvUZHGkR8CMcPSg6lkpyDQn1qWEy0RApPzO/JapV/zaHxj2GNfQ+/2A==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@dot/versioner": "^0.4.2", + "color-name": "^1.1.4", + "css-tree": "^3.1.0", + "husky": "^9.1.7", + "is-url-superb": "^4.0.0", + "quote-unquote": "^1.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "postcss": "^8.4.14" + } }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -10143,9 +10681,9 @@ } }, "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", "bin": { @@ -10163,6 +10701,7 @@ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -10171,10 +10710,11 @@ } }, "node_modules/process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", @@ -10191,6 +10731,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, + "license": "MIT", "dependencies": { "asap": "~2.0.3" } @@ -10235,8 +10776,9 @@ "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT" }, "node_modules/psl": { "version": "1.15.0", @@ -10277,23 +10819,24 @@ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/puppeteer": { - "version": "24.17.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.17.0.tgz", - "integrity": "sha512-CGrmJ8WgilK3nyE73k+pbxHggETPpEvL6AQ9H5JSK1RgZRGMQVJ+iO3MocGm9yBQXQJ9U5xijyLvkYXFeb0/+g==", + "version": "24.34.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.34.0.tgz", + "integrity": "sha512-Sdpl/zsYOsagZ4ICoZJPGZw8d9gZmK5DcxVal11dXi/1/t2eIXHjCf5NfmhDg5XnG9Nye+yo/LqMzIxie2rHTw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.7", - "chromium-bidi": "8.0.0", + "@puppeteer/browsers": "2.11.0", + "chromium-bidi": "12.0.1", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1475386", - "puppeteer-core": "24.17.0", + "devtools-protocol": "0.0.1534754", + "puppeteer-core": "24.34.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -10304,27 +10847,41 @@ } }, "node_modules/puppeteer-core": { - "version": "24.17.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.17.0.tgz", - "integrity": "sha512-RYOBKFiF+3RdwIZTEacqNpD567gaFcBAOKTT7742FdB1icXudrPI7BlZbYTYWK2wgGQUXt9Zi1Yn+D5PmCs4CA==", + "version": "24.34.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.34.0.tgz", + "integrity": "sha512-24evawO+mUGW4mvS2a2ivwLdX3gk8zRLZr9HP+7+VT2vBQnm0oh9jJEZmUE3ePJhRkYlZ93i7OMpdcoi2qNCLg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.7", - "chromium-bidi": "8.0.0", - "debug": "^4.4.1", - "devtools-protocol": "0.0.1475386", + "@puppeteer/browsers": "2.11.0", + "chromium-bidi": "12.0.1", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1534754", "typed-query-selector": "^2.12.0", + "webdriver-bidi-protocol": "0.3.10", "ws": "^8.18.3" }, "engines": { "node": ">=18" } }, + "node_modules/qified": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.2.tgz", + "integrity": "sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.13.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", + "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -10332,10 +10889,14 @@ } }, "node_modules/queue-lit": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.0.tgz", - "integrity": "sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==", - "dev": true + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", + "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -10355,55 +10916,259 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/quote-unquote": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz", + "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==", + "dev": true, + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, - "node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "license": "MIT", "dependencies": { - "resolve": "^1.20.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">=8" + }, + "funding": { + "url": "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/sponsors/sindresorhus" } }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redent/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/redent/node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { @@ -10431,9 +11196,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, "license": "MIT", "dependencies": { @@ -10448,6 +11213,7 @@ "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true, + "license": "MIT", "bin": { "regexp-tree": "bin/regexp-tree" } @@ -10474,18 +11240,18 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -10499,13 +11265,13 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" @@ -10514,14 +11280,16 @@ "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, + "license": "ISC" }, "node_modules/replace-ext": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } @@ -10541,12 +11309,23 @@ "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "escape-string-regexp": "^1.0.3", "object-assign": "^4.0.1", "readable-stream": "^2.0.2" } }, + "node_modules/replacestream/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -10583,8 +11362,9 @@ "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10594,17 +11374,19 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/requizzle": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", - "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", "dev": true, + "license": "MIT", "dependencies": { - "lodash": "^4.17.14" + "lodash": "^4.17.21" } }, "node_modules/resolve": { @@ -10647,6 +11429,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -10692,10 +11475,11 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -10720,6 +11504,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -10755,7 +11540,8 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/safe-push-apply": { "version": "1.0.0", @@ -10807,9 +11593,9 @@ "license": "MIT" }, "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "license": "MIT", "dependencies": { @@ -10827,15 +11613,16 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -10847,6 +11634,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -10858,7 +11646,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/section-matter": { "version": "1.0.0", @@ -10874,30 +11663,14 @@ "node": ">=4" } }, - "node_modules/section-matter/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/semver-greatest-satisfied-range": { @@ -10918,6 +11691,7 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -10971,6 +11745,29 @@ "node": ">= 0.4" } }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -11065,28 +11862,57 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "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/chalk/slice-ansi?sponsor=1" } }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "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/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -11128,11 +11954,25 @@ "node": ">= 14" } }, + "node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -11152,6 +11992,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -11167,11 +12008,73 @@ "node": ">= 10.13.0" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/split2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/sshpk": { "version": "1.18.0", @@ -11251,18 +12154,15 @@ } }, "node_modules/streamx": { - "version": "2.21.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz", - "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "dev": true, "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/string_decoder": { @@ -11270,6 +12170,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -11295,6 +12196,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11304,6 +12206,52 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", @@ -11364,16 +12312,19 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "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/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { @@ -11382,6 +12333,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11389,6 +12341,26 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -11399,15 +12371,22 @@ "node": ">=0.10.0" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", "dev": true, "license": "MIT", - "dependencies": { - "min-indent": "^1.0.1" - }, "engines": { "node": ">=12" }, @@ -11420,6 +12399,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -11441,9 +12421,9 @@ "license": "MIT" }, "node_modules/stylelint": { - "version": "16.23.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.23.1.tgz", - "integrity": "sha512-dNvDTsKV1U2YtiUDfe9d2gp902veFeo3ecCWdGlmLm2WFrAV0+L5LoOj/qHSBABQwMsZPJwfC4bf39mQm1S5zw==", + "version": "16.26.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.26.1.tgz", + "integrity": "sha512-v20V59/crfc8sVTAtge0mdafI3AdnzQ2KsWe6v523L4OA1bJO02S7MO2oyXDCS6iWb9ckIPnqAFVItqSBQr7jw==", "dev": true, "funding": [ { @@ -11458,19 +12438,20 @@ "license": "MIT", "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-syntax-patches-for-csstree": "^1.0.19", "@csstools/css-tokenizer": "^3.0.4", "@csstools/media-query-list-parser": "^4.0.3", "@csstools/selector-specificity": "^5.0.0", - "@dual-bundle/import-meta-resolve": "^4.1.0", + "@dual-bundle/import-meta-resolve": "^4.2.1", "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", "css-functions-list": "^3.2.3", "css-tree": "^3.1.0", - "debug": "^4.4.1", + "debug": "^4.4.3", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.1.3", + "file-entry-cache": "^11.1.1", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", @@ -11520,55 +12501,33 @@ "stylelint": ">=16.0.0" } }, - "node_modules/stylelint/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "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/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, "node_modules/stylelint/node_modules/balanced-match": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.3.tgz", - "integrity": "sha512-D+w75Ub8T55yor7fPgN06rkCAUbAYw2vpxJmmjv/GDAcvCnv9g7IvHhIZoxzRZThrXPFI2maeY24pPbtyYU7Lg==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.1.tgz", + "integrity": "sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^6.1.12" + "flat-cache": "^6.1.19" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.12.tgz", - "integrity": "sha512-U+HqqpZPPXP5d24bWuRzjGqVqUcw64k4nZAbruniDwdRg0H10tvN7H6ku1tjhA4rg5B9GS3siEvwO2qjJJ6f8Q==", + "version": "6.1.19", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.19.tgz", + "integrity": "sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^1.10.3", + "cacheable": "^2.2.0", "flatted": "^3.3.3", - "hookified": "^1.10.0" + "hookified": "^1.13.0" } }, "node_modules/stylelint/node_modules/global-modules": { @@ -11576,6 +12535,7 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -11588,6 +12548,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -11607,29 +12568,35 @@ "node": ">= 4" } }, - "node_modules/stylelint/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/stylelint/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/summary": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/summary/-/summary-2.1.0.tgz", "integrity": "sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/supports-color": { "version": "7.2.0", @@ -11666,6 +12633,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -11683,27 +12651,16 @@ "semver": "^6.3.0" } }, - "node_modules/sver/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/svg-tags": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, "node_modules/svglint": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/svglint/-/svglint-4.1.0.tgz", - "integrity": "sha512-gGpw/a8EQgBEEmkBCMS38ykEVhQJBFObkyLF3BZVO9GzgCuTCTx2Dlms01y+N02IobN80k7Q+NxTvoMd16CP0g==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/svglint/-/svglint-4.1.2.tgz", + "integrity": "sha512-Q4DxRDN6gGGrRnh5qQ/ySs57Gr9h2cOBGvAYmqQHPfEPa4uYCxEoCijH9nYl9FzbqOvoCrMpR8ckjQllqvU/Zg==", "dev": true, "license": "MIT", "dependencies": { @@ -11724,17 +12681,17 @@ "node": ">=20.0.0" } }, - "node_modules/svglint/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/svglint/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "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/chalk/ansi-regex?sponsor=1" + "url": "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/chalk/chalk?sponsor=1" } }, "node_modules/svglint/node_modules/dom-serializer": { @@ -11742,6 +12699,7 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" @@ -11757,13 +12715,15 @@ "type": "github", "url": "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/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/svglint/node_modules/dom-serializer/node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, + "license": "BSD-2-Clause", "funding": { "url": "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/fb55/entities?sponsor=1" } @@ -11772,13 +12732,15 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/svglint/node_modules/domhandler": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "1" } @@ -11788,6 +12750,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "0", "domelementtype": "1" @@ -11797,13 +12760,39 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/svglint/node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "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/sponsors/isaacs" + } }, "node_modules/svglint/node_modules/htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^1.3.1", "domhandler": "^2.3.0", @@ -11813,43 +12802,88 @@ "readable-stream": "^3.1.1" } }, - "node_modules/svglint/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/svglint/node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">= 6" + "node": "20 || >=22" + }, + "funding": { + "url": "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/sponsors/isaacs" } }, - "node_modules/svglint/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/svglint/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "license": "ISC", "engines": { - "node": ">=12" - }, - "funding": { - "url": "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/chalk/strip-ansi?sponsor=1" + "node": "20 || >=22" + } + }, + "node_modules/svglint/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "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/sponsors/isaacs" + } + }, + "node_modules/svglint/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "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/sponsors/isaacs" + } + }, + "node_modules/svglint/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/synckit": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", - "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.4" + "@pkgr/core": "^0.2.9" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -11892,6 +12926,16 @@ "url": "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/sponsors/epoberezkin" } }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -11899,14 +12943,49 @@ "dev": true, "license": "MIT" }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "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/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/tar-fs": { @@ -11941,19 +13020,20 @@ "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", "dev": true, + "license": "MIT", "dependencies": { "streamx": "^2.12.5" } }, "node_modules/terser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -11965,9 +13045,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -11999,21 +13079,39 @@ } } }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, "node_modules/text-decoder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", - "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", "dev": true, "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.4" } }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, "node_modules/textextensions": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-3.3.0.tgz", "integrity": "sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -12024,56 +13122,93 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" }, "node_modules/through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "license": "MIT", "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "readable-stream": "3" } }, - "node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true, - "license": "MIT" - }, "node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true, - "license": "MIT" - }, "node_modules/time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "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/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "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/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -12114,10 +13249,20 @@ "node": ">=0.8" } }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -12149,92 +13294,22 @@ "node": ">=16.20.2" } }, - "node_modules/tsc-alias/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsc-alias/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/tsc-alias/node_modules/commander": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || >=14" } }, - "node_modules/tsc-alias/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tsc-alias/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tsc-alias/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -12247,6 +13322,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -12254,15 +13330,6 @@ "json5": "lib/cli.js" } }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -12275,6 +13342,7 @@ "resolved": "https://registry.npmjs.org/ttest/-/ttest-4.0.0.tgz", "integrity": "sha512-biXJWXntqllqzhEPN0TlpwSp4d2xjY2VblchlkJaLIAmlvny9bhpiiPNAlrjyQxcJC1ehoqB8w6JD2WU2p+yUQ==", "dev": true, + "license": "MIT", "dependencies": { "distributions": "^2.1.0", "summary": "^2.0.0" @@ -12313,8 +13381,18 @@ "node": ">= 0.8.0" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", + "node_modules/type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, @@ -12399,9 +13477,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -12413,11 +13491,11 @@ } }, "node_modules/uc.micro": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", - "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/unbox-primitive": { "version": "1.1.0", @@ -12449,10 +13527,11 @@ } }, "node_modules/underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", - "dev": true + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "dev": true, + "license": "MIT" }, "node_modules/undertaker": { "version": "2.0.0", @@ -12491,9 +13570,9 @@ } }, "node_modules/undici": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.11.0.tgz", - "integrity": "sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", + "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", "dev": true, "license": "MIT", "engines": { @@ -12501,9 +13580,9 @@ } }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, @@ -12532,9 +13611,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, "license": "MIT", "engines": { @@ -12542,9 +13621,9 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, "license": "MIT", "engines": { @@ -12552,9 +13631,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -12583,10 +13662,11 @@ } }, "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -12594,8 +13674,9 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" }, "node_modules/uuid": { "version": "3.4.0", @@ -12624,6 +13705,17 @@ "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==", "dev": true }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/value-or-function": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz", @@ -12649,6 +13741,13 @@ "extsprintf": "^1.2.0" } }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, "node_modules/vinyl": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz", @@ -12726,8 +13825,9 @@ "node_modules/vinyl-sourcemaps-apply": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", "dev": true, + "license": "ISC", "dependencies": { "source-map": "^0.5.1" } @@ -12735,51 +13835,54 @@ "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/vscode-json-languageservice": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.6.tgz", - "integrity": "sha512-DIKb3tcfRtb3tIE6g9SLOl5E9tNSt6kljH08Wa5RwFlVshtXGrDDzttchze4CYy9pJpE9mBtCbRHmLvY1Z1ZXA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.2.1.tgz", + "integrity": "sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==", "dev": true, + "license": "MIT", "dependencies": { "jsonc-parser": "^3.0.0", - "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-textdocument": "^1.0.3", "vscode-languageserver-types": "^3.16.0", "vscode-nls": "^5.0.0", - "vscode-uri": "^3.0.2" - }, - "engines": { - "npm": ">=7.0.0" + "vscode-uri": "^3.0.3" } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz", - "integrity": "sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==", - "dev": true + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "dev": true, + "license": "MIT" }, "node_modules/vscode-languageserver-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", - "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", - "dev": true + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true, + "license": "MIT" }, "node_modules/vscode-nls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.0.0.tgz", - "integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==", - "dev": true + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", + "dev": true, + "license": "MIT" }, "node_modules/vscode-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.2.tgz", - "integrity": "sha512-jkjy6pjU1fxUvI51P+gCsxg1u2n8LSt0W6KrCNQceaziKzff74GoWmjVG46KieVzybO1sttPQmYfrwSHey7GUA==", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" }, "node_modules/ware": { "version": "1.3.0", @@ -12792,10 +13895,11 @@ } }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12804,10 +13908,17 @@ "node": ">=10.13.0" } }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.10.tgz", + "integrity": "sha512-5LAE43jAVLOhB/QqX4bwSiv0Hg1HBfMmOuwBSXHdvg4GMGu9Y0lIq7p4R/yySu6w74WmaR4GM4H9t2IwLW7hgw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/webpack": { - "version": "5.101.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.2.tgz", - "integrity": "sha512-4JLXU0tD6OZNVqlwzm3HGEhAHufSiyv+skb7q0d2367VDMzrU1Q/ZeepvkcHH0rZie6uqEtTQQe0OEOOluH3Mg==", + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "dev": true, "license": "MIT", "dependencies": { @@ -12819,22 +13930,22 @@ "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.0", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.3", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "bin": { @@ -12868,6 +13979,7 @@ "resolved": "https://registry.npmjs.org/webpack-stream/-/webpack-stream-7.0.0.tgz", "integrity": "sha512-XoAQTHyCaYMo6TS7Atv1HYhtmBgKiVLONJbzLBl2V3eibXQ2IT/MCRM841RW/r3vToKD5ivrTJFWgd/ghoxoRg==", "dev": true, + "license": "MIT", "dependencies": { "fancy-log": "^1.3.3", "lodash.clone": "^4.3.2", @@ -12885,11 +13997,84 @@ "webpack": "^5.21.2" } }, + "node_modules/webpack-stream/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-stream/node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/webpack-stream/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-stream/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-stream/node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/webpack-stream/node_modules/replace-ext": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -12899,6 +14084,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12914,6 +14100,7 @@ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "dev": true, + "license": "MIT", "dependencies": { "clone": "^2.1.1", "clone-buffer": "^1.0.0", @@ -12926,6 +14113,30 @@ "node": ">= 0.10" } }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -12950,15 +14161,19 @@ } }, "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-boxed-primitive": { @@ -13057,18 +14272,29 @@ "url": "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/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "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/chalk/wrap-ansi?sponsor=1" @@ -13080,6 +14306,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -13092,6 +14319,67 @@ "url": "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/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "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/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "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/sponsors/sindresorhus" + } + }, "node_modules/wrap-fn": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", @@ -13105,14 +14393,16 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" @@ -13121,6 +14411,58 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/write-json-file": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", + "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.15", + "make-dir": "^2.1.0", + "pify": "^4.0.1", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.4.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/write-json-file/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-json-file/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/write-pkg": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", + "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sort-keys": "^2.0.0", + "type-fest": "^0.4.1", + "write-json-file": "^3.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ws": { "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", @@ -13147,7 +14489,8 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/xtend": { "version": "4.0.2", @@ -13164,6 +14507,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -13172,15 +14516,20 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yargs": { @@ -13202,59 +14551,19 @@ } }, "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "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/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/yargs/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "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/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/yargs/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, "license": "ISC", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, "engines": { - "node": ">=20" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yargs/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", "dev": true, "license": "MIT" }, @@ -13276,50 +14585,6 @@ "url": "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/sponsors/sindresorhus" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "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/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/yargs/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "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/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index 0d4dc985a69d3..043e3081b0f76 100644 --- a/package.json +++ b/package.json @@ -2,30 +2,31 @@ "name": "pdf.js", "type": "module", "devDependencies": { - "@babel/core": "^7.28.3", - "@babel/preset-env": "^7.28.3", - "@babel/runtime": "^7.28.3", - "@csstools/postcss-light-dark-function": "^2.0.9", + "@babel/core": "^7.28.5", + "@babel/preset-env": "^7.28.5", + "@babel/runtime": "^7.28.4", + "@csstools/postcss-light-dark-function": "^2.0.11", "@fluent/bundle": "^0.19.1", "@fluent/dom": "^0.10.2", "@metalsmith/layouts": "^3.0.0", "@metalsmith/markdown": "^1.10.0", - "@napi-rs/canvas": "^0.1.77", - "@types/node": "^24.3.0", - "autoprefixer": "^10.4.21", + "@napi-rs/canvas": "^0.1.88", + "@types/node": "^25.0.3", + "autoprefixer": "^10.4.23", "babel-loader": "^10.0.0", - "caniuse-lite": "^1.0.30001735", - "core-js": "^3.45.0", - "eslint": "^9.33.0", + "cached-iterable": "^0.3.0", + "caniuse-lite": "^1.0.30001762", + "core-js": "^3.47.0", + "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jasmine": "^4.2.2", "eslint-plugin-json": "^4.0.1", - "eslint-plugin-no-unsanitized": "^4.1.2", - "eslint-plugin-perfectionist": "^4.15.0", + "eslint-plugin-no-unsanitized": "^4.1.4", + "eslint-plugin-perfectionist": "^5.2.0", "eslint-plugin-prettier": "^5.5.4", - "eslint-plugin-unicorn": "^60.0.0", - "globals": "^16.3.0", + "eslint-plugin-unicorn": "^62.0.0", + "globals": "^17.0.0", "gulp": "^5.0.1", "gulp-cli": "^3.1.0", "gulp-postcss": "^10.0.0", @@ -34,28 +35,30 @@ "gulp-replace": "^1.1.4", "gulp-zip": "^6.1.0", "highlight.js": "^11.11.1", - "jasmine": "^5.9.0", - "jsdoc": "^4.0.4", + "jasmine": "^5.13.0", + "jsdoc": "^4.0.5", "jstransformer-nunjucks": "^1.2.0", "metalsmith": "^2.6.3", - "metalsmith-html-relative": "^2.0.7", + "metalsmith-html-relative": "^2.0.9", + "node-readable-to-web-readable-stream": "^0.4.2", "ordered-read-streams": "^2.0.0", "pngjs": "^7.0.0", "postcss": "^8.5.6", "postcss-dir-pseudo-class": "^9.0.1", - "postcss-discard-comments": "^7.0.4", + "postcss-discard-comments": "^7.0.5", "postcss-nesting": "^13.0.2", - "prettier": "^3.6.2", - "puppeteer": "^24.17.0", - "stylelint": "^16.23.1", + "postcss-values-parser": "^7.0.0", + "prettier": "^3.7.4", + "puppeteer": "^24.34.0", + "stylelint": "^16.26.1", "stylelint-prettier": "^5.0.3", - "svglint": "^4.1.0", - "terser-webpack-plugin": "^5.3.14", + "svglint": "^4.1.2", + "terser-webpack-plugin": "^5.3.16", "tsc-alias": "^1.8.16", "ttest": "^4.0.0", - "typescript": "^5.9.2", + "typescript": "^5.9.3", "vinyl": "^3.0.1", - "webpack": "^5.101.2", + "webpack": "^5.104.1", "webpack-stream": "^7.0.0", "yargs": "^18.0.0" }, diff --git a/pdfjs.config b/pdfjs.config index 0ecb585cd7e38..b1d6327626aea 100644 --- a/pdfjs.config +++ b/pdfjs.config @@ -1,5 +1,5 @@ { - "stableVersion": "5.4.54", + "stableVersion": "5.4.530", "baseVersion": "1b427a3af5e0a40c296a3cafb08edbd36d973ff1", "versionPrefix": "5.4." } diff --git a/src/core/annotation.js b/src/core/annotation.js index da706ffce0058..87d4e9409ae5c 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -1810,8 +1810,8 @@ class MarkupAnnotation extends Annotation { }); const retRef = { ref: annotationRef }; - if (annotation.popup) { - const popup = annotation.popup; + const { popup } = annotation; + if (popup) { if (popup.deleted) { annotationDict.delete("Popup"); annotationDict.delete("Contents"); @@ -2779,10 +2779,10 @@ class TextWidgetAnnotation extends WidgetAnnotation { warn("Barcodes are not supported"); } - // this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML; + this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML; // MasterControl turned this off to avoid issues with chromium // browsers with hardware accelleration on. - this.data.hasOwnCanvas = false; + // this.data.hasOwnCanvas = false; this._hasText = true; // The field value is always a string. @@ -5293,8 +5293,8 @@ class FileAttachmentAnnotation extends MarkupAnnotation { constructor(params) { super(params); - const { dict, xref } = params; - const file = new FileSpec(dict.get("FS"), xref); + const { dict } = params; + const file = new FileSpec(dict.get("FS")); this.data.annotationType = AnnotationType.FILEATTACHMENT; this.data.hasOwnCanvas = this.data.noRotate; diff --git a/src/core/ascii_85_stream.js b/src/core/ascii_85_stream.js index 9cabbc430a9e9..0bbcec9992f4b 100644 --- a/src/core/ascii_85_stream.js +++ b/src/core/ascii_85_stream.js @@ -25,7 +25,7 @@ class Ascii85Stream extends DecodeStream { } super(maybeLength); - this.str = str; + this.stream = str; this.dict = str.dict; this.input = new Uint8Array(5); } @@ -35,7 +35,7 @@ class Ascii85Stream extends DecodeStream { const Z_LOWER_CHAR = 0x7a; // 'z' const EOF = -1; - const str = this.str; + const str = this.stream; let c = str.getByte(); while (isWhiteSpace(c)) { diff --git a/src/core/ascii_hex_stream.js b/src/core/ascii_hex_stream.js index 60fe007e62aee..4dec730a6e4d5 100644 --- a/src/core/ascii_hex_stream.js +++ b/src/core/ascii_hex_stream.js @@ -24,7 +24,7 @@ class AsciiHexStream extends DecodeStream { } super(maybeLength); - this.str = str; + this.stream = str; this.dict = str.dict; this.firstDigit = -1; @@ -32,7 +32,7 @@ class AsciiHexStream extends DecodeStream { readBlock() { const UPSTREAM_BLOCK_SIZE = 8000; - const bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); + const bytes = this.stream.getBytes(UPSTREAM_BLOCK_SIZE); if (!bytes.length) { this.eof = true; return; diff --git a/src/core/base_stream.js b/src/core/base_stream.js index 0266449a1bc4e..bf252b24e7297 100644 --- a/src/core/base_stream.js +++ b/src/core/base_stream.js @@ -68,6 +68,10 @@ class BaseStream { return false; } + get isImageStream() { + return false; + } + get canAsyncDecodeImageFromBuffer() { return false; } @@ -137,6 +141,10 @@ class BaseStream { getBaseStreams() { return null; } + + getOriginalStream() { + return this.stream?.getOriginalStream() || this; + } } export { BaseStream }; diff --git a/src/core/catalog.js b/src/core/catalog.js index e5946c50fe662..9ab10f281a0f5 100644 --- a/src/core/catalog.js +++ b/src/core/catalog.js @@ -267,6 +267,10 @@ class Catalog { return markInfo; } + get hasStructTree() { + return this.#catDict.has("StructTreeRoot"); + } + get structTreeRoot() { let structTree = null; try { @@ -735,6 +739,16 @@ class Catalog { return rawDests; } + get rawPageLabels() { + const obj = this.#catDict.getRaw("PageLabels"); + if (!obj) { + return null; + } + + const numberTree = new NumberTree(obj, this.xref); + return numberTree.getAll(); + } + get pageLabels() { let obj = null; try { @@ -749,8 +763,8 @@ class Catalog { } #readPageLabels() { - const obj = this.#catDict.getRaw("PageLabels"); - if (!obj) { + const nums = this.rawPageLabels; + if (!nums) { return null; } @@ -758,8 +772,6 @@ class Catalog { let style = null, prefix = ""; - const numberTree = new NumberTree(obj, this.xref); - const nums = numberTree.getAll(); let currentLabel = "", currentIndex = 1; @@ -1045,7 +1057,7 @@ class Catalog { if (obj instanceof Dict && obj.has("EmbeddedFiles")) { const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref); for (const [key, value] of nameTree.getAll()) { - const fs = new FileSpec(value, this.xref); + const fs = new FileSpec(value); attachments ??= Object.create(null); attachments[stringToPDFString(key, /* keepEscapeSequence = */ true)] = fs.serializable; @@ -1611,23 +1623,21 @@ class Catalog { case "GoToR": const urlDict = action.get("F"); if (urlDict instanceof Dict) { - const fs = new FileSpec( - urlDict, - /* xref = */ null, - /* skipContent = */ true - ); - const { rawFilename } = fs.serializable; - url = rawFilename; + const fs = new FileSpec(urlDict, /* skipContent = */ true); + ({ rawFilename: url } = fs.serializable); } else if (typeof urlDict === "string") { url = urlDict; + } else { + break; } // NOTE: the destination is relative to the *remote* document. const remoteDest = fetchRemoteDest(action); - if (remoteDest && typeof url === "string") { + if (remoteDest) { // NOTE: We don't use the `updateUrlHash` function here, since - // the `createValidAbsoluteUrl` function (see below) already - // handles parsing and validation of the final URL. + // the `createValidAbsoluteUrl` function (see below) already handles + // parsing/validation of the final URL and manual splitting also + // ensures that the `unsafeUrl` property will be available/correct. url = /* baseUrl = */ url.split("#", 1)[0] + "#" + remoteDest; } // The 'NewWindow' property, equal to `LinkTarget.BLANK`. diff --git a/src/core/ccitt_stream.js b/src/core/ccitt_stream.js index 0e3b1cea302cc..ca173f460b5c0 100644 --- a/src/core/ccitt_stream.js +++ b/src/core/ccitt_stream.js @@ -21,7 +21,7 @@ class CCITTFaxStream extends DecodeStream { constructor(str, maybeLength, params) { super(maybeLength); - this.str = str; + this.stream = str; this.dict = str.dict; if (!(params instanceof Dict)) { @@ -55,6 +55,10 @@ class CCITTFaxStream extends DecodeStream { this.buffer[this.bufferLength++] = c; } } + + get isImageStream() { + return true; + } } export { CCITTFaxStream }; diff --git a/src/core/cff_parser.js b/src/core/cff_parser.js index 61dcfa2a5feb8..0189a6e411504 100644 --- a/src/core/cff_parser.js +++ b/src/core/cff_parser.js @@ -119,8 +119,8 @@ const CharstringValidationData = [ /* 7 */ { id: "vlineto", min: 1, resetStack: true }, /* 8 */ { id: "rrcurveto", min: 6, resetStack: true }, /* 9 */ null, - /* 10 */ { id: "callsubr", min: 1, undefStack: true }, - /* 11 */ { id: "return", min: 0, undefStack: true }, + /* 10 */ { id: "callsubr", min: 1 }, + /* 11 */ { id: "return", min: 0 }, /* 12 */ null, /* 13 */ null, /* 14 */ { id: "endchar", min: 0, stackClearing: true }, @@ -138,7 +138,7 @@ const CharstringValidationData = [ /* 26 */ { id: "vvcurveto", min: 4, resetStack: true }, /* 27 */ { id: "hhcurveto", min: 4, resetStack: true }, /* 28 */ null, // shortint - /* 29 */ { id: "callgsubr", min: 1, undefStack: true }, + /* 29 */ { id: "callgsubr", min: 1 }, /* 30 */ { id: "vhcurveto", min: 4, resetStack: true }, /* 31 */ { id: "hvcurveto", min: 4, resetStack: true }, ]; @@ -255,6 +255,8 @@ class CFFParser { const charStringOffset = topDict.getByName("CharStrings"); const charStringIndex = this.parseIndex(charStringOffset).obj; + cff.charStringCount = charStringIndex.count; + const fontMatrix = topDict.getByName("FontMatrix"); if (fontMatrix) { properties.fontMatrix = fontMatrix; @@ -627,26 +629,24 @@ class CFFParser { data[j - 1] = value === 1 ? 3 : 23; } } - if ("min" in validationCommand) { - if (!state.undefStack && stackSize < validationCommand.min) { - warn( - "Not enough parameters for " + - validationCommand.id + - "; actual: " + - stackSize + - ", expected: " + - validationCommand.min - ); - - if (stackSize === 0) { - // Just "fix" the outline in replacing command by a endchar: - // it could lead to wrong rendering of some glyphs or not. - // For example, the pdf in #6132 is well-rendered. - data[j - 1] = 14; - return true; - } - return false; + if (stackSize < validationCommand.min) { + warn( + "Not enough parameters for " + + validationCommand.id + + "; actual: " + + stackSize + + ", expected: " + + validationCommand.min + ); + + if (stackSize === 0) { + // Just "fix" the outline in replacing command by a endchar: + // it could lead to wrong rendering of some glyphs or not. + // For example, the pdf in #6132 is well-rendered. + data[j - 1] = 14; + return true; } + return false; } if (state.firstStackClearing && validationCommand.stackClearing) { state.firstStackClearing = false; @@ -670,15 +670,11 @@ class CFFParser { validationCommand.stackFn(stack, stackSize); } stackSize += validationCommand.stackDelta; - } else if (validationCommand.stackClearing) { - stackSize = 0; - } else if (validationCommand.resetStack) { - stackSize = 0; - state.undefStack = false; - } else if (validationCommand.undefStack) { + } else if ( + validationCommand.stackClearing || + validationCommand.resetStack + ) { stackSize = 0; - state.undefStack = true; - state.firstStackClearing = false; } } } @@ -706,7 +702,6 @@ class CFFParser { callDepth: 0, stackSize: 0, stack: [], - undefStack: true, hints: 0, firstStackClearing: true, seac: null, @@ -1012,6 +1007,7 @@ class CFF { this.fdSelect = null; this.isCIDFont = false; + this.charStringCount = 0; } duplicateFirstGlyph() { diff --git a/src/core/chunked_stream.js b/src/core/chunked_stream.js index c77f62531ed51..94c01fc031618 100644 --- a/src/core/chunked_stream.js +++ b/src/core/chunked_stream.js @@ -18,6 +18,12 @@ import { assert } from "../shared/util.js"; import { Stream } from "./stream.js"; class ChunkedStream extends Stream { + progressiveDataLength = 0; + + _lastSuccessfulEnsureByteChunk = -1; // Single-entry cache + + _loadedChunks = new Set(); + constructor(length, chunkSize, manager) { super( /* arrayBuffer = */ new Uint8Array(length), @@ -27,11 +33,8 @@ class ChunkedStream extends Stream { ); this.chunkSize = chunkSize; - this._loadedChunks = new Set(); this.numChunks = Math.ceil(length / chunkSize); this.manager = manager; - this.progressiveDataLength = 0; - this.lastSuccessfulEnsureByteChunk = -1; // Single-entry cache } // If a particular stream does not implement one or more of these methods, @@ -106,14 +109,14 @@ class ChunkedStream extends Stream { if (chunk > this.numChunks) { return; } - if (chunk === this.lastSuccessfulEnsureByteChunk) { + if (chunk === this._lastSuccessfulEnsureByteChunk) { return; } if (!this._loadedChunks.has(chunk)) { throw new MissingDataException(pos, pos + 1); } - this.lastSuccessfulEnsureByteChunk = chunk; + this._lastSuccessfulEnsureByteChunk = chunk; } ensureRange(begin, end) { @@ -257,40 +260,37 @@ class ChunkedStream extends Stream { } class ChunkedStreamManager { - constructor(pdfNetworkStream, args) { + aborted = false; + + currRequestId = 0; + + _chunksNeededByRequest = new Map(); + + _loadedStreamCapability = Promise.withResolvers(); + + _promisesByRequest = new Map(); + + _requestsByChunk = new Map(); + + constructor(pdfStream, args) { this.length = args.length; this.chunkSize = args.rangeChunkSize; this.stream = new ChunkedStream(this.length, this.chunkSize, this); - this.pdfNetworkStream = pdfNetworkStream; + this.pdfStream = pdfStream; this.disableAutoFetch = args.disableAutoFetch; this.msgHandler = args.msgHandler; - - this.currRequestId = 0; - - this._chunksNeededByRequest = new Map(); - this._requestsByChunk = new Map(); - this._promisesByRequest = new Map(); - this.progressiveDataLength = 0; - this.aborted = false; - - this._loadedStreamCapability = Promise.withResolvers(); } sendRequest(begin, end) { - const rangeReader = this.pdfNetworkStream.getRangeReader(begin, end); - if (!rangeReader.isStreamingSupported) { - rangeReader.onProgress = this.onProgress.bind(this); - } + const rangeReader = this.pdfStream.getRangeReader(begin, end); - let chunks = [], - loaded = 0; + let chunks = []; return new Promise((resolve, reject) => { const readChunk = ({ value, done }) => { try { if (done) { - const chunkData = arrayBuffersToBytes(chunks); + resolve(arrayBuffersToBytes(chunks)); chunks = null; - resolve(chunkData); return; } if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) { @@ -299,12 +299,6 @@ class ChunkedStreamManager { "readChunk (sendRequest) - expected an ArrayBuffer." ); } - loaded += value.byteLength; - - if (rangeReader.isStreamingSupported) { - this.onProgress({ loaded }); - } - chunks.push(value); rangeReader.read().then(readChunk, reject); } catch (e) { @@ -446,34 +440,26 @@ class ChunkedStreamManager { return groupedChunks; } - onProgress(args) { - this.msgHandler.send("DocProgress", { - loaded: this.stream.numChunksLoaded * this.chunkSize + args.loaded, - total: this.length, - }); - } - onReceiveData(args) { + const { chunkSize, length, stream } = this; + const chunk = args.chunk; const isProgressive = args.begin === undefined; - const begin = isProgressive ? this.progressiveDataLength : args.begin; + const begin = isProgressive ? stream.progressiveDataLength : args.begin; const end = begin + chunk.byteLength; - const beginChunk = Math.floor(begin / this.chunkSize); + const beginChunk = Math.floor(begin / chunkSize); const endChunk = - end < this.length - ? Math.floor(end / this.chunkSize) - : Math.ceil(end / this.chunkSize); + end < length ? Math.floor(end / chunkSize) : Math.ceil(end / chunkSize); if (isProgressive) { - this.stream.onReceiveProgressiveData(chunk); - this.progressiveDataLength = end; + stream.onReceiveProgressiveData(chunk); } else { - this.stream.onReceiveData(begin, chunk); + stream.onReceiveData(begin, chunk); } - if (this.stream.isDataLoaded) { - this._loadedStreamCapability.resolve(this.stream); + if (stream.isDataLoaded) { + this._loadedStreamCapability.resolve(stream); } const loadedRequests = []; @@ -502,16 +488,16 @@ class ChunkedStreamManager { // unfetched chunk of the PDF file. if (!this.disableAutoFetch && this._requestsByChunk.size === 0) { let nextEmptyChunk; - if (this.stream.numChunksLoaded === 1) { + if (stream.numChunksLoaded === 1) { // This is a special optimization so that after fetching the first // chunk, rather than fetching the second chunk, we fetch the last // chunk. - const lastChunk = this.stream.numChunks - 1; - if (!this.stream.hasChunk(lastChunk)) { + const lastChunk = stream.numChunks - 1; + if (!stream.hasChunk(lastChunk)) { nextEmptyChunk = lastChunk; } } else { - nextEmptyChunk = this.stream.nextEmptyChunk(endChunk); + nextEmptyChunk = stream.nextEmptyChunk(endChunk); } if (Number.isInteger(nextEmptyChunk)) { this._requestChunks([nextEmptyChunk]); @@ -525,8 +511,8 @@ class ChunkedStreamManager { } this.msgHandler.send("DocProgress", { - loaded: this.stream.numChunksLoaded * this.chunkSize, - total: this.length, + loaded: stream.numChunksLoaded * chunkSize, + total: length, }); } @@ -544,7 +530,7 @@ class ChunkedStreamManager { abort(reason) { this.aborted = true; - this.pdfNetworkStream?.cancelAllRequests(reason); + this.pdfStream?.cancelAllRequests(reason); for (const capability of this._promisesByRequest.values()) { capability.reject(reason); diff --git a/src/core/cmap.js b/src/core/cmap.js index 6c0cab60cc6ae..5ef35ff8fde39 100644 --- a/src/core/cmap.js +++ b/src/core/cmap.js @@ -699,6 +699,12 @@ class CMapFactory { if (encoding instanceof Name) { return createBuiltInCMap(encoding.name, fetchBuiltInCMap); } else if (encoding instanceof BaseStream) { + if (encoding.isAsync) { + const bytes = await encoding.asyncGetBytes(); + if (bytes) { + encoding = new Stream(bytes, 0, bytes.length, encoding.dict); + } + } const parsedCMap = await parseCMap( /* cMap = */ new CMap(), /* lexer = */ new Lexer(encoding), diff --git a/src/core/decode_stream.js b/src/core/decode_stream.js index ef2bab40bb375..c76078f111cce 100644 --- a/src/core/decode_stream.js +++ b/src/core/decode_stream.js @@ -129,13 +129,26 @@ class DecodeStream extends BaseStream { } getBaseStreams() { - return this.str ? this.str.getBaseStreams() : null; + return this.stream ? this.stream.getBaseStreams() : null; + } + + clone() { + // Make sure it has been fully read. + while (!this.eof) { + this.readBlock(); + } + return new Stream( + this.buffer, + this.start, + this.end - this.start, + this.dict.clone() + ); } } class StreamsSequenceStream extends DecodeStream { constructor(streams, onError = null) { - streams = streams.filter(s => s instanceof BaseStream); + streams = streams.filter(s => s instanceof BaseStream && !s.isImageStream); let maybeLength = 0; for (const stream of streams) { diff --git a/src/core/decrypt_stream.js b/src/core/decrypt_stream.js index ee2fff21f0503..78fbc5ae5aac9 100644 --- a/src/core/decrypt_stream.js +++ b/src/core/decrypt_stream.js @@ -21,7 +21,7 @@ class DecryptStream extends DecodeStream { constructor(str, maybeLength, decrypt) { super(maybeLength); - this.str = str; + this.stream = str; this.dict = str.dict; this.decrypt = decrypt; this.nextChunk = null; @@ -33,14 +33,14 @@ class DecryptStream extends DecodeStream { if (this.initialized) { chunk = this.nextChunk; } else { - chunk = this.str.getBytes(chunkSize); + chunk = this.stream.getBytes(chunkSize); this.initialized = true; } if (!chunk?.length) { this.eof = true; return; } - this.nextChunk = this.str.getBytes(chunkSize); + this.nextChunk = this.stream.getBytes(chunkSize); const hasMoreData = this.nextChunk?.length > 0; const decrypt = this.decrypt; @@ -52,6 +52,10 @@ class DecryptStream extends DecodeStream { buffer.set(chunk, bufferLength); this.bufferLength = newLength; } + + getOriginalStream() { + return this; + } } export { DecryptStream }; diff --git a/src/core/document.js b/src/core/document.js index a3892751f03b2..9d65d04ac84ab 100644 --- a/src/core/document.js +++ b/src/core/document.js @@ -27,7 +27,6 @@ import { stringToBytes, stringToPDFString, stringToUTF8String, - toHexUtil, unreachable, Util, warn, @@ -61,6 +60,7 @@ import { RefSetCache, } from "./primitives.js"; import { getXfaFontDict, getXfaFontName } from "./xfa_fonts.js"; +import { NullStream, Stream } from "./stream.js"; import { BaseStream } from "./base_stream.js"; import { calculateMD5 } from "./calculate_md5.js"; import { Catalog } from "./catalog.js"; @@ -68,7 +68,6 @@ import { clearGlobalCaches } from "./cleanup_helper.js"; import { DatasetReader } from "./dataset_reader.js"; import { Intersector } from "./intersector.js"; import { Linearization } from "./parser.js"; -import { NullStream } from "./stream.js"; import { ObjectLoader } from "./object_loader.js"; import { OperatorList } from "./operator_list.js"; import { PartialEvaluator } from "./evaluator.js"; @@ -178,7 +177,7 @@ class Page { ); } - #getBoundingBox(name) { + getBoundingBox(name) { if (this.xfaData) { return this.xfaData.bbox; } @@ -201,7 +200,7 @@ class Page { return shadow( this, "mediaBox", - this.#getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX + this.getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX ); } @@ -210,7 +209,7 @@ class Page { return shadow( this, "cropBox", - this.#getBoundingBox("CropBox") || this.mediaBox + this.getBoundingBox("CropBox") || this.mediaBox ); } @@ -270,10 +269,32 @@ class Page { async getContentStream() { const content = await this.pdfManager.ensure(this, "content"); - if (content instanceof BaseStream) { + if (content instanceof BaseStream && !content.isImageStream) { + if (content.isAsync) { + const bytes = await content.asyncGetBytes(); + if (bytes) { + return new Stream(bytes, 0, bytes.length, content.dict); + } + } return content; } if (Array.isArray(content)) { + const promises = []; + for (let i = 0, ii = content.length; i < ii; i++) { + const item = content[i]; + if (item instanceof BaseStream && item.isAsync) { + promises.push( + item.asyncGetBytes().then(bytes => { + if (bytes) { + content[i] = new Stream(bytes, 0, bytes.length, item.dict); + } + }) + ); + } + } + if (promises.length > 0) { + await Promise.all(promises); + } return new StreamsSequenceStream( content, this.#onSubStreamError.bind(this) @@ -442,6 +463,8 @@ class Page { task, intent, cacheKey, + pageId = this.pageIndex, + pageIndex = this.pageIndex, annotationStorage = null, modifiedIds = null, }) { @@ -527,13 +550,12 @@ class Page { RESOURCES_KEYS_OPERATOR_LIST ); const opList = new OperatorList(intent, sink); - handler.send("StartRenderPage", { transparency: partialEvaluator.hasBlendModes( resources, this.nonBlendModesSet ), - pageIndex: this.pageIndex, + pageIndex, cacheKey, }); @@ -1167,49 +1189,6 @@ class PDFDocument { }); } - #collectSignatureCertificates( - fields, - collectedSignatureCertificates, - visited = new RefSet() - ) { - if (!Array.isArray(fields)) { - return; - } - for (let field of fields) { - if (field instanceof Ref) { - if (visited.has(field)) { - continue; - } - visited.put(field); - } - field = this.xref.fetchIfRef(field); - if (!(field instanceof Dict)) { - continue; - } - if (field.has("Kids")) { - this.#collectSignatureCertificates( - field.get("Kids"), - collectedSignatureCertificates, - visited - ); - continue; - } - const isSignature = isName(field.get("FT"), "Sig"); - if (!isSignature) { - continue; - } - const value = field.get("V"); - if (!(value instanceof Dict)) { - continue; - } - const subFilter = value.get("SubFilter"); - if (!(subFilter instanceof Name)) { - continue; - } - collectedSignatureCertificates.add(subFilter.name); - } - } - get _xfaStreams() { const { acroForm } = this.catalog; if (!acroForm) { @@ -1525,20 +1504,6 @@ class PDFDocument { // specification). const sigFlags = acroForm.get("SigFlags"); const hasSignatures = !!(sigFlags & 0x1); - if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { - if (hasSignatures) { - const collectedSignatureCertificates = new Set(); - this.#collectSignatureCertificates( - fields, - collectedSignatureCertificates - ); - if (collectedSignatureCertificates.size > 0) { - formInfo.collectedSignatureCertificates = Array.from( - collectedSignatureCertificates - ); - } - } - } const hasOnlyDocumentSignatures = hasSignatures && this.#hasOnlyDocumentSignatures(fields); formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures; @@ -1566,11 +1531,6 @@ class PDFDocument { IsSignaturesPresent: formInfo.hasSignatures, }; - if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { - docInfo.collectedSignatureCertificates = - formInfo.collectedSignatureCertificates ?? null; - } - let infoDict; try { infoDict = xref.trailer.get("Info"); @@ -1667,8 +1627,8 @@ class PDFDocument { } return shadow(this, "fingerprints", [ - toHexUtil(hashOriginal), - hashModified ? toHexUtil(hashModified) : null, + hashOriginal.toHex(), + hashModified?.toHex() ?? null, ]); } diff --git a/src/core/editor/pdf_editor.js b/src/core/editor/pdf_editor.js new file mode 100644 index 0000000000000..cf1862d9dc83d --- /dev/null +++ b/src/core/editor/pdf_editor.js @@ -0,0 +1,1627 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @typedef {import("../document.js").PDFDocument} PDFDocument */ +/** @typedef {import("../document.js").Page} Page */ +/** @typedef {import("../xref.js").XRef} XRef */ + +import { Dict, isName, Name, Ref, RefSet, RefSetCache } from "../primitives.js"; +import { getModificationDate, stringToPDFString } from "../../shared/util.js"; +import { incrementalUpdate, writeValue } from "../writer.js"; +import { NameTree, NumberTree } from "../name_number_tree.js"; +import { BaseStream } from "../base_stream.js"; +import { StringStream } from "../stream.js"; +import { stringToAsciiOrUTF16BE } from "../core_utils.js"; + +const MAX_LEAVES_PER_PAGES_NODE = 16; +const MAX_IN_NAME_TREE_NODE = 64; + +class PageData { + constructor(page, documentData) { + this.page = page; + this.documentData = documentData; + this.annotations = null; + // Named destinations which points to this page. + this.pointingNamedDestinations = null; + + documentData.pagesMap.put(page.ref, this); + } +} + +class DocumentData { + constructor(document) { + this.document = document; + this.destinations = null; + this.pageLabels = null; + this.pagesMap = new RefSetCache(); + this.oldRefMapping = new RefSetCache(); + this.dedupNamedDestinations = new Map(); + this.usedNamedDestinations = new Set(); + this.postponedRefCopies = new RefSetCache(); + this.usedStructParents = new Set(); + this.oldStructParentMapping = new Map(); + this.structTreeRoot = null; + this.parentTree = null; + this.idTree = null; + this.roleMap = null; + this.classMap = null; + this.namespaces = null; + this.structTreeAF = null; + this.structTreePronunciationLexicon = []; + } +} + +class XRefWrapper { + constructor(entries) { + this.entries = entries; + } + + fetch(ref) { + return ref instanceof Ref ? this.entries[ref.num] : ref; + } +} + +class PDFEditor { + constructor({ useObjectStreams = true, title = "", author = "" } = {}) { + this.hasSingleFile = false; + this.currentDocument = null; + this.oldPages = []; + this.newPages = []; + this.xref = [null]; + this.xrefWrapper = new XRefWrapper(this.xref); + this.newRefCount = 1; + [this.rootRef, this.rootDict] = this.newDict; + [this.infoRef, this.infoDict] = this.newDict; + [this.pagesRef, this.pagesDict] = this.newDict; + this.namesDict = null; + this.useObjectStreams = useObjectStreams; + this.objStreamRefs = useObjectStreams ? new Set() : null; + this.version = "1.7"; + this.title = title; + this.author = author; + this.pageLabels = null; + this.namedDestinations = new Map(); + this.parentTree = new Map(); + this.structTreeKids = []; + this.idTree = new Map(); + this.classMap = new Dict(); + this.roleMap = new Dict(); + this.namespaces = new Map(); + this.structTreeAF = []; + this.structTreePronunciationLexicon = []; + } + + /** + * Get a new reference for an object in the PDF. + * @returns {Ref} + */ + get newRef() { + const ref = Ref.get(this.newRefCount++, 0); + return ref; + } + + /** + * Create a new dictionary and its reference. + * @returns {[Ref, Dict]} + */ + get newDict() { + const ref = this.newRef; + const dict = (this.xref[ref.num] = new Dict()); + return [ref, dict]; + } + + /** + * Clone an object in the PDF. + * @param {*} obj + * @param {XRef} xref + * @returns {Promise} + */ + async #cloneObject(obj, xref) { + const ref = this.newRef; + this.xref[ref.num] = await this.#collectDependencies(obj, true, xref); + return ref; + } + + cloneDict(dict) { + const newDict = dict.clone(); + newDict.xref = this.xrefWrapper; + return newDict; + } + + /** + * Collect the dependencies of an object and create new references for each + * dependency. + * @param {*} obj + * @param {boolean} mustClone + * @param {XRef} xref + * @returns {Promise<*>} + */ + async #collectDependencies(obj, mustClone, xref) { + if (obj instanceof Ref) { + const { + currentDocument: { oldRefMapping }, + } = this; + let newRef = oldRefMapping.get(obj); + if (newRef) { + return newRef; + } + const oldRef = obj; + obj = await xref.fetchAsync(oldRef); + if (typeof obj === "number") { + // Simple value; no need to create a new reference. + return obj; + } + + newRef = this.newRef; + oldRefMapping.put(oldRef, newRef); + + if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) { + if ( + obj instanceof Dict && + isName(obj.get("Type"), "Page") && + !this.currentDocument.pagesMap.has(oldRef) + ) { + throw new Error( + "Add a deleted page to the document is not supported." + ); + } + } + + this.xref[newRef.num] = await this.#collectDependencies(obj, true, xref); + return newRef; + } + const promises = []; + const { + currentDocument: { postponedRefCopies }, + } = this; + if (Array.isArray(obj)) { + if (mustClone) { + obj = obj.slice(); + } + for (let i = 0, ii = obj.length; i < ii; i++) { + const postponedActions = postponedRefCopies.get(obj[i]); + if (postponedActions) { + // The object is a reference that needs to be copied later. + postponedActions.push(ref => (obj[i] = ref)); + continue; + } + promises.push( + this.#collectDependencies(obj[i], true, xref).then( + newObj => (obj[i] = newObj) + ) + ); + } + await Promise.all(promises); + return obj; + } + let dict; + if (obj instanceof BaseStream) { + ({ dict } = obj = obj.getOriginalStream().clone()); + dict.xref = this.xrefWrapper; + } else if (obj instanceof Dict) { + if (mustClone) { + obj = obj.clone(); + obj.xref = this.xrefWrapper; + } + dict = obj; + } + if (dict) { + for (const [key, rawObj] of dict.getRawEntries()) { + const postponedActions = postponedRefCopies.get(rawObj); + if (postponedActions) { + // The object is a reference that needs to be copied later. + postponedActions.push(ref => dict.set(key, ref)); + continue; + } + promises.push( + this.#collectDependencies(rawObj, true, xref).then(newObj => + dict.set(key, newObj) + ) + ); + } + await Promise.all(promises); + } + + return obj; + } + + async #cloneStructTreeNode( + parentStructRef, + node, + xref, + removedStructElements, + dedupIDs, + dedupClasses, + dedupRoles, + visited = new RefSet() + ) { + const { + currentDocument: { pagesMap, oldRefMapping }, + } = this; + const pg = node.getRaw("Pg"); + if (pg instanceof Ref && !pagesMap.has(pg)) { + return null; + } + let kids; + const k = (kids = node.getRaw("K")); + if (k instanceof Ref) { + // We're only interested by ref referencing nodes and not an array. + if (visited.has(k)) { + return null; + } + kids = await xref.fetchAsync(k); + if (!Array.isArray(kids)) { + kids = [k]; + } + } + kids = Array.isArray(kids) ? kids : [kids]; + const newKids = []; + const structElemIndices = []; + for (let kid of kids) { + const kidRef = kid instanceof Ref ? kid : null; + if (kidRef) { + if (visited.has(kidRef)) { + continue; + } + visited.put(kidRef); + kid = await xref.fetchAsync(kidRef); + } + if (typeof kid === "number") { + newKids.push(kid); + continue; + } + if (!(kid instanceof Dict)) { + continue; + } + const pgRef = kid.getRaw("Pg"); + if (pgRef instanceof Ref && !pagesMap.has(pgRef)) { + continue; + } + const type = kid.get("Type"); + if (!type || isName(type, "StructElem")) { + let setAsSpan = false; + if (kidRef && removedStructElements.has(kidRef)) { + if (!isName(kid.get("S"), "Link")) { + continue; + } + // A link annotation has been removed but we still need to keep the + // node in order to preserve the structure tree. Mark it as a Span + // so that it doesn't affect the semantics. + setAsSpan = true; + } + const newKidRef = await this.#cloneStructTreeNode( + kidRef, + kid, + xref, + removedStructElements, + dedupIDs, + dedupClasses, + dedupRoles, + visited + ); + if (newKidRef) { + structElemIndices.push(newKids.length); + newKids.push(newKidRef); + if (kidRef) { + oldRefMapping.put(kidRef, newKidRef); + } + if (setAsSpan) { + this.xref[newKidRef.num].setIfName("S", "Span"); + } + } + continue; + } + if (isName(type, "OBJR")) { + if (!kidRef) { + continue; + } + const newKidRef = oldRefMapping.get(kidRef); + if (!newKidRef) { + continue; + } + const newKid = this.xref[newKidRef.num]; + // Fix the missing StructParent entry in the referenced object. + const objRef = newKid.getRaw("Obj"); + if (objRef instanceof Ref) { + const obj = this.xref[objRef.num]; + if ( + obj instanceof Dict && + !obj.has("StructParent") && + parentStructRef + ) { + const structParent = this.parentTree.size; + this.parentTree.set(structParent, [oldRefMapping, parentStructRef]); + obj.set("StructParent", structParent); + } + } + newKids.push(newKidRef); + continue; + } + if (isName(type, "MCR")) { + const newKid = await this.#collectDependencies( + kidRef || kid, + true, + xref + ); + newKids.push(newKid); + continue; + } + if (kidRef) { + const newKidRef = await this.#collectDependencies(kidRef, true, xref); + newKids.push(newKidRef); + } + } + if (kids.length !== 0 && newKids.length === 0) { + return null; + } + + const newNodeRef = this.newRef; + const newNode = (this.xref[newNodeRef.num] = this.cloneDict(node)); + // Don't collect for ID or C since they will be fixed later. + newNode.delete("ID"); + newNode.delete("C"); + newNode.delete("K"); + newNode.delete("P"); + newNode.delete("S"); + await this.#collectDependencies(newNode, false, xref); + + // Fix the class names. + const classNames = node.get("C"); + if (classNames instanceof Name) { + const newClassName = dedupClasses.get(classNames.name); + if (newClassName) { + newNode.set("C", Name.get(newClassName)); + } else { + newNode.set("C", classNames); + } + } else if (Array.isArray(classNames)) { + const newClassNames = []; + for (const className of classNames) { + if (className instanceof Name) { + const newClassName = dedupClasses.get(className.name); + if (newClassName) { + newClassNames.push(Name.get(newClassName)); + } else { + newClassNames.push(className); + } + } + } + newNode.set("C", newClassNames); + } + + // Fix the role name. + const roleName = node.get("S"); + if (roleName instanceof Name) { + const newRoleName = dedupRoles.get(roleName.name); + if (newRoleName) { + newNode.set("S", Name.get(newRoleName)); + } else { + newNode.set("S", roleName); + } + } + + // Fix the ID. + const id = node.get("ID"); + if (typeof id === "string") { + const stringId = stringToPDFString(id, /* keepEscapeSequence = */ false); + const newId = dedupIDs.get(stringId); + if (newId) { + newNode.set("ID", stringToAsciiOrUTF16BE(newId)); + } else { + newNode.set("ID", id); + } + } + + // Table headers may contain IDs that need to be deduplicated. + let attributes = newNode.get("A"); + if (attributes) { + if (!Array.isArray(attributes)) { + attributes = [attributes]; + } + for (let attr of attributes) { + attr = this.xrefWrapper.fetch(attr); + if (isName(attr.get("O"), "Table") && attr.has("Headers")) { + const headers = this.xrefWrapper.fetch(attr.getRaw("Headers")); + if (Array.isArray(headers)) { + for (let i = 0, ii = headers.length; i < ii; i++) { + const newId = dedupIDs.get( + stringToPDFString(headers[i], /* keepEscapeSequence = */ false) + ); + if (newId) { + headers[i] = newId; + } + } + } + } + } + } + + for (const index of structElemIndices) { + const structElemRef = newKids[index]; + const structElem = this.xref[structElemRef.num]; + structElem.set("P", newNodeRef); + } + + if (newKids.length === 1) { + newNode.set("K", newKids[0]); + } else if (newKids.length > 1) { + newNode.set("K", newKids); + } + + return newNodeRef; + } + + /** + * @typedef {Object} PageInfo + * @property {PDFDocument} document + * @property {Array|number>} [includePages] + * included ranges (inclusive) or indices. + * @property {Array|number>} [excludePages] + * excluded ranges (inclusive) or indices. + * @property {Array} [pageIndices] + * position of the pages in the final document. + */ + + /** + * Extract pages from the given documents. + * @param {Array} pageInfos + * @return {Promise} + */ + async extractPages(pageInfos) { + const promises = []; + let newIndex = 0; + this.hasSingleFile = pageInfos.length === 1; + const allDocumentData = []; + for (const { + document, + includePages, + excludePages, + pageIndices, + } of pageInfos) { + if (!document) { + continue; + } + if (pageIndices) { + newIndex = -1; + } + const documentData = new DocumentData(document); + allDocumentData.push(documentData); + promises.push(this.#collectDocumentData(documentData)); + let keptIndices, keptRanges, deletedIndices, deletedRanges; + for (const page of includePages || []) { + if (Array.isArray(page)) { + (keptRanges ||= []).push(page); + } else { + (keptIndices ||= new Set()).add(page); + } + } + for (const page of excludePages || []) { + if (Array.isArray(page)) { + (deletedRanges ||= []).push(page); + } else { + (deletedIndices ||= new Set()).add(page); + } + } + let pageIndex = 0; + for (let i = 0, ii = document.numPages; i < ii; i++) { + if (deletedIndices?.has(i)) { + continue; + } + if (deletedRanges) { + let isDeleted = false; + for (const [start, end] of deletedRanges) { + if (i >= start && i <= end) { + isDeleted = true; + break; + } + } + if (isDeleted) { + continue; + } + } + + let takePage = false; + if (keptIndices) { + takePage = keptIndices.has(i); + } + if (!takePage && keptRanges) { + for (const [start, end] of keptRanges) { + if (i >= start && i <= end) { + takePage = true; + break; + } + } + } + if (!takePage && !keptIndices && !keptRanges) { + takePage = true; + } + if (!takePage) { + continue; + } + let newPageIndex; + if (pageIndices) { + newPageIndex = pageIndices[pageIndex++]; + } + if (newPageIndex === undefined) { + if (newIndex !== -1) { + newPageIndex = newIndex++; + } else { + for ( + newPageIndex = 0; + this.oldPages[newPageIndex] === undefined; + newPageIndex++ + ) { + /* empty */ + } + } + } + promises.push( + document.getPage(i).then(page => { + this.oldPages[newPageIndex] = new PageData(page, documentData); + }) + ); + } + } + await Promise.all(promises); + promises.length = 0; + + this.#collectValidDestinations(allDocumentData); + this.#collectPageLabels(); + + for (const page of this.oldPages) { + promises.push(this.#postCollectPageData(page)); + } + await Promise.all(promises); + + this.#findDuplicateNamedDestinations(); + this.#setPostponedRefCopies(allDocumentData); + + for (let i = 0, ii = this.oldPages.length; i < ii; i++) { + this.newPages[i] = await this.#makePageCopy(i, null); + } + + this.#fixPostponedRefCopies(allDocumentData); + await this.#mergeStructTrees(allDocumentData); + + return this.writePDF(); + } + + /** + * Collect the document data. + * @param {DocumentData} documentData + * @return {Promise} + */ + async #collectDocumentData(documentData) { + const { + document: { pdfManager, xref }, + } = documentData; + await Promise.all([ + pdfManager + .ensureCatalog("destinations") + .then(destinations => (documentData.destinations = destinations)), + pdfManager + .ensureCatalog("rawPageLabels") + .then(pageLabels => (documentData.pageLabels = pageLabels)), + pdfManager + .ensureCatalog("structTreeRoot") + .then(structTreeRoot => (documentData.structTreeRoot = structTreeRoot)), + ]); + const structTreeRoot = documentData.structTreeRoot; + if (structTreeRoot) { + const rootDict = structTreeRoot.dict; + const parentTree = rootDict.get("ParentTree"); + if (parentTree) { + const numberTree = new NumberTree(parentTree, xref); + documentData.parentTree = numberTree.getAll(/* isRaw = */ true); + } + const idTree = rootDict.get("IDTree"); + if (idTree) { + const nameTree = new NameTree(idTree, xref); + documentData.idTree = nameTree.getAll(/* isRaw = */ true); + } + documentData.roleMap = rootDict.get("RoleMap") || null; + documentData.classMap = rootDict.get("ClassMap") || null; + let namespaces = rootDict.get("Namespaces") || null; + if (namespaces && !Array.isArray(namespaces)) { + namespaces = [namespaces]; + } + documentData.namespaces = namespaces; + documentData.structTreeAF = rootDict.get("AF") || null; + documentData.structTreePronunciationLexicon = + rootDict.get("PronunciationLexicon") || null; + } + } + + /** + * Post process the collected page data. + * @param {PageData} pageData + * @returns {Promise} + */ + async #postCollectPageData(pageData) { + const { + page: { xref, annotations }, + documentData: { pagesMap, destinations, usedNamedDestinations }, + } = pageData; + + if (!annotations) { + return; + } + + const promises = []; + let newAnnotations = []; + let newIndex = 0; + + // Filter out annotations that are linking to deleted pages. + for (const annotationRef of annotations) { + const newAnnotationIndex = newIndex++; + promises.push( + xref.fetchIfRefAsync(annotationRef).then(async annotationDict => { + if (!isName(annotationDict.get("Subtype"), "Link")) { + newAnnotations[newAnnotationIndex] = annotationRef; + return; + } + const action = annotationDict.get("A"); + const dest = + action instanceof Dict + ? action.get("D") + : annotationDict.get("Dest"); + if ( + !dest /* not a destination */ || + (Array.isArray(dest) && + (!(dest[0] instanceof Ref) || pagesMap.has(dest[0]))) + ) { + // Keep the annotation as is: it isn't linking to a deleted page. + newAnnotations[newAnnotationIndex] = annotationRef; + } else if (typeof dest === "string") { + const destString = stringToPDFString( + dest, + /* keepEscapeSequence = */ true + ); + if (destinations.has(destString)) { + // Keep the annotation as is: the named destination is valid. + // Valid named destinations have been collected previously (see + // #collectValidDestinations). + newAnnotations[newAnnotationIndex] = annotationRef; + usedNamedDestinations.add(destString); + } + } + }) + ); + } + + await Promise.all(promises); + newAnnotations = newAnnotations.filter(annot => !!annot); + pageData.annotations = newAnnotations.length > 0 ? newAnnotations : null; + } + + /** + * Some references cannot be copied right away since they correspond to some + * pages that haven't been processed yet. Postpone the copy of those + * references. + * @param {Array} allDocumentData + */ + #setPostponedRefCopies(allDocumentData) { + for (const { postponedRefCopies, pagesMap } of allDocumentData) { + for (const oldPageRef of pagesMap.keys()) { + postponedRefCopies.put(oldPageRef, []); + } + } + } + + /** + * Fix all postponed reference copies. + * @param {Array} allDocumentData + */ + #fixPostponedRefCopies(allDocumentData) { + for (const { postponedRefCopies, oldRefMapping } of allDocumentData) { + for (const [oldRef, actions] of postponedRefCopies.items()) { + const newRef = oldRefMapping.get(oldRef); + for (const action of actions) { + action(newRef); + } + } + postponedRefCopies.clear(); + } + } + + #visitObject(obj, callback, visited = new RefSet()) { + if (obj instanceof Ref) { + if (!visited.has(obj)) { + visited.put(obj); + this.#visitObject(this.xref[obj.num], callback, visited); + } + return; + } + if (Array.isArray(obj)) { + for (const item of obj) { + this.#visitObject(item, callback, visited); + } + return; + } + let dict; + if (obj instanceof BaseStream) { + ({ dict } = obj); + } else if (obj instanceof Dict) { + dict = obj; + } + if (dict) { + callback(dict); + for (const value of dict.getRawValues()) { + this.#visitObject(value, callback, visited); + } + } + } + + async #mergeStructTrees(allDocumentData) { + let newStructParentId = 0; + const { parentTree: newParentTree } = this; + for (let i = 0, ii = this.newPages.length; i < ii; i++) { + const { + documentData: { + parentTree, + oldRefMapping, + oldStructParentMapping, + usedStructParents, + document: { xref }, + }, + } = this.oldPages[i]; + if (!parentTree) { + continue; + } + const pageRef = this.newPages[i]; + const pageDict = this.xref[pageRef.num]; + + // Visit the new page in order to collect used StructParent entries. + this.#visitObject(pageDict, dict => { + const structParent = + dict.get("StructParent") ?? dict.get("StructParents"); + if (typeof structParent !== "number") { + return; + } + usedStructParents.add(structParent); + let parent = parentTree.get(structParent); + const parentRef = parent instanceof Ref ? parent : null; + if (parentRef) { + const array = xref.fetch(parentRef); + if (Array.isArray(array)) { + parent = array; + } + } + if (Array.isArray(parent) && parent.every(ref => ref === null)) { + parent = null; + } + if (!parent) { + if (dict.has("StructParent")) { + dict.delete("StructParent"); + } else { + dict.delete("StructParents"); + } + return; + } + let newStructParent = oldStructParentMapping.get(structParent); + if (newStructParent === undefined) { + newStructParent = newStructParentId++; + oldStructParentMapping.set(structParent, newStructParent); + newParentTree.set(newStructParent, [oldRefMapping, parent]); + } + if (dict.has("StructParent")) { + dict.set("StructParent", newStructParent); + } else { + dict.set("StructParents", newStructParent); + } + }); + } + + const { + structTreeKids, + idTree: newIdTree, + classMap: newClassMap, + roleMap: newRoleMap, + namespaces: newNamespaces, + structTreeAF: newStructTreeAF, + structTreePronunciationLexicon: newStructTreePronunciationLexicon, + } = this; + // Clone the struct tree nodes for each document. + for (const documentData of allDocumentData) { + const { + document: { xref }, + oldRefMapping, + parentTree, + usedStructParents, + structTreeRoot, + idTree, + classMap, + roleMap, + namespaces, + structTreeAF, + structTreePronunciationLexicon, + } = documentData; + + if (!structTreeRoot) { + continue; + } + + this.currentDocument = documentData; + // Get all the removed StructElem + const removedStructElements = new RefSet(); + for (const [key, value] of parentTree || []) { + if (!usedStructParents.has(key) && value instanceof Ref) { + removedStructElements.put(value); + } + } + + // Deduplicate IDs in the ID tree. + // We keep the old node references since they will be cloned later when + // cloning the struct tree. + const dedupIDs = new Map(); + for (const [id, nodeRef] of idTree || []) { + let _id = id; + if (newIdTree.has(id)) { + for (let i = 1; ; i++) { + const newId = `${id}_${i}`; + if (!newIdTree.has(newId)) { + dedupIDs.set(id, newId); + _id = newId; + break; + } + } + } + newIdTree.set(_id, nodeRef); + } + + const dedupClasses = new Map(); + if (classMap?.size > 0) { + // Deduplicate ClassMap entries. + for (let [className, classDict] of classMap) { + classDict = await this.#collectDependencies(classDict, true, xref); + if (newClassMap.has(className)) { + for (let i = 1; ; i++) { + const newClassName = `${className}_${i}`; + if (!newClassMap.has(newClassName)) { + dedupClasses.set(className, newClassName); + className = newClassName; + break; + } + } + } + newClassMap.set(className, classDict); + } + } + + const dedupRoles = new Map(); + if (roleMap?.size > 0) { + // Deduplicate RoleMap entries. + for (const [roleName, mappedName] of roleMap) { + const newMappedName = newRoleMap.get(roleName); + if (!newMappedName) { + newRoleMap.set(roleName, mappedName); + continue; + } + if (newMappedName === mappedName) { + continue; + } + for (let i = 1; ; i++) { + const newRoleName = `${roleName}_${i}`; + if (!newRoleMap.has(newRoleName)) { + dedupRoles.set(roleName, newRoleName); + newRoleMap.set(newRoleName, mappedName); + break; + } + } + } + } + + if (namespaces?.length > 0) { + for (const namespaceRef of namespaces) { + const namespace = await xref.fetchIfRefAsync(namespaceRef); + let ns = namespace.get("NS"); + if (!ns || newNamespaces.has(ns)) { + continue; + } + ns = stringToPDFString(ns, /* keepEscapeSequence = */ false); + const newNamespace = await this.#collectDependencies( + namespace, + true, + xref + ); + newNamespaces.set(ns, newNamespace); + } + } + + if (structTreeAF) { + for (const afRef of structTreeAF) { + newStructTreeAF.push( + await this.#collectDependencies(afRef, true, xref) + ); + } + } + + if (structTreePronunciationLexicon) { + for (const lexiconRef of structTreePronunciationLexicon) { + newStructTreePronunciationLexicon.push( + await this.#collectDependencies(lexiconRef, true, xref) + ); + } + } + + // Get the kids. + let kids = structTreeRoot.dict.get("K"); + if (!kids) { + continue; + } + kids = Array.isArray(kids) ? kids : [kids]; + for (let kid of kids) { + const kidRef = kid instanceof Ref ? kid : null; + if (kidRef && removedStructElements.has(kidRef)) { + continue; + } + kid = await xref.fetchIfRefAsync(kid); + const newKidRef = await this.#cloneStructTreeNode( + kidRef, + kid, + xref, + removedStructElements, + dedupIDs, + dedupClasses, + dedupRoles + ); + if (newKidRef) { + structTreeKids.push(newKidRef); + } + } + + // Fix the ID tree. + for (const [id, nodeRef] of idTree || []) { + const newNodeRef = oldRefMapping.get(nodeRef); + const newId = dedupIDs.get(id) || id; + if (newNodeRef) { + newIdTree.set(newId, newNodeRef); + } else { + newIdTree.delete(newId); + } + } + } + + for (const [key, [oldRefMapping, parent]] of newParentTree) { + if (!parent) { + newParentTree.delete(key); + continue; + } + // Some nodes haven't been visited while cloning the struct trees so their + // ref don't belong to the oldRefMapping. Remove those nodes. + if (!Array.isArray(parent)) { + const newParent = oldRefMapping.get(parent); + if (newParent === undefined) { + newParentTree.delete(key); + } else { + newParentTree.set(key, newParent); + } + continue; + } + const newParents = parent.map( + ref => (ref instanceof Ref && oldRefMapping.get(ref)) || null + ); + if (newParents.length === 0 || newParents.every(ref => ref === null)) { + newParentTree.delete(key); + continue; + } + newParentTree.set(key, newParents); + } + + this.currentDocument = null; + } + + /** + * Collect named destinations that are still valid (i.e. pointing to kept + * pages). + * @param {Array} allDocumentData + */ + #collectValidDestinations(allDocumentData) { + // TODO: Handle OpenAction as well. + for (const documentData of allDocumentData) { + if (!documentData.destinations) { + continue; + } + const { destinations, pagesMap } = documentData; + const newDestinations = (documentData.destinations = new Map()); + for (const [key, dest] of Object.entries(destinations)) { + const pageRef = dest[0]; + const pageData = pagesMap.get(pageRef); + if (!pageData) { + continue; + } + (pageData.pointingNamedDestinations ||= new Set()).add(key); + newDestinations.set(key, dest); + } + } + } + + /** + * Find and rename duplicate named destinations. + */ + #findDuplicateNamedDestinations() { + const { namedDestinations } = this; + for (let i = 0, ii = this.oldPages.length; i < ii; i++) { + const page = this.oldPages[i]; + const { + documentData: { + destinations, + dedupNamedDestinations, + usedNamedDestinations, + }, + } = page; + let { pointingNamedDestinations } = page; + + if (!pointingNamedDestinations) { + // No named destinations pointing to this page. + continue; + } + // Keep only the named destinations that are still used. + page.pointingNamedDestinations = pointingNamedDestinations = + pointingNamedDestinations.intersection(usedNamedDestinations); + + for (const pointingDest of pointingNamedDestinations) { + if (!usedNamedDestinations.has(pointingDest)) { + // If the named destination isn't used, we can keep it as is. + continue; + } + const dest = destinations.get(pointingDest).slice(); + if (!namedDestinations.has(pointingDest)) { + // If the named destination hasn't been used yet, we can keep it + // as is. + namedDestinations.set(pointingDest, dest); + continue; + } + // Create a new unique named destination. + const newName = `${pointingDest}_p${i + 1}`; + dedupNamedDestinations.set(pointingDest, newName); + namedDestinations.set(newName, dest); + } + } + } + + /** + * Fix named destinations in the annotations. + * @param {Array} annotations + * @param {Map} dedupNamedDestinations + */ + #fixNamedDestinations(annotations, dedupNamedDestinations) { + if (dedupNamedDestinations.size === 0) { + return; + } + const fixDestination = (dict, key, dest) => { + if (typeof dest === "string") { + dict.set( + key, + dedupNamedDestinations.get( + stringToPDFString(dest, /* keepEscapeSequence = */ true) + ) || dest + ); + } + }; + + for (const annotRef of annotations) { + const annotDict = this.xref[annotRef.num]; + if (!isName(annotDict.get("Subtype"), "Link")) { + continue; + } + const action = annotDict.get("A"); + if (action instanceof Dict && action.has("D")) { + const dest = action.get("D"); + fixDestination(action, "D", dest); + continue; + } + const dest = annotDict.get("Dest"); + fixDestination(annotDict, "Dest", dest); + } + } + + async #collectPageLabels() { + // We can only preserve page labels when editing a single PDF file. + // This is consistent with behavior in Adobe Acrobat. + if (!this.hasSingleFile) { + return; + } + const { + documentData: { document, pageLabels }, + } = this.oldPages[0]; + if (!pageLabels) { + return; + } + const numPages = document.numPages; + const oldPageLabels = []; + const oldPageIndices = new Set( + this.oldPages.map(({ page: { pageIndex } }) => pageIndex) + ); + let currentLabel = null; + let stFirstIndex = -1; + for (let i = 0; i < numPages; i++) { + const newLabel = pageLabels.get(i); + if (newLabel) { + currentLabel = newLabel; + stFirstIndex = currentLabel.has("St") ? i : -1; + } + if (!oldPageIndices.has(i)) { + continue; + } + if (stFirstIndex !== -1) { + const st = currentLabel.get("St"); + currentLabel = this.cloneDict(currentLabel); + currentLabel.set("St", st + (i - stFirstIndex)); + stFirstIndex = -1; + } + oldPageLabels.push(currentLabel); + } + currentLabel = oldPageLabels[0]; + let currentIndex = 0; + const newPageLabels = (this.pageLabels = [[0, currentLabel]]); + for (let i = 0, ii = oldPageLabels.length; i < ii; i++) { + const label = oldPageLabels[i]; + if (label === currentLabel) { + continue; + } + currentIndex = i; + currentLabel = label; + newPageLabels.push([currentIndex, currentLabel]); + } + } + + /** + * Create a copy of a page. + * @param {number} pageIndex + * @returns {Promise} the page reference in the new PDF document. + */ + async #makePageCopy(pageIndex) { + const { page, documentData, annotations, pointingNamedDestinations } = + this.oldPages[pageIndex]; + this.currentDocument = documentData; + const { dedupNamedDestinations, oldRefMapping } = documentData; + const { xref, rotate, mediaBox, resources, ref: oldPageRef } = page; + const pageRef = this.newRef; + const pageDict = (this.xref[pageRef.num] = this.cloneDict(page.pageDict)); + oldRefMapping.put(oldPageRef, pageRef); + + if (pointingNamedDestinations) { + for (const pointingDest of pointingNamedDestinations) { + const name = dedupNamedDestinations.get(pointingDest) || pointingDest; + const dest = this.namedDestinations.get(name); + dest[0] = pageRef; + } + } + + // No need to keep these entries as we'll set them again later. + for (const key of [ + "Rotate", + "MediaBox", + "CropBox", + "BleedBox", + "TrimBox", + "ArtBox", + "Resources", + "Annots", + "Parent", + "UserUnit", + ]) { + pageDict.delete(key); + } + + const lastRef = this.newRefCount; + await this.#collectDependencies(pageDict, false, xref); + + pageDict.set("Rotate", rotate); + pageDict.set("MediaBox", mediaBox); + for (const boxName of ["CropBox", "BleedBox", "TrimBox", "ArtBox"]) { + const box = page.getBoundingBox(boxName); + if (box?.some((value, index) => value !== mediaBox[index])) { + // These boxes are optional and their default value is the MediaBox. + pageDict.set(boxName, box); + } + } + const userUnit = page.userUnit; + if (userUnit !== 1) { + pageDict.set("UserUnit", userUnit); + } + pageDict.setIfDict( + "Resources", + await this.#collectDependencies(resources, true, xref) + ); + + if (annotations) { + const newAnnotations = await this.#collectDependencies( + annotations, + true, + xref + ); + this.#fixNamedDestinations(newAnnotations, dedupNamedDestinations); + pageDict.setIfArray("Annots", newAnnotations); + } + + if (this.useObjectStreams) { + const newLastRef = this.newRefCount; + const pageObjectRefs = []; + for (let i = lastRef; i < newLastRef; i++) { + const obj = this.xref[i]; + if (obj instanceof BaseStream) { + continue; + } + pageObjectRefs.push(Ref.get(i, 0)); + } + for (let i = 0; i < pageObjectRefs.length; i += 0xffff) { + const objStreamRef = this.newRef; + this.objStreamRefs.add(objStreamRef.num); + this.xref[objStreamRef.num] = pageObjectRefs.slice(i, i + 0xffff); + } + } + + this.currentDocument = null; + + return pageRef; + } + + /** + * Create the page tree structure. + */ + #makePageTree() { + const { newPages: pages, rootDict, pagesRef, pagesDict } = this; + rootDict.set("Pages", pagesRef); + pagesDict.setIfName("Type", "Pages"); + pagesDict.set("Count", pages.length); + + const maxLeaves = + MAX_LEAVES_PER_PAGES_NODE <= 1 ? pages.length : MAX_LEAVES_PER_PAGES_NODE; + const stack = [{ dict: pagesDict, kids: pages, parentRef: pagesRef }]; + + while (stack.length > 0) { + const { dict, kids, parentRef } = stack.pop(); + if (kids.length <= maxLeaves) { + dict.set("Kids", kids); + for (const ref of kids) { + this.xref[ref.num].set("Parent", parentRef); + } + continue; + } + const chunkSize = Math.max(maxLeaves, Math.ceil(kids.length / maxLeaves)); + const kidsChunks = []; + for (let i = 0; i < kids.length; i += chunkSize) { + kidsChunks.push(kids.slice(i, i + chunkSize)); + } + const kidsRefs = []; + dict.set("Kids", kidsRefs); + for (const chunk of kidsChunks) { + const [kidRef, kidDict] = this.newDict; + kidsRefs.push(kidRef); + kidDict.setIfName("Type", "Pages"); + kidDict.set("Parent", parentRef); + kidDict.set("Count", chunk.length); + stack.push({ dict: kidDict, kids: chunk, parentRef: kidRef }); + } + } + } + + /** + * Create a name or number tree from the given map. + * @param {Array<[string|number, any]>} map + * @returns {Ref} + */ + #makeNameNumTree(map, areNames) { + const allEntries = map.sort( + areNames + ? ([keyA], [keyB]) => keyA.localeCompare(keyB) + : ([keyA], [keyB]) => keyA - keyB + ); + const maxLeaves = + MAX_IN_NAME_TREE_NODE <= 1 ? allEntries.length : MAX_IN_NAME_TREE_NODE; + const [treeRef, treeDict] = this.newDict; + const stack = [{ dict: treeDict, entries: allEntries }]; + const valueType = areNames ? "Names" : "Nums"; + + while (stack.length > 0) { + const { dict, entries } = stack.pop(); + if (entries.length <= maxLeaves) { + dict.set("Limits", [entries[0][0], entries.at(-1)[0]]); + dict.set(valueType, entries.flat()); + continue; + } + const entriesChunks = []; + const chunkSize = Math.max( + maxLeaves, + Math.ceil(entries.length / maxLeaves) + ); + for (let i = 0; i < entries.length; i += chunkSize) { + entriesChunks.push(entries.slice(i, i + chunkSize)); + } + const entriesRefs = []; + dict.set("Kids", entriesRefs); + for (const chunk of entriesChunks) { + const [entriesRef, entriesDict] = this.newDict; + entriesRefs.push(entriesRef); + entriesDict.set("Limits", [chunk[0][0], chunk.at(-1)[0]]); + stack.push({ dict: entriesDict, entries: chunk }); + } + } + return treeRef; + } + + /** + * Create the page labels tree if it exists. + */ + #makePageLabelsTree() { + const { pageLabels } = this; + if (!pageLabels || pageLabels.length === 0) { + return; + } + const { rootDict } = this; + const pageLabelsRef = this.#makeNameNumTree( + this.pageLabels, + /* areNames = */ false + ); + rootDict.set("PageLabels", pageLabelsRef); + } + + #makeDestinationsTree() { + const { namedDestinations } = this; + if (namedDestinations.size === 0) { + return; + } + if (!this.namesDict) { + [this.namesRef, this.namesDict] = this.newDict; + this.rootDict.set("Names", this.namesRef); + } + this.namesDict.set( + "Dests", + this.#makeNameNumTree( + Array.from(namedDestinations.entries()), + /* areNames = */ true + ) + ); + } + + #makeStructTree() { + const { structTreeKids } = this; + if (!structTreeKids || structTreeKids.length === 0) { + return; + } + const { rootDict } = this; + const structTreeRef = this.newRef; + const structTree = (this.xref[structTreeRef.num] = new Dict()); + structTree.setIfName("Type", "StructTreeRoot"); + structTree.setIfArray("K", structTreeKids); + for (const kidRef of structTreeKids) { + const kid = this.xref[kidRef.num]; + const type = kid.get("Type"); + if (!type || isName(type, "StructElem")) { + kid.set("P", structTreeRef); + } + } + if (this.parentTree.size > 0) { + const parentTreeRef = this.#makeNameNumTree( + Array.from(this.parentTree.entries()), + /* areNames = */ false + ); + const parentTree = this.xref[parentTreeRef.num]; + parentTree.setIfName("Type", "ParentTree"); + structTree.set("ParentTree", parentTreeRef); + structTree.set("ParentTreeNextKey", this.parentTree.size); + } + if (this.idTree.size > 0) { + const idTreeRef = this.#makeNameNumTree( + Array.from(this.idTree.entries()), + /* areNames = */ true + ); + const idTree = this.xref[idTreeRef.num]; + idTree.setIfName("Type", "IDTree"); + structTree.set("IDTree", idTreeRef); + } + if (this.classMap.size > 0) { + const classMapRef = this.newRef; + this.xref[classMapRef.num] = this.classMap; + structTree.set("ClassMap", classMapRef); + } + if (this.roleMap.size > 0) { + const roleMapRef = this.newRef; + this.xref[roleMapRef.num] = this.roleMap; + structTree.set("RoleMap", roleMapRef); + } + if (this.namespaces.size > 0) { + const namespacesRef = this.newRef; + this.xref[namespacesRef.num] = Array.from(this.namespaces.values()); + structTree.set("Namespaces", namespacesRef); + } + if (this.structTreeAF.length > 0) { + const structTreeAFRef = this.newRef; + this.xref[structTreeAFRef.num] = this.structTreeAF; + structTree.set("AF", structTreeAFRef); + } + if (this.structTreePronunciationLexicon.length > 0) { + const structTreePronunciationLexiconRef = this.newRef; + this.xref[structTreePronunciationLexiconRef.num] = + this.structTreePronunciationLexicon; + structTree.set("PronunciationLexicon", structTreePronunciationLexiconRef); + } + rootDict.set("StructTreeRoot", structTreeRef); + } + + /** + * Create the root dictionary. + * @returns {Promise} + */ + async #makeRoot() { + const { rootDict } = this; + rootDict.setIfName("Type", "Catalog"); + rootDict.setIfName("Version", this.version); + this.#makePageTree(); + this.#makePageLabelsTree(); + this.#makeDestinationsTree(); + this.#makeStructTree(); + } + + /** + * Create the info dictionary. + * @returns {Map} infoMap + */ + #makeInfo() { + const infoMap = new Map(); + if (this.hasSingleFile) { + const { + xref: { trailer }, + } = this.oldPages[0].documentData.document; + const oldInfoDict = trailer.get("Info"); + for (const [key, value] of oldInfoDict || []) { + if (typeof value === "string") { + infoMap.set(key, stringToPDFString(value)); + } + } + } + infoMap.delete("ModDate"); + infoMap.set("CreationDate", getModificationDate()); + infoMap.set("Creator", "PDF.js"); + infoMap.set("Producer", "Firefox"); + + if (this.author) { + infoMap.set("Author", this.author); + } + if (this.title) { + infoMap.set("Title", this.title); + } + for (const [key, value] of infoMap) { + this.infoDict.set(key, stringToAsciiOrUTF16BE(value)); + } + return infoMap; + } + + /** + * Create the encryption dictionary if required. + * @returns {Promise<[Dict|null, CipherTransformFactory|null, Array|null]>} + */ + async #makeEncrypt() { + if (!this.hasSingleFile) { + return [null, null, null]; + } + const { documentData } = this.oldPages[0]; + const { + document: { + xref: { trailer, encrypt }, + }, + } = documentData; + if (!trailer.has("Encrypt")) { + return [null, null, null]; + } + const encryptDict = trailer.get("Encrypt"); + if (!(encryptDict instanceof Dict)) { + return [null, null, null]; + } + this.currentDocument = documentData; + const result = [ + await this.#cloneObject(encryptDict, trailer.xref), + encrypt, + trailer.get("ID"), + ]; + this.currentDocument = null; + return result; + } + + /** + * Create the changes required to write the new PDF document. + * @returns {Promise<[RefSetCache, Ref]>} + */ + async #createChanges() { + const changes = new RefSetCache(); + changes.put(Ref.get(0, 0xffff), { data: null }); + for (let i = 1, ii = this.xref.length; i < ii; i++) { + if (this.objStreamRefs?.has(i)) { + await this.#createObjectStream(Ref.get(i, 0), this.xref[i], changes); + } else { + changes.put(Ref.get(i, 0), { data: this.xref[i] }); + } + } + + return [changes, this.newRef]; + } + + /** + * Create an object stream containing the given objects. + * @param {Ref} objStreamRef + * @param {Array} objRefs + * @param {RefSetCache} changes + */ + async #createObjectStream(objStreamRef, objRefs, changes) { + const streamBuffer = [""]; + const objOffsets = []; + let offset = 0; + const buffer = []; + for (let i = 0, ii = objRefs.length; i < ii; i++) { + const objRef = objRefs[i]; + changes.put(objRef, { data: null, objStreamRef, index: i }); + objOffsets.push(`${objRef.num} ${offset}`); + const data = this.xref[objRef.num]; + await writeValue(data, buffer, /* transform = */ null); + const obj = buffer.join(""); + buffer.length = 0; + streamBuffer.push(obj); + offset += obj.length + 1; + } + streamBuffer[0] = objOffsets.join("\n"); + const objStream = new StringStream(streamBuffer.join("\n")); + const objStreamDict = (objStream.dict = new Dict()); + objStreamDict.setIfName("Type", "ObjStm"); + objStreamDict.set("N", objRefs.length); + objStreamDict.set("First", streamBuffer[0].length + 1); + + changes.put(objStreamRef, { data: objStream }); + } + + /** + * Write the new PDF document to a Uint8Array. + * @returns {Promise} + */ + async writePDF() { + await this.#makeRoot(); + const infoMap = this.#makeInfo(); + const [encryptRef, encrypt, fileIds] = await this.#makeEncrypt(); + const [changes, xrefTableRef] = await this.#createChanges(); + + // Create the PDF header in order to help sniffers. + // PDF version must be in the range 1.0 to 1.7 inclusive. + // We add a binary comment line to ensure that the file is treated + // as a binary file by applications that open it. + const header = [ + ...`%PDF-${this.version}\n%`.split("").map(c => c.charCodeAt(0)), + 0xfa, + 0xde, + 0xfa, + 0xce, + ]; + return incrementalUpdate({ + originalData: new Uint8Array(header), + changes, + xrefInfo: { + startXRef: null, + rootRef: this.rootRef, + infoRef: this.infoRef, + encryptRef, + newRef: xrefTableRef, + fileIds: fileIds || [null, null], + infoMap, + }, + useXrefStream: this.useObjectStreams, + xref: { + encrypt, + encryptRef, + }, + }); + } +} + +export { PDFEditor }; diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 474f297884b9b..6a2ba2986ee9f 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -40,6 +40,11 @@ import { lookupMatrix, lookupNormalRect, } from "./core_utils.js"; +import { + FontInfo, + FontPathInfo, + PatternInfo, +} from "../shared/obj-bin-transform.js"; import { getEncoding, MacRomanEncoding, @@ -1034,6 +1039,7 @@ class PartialEvaluator { if ( isAddToPathSet || state.fillColorSpace.name === "Pattern" || + state.strokeColorSpace.name === "Pattern" || font.disableFontFace ) { PartialEvaluator.buildFontPaths( @@ -1516,7 +1522,10 @@ class PartialEvaluator { localShadingPatternCache.set(shading, id); if (this.parsingType3Font) { - this.handler.send("commonobj", [id, "Pattern", patternIR]); + const transfers = []; + const patternBuffer = PatternInfo.write(patternIR); + transfers.push(patternBuffer); + this.handler.send("commonobj", [id, "Pattern", patternBuffer], transfers); } else { this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]); } @@ -1697,7 +1706,7 @@ class PartialEvaluator { return null; } - getOperatorList({ + async getOperatorList({ stream, task, resources, @@ -1706,6 +1715,13 @@ class PartialEvaluator { fallbackFontDict = null, prevRefs = null, }) { + if (stream.isAsync) { + const bytes = await stream.asyncGetBytes(); + if (bytes) { + stream = new Stream(bytes, 0, bytes.length, stream.dict); + } + } + const objId = stream.dict?.objId; const seenRefs = new RefSet(prevRefs); @@ -2364,7 +2380,7 @@ class PartialEvaluator { }); } - getTextContent({ + async getTextContent({ stream, task, resources, @@ -2380,6 +2396,13 @@ class PartialEvaluator { prevRefs = null, intersector = null, }) { + if (stream.isAsync) { + const bytes = await stream.asyncGetBytes(); + if (bytes) { + stream = new Stream(bytes, 0, bytes.length, stream.dict); + } + } + const objId = stream.dict?.objId; const seenRefs = new RefSet(prevRefs); @@ -2926,7 +2949,7 @@ class PartialEvaluator { for (let i = 0, ii = glyphs.length; i < ii; i++) { const glyph = glyphs[i]; - const { category } = glyph; + const { category, originalCharCode } = glyph; if (category.isInvisibleFormatMark) { continue; @@ -2940,6 +2963,10 @@ class PartialEvaluator { } let scaledDim = glyphWidth * scale; + if (originalCharCode === 0x20) { + charSpacing += textState.wordSpacing; + } + if (!keepWhiteSpace && category.isWhitespace) { // Don't push a " " in the textContentItem // (except when it's between two non-spaces chars), @@ -2947,13 +2974,13 @@ class PartialEvaluator { // compareWithLastPosition. // This way we can merge real spaces and spaces due to cursor moves. if (!font.vertical) { - charSpacing += scaledDim + textState.wordSpacing; + charSpacing += scaledDim; textState.translateTextMatrix( charSpacing * textState.textHScale, 0 ); } else { - charSpacing += -scaledDim + textState.wordSpacing; + charSpacing += -scaledDim; textState.translateTextMatrix(0, -charSpacing); } saveLastChar(" "); @@ -3576,7 +3603,7 @@ class PartialEvaluator { if (properties.composite) { // CIDSystemInfo helps to match CID to glyphs const cidSystemInfo = dict.get("CIDSystemInfo"); - if (cidSystemInfo instanceof Dict) { + if (cidSystemInfo instanceof Dict && !properties.cidSystemInfo) { properties.cidSystemInfo = { registry: stringToPDFString(cidSystemInfo.get("Registry")), ordering: stringToPDFString(cidSystemInfo.get("Ordering")), @@ -3658,11 +3685,72 @@ class PartialEvaluator { baseEncodingName = null; } + // Ignore incorrectly specified WinAnsiEncoding for non-embedded CJK fonts + // (fixes issue20489). Some chinese fonts often have WinAnsiEncoding in the + // PDF even though they should use Identity-H or GB-EUC-H encoding. + if ( + baseEncodingName === "WinAnsiEncoding" && + nonEmbeddedFont && + properties.name?.charCodeAt(0) >= 0xb7 + ) { + const fontName = properties.name; + // This list is built from some names from Pdfium and mupdf: + // - https://pdfium.googlesource.com/pdfium/+/master/core/fpdfapi/font/cpdf_font.cpp#41 + // - https://fossies.org/linux/mupdf/source/pdf/pdf-font.c#l_820 + const chineseFontNames = [ + "\xCB\xCE\xCC\xE5", // SimSun + "\xBA\xDA\xCC\xE5", // SimHei + "\xBF\xAC\xCC\xE5", // SimKai + "\xB7\xC2\xCB\xCE", // SimFang + "\xBF\xAC\xCC\xE5_GB2312", // SimKai + "\xB7\xC2\xCB\xCE_GB2312", // SimFang + "\xC1\xA5\xCA\xE9", // SimLi + "\xD0\xC2\xCB\xCE", // SimSun + ]; + + // Check for common Chinese font names and their GBK-encoded equivalents + // (which may appear as Latin-1 when incorrectly decoded). + if (chineseFontNames.includes(fontName)) { + baseEncodingName = null; + properties.defaultEncoding = "Adobe-GB1-UCS2"; + properties.composite = true; + properties.cidEncoding = Name.get("GBK-EUC-H"); + const cMap = await CMapFactory.create({ + encoding: properties.cidEncoding, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null, + }); + properties.cMap = cMap; + properties.vertical = properties.cMap.vertical; + properties.cidSystemInfo = { + registry: "Adobe", + ordering: "GB1", + supplement: 0, + }; + } + } + if (baseEncodingName) { properties.defaultEncoding = getEncoding(baseEncodingName); } else { - const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + let isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic); + + // The PDF specs state that the flags Symbolic and Nonsymbolic must be + // mutually exclusive. However, some fonts are marked as both. + // In that case we ignore the Symbolic flag when there is a Differences + // entry (which indicates that the font is used as a non-symbolic + // font). + if ( + properties.type === "TrueType" && + isSymbolicFont && + isNonsymbolicFont && + differences.length !== 0 + ) { + properties.flags &= ~FontFlags.Symbolic; + isSymbolicFont = false; + } + // According to "Table 114" in section "9.6.6.1 General" (under // "9.6.6 Character Encoding") of the PDF specification, a Nonsymbolic // font should use the `StandardEncoding` if no encoding is specified. @@ -4263,7 +4351,7 @@ class PartialEvaluator { hash.update(`${firstChar}-${lastChar}`); // Fixes issue10665_reduced.pdf if (toUnicode instanceof BaseStream) { - const stream = toUnicode.str || toUnicode; + const stream = toUnicode.stream || toUnicode; const uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array( @@ -4491,8 +4579,16 @@ class PartialEvaluator { if (fontFile) { if (!(fontFile instanceof BaseStream)) { throw new FormatError("FontFile should be a stream"); - } else if (fontFile.isEmpty) { - throw new FormatError("FontFile is empty"); + } else { + if (fontFile.isAsync) { + const bytes = await fontFile.asyncGetBytes(); + if (bytes) { + fontFile = new Stream(bytes, 0, bytes.length, fontFile.dict); + } + } + if (fontFile.isEmpty) { + throw new FormatError("FontFile is empty"); + } } } } catch (ex) { @@ -4639,11 +4735,8 @@ class PartialEvaluator { if (font.renderer.hasBuiltPath(fontChar)) { return; } - handler.send("commonobj", [ - glyphName, - "FontPath", - font.renderer.getPathJs(fontChar), - ]); + const buffer = FontPathInfo.write(font.renderer.getPathJs(fontChar)); + handler.send("commonobj", [glyphName, "FontPath", buffer], [buffer]); } catch (reason) { if (evaluatorOptions.ignoreErrors) { warn(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`); @@ -4693,12 +4786,21 @@ class TranslatedFont { return; } this.#sent = true; - - handler.send("commonobj", [ - this.loadedName, - "Font", - this.font.exportData(), - ]); + const fontData = this.font.exportData(); + const transfer = []; + if (fontData.data) { + if (fontData.data.charProcOperatorList) { + fontData.charProcOperatorList = fontData.data.charProcOperatorList; + } + fontData.data = FontInfo.write(fontData.data); + transfer.push(fontData.data); + } + handler.send("commonobj", [this.loadedName, "Font", fontData], transfer); + // future path: switch to a SharedArrayBuffer + // const sab = new SharedArrayBuffer(data.byteLength); + // const view = new Uint8Array(sab); + // view.set(new Uint8Array(data)); + // handler.send("commonobj", [this.loadedName, "Font", sab]); } fallback(handler, evaluatorOptions) { diff --git a/src/core/file_spec.js b/src/core/file_spec.js index d331af04e93ce..c5b3679509bd5 100644 --- a/src/core/file_spec.js +++ b/src/core/file_spec.js @@ -13,26 +13,18 @@ * limitations under the License. */ -import { shadow, stringToPDFString, warn } from "../shared/util.js"; +import { stringToPDFString, warn } from "../shared/util.js"; import { BaseStream } from "./base_stream.js"; import { Dict } from "./primitives.js"; function pickPlatformItem(dict) { - if (!(dict instanceof Dict)) { - return null; - } - // Look for the filename in this order: - // UF, F, Unix, Mac, DOS - if (dict.has("UF")) { - return dict.get("UF"); - } else if (dict.has("F")) { - return dict.get("F"); - } else if (dict.has("Unix")) { - return dict.get("Unix"); - } else if (dict.has("Mac")) { - return dict.get("Mac"); - } else if (dict.has("DOS")) { - return dict.get("DOS"); + if (dict instanceof Dict) { + // Look for the filename in this order: UF, F, Unix, Mac, DOS + for (const key of ["UF", "F", "Unix", "Mac", "DOS"]) { + if (dict.has(key)) { + return dict.get(key); + } + } } return null; } @@ -51,11 +43,10 @@ function stripPath(str) { class FileSpec { #contentAvailable = false; - constructor(root, xref, skipContent = false) { + constructor(root, skipContent = false) { if (!(root instanceof Dict)) { return; } - this.xref = xref; this.root = root; if (root.has("FS")) { this.fs = root.get("FS"); @@ -73,56 +64,46 @@ class FileSpec { } get filename() { - let filename = ""; - const item = pickPlatformItem(this.root); if (item && typeof item === "string") { - filename = stringToPDFString(item, /* keepEscapeSequence = */ true) + // NOTE: The following replacement order is INTENTIONAL, regardless of + // what some static code analysers (e.g. CodeQL) may claim. + return stringToPDFString(item, /* keepEscapeSequence = */ true) .replaceAll("\\\\", "\\") .replaceAll("\\/", "/") .replaceAll("\\", "/"); } - return shadow(this, "filename", filename || "unnamed"); + return ""; } get content() { if (!this.#contentAvailable) { return null; } - this._contentRef ||= pickPlatformItem(this.root?.get("EF")); + const ef = pickPlatformItem(this.root?.get("EF")); - let content = null; - if (this._contentRef) { - const fileObj = this.xref.fetchIfRef(this._contentRef); - if (fileObj instanceof BaseStream) { - content = fileObj.getBytes(); - } else { - warn( - "Embedded file specification points to non-existing/invalid content" - ); - } - } else { - warn("Embedded file specification does not have any content"); + if (ef instanceof BaseStream) { + return ef.getBytes(); } - return content; + warn("Embedded file specification points to non-existing/invalid content"); + return null; } get description() { - let description = ""; - const desc = this.root?.get("Desc"); if (desc && typeof desc === "string") { - description = stringToPDFString(desc); + return stringToPDFString(desc); } - return shadow(this, "description", description); + return ""; } get serializable() { + const { filename, content, description } = this; return { - rawFilename: this.filename, - filename: stripPath(this.filename), - content: this.content, - description: this.description, + rawFilename: filename, + filename: stripPath(filename) || "unnamed", + content, + description, }; } } diff --git a/src/core/flate_stream.js b/src/core/flate_stream.js index bc98ae1aef6cd..064b46ee87b73 100644 --- a/src/core/flate_stream.js +++ b/src/core/flate_stream.js @@ -122,10 +122,12 @@ const fixedDistCodeTab = [ ]; class FlateStream extends DecodeStream { + #isAsync = true; + constructor(str, maybeLength) { super(maybeLength); - this.str = str; + this.stream = str; this.dict = str.dict; const cmf = str.getByte(); @@ -161,8 +163,10 @@ class FlateStream extends DecodeStream { } async asyncGetBytes() { - this.str.reset(); - const bytes = this.str.getBytes(); + this.stream.reset(); + const bytes = this.stream.isAsync + ? await this.stream.asyncGetBytes() + : this.stream.getBytes(); try { const { readable, writable } = new DecompressionStream("deflate"); @@ -200,11 +204,12 @@ class FlateStream extends DecodeStream { // decoder. // We already get the bytes from the underlying stream, so we just reuse // them to avoid get them again. - this.str = new Stream( + this.#isAsync = false; + this.stream = new Stream( bytes, 2 /* = header size (see ctor) */, bytes.length, - this.str.dict + this.stream.dict ); this.reset(); return null; @@ -212,11 +217,11 @@ class FlateStream extends DecodeStream { } get isAsync() { - return true; + return this.#isAsync; } getBits(bits) { - const str = this.str; + const str = this.stream; let codeSize = this.codeSize; let codeBuf = this.codeBuf; @@ -236,7 +241,7 @@ class FlateStream extends DecodeStream { } getCode(table) { - const str = this.str; + const str = this.stream; const codes = table[0]; const maxLen = table[1]; let codeSize = this.codeSize; @@ -312,7 +317,7 @@ class FlateStream extends DecodeStream { readBlock() { let buffer, hdr, len; - const str = this.str; + const str = this.stream; // read block header try { hdr = this.getBits(3); diff --git a/src/core/font_renderer.js b/src/core/font_renderer.js index 23c8b218d3cdc..e740896070611 100644 --- a/src/core/font_renderer.js +++ b/src/core/font_renderer.js @@ -16,6 +16,8 @@ import { assert, bytesToString, + DrawOPS, + FeatureTest, FONT_IDENTITY_MATRIX, FormatError, unreachable, @@ -169,16 +171,16 @@ function compileGlyf(code, cmds, font) { function moveTo(x, y) { if (firstPoint) { // Close the current subpath in adding a straight line to the first point. - cmds.add("L", firstPoint); + cmds.add(DrawOPS.lineTo, firstPoint); } firstPoint = [x, y]; - cmds.add("M", [x, y]); + cmds.add(DrawOPS.moveTo, [x, y]); } function lineTo(x, y) { - cmds.add("L", [x, y]); + cmds.add(DrawOPS.lineTo, [x, y]); } function quadraticCurveTo(xa, ya, x, y) { - cmds.add("Q", [xa, ya, x, y]); + cmds.add(DrawOPS.quadraticCurveTo, [xa, ya, x, y]); } let i = 0; @@ -355,16 +357,16 @@ function compileCharString(charStringCode, cmds, font, glyphId) { function moveTo(x, y) { if (firstPoint) { // Close the current subpath in adding a straight line to the first point. - cmds.add("L", firstPoint); + cmds.add(DrawOPS.lineTo, firstPoint); } firstPoint = [x, y]; - cmds.add("M", [x, y]); + cmds.add(DrawOPS.moveTo, [x, y]); } function lineTo(x, y) { - cmds.add("L", [x, y]); + cmds.add(DrawOPS.lineTo, [x, y]); } function bezierCurveTo(x1, y1, x2, y2, x, y) { - cmds.add("C", [x1, y1, x2, y2, x, y]); + cmds.add(DrawOPS.curveTo, [x1, y1, x2, y2, x, y]); } const stack = []; @@ -749,7 +751,7 @@ class Commands { for (let i = 0, ii = args.length; i < ii; i += 2) { Util.applyTransform(args, currentTransform, i); } - this.cmds.push(`${cmd}${args.join(" ")}`); + this.cmds.push(cmd, ...args); } else { this.cmds.push(cmd); } @@ -771,8 +773,13 @@ class Commands { this.currentTransform = this.transformStack.pop() || [1, 0, 0, 1, 0, 0]; } - getSVG() { - return this.cmds.join(""); + getPath() { + if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { + return new Float16Array(this.cmds); + } + return new ( + FeatureTest.isFloat16ArraySupported ? Float16Array : Float32Array + )(this.cmds); } } @@ -834,9 +841,9 @@ class CompiledFont { const cmds = new Commands(); cmds.transform(fontMatrix.slice()); this.compileGlyphImpl(code, cmds, glyphId); - cmds.add("Z"); + cmds.add(DrawOPS.closePath); - return cmds.getSVG(); + return cmds.getPath(); } compileGlyphImpl() { diff --git a/src/core/font_substitutions.js b/src/core/font_substitutions.js index 41bc5cc75fbb1..7325087b3a935 100644 --- a/src/core/font_substitutions.js +++ b/src/core/font_substitutions.js @@ -51,6 +51,7 @@ const substitutionMap = new Map([ "FreeSerif", "Linux Libertine O", "Libertinus Serif", + "PT Astra Serif", "DejaVu Serif", "Bitstream Vera Serif", "Ubuntu", @@ -305,6 +306,64 @@ const substitutionMap = new Map([ alias: "Wingdings", }, ], + [ + "\xCB\xCE\xCC\xE5", + { + local: ["SimSun", "SimSun Regular", "NSimSun"], + style: NORMAL, + ultimate: "serif", + }, + ], + [ + "\xBA\xDA\xCC\xE5", + { + local: ["SimHei", "SimHei Regular"], + style: NORMAL, + ultimate: "sans-serif", + }, + ], + [ + "\xBF\xAC\xCC\xE5", + { + local: ["KaiTi", "SimKai", "SimKai Regular"], + style: NORMAL, + ultimate: "sans-serif", + }, + ], + [ + "\xB7\xC2\xCB\xCE", + { + local: ["FangSong", "SimFang", "SimFang Regular"], + style: NORMAL, + ultimate: "serif", + }, + ], + [ + "\xBF\xAC\xCC\xE5_GB2312", + { + alias: "\xBF\xAC\xCC\xE5", + }, + ], + [ + "\xB7\xC2\xCB\xCE_GB2312", + { + alias: "\xB7\xC2\xCB\xCE", + }, + ], + [ + "\xC1\xA5\xCA\xE9", + { + local: ["SimLi", "SimLi Regular"], + style: NORMAL, + ultimate: "serif", + }, + ], + [ + "\xD0\xC2\xCB\xCE", + { + alias: "\xCB\xCE\xCC\xE5", + }, + ], ]); const fontAliases = new Map([["Arial-Black", "ArialBlack"]]); diff --git a/src/core/fonts.js b/src/core/fonts.js index bfb9943c61c36..a155ac70283ab 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -60,7 +60,6 @@ import { CFFFont } from "./cff_font.js"; import { FontRendererFactory } from "./font_renderer.js"; import { getFontBasicMetrics } from "./metrics.js"; import { GlyfTable } from "./glyf.js"; -import { IdentityCMap } from "./cmap.js"; import { OpenTypeFileBuilder } from "./opentype_file_builder.js"; import { readUint32 } from "./core_utils.js"; import { Stream } from "./stream.js"; @@ -989,10 +988,14 @@ class Font { // Fallback to checking the font name, in order to improve text-selection, // since the /Flags-entry is often wrong (fixes issue13845.pdf). if (!isSerifFont && !properties.isSimulatedFlags) { - const baseName = name.replaceAll(/[,_]/g, "-").split("-", 1)[0], + const stdFontMap = getStdFontMap(), + nonStdFontMap = getNonStdFontMap(), serifFonts = getSerifFonts(); - for (const namePart of baseName.split("+")) { - if (serifFonts[namePart]) { + for (const namePart of name.split("+")) { + let fontName = namePart.replaceAll(/[,_]/g, "-"); + fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; + fontName = fontName.split("-", 1)[0]; + if (serifFonts[fontName]) { isSerifFont = true; break; } @@ -1144,19 +1147,27 @@ class Font { } exportData() { - const exportDataProps = this.fontExtraProperties - ? [...EXPORT_DATA_PROPERTIES, ...EXPORT_DATA_EXTRA_PROPERTIES] - : EXPORT_DATA_PROPERTIES; - const data = Object.create(null); - for (const prop of exportDataProps) { + for (const prop of EXPORT_DATA_PROPERTIES) { const value = this[prop]; // Ignore properties that haven't been explicitly set. if (value !== undefined) { data[prop] = value; } } - return data; + + if (!this.fontExtraProperties) { + return { data }; + } + + const extra = Object.create(null); + for (const prop of EXPORT_DATA_EXTRA_PROPERTIES) { + const value = this[prop]; + if (value !== undefined) { + extra[prop] = value; + } + } + return { data, extra }; } fallbackToSystemFont(properties) { @@ -2626,27 +2637,23 @@ class Font { header = readOpenTypeHeader(font); tables = readTables(font, header.numTables); } - let cff, cffFile; const isTrueType = !tables["CFF "]; if (!isTrueType) { - const isComposite = - properties.composite && - (properties.cidToGidMap?.length > 0 || - !(properties.cMap instanceof IdentityCMap)); // OpenType font (skip composite fonts with non-default glyph mapping). if ( - (header.version === "OTTO" && !isComposite) || + (header.version === "OTTO" && !properties.composite) || !tables.head || !tables.hhea || !tables.maxp || !tables.post ) { // No major tables: throwing everything at `CFFFont`. - cffFile = new Stream(tables["CFF "].data); - cff = new CFFFont(cffFile, properties); - - return this.convert(name, cff, properties); + return this.convert( + name, + new CFFFont(new Stream(tables["CFF "].data), properties), + properties + ); } delete tables.glyf; @@ -2674,9 +2681,32 @@ class Font { throw new FormatError('Required "maxp" table is not found'); } + let numGlyphsFromCFF; + if (!isTrueType) { + try { + // Trying to repair CFF file + const parser = new CFFParser( + new Stream(tables["CFF "].data), + properties, + SEAC_ANALYSIS_ENABLED + ); + const cff = parser.parse(); + cff.duplicateFirstGlyph(); + const compiler = new CFFCompiler(cff); + tables["CFF "].data = compiler.compile(); + numGlyphsFromCFF = cff.charStringCount; + } catch { + warn("Failed to compile font " + properties.loadedName); + } + } + font.pos = (font.start || 0) + tables.maxp.offset; let version = font.getInt32(); - const numGlyphs = font.getUint16(); + const numGlyphs = numGlyphsFromCFF ?? font.getUint16(); + if (version === 0x00005000 && tables.maxp.length !== 6) { + tables.maxp.data = tables.maxp.data.subarray(0, 6); + tables.maxp.length = 6; + } if (version !== 0x00010000 && version !== 0x00005000) { // https://learn.microsoft.com/en-us/typography/opentype/spec/maxp @@ -2690,13 +2720,36 @@ class Font { writeUint32(tables.maxp.data, 0, version); } + let isGlyphLocationsLong = int16( + tables.head.data[50], + tables.head.data[51] + ); + if (tables.loca) { + const locaLength = isGlyphLocationsLong + ? (numGlyphs + 1) * 4 + : (numGlyphs + 1) * 2; + if (tables.loca.length !== locaLength) { + warn("Incorrect 'loca' table length -- attempting to fix it."); + // The length of the loca table is wrong (see #13425), so we check if we + // have enough space to fix it. + const sortedTables = Object.values(tables) + .filter(Boolean) + .sort((a, b) => a.offset - b.offset); + const locaIndex = sortedTables.indexOf(tables.loca); + const nextTable = sortedTables[locaIndex + 1] || null; + if (nextTable && tables.loca.offset + locaLength < nextTable.offset) { + const previousPos = font.pos; + font.pos = font.start || 0; + font.skip(tables.loca.offset); + tables.loca.data = font.getBytes(locaLength); + tables.loca.length = locaLength; + font.pos = previousPos; + } + } + } + if (properties.scaleFactors?.length === numGlyphs && isTrueType) { const { scaleFactors } = properties; - const isGlyphLocationsLong = int16( - tables.head.data[50], - tables.head.data[51] - ); - const glyphs = new GlyfTable({ glyfTable: tables.glyf.data, isGlyphLocationsLong, @@ -2711,7 +2764,7 @@ class Font { if (isLocationLong !== !!isGlyphLocationsLong) { tables.head.data[50] = 0; - tables.head.data[51] = isLocationLong ? 1 : 0; + isGlyphLocationsLong = tables.head.data[51] = isLocationLong ? 1 : 0; } const metrics = tables.hmtx.data; @@ -2789,10 +2842,6 @@ class Font { let missingGlyphs = Object.create(null); if (isTrueType) { - const isGlyphLocationsLong = int16( - tables.head.data[50], - tables.head.data[51] - ); const glyphsInfo = sanitizeGlyphLocations( tables.loca, tables.glyf, @@ -3068,24 +3117,6 @@ class Font { } } - if (!isTrueType) { - try { - // Trying to repair CFF file - cffFile = new Stream(tables["CFF "].data); - const parser = new CFFParser( - cffFile, - properties, - SEAC_ANALYSIS_ENABLED - ); - cff = parser.parse(); - cff.duplicateFirstGlyph(); - const compiler = new CFFCompiler(cff); - tables["CFF "].data = compiler.compile(); - } catch { - warn("Failed to compile font " + properties.loadedName); - } - } - // Re-creating 'name' table if (!tables.name) { tables.name = { diff --git a/src/core/image.js b/src/core/image.js index dbeaaa9c34ecf..d4e40fe01ea66 100644 --- a/src/core/image.js +++ b/src/core/image.js @@ -369,7 +369,7 @@ class PDFImage { const inverseDecode = decode?.[0] > 0; const computedLength = ((width + 7) >> 3) * height; - const imgArray = image.getBytes(computedLength); + const imgArray = await image.getImageData(computedLength); const isSingleOpaquePixel = width === 1 && diff --git a/src/core/intersector.js b/src/core/intersector.js index acd54f2f6af18..75f8bb43ee4bf 100644 --- a/src/core/intersector.js +++ b/src/core/intersector.js @@ -16,13 +16,13 @@ class SingleIntersector { #annotation; - #minX = Infinity; + minX = Infinity; - #minY = Infinity; + minY = Infinity; - #maxX = -Infinity; + maxX = -Infinity; - #maxY = -Infinity; + maxY = -Infinity; #quadPoints = null; @@ -40,30 +40,21 @@ class SingleIntersector { if (!quadPoints) { // If there are no quad points, we use the rectangle to determine the // bounds of the annotation. - [this.#minX, this.#minY, this.#maxX, this.#maxY] = annotation.data.rect; + [this.minX, this.minY, this.maxX, this.maxY] = annotation.data.rect; return; } for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { - this.#minX = Math.min(this.#minX, quadPoints[i]); - this.#maxX = Math.max(this.#maxX, quadPoints[i + 2]); - this.#minY = Math.min(this.#minY, quadPoints[i + 5]); - this.#maxY = Math.max(this.#maxY, quadPoints[i + 1]); + this.minX = Math.min(this.minX, quadPoints[i]); + this.maxX = Math.max(this.maxX, quadPoints[i + 2]); + this.minY = Math.min(this.minY, quadPoints[i + 5]); + this.maxY = Math.max(this.maxY, quadPoints[i + 1]); } if (quadPoints.length > 8) { this.#quadPoints = quadPoints; } } - overlaps(other) { - return !( - this.#minX >= other.#maxX || - this.#maxX <= other.#minX || - this.#minY >= other.#maxY || - this.#maxY <= other.#minY - ); - } - /** * Check if the given point intersects with the annotation's quad points. * The point (x, y) is supposed to be the center of the glyph. @@ -72,12 +63,7 @@ class SingleIntersector { * @returns {boolean} */ #intersects(x, y) { - if ( - this.#minX >= x || - this.#maxX <= x || - this.#minY >= y || - this.#maxY <= y - ) { + if (this.minX >= x || this.maxX <= x || this.minY >= y || this.maxY <= y) { return false; } @@ -154,56 +140,98 @@ class SingleIntersector { } } +// The grid is STEPS x STEPS. +const STEPS = 64; + class Intersector { - #intersectors = new Map(); + #intersectors = []; + + #grid = []; + + #minX; + + #maxX; + + #minY; + + #maxY; + + #invXRatio; + + #invYRatio; constructor(annotations) { + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + const intersectors = this.#intersectors; for (const annotation of annotations) { if (!annotation.data.quadPoints && !annotation.data.rect) { continue; } const intersector = new SingleIntersector(annotation); - for (const [otherIntersector, overlapping] of this.#intersectors) { - if (otherIntersector.overlaps(intersector)) { - if (!overlapping) { - this.#intersectors.set(otherIntersector, new Set([intersector])); - } else { - overlapping.add(intersector); + intersectors.push(intersector); + minX = Math.min(minX, intersector.minX); + minY = Math.min(minY, intersector.minY); + maxX = Math.max(maxX, intersector.maxX); + maxY = Math.max(maxY, intersector.maxY); + } + this.#minX = minX; + this.#minY = minY; + this.#maxX = maxX; + this.#maxY = maxY; + this.#invXRatio = (STEPS - 1) / (maxX - minX); + this.#invYRatio = (STEPS - 1) / (maxY - minY); + for (const intersector of intersectors) { + // TODO: instead of using the intersector bounds, we could iterate over + // the grid cells that the quad points intersect. + const iMin = this.#getGridIndex(intersector.minX, intersector.minY); + const iMax = this.#getGridIndex(intersector.maxX, intersector.maxY); + const w = (iMax - iMin) % STEPS; + const h = Math.floor((iMax - iMin) / STEPS); + for (let i = iMin; i <= iMin + h * STEPS; i += STEPS) { + for (let j = 0; j <= w; j++) { + let existing = this.#grid[i + j]; + if (!existing) { + this.#grid[i + j] = existing = []; } + existing.push(intersector); } } - this.#intersectors.set(intersector, null); } } + #getGridIndex(x, y) { + const i = Math.floor((x - this.#minX) * this.#invXRatio); + const j = Math.floor((y - this.#minY) * this.#invYRatio); + return i + j * STEPS; + } + addGlyph(transform, width, height, glyph) { const x = transform[4] + width / 2; const y = transform[5] + height / 2; - let overlappingIntersectors; - for (const [intersector, overlapping] of this.#intersectors) { - if (overlappingIntersectors) { - if (overlappingIntersectors.has(intersector)) { - intersector.addGlyph(x, y, glyph); - } else { - intersector.disableExtraChars(); - } - continue; - } - if (!intersector.addGlyph(x, y, glyph)) { - continue; - } - overlappingIntersectors = overlapping; + if (x < this.#minX || y < this.#minY || x > this.#maxX || y > this.#maxY) { + return; + } + const intersectors = this.#grid[this.#getGridIndex(x, y)]; + if (!intersectors) { + return; + } + + for (const intersector of intersectors) { + intersector.addGlyph(x, y, glyph); } } addExtraChar(char) { - for (const intersector of this.#intersectors.keys()) { + for (const intersector of this.#intersectors) { intersector.addExtraChar(char); } } setText() { - for (const intersector of this.#intersectors.keys()) { + for (const intersector of this.#intersectors) { intersector.setText(); } } diff --git a/src/core/jbig2.js b/src/core/jbig2.js index df689d9638de5..e31bd1f5ec15b 100644 --- a/src/core/jbig2.js +++ b/src/core/jbig2.js @@ -1165,15 +1165,15 @@ function readSegmentHeader(data, start) { let referredToCount = (referredFlags >> 5) & 7; const retainBits = [referredFlags & 31]; let position = start + 6; - if (referredFlags === 7) { + if (referredToCount === 7) { referredToCount = readUint32(data, position - 1) & 0x1fffffff; position += 3; - let bytes = (referredToCount + 7) >> 3; + let bytes = (referredToCount + 8) >> 3; retainBits[0] = data[position++]; while (--bytes > 0) { retainBits.push(data[position++]); } - } else if (referredFlags === 5 || referredFlags === 6) { + } else if (referredToCount === 5 || referredToCount === 6) { throw new Jbig2Error("invalid referred-to flags"); } diff --git a/src/core/jbig2_stream.js b/src/core/jbig2_stream.js index 126669c811c45..c62c3580ce1e8 100644 --- a/src/core/jbig2_stream.js +++ b/src/core/jbig2_stream.js @@ -13,11 +13,12 @@ * limitations under the License. */ +import { shadow, warn } from "../shared/util.js"; import { BaseStream } from "./base_stream.js"; import { DecodeStream } from "./decode_stream.js"; import { Dict } from "./primitives.js"; import { Jbig2Image } from "./jbig2.js"; -import { shadow } from "../shared/util.js"; +import { JBig2WasmImage } from "./jbig2_wasm.js"; /** * For JBIG2's we use a library to decode these images and @@ -47,7 +48,44 @@ class Jbig2Stream extends DecodeStream { this.decodeImage(); } - decodeImage(bytes) { + get isAsyncDecoder() { + return true; + } + + get isImageStream() { + return true; + } + + async decodeImage(bytes, _decoderOptions) { + if (this.eof) { + return this.buffer; + } + bytes ||= this.bytes; + try { + let globals = null; + if (this.params instanceof Dict) { + const globalsStream = this.params.get("JBIG2Globals"); + if (globalsStream instanceof BaseStream) { + globals = globalsStream.getBytes(); + } + } + this.buffer = await JBig2WasmImage.decode( + bytes, + this.dict.get("Width"), + this.dict.get("Height"), + globals + ); + } catch { + warn("Jbig2Stream: Falling back to JS JBIG2 decoder."); + return this.decodeImageFallback(bytes); + } + this.bufferLength = this.buffer.length; + this.eof = true; + + return this.buffer; + } + + async decodeImageFallback(bytes) { if (this.eof) { return this.buffer; } diff --git a/src/core/jbig2_wasm.js b/src/core/jbig2_wasm.js new file mode 100644 index 0000000000000..0d9d690f93fc0 --- /dev/null +++ b/src/core/jbig2_wasm.js @@ -0,0 +1,127 @@ +/* Copyright 2026 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { BaseException, warn } from "../shared/util.js"; +import { fetchBinaryData } from "./core_utils.js"; +import JBig2 from "../../external/jbig2/jbig2.js"; + +class JBig2Error extends BaseException { + constructor(msg) { + super(msg, "Jbig2Error"); + } +} + +class JBig2WasmImage { + static #buffer = null; + + static #handler = null; + + static #modulePromise = null; + + static #useWasm = true; + + static #useWorkerFetch = true; + + static #wasmUrl = null; + + static setOptions({ handler, useWasm, useWorkerFetch, wasmUrl }) { + this.#useWasm = useWasm; + this.#useWorkerFetch = useWorkerFetch; + this.#wasmUrl = wasmUrl; + + if (!useWorkerFetch) { + this.#handler = handler; + } + } + + static async #instantiateWasm(fallbackCallback, imports, successCallback) { + const filename = "jbig2.wasm"; + try { + if (!this.#buffer) { + if (this.#useWorkerFetch) { + this.#buffer = await fetchBinaryData(`${this.#wasmUrl}${filename}`); + } else { + this.#buffer = await this.#handler.sendWithPromise( + "FetchBinaryData", + { type: "wasmFactory", filename } + ); + } + } + const results = await WebAssembly.instantiate(this.#buffer, imports); + return successCallback(results.instance); + } catch (reason) { + warn(`JBig2Image#instantiateWasm: ${reason}`); + return fallbackCallback(null); + } finally { + this.#handler = null; + } + } + + static async decode(bytes, width, height, globals) { + if (!this.#modulePromise) { + const { promise, resolve } = Promise.withResolvers(); + const promises = [promise]; + if (this.#useWasm) { + promises.push( + JBig2({ + warn, + instantiateWasm: this.#instantiateWasm.bind(this, resolve), + }) + ); + } else { + resolve(null); + } + this.#modulePromise = Promise.race(promises); + } + const module = await this.#modulePromise; + if (!module) { + throw new JBig2Error("JBig2 failed to initialize"); + } + let ptr, globalsPtr; + + try { + const size = bytes.length; + ptr = module._malloc(size); + module.writeArrayToMemory(bytes, ptr); + const globalsSize = globals ? globals.length : 0; + if (globalsSize > 0) { + globalsPtr = module._malloc(globalsSize); + module.writeArrayToMemory(globals, globalsPtr); + } + + module._jbig2_decode(ptr, size, width, height, globalsPtr, globalsSize); + if (!module.imageData) { + throw new JBig2Error("Unknown error"); + } + const { imageData } = module; + module.imageData = null; + + return imageData; + } finally { + if (ptr) { + module._free(ptr); + } + if (globalsPtr) { + module._free(globalsPtr); + } + } + } + + static cleanup() { + this.#modulePromise = null; + } +} + +export { JBig2Error, JBig2WasmImage }; diff --git a/src/core/jpeg_stream.js b/src/core/jpeg_stream.js index 4af24eeb8e733..75511f7087853 100644 --- a/src/core/jpeg_stream.js +++ b/src/core/jpeg_stream.js @@ -194,6 +194,10 @@ class JpegStream extends DecodeStream { decoder?.close(); } } + + get isImageStream() { + return true; + } } export { JpegStream }; diff --git a/src/core/jpx_stream.js b/src/core/jpx_stream.js index e454d58bd9754..54938eb745d41 100644 --- a/src/core/jpx_stream.js +++ b/src/core/jpx_stream.js @@ -64,6 +64,10 @@ class JpxStream extends DecodeStream { get canAsyncDecodeImageFromBuffer() { return this.stream.isAsync; } + + get isImageStream() { + return true; + } } export { JpxStream }; diff --git a/src/core/lzw_stream.js b/src/core/lzw_stream.js index 9a0ae744884a5..7971aeb26808b 100644 --- a/src/core/lzw_stream.js +++ b/src/core/lzw_stream.js @@ -19,7 +19,7 @@ class LZWStream extends DecodeStream { constructor(str, maybeLength, earlyChange) { super(maybeLength); - this.str = str; + this.stream = str; this.dict = str.dict; this.cachedData = 0; this.bitsCached = 0; @@ -46,7 +46,7 @@ class LZWStream extends DecodeStream { let bitsCached = this.bitsCached; let cachedData = this.cachedData; while (bitsCached < n) { - const c = this.str.getByte(); + const c = this.stream.getByte(); if (c === -1) { this.eof = true; return null; diff --git a/src/core/name_number_tree.js b/src/core/name_number_tree.js index 461711d1f3593..c5b63dc7b6432 100644 --- a/src/core/name_number_tree.js +++ b/src/core/name_number_tree.js @@ -34,7 +34,7 @@ class NameOrNumberTree { this._type = type; } - getAll() { + getAll(isRaw = false) { const map = new Map(); if (!this.root) { return map; @@ -68,7 +68,10 @@ class NameOrNumberTree { continue; } for (let i = 0, ii = entries.length; i < ii; i += 2) { - map.set(xref.fetchIfRef(entries[i]), xref.fetchIfRef(entries[i + 1])); + map.set( + xref.fetchIfRef(entries[i]), + isRaw ? entries[i + 1] : xref.fetchIfRef(entries[i + 1]) + ); } } return map; diff --git a/src/core/pattern.js b/src/core/pattern.js index a18b330ea4f5f..68042e58ddfd5 100644 --- a/src/core/pattern.js +++ b/src/core/pattern.js @@ -18,6 +18,7 @@ import { FormatError, info, MathClamp, + MeshFigureType, unreachable, Util, warn, @@ -582,7 +583,7 @@ class MeshShading extends BaseShading { reader.align(); } this.figures.push({ - type: "triangles", + type: MeshFigureType.TRIANGLES, coords: new Int32Array(ps), colors: new Int32Array(ps), }); @@ -600,7 +601,7 @@ class MeshShading extends BaseShading { colors.push(color); } this.figures.push({ - type: "lattice", + type: MeshFigureType.LATTICE, coords: new Int32Array(ps), colors: new Int32Array(ps), verticesPerRow, @@ -732,7 +733,7 @@ class MeshShading extends BaseShading { 9, ]); this.figures.push({ - type: "patch", + type: MeshFigureType.PATCH, coords: new Int32Array(ps), // making copies of ps and cs colors: new Int32Array(cs), }); @@ -802,7 +803,7 @@ class MeshShading extends BaseShading { break; } this.figures.push({ - type: "patch", + type: MeshFigureType.PATCH, coords: new Int32Array(ps), // making copies of ps and cs colors: new Int32Array(cs), }); @@ -811,7 +812,10 @@ class MeshShading extends BaseShading { _buildFigureFromPatch(index) { const figure = this.figures[index]; - assert(figure.type === "patch", "Unexpected patch mesh figure"); + assert( + figure.type === MeshFigureType.PATCH, + "Unexpected patch mesh figure" + ); const coords = this.coords, colors = this.colors; @@ -919,7 +923,7 @@ class MeshShading extends BaseShading { figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; this.figures[index] = { - type: "lattice", + type: MeshFigureType.LATTICE, coords: figureCoords, colors: figureColors, verticesPerRow, diff --git a/src/core/pdf_manager.js b/src/core/pdf_manager.js index 9ee866cdbfda2..3c4255efbeb60 100644 --- a/src/core/pdf_manager.js +++ b/src/core/pdf_manager.js @@ -22,6 +22,7 @@ import { } from "../shared/util.js"; import { ChunkedStreamManager } from "./chunked_stream.js"; import { ImageResizer } from "./image_resizer.js"; +import { JBig2WasmImage } from "./jbig2_wasm.js"; import { JpegStream } from "./jpeg_stream.js"; import { JpxImage } from "./jpx.js"; import { MissingDataException } from "./core_utils.js"; @@ -81,6 +82,7 @@ class BasePdfManager { JpxImage.setOptions(options); IccColorSpace.setOptions(options); CmykICCBasedCS.setOptions(options); + JBig2WasmImage.setOptions(options); } get docId() { diff --git a/src/core/predictor_stream.js b/src/core/predictor_stream.js index ac807a3b3a981..9623901da73e4 100644 --- a/src/core/predictor_stream.js +++ b/src/core/predictor_stream.js @@ -35,7 +35,7 @@ class PredictorStream extends DecodeStream { this.readBlock = predictor === 2 ? this.readBlockTiff : this.readBlockPng; - this.str = str; + this.stream = str; this.dict = str.dict; const colors = (this.colors = params.get("Colors") || 1); @@ -57,7 +57,7 @@ class PredictorStream extends DecodeStream { const bits = this.bits; const colors = this.colors; - const rawBytes = this.str.getBytes(rowBytes); + const rawBytes = this.stream.getBytes(rowBytes); this.eof = !rawBytes.length; if (this.eof) { return; @@ -138,8 +138,8 @@ class PredictorStream extends DecodeStream { const rowBytes = this.rowBytes; const pixBytes = this.pixBytes; - const predictor = this.str.getByte(); - const rawBytes = this.str.getBytes(rowBytes); + const predictor = this.stream.getByte(); + const rawBytes = this.stream.getBytes(rowBytes); this.eof = !rawBytes.length; if (this.eof) { return; diff --git a/src/core/primitives.js b/src/core/primitives.js index aa79c24c389d4..854341dbdb099 100644 --- a/src/core/primitives.js +++ b/src/core/primitives.js @@ -188,6 +188,10 @@ class Dict { return [...this._map.values()]; } + getRawEntries() { + return this._map.entries(); + } + set(key, value) { if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) { if (typeof key !== "string") { @@ -231,6 +235,12 @@ class Dict { } } + setIfDict(key, value) { + if (value instanceof Dict) { + this.set(key, value); + } + } + has(key) { return this._map.has(key); } @@ -309,7 +319,7 @@ class Dict { } delete(key) { - delete this._map[key]; + this._map.delete(key); } } @@ -429,6 +439,12 @@ class RefSetCache { yield [Ref.fromString(ref), value]; } } + + *keys() { + for (const ref of this._map.keys()) { + yield Ref.fromString(ref); + } + } } function isName(v, name) { diff --git a/src/core/run_length_stream.js b/src/core/run_length_stream.js index 72e66daa23d5a..db664b733620a 100644 --- a/src/core/run_length_stream.js +++ b/src/core/run_length_stream.js @@ -19,7 +19,7 @@ class RunLengthStream extends DecodeStream { constructor(str, maybeLength) { super(maybeLength); - this.str = str; + this.stream = str; this.dict = str.dict; } @@ -28,7 +28,7 @@ class RunLengthStream extends DecodeStream { // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes // (in addition to the second byte from the header), n = 129 through 255 - // duplicate the second byte from the header (257 - n) times, n = 128 - end. - const repeatHeader = this.str.getBytes(2); + const repeatHeader = this.stream.getBytes(2); if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { this.eof = true; return; @@ -42,7 +42,7 @@ class RunLengthStream extends DecodeStream { buffer = this.ensureBuffer(bufferLength + n + 1); buffer[bufferLength++] = repeatHeader[1]; if (n > 0) { - const source = this.str.getBytes(n); + const source = this.stream.getBytes(n); buffer.set(source, bufferLength); bufferLength += n; } diff --git a/src/core/standard_fonts.js b/src/core/standard_fonts.js index 94017adeda9bd..88f22a4a69a19 100644 --- a/src/core/standard_fonts.js +++ b/src/core/standard_fonts.js @@ -574,6 +574,39 @@ const getGlyphMapForStandardFonts = getLookupTableFactory(function (t) { t[598] = 1068; t[599] = 1069; t[600] = 1070; + t[601] = 1071; + t[602] = 1072; + t[603] = 1073; + t[604] = 1074; + t[605] = 1075; + t[606] = 1076; + t[607] = 1077; + t[608] = 1078; + t[609] = 1079; + t[610] = 1080; + t[611] = 1081; + t[612] = 1082; + t[613] = 1083; + t[614] = 1084; + t[615] = 1085; + t[616] = 1086; + t[617] = 1087; + t[618] = 1088; + t[619] = 1089; + t[620] = 1090; + t[621] = 1091; + t[622] = 1092; + t[623] = 1093; + t[624] = 1094; + t[625] = 1095; + t[626] = 1096; + t[627] = 1097; + t[628] = 1098; + t[629] = 1099; + t[630] = 1100; + t[631] = 1101; + t[632] = 1102; + t[633] = 1103; t[672] = 1488; t[673] = 1489; t[674] = 1490; diff --git a/src/core/stream.js b/src/core/stream.js index 7bc9791ed9888..e47be2ccdb3d5 100644 --- a/src/core/stream.js +++ b/src/core/stream.js @@ -51,6 +51,7 @@ class Stream extends BaseStream { const strEnd = this.end; if (!length) { + this.pos = strEnd; return bytes.subarray(pos, strEnd); } let end = pos + length; @@ -82,6 +83,15 @@ class Stream extends BaseStream { makeSubStream(start, length, dict = null) { return new Stream(this.bytes.buffer, start, length, dict); } + + clone() { + return new Stream( + this.bytes.buffer, + this.start, + this.end - this.start, + this.dict.clone() + ); + } } class StringStream extends Stream { diff --git a/src/core/struct_tree.js b/src/core/struct_tree.js index f8eafbc17b481..cdd12dfa85d7f 100644 --- a/src/core/struct_tree.js +++ b/src/core/struct_tree.js @@ -13,9 +13,15 @@ * limitations under the License. */ -import { AnnotationPrefix, stringToPDFString, warn } from "../shared/util.js"; +import { + AnnotationPrefix, + stringToPDFString, + stringToUTF8String, + warn, +} from "../shared/util.js"; import { Dict, isName, Name, Ref, RefSetCache } from "./primitives.js"; import { lookupNormalRect, stringToAsciiOrUTF16BE } from "./core_utils.js"; +import { BaseStream } from "./base_stream.js"; import { NumberTree } from "./name_number_tree.js"; const MAX_DEPTH = 40; @@ -35,10 +41,41 @@ class StructTreeRoot { this.ref = rootRef instanceof Ref ? rootRef : null; this.roleMap = new Map(); this.structParentIds = null; + this.kidRefToPosition = undefined; + this.parentTree = null; + } + + getKidPosition(kidRef) { + if (this.kidRefToPosition === undefined) { + const obj = this.dict.get("K"); + if (Array.isArray(obj)) { + const map = (this.kidRefToPosition = new Map()); + for (let i = 0, ii = obj.length; i < ii; i++) { + const ref = obj[i]; + if (ref) { + map.set(ref.toString(), i); + } + } + } else if (obj instanceof Dict) { + this.kidRefToPosition = new Map([[obj.objId, 0]]); + } else if (!obj) { + this.kidRefToPosition = new Map(); + } else { + this.kidRefToPosition = null; + } + } + return this.kidRefToPosition + ? (this.kidRefToPosition.get(kidRef) ?? NaN) + : -1; } init() { this.readRoleMap(); + const parentTree = this.dict.get("ParentTree"); + if (!parentTree) { + return; + } + this.parentTree = new NumberTree(parentTree, this.xref); } #addIdToPage(pageRef, id, type) { @@ -554,6 +591,51 @@ class StructElementNode { return root.roleMap.get(name) ?? name; } + get mathML() { + let AFs = this.dict.get("AF") || []; + if (!Array.isArray(AFs)) { + AFs = [AFs]; + } + for (let af of AFs) { + af = this.xref.fetchIfRef(af); + if (!(af instanceof Dict)) { + continue; + } + if (!isName(af.get("Type"), "Filespec")) { + continue; + } + if (!isName(af.get("AFRelationship"), "Supplement")) { + continue; + } + const ef = af.get("EF"); + if (!(ef instanceof Dict)) { + continue; + } + const fileStream = ef.get("UF") || ef.get("F"); + if (!(fileStream instanceof BaseStream)) { + continue; + } + if (!isName(fileStream.dict.get("Type"), "EmbeddedFile")) { + continue; + } + if (!isName(fileStream.dict.get("Subtype"), "application/mathml+xml")) { + continue; + } + // The default encoding for xml files is UTF-8. + return stringToUTF8String(fileStream.getString()); + } + const A = this.dict.get("A"); + if (A instanceof Dict) { + // This stuff isn't in the spec, but MS Office seems to use it. + const O = A.get("O"); + if (isName(O, "MSFT_Office")) { + const mathml = A.get("MSFT_MathML"); + return mathml ? stringToPDFString(mathml) : null; + } + } + return null; + } + parseKids() { let pageObjId = null; const objRef = this.dict.getRaw("Pg"); @@ -695,7 +777,7 @@ class StructTreePage { return; } - const parentTree = this.rootDict.get("ParentTree"); + const { parentTree } = this.root; if (!parentTree) { return; } @@ -706,10 +788,9 @@ class StructTreePage { } const map = new Map(); - const numberTree = new NumberTree(parentTree, this.xref); if (Number.isInteger(id)) { - const parentArray = numberTree.get(id); + const parentArray = parentTree.get(id); if (Array.isArray(parentArray)) { for (const ref of parentArray) { if (ref instanceof Ref) { @@ -723,7 +804,7 @@ class StructTreePage { return; } for (const [elemId, type] of ids) { - const obj = numberTree.get(elemId); + const obj = parentTree.get(elemId); if (obj) { const elem = this.addNode(this.xref.fetchIfRef(obj), map); if ( @@ -754,6 +835,23 @@ class StructTreePage { const element = new StructElementNode(this, dict); map.set(dict, element); + switch (element.role) { + case "L": + case "LBody": + case "LI": + case "Table": + case "THead": + case "TBody": + case "TFoot": + case "TR": { + // Always collect all child nodes of lists and tables, even empty ones + for (const kid of element.kids) { + if (kid.type === StructElementType.ELEMENT) { + this.addNode(kid.dict, map, level - 1); + } + } + } + } const parent = dict.get("P"); @@ -785,31 +883,14 @@ class StructTreePage { } addTopLevelNode(dict, element) { - const obj = this.rootDict.get("K"); - if (!obj) { + const index = this.root.getKidPosition(dict.objId); + if (isNaN(index)) { return false; } - - if (obj instanceof Dict) { - if (obj.objId !== dict.objId) { - return false; - } - this.nodes[0] = element; - return true; - } - - if (!Array.isArray(obj)) { - return true; - } - let save = false; - for (let i = 0; i < obj.length; i++) { - const kidRef = obj[i]; - if (kidRef?.toString() === dict.objId) { - this.nodes[i] = element; - save = true; - } + if (index !== -1) { + this.nodes[index] = element; } - return save; + return true; } /** @@ -834,6 +915,12 @@ class StructTreePage { if (typeof alt === "string") { obj.alt = stringToPDFString(alt); } + if (obj.role === "Formula") { + const { mathML } = node; + if (mathML) { + obj.mathML = mathML; + } + } const a = node.dict.get("A"); if (a instanceof Dict) { diff --git a/src/core/worker.js b/src/core/worker.js index b94fb706849d4..ae3c48be932c9 100644 --- a/src/core/worker.js +++ b/src/core/worker.js @@ -36,6 +36,7 @@ import { MessageHandler, wrapReason } from "../shared/message_handler.js"; import { AnnotationFactory } from "./annotation.js"; import { clearGlobalCaches } from "./cleanup_helper.js"; import { incrementalUpdate } from "./writer.js"; +import { PDFEditor } from "./editor/pdf_editor.js"; import { PDFWorkerStream } from "./worker_stream.js"; import { StructTreeRoot } from "./struct_tree.js"; @@ -218,23 +219,23 @@ class WorkerMessageHandler { return new LocalPdfManager(pdfManagerArgs); } - const pdfStream = new PDFWorkerStream(handler), - fullRequest = pdfStream.getFullReader(); + const pdfStream = new PDFWorkerStream({ msgHandler: handler }), + fullReader = pdfStream.getFullReader(); const pdfManagerCapability = Promise.withResolvers(); let newPdfManager, cachedChunks = [], loaded = 0; - fullRequest.headersReady + fullReader.headersReady .then(function () { - if (!fullRequest.isRangeSupported) { + if (!fullReader.isRangeSupported) { return; } pdfManagerArgs.source = pdfStream; - pdfManagerArgs.length = fullRequest.contentLength; + pdfManagerArgs.length = fullReader.contentLength; // We don't need auto-fetch when streaming is enabled. - pdfManagerArgs.disableAutoFetch ||= fullRequest.isStreamingSupported; + pdfManagerArgs.disableAutoFetch ||= fullReader.isStreamingSupported; newPdfManager = new NetworkPdfManager(pdfManagerArgs); // There may be a chance that `newPdfManager` is not initialized for @@ -281,10 +282,10 @@ class WorkerMessageHandler { } loaded += value.byteLength; - if (!fullRequest.isStreamingSupported) { + if (!fullReader.isStreamingSupported) { handler.send("DocProgress", { loaded, - total: Math.max(loaded, fullRequest.contentLength || 0), + total: Math.max(loaded, fullReader.contentLength || 0), }); } @@ -293,12 +294,12 @@ class WorkerMessageHandler { } else { cachedChunks.push(value); } - fullRequest.read().then(readChunk, reject); + fullReader.read().then(readChunk, reject); } catch (e) { reject(e); } }; - fullRequest.read().then(readChunk, reject); + fullReader.read().then(readChunk, reject); }).catch(function (e) { pdfManagerCapability.reject(e); cancelXHRs = null; @@ -514,6 +515,7 @@ class WorkerMessageHandler { return Promise.all([ pdfManager.ensureDoc("documentInfo"), pdfManager.ensureCatalog("metadata"), + pdfManager.ensureCatalog("hasStructTree"), ]); }); @@ -557,6 +559,97 @@ class WorkerMessageHandler { return pdfManager.ensureDoc("calculationOrderIds"); }); + handler.on("ExtractPages", async function ({ pageInfos }) { + if (!pageInfos) { + warn("extractPages: nothing to extract."); + return null; + } + if (!Array.isArray(pageInfos)) { + pageInfos = [pageInfos]; + } + let newDocumentId = 0; + for (const pageInfo of pageInfos) { + if (pageInfo.document === null) { + pageInfo.document = pdfManager.pdfDocument; + } else if (ArrayBuffer.isView(pageInfo.document)) { + const manager = new LocalPdfManager({ + source: pageInfo.document, + docId: `${docId}_extractPages_${newDocumentId++}`, + handler, + password: pageInfo.password ?? null, + evaluatorOptions: Object.assign({}, pdfManager.evaluatorOptions), + }); + let recoveryMode = false; + let isValid = true; + while (true) { + try { + await manager.requestLoadedStream(); + await manager.ensureDoc("checkHeader"); + await manager.ensureDoc("parseStartXRef"); + await manager.ensureDoc("parse", [recoveryMode]); + break; + } catch (e) { + if (e instanceof XRefParseException) { + if (recoveryMode === false) { + recoveryMode = true; + continue; + } else { + isValid = false; + warn("extractPages: XRefParseException."); + } + } else if (e instanceof PasswordException) { + const task = new WorkerTask( + `PasswordException: response ${e.code}` + ); + + startWorkerTask(task); + + try { + const { password } = await handler.sendWithPromise( + "PasswordRequest", + e + ); + manager.updatePassword(password); + } catch { + isValid = false; + warn("extractPages: invalid password."); + } finally { + finishWorkerTask(task); + } + } else { + isValid = false; + warn("extractPages: invalid document."); + } + if (!isValid) { + break; + } + } + } + if (!isValid) { + pageInfo.document = null; + } + const isPureXfa = await manager.ensureDoc("isPureXfa"); + if (isPureXfa) { + pageInfo.document = null; + warn("extractPages does not support pure XFA documents."); + } else { + pageInfo.document = manager.pdfDocument; + } + } else { + warn("extractPages: invalid document."); + } + } + try { + const pdfEditor = new PDFEditor(); + const buffer = await pdfEditor.extractPages(pageInfos); + return buffer; + } catch (reason) { + // eslint-disable-next-line no-console + console.error(reason); + return null; + } + }); + handler.on( "SaveDocument", async function ({ isPureXfa, numPages, annotationStorage, filename }) { @@ -566,7 +659,6 @@ class WorkerMessageHandler { pdfManager.ensureCatalog("acroFormRef"), pdfManager.ensureDoc("startXRef"), pdfManager.ensureDoc("xref"), - pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("structTreeRoot"), ]; const changes = new RefSetCache(); @@ -581,7 +673,6 @@ class WorkerMessageHandler { acroFormRef, startXRef, xref, - linearization, _structTreeRoot, ] = await Promise.all(globalPromises); const catalogRef = xref.trailer.getRaw("Root") || null; @@ -736,9 +827,7 @@ class WorkerMessageHandler { infoRef: xref.trailer.getRaw("Info") || null, infoMap, fileIds: xref.trailer.get("ID") || null, - startXRef: linearization - ? startXRef - : (xref.lastXRefStreamPos ?? startXRef), + startXRef, filename, }; } @@ -764,8 +853,8 @@ class WorkerMessageHandler { ); handler.on("GetOperatorList", function (data, sink) { - const pageIndex = data.pageIndex; - pdfManager.getPage(pageIndex).then(function (page) { + const { pageId, pageIndex } = data; + pdfManager.getPage(pageId).then(function (page) { const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`); startWorkerTask(task); @@ -782,6 +871,7 @@ class WorkerMessageHandler { cacheKey: data.cacheKey, annotationStorage: data.annotationStorage, modifiedIds: data.modifiedIds, + pageIndex, }) .then( function (operatorListInfo) { @@ -810,9 +900,10 @@ class WorkerMessageHandler { }); handler.on("GetTextContent", function (data, sink) { - const { pageIndex, includeMarkedContent, disableNormalization } = data; + const { pageId, pageIndex, includeMarkedContent, disableNormalization } = + data; - pdfManager.getPage(pageIndex).then(function (page) { + pdfManager.getPage(pageId).then(function (page) { const task = new WorkerTask("GetTextContent: page " + pageIndex); startWorkerTask(task); @@ -905,11 +996,6 @@ class WorkerMessageHandler { handler.on("GetXFADatasets", function (data) { return pdfManager.ensureDoc("xfaDatasets"); }); - handler.on("GetXRefPrevValue", function (data) { - return pdfManager - .ensureXRef("trailer") - .then(trailer => trailer.get("Prev")); - }); handler.on("GetStartXRefPos", function (data) { return pdfManager.ensureDoc("startXRef"); }); diff --git a/src/core/worker_stream.js b/src/core/worker_stream.js index 047935316cde4..66db663228802 100644 --- a/src/core/worker_stream.js +++ b/src/core/worker_stream.js @@ -13,77 +13,35 @@ * limitations under the License. */ -import { assert } from "../shared/util.js"; - -/** @implements {IPDFStream} */ -class PDFWorkerStream { - constructor(msgHandler) { - this._msgHandler = msgHandler; - this._contentLength = null; - this._fullRequestReader = null; - this._rangeRequestReaders = []; - } - - getFullReader() { - assert( - !this._fullRequestReader, - "PDFWorkerStream.getFullReader can only be called once." - ); - this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler); - return this._fullRequestReader; - } - - getRangeReader(begin, end) { - const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler); - this._rangeRequestReaders.push(reader); - return reader; - } - - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); - - for (const reader of this._rangeRequestReaders.slice(0)) { - reader.cancel(reason); - } +import { + BasePDFStream, + BasePDFStreamRangeReader, + BasePDFStreamReader, +} from "../shared/base_pdf_stream.js"; + +class PDFWorkerStream extends BasePDFStream { + constructor(source) { + super(source, PDFWorkerStreamReader, PDFWorkerStreamRangeReader); } } -/** @implements {IPDFStreamReader} */ -class PDFWorkerStreamReader { - constructor(msgHandler) { - this._msgHandler = msgHandler; - this.onProgress = null; +class PDFWorkerStreamReader extends BasePDFStreamReader { + _reader = null; - this._contentLength = null; - this._isRangeSupported = false; - this._isStreamingSupported = false; + constructor(stream) { + super(stream); + const { msgHandler } = stream._source; - const readableStream = this._msgHandler.sendWithStream("GetReader"); + const readableStream = msgHandler.sendWithStream("GetReader"); this._reader = readableStream.getReader(); - this._headersReady = this._msgHandler - .sendWithPromise("ReaderHeadersReady") - .then(data => { - this._isStreamingSupported = data.isStreamingSupported; - this._isRangeSupported = data.isRangeSupported; - this._contentLength = data.contentLength; - }); - } + msgHandler.sendWithPromise("ReaderHeadersReady").then(data => { + this._contentLength = data.contentLength; + this._isStreamingSupported = data.isStreamingSupported; + this._isRangeSupported = data.isRangeSupported; - get headersReady() { - return this._headersReady; - } - - get contentLength() { - return this._contentLength; - } - - get isStreamingSupported() { - return this._isStreamingSupported; - } - - get isRangeSupported() { - return this._isRangeSupported; + this._headersCapability.resolve(); + }, this._headersCapability.reject); } async read() { @@ -101,23 +59,20 @@ class PDFWorkerStreamReader { } } -/** @implements {IPDFStreamRangeReader} */ -class PDFWorkerStreamRangeReader { - constructor(begin, end, msgHandler) { - this._msgHandler = msgHandler; - this.onProgress = null; +class PDFWorkerStreamRangeReader extends BasePDFStreamRangeReader { + _reader = null; + + constructor(stream, begin, end) { + super(stream, begin, end); + const { msgHandler } = stream._source; - const readableStream = this._msgHandler.sendWithStream("GetRangeReader", { + const readableStream = msgHandler.sendWithStream("GetRangeReader", { begin, end, }); this._reader = readableStream.getReader(); } - get isStreamingSupported() { - return false; - } - async read() { const { value, done } = await this._reader.read(); if (done) { diff --git a/src/core/writer.js b/src/core/writer.js index bf66226a2c248..921936b3be2bb 100644 --- a/src/core/writer.js +++ b/src/core/writer.js @@ -19,7 +19,6 @@ import { escapePDFName, escapeString, getSizeInBytes, - numberToString, parseXFAPath, } from "./core_utils.js"; import { SimpleDOMNode, SimpleXMLParser } from "./xml_parser.js"; @@ -27,29 +26,34 @@ import { Stream, StringStream } from "./stream.js"; import { BaseStream } from "./base_stream.js"; import { calculateMD5 } from "./calculate_md5.js"; -async function writeObject(ref, obj, buffer, { encrypt = null }) { - const transform = encrypt?.createCipherTransform(ref.num, ref.gen); +async function writeObject( + ref, + obj, + buffer, + { encrypt = null, encryptRef = null } +) { + // Avoid to encrypt the encrypt dictionary. + const transform = + encrypt && encryptRef !== ref + ? encrypt.createCipherTransform(ref.num, ref.gen) + : null; buffer.push(`${ref.num} ${ref.gen} obj\n`); - if (obj instanceof Dict) { - await writeDict(obj, buffer, transform); - } else if (obj instanceof BaseStream) { - await writeStream(obj, buffer, transform); - } else if (Array.isArray(obj) || ArrayBuffer.isView(obj)) { - await writeArray(obj, buffer, transform); - } + await writeValue(obj, buffer, transform); buffer.push("\nendobj\n"); } async function writeDict(dict, buffer, transform) { buffer.push("<<"); - for (const key of dict.getKeys()) { + for (const [key, rawObj] of dict.getRawEntries()) { buffer.push(` /${escapePDFName(key)} `); - await writeValue(dict.getRaw(key), buffer, transform); + await writeValue(rawObj, buffer, transform); } buffer.push(">>"); } async function writeStream(stream, buffer, transform) { + stream = stream.getOriginalStream(); + stream.reset(); let bytes = stream.getBytes(); const { dict } = stream; @@ -67,7 +71,7 @@ async function writeStream(stream, buffer, transform) { // The number 256 is arbitrary, but it should be reasonable. const MIN_LENGTH_FOR_COMPRESSING = 256; - if (bytes.length >= MIN_LENGTH_FOR_COMPRESSING || isFilterZeroFlateDecode) { + if (bytes.length >= MIN_LENGTH_FOR_COMPRESSING && !isFilterZeroFlateDecode) { try { const cs = new CompressionStream("deflate"); const writer = cs.writable.getWriter(); @@ -120,14 +124,11 @@ async function writeStream(stream, buffer, transform) { async function writeArray(array, buffer, transform) { buffer.push("["); - let first = true; - for (const val of array) { - if (!first) { + for (let i = 0, ii = array.length; i < ii; i++) { + await writeValue(array[i], buffer, transform); + if (i < ii - 1) { buffer.push(" "); - } else { - first = false; } - await writeValue(val, buffer, transform); } buffer.push("]"); } @@ -145,7 +146,11 @@ async function writeValue(value, buffer, transform) { } buffer.push(`(${escapeString(value)})`); } else if (typeof value === "number") { - buffer.push(numberToString(value)); + // Don't try to round numbers in general, it could lead to have degenerate + // matrices (e.g. [0.000008 0 0 0.000008 0 0]). + // The numbers must be "rounded" only when pdf.js is producing them and the + // current transformation matrix is well known. + buffer.push(value.toString()); } else if (typeof value === "boolean") { buffer.push(value.toString()); } else if (value instanceof Dict) { @@ -306,7 +311,7 @@ async function getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { } computeIDs(baseOffset, xrefInfo, newXref); buffer.push("trailer\n"); - await writeDict(newXref, buffer); + await writeDict(newXref, buffer, null); buffer.push("\nstartxref\n", baseOffset.toString(), "\n%%EOF\n"); } @@ -332,10 +337,17 @@ async function getXRefStreamTable( const xrefTableData = []; let maxOffset = 0; let maxGen = 0; - for (const { ref, data } of newRefs) { + for (const { ref, data, objStreamRef, index } of newRefs) { let gen; maxOffset = Math.max(maxOffset, baseOffset); - if (data !== null) { + // The first number in each entry is the type (see 7.5.8.3): + // 0: free object + // 1: in-use object + // 2: compressed object + if (objStreamRef) { + gen = index; + xrefTableData.push([2, objStreamRef.num, gen]); + } else if (data !== null) { gen = Math.min(ref.gen, 0xffff); xrefTableData.push([1, baseOffset, gen]); baseOffset += data.length; @@ -371,13 +383,13 @@ async function getXRefStreamTable( function computeIDs(baseOffset, xrefInfo, newXref) { if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) { const md5 = computeMD5(baseOffset, xrefInfo); - newXref.set("ID", [xrefInfo.fileIds[0], md5]); + newXref.set("ID", [xrefInfo.fileIds[0] || md5, md5]); } } function getTrailerDict(xrefInfo, changes, useXrefStream) { const newXref = new Dict(null); - newXref.set("Prev", xrefInfo.startXRef); + newXref.setIfDefined("Prev", xrefInfo?.startXRef); const refForXrefTable = xrefInfo.newRef; if (useXrefStream) { changes.put(refForXrefTable, { data: "" }); @@ -386,21 +398,20 @@ function getTrailerDict(xrefInfo, changes, useXrefStream) { } else { newXref.set("Size", refForXrefTable.num); } - if (xrefInfo.rootRef !== null) { - newXref.set("Root", xrefInfo.rootRef); - } - if (xrefInfo.infoRef !== null) { - newXref.set("Info", xrefInfo.infoRef); - } - if (xrefInfo.encryptRef !== null) { - newXref.set("Encrypt", xrefInfo.encryptRef); - } + newXref.setIfDefined("Root", xrefInfo?.rootRef); + newXref.setIfDefined("Info", xrefInfo?.infoRef); + newXref.setIfDefined("Encrypt", xrefInfo?.encryptRef); + return newXref; } async function writeChanges(changes, xref, buffer = []) { const newRefs = []; - for (const [ref, { data }] of changes.items()) { + for (const [ref, { data, objStreamRef, index }] of changes.items()) { + if (objStreamRef) { + newRefs.push({ ref, data, objStreamRef, index }); + continue; + } if (data === null || typeof data === "string") { newRefs.push({ ref, data }); continue; @@ -483,4 +494,4 @@ async function incrementalUpdate({ return array; } -export { incrementalUpdate, writeChanges, writeDict, writeObject }; +export { incrementalUpdate, writeChanges, writeDict, writeObject, writeValue }; diff --git a/src/core/xfa/template.js b/src/core/xfa/template.js index 7e7eaac4b1234..4c643d51722a5 100644 --- a/src/core/xfa/template.js +++ b/src/core/xfa/template.js @@ -90,7 +90,6 @@ import { XFAObject, XFAObjectArray, } from "./xfa_object.js"; -import { fromBase64Util, Util, warn } from "../../shared/util.js"; import { getBBox, getColor, @@ -103,6 +102,7 @@ import { getStringOption, HTMLResult, } from "./utils.js"; +import { Util, warn } from "../../shared/util.js"; import { getMetrics } from "./fonts.js"; import { recoverJsURL } from "../core_utils.js"; import { searchNode } from "./som.js"; @@ -3420,7 +3420,7 @@ class Image extends StringObject { } if (!buffer && this.transferEncoding === "base64") { - buffer = fromBase64Util(this[$content]); + buffer = Uint8Array.fromBase64(this[$content]); } if (!buffer) { @@ -3899,7 +3899,7 @@ class Occur extends XFAObject { attributes.max !== "" ? getInteger({ data: attributes.max, - defaultValue: 1, + defaultValue: -1, validate: x => true, }) : ""; diff --git a/src/core/xref.js b/src/core/xref.js index 8ffbefcc12e69..c13c08a7d3bde 100644 --- a/src/core/xref.js +++ b/src/core/xref.js @@ -33,8 +33,6 @@ import { BaseStream } from "./base_stream.js"; import { CipherTransformFactory } from "./crypto.js"; class XRef { - #firstXRefStmPos = null; - constructor(stream, pdfManager) { this.stream = stream; this.pdfManager = pdfManager; @@ -754,7 +752,6 @@ class XRef { // (possible infinite recursion) this._xrefStms.add(obj); this.startXRefQueue.push(obj); - this.#firstXRefStmPos ??= obj; } } else if (Number.isInteger(obj)) { // Parse in-stream XRef @@ -803,13 +800,6 @@ class XRef { throw new XRefParseException(); } - get lastXRefStreamPos() { - return ( - this.#firstXRefStmPos ?? - (this._xrefStms.size > 0 ? Math.max(...this._xrefStms) : null) - ); - } - getEntry(i) { const xrefEntry = this.entries[i]; if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { diff --git a/src/display/annotation_layer.js b/src/display/annotation_layer.js index 27e54495767cb..30e9a283b1209 100644 --- a/src/display/annotation_layer.js +++ b/src/display/annotation_layer.js @@ -24,9 +24,12 @@ /** @typedef {import("../src/display/editor/tools.js").AnnotationEditorUIManager} AnnotationEditorUIManager */ // eslint-disable-next-line max-len /** @typedef {import("../../web/struct_tree_layer_builder.js").StructTreeLayerBuilder} StructTreeLayerBuilder */ +// eslint-disable-next-line max-len +/** @typedef {import("../../web/comment_manager.js").CommentManager} CommentManager */ import { AnnotationBorderStyleType, + AnnotationEditorPrefix, AnnotationEditorType, AnnotationPrefix, AnnotationType, @@ -37,11 +40,14 @@ import { Util, warn, } from "../shared/util.js"; -import { PDFDateString, setLayerDimensions } from "./display_utils.js"; +import { + PDFDateString, + renderRichText, + setLayerDimensions, +} from "./display_utils.js"; import { AnnotationStorage } from "./annotation_storage.js"; import { ColorConverters } from "../shared/scripting_utils.js"; import { DOMSVGFactory } from "./svg_factory.js"; -import { XfaLayer } from "./xfa_layer.js"; const DEFAULT_FONT_SIZE = 9; const GetElementsByNameSet = new WeakSet(); @@ -178,9 +184,11 @@ class AnnotationElement { this.hasJSActions = parameters.hasJSActions; this._fieldObjects = parameters.fieldObjects; this.parent = parameters.parent; + this.hasOwnCommentButton = false; if (isRenderable) { - this.container = this._createContainer(ignoreBorder); + this.contentElement = this.container = + this._createContainer(ignoreBorder); } if (createQuadrilaterals) { this._createQuadrilaterals(); @@ -196,15 +204,31 @@ class AnnotationElement { } get hasPopupData() { - return AnnotationElement._hasPopupData(this.data); + return ( + AnnotationElement._hasPopupData(this.data) || + (this.enableComment && !!this.commentText) + ); + } + + get commentData() { + const { data } = this; + const editor = this.annotationStorage?.getEditor(data.id); + if (editor) { + return editor.getData(); + } + return data; } get hasCommentButton() { - return this.enableComment && this._isEditable && this.hasPopupElement; + return this.enableComment && this.hasPopupElement; } get commentButtonPosition() { - const { quadPoints, rect } = this.data; + const editor = this.annotationStorage?.getEditor(this.data.id); + if (editor) { + return editor.commentButtonPositionInPage; + } + const { quadPoints, inkLists, rect } = this.data; let maxX = -Infinity; let maxY = -Infinity; if (quadPoints?.length >= 8) { @@ -218,60 +242,27 @@ class AnnotationElement { } return [maxX, maxY]; } + if (inkLists?.length >= 1) { + for (const inkList of inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + if (inkList[i + 1] > maxY) { + maxY = inkList[i + 1]; + maxX = inkList[i]; + } else if (inkList[i + 1] === maxY) { + maxX = Math.max(maxX, inkList[i]); + } + } + } + if (maxX !== Infinity) { + return [maxX, maxY]; + } + } if (rect) { return [rect[2], rect[3]]; } return null; } - get commentButtonColor() { - if (!this.data.color) { - return null; - } - const [r, g, b] = this.data.color; - const opacity = this.data.opacity ?? 1; - const oppositeOpacity = 255 * (1 - opacity); - - return this.#changeLightness( - Math.min(r + oppositeOpacity, 255), - Math.min(g + oppositeOpacity, 255), - Math.min(b + oppositeOpacity, 255) - ); - } - - #changeLightness(r, g, b) { - r /= 255; - g /= 255; - b /= 255; - - const max = Math.max(r, g, b); - const min = Math.min(r, g, b); - const l = (max + min) / 2; - const newL = (((1 + Math.sqrt(l)) / 2) * 100).toFixed(2); - - if (max === min) { - // gray - return `hsl(0, 0%, ${newL}%)`; - } - - const d = max - min; - - // hue (branch on max only; avoids mod) - let h; - if (max === r) { - h = (g - b) / d + (g < b ? 6 : 0); - } else if (max === g) { - h = (b - r) / d + 2; - } else { - // max === b - h = (r - g) / d + 4; - } - h = (h * 60).toFixed(2); - const s = ((d / (1 - Math.abs(2 * l - 1))) * 100).toFixed(2); - - return `hsl(${h}, ${s}%, ${newL}%)`; - } - _normalizePoint(point) { const { page: { view }, @@ -285,6 +276,39 @@ class AnnotationElement { return point; } + get commentText() { + const { data } = this; + return ( + this.annotationStorage.getRawValue(`${AnnotationEditorPrefix}${data.id}`) + ?.popup?.contents || + data.contentsObj?.str || + "" + ); + } + + set commentText(text) { + const { data } = this; + const popup = { deleted: !text, contents: text || "" }; + if (!this.annotationStorage.updateEditor(data.id, { popup })) { + this.annotationStorage.setValue(`${AnnotationEditorPrefix}${data.id}`, { + id: data.id, + annotationType: data.annotationType, + page: this.parent.page, + popup, + popupRef: data.popupRef, + modificationDate: new Date(), + }); + } + if (!text) { + this.removePopup(); + } + } + + removePopup() { + (this.#popupElement?.popup || this.popup)?.remove(); + this.#popupElement = this.popup = null; + } + updateEdited(params) { if (!this.container) { return; @@ -565,6 +589,29 @@ class AnnotationElement { rotation: angle, }); }, + rect: event => { + const rect = event.detail.rect; + if (!Array.isArray(rect) || rect.length !== 4) { + return; + } + + // PDF coordinates: [left, bottom, right, top] + const [left, bottom, right, top] = rect; + const width = right - left; + const height = top - bottom; + + // Update container position and size + // Note: May need coordinate system conversion depending on page rendering + this.container.style.left = `${left}px`; + this.container.style.bottom = `${bottom}px`; + this.container.style.width = `${width}px`; + this.container.style.height = `${height}px`; + + // Store in annotation storage + this.annotationStorage.setValue(this.data.id, { + rect: rect.slice(), // Store a copy + }); + }, }); } @@ -598,8 +645,10 @@ class AnnotationElement { target: element, }; action(eventProxy); - // The action has been consumed: no need to keep it. - delete storedData[actionName]; + // Don't delete properties - they may be needed for: + // 1. Sibling fields (same name, different pages) that render later + // 2. Future re-renders of the same field + // delete storedData[actionName]; } } } @@ -724,7 +773,7 @@ class AnnotationElement { contentsObj = data.contentsObj; modificationDate = data.modificationDate; } - const popup = (this.#popupElement = new PopupAnnotationElement({ + this.#popupElement = new PopupAnnotationElement({ data: { color: data.color, titleObj: data.titleObj, @@ -740,14 +789,17 @@ class AnnotationElement { linkService: this.linkService, parent: this.parent, elements: [this], - })); - this.parent.div.append(popup.render()); + }); } get hasPopupElement() { return !!(this.#popupElement || this.popup || this.data.popupRef); } + get extraPopupElement() { + return this.#popupElement; + } + /** * Render the annotation's HTML element(s). * @@ -870,6 +922,56 @@ class AnnotationElement { } } +class EditorAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { isRenderable: true, ignoreBorder: true }); + this.editor = parameters.editor; + } + + render() { + this.container.className = "editorAnnotation"; + return this.container; + } + + createOrUpdatePopup() { + const { editor } = this; + if (!editor.hasComment) { + return; + } + this._createPopup(editor.comment); + } + + get hasCommentButton() { + return this.enableComment && this.editor.hasComment; + } + + get commentButtonPosition() { + return this.editor.commentButtonPositionInPage; + } + + get commentText() { + return this.editor.comment.text; + } + + set commentText(text) { + this.editor.comment = text; + if (!text) { + this.removePopup(); + } + } + + get commentData() { + return this.editor.getData(); + } + + remove() { + this.parent.removeAnnotation(this.data.id); + this.container.remove(); + this.container = null; + this.removePopup(); + } +} + class LinkAnnotationElement extends AnnotationElement { constructor(parameters, options = null) { super(parameters, { @@ -930,6 +1032,7 @@ class LinkAnnotationElement extends AnnotationElement { this.container.classList.add("linkAnnotation"); if (isBound) { + this.contentElement = link; this.container.append(link); } @@ -1194,6 +1297,7 @@ class TextAnnotationElement extends AnnotationElement { ); if (!this.data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } @@ -1205,6 +1309,8 @@ class TextAnnotationElement extends AnnotationElement { class WidgetAnnotationElement extends AnnotationElement { render() { // Show only the container for unsupported field types. + // Apply any properties that were set via JavaScript before rendering + this._setDefaultPropertiesFromJS(this.container); return this.container; } @@ -1439,6 +1545,7 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { element.hidden = true; } GetElementsByNameSet.add(element); + this.contentElement = element; element.setAttribute("data-element-id", id); element.disabled = this.data.readOnly; @@ -1659,6 +1766,14 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { ).valueOf(); target.step = ""; } else { + // Unfortunately, when the date is "2025-09-23", the parser + // converts it to UTC time which may lead to the date being off by + // one day depending on the timezone. To workaround this, we + // append "T00:00" to the date so that it's parsed as local + // time (bug 1989874). + if (!value.includes("T")) { + value = `${value}T00:00`; + } value = new Date(value).valueOf(); } target.type = "text"; @@ -2260,18 +2375,24 @@ class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { class PopupAnnotationElement extends AnnotationElement { constructor(parameters) { - const { data, elements } = parameters; - super(parameters, { isRenderable: AnnotationElement._hasPopupData(data) }); + const { data, elements, parent } = parameters; + const hasCommentManager = !!parent._commentManager; + super(parameters, { + isRenderable: !hasCommentManager && AnnotationElement._hasPopupData(data), + }); this.elements = elements; - this.popup = null; + if (hasCommentManager && AnnotationElement._hasPopupData(data)) { + const popup = (this.popup = this.#createPopup()); + for (const element of elements) { + element.popup = popup; + } + } else { + this.popup = null; + } } - render() { - const { container } = this; - container.classList.add("popupAnnotation"); - container.role = "comment"; - - const popup = (this.popup = new PopupElement({ + #createPopup() { + return new PopupElement({ container: this.container, color: this.data.color, titleObj: this.data.titleObj, @@ -2283,8 +2404,16 @@ class PopupAnnotationElement extends AnnotationElement { parent: this.parent, elements: this.elements, open: this.data.open, - eventBus: this.linkService.eventBus, - })); + commentManager: this.parent._commentManager, + }); + } + + render() { + const { container } = this; + container.classList.add("popupAnnotation"); + container.role = "comment"; + + const popup = (this.popup = this.#createPopup()); const elementIds = []; for (const element of this.elements) { @@ -2304,6 +2433,8 @@ class PopupAnnotationElement extends AnnotationElement { } class PopupElement { + #commentManager = null; + #boundKeyDown = this.#keyDown.bind(this); #boundHide = this.#hide.bind(this); @@ -2322,8 +2453,6 @@ class PopupElement { #elements = null; - #eventBus = null; - #parent = null; #parentRect = null; @@ -2340,7 +2469,7 @@ class PopupElement { #commentButtonPosition = null; - #commentButtonColor = null; + #popupPosition = null; #rect = null; @@ -2352,6 +2481,10 @@ class PopupElement { #wasVisible = false; + #firstElement = null; + + #commentText = null; + constructor({ container, color, @@ -2364,7 +2497,7 @@ class PopupElement { rect, parentRect, open, - eventBus = null, + commentManager = null, }) { this.#container = container; this.#titleObj = titleObj; @@ -2375,29 +2508,34 @@ class PopupElement { this.#rect = rect; this.#parentRect = parentRect; this.#elements = elements; - this.#eventBus = eventBus; + this.#commentManager = commentManager; + this.#firstElement = elements[0]; // The modification date is shown in the popup instead of the creation // date if it is available and can be parsed correctly, which is // consistent with other viewers such as Adobe Acrobat. this.#dateObj = PDFDateString.toDateObject(modificationDate); + // The elements that will trigger the popup. this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup()); - this.#addEventListeners(); - this.#container.hidden = true; - if (open) { - this.#toggle(); - } + if (!commentManager) { + this.#addEventListeners(); - if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("TESTING")) { - // Since the popup is lazily created, we need to ensure that it'll be - // created and displayed during reference tests. - this.#parent.popupShow.push(async () => { - if (this.#container.hidden) { - this.#show(); - } - }); + this.#container.hidden = true; + if (open) { + this.#toggle(); + } + + if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("TESTING")) { + // Since the popup is lazily created, we need to ensure that it'll be + // created and displayed during reference tests. + this.#parent.popupShow.push(async () => { + if (this.#container.hidden) { + this.#show(); + } + }); + } } } @@ -2411,8 +2549,8 @@ class PopupElement { // Attach the event listeners to the trigger element. for (const element of this.trigger) { element.addEventListener("click", this.#boundToggle, { signal }); - element.addEventListener("mouseenter", this.#boundShow, { signal }); - element.addEventListener("mouseleave", this.#boundHide, { signal }); + element.addEventListener("pointerenter", this.#boundShow, { signal }); + element.addEventListener("pointerleave", this.#boundHide, { signal }); element.classList.add("popupTriggerArea"); } @@ -2422,8 +2560,6 @@ class PopupElement { signal, }); } - - this.#renderCommentButton(); } #setCommentButtonPosition() { @@ -2434,11 +2570,13 @@ class PopupElement { this.#commentButtonPosition = element._normalizePoint( element.commentButtonPosition ); - this.#commentButtonColor = element.commentButtonColor; } - #renderCommentButton() { + renderCommentButton() { if (this.#commentButton) { + if (!this.#commentButton.parentNode) { + this.#firstElement.container.after(this.#commentButton); + } return; } @@ -2450,40 +2588,200 @@ class PopupElement { return; } - const button = (this.#commentButton = document.createElement("button")); - button.className = "annotationCommentButton"; - const parentContainer = this.#elements[0].container; - button.style.zIndex = parentContainer.style.zIndex + 1; - button.tabIndex = 0; + const { signal } = (this.#popupAbortController = new AbortController()); + const hasOwnButton = this.#firstElement.hasOwnCommentButton; + const togglePopup = () => { + this.#commentManager.toggleCommentPopup( + this, + /* isSelected = */ true, + /* visibility = */ undefined, + /* isEditable = */ !hasOwnButton + ); + }; + const showPopup = () => { + this.#commentManager.toggleCommentPopup( + this, + /* isSelected = */ false, + /* visibility = */ true, + /* isEditable = */ !hasOwnButton + ); + }; + const hidePopup = () => { + this.#commentManager.toggleCommentPopup( + this, + /* isSelected = */ false, + /* visibility = */ false + ); + }; - const { signal } = this.#popupAbortController; - button.addEventListener("hover", this.#boundToggle, { signal }); - button.addEventListener("keydown", this.#boundKeyDown, { signal }); - button.addEventListener( - "click", - () => { - const [ - { - data: { id: editId }, - annotationEditorType: mode, - }, - ] = this.#elements; - this.#eventBus?.dispatch("switchannotationeditormode", { - source: this, - editId, - mode, - editComment: true, - }); - }, - { signal } - ); - const { style } = button; - style.left = `calc(${this.#commentButtonPosition[0]}%)`; - style.top = `calc(${this.#commentButtonPosition[1]}% - var(--comment-button-dim))`; - if (this.#commentButtonColor) { - style.backgroundColor = this.#commentButtonColor; + if (!hasOwnButton) { + const button = (this.#commentButton = document.createElement("button")); + button.className = "annotationCommentButton"; + const parentContainer = this.#firstElement.container; + button.style.zIndex = parentContainer.style.zIndex + 1; + button.tabIndex = 0; + button.ariaHasPopup = "dialog"; + button.ariaControls = "commentPopup"; + button.setAttribute("data-l10n-id", "pdfjs-show-comment-button"); + this.#updateColor(); + this.#updateCommentButtonPosition(); + button.addEventListener("keydown", this.#boundKeyDown, { signal }); + button.addEventListener("click", togglePopup, { signal }); + button.addEventListener("pointerenter", showPopup, { signal }); + button.addEventListener("pointerleave", hidePopup, { signal }); + parentContainer.after(button); + } else { + this.#commentButton = this.#firstElement.container; + for (const element of this.trigger) { + element.ariaHasPopup = "dialog"; + element.ariaControls = "commentPopup"; + element.addEventListener("keydown", this.#boundKeyDown, { signal }); + element.addEventListener("click", togglePopup, { signal }); + element.addEventListener("pointerenter", showPopup, { signal }); + element.addEventListener("pointerleave", hidePopup, { signal }); + element.classList.add("popupTriggerArea"); + } + } + } + + #updateCommentButtonPosition() { + if (this.#firstElement.extraPopupElement && !this.#firstElement.editor) { + // If there's no editor associated with the annotation then the comment + // button position can't be changed. + return; + } + if (!this.#commentButton) { + this.renderCommentButton(); } - parentContainer.after(button); + const [x, y] = this.#commentButtonPosition; + const { style } = this.#commentButton; + style.left = `calc(${x}%)`; + style.top = `calc(${y}% - var(--comment-button-dim))`; + } + + #updateColor() { + if (this.#firstElement.extraPopupElement) { + return; + } + if (!this.#commentButton) { + this.renderCommentButton(); + } + this.#commentButton.style.backgroundColor = this.commentButtonColor || ""; + } + + get commentButtonColor() { + const { color, opacity } = this.#firstElement.commentData; + if (!color) { + return null; + } + return this.#parent._commentManager.makeCommentColor(color, opacity); + } + + focusCommentButton() { + setTimeout(() => { + this.#commentButton?.focus(); + }, 0); + } + + getData() { + const { richText, color, opacity, creationDate, modificationDate } = + this.#firstElement.commentData; + return { + contentsObj: { str: this.comment }, + richText, + color, + opacity, + creationDate, + modificationDate, + }; + } + + get elementBeforePopup() { + return this.#commentButton; + } + + get comment() { + this.#commentText ||= this.#firstElement.commentText; + return this.#commentText; + } + + set comment(text) { + if (text === this.comment) { + return; + } + this.#firstElement.commentText = this.#commentText = text; + } + + focus() { + this.#firstElement.container?.focus(); + } + + get parentBoundingClientRect() { + return this.#firstElement.layer.getBoundingClientRect(); + } + + setCommentButtonStates({ selected, hasPopup }) { + if (!this.#commentButton) { + return; + } + this.#commentButton.classList.toggle("selected", selected); + this.#commentButton.ariaExpanded = hasPopup; + } + + setSelectedCommentButton(selected) { + this.#commentButton.classList.toggle("selected", selected); + } + + get commentPopupPosition() { + if (this.#popupPosition) { + return this.#popupPosition; + } + const { x, y, height } = this.#commentButton.getBoundingClientRect(); + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight, + } = this.#firstElement.layer.getBoundingClientRect(); + return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight]; + } + + set commentPopupPosition(pos) { + this.#popupPosition = pos; + } + + hasDefaultPopupPosition() { + return this.#popupPosition === null; + } + + get commentButtonPosition() { + return this.#commentButtonPosition; + } + + get commentButtonWidth() { + return ( + this.#commentButton.getBoundingClientRect().width / + this.parentBoundingClientRect.width + ); + } + + editComment(options) { + const [posX, posY] = + this.#popupPosition || this.commentButtonPosition.map(x => x / 100); + const parentDimensions = this.parentBoundingClientRect; + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight, + } = parentDimensions; + this.#commentManager.showDialog( + null, + this, + parentX + posX * parentWidth, + parentY + posY * parentHeight, + { ...options, parentDimensions } + ); } render() { @@ -2526,18 +2824,15 @@ class PopupElement { header.append(modificationDate); } - const html = this.#html; - if (html) { - XfaLayer.render({ - xfaHtml: html, - intent: "richText", - div: popup, - }); - popup.lastChild.classList.add("richText", "popupContent"); - } else { - const contents = this._formatContents(this.#contentsObj); - popup.append(contents); - } + renderRichText( + { + html: this.#html || this.#contentsObj.str, + dir: this.#contentsObj?.dir, + className: "popupContent", + }, + popup + ); + this.#container.append(popup); } @@ -2596,29 +2891,6 @@ class PopupElement { return popupContent; } - /** - * Format the contents of the popup by adding newlines where necessary. - * - * @private - * @param {Object} contentsObj - * @memberof PopupElement - * @returns {HTMLParagraphElement} - */ - _formatContents({ str, dir }) { - const p = document.createElement("p"); - p.classList.add("popupContent"); - p.dir = dir; - const lines = str.split(/(?:\r\n?|\n)/); - for (let i = 0, ii = lines.length; i < ii; ++i) { - const line = lines[i]; - p.append(document.createTextNode(line)); - if (i < ii - 1) { - p.append(document.createElement("br")); - } - } - return p; - } - #keyDown(event) { if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) { return; @@ -2630,6 +2902,25 @@ class PopupElement { } updateEdited({ rect, popup, deleted }) { + if (this.#commentManager) { + if (deleted) { + this.remove(); + this.#commentText = null; + } else if (popup) { + if (popup.deleted) { + this.remove(); + } else { + this.#updateColor(); + this.#commentText = popup.text; + } + } + if (rect) { + this.#commentButtonPosition = null; + this.#setCommentButtonPosition(); + this.#updateCommentButtonPosition(); + } + return; + } if (deleted || popup?.deleted) { this.remove(); return; @@ -2642,7 +2933,7 @@ class PopupElement { if (rect) { this.#position = null; } - if (popup) { + if (popup && popup.text) { this.#richText = this.#makePopupContent(popup.text); this.#dateObj = PDFDateString.toDateObject(popup.date); this.#contentsObj = null; @@ -2670,8 +2961,12 @@ class PopupElement { this.#popup = null; this.#wasVisible = false; this.#pinned = false; - for (const element of this.trigger) { - element.classList.remove("popupTriggerArea"); + this.#commentButton?.remove(); + this.#commentButton = null; + if (this.trigger) { + for (const element of this.trigger) { + element.classList.remove("popupTriggerArea"); + } } } @@ -2723,6 +3018,11 @@ class PopupElement { * Toggle the visibility of the popup. */ #toggle() { + if (this.#commentManager) { + this.#commentManager.toggleCommentPopup(this, /* isSelected = */ false); + return; + } + this.#pinned = !this.#pinned; if (this.#pinned) { this.#show(); @@ -2774,6 +3074,9 @@ class PopupElement { } maybeShow() { + if (this.#commentManager) { + return; + } this.#addEventListeners(); if (!this.#wasVisible) { return; @@ -2786,6 +3089,9 @@ class PopupElement { } get isVisible() { + if (this.#commentManager) { + return false; + } return this.#container.hidden === false; } } @@ -2802,7 +3108,7 @@ class FreeTextAnnotationElement extends AnnotationElement { this.container.classList.add("freeTextAnnotation"); if (this.textContent) { - const content = document.createElement("div"); + const content = (this.contentElement = document.createElement("div")); content.classList.add("annotationTextContent"); content.setAttribute("role", "comment"); for (const line of this.textContent) { @@ -2814,6 +3120,7 @@ class FreeTextAnnotationElement extends AnnotationElement { } if (!this.data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } @@ -2862,6 +3169,7 @@ class LineAnnotationElement extends AnnotationElement { // Create the popup ourselves so that we can bind it to the line instead // of to the entire container (which is the default). if (!data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } @@ -2918,6 +3226,7 @@ class SquareAnnotationElement extends AnnotationElement { // Create the popup ourselves so that we can bind it to the square instead // of to the entire container (which is the default). if (!data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } @@ -2975,6 +3284,7 @@ class CircleAnnotationElement extends AnnotationElement { // Create the popup ourselves so that we can bind it to the circle instead // of to the entire container (which is the default). if (!data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } @@ -3048,6 +3358,7 @@ class PolylineAnnotationElement extends AnnotationElement { // Create the popup ourselves so that we can bind it to the polyline // instead of to the entire container (which is the default). if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } @@ -3082,6 +3393,7 @@ class CaretAnnotationElement extends AnnotationElement { this.container.classList.add("caretAnnotation"); if (!this.data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } return this.container; @@ -3176,6 +3488,7 @@ class InkAnnotationElement extends AnnotationElement { } if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } @@ -3215,31 +3528,6 @@ class InkAnnotationElement extends AnnotationElement { addHighlightArea() { this.container.classList.add("highlightArea"); } - - get commentButtonPosition() { - const { inkLists, rect } = this.data; - if (inkLists?.length >= 1) { - let maxX = -Infinity; - let maxY = -Infinity; - for (const inkList of inkLists) { - for (let i = 0, ii = inkList.length; i < ii; i += 2) { - if (inkList[i + 1] > maxY) { - maxY = inkList[i + 1]; - maxX = inkList[i]; - } else if (inkList[i + 1] === maxY) { - maxX = Math.max(maxX, inkList[i]); - } - } - } - if (maxX !== Infinity) { - return [maxX, maxY]; - } - } - if (rect) { - return [rect[2], rect[3]]; - } - return null; - } } class HighlightAnnotationElement extends AnnotationElement { @@ -3257,6 +3545,7 @@ class HighlightAnnotationElement extends AnnotationElement { data: { overlaidText, popupRef }, } = this; if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } @@ -3288,6 +3577,7 @@ class UnderlineAnnotationElement extends AnnotationElement { data: { overlaidText, popupRef }, } = this; if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } @@ -3318,6 +3608,7 @@ class SquigglyAnnotationElement extends AnnotationElement { data: { overlaidText, popupRef }, } = this; if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } @@ -3348,6 +3639,7 @@ class StrikeOutAnnotationElement extends AnnotationElement { data: { overlaidText, popupRef }, } = this; if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } @@ -3375,6 +3667,7 @@ class StampAnnotationElement extends AnnotationElement { this.container.setAttribute("role", "img"); if (!this.data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } this._editOnDoubleClick(); @@ -3438,6 +3731,7 @@ class FileAttachmentAnnotationElement extends AnnotationElement { }); if (!data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; this._createPopup(); } else { trigger.classList.add("popupTriggerArea"); @@ -3483,6 +3777,7 @@ class FileAttachmentAnnotationElement extends AnnotationElement { * @property {TextAccessibilityManager} [accessibilityManager] * @property {AnnotationEditorUIManager} [annotationEditorUIManager] * @property {StructTreeLayerBuilder} [structTreeLayer] + * @property {CommentManager} [commentManager] - The comment manager instance. */ /** @@ -3493,10 +3788,18 @@ class AnnotationLayer { #annotationCanvasMap = null; + #annotationStorage = null; + #editableAnnotations = new Map(); #structTreeLayer = null; + #linkService = null; + + #elements = []; + + #hasAriaAttributesFromStructTree = false; + constructor({ div, accessibilityManager, @@ -3505,15 +3808,21 @@ class AnnotationLayer { page, viewport, structTreeLayer, + commentManager, + linkService, + annotationStorage, }) { this.div = div; this.#accessibilityManager = accessibilityManager; this.#annotationCanvasMap = annotationCanvasMap; this.#structTreeLayer = structTreeLayer || null; + this.#linkService = linkService || null; + this.#annotationStorage = annotationStorage || new AnnotationStorage(); this.page = page; this.viewport = viewport; this.zIndex = 0; this._annotationEditorUIManager = annotationEditorUIManager; + this._commentManager = commentManager || null; if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("TESTING")) { // For testing purposes. @@ -3532,31 +3841,6 @@ class AnnotationLayer { return this.#editableAnnotations.size > 0; } - async #appendElement(element, id, popupElements) { - const contentElement = element.firstChild || element; - const annotationId = (contentElement.id = `${AnnotationPrefix}${id}`); - const ariaAttributes = - await this.#structTreeLayer?.getAriaAttributes(annotationId); - if (ariaAttributes) { - for (const [key, value] of ariaAttributes) { - contentElement.setAttribute(key, value); - } - } - - if (popupElements) { - // Set the popup just after the first element associated with the popup. - popupElements.at(-1).container.after(element); - } else { - this.div.append(element); - this.#accessibilityManager?.moveElementInDOM( - this.div, - element, - contentElement, - /* isRemovable = */ false - ); - } - } - /** * Render a new annotation layer with all annotation elements. * @@ -3569,15 +3853,16 @@ class AnnotationLayer { setLayerDimensions(layer, this.viewport); const popupToElements = new Map(); + const popupAnnotations = []; const elementParams = { data: null, layer, - linkService: params.linkService, + linkService: this.#linkService, downloadManager: params.downloadManager, imageResourcesPath: params.imageResourcesPath || "", renderForms: params.renderForms !== false, svgFactory: new DOMSVGFactory(), - annotationStorage: params.annotationStorage || new AnnotationStorage(), + annotationStorage: this.#annotationStorage, enableComment: params.enableComment === true, enableScripting: params.enableScripting === true, hasJSActions: params.hasJSActions, @@ -3601,6 +3886,10 @@ class AnnotationLayer { // Ignore popup annotations without a corresponding annotation. continue; } + if (!this._commentManager) { + popupAnnotations.push(data); + continue; + } elementParams.elements = elements; } elementParams.data = data; @@ -3610,12 +3899,16 @@ class AnnotationLayer { continue; } - if (!isPopupAnnotation && data.popupRef) { - const elements = popupToElements.get(data.popupRef); - if (!elements) { - popupToElements.set(data.popupRef, [element]); - } else { - elements.push(element); + if (!isPopupAnnotation) { + this.#elements.push(element); + + if (data.popupRef) { + const elements = popupToElements.get(data.popupRef); + if (!elements) { + popupToElements.set(data.popupRef, [element]); + } else { + elements.push(element); + } } } @@ -3623,7 +3916,6 @@ class AnnotationLayer { if (data.hidden) { rendered.style.visibility = "hidden"; } - await this.#appendElement(rendered, data.id, elementParams.elements); if (element._isEditable) { this.#editableAnnotations.set(element.data.id, element); @@ -3631,9 +3923,124 @@ class AnnotationLayer { } } + await this.#addElementsToDOM(); + + for (const data of popupAnnotations) { + const elements = (elementParams.elements = popupToElements.get(data.id)); + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + const rendered = element.render(); + element.contentElement.id = `${AnnotationPrefix}${data.id}`; + if (data.hidden) { + rendered.style.visibility = "hidden"; + } + elements.at(-1).container.after(rendered); + } + this.#setAnnotationCanvasMap(); } + async #addElementsToDOM() { + if (this.#elements.length === 0) { + return; + } + // Clear the existing annotations in order to make sure comment buttons + // don't have a parent any longer. + this.div.replaceChildren(); + + const promises = []; + if (!this.#hasAriaAttributesFromStructTree) { + this.#hasAriaAttributesFromStructTree = true; + for (const { + contentElement, + data: { id }, + } of this.#elements) { + const annotationId = (contentElement.id = `${AnnotationPrefix}${id}`); + promises.push( + this.#structTreeLayer + ?.getAriaAttributes(annotationId) + .then(ariaAttributes => { + if (ariaAttributes) { + for (const [key, value] of ariaAttributes) { + contentElement.setAttribute(key, value); + } + } + }) + ); + } + } + this.#elements.sort( + ( + { + data: { + rect: [a0, a1, a2, a3], + }, + }, + { + data: { + rect: [b0, b1, b2, b3], + }, + } + ) => { + // We are in page coordinates, which has the origin at the + // bottom left. + if (a0 === a2 && a1 === a3) { + return +1; + } + + if (b0 === b2 && b1 === b3) { + return -1; + } + + const top1 = a3; + const bot1 = a1; + const mid1 = (a1 + a3) / 2; + + const top2 = b3; + const bot2 = b1; + const mid2 = (b1 + b3) / 2; + + if (mid1 >= top2 && mid2 <= bot1) { + return -1; + } + + if (mid2 >= top1 && mid1 <= bot2) { + return +1; + } + + const centerX1 = (a0 + a2) / 2; + const centerX2 = (b0 + b2) / 2; + + return centerX1 - centerX2; + } + ); + + const fragment = document.createDocumentFragment(); + for (const element of this.#elements) { + fragment.append(element.container); + if (this._commentManager) { + ( + element.extraPopupElement?.popup || element.popup + )?.renderCommentButton(); + } else if (element.extraPopupElement) { + fragment.append(element.extraPopupElement.render()); + } + } + this.div.append(fragment); + await Promise.all(promises); + if (this.#accessibilityManager) { + for (const element of this.#elements) { + this.#accessibilityManager.addPointerInTextLayer( + element.contentElement, + /* isRemovable = */ false + ); + } + } + } + /** * Add link annotations to the annotation layer. * @@ -3641,11 +4048,11 @@ class AnnotationLayer { * @param {IPDFLinkService} linkService * @memberof AnnotationLayer */ - async addLinkAnnotations(annotations, linkService) { + async addLinkAnnotations(annotations) { const elementParams = { data: null, layer: this.div, - linkService, + linkService: this.#linkService, svgFactory: new DOMSVGFactory(), parent: this, }; @@ -3658,9 +4065,11 @@ class AnnotationLayer { if (!element.isRenderable) { continue; } - const rendered = element.render(); - await this.#appendElement(rendered, data.id, null); + element.render(); + element.contentElement.id = `${AnnotationPrefix}${data.id}`; + this.#elements.push(element); } + await this.#addElementsToDOM(); } /** @@ -3701,6 +4110,13 @@ class AnnotationLayer { firstChild.after(canvas); } + // If there's a visible input/textarea element, the canvas should be hidden + // (user is editing the field). Otherwise, show the canvas (appearance stream). + const inputElement = element.querySelector("input, textarea"); + if (inputElement && !inputElement.hidden) { + canvas.hidden = true; + } + const editableAnnotation = this.#editableAnnotations.get(id); if (!editableAnnotation) { continue; @@ -3728,6 +4144,54 @@ class AnnotationLayer { return this.#editableAnnotations.get(id); } + addFakeAnnotation(editor) { + const { div } = this; + const { id, rotation } = editor; + const element = new EditorAnnotationElement({ + data: { + id, + rect: editor.getPDFRect(), + rotation, + }, + editor, + layer: div, + parent: this, + enableComment: !!this._commentManager, + linkService: this.#linkService, + annotationStorage: this.#annotationStorage, + }); + element.render(); + element.contentElement.id = `${AnnotationPrefix}${id}`; + element.createOrUpdatePopup(); + this.#elements.push(element); + return element; + } + + removeAnnotation(id) { + const index = this.#elements.findIndex(el => el.data.id === id); + if (index < 0) { + return; + } + const [element] = this.#elements.splice(index, 1); + this.#accessibilityManager?.removePointerInTextLayer( + element.contentElement + ); + } + + updateFakeAnnotations(editors) { + if (editors.length === 0) { + return; + } + for (const editor of editors) { + editor.updateFakeAnnotationElement(this); + } + this.#addElementsToDOM(); + } + + togglePointerEvents(enabled = false) { + this.div.classList.toggle("disabled", !enabled); + } + /** * @private */ diff --git a/src/display/annotation_storage.js b/src/display/annotation_storage.js index 91cdc62408bf8..58e0407b9e854 100644 --- a/src/display/annotation_storage.js +++ b/src/display/annotation_storage.js @@ -31,6 +31,8 @@ class AnnotationStorage { #modifiedIds = null; + #editorsMap = null; + #storage = new Map(); constructor() { @@ -83,6 +85,13 @@ class AnnotationStorage { * @param {string} key */ remove(key) { + const storedValue = this.#storage.get(key); + if (storedValue === undefined) { + return; + } + if (storedValue instanceof AnnotationEditor) { + this.#editorsMap.delete(storedValue.annotationElementId); + } this.#storage.delete(key); if (this.#storage.size === 0) { @@ -122,11 +131,11 @@ class AnnotationStorage { this.#setModified(); } - if ( - value instanceof AnnotationEditor && - typeof this.onAnnotationEditor === "function" - ) { - this.onAnnotationEditor(value.constructor._type); + if (value instanceof AnnotationEditor) { + (this.#editorsMap ||= new Map()).set(value.annotationElementId, value); + if (typeof this.onAnnotationEditor === "function") { + this.onAnnotationEditor(value.constructor._type); + } } } @@ -187,6 +196,10 @@ class AnnotationStorage { val instanceof AnnotationEditor ? val.serialize(/* isForCopying = */ false, context) : val; + if (val.page) { + val.pageIndex = val.page._pageIndex; + delete val.page; + } if (serialized) { map.set(key, serialized); @@ -213,10 +226,24 @@ class AnnotationStorage { get editorStats() { let stats = null; const typeToEditor = new Map(); + let numberOfEditedComments = 0; + let numberOfDeletedComments = 0; for (const value of this.#storage.values()) { if (!(value instanceof AnnotationEditor)) { + if (value.popup) { + if (value.popup.deleted) { + numberOfDeletedComments += 1; + } else { + numberOfEditedComments += 1; + } + } continue; } + if (value.isCommentDeleted) { + numberOfDeletedComments += 1; + } else if (value.hasEditedComment) { + numberOfEditedComments += 1; + } const editorStats = value.telemetryFinalData; if (!editorStats) { continue; @@ -240,6 +267,16 @@ class AnnotationStorage { counters.set(val, count + 1); } } + if (numberOfDeletedComments > 0 || numberOfEditedComments > 0) { + stats ||= Object.create(null); + stats.comments = { + deleted: numberOfDeletedComments, + edited: numberOfEditedComments, + }; + } + if (!stats) { + return null; + } for (const [type, editor] of typeToEditor) { stats[type] = editor.computeTelemetryFinalData(stats[type]); } @@ -250,6 +287,19 @@ class AnnotationStorage { this.#modifiedIds = null; } + updateEditor(annotationId, data) { + const value = this.#editorsMap?.get(annotationId); + if (value) { + value.updateFromAnnotationLayer(data); + return true; + } + return false; + } + + getEditor(annotationId) { + return this.#editorsMap?.get(annotationId) || null; + } + /** * @returns {{ids: Set, hash: string}} */ @@ -258,15 +308,13 @@ class AnnotationStorage { return this.#modifiedIds; } const ids = []; - for (const value of this.#storage.values()) { - if ( - !(value instanceof AnnotationEditor) || - !value.annotationElementId || - !value.serialize() - ) { - continue; + if (this.#editorsMap) { + for (const value of this.#editorsMap.values()) { + if (!value.serialize()) { + continue; + } + ids.push(value.annotationElementId); } - ids.push(value.annotationElementId); } return (this.#modifiedIds = { ids: new Set(ids), diff --git a/src/display/api.js b/src/display/api.js index 54612a5c9bcb3..f088b9dc1e782 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -25,6 +25,7 @@ import { getVerbosityLevel, info, isNodeJS, + MathClamp, RenderingIntentFlag, setVerbosityLevel, shadow, @@ -40,11 +41,17 @@ import { deprecated, isDataScheme, isValidFetchUrl, + PagesMapper, PageViewport, RenderingCancelledException, StatTimer, } from "./display_utils.js"; import { FontFaceObject, FontLoader } from "./font_loader.js"; +import { + FontInfo, + FontPathInfo, + PatternInfo, +} from "../shared/obj-bin-transform.js"; import { getDataProp, getFactoryUrlProp, @@ -434,6 +441,7 @@ function getDocument(src = {}) { ownerDocument, pdfBug, styleElement, + enableHWA, loadingParams: { disableAutoFetch, enableXfa, @@ -457,7 +465,8 @@ function getDocument(src = {}) { let networkStream; if (rangeTransport) { - networkStream = new PDFDataTransportStream(rangeTransport, { + networkStream = new PDFDataTransportStream({ + pdfDataRangeTransport: rangeTransport, disableRange, disableStream, }); @@ -502,8 +511,7 @@ function getDocument(src = {}) { task, networkStream, transportParams, - transportFactory, - enableHWA + transportFactory ); task._transport = transport; messageHandler.send("Ready", null); @@ -518,6 +526,8 @@ function getDocument(src = {}) { * @typedef {Object} OnProgressParameters * @property {number} loaded - Currently loaded number of bytes. * @property {number} total - Total number of bytes in the PDF file. + * @property {number} percent - Currently loaded percentage, as an integer value + * in the [0, 100] range. If `total` is undefined, the percentage is `NaN`. */ /** @@ -751,9 +761,6 @@ class PDFDocumentProxy { Object.defineProperty(this, "getXFADatasets", { value: () => this._transport.getXFADatasets(), }); - Object.defineProperty(this, "getXRefPrevValue", { - value: () => this._transport.getXRefPrevValue(), - }); Object.defineProperty(this, "getStartXRefPos", { value: () => this._transport.getStartXRefPos(), }); @@ -1027,6 +1034,24 @@ class PDFDocumentProxy { return this._transport.saveDocument(); } + /** + * @typedef {Object} PageInfo + * @property {null|Uint8Array} document + * @property {Array|number>} [includePages] + * included ranges or indices. + * @property {Array|number>} [excludePages] + * excluded ranges or indices. + */ + + /** + * @param {Array} pageInfos - The pages to extract. + * @returns {Promise} A promise that is resolved with a + * {Uint8Array} containing the full data of the saved document. + */ + extractPages(pageInfos) { + return this._transport.extractPages(pageInfos); + } + /** * @returns {Promise<{ length: number }>} A promise that is resolved when the * document's data is loaded. It is resolved with an {Object} that contains @@ -1242,8 +1267,14 @@ class PDFDocumentProxy { * @property {boolean} [isEditing] - Render the page in editing mode. * @property {boolean} [recordOperations] - Record the dependencies and bounding * boxes of all PDF operations that render onto the canvas. - * @property {Set} [filteredOperationIndexes] - If provided, only run - * the PDF operations that are included in this set. + * @property {OperationsFilter} [operationsFilter] - If provided, only + * run for which this function returns `true`. + */ + +/** + * @callback OperationsFilter + * @param {number} index - The index of the operation. + * @returns {boolean} If false, the operation is ignored. */ /** @@ -1302,6 +1333,8 @@ class PDFDocumentProxy { class PDFPageProxy { #pendingCleanup = false; + #pagesMapper = PagesMapper.instance; + constructor(pageIndex, pageInfo, transport, pdfBug = false) { this._pageIndex = pageIndex; this._pageInfo = pageInfo; @@ -1314,7 +1347,7 @@ class PDFPageProxy { this._intentStates = new Map(); this.destroyed = false; - this.recordedGroups = null; + this.recordedBBoxes = null; } /** @@ -1324,6 +1357,13 @@ class PDFPageProxy { return this._pageIndex + 1; } + /** + * @param {number} value - The page number to set. First page is 1. + */ + set pageNumber(value) { + this._pageIndex = value - 1; + } + /** * @type {number} The number of degrees the page is rotated clockwise. */ @@ -1440,7 +1480,7 @@ class PDFPageProxy { printAnnotationStorage = null, isEditing = false, recordOperations = false, - filteredOperationIndexes = null, + operationsFilter = null, }) { this._stats?.time("Overall"); @@ -1487,23 +1527,28 @@ class PDFPageProxy { this._pumpOperatorList(intentArgs); } + const recordForDebugger = Boolean( + this._pdfBug && globalThis.StepperManager?.enabled + ); + const shouldRecordOperations = - !this.recordedGroups && - (recordOperations || - (this._pdfBug && globalThis.StepperManager?.enabled)); + !this.recordedBBoxes && (recordOperations || recordForDebugger); const complete = error => { intentState.renderTasks.delete(internalRenderTask); if (shouldRecordOperations) { - const recordedGroups = internalRenderTask.gfx?.dependencyTracker.take(); - if (recordedGroups) { - internalRenderTask.stepper?.setOperatorGroups(recordedGroups); + const recordedBBoxes = internalRenderTask.gfx?.dependencyTracker.take(); + if (recordedBBoxes) { + if (internalRenderTask.stepper) { + internalRenderTask.stepper.setOperatorBBoxes( + recordedBBoxes, + internalRenderTask.gfx.dependencyTracker.takeDebugMetadata() + ); + } if (recordOperations) { - this.recordedGroups = recordedGroups; + this.recordedBBoxes = recordedBBoxes; } - } else if (recordOperations) { - this.recordedGroups = []; } } @@ -1542,7 +1587,11 @@ class PDFPageProxy { canvas, canvasContext, dependencyTracker: shouldRecordOperations - ? new CanvasDependencyTracker(canvas) + ? new CanvasDependencyTracker( + canvas, + intentState.operatorList.length, + recordForDebugger + ) : null, viewport, transform, @@ -1559,7 +1608,7 @@ class PDFPageProxy { pdfBug: this._pdfBug, pageColors, enableHWA: this._transport.enableHWA, - filteredOperationIndexes, + operationsFilter, }); (intentState.renderTasks ||= new Set()).add(internalRenderTask); @@ -1664,6 +1713,7 @@ class PDFPageProxy { return this._transport.messageHandler.sendWithStream( "GetTextContent", { + pageId: this.#pagesMapper.getPageId(this._pageIndex + 1) - 1, pageIndex: this._pageIndex, includeMarkedContent: includeMarkedContent === true, disableNormalization: disableNormalization === true, @@ -1849,6 +1899,7 @@ class PDFPageProxy { const readableStream = this._transport.messageHandler.sendWithStream( "GetOperatorList", { + pageId: this.#pagesMapper.getPageId(this._pageIndex + 1) - 1, pageIndex: this._pageIndex, intent: renderingIntent, cacheKey, @@ -2344,8 +2395,14 @@ class PDFWorker { * @ignore */ class WorkerTransport { + downloadInfoCapability = Promise.withResolvers(); + + #fullReader = null; + #methodPromises = new Map(); + #networkStream = null; + #pageCache = new Map(); #pagePromises = new Map(); @@ -2354,21 +2411,19 @@ class WorkerTransport { #passwordCapability = null; - constructor( - messageHandler, - loadingTask, - networkStream, - params, - factory, - enableHWA - ) { + #pagesMapper = PagesMapper.instance; + + constructor(messageHandler, loadingTask, networkStream, params, factory) { this.messageHandler = messageHandler; this.loadingTask = loadingTask; + this.#networkStream = networkStream; + this.commonObjs = new PDFObjects(); this.fontLoader = new FontLoader({ ownerDocument: params.ownerDocument, styleElement: params.styleElement, }); + this.enableHWA = params.enableHWA; this.loadingParams = params.loadingParams; this._params = params; @@ -2381,14 +2436,10 @@ class WorkerTransport { this.destroyed = false; this.destroyCapability = null; - this._networkStream = networkStream; - this._fullReader = null; - this._lastProgress = null; - this.downloadInfoCapability = Promise.withResolvers(); - this.enableHWA = enableHWA; - this.setupMessageHandler(); + this.#pagesMapper.addListener(this.#updateCaches.bind(this)); + if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) { // For testing purposes. Object.defineProperty(this, "getNetworkStreamName", { @@ -2413,6 +2464,24 @@ class WorkerTransport { } } + #updateCaches() { + const newPageCache = new Map(); + const newPromiseCache = new Map(); + for (let i = 0, ii = this.#pagesMapper.pagesNumber; i < ii; i++) { + const prevPageIndex = this.#pagesMapper.getPrevPageNumber(i + 1) - 1; + const page = this.#pageCache.get(prevPageIndex); + if (page) { + newPageCache.set(i, page); + } + const promise = this.#pagePromises.get(prevPageIndex); + if (promise) { + newPromiseCache.set(i, promise); + } + } + this.#pageCache = newPageCache; + this.#pagePromises = newPromiseCache; + } + #cacheSimpleMethod(name, data = null) { const cachedPromise = this.#methodPromises.get(name); if (cachedPromise) { @@ -2424,6 +2493,14 @@ class WorkerTransport { return promise; } + #onProgress({ loaded, total }) { + this.loadingTask.onProgress?.({ + loaded, + total, + percent: MathClamp(Math.round((loaded / total) * 100), 0, 100), + }); + } + get annotationStorage() { return shadow(this, "annotationStorage", new AnnotationStorage()); } @@ -2535,7 +2612,7 @@ class WorkerTransport { this.filterFactory.destroy(); TextLayer.cleanup(); - this._networkStream?.cancelAllRequests( + this.#networkStream?.cancelAllRequests( new AbortException("Worker was terminated.") ); @@ -2552,18 +2629,16 @@ class WorkerTransport { messageHandler.on("GetReader", (data, sink) => { assert( - this._networkStream, - "GetReader - no `IPDFStream` instance available." + this.#networkStream, + "GetReader - no `BasePDFStream` instance available." ); - this._fullReader = this._networkStream.getFullReader(); - this._fullReader.onProgress = evt => { - this._lastProgress = { - loaded: evt.loaded, - total: evt.total, - }; - }; + this.#fullReader = this.#networkStream.getFullReader(); + // If stream or range turn out to be disabled, once `headersReady` is + // resolved, this is our only way to report loading progress. + this.#fullReader.onProgress = evt => this.#onProgress(evt); + sink.onPull = () => { - this._fullReader + this.#fullReader .read() .then(function ({ value, done }) { if (done) { @@ -2584,7 +2659,7 @@ class WorkerTransport { }; sink.onCancel = reason => { - this._fullReader.cancel(reason); + this.#fullReader.cancel(reason); sink.ready.catch(readyReason => { if (this.destroyed) { @@ -2596,40 +2671,29 @@ class WorkerTransport { }); messageHandler.on("ReaderHeadersReady", async data => { - await this._fullReader.headersReady; + await this.#fullReader.headersReady; const { isStreamingSupported, isRangeSupported, contentLength } = - this._fullReader; + this.#fullReader; - // If stream or range are disabled, it's our only way to report - // loading progress. - if (!isStreamingSupported || !isRangeSupported) { - if (this._lastProgress) { - loadingTask.onProgress?.(this._lastProgress); - } - this._fullReader.onProgress = evt => { - loadingTask.onProgress?.({ - loaded: evt.loaded, - total: evt.total, - }); - }; + if (isStreamingSupported && isRangeSupported) { + this.#fullReader.onProgress = null; // See comment in "GetReader" above. } - return { isStreamingSupported, isRangeSupported, contentLength }; }); messageHandler.on("GetRangeReader", (data, sink) => { assert( - this._networkStream, - "GetRangeReader - no `IPDFStream` instance available." + this.#networkStream, + "GetRangeReader - no `BasePDFStream` instance available." ); - const rangeReader = this._networkStream.getRangeReader( + const rangeReader = this.#networkStream.getRangeReader( data.begin, data.end ); // When streaming is enabled, it's possible that the data requested here - // has already been fetched via the `_fullRequestReader` implementation. + // has already been fetched via the `#fullReader` implementation. // However, given that the PDF data is loaded asynchronously on the // main-thread and then sent via `postMessage` to the worker-thread, // it may not have been available during parsing (hence the attempt to @@ -2637,7 +2701,7 @@ class WorkerTransport { // // To avoid wasting time and resources here, we'll thus *not* dispatch // range requests if the data was already loaded but has not been sent to - // the worker-thread yet (which will happen via the `_fullRequestReader`). + // the worker-thread yet (which will happen via the `#fullReader`). if (!rangeReader) { sink.close(); return; @@ -2675,6 +2739,7 @@ class WorkerTransport { }); messageHandler.on("GetDoc", ({ pdfInfo }) => { + this.#pagesMapper.pagesNumber = pdfInfo.numPages; this._numPages = pdfInfo.numPages; this._htmlForXfa = pdfInfo.htmlForXfa; delete pdfInfo.htmlForXfa; @@ -2710,10 +2775,7 @@ class WorkerTransport { messageHandler.on("DataLoaded", data => { // For consistency: Ensure that progress is always reported when the // entire PDF file has been loaded, regardless of how it was fetched. - loadingTask.onProgress?.({ - loaded: data.length, - total: data.length, - }); + this.#onProgress({ loaded: data.length, total: data.length }); this.downloadInfoCapability.resolve(data); }); @@ -2745,11 +2807,17 @@ class WorkerTransport { break; } + const fontData = new FontInfo(exportedData); const inspectFont = this._params.pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null; - const font = new FontFaceObject(exportedData, inspectFont); + const font = new FontFaceObject( + fontData, + inspectFont, + exportedData.extra, + exportedData.charProcOperatorList + ); this.fontLoader .bind(font) @@ -2761,7 +2829,7 @@ class WorkerTransport { // rather than waiting for a `PDFDocumentProxy.cleanup` call. // Since `font.data` could be very large, e.g. in some cases // multiple megabytes, this will help reduce memory usage. - font.data = null; + font.clearData(); } this.commonObjs.resolve(id, font); }); @@ -2784,10 +2852,15 @@ class WorkerTransport { } break; case "FontPath": + this.commonObjs.resolve(id, new FontPathInfo(exportedData)); + break; case "Image": - case "Pattern": this.commonObjs.resolve(id, exportedData); break; + case "Pattern": + const pattern = new PatternInfo(exportedData); + this.commonObjs.resolve(id, pattern.getIR()); + break; default: throw new Error(`Got unknown common object type ${type}`); } @@ -2825,10 +2898,7 @@ class WorkerTransport { if (this.destroyed) { return; // Ignore any pending requests if the worker was terminated. } - loadingTask.onProgress?.({ - loaded: data.loaded, - total: data.total, - }); + this.#onProgress(data); }); messageHandler.on("FetchBinaryData", async data => { @@ -2869,7 +2939,7 @@ class WorkerTransport { isPureXfa: !!this._htmlForXfa, numPages: this._numPages, annotationStorage: map, - filename: this._fullReader?.filename ?? null, + filename: this.#fullReader?.filename ?? null, }, transfer ) @@ -2878,30 +2948,35 @@ class WorkerTransport { }); } + extractPages(pageInfos) { + return this.messageHandler.sendWithPromise("ExtractPages", { pageInfos }); + } + getPage(pageNumber) { if ( !Number.isInteger(pageNumber) || pageNumber <= 0 || - pageNumber > this._numPages + pageNumber > this.#pagesMapper.pagesNumber ) { return Promise.reject(new Error("Invalid page request.")); } + const pageIndex = pageNumber - 1; + const newPageIndex = this.#pagesMapper.getPageId(pageNumber) - 1; - const pageIndex = pageNumber - 1, - cachedPromise = this.#pagePromises.get(pageIndex); + const cachedPromise = this.#pagePromises.get(pageIndex); if (cachedPromise) { return cachedPromise; } const promise = this.messageHandler .sendWithPromise("GetPage", { - pageIndex, + pageIndex: newPageIndex, }) .then(pageInfo => { if (this.destroyed) { throw new Error("Transport destroyed"); } if (pageInfo.refStr) { - this.#pageRefCache.set(pageInfo.refStr, pageNumber); + this.#pageRefCache.set(pageInfo.refStr, newPageIndex); } const page = new PDFPageProxy( @@ -2917,19 +2992,20 @@ class WorkerTransport { return promise; } - getPageIndex(ref) { + async getPageIndex(ref) { if (!isRefProxy(ref)) { - return Promise.reject(new Error("Invalid pageIndex request.")); + throw new Error("Invalid pageIndex request."); } - return this.messageHandler.sendWithPromise("GetPageIndex", { + const index = await this.messageHandler.sendWithPromise("GetPageIndex", { num: ref.num, gen: ref.gen, }); + return this.#pagesMapper.getPageNumber(index + 1) - 1; } getAnnotations(pageIndex, intent) { return this.messageHandler.sendWithPromise("GetAnnotations", { - pageIndex, + pageIndex: this.#pagesMapper.getPageId(pageIndex + 1) - 1, intent, }); } @@ -2996,13 +3072,13 @@ class WorkerTransport { getPageJSActions(pageIndex) { return this.messageHandler.sendWithPromise("GetPageJSActions", { - pageIndex, + pageIndex: this.#pagesMapper.getPageId(pageIndex + 1) - 1, }); } getStructTree(pageIndex) { return this.messageHandler.sendWithPromise("GetStructTree", { - pageIndex, + pageIndex: this.#pagesMapper.getPageId(pageIndex + 1) - 1, }); } @@ -3031,8 +3107,9 @@ class WorkerTransport { .then(results => ({ info: results[0], metadata: results[1] ? new Metadata(results[1]) : null, - contentDispositionFilename: this._fullReader?.filename ?? null, - contentLength: this._fullReader?.contentLength ?? null, + contentDispositionFilename: this.#fullReader?.filename ?? null, + contentLength: this.#fullReader?.contentLength ?? null, + hasStructTree: results[2], })); this.#methodPromises.set(name, promise); return promise; @@ -3071,7 +3148,10 @@ class WorkerTransport { return null; } const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`; - return this.#pageRefCache.get(refStr) ?? null; + const pageIndex = this.#pageRefCache.get(refStr); + return pageIndex >= 0 + ? this.#pagesMapper.getPageNumber(pageIndex + 1) + : null; } } @@ -3079,7 +3159,7 @@ class WorkerTransport { * Allows controlling of the rendering tasks. */ class RenderTask { - #internalRenderTask = null; + _internalRenderTask = null; /** * Callback for incremental rendering -- a function that will be called @@ -3100,12 +3180,12 @@ class RenderTask { onError = null; constructor(internalRenderTask) { - this.#internalRenderTask = internalRenderTask; + this._internalRenderTask = internalRenderTask; if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) { // For testing purposes. Object.defineProperty(this, "getOperatorList", { - value: () => this.#internalRenderTask.operatorList, + value: () => this._internalRenderTask.operatorList, }); } } @@ -3115,7 +3195,7 @@ class RenderTask { * @type {Promise} */ get promise() { - return this.#internalRenderTask.capability.promise; + return this._internalRenderTask.capability.promise; } /** @@ -3126,7 +3206,7 @@ class RenderTask { * @param {number} [extraDelay] */ cancel(extraDelay = 0) { - this.#internalRenderTask.cancel(/* error = */ null, extraDelay); + this._internalRenderTask.cancel(/* error = */ null, extraDelay); } /** @@ -3134,11 +3214,11 @@ class RenderTask { * @type {boolean} */ get separateAnnots() { - const { separateAnnots } = this.#internalRenderTask.operatorList; + const { separateAnnots } = this._internalRenderTask.operatorList; if (!separateAnnots) { return false; } - const { annotationCanvasMap } = this.#internalRenderTask; + const { annotationCanvasMap } = this._internalRenderTask; return ( separateAnnots.form || (separateAnnots.canvas && annotationCanvasMap?.size > 0) @@ -3169,7 +3249,7 @@ class InternalRenderTask { pdfBug = false, pageColors = null, enableHWA = false, - filteredOperationIndexes = null, + operationsFilter = null, }) { this.callback = callback; this.params = params; @@ -3201,7 +3281,7 @@ class InternalRenderTask { this._canvasContext = params.canvas ? null : params.canvasContext; this._enableHWA = enableHWA; this._dependencyTracker = params.dependencyTracker; - this._filteredOperationIndexes = filteredOperationIndexes; + this._operationsFilter = operationsFilter; } get completed() { @@ -3288,6 +3368,9 @@ class InternalRenderTask { this.graphicsReadyCallback ||= this._continueBound; return; } + this.gfx.dependencyTracker?.growOperationsCount( + this.operatorList.fnArray.length + ); this.stepper?.updateOperatorList(this.operatorList); if (this.running) { @@ -3328,14 +3411,13 @@ class InternalRenderTask { this.operatorListIdx, this._continueBound, this.stepper, - this._filteredOperationIndexes + this._operationsFilter ); if (this.operatorListIdx === this.operatorList.argsArray.length) { this.running = false; if (this.operatorList.lastChunk) { this.gfx.endDrawing(); InternalRenderTask.#canvasInUse.delete(this._canvas); - this.callback(); } } diff --git a/src/display/canvas.js b/src/display/canvas.js index 55054a1bb8651..b364a2910e297 100644 --- a/src/display/canvas.js +++ b/src/display/canvas.js @@ -18,7 +18,6 @@ import { Dependencies, } from "./canvas_dependency_tracker.js"; import { - DrawOPS, FeatureTest, FONT_IDENTITY_MATRIX, ImageKind, @@ -33,6 +32,7 @@ import { import { getCurrentTransform, getCurrentTransformInverse, + makePathFromDrawOPS, OutputScale, PixelsPerInch, } from "./display_utils.js"; @@ -763,7 +763,7 @@ class CanvasGraphics { executionStartIdx, continueCallback, stepper, - filteredOperationIndexes + operationsFilter ) { const argsArray = operatorList.argsArray; const fnArray = operatorList.fnArray; @@ -791,7 +791,7 @@ class CanvasGraphics { return i; } - if (!filteredOperationIndexes || filteredOperationIndexes.has(i)) { + if (!operationsFilter || operationsFilter(i)) { fnId = fnArray[i]; // TODO: There is a `undefined` coming from somewhere. fnArgs = argsArray[i] ?? null; @@ -1100,7 +1100,7 @@ class CanvasGraphics { -offsetY, ]); fillCtx.fillStyle = isPatternFill - ? fillColor.getPattern(ctx, this, inverse, PathType.FILL) + ? fillColor.getPattern(ctx, this, inverse, PathType.FILL, opIdx) : fillColor; fillCtx.fillRect(0, 0, width, height); @@ -1489,35 +1489,7 @@ class CanvasGraphics { } if (!(path instanceof Path2D)) { - // Using a SVG string is slightly slower than using the following loop. - const path2d = (data[0] = new Path2D()); - for (let i = 0, ii = path.length; i < ii; ) { - switch (path[i++]) { - case DrawOPS.moveTo: - path2d.moveTo(path[i++], path[i++]); - break; - case DrawOPS.lineTo: - path2d.lineTo(path[i++], path[i++]); - break; - case DrawOPS.curveTo: - path2d.bezierCurveTo( - path[i++], - path[i++], - path[i++], - path[i++], - path[i++], - path[i++] - ); - break; - case DrawOPS.closePath: - path2d.closePath(); - break; - default: - warn(`Unrecognized drawing path operator: ${path[i - 1]}`); - break; - } - } - path = path2d; + path = data[0] = makePathFromDrawOPS(path); } Util.axialAlignedBoundingBox( minMax, @@ -1549,7 +1521,8 @@ class CanvasGraphics { ctx, this, getCurrentTransformInverse(ctx), - PathType.STROKE + PathType.STROKE, + opIdx ); if (baseTransform) { const newPath = new Path2D(); @@ -1603,7 +1576,8 @@ class CanvasGraphics { ctx, this, getCurrentTransformInverse(ctx), - PathType.FILL + PathType.FILL, + opIdx ); if (baseTransform) { const newPath = new Path2D(); @@ -1759,7 +1733,7 @@ class CanvasGraphics { setFont(opIdx, fontRefName, size) { this.dependencyTracker ?.recordSimpleData("font", opIdx) - .recordNamedDependency(opIdx, fontRefName); + .recordSimpleDataFromNamed("fontObj", fontRefName, opIdx); const fontObj = this.commonObjs.get(fontRefName); const current = this.current; @@ -1841,7 +1815,9 @@ class CanvasGraphics { } setTextMatrix(opIdx, matrix) { - this.dependencyTracker?.recordSimpleData("textMatrix", opIdx); + this.dependencyTracker + ?.resetIncrementalData("sameLineText") + .recordSimpleData("textMatrix", opIdx); const { current } = this; current.textMatrix = matrix; current.textMatrixScale = Math.hypot(matrix[0], matrix[1]); @@ -2034,7 +2010,6 @@ class CanvasGraphics { if (this.dependencyTracker) { this.dependencyTracker .recordDependencies(opIdx, Dependencies.showText) - .copyDependenciesFromIncrementalOperation(opIdx, "sameLineText") .resetBBox(opIdx); if (this.current.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG) { this.dependencyTracker @@ -2047,9 +2022,7 @@ class CanvasGraphics { const font = current.font; if (font.isType3Font) { this.showType3Text(opIdx, glyphs); - this.dependencyTracker - ?.recordOperation(opIdx) - .recordIncrementalData("sameLineText", opIdx); + this.dependencyTracker?.recordShowTextOperation(opIdx); return undefined; } @@ -2089,26 +2062,41 @@ class CanvasGraphics { } let patternFillTransform, patternStrokeTransform; - if (current.patternFill) { + + // Only compute pattern transforms if the text rendering mode actually + // uses fill/stroke. This avoids expensive pattern calculations each call + // when a patternFill/patternStroke is set, but unused. + const fillStrokeMode = + current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + const needsFill = + fillStrokeMode === TextRenderingMode.FILL || + fillStrokeMode === TextRenderingMode.FILL_STROKE; + const needsStroke = + fillStrokeMode === TextRenderingMode.STROKE || + fillStrokeMode === TextRenderingMode.FILL_STROKE; + + if (needsFill && current.patternFill) { ctx.save(); const pattern = current.fillColor.getPattern( ctx, this, getCurrentTransformInverse(ctx), - PathType.FILL + PathType.FILL, + opIdx ); patternFillTransform = getCurrentTransform(ctx); ctx.restore(); ctx.fillStyle = pattern; } - if (current.patternStroke) { + if (needsStroke && current.patternStroke) { ctx.save(); const pattern = current.strokeColor.getPattern( ctx, this, getCurrentTransformInverse(ctx), - PathType.STROKE + PathType.STROKE, + opIdx ); patternStrokeTransform = getCurrentTransform(ctx); ctx.restore(); @@ -2118,12 +2106,7 @@ class CanvasGraphics { let lineWidth = current.lineWidth; const scale = current.textMatrixScale; if (scale === 0 || lineWidth === 0) { - const fillStrokeMode = - current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; - if ( - fillStrokeMode === TextRenderingMode.STROKE || - fillStrokeMode === TextRenderingMode.FILL_STROKE - ) { + if (needsStroke) { lineWidth = this.getSinglePixelWidth(); } } else { @@ -2157,8 +2140,7 @@ class CanvasGraphics { -measure.actualBoundingBoxAscent, measure.actualBoundingBoxDescent ) - .recordOperation(opIdx) - .recordIncrementalData("sameLineText", opIdx); + .recordShowTextOperation(opIdx); } current.x += width * widthAdvanceScale * textHScale; ctx.restore(); @@ -2277,9 +2259,7 @@ class CanvasGraphics { ctx.restore(); this.compose(); - this.dependencyTracker - ?.recordOperation(opIdx) - .recordIncrementalData("sameLineText", opIdx); + this.dependencyTracker?.recordShowTextOperation(opIdx); return undefined; } @@ -2351,7 +2331,6 @@ class CanvasGraphics { } ctx.restore(); if (dependencyTracker) { - this.dependencyTracker.recordNestedDependencies(); this.dependencyTracker = dependencyTracker; } } @@ -2378,7 +2357,7 @@ class CanvasGraphics { if (IR[0] === "TilingPattern") { const baseTransform = this.baseTransform || getCurrentTransform(this.ctx); const canvasGraphicsFactory = { - createCanvasGraphics: ctx => + createCanvasGraphics: (ctx, renderingOpIdx) => new CanvasGraphics( ctx, this.commonObjs, @@ -2392,7 +2371,11 @@ class CanvasGraphics { undefined, undefined, this.dependencyTracker - ? new CanvasNestedDependencyTracker(this.dependencyTracker, opIdx) + ? new CanvasNestedDependencyTracker( + this.dependencyTracker, + renderingOpIdx, + /* ignoreBBoxes */ true + ) : null ), }; @@ -2470,7 +2453,8 @@ class CanvasGraphics { ctx, this, getCurrentTransformInverse(ctx), - PathType.SHADING + PathType.SHADING, + opIdx ); const inv = getCurrentTransformInverse(ctx); @@ -2937,7 +2921,8 @@ class CanvasGraphics { maskCtx, this, getCurrentTransformInverse(ctx), - PathType.FILL + PathType.FILL, + opIdx ) : fillColor; maskCtx.fillRect(0, 0, width, height); diff --git a/src/display/canvas_dependency_tracker.js b/src/display/canvas_dependency_tracker.js index 2b5ff3ef06d14..0d391c40655de 100644 --- a/src/display/canvas_dependency_tracker.js +++ b/src/display/canvas_dependency_tracker.js @@ -2,10 +2,70 @@ import { Util } from "../shared/util.js"; const FORCED_DEPENDENCY_LABEL = "__forcedDependency"; +const { floor, ceil } = Math; + +function expandBBox(array, index, minX, minY, maxX, maxY) { + array[index * 4 + 0] = Math.min(array[index * 4 + 0], minX); + array[index * 4 + 1] = Math.min(array[index * 4 + 1], minY); + array[index * 4 + 2] = Math.max(array[index * 4 + 2], maxX); + array[index * 4 + 3] = Math.max(array[index * 4 + 3], maxY); +} + +// This is computed rathter than hard-coded to keep into +// account the platform's endianess. +const EMPTY_BBOX = new Uint32Array(new Uint8Array([255, 255, 0, 0]).buffer)[0]; + +class BBoxReader { + #bboxes; + + #coords; + + constructor(bboxes, coords) { + this.#bboxes = bboxes; + this.#coords = coords; + } + + get length() { + return this.#bboxes.length; + } + + isEmpty(i) { + return this.#bboxes[i] === EMPTY_BBOX; + } + + minX(i) { + return this.#coords[i * 4 + 0] / 256; + } + + minY(i) { + return this.#coords[i * 4 + 1] / 256; + } + + maxX(i) { + return (this.#coords[i * 4 + 2] + 1) / 256; + } + + maxY(i) { + return (this.#coords[i * 4 + 3] + 1) / 256; + } +} + +const ensureDebugMetadata = (map, key) => { + if (!map) { + return undefined; + } + let value = map.get(key); + if (!value) { + value = { dependencies: new Set(), isRenderingOperation: false }; + map.set(key, value); + } + return value; +}; + /** * @typedef {"lineWidth" | "lineCap" | "lineJoin" | "miterLimit" | "dash" | * "strokeAlpha" | "fillColor" | "fillAlpha" | "globalCompositeOperation" | - * "path" | "filter"} SimpleDependency + * "path" | "filter" | "font" | "fontObj"} SimpleDependency */ /** @@ -54,9 +114,38 @@ class CanvasDependencyTracker { #canvasHeight; - constructor(canvas) { + // Uint8ClampedArray + #bboxesCoords; + + #bboxes; + + #debugMetadata; + + constructor(canvas, operationsCount, recordDebugMetadata = false) { this.#canvasWidth = canvas.width; this.#canvasHeight = canvas.height; + this.#initializeBBoxes(operationsCount); + if (recordDebugMetadata) { + this.#debugMetadata = new Map(); + } + } + + growOperationsCount(operationsCount) { + if (operationsCount >= this.#bboxes.length) { + this.#initializeBBoxes(operationsCount, this.#bboxes); + } + } + + #initializeBBoxes(operationsCount, oldBBoxes) { + const buffer = new ArrayBuffer(operationsCount * 4); + this.#bboxesCoords = new Uint8ClampedArray(buffer); + this.#bboxes = new Uint32Array(buffer); + if (oldBBoxes && oldBBoxes.length > 0) { + this.#bboxes.set(oldBBoxes); + this.#bboxes.fill(EMPTY_BBOX, oldBBoxes.length); + } else { + this.#bboxes.fill(EMPTY_BBOX); + } } save(opIdx) { @@ -71,7 +160,7 @@ class CanvasDependencyTracker { }, }; this.#clipBox = { __proto__: this.#clipBox }; - this.#savesStack.push([opIdx, null]); + this.#savesStack.push(opIdx); return this; } @@ -87,9 +176,12 @@ class CanvasDependencyTracker { this.#incremental = Object.getPrototypeOf(this.#incremental); this.#clipBox = Object.getPrototypeOf(this.#clipBox); - const lastPair = this.#savesStack.pop(); - if (lastPair !== undefined) { - lastPair[1] = opIdx; + const lastSave = this.#savesStack.pop(); + if (lastSave !== undefined) { + ensureDebugMetadata(this.#debugMetadata, opIdx)?.dependencies.add( + lastSave + ); + this.#bboxes[opIdx] = this.#bboxes[lastSave]; } return this; @@ -99,7 +191,7 @@ class CanvasDependencyTracker { * @param {number} idx */ recordOpenMarker(idx) { - this.#savesStack.push([idx, null]); + this.#savesStack.push(idx); return this; } @@ -107,13 +199,16 @@ class CanvasDependencyTracker { if (this.#savesStack.length === 0) { return null; } - return this.#savesStack.at(-1)[0]; + return this.#savesStack.at(-1); } - recordCloseMarker(idx) { - const lastPair = this.#savesStack.pop(); - if (lastPair !== undefined) { - lastPair[1] = idx; + recordCloseMarker(opIdx) { + const lastSave = this.#savesStack.pop(); + if (lastSave !== undefined) { + ensureDebugMetadata(this.#debugMetadata, opIdx)?.dependencies.add( + lastSave + ); + this.#bboxes[opIdx] = this.#bboxes[lastSave]; } return this; } @@ -121,14 +216,17 @@ class CanvasDependencyTracker { // Marked content needs a separate stack from save/restore, because they // form two independent trees. beginMarkedContent(opIdx) { - this.#markedContentStack.push([opIdx, null]); + this.#markedContentStack.push(opIdx); return this; } endMarkedContent(opIdx) { - const lastPair = this.#markedContentStack.pop(); - if (lastPair !== undefined) { - lastPair[1] = opIdx; + const lastSave = this.#markedContentStack.pop(); + if (lastSave !== undefined) { + ensureDebugMetadata(this.#debugMetadata, opIdx)?.dependencies.add( + lastSave + ); + this.#bboxes[opIdx] = this.#bboxes[lastSave]; } return this; } @@ -182,6 +280,15 @@ class CanvasDependencyTracker { return this; } + /** + * @param {SimpleDependency} name + * @param {string} depName + * @param {number} fallbackIdx + */ + recordSimpleDataFromNamed(name, depName, fallbackIdx) { + this.#simple[name] = this.#namedDependencies.get(depName) ?? fallbackIdx; + } + // All next operations, until the next .restore(), will depend on this recordFutureForcedDependency(name, idx) { this.recordIncrementalData(FORCED_DEPENDENCY_LABEL, idx); @@ -207,18 +314,16 @@ class CanvasDependencyTracker { } resetBBox(idx) { - this.#pendingBBoxIdx = idx; - this.#pendingBBox[0] = Infinity; - this.#pendingBBox[1] = Infinity; - this.#pendingBBox[2] = -Infinity; - this.#pendingBBox[3] = -Infinity; + if (this.#pendingBBoxIdx !== idx) { + this.#pendingBBoxIdx = idx; + this.#pendingBBox[0] = Infinity; + this.#pendingBBox[1] = Infinity; + this.#pendingBBox[2] = -Infinity; + this.#pendingBBox[3] = -Infinity; + } return this; } - get hasPendingBBox() { - return this.#pendingBBoxIdx !== -1; - } - recordClipBox(idx, ctx, minX, maxX, minY, maxY) { const transform = Util.multiplyByDOMMatrix( this.#baseTransformStack.at(-1), @@ -384,20 +489,6 @@ class CanvasDependencyTracker { return this; } - copyDependenciesFromIncrementalOperation(idx, name) { - const operations = this.#operations; - const pendingDependencies = this.#pendingDependencies; - for (const depIdx of this.#incremental[name]) { - operations - .get(depIdx) - .dependencies.forEach( - pendingDependencies.add, - pendingDependencies.add(depIdx) - ); - } - return this; - } - recordNamedDependency(idx, name) { if (this.#namedDependencies.has(name)) { this.#pendingDependencies.add(this.#namedDependencies.get(name)); @@ -409,38 +500,74 @@ class CanvasDependencyTracker { /** * @param {number} idx */ - recordOperation(idx, preserveBbox = false) { + recordOperation(idx, preserve = false) { this.recordDependencies(idx, [FORCED_DEPENDENCY_LABEL]); - const dependencies = new Set(this.#pendingDependencies); - const pairs = this.#savesStack.concat(this.#markedContentStack); - const bbox = - this.#pendingBBoxIdx === idx - ? { - minX: this.#pendingBBox[0], - minY: this.#pendingBBox[1], - maxX: this.#pendingBBox[2], - maxY: this.#pendingBBox[3], - } - : null; - this.#operations.set(idx, { bbox, pairs, dependencies }); - if (!preserveBbox) { - this.#pendingBBoxIdx = -1; + + if (this.#debugMetadata) { + const metadata = ensureDebugMetadata(this.#debugMetadata, idx); + const { dependencies } = metadata; + this.#pendingDependencies.forEach(dependencies.add, dependencies); + this.#savesStack.forEach(dependencies.add, dependencies); + this.#markedContentStack.forEach(dependencies.add, dependencies); + dependencies.delete(idx); + metadata.isRenderingOperation = true; + } + + if (this.#pendingBBoxIdx === idx) { + const minX = floor((this.#pendingBBox[0] * 256) / this.#canvasWidth); + const minY = floor((this.#pendingBBox[1] * 256) / this.#canvasHeight); + const maxX = ceil((this.#pendingBBox[2] * 256) / this.#canvasWidth); + const maxY = ceil((this.#pendingBBox[3] * 256) / this.#canvasHeight); + + expandBBox(this.#bboxesCoords, idx, minX, minY, maxX, maxY); + for (const depIdx of this.#pendingDependencies) { + if (depIdx !== idx) { + expandBBox(this.#bboxesCoords, depIdx, minX, minY, maxX, maxY); + } + } + for (const saveIdx of this.#savesStack) { + if (saveIdx !== idx) { + expandBBox(this.#bboxesCoords, saveIdx, minX, minY, maxX, maxY); + } + } + for (const saveIdx of this.#markedContentStack) { + if (saveIdx !== idx) { + expandBBox(this.#bboxesCoords, saveIdx, minX, minY, maxX, maxY); + } + } + + if (!preserve) { + this.#pendingDependencies.clear(); + this.#pendingBBoxIdx = -1; + } } - this.#pendingDependencies.clear(); return this; } - bboxToClipBoxDropOperation(idx) { - if (this.#pendingBBoxIdx !== -1) { + recordShowTextOperation(idx, preserve = false) { + const deps = Array.from(this.#pendingDependencies); + this.recordOperation(idx, preserve); + this.recordIncrementalData("sameLineText", idx); + for (const dep of deps) { + this.recordIncrementalData("sameLineText", dep); + } + return this; + } + + bboxToClipBoxDropOperation(idx, preserve = false) { + if (this.#pendingBBoxIdx === idx) { this.#pendingBBoxIdx = -1; this.#clipBox[0] = Math.max(this.#clipBox[0], this.#pendingBBox[0]); this.#clipBox[1] = Math.max(this.#clipBox[1], this.#pendingBBox[1]); this.#clipBox[2] = Math.min(this.#clipBox[2], this.#pendingBBox[2]); this.#clipBox[3] = Math.min(this.#clipBox[3], this.#pendingBBox[3]); + + if (!preserve) { + this.#pendingDependencies.clear(); + } } - this.#pendingDependencies.clear(); return this; } @@ -464,21 +591,11 @@ class CanvasDependencyTracker { take() { this.#fontBBoxTrustworthy.clear(); - return Array.from( - this.#operations, - ([idx, { bbox, pairs, dependencies }]) => { - pairs.forEach(pair => pair.forEach(dependencies.add, dependencies)); - dependencies.delete(idx); - return { - minX: (bbox?.minX ?? 0) / this.#canvasWidth, - maxX: (bbox?.maxX ?? this.#canvasWidth) / this.#canvasWidth, - minY: (bbox?.minY ?? 0) / this.#canvasHeight, - maxY: (bbox?.maxY ?? this.#canvasHeight) / this.#canvasHeight, - dependencies: Array.from(dependencies).sort((a, b) => a - b), - idx, - }; - } - ); + return new BBoxReader(this.#bboxes, this.#bboxesCoords); + } + + takeDebugMetadata() { + return this.#debugMetadata; } } @@ -496,14 +613,17 @@ class CanvasNestedDependencyTracker { /** @type {number} */ #opIdx; - #nestingLevel = 0; + #ignoreBBoxes; - #outerDependencies; + #nestingLevel = 0; #savesLevel = 0; - constructor(dependencyTracker, opIdx) { - if (dependencyTracker instanceof CanvasNestedDependencyTracker) { + constructor(dependencyTracker, opIdx, ignoreBBoxes) { + if ( + dependencyTracker instanceof CanvasNestedDependencyTracker && + dependencyTracker.#ignoreBBoxes === !!ignoreBBoxes + ) { // The goal of CanvasNestedDependencyTracker is to collapse all operations // into a single one. If we are already in a // CanvasNestedDependencyTracker, that is already happening. @@ -511,8 +631,12 @@ class CanvasNestedDependencyTracker { } this.#dependencyTracker = dependencyTracker; - this.#outerDependencies = dependencyTracker._takePendingDependencies(); this.#opIdx = opIdx; + this.#ignoreBBoxes = !!ignoreBBoxes; + } + + growOperationsCount() { + throw new Error("Unreachable"); } save(opIdx) { @@ -595,6 +719,20 @@ class CanvasNestedDependencyTracker { return this; } + /** + * @param {SimpleDependency} name + * @param {string} depName + * @param {number} fallbackIdx + */ + recordSimpleDataFromNamed(name, depName, fallbackIdx) { + this.#dependencyTracker.recordSimpleDataFromNamed( + name, + depName, + this.#opIdx + ); + return this; + } + // All next operations, until the next .restore(), will depend on this recordFutureForcedDependency(name, idx) { this.#dependencyTracker.recordFutureForcedDependency(name, this.#opIdx); @@ -614,55 +752,59 @@ class CanvasNestedDependencyTracker { } resetBBox(idx) { - if (!this.#dependencyTracker.hasPendingBBox) { + if (!this.#ignoreBBoxes) { this.#dependencyTracker.resetBBox(this.#opIdx); } return this; } - get hasPendingBBox() { - return this.#dependencyTracker.hasPendingBBox; - } - recordClipBox(idx, ctx, minX, maxX, minY, maxY) { - this.#dependencyTracker.recordClipBox( - this.#opIdx, - ctx, - minX, - maxX, - minY, - maxY - ); + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordClipBox( + this.#opIdx, + ctx, + minX, + maxX, + minY, + maxY + ); + } return this; } recordBBox(idx, ctx, minX, maxX, minY, maxY) { - this.#dependencyTracker.recordBBox( - this.#opIdx, - ctx, - minX, - maxX, - minY, - maxY - ); + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordBBox( + this.#opIdx, + ctx, + minX, + maxX, + minY, + maxY + ); + } return this; } recordCharacterBBox(idx, ctx, font, scale, x, y, getMeasure) { - this.#dependencyTracker.recordCharacterBBox( - this.#opIdx, - ctx, - font, - scale, - x, - y, - getMeasure - ); + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordCharacterBBox( + this.#opIdx, + ctx, + font, + scale, + x, + y, + getMeasure + ); + } return this; } recordFullPageBBox(idx) { - this.#dependencyTracker.recordFullPageBBox(this.#opIdx); + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordFullPageBBox(this.#opIdx); + } return this; } @@ -675,14 +817,6 @@ class CanvasNestedDependencyTracker { return this; } - copyDependenciesFromIncrementalOperation(idx, name) { - this.#dependencyTracker.copyDependenciesFromIncrementalOperation( - this.#opIdx, - name - ); - return this; - } - recordNamedDependency(idx, name) { this.#dependencyTracker.recordNamedDependency(this.#opIdx, name); return this; @@ -694,27 +828,28 @@ class CanvasNestedDependencyTracker { */ recordOperation(idx) { this.#dependencyTracker.recordOperation(this.#opIdx, true); - const operation = this.#dependencyTracker._extractOperation(this.#opIdx); - for (const depIdx of operation.dependencies) { - this.#outerDependencies.add(depIdx); - } - this.#outerDependencies.delete(this.#opIdx); - this.#outerDependencies.delete(null); return this; } - bboxToClipBoxDropOperation(idx) { - this.#dependencyTracker.bboxToClipBoxDropOperation(this.#opIdx); + recordShowTextOperation(idx) { + this.#dependencyTracker.recordShowTextOperation(this.#opIdx, true); return this; } - recordNestedDependencies() { - this.#dependencyTracker._pushPendingDependencies(this.#outerDependencies); + bboxToClipBoxDropOperation(idx) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.bboxToClipBoxDropOperation(this.#opIdx, true); + } + return this; } take() { throw new Error("Unreachable"); } + + takeDebugMetadata() { + throw new Error("Unreachable"); + } } /** @satisfies {Record} */ @@ -759,6 +894,7 @@ const Dependencies = { "moveText", "textMatrix", "font", + "fontObj", "filter", "fillColor", "textRenderingMode", @@ -766,7 +902,8 @@ const Dependencies = { "fillAlpha", "strokeAlpha", "globalCompositeOperation", - // TODO: More + + "sameLineText", ], transform: ["transform"], transformAndFill: ["transform", "fillColor"], diff --git a/src/display/display_utils.js b/src/display/display_utils.js index 1db092a9d031a..e12c702a0c53b 100644 --- a/src/display/display_utils.js +++ b/src/display/display_utils.js @@ -15,11 +15,14 @@ import { BaseException, + DrawOPS, FeatureTest, + MathClamp, shadow, Util, warn, } from "../shared/util.js"; +import { XfaLayer } from "./xfa_layer.js"; const SVG_NS = "http://www.w3.org/2000/svg"; @@ -770,9 +773,495 @@ const SupportedImageMimeTypes = [ "image/x-icon", ]; +class ColorScheme { + static get isDarkMode() { + return shadow( + this, + "isDarkMode", + !!window?.matchMedia?.("(prefers-color-scheme: dark)").matches + ); + } +} + +class CSSConstants { + static get commentForegroundColor() { + const element = document.createElement("span"); + element.classList.add("comment", "sidebar"); + const { style } = element; + style.width = style.height = "0"; + style.display = "none"; + style.color = "var(--comment-fg-color)"; + document.body.append(element); + const { color } = window.getComputedStyle(element); + element.remove(); + return shadow(this, "commentForegroundColor", getRGB(color)); + } +} + +function applyOpacity(r, g, b, opacity) { + opacity = Math.min(Math.max(opacity ?? 1, 0), 1); + const white = 255 * (1 - opacity); + r = Math.round(r * opacity + white); + g = Math.round(g * opacity + white); + b = Math.round(b * opacity + white); + return [r, g, b]; +} + +function RGBToHSL(rgb, output) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const l = (max + min) / 2; + + if (max === min) { + // achromatic + output[0] = output[1] = 0; // hue and saturation are 0 + } else { + const d = max - min; + output[1] = l < 0.5 ? d / (max + min) : d / (2 - max - min); + // hue + switch (max) { + case r: + output[0] = ((g - b) / d + (g < b ? 6 : 0)) * 60; + break; + case g: + output[0] = ((b - r) / d + 2) * 60; + break; + case b: + output[0] = ((r - g) / d + 4) * 60; + break; + } + } + output[2] = l; +} + +function HSLToRGB(hsl, output) { + const h = hsl[0]; + const s = hsl[1]; + const l = hsl[2]; + const c = (1 - Math.abs(2 * l - 1)) * s; // chroma + const x = c * (1 - Math.abs(((h / 60) % 2) - 1)); + const m = l - c / 2; + + switch (Math.floor(h / 60)) { + case 0: + output[0] = c + m; + output[1] = x + m; + output[2] = m; + break; + case 1: + output[0] = x + m; + output[1] = c + m; + output[2] = m; + break; + case 2: + output[0] = m; + output[1] = c + m; + output[2] = x + m; + break; + case 3: + output[0] = m; + output[1] = x + m; + output[2] = c + m; + break; + case 4: + output[0] = x + m; + output[1] = m; + output[2] = c + m; + break; + case 5: + case 6: + output[0] = c + m; + output[1] = m; + output[2] = x + m; + break; + } +} + +function computeLuminance(x) { + return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; +} + +function contrastRatio(hsl1, hsl2, output) { + HSLToRGB(hsl1, output); + output.map(computeLuminance); + const lum1 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2]; + HSLToRGB(hsl2, output); + output.map(computeLuminance); + const lum2 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2]; + return lum1 > lum2 + ? (lum1 + 0.05) / (lum2 + 0.05) + : (lum2 + 0.05) / (lum1 + 0.05); +} + +// Cache for the findContrastColor function, to improve performance. +const contrastCache = new Map(); + +/** + * Find a color that has sufficient contrast against a fixed color. + * The luminance (in HSL color space) of the base color is adjusted + * until the contrast ratio between the base color and the fixed color + * is at least the minimum contrast ratio required by WCAG 2.1. + * @param {Array} baseColor + * @param {Array} fixedColor + * @returns {string} + */ +function findContrastColor(baseColor, fixedColor) { + const key = + baseColor[0] + + baseColor[1] * 0x100 + + baseColor[2] * 0x10000 + + fixedColor[0] * 0x1000000 + + fixedColor[1] * 0x100000000 + + fixedColor[2] * 0x10000000000; + let cachedValue = contrastCache.get(key); + if (cachedValue) { + return cachedValue; + } + const array = new Float32Array(9); + const output = array.subarray(0, 3); + const baseHSL = array.subarray(3, 6); + RGBToHSL(baseColor, baseHSL); + const fixedHSL = array.subarray(6, 9); + RGBToHSL(fixedColor, fixedHSL); + const isFixedColorDark = fixedHSL[2] < 0.5; + + // Use the contrast ratio requirements from WCAG 2.1. + // https://www.w3.org/TR/WCAG21/#contrast-minimum + // https://www.w3.org/TR/WCAG21/#contrast-enhanced + const minContrast = isFixedColorDark ? 12 : 4.5; + + baseHSL[2] = isFixedColorDark + ? Math.sqrt(baseHSL[2]) + : 1 - Math.sqrt(1 - baseHSL[2]); + + if (contrastRatio(baseHSL, fixedHSL, output) < minContrast) { + let start, end; + if (isFixedColorDark) { + start = baseHSL[2]; + end = 1; + } else { + start = 0; + end = baseHSL[2]; + } + const PRECISION = 0.005; + while (end - start > PRECISION) { + const mid = (baseHSL[2] = (start + end) / 2); + if ( + isFixedColorDark === + contrastRatio(baseHSL, fixedHSL, output) < minContrast + ) { + start = mid; + } else { + end = mid; + } + } + baseHSL[2] = isFixedColorDark ? end : start; + } + + HSLToRGB(baseHSL, output); + cachedValue = Util.makeHexColor( + Math.round(output[0] * 255), + Math.round(output[1] * 255), + Math.round(output[2] * 255) + ); + contrastCache.set(key, cachedValue); + return cachedValue; +} + +function renderRichText({ html, dir, className }, container) { + const fragment = document.createDocumentFragment(); + if (typeof html === "string") { + const p = document.createElement("p"); + p.dir = dir || "auto"; + const lines = html.split(/(?:\r\n?|\n)/); + for (let i = 0, ii = lines.length; i < ii; ++i) { + const line = lines[i]; + p.append(document.createTextNode(line)); + if (i < ii - 1) { + p.append(document.createElement("br")); + } + } + fragment.append(p); + } else { + XfaLayer.render({ + xfaHtml: html, + div: fragment, + intent: "richText", + }); + } + fragment.firstElementChild.classList.add("richText", className); + container.append(fragment); +} + +function makePathFromDrawOPS(data) { + // Using a SVG string is slightly slower than using the following loop. + const path = new Path2D(); + if (!data) { + return path; + } + for (let i = 0, ii = data.length; i < ii; ) { + switch (data[i++]) { + case DrawOPS.moveTo: + path.moveTo(data[i++], data[i++]); + break; + case DrawOPS.lineTo: + path.lineTo(data[i++], data[i++]); + break; + case DrawOPS.curveTo: + path.bezierCurveTo( + data[i++], + data[i++], + data[i++], + data[i++], + data[i++], + data[i++] + ); + break; + case DrawOPS.quadraticCurveTo: + path.quadraticCurveTo(data[i++], data[i++], data[i++], data[i++]); + break; + case DrawOPS.closePath: + path.closePath(); + break; + default: + warn(`Unrecognized drawing path operator: ${data[i - 1]}`); + break; + } + } + return path; +} + +/** + * Maps between page IDs and page numbers, allowing bidirectional conversion + * between the two representations. This is useful when the page numbering + * in the PDF document doesn't match the default sequential ordering. + */ +class PagesMapper { + /** + * Maps page IDs to their corresponding page numbers. + * @type {Uint32Array|null} + */ + static #idToPageNumber = null; + + /** + * Maps page numbers to their corresponding page IDs. + * @type {Uint32Array|null} + */ + static #pageNumberToId = null; + + /** + * Previous mapping of page IDs to page numbers. + * @type {Uint32Array|null} + */ + static #prevIdToPageNumber = null; + + /** + * The total number of pages. + * @type {number} + */ + static #pagesNumber = 0; + + /** + * Listeners for page changes. + * @type {Array} + */ + static #listeners = []; + + /** + * Gets the total number of pages. + * @returns {number} The number of pages. + */ + get pagesNumber() { + return PagesMapper.#pagesNumber; + } + + /** + * Sets the total number of pages and initializes default mappings + * where page IDs equal page numbers (1-indexed). + * @param {number} n - The total number of pages. + */ + set pagesNumber(n) { + if (PagesMapper.#pagesNumber === n) { + return; + } + PagesMapper.#pagesNumber = n; + if (n === 0) { + PagesMapper.#pageNumberToId = null; + PagesMapper.#idToPageNumber = null; + } + } + + addListener(listener) { + PagesMapper.#listeners.push(listener); + } + + removeListener(listener) { + const index = PagesMapper.#listeners.indexOf(listener); + if (index >= 0) { + PagesMapper.#listeners.splice(index, 1); + } + } + + #updateListeners() { + for (const listener of PagesMapper.#listeners) { + listener(); + } + } + + #init(mustInit) { + if (PagesMapper.#pageNumberToId) { + return; + } + const n = PagesMapper.#pagesNumber; + + // Allocate a single array for better memory locality. + const array = new Uint32Array(3 * n); + const pageNumberToId = (PagesMapper.#pageNumberToId = array.subarray(0, n)); + const idToPageNumber = (PagesMapper.#idToPageNumber = array.subarray( + n, + 2 * n + )); + if (mustInit) { + for (let i = 0; i < n; i++) { + pageNumberToId[i] = idToPageNumber[i] = i + 1; + } + } + PagesMapper.#prevIdToPageNumber = array.subarray(2 * n); + } + + /** + * Move a set of pages to a new position while keeping ID→number mappings in + * sync. + * + * @param {Set} selectedPages - Page numbers being moved (1-indexed). + * @param {number[]} pagesToMove - Ordered list of page numbers to move. + * @param {number} index - Zero-based insertion index in the page-number list. + */ + movePages(selectedPages, pagesToMove, index) { + this.#init(true); + const pageNumberToId = PagesMapper.#pageNumberToId; + const idToPageNumber = PagesMapper.#idToPageNumber; + PagesMapper.#prevIdToPageNumber.set(idToPageNumber); + const movedCount = pagesToMove.length; + const mappedPagesToMove = new Uint32Array(movedCount); + let removedBeforeTarget = 0; + + for (let i = 0; i < movedCount; i++) { + const pageIndex = pagesToMove[i] - 1; + mappedPagesToMove[i] = pageNumberToId[pageIndex]; + if (pageIndex < index) { + removedBeforeTarget += 1; + } + } + + const pagesNumber = PagesMapper.#pagesNumber; + // target index after removing elements that were before it + let adjustedTarget = index - removedBeforeTarget; + const remainingLen = pagesNumber - movedCount; + adjustedTarget = MathClamp(adjustedTarget, 0, remainingLen); + + // Create the new mapping. + // First copy over the pages that are not being moved. + // Then insert the moved pages at the target position. + for (let i = 0, r = 0; i < pagesNumber; i++) { + if (!selectedPages.has(i + 1)) { + pageNumberToId[r++] = pageNumberToId[i]; + } + } + + // Shift the pages after the target position. + pageNumberToId.copyWithin( + adjustedTarget + movedCount, + adjustedTarget, + remainingLen + ); + // Finally insert the moved pages. + pageNumberToId.set(mappedPagesToMove, adjustedTarget); + + let hasChanged = false; + for (let i = 0, ii = pagesNumber; i < ii; i++) { + const id = pageNumberToId[i]; + hasChanged ||= id !== i + 1; + idToPageNumber[id - 1] = i + 1; + } + this.#updateListeners(); + + if (!hasChanged) { + // Reset. + this.pagesNumber = 0; + } + } + + /** + * Checks if the page mappings have been altered from their initial state. + * @returns {boolean} True if the mappings have been altered, false otherwise. + */ + hasBeenAltered() { + return PagesMapper.#pageNumberToId !== null; + } + + /** + * Gets the current page mapping suitable for saving. + * @returns {Object} An object containing the page indices. + */ + getPageMappingForSaving() { + // Saving is index-based. + return { + pageIndices: PagesMapper.#idToPageNumber + ? PagesMapper.#idToPageNumber.map(x => x - 1) + : null, + }; + } + + getPrevPageNumber(pageNumber) { + return PagesMapper.#prevIdToPageNumber[ + PagesMapper.#pageNumberToId[pageNumber - 1] - 1 + ]; + } + + /** + * Gets the page number for a given page ID. + * @param {number} id - The page ID (1-indexed). + * @returns {number} The page number, or the ID itself if no mapping exists. + */ + getPageNumber(id) { + return PagesMapper.#idToPageNumber?.[id - 1] ?? id; + } + + /** + * Gets the page ID for a given page number. + * @param {number} pageNumber - The page number (1-indexed). + * @returns {number} The page ID, or the page number itself if no mapping + * exists. + */ + getPageId(pageNumber) { + return PagesMapper.#pageNumberToId?.[pageNumber - 1] ?? pageNumber; + } + + /** + * Gets or creates a singleton instance of PagesMapper. + * @returns {PagesMapper} The singleton instance. + */ + static get instance() { + return shadow(this, "instance", new PagesMapper()); + } + + getMapping() { + return PagesMapper.#pageNumberToId.subarray(0, this.pagesNumber); + } +} + export { + applyOpacity, + ColorScheme, + CSSConstants, deprecated, fetchData, + findContrastColor, getColorValues, getCurrentTransform, getCurrentTransformInverse, @@ -783,12 +1272,15 @@ export { isDataScheme, isPdfFile, isValidFetchUrl, + makePathFromDrawOPS, noContextMenu, OutputScale, + PagesMapper, PageViewport, PDFDateString, PixelsPerInch, RenderingCancelledException, + renderRichText, setLayerDimensions, StatTimer, stopEvent, diff --git a/src/display/draw_layer.js b/src/display/draw_layer.js index 3c763f443f923..78b338c6de4b6 100644 --- a/src/display/draw_layer.js +++ b/src/display/draw_layer.js @@ -30,10 +30,6 @@ class DrawLayer { static #id = 0; - constructor({ pageIndex }) { - this.pageIndex = pageIndex; - } - setParent(parent) { if (!this.#parent) { this.#parent = parent; @@ -103,7 +99,7 @@ class DrawLayer { root.append(defs); const path = DrawLayer._svgFactory.createElement("path"); defs.append(path); - const pathId = `path_p${this.pageIndex}_${id}`; + const pathId = `path_${id}`; path.setAttribute("id", pathId); path.setAttribute("vector-effect", "non-scaling-stroke"); @@ -135,7 +131,7 @@ class DrawLayer { root.append(defs); const path = DrawLayer._svgFactory.createElement("path"); defs.append(path); - const pathId = `path_p${this.pageIndex}_${id}`; + const pathId = `path_${id}`; path.setAttribute("id", pathId); path.setAttribute("vector-effect", "non-scaling-stroke"); @@ -143,7 +139,7 @@ class DrawLayer { if (mustRemoveSelfIntersections) { const mask = DrawLayer._svgFactory.createElement("mask"); defs.append(mask); - maskId = `mask_p${this.pageIndex}_${id}`; + maskId = `mask_${id}`; mask.setAttribute("id", maskId); mask.setAttribute("maskUnits", "objectBoundingBox"); const rect = DrawLayer._svgFactory.createElement("rect"); @@ -208,8 +204,8 @@ class DrawLayer { } } if (path) { - const defs = element.firstChild; - const pathElement = defs.firstChild; + const defs = element.firstElementChild; + const pathElement = defs.firstElementChild; this.#updateProperties(pathElement, path); } } diff --git a/src/display/editor/annotation_editor_layer.js b/src/display/editor/annotation_editor_layer.js index 4742fe0c4bb36..a740d3952f514 100644 --- a/src/display/editor/annotation_editor_layer.js +++ b/src/display/editor/annotation_editor_layer.js @@ -144,6 +144,10 @@ class AnnotationEditorLayer { this.#uiManager.addLayer(this); } + updatePageIndex(newPageIndex) { + this.pageIndex = newPageIndex; + } + get isEmpty() { return this.#editors.size === 0; } @@ -170,6 +174,7 @@ class AnnotationEditorLayer { this.#cleanup(); switch (mode) { case AnnotationEditorType.NONE: + this.div.classList.toggle("nonEditing", true); this.disableTextSelection(); this.togglePointerEvents(false); this.toggleAnnotationLayerPointerEvents(true); @@ -193,11 +198,17 @@ class AnnotationEditorLayer { this.toggleAnnotationLayerPointerEvents(false); const { classList } = this.div; - for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { - classList.toggle( - `${editorType._type}Editing`, - mode === editorType._editorType - ); + classList.toggle("nonEditing", false); + if (mode === AnnotationEditorType.POPUP) { + classList.toggle("commentEditing", true); + } else { + classList.toggle("commentEditing", false); + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.toggle( + `${editorType._type}Editing`, + mode === editorType._editorType + ); + } } this.div.hidden = false; } @@ -235,7 +246,13 @@ class AnnotationEditorLayer { } toggleAnnotationLayerPointerEvents(enabled = false) { - this.#annotationLayer?.div.classList.toggle("disabled", !enabled); + this.#annotationLayer?.togglePointerEvents(enabled); + } + + get #allEditorsIterator() { + return this.#editors.size !== 0 + ? this.#editors.values() + : this.#uiManager.getEditors(this.pageIndex); } /** @@ -246,10 +263,11 @@ class AnnotationEditorLayer { this.#isEnabling = true; this.div.tabIndex = 0; this.togglePointerEvents(true); + this.div.classList.toggle("nonEditing", false); this.#textLayerDblClickAC?.abort(); this.#textLayerDblClickAC = null; const annotationElementIds = new Set(); - for (const editor of this.#editors.values()) { + for (const editor of this.#allEditorsIterator) { editor.enableEditing(); editor.show(true); if (editor.annotationElementId) { @@ -258,29 +276,30 @@ class AnnotationEditorLayer { } } - if (!this.#annotationLayer) { - this.#isEnabling = false; - return; - } - - const editables = this.#annotationLayer.getEditableAnnotations(); - for (const editable of editables) { - // The element must be hidden whatever its state is. - editable.hide(); - if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) { - continue; - } - if (annotationElementIds.has(editable.data.id)) { - continue; - } - const editor = await this.deserialize(editable); - if (!editor) { - continue; + const annotationLayer = this.#annotationLayer; + if (annotationLayer) { + for (const editable of annotationLayer.getEditableAnnotations()) { + // The element must be hidden whatever its state is. + editable.hide(); + if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) { + continue; + } + if (annotationElementIds.has(editable.data.id)) { + continue; + } + const editor = await this.deserialize(editable); + if (!editor) { + continue; + } + this.addOrRebuild(editor); + editor.enableEditing(); } - this.addOrRebuild(editor); - editor.enableEditing(); } this.#isEnabling = false; + this.#uiManager._eventBus.dispatch("editorsrendered", { + source: this, + pageNumber: this.pageIndex + 1, + }); } /** @@ -290,6 +309,7 @@ class AnnotationEditorLayer { this.#isDisabling = true; this.div.tabIndex = -1; this.togglePointerEvents(false); + this.div.classList.toggle("nonEditing", true); if (this.#textLayer && !this.#textLayerDblClickAC) { this.#textLayerDblClickAC = new AbortController(); const signal = this.#uiManager.combinedSignal(this.#textLayerDblClickAC); @@ -330,32 +350,36 @@ class AnnotationEditorLayer { if (editor?.annotationElementId === null) { e.stopPropagation(); e.preventDefault(); - editor.dblclick(); + editor.dblclick(e); } }, { signal, capture: true } ); } - const changedAnnotations = new Map(); - const resetAnnotations = new Map(); - for (const editor of this.#editors.values()) { - editor.disableEditing(); - if (!editor.annotationElementId) { - continue; - } - if (editor.serialize() !== null) { - changedAnnotations.set(editor.annotationElementId, editor); - continue; - } else { - resetAnnotations.set(editor.annotationElementId, editor); + + const annotationLayer = this.#annotationLayer; + const needFakeAnnotation = []; + if (annotationLayer) { + const changedAnnotations = new Map(); + const resetAnnotations = new Map(); + for (const editor of this.#allEditorsIterator) { + editor.disableEditing(); + if (!editor.annotationElementId) { + needFakeAnnotation.push(editor); + continue; + } + if (editor.serialize() !== null) { + changedAnnotations.set(editor.annotationElementId, editor); + continue; + } else { + resetAnnotations.set(editor.annotationElementId, editor); + } + this.getEditableAnnotation(editor.annotationElementId)?.show(); + editor.remove(); } - this.getEditableAnnotation(editor.annotationElementId)?.show(); - editor.remove(); - } - if (this.#annotationLayer) { // Show the annotations that were hidden in enable(). - const editables = this.#annotationLayer.getEditableAnnotations(); + const editables = annotationLayer.getEditableAnnotations(); for (const editable of editables) { const { id } = editable.data; if (this.#uiManager.isDeletedAnnotationElement(id)) { @@ -392,6 +416,7 @@ class AnnotationEditorLayer { } this.disableTextSelection(); this.toggleAnnotationLayerPointerEvents(true); + annotationLayer?.updateFakeAnnotations(needFakeAnnotation); this.#isDisabling = false; } @@ -540,7 +565,7 @@ class AnnotationEditorLayer { } if (editor.parent && editor.annotationElementId) { - this.#uiManager.addDeletedAnnotationElement(editor.annotationElementId); + this.#uiManager.addDeletedAnnotationElement(editor); AnnotationEditor.deleteAnnotationElement(editor); editor.annotationElementId = null; } @@ -643,6 +668,15 @@ class AnnotationEditorLayer { this.addCommands({ cmd, undo, mustExec: false }); } + getEditorByUID(uid) { + for (const editor of this.#editors.values()) { + if (editor.uid === uid) { + return editor; + } + } + return null; + } + /** * Get an id for an editor. * @returns {string} @@ -701,7 +735,7 @@ class AnnotationEditorLayer { /** * Create a new editor * @param {Object} data - * @returns {AnnotationEditor | null} + * @returns {Promise} */ async deserialize(data) { return ( @@ -736,8 +770,12 @@ class AnnotationEditorLayer { return editor; } + get boundingClientRect() { + return this.div.getBoundingClientRect(); + } + #getCenterPoint() { - const { x, y, width, height } = this.div.getBoundingClientRect(); + const { x, y, width, height } = this.boundingClientRect; const tlX = Math.max(0, x); const tlY = Math.max(0, y); const brX = Math.min(window.innerWidth, x + width); diff --git a/src/display/editor/color_picker.js b/src/display/editor/color_picker.js index 0633051841827..e7561516b7300 100644 --- a/src/display/editor/color_picker.js +++ b/src/display/editor/color_picker.js @@ -183,7 +183,7 @@ class ColorPicker { return; } if (event.target === this.#button) { - this.#dropdown.firstChild?.focus(); + this.#dropdown.firstElementChild?.focus(); return; } event.target.nextSibling?.focus(); @@ -191,7 +191,7 @@ class ColorPicker { _moveToPrevious(event) { if ( - event.target === this.#dropdown?.firstChild || + event.target === this.#dropdown?.firstElementChild || event.target === this.#button ) { if (this.#isDropdownVisible) { @@ -210,7 +210,7 @@ class ColorPicker { this.#openDropdown(event); return; } - this.#dropdown.firstChild?.focus(); + this.#dropdown.firstElementChild?.focus(); } _moveToEnd(event) { @@ -218,7 +218,7 @@ class ColorPicker { this.#openDropdown(event); return; } - this.#dropdown.lastChild?.focus(); + this.#dropdown.lastElementChild?.focus(); } #keyDown(event) { @@ -334,10 +334,10 @@ class BasicColorPicker { if (this.#input) { return this.#input; } - const { editorType, colorType, colorValue } = this.#editor; + const { editorType, colorType, color } = this.#editor; const input = (this.#input = document.createElement("input")); input.type = "color"; - input.value = colorValue || "#000000"; + input.value = color || "#000000"; input.className = "basicColorPicker"; input.tabIndex = 0; input.setAttribute("data-l10n-id", BasicColorPicker.#l10nColor[editorType]); diff --git a/src/display/editor/comment.js b/src/display/editor/comment.js index 230ff0e553752..5f73e3e5bca6d 100644 --- a/src/display/editor/comment.js +++ b/src/display/editor/comment.js @@ -13,10 +13,12 @@ * limitations under the License. */ -import { noContextMenu } from "../display_utils.js"; +import { noContextMenu, stopEvent } from "../display_utils.js"; class Comment { - #commentButton = null; + #commentStandaloneButton = null; + + #commentToolbarButton = null; #commentWasFromKeyBoard = false; @@ -24,26 +26,136 @@ class Comment { #initialText = null; + #richText = null; + #text = null; #date = null; #deleted = false; + #popupPosition = null; + constructor(editor) { this.#editor = editor; - this.toolbar = null; } - render() { + renderForToolbar() { + const button = (this.#commentToolbarButton = + document.createElement("button")); + button.className = "comment"; + return this.#render(button, false); + } + + renderForStandalone() { + const button = (this.#commentStandaloneButton = + document.createElement("button")); + button.className = "annotationCommentButton"; + + const position = this.#editor.commentButtonPosition; + if (position) { + const { style } = button; + style.insetInlineEnd = `calc(${ + 100 * + (this.#editor._uiManager.direction === "ltr" + ? 1 - position[0] + : position[0]) + }% - var(--comment-button-dim))`; + style.top = `calc(${100 * position[1]}% - var(--comment-button-dim))`; + const color = this.#editor.commentButtonColor; + if (color) { + style.backgroundColor = color; + } + } + + return this.#render(button, true); + } + + focusButton() { + setTimeout(() => { + (this.#commentStandaloneButton ?? this.#commentToolbarButton)?.focus(); + }, 0); + } + + onUpdatedColor() { + if (!this.#commentStandaloneButton) { + return; + } + const color = this.#editor.commentButtonColor; + if (color) { + this.#commentStandaloneButton.style.backgroundColor = color; + } + this.#editor._uiManager.updatePopupColor(this.#editor); + } + + get commentButtonWidth() { + return ( + (this.#commentStandaloneButton?.getBoundingClientRect().width ?? 0) / + this.#editor.parent.boundingClientRect.width + ); + } + + get commentPopupPositionInLayer() { + if (this.#popupPosition) { + return this.#popupPosition; + } + if (!this.#commentStandaloneButton) { + return null; + } + const { x, y, height } = + this.#commentStandaloneButton.getBoundingClientRect(); + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight, + } = this.#editor.parent.boundingClientRect; + return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight]; + } + + set commentPopupPositionInLayer(pos) { + this.#popupPosition = pos; + } + + hasDefaultPopupPosition() { + return this.#popupPosition === null; + } + + removeStandaloneCommentButton() { + this.#commentStandaloneButton?.remove(); + this.#commentStandaloneButton = null; + } + + removeToolbarCommentButton() { + this.#commentToolbarButton?.remove(); + this.#commentToolbarButton = null; + } + + setCommentButtonStates({ selected, hasPopup }) { + if (!this.#commentStandaloneButton) { + return; + } + this.#commentStandaloneButton.classList.toggle("selected", selected); + this.#commentStandaloneButton.ariaExpanded = hasPopup; + } + + #render(comment, isStandalone) { if (!this.#editor._uiManager.hasCommentManager()) { return null; } - const comment = (this.#commentButton = document.createElement("button")); - comment.className = "comment"; comment.tabIndex = "0"; - comment.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-button"); + comment.ariaHasPopup = "dialog"; + + if (isStandalone) { + comment.ariaControls = "commentPopup"; + comment.setAttribute("data-l10n-id", "pdfjs-show-comment-button"); + } else { + comment.ariaControlsElements = [ + this.#editor._uiManager.getCommentDialogElement(), + ]; + comment.setAttribute("data-l10n-id", "pdfjs-editor-add-comment-button"); + } const signal = this.#editor._uiManager._signal; if (!(signal instanceof AbortSignal) || signal.aborted) { @@ -51,13 +163,41 @@ class Comment { } comment.addEventListener("contextmenu", noContextMenu, { signal }); + if (isStandalone) { + comment.addEventListener( + "focusin", + e => { + this.#editor._focusEventsAllowed = false; + stopEvent(e); + }, + { + capture: true, + signal, + } + ); + comment.addEventListener( + "focusout", + e => { + this.#editor._focusEventsAllowed = true; + stopEvent(e); + }, + { + capture: true, + signal, + } + ); + } comment.addEventListener("pointerdown", event => event.stopPropagation(), { signal, }); const onClick = event => { event.preventDefault(); - this.edit(); + if (comment === this.#commentToolbarButton) { + this.edit(); + } else { + this.#editor.toggleComment(/* isSelected = */ true); + } }; comment.addEventListener("click", onClick, { capture: true, signal }); comment.addEventListener( @@ -71,25 +211,64 @@ class Comment { { signal } ); + comment.addEventListener( + "pointerenter", + () => { + this.#editor.toggleComment( + /* isSelected = */ false, + /* visibility = */ true + ); + }, + { signal } + ); + comment.addEventListener( + "pointerleave", + () => { + this.#editor.toggleComment( + /* isSelected = */ false, + /* visibility = */ false + ); + }, + { signal } + ); + return comment; } - edit() { - const { bottom, left, right } = this.#editor.getClientDimensions(); - const position = { top: bottom }; - if (this.#editor._uiManager.direction === "ltr") { - position.right = right; + edit(options) { + const position = this.commentPopupPositionInLayer; + let posX, posY; + if (position) { + [posX, posY] = position; } else { - position.left = left; + // The position is in the editor coordinates. + [posX, posY] = this.#editor.commentButtonPosition; + const { width, height, x, y } = this.#editor; + posX = x + posX * width; + posY = y + posY * height; } - this.#editor._uiManager.editComment(this.#editor, position); + const parentDimensions = this.#editor.parent.boundingClientRect; + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight, + } = parentDimensions; + this.#editor._uiManager.editComment( + this.#editor, + parentX + posX * parentWidth, + parentY + posY * parentHeight, + { ...options, parentDimensions } + ); } finish() { - if (!this.#commentButton) { + if (!this.#commentToolbarButton) { return; } - this.#commentButton.focus({ focusVisible: this.#commentWasFromKeyBoard }); + this.#commentToolbarButton.focus({ + focusVisible: this.#commentWasFromKeyBoard, + }); this.#commentWasFromKeyBoard = false; } @@ -97,6 +276,10 @@ class Comment { return this.#deleted || this.#text === ""; } + isEmpty() { + return this.#text === null; + } + hasBeenEdited() { return this.isDeleted() || this.#text !== this.#initialText; } @@ -108,8 +291,9 @@ class Comment { get data() { return { text: this.#text, + richText: this.#richText, date: this.#date, - deleted: this.#deleted, + deleted: this.isDeleted(), }; } @@ -117,6 +301,9 @@ class Comment { * Set the comment data. */ set data(text) { + if (text !== this.#text) { + this.#richText = null; + } if (text === null) { this.#text = ""; this.#deleted = true; @@ -127,24 +314,36 @@ class Comment { this.#deleted = false; } - setInitialText(text) { - this.#initialText = text; - this.data = text; + /** + * Restore the comment data (used for undo). + * @param {Object} data - The comment data to restore. + * @param {string} data.text - The comment text. + * @param {string|null} data.richText - The rich text content. + * @param {Date|null} data.date - The original date. + */ + restoreData({ text, richText, date }) { + this.#text = text; + this.#richText = richText; + this.#date = date; + this.#deleted = false; } - toggle(enabled = false) { - if (!this.#commentButton) { - return; - } - this.#commentButton.disabled = !enabled; + setInitialText(text, richText = null) { + this.#initialText = text; + this.data = text; + this.#date = null; + this.#richText = richText; } shown() {} destroy() { - this.#commentButton?.remove(); - this.#commentButton = null; + this.#commentToolbarButton?.remove(); + this.#commentToolbarButton = null; + this.#commentStandaloneButton?.remove(); + this.#commentStandaloneButton = null; this.#text = ""; + this.#richText = null; this.#date = null; this.#editor = null; this.#commentWasFromKeyBoard = false; diff --git a/src/display/editor/draw.js b/src/display/editor/draw.js index 2ef5640766bfb..778b1d73f16f0 100644 --- a/src/display/editor/draw.js +++ b/src/display/editor/draw.js @@ -16,6 +16,7 @@ import { AnnotationEditorParamsType, unreachable } from "../../shared/util.js"; import { noContextMenu, stopEvent } from "../display_utils.js"; import { AnnotationEditor } from "./editor.js"; +import { CurrentPointers } from "./tools.js"; class DrawingOptions { #svgProperties = Object.create(null); @@ -81,14 +82,6 @@ class DrawingEditor extends AnnotationEditor { static #currentDrawingOptions = null; - static #currentPointerId = NaN; - - static #currentPointerType = null; - - static #currentPointerIds = null; - - static #currentMoveTimestamp = NaN; - static _INNER_MARGIN = 3; constructor(params) { @@ -98,6 +91,12 @@ class DrawingEditor extends AnnotationEditor { this._addOutlines(params); } + /** @inheritdoc */ + onUpdatedColor() { + this._colorPicker?.update(this.color); + super.onUpdatedColor(); + } + _addOutlines(params) { if (params.drawOutlines) { this.#createDrawOutlines(params); @@ -243,7 +242,7 @@ class DrawingEditor extends AnnotationEditor { options.toSVGProperties() ); if (type === this.colorType) { - this._colorPicker?.update(val); + this.onUpdatedColor(); } }; this.addCommands({ @@ -488,8 +487,7 @@ class DrawingEditor extends AnnotationEditor { this.#convertToParentSpace(bbox); if (this.div) { this.fixAndSetPosition(); - const [parentWidth, parentHeight] = this.parentDimensions; - this.setDims(this.width * parentWidth, this.height * parentHeight); + this.setDims(); } this._onResized(); } @@ -649,8 +647,7 @@ class DrawingEditor extends AnnotationEditor { div.append(drawDiv); drawDiv.setAttribute("aria-hidden", "true"); drawDiv.className = "internal"; - const [parentWidth, parentHeight] = this.parentDimensions; - this.setDims(this.width * parentWidth, this.height * parentHeight); + this.setDims(); this._uiManager.addShouldRescale(this); this.disableEditing(); @@ -674,20 +671,15 @@ class DrawingEditor extends AnnotationEditor { } static startDrawing(parent, uiManager, _isLTR, event) { - // The _currentPointerType is set when the user starts an empty drawing - // session. If, in the same drawing session, the user starts using a + // The pointerType of CurrentPointer is set when the user starts an empty + // drawing session. If, in the same drawing session, the user starts using a // different type of pointer (e.g. a pen and then a finger), we just return. // - // The _currentPointerId and _currentPointerIds are used to keep track of - // the pointers with a same type (e.g. two fingers). If the user starts to - // draw with a finger and then uses a second finger, we just stop the - // current drawing and let the user zoom the document. + // If the user starts to draw with a finger and then uses a second finger, + // we just stop the current drawing and let the user zoom the document. const { target, offsetX: x, offsetY: y, pointerId, pointerType } = event; - if ( - DrawingEditor.#currentPointerType && - DrawingEditor.#currentPointerType !== pointerType - ) { + if (CurrentPointers.isInitializedAndDifferentPointerType(pointerType)) { return; } @@ -700,16 +692,13 @@ class DrawingEditor extends AnnotationEditor { const ac = (DrawingEditor.#currentDrawingAC = new AbortController()); const signal = parent.combinedSignal(ac); - DrawingEditor.#currentPointerId ||= pointerId; - DrawingEditor.#currentPointerType ??= pointerType; + CurrentPointers.setPointer(pointerType, pointerId); window.addEventListener( "pointerup", e => { - if (DrawingEditor.#currentPointerId === e.pointerId) { + if (CurrentPointers.isSamePointerIdOrRemove(e.pointerId)) { this._endDraw(e); - } else { - DrawingEditor.#currentPointerIds?.delete(e.pointerId); } }, { signal } @@ -717,10 +706,8 @@ class DrawingEditor extends AnnotationEditor { window.addEventListener( "pointercancel", e => { - if (DrawingEditor.#currentPointerId === e.pointerId) { + if (CurrentPointers.isSamePointerIdOrRemove(e.pointerId)) { this._currentParent.endDrawingSession(); - } else { - DrawingEditor.#currentPointerIds?.delete(e.pointerId); } }, { signal } @@ -728,14 +715,14 @@ class DrawingEditor extends AnnotationEditor { window.addEventListener( "pointerdown", e => { - if (DrawingEditor.#currentPointerType !== e.pointerType) { + if (!CurrentPointers.isSamePointerType(e.pointerType)) { // For example, we started with a pen and the user // is now using a finger. return; } // For example, the user is using a second finger. - (DrawingEditor.#currentPointerIds ||= new Set()).add(e.pointerId); + CurrentPointers.initializeAndAddPointerId(e.pointerId); // The first finger created a first point and a second finger just // started, so we stop the drawing and remove this only point. @@ -761,7 +748,7 @@ class DrawingEditor extends AnnotationEditor { target.addEventListener( "touchmove", e => { - if (e.timeStamp === DrawingEditor.#currentMoveTimestamp) { + if (CurrentPointers.isSameTimeStamp(e.timeStamp)) { // This move event is used to draw so we don't want to scroll. stopEvent(e); } @@ -808,16 +795,16 @@ class DrawingEditor extends AnnotationEditor { } static _drawMove(event) { - DrawingEditor.#currentMoveTimestamp = -1; + CurrentPointers.isSameTimeStamp(event.timeStamp); if (!DrawingEditor.#currentDraw) { return; } const { offsetX, offsetY, pointerId } = event; - if (DrawingEditor.#currentPointerId !== pointerId) { + if (!CurrentPointers.isSamePointerId(pointerId)) { return; } - if (DrawingEditor.#currentPointerIds?.size >= 1) { + if (CurrentPointers.isUsingMultiplePointers()) { // The user is using multiple fingers and the first one is moving. this._endDraw(event); return; @@ -827,7 +814,7 @@ class DrawingEditor extends AnnotationEditor { DrawingEditor.#currentDraw.add(offsetX, offsetY) ); // We track the timestamp to know if the touchmove event is used to draw. - DrawingEditor.#currentMoveTimestamp = event.timeStamp; + CurrentPointers.setTimeStamp(event.timeStamp); stopEvent(event); } @@ -837,15 +824,13 @@ class DrawingEditor extends AnnotationEditor { this._currentParent = null; DrawingEditor.#currentDraw = null; DrawingEditor.#currentDrawingOptions = null; - DrawingEditor.#currentPointerType = null; - DrawingEditor.#currentMoveTimestamp = NaN; + CurrentPointers.clearTimeStamp(); } if (DrawingEditor.#currentDrawingAC) { DrawingEditor.#currentDrawingAC.abort(); DrawingEditor.#currentDrawingAC = null; - DrawingEditor.#currentPointerId = NaN; - DrawingEditor.#currentPointerIds = null; + CurrentPointers.clearPointerIds(); } } diff --git a/src/display/editor/drawers/freedraw.js b/src/display/editor/drawers/freedraw.js index c3bd3dd5fc4a0..8300ca3b364ad 100644 --- a/src/display/editor/drawers/freedraw.js +++ b/src/display/editor/drawers/freedraw.js @@ -480,6 +480,7 @@ class FreeDrawOutline extends Outline { this.#scaleFactor = scaleFactor; this.#innerMargin = innerMargin; this.#isLTR = isLTR; + this.firstPoint = [NaN, NaN]; this.lastPoint = [NaN, NaN]; this.#computeMinMax(isLTR); @@ -560,9 +561,12 @@ class FreeDrawOutline extends Outline { let lastX = outline[4]; let lastY = outline[5]; const minMax = [lastX, lastY, lastX, lastY]; + let firstPointX = lastX; + let firstPointY = lastY; let lastPointX = lastX; let lastPointY = lastY; const ltrCallback = isLTR ? Math.max : Math.min; + const bezierBbox = new Float32Array(4); for (let i = 6, ii = outline.length; i < ii; i += 6) { const x = outline[i + 4], @@ -571,6 +575,12 @@ class FreeDrawOutline extends Outline { if (isNaN(outline[i])) { Util.pointBoundingBox(x, y, minMax); + if (firstPointY > y) { + firstPointX = x; + firstPointY = y; + } else if (firstPointY === y) { + firstPointX = ltrCallback(firstPointX, x); + } if (lastPointY < y) { lastPointX = x; lastPointY = y; @@ -578,16 +588,34 @@ class FreeDrawOutline extends Outline { lastPointX = ltrCallback(lastPointX, x); } } else { - const bbox = [Infinity, Infinity, -Infinity, -Infinity]; - Util.bezierBoundingBox(lastX, lastY, ...outline.slice(i, i + 6), bbox); + bezierBbox[0] = bezierBbox[1] = Infinity; + bezierBbox[2] = bezierBbox[3] = -Infinity; + Util.bezierBoundingBox( + lastX, + lastY, + ...outline.slice(i, i + 6), + bezierBbox + ); - Util.rectBoundingBox(...bbox, minMax); + Util.rectBoundingBox( + bezierBbox[0], + bezierBbox[1], + bezierBbox[2], + bezierBbox[3], + minMax + ); - if (lastPointY < bbox[3]) { - lastPointX = bbox[2]; - lastPointY = bbox[3]; - } else if (lastPointY === bbox[3]) { - lastPointX = ltrCallback(lastPointX, bbox[2]); + if (firstPointY > bezierBbox[1]) { + firstPointX = bezierBbox[0]; + firstPointY = bezierBbox[1]; + } else if (firstPointY === bezierBbox[1]) { + firstPointX = ltrCallback(firstPointX, bezierBbox[0]); + } + if (lastPointY < bezierBbox[3]) { + lastPointX = bezierBbox[2]; + lastPointY = bezierBbox[3]; + } else if (lastPointY === bezierBbox[3]) { + lastPointX = ltrCallback(lastPointX, bezierBbox[2]); } } lastX = x; @@ -599,6 +627,7 @@ class FreeDrawOutline extends Outline { bbox[1] = minMax[1] - this.#innerMargin; bbox[2] = minMax[2] - minMax[0] + 2 * this.#innerMargin; bbox[3] = minMax[3] - minMax[1] + 2 * this.#innerMargin; + this.firstPoint = [firstPointX, firstPointY]; this.lastPoint = [lastPointX, lastPointY]; } diff --git a/src/display/editor/drawers/highlight.js b/src/display/editor/drawers/highlight.js index ff0cf469a65d9..2809dd5aa4131 100644 --- a/src/display/editor/drawers/highlight.js +++ b/src/display/editor/drawers/highlight.js @@ -20,6 +20,8 @@ import { Util } from "../../../shared/util.js"; class HighlightOutliner { #box; + #firstPoint; + #lastPoint; #verticalEdges = []; @@ -63,12 +65,30 @@ class HighlightOutliner { const bboxHeight = minMax[3] - minMax[1] + 2 * innerMargin; const shiftedMinX = minMax[0] - innerMargin; const shiftedMinY = minMax[1] - innerMargin; + let firstPointX = isLTR ? -Infinity : Infinity; + let firstPointY = Infinity; const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2); const lastPoint = [lastEdge[0], lastEdge[2]]; // Convert the coordinates of the edges into box coordinates. for (const edge of this.#verticalEdges) { - const [x, y1, y2] = edge; + const [x, y1, y2, left] = edge; + if (!left && isLTR) { + if (y1 < firstPointY) { + firstPointY = y1; + firstPointX = x; + } else if (y1 === firstPointY) { + firstPointX = Math.max(firstPointX, x); + } + } else if (left && !isLTR) { + if (y1 < firstPointY) { + firstPointY = y1; + firstPointX = x; + } else if (y1 === firstPointY) { + firstPointX = Math.min(firstPointX, x); + } + } + edge[0] = (x - shiftedMinX) / bboxWidth; edge[1] = (y1 - shiftedMinY) / bboxHeight; edge[2] = (y2 - shiftedMinY) / bboxHeight; @@ -80,6 +100,7 @@ class HighlightOutliner { bboxWidth, bboxHeight, ]); + this.#firstPoint = [firstPointX, firstPointY]; this.#lastPoint = lastPoint; } @@ -170,7 +191,12 @@ class HighlightOutliner { } outline.push(lastPointX, lastPointY); } - return new HighlightOutline(outlines, this.#box, this.#lastPoint); + return new HighlightOutline( + outlines, + this.#box, + this.#firstPoint, + this.#lastPoint + ); } #binarySearch(y) { @@ -264,10 +290,11 @@ class HighlightOutline extends Outline { #outlines; - constructor(outlines, box, lastPoint) { + constructor(outlines, box, firstPoint, lastPoint) { super(); this.#outlines = outlines; this.#box = box; + this.firstPoint = firstPoint; this.lastPoint = lastPoint; } diff --git a/src/display/editor/drawers/signaturedraw.js b/src/display/editor/drawers/signaturedraw.js index f90a1428edac2..d3e217d6cda7a 100644 --- a/src/display/editor/drawers/signaturedraw.js +++ b/src/display/editor/drawers/signaturedraw.js @@ -13,10 +13,10 @@ * limitations under the License. */ -import { fromBase64Util, toBase64Util, warn } from "../../../shared/util.js"; import { ContourDrawOutline } from "./contour.js"; import { InkDrawOutline } from "./inkdraw.js"; import { Outline } from "./outline.js"; +import { warn } from "../../../shared/util.js"; const BASE_HEADER_LENGTH = 8; const POINTS_PROPERTIES_NUMBER = 3; @@ -749,12 +749,12 @@ class SignatureExtractor { const buf = await new Response(cs.readable).arrayBuffer(); const bytes = new Uint8Array(buf); - return toBase64Util(bytes); + return bytes.toBase64(); } static async decompressSignature(signatureData) { try { - const bytes = fromBase64Util(signatureData); + const bytes = Uint8Array.fromBase64(signatureData); const { readable, writable } = new DecompressionStream("deflate-raw"); const writer = writable.getWriter(); await writer.ready; diff --git a/src/display/editor/editor.js b/src/display/editor/editor.js index 452028d24d8b7..e958bbb838485 100644 --- a/src/display/editor/editor.js +++ b/src/display/editor/editor.js @@ -55,20 +55,22 @@ class AnnotationEditor { #comment = null; + #commentStandaloneButton = null; + #disabled = false; #dragPointerId = null; #dragPointerType = ""; - #keepAspectRatio = false; - #resizersDiv = null; #lastPointerCoords = null; #savedDimensions = null; + #fakeAnnotation = null; + #focusAC = null; #focusedResizerName = ""; @@ -184,6 +186,9 @@ class AnnotationEditor { this._initialOptions.isCentered = parameters.isCentered; this._structTreeParentId = null; this.annotationElementId = parameters.annotationElementId || null; + this.creationDate = parameters.creationDate || new Date(); + this.modificationDate = parameters.modificationDate || null; + this.canAddComment = true; const { rotation, @@ -204,6 +209,10 @@ class AnnotationEditor { this.deleted = false; } + updatePageIndex(newPageIndex) { + this.pageIndex = newPageIndex; + } + get editorType() { return Object.getPrototypeOf(this).constructor._type; } @@ -313,6 +322,10 @@ class AnnotationEditor { this.div?.classList.toggle("draggable", value); } + get uid() { + return this.annotationElementId || this.id; + } + /** * @returns {boolean} true if the editor handles the Enter key itself. */ @@ -376,6 +389,10 @@ class AnnotationEditor { } else { // The editor is being removed from the DOM, so we need to stop resizing. this.#stopResizing(); + + // Remove the fake annotation in the annotation layer. + this.#fakeAnnotation?.remove(); + this.#fakeAnnotation = null; } this.parent = parent; } @@ -728,34 +745,15 @@ class AnnotationEditor { /** * Set the dimensions of this editor. - * @param {number} width - * @param {number} height */ - setDims(width, height) { - const [parentWidth, parentHeight] = this.parentDimensions; - const { style } = this.div; - style.width = `${((100 * width) / parentWidth).toFixed(2)}%`; - if (!this.#keepAspectRatio) { - style.height = `${((100 * height) / parentHeight).toFixed(2)}%`; - } - } - - fixDims() { - const { style } = this.div; - const { height, width } = style; - const widthPercent = width.endsWith("%"); - const heightPercent = !this.#keepAspectRatio && height.endsWith("%"); - if (widthPercent && heightPercent) { - return; - } - - const [parentWidth, parentHeight] = this.parentDimensions; - if (!widthPercent) { - style.width = `${((100 * parseFloat(width)) / parentWidth).toFixed(2)}%`; - } - if (!this.#keepAspectRatio && !heightPercent) { - style.height = `${((100 * parseFloat(height)) / parentHeight).toFixed(2)}%`; - } + setDims() { + const { + div: { style }, + width, + height, + } = this; + style.width = `${(100 * width).toFixed(2)}%`; + style.height = `${(100 * height).toFixed(2)}%`; } /** @@ -864,8 +862,7 @@ class AnnotationEditor { this.height = height; this.x = x; this.y = y; - const [parentWidth, parentHeight] = this.parentDimensions; - this.setDims(parentWidth * width, parentHeight * height); + this.setDims(); this.fixAndSetPosition(); this._onResized(); } @@ -1042,7 +1039,7 @@ class AnnotationEditor { this.x = newX; this.y = newY; - this.setDims(parentWidth * newWidth, parentHeight * newHeight); + this.setDims(); this.fixAndSetPosition(); this._onResizing(); @@ -1084,17 +1081,28 @@ class AnnotationEditor { await this._editToolbar.addButton(name, tool); } } - this._editToolbar.addButton("comment", this.addCommentButton()); + if (!this.hasComment) { + this._editToolbar.addButton("comment", this.addCommentButton()); + } this._editToolbar.addButton("delete"); return this._editToolbar; } + addCommentButtonInToolbar() { + this._editToolbar?.addButtonBefore( + "comment", + this.addCommentButton(), + ".deleteButton" + ); + } + + removeCommentButtonFromToolbar() { + this._editToolbar?.removeButton("comment"); + } + removeEditToolbar() { - if (!this._editToolbar) { - return; - } - this._editToolbar.remove(); + this._editToolbar?.remove(); this._editToolbar = null; // We destroy the alt text but we don't null it because we want to be able @@ -1165,50 +1173,121 @@ class AnnotationEditor { return this.#altText?.hasData() ?? false; } + focusCommentButton() { + this.#comment?.focusButton(); + } + addCommentButton() { - if (this.#comment) { - return this.#comment; + return this.canAddComment ? (this.#comment ||= new Comment(this)) : null; + } + + addStandaloneCommentButton() { + if (!this._uiManager.hasCommentManager()) { + return; } - return (this.#comment = new Comment(this)); + if (this.#commentStandaloneButton) { + if (this._uiManager.isEditingMode()) { + this.#commentStandaloneButton.classList.remove("hidden"); + } + return; + } + if (!this.hasComment) { + return; + } + this.#commentStandaloneButton = this.#comment.renderForStandalone(); + this.div.append(this.#commentStandaloneButton); } - get commentColor() { - return null; + removeStandaloneCommentButton() { + this.#comment.removeStandaloneCommentButton(); + this.#commentStandaloneButton = null; + } + + hideStandaloneCommentButton() { + this.#commentStandaloneButton?.classList.add("hidden"); } get comment() { - const comment = this.#comment; + if (!this.#comment) { + return null; + } + const { + data: { richText, text, date, deleted }, + } = this.#comment; return { - text: comment.data.text, - date: comment.data.date, - deleted: comment.isDeleted(), - color: this.commentColor, + text, + richText, + date, + deleted, + color: this.getNonHCMColor(), + opacity: this.opacity ?? 1, }; } - set comment(text) { - if (!this.#comment) { - this.#comment = new Comment(this); + set comment(value) { + this.#comment ||= new Comment(this); + if (typeof value === "object" && value !== null) { + // Restore full comment data (used for undo). + this.#comment.restoreData(value); + } else { + this.#comment.data = value; + } + if (this.hasComment) { + this.removeCommentButtonFromToolbar(); + this.addStandaloneCommentButton(); + this._uiManager.updateComment(this); + } else { + this.addCommentButtonInToolbar(); + this.removeStandaloneCommentButton(); + this._uiManager.removeComment(this); } - this.#comment.data = text; } - setCommentData(text) { - if (!this.#comment) { - this.#comment = new Comment(this); + setCommentData({ comment, popupRef, richText }) { + if (!popupRef) { + return; + } + this.#comment ||= new Comment(this); + this.#comment.setInitialText(comment, richText); + + if (!this.annotationElementId) { + return; + } + const storedData = this._uiManager.getAndRemoveDataFromAnnotationStorage( + this.annotationElementId + ); + if (storedData) { + this.updateFromAnnotationLayer(storedData); } - this.#comment.setInitialText(text); } get hasEditedComment() { return this.#comment?.hasBeenEdited(); } - async editComment() { - if (!this.#comment) { - this.#comment = new Comment(this); + get hasDeletedComment() { + return this.#comment?.isDeleted(); + } + + get hasComment() { + return ( + !!this.#comment && !this.#comment.isEmpty() && !this.#comment.isDeleted() + ); + } + + async editComment(options) { + this.#comment ||= new Comment(this); + this.#comment.edit(options); + } + + toggleComment(isSelected, visibility = undefined) { + if (this.hasComment) { + this._uiManager.toggleComment(this, isSelected, visibility); } - this.#comment.edit(); + } + + setSelectedCommentButton(selected) { + this.#comment.setSelectedButton(selected); } addComment(serialized) { @@ -1229,6 +1308,14 @@ class AnnotationEditor { } } + updateFromAnnotationLayer({ popup: { contents, deleted } }) { + this.#comment.data = deleted ? null : contents; + } + + get parentBoundingClientRect() { + return this.parent.boundingClientRect; + } + /** * Render this editor in a div. * @returns {HTMLDivElement | null} @@ -1276,6 +1363,7 @@ class AnnotationEditor { }); } + this.addStandaloneCommentButton(); this._uiManager._editorUndoBar?.hide(); return div; @@ -1339,7 +1427,7 @@ class AnnotationEditor { this.width = newWidth; this.height = newHeight; - this.setDims(parentWidth * newWidth, parentHeight * newHeight); + this.setDims(); this.fixAndSetPosition(); this._onResizing(); @@ -1416,6 +1504,11 @@ class AnnotationEditor { e => { if (!hasDraggingStarted) { hasDraggingStarted = true; + this._uiManager.toggleComment( + this, + /* isSelected = */ true, + /* visibility = */ false + ); this._onStartDragging(); } const { clientX: x, clientY: y, pointerId } = e; @@ -1581,6 +1674,44 @@ class AnnotationEditor { return this.getRect(0, 0); } + getNonHCMColor() { + return ( + this.color && + AnnotationEditor._colorManager.convert( + this._uiManager.getNonHCMColor(this.color) + ) + ); + } + + /** + * The color has been changed. + */ + onUpdatedColor() { + this.#comment?.onUpdatedColor(); + } + + getData() { + const { + comment: { text: str, color, date, opacity, deleted, richText }, + uid: id, + pageIndex, + creationDate, + modificationDate, + } = this; + return { + id, + pageIndex, + rect: this.getPDFRect(), + richText, + contentsObj: { str }, + creationDate, + modificationDate: date || modificationDate, + popupRef: !deleted, + color, + opacity, + }; + } + /** * Executed once this editor has been rendered. * @param {boolean} focus - true if the editor should be focused. @@ -1709,7 +1840,14 @@ class AnnotationEditor { * @returns {Object | null} */ serialize(isForCopying = false, context = null) { - unreachable("An editor must be serializable"); + return { + annotationType: this.mode, + pageIndex: this.pageIndex, + rect: this.getPDFRect(), + rotation: this.rotation, + structTreeParentId: this._structTreeParentId, + popupRef: this._initialData?.popupRef || "", + }; } /** @@ -1727,6 +1865,8 @@ class AnnotationEditor { id: parent.getNextId(), uiManager, annotationElementId: data.annotationElementId, + creationDate: data.creationDate, + modificationDate: data.modificationDate, }); editor.rotation = data.rotation; editor.#accessibilityData = data.accessibilityData; @@ -1775,6 +1915,7 @@ class AnnotationEditor { } else { this._uiManager.removeEditor(this); } + this.hideCommentPopup(); if (this.#moveInDOMTimeout) { clearTimeout(this.#moveInDOMTimeout); @@ -1791,6 +1932,8 @@ class AnnotationEditor { this.parent = null; this.#touchManager?.destroy(); this.#touchManager = null; + this.#fakeAnnotation?.remove(); + this.#fakeAnnotation = null; } /** @@ -1814,6 +1957,56 @@ class AnnotationEditor { return null; } + /** + * Get the position of the comment button. + * @returns {Array|null} + */ + get commentButtonPosition() { + return this._uiManager.direction === "ltr" ? [1, 0] : [0, 0]; + } + + get commentButtonPositionInPage() { + const { + commentButtonPosition: [posX, posY], + } = this; + const [blX, blY, trX, trY] = this.getPDFRect(); + return [ + AnnotationEditor._round(blX + (trX - blX) * posX), + AnnotationEditor._round(blY + (trY - blY) * (1 - posY)), + ]; + } + + get commentButtonColor() { + return this._uiManager.makeCommentColor( + this.getNonHCMColor(), + this.opacity + ); + } + + get commentPopupPosition() { + return this.#comment.commentPopupPositionInLayer; + } + + set commentPopupPosition(pos) { + this.#comment.commentPopupPositionInLayer = pos; + } + + hasDefaultPopupPosition() { + return this.#comment.hasDefaultPopupPosition(); + } + + get commentButtonWidth() { + return this.#comment.commentButtonWidth; + } + + get elementBeforePopup() { + return this.div; + } + + setCommentButtonStates(options) { + this.#comment?.setCommentButtonStates(options); + } + /** * onkeydown callback. * @param {KeyboardEvent} event @@ -1870,11 +2063,13 @@ class AnnotationEditor { // on the top-left one. if (nextFirstPosition < firstPosition) { for (let i = 0; i < firstPosition - nextFirstPosition; i++) { - this.#resizersDiv.append(this.#resizersDiv.firstChild); + this.#resizersDiv.append(this.#resizersDiv.firstElementChild); } } else if (nextFirstPosition > firstPosition) { for (let i = 0; i < nextFirstPosition - firstPosition; i++) { - this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild); + this.#resizersDiv.firstElementChild.before( + this.#resizersDiv.lastElementChild + ); } } @@ -1888,7 +2083,7 @@ class AnnotationEditor { this.#setResizerTabIndex(0); this.#isResizerEnabledForKeyboard = true; - this.#resizersDiv.firstChild.focus({ focusVisible: true }); + this.#resizersDiv.firstElementChild.focus({ focusVisible: true }); event.preventDefault(); event.stopImmediatePropagation(); } @@ -1946,6 +2141,7 @@ class AnnotationEditor { */ select() { if (this.isSelected && this._editToolbar) { + this._editToolbar.show(); return; } this.isSelected = true; @@ -1966,6 +2162,12 @@ class AnnotationEditor { this.#altText?.toggleAltTextBadge(false); } + focus() { + if (this.div && !this.div.contains(document.activeElement)) { + setTimeout(() => this.div?.focus({ preventScroll: true }), 0); + } + } + /** * Unselect this editor. */ @@ -1985,6 +2187,13 @@ class AnnotationEditor { } this._editToolbar?.hide(); this.#altText?.toggleAltTextBadge(true); + this.hideCommentPopup(); + } + + hideCommentPopup() { + if (this.hasComment) { + this._uiManager.toggleComment(null); + } } /** @@ -2032,10 +2241,14 @@ class AnnotationEditor { * @param {MouseEvent} event */ dblclick(event) { + if (event.target.nodeName === "BUTTON") { + // Avoid entering in edit mode when clicking on the comment button. + return; + } this.enterInEditMode(); this.parent.updateToolbar({ mode: this.constructor._editorType, - editId: this.id, + editId: this.uid, }); } @@ -2079,19 +2292,6 @@ class AnnotationEditor { } } - /** - * Set the aspect ratio to use when resizing. - * @param {number} width - * @param {number} height - */ - setAspectRatio(width, height) { - this.#keepAspectRatio = true; - const aspectRatio = width / height; - const { style } = this.div; - style.aspectRatio = aspectRatio; - style.height = "auto"; - } - static get MIN_SIZE() { return 16; } @@ -2167,6 +2367,24 @@ class AnnotationEditor { this.#disabled = true; } + updateFakeAnnotationElement(annotationLayer) { + if (!this.#fakeAnnotation && !this.deleted) { + this.#fakeAnnotation = annotationLayer.addFakeAnnotation(this); + return; + } + if (this.deleted) { + this.#fakeAnnotation.remove(); + this.#fakeAnnotation = null; + return; + } + if (this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized) { + this.#fakeAnnotation.updateEdited({ + rect: this.getPDFRect(), + popup: this.comment, + }); + } + } + /** * Render an annotation in the annotation layer. * @param {Object} annotation @@ -2193,12 +2411,12 @@ class AnnotationEditor { } resetAnnotationElement(annotation) { - const { firstChild } = annotation.container; + const { firstElementChild } = annotation.container; if ( - firstChild?.nodeName === "DIV" && - firstChild.classList.contains("annotationContent") + firstElementChild?.nodeName === "DIV" && + firstElementChild.classList.contains("annotationContent") ) { - firstChild.remove(); + firstElementChild.remove(); } } } diff --git a/src/display/editor/freetext.js b/src/display/editor/freetext.js index 18b49d3e8b6c7..e0a8ed7b10c26 100644 --- a/src/display/editor/freetext.js +++ b/src/display/editor/freetext.js @@ -35,8 +35,6 @@ const EOL_PATTERN = /\r\n?|\n/g; * Basic text editor in order to create a FreeTex annotation. */ class FreeTextEditor extends AnnotationEditor { - #color; - #content = ""; #editorDivId = `${this.id}-editor`; @@ -129,7 +127,7 @@ class FreeTextEditor extends AnnotationEditor { constructor(params) { super({ ...params, name: "freeTextEditor" }); - this.#color = + this.color = params.color || FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor; @@ -137,6 +135,7 @@ class FreeTextEditor extends AnnotationEditor { if (!this.annotationElementId) { this._uiManager.a11yAlert("pdfjs-editor-freetext-added-alert"); } + this.canAddComment = false; } /** @inheritdoc */ @@ -201,7 +200,7 @@ class FreeTextEditor extends AnnotationEditor { get propertiesToUpdate() { return [ [AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], - [AnnotationEditorParamsType.FREETEXT_COLOR, this.#color], + [AnnotationEditorParamsType.FREETEXT_COLOR, this.color], ]; } @@ -215,10 +214,6 @@ class FreeTextEditor extends AnnotationEditor { return AnnotationEditorParamsType.FREETEXT_COLOR; } - get colorValue() { - return this.#color; - } - /** * Update the font size and make this action as undoable. * @param {number} fontSize @@ -242,16 +237,23 @@ class FreeTextEditor extends AnnotationEditor { }); } + /** @inheritdoc */ + onUpdatedColor() { + this.editorDiv.style.color = this.color; + this._colorPicker?.update(this.color); + super.onUpdatedColor(); + } + /** * Update the color and make this action undoable. * @param {string} color */ #updateColor(color) { const setColor = col => { - this.#color = this.editorDiv.style.color = col; - this._colorPicker?.update(col); + this.color = col; + this.onUpdatedColor(); }; - const savedColor = this.#color; + const savedColor = this.color; this.addCommands({ cmd: setColor.bind(this, color), undo: setColor.bind(this, savedColor), @@ -581,7 +583,7 @@ class FreeTextEditor extends AnnotationEditor { const { style } = this.editorDiv; style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`; - style.color = this.#color; + style.color = this.color; this.div.append(this.editorDiv); @@ -787,7 +789,10 @@ class FreeTextEditor extends AnnotationEditor { rotation, id, popupRef, + richText, contentsObj, + creationDate, + modificationDate, }, textContent, textPosition, @@ -815,15 +820,18 @@ class FreeTextEditor extends AnnotationEditor { deleted: false, popupRef, comment: contentsObj?.str || null, + richText, + creationDate, + modificationDate, }; } const editor = await super.deserialize(data, parent, uiManager); editor.#fontSize = data.fontSize; - editor.#color = Util.makeHexColor(...data.color); + editor.color = Util.makeHexColor(...data.color); editor.#content = FreeTextEditor.#deserializeContent(data.value); editor._initialData = initialData; if (data.comment) { - editor.setCommentData(data.comment); + editor.setCommentData(data); } return editor; @@ -839,23 +847,14 @@ class FreeTextEditor extends AnnotationEditor { return this.serializeDeleted(); } - const rect = this.getPDFRect(); const color = AnnotationEditor._colorManager.convert( - this.isAttachedToDOM - ? getComputedStyle(this.editorDiv).color - : this.#color + this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.color ); - - const serialized = { - annotationType: AnnotationEditorType.FREETEXT, + const serialized = Object.assign(super.serialize(isForCopying), { color, fontSize: this.#fontSize, value: this.#serializeContent(), - pageIndex: this.pageIndex, - rect, - rotation: this.rotation, - structTreeParentId: this._structTreeParentId, - }; + }); this.addComment(serialized); if (isForCopying) { @@ -895,7 +894,7 @@ class FreeTextEditor extends AnnotationEditor { } const { style } = content; style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`; - style.color = this.#color; + style.color = this.color; content.replaceChildren(); for (const line of this.#content.split("\n")) { @@ -906,13 +905,13 @@ class FreeTextEditor extends AnnotationEditor { content.append(div); } - const params = { + annotation.updateEdited({ rect: this.getPDFRect(), - }; - params.popup = this.hasEditedComment - ? this.comment - : { text: this.#content }; - annotation.updateEdited(params); + popup: + this._uiManager.hasCommentManager() || this.hasEditedComment + ? this.comment + : { text: this.#content }, + }); return content; } diff --git a/src/display/editor/highlight.js b/src/display/editor/highlight.js index a4fe5ba6ab9b5..e0bdeefd5fe45 100644 --- a/src/display/editor/highlight.js +++ b/src/display/editor/highlight.js @@ -60,9 +60,9 @@ class HighlightEditor extends AnnotationEditor { #isFreeHighlight = false; - #lastPoint = null; + #firstPoint = null; - #opacity; + #lastPoint = null; #outlineId = null; @@ -106,7 +106,7 @@ class HighlightEditor extends AnnotationEditor { super({ ...params, name: "highlightEditor" }); this.color = params.color || HighlightEditor._defaultColor; this.#thickness = params.thickness || HighlightEditor._defaultThickness; - this.#opacity = params.opacity || HighlightEditor._defaultOpacity; + this.opacity = params.opacity || HighlightEditor._defaultOpacity; this.#boxes = params.boxes || null; this.#methodOfCreation = params.methodOfCreation || ""; this.#text = params.text || ""; @@ -151,10 +151,6 @@ class HighlightEditor extends AnnotationEditor { }; } - get commentColor() { - return this.color; - } - static computeTelemetryFinalData(data) { // We want to know how many colors have been used. return { numberOfColors: data.get("color").size }; @@ -176,6 +172,11 @@ class HighlightEditor extends AnnotationEditor { ); this.#focusOutlines = outlinerForOutline.getOutlines(); + const { firstPoint } = this.#highlightOutlines; + this.#firstPoint = [ + (firstPoint[0] - this.x) / this.width, + (firstPoint[1] - this.y) / this.height, + ]; // The last point is in the pages coordinate system. const { lastPoint } = this.#focusOutlines; this.#lastPoint = [ @@ -268,6 +269,11 @@ class HighlightEditor extends AnnotationEditor { } } + const { firstPoint } = highlightOutlines; + this.#firstPoint = [ + (firstPoint[0] - x) / width, + (firstPoint[1] - y) / height, + ]; const { lastPoint } = this.#focusOutlines; this.#lastPoint = [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height]; } @@ -299,6 +305,11 @@ class HighlightEditor extends AnnotationEditor { return this.#lastPoint; } + /** @inheritdoc */ + get commentButtonPosition() { + return this.#firstPoint; + } + /** @inheritdoc */ updateParams(type, value) { switch (type) { @@ -339,6 +350,18 @@ class HighlightEditor extends AnnotationEditor { ]; } + /** @inheritdoc */ + onUpdatedColor() { + this.parent?.drawLayer.updateProperties(this.#id, { + root: { + fill: this.color, + "fill-opacity": this.opacity, + }, + }); + this.#colorPicker?.updateColor(this.color); + super.onUpdatedColor(); + } + /** * Update the color and make this action undoable. * @param {string} color @@ -346,17 +369,11 @@ class HighlightEditor extends AnnotationEditor { #updateColor(color) { const setColorAndOpacity = (col, opa) => { this.color = col; - this.#opacity = opa; - this.parent?.drawLayer.updateProperties(this.#id, { - root: { - fill: col, - "fill-opacity": opa, - }, - }); - this.#colorPicker?.updateColor(col); + this.opacity = opa; + this.onUpdatedColor(); }; const savedColor = this.color; - const savedOpacity = this.#opacity; + const savedOpacity = this.opacity; this.addCommands({ cmd: setColorAndOpacity.bind( this, @@ -510,8 +527,7 @@ class HighlightEditor extends AnnotationEditor { highlightOutlines: this.#highlightOutlines.getNewOutline(thickness / 2), }); this.fixAndSetPosition(); - const [parentWidth, parentHeight] = this.parentDimensions; - this.setDims(this.width * parentWidth, this.height * parentHeight); + this.setDims(); } #cleanDrawLayer() { @@ -534,7 +550,7 @@ class HighlightEditor extends AnnotationEditor { root: { viewBox: "0 0 1 1", fill: this.color, - "fill-opacity": this.#opacity, + "fill-opacity": this.opacity, }, rootClass: { highlight: true, @@ -630,8 +646,7 @@ class HighlightEditor extends AnnotationEditor { highlightDiv.setAttribute("aria-hidden", "true"); highlightDiv.className = "internal"; highlightDiv.style.clipPath = this.#clipPathId; - const [parentWidth, parentHeight] = this.parentDimensions; - this.setDims(this.width * parentWidth, this.height * parentHeight); + this.setDims(); bindEvents(this, this.#highlightDiv, ["pointerover", "pointerleave"]); this.enableEditing(); @@ -878,7 +893,10 @@ class HighlightEditor extends AnnotationEditor { color, opacity, popupRef, + richText, contentsObj, + creationDate, + modificationDate, }, parent: { page: { pageNumber }, @@ -897,7 +915,10 @@ class HighlightEditor extends AnnotationEditor { id, deleted: false, popupRef, + richText, comment: contentsObj?.str || null, + creationDate, + modificationDate, }; } else if (data instanceof InkAnnotationElement) { const { @@ -909,7 +930,10 @@ class HighlightEditor extends AnnotationEditor { color, borderStyle: { rawWidth: thickness }, popupRef, + richText, contentsObj, + creationDate, + modificationDate, }, parent: { page: { pageNumber }, @@ -928,7 +952,10 @@ class HighlightEditor extends AnnotationEditor { id, deleted: false, popupRef, + richText, comment: contentsObj?.str || null, + creationDate, + modificationDate, }; } @@ -936,13 +963,13 @@ class HighlightEditor extends AnnotationEditor { const editor = await super.deserialize(data, parent, uiManager); editor.color = Util.makeHexColor(...color); - editor.#opacity = opacity || 1; + editor.opacity = opacity || 1; if (inkLists) { editor.#thickness = data.thickness; } editor._initialData = initialData; if (data.comment) { - editor.setCommentData(data.comment); + editor.setCommentData(data); } const [pageWidth, pageHeight] = editor.pageDimensions; @@ -1023,23 +1050,17 @@ class HighlightEditor extends AnnotationEditor { return this.serializeDeleted(); } - const rect = this.getPDFRect(); const color = AnnotationEditor._colorManager.convert( this._uiManager.getNonHCMColor(this.color) ); - - const serialized = { - annotationType: AnnotationEditorType.HIGHLIGHT, + const serialized = super.serialize(isForCopying); + Object.assign(serialized, { color, - opacity: this.#opacity, + opacity: this.opacity, thickness: this.#thickness, quadPoints: this.#serializeBoxes(), - outlines: this.#serializeOutlines(rect), - pageIndex: this.pageIndex, - rect, - rotation: this.#getRotation(), - structTreeParentId: this._structTreeParentId, - }; + outlines: this.#serializeOutlines(serialized.rect), + }); this.addComment(serialized); if (this.annotationElementId && !this.#hasElementChanged(serialized)) { @@ -1063,13 +1084,10 @@ class HighlightEditor extends AnnotationEditor { annotation.hide(); return null; } - const params = { + annotation.updateEdited({ rect: this.getPDFRect(), - }; - if (this.hasEditedComment) { - params.popup = this.comment; - } - annotation.updateEdited(params); + popup: this.comment, + }); return null; } diff --git a/src/display/editor/ink.js b/src/display/editor/ink.js index 58afba9988347..ad741404818ba 100644 --- a/src/display/editor/ink.js +++ b/src/display/editor/ink.js @@ -150,7 +150,10 @@ class InkEditor extends DrawingEditor { opacity, borderStyle: { rawWidth: thickness }, popupRef, + richText, contentsObj, + creationDate, + modificationDate, }, parent: { page: { pageNumber }, @@ -170,14 +173,17 @@ class InkEditor extends DrawingEditor { id, deleted: false, popupRef, + richText, comment: contentsObj?.str || null, + creationDate, + modificationDate, }; } const editor = await super.deserialize(data, parent, uiManager); editor._initialData = initialData; if (data.comment) { - editor.setCommentData(data.comment); + editor.setCommentData(data); } return editor; @@ -193,10 +199,14 @@ class InkEditor extends DrawingEditor { return AnnotationEditorParamsType.INK_COLOR; } - get colorValue() { + get color() { return this._drawingOptions.stroke; } + get opacity() { + return this._drawingOptions["stroke-opacity"]; + } + /** @inheritdoc */ onScaleChanging() { if (!this.parent) { @@ -243,7 +253,7 @@ class InkEditor extends DrawingEditor { return this.serializeDeleted(); } - const { lines, points, rect } = this.serializeDraw(isForCopying); + const { lines, points } = this.serializeDraw(isForCopying); const { _drawingOptions: { stroke, @@ -251,8 +261,7 @@ class InkEditor extends DrawingEditor { "stroke-width": thickness, }, } = this; - const serialized = { - annotationType: AnnotationEditorType.INK, + const serialized = Object.assign(super.serialize(isForCopying), { color: AnnotationEditor._colorManager.convert(stroke), opacity, thickness, @@ -260,11 +269,7 @@ class InkEditor extends DrawingEditor { lines, points, }, - pageIndex: this.pageIndex, - rect, - rotation: this.rotation, - structTreeParentId: this._structTreeParentId, - }; + }); this.addComment(serialized); if (isForCopying) { @@ -300,15 +305,12 @@ class InkEditor extends DrawingEditor { return null; } const { points, rect } = this.serializeDraw(/* isForCopying = */ false); - const params = { + annotation.updateEdited({ rect, thickness: this._drawingOptions["stroke-width"], points, - }; - if (this.hasEditedComment) { - params.popup = this.comment; - } - annotation.updateEdited(params); + popup: this.comment, + }); return null; } diff --git a/src/display/editor/signature.js b/src/display/editor/signature.js index 0dc38ecd11359..272c1c62627e8 100644 --- a/src/display/editor/signature.js +++ b/src/display/editor/signature.js @@ -276,7 +276,6 @@ class SignatureEditor extends DrawingEditor { drawOutlines: outline, drawingOptions, }); - const [parentWidth, parentHeight] = this.parentDimensions; const [, pageHeight] = this.pageDimensions; let newHeight = heightInPage / pageHeight; // Ensure the signature doesn't exceed the page height. @@ -290,7 +289,7 @@ class SignatureEditor extends DrawingEditor { } this.height = newHeight; - this.setDims(parentWidth * this.width, parentHeight * this.height); + this.setDims(); this.x = savedX; this.y = savedY; this.center(); @@ -374,21 +373,16 @@ class SignatureEditor extends DrawingEditor { return null; } - const { lines, points, rect } = this.serializeDraw(isForCopying); + const { lines, points } = this.serializeDraw(isForCopying); const { _drawingOptions: { "stroke-width": thickness }, } = this; - const serialized = { - annotationType: AnnotationEditorType.SIGNATURE, + const serialized = Object.assign(super.serialize(isForCopying), { isSignature: true, areContours: this.#isExtracted, color: [0, 0, 0], thickness: this.#isExtracted ? 0 : thickness, - pageIndex: this.pageIndex, - rect, - rotation: this.rotation, - structTreeParentId: this._structTreeParentId, - }; + }); this.addComment(serialized); if (isForCopying) { serialized.paths = { lines, points }; diff --git a/src/display/editor/stamp.js b/src/display/editor/stamp.js index cf5f50d73ea18..51c9c10fb2620 100644 --- a/src/display/editor/stamp.js +++ b/src/display/editor/stamp.js @@ -15,6 +15,7 @@ import { AnnotationEditorType, AnnotationPrefix } from "../../shared/util.js"; import { + ColorScheme, OutputScale, PixelsPerInch, SupportedImageMimeTypes, @@ -442,11 +443,6 @@ class StampEditor extends AnnotationEditor { width *= factor; height *= factor; } - const [parentWidth, parentHeight] = this.parentDimensions; - this.setDims( - (width * parentWidth) / pageWidth, - (height * parentHeight) / pageHeight - ); this._uiManager.enableWaiting(false); const canvas = (this.#canvas = document.createElement("canvas")); @@ -455,6 +451,8 @@ class StampEditor extends AnnotationEditor { this.width = width / pageWidth; this.height = height / pageHeight; + this.setDims(); + if (this._initialOptions?.isCentered) { this.center(); } else { @@ -535,7 +533,7 @@ class StampEditor extends AnnotationEditor { black = "#cfcfd8"; if (this._uiManager.hcmFilter !== "none") { black = "black"; - } else if (window.matchMedia?.("(prefers-color-scheme: dark)").matches) { + } else if (ColorScheme.isDarkMode) { white = "#8f8f9d"; black = "#42414d"; } @@ -750,7 +748,17 @@ class StampEditor extends AnnotationEditor { let missingCanvas = false; if (data instanceof StampAnnotationElement) { const { - data: { rect, rotation, id, structParent, popupRef, contentsObj }, + data: { + rect, + rotation, + id, + structParent, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate, + }, container, parent: { page: { pageNumber }, @@ -794,7 +802,10 @@ class StampEditor extends AnnotationEditor { isSvg: false, structParent, popupRef, + richText, comment: contentsObj?.str || null, + creationDate, + modificationDate, }; } const editor = await super.deserialize(data, parent, uiManager); @@ -822,7 +833,7 @@ class StampEditor extends AnnotationEditor { } editor._initialData = initialData; if (data.comment) { - editor.setCommentData(data.comment); + editor.setCommentData(data); } // No need to be add in the undo stack if the editor is created from an // existing one. @@ -841,15 +852,10 @@ class StampEditor extends AnnotationEditor { return this.serializeDeleted(); } - const serialized = { - annotationType: AnnotationEditorType.STAMP, + const serialized = Object.assign(super.serialize(isForCopying), { bitmapId: this.#bitmapId, - pageIndex: this.pageIndex, - rect: this.getPDFRect(), - rotation: this.rotation, isSvg: this.#isSvg, - structTreeParentId: this._structTreeParentId, - }; + }); this.addComment(serialized); if (isForCopying) { @@ -878,8 +884,10 @@ class StampEditor extends AnnotationEditor { serialized.accessibilityData.structParent = this._initialData.structParent ?? -1; } + serialized.id = this.annotationElementId; + delete serialized.bitmapId; + return serialized; } - serialized.id = this.annotationElementId; if (context === null) { return serialized; @@ -934,13 +942,10 @@ class StampEditor extends AnnotationEditor { annotation.hide(); return null; } - const params = { + annotation.updateEdited({ rect: this.getPDFRect(), - }; - if (this.hasEditedComment) { - params.popup = this.comment; - } - annotation.updateEdited(params); + popup: this.comment, + }); return null; } diff --git a/src/display/editor/toolbar.js b/src/display/editor/toolbar.js index 875a22aff1d06..563ad965e01e2 100644 --- a/src/display/editor/toolbar.js +++ b/src/display/editor/toolbar.js @@ -28,6 +28,8 @@ class EditorToolbar { #comment = null; + #commentButtonDivider = null; + #signatureDescriptionButton = null; static #l10nRemove = null; @@ -158,16 +160,22 @@ class EditorToolbar { this.#altText = altText; } - addComment(comment) { + addComment(comment, beforeElement = null) { if (this.#comment) { return; } - const button = comment.render(); + const button = comment.renderForToolbar(); if (!button) { return; } this.#addListenersToElement(button); - this.#buttons.append(button, this.#divider); + const divider = (this.#commentButtonDivider = this.#divider); + if (!beforeElement) { + this.#buttons.append(button, divider); + } else { + this.#buttons.insertBefore(button, beforeElement); + this.#buttons.insertBefore(divider, beforeElement); + } this.#comment = comment; comment.toolbar = this; } @@ -189,26 +197,58 @@ class EditorToolbar { this.#buttons.append(button, this.#divider); } + removeButton(name) { + switch (name) { + case "comment": + this.#comment?.removeToolbarCommentButton(); + this.#comment = null; + this.#commentButtonDivider?.remove(); + this.#commentButtonDivider = null; + break; + } + } + async addButton(name, tool) { switch (name) { case "colorPicker": - this.addColorPicker(tool); + if (tool) { + this.addColorPicker(tool); + } break; case "altText": - await this.addAltText(tool); + if (tool) { + await this.addAltText(tool); + } break; case "editSignature": - await this.addEditSignatureButton(tool); + if (tool) { + await this.addEditSignatureButton(tool); + } break; case "delete": this.addDeleteButton(); break; case "comment": - this.addComment(tool); + if (tool) { + this.addComment(tool); + } break; } } + async addButtonBefore(name, tool, beforeSelector) { + if (!tool && name === "comment") { + return; + } + const beforeElement = this.#buttons.querySelector(beforeSelector); + if (!beforeElement) { + return; + } + if (name === "comment") { + this.addComment(tool, beforeElement); + } + } + updateEditSignatureButton(description) { if (this.#signatureDescriptionButton) { this.#signatureDescriptionButton.title = description; diff --git a/src/display/editor/tools.js b/src/display/editor/tools.js index b054d1889a828..75c2ca16b334d 100644 --- a/src/display/editor/tools.js +++ b/src/display/editor/tools.js @@ -42,6 +42,87 @@ function bindEvents(obj, element, names) { } } +/** + * Class to store current pointers used by the editor to be able to handle + * multiple pointers (e.g. two fingers, a pen, a mouse, ...). + */ +class CurrentPointers { + // To manage the pointer events. + + // The pointerId and pointerIds are used to keep track of + // the pointers with a same type (e.g. two fingers). + static #pointerId = NaN; + + static #pointerIds = null; + + // Track the timestamp to know if the touchmove event is used. + static #moveTimestamp = NaN; + + // The pointerType is used to know if we are using a mouse, a pen or a touch. + static #pointerType = null; + + static initializeAndAddPointerId(pointerId) { + // Store pointer ids. For example, the user is using a second finger. + (CurrentPointers.#pointerIds ||= new Set()).add(pointerId); + } + + static setPointer(pointerType, pointerId) { + CurrentPointers.#pointerId ||= pointerId; + CurrentPointers.#pointerType ??= pointerType; + } + + static setTimeStamp(timeStamp) { + CurrentPointers.#moveTimestamp = timeStamp; + } + + static isSamePointerId(pointerId) { + return CurrentPointers.#pointerId === pointerId; + } + + // Check if it's the same pointer id, otherwise remove it from the set. + static isSamePointerIdOrRemove(pointerId) { + if (CurrentPointers.#pointerId === pointerId) { + return true; + } + + CurrentPointers.#pointerIds?.delete(pointerId); + return false; + } + + static isSamePointerType(pointerType) { + return CurrentPointers.#pointerType === pointerType; + } + + static isInitializedAndDifferentPointerType(pointerType) { + return ( + CurrentPointers.#pointerType !== null && + !CurrentPointers.isSamePointerType(pointerType) + ); + } + + static isSameTimeStamp(timeStamp) { + return CurrentPointers.#moveTimestamp === timeStamp; + } + + static isUsingMultiplePointers() { + // Check if the user is using multiple fingers + return CurrentPointers.#pointerIds?.size >= 1; + } + + static clearPointerType() { + CurrentPointers.#pointerType = null; + } + + static clearPointerIds() { + CurrentPointers.#pointerId = NaN; + CurrentPointers.#pointerIds = null; + } + + static clearTimeStamp() { + CurrentPointers.#moveTimestamp = NaN; + } +} + /** * Class to create some unique ids for the different editors. */ @@ -53,6 +134,9 @@ class IdManager { Object.defineProperty(this, "reset", { value: () => (this.#id = 0), }); + Object.defineProperty(this, "getNextId", { + value: () => this.#id, + }); } } @@ -864,6 +948,7 @@ class AnnotationEditorUIManager { evt => this.updateParams(evt.type, evt.value), { signal } ); + eventBus._on("pagesedited", this.onPagesEdited.bind(this), { signal }); window.addEventListener( "pointerdown", () => { @@ -896,6 +981,7 @@ class AnnotationEditorUIManager { this.isShiftKeyDown = false; this._editorUndoBar = editorUndoBar || null; this._supportsPinchToZoom = supportsPinchToZoom !== false; + commentManager?.setSidebarUiManager(this); if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("TESTING")) { Object.defineProperty(this, "reset", { @@ -905,6 +991,9 @@ class AnnotationEditorUIManager { this.#idManager.reset(); }, }); + Object.defineProperty(this, "getNextEditorId", { + value: () => this.#idManager.getNextId(), + }); } } @@ -1067,8 +1156,72 @@ class AnnotationEditorUIManager { return !!this.#commentManager; } - editComment(editor, position) { - this.#commentManager?.open(this, editor, position); + editComment(editor, posX, posY, options) { + this.#commentManager?.showDialog(this, editor, posX, posY, options); + } + + selectComment(pageIndex, uid) { + const layer = this.#allLayers.get(pageIndex); + const editor = layer?.getEditorByUID(uid); + editor?.toggleComment(/* isSelected */ true, /* visibility */ true); + } + + updateComment(editor) { + this.#commentManager?.updateComment(editor.getData()); + } + + updatePopupColor(editor) { + this.#commentManager?.updatePopupColor(editor); + } + + removeComment(editor) { + this.#commentManager?.removeComments([editor.uid]); + } + + /** + * Delete a comment from an editor with undo support. + * @param {AnnotationEditor} editor - The editor whose comment to delete. + * @param {Object} savedData - The comment data to save for undo. + */ + deleteComment(editor, savedData) { + const undo = () => { + editor.comment = savedData; + }; + const cmd = () => { + this._editorUndoBar?.show(undo, "comment"); + this.toggleComment(/* editor = */ null); + editor.comment = null; + }; + this.addCommands({ cmd, undo, mustExec: true }); + } + + toggleComment(editor, isSelected, visibility = undefined) { + this.#commentManager?.toggleCommentPopup(editor, isSelected, visibility); + } + + makeCommentColor(color, opacity) { + return ( + (color && this.#commentManager?.makeCommentColor(color, opacity)) || null + ); + } + + getCommentDialogElement() { + return this.#commentManager?.dialogElement || null; + } + + async waitForEditorsRendered(pageNumber) { + if (this.#allLayers.has(pageNumber - 1)) { + return; + } + const { resolve, promise } = Promise.withResolvers(); + const onEditorsRendered = evt => { + if (evt.pageNumber === pageNumber) { + this._eventBus._off("editorsrendered", onEditorsRendered); + resolve(); + } + }; + this._eventBus.on("editorsrendered", onEditorsRendered); + await promise; } getSignature(editor) { @@ -1107,6 +1260,26 @@ class AnnotationEditorUIManager { } } + onPagesEdited({ pagesMapper }) { + for (const editor of this.#allEditors.values()) { + editor.updatePageIndex( + pagesMapper.getPrevPageNumber(editor.pageIndex + 1) - 1 + ); + } + const allLayers = this.#allLayers; + const newAllLayers = (this.#allLayers = new Map()); + for (const [pageIndex, layer] of allLayers) { + const prevPageIndex = pagesMapper.getPrevPageNumber(pageIndex + 1) - 1; + if (prevPageIndex === -1) { + // TODO: handle the case where the deletion of the page has been undone. + layer.destroy(); + continue; + } + newAllLayers.set(prevPageIndex, layer); + layer.updatePageIndex(prevPageIndex); + } + } + onPageChanging({ pageNumber }) { this.#currentPageIndex = pageNumber - 1; } @@ -1240,6 +1413,26 @@ class AnnotationEditorUIManager { this.#floatingToolbar.show(textLayer, boxes, this.direction === "ltr"); } + /** + * Some annotations may have been modified in the annotation layer + * (e.g. comments added or modified). + * So this function retrieves the data from the storage and removes + * them from the storage in order to be able to save them later. + * @param {string} annotationId + * @returns {Object|null} The data associated to the annotation or null. + */ + getAndRemoveDataFromAnnotationStorage(annotationId) { + if (!this.#annotationStorage) { + return null; + } + const key = `${AnnotationEditorPrefix}${annotationId}`; + const storedValue = this.#annotationStorage.getRawValue(key); + if (storedValue) { + this.#annotationStorage.remove(key); + } + return storedValue; + } + /** * Add an editor in the annotation storage. * @param {AnnotationEditor} editor @@ -1463,12 +1656,12 @@ class AnnotationEditorUIManager { addEditListeners() { this.#addKeyboardManager(); - this.#addCopyPasteListeners(); + this.setEditingState(true); } removeEditListeners() { this.#removeKeyboardManager(); - this.#removeCopyPasteListeners(); + this.setEditingState(false); } dragOver(event) { @@ -1768,6 +1961,8 @@ class AnnotationEditorUIManager { * Change the editor mode (None, FreeText, Ink, ...) * @param {number} mode * @param {string|null} editId + * @param {boolean} [isFromUser] - true if the mode change is due to a + * user action. * @param {boolean} [isFromKeyboard] - true if the mode change is due to a * keyboard action. * @param {boolean} [mustEnterInEditMode] - true if the editor must enter in @@ -1778,6 +1973,7 @@ class AnnotationEditorUIManager { async updateMode( mode, editId = null, + isFromUser = false, isFromKeyboard = false, mustEnterInEditMode = false, editComment = false @@ -1800,27 +1996,34 @@ class AnnotationEditorUIManager { if (this.#mode === AnnotationEditorType.POPUP) { this.#commentManager?.hideSidebar(); } + this.#commentManager?.destroyPopup(); this.#mode = mode; if (mode === AnnotationEditorType.NONE) { this.setEditingState(false); this.#disableAll(); + for (const editor of this.#allEditors.values()) { + editor.hideStandaloneCommentButton(); + } this._editorUndoBar?.hide(); + this.toggleComment(/* editor = */ null); this.#updateModeCapability.resolve(); return; } + for (const editor of this.#allEditors.values()) { + editor.addStandaloneCommentButton(); + } + if (mode === AnnotationEditorType.SIGNATURE) { await this.#signatureManager?.loadSignatures(); } - if (mode === AnnotationEditorType.POPUP) { - this.#allEditableAnnotations ||= - await this.#pdfDocument.getAnnotationsByType( - new Set(this.#editorTypes.map(editorClass => editorClass._editorType)) - ); - this.#commentManager?.showSidebar(this.#allEditableAnnotations); + + if (isFromUser) { + // reinitialize the pointer type when the mode is changed by the user + CurrentPointers.clearPointerType(); } this.setEditingState(true); @@ -1829,6 +2032,39 @@ class AnnotationEditorUIManager { for (const layer of this.#allLayers.values()) { layer.updateMode(mode); } + + if (mode === AnnotationEditorType.POPUP) { + this.#allEditableAnnotations ||= + await this.#pdfDocument.getAnnotationsByType( + new Set(this.#editorTypes.map(editorClass => editorClass._editorType)) + ); + const elementIds = new Set(); + const allComments = []; + for (const editor of this.#allEditors.values()) { + const { annotationElementId, hasComment, deleted } = editor; + if (annotationElementId) { + elementIds.add(annotationElementId); + } + if (hasComment && !deleted) { + allComments.push(editor.getData()); + } + } + for (const annotation of this.#allEditableAnnotations) { + const { id, popupRef, contentsObj } = annotation; + if ( + popupRef && + contentsObj?.str && + !elementIds.has(id) && + !this.#deletedAnnotationsElementIds.has(id) + ) { + // The annotation exists in the PDF and has a comment but there + // is no editor for it (anymore). + allComments.push(annotation); + } + } + this.#commentManager?.showSidebar(allComments); + } + if (!editId) { if (isFromKeyboard) { this.addNewEditorFromKeyboard(); @@ -1839,12 +2075,14 @@ class AnnotationEditorUIManager { } for (const editor of this.#allEditors.values()) { - if (editor.annotationElementId === editId || editor.id === editId) { + if (editor.uid === editId) { this.setSelected(editor); if (editComment) { editor.editComment(); } else if (mustEnterInEditMode) { editor.enterInEditMode(); + } else { + editor.focus(); } } else { editor.unselect(); @@ -1984,16 +2222,14 @@ class AnnotationEditorUIManager { /** * Get all the editors belonging to a given page. * @param {number} pageIndex - * @returns {Array} + * @yields {AnnotationEditor} */ - getEditors(pageIndex) { - const editors = []; + *getEditors(pageIndex) { for (const editor of this.#allEditors.values()) { if (editor.pageIndex === pageIndex) { - editors.push(editor); + yield editor; } } - return editors; } /** @@ -2150,7 +2386,7 @@ class AnnotationEditorUIManager { setSelected(editor) { this.updateToolbar({ mode: editor.mode, - editId: editor.id, + editId: editor.uid, }); this.#currentDrawingSession?.commitOrRemove(); @@ -2565,6 +2801,10 @@ class AnnotationEditorUIManager { return this.#mode; } + isEditingMode() { + return this.#mode !== AnnotationEditorType.NONE; + } + get imageManager() { return shadow(this, "imageManager", new ImageManager()); } @@ -2688,5 +2928,6 @@ export { bindEvents, ColorManager, CommandManager, + CurrentPointers, KeyboardManager, }; diff --git a/src/display/fetch_stream.js b/src/display/fetch_stream.js index acbf3c868e37e..c1b1b636d63e7 100644 --- a/src/display/fetch_stream.js +++ b/src/display/fetch_stream.js @@ -13,14 +13,19 @@ * limitations under the License. */ -import { AbortException, assert, warn } from "../shared/util.js"; +import { AbortException, warn } from "../shared/util.js"; +import { + BasePDFStream, + BasePDFStreamRangeReader, + BasePDFStreamReader, +} from "../shared/base_pdf_stream.js"; import { createHeaders, createResponseError, + ensureResponseOrigin, extractFilenameFromHeader, getResponseOrigin, validateRangeRequestCapabilities, - validateResponseStatus, } from "./network_utils.js"; if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { @@ -29,15 +34,21 @@ if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { ); } -function createFetchOptions(headers, withCredentials, abortController) { - return { +function fetchUrl(url, headers, withCredentials, abortController) { + return fetch(url, { method: "GET", headers, signal: abortController.signal, mode: "cors", credentials: withCredentials ? "include" : "same-origin", redirect: "follow", - }; + }); +} + +function ensureResponseStatus(status, url) { + if (status !== 200 && status !== 206) { + throw createResponseError(status, url); + } } function getArrayBuffer(val) { @@ -51,86 +62,44 @@ function getArrayBuffer(val) { return new Uint8Array(val).buffer; } -/** @implements {IPDFStream} */ -class PDFFetchStream { +class PDFFetchStream extends BasePDFStream { _responseOrigin = null; constructor(source) { - this.source = source; + super(source, PDFFetchStreamReader, PDFFetchStreamRangeReader); this.isHttp = /^https?:/i.test(source.url); this.headers = createHeaders(this.isHttp, source.httpHeaders); - - this._fullRequestReader = null; - this._rangeRequestReaders = []; - } - - get _progressiveDataLength() { - return this._fullRequestReader?._loaded ?? 0; - } - - getFullReader() { - assert( - !this._fullRequestReader, - "PDFFetchStream.getFullReader can only be called once." - ); - this._fullRequestReader = new PDFFetchStreamReader(this); - return this._fullRequestReader; } +} - getRangeReader(begin, end) { - if (end <= this._progressiveDataLength) { - return null; - } - const reader = new PDFFetchStreamRangeReader(this, begin, end); - this._rangeRequestReaders.push(reader); - return reader; - } +class PDFFetchStreamReader extends BasePDFStreamReader { + _abortController = new AbortController(); - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); + _reader = null; - for (const reader of this._rangeRequestReaders.slice(0)) { - reader.cancel(reason); - } - } -} - -/** @implements {IPDFStreamReader} */ -class PDFFetchStreamReader { constructor(stream) { - this._stream = stream; - this._reader = null; - this._loaded = 0; - this._filename = null; - const source = stream.source; - this._withCredentials = source.withCredentials || false; - this._contentLength = source.length; - this._headersCapability = Promise.withResolvers(); - this._disableRange = source.disableRange || false; - this._rangeChunkSize = source.rangeChunkSize; - if (!this._rangeChunkSize && !this._disableRange) { - this._disableRange = true; - } + super(stream); + const { + disableRange, + disableStream, + length, + rangeChunkSize, + url, + withCredentials, + } = stream._source; - this._abortController = new AbortController(); - this._isStreamingSupported = !source.disableStream; - this._isRangeSupported = !source.disableRange; + this._contentLength = length; + this._isStreamingSupported = !disableStream; + this._isRangeSupported = !disableRange; // Always create a copy of the headers. const headers = new Headers(stream.headers); - const url = source.url; - fetch( - url, - createFetchOptions(headers, this._withCredentials, this._abortController) - ) + fetchUrl(url, headers, withCredentials, this._abortController) .then(response => { stream._responseOrigin = getResponseOrigin(response.url); - if (!validateResponseStatus(response.status)) { - throw createResponseError(response.status, url); - } + ensureResponseStatus(response.status, url); this._reader = response.body.getReader(); - this._headersCapability.resolve(); const responseHeaders = response.headers; @@ -138,8 +107,8 @@ class PDFFetchStreamReader { validateRangeRequestCapabilities({ responseHeaders, isHttp: stream.isHttp, - rangeChunkSize: this._rangeChunkSize, - disableRange: this._disableRange, + rangeChunkSize, + disableRange, }); this._isRangeSupported = allowRangeRequests; @@ -153,30 +122,10 @@ class PDFFetchStreamReader { if (!this._isStreamingSupported && this._isRangeSupported) { this.cancel(new AbortException("Streaming is disabled.")); } + + this._headersCapability.resolve(); }) .catch(this._headersCapability.reject); - - this.onProgress = null; - } - - get headersReady() { - return this._headersCapability.promise; - } - - get filename() { - return this._filename; - } - - get contentLength() { - return this._contentLength; - } - - get isRangeSupported() { - return this._isRangeSupported; - } - - get isStreamingSupported() { - return this._isStreamingSupported; } async read() { @@ -200,48 +149,32 @@ class PDFFetchStreamReader { } } -/** @implements {IPDFStreamRangeReader} */ -class PDFFetchStreamRangeReader { +class PDFFetchStreamRangeReader extends BasePDFStreamRangeReader { + _abortController = new AbortController(); + + _readCapability = Promise.withResolvers(); + + _reader = null; + constructor(stream, begin, end) { - this._stream = stream; - this._reader = null; - this._loaded = 0; - const source = stream.source; - this._withCredentials = source.withCredentials || false; - this._readCapability = Promise.withResolvers(); - this._isStreamingSupported = !source.disableStream; - - this._abortController = new AbortController(); + super(stream, begin, end); + const { url, withCredentials } = stream._source; + // Always create a copy of the headers. const headers = new Headers(stream.headers); headers.append("Range", `bytes=${begin}-${end - 1}`); - const url = source.url; - fetch( - url, - createFetchOptions(headers, this._withCredentials, this._abortController) - ) + fetchUrl(url, headers, withCredentials, this._abortController) .then(response => { const responseOrigin = getResponseOrigin(response.url); - if (responseOrigin !== stream._responseOrigin) { - throw new Error( - `Expected range response-origin "${responseOrigin}" to match "${stream._responseOrigin}".` - ); - } - if (!validateResponseStatus(response.status)) { - throw createResponseError(response.status, url); - } - this._readCapability.resolve(); + ensureResponseOrigin(responseOrigin, stream._responseOrigin); + ensureResponseStatus(response.status, url); this._reader = response.body.getReader(); + + this._readCapability.resolve(); }) .catch(this._readCapability.reject); - - this.onProgress = null; - } - - get isStreamingSupported() { - return this._isStreamingSupported; } async read() { @@ -250,9 +183,6 @@ class PDFFetchStreamRangeReader { if (done) { return { value, done }; } - this._loaded += value.byteLength; - this.onProgress?.({ loaded: this._loaded }); - return { value: getArrayBuffer(value), done: false }; } diff --git a/src/display/font_loader.js b/src/display/font_loader.js index e41357fcee0be..b7b27e6ddbfd8 100644 --- a/src/display/font_loader.js +++ b/src/display/font_loader.js @@ -19,10 +19,10 @@ import { isNodeJS, shadow, string32, - toBase64Util, unreachable, warn, } from "../shared/util.js"; +import { makePathFromDrawOPS } from "./display_utils.js"; class FontLoader { #systemFonts = new Set(); @@ -355,12 +355,11 @@ class FontLoader { } class FontFaceObject { - constructor(translatedData, inspectFont = null) { + #fontData; + + constructor(translatedData, inspectFont = null, extra, charProcOperatorList) { this.compiledGlyphs = Object.create(null); - // importing translated data - for (const i in translatedData) { - this[i] = translatedData[i]; - } + this.#fontData = translatedData; if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) { if (typeof this.disableFontFace !== "boolean") { unreachable("disableFontFace must be available."); @@ -370,6 +369,12 @@ class FontFaceObject { } } this._inspectFont = inspectFont; + if (extra) { + Object.assign(this, extra); + } + if (charProcOperatorList) { + this.charProcOperatorList = charProcOperatorList; + } } createNativeFontFace() { @@ -402,7 +407,7 @@ class FontFaceObject { return null; } // Add the @font-face rule to the document. - const url = `url(data:${this.mimetype};base64,${toBase64Util(this.data)});`; + const url = `url(data:${this.mimetype};base64,${this.data.toBase64()});`; let rule; if (!this.cssFontInfo) { rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`; @@ -430,7 +435,7 @@ class FontFaceObject { } catch (ex) { warn(`getPathGenerator - ignoring character: "${ex}".`); } - const path = new Path2D(cmds || ""); + const path = makePathFromDrawOPS(cmds?.path); if (!this.fontExtraProperties) { // Remove the raw path-string, since we don't need it anymore. @@ -438,6 +443,110 @@ class FontFaceObject { } return (this.compiledGlyphs[character] = path); } + + get black() { + return this.#fontData.black; + } + + get bold() { + return this.#fontData.bold; + } + + get disableFontFace() { + return this.#fontData.disableFontFace ?? false; + } + + set disableFontFace(value) { + shadow(this, "disableFontFace", !!value); + } + + get fontExtraProperties() { + return this.#fontData.fontExtraProperties ?? false; + } + + get isInvalidPDFjsFont() { + return this.#fontData.isInvalidPDFjsFont; + } + + get isType3Font() { + return this.#fontData.isType3Font; + } + + get italic() { + return this.#fontData.italic; + } + + get missingFile() { + return this.#fontData.missingFile; + } + + get remeasure() { + return this.#fontData.remeasure; + } + + get vertical() { + return this.#fontData.vertical; + } + + get ascent() { + return this.#fontData.ascent; + } + + get defaultWidth() { + return this.#fontData.defaultWidth; + } + + get descent() { + return this.#fontData.descent; + } + + get bbox() { + return this.#fontData.bbox; + } + + set bbox(bbox) { + shadow(this, "bbox", bbox); + } + + get fontMatrix() { + return this.#fontData.fontMatrix; + } + + get fallbackName() { + return this.#fontData.fallbackName; + } + + get loadedName() { + return this.#fontData.loadedName; + } + + get mimetype() { + return this.#fontData.mimetype; + } + + get name() { + return this.#fontData.name; + } + + get data() { + return this.#fontData.data; + } + + clearData() { + this.#fontData.clearData(); + } + + get cssFontInfo() { + return this.#fontData.cssFontInfo; + } + + get systemFontInfo() { + return this.#fontData.systemFontInfo; + } + + get defaultVMetrics() { + return this.#fontData.defaultVMetrics; + } } export { FontFaceObject, FontLoader }; diff --git a/src/display/network.js b/src/display/network.js index 34fa53ab92f5d..018df2024e4b2 100644 --- a/src/display/network.js +++ b/src/display/network.js @@ -14,9 +14,15 @@ */ import { assert, stringToBytes, warn } from "../shared/util.js"; +import { + BasePDFStream, + BasePDFStreamRangeReader, + BasePDFStreamReader, +} from "../shared/base_pdf_stream.js"; import { createHeaders, createResponseError, + ensureResponseOrigin, extractFilenameFromHeader, getResponseOrigin, validateRangeRequestCapabilities, @@ -31,77 +37,75 @@ if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { const OK_RESPONSE = 200; const PARTIAL_CONTENT_RESPONSE = 206; -function getArrayBuffer(xhr) { - const data = xhr.response; - if (typeof data !== "string") { - return data; - } - return stringToBytes(data).buffer; +function getArrayBuffer(val) { + return typeof val !== "string" ? val : stringToBytes(val).buffer; } -class NetworkManager { - _responseOrigin = null; +class PDFNetworkStream extends BasePDFStream { + #pendingRequests = new WeakMap(); - constructor({ url, httpHeaders, withCredentials }) { - this.url = url; - this.isHttp = /^https?:/i.test(url); - this.headers = createHeaders(this.isHttp, httpHeaders); - this.withCredentials = withCredentials || false; + _responseOrigin = null; - this.currXhrId = 0; - this.pendingRequests = Object.create(null); + constructor(source) { + super(source, PDFNetworkStreamReader, PDFNetworkStreamRangeReader); + this.url = source.url; + this.isHttp = /^https?:/i.test(this.url); + this.headers = createHeaders(this.isHttp, source.httpHeaders); } - request(args) { + /** + * @ignore + */ + _request(args) { const xhr = new XMLHttpRequest(); - const xhrId = this.currXhrId++; - const pendingRequest = (this.pendingRequests[xhrId] = { xhr }); + const pendingRequest = { + validateStatus: null, + onHeadersReceived: args.onHeadersReceived, + onDone: args.onDone, + onError: args.onError, + onProgress: args.onProgress, + }; + this.#pendingRequests.set(xhr, pendingRequest); xhr.open("GET", this.url); - xhr.withCredentials = this.withCredentials; + xhr.withCredentials = this._source.withCredentials; for (const [key, val] of this.headers) { xhr.setRequestHeader(key, val); } if (this.isHttp && "begin" in args && "end" in args) { xhr.setRequestHeader("Range", `bytes=${args.begin}-${args.end - 1}`); - pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE; + + // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2: + // "A server MAY ignore the Range header". This means it's possible to + // get a 200 rather than a 206 response from a range request. + pendingRequest.validateStatus = status => + status === PARTIAL_CONTENT_RESPONSE || status === OK_RESPONSE; } else { - pendingRequest.expectedStatus = OK_RESPONSE; + pendingRequest.validateStatus = status => status === OK_RESPONSE; } xhr.responseType = "arraybuffer"; assert(args.onError, "Expected `onError` callback to be provided."); - xhr.onerror = () => { - args.onError(xhr.status); - }; - xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); - xhr.onprogress = this.onProgress.bind(this, xhrId); - - pendingRequest.onHeadersReceived = args.onHeadersReceived; - pendingRequest.onDone = args.onDone; - pendingRequest.onError = args.onError; - pendingRequest.onProgress = args.onProgress; + xhr.onerror = () => args.onError(xhr.status); + xhr.onreadystatechange = this.#onStateChange.bind(this, xhr); + xhr.onprogress = this.#onProgress.bind(this, xhr); xhr.send(null); - return xhrId; + return xhr; } - onProgress(xhrId, evt) { - const pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - return; // Maybe abortRequest was called... - } - pendingRequest.onProgress?.(evt); + #onProgress(xhr, evt) { + const pendingRequest = this.#pendingRequests.get(xhr); + pendingRequest?.onProgress?.(evt); } - onStateChange(xhrId, evt) { - const pendingRequest = this.pendingRequests[xhrId]; + #onStateChange(xhr, evt) { + const pendingRequest = this.#pendingRequests.get(xhr); if (!pendingRequest) { return; // Maybe abortRequest was called... } - const xhr = pendingRequest.xhr; if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { pendingRequest.onHeadersReceived(); delete pendingRequest.onHeadersReceived; @@ -111,13 +115,12 @@ class NetworkManager { return; } - if (!(xhrId in this.pendingRequests)) { + if (!this.#pendingRequests.has(xhr)) { // The XHR request might have been aborted in onHeadersReceived() // callback, in which case we should abort request. return; } - - delete this.pendingRequests[xhrId]; + this.#pendingRequests.delete(xhr); // Success status == 0 can be on ftp, file and other protocols. if (xhr.status === 0 && this.isHttp) { @@ -126,147 +129,79 @@ class NetworkManager { } const xhrStatus = xhr.status || OK_RESPONSE; - // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2: - // "A server MAY ignore the Range header". This means it's possible to - // get a 200 rather than a 206 response from a range request. - const ok_response_on_range_request = - xhrStatus === OK_RESPONSE && - pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; - - if ( - !ok_response_on_range_request && - xhrStatus !== pendingRequest.expectedStatus - ) { + if (!pendingRequest.validateStatus(xhrStatus)) { pendingRequest.onError(xhr.status); return; } - const chunk = getArrayBuffer(xhr); + const chunk = getArrayBuffer(xhr.response); if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { const rangeHeader = xhr.getResponseHeader("Content-Range"); - const matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); - if (matches) { - pendingRequest.onDone({ - begin: parseInt(matches[1], 10), - chunk, - }); + if (/bytes (\d+)-(\d+)\/(\d+)/.test(rangeHeader)) { + pendingRequest.onDone(chunk); } else { warn(`Missing or invalid "Content-Range" header.`); pendingRequest.onError(0); } } else if (chunk) { - pendingRequest.onDone({ - begin: 0, - chunk, - }); + pendingRequest.onDone(chunk); } else { pendingRequest.onError(xhr.status); } } - getRequestXhr(xhrId) { - return this.pendingRequests[xhrId].xhr; + /** + * Abort the request, if it's pending. + * @ignore + */ + _abortRequest(xhr) { + if (this.#pendingRequests.has(xhr)) { + this.#pendingRequests.delete(xhr); + xhr.abort(); + } } - isPendingRequest(xhrId) { - return xhrId in this.pendingRequests; - } + getRangeReader(begin, end) { + const reader = super.getRangeReader(begin, end); - abortRequest(xhrId) { - const xhr = this.pendingRequests[xhrId].xhr; - delete this.pendingRequests[xhrId]; - xhr.abort(); + if (reader) { + reader.onClosed = () => this._rangeReaders.delete(reader); + } + return reader; } } -/** @implements {IPDFStream} */ -class PDFNetworkStream { - constructor(source) { - this._source = source; - this._manager = new NetworkManager(source); - this._rangeChunkSize = source.rangeChunkSize; - this._fullRequestReader = null; - this._rangeRequestReaders = []; - } +class PDFNetworkStreamReader extends BasePDFStreamReader { + _cachedChunks = []; - _onRangeRequestReaderClosed(reader) { - const i = this._rangeRequestReaders.indexOf(reader); - if (i >= 0) { - this._rangeRequestReaders.splice(i, 1); - } - } + _done = false; - getFullReader() { - assert( - !this._fullRequestReader, - "PDFNetworkStream.getFullReader can only be called once." - ); - this._fullRequestReader = new PDFNetworkStreamFullRequestReader( - this._manager, - this._source - ); - return this._fullRequestReader; - } + _requests = []; - getRangeReader(begin, end) { - const reader = new PDFNetworkStreamRangeRequestReader( - this._manager, - begin, - end - ); - reader.onClosed = this._onRangeRequestReaderClosed.bind(this); - this._rangeRequestReaders.push(reader); - return reader; - } + _storedError = null; - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); + constructor(stream) { + super(stream); + const { length } = stream._source; - for (const reader of this._rangeRequestReaders.slice(0)) { - reader.cancel(reason); - } - } -} + this._contentLength = length; + // Note that `XMLHttpRequest` doesn't support streaming, and range requests + // will be enabled (if supported) in `this.#onHeadersReceived` below. -/** @implements {IPDFStreamReader} */ -class PDFNetworkStreamFullRequestReader { - constructor(manager, source) { - this._manager = manager; - - this._url = source.url; - this._fullRequestId = manager.request({ - onHeadersReceived: this._onHeadersReceived.bind(this), - onDone: this._onDone.bind(this), - onError: this._onError.bind(this), - onProgress: this._onProgress.bind(this), + this._fullRequestXhr = stream._request({ + onHeadersReceived: this.#onHeadersReceived.bind(this), + onDone: this.#onDone.bind(this), + onError: this.#onError.bind(this), + onProgress: this.#onProgress.bind(this), }); - this._headersCapability = Promise.withResolvers(); - this._disableRange = source.disableRange || false; - this._contentLength = source.length; // Optional - this._rangeChunkSize = source.rangeChunkSize; - if (!this._rangeChunkSize && !this._disableRange) { - this._disableRange = true; - } - - this._isStreamingSupported = false; - this._isRangeSupported = false; - - this._cachedChunks = []; - this._requests = []; - this._done = false; - this._storedError = undefined; - this._filename = null; - - this.onProgress = null; } - _onHeadersReceived() { - const fullRequestXhrId = this._fullRequestId; - const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId); + #onHeadersReceived() { + const stream = this._stream; + const { disableRange, rangeChunkSize } = stream._source; + const fullRequestXhr = this._fullRequestXhr; - this._manager._responseOrigin = getResponseOrigin( - fullRequestXhr.responseURL - ); + stream._responseOrigin = getResponseOrigin(fullRequestXhr.responseURL); const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders(); const responseHeaders = new Headers( @@ -285,9 +220,9 @@ class PDFNetworkStreamFullRequestReader { const { allowRangeRequests, suggestedLength } = validateRangeRequestCapabilities({ responseHeaders, - isHttp: this._manager.isHttp, - rangeChunkSize: this._rangeChunkSize, - disableRange: this._disableRange, + isHttp: stream.isHttp, + rangeChunkSize, + disableRange, }); if (allowRangeRequests) { @@ -303,68 +238,46 @@ class PDFNetworkStreamFullRequestReader { // requests, there will be an issue for sites where you can only // request the pdf once. However, if this is the case, then the // server should not be returning that it can support range requests. - this._manager.abortRequest(fullRequestXhrId); + stream._abortRequest(fullRequestXhr); } this._headersCapability.resolve(); } - _onDone(data) { - if (data) { - if (this._requests.length > 0) { - const requestCapability = this._requests.shift(); - requestCapability.resolve({ value: data.chunk, done: false }); - } else { - this._cachedChunks.push(data.chunk); - } + #onDone(chunk) { + if (this._requests.length > 0) { + const capability = this._requests.shift(); + capability.resolve({ value: chunk, done: false }); + } else { + this._cachedChunks.push(chunk); } this._done = true; if (this._cachedChunks.length > 0) { return; } - for (const requestCapability of this._requests) { - requestCapability.resolve({ value: undefined, done: true }); + for (const capability of this._requests) { + capability.resolve({ value: undefined, done: true }); } this._requests.length = 0; } - _onError(status) { - this._storedError = createResponseError(status, this._url); + #onError(status) { + this._storedError = createResponseError(status, this._stream.url); this._headersCapability.reject(this._storedError); - for (const requestCapability of this._requests) { - requestCapability.reject(this._storedError); + for (const capability of this._requests) { + capability.reject(this._storedError); } this._requests.length = 0; this._cachedChunks.length = 0; } - _onProgress(evt) { + #onProgress(evt) { this.onProgress?.({ loaded: evt.loaded, total: evt.lengthComputable ? evt.total : this._contentLength, }); } - get filename() { - return this._filename; - } - - get isRangeSupported() { - return this._isRangeSupported; - } - - get isStreamingSupported() { - return this._isStreamingSupported; - } - - get contentLength() { - return this._contentLength; - } - - get headersReady() { - return this._headersCapability.promise; - } - async read() { await this._headersCapability.promise; @@ -378,100 +291,82 @@ class PDFNetworkStreamFullRequestReader { if (this._done) { return { value: undefined, done: true }; } - const requestCapability = Promise.withResolvers(); - this._requests.push(requestCapability); - return requestCapability.promise; + const capability = Promise.withResolvers(); + this._requests.push(capability); + return capability.promise; } cancel(reason) { this._done = true; this._headersCapability.reject(reason); - for (const requestCapability of this._requests) { - requestCapability.resolve({ value: undefined, done: true }); + for (const capability of this._requests) { + capability.resolve({ value: undefined, done: true }); } this._requests.length = 0; - if (this._manager.isPendingRequest(this._fullRequestId)) { - this._manager.abortRequest(this._fullRequestId); - } - this._fullRequestReader = null; + + this._stream._abortRequest(this._fullRequestXhr); + this._fullRequestXhr = null; } } -/** @implements {IPDFStreamRangeReader} */ -class PDFNetworkStreamRangeRequestReader { - constructor(manager, begin, end) { - this._manager = manager; +class PDFNetworkStreamRangeReader extends BasePDFStreamRangeReader { + onClosed = null; - this._url = manager.url; - this._requestId = manager.request({ + _done = false; + + _queuedChunk = null; + + _requests = []; + + _storedError = null; + + constructor(stream, begin, end) { + super(stream, begin, end); + + this._requestXhr = stream._request({ begin, end, - onHeadersReceived: this._onHeadersReceived.bind(this), - onDone: this._onDone.bind(this), - onError: this._onError.bind(this), - onProgress: this._onProgress.bind(this), + onHeadersReceived: this.#onHeadersReceived.bind(this), + onDone: this.#onDone.bind(this), + onError: this.#onError.bind(this), + onProgress: null, }); - this._requests = []; - this._queuedChunk = null; - this._done = false; - this._storedError = undefined; - - this.onProgress = null; - this.onClosed = null; } - _onHeadersReceived() { - const responseOrigin = getResponseOrigin( - this._manager.getRequestXhr(this._requestId)?.responseURL - ); - - if (responseOrigin !== this._manager._responseOrigin) { - this._storedError = new Error( - `Expected range response-origin "${responseOrigin}" to match "${this._manager._responseOrigin}".` - ); - this._onError(0); + #onHeadersReceived() { + const responseOrigin = getResponseOrigin(this._requestXhr?.responseURL); + try { + ensureResponseOrigin(responseOrigin, this._stream._responseOrigin); + } catch (ex) { + this._storedError = ex; + this.#onError(0); } } - _close() { - this.onClosed?.(this); - } - - _onDone(data) { - const chunk = data.chunk; + #onDone(chunk) { if (this._requests.length > 0) { - const requestCapability = this._requests.shift(); - requestCapability.resolve({ value: chunk, done: false }); + const capability = this._requests.shift(); + capability.resolve({ value: chunk, done: false }); } else { this._queuedChunk = chunk; } this._done = true; - for (const requestCapability of this._requests) { - requestCapability.resolve({ value: undefined, done: true }); + for (const capability of this._requests) { + capability.resolve({ value: undefined, done: true }); } this._requests.length = 0; - this._close(); + this.onClosed?.(); } - _onError(status) { - this._storedError ??= createResponseError(status, this._url); - for (const requestCapability of this._requests) { - requestCapability.reject(this._storedError); + #onError(status) { + this._storedError ??= createResponseError(status, this._stream.url); + for (const capability of this._requests) { + capability.reject(this._storedError); } this._requests.length = 0; this._queuedChunk = null; } - _onProgress(evt) { - if (!this.isStreamingSupported) { - this.onProgress?.({ loaded: evt.loaded }); - } - } - - get isStreamingSupported() { - return false; - } - async read() { if (this._storedError) { throw this._storedError; @@ -484,21 +379,20 @@ class PDFNetworkStreamRangeRequestReader { if (this._done) { return { value: undefined, done: true }; } - const requestCapability = Promise.withResolvers(); - this._requests.push(requestCapability); - return requestCapability.promise; + const capability = Promise.withResolvers(); + this._requests.push(capability); + return capability.promise; } cancel(reason) { this._done = true; - for (const requestCapability of this._requests) { - requestCapability.resolve({ value: undefined, done: true }); + for (const capability of this._requests) { + capability.resolve({ value: undefined, done: true }); } this._requests.length = 0; - if (this._manager.isPendingRequest(this._requestId)) { - this._manager.abortRequest(this._requestId); - } - this._close(); + + this._stream._abortRequest(this._requestXhr); + this.onClosed?.(); } } diff --git a/src/display/network_utils.js b/src/display/network_utils.js index 5af942a9f32a5..0e8a7cffc601b 100644 --- a/src/display/network_utils.js +++ b/src/display/network_utils.js @@ -107,15 +107,19 @@ function createResponseError(status, url) { ); } -function validateResponseStatus(status) { - return status === 200 || status === 206; +function ensureResponseOrigin(rangeOrigin, origin) { + if (rangeOrigin !== origin) { + throw new Error( + `Expected range response-origin "${rangeOrigin}" to match "${origin}".` + ); + } } export { createHeaders, createResponseError, + ensureResponseOrigin, extractFilenameFromHeader, getResponseOrigin, validateRangeRequestCapabilities, - validateResponseStatus, }; diff --git a/src/display/node_stream.js b/src/display/node_stream.js index 36f1b1a8dd4bb..35dfaefdfe13f 100644 --- a/src/display/node_stream.js +++ b/src/display/node_stream.js @@ -14,7 +14,12 @@ */ /* globals process */ -import { AbortException, assert } from "../shared/util.js"; +import { AbortException, assert, warn } from "../shared/util.js"; +import { + BasePDFStream, + BasePDFStreamRangeReader, + BasePDFStreamReader, +} from "../shared/base_pdf_stream.js"; import { createResponseError } from "./network_utils.js"; if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { @@ -33,263 +38,147 @@ function parseUrlOrPath(sourceUrl) { return new URL(url.pathToFileURL(sourceUrl)); } -class PDFNodeStream { - constructor(source) { - this.source = source; - this.url = parseUrlOrPath(source.url); - assert( - this.url.protocol === "file:", - "PDFNodeStream only supports file:// URLs." - ); +function getReadableStream(readStream) { + const { Readable } = process.getBuiltinModule("stream"); - this._fullRequestReader = null; - this._rangeRequestReaders = []; + if (typeof Readable.toWeb === "function") { + // See https://nodejs.org/api/stream.html#streamreadabletowebstreamreadable-options + return Readable.toWeb(readStream); } + // Fallback to support Node.js versions older than `24.0.0` and `22.17.0`. + const require = process + .getBuiltinModule("module") + .createRequire(import.meta.url); - get _progressiveDataLength() { - return this._fullRequestReader?._loaded ?? 0; - } + const polyfill = require("node-readable-to-web-readable-stream"); + return polyfill.makeDefaultReadableStreamFromNodeReadable(readStream); +} - getFullReader() { - assert( - !this._fullRequestReader, - "PDFNodeStream.getFullReader can only be called once." - ); - this._fullRequestReader = new PDFNodeStreamFsFullReader(this); - return this._fullRequestReader; +function getArrayBuffer(val) { + if (val instanceof Uint8Array) { + return val.buffer; } - - getRangeReader(start, end) { - if (end <= this._progressiveDataLength) { - return null; - } - const rangeReader = new PDFNodeStreamFsRangeReader(this, start, end); - this._rangeRequestReaders.push(rangeReader); - return rangeReader; + if (val instanceof ArrayBuffer) { + return val; } + warn(`getArrayBuffer - unexpected data format: ${val}`); + return new Uint8Array(val).buffer; +} - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); - - for (const reader of this._rangeRequestReaders.slice(0)) { - reader.cancel(reason); - } +class PDFNodeStream extends BasePDFStream { + constructor(source) { + super(source, PDFNodeStreamReader, PDFNodeStreamRangeReader); + this.url = parseUrlOrPath(source.url); + assert( + this.url.protocol === "file:", + "PDFNodeStream only supports file:// URLs." + ); } } -class PDFNodeStreamFsFullReader { - constructor(stream) { - this._url = stream.url; - this._done = false; - this._storedError = null; - this.onProgress = null; - const source = stream.source; - this._contentLength = source.length; // optional - this._loaded = 0; - this._filename = null; +class PDFNodeStreamReader extends BasePDFStreamReader { + _reader = null; - this._disableRange = source.disableRange || false; - this._rangeChunkSize = source.rangeChunkSize; - if (!this._rangeChunkSize && !this._disableRange) { - this._disableRange = true; - } - - this._isStreamingSupported = !source.disableStream; - this._isRangeSupported = !source.disableRange; + constructor(stream) { + super(stream); + const { disableRange, disableStream, length, rangeChunkSize } = + stream._source; - this._readableStream = null; - this._readCapability = Promise.withResolvers(); - this._headersCapability = Promise.withResolvers(); + this._contentLength = length; + this._isStreamingSupported = !disableStream; + this._isRangeSupported = !disableRange; + const url = stream.url; const fs = process.getBuiltinModule("fs"); - fs.promises.lstat(this._url).then( - stat => { + fs.promises + .lstat(url) + .then(stat => { + const readStream = fs.createReadStream(url); + const readableStream = getReadableStream(readStream); + + this._reader = readableStream.getReader(); + + const { size } = stat; + if (size <= 2 * rangeChunkSize) { + // The file size is smaller than the size of two chunks, so it doesn't + // make any sense to abort the request and retry with a range request. + this._isRangeSupported = false; + } // Setting right content length. - this._contentLength = stat.size; + this._contentLength = size; + + // We need to stop reading when range is supported and streaming is + // disabled. + if (!this._isStreamingSupported && this._isRangeSupported) { + this.cancel(new AbortException("Streaming is disabled.")); + } - this._setReadableStream(fs.createReadStream(this._url)); this._headersCapability.resolve(); - }, - error => { + }) + .catch(error => { if (error.code === "ENOENT") { - error = createResponseError(/* status = */ 0, this._url.href); + error = createResponseError(/* status = */ 0, url.href); } - this._storedError = error; this._headersCapability.reject(error); - } - ); - } - - get headersReady() { - return this._headersCapability.promise; - } - - get filename() { - return this._filename; - } - - get contentLength() { - return this._contentLength; - } - - get isRangeSupported() { - return this._isRangeSupported; - } - - get isStreamingSupported() { - return this._isStreamingSupported; + }); } async read() { - await this._readCapability.promise; - if (this._done) { - return { value: undefined, done: true }; + await this._headersCapability.promise; + const { value, done } = await this._reader.read(); + if (done) { + return { value, done }; } - if (this._storedError) { - throw this._storedError; - } - - const chunk = this._readableStream.read(); - if (chunk === null) { - this._readCapability = Promise.withResolvers(); - return this.read(); - } - this._loaded += chunk.length; + this._loaded += value.length; this.onProgress?.({ loaded: this._loaded, total: this._contentLength, }); - // Ensure that `read()` method returns ArrayBuffer. - const buffer = new Uint8Array(chunk).buffer; - return { value: buffer, done: false }; + return { value: getArrayBuffer(value), done: false }; } cancel(reason) { - // Call `this._error()` method when cancel is called - // before _readableStream is set. - if (!this._readableStream) { - this._error(reason); - return; - } - this._readableStream.destroy(reason); + this._reader?.cancel(reason); } +} - _error(reason) { - this._storedError = reason; - this._readCapability.resolve(); - } +class PDFNodeStreamRangeReader extends BasePDFStreamRangeReader { + _readCapability = Promise.withResolvers(); - _setReadableStream(readableStream) { - this._readableStream = readableStream; - readableStream.on("readable", () => { - this._readCapability.resolve(); - }); + _reader = null; - readableStream.on("end", () => { - // Destroy readable to minimize resource usage. - readableStream.destroy(); - this._done = true; - this._readCapability.resolve(); - }); + constructor(stream, begin, end) { + super(stream, begin, end); - readableStream.on("error", reason => { - this._error(reason); - }); + const url = stream.url; + const fs = process.getBuiltinModule("fs"); + try { + const readStream = fs.createReadStream(url, { + start: begin, + end: end - 1, + }); + const readableStream = getReadableStream(readStream); - // We need to stop reading when range is supported and streaming is - // disabled. - if (!this._isStreamingSupported && this._isRangeSupported) { - this._error(new AbortException("streaming is disabled")); - } + this._reader = readableStream.getReader(); - // Destroy ReadableStream if already in errored state. - if (this._storedError) { - this._readableStream.destroy(this._storedError); + this._readCapability.resolve(); + } catch (error) { + this._readCapability.reject(error); } } -} - -class PDFNodeStreamFsRangeReader { - constructor(stream, start, end) { - this._url = stream.url; - this._done = false; - this._storedError = null; - this.onProgress = null; - this._loaded = 0; - this._readableStream = null; - this._readCapability = Promise.withResolvers(); - const source = stream.source; - this._isStreamingSupported = !source.disableStream; - - const fs = process.getBuiltinModule("fs"); - this._setReadableStream( - fs.createReadStream(this._url, { start, end: end - 1 }) - ); - } - - get isStreamingSupported() { - return this._isStreamingSupported; - } async read() { await this._readCapability.promise; - if (this._done) { - return { value: undefined, done: true }; - } - if (this._storedError) { - throw this._storedError; - } - - const chunk = this._readableStream.read(); - if (chunk === null) { - this._readCapability = Promise.withResolvers(); - return this.read(); + const { value, done } = await this._reader.read(); + if (done) { + return { value, done }; } - this._loaded += chunk.length; - this.onProgress?.({ loaded: this._loaded }); - - // Ensure that `read()` method returns ArrayBuffer. - const buffer = new Uint8Array(chunk).buffer; - return { value: buffer, done: false }; + return { value: getArrayBuffer(value), done: false }; } cancel(reason) { - // Call `this._error()` method when cancel is called - // before _readableStream is set. - if (!this._readableStream) { - this._error(reason); - return; - } - this._readableStream.destroy(reason); - } - - _error(reason) { - this._storedError = reason; - this._readCapability.resolve(); - } - - _setReadableStream(readableStream) { - this._readableStream = readableStream; - readableStream.on("readable", () => { - this._readCapability.resolve(); - }); - - readableStream.on("end", () => { - // Destroy readableStream to minimize resource usage. - readableStream.destroy(); - this._done = true; - this._readCapability.resolve(); - }); - - readableStream.on("error", reason => { - this._error(reason); - }); - - // Destroy readableStream if already in errored state. - if (this._storedError) { - this._readableStream.destroy(this._storedError); - } + this._reader?.cancel(reason); } } diff --git a/src/display/pattern_helper.js b/src/display/pattern_helper.js index 6bb6fe1201e26..d460de365637e 100644 --- a/src/display/pattern_helper.js +++ b/src/display/pattern_helper.js @@ -13,7 +13,13 @@ * limitations under the License. */ -import { FormatError, info, unreachable, Util } from "../shared/util.js"; +import { + FormatError, + info, + MeshFigureType, + unreachable, + Util, +} from "../shared/util.js"; import { getCurrentTransform } from "./display_utils.js"; const PathType = { @@ -65,23 +71,51 @@ class RadialAxialShadingPattern extends BaseShadingPattern { this.matrix = null; } - _createGradient(ctx) { + isOriginBased() { + return ( + this._p0[0] === 0 && + this._p0[1] === 0 && + (!this.isRadial() || (this._p1[0] === 0 && this._p1[1] === 0)) + ); + } + + isRadial() { + return this._type === "radial"; + } + + _createGradient(ctx, transform = null) { let grad; + let firstPoint = this._p0; + let secondPoint = this._p1; + if (transform) { + firstPoint = firstPoint.slice(); + secondPoint = secondPoint.slice(); + Util.applyTransform(firstPoint, transform); + Util.applyTransform(secondPoint, transform); + } if (this._type === "axial") { grad = ctx.createLinearGradient( - this._p0[0], - this._p0[1], - this._p1[0], - this._p1[1] + firstPoint[0], + firstPoint[1], + secondPoint[0], + secondPoint[1] ); } else if (this._type === "radial") { + let r0 = this._r0; + let r1 = this._r1; + if (transform) { + const scale = new Float32Array(2); + Util.singularValueDecompose2dScale(transform, scale); + r0 *= scale[0]; + r1 *= scale[0]; + } grad = ctx.createRadialGradient( - this._p0[0], - this._p0[1], - this._r0, - this._p1[0], - this._p1[1], - this._r1 + firstPoint[0], + firstPoint[1], + r0, + secondPoint[0], + secondPoint[1], + r1 ); } @@ -94,6 +128,32 @@ class RadialAxialShadingPattern extends BaseShadingPattern { getPattern(ctx, owner, inverse, pathType) { let pattern; if (pathType === PathType.STROKE || pathType === PathType.FILL) { + if (this.isOriginBased()) { + let transf = Util.transform(inverse, owner.baseTransform); + if (this.matrix) { + transf = Util.transform(transf, this.matrix); + } + const precision = 1e-3; + const n1 = Math.hypot(transf[0], transf[1]); + const n2 = Math.hypot(transf[2], transf[3]); + const ps = (transf[0] * transf[2] + transf[1] * transf[3]) / (n1 * n2); + if (Math.abs(ps) < precision) { + // The images of the basis vectors are orthogonal. + if (this.isRadial()) { + // If the images of the basis vectors are a square then the + // circles are transformed to circles and we can use a gradient + // directly. + if (Math.abs(n1 - n2) < precision) { + return this._createGradient(ctx, transf); + } + } else { + // The rectangles are transformed to rectangles and we can use a + // gradient directly. + return this._createGradient(ctx, transf); + } + } + } + const ownerBBox = owner.current.getClippedPathBoundingBox( pathType, getCurrentTransform(ctx) @@ -261,7 +321,7 @@ function drawFigure(data, figure, context) { const cs = figure.colors; let i, ii; switch (figure.type) { - case "lattice": + case MeshFigureType.LATTICE: const verticesPerRow = figure.verticesPerRow; const rows = Math.floor(ps.length / verticesPerRow) - 1; const cols = verticesPerRow - 1; @@ -291,7 +351,7 @@ function drawFigure(data, figure, context) { } } break; - case "triangles": + case MeshFigureType.TRIANGLES: for (i = 0, ii = ps.length; i < ii; i += 3) { drawTriangle( data, @@ -478,7 +538,7 @@ class TilingPattern { this.baseTransform = baseTransform; } - createPatternCanvas(owner) { + createPatternCanvas(owner, opIdx) { const { bbox, operatorList, @@ -567,7 +627,7 @@ class TilingPattern { dimy.size ); const tmpCtx = tmpCanvas.context; - const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); + const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx, opIdx); graphics.groupLevel = owner.groupLevel; this.setFillAndStrokeStyleToContext(graphics, paintType, color); @@ -600,7 +660,7 @@ class TilingPattern { graphics.endDrawing(); - graphics.dependencyTracker?.restore().recordNestedDependencies?.(); + graphics.dependencyTracker?.restore(); tmpCtx.restore(); if (redrawHorizontally || redrawVertically) { @@ -726,7 +786,7 @@ class TilingPattern { return false; } - getPattern(ctx, owner, inverse, pathType) { + getPattern(ctx, owner, inverse, pathType, opIdx) { // PDF spec 8.7.2 NOTE 1: pattern's matrix is relative to initial matrix. let matrix = inverse; if (pathType !== PathType.SHADING) { @@ -736,7 +796,7 @@ class TilingPattern { } } - const temporaryPatternCanvas = this.createPatternCanvas(owner); + const temporaryPatternCanvas = this.createPatternCanvas(owner, opIdx); let domMatrix = new DOMMatrix(matrix); // Rescale and so that the ctx.createPattern call generates a pattern with diff --git a/src/display/text_layer.js b/src/display/text_layer.js index 724924dc6f13a..a1e9e82abe298 100644 --- a/src/display/text_layer.js +++ b/src/display/text_layer.js @@ -128,6 +128,7 @@ class TextLayer { this.#pageHeight = pageHeight; TextLayer.#ensureMinFontSizeComputed(); + container.style.setProperty("--min-font-size", TextLayer.#minFontSize); setLayerDimensions(container, viewport); @@ -293,6 +294,9 @@ class TextLayer { if (item.id) { this.#container.setAttribute("id", `${item.id}`); } + if (item.tag === "Artifact") { + this.#container.ariaHidden = true; + } parent.append(this.#container); } else if (item.type === "endMarkedContent") { this.#container = this.#container.parentNode; @@ -342,23 +346,12 @@ class TextLayer { top = tx[5] - fontAscent * Math.cos(angle); } - const scaleFactorStr = "calc(var(--total-scale-factor) *"; const divStyle = textDiv.style; // Setting the style properties individually, rather than all at once, // should be OK since the `textDiv` isn't appended to the document yet. - if (this.#container === this.#rootContainer) { - divStyle.left = `${((100 * left) / this.#pageWidth).toFixed(2)}%`; - divStyle.top = `${((100 * top) / this.#pageHeight).toFixed(2)}%`; - } else { - // We're in a marked content span, hence we can't use percents. - divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`; - divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`; - } - // We multiply the font size by #minFontSize, and then #layout will - // scale the element by 1/#minFontSize. This allows us to effectively - // ignore the minimum font size enforced by the browser, so that the text - // layer s can always match the size of the text in the canvas. - divStyle.fontSize = `${scaleFactorStr}${(TextLayer.#minFontSize * fontHeight).toFixed(2)}px)`; + divStyle.left = `${((100 * left) / this.#pageWidth).toFixed(2)}%`; + divStyle.top = `${((100 * top) / this.#pageHeight).toFixed(2)}%`; + divStyle.setProperty("--font-height", `${fontHeight.toFixed(2)}px`); divStyle.fontFamily = fontFamily; textDivProperties.fontSize = fontHeight; @@ -421,11 +414,6 @@ class TextLayer { const { div, properties, ctx } = params; const { style } = div; - let transform = ""; - if (TextLayer.#minFontSize > 1) { - transform = `scale(${1 / TextLayer.#minFontSize})`; - } - if (properties.canvasWidth !== 0 && properties.hasText) { const { fontFamily } = style; const { canvasWidth, fontSize } = properties; @@ -435,14 +423,11 @@ class TextLayer { const { width } = ctx.measureText(div.textContent); if (width > 0) { - transform = `scaleX(${(canvasWidth * this.#scale) / width}) ${transform}`; + style.setProperty("--scale-x", (canvasWidth * this.#scale) / width); } } if (properties.angle !== 0) { - transform = `rotate(${properties.angle}deg) ${transform}`; - } - if (transform.length > 0) { - style.transform = transform; + style.setProperty("--rotate", `${properties.angle}deg`); } } diff --git a/src/display/transport_stream.js b/src/display/transport_stream.js index 36bef6dc10eb0..57423932b78c2 100644 --- a/src/display/transport_stream.js +++ b/src/display/transport_stream.js @@ -13,185 +13,137 @@ * limitations under the License. */ -/** @typedef {import("../interfaces").IPDFStream} IPDFStream */ -/** @typedef {import("../interfaces").IPDFStreamReader} IPDFStreamReader */ -// eslint-disable-next-line max-len -/** @typedef {import("../interfaces").IPDFStreamRangeReader} IPDFStreamRangeReader */ - +import { + BasePDFStream, + BasePDFStreamRangeReader, + BasePDFStreamReader, +} from "../shared/base_pdf_stream.js"; import { assert } from "../shared/util.js"; import { isPdfFile } from "./display_utils.js"; -/** @implements {IPDFStream} */ -class PDFDataTransportStream { - constructor( - pdfDataRangeTransport, - { disableRange = false, disableStream = false } - ) { - assert( - pdfDataRangeTransport, - 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.' - ); - const { length, initialData, progressiveDone, contentDispositionFilename } = - pdfDataRangeTransport; +function getArrayBuffer(val) { + // Prevent any possible issues by only transferring a Uint8Array that + // completely "utilizes" its underlying ArrayBuffer. + return val instanceof Uint8Array && val.byteLength === val.buffer.byteLength + ? val.buffer + : new Uint8Array(val).buffer; +} - this._queuedChunks = []; - this._progressiveDone = progressiveDone; - this._contentDispositionFilename = contentDispositionFilename; +class PDFDataTransportStream extends BasePDFStream { + _progressiveDone = false; + + _queuedChunks = []; + + constructor(source) { + super( + source, + PDFDataTransportStreamReader, + PDFDataTransportStreamRangeReader + ); + const { pdfDataRangeTransport } = source; + const { initialData, progressiveDone } = pdfDataRangeTransport; if (initialData?.length > 0) { - // Prevent any possible issues by only transferring a Uint8Array that - // completely "utilizes" its underlying ArrayBuffer. - const buffer = - initialData instanceof Uint8Array && - initialData.byteLength === initialData.buffer.byteLength - ? initialData.buffer - : new Uint8Array(initialData).buffer; + const buffer = getArrayBuffer(initialData); this._queuedChunks.push(buffer); } - - this._pdfDataRangeTransport = pdfDataRangeTransport; - this._isStreamingSupported = !disableStream; - this._isRangeSupported = !disableRange; - this._contentLength = length; - - this._fullRequestReader = null; - this._rangeReaders = []; + this._progressiveDone = progressiveDone; pdfDataRangeTransport.addRangeListener((begin, chunk) => { - this._onReceiveData({ begin, chunk }); + this.#onReceiveData(begin, chunk); }); pdfDataRangeTransport.addProgressListener((loaded, total) => { - this._onProgress({ loaded, total }); + if (total !== undefined) { + this._fullReader?.onProgress?.({ loaded, total }); + } }); pdfDataRangeTransport.addProgressiveReadListener(chunk => { - this._onReceiveData({ chunk }); + this.#onReceiveData(/* begin = */ undefined, chunk); }); pdfDataRangeTransport.addProgressiveDoneListener(() => { - this._onProgressiveDone(); + this._fullReader?.progressiveDone(); + this._progressiveDone = true; }); pdfDataRangeTransport.transportReady(); } - _onReceiveData({ begin, chunk }) { - // Prevent any possible issues by only transferring a Uint8Array that - // completely "utilizes" its underlying ArrayBuffer. - const buffer = - chunk instanceof Uint8Array && - chunk.byteLength === chunk.buffer.byteLength - ? chunk.buffer - : new Uint8Array(chunk).buffer; + #onReceiveData(begin, chunk) { + const buffer = getArrayBuffer(chunk); if (begin === undefined) { - if (this._fullRequestReader) { - this._fullRequestReader._enqueue(buffer); + if (this._fullReader) { + this._fullReader._enqueue(buffer); } else { this._queuedChunks.push(buffer); } } else { - const found = this._rangeReaders.some(function (rangeReader) { - if (rangeReader._begin !== begin) { - return false; - } - rangeReader._enqueue(buffer); - return true; - }); + const rangeReader = this._rangeReaders + .keys() + .find(r => r._begin === begin); + assert( - found, - "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found." + rangeReader, + "#onReceiveData - no `PDFDataTransportStreamRangeReader` instance found." ); - } - } - - get _progressiveDataLength() { - return this._fullRequestReader?._loaded ?? 0; - } - - _onProgress(evt) { - if (evt.total === undefined) { - // Reporting to first range reader, if it exists. - this._rangeReaders[0]?.onProgress?.({ loaded: evt.loaded }); - } else { - this._fullRequestReader?.onProgress?.({ - loaded: evt.loaded, - total: evt.total, - }); - } - } - - _onProgressiveDone() { - this._fullRequestReader?.progressiveDone(); - this._progressiveDone = true; - } - - _removeRangeReader(reader) { - const i = this._rangeReaders.indexOf(reader); - if (i >= 0) { - this._rangeReaders.splice(i, 1); + rangeReader._enqueue(buffer); } } getFullReader() { - assert( - !this._fullRequestReader, - "PDFDataTransportStream.getFullReader can only be called once." - ); - const queuedChunks = this._queuedChunks; + const reader = super.getFullReader(); this._queuedChunks = null; - return new PDFDataTransportStreamReader( - this, - queuedChunks, - this._progressiveDone, - this._contentDispositionFilename - ); + return reader; } getRangeReader(begin, end) { - if (end <= this._progressiveDataLength) { - return null; + const reader = super.getRangeReader(begin, end); + + if (reader) { + reader.onDone = () => this._rangeReaders.delete(reader); + + this._source.pdfDataRangeTransport.requestDataRange(begin, end); } - const reader = new PDFDataTransportStreamRangeReader(this, begin, end); - this._pdfDataRangeTransport.requestDataRange(begin, end); - this._rangeReaders.push(reader); return reader; } cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); + super.cancelAllRequests(reason); - for (const reader of this._rangeReaders.slice(0)) { - reader.cancel(reason); - } - this._pdfDataRangeTransport.abort(); + this._source.pdfDataRangeTransport.abort(); } } -/** @implements {IPDFStreamReader} */ -class PDFDataTransportStreamReader { - constructor( - stream, - queuedChunks, - progressiveDone = false, - contentDispositionFilename = null - ) { - this._stream = stream; - this._done = progressiveDone || false; - this._filename = isPdfFile(contentDispositionFilename) - ? contentDispositionFilename - : null; - this._queuedChunks = queuedChunks || []; - this._loaded = 0; +class PDFDataTransportStreamReader extends BasePDFStreamReader { + _done = false; + + _queuedChunks = null; + + _requests = []; + + constructor(stream) { + super(stream); + const { pdfDataRangeTransport, disableRange, disableStream } = + stream._source; + const { length, contentDispositionFilename } = pdfDataRangeTransport; + + this._queuedChunks = stream._queuedChunks || []; for (const chunk of this._queuedChunks) { this._loaded += chunk.byteLength; } - this._requests = []; - this._headersReady = Promise.resolve(); - stream._fullRequestReader = this; + this._done = stream._progressiveDone; + + this._contentLength = length; + this._isStreamingSupported = !disableStream; + this._isRangeSupported = !disableRange; - this.onProgress = null; + if (isPdfFile(contentDispositionFilename)) { + this._filename = contentDispositionFilename; + } + this._headersCapability.resolve(); } _enqueue(chunk) { @@ -199,34 +151,14 @@ class PDFDataTransportStreamReader { return; // Ignore new data. } if (this._requests.length > 0) { - const requestCapability = this._requests.shift(); - requestCapability.resolve({ value: chunk, done: false }); + const capability = this._requests.shift(); + capability.resolve({ value: chunk, done: false }); } else { this._queuedChunks.push(chunk); } this._loaded += chunk.byteLength; } - get headersReady() { - return this._headersReady; - } - - get filename() { - return this._filename; - } - - get isRangeSupported() { - return this._stream._isRangeSupported; - } - - get isStreamingSupported() { - return this._stream._isStreamingSupported; - } - - get contentLength() { - return this._stream._contentLength; - } - async read() { if (this._queuedChunks.length > 0) { const chunk = this._queuedChunks.shift(); @@ -235,38 +167,38 @@ class PDFDataTransportStreamReader { if (this._done) { return { value: undefined, done: true }; } - const requestCapability = Promise.withResolvers(); - this._requests.push(requestCapability); - return requestCapability.promise; + const capability = Promise.withResolvers(); + this._requests.push(capability); + return capability.promise; } cancel(reason) { this._done = true; - for (const requestCapability of this._requests) { - requestCapability.resolve({ value: undefined, done: true }); + for (const capability of this._requests) { + capability.resolve({ value: undefined, done: true }); } this._requests.length = 0; } progressiveDone() { - if (this._done) { - return; - } - this._done = true; + this._done ||= true; } } -/** @implements {IPDFStreamRangeReader} */ -class PDFDataTransportStreamRangeReader { +class PDFDataTransportStreamRangeReader extends BasePDFStreamRangeReader { + onDone = null; + + _begin = -1; + + _done = false; + + _queuedChunk = null; + + _requests = []; + constructor(stream, begin, end) { - this._stream = stream; + super(stream, begin, end); this._begin = begin; - this._end = end; - this._queuedChunk = null; - this._requests = []; - this._done = false; - - this.onProgress = null; } _enqueue(chunk) { @@ -276,19 +208,16 @@ class PDFDataTransportStreamRangeReader { if (this._requests.length === 0) { this._queuedChunk = chunk; } else { - const requestsCapability = this._requests.shift(); - requestsCapability.resolve({ value: chunk, done: false }); - for (const requestCapability of this._requests) { - requestCapability.resolve({ value: undefined, done: true }); + const firstCapability = this._requests.shift(); + firstCapability.resolve({ value: chunk, done: false }); + + for (const capability of this._requests) { + capability.resolve({ value: undefined, done: true }); } this._requests.length = 0; } this._done = true; - this._stream._removeRangeReader(this); - } - - get isStreamingSupported() { - return false; + this.onDone?.(); } async read() { @@ -300,18 +229,18 @@ class PDFDataTransportStreamRangeReader { if (this._done) { return { value: undefined, done: true }; } - const requestCapability = Promise.withResolvers(); - this._requests.push(requestCapability); - return requestCapability.promise; + const capability = Promise.withResolvers(); + this._requests.push(capability); + return capability.promise; } cancel(reason) { this._done = true; - for (const requestCapability of this._requests) { - requestCapability.resolve({ value: undefined, done: true }); + for (const capability of this._requests) { + capability.resolve({ value: undefined, done: true }); } this._requests.length = 0; - this._stream._removeRangeReader(this); + this.onDone?.(); } } diff --git a/src/pdf.js b/src/pdf.js index d5cc9aff982d1..c5fd11f9f9070 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -45,14 +45,10 @@ import { VerbosityLevel, } from "./shared/util.js"; import { - build, - getDocument, - PDFDataRangeTransport, - PDFWorker, - version, -} from "./display/api.js"; -import { + applyOpacity, + CSSConstants, fetchData, + findContrastColor, getFilenameFromUrl, getPdfFilenameFromUrl, getRGB, @@ -61,13 +57,22 @@ import { isPdfFile, noContextMenu, OutputScale, + PagesMapper, PDFDateString, PixelsPerInch, RenderingCancelledException, + renderRichText, setLayerDimensions, stopEvent, SupportedImageMimeTypes, } from "./display/display_utils.js"; +import { + build, + getDocument, + PDFDataRangeTransport, + PDFWorker, + version, +} from "./display/api.js"; import { AnnotationEditorLayer } from "./display/editor/annotation_editor_layer.js"; import { AnnotationEditorUIManager } from "./display/editor/tools.js"; import { AnnotationLayer } from "./display/annotation_layer.js"; @@ -97,13 +102,16 @@ globalThis.pdfjsLib = { AnnotationLayer, AnnotationMode, AnnotationType, + applyOpacity, build, ColorPicker, createValidAbsoluteUrl, + CSSConstants, DOMSVGFactory, DrawLayer, FeatureTest, fetchData, + findContrastColor, getDocument, getFilenameFromUrl, getPdfFilenameFromUrl, @@ -121,6 +129,7 @@ globalThis.pdfjsLib = { normalizeUnicode, OPS, OutputScale, + PagesMapper, PasswordResponses, PDFDataRangeTransport, PDFDateString, @@ -128,6 +137,7 @@ globalThis.pdfjsLib = { PermissionFlag, PixelsPerInch, RenderingCancelledException, + renderRichText, ResponseException, setLayerDimensions, shadow, @@ -152,13 +162,16 @@ export { AnnotationLayer, AnnotationMode, AnnotationType, + applyOpacity, build, ColorPicker, createValidAbsoluteUrl, + CSSConstants, DOMSVGFactory, DrawLayer, FeatureTest, fetchData, + findContrastColor, getDocument, getFilenameFromUrl, getPdfFilenameFromUrl, @@ -176,6 +189,7 @@ export { normalizeUnicode, OPS, OutputScale, + PagesMapper, PasswordResponses, PDFDataRangeTransport, PDFDateString, @@ -183,6 +197,7 @@ export { PermissionFlag, PixelsPerInch, RenderingCancelledException, + renderRichText, ResponseException, setLayerDimensions, shadow, diff --git a/src/scripting_api/app_utils.js b/src/scripting_api/app_utils.js index b46f8ea2640dd..a71a50d0c7acc 100644 --- a/src/scripting_api/app_utils.js +++ b/src/scripting_api/app_utils.js @@ -13,7 +13,7 @@ * limitations under the License. */ -const VIEWER_TYPE = "PDF.js"; +const VIEWER_TYPE = "Reader"; //MC need to trick our old pdfs const VIEWER_VARIATION = "Full"; const VIEWER_VERSION = 21.00720099; const FORMS_VERSION = 21.00720099; diff --git a/src/scripting_api/doc.js b/src/scripting_api/doc.js index c76ccc047483f..b393f6d64c667 100644 --- a/src/scripting_api/doc.js +++ b/src/scripting_api/doc.js @@ -23,7 +23,18 @@ const DOC_EXTERNAL = false; class InfoProxyHandler { static get(obj, prop) { - return obj[prop.toLowerCase()]; + // First try exact match + if (prop in obj) { + return obj[prop]; + } + // Fall back to case-insensitive match + const lowerProp = prop.toLowerCase(); + for (const key in obj) { + if (key.toLowerCase() === lowerProp) { + return obj[key]; + } + } + return undefined; } static set(obj, prop, value) { @@ -73,24 +84,40 @@ class Doc extends PDFObject { this._subject = data.Subject || ""; this._title = data.Title || ""; this._URL = data.URL || ""; + this._pages = data.pages || []; // info has case insensitive properties // and they're are read-only. - this._info = new Proxy( - { - title: this._title, - author: this._author, - authors: data.authors || [this._author], - subject: this._subject, - keywords: this._keywords, - creator: this._creator, - producer: this._producer, - creationdate: this._creationDate, - moddate: this._modDate, - trapped: data.Trapped || "Unknown", - }, - InfoProxyHandler - ); + const infoObject = { + title: this._title, + author: this._author, + authors: data.authors || [this._author], + subject: this._subject, + keywords: this._keywords, + creator: this._creator, + producer: this._producer, + creationdate: this._creationDate, + moddate: this._modDate, + trapped: data.Trapped || "Unknown", + }; + + // Include custom metadata fields from the PDF's Info dictionary + for (const key in data) { + if (data.hasOwnProperty(key)) { + const value = data[key]; + // Include custom metadata if not already in info and is a primitive + if ( + value !== null && + value !== undefined && + typeof value !== "function" && + typeof value !== "object" + ) { + infoObject[key] = value; // Add with original casing - InfoProxyHandler handles case-insensitive access + } + } + } + + this._info = new Proxy(infoObject, InfoProxyHandler); this._zoomType = ZoomType.none; this._zoom = data.zoom || 100; @@ -944,6 +971,36 @@ class Doc extends PDFObject { return searchedField; } + // Try Adobe Acrobat .pageNum notation (e.g., "fieldName.0") + // Check if the name ends with a dot followed by digits + const pageNumMatch = cName.match(/^(.+)\.(\d+)$/); + if (pageNumMatch) { + const baseName = pageNumMatch[1]; + const pageNum = parseInt(pageNumMatch[2], 10); + + // Look for field with matching base name and page number + for (const [name, field] of this._fields.entries()) { + if (name === baseName || name.endsWith("." + baseName)) { + // Check if this field or its children are on the requested page + const children = field.obj._kidIds ? this._getChildren(name) : [field]; + for (const child of children) { + if (child.obj._page === pageNum) { + this._fields.set(cName, child); + return child; + } + } + } + } + + // If no exact page match, try just the base name + // (for single-page fields, ignore the page number) + const baseField = this._fields.get(baseName); + if (baseField) { + this._fields.set(cName, baseField); + return baseField; + } + } + const parts = cName.split("#"); let childIndex = NaN; if (parts.length === 2) { @@ -1051,8 +1108,42 @@ class Doc extends PDFObject { /* Not implemented */ } - getPageBox() { - /* TODO */ + getPageBox(cBox = "CropBox", nPage = this._pageNum) { + // Handle object parameter: {cBox, nPage} + if (typeof cBox === "object" && cBox !== null) { + nPage = cBox.nPage ?? this._pageNum; + cBox = cBox.cBox ?? "CropBox"; + } + + // Normalize box type (case-insensitive) + const boxType = String(cBox).toLowerCase(); + const boxMap = { + mediabox: "MediaBox", + cropbox: "CropBox", + bleedbox: "BleedBox", + trimbox: "TrimBox", + artbox: "ArtBox", + }; + const normalizedBox = boxMap[boxType] || "CropBox"; + + // Validate page number + if (nPage < 0 || nPage >= this.numPages) { + throw new Error("Invalid page number"); + } + + // Get page data + const page = this._pages[nPage]; + if (!page) { + // Return default US Letter size if no page data + return [0, 0, 612, 792]; + } + + // Try requested box type, fall back to CropBox, then MediaBox + return ( + page[normalizedBox] || + page.CropBox || + page.MediaBox || [0, 0, 612, 792] + ); } getPageLabel() { diff --git a/src/scripting_api/initialization.js b/src/scripting_api/initialization.js index 9e4727bcb1015..cab36e700f27e 100644 --- a/src/scripting_api/initialization.js +++ b/src/scripting_api/initialization.js @@ -136,6 +136,81 @@ function initSandbox(params) { globalThis.color = new Proxy(color, proxyHandler); globalThis.console = new Proxy(new Console({ send }), proxyHandler); globalThis.util = new Proxy(util, proxyHandler); + + // Shadow the Date constructor to handle numeric strings (Unix timestamps as strings) + // This allows PDF JavaScript like "new Date('1767143202634')" to work correctly + const OriginalDate = globalThis.Date; + globalThis.Date = function (...args) { + // If called with a single argument that is a numeric string, parse it as an integer + if ( + args.length === 1 && + typeof args[0] === "string" && + !isNaN(args[0]) && + args[0].trim() !== "" + ) { + return new OriginalDate(parseInt(args[0], 10)); + } + // Otherwise, use the original Date constructor + return new OriginalDate(...args); + }; + // Copy static methods from the original Date constructor + globalThis.Date.prototype = OriginalDate.prototype; + globalThis.Date.parse = OriginalDate.parse; + globalThis.Date.UTC = OriginalDate.UTC; + globalThis.Date.now = OriginalDate.now; + + // Add polyfill for legacy Mozilla toSource() method + // This allows legacy PDF JavaScript like "eval(this.info.toSource())" to work + if (!Object.prototype.toSource) { + Object.defineProperty(Object.prototype, "toSource", { + value: function () { + const toSource = (obj, visited = new WeakSet()) => { + if (obj === null) { + return "null"; + } + if (obj === undefined) { + return "undefined"; + } + if (typeof obj === "string") { + return JSON.stringify(obj); + } + if (typeof obj === "number" || typeof obj === "boolean") { + return String(obj); + } + if (typeof obj === "function") { + return "function()"; + } + + // Handle circular references + if (visited.has(obj)) { + return "{}"; + } + visited.add(obj); + + if (Array.isArray(obj)) { + const items = obj.map(item => toSource(item, visited)); + return `[${items.join(", ")}]`; + } + + // Handle plain objects + const pairs = []; + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + const value = toSource(obj[key], visited); + pairs.push(`${key}: ${value}`); + } + } + return `({${pairs.join(", ")}})`; + }; + + return toSource(this); + }, + writable: true, + configurable: true, + enumerable: false, + }); + } + globalThis.border = Border; globalThis.cursor = Cursor; globalThis.display = Display; diff --git a/src/interfaces.js b/src/shared/base_pdf_stream.js similarity index 53% rename from src/interfaces.js rename to src/shared/base_pdf_stream.js index 15493bdb819f2..4f3ee4dfe0137 100644 --- a/src/interfaces.js +++ b/src/shared/base_pdf_stream.js @@ -13,56 +13,119 @@ * limitations under the License. */ +import { assert, unreachable } from "./util.js"; + /** * Interface that represents PDF data transport. If possible, it allows * progressively load entire or fragment of the PDF binary data. - * - * @interface */ -class IPDFStream { +class BasePDFStream { + #PDFStreamReader = null; + + #PDFStreamRangeReader = null; + + _fullReader = null; + + _rangeReaders = new Set(); + + _source = null; + + constructor(source, PDFStreamReader, PDFStreamRangeReader) { + if ( + (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) && + this.constructor === BasePDFStream + ) { + unreachable("Cannot initialize BasePDFStream."); + } + this._source = source; + + this.#PDFStreamReader = PDFStreamReader; + this.#PDFStreamRangeReader = PDFStreamRangeReader; + } + + get _progressiveDataLength() { + return this._fullReader?._loaded ?? 0; + } + /** * Gets a reader for the entire PDF data. - * @returns {IPDFStreamReader} + * @returns {BasePDFStreamReader} */ getFullReader() { - return null; + assert( + !this._fullReader, + "BasePDFStream.getFullReader can only be called once." + ); + return (this._fullReader = new this.#PDFStreamReader(this)); } /** * Gets a reader for the range of the PDF data. * * NOTE: Currently this method is only expected to be invoked *after* - * the `IPDFStreamReader.prototype.headersReady` promise has resolved. + * the `BasePDFStreamReader.prototype.headersReady` promise has resolved. * * @param {number} begin - the start offset of the data. * @param {number} end - the end offset of the data. - * @returns {IPDFStreamRangeReader} + * @returns {BasePDFStreamRangeReader} */ getRangeReader(begin, end) { - return null; + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new this.#PDFStreamRangeReader(this, begin, end); + this._rangeReaders.add(reader); + return reader; } /** * Cancels all opened reader and closes all their opened requests. * @param {Object} reason - the reason for cancelling */ - cancelAllRequests(reason) {} + cancelAllRequests(reason) { + this._fullReader?.cancel(reason); + + // Always create a copy of the rangeReaders. + for (const reader of new Set(this._rangeReaders)) { + reader.cancel(reason); + } + } } /** * Interface for a PDF binary data reader. - * - * @interface */ -class IPDFStreamReader { - constructor() { - /** - * Sets or gets the progress callback. The callback can be useful when the - * isStreamingSupported property of the object is defined as false. - * The callback is called with one parameter: an object with the loaded and - * total properties. - */ - this.onProgress = null; +class BasePDFStreamReader { + /** + * Sets or gets the progress callback. The callback can be useful when the + * isStreamingSupported property of the object is defined as false. + * The callback is called with one parameter: an object with the loaded and + * total properties. + */ + onProgress = null; + + _contentLength = 0; + + _filename = null; + + _headersCapability = Promise.withResolvers(); + + _isRangeSupported = false; + + _isStreamingSupported = false; + + _loaded = 0; + + _stream = null; + + constructor(stream) { + if ( + (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) && + this.constructor === BasePDFStreamReader + ) { + unreachable("Cannot initialize BasePDFStreamReader."); + } + this._stream = stream; } /** @@ -71,7 +134,7 @@ class IPDFStreamReader { * @type {Promise} */ get headersReady() { - return Promise.resolve(); + return this._headersCapability.promise; } /** @@ -81,7 +144,7 @@ class IPDFStreamReader { * header is missing/invalid. */ get filename() { - return null; + return this._filename; } /** @@ -90,7 +153,7 @@ class IPDFStreamReader { * @type {number} The data length (or 0 if unknown). */ get contentLength() { - return 0; + return this._contentLength; } /** @@ -100,7 +163,7 @@ class IPDFStreamReader { * @type {boolean} */ get isRangeSupported() { - return false; + return this._isRangeSupported; } /** @@ -109,7 +172,7 @@ class IPDFStreamReader { * @type {boolean} */ get isStreamingSupported() { - return false; + return this._isStreamingSupported; } /** @@ -120,37 +183,33 @@ class IPDFStreamReader { * set to true. * @returns {Promise} */ - async read() {} + async read() { + unreachable("Abstract method `read` called"); + } /** * Cancels all pending read requests and closes the stream. * @param {Object} reason */ - cancel(reason) {} + cancel(reason) { + unreachable("Abstract method `cancel` called"); + } } /** * Interface for a PDF binary data fragment reader. - * - * @interface */ -class IPDFStreamRangeReader { - constructor() { - /** - * Sets or gets the progress callback. The callback can be useful when the - * isStreamingSupported property of the object is defined as false. - * The callback is called with one parameter: an object with the loaded - * property. - */ - this.onProgress = null; - } - - /** - * Gets ability of the stream to progressively load binary data. - * @type {boolean} - */ - get isStreamingSupported() { - return false; +class BasePDFStreamRangeReader { + _stream = null; + + constructor(stream, begin, end) { + if ( + (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) && + this.constructor === BasePDFStreamRangeReader + ) { + unreachable("Cannot initialize BasePDFStreamRangeReader."); + } + this._stream = stream; } /** @@ -161,13 +220,17 @@ class IPDFStreamRangeReader { * set to true. * @returns {Promise} */ - async read() {} + async read() { + unreachable("Abstract method `read` called"); + } /** * Cancels all pending read requests and closes the stream. * @param {Object} reason */ - cancel(reason) {} + cancel(reason) { + unreachable("Abstract method `cancel` called"); + } } -export { IPDFStream, IPDFStreamRangeReader, IPDFStreamReader }; +export { BasePDFStream, BasePDFStreamRangeReader, BasePDFStreamReader }; diff --git a/src/shared/obj-bin-transform.js b/src/shared/obj-bin-transform.js new file mode 100644 index 0000000000000..7e0f4b14178c7 --- /dev/null +++ b/src/shared/obj-bin-transform.js @@ -0,0 +1,920 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { assert, FeatureTest, MeshFigureType } from "./util.js"; + +class CssFontInfo { + #buffer; + + #view; + + #decoder; + + static strings = ["fontFamily", "fontWeight", "italicAngle"]; + + static write(info) { + const encoder = new TextEncoder(); + const encodedStrings = {}; + let stringsLength = 0; + for (const prop of CssFontInfo.strings) { + const encoded = encoder.encode(info[prop]); + encodedStrings[prop] = encoded; + stringsLength += 4 + encoded.length; + } + + const buffer = new ArrayBuffer(stringsLength); + const data = new Uint8Array(buffer); + const view = new DataView(buffer); + let offset = 0; + + for (const prop of CssFontInfo.strings) { + const encoded = encodedStrings[prop]; + const length = encoded.length; + view.setUint32(offset, length); + data.set(encoded, offset + 4); + offset += 4 + length; + } + assert(offset === buffer.byteLength, "CssFontInfo.write: Buffer overflow"); + return buffer; + } + + constructor(buffer) { + this.#buffer = buffer; + this.#view = new DataView(this.#buffer); + this.#decoder = new TextDecoder(); + } + + #readString(index) { + assert(index < CssFontInfo.strings.length, "Invalid string index"); + let offset = 0; + for (let i = 0; i < index; i++) { + offset += this.#view.getUint32(offset) + 4; + } + const length = this.#view.getUint32(offset); + return this.#decoder.decode( + new Uint8Array(this.#buffer, offset + 4, length) + ); + } + + get fontFamily() { + return this.#readString(0); + } + + get fontWeight() { + return this.#readString(1); + } + + get italicAngle() { + return this.#readString(2); + } +} + +class SystemFontInfo { + #buffer; + + #view; + + #decoder; + + static strings = ["css", "loadedName", "baseFontName", "src"]; + + static write(info) { + const encoder = new TextEncoder(); + const encodedStrings = {}; + let stringsLength = 0; + for (const prop of SystemFontInfo.strings) { + const encoded = encoder.encode(info[prop]); + encodedStrings[prop] = encoded; + stringsLength += 4 + encoded.length; + } + stringsLength += 4; + let encodedStyleStyle, + encodedStyleWeight, + lengthEstimate = 1 + stringsLength; + if (info.style) { + encodedStyleStyle = encoder.encode(info.style.style); + encodedStyleWeight = encoder.encode(info.style.weight); + lengthEstimate += + 4 + encodedStyleStyle.length + 4 + encodedStyleWeight.length; + } + + const buffer = new ArrayBuffer(lengthEstimate); + const data = new Uint8Array(buffer); + const view = new DataView(buffer); + let offset = 0; + + view.setUint8(offset++, info.guessFallback ? 1 : 0); + view.setUint32(offset, 0); + offset += 4; + stringsLength = 0; + for (const prop of SystemFontInfo.strings) { + const encoded = encodedStrings[prop]; + const length = encoded.length; + stringsLength += 4 + length; + view.setUint32(offset, length); + data.set(encoded, offset + 4); + offset += 4 + length; + } + view.setUint32(offset - stringsLength - 4, stringsLength); + + if (info.style) { + view.setUint32(offset, encodedStyleStyle.length); + data.set(encodedStyleStyle, offset + 4); + offset += 4 + encodedStyleStyle.length; + view.setUint32(offset, encodedStyleWeight.length); + data.set(encodedStyleWeight, offset + 4); + offset += 4 + encodedStyleWeight.length; + } + assert( + offset <= buffer.byteLength, + "SubstitionInfo.write: Buffer overflow" + ); + return buffer.transferToFixedLength(offset); + } + + constructor(buffer) { + this.#buffer = buffer; + this.#view = new DataView(this.#buffer); + this.#decoder = new TextDecoder(); + } + + get guessFallback() { + return this.#view.getUint8(0) !== 0; + } + + #readString(index) { + assert(index < SystemFontInfo.strings.length, "Invalid string index"); + let offset = 5; + for (let i = 0; i < index; i++) { + offset += this.#view.getUint32(offset) + 4; + } + const length = this.#view.getUint32(offset); + return this.#decoder.decode( + new Uint8Array(this.#buffer, offset + 4, length) + ); + } + + get css() { + return this.#readString(0); + } + + get loadedName() { + return this.#readString(1); + } + + get baseFontName() { + return this.#readString(2); + } + + get src() { + return this.#readString(3); + } + + get style() { + let offset = 1; + offset += 4 + this.#view.getUint32(offset); + const styleLength = this.#view.getUint32(offset); + const style = this.#decoder.decode( + new Uint8Array(this.#buffer, offset + 4, styleLength) + ); + offset += 4 + styleLength; + const weightLength = this.#view.getUint32(offset); + const weight = this.#decoder.decode( + new Uint8Array(this.#buffer, offset + 4, weightLength) + ); + return { style, weight }; + } +} + +class FontInfo { + static bools = [ + "black", + "bold", + "disableFontFace", + "fontExtraProperties", + "isInvalidPDFjsFont", + "isType3Font", + "italic", + "missingFile", + "remeasure", + "vertical", + ]; + + static numbers = ["ascent", "defaultWidth", "descent"]; + + static strings = ["fallbackName", "loadedName", "mimetype", "name"]; + + static #OFFSET_NUMBERS = Math.ceil((this.bools.length * 2) / 8); + + static #OFFSET_BBOX = this.#OFFSET_NUMBERS + this.numbers.length * 8; + + static #OFFSET_FONT_MATRIX = this.#OFFSET_BBOX + 1 + 2 * 4; + + static #OFFSET_DEFAULT_VMETRICS = this.#OFFSET_FONT_MATRIX + 1 + 8 * 6; + + static #OFFSET_STRINGS = this.#OFFSET_DEFAULT_VMETRICS + 1 + 2 * 3; + + #buffer; + + #decoder; + + #view; + + constructor({ data, extra }) { + this.#buffer = data; + this.#decoder = new TextDecoder(); + this.#view = new DataView(this.#buffer); + if (extra) { + Object.assign(this, extra); + } + } + + #readBoolean(index) { + assert(index < FontInfo.bools.length, "Invalid boolean index"); + const byteOffset = Math.floor(index / 4); + const bitOffset = (index * 2) % 8; + const value = (this.#view.getUint8(byteOffset) >> bitOffset) & 0x03; + return value === 0x00 ? undefined : value === 0x02; + } + + get black() { + return this.#readBoolean(0); + } + + get bold() { + return this.#readBoolean(1); + } + + get disableFontFace() { + return this.#readBoolean(2); + } + + get fontExtraProperties() { + return this.#readBoolean(3); + } + + get isInvalidPDFjsFont() { + return this.#readBoolean(4); + } + + get isType3Font() { + return this.#readBoolean(5); + } + + get italic() { + return this.#readBoolean(6); + } + + get missingFile() { + return this.#readBoolean(7); + } + + get remeasure() { + return this.#readBoolean(8); + } + + get vertical() { + return this.#readBoolean(9); + } + + #readNumber(index) { + assert(index < FontInfo.numbers.length, "Invalid number index"); + return this.#view.getFloat64(FontInfo.#OFFSET_NUMBERS + index * 8); + } + + get ascent() { + return this.#readNumber(0); + } + + get defaultWidth() { + return this.#readNumber(1); + } + + get descent() { + return this.#readNumber(2); + } + + get bbox() { + let offset = FontInfo.#OFFSET_BBOX; + const numCoords = this.#view.getUint8(offset); + if (numCoords === 0) { + return undefined; + } + offset += 1; + const bbox = []; + for (let i = 0; i < 4; i++) { + bbox.push(this.#view.getInt16(offset, true)); + offset += 2; + } + return bbox; + } + + get fontMatrix() { + let offset = FontInfo.#OFFSET_FONT_MATRIX; + const numPoints = this.#view.getUint8(offset); + if (numPoints === 0) { + return undefined; + } + offset += 1; + const fontMatrix = []; + for (let i = 0; i < 6; i++) { + fontMatrix.push(this.#view.getFloat64(offset, true)); + offset += 8; + } + return fontMatrix; + } + + get defaultVMetrics() { + let offset = FontInfo.#OFFSET_DEFAULT_VMETRICS; + const numMetrics = this.#view.getUint8(offset); + if (numMetrics === 0) { + return undefined; + } + offset += 1; + const defaultVMetrics = []; + for (let i = 0; i < 3; i++) { + defaultVMetrics.push(this.#view.getInt16(offset, true)); + offset += 2; + } + return defaultVMetrics; + } + + #readString(index) { + assert(index < FontInfo.strings.length, "Invalid string index"); + let offset = FontInfo.#OFFSET_STRINGS + 4; + for (let i = 0; i < index; i++) { + offset += this.#view.getUint32(offset) + 4; + } + const length = this.#view.getUint32(offset); + const stringData = new Uint8Array(length); + stringData.set(new Uint8Array(this.#buffer, offset + 4, length)); + return this.#decoder.decode(stringData); + } + + get fallbackName() { + return this.#readString(0); + } + + get loadedName() { + return this.#readString(1); + } + + get mimetype() { + return this.#readString(2); + } + + get name() { + return this.#readString(3); + } + + get data() { + let offset = FontInfo.#OFFSET_STRINGS; + const stringsLength = this.#view.getUint32(offset); + offset += 4 + stringsLength; + const systemFontInfoLength = this.#view.getUint32(offset); + offset += 4 + systemFontInfoLength; + const cssFontInfoLength = this.#view.getUint32(offset); + offset += 4 + cssFontInfoLength; + const length = this.#view.getUint32(offset); + if (length === 0) { + return undefined; + } + return new Uint8Array(this.#buffer, offset + 4, length); + } + + clearData() { + let offset = FontInfo.#OFFSET_STRINGS; + const stringsLength = this.#view.getUint32(offset); + offset += 4 + stringsLength; + const systemFontInfoLength = this.#view.getUint32(offset); + offset += 4 + systemFontInfoLength; + const cssFontInfoLength = this.#view.getUint32(offset); + offset += 4 + cssFontInfoLength; + const length = this.#view.getUint32(offset); + const data = new Uint8Array(this.#buffer, offset + 4, length); + data.fill(0); + this.#view.setUint32(offset, 0); + // this.#buffer.resize(offset); + } + + get cssFontInfo() { + let offset = FontInfo.#OFFSET_STRINGS; + const stringsLength = this.#view.getUint32(offset); + offset += 4 + stringsLength; + const systemFontInfoLength = this.#view.getUint32(offset); + offset += 4 + systemFontInfoLength; + const cssFontInfoLength = this.#view.getUint32(offset); + if (cssFontInfoLength === 0) { + return null; + } + const cssFontInfoData = new Uint8Array(cssFontInfoLength); + cssFontInfoData.set( + new Uint8Array(this.#buffer, offset + 4, cssFontInfoLength) + ); + return new CssFontInfo(cssFontInfoData.buffer); + } + + get systemFontInfo() { + let offset = FontInfo.#OFFSET_STRINGS; + const stringsLength = this.#view.getUint32(offset); + offset += 4 + stringsLength; + const systemFontInfoLength = this.#view.getUint32(offset); + if (systemFontInfoLength === 0) { + return null; + } + const systemFontInfoData = new Uint8Array(systemFontInfoLength); + systemFontInfoData.set( + new Uint8Array(this.#buffer, offset + 4, systemFontInfoLength) + ); + return new SystemFontInfo(systemFontInfoData.buffer); + } + + static write(font) { + const systemFontInfoBuffer = font.systemFontInfo + ? SystemFontInfo.write(font.systemFontInfo) + : null; + const cssFontInfoBuffer = font.cssFontInfo + ? CssFontInfo.write(font.cssFontInfo) + : null; + + const encoder = new TextEncoder(); + const encodedStrings = {}; + let stringsLength = 0; + for (const prop of FontInfo.strings) { + encodedStrings[prop] = encoder.encode(font[prop]); + stringsLength += 4 + encodedStrings[prop].length; + } + + const lengthEstimate = + FontInfo.#OFFSET_STRINGS + + 4 + + stringsLength + + 4 + + (systemFontInfoBuffer ? systemFontInfoBuffer.byteLength : 0) + + 4 + + (cssFontInfoBuffer ? cssFontInfoBuffer.byteLength : 0) + + 4 + + (font.data ? font.data.length : 0); + + const buffer = new ArrayBuffer(lengthEstimate); + const data = new Uint8Array(buffer); + const view = new DataView(buffer); + let offset = 0; + + const numBools = FontInfo.bools.length; + let boolByte = 0, + boolBit = 0; + for (let i = 0; i < numBools; i++) { + const value = font[FontInfo.bools[i]]; + // eslint-disable-next-line no-nested-ternary + const bits = value === undefined ? 0x00 : value ? 0x02 : 0x01; + boolByte |= bits << boolBit; + boolBit += 2; + if (boolBit === 8 || i === numBools - 1) { + view.setUint8(offset++, boolByte); + boolByte = 0; + boolBit = 0; + } + } + assert( + offset === FontInfo.#OFFSET_NUMBERS, + "FontInfo.write: Boolean properties offset mismatch" + ); + + for (const prop of FontInfo.numbers) { + view.setFloat64(offset, font[prop]); + offset += 8; + } + assert( + offset === FontInfo.#OFFSET_BBOX, + "FontInfo.write: Number properties offset mismatch" + ); + + if (font.bbox) { + view.setUint8(offset++, 4); + for (const coord of font.bbox) { + view.setInt16(offset, coord, true); + offset += 2; + } + } else { + view.setUint8(offset++, 0); + offset += 2 * 4; // TODO: optimize this padding away + } + + assert( + offset === FontInfo.#OFFSET_FONT_MATRIX, + "FontInfo.write: BBox properties offset mismatch" + ); + + if (font.fontMatrix) { + view.setUint8(offset++, 6); + for (const point of font.fontMatrix) { + view.setFloat64(offset, point, true); + offset += 8; + } + } else { + view.setUint8(offset++, 0); + offset += 8 * 6; // TODO: optimize this padding away + } + + assert( + offset === FontInfo.#OFFSET_DEFAULT_VMETRICS, + "FontInfo.write: FontMatrix properties offset mismatch" + ); + + if (font.defaultVMetrics) { + view.setUint8(offset++, 1); + for (const metric of font.defaultVMetrics) { + view.setInt16(offset, metric, true); + offset += 2; + } + } else { + view.setUint8(offset++, 0); + offset += 3 * 2; // TODO: optimize this padding away + } + + assert( + offset === FontInfo.#OFFSET_STRINGS, + "FontInfo.write: DefaultVMetrics properties offset mismatch" + ); + + view.setUint32(FontInfo.#OFFSET_STRINGS, 0); + offset += 4; + for (const prop of FontInfo.strings) { + const encoded = encodedStrings[prop]; + const length = encoded.length; + view.setUint32(offset, length); + data.set(encoded, offset + 4); + offset += 4 + length; + } + view.setUint32( + FontInfo.#OFFSET_STRINGS, + offset - FontInfo.#OFFSET_STRINGS - 4 + ); + + if (!systemFontInfoBuffer) { + view.setUint32(offset, 0); + offset += 4; + } else { + const length = systemFontInfoBuffer.byteLength; + view.setUint32(offset, length); + assert( + offset + 4 + length <= buffer.byteLength, + "FontInfo.write: Buffer overflow at systemFontInfo" + ); + data.set(new Uint8Array(systemFontInfoBuffer), offset + 4); + offset += 4 + length; + } + + if (!cssFontInfoBuffer) { + view.setUint32(offset, 0); + offset += 4; + } else { + const length = cssFontInfoBuffer.byteLength; + view.setUint32(offset, length); + assert( + offset + 4 + length <= buffer.byteLength, + "FontInfo.write: Buffer overflow at cssFontInfo" + ); + data.set(new Uint8Array(cssFontInfoBuffer), offset + 4); + offset += 4 + length; + } + + if (font.data === undefined) { + view.setUint32(offset, 0); + offset += 4; + } else { + view.setUint32(offset, font.data.length); + data.set(font.data, offset + 4); + offset += 4 + font.data.length; + } + + assert(offset <= buffer.byteLength, "FontInfo.write: Buffer overflow"); + return buffer.transferToFixedLength(offset); + } +} + +class PatternInfo { + static #KIND = 0; // 1=axial, 2=radial, 3=mesh + + static #HAS_BBOX = 1; // 0/1 + + static #HAS_BACKGROUND = 2; // 0/1 (background for mesh patterns) + + static #SHADING_TYPE = 3; // shadingType (only for mesh patterns) + + static #N_COORD = 4; // number of coordinate pairs + + static #N_COLOR = 8; // number of rgb triplets + + static #N_STOP = 12; // number of gradient stops + + static #N_FIGURES = 16; // number of figures + + constructor(buffer) { + this.buffer = buffer; + this.view = new DataView(buffer); + this.data = new Uint8Array(buffer); + } + + static write(ir) { + let kind, + bbox = null, + coords = [], + colors = [], + colorStops = [], + figures = [], + shadingType = null, // only needed for mesh patterns + background = null; // background for mesh patterns + + switch (ir[0]) { + case "RadialAxial": + kind = ir[1] === "axial" ? 1 : 2; + bbox = ir[2]; + colorStops = ir[3]; + if (kind === 1) { + coords.push(...ir[4], ...ir[5]); + } else { + coords.push(ir[4][0], ir[4][1], ir[6], ir[5][0], ir[5][1], ir[7]); + } + break; + case "Mesh": + kind = 3; + shadingType = ir[1]; + coords = ir[2]; + colors = ir[3]; + figures = ir[4] || []; + bbox = ir[6]; + background = ir[7]; + break; + default: + throw new Error(`Unsupported pattern type: ${ir[0]}`); + } + + const nCoord = Math.floor(coords.length / 2); + const nColor = Math.floor(colors.length / 3); + const nStop = colorStops.length; + const nFigures = figures.length; + + let figuresSize = 0; + for (const figure of figures) { + figuresSize += 1; + figuresSize = Math.ceil(figuresSize / 4) * 4; // Ensure 4-byte alignment + figuresSize += 4 + figure.coords.length * 4; + figuresSize += 4 + figure.colors.length * 4; + if (figure.verticesPerRow !== undefined) { + figuresSize += 4; + } + } + + const byteLen = + 20 + + nCoord * 8 + + nColor * 3 + + nStop * 8 + + (bbox ? 16 : 0) + + (background ? 3 : 0) + + figuresSize; + const buffer = new ArrayBuffer(byteLen); + const dataView = new DataView(buffer); + const u8data = new Uint8Array(buffer); + + dataView.setUint8(PatternInfo.#KIND, kind); + dataView.setUint8(PatternInfo.#HAS_BBOX, bbox ? 1 : 0); + dataView.setUint8(PatternInfo.#HAS_BACKGROUND, background ? 1 : 0); + dataView.setUint8(PatternInfo.#SHADING_TYPE, shadingType); // Only for mesh pattern, null otherwise + dataView.setUint32(PatternInfo.#N_COORD, nCoord, true); + dataView.setUint32(PatternInfo.#N_COLOR, nColor, true); + dataView.setUint32(PatternInfo.#N_STOP, nStop, true); + dataView.setUint32(PatternInfo.#N_FIGURES, nFigures, true); + + let offset = 20; + const coordsView = new Float32Array(buffer, offset, nCoord * 2); + coordsView.set(coords); + offset += nCoord * 8; + + u8data.set(colors, offset); + offset += nColor * 3; + + for (const [pos, hex] of colorStops) { + dataView.setFloat32(offset, pos, true); + offset += 4; + dataView.setUint32(offset, parseInt(hex.slice(1), 16), true); + offset += 4; + } + if (bbox) { + for (const v of bbox) { + dataView.setFloat32(offset, v, true); + offset += 4; + } + } + + if (background) { + u8data.set(background, offset); + offset += 3; + } + + for (let i = 0; i < figures.length; i++) { + const figure = figures[i]; + dataView.setUint8(offset, figure.type); + offset += 1; + // Ensure 4-byte alignment + offset = Math.ceil(offset / 4) * 4; + dataView.setUint32(offset, figure.coords.length, true); + offset += 4; + const figureCoordsView = new Int32Array( + buffer, + offset, + figure.coords.length + ); + figureCoordsView.set(figure.coords); + offset += figure.coords.length * 4; + dataView.setUint32(offset, figure.colors.length, true); + offset += 4; + const colorsView = new Int32Array(buffer, offset, figure.colors.length); + colorsView.set(figure.colors); + offset += figure.colors.length * 4; + + if (figure.verticesPerRow !== undefined) { + dataView.setUint32(offset, figure.verticesPerRow, true); + offset += 4; + } + } + return buffer; + } + + getIR() { + const dataView = this.view; + const kind = this.data[PatternInfo.#KIND]; + const hasBBox = !!this.data[PatternInfo.#HAS_BBOX]; + const hasBackground = !!this.data[PatternInfo.#HAS_BACKGROUND]; + const nCoord = dataView.getUint32(PatternInfo.#N_COORD, true); + const nColor = dataView.getUint32(PatternInfo.#N_COLOR, true); + const nStop = dataView.getUint32(PatternInfo.#N_STOP, true); + const nFigures = dataView.getUint32(PatternInfo.#N_FIGURES, true); + + let offset = 20; + const coords = new Float32Array(this.buffer, offset, nCoord * 2); + offset += nCoord * 8; + const colors = new Uint8Array(this.buffer, offset, nColor * 3); + offset += nColor * 3; + const stops = []; + for (let i = 0; i < nStop; ++i) { + const p = dataView.getFloat32(offset, true); + offset += 4; + const rgb = dataView.getUint32(offset, true); + offset += 4; + stops.push([p, `#${rgb.toString(16).padStart(6, "0")}`]); + } + let bbox = null; + if (hasBBox) { + bbox = []; + for (let i = 0; i < 4; ++i) { + bbox.push(dataView.getFloat32(offset, true)); + offset += 4; + } + } + + let background = null; + if (hasBackground) { + background = new Uint8Array(this.buffer, offset, 3); + offset += 3; + } + + const figures = []; + for (let i = 0; i < nFigures; ++i) { + const type = dataView.getUint8(offset); + offset += 1; + // Ensure 4-byte alignment + offset = Math.ceil(offset / 4) * 4; + + const coordsLength = dataView.getUint32(offset, true); + offset += 4; + const figureCoords = new Int32Array(this.buffer, offset, coordsLength); + offset += coordsLength * 4; + + const colorsLength = dataView.getUint32(offset, true); + offset += 4; + const figureColors = new Int32Array(this.buffer, offset, colorsLength); + offset += colorsLength * 4; + + const figure = { + type, + coords: figureCoords, + colors: figureColors, + }; + + if (type === MeshFigureType.LATTICE) { + figure.verticesPerRow = dataView.getUint32(offset, true); + offset += 4; + } + + figures.push(figure); + } + + if (kind === 1) { + // axial + return [ + "RadialAxial", + "axial", + bbox, + stops, + Array.from(coords.slice(0, 2)), + Array.from(coords.slice(2, 4)), + null, + null, + ]; + } + if (kind === 2) { + return [ + "RadialAxial", + "radial", + bbox, + stops, + [coords[0], coords[1]], + [coords[3], coords[4]], + coords[2], + coords[5], + ]; + } + if (kind === 3) { + const shadingType = this.data[PatternInfo.#SHADING_TYPE]; + let bounds = null; + if (coords.length > 0) { + let minX = coords[0], + maxX = coords[0]; + let minY = coords[1], + maxY = coords[1]; + for (let i = 0; i < coords.length; i += 2) { + const x = coords[i], + y = coords[i + 1]; + minX = minX > x ? x : minX; + minY = minY > y ? y : minY; + maxX = maxX < x ? x : maxX; + maxY = maxY < y ? y : maxY; + } + bounds = [minX, minY, maxX, maxY]; + } + return [ + "Mesh", + shadingType, + coords, + colors, + figures, + bounds, + bbox, + background, + ]; + } + throw new Error(`Unsupported pattern kind: ${kind}`); + } +} + +class FontPathInfo { + static write(path) { + let data; + let buffer; + if ( + (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) || + FeatureTest.isFloat16ArraySupported + ) { + buffer = new ArrayBuffer(path.length * 2); + data = new Float16Array(buffer); + } else { + buffer = new ArrayBuffer(path.length * 4); + data = new Float32Array(buffer); + } + data.set(path); + return buffer; + } + + #buffer; + + constructor(buffer) { + this.#buffer = buffer; + } + + get path() { + if ( + (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) || + FeatureTest.isFloat16ArraySupported + ) { + return new Float16Array(this.#buffer); + } + return new Float32Array(this.#buffer); + } +} + +export { CssFontInfo, FontInfo, FontPathInfo, PatternInfo, SystemFontInfo }; diff --git a/src/shared/util.js b/src/shared/util.js index 729c1e698c809..df9138133e43d 100644 --- a/src/shared/util.js +++ b/src/shared/util.js @@ -108,6 +108,12 @@ const PermissionFlag = { PRINT_HIGH_QUALITY: 0x800, }; +const MeshFigureType = { + TRIANGLES: 1, + LATTICE: 2, + PATCH: 3, +}; + const TextRenderingMode = { FILL: 0, STROKE: 1, @@ -348,7 +354,8 @@ const DrawOPS = { moveTo: 0, lineTo: 1, curveTo: 2, - closePath: 3, + quadraticCurveTo: 3, + closePath: 4, }; const PasswordResponses = { @@ -374,7 +381,7 @@ function getVerbosityLevel() { function info(msg) { if (verbosity >= VerbosityLevel.INFOS) { // eslint-disable-next-line no-console - console.log(`Info: ${msg}`); + console.info(`Info: ${msg}`); } } @@ -382,7 +389,7 @@ function info(msg) { function warn(msg) { if (verbosity >= VerbosityLevel.WARNINGS) { // eslint-disable-next-line no-console - console.log(`Warning: ${msg}`); + console.warn(`Warning: ${msg}`); } } @@ -643,6 +650,23 @@ class FeatureTest { ); } + static get isFloat16ArraySupported() { + return shadow( + this, + "isFloat16ArraySupported", + typeof Float16Array !== "undefined" + ); + } + + static get isSanitizerSupported() { + return shadow( + this, + "isSanitizerSupported", + // eslint-disable-next-line no-undef + typeof Sanitizer !== "undefined" + ); + } + static get platform() { const { platform, userAgent } = navigator; @@ -1211,44 +1235,6 @@ function MathClamp(v, min, max) { return Math.min(Math.max(v, min), max); } -// TODO: Remove this once `Uint8Array.prototype.toHex` is generally available. -function toHexUtil(arr) { - if (Uint8Array.prototype.toHex) { - return arr.toHex(); - } - return Array.from(arr, num => hexNumbers[num]).join(""); -} - -// TODO: Remove this once `Uint8Array.prototype.toBase64` is generally -// available. -function toBase64Util(arr) { - if (Uint8Array.prototype.toBase64) { - return arr.toBase64(); - } - return btoa(bytesToString(arr)); -} - -// TODO: Remove this once `Uint8Array.fromBase64` is generally available. -function fromBase64Util(str) { - if (Uint8Array.fromBase64) { - return Uint8Array.fromBase64(str); - } - return stringToBytes(atob(str)); -} - -// TODO: Remove this once https://bugzilla.mozilla.org/show_bug.cgi?id=1928493 -// is fixed. -if ( - (typeof PDFJSDev === "undefined" || PDFJSDev.test("SKIP_BABEL")) && - typeof Promise.try !== "function" -) { - Promise.try = function (fn, ...args) { - return new Promise(resolve => { - resolve(fn(...args)); - }); - }; -} - // TODO: Remove this once the `javascript.options.experimental.math_sumprecise` // preference is removed from Firefox. if (typeof Math.sumPrecise !== "function") { @@ -1314,7 +1300,6 @@ export { FeatureTest, FONT_IDENTITY_MATRIX, FormatError, - fromBase64Util, getModificationDate, getUuid, getVerbosityLevel, @@ -1327,6 +1312,7 @@ export { LINE_DESCENT_FACTOR, LINE_FACTOR, MathClamp, + MeshFigureType, normalizeUnicode, objectSize, OPS, @@ -1343,8 +1329,6 @@ export { stringToPDFString, stringToUTF8String, TextRenderingMode, - toBase64Util, - toHexUtil, UnknownErrorException, unreachable, updateUrlHash, diff --git a/stylelint-mozcentral.json b/stylelint-mozcentral.json new file mode 100644 index 0000000000000..6f5e7fffc1f3c --- /dev/null +++ b/stylelint-mozcentral.json @@ -0,0 +1,12 @@ +{ + "plugins": ["./external/stylelint/no-unused-custom-properties.mjs"], + "rules": { + "no-unknown-custom-properties": true, + "pdfjs/no-unused-custom-properties": [ + true, + { + "ignoreList": ["scale-round-x", "scale-round-y", "input-width"] + } + ] + } +} diff --git a/test/driver.js b/test/driver.js index 4a46695e8b039..612832b0951c1 100644 --- a/test/driver.js +++ b/test/driver.js @@ -257,10 +257,8 @@ class Rasterize { // Rendering annotation layer as HTML. const parameters = { annotations, - linkService: new SimpleLinkService(), imageResourcesPath, renderForms, - annotationStorage, fieldObjects, }; @@ -272,6 +270,8 @@ class Rasterize { annotationCanvasMap: annotationImageMap, page, viewport: annotationViewport, + linkService: new SimpleLinkService(), + annotationStorage, }); await annotationLayer.render(parameters); await annotationLayer.showPopups(); @@ -506,6 +506,7 @@ class Driver { this.inFlightRequests = 0; this.testFilter = JSON.parse(params.get("testfilter") || "[]"); this.xfaOnly = params.get("xfaonly") === "true"; + this.masterMode = params.get("mastermode") === "true"; // Create a working canvas this.canvas = document.createElement("canvas"); @@ -591,6 +592,25 @@ class Driver { task.stats = { times: [] }; task.enableXfa = task.enableXfa === true; + if (task.includePages && task.type === "extract") { + if (this.masterMode) { + const includePages = []; + for (const page of task.includePages) { + if (Array.isArray(page)) { + for (let i = page[0]; i <= page[1]; i++) { + includePages.push(i); + } + } else { + includePages.push(page); + } + } + task.numberOfTasks = includePages.length; + task.includePages = includePages; + } else { + delete task.pageMapping; + } + } + const prevFile = md5FileMap.get(task.md5); if (prevFile) { if (task.file !== prevFile) { @@ -608,6 +628,13 @@ class Driver { `[${this.currentTask + 1}/${this.manifest.length}] ${task.id}:\n` ); + if (task.type === "skip-because-failing") { + this._log(` Skipping file "${task.file} because it's failing"\n`); + this.currentTask++; + this._nextTask(); + return; + } + // Support *linked* test-cases for the other suites, e.g. unit- and // integration-tests, without needing to run them as reference-tests. if (task.type === "other") { @@ -658,6 +685,20 @@ class Driver { }); let promise = loadingTask.promise; + if (!this.masterMode && task.type === "extract") { + promise = promise.then(async doc => { + const data = await doc.extractPages([ + { + document: null, + includePages: task.includePages, + }, + ]); + await loadingTask.destroy(); + delete task.includePages; + return getDocument(data).promise; + }); + } + if (task.annotationStorage) { for (const annotation of Object.values(task.annotationStorage)) { const { bitmapName, quadPoints, paths, outlines } = annotation; @@ -862,7 +903,12 @@ class Driver { } } - if (task.skipPages?.includes(task.pageNum)) { + if ( + task.skipPages?.includes(task.pageNum) || + (this.masterMode && + task.includePages && + !task.includePages.includes(task.pageNum - 1)) + ) { this._log( ` Skipping page ${task.pageNum}/${task.pdfDoc.numPages}...\n` ); @@ -1117,28 +1163,7 @@ class Driver { const baseline = ctx.canvas.toDataURL("image/png"); this._clearCanvas(); - const filteredIndexes = new Set(); - - // TODO: This logic is copy-psated from PDFPageDetailView. - // We should export it instead, because even though it's - // not the core logic of partial rendering it is still - // relevant - const recordedGroups = page.recordedGroups; - for (let i = 0, ii = recordedGroups.length; i < ii; i++) { - const group = recordedGroups[i]; - if ( - group.minX <= partialCrop.maxX && - group.maxX >= partialCrop.minX && - group.minY <= partialCrop.maxY && - group.maxY >= partialCrop.minY - ) { - filteredIndexes.add(group.idx); - group.dependencies.forEach( - filteredIndexes.add, - filteredIndexes - ); - } - } + const recordedBBoxes = page.recordedBBoxes; const partialRenderContext = { canvasContext: ctx, @@ -1149,7 +1174,17 @@ class Driver { pageColors, transform, recordOperations: false, - filteredOperationIndexes: filteredIndexes, + operationsFilter(index) { + if (recordedBBoxes.isEmpty(index)) { + return false; + } + return ( + recordedBBoxes.minX(index) <= partialCrop.maxX && + recordedBBoxes.maxX(index) >= partialCrop.minX && + recordedBBoxes.minY(index) <= partialCrop.maxY && + recordedBBoxes.maxY(index) >= partialCrop.minY + ); + }, }; const partialRenderTask = page.render(partialRenderContext); @@ -1285,10 +1320,11 @@ class Driver { id: task.id, numPages: task.pdfDoc ? task.lastPage || task.pdfDoc.numPages : 0, lastPageNum: this._getLastPageNumber(task), + numberOfTasks: task.numberOfTasks ?? -1, failure, file: task.file, round: task.round, - page: task.pageNum, + page: task.pageMapping?.[task.pageNum] ?? task.pageNum, snapshot, baselineSnapshot, stats: task.stats.times, diff --git a/test/font/font_core_spec.js b/test/font/font_core_spec.js index d9ead417992ac..0eae7dab240c7 100644 --- a/test/font/font_core_spec.js +++ b/test/font/font_core_spec.js @@ -1,7 +1,7 @@ -import { decodeFontData, ttx, verifyTtxOutput } from "./fontutils.js"; +import { ttx, verifyTtxOutput } from "./fontutils.js"; describe("font1", function () { - const font1_1 = decodeFontData( + const font1_1 = Uint8Array.fromBase64( // eslint-disable-next-line max-len "T1RUTwAJAIAAAwAQQ0ZGIP/t0rAAAACcAAADKU9TLzJDxycMAAADyAAAAGBjbWFwwFIBcgAABCgAAABUaGVhZKsnTJ4AAAR8AAAANmhoZWEDHvxTAAAEtAAAACRobXR4AAAAAAAABNgAAAA4bWF4cAAOUAAAAAUQAAAABm5hbWX8Fq+xAAAFGAAAAfhwb3N0AAMAAAAABxAAAAAgAQAEAgABAQEMS0hQRkxFK01UU1kAAQEBOfgeAPgfAfggAvghA/gXBIv+Tvqn+bAFHQAAAMgPHQAAAL0QHQAAANsRHQAAACcdAAADARL4IAwWAAcBAQgUGx5TV19yYWRpY2FsY2lyY2xlY29weXJ0c2ltaWxhcjEuMUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MyBUaGUgVGVYcGxvcmF0b3JzIENvcnBvcmF0aW9uTVRTWU1hdGhUaW1lAAAAAAkAAg0YQ0RmZ3AAAKYAqAGIAYkADAAeAFwAXgGHAAoCAAEAAwAWAFoAtgDxARcBNgGKAd4CDiAO93W9Ad/4+AP5TPd1Fb38+FkHDvfslp/3PtH3Pp8B9xjR9zDQ9zDRFPz4P/eAFfd193UFRQb7UvtS+1L3UgVFBvd1+3X7dvt1BdIG91L3UvdS+1IF0gYO+MT7ZbP5vLMBw7P5vLMD+kT3fxX3iPtc91z7iPuI+1z7XPuI+4j3XPtc94j3iPdc91z3iB78UPwoFft0+0f3SPd093T3R/dI93T3dPdI+0j7dPt0+0j7SPt0Hw73Zb33Br0Bw/kwA/ln+C8VT3o8Lz8hMvc4+xYbP0E/WncfQIwH3KLi0Mb3AuL7OPcUG9nc272ZH9IHDjig97O997SfAfgBvQP5aPd1Fb37yffIWfvI+8lZ98n7yL33yAcO9MP3JsMBw/kwA/lo98cVw/0wUwf5MPteFcP9MFMHDkX7SaD4JJ/4JJ8B9yXVA/dv9w0V0n6yPZwejQfZnZiy0hr3PAfQn7HSmx6WByRNd/sLH/tGB0t7bEZ5HtB4m2xLGvtFB/sMyXfyHpYHRJt3sdAaDkX7SaD4JJ/4JJ8B9yvVA/d19xwVy5uq0J4eRp17qssa90UH9wxNnyQegAfSe59lRhr7PAdEmGTZeh6JBz15fmREGvs8B0Z3ZUR7HoAH8smf9wsfDvgq/k6g99/k+LCfAcD5yAP4Kf5OFZUG+F76fQVWBvwe/fT7cffE+yz7KJp23dsFDnie+GWenJD3K54G+2WiBx4KBI8MCb0KvQufqQwMqZ8MDfmgFPhMFQAAAAAAAwIkAfQABQAAAooCuwAAAIwCigK7AAAB3wAxAQIAAAAABgAAAAAAAAAAAAABEAAAAAAAAAAAAAAAKjIxKgAAAEPgBwMc/EYAZAMcA7oAAAAAAAAAAAAAAAAAAABDAAMAAAABAAMAAQAAAAwABABIAAAACgAIAAIAAgBEAGcAcOAH//8AAABDAGYAcOAA////wv+h/5kAAAABAAAAAAAAAAQAAAABAAEAAgACAAMAAwAEAAQAAQAAAAAQAAAAAABfDzz1AAAD6AAAAACeC34nAAAAAJ4LficAAPxGD/8DHAAAABEAAAAAAAAAAAABAAADHPxGAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAOAAAAAAAUAPYAAQAAAAAAAAAQAAAAAQAAAAAAAQALABAAAQAAAAAAAgAHABsAAQAAAAAAAwAIACIAAQAAAAAABAALACoAAQAAAAAABQAMADUAAQAAAAAABgAAAEEAAQAAAAAABwAHAEEAAQAAAAAACAAHAEgAAQAAAAAACQAHAE8AAwABBAkAAAAgAFYAAwABBAkAAQAWAHYAAwABBAkAAgAOAIwAAwABBAkAAwAQAJoAAwABBAkABAAWAKoAAwABBAkABQAYAMAAAwABBAkABgAAANgAAwABBAkABwAOANgAAwABBAkACAAOAOYAAwABBAkACQAOAPRPcmlnaW5hbCBsaWNlbmNlS0hQRkxFK01UU1lVbmtub3dudW5pcXVlSURLSFBGTEUrTVRTWVZlcnNpb24gMC4xMVVua25vd25Vbmtub3duVW5rbm93bgBPAHIAaQBnAGkAbgBhAGwAIABsAGkAYwBlAG4AYwBlAEsASABQAEYATABFACsATQBUAFMAWQBVAG4AawBuAG8AdwBuAHUAbgBpAHEAdQBlAEkARABLAEgAUABGAEwARQArAE0AVABTAFkAVgBlAHIAcwBpAG8AbgAgADAALgAxADEAVQBuAGsAbgBvAHcAbgBVAG4AawBuAG8AdwBuAFUAbgBrAG4AbwB3AG4AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" ); diff --git a/test/font/font_fpgm_spec.js b/test/font/font_fpgm_spec.js index 45501608e9759..ed8605ef4da28 100644 --- a/test/font/font_fpgm_spec.js +++ b/test/font/font_fpgm_spec.js @@ -1,4 +1,4 @@ -import { decodeFontData, ttx, verifyTtxOutput } from "./fontutils.js"; +import { ttx, verifyTtxOutput } from "./fontutils.js"; import { CMapFactory } from "../../src/core/cmap.js"; import { Font } from "../../src/core/fonts.js"; import { Name } from "../../src/core/primitives.js"; @@ -6,7 +6,7 @@ import { Stream } from "../../src/core/stream.js"; import { ToUnicodeMap } from "../../src/core/to_unicode_map.js"; describe("font_fpgm", function () { - const font2324 = decodeFontData( + const font2324 = Uint8Array.fromBase64( // eslint-disable-next-line max-len "AAEAAAANAIAAAwBQT1MvMlNlbJwAAADcAAAAYGNtYXDrAFO9AAABPAAALKxjdnQgAzYCuwAALegAAAAMZnBnbQgKVdkAAC30AAACaGdseWa+m03rAAAwXAAAOERoZWFk9BT7TwAAaKAAAAA4aGhlYQWlFpUAAGjYAAAAJGhtdHgPKyHAAABo/AAAUqRsb2NhBA9dxAAAu6AAAFKobWF4cBY1AjUAAQ5IAAAAIG5hbWXZdYwDAAEOaAAAAhBwb3N0AAMAAAABEHgAAAAgcHJlcFyRbmMAARCYAAAAVAADAiQB9AAFAAACigK7AAAAjAKKArsAAAHfADEBAgAAAAAGAAAAAAAAAOAAEAFQAP3/AAAAIAAAAAQqMjEqAAAAIP//A+j+1ABkBBoB1QAAAAAAAAAAAgwC2QAAACAAAwAAAAEAAwABAAAADAAELKAAAADQAIAABgBQAH4emx75HxUfHR9FH00fVx9ZH1sfXR99H7QfxB/TH9sf7x/0H/4gZCBxII4glCCuILUguCDhIPAhCSEkITMhPCE/IUQhSyFOIX8hmSGmIaohtSHDIcwh1SHdIgAiAyINIhciGiIeIiAiLiI0Ij4iSSJNIlAiYiJlImsicyJ9IokijCKZIqcitSLDIsYiyCLjIwAjCyMjIyojpiOuJCQkaSVLJWwl/yYsJmcmbydAKgQqCS1lLW8uF6Yrp4ztwPsF+xf7Nvs8+z77QftE+0///wAAACAeAB6gHwAfGB8gH0gfUB9ZH1sfXR9fH4Afth/GH9Yf3R/yH/YgACBwIHQgkCChILAguCDQIOQhACELISYhNSE+IUEhSiFNIVMhkCGmIakhtSG8Icwh0CHdIgAiAiIFIg8iGSIdIiAiIyI0IjwiQCJNIlAiYCJkImoibSJ6IoAijCKPIqIisiLAIsUiyCLgIwAjCCMgIykjmyOuJAAkYCUAJVAlgCYsJmAmaSdAKgAqCS0wLW8uF6UAp4jgAPsA+xP7Hfs4+z77QPtD+0b//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AGMAsIDdAOeA6gD8gP8BAoECgQKBAoERgSuBMoE5ATuBRIFFgUmBe4F8AYkBiwGRgZQBlAGcgaKBpwGzgboBvYG+Ab+BwAHAgdaB2wHbAduB24HfAd8B4YHhgeGB4gHmAeoB6oHrAesB8IHwgfGB9gH2AfYB9wH3gfgB+wH8ggECAQIGAgiCCgILggwCDAINgg2CDwIQghECFoIWgiiCLQJSgmCCoAKgAqOCpoKmgqiCqILDAsMCwwNYg1qKOoo9Cj8KS4pNik2KTgpOilMAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQn6CfsJ/An9Cf4J/woACgEKAgoDCgQKBQoGCgcKCAoJCgoKCwoMCg0KDgoPChAKEQoSChMKFAoVChYKFwoYChkKGgobChwKHQoeCh8KIAohCiIKIwokCiUKJgonCigKKQoqCisKLAotCi4KLwowCjEKMgozCjQKNQo2CjcKOAo5CjoKOwo8Cj0KPgo/CkAKQQpCCkMKRApFCkYKRwpICkkKSgpLCkwKTQpOCk8KUApRClIKUwpUClUKVgpXClgKWQpaClsKXApdCl4KXwpgCmEKYgpjCmQKZQpmCmcKaAppCmoKawpsCm0KbgpvCnAKcQpyCnMKdAp1CnYKdwp4CnkKegp7CnwKfQp+Cn8KgAqBCoIKgwqECoUKhgqHCogKiQqKCosKjAqNCo4KjwqQCpEKkgqTCpQKlQqWCpcKmAqZCpoKmwqcCp0KngqfCqAKoQqiCqMKpAqlCqYKpwqoCqkKqgqrCqwKrQquCq8KsAqxCrIKswq0CrUKtgq3CrgKuQq6CrsKvAq9Cr4KvwrACsEKwgrDCsQKxQrGCscKyArJCsoKywrMCs0KzgrPCtAK0QrSCtMK1ArVCtYK1wrYCtkK2grbCtwK3QreCt8K4ArhCuIK4wrkCuUK5grnCugK6QrqCusK7ArtCu4K7wrwCvEK8grzCvQK9Qr2CvcK+Ar5CvoK+wr8Cv0K/gr/CwALAQsCCwMLBAsFCwYLBwsICwkLCgsLCwwLDQsOCw8LEAsRCxILEwsUCxULFgsXCxgLGQsaCxsLHAsdCx4LHwsgCyELIgsjCyQLJQsmCycLKAspCyoLKwssCy0LLgsvCzALMQsyCzMLNAs1CzYLNws4CzkLOgs7CzwLPQs+Cz8LQAtBC0ILQwtEC0ULRgtHC0gLSQtKC0sLTAtNC04LTwtQC1ELUgtTC1QLVQtWC1cLWAtZC1oLWwtcC10LXgtfC2ALYQtiC2MLZAtlC2YLZwtoC2kLagtrC2wLbQtuC28LcAtxC3ILcwt0C3ULdgt3C3gLeQt6C3sLfAt9C34LfwuAC4ELgguDC4QLhQuGC4cLiAuJC4oLiwuMC40LjguPC5ALkQuSC5MLlAuVC5YLlwuYC5kLmgubC5wLnQueC58LoAuhC6ILowukC6ULpgunC6gLqQuqC6sLrAutC64LrwuwC7ELsguzC7QLtQu2C7cLuAu5C7oLuwu8C70Lvgu/C8ALwQvCC8MLxAvFC8YLxwvIC8kLygvLC8wLzQvOC88L0AvRC9IL0wvUC9UL1gvXC9gL2QvaC9sL3AvdC94L3wvgC+EL4gvjC+QL5QvmC+cL6AvpC+oL6wvsC+0L7gvvC/AL8QvyC/ML9Av1C/YL9wv4C/kL+gv7C/wL/Qv+C/8MAAwBDAIMAwwEDAUMBgwHDAgMCQwKDAsMDAwNDA4MDwwQDBEMEgwTDBQMFQwWDBcMGAwZDBoMGwwcDB0MHgwfDCAMIQwiDCMMJAwlDCYMJwwoDCkMKgwrDCwMLQwuDC8MMAwxDDIMMww0DDUMNgw3DDgMOQw6DDsMPAw9DD4MPwxADEEMQgxDDEQMRQxGDEcMSAxJDEoMSwxMDE0MTgxPDFAMUQxSDFMMVAxVDFYMVwxYDFkMWgxbDFwMXQxeDF8MYAxhDGIMYwxkDGUMZgxnDGgMaQxqDGsMbAxtDG4MbwxwDHEMcgxzDHQMdQx2DHcMeAx5DHoMewx8DH0Mfgx/DIAMgQyCDIMMhAyFDIYMhwyIDIkMigyLDIwMjQyODI8MkAyRDJIMkwyUDJUMlgyXDJgMmQyaDJsMnAydDJ4MnwygDKEMogyjDKQMpQymDKcMqAypDKoMqwysDK0MrgyvDLAMsQyyDLMMtAy1DLYMtwy4DLkMugy7DLwMvQy+DL8MwAzBDMIMwwzEDMUMxgzHDMgMyQzKDMsMzAzNDM4MzwzQDNEM0gzTDNQM1QzWDNcM2AzZDNoM2wzcDN0M3gzfDOAM4QziDOMM5AzlDOYM5wzoDOkM6gzrDOwM7QzuDO8M8AzxDPIM8wz0DPUM9gz3DPgM+Qz6DPsM/Az9DP4M/w0ADQENAg0DDQQNBQ0GDQcNCA0JDQoNCw0MDQ0NDg0PDRANEQ0SDRMNFA0VDRYNFw0YDRkNGg0bDRwNHQ0eDR8NIA0hDSINIw0kDSUNJg0nDSgNKQ0qDSsNLA0tDS4NLw0wDTENMg0zDTQNNQ02DTcNOA05DToNOw08DT0NPg0/DUANQQ1CDUMNRA1FDUYNRw1IDUkNSg1LDUwNTQ1ODU8NUA1RDVINUw1UDVUNVg1XDVgNWQ1aDVsNXA1dDV4NXw1gDWENYg1jDWQNZQ1mDWcNaA1pDWoNaw1sDW0Nbg1vDXANcQ1yDXMNdA11DXYNdw14DXkNeg17DXwNfQ1+DX8NgA2BDYINgw2EDYUNhg2HDYgNiQ2KDYsNjA2NDY4Njw2QDZENkg2TDZQNlQ2WDZcNmA2ZDZoNmw2cDZ0Nng2fDaANoQ2iDaMNpA2lDaYNpw2oDakNqg2rDawNrQ2uDa8NsA2xDbINsw20DbUNtg23DbgNuQ26DbsNvA29Db4Nvw3ADcENwg3DDcQNxQ3GDccNyA3JDcoNyw3MDc0Nzg3PDdAN0Q3SDdMN1A3VDdYN1w3YDdkN2g3bDdwN3Q3eDd8N4A3hDeIN4w3kDeUN5g3nDegN6Q3qDesN7A3tDe4N7w3wDfEN8g3zDfQN9Q32DfcN+A35DfoN+w38Df0N/g3/DgAOAQ4CDgMOBA4FDgYOBw4IDgkOCg4LDgwODQ4ODg8OEA4RDhIOEw4UDhUOFg4XDhgOGQ4aDhsOHA4dDh4OHw4gDiEOIg4jDiQOJQ4mDicOKA4pDioOKw4sDi0OLg4vDjAOMQ4yDjMONA41DjYONw44DjkOOg47DjwOPQ4+Dj8OQA5BDkIOQw5EDkUORg5HDkgOSQ5KDksOTA5NDk4OTw5QDlEOUg5TDlQOVQ5WDlcOWA5ZDloOWw5cDl0OXg5fDmAOYQ5iDmMOZA5lDmYOZw5oDmkOag5rDmwObQ5uDm8OcA5xDnIOcw50DnUOdg53DngOeQ56DnsOfA59Dn4Ofw6ADoEOgg6DDoQOhQ6GDocOiA6JDooOiw6MDo0Ojg6PDpAOkQ6SDpMOlA6VDpYOlw6YDpkOmg6bDpwOnQ6eDp8OoA6hDqIOow6kDqUOpg6nDqgOqQ6qDqsOrA6tDq4Orw6wDrEOsg6zDrQOtQ62DrcOuA65DroOuw68Dr0Ovg6/DsAOwQ7CDsMOxA7FDsYOxw7IDskOyg7LDswOzQ7ODs8O0A7RDtIO0w7UDtUO1g7XDtgO2Q7aDtsO3A7dDt4O3w7gDuEO4g7jDuQO5Q7mDucO6A7pDuoO6w7sDu0O7g7vDvAO8Q7yDvMO9A71DvYO9w74DvkO+g77DvwO/Q7+Dv8PAA8BDwIPAw8EDwUPBg8HDwgPCQ8KDwsPDA8NDw4PDw8QDxEPEg8TDxQPFQ8WDxcPGA8ZDxoPGw8cDx0PHg8fDyAPIQ8iDyMPJA8lDyYPJw8oDykPKg8rDywPLQ8uDy8PMA8xDzIPMw80DzUPNg83DzgPOQ86DzsPPA89Dz4PPw9AD0EPQg9DD0QPRQ9GD0cPSA9JD0oPSw9MD00PTg9PD1APUQ9SD1MPVA9VD1YPVw9YD1kPWg9bD1wPXQ9eD18PYA9hD2IPYw9kD2UPZg9nD2gPaQ9qD2sPbA9tD24Pbw9wD3EPcg9zD3QPdQ92D3cPeA95D3oPew98D30Pfg9/D4APgQ+CD4MPhA+FD4YPhw+ID4kPig+LD4wPjQ+OD48PkA+RD5IPkw+UD5UPlg+XD5gPmQ+aD5sPnA+dD54Pnw+gD6EPog+jD6QPpQ+mD6cPqA+pD6oPqw+sD60Prg+vD7APsQ+yD7MPtA+1D7YPtw+4D7kPug+7D7wPvQ++D78PwA/BD8IPww/ED8UPxg/HD8gPyQ/KD8sPzA/ND84Pzw/QD9EP0g/TD9QP1Q/WD9cP2A/ZD9oP2w/cD90P3g/fD+AP4Q/iD+MP5A/lD+YP5w/oD+kP6g/rD+wP7Q/uD+8P8A/xD/IP8w/0D/UP9g/3D/gP+Q/6D/sP/A/9D/4P/xAAEAEQAhADEAQQBRAGEAcQCBAJEAoQCxAMEA0QDhAPEBAQERASEBMQFBAVEBYQFxAYEBkQGhAbEBwQHRAeEB8QIBAhECIQIxAkECUQJhAnECgQKRAqECsQLBAtEC4QLxAwEDEQMhAzEDQQNRA2EDcQOBA5EDoQOxA8ED0QPhA/EEAQQRBCEEMQRBBFAGIAYwBkAGUAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAcgBzAHQAdQB2AHcAeAB5AHoAewB8AH0AfgB/AIAAgQCCAIMAhACFAIYAhwCIAIkAigCLAIwAjQCOAI8AkACRAJIAkwCUAJUAlgCXAJgAmQCaAJsAnACdAJ4AnwCgAKEAogCjAKQApQCmAKcAqACpAKoAqwCsAK0ArgCvALAAsQCyALMAtAC1ALYAtwC4ALkAugC7ALwAvQC+AL8AwADBAMIAwwDEAMUAxgDHAMgAyQDKAMsAzADNAM4AzwDQANEA0gDTANQA1QDWANcA2ADZANoA2wDcAN0A3gDfAOAA4QDiAOMA5ADlAOYA5wDoAOkA6gDrAOwA7QDuAO8A8ADxAPIA8wD0APUA9gD3APgA+QD6APsA/AD9AP4A/wEAAQEBAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgEzATQBNQE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAccByAHJAcoBywHMAc0BzgHPAdAB0QHSAdMB1AHVAdYB1wHYAdkB2gHbAdwB3QHeAd8B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AgACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICEwIUAhUCFgIXAhgCGQIaAhsCHAIdAh4CHwIgAiECIgIjAiQCJQImAicCKAIpAioCKwIsAi0CLgIvAjACMQIyAjMCNAI1AjYCNwI4AjkCOgI7AjwCPQI+Aj8CQAJBAkICQwJEAkUCRgJHAkgCSQJKAksCTAJNAk4CTwJQAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJ0AnUCdgJ3AngCeQJ6AnsCfAJ9An4CfwKAAoECggKDAoQChQKGAocCiAKJAooCiwKMAo0CjgKPApACkQKSApMClAKVApYClwKYApkCmgKbApwCnQKeAp8CoAKhAqICowKkAqUCpgKnAqgCqQKqAqsCrAKtAq4CrwKwArECsgKzArQCtQK2ArcCuAK5AroCuwK8Ar0CvgK/AsACwQLCAsMCxALFAsYCxwLIAskCygLLAswCzQLOAs8C0ALRAtIC0wLUAtUC1gLXAtgC2QLaAtsC3ALdAt4C3wLgAuEC4gLjAuQC5QLmAucC6ALpAuoC6wLsAu0C7gLvAvAC8QLyAvMC9AL1AvYC9wL4AvkC+gL7AvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRQNGA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSA1MDVANVA1YDVwNYA1kDWgNbA1wDXQNeA18DYANhA2IDYwNkA2UDZgNnA2gDaQNqA2sDbANtA24DbwNwA3EDcgNzA3QDdQN2A3cDeAN5A3oDewN8A30DfgN/A4ADgQOCA4MDhAOFA4YDhwOIA4kDigOLA4wDjQOOA48DkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwOgA6EDogOjA6QDpQOmA6cDqAOpA6oDqwOsA60DrgOvA7ADsQOyA7MDtAO1A7YDtwO4A7kDugO7A7wDvQO+A78DwAPBA8IDwwPEA8UDxgPHA8gDyQPKA8sDzAPNA84DzwPQA9ED0gPTA9QD1QPWA9cD2APZA9oD2wPcA90D3gPfA+AD4QPiA+MD5APlA+YD5wPoA+kD6gPrA+wD7QPuA+8D8APxA/ID8wP0A/UD9gP3A/gD+QP6A/sD/AP9A/4D/wQABAEEAgQDBAQEBQQGBAcECAQJBAoECwQMBA0EDgQPBBAEEQQSBBMEFAQVBBYEFwQYBBkEGgQbBBwEHQQeBB8EIAQhBCIEIwQkBCUEJgQnBCgEKQQqBCsELAQtBC4ELwQwBDEEMgQzBDQENQQ2BDcEOAQ5BDoEOwQ8BD0EPgQ/BEAEQQRCBEMERARFBEYERwRIBEkESgRLBEwETQROBE8EUARRBFIEUwRUBFUEVgRXBFgEWQRaBFsEXARdBF4EXwRgBGEEYgRjBGQEZQRmBGcEaARpBGoEawRsBG0EbgRvBHAEcQRyBHMEdAR1BHYEdwR4BHkEegR7BHwEfQR+BH8EgASBBIIEgwSEBIUEhgSHBIgEiQSKBIsEjASNBI4EjwSQBJEEkgSTBJQElQSWBJcEmASZBJoEmwScBJ0EngSfBKAEoQSiBKMEpASlBKYEpwSoBKkEqgSrBKwErQSuBK8EsASxBLIEswS0BLUEtgS3BLgEuQS6BLsEvAS9BL4EvwTABMEEwgTDBMQExQTGBMcEyATJBMoEywTMBM0EzgTPBNAE0QTSBNME1ATVBNYE1wTYBNkE2gTbBNwE3QTeBN8E4AThBOIE4wTkBOUE5gTnBOgE6QTqBOsE7ATtBO4E7wTwBPEE8gTzBPQE9QT2BPcE+AT5BPoE+wT8BP0E/gT/BQAFAQUCBQMFBAUFBQYFBwUIBQkFCgULBQwFDQUOBQ8FEAURBRIFEwUUBRUFFgUXBRgFGQUaBRsFHAUdBR4FHwUgBSEFIgUjBSQFJQUmBScFKAUpBSoFKwUsBS0FLgUvBTAFMQUyBTMFNAU1BTYFNwU4BTkFOgU7BTwFPQU+BT8FQAVBBUIFQwVEBUUFRgVHBUgFSQVKBUsFTAVNBU4FTwVQBVEFUgVTBVQFVQVWBVcFWAVZBVoFWwVcBV0FXgVfBWAFYQViBWMFZAVlBWYFZwVoBWkFagVrBWwFbQVuBW8FcAVxBXIFcwV0BXUFdgV3BXgFeQV6BXsFfAV9BX4FfwWABYEFggWDBYQFhQWGBYcFiAWJBYoFiwWMBY0FjgWPBZAFkQWSBZMFlAWVBZYFlwWYBZkFmgWbBZwFnQWeBZ8FoAWhBaIFowWkBaUFpgWnBagFqQWqBasFrAWtBa4FrwWwBbEFsgWzBbQFtQW2BbcFuAW5BboFuwW8Bb0FvgW/BcAFwQXCBcMFxAXFBcYFxwXIBckFygXLBcwFzQXOBc8F0AXRBdIF0wXUBdUF1gXXBdgF2QXaBdsF3AXdBd4F3wXgBeEF4gXjBeQF5QXmBecF6AXpBeoF6wXsBe0F7gXvBfAF8QXyBfMF9AX1BfYF9wX4BfkF+gX7BfwF/QX+Bf8GAAYBBgIGAwYEBgUGBgYHBggGCQYKBgsGDAYNBg4GDwYQBhEGEgYTBhQGFQYWBhcGGAYZBhoGGwYcBh0GHgYfBiAGIQYiBiMGJAYlBiYGJwYoBikGKgYrBiwGLQYuBi8GMAYxBjIGMwY0BjUGNgY3BjgGOQY6BjsGPAY9Bj4GPwZABkEGQgZDBkQGRQZGBkcGSAZJBkoGSwZMBk0GTgZPBlAGUQZSBlMGVAZVBlYGVwZYBlkGWgZbBlwGXQZeBl8GYAZhBmIGYwZkBmUGZgZnBmgGaQZqBmsGbAZtBm4GbwZwBnEGcgZzBnQGdQZ2BncGeAZ5BnoGewZ8Bn0GfgZ/BoAGgQaCBoMGhAaFBoYGhwaIBokGigaLBowGjQaOBo8GkAaRBpIGkwaUBpUGlgaXBpgGmQaaBpsGnAadBp4GnwagBqEGogajBqQGpQamBqcGqAapBqoGqwasBq0GrgavBrAGsQayBrMGtAa1BrYGtwa4BrkGuga7BrwGvQa+Br8GwAbBBsIGwwbEBsUGxgbHBsgGyQbKBssGzAbNBs4GzwbQBtEG0gbTBtQG1QbWBtcG2AbZBtoG2wbcBt0G3gbfBuAG4QbiBuMG5AblBuYG5wboBukG6gbrBuwG7QbuBu8G8AbxBvIG8wb0BvUG9gb3BvgG+Qb6BvsG/Ab9Bv4G/wcABwEHAgcDBwQHBQcGBwcHCAcJBwoHCwcMBw0HDgcPBxAHEQcSBxMHFAcVBxYHFwcYBxkHGgcbBxwHHQceBx8HIAchByIHIwckByUHJgcnBygHKQcqBysHLActBy4HLwcwBzEHMgczBzQHNQc2BzcHOAc5BzoHOwc8Bz0HPgc/B0AHQQdCB0MHRAdFB0YHRwdIB0kHSgdLB0wHTQdOB08HUAdRB1IHUwdUB1UHVgdXB1gHWQdaB1sHXAddB14HXwdgB2EHYgdjB2QHZQdmB2cHaAdpB2oHawdsB20HbgdvB3AHcQdyB3MHdAd1B3YHdwd4B3kHegd7B3wHfQd+B38HgAeBB4IHgweEB4UHhgeHB4gHiQeKB4sHjAeNB44HjweQB5EHkgeTB5QHlQeWB5cHmAeZB5oHmwecB50HngefB6AHoQeiB6MHpAelB6YHpweoB6kHqgerB6wHrQeuB68HsAexB7IHswe0B7UHtge3B7gHuQe6B7sHvAe9B74HvwfAB8EHwgfDB8QHxQfGB8cHyAfJB8oHywfMB80HzgfPB9AH0QfSB9MH1AfVB9YH1wfYB9kH2gfbB9wH3QfeB98H4AfhB+IH4wfkB+UH5gfnB+gH6QfqB+sH7AftB+4H7wfwB/EH8gfzB/QH9Qf2B/cH+Af5B/oH+wf8B/0H/gf/CAAIAQgCCAMIBAgFCAYIBwgICAkICggLCAwIDQgOCA8IEAgRCBIIEwgUCBUIFggXCBgIGQgaCBsIHAgdCB4IHwggCCEIIggjCCQIJQgmCCcIKAgpCCoIKwgsCC0ILggvCDAIMQgyCDMINAg1CDYINwg4CDkIOgg7CDwIPQg+CD8IQAhBCEIIQwhECEUIRghHCEgISQhKCEsITAhNCE4ITwhQCFEIUghTCFQIVQhWCFcIWAhZCFoIWwhcCF0IXghfCGAIYQhiCGMIZAhlCGYIZwhoCGkIaghrCGwIbQhuCG8IcAhxCHIIcwh0CHUIdgh3CHgIeQh6CHsIfAh9CH4IfwiACIEIggiDCIQIhQiGCIcIiAiJCIoIiwiMCI0IjgiPCJAIkQiSCJMIlAiVCJYIlwiYCJkImgibCJwInQieCJ8IoAihCKIIowikCKUIpginCKgIqQiqCKsIrAitCK4IrwiwCLEIsgizCLQItQi2CLcIuAi5CLoIuwi8CL0Ivgi/CMAIwQjCCMMIxAjFCMYIxwjICMkIygjLCMwIzQjOCM8I0AjRCNII0wjUCNUI1gjXCNgI2QjaCNsI3AjdCN4I3wjgCOEI4gjjCOQI5QjmCOcI6AjpCOoI6wjsCO0I7gjvCPAI8QjyCPMI9Aj1CPYI9wj4CPkI+gj7CPwI/Qj+CP8JAAkBCQIJAwkECQUJBgkHCQgJCQkKCQsJDAkNCQ4JDwkQCREJEgkTCRQJFQkWCRcJGAkZCRoJGwkcCR0JHgkfCSAJIQkiCSMJJAklCSYJJwkoCSkJKgkrCSwJLQkuCS8JMAkxCTIJMwk0CTUJNgk3CTgJOQk6CTsJPAk9CT4JPwlACUEJQglDCUQJRQlGCUcJSAlJCUoJSwlMCU0JTglPCVAJUQlSCVMJVAlVCVYJVwlYCVkJWglbCVwJXQleCV8JYAlhCWIJYwlkCWUJZglnCWgJaQlqCWsJbAltCW4JbwlwCXEJcglzCXQJdQl2CXcJeAl5CXoJewl8CX0Jfgl/CYAJgQmCCYMJhAmFCYYJhwmICYkJigmLCYwJjQmOCY8JkAmRCZIJkwmUCZUJlgmXCZgJmQmaCZsJnAmdCZ4JnwmgCaEJogmjCaQJpQmmCacJqAmpCaoJqwmsCa0JrgmvCbAJsQmyCbMJtAm1CbYJtwm4CbkJugm7CbwJvQm+Cb8JwAnBCcIJwwnECcUJxgnHCcgJyQnKCcsJzAnNCc4JzwnQCdEJ0gnTCdQJ1QnWCdcJ2AnZCdoJ2wncCd0J3gnfCeAJ4QniCeMJ5AnlCeYJ5wnoCekJ6gnrCewJ7QnuCe8J8AnxCfIJ8wn0CfUJ9gn3CfgJ+RBGEEcQSBBJEEoQSxBMEE0QThBPEFAQURBSEFMQVBBVEFYQVxBYEFkQWhBbEFwQXRBeEF8QYBBhEGIQYxBkEGUQZhBnEGgQaRBqEGsQbBBtEG4QbxBwEHEQchBzEHQQdRB2EHcQeBB5EHoQexB8EH0QfhB/EIAQgRCCEIMQhBCFEIYQhxCIEIkQihCLEIwQjRCOEI8QkBCREJIQkxCUEJUQlhCXEJgQmRCaEJsQnBCdEJ4QnxCgEKEQohCjEKQQpRCmEKcQqBCpEKoQqxCsEK0QrhCvELAQsRCyELMQtBC1ELYQtxC4ELkQuhC7ELwQvRC+EL8QwBDBEMIQwxDEEMUQxhDHEMgQyRDKEMsQzBDNEM4QzxDQENEQ0hDTENQQ1RDWENcQ2BDZENoQ2xDcEN0Q3hDfEOAQ4RDiEOMQ5BDlEOYQ5xDoEOkQ6hDrEOwQ7RDuEO8Q8BDxEPIQ8xD0EPUQ9hD3EPgQ+RD6EPsQ/BD9EP4Q/xEAEQERAhEDEQQRBREGEQcRCBEJEQoRCxEMEQ0RDhEPERARERESERMRFBEVERYRFxEYERkRGhEbERwRHREeER8RIBEhESIRIxEkESURJhEnESgRKREqESsRLBEtES4RLxEwETERMhEzETQRNRE2ETcROBE5EToROxE8ET0RPhE/EUARQRFCEUMRRBFFEUYRRxFIEUkRShFLEUwRTRFOEU8RUBFREVIRUxFUEVURVhFXEVgRWRFaEVsRXBFdEV4RXxFgEWERYhFjEWQRZRFmEWcRaBFpEWoRaxFsEW0RbhFvEXARcRFyEXMRdBF1EXYRdxF4EXkRehF7EXwRfRF+EX8RgBGBEYIRgxGEEYURhhGHEYgRiRGKEYsRjBGNEY4RjxGQEZERkhGTEZQRlRGWEZcRmBGZEZoRmxGcEZ0RnhGfEaARoRGiEaMRpBGlEaYRpxGoEakRqhGrEawRrRGuEa8RsBGxEbIRsxG0EbURthG3EbgRuRG6EbsRvBG9Eb4RvxHAEcERwhHDEcQRxRHGEccRyBHJEcoRyxHMEc0RzhHPEdAR0RHSEdMR1BHVEdYR1xHYEdkR2hHbEdwR3RHeEd8R4BHhEeIR4xHkEeUR5hHnEegR6RHqEesR7BHtEe4R7xHwEfER8hHzEfQR9RH2EfcR+BH5EfoR+xH8Ef0R/hH/EgASARICEgMSBBIFEgYSBxIIEgkSChILEgwSDRIOEg8SEBIREhISExIUEhUSFhIXEhgSGRIaEhsSHBIdEh4SHxIgEiESIhIjEiQSJRImEicSKBIpEioSKxIsEi0SLhIvEjASMRIyEjMSNBI1EjYSNxI4EjkSOhI7EjwSPRI+Ej8SQBJBEkISQxJEEkUSRhJHEkgSSRJKEksSTBJNEk4STxJQElESUhJTElQSVRJWElcSWBJZEloSWxJcEl0SXhJfEmASYRJiEmMSZBJlEmYSZxJoEmkSahJrEmwSbRJuEm8ScBJxEnIScxJ0EnUSdhJ3EngSeRJ6EnsSfBJ9En4SfxKAEoESghKDEoQShRKGEocSiBKJEooSixKMEo0SjhKPEpASkRKSEpMSlBKVEpYSlxKYEpkSmhKbEpwSnRKeEp8SoBKhEqISoxKkEqUSphKnEqgSqRKqEqsSrBKtEq4SrxKwErESshKzErQStRK2ErcSuBK5EroSuxK8Er0SvhK/EsASwRLCEsMSxBLFEsYSxxLIEskSyhLLEswSzRLOEs8S0BLREtIS0xLUEtUS1hLXEtgS2RLaEtsS3BLdEt4S3xLgEuES4hLjEuQS5RLmEucS6BLpEuoS6xLsEu0S7hLvEvAS8RLyEvMS9BL1EvYS9xL4EvkS+hL7EvwS/RL+Ev8TABMBEwITAxMEEwUTBhMHEwgTCRMKEwsTDBMNEw4TDxMQExETEhMTExQTFRMWExcTGBMZExoTGxMcEx0THhMfEyATIRMiEyMTJBMlEyYTJxMoEykTKhMrEywTLRMuEy8TMBMxEzITMxM0EzUTNhM3EzgTORM6EzsTPBM9Ez4TPxNAE0ETQhNDE0QTRRNGE0cTSBNJE0oTSxNME00TThNPE1ATURNSE1MTVBNVE1YTVxNYE1kTWhNbE1wTXRNeE18TYBNhE2ITYxNkE2UTZhNnE2gTaRNqE2sTbBNtE24TbxNwE3ETchNzE3QTdRN2E3cTeBN5E3oTexN8E30TfhN/E4ATgROCE4MThBOFE4YThxOIE4kTihOLE4wTjROOE48TkBORE5ITkxOUE5UTlhOXE5gTmROaE5sTnBOdE54TnxOgE6ETohOjE6QTpROmE6cTqBOpE6oTqxOsE60TrhOvE7ATsROyE7MTtBO1E7YTtxO4E7kTuhO7E7wTvRO+E78TwBPBE8ITwxPEE8UTxhPHE8gTyRPKE8sTzBPNE84TzxPQE9ET0hPTE9QT1RPWE9cT2BQTFBQUFRQWFBcUGBQZFBoUGxQcFB0UHhQfFCAUIRQiFCMUJBQlFCYUJxQoFCkUKhQrFCwULRQuFC8UMBQxFDIUMxQ0FDUUNhQ3FDgUORQ6FDsUPBQ9FD4UPxRAFEEUQhRDFEQURRRGFEcUSBRJFEoUSxRMFE0UThRPFFAUURRSFFMUVBRVFFYUVxRYFFkUWhRbFFwUXRReFF8UYBRhFGIUYxRkFGUUZhRnFGgUaRRqFGsUbBRtFG4UbxRwFHEUchRzFHQUdRR2FHcUeBR5FHoUexR8FH0UfhR/FIAUgRSCFIMUhBSFFIYUhxSIFIkUihSLFIwUjRSOFI8UkBSRFJIUkxSUFJUUlhSXFJgUmRSaFJsUnBSdFJ4UnxSgFKEUohSjFKQUpRSmFKcUqBPZE9oT2xPcE90T3hPfE+AT4RPiE+MT5BPlE+YT5xPoE+kT6hPrE+wT7RPuE+8T8BPxE/IT8xP0E/UT9hP3E/gT+RP6E/sT/BP9E/4T/xQAFAEUAhQDFAQUBRQGFAcUCBQJFAoUCxQMFA0UDhQPFBAUERQSAAEAAgAAAgwC2QBSAF0AXbAALLAAE0uwKlBYsEp2WbAAIz8YsAYrWD1ZS7AqUFh9WSDUsAETLhgtsAEsINqwDCstsAIsS1JYRSNZIS2wAyxpGCCwQFBYIbBAWS2wBCywBitYISMheljdG81ZG0tSWFj9G+1ZGyMhsAUrWLBGdllY3RvNWVlZGC2wBSwNXFotsAYssSIBiFBYsCCIXFwbsABZLbAHLLEkAYhQWLBAiFxcG7AAWS2wCCwSESA5Ly2wCSwgfbAGK1jEG81ZILADJUkjILAEJkqwAFBYimWKYSCwAFBYOBshIVkbiophILAAUlg4GyEhWVkYLbAKLLAGK1ghEBsQIVktsAssINKwDCstsAwsIC+wBytcWCAgRyNGYWogWCBkYjgbISFZGyFZLbANLBIRICA5LyCKIEeKRmEjiiCKI0qwAFBYI7AAUliwQDgbIVkbI7AAUFiwQGU4GyFZWS2wDiywBitYPdYYISEbINaKS1JYIIojSSCwAFVYOBshIVkbISFZWS2wDywjINYgL7AHK1xYIyBYS1MbIbABWViKsAQmSSOKIyCKSYojYTgbISEhIVkbISEhISFZLbAQLCDasBIrLbARLCDSsBIrLbASLCAvsAcrXFggIEcjRmFqiiBHI0YjYWpgIFggZFqOQVMhWRshIVktsBMsIIogiocgsAMlSmQjigewIFBYPBvAWS2wFCyzAEABQEJCAUu4EABjAEu4EABjIIogilVYIIogilJYI2IgsAAjQhtiILABI0JZILBAUliyACAAQ2NCsgEgAUNjQrAgY7AZZRwhWRshIVktsBUssAFDYyOwAENjIy0AAAAAAgBYAAACZALZAAMABwAAMxEhESUhESFYAgz+RwFm/poC2f0nSAJJAAIAfAAAANAC2QAFAAkAABMRByMnERMVIzXQFicWU1QC2f6u398BUv2PaGgAAgA0AdABMQLFAAUACwAAEzMVByMnNzMVByMnNF0bJxugXRsnGwLFb4aGb2+GhgAAAgAO/+wCHgK5ABsAHwAAAQczFSMHMxUjByM3IwcjNyM1MzcjNTM3MwczNwMjBzMB5SRdah9pdSdMJnwnTCZlch9seSRMJH0jMHwgfQK5xESuRNPT09NErkTExMT++K4AAwAh/4ICBgMCAC4ANAA7AAAlFAYHFSM1LgE9ATMeBxcRJicmNTQ2NzUzFR4BFSMuAScVHgYlNQ4BFRQTPgE1NCYnAgZvaTtlbU8CAQYHDRIaJBZdIUdlYDtbZ08BQDIENBwzHyIQ/u04PK9DQzlNw2BzB2dnB25hERQNJQ8eDxILAwEQHBgzX1VnDDY2B2lVN0YC+QEOChYbJzix8Ag+MVr+eghKNzE2FwAAAAUAHf/sA1sCxQAJABUAGQAkADAAABMyFhUUBiImNDYXIgYVFBYzMjY1NCYlMwEjATIWFRQGIyImNDYXIgYVFBYzMjY1NCbHSGNkjGVkRik8PCopPDsBb0L+dUIB2khjZUVHZGRGKTw8Kik8OwKtZElFZGWMZUY7Kik8OykrO179JwFWZEhFZGWMZEY7KSo7OygrOwADADT/6QJ9AsUAHgAqADMAACUGBwYjIiY1NDY3LgE1NDYyFhUUBgcXNj0BMxQHFyMDPgE1NCYjIgYVFBYTJw4BFRQWMzIB0jIgO0RccUVdLyJkjlw8ToUfUDp6bfM7LDEmJy8ZsqBENk02SU4xEiJtWkRbNjtFI0JbWEU2TCyjNzwEXlmXAa8lNCIlMC8nGyv+psgrRSo1SwAAAAABADAB0ACOAsUABQAAEzMVByMnMF4bKBsCxW+GhgAAAAEASf8sASMC2QAKAAATMwYVFBcjJgI0Nuw3iYk3S1hYAtnd+fjfYgD/7P4AAQAm/ywBAALZAAoAABcjNjU0JzMeARQGXTeJiTdLWFjU3fn432L/7P4AAAABACgBuQFXAtkADgAAEzMHNxcHFwcnByc3JzcXoD8FahNsRjM+PzJFbBNqAtlwJjseWSRdXSRZHjsmAAABADL/9gIWAdoACwAAARUjFSM1IzUzNTMVAhbPRs/PRgELRs/PRs/PAAAAAAEAV/9tAMAAaAAKAAA3MxUUIzU+AT0BI1dpaSMZPGh4gyYBJjQSAAABAC4A8AEcATgAAwAAARUjNQEc7gE4SEgAAAAAAQBXAAAAvwBoAAMAADcVIzW/aGhoaAAAAf/4/+wBHALZAAMAABMzAyPlN+03Atn9EwAAAAIAK//pAfsCxQANABUAABM0PgMzMhEUBiMiJgAgERAzMjY1Kx4uQDsh6HdxcnYBdv7kjEpGAVdZiE0wEP6Mr7m7AdP+3/7ckJcAAAABAGYAAAFbAsUACAAAASM1PgE3MxEjAQOdZj4XOlgB+T8NLlL9OwAAAQAiAAAB/wLFABkAABM2MzIWFRQPAQ4BByEVIT4BPwE2NTQmIyIHMgfjZX6WZEE4BwF1/igGUm9cYFA8hQoBz/Z0XIRSNiNCLVd1fz80N1U5TKkAAQAg/+kB+gLFACQAAAEiBgcjNjMyFhUUBx4BFRQGIyInMx4BMzI2NTQjByM1PgE1NCYBDkw5AlgF2WVzY0A4g23aEFgFSEhFTpMlC19PQwJ4U0XlaFtsJxZPRGV45U1KS0OBAUsCLEE4QQAAAgAcAAACCALFAAoADQAAJSE1ATMRMxUjFSM1EQMBR/7VAUJBaWlY3qpdAb7+NE+q+QE2/soAAAABACP/6QIBAsUAIQAAARUhBzYzMhYVFAYjIi4FJzMWMzI2NTQmIyIGByMTAdz+2Rw7SGZ/iGspRS0lExEEA1gfckhTVEcpOh9RNQLFV8Yrg2lwjhIZKR8vEhF3WExPWx0lAYIAAgAr/+kCAQLFABkAJQAAEzQ+AzMyFhcjLgEjIgYHNjMyFhUUBiMiEyIGFRQWMzI2NTQmKyIzRz8jUWsNWAs+LkxRATppX3qDZe7yQVJSPj1QSgFDXo9SMxBiVzM4i4JPfmNohwGCU0JEW1dDR1MAAAEALgAAAggCxQAKAAABFQYCByM2EjchNQIIeIsdXih8f/6BAsVKoP7Pqq8BCrVXAAMAJf/pAgECxQATAB4AKAAAARYVFAYiJjU0Ny4BNTQ2MhYVFAYmIgYVFBYzMjY1NAYiBhQWMzI2NTQBh3qF0oV5Nip3vHcqc3BDQzg3RDmEUlFBQ1MBdTp3YXp7YXY6IkAxU2pqUzJA4T0zMj08MjTsTXxOTT8+AAIAJv/pAf0CxQAYACMAAAEUDgMjIiYnMx4BMzI2NwYiJjU0NjMyByIGFRQWMjY1NCYB/SIzR0AjUWsNWAs+LkxRAULAeoNl7/A9UEqAU1IBa16PUjMQYlczOIuCT35jaIdNWENHU1RBRVsAAAIAbgAAANYCDAADAAcAADcVIzUTFSM11mhoaGhoaAGkaGgAAAIAbv9tANcCDAADAA4AABMVIzUDMxUUIzU+AT0BI9doAWlpIxk8AgxoaP5ceIMmASY0EgABAC3/9wIWAdoABgAANzUlFQ0BFS0B6f52AYrGRc9PoaRPAAACADIAbwIWAWEAAwAHAAABFSE1BRUhNQIW/hwB5P4cAWFGRqxGRgAAAQAy//cCGwHaAAYAAAEVBTUtATUCG/4XAYr+dgELRc9PoaRPAAAAAAIATQAAAf0C5QAbAB8AAAEUDgMdASM1ND4DNTQmIyIGFSM0NjMyFgMVIzUB/SU0NSVaJTU0JUY6SThVb2xhdLNaAiUuSjEtOSAvNyVCMDA9IzM/Ukpzd2j962hoAAAAAAIAIv9yA7cC5QA1AEEAAAEzAwYVFBYzMjY1NCYjIgYVFBYzMjcXBiMiLgE1NDY3PgEzMhYVFAcGIyInBiMiJjU0NjMyFwMyNjU0JiMiBhUUFgKZU1oMHhRAaNGPnuvYn09yHHByfNJ5VEpCslmv+1ZMbmAOQkxGXZxlVCa+QVs2KD9iOgH1/ugjDxIajlh9tuqdj8MgQypruG1ivUM8RdyYe2RZTUhpTm2oV/7LpkwmNIJUMUUAAAACABEAAAKNAtkABwAKAAAlIQcjATMBIwsCAdr+501jAQR4AQBoZXB429sC2f0nASkBTP60AAAAAAMATwAAAm8C2QAPABUAHwAAJRQGIyERITIeAhUUBx4BJjQrARUzEzI+ATU0JisBFQJvdmH+twEoPVotFGVGP32StLQvMT4URD/j0F5yAtkkOzsfcC8bVI3o6P6zKzQeOUX7AAABADD/6QKlAuUAHQAAEzQ+AzMyFyMuASMiBhUUFjMyNjczAiEiLgMwETBHeUzuK18QXldqe4BtWmARYCH+9Ut3Ry8RAWQyYmpPNO5OTqKMiaFlav7fM05pYAAAAAIAWQAAApsC2QAHABAAADMRITIWEAYjJzMyNjU0JisBWQEZi56firysbHBwbKwC2cL+rMNSkIqLkAAAAAEAWgAAAmUC2QALAAATFSEVIREhFSEVIRW3Aa799QH5/mQBjQFM+lIC2VLpUgAAAAEAWgAAAkMC2QAJAAATESMRIRUhFSEVt10B6f50AVwBTP60AtlS6VIAAAAAAQAs/+kCxQLlACQAABMUHgMzMjY9ASM1IREjJwYjIiY1ND4DMzIWFyMuASMiBokOJDlePGSB3gEwOxdokZS6EjJLf1B9oRNfD3FTdIwBaiZNVD8pfmIUUv57YXTUqDBhalA1em9GUaMAAAAAAQBTAAAChALZAAsAAAEhESMRMxEhETMRIwIn/oldXQF3XV0BTP60Atn+xQE7/ScAAQBkAAAAwgLZAAMAABMRIxHCXgLZ/ScC2QAAAAEAEf/pAaoC2QARAAA3MjY1ETMRFAYjIiY9ATMVFBbdQDBdb19ebV84N1RNAgH93V9uaFlAL0BEAAAAAAEATwAAApIC2QALAAATFSMRMxEBMwkBIwGsXV0Ba3j+1wEsbv7/AP//Atn+jwFx/tf+UAF2AAAAAQBQAAACFQLZAAUAABMRIRUhEa0BaP47Atn9eVIC2QABAEsAAAL5AtkADAAAISMDESMRMxsBMxEjEQHUYs9YgdjUgVgCY/2dAtn9hQJ7/ScCYwAAAQBMAAAChgLZAAkAAAERIwERIxEzAREChmn+h1hlAX0C2f0nAk/9sQLZ/awCVAAAAgAm/+kC5gLlAAoAFAAAARQGIyImEDYzMhYlIgYQFjI2NTQmAubAoJ7Cwp2gwf6fdI6P6I+OAWGi1tMBVtPUgqX+8qWkhIqmAAAAAAIAWwAAAmkC2QAKABIAAAEUBisBESMRITIWBTMyNjQmKwECaXFb5V0BLWx1/k/CQ0tLQ8ICA11x/ssC2W/jRHhEAAAAAgAm/8UC5gLlAA4AHAAABQcnBiMiJhA2MzIWFRQHJxc2NTQmIgYQFjMyNycC3S9pVmmewsKencNnnllPj+iPjnQ8PEoBOlcz0wFW09KqrHGBSVmLhqWl/vKlHD4AAAAAAgBdAAACpwLZAB0AJgAAAR4DFRQGFRQWFxUjJj0BNCYrAREjESEyFhUUBic0JisBFTMyNgIYICsTBgESGnEUOj7wXQFQa3M2K0xD4eFKRQFoDiYwKh0JIggpOBIXLklBQz/+xgLZZV4+UoNINvs8AAEAMP/pAm0C5QAwAAAlMj4CNTQvASY1NDYzMhYXIy4BIyIGFRQWHwEeARUUDgMjIi4DJzMVFB4CAVY4TiUPhrWPi3h+jAFYAV5XSlk2QrdKUQ8oPmdBKUtOOCUBWBMrVTsaKikXUyMwJYVjc3drR01ENyowEjEUYEMdOT0uHg0jN1w8BR82NB8AAAAAAQAVAAACUQLZAAcAAAERIxEjNSEVAWJd8AI8Aof9eQKHUlIAAQBV/+kChQLZABEAAAEzERQGIyImNREzERQWMzI2NQIoXZmAgpVdZVVYZALZ/gBugoFvAgD+AE9PVEoAAQAeAAAChQLZAAYAACEjATMbATMBiGT++mTWymMC2f2XAmkAAQAWAAADoQLZAAwAACEjCwEjAzMbATMbATMC6Gaoo2a7aImiZKaGaAJX/akC2f2wAlD9sAJQAAABABYAAAKJAtkACwAACQEjCwEjAQMzGwEzAYcBAnPHyHEBAvJxu7xvAXb+igEw/tABdgFj/uIBHgAAAAABAA0AAAKVAtkACAAAAREjEQEzGwEzAYNd/udz1tBvAR7+4gEeAbv+nQFjAAEAHAAAAkcC2QAJAAABFQEhFSE1ASE1AkX+TAG2/dUBtv5mAtlU/c1SUgI1UgAAAAEAQP8sAPoC2QAHAAATFSMRMxUjEfpnZ7oC2Uj840gDrQAAAAH/+P/sARwC2QADAAAbASMDL+037QLZ/RMC7QABABb/LADQAtkABwAAFzUzESM1MxEWZ2e61EgDHUj8UwAAAAABACwBSQGpAsUABgAAEzMTIwsBI8VJm0V6eUUCxf6EASz+1AAB/+r/UAJC/4IAAwAABRUhNQJC/ah+MjIAAAAAAQAWAlAA5wLkAAMAABMXIyeHYDyVAuSUlAAAAAIAKv/pAhcCGwApADQAABM2MzIWFREUMzI3FQYjIiYnBiMiJjU0Pgc3PgE9ATQmIyIGBxMyNj0BDgMUFkEGzGFkLQkJIxYoKQVUXk9dCQscEy0YPBwkMSY9ODo8BVNFWBllSjw2AXGqSUb+zCkCPwklKE1URxcmHRkQDwcKBAUGGhoWJigtMP7BSSpeDBAMLVAsAAACADb/6QILAtkADgAZAAATMxE2MzIWFRQGIyInFSMTIgYUFjMyNjU0JjZTOWloeHxoaztL5UJQUEJEVVMC2f7sVpR/gp1aQwHNb7hvb1lecAAAAAABAB//6QHdAhsAGAAAASMuASMiBhUUFjMyNzMOASMiJjU0NjMyFgHXVAhANERNTkVrFVQIcF5rfX9qW20BXDc7b2Jdan5ga5V/gpxiAAAAAAIAGv/pAe8C2QAPABsAAAERIzUOASMiJjU0NjMyFxEDIgYVFBYzMjY1NCYB70oiTzZqentmbDWTRFRURUJQUALZ/SdFMSuZhX2XUQEP/vRwW1xvbltebwACACj/6QIBAhsAFAAdAAAlIRYXFjMyNzMOASMiJhA2MzIWFxYFITY1NCYjIgYCAf5+ARsrU2YjVBB2Wm6Ag21KcRkV/oABJgFUPT9S6kgoRGlWYJUBAptKQDcsAgRBWVcAAAAAAQASAAABAgLcABQAAAEVIxEjESM1MzU0NjMyFxUmIyIdAQECV1NGRkE6FxgTCjoCDET+OAHIRFk4PwVFATVSAAIAHf8mAekCGwAcACgAABciJjU0NjMyFzUzERQOAiMiJiczFjMyNj0BDgEDIgYVFBYzMjY1NCb1XHx7ZGI+TRIwX0lcbgdVDnFUPiNLIUNOTkRCTEsXl32AnltM/kpLZVYqVEpYX2EbMiwB5W5eX21rXmJtAAAAAAEARgAAAeYC2QATAAABNCYjIgYVESMRMxE+ATMyFhURIwGTQylATlNTJUs4TFlTAWs3MGFQ/t8C2f7rMCdNQv50AAAAAgBCAAAAlgLZAAMABwAAExEjETcVIzWWU1NUAgz99AIMzWlpAAAAAAL/7v8mAJkC2QAMABAAABMzERQjIic1FjMyNjUTFSM1RlOPDQ8MCyQdU1MCDP2HbQNHAh8nAyVpaQAAAAEAOgAAAfYC2QALAAATETczBxMjAwcVIxGN3mu21mexUVMC2f5V3rX+qQEcUMwC2QAAAAABAEQAAACYAtkAAwAAExEjEZhUAtn9JwLZAAAAAQBGAAAC+gIbACEAABMzFT4BMzIXPgEzMhYVESMRNCYjIgYVESMRNCYjIgYVESNGTSJLNGEsJUg0SU9UMy4zSFQzLjNIVAIMSi8qUCwkS0f+dwFpMjdQOf63AWkyN1A5/rcAAAEARgAAAecCGwATAAATMxU+ATMyFhURIxE0JiMiBhURI0ZNI1E6TFpTOjJATlQCDFg3ME5B/nQBay84YVD+3wACACT/6QH+AhsACgAVAAABMhYVFAYjIiYQNhciBhQWMzI2NTQmARBxfX9ucH1+b0ZQUEZFUU8CG5WIgZSVAQiVTW2+bW1cYW4AAAAAAgA2/yYCCwIbAA4AGQAAFxEzFTYzMhYVFAYjIicREyIGFBYzMjY1NCY2TTtsaHl7ZWFAkkJQUEJEVFPaAuZPXpqEfZdO/u8Cp2+4b29ZXnAAAAAAAgAa/yYB7wIbAA4AGgAABSMRBiMiJjU0NjMyFzUzByIGFRQWMzI2NTQmAe9TOWloeHxoazxK5UVUVEVCUE/aARZTlH+CnVVGP3BbXG9uWl5wAAAAAQBFAAABQQIbAA0AAAEOARURIxEzFT4BMzIXAUFUVFRNJEMoCxUBwwJKZ/7wAgxfOzMDAAEAIv/pAcsCGwAkAAA3HgEzMjY1NCYvAS4BNTQ2MhYXIyYjIgYVFBYfAR4BFRQGIyInegY1RTdDJitOXUlutmIBWANmMzwuM1BORnVjywacLzctJR0iChMWQz5JV1RNVCskHCMMExNFOkxaswAAAAABAA7/6QD+ApwAFQAAExUjERQWMzI3FQYjIiY1ESM1MzUzFf5WExsZDycdMTRHR1MCDET+mRwTBEYHKygBjESQkAAAAAEAQf/pAeICDAATAAAhIzUOASMiJjURMxEUFjMyNjURMwHiSyVQOkxbUzoyQU5TSTQsTkEBlP6NLzhhUAEpAAABAAoAAAHmAgwABgAAISMDMxsBMwEdW7hejJReAgz+VwGpAAABAAYAAALEAgwADAAAISMLASMDMxsBMxsBMwIqX2plXphca2RmZ2heAZv+ZQIM/mgBmP5oAZgAAAEAEQAAAdkCDAALAAABEyMnByMTAzMXNzMBJLVhg4Vfua9ffn5eAQ/+8cnJAQsBAb6+AAABABT/JgHeAgwAEAAAATMDBiMiJzUWMzI2PwEDMxMBhFrpKV4fGRsRGh4LILFZhgIM/YZsDUsGFxxTAg7+aAAAAQAfAAAByQIMAAkAAAEVASEVITUBITUBu/7JAUX+VgE5/twCDEr+h0lLAXhJAAAAAQAr/ywBFALZACEAAAEVIyIGHQEUBgcWHQEUFjsBFSMiJj0BNCYnNT4BPQE0NjMBFA8lGiQuUholDy40OSIsLCI5NALZQRwntUVGEiZ4tSccQUU+p0U8CUUJO0anPkUAAQBk/ywAoALZAAMAABMzESNkPDwC2fxTAAAAAAEAHf8sAQYC2QAgAAAXNTMyNj0BNDcmPQE0JisBNTMyFh0BFBYXFQ4BHQEUBiMdECUbUlIbJRAvNDohKyshOjTUQRwntXglJni1JxxBRT6nRTwJRQk8Rac+RQAAAQBLAQwB/AG2ABUAABMiByM+ATMyHwEWMzI2NTMUIyIvASa1LwY1BDcxGxt1HBYeFTVpJypiFwFzTkZLEEURJSaPGj8OAAD//wAAAAAAAAAAEAIAAwAA//8Aev8zAM4CDBAPAAQBSgIMwAAAAgA0/4gB/gJ0ABkAHwAAARE2NzMOAQcVIzUuATU0Njc1MxUeARcjLgEDEQYVFBYBOGASVAVqVypldXVlKlhjBVQFOViDRQHO/mcLdFptBGFiCZN3epgLWlkGY1YyPP5tAZYYuFVnAAABABr/6QIXAtkANQAAExQeARczFSMWFRQGBzYzMhYzMjcXBiMiJiMiByc+ATU0JyM1My4BNTQ2MzIeAxcjJiMiBpMPJgagiA8zQzs/IWgYKCsqOUorhiM1ODBFOBhuUSITiWUdNT4sHwFYBIRATQILHCw+DTcrHCdSRCcfHkI4LiVCO1YuJig3OTEhW3sJHjFXOZpGAAAAAAIAQwCFAekCJwAbACYAACUHJwYjIicHJzcmNTQ3JzcXNjMyFzcXBxYVFAcnIgYUFjMyNjU0JgHlOjUoPDUpMzgwICA2ODcsNTooOzk3Gh2dLD4/LCs/Pr42NR4ZMzkxKzs5LTc1NxocNTo3KTQyL8k+Vj09Kiw+AAEACwAAAiECxQAWAAABFSMVMxUjFSM1IzUzNSM1MwMzGwEzAwHvqqqqWKysrJfNVbmzVckBYjNNM6+vM00zAWP+vgFC/p0AAAIAZP8sAKAC2QADAAcAABMzESMVMxEjZDw8PDwC2f5vi/5vAAIAK/8rAfoC2QA0AD8AABcUFjMyNjU0LwEuATU0NjcmNTQ2MhYdASM1NCYjIgYVFBYfAR4BFRQHHgEVFAYjIi4DNTcXNjU0LwEOARQWoj0pKzU3qjErMjcsa5xhVDUsJjMZIJI9MG0eF2tQGC40JxlvpklJoScgGg5FNTAmMiZ1IkoxMkcdMzNFYGJPHBovNzAlFiIVXidKNnMpIjQgSGAIGypKMPN7Jz89M20aLTwoAAAA//8AGQJkATQCzBAmAnlZABAGAnmmAAAAAAP/8//qAu8C5gAaACUAMAAAAQ4EIyImNTQ2MzIXIy4BIyIGFRQWMzI3ACAWFRQGIyImNTQkIAYVFBYzMjY1NAIoBgcbIUAoVmxtWIMjRw0tKDlERThWFP7yATzg4aKa3wIA/vy4t3+FuQE4GxxAJB+BZmmCmzIrXU9IYnwBrt+eoN/inJ6ivISDvbuGgwAAAAMAJQEvAU0C5gADACMALQAAARUhNSUVBiMiJwYjIiY1NDY3PgE9ATQjIgYHIzYzMh0BFDMyJw4CFRQzMjY1AUD+6wEiEBAvCDE4MDhEWRwVQyIdBTsDfnoXBFQTUy45JTYBYjMzXywGKys0LDExBwIOEQ0sGCBsXrMXeggKFx0vKBoAAAIALQBqAZIBtgAGAA0AADc1NxUHFxU3NTcVBxcVLZhqajWYamrjWXpTU1NTeVl6U1NTUwABACgAVgIgAXcABQAAEyERIzUhKAH4Rv5OAXf+39sAAAEALgDwARwBOAADAAABFSM1ARzuAThISAAAAAAE//P/6gLvAuYAGwAjAC4AOQAAAR4BFRQGFRQXFSMmNTQ1NzQmKwEVIxEzMhUUBiczMjU0JisBJiAWFRQGIyImNTQkIAYVFBYzMjY1NAHvGxMBF08PAR4ihkbOjRf+gUsjKIE9ATzg4aKa3wIA/vy4t3+FuQFoEi8gBhkFLREZIyUCAygkILkBvX4iKgVDIyDc356g3+KcnqK8hIO9u4aDAAAAAAEAHAJ3AS4CvQADAAABFSE1AS7+7gK9RkYAAAACAJcBfwHGAq4ACgAVAAABMhYVFAYjIiY0NhYiBhUUFjMyNjU0AS8+WVlAPVlZZk44NyYoOAKuWT5AWFp8WTk4Jic4NygnAAACADL/9QIWAm8ACwAPAAABFSMVIzUjNTM1MxUTFSE1AhbPRs/PRs/+HAGgRs/PRs/P/ptGRgAAAAEAEwEcAUYCxQAcAAATIg4CByM2MzIWFRQPAQ4BBzMVIT4BPwE2NTQmshokEQcBPgSTQFJgPyEfCeX+0AQzSDo7MQKQEiAdFJhGOFIvIBEjHDpJTCYfIC8gKwAAAQAQAQ4BQgLFACUAABMiBhUjNjMyFhUUBxYVFAYjIiY1Mx4BMzI2NTQmJyYjNTI2NTQmqS4jPwONQEs5R1VGSE8+AiwtKjAgGg8zQC4pApAtLI5AODsaGEw9SUpELisrJhsnBAIzGiMgJAAAAQBcAlABLQLkAAMAABMzByO8cZU8AuSUAAAAAAEAQf8kAiACDAAaAAAlFQYjIicGIyInFSMRMxEUFjMyNjURMxEUMzICICEYUwM7aDYkU1M6MUFOUy0IMT8JU1Ma3wLo/o0vOGFQASn+TCkAAQAw/08CCgLZAA8AAAEuATU0NjsBFSMRIxEjESMA/2Fugl76OUBSQAEDBYNeZYtA/LYDSvy2AP//AFcA4wC/AUsQAwJ5/+T+fwAAAAEAJ/8qAR8AAAAaAAAXHgMzMjY1NCMiByc3Mwc2MzIWFRQGIyInPAkhERoNFx8uDxAMKiYXDQ8mKUI5L06MBBAHBhoTJQgHXDgCIyArMiIAAQBFARwA5gLFAAkAABMjNTc+ATczESOoYw82JA0rPgJELgEFHTD+VwAAAAADACgBLwFEAuYAAwAOABkAAAEVITUTMhYVFAYiJjU0NhciBhUUFjI2NTQmATr++YNESkuGS0tDJy0tTi0sAWIzMwGEWlRPWlpSUVo0QDc4QD83OUAAAAD//wAuAGoBkwG2EA8AbQHAAiDAAAAEAD3/7ANRAsUACQANABgAGwAAEyM1Nz4BNzMRIwEzASMlIzUTMxEzFSMVIz0BB6BjDzYkDSs+AeM6/jw6AhG8zC5DQz6BAkQuAQUdMP5XAan9J3g7AQr+8DVkmaqqAAADAD3/7ANMAsUACQANACoAABMjNTc+ATczESMBMwEjASIOAgcjNjMyFhUUDwEOAQczFSE+AT8BNjU0JqBjDzYkDSs+Acs6/jw6AhEaJBEHAT4Ek0BSYD8hHwnl/tAEM0g6OzECRC4BBR0w/lcBqf0nAYgSIB0UmEY4Ui8gESMcOklMJh8gLyArAAAAAAQAGv/sA0QCxQAlACkANAA3AAATIgYVIzYzMhYVFAcWFRQGIyImNTMeATMyNjU0JicmIzUyNjU0JiUzASMlIzUTMxEzFSMVIz0BB7MuIz8DjUBLOUdVRkhPPgIsLSowIBoPM0AuKQGqOv48OgIHvMwuQ0M+gQKQLSyOQDg7GhhMPUlKRC4rKyYbJwQCMxojICQ1/Sd4OwEK/vA1ZJmqqv//AGD/JwIQAgwQDwAiAl0CDMAA//8AEQAAAo0DnBAjAmsAqAC4EgIAJAAA//8AEQAAAo0DnBAjAmoAtgC4EgIAJAAA//8AEQAAAo0DnxAjAmYArAC6EgIAJAAA//8AEQAAAo0DdxAjAnwArwCqEgIAJAAA//8AEQABAo0DcRAjAGoArgClEgIAJAAB//8AEQAAAo0DxhAjAnoAqADCEgIAJAAAAAIACwAAA7YC2QAPABMAACUhByMBIRUhFSEVIRUhFSEZASMDAdT+81VnASsCbv6NAWD+oAGF/h5kitbWAtlS6VL6UgEoAV/+oQAAAAABADD/KgKlAuUANwAAJTI2NzMCIQc2MzIWFRQGIyInNx4DMzI2NTQjIgcnNy4BJy4BNTQ+AzMyFyMuASMiBhUUFgF6Wl8SYCH+9w0NDyYpQjkwTRUHHxIcDhcfLg8QCx84PCFETBEwR3lM7itfEFxYa3uAOmRs/t8hAiMgKzIiKAMPCAcaEyUIB0UIFRcxrGoyYmpPNO5NT6KMiaIAAAD//wBaAAACZQOZECMCawC5ALUSAgAoAAD//wBaAAACZQOdECMCagCyALkSAgAoAAD//wBaAAACZQOeECMCZgC1ALkSAgAoAAD//wBaAAACZQN0ECMAagC0AKgSAgAoAAD//wAAAAAA0QOdECMCa//qALkSAgAsAAD//wBHAAABGAOdECMCav/rALkSAgAsAAD/////AAABHgOdECMCZv/rALgSAgAsAAD//wAJAAABJANyECMAav/wAKYSAgAsAAAAAgAUAAACmwLZAAsAFwAAEyM1MxEhMhYQBiMhExEzMjYQJisBFTMVWUVFARqKnp6K/uZdrWtwcGutqwFTQwFDwv6swwFT/v+QARaP8UMAAP//AEwAAAKGA2YQIwJ8AMcAmRICADEAAP//ACb/6QLmA5oQIwJrAOAAthICADIAAP//ACb/6QLmA5sQIwJqAOUAtxICADIAAP//ACb/6QLmA6AQIwJmAOMAuxICADIAAP//ACb/6QLmA3IQIwJ8AOMApRICADIAAP//ACb/6QLmA3QQIwBqAOIAqBICADIAAAABAF8AIgHoAasACwAAARcHFwcnByc3JzcXAbYxkpMyk5Iyk5IxkgGrMpKTMpOSMZOSMZEAAwAe/+kC6ALzABMAGwAjAAA/ASY1NDYzMhc3FwcWFRQGIyInBzcBJiMiBhUUCQEWMzI2NTQeUUzDnYldVyhZVMOdkGFNaQGASWJ0jwHR/n1Ka3SPE1lqkqrTUV8kYWqeqtNaVMEBo0ClhmgBKv5bSqWGcv//AFX/6QKFA5wQIwJrAMcAuBICADgAAP//AFX/6QKFA5wQIwJqAMcAuBICADgAAP//AFX/6QKFA50QIwJmAMoAuBICADgAAP//AFX/6QKFA3ESIgA4AAAQAwBqAMoApf//AA0AAAKVA5sQIwJqALEAtxICADwAAAACAFsAAAJoAtkADAAUAAA3FSMRMxUzMhYVFAYjJzMyNjQmKwG4XV3QaHhyWeXCQUlJQcK9vQLZeHFjW3VSRHhEAAAAAAEAQ//xAjsC2AAlAAABMjU0JiMiBhURIxE0NjIWFRQOAgceARUUBiMiJzUWMzI1NCsBASabT0lQPlh53IERIREPNECKchQhFhaqqhABq3EzPUhG/gICFFlrYlIiNiQOCg5mMn96B0sDlowA//8AKv/pAhcC2BAiAmtz9BICAEQAAAAA//8AKv/pAhcC2BAiAmpz9BICAEQAAAAA//8AKv/pAhcC1xAiAmZw8hICAEQAAAAA//8AKv/pAhcCxRAiAnxx+BICAEQAAAAA//8AKv/pAhcC1xAiAGpwCxICAEQAAAAA//8AKv/pAhcDBBAiAnpsABICAEQAAAAAAAMAKv/pA1UCGwAvADsAQgAAJR4DMzI3Mw4BIyInJjUOASMiJjU0PgU9ATQjIgcjNjMyFz4BMzIWFxYVBTI2PQEOAxUUFiUhNCYjIgYB0wEeMDEaZSVUEHZZiDgCOGU7TFwaKkZHZiR2cApUBsqALxtcNklwGhX9kEZaHmdHODYBHgEmUEA/Uuo0SyUQaVVhawIBOjRURyY5JBgMCBodFk5dqlImLEpAN3C4URplDREKLCgnLfxHWVcAAAAAAQAf/yoB3QIbADUAABcuBDU0NjMyFhcjLgEjIgYVFBYzMjczDgEjBzYzMhYVFAYjIic3HgMzMjY1NCMiByfhNU4mFQR/alttB1QIQDRETU5FaxVUBXRcDQ4OJSpCOS9OFQcfER0OFx8uDxAMFQo4PVAsF4KcYl03O29jXWp/Xm0hAiMgKzIhKQMPCAcaEyUIBwAA//8AKP/pAgEC2hAiAmt29hICAEgAAAAA//8AKP/pAgEC2hAiAmp49hICAEgAAAAA//8AKP/pAgEC1xAiAmZ78hICAEgAAAAA//8AKP/pAgEC1xAiAGp1CxICAEgAAAAA//8AAAAAANEC2hAiAmvq9hICAPMAAAAA//8AKQAAAPoC2hAiAmrN9hICAPMAAAAA////+QAAARgC2RAiAmbl9BICAPMAAAAA////8AAAAQsC2BAiAGrXDBICAPMAAAAAAAIAJP/pAf4C5wAfACoAABM0PgMzMhcmJwcnNyYnNxYXNxcHHgQVFAYiJhMiBhQWMzI2NTQmJB0tPDgcGCcnO2EkVR40LCVKYShaHipGKyJ84nztRlBQRkVRTwECQGU8Jw8NKDEtJygXHSwQLy0lKRcjTUxzPoeTkwFSbb5tbVxhbgAA//8ARgAAAecCwhAiAnx09RICAFEAAAAA//8AJP/pAf4C2RAiAmtt9RICAFIAAAAA//8AJP/pAf4C2hAiAmpu9hICAFIAAAAA//8AJP/pAf4C2hAiAmZu9RICAFIAAAAA//8AJP/pAf4CxBAiAnxu9xICAFIAAAAA//8AJP/pAf4C2RAiAGptDRICAFIAAAAAAAMAMgAAAhYB2AADAAcACwAAARUhNQUVIzUTFSM1Ahb+HAEmaGhoAQ9GRqdoaAFwaGgAAAADABL/4gIRAhsAEwAbACMAAAEHFhUUBiMiJwcnNyY1NDYzMhc3BwMWMzI2NTQFEyYjIgYVFAIRPyx9b2c8PSBCMH5vZUE6XO4rP0ZQ/unvKUVGUAH/R0lthJU+RRxKR3OElUFBqP7zMG1fQrcBDTRtX0QA//8AQf/pAeIC2RAiAmts9RICAFgAAAAA//8AQf/pAeIC2RAiAmps9RICAFgAAAAA//8AQf/pAeIC2RAiAmZv9BICAFgAAAAA//8AQf/pAeIC2RAiAGpoDRICAFgAAAAA//8AFP8mAd4C2RAiAmpR9RICAFwAAAAAAAIANv8mAgoCygAOABkAABcRMxU2MzIWFRQGIyInERMiBhQWMzI2NTQmNlM4aWZ6e2VhQJJCUFBCRFRT2gOk/1Ccgn2XTv7vAqdvuG9vWV5wAAAA//8AFP8mAd4C2RAiAGpWDRICAFwAAAAAAAEAVAAAAKcCDAADAAATESMRp1MCDP30AgwAAAACACv/7AO/AuUAHAAtAAATND4DMzIXNSEVIRUhFSEVIRUhNQYjIi4DNxQeAzMyNxEmIyIOAysoPVJNJ3k+Aa3+sAFI/rgBVf5OQ3UoTVI8J10aKTk0HX07O3wfNTknGgFkWItUNhRYTFLuUvVSSl4UNVGIWkluPycNeAFleA4nQG4AAAADACT/6QN/AhsAHwAqADEAACUeAzMyNzMOASMiJwYjIiY1NDYzMhc+ATMyFhcWFSQiBhUUFjMyNjU0FyE0JiMiBgH9AR4wMRpmI1QQdlmEPj+DcXx8cYc9H2U9SnEZFf3YjFBQRkVRWAEmUEA/Uuo0SyUQaVZgZ2eTh4aSajI4SkA3cORtXmBtbF5hM0dZV///AA0AAAKVA3EQIwBqAK4ApRICADwAAAABAAD/JgECAtwAHQAAARUjERQjIic1FjMyNjURIzUzNTQ2MzIXFSYjIh0BAQJXjw0PEQMmHkZGQToXGBMKOgIMRP3LbQNHAR4nAhREWTg/BUUBNVIAAAAAAQAUAk8BMwLlAAYAABMzFyMnByN0X2A/UU9AAuWWYGAAAAAAAQATAk8BMgLlAAYAABMjJzMXNzPSX2A/UU9AAk+WYGAAAAD//wBcAlABLQLkEAIAdgAA//8AFgJQAOcC5BACAEMAAAABAA8CVQE8AtwADAAAEzMWMzI2NzMGIyIuAQ87CFQoMAM7C40kPDQC3EIiIIcTQAABAHMCZADbAswAAwAAExUjNdtoAsxoaAACAD0CMQERAwQACgAVAAATMhYVFAYiJjU0NhciBhUUFjI2NTQmpyw+P1Y/PysSGhokGhkDBD4sKz0+Kyo/PhoREhoaERMZAAABADn/MwEJAAAAEAAAFyImNTQ2NzMOARUUMzI3FQa9OEwzLkY3J0glGjDNNCokOhEfLB82Ci0KAAEABQJlAT8CzQAQAAATMhYzMjczBiMiJiMiByM+AVsZWBQZDDoPShRkDhcKOggtAs0lJWgmJTE2AAAAAAL/3QJOAVwC5AADAAcAABMzByMlMwcjPXGVPAEOcZU8AuSWlpYAAAABADQAAALZAt0AIQAAJT4DNTQmIyIGFRQWFxUhNTMuATU0NjMyFhUUBgczFSEBuxY7RC6OcW2HaU3++KRPWruOmsJoVLD+7kwJL013QXGaoG5jtCNMSC6sZYrMwpBprixIAAAAAQAe//wCUgIMABYAACUyNxcGIyImNREjESMRIzUhFSMRFB4BAiQSDBAwGi4s7F5GAihAAg5ADD4SMEYBVP46AcZGRv6uFBEPAAAAAAH/+wDwAjEBOAADAAABFSE1AjH9ygE4SEgAAAAB//cA8APpATgAAwAAARUhNQPp/A4BOEhIAAAAAQBBAfIAngLaAAgAABMjNTQ3FQYVM55dXTAwAfJlewgmClAAAQBAAfEAnQLZAAgAABMzFRQHNTY1I0BdXTAwAtllewgmCFIAAQBB/4AAngBoAAgAADczFRQHNTY1I0FdXTAwaGV7CCYIUgD//wAwAfIBKwLaECcL8QCNAAAQBgvx7wD//wAxAfEBLgLZECcL8gCRAAAQBgvy8QD//wAv/4ABLABoECcL8wCOAAAQBgvz7gAAAQAm/08CAQLFAAsAAAEVIxEjESM1MzUzFQIBwljBwVgB9lL9qwJVUs/PAAABACb/TwIBAsUAEwAAARUjETMVIxUjNSM1MxEjNTM1MxUCAcLCwljBwcHBWAH2Uv7NUtDQUgEzUs/PAAABADIA3AEsAdYACQAAEjIWFRQGIyImNHtoSUozNEkB1ko1MklJaAD//wB0AAADdABoECcAEQK1AAAQJwARAWgAABAGABEdAAAHAAn/6gPhAuIACgAVABkAJAAuADkAQwAAEzIWFRQGIyImNDYXIgYVFBYyNjU0JiUzASMBMhYVFAYjIiY0NhciBhQWMjY1NCYlMhYVFAYjIiY0NhciBhQWMjY1NCaeP1dYPT5YWD0lNTZKNTUBKEL+dUIBgj9XWD0+WFg9JTU1SjY1AUI/V1g9PlhYPSU1NUo2NQLYWEA9WFl8WDw1JSY1NSUmNUb9CgErWEA9WFl8WDw1SjY1JSY1PFhAPVhZfFg8NUo2NSUmNQAAAAABADEAagDJAbYABgAANzU3FQcXFTGYamrjWXpTU1NT//8AMQBqAMkBthAPDBIA+gIgwAAAAf9O/+wBWgLZAAMAAAEzASMBHD7+Mj4C2f0TAAEAJP/pAmsCxQAwAAAFIi4DJyM3MyY1NDcjNzM+BDMyFwcuASMiBgchByEGFBchByMeATMyNjcVBgGkPmdALxUEUxY3AQNPFj8DEy9AbEBjXh4zSyxEcxgBRRf+yQIBAR8Y/xZ4RClFOUcXLUFRPRk7EBAFHTsVOVFBL0NJJhpkXzsVHg87XGsUIlkrAAAA//8ADwDLA8YC2BAvADABogDLLhQQDwA3AAAAyy4UAAAAAgAr/+kCAQLFABkAJQAAATIeAxUQIyImNTQ2MzIXLgEjIgYHIz4BEyIGFRQWMzI2NTQmAQMjQEczIe5lg3pfaToBUUwuPgtYDWtdQEpQPT5SUgLFEDNSj17+podoY35Pgos4M1di/qZTR0NXW0RCUwAAAAACAAoAAAK9AtkAAwAGAAAzATMJAQMhCgEmZAEp/qbUAacC2f0nAmj96gAAAAEAaf89As0C2QAHAAATIREjESERI2kCZHb+iHYC2fxkAzf8yQAAAAABACn/PQK0AtkACwAAEyEVIQkBIRUhNQkBOAJv/iUBTf6oAfP9dQFn/qgC2WD+nv6FX0oBjQFtAAEAB//cAgADlAAHAAABFwsBBzU3EwHKNpjoeZS0A5QI/FAB4j9BSv6IAAAAAwAZAHwCsQGUADEASgBkAAATMh4HFz4GMzIeAhUUBiMiJiMuBCcOBSMiJjU0PgIHFBYzMj4HNy4HIyIGBTI2NTQmIyIOBgceCacNGxoWGxAZCRgBAh4PIRoiIREnPB0OTjkCCQIdNSocHQMGKxEoHCoVOU4OHTszLTEKFBUPFQsWBxkCARYKGRAbFRkLKTEB1DEtMSkLGhUaERgLFAIDFAgTChMMExATAZQFCwkTChYIFgEBHQwaDhEIITAqDzVZAQMTHBgdAwYmDhsMClk1ECowIJAbPQMIBg8IFAYYAgETCBQKEAgGPHg/GSA8BgkODBMJEgEDEwgRCA4GCgQDAAEAZP8KAcYC/wAYAAAFFA4CIyInNxYzMjURNDYzMhcHJiMiBgcBOyU8PiENCgITD15kSBMhDx0NITABAkVlMxcDVgiEAlNacwdTCUJMAAD//wBLAM4B/AF4EAYAYQDC//8ASQBwAfwB5hAmDUoAohAGDUr+bgAAAAEAMv/sAhYB2AATAAAlFSEHIzcjNTM3IzUzNzMHMxUjBwIW/v42SzaXtCre+zNLM567KrVGg4NGZkZ3d0ZmAAACAC3/9QIWAn8AAwAKAAAlFSE1ETUlFQ0BFQIW/hcB6f52AYo4Q0MBM0XPT6GkTwACAC3/9QIWAn8AAwAKAAAlFSE1ARUFNS0BNQIW/hcB6f4XAYr+djhDQwF4Rc9PoaRPAAAAAgAWAAAB1ALoAAUACQAAARMDIwMbAgsBARTAwD7AwCCgoKEC6P6M/owBdAF0/VQBOAE4/sgAAAABAAwAAAGEAtwAGQAAAREjESMRIxEjNTM1NDY7ARUjLgEjIh0BOwEBhFOMU0ZGQTqzRQNLDjqMCAIM/fQByP44AchEWTg/ZggVNVIAAgASAAABiwLcABEAGAAAAREjESMRIxEjNTM1NDYzMhc1FSYjIh0BMwGLU41TRkZBOk0YE0A6jQLZ/ScByP44AchEWTg/BQJHATVSAAEAAAABWBAAAAAAXw889QIrA+gAAAAAyLuwCgAAAADIu7AK+3L+KwXuBBoAAAAIAAAAAQAAAAAAAQAAA+j+1ABaBd37cv06Be4AAQAAAAAAAAAAAAAAAAAAFKkCvABYAAAAAAJYAAABFgAAARYAfAFjADQCLAAOAiwAIQN5AB0CmwA0AL8AMAFNAEkBTQAmAYUAKAJIADIBFgBXAU0ALgEWAFcBFv/4AiwAKwIsAGYCLAAiAiwAIAIsABwCLAAjAiwAKwIsAC4CLAAlAiwAJgEWAG4BFgBuAkgALQJIADICSAAyAiwATQP3ACICmwARApsATwLSADAC0gBZApsAWgJjAFoDCgAsAtIAUwEWAGQB9AARApsATwIsAFADQQBLAtIATAMKACYCmwBbAwoAJgLSAF0CmwAwAmMAFQLSAFUCmwAeA7AAFgKbABYCmwANAmMAHAEWAEABFv/4ARUAFgHVACwCLP/qAU0AFgIsACoCLAA2AfQAHwIsABoCLAAoARYAEgIsAB0CLABGAN4AQgDe/+4B9AA6AN4ARANBAEYCLABGAiwAJAIsADYCLAAaAU0ARQH0ACIBFgAOAiwAQQH0AAoC0gAGAfQAEQH0ABQB9AAfAU4AKwEEAGQBTgAdAkgASwEWAAABFgB6AiwANAIsABoCLABDAiwACwEEAGQCLAArAU0AGQLh//MBcgAlAcAALQJIACgBTQAuAuH/8wFNABwCXgCXAkgAMgFeABMBXgAQAU0AXAIsAEECGQAwARYAVwFNACcBXgBFAW0AKAHAAC4DZQA9A2UAPQNvABoCLABgApsAEQKbABECmwARApsAEQKbABECmwARA+gACwLSADACmwBaApsAWgKbAFoCmwBaARYAAAEWAEcBFv//ARYACQLSABQC0gBMAwoAJgMKACYDCgAmAwoAJgMKACYCSABfAwoAHgLSAFUC0gBVAtIAVQLSAFUCmwANApoAWwJjAEMCLAAqAiwAKgIsACoCLAAqAiwAKgIsACoDgAAqAfQAHwIsACgCLAAoAiwAKAIsACgA+wAAAPsAKQD7//kA+//wAiwAJAIsAEYCLAAkAiwAJAIsACQCLAAkAiwAJAJIADICYwASAiwAQQIsAEECLABBAiwAQQH0ABQCKwA2AfQAFAKbABECLAAqApsAEQIsACoCmwARAiwAKwLSADAB9AAfAtIAMAH0AB8C0gAwAfQAHwLSADAB9AAfAtIAWQLSABoC0gAUAiwAGgKbAFoCLAAoApsAWgIsACgCmwBaAiwAKAKbAFoCLAAoApsAWgIsACgDCgAsAiwAHQMKACwCLAAdAwoALAIsAB0DCgAsAiwAHQLSAFMCLABGAtIAJwIsAAcBFv/2APv/4QEWAAIA+//1ARb//QD7/+cBFgAaAN7/7gEWAF8A+wBUAuQAZAGAAEIB9AARAN7/4AKbAE8B9AA6AfQAOgIsAEYA3gBAAiwAUADeAEICLABQAW8ARAIsAFAB9ABEAiwAAADeAAAC0gBMAiwARgLSAEwCLABGAtIATAIsAEYCvgAuAsYAbAIsAEYDCgAmAiwAJAMKACYCLAAkAwoAJgIsACQD6AArA6oAJALSAF0BTQBFAtIAXQFNAEUC0gBdAU0AMQKbADAB9AAiApsAMAH0ACICmwAwAfQAIgKbADAB9AAiAmMAFQEWAA4CYwAVAbsADgJjABUBFgAJAtIAVQIsAEEC0gBVAiwAQQLSAFUCLABBAtIAVQIsAEEC0gBVAiwAQQLSAFUCLABBA7AAFgLSAAYCmwANAfQAFAKbAA0CYwAcAfQAHwJjABwB9AAfAmMAHAH0AB8BFgASAiwAGgNWADACnABQAiwANgLNAAECVAABAtIAMAL/ADACPwAfAtIAFAODADACmwBPAiwANgI0ACYCmwBaAtIALwKbADACYwACARYAAAMiACwCmwANA3kARgEWAEIBWQAGApsATwH0ADoBWQAGAjAAHgNBAEAC0v/0AiwARgMKACYDFAAmAjUAJAOwACYC0gAkA0oAMAIsADYCmgBbApsAMAH0ACICYwAcAU3/7gEWAA4CYwAAARYADgJjABUDCABVAnAAQQMKABEC0gBVAtIACgIsABQCYwAcAfQAHwJjACACYwAgAfQADAH0ACICLAAiAiwAQAIsADYBBABkAXIAZAJIADIBFgB8BR8AWQS4AFkEIAAaBCAAUAMKAFABvABEBIYATAOwAEwDCgBGApsAEQIsACoBFgADAPv/7wMKACYCLAAkAtIAVQIsAEEC0gBVAiwAQQLSAFUCLABBAtIAVQIsAEEC0gBVAiwAQQIsACgCmwARAiwAKgKbABECLAAqA+gACwOAACoDCgAsAiwAHQMKACwCLAAdApsATwH0ADoDCgAmAiwAJAMKACYCLAAkAmMAIAIOABQA3v/fBTUAWQTGAFkEIAAaAwoALAIsAB0CdgBbAtIATAIsAEYCmwARAiwAKgPoAAsDgAAqAwoAHgJjABICmwARAiwADgKbABECLAAqApsAWgIsABECmwBaAiwAKAEW/3sA+/98ARb//QD7/+cDCgAmAiwABgMKACYCLAAkAtIAXQFN/7kC0gBdAU0ALQLSAFUCLP/zAtIAVQIsAEECmwAwAfQAIgJjABUBFgAOAgkAIAGJAA4C0gBTAiwARgJjABwB9AAfApsAEQIsACoCmwBaAiwAKAMKACYCLAAkAwoAJgIsACQDCgAmAiwAJAMKACYCLAAkApsADQH0ABQA3v/uAiwAKgIyABoCOwAOAiwANgH0AB8B9AALAmAAGgJaABoCLAAoAiwAKAMkACgB9AAiAfMAJALmACIB/gAhARsAFAJUAB0CLAAdAiwAHwH0ABECLAAMAiwARgIsAEYCLABGAQwADwD/AEIBFgAUAdkAFAGrABQBBABEAmoARANBAEYDQQBGA0EARgJSABQCVABGAjcARgIsACQDCgAkAtIAGwLaAC4BTQAMAU0ADAF0AAwBTQBFAU0ARQGCAFQBcwAOAiIANgIiADYB9AAiASsAFAEqABQBNQAeAc8ADwEWABgBFgAOAlQADgJyACICGwBCAfQACgLSAAYB9AAUAiwAIAI1AB8B/AAfAg4AFAIoADQCLAAvAiwALwIsAC8C0gAwAwoAJgH6AEYCCAAiAm8AHwIuAEYB1QAOAiYAJgGuAEYCWgAaAiwALwIsAC8DrAAaA7wAGgOwABoCsQAOAgMACwL8AA4DEgASApQARAJVAEQCEgAtAeYAHgI6ABQCdwAUAU0AIAFNACAApwAMAOwAJgDsAB4BFAAaAWcAKAH0ABUBSgARARYAMQHGADEBFgBXARYAVwEWAFcBTQCVAU0ATwFNABgBTQAYAU0AHAFNABwBTQAzAU0AMwFNABQBTQATAU0AggFNABwBTQBcAU0AFgEQAGQBTQAdAU0AUwFNACMBTQBnAU0AZwFNAHoBTQB7AU0ACwFNAAsBTQALAU0ACwFNAA8BTQBzAU0APQFNADkBTQAFAU3/3QFNAAAB/gCQAU0ADwC6ADoBTQAbAU0AEQFOABgCDgAoAg4AKAIOACgCDgAoAg4AKAIHAEgCBwBIAU0AFwFNABwBTQAxAU0AMwFNAC4BTQAaAU0AGwFHADoBBQAWAbUAFgG1ABIBTQAJARYAbgDIABgAyAAaAMgAGADIABgBTQALAU0ACwFNAAAAAP7JAAD/DwAA/scAAP64AAD+zwAA/j0AAP7CAAD/JgAA/swAAP7kAAD+8QAA/rQAAP7GAAD/MQAA/uwAAP49AAD+wgAA/sIAAP8pAAD/MgAA/ywAAP8rAAD+yQAA/v4AAP7oAAD/AQAA/zUAAP93AAD/IAAA/uQAAP7kAAD+5AAA/lgAAP9VAAD/rQAA/vIAAP6TAAD+sAAA/vMAAP6QAAD+7AAA/v0AAP7PAAD+wAAA/sYAAP7GAAD+wgAA/sIAAP59AAD+kAAA/acAAP2nAAD+PgAA/mUAAP05AAD9QwAA/UMAAP8CAAD+lgAA/pQAAP6CAAD+0wAA/yEAAP2oAAD+yQAA/w8AAP6oAAD/MgAA/p4AAP6/AAD+zwAA/owAAP64AAD+8gAA/o8AAP5oAAD+kQAA/eAAAP6UAAAAAAAA/rsAAP86AAD+oQAA/lEAAP5rAAD+fAAA/hQAAP87AAD+vQAA/m4AAP39AAD+rwAA/rQAAP64AAD+vAAA/rwAAP6pAAD+tAAA/tQAAP6pAAD+lgAA/uQAAP6TAAD+rgAA/rUAAP6kAAD+uQAA/m4AAP7iAAD+zQAA/pQAAP6eARYAMQDHABYBTAB/ARYAbgFNAHMBTQAGApsABQETAFYDEv/YAzz/2AFx/9gDQf/qA03/2AMK/9gBHv/qApsAEQKbAE8CRgBSAwoANQKbAFoCdAAcAtIAUwMKACYBFgBkApsATwKbABEDQQBLAtIATAJ2AEEDCgAmAtIAUAKbAFsCdAAoAmMAFQKbAA0CzQAdApsAFgLpADQDCgA0ARYACAKbAA0CVAAwAhAAJwIkABgBMwA4AhoAMgJUADACHgAyAhMAGQI0ACQCAAAnAccAJgIkABgCDQAoAR4AOAH+ADwCJwAPAhwAPAH0AAoB1gAQAiIAJAJrAB4COQAyAiMAIgJsACIB7AAUAhoAMgLlAC4COwANApYAKgLkACQBHv/aAhoAMgIiACQCGgAyAuQAJAJEADYC5gA0A00ACgJsADQC5QA5AuQAJAIsAAgCLAAAAjYAOQMKACYBSAAwApsAUAKRAFAC/gAcAkYAUALSADACmwAwARYAZAEWAAMB9AARBDgAUwP2AFMC/gAcAnQAUALaAFACZQAKAtIAUwKaAA8CnABQApwAUAJGAFADLAAiApEAUAOJAAoCmwAwAtoAUALaAFACeABQAqIAIQNOAFAC0QBQAxwALgLRAFACjgBQAtIAMAJjABUCZQAKA10AMAKRAA8C5gBQAnIAOAM+AFADUwBQA0kAFANqAFACngBQAs0AKgPpAFACrgAPAigAJgImACYB+gBGAZQARgJaAB4CIwAmAvMABQHzACQCNwBGAjcARgHpAEYCBQAeAmoARgIuAEYCJgAmAi0ARgJBAEYCCAAmAbwAJAHUAAUDYQAmAdIABQJCAEYB8gAwArQARgLIAEYCmAAeArIARgIJAEYCCAAkAvcARgIfAA4CJQAmAiUAJgJBABIBlABGAgcAJgH2ACQA4ABGAPv/8ADf/+4DLQAfA1UARgJBABIB6QBGAjcARgHUAAUCLgBGA64AFQK1ABAC+gA8ApYAKgMgADACJgAmA64AFQK1ABADrgAVArUAEAHUABQAAP6EAAD+/gAA/wcAAP8NAAD91wAA/RAAAPz9AvsAUAJHAEYCsQAKAg4ACAKMAFACPABGAlkAUAGNAEYCTQAKAYgACgJPAFAB2wBGA58ACgM+AAUClQAqAe0AIgKSAFAB/gBGAqMAUAIHAEYCrAAKAgIABQNHABQCjQAUAuQAUAI6AEYD2wBQAsoARgQiAFADKABGAyoAMAKFACYC0gAwAgQAJgJjABUBkgAPApwACgJCAAUCnAAKAkwACgKYAAUB6AAFA6gADwKnAA8CfgAwAgkAMAJ2ADwB8gAwAnYAUAHyAEYDnwAvArsAJAOfAC8CuwAkAP4AUAOJAAoC8wAFApwAUAIAAEYCuAAgAgwAFgLRAFACLgBGAugAUAI7AEYCdgA8AfIAMANlAFACdwBGAP4AUAKaAA8CKAAmApoADwIoACYD6AALA28AIgKRAFACIwAmAtIALwIfACAC0gAvAh8AIAOJAAoC8wAFApsAMAHzACQCYwAgAhwAKALaAFACNwBGAtoAUAI3AEYDHAAuAiYAJgMgADACJgAmAyAAMAImACYCzQAqAggAJAJlAAoB1AAFAmUACgHUAAUCZQAKAdQABQJyADgB8gAwAkYAUAGLAEYDagBQArIARgKbADAB6wAiApkAGAH9ABYDCgAmAj8AJAOmABECyAAFAnMAUAHpAEYC0ABGArgARgLuADwC1QA8ArsARgLvADIBvgBGAr8ARgMWAEYCkABBArkARgGGAEYDVABGAxcAIwK6AEYCSQAUApAAMgKLAEECkgAoAvcAPAJTAC0DBAAKAlsAKAK/AEYCiABCAroAQQLoAC0C4gBGAr8ARgLjAEEClAAtArUARgJvADwBgQBGAxQALQJ4AB4DBwAtAsoAKAFNAE8A3gA1AMgAHgFNABsBTQAWAU0ADQFNABYDQQBBAicARgI8ACMCOQBBAiIAQQJFACMBYQBGAicAQQI4AEYCOQAjAigARgEUAEYDGwBGAhcAIwIpAEYCGQBGAgAAIwI4AEECKAAsAhMAQQD5/+wCDwBGAZUAIwInAEEBhgAjA0EAQQH9ACYCCwBBAiEAQQJIAEEDbwBBAigAQQIoACMBLQBGA3QAQQJCAAACLAAjApwAKgIgAEYBFgBaAU0ADAAAAQkAAABmAAAAbgAAAIAAAAEJAAAAyAAAALgAAADPAAAA0gAAAEAAAACEAAAA4AAAAOUB6AAmAAAAeQDUAD4AAAJ/AAAARgEWAG4AAAGKAoAAOgJPADoB0gAeAlYAJgJuAD8A1AA+AV8AJwJvAD8CYAA9AMgAOgIOACYCJgA5AlgAJQJvAD8CbQAwANQAPgF6ADMCXwA9AksAJAI/ADkCOAA/AhwADQJOADMCXgA+AiMAJQMIADwCrwAjAagAPgGcADwBkAA4ALgALAFYADcCWAA4AMkANADJADIAyQAzAMkALAH0AGoB9ABqAfQAagFyAFQBcgBXAj4AGgI+ABoChQCIAj4AGgAAAAABxAAjAcQAOQI+/7gChf+4AoX/uAH9AGsB/QBrAqoAbQJJAGQBlACxAnP/uALO/7gCzv+4AeT/uAKq/7ICWABhApT/uAKqAGsCGgBrAs7/uALOAKcCzv+4Aj7/uAI+/7gCfgB/Akn/uAH9AGsCqv+4AqoAYwAAAM4AAAEAAAABLAAAAPUAAADNAAAA4wAAAPUAAADNAAAA3AAAAH0AAACpAAABIAAAAQcAAACrAAAA/QAAAQcAAAEPAAABBwAAAQcAAAEJAAABBwAAAKcAAACnAAAAqgAAAKgAAACnAAAA1QAA/tQAAP7UAAD/PgExAD8CvgAeAs0AHQM8AAMB0AAAAdAAAAJGAAADJAAAA5kAAAKBAAABsQAAAbEAAAGxAAABsQAAA1gAIAM7AAIDRQAMA1gAHgLtAAADDAAAAgoAAAJOAAACigAAAmwAAAKEAAACvwAAArQAAAKoAAACOAAAAhMAAAJjAAACGgAAAmAAAAI0AAAClAAqAfQAAAJRACgCOAAAAjgAAAHfAAAC3QAAAewAAAJCAAYCBgAAAiwAAAGzAAABswAAApAAAAKVAAAClQAAAewAAAKGAAAB3wAAApsAAAHmAAAABv6aAboAFwDT/98A4gAAAOH/DAAA/jIAAP7EAAD+0AAA/tAAAP7UAFT+0wAA/nwAAP5MAOL/uADh/xcA4v9cAOL/MwAA/14AAP9zA0cAFQAA/4cAAP3gAAD+LAAAAIgAAP7UAu0AAAMMAAACCgAAAr8AAAJjAAACGgAAAt0AAAIsAAADhAAAAnIAAAJxAHgCcQB2AqIBcwKiAO4CPwBaAj8AcQI/AFgCPwBkAj8ATgI/AGUCPwBlAj8AIgI/AIICPwCBAW0AagGDAIECzQAeAy4AAAIsAAACOAAAAr8AAAI/AFgCYwAAAewAAAAA/swBLAAUAQgAIgKQAAEDPQABAfv/8gI0AAECGwAAAi8AAAJYABIB4QB0AkQAIwJzACMCHAAXAmUAFwI6AAEB0wAcAeEAKwG2AAEB4wAJAZgAAAH9AAACWQAAAjMAAQMDABoBkf/RAZQAAAIcAAABmAAAAcwAPwIf/98B3QAPAaL/6QGxAC0BvQAAAfMACQJSAAEBjQAAAjUAAAHKAAEBsQAAAZoAAAH8AAECBgAAAb0AAAH8AAABzAABAAD+hAG4AAAAwf+xAL0AAAC0/ncAAP8FAAD/QAAA/xYAAP63AScAAQEv/8YAAP42AAD+SgAA/y8BZAALANv+7AIpAAABmAAAAbcAAAJSABMB4QB0AAD+7wAA/c8B9ABBAbUATQHfADECEgARAfEAOQH0ADEB4gAIAfcAYAIFACQB4QAcAXn/5wF5/+cBrQAbAX//+wGtABoB3gAoAiEADQCeABcBbQARARgAKwFlAAMAAP68AAD/dwFfADADXP/5BED/+QNl/+ADoP/2AtP/+QLT//kCmf/2A1n/+QLM//kDWv/5Aqr/+AJ6//MCuP/5Auj/+QKJ//cCov/6ApD/+AKN//YCdf/5An//+gKB//kCkf/2Aor/+AKN//cCi//5AoD/+gJ6//oClv/4Anb/9gJx//QChf/3Ao3/+AJw//cCZf/3ApL/+QLe//oCbP/6AqT/9gLP/+sCcv/5Apr/+QKa//kCZv/2AAD/XQEe//MBQv/7AS3/IgAA/foAAP36AAD+CgAA/d8AAP4hAAD9zwAA/q4AAP6uAnz/8wL6//oCjP/2Ao3/+gKQ//oCoAAhAh8AHwJuABUCbgAVAkAAFAJNAAAB/QAQAoUADgKVAA4CjwAOAAD+0QAA/pwCmv/2Atb/+QTBAAwAAP7qABb+mAAX/zwAAAC5Awf/zwPT/8gCUgAAAjgAAAINAAAC1P/sA67/zwIuAAADB//mAwf/5gMH/+YD0//VA9P/1gPT/9UCYv/2AsIADAJv//UCYv/3Aln/9gJm//YCgv/1Aqz/8AJ6//QChP/0Af0AAQId//4CG//+AgwAAAKR//MCI//8Amj/+AHuAAICWf/0AnP/9QIMAAICbP/3ArP/7wKv//AB1AAFAk7/+QH9AAACO//5Aq//8QIO//0CbP/2Aj///AJs//YCJf/7ADX+xAGfAA0A8QA8ALoAFQDZ/ywAIP6SABX+xgAm/oMAG/7LAC3+cgAp/nQALv5PAM//XwC+/ykAtv8IABD/IAPC/84Dtf/PAmEAAAAA/mUAAP5mAd8AAgH2AAEB5AADAdcAAwH1//UCDwAAAc4AAwIMAAABxgAGAe8AAQLwABsCSwA8AmwAPAKCADwDLwA8AlgAPAJTADwDHwA8A30AUAJuADwCVQA8A6sAPAJaADwCWwBQAxYAUAJLADwCbwAeAx8APAJZAFADGAA8AtQAFANPADwCVwA8AywAPAJbADwCjQAeAk4AUALyADwCVAA8Ao0AUAKLADwCVABQA3gAPAJRADwBtAAeAesAHgIQAB4CtAAeAb8AHgG/AB4CdAAeAt4AHgHBAB4BvQAeA0sAHgHBAB4BwQAeAqoAHgHBAB4B4AAAAqoAHgHUAB4CxgAeAm8AAAK5AB4BvwAeAr4AHgG/AB4B1gAAAbgAHgJ4AB4BwQAeAdYAHgIYAB4BwQAeApAAAAHaAB4CdgAAAYoAHgGjAB4BpgAeAbQAHgIQAB4CAwA8AcEATgKmADUC9AA1Alz/6gMCAAUDyQAdAM8ANQJ5ACoDIAAkAdoANQKxABgCoP/qAb7/6wJ9ADUDCAAJAf8AGgLT/+MCEAA1Ak8ANQNH//0DwwACAmcADQIzADICwQAeAyAANQIuABwDcP/+A8YAHgKjADUCDwAYAt0ADAMLAB0CIwAXAvQAHgNC/+YCXAA1AngAEAJdABwEGwAdApEAGANKAAoC7AAQBKj/+ANKAAoCeAAkApwAMgOgAAYCcgAGAo8ANQH2AAYCuAAYAoIANQIGADMDuP/zAm4AIALGAAICCf/mAiwACQKQ//MCbgAgA3EAIwL4//sCNAAyAjcANQLIAB4CzQARA0YACAJpADUCsQAfAv8ACALYADUCsgA1AicACANbAB4DvQAeA4T/+QMLAB0DJQAkAm3/5gJcACQDSgAKAo0AEQLh/+gCWQAyA4UAHwKPADUDrQAyA60AMgOtADIDrQAyAtYAMgLWADIC1gAyAtYAMgLWADIC1gAyAtYAMgOtADIDrQAyA60AMgOtADIDrQAyA60AMgNyADIDcgAyA3IAMgNyADIC1gAyA3IAMgNyADIDcgAyA3IAMgLWADIB7gAyAVsAMgG/ADIBSQAyAUkAMgHEADIBxAAyARQAMgHDADIBzwAyASEAMgDYADIBkAAyAZAAMgGQADIEkQAyA60AMgMqADID9AAyA60AMgOtADIDrQAyA60AMgLWADIC1gAyAtYAMgLWADIC1gAyAtYAMgLWADIDrQAyA60AMgOtADIDrQAyA60AMgOtADIC1gAyA3IAMgLWADIDcgAyA3IAMgLWADIDcgAyAtYAMgLWADIBhgAyAJ8AMgFMADIC5gAyAuYAMgLmADIC5gAyAugAMgLoADIC6AAyAugAMgLoADIC6AAyAugAMgOSADIDkAAyA5AAMgOSADIDkAAyA5IAMgLoADIDlAAyAugAMgOUADIDlAAyAugAMgOUADIC6AAyA5MAMgHdADIDVwAyA1cAMgNXADIDVwAyAlAAMgJQADICUAAyAlAAMgJQADICYgAyAskAMgJQADICYAAyAs4AMgL8ADIC/AAyAs4AMgL8ADICzgAyAs4AMgL7ADIC3wAyAvsAMgL8ADICzgAyAvwAMgLeADIC+wAyAWkAMgFpADICxAAyAsQAMgLEADICiwAyAlAAMgJQADICUAAyAlAAMgJQADICYgAyAskAMgJQADICYAAyAmAAMgL7ADIC+wAyAmAAMgL7ADICYAAyAmEAMgL7ADICcwAyAvsAMgL7ADICYQAyAvsAMgJxADIC+wAyAWkAMgFpADICUAAyAlAAMgJQADICUAAyAlAAMgJiADICyQAyAlAAMgJgADICUAAyAvsAMgL7ADICUAAyAvsAMgJQADICUAAyAvsAMgJiADIC+wAyAvsAMgJQADIC+wAyAmAAMgL7ADIBWgAyARQAMgFaADIBSwAyAjIAMgLIADICyAAyAsgAMgLIADICyAAyAsgAMgLIADICyAAyAsgAMgNkADIDPAAyAzwAMgLIADIDPAAyAsgAMgLIADIB0gAyAcQAMgHSADICyAAyAsgAMgLIADICyAAyAsgAMgLIADICyAAyAsgAMgLIADIDZAAyAzwAMgM8ADIDZAAyAzwAMgNkADICyAAyAzwAMgLIADIDPAAyAzwAMgLIADIDPAAyAsgAMgHSADIBBgAAAnAAMgH4ADICDAAyAfgAMgIJADIB+AAyAggAMgJwADIB+AAyAggAMgJsADIClAAyApMAMgJsADICpAAyAmwAMgJsADIClAAyAn0AMgKkADICkwAyAmwAMgKTADICfAAyApMAMgE1ADIBbQAyATUAMgHKADIBOwAyATsAMgFbADID8gAyA/wAMgNoADIDaAAyAz4AMgM+ADIDPgAyA1YAMgNWADIDVgAyA1YAMgPpADID6gAyA+kAMgPqADID6QAyA+oAMgPmADID5gAyA+YAMgPmADID5gAyA+YAMgPmADID5gAyAlIAMgIEADICBAAyAgQAMgIEADICBAAyAhQAMgJ8ADICBAAyAhQAMgKfADICoAAyAp8AMgKgADICnwAyAqAAMgKfADICoAAyAq8AMgKgADICnwAyAqAAMgKfADICsAAyAp8AMgF0ADIB+QAyAdAAMgHMADIDPgAyAz4AMgM+ADIDPgAyAz4AMgM+ADICLAAyAiwAMgIsADICLAAyAiwAMgIsADICswAyAsgAMgFXADIBagAyAnAAMgMxADIDMQAyAzEAMgMxADIDOAAyAzgAMgM4ADIDOAAyA9QAMgPMADIB0QAyAuYAMgLmADIC5gAyAuYAMgLmADIC5gAyAuYAMgLmADIC5gAyAuYAMgOCADIDUAAyAZoAMgLmADIC5gAyAugAMgLoADIDOQAyAuYAMgLmADIC6AAyAugAMgMgADIDIAAyAyAAMgMgADIDIAAyAyAAMgMgADIB7QAyAlAAMgHMADIDawAyA2sAMgNrADIDCQAyAxsAMgNrADIDawAyAoQAMgJQADICUAAyAlAAMgJQADIDDgAyAw4AMgMOADIDDgAyBCAAMgQgADIEIAAyAq8AMgLBADIEIAAyBCAAMgIMADIDDgAyAoYAMgKGADIChgAyAoYAMgLIADICyAAyAsgAMgLIADIB0gAyAwQAMgMEADIDBAAyAwQAMgMEADIDBAAyAdIAMgJ+ADICfgAyAn4AMgJ+ADICfgAyAn4AMgJ+ADIBhAAyAegAMgIDADICAwAyAgMAMgIDADICUAAyAlAAMgJQADICUAAyAh4AMgIeADICHgAyAh4AMgIxADICMQAyAjEAMgIxADICdgAyAnYAMgJ2ADICdgAyA60AMgOtADIC1gAyAtYAMgLWADIC1gAyA60AMgOtADIC1gAyAtYAMgLWADIC1gAyA60AMgOtADIC1gAyAtYAMgLaADIC1gAyA60AMgOtADIC1gAyAtYAMgLaADIC1gAyAz4AMgM+ADIDPgAyAz4AMgM+ADIDPgAyAz4AMgM+ADIDPgAyAz4AMgM+ADIDPgAyAz4AMgM+ADIDPgAyAz4AMgM+ADIDPgAyAZAAMgLSADIC0gAyAtIAMgLSADIC0gAyAtIAMgLSADIC0gAyAtIAMgLSADIC0gAyAtIAMgLSADIC0gAyAtIAMgLSADIC0gAyAtIAMgIKADICUAAyAlAAMgLIADICyAAyAsgAMgLIADIC0gAyAtIAMgLSADIC0gAyAtIAMgLSADIDPgAyAz4AMgLAADICwAAyAsAAMgLAADIChwAyAocAMgKHADIDPgAyAz4AMgM+ADIDPgAyAz4AMgKHADIChwAyAz4AMgM+ADIDPgAyAz4AMgM+ADIDPgAyAdEAMgHRADIB0QAyAdEAMgM+ADIDPgAyAj4AMgI+ADICPgAyAj4AMgJhADICYQAyAocAMgKHADIChwAyAocAMgLjADIC4wAyAvIAMgLyADIC8gAyAvIAMgM+ADIDPgAyAvMAMgLzADIC8wAyAvMAMgM+ADIDPgAyAz4AMgM+ADIDPgAyAz4AMgGrADIBqwAyAz4AMgM+ADIDPgAyAz4AMgM+ADIDPgAyAz4AMgM+ADICzgAyAs4AMgLOADICzgAyAz4AMgM+ADICzgAyAs4AMgLOADICzgAyAg0AMgM+ADIDPgAyAs4AMgLOADICzgAyAs4AMgM+ADIDPgAyAs4AMgLOADICzgAyAs4AMgLSADIC0gAyAtIAMgLSADIC0gAyAtIAMgM2ADIBcgAyA2sAMgQgADIFJAAyBSIAMgPDADID1QAyBSIAMgUyADICnAAyAwoAMgMKADICugAyAroAMgMKADIDCgAyAZAAMgGQADIC1gAyAtYAMgLWADIDcgAyAtYAMgLWADIDEgAyAugAMgJQADIC/AAyAlAAHQLIADICyAAyAsgAMgH4ADIB+AAyAz4AMgM+ADID6QAyAgQAMgIEADICLAAyAzgAMgN8ADIDOAAyA3wAMgLIADIDOAAyAsgAMgM4ADID5AAyA8QAMgPEADIC1gAyAtYAMgKuADICDQAyAcQAMgFpADIBaQAyAVoAMgHSADIBNgAyAeYAMgI/ADICPwAyAN8AMgDYADID2AAyAiwAIQIsADIDigAyA1oAMgOKADIC6AAyAugAMgL2ADICUAAyAygAMgKGADICdgAyA4oAMgLSADIC0gAyA4oAMgKHADID2AAyARgAMgE/ADIBYwAyApsAEQIsACoCmwBPAiwANgKbAE8CLAA2ApsATwIsADYC0gAwAfQAHwLSAFkCLAAaAtIAWQIsABoC0gBZAiwAGgLSAFkCLAAaAtIAWQIsABoCmwBaAiwAKAKbAFoCLAAoApsAWgIsACgCmwBaAiwAKAKbAFoCLAAoAmMAWgEWABIDCgAsAiwAHQLSAFMCLABGAtIAUwIsAEYC0gBTAiwARgLS//ECLP/fAtIAUwIsAEYBFv/2AN7/zwEWAAUA+//0ApsATwH0ADoCmwBPAfQAOgKbAE8B9AA6AiwAUADeADoCLABQAN7/5QIsAFAA3v/lAiwAUADe/94DQQBLA0EARgNBAEsDQQBGA0EASwNBAEYC0gBMAiwARgLSAEwCLABGAtIATAIsAEYC0gBMAiwARgMKACYCLAAkAwoAJgIsACQDCgAmAiwAJAMKACYCLAAkApsAWwIsADYCmwBbAiwANgLSAF0BTQBFAtIAXQFNADsC0gBdAU0AOwLSAF0BTf/mApsAMAH0ACICmwAwAfQAIgKbADAB9AAiApsAMAH0ACICmwAwAfQAIgJjABUBFgAOAmMAFQEWAA4CYwAVARYADgJjABUBFgAOAtIAVQIsAEEC0gBVAiwAQQLSAFUCLABBAtIAVQIsAEEC0gBVAiwAQQKbAB4B9AAKApsAHgH0AAoDsAAWAtIABgOwABYC0gAGA7AAFgLSAAYDsAAWAtIABgOwABYC0gAGApsAFgH0ABECmwAWAfQAEQKbAA0B9AAUAmMAHAH0AB8CYwAcAfQAHwJjABwB9AAfAiwARgEWAAAC0gAGAfQAFAIrACoBFgASApsAEQIsACoCmwARAiwAKgKbABECLAAqApsAAAIs/8cCmwARAiwAKgKbABECLAAqApsAEQIsACoCmwARAiwAKgKbABECLAAqApsAEQIsACoCmwARAiwAKgKbABECLAAqApsAWgIsACgCmwBaAiwAKAKbAFoCLAAoApsAWgIsACgCmwAHAiz/xAKbAFoCLAAoApsAWgIsACgCmwBaAiwAKAEWAFMA+wBOARYAXwDeADkDCgAmAiwAJAMKACYCLAAkAwoAJgIsACQDCgAmAiz/pwMKACYCLAAkAwoAJgIsACQDCgAmAiwAJAMUACYCNQAkAxQAJgI1ACQDFAAmAjUAJAMUACYCNQAkAxQAJgI1ACQC0gBVAiwAQQLSAFUCLABBAwgAVQJwAEEDCABVAnAAQQMIAFUCcABBAwgAVQJwAEEDCABVAnAAQQKbAA0B9AAUApsADQH0ABQCmwANAfQAFAKbAA0B9AAUAlQAMAJUADACVAAwAlQAMAJUADACVAAwAlQAMAJUADACmwARApsADgLm//IC9P/zArT/7wK7/+0Cof/xApv/5QIAACcCAAAnAgAAJwIAACcCAAAnAgAAJwLa//MCyv/uA4T/8ANy//EDY//vA2//8QIkABgCJAAYAiQAGAIkABgCJAAYAiQAGAIkABgCJAAYAwT/8QMK//cDsf/yA7P/+AOv//QDsv/0A1X/3QNV/90BHgAsAR4AOAEe//QBHv/3AR7/+wEe//kBHv/LAR7/ywFC//EBQf/1AeL/8gHl//EB3f/xAeT/8wGK/+ABhv/eAiIAJAIiACQCIgAkAiIAJAIiACQCIgAkAwf/7wMQ//QD3v/yA9v/8wN3//EDgf/zAhoAMgIaADICGgAyAhoAMgIaADICGgAyAhoAMgIaADIC6//uA5P/7wPL//QDX//vAuQAJALkACQC5AAkAuQAJALkACQC5AAkAuQAJALkACQDAf/zAwb/8QPM//EDyv/vA2//8wOW/+8Dhf/3A4X/8wJUADACVAAwAgAAJwIAACcCJAAYAiQAGAEeAAABHgA4AiIAJAIiACQCGgAyAhoAMgLkACQC5AAkAlQAMAJUADACVAAwAlQAMAJUADACVAAwAlQAMAJUADADPgARAzwADgOU//IDlP/zA1X/7wNc/+0DQ//xAzv/5QIkABgCJAAYAiQAGAIkABgCJAAYAiQAGAIkABgCJAAYA6D/8QOj//cEUP/yBFX/+ARL//QETv/0A/H/3QP0/90C5AAkAuQAJALkACQC5AAkAuQAJALkACQC5AAkAuQAJAOm//MDpv/xBGr/8QRo/+8EFf/zBDX/7wQm//cEKf/zAlQAMAJUADACVAAwAlQAMAJUADACVAAwAlQAMAKbABECmwARApv/3QKbAAUDQAARAU0AdADIABcBTQB0AU0ADQFNAA0CJAAYAiQAGAIkABgCJAAYAiQAGANB//cDCP/jA7AAEAOAAAYDawBTAZAAUgGQAEIBTQANAR7/zQEe/9sBHv/kAR7/8AEe/8cBHv/wARb//QEWAAoBgf/lAXj/4gGQAEQBkABRAU0ADQIaADICGgAyAhoAMgIaADICOQAyAjkAMgIaADICAgAyApsADQKbAA0DMf/aAzv/yQLl//MBiQAiAYkAIgFNACAC5AAkAuQAJALkACQC5AAkAuQAJANB/78DQf/qA1D/xwMu/9oDqwA0AU0AUgFNAHYB9AAAA+gAAAH0AAAD6AAAAU0AAAD6AAAApwAAAiwAAAEWAAAAyAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0ALgFNAC4CLP/7Aiz/+wPo//cD6P/3ATgASwI2/2sA3gBBAN0AQADeAEEA3QBAAU0AMAFNADEBTQAvAU0AMQIsACYCLAAmAV4AMgFeAEYBFgBXApoAcwPoAHQBFgBXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAD6AAJBVAACQEWADEB1QAxAqgAMQEWADEB1QAxAqgAMQF4AAkA+gAxAPoAMQJuAGICLAB8AiwATQIs/+oCkgA7ApIAOwG2ACMDSAAKAZAANQCn/04BTgB5AU4AHwRYAE0DQgBNA0IAfAIsAC4CGQAwAhkAHwIZACABhQAoARYAPwKSADsBhQAoAnoAPAH0AAECkgA7AxMAJAIDADwDVwAxAtIAPALVADwA4AA8AtIAPAJcADwA4AA8AOAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFeABoAjAAqAV4AFAFeABIBXgAYAV4AFgFeABYBXgAXAV4AEQFeAAsBXgALAV4AbwFeAE4BaAAtAV4AGgFeAEUBXgATAV4AEAFeABQBXgASAV4AGAFeABYBXgAWAV4AFwFeABEBXgAMAV4ADAFeAG8BXgBMAWsAHAFuABwBaAAXAUUACwFeABoCZwAmAlkAIAJjACwCLAAaA0EARgKqAEcFJQBbBLIAXQNvADIDZQA8AhoANgKPACQCmwAYAmMAFQI6ACICrAAnAs0AWgKbABECmwBbAoAAIQIEACAAAP35AAD9+QAA/zYAAP8dAAD9jQAA/Y0AAP2oAAD9qAAA/ncAAP54AAD+eAAA/ikAAP2vAAD9MgAA/TEAAP00AAD9MgAA/XcAAPtyAAD9QwAA/ssAAP5QAAD+KQAA/jAAAPxCAAD9rgAA/fwAAP35AAD9twAA/agAAP7UA2YAKQNbACkC0gAwA/kAHgIsADMDHAAwA0AAMAKbADAC0gArA5cAKAPJACECZwARAocALgIsABwCPABWAykAOgJeAA8DhAApAeEAHwLrAAUC0gBMA6YAPANyAAgCWAA0ApsAWwMKACYDUv/+ArsAEwLSAF0DQgBdAtIAXQQTACIE7QATA+gADwKbAB4CYwAcAwoANAMKABECAAARAR4AEAKbAE8CmwARA4wAIgJvABECLAAoAdUAHwIyAC0DfwApAkwAKQQ4AB0CgAA6AlAAOgHSAB4CVgAmARYAQwNkACQFOgAwAmsAHgJGAFIC0gBQAwoALAIsAFACLABQApsADQIEABsCjwAeBLAAJAGzABwDZQBFA2UAFANlAEUDZQATA2UAEANlABQDZQBFA2UAEgNlAEUDZQAQA2UAEgNlABYDZQBFARYAZAIsAGQDQgBkA7EAZAKbAB4DsQAeBMcAHgXdAB4DsQBkApsAFgOxABYExwAWAiwAUALSADAC0gBZA0EASwDeAEIBvABCApoAQgLSAEIB9AAKAtIACgOwAAoEjgAKAtIAQgH0ABEC0gARA7AAEQDeAEQB9AAfAiwAGgNBAEYD2wAgAlsALQPbADECWwAtBBIAGAQSAQUDIAAUAyAAEwMgABQDIAATA9sAMAPbABwD2wAtApIADwPbACAD2wAgAXwAOAGJACMD2wAgA9sALQF8ADgBewAgA9sAIAPbAB4CWwAnA9sALQJbACwEEgAbAlsAJwREACACmwARAiwAKwKbAFoDNwAWAscACgLHAAoCSAA3AkgANwJIAC0CSAA3AkgANwLJAC0DNwBpAzcAaQMkACkCSAAoAkgAMgJIADIB/v/8AYgAKAJIAF0CSACnAh4ABwLJABoCyQAZAwAAGgDIAEsBIAAeATgASwFUAB4CWwAbAlsAHgMAACgDAAAoAiwAZAMcAGQDvABkAiwAXwNfAKMCSABLAkgASwI9AEsA9AAlAkgAMwJIACoCSAAoAkgAKAJIADICSAAyAkgAMgJIAEkCSABJAioAGwJIADICSAAyAkgAKAJIACgCSAAtAkgALQO7AC0DuwAtAioAGwJIAC0CSAAtAkgALQJIAC0CSAAcAkgAHAJIAC0CSAAtAkgAKAJIACgCSAAtAkgALQJIADcCSAA3AkgANwJIADcCSAAaAkgANgJIABoCSAA2AwAAKAJ8ADQCfABQAnwAQgJ8AEICfABFAnwARQMAACsDAAArAwAAKwMAACsDAAArApIATAKSAB8CkgAPApIADwJYAEwCYABMAnwAPgJ8AD4CfAA+AnwAPgLoAB4C6AAeAvwAPQL8AD0BFgBXAdcAQALGAD4CSAAoAkgAKAJ8AEICfABCAzcAJwHIAGIBxwBIAccAXwHIAEkCLADmAiwAZAKSADsCkgA7AUkAGQFJAA8BgAAoAYAAKAGAACgBgAAsAYABBgGAACwBhABYAYQAWAGEAFgBhAA3AYQA4AGEADcCLADmAyAAPwMgADMDIAAzAyAARwMgAD0DIABHAyAANQMgAD0DIADTAyAAuwMgAN0DIADDAyAA6QMgAL0DIADYAyAA3QMgAE8DIABZAyAAWQMgAFkDIABZAyAAPwMgAEcDIABRAyAAPwMgAMgDIABEAyAAWwMgAN8DIAC9AyAA6AMgAM4DIADbAyAAWQIs//cB9AASAyAAawMUACMDFAAjAxQAIwMUACMDFAAjAxQAIwMUACMDFAAjAxQAIwMUACMD6AAAA+gAAAPoAcwD6AGkA+gAAAPoAAAD6AHMA+gBpAPoAAAD6AAAA+gBzAPoAaQD6AHMA+gBzAPoAaQD6AGkA+gAAAPoAAAD6AAAA+gAAAPoAcwD6AHMA+gBpAPoAaQD6AAAA+gAAAPoAAAD6AAAA+gBzAPoAcwD6AGkA+gBpAPoAaQD6AGkA+gBpAPoAaQD6AAAA+gAAAPoAAAD6AAAA+gBpAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAXwD6AHMA+gBfAPoAXwD6AAAA+gAAAPoAAAD6AHMA+gBfAPoAXwD6AAAA+gAAAPoAAAD6AHMA+gBfAPoAXwD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gB9APoAAAD6AAAA+gAAAPoAAAD6ANrA+gAAAPoAfQD6AH0A+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAMgADIDIAAyAyAAMgMgADIDIAAyAyAAMgMgADIDIAAyAyAAMgMgADICcQDgAnEA4AMgAGQDIABkAyAA+gMgAPoD6AAAA+gAAAN8ACMDfAAjAp0AgAKdAIADfABeA3wAXgKdALQCnQCeA3sAXgN7AF0DfAAjA3wAIwKdAIECnQCAA3wAXgN8AF4CnQCIAp0AngN7AF4DewBdAxQAJAMUACQDFAAkAyAAJwHpABYDIAAnAyAAJwMgACcDIAAnAyAAJwMgACcDIAAnAyAAJwMgACcDIAAnAyAAJwMgACcDIAGKAV4AAAMgADIDIAAyAyAAMgMgACcDIAGSAyABigMfACcDIAAnAyAAJwPoAJYD6ACWA+gAlgPoAJYBXgAyAyAAMgMgADIDIAAyAyAAMgMgADIDfAAjA3wAIwN8ACMDcgAIAyAAMgMgADIDIAAyAyAAMgMgACcDIAAnAyAAJwMgACcDIACdAyAAnAMgAJwDIACeAyAAnQMgAMgDIADIAyAAnAOhAEICcgAiArYAIwJTACIDCAAjAnIAIgK2ACMCUwAiAwgAIwFNADcCKwA3AtIANwLSADcBnwBCAXkAPAGSADIEiQAiAxcAJwMXACcDFwAnAvwAPQL8AD0CSAAoAWAAKANoADgDaAA4AtAASALQAEgC0ABIAiAAMALFADACxQAwAtAASALQAEgCVAA2AroASALmAEgCPgBIAuYASANoADgDaAA4ASQASAK4ADACuAA8AtAASAIgADQC1ABIAvQANgJYADoCoAAwA3gAPANEADYCDABIAtAASAEEAFoDRAA2AOAAJgKmAD8BfAA2A2gAOANoADcC0ABIAQwAPAKAADgDaAA4A2gANwMCADgBqAA2AtAASAMCADgC0ABIAsUAMALQAEgCHQA8AzwANgHGAEgDPAA2AboASAFNAC4CugBGAroARgKkAEYDIABGAyAARgNSAEYDogBGAtAARgL0AEYC7gBGAu4ARgLuAEYCHABGAhwARgMMAEYDDABGBDoARgQ6AEYDDABGAwwARgLQAEYDBgBGAlgARgJYAEYCWABGAlgARgPXAEYD1wBGAu0ARgLtAEYEOABGA3oARgNlAEYC0ABGAuMARgPXAEYDDABGA0gARgMMAEYBqABGA0gARgPHAEYBzgBGA7gARgLfAEYC3wBGAwwARgLuAEYDZQBGAwQARgMEAEYCpABGAvoARgKiAEYCogBGAegARgJcAEYDNgBGBCMARgNTAEYDUwBGArEARgNMAEYCxABGA4sARgOLAEYDiwBGAmQARgJkAEYDSABGAwcARgIgAEYDBgBGAhwARgLAAEYC0wBGA3cARgN3AEYCpABGAzEARgL6AEYDdwBGAzgARgN6AEYCwQBGAwwARgLBAEYCFQBGAgsARgK2AEYDBABGAwQARgMEAEYDfABGAscARgLHAEYDQABGA0AARgOwAEYDsABGA0AARgOgAEYC5wBGAt8ARgLbAEYDDgBGAlMARgN6AEYCqABGA3cARgMvAEYB/gBGA1AARgK8AEYCvABGArwARgLUAEYC1ABGAnkARgJ5AEYDLQBGA0IARgJxAEYDdwBGAlAARgMEAEYDBABGAn8ARgJ/AEYDdwBGA3cARgLNAEYCzQBGAxIARgN7AEYDDABGA0kARgH0AEYDGABGAgoARgIKAEYChwBGAWkARgMvAEYDUgBGAqsARgNCAEYDggBGAgoARgM0AEYDNABGAygARgNgAEYDBABGAygARgNlAEYDhABGA0wARgNMAEYDLABGAywARgMsAEYDogBGA94ARgIcAEYCYABGAnYARgOOAEYCrwBGAq8ARgLoAEYCrwBGAtQARgLmAEYC1ABGAuYARgLoAEYC6ABGAugARgLoAEYDDABGAhwARgIcAEYCUwBGAuQARgJsAEYDBABGA5IARgOSAEYDWQBGAyAARgMEAEYDdwBGA94ARgPtAEYDHwBGAx8ARgO0AEYDtABGA4oARgQUAEYCWABGAlgARgI+AEYC5gBGAj4ARgLmAEYB9ABGAlwARgLAAEYCwABGAuoARgM0AEYC2wBGAyUARgJeAEYC1gBGAtYARgH0AEYDLQBGA6sARgOCAEYClABGAnkARgOSAEYCsQBGBM8ARgMQAEYCxgBGA9YARgLAAEYDDgBGAk8ARgMCAEYCbABGAmwARgOiAEYDogBGA6IARgMRAEYDEQBGAy0ARgMtAEYDywBGA8sARgLRAEYDIQBGAkYARgJcAEYCagBGAkYARgQjAEYEIwBGBCMARgQjAEYC0ABGAxUARgLTAEYC0QBGAwQARgMEAEYDBABGAwQARgMEAEYCbABGAnoARgMmAEYDOQBGAp4ARgIJAEYCAABGBG4ARgUsAEYDBABGBEMARgG9AEYDKwBGAwgARgJmAEYC0ABGA4YARgL9AEYDmABGBAAARgLfAEYC5gBGAzAARgLLAEYCtABGAMgARgKlAEYDAgBGAoAARgJTAEYCDgBGAqUARgH0AEYCywBGBHcARgIwAEYBTQAXARQAVgFWADIAwgAyAMIAMgAA/t0AAP78AAD96AIOAAAAewAAAugAMgA7AAABLAAAASwAAADE/l4ABv5MAAD+TAEpACYA6v+yAAD/FQBO/oYBwgBTAAD+JwAA/oEAcP8CAJf+5AAA/ewAAP5BAAD+LwAA/YkAAP5pAdn/7QFNAAUBJwAKATL/7gEO/+gBNP/uAQz/5wGS//QBR//mAaP/7gImABMBLf/lASH/9wGR/+IBI//hAM8ADAFUAAsBNQAgATD/6AC8/9MBTQBLAaH/7gEO/+4Bi//vAcj/6QEv/+oAAP8VARr/1QDyAAABmv/OAeL/1wE6/+4Bd//uASP/4QEy//EAAP8VAQ7/7gCu/t4BIv8SATX/sAB4/0YAeP9ZAPH/4QK4/9UCfP/yAd8AAwHXAAQBzP/0Aer/8wId//QCT//nAdb/7gHY//MCCv/ZAeT/8QIC/+UCH//fAe8ABAH3/+8B4QAFAeH/9wIL/+EB8wAJAn3/+QG8//ACC//nAiv/6QHY//YB1//4AfL/7QHS/+sB7//sAeL/1wHF//MB2P/tAbv/8wKY/9UCOP/pAbj/6QG4/80ClP/ZAdn/7QKU/9kB2f/tApT/2QHZ/+0B3//zAjr/3QI4/90COv/dApj/1QKY/9UCmP/VAnL/6QHkAA4C/QAQAisABQIrAAUB1wArAdcAKwJ/ACsBrP/nAhD/1QJL//MDt//yA7f/6gMW//sB1//nAun/7QLp//IC6f/zAkf/6AKR/+sDE//nAxP/5wMT/+cD4v/vAZj/5QMO/+YDDv/mAl3/6QKf/80CcQAEAiEAFAI6ABcDAwAhAcP/4AHr//QCFv/HA1b/4gN3/+kCp//ZAlgADQJYAA0CAAANAbL/9gKaACwBsv/2Ap0AMQJgAAUBwgA/Am4APwIr/90CK//dAfUADwIf/98CIf/pAqL/3wIf/98C/v/RAtX/0QHq/9MB6v/TAhf/7AIP/+kCD//pAaL/6QID/8sB7f/LAh3/5QHl/+kBsQAtAloALQJQ/9MCUP/TAc//5wJA/+cCQP/nALz/0wIZ//ECGf/wAgv/4QIb//ACC//hAm7/0wJt/9MCcf/wAgn/6wIJ/+sCRP/0Ab3/2AJo/9gCfv/xAfn/8ALrABkCMwAbAfQAHwHzAAkB8wAJAfMACQJn/9wB8v/uAkj/5wJr/+cCW//pAlv/6QIr/+kBef/nAgj/9QF5/+cCK//pAgf/6gMu/+kCz//pAan/6QHA/+gDVv/pA1j/6QHI/+kCj//ZAo//2QHI/+kByP/pAcj/6AKD/+kCX//oAcj/6QHA/+gDGv/pAxr/6QJI/9MB8f/dArH/0gKx/9ICav/VAmr/1QHx//ECxv/VAmX/8gHx//EDBwAZAwcAGQKR/98ByP/VAnoAAAMX//QCD//tAfL/7QKT/+0B8v/tAgb/zgJT/84CQ//uAbf/3QJP//UCCf/rAk//9QHm/+ACrP/pAxD/zgMW/84ChP/pAoT/6QIv/84CSP/pAmj/1wKD/9cCaP/XAjD/5wL3/98CJf/jAvf/3wIl/+MCDf/zAhL/9wHi/9cCC//xAeL/1wH6/9MB7//sA5D/1wOM/9cDjP/XAsr/8QLK//ECnf/XApP/7AHi/9cB7//sAbj/5wIJ/9MCmP/pAy7/5wG4/+cDRv/nAjr/3QHXACsBrP/nAZj/5QH9//ECT//nAX3/xwIK/9kBwgA/Ah//3wHdAA8Bjf/oAt0ALQGxAC0CC//hAb3/2AHzAAkCwP/nAiv/6QHI/+kB/P/oAcD/6AHQ//QB8v/fAfL/7QHi/9cB7//sAtz/5wG4/+cB3wADAnAAAwIA//kClwAFAnEABQKYACsCdAArAwn/5wLN/+cCvf/lApr/5QKWAAQCcgAEAgf/+wLE/+4Ch//vApYABQJxAAUCC//hAgv/4QIL/+ECC//hAz//6wL3/+sCngAJAnEACQKeAAkCeAAJAof/+gJf//oCQ//nAh//5wLD/+cCo//nApb/9gJv//YD8P/pA83/6QJK/+cCGv/nAfH/8QHx//ECrP/tAoH/7QKt/+0ChP/tA7f/zgOV/84B4v/XAiT/1wHi/9cCA//XAq//7AKG/+wEM//XBA//1wQq/9cEBP/XAq3/7AKL/+wBuf/TAgn/0wJD/+cCGf/nAkf/5wIe/+cCmf/tAnT/7QI6/90B0wAcAdcAKwGs/+cB4wAJAZj/5QH9//ECT//nAjP/5wMDABoBff/HAZT/9AIK/9kBmP/VAcIAPwIf/98B3QAPAaL/6QGxAC0Bvf/YAfMACQJI/+cBef/nAiv/6QHA/+gBp//hAYb/5wHy/98B8v/tAan/6QHv/+wBuP/nAgv/5wGY/+kBrP/rAXn/5wF5/+cAmf5XAAD+HAAA/mEAAP5hAAD+GQIL/+EAAP6RAAD+7QAA/tQAAP5uAzL+AQAA/gYAAP5GAAD9zgGa/8kCxP/tAKT/EwJIAAAB///TAon/3wKJ/+0CBf/vAeL/1wKW/+wBuP/nAfIAAAG3/90AAP5jAJv/lQBx/7MBFv/vANj/8gEW/+8COAAAAhEAAAODAAADgwAAAc8AAAAA/nwA0/9VAAb+TAAG/kwABv8nAeYAAAKBAAACgQAAAgoAAAJhAA4CnwAAAqEAAAJcAAACtP/+AnYAEgJ1ABICrgAAAtAAAALL/8UB0gAAAwX/8wJvAAAC2gAAAsQAAALl//MCPwAAAl0AAAHjAAACHQAAARwAAAFjAAABggAAAq4AAAHSAAAByQAAAb4AAAInAAAChAApAegAAAJCACcBaQAAAU4AAAGoACkBoQAAAWcAJwE+AAABPgAAAPj/8wHSAAABBAAAAXwAKQEfAAABQwAAAdIAAAK7AAABpQAAAhYAAAIWAAABBAAAAZ0AAAD4AAAB5AAAAf4AAAF8AAAB4AAAAjIABAH5AAAB4AAAAmIAAALaAAACeAAAApgAAAJqAAACagAAAqIAAAJyAAABrQAAAnQAAAHoAAACSv//AoEAAAKEAAAB6AAAAioAAAIqAAACBQAAAmoAAAJVAAACVQAAAvwAAALYAAADIAAFAdr/tQMG//MB6AAAAOIACwKQ//MCiwAAANP/NQDT/l0A1v9KANT+awDT/zUA0/5dANP/+QDT//kA0//5AaAAKQG6AAABvgAAAXUAAAHeACMBz///AbMACAIKAAAABv49AAb/IAH5AAAABv8nAAP+IQDh/+MA0//5ANP/8wDT//AA0wAAANP/BgDT/w4AAP58AAb+fAAG/nwABv5MAAb+TAAG/kwA0/9VANP/LAAG/kwBrwAAANz/RAJbAAACigAAAjgAAAIRAAACYwAAAhgAAAH0AAAC2gAAAvkAAAH+AAACPwAAAnoAAAJdAAACcwAAAq4AAAK7AAAClwAAAioAAAIFAAACVQAAAgwAAAJRAAACWQAAAoQAKQHoAAACHQACAioAAAHgAAACOwANAfkAAAIdAAABp//nAoAAAAJi//4DKAAAAxMAAAMuAAAC9QAAAiYAAgHB//QCYgAAAbMAAAFOAAACRQAAAjkAAAJFAAABbwACAkUAAAISAAAA+P/zAooAAAHmAAAB9AAAAjgAAAIRAAACYwAAAhgAAAH0AAAB5AAAAooAAAMoAAADEwAAAkUAAAJFAAACOQAAAkUAAAHSAAAB0gAAAjP/9AH0//oBxgAEAbcAAAHC//8CRf/zAlv/9gHY//MBzwACAX8ABgG0AAEBuf/9Ac3//gFiAAgB+QAmAhX/+AIN//oBQQANAbIAAgGnAAMCDP/6AXIABgG5AAUBnAAEAcT//wIB//oB2P/uAcYAAAGvAAMB6f/8Ah3/7QIG//oB6//1AbwAAQHP//8Cmv/sAbgAAQG/AAAB2f/+AZYABQIM//kCE//6AUgADQJ1/+4CS//6Ajv/+wIs//4DKP/oA43/3gJ2//gDLP/oAvT/7ALW/+wCtv/vAi///gIu//wCHP/yAi///AI2//wCDv/5Aon/9AHqAAIDEP/nAoH/8wJo//cC7v/pA5T/2wHmAAUBhQAIAlv/6gJR//gCvP/wAq3/8gIX/+0CKv/rAhn//wKC//ICXv/3Akv/+gKQ//MC0v/lAq7/8AKO//UCWP/4Amj/9gJb//cCW//3AnX/9QIy//sCywASAq//8AHvAAQDDf/mAhb//gLo/+ACy//lAuT/4wAr/yoAKf5MA1z/3wMz/+MDM//jA1z/3wIWAAACkP/zAhv//gId//4CDAAAACz+RwA6/jwAMP4xACz+VAAk/nEAMP5gAC7+XgAp/lYAMv5bAC/+WAAx/qYAKv5LACr+SwPl/9ABBgAYAeIAAAJi//YCwgAMAm//9QJi//cCWf/2Amb/9gKC//UCrP/wAnr/9AKE//QB/QABAh3//gIb//4CDAAAApH/8wIj//wCaP/3Ae4AAgJZ//QCc//1Agz//gJs//cCs//vAq//8AHUAAQCTv/4Af//9AI7//kCr//xAg7//QJs//UCP//6AnD/0gIl//sB5P/6AcT/9gAJ/r8ACf5hAAn+VAIe//YACf4xAAn+QAAJ/j4ACf5bAAn+owAJ/rMAAP6/AAn+QgAJ/mcACf6YAAD+vwAJ/lIBUQAOAOwAMQKK//QBG//zA7X/+QO0//kDxP/5Aqn/+ALv//kCif/3Aq//+gKR//gCcv/5AoL/+gKH//IClf/2ApD/9wKL//kCgv/6AnL/+gKZ//gCe//2AnX/9AKN//cCb//3Amr/9wKP//kC4f/6Am3/+gJ1//kCmv/5Amf/9gNa//kECv/5A2j/6wOb//YC1v/5Atb/+QKa//YDWv/5As7/+QNd//kEQ//5AGz/8wAJ/mEACf5iAAn+vwAJ/l8ACf5hAtIATAHvABIBzAAMAdEAEgKMABIChQASAggAEgPsAEEEFABBBBIAQQQNAEEE6ABBAMgAOgExAAABkAA4AksAJQN6ADoDUAAmA2gAPwMgADkDUgAlA2kAPwMdACUDqQAjAkgAMgMIADwDCAA8AwgAPAMIADwCgAA6AoAAOgKAADoCTwA6AdIAHgJWACYCbgA/AQYADQFfAAkCYAA9AQ4ABwIOACYCJgA5AlgAJQJtADABegAzAl8APQI/ADkCOAA/Ak4AMwJeAD4CIwAlAwgAPAKvACMA1AA+Ak8AOgImADkCOAA/AoAASAOEABIEDgANAt4ADQFhAAMBPwAAA8YAAwIaAAAE3gAAAVwAAwO/AAIB/AADAkoAAAQuAAMEgAAAA2QAAgM+AAIDLQAAA6MAAgO2AAADjAAAAZoAAALiAAMCgAADAxIAAgLHAAMEAgAAAf4AAAJhAAICGgAAA3wAAgIFAAABowAsA2QAAgKAAAMDywACA+wAAwKdAAAFcQAIBFYACQTCAAAD6QADAoIAAwUXAAMFGQACBRYAAgKAAAMEMgAEBEMAAAPqACMCgAACA+wAAwNJAAMC6AADA/YAAwSzAAMEDQAEBEMAAwPlAAQECgADAoAAAQL4AAQDbwADA/EAAwMAAAQETQADAn0AAAKAAAID+QAABSMAAwRwAAQFbgAEBV8AAgLl//8D2///BEMABAOZAAICMQAAAWEAAwFcAAMBmgAAARf//gLqAAQCPABLAo4AOQL4AEkBJgA3AvAANwLKADYCkABPAkYAMAI5ADACNQA3Al4AMQJGAD8C0AA6ApIAOQNZAD0CJgAyAu0ANQHtADkCXABGA1YAOQIjAE8CSABJAhIAKwHtAE4CEQA4A2QAMAIGADMB8gBEAucATgQvADACkAByAhIANwJIAEoDCAAxAjwAbgI2AEEB8QA4AkwALgJgAE8CIABOAuYANwHQADcCtwA3Ae8ANwKjADcB6QA3AskANwNIADYClwA3AoIANwH0ADcB2AA3AiYANwGAADcDQAA3AXUANwHbADcCTQA3A0EANwJSADcCBgA3ApQANwEgADcBxAA3AbsANwISADcBwQA3AmIANwEEADcAAAAAAAAAKAAAACgAAAAoAAAAKAAAAFQAAACEAAAA5AAAAZAAAAIkAAACwAAAAuAAAAMMAAADOAAAA3QAAAOgAAADyAAAA+QAAAP8AAAEGAAABGQAAASMAAAE4AAABUwAAAWEAAAF6AAABlgAAAaIAAAHAAAAB2wAAAeQAAAHxAAAB+gAAAgQAAAIOAAACJgAAAlQAAAJiAAACewAAApIAAAKhAAACrQAAArgAAALTAAAC3wAAAuYAAAL1AAADAwAAAwsAAAMYAAADJAAAAzcAAANIAAADYAAAA3wAAAOfAAADqAAAA7cAAAPAAAADzgAAA90AAAPoAAAD9AAAA/0AAAQEAAAEDQAABBYAAAQdAAAEJAAABEkAAAReAAAEcgAABIgAAAShAAAEsQAABM8AAATgAAAE6gAABPkAAAUGAAAFDQAABSYAAAU2AAAFSQAABV4AAAVzAAAFgAAABZwAAAWtAAAFvQAABcYAAAXUAAAF4QAABfEAAAX9AAAGFQAABhwAAAYzAAAGRQAABkkAAAZOAAAGaAAABo4AAAasAAAGvgAABscAAAb0AAAG+gAABx4AAAc/AAAHTAAAB1QAAAdbAAAHhAAAB4sAAAedAAAHqwAAB8IAAAfdAAAH5AAAB/gAAAgGAAAICwAACB8AAAgqAAAIQAAACEUAAAhdAAAIgAAACKgAAAitAAAIswAACLkAAAi/AAAIxQAACMsAAAjRAAAI5AAACQwAAAkSAAAJGAAACR4AAAkkAAAJKgAACTAAAAk2AAAJPAAACVAAAAlWAAAJXAAACWIAAAloAAAJbgAACXQAAAmBAAAJngAACaQAAAmqAAAJsAAACbYAAAm8AAAJzQAACegAAAnuAAAJ9AAACfoAAAoAAAAKBgAACgwAAAo7AAAKYAAACmYAAApsAAAKcgAACngAAAp+AAAKhAAACooAAAqQAAAKsQAACrcAAAq9AAAKwwAACskAAArPAAAK1QAACuIAAAr/AAALBQAACwsAAAsRAAALFwAACx0AAAsyAAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs4AAALOAAACzgAAAs/AAALPwAACz8AAAs/AAALPwAACz8AAAs/AAALPwAACz8AAAs/AAALPwAACz8AAAs/AAALPwAACz8AAAs/AAALPwAACz8AAAs/AAALPwAACz8AAAs/AAALPwAACz8AAAs/AAALPwAACz8AAAs/AAALPwAACz8AAAs/AAALPwAACz8AAAtgAAALhAAAC4QAAAuEAAALhAAAC4QAAAuEAAALhAAAC4QAAAuEAAALhAAAC4QAAAuEAAALhAAAC4QAAAuEAAALhAAAC4QAAAuEAAALhAAAC4QAAAuEAAALhAAAC4QAAAuEAAALhAAAC4QAAAuEAAALhAAAC4QAAAuEAAALhAAAC4QAAAuEAAALhAAAC4QAAAuEAAALhAAAC4oAAAuKAAALigAAC4oAAAuKAAALigAAC4oAAAuKAAALigAAC4oAAAuKAAALigAAC4oAAAuKAAALigAAC4oAAAuKAAALigAAC4oAAAuKAAALigAAC4oAAAuKAAALigAAC4oAAAuKAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6AAAAugAAALoAAAC6kAAAuyAAALsgAAC7IAAAu2AAALugAAC7oAAAu6AAALugAAC7oAAAu6AAALugAAC7oAAAu6AAALugAAC7oAAAu6AAALugAAC8YAAAvMAAAL3gAAC+wAAAv7AAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAwFAAAMBQAADAUAAAweAAAMHgAADB4AAAweAAAMHgAADB4AAAweAAAMHgAADB4AAAweAAAMHgAADB4AAAweAAAMHgAADB4AAAweAAAMHgAADB4AAAweAAAMHgAADB4AAAweAAAMHgAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMMQAADDEAAAwxAAAMOAAADD8AAAw/AAAMPwAADD8AAAxIAAAMUQAADFoAAAxaAAAMYAAADGYAAAxsAAAMbAAADHcAAAyGAAAMkAAADJAAAAyQAAAMkAAADJgAAAyYAAAMmAAADJgAAAyYAAAMmAAADJgAAAyYAAAMmAAADJgAAAzLAAAMywAADMsAAAzLAAAMywAADMsAAAzLAAAMywAADMsAAAzTAAAM2AAADNgAAAzYAAAM2AAADNgAAAzYAAAM2AAADNgAAAzYAAAM2AAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADN8AAAzfAAAM3wAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANAwAADQMAAA0DAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANCwAADQsAAA0LAAANKAAADSgAAA0oAAANMwAADTMAAA0zAAANMwAADTMAAA0zAAANMwAADTMAAA09AAANPQAADUsAAA1LAAANSwAADUsAAA1LAAANSwAADUsAAA1LAAANVgAADVYAAA2WAAANlgAADZYAAA2WAAANlgAADZYAAA2WAAANlgAADZYAAA2WAAANqgAADaoAAA2qAAANqgAADaoAAA2uAAANrgAADa4AAA2uAAANrgAADa4AAA2uAAANrgAADa4AAA2uAAANrgAADbQAAA20AAANtAAADbQAAA3EAAANxAAADcQAAA3QAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADd0AAA3dAAAN3QAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3rAAAN6wAADesAAA3+AAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAA4RAAAOEQAADhEAAEAABSpAbgAZAB1AAgAAgABAAIAFgAAAQAAAAAIAAQAAAAUAPYAAQAAAAAAAAAQAAAAAQAAAAAAAQAPABAAAQAAAAAAAgAHAB8AAQAAAAAAAwAIACYAAQAAAAAABAAPAC4AAQAAAAAABQAMAD0AAQAAAAAABgAAAEkAAQAAAAAABwAHAEkAAQAAAAAACAAHAFAAAQAAAAAACQAHAFcAAwABBAkAAAAgAF4AAwABBAkAAQAeAH4AAwABBAkAAgAOAJwAAwABBAkAAwAQAKoAAwABBAkABAAeALoAAwABBAkABQAYANgAAwABBAkABgAAAPAAAwABBAkABwAOAPAAAwABBAkACAAOAP4AAwABBAkACQAOAQxPcmlnaW5hbCBsaWNlbmNlQUFBQUFDK0ZyZWVTYW5zVW5rbm93bnVuaXF1ZUlEQUFBQUFDK0ZyZWVTYW5zVmVyc2lvbiAwLjExVW5rbm93blVua25vd25Vbmtub3duAE8AcgBpAGcAaQBuAGEAbAAgAGwAaQBjAGUAbgBjAGUAQQBBAEEAQQBBAEMAKwBGAHIAZQBlAFMAYQBuAHMAVQBuAGsAbgBvAHcAbgB1AG4AaQBxAHUAZQBJAEQAQQBBAEEAQQBBAEMAKwBGAHIAZQBlAFMAYQBuAHMAVgBlAHIAcwBpAG8AbgAgADAALgAxADEAVQBuAGsAbgBvAHcAbgBVAG4AawBuAG8AdwBuAFUAbgBrAG4AbwB3AG4AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgB/4WwAY0AS7AIUFixAQGOWbFGBitYIbAQWUuwFFJYIbCAWR2wBitcWACwAyBFsAMrRAGwBCBFsAMrRLAFIEW6AAR//wACK7EDRnYrRFmwFCsAAA==" ); diff --git a/test/font/font_os2_spec.js b/test/font/font_os2_spec.js index d348a6b4ca3ac..2b73501834c31 100644 --- a/test/font/font_os2_spec.js +++ b/test/font/font_os2_spec.js @@ -1,4 +1,4 @@ -import { decodeFontData, ttx, verifyTtxOutput } from "./fontutils.js"; +import { ttx, verifyTtxOutput } from "./fontutils.js"; import { CMapFactory } from "../../src/core/cmap.js"; import { Font } from "../../src/core/fonts.js"; import { Name } from "../../src/core/primitives.js"; @@ -6,11 +6,11 @@ import { Stream } from "../../src/core/stream.js"; import { ToUnicodeMap } from "../../src/core/to_unicode_map.js"; describe("font_post", function () { - const font2154 = decodeFontData( + const font2154 = Uint8Array.fromBase64( // eslint-disable-next-line max-len "AAEAAAANAIAAAwBQT1MvMpxkBm8AAADcAAAAVmNtYXDwD/A1AAABNAAAAC5jdnQgJsYFBAAAAWQAAADuZnBnbTQnXAoAAAJUAAACh2dseWbDL/rtAAAE3AAAAGBoZWFkxW7T6QAABTwAAAA2aGhlYQ37B2cAAAV0AAAAJGhtdHhvP0naAAAFmAAAA8hsb2NhFrAWsAAACWAAAAHmbWF4cAJLAyUAAAtIAAAAIG5hbWUnzzMmAAALaAAAA3pwb3N0AAMAAAAADuQAAAAgcHJlcFbFIB8AAA8EAAABhwABAxMBkAAFAAYFmgUzAAABJQWaBTMAAAOgAGYCEgAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAABHbHlmsUAAIPtPBeH94QAABeECBgAAACAAAAAAAAAAAAABAAMAAQAAAAwABAAiAAAABAAEAAEAAPAA//8AAPAA//8AAAABAAQAAAAAAAAFeQAIBYAAFQSP/9sD1AAVAAD/6wAA/+v/4f/3/s//9wTyAJP/K//nA/gAKAQ5ABEEVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgCbAMMA0gDhAKAArwBkAAAAAAAAAAAAMgCMAJsArwC+ANcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////wAAAAAAAAAAAABAGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAsigNFioqHsAErsEcjRLBHeuQYLSwgabBAYbAAiyCxAsCKjLgQAGJgKwxkI2RhXFiwA2FZLSwhIQxkI2SLuEAAYi0sIbCAUVgMZCNki7ggAGIbsgBABStZsAJgLSwhsMBRWAxkI2SLuBVVYhuyAIAFK1mwAmAtLAxkI2SLuEAAYmAjIS0sALBGI3CxAUY+AbBGI3CxAkZFOrECAAgNLSxFIyCxKgQlilBYYYsbYIxZaS0sICBFGGhEILABYCBFsEZ2aIpFYEQtLCCwAyVKZLEHBSYjK4oQOi0sILADJSNKZLEHBSYjK4oQZTotLCCwAyVHI0cjYSCxBwYmIysgimG4/4BisAQmICAQijogRiC4EABjV2BIISEtLCCwAyVHI0dhILEHBiYjKyNhILCAYmGKICAQijogRiC4EABjV2BIIS0sILADJUpkILEHBiYjKyCKYbj/gGKwBCYgIBCKOi86LSwgsAMlSmQgabAFJosgimG4/4BisAQmICAQijovOi0sRiNGYIqKRiMgRopgimG4/4BiIyAQI4qxRkaKcEVgILAAUFiwAWG4/8CLG7BAjFloATotLAGwBkOwB0NlCi0sS1JYRUQbISFZLSxFIyBFILEEBSWKUFgmYYqLGyZgioxZRC0sARAgPAA8LSwBsQsKQyNDZQotLCCwAyVKZLEHBSYjK7AEJouKEDotLCCwAyUjSmSxBwUmIyuwBCaLihBlOi0sILADJUpkILEHBiYjK7AFJosgimG4/4BisAQmICAQijovOi0sS1NYIIqKYSCKIIpgsAQlICAgDyOwAWEguf/oAACKUXhZISEhLQAAAgCAAAADgAXhAAMABwA4QCACAQcFAAYHVQAECVUHAQ0ACAMCBQYHBABJBgINSQAEDSsrERI5ETkSOQA/KysRORE5ERI5MTAzESERJSERIYADAP2AAgD+AAXh+h+ABOEAAQAAAAEAAAAAAABfDzz1ACgIAAAQAACrSRkTAAAAALLCcf3/RP36CNMF4QAAAAkAAgAAAAAAAAABAAAF4f3hAAAJEf9E/4II0wABAAAAAAAAAAAAAAAAAAAA8gQAAIAAAAAAAjcAAAI3AAACqgBCAqoAcwNSAAADUgA1BcMAYAUfACwBjQAMAf4AIwH+ABkDUgBSBOEAtAHFAFICNwAlAcUASALfAAoDUgAxA1IAhwNSAD8DUgA9A1IALwNSADkDUgAxA1IAQgNSADEDUgAvAjcASAI3AEgEewCFBOEAtAR7AIUDiwBMBs0AXQW8//0EIgCCBO8AUQURAH4EAACVA7wAgAWaAEwFdwCJAkQAiQLvAAUE7wB5A94AggaqACQF3gAoBkUAUQO8AEwGRQBUBIgAkgO8AGkEiAApBbwAfwWaAB8GzQAQBO8AFASqABoEZwA+Af4AZgI1AAAB/gBoAxQAGwQIAAAEiAFuA1UAOgPeAE8DVQA/BAAAVgN3AEQCRABTA3cATAPeAFQBvABbAbz/7AN3AFUBvABZBgAAVQPeAFsEAAA4BAAAXwPeADoCqwBeAokAKAJnAA0D3gBJA3cABAURAAIDd//1A5r/8wLMABID1wDhAQIAQgPXASEEWAAUBM0AKQI3AAACqgBCBIgA1ANSAAoEiABdBIgABAOaAZ0C3wAvBIgBLQOaAHACzABnA1UAMQbNAUcCRAAhA5oAcASIAS8DGQBUBOEAtAI3AEwCNwBQBIgB7gQA/5AEiAEMAkQAiQSIAXwCNwBkAswAIANVAC0FFwBkBRcAZAUXAFADiwBMBOEAzwThALQEiAE9AJgAAAI5AAAB7AAAAewAAACYAAABugAAAboAAAFoAAABaAAAAJgAAAI5AAAAmAAAAFwAAAGNAAACNwAlAj0A5wUXBB8FFwDnAjcASARvAFADxQBIAqoANQOLAAQENQBeAnEANwJxADUEbwA/BG8AGQI3AFADGQAjA4sAMwOLADMEqABSBG8AXgI3AD8CqgA/BG8AFAP8AB8DiwAbA8UAWAPFAC0D/AA1BDUAUgOLABIFFwAZBKgAOQRaADcEWgBQBAcAUAGNAAwCqgBzAz8AcQM/AD8EiABOCAAA6AJEAEgCRABhAkQAGwPeAEYD3gBfA94AEQSIAJ0EiACeBTMAzggAAM4JEQAyAd4AMQHeACgF0wBmBGcAZwMZACMDGQAjA4v/RAOL/0QD/AAfBG8AUARvAFAEbwBQA4sAGwJxADcDxQBIA4sAMwPFAFgEb//LBRcAGQUXABkFFwAZBRcAGQPFAEgCqgA1A4sABAQ1AF4CcQA3AqoAFARvABkCNwAzAxkAIwOLADMDiwAzBG8AXgKqAD8EbwAUA8UAWAP8ADUENQBSA4sAEgUXABkEqAA5AAAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAAAAAQAAAPIAWwAHAAAAAAACABAAQACWAAAApQKHAAYAAQAAAAoAfgABAAAAAAAAAMMAAAABAAAAAAADAA8AwwABAAAAAAAEAA8A0gABAAAAAAAGAA8A4QADAAEECQAAAYYA8AADAAEECQABAB4CdgADAAEECQACAA4ClAADAAEECQADAB4CogADAAEECQAEAB4CwAADAAEECQAGAB4C3lR5cGVmYWNlIFBvcnRpb25zIKkgVGhlIE1vbm90eXBlIENvcnBvcmF0aW9uIHBsYy4gRGF0YSBQb3J0aW9ucyCpIFRoZSBNb25vdHlwZSBDb3Jwb3JhdGlvbiBwbGMvVHlwZSBTb2x1dGlvbnMgSW5jLiAxOTkwLTE5OTIuIFBvcnRpb25zIKkgMTk5MS0xOTkzIEtpdnVuIENvbXB1dGVycyBMdGQuIKkgMTk5MiBUeXBlIFNvbHV0aW9ucywgSW5jLktMSUtCRStOYXJraXNpbUtMSUtCRStOYXJraXNpbUtMSUtCRStOYXJraXNpbQBUAHkAcABlAGYAYQBjAGUAIABQAG8AcgB0AGkAbwBuAHMAIACpACAAVABoAGUAIABNAG8AbgBvAHQAeQBwAGUAIABDAG8AcgBwAG8AcgBhAHQAaQBvAG4AIABwAGwAYwAuACAARABhAHQAYQAgAFAAbwByAHQAaQBvAG4AcwAgAKkAIABUAGgAZQAgAE0AbwBuAG8AdAB5AHAAZQAgAEMAbwByAHAAbwByAGEAdABpAG8AbgAgAHAAbABjAC8AVAB5AHAAZQAgAFMAbwBsAHUAdABpAG8AbgBzACAASQBuAGMALgAgADEAOQA5ADAALQAxADkAOQAyAC4AIABQAG8AcgB0AGkAbwBuAHMAIACpACAAMQA5ADkAMQAtADEAOQA5ADMAIABLAGkAdgB1AG4AIABDAG8AbQBwAHUAdABlAHIAcwAgAEwAdABkAC4AIACpACAAMQA5ADkAMgAgAFQAeQBwAGUAIABTAG8AbAB1AHQAaQBvAG4AcwAsACAASQBuAGMALgBLAEwASQBLAEIARQArAE4AYQByAGsAaQBzAGkAbQBSAGUAZwB1AGwAYQByAEsATABJAEsAQgBFACsATgBhAHIAawBpAHMAaQBtAEsATABJAEsAQgBFACsATgBhAHIAawBpAHMAaQBtAEsATABJAEsAQgBFACsATgBhAHIAawBpAHMAaQBtAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAwJAgiCCAIHggcCBoIGAgWCBQIEggQCA4IDAgKCAgIBggECAIIAAgARkYAAAAAYAUBc0uwwGMAS2IgsPZTI7gBClFasAUjQgGwEksAS1RCALkAAQfAhY0WFhBwPrEGBkWwCGBEKysrKysrKysrKysrKysrKysrKxgBsUhIRWmwQItEsUlJRWmwQItEsUpKRWmwQItEsUtLRWmwQItEsUxMRWmwQItEsU1NRWmwQItEsU5ORWmwQItEsU9PRWmwQItEsVBQRWmwQItEsVFRRWmwQItEsVJSRWmwQItEsVNTRWmwQItEALFUVEVpsECLRLFVVUVpsECLRLFWVkVpsECLRLFXV0VpsECLRLFYWEVpsECLRLFZWUVpsECLRLFaWkVpsECLRLFbW0VpsECLRLFcXEVpsECLRLFdXUVpsECLRLFeXkVpsECLRLFfX0VpsECLRACwAkVosHNFaLBAi2CwICMhIbAGRWiwdEVosECLYLAiIyEhsABFaLB2RWiwQItgsHUjISEA" ); - const font1282 = decodeFontData( + const font1282 = Uint8Array.fromBase64( // eslint-disable-next-line max-len "AAEAAAANAIAAAwBQT1MvMlJpU/gAAADcAAAATmNtYXCFppKjAAABLAAACnpjdnQglnDSdgAAC6gAAAYwZnBnbcx5WZoAABHYAAAGbmdseWYHpqdrAAAYSAAAEkZoZWFkzS3ungAAKpAAAAA2aGhlYRJtEaoAACrIAAAAJGhtdHjKonNAAAAq7AAAFKBsb2NhAFYgrgAAP4wAABSkbWF4cAnkAZUAAFQwAAAAIG5hbWWb1QwoAABUUAAAAPhwb3N0AAMAAAAAVUgAAAAgcHJlcFL+xOkAAFVoAAAK/wAABAABkAAFAAAEAAQAAAAEAAQABAAAAAQAAGYCEgwAAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAA/Pz8/AEDwIPAACAACAADMCAwDmAAAAAAAAQADAAEAAAAMAAQKbgAAAAQABAABAADlJv//AADgAP//AAAAAQAEAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZABlAGYAZwBoAGkAagBrAGwAbQBuAG8AcABxAHIAcwB0AHUAdgB3AHgAeQB6AHsAfAB9AH4AfwCAAIEAggCDAIQAhQCGAIcAiACJAIoAiwCMAI0AjgCPAJAAkQCSAJMAlACVAJYAlwCYAJkAmgCbAJwAnQCeAJ8AoAChAKIAowCkAKUApgCnAKgAqQCqAKsArACtAK4ArwCwALEAsgCzALQAtQC2ALcAuAC5ALoAuwC8AL0AvgC/AMAAwQDCAMMAxADFAMYAxwDIAMkAygDLAMwAzQDOAM8A0ADRANIA0wDUANUA1gDXANgA2QDaANsA3ADdAN4A3wDgAOEA4gDjAOQA5QDmAOcA6ADpAOoA6wDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+AP8BAAEBAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAiICIwIkAiUCJgInAigCKQIqAisCLAItAi4CLwIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMCRAJFAkYCRwJIAkkCSgJLAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoICgwKEAoUChgKHAogCiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZApoCmwKcAp0CngKfAqACoQKiAqMCpAKlAqYCpwKoAqkCqgKrAqwCrQKuAq8CsAKxArICswK0ArUCtgK3ArgCuQK6ArsCvAK9Ar4CvwLAAsECwgLDAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAtAC0QLSAtMC1ALVAtYC1wLYAtkC2gLbAtwC3QLeAt8C4ALhAuIC4wLkAuUC5gLnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AvoC+wL8Av0C/gL/AwADAQMCAwMDBAMFAwYDBwMIAwkDCgMLAwwDDQMOAw8DEAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMvAzADMQMyAzMDNAM1AzYDNwM4AzkDOgM7AzwDPQM+Az8DQANBA0IDQwNEA0UDRgNHA0gDSQNKA0sDTANNA04DTwNQA1EDUgNTA1QDVQNWA1cDWANZA1oDWwNcA10DXgNfA2ADYQNiA2MDZANlA2YDZwNoA2kDagNrA2wDbQNuA28DcANxA3IDcwN0A3UDdgN3A3gDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgOPA5ADkQOSA5MDlAOVA5YDlwOYA5kDmgObA5wDnQOeA58DoAOhA6IDowOkA6UDpgOnA6gDqQOqA6sDrAOtA64DrwOwA7EDsgOzA7QDtQO2A7cDuAO5A7oDuwO8A70DvgO/A8ADwQPCA8MDxAPFA8YDxwPIA8kDygPLA8wDzQPOA88D0APRA9ID0wPUA9UD1gPXA9gD2QPaA9sD3APdA94D3wPgA+ED4gPjA+QD5QPmA+cD6APpA+oD6wPsA+0D7gPvA/AD8QPyA/MD9AP1A/YD9wP4A/kD+gP7A/wD/QP+A/8EAAQBBAIEAwQEBAUEBgQHBAgECQQKBAsEDAQNBA4EDwQQBBEEEgQTBBQEFQQWBBcEGAQZBBoEGwQcBB0EHgQfBCAEIQQiBCMEJAQlBCYEJwQoBCkEKgQrBCwELQQuBC8EMAQxBDIEMwQ0BDUENgQ3BDgEOQQ6BDsEPAQ9BD4EPwRABEEEQgRDBEQERQRGBEcESARJBEoESwRMBE0ETgRPBFAEUQRSBFMEVARVBFYEVwRYBFkEWgRbBFwEXQReBF8EYARhBGIEYwRkBGUEZgRnBGgEaQRqBGsEbARtBG4EbwRwBHEEcgRzBHQEdQR2BHcEeAR5BHoEewR8BH0EfgR/BIAEgQSCBIMEhASFBIYEhwSIBIkEigSLBIwEjQSOBI8EkASRBJIEkwSUBJUElgSXBJgEmQSaBJsEnASdBJ4EnwSgBKEEogSjBKQEpQSmBKcEqASpBKoEqwSsBK0ErgSvBLAEsQSyBLMEtAS1BLYEtwS4BLkEugS7BLwEvQS+BL8EwATBBMIEwwTEBMUExgTHBMgEyQTKBMsEzATNBM4EzwTQBNEE0gTTBNQE1QTWBNcE2ATZBNoE2wTcBN0E3gTfBOAE4QTiBOME5ATlBOYE5wToBOkE6gTrBOwE7QTuBO8E8ATxBPIE8wT0BPUE9gT3BPgE+QT6BPsE/AT9BP4E/wUABQEFAgUDBQQFBQUGBQcFCAUJBQoFCwUMBQ0FDgUPBRAFEQUSBRMFFAUVBRYFFwUYBRkFGgUbBRwFHQUeBR8FIAUhBSIFIwUkBSUFJgUnAAAFugAZBboAGgWnABkEJgAYAAD/5wAA/+gAAP/n/mn/6AW6ABn+af/oAuoAAAC4AAAAuAAAAAAAqACtAWkArQC/AMIB8AAYAK8AuQC0AMgAFwBEAJwAfACUAIcABgBaAMgAiQBSAFIABQBEAJQBGf+0AC8AoQADAKEAzQAXAFcAfgC6ABYBGP/pAH8AhQPTAIcAhQANACIAQQBQAG8AjQFM/3UAXADfBIMANwBMAG4AcAGA/1j/jv+S/6QApQC5A8j//QALABoAYwBjAM3/7gXY/9wALQBcAJUAmQDfAZIJtQBAAFcAgAC5A50AcgCaA10EAf9n//oAAwAhAHcAzQAEAE0AzQHAAisATABlAOcBGAF8A0MF2P+j/7D/xAADABwAXQBoAJoAugE1AUcCIQVc/03/zQAWAC0AeACAAJkAsgC2ALYAuAC9ANoBDAXw/6T/8AAZACwASQB/ALQAzgHAA/79gf4/AAAABQAYACkAOQBJAG8AvgDHANABIwHBAm8FDAUyBUAFev/UABQAMQBVAFcApwC0AOYB9wJ+An4CfwPGBEb/QgAOAIUAkQC/AMIAxQDhARoBLwFPAVYCKQJvAp4DcgAIACwAMQAxAGQAaQCJAJgAxwDeASsBtgIMAs8DowSrBPsGHf7g/w4ABgAmAJsAnQDBAQ0BGAEgAXMBggHWAeMCQwJfApsC4gOUBKkE0gdhABwAXgBtAI0AqwD3ARIBOAFRAVsBaAF8AYcBkQGZAc0B0AHoAkECVAJrAu8DaANxA70EQgRCBFMEcwSDBYYFiwbo/lj+xP7R/vf/Mv+GAFEAfACBAJEAlQCeALQAuQDPANkA2QDfAOIBBQELAQ4BDgEgASEBVQF7AXsBfgGNAaIBqAGpAbQB0AHQAeIB6QHyAfUB+wIAAgACBgIbAiECIgIiAiMCcgJ3ApQCnALPAs8C0ALsAvkDFwMiAysDNQM8A1kDbwNxA4cDkAOQA7UD4QQaBM8E/wUyBTIFlgWfBagFqwXCBfAGDAeCCAAIzPyj/Sr93v4A/oj+lv6y/rT/4QAVABkAGgAcAB8APABRAGEAYQBqAHgAlgClAK8A0wEMARgBGgEqAT4BTAFRAV8BagFxAXgBggGEAZoBpQGoAakBrgG8Ac0B1wHvAgACDQIcAiECIgIuAjUCQgJPAk8CXgJlAnECkAKSArQC1gL6AwcDCwMPAxUDKgNHA10DZQN0A3kDlgOwA8wD3QPiA/YD/AP8A/8ECgQfBCIEJgQrBEcEXwR1BJ4E5wTnBVwFywXlBgoGbQaGBrgG8Qc2Bz4HUAdRB10Hjwe2B9QIYAC2AMMAtQC3AAAAAAAAAAAAAAAAAeADgQNFA7UAjgIzBBkCzgLOAC0AXwBkA00CPwAAAqgBiAJ9AbQCJAV4BjsCOwFOAPAEJgKUAsYCnwL2AjsDTQFLAVMAagIxAAAAAAAABhQEqgAAADwEwwDtBLwCZQLOA7UAeAYMAX4C7wYMALIBAAI5AAABxQMwBCsDywDaA98BBwShANsECgEXAe0CpwNQAQsBvQQ+BVgAIQOcAK4DcQF9ALUCRQAACvsIjAErAU4BqgCHAFQBMgH4A/8AAwJOALQANwPjAIMAawLYAO0AdwCIAJcBZARnAI4AMwF8AOcApgKeAykFbgYqBhUByQJpBIoCEwG0AAIEqQAAAjkBJAEDBRQAhAFdA5oG7wLZAHUAzwQKAN4DrAS8As8CrgNNBPAFUgFoAG0AfQCGAHH/gQB5BVgE0gFnAAMBVgAlBOAAlAB8AzIEIQCUAH8AcgBcAC8AtgAYALoAuABBA00AcgAYAB8ATAFqAVUAmQCaAJoAmACyAAQAeABpABQAVwBuAM4AtAZUArgAZwUOAWUA5wAABMv+UgBa/6YAmf9nAG7/kgAt/9QAh/98ALgAqADlAI8AqAGF/nsAcAAeANkA3gFMBUYCzwVG/y0CigLZAlMClgC3AAAAAAAAAAAAAAAAAAABJQEYAOoA6gCuAEYAPgW7AIoE1wBTAD//jP/VABUAKAAiAJkAYgBKAOQAbQDuAOUASAPAADP+TgKx/0YDcAB5Bd8AUf+n/x8BCgBo/2wATwC8AKUHBQBhBytAQ1VUQUA/Pj08Ozo5ODc1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAsRSNGYCCwJmCwBCYjSEgtLEUjRiNhILAmYbAEJiNISC0sRSNGYLAgYSCwRmCwBCYjSEgtLEUjRiNhsCBgILAmYbAgYbAEJiNISC0sRSNGYLBAYSCwZmCwBCYjSEgtLEUjRiNhsEBgILAmYbBAYbAEJiNISC0sARAgPAA8LSwgRSMgsM1EIyC4AVpRWCMgsI1EI1kgsO1RWCMgsE1EI1kgsJBRWCMgsA1EI1khIS0sICBFGGhEILABYCBFsEZ2aIpFYEQtLAGxCwpDI0NlCi0sALEKC0MjQwstLACwFyNwsQEXPgGwFyNwsQIXRTqxAgAIDS0sRbAaI0RFsBkjRC0sIEWwAyVFYWSwUFFYRUQbISFZLSywAUNjI2KwACNCsA8rLSwgRbAAQ2BELSwBsAZDsAdDZQotLCBpsEBhsACLILEswIqMuBAAYmArDGQjZGFcWLADYVktLEWwESuwFyNEsBd65BgtLEWwESuwFyNELSywEkNYh0WwESuwFyNEsBd65BsDikUYaSCwFyNEioqHILCgUViwESuwFyNEsBd65BshsBd65FlZGC0sLSywAiVGYIpGsEBhjEgtLEtTIFxYsAKFWViwAYVZLSwgsAMlRbAZI0RFsBojREVlI0UgsAMlYGogsAkjQiNoimpgYSCwGoqwAFJ5IbIaGkC5/+AAGkUgilRYIyGwPxsjWWFEHLEUAIpSebMZQCAZRSCKVFgjIbA/GyNZYUQtLLEQEUMjQwstLLEOD0MjQwstLLEMDUMjQwstLLEMDUMjQ2ULLSyxDg9DI0NlCy0ssRARQyNDZQstLEtSWEVEGyEhWS0sASCwAyUjSbBAYLAgYyCwAFJYI7ACJTgjsAIlZTgAimM4GyEhISEhWQEtLEuwZFFYRWmwCUNgihA6GyEhIVktLAGwBSUQIyCK9QCwAWAj7ewtLAGwBSUQIyCK9QCwAWEj7ewtLAGwBiUQ9QDt7C0sILABYAEQIDwAPC0sILABYQEQIDwAPC0ssCsrsCoqLSwAsAdDsAZDCy0sPrAqKi0sNS0sdrgCIyNwECC4AiNFILAAUFiwAWFZOi8YLSwhIQxkI2SLuEAAYi0sIbCAUVgMZCNki7ggAGIbsgBALytZsAJgLSwhsMBRWAxkI2SLuBVVYhuyAIAvK1mwAmAtLAxkI2SLuEAAYmAjIS0stAABAAAAFbAIJrAIJrAIJrAIJg8QFhNFaDqwARYtLLQAAQAAABWwCCawCCawCCawCCYPEBYTRWhlOrABFi0sS1MjS1FaWCBFimBEGyEhWS0sS1RYIEWKYEQbISFZLSxLUyNLUVpYOBshIVktLEtUWDgbISFZLSywE0NYAxsCWS0ssBNDWAIbA1ktLEtUsBJDXFpYOBshIVktLLASQ1xYDLAEJbAEJQYMZCNkYWS4BwhRWLAEJbAEJQEgRrAQYEggRrAQYEhZCiEhGyEhWS0ssBJDXFgMsAQlsAQlBgxkI2RhZLgHCFFYsAQlsAQlASBGuP/wYEggRrj/8GBIWQohIRshIVktLEtTI0tRWliwOisbISFZLSxLUyNLUVpYsDsrGyEhWS0sS1MjS1FasBJDXFpYOBshIVktLAyKA0tUsAQmAktUWoqKCrASQ1xaWDgbISFZLSxLUliwBCWwBCVJsAQlsAQlSWEgsABUWCEgQ7AAVViwAyWwAyW4/8A4uP/AOFkbsEBUWCBDsABUWLACJbj/wDhZGyBDsABUWLADJbADJbj/wDi4/8A4G7ADJbj/wDhZWVlZISEhIS0sRiNGYIqKRiMgRopgimG4/4BiIyAQI4q5AsICwopwRWAgsABQWLABYbj/uosbsEaMWbAQYGgBOi0ssQIAQrEjAYhRsUABiFNaWLkQAAAgiFRYsgIBAkNgQlmxJAGIUVi5IAAAQIhUWLICAgJDYEKxJAGIVFiyAiACQ2BCAEsBS1JYsgIIAkNgQlkbuUAAAICIVFiyAgQCQ2BCWblAAACAY7gBAIhUWLICCAJDYEJZuUAAAQBjuAIAiFRYsgIQAkNgQlm5QAACAGO4BACIVFiyAkACQ2BCWVlZWVktLLACQ1RYS1MjS1FaWDgbISFZGyEhISFZLQAAAAIBAAAABQAFAAADAAcAQrQCAeQGB7gCmUATAAUE5AMACgcE5AEAGQgGBeQCA7wCMQAJAZkBLgAYKxD2PP08ThD0PE39PAA/PP08EPw8/TwxMCERIRElIREhAQAEAPwgA8D8QAUA+wAgBMAAAAEAZv/nBXYF0wAdANO1YwJqHQIBuP/otAsLBlUAuP/oQF8LCwZVIAAyDWMAcAB0HYAAhB2QAJoFqwOlDbkDtA3HDdAA5B3zHREOEh0RHR0DKgYoESocIB9HDVYUVxVWGWgFax17EosSmgOZDpocqAGkAqgR1Q4TABQAGhAUEBoEArj/3rIoOQG4/8BALSg5EA8AAQQbEx4MAxseBAkQJg9KACYgAQEBGh8XJiAIAQgMCwsGVQgZHmNcGCtOEPQrXU3tThD2XU3t9O0AP+0/7REXOTEwASsrXV1xAF0rKwFyARcGBCMiJAI1NBIkMzIEFwcmJiMiBgIVFBIWMzI2BLTCPf7D5e3+15uvAUPC3AEsO78zwpOp41xt5oaj4gICMe/7wQFu0uUBVbHgyy2gkqL+75G7/umKvAAAAQCiAAAE6AW6AAsAlUAVBgUeCAgHBwADBB4CAQIKCR4LAAgHuP/AQB0QEjQHVANKIAogDQIKGg0ECSABIAABACAQEAJVALj/9rQPDwJVALj/9rQNDQJVALj/+rQMDAJVALj/+rQMDAZVALj/8EAKDQ0GVQBdDDtbGCtOEPQrKysrKytdPE39PE4Q9l1N9OQrAD88/Tw/PP08EjkvPBD9PDEwMxEhFSERIRUhESEVogQk/J4DK/zVA4QFuq3+P6z+Da0AAAIAoQAABa0FugAYACIB/EAhEgsOARI2HFofZghtHwQJEA0NBlUIEA0NBlUHEA0NBlUkuP/AtAwMAlUNuP/0tAwMAlUMuP/0tAwMAlULuP/0tAwMAlUSuP/isxIaNBK4//CzIic0Ebj/4rMdJzQQuP/isx0nNA+4/+KzHSc0Erj/2LMdJjQRuP/isxIaNBC4/+KzEho0D7j/4kBJEho0JQ5KHEogUwtcHG0ccgl4DnkPhQqID5cNqQ+4D+gO5w8QDgwMIBEPFBERDxEPDAkSGwIhGhYKBhIREA0MBRgJCRYXGhkeF7j/wEAZCwsGVRcXACEiHgIBAgAYGA8PDggeJg6cBrj/6LQPDwJVBrj/9rQNDQJVBrj/4EAiDAwCVQYGDQ0GVQZdICRwJIAkAyQiGCABIAABACAQEAJVALj/9rQPDwJVALj/9rQNDQJVALj/+kALDAwCVQAGCwsGVQC4//e0DAwGVQC4//hACg0NBlUAXSM7qBgrThD0KysrKysrK108Tf08EF32KysrKxnkGO0APzwQPBA8Pzz9PBI5Lyv9PBA8OS8SFzkBERc5hw4uKwV9EMQxMAFdKysrKysrKysrKysrKwArKytdQ1xYQAoIQA85DxA6ERI6KysrWQFxQ1xYuQAO/95AGhk5ESIZORIiGTkOQBw5ECIUORAiHzkQIhU5KysrKysrK1kzESEyFhYVFAYHFhcWFxMjAy4CJyYjIxERITI2NjU0JiMhoQKKxMx6ytNNKFVM//TCVW5XLSFL4QGhhZZOl6P+MAW6T8h5nNYdJSROdf5xATGEjDgLB/11AzM3eUdohgAAAQCh/+cFIgW6ABQA2UAKJg9YBFgIyQgEFrj/wEAWExU0NAQ7CEYESgh2D6YF6A8HDAACEbgCu7QGCRQmArj/7LQPDwJVArj/8kALDQ0CVQIQDAwCVQK4/+BAHAsLBlUCXSAWASAWUBYCYBZwFoAWAxYNJiAKAQq4/8BAChMVNAogEBACVQq4//a0Dw8CVQq4//a0DQ0CVQq4//pACwwMAlUKBAsLBlUKuP/3tAwMBlUKuP/4QAoNDQZVCl0VO1kYK04Q9CsrKysrKysrXe1NEF1dcfYrKysrTe0AP+0/PDEwAV0rAF0BMxEUAgQjIiQCNREzERQWFjMyNhEEYMJk/vvUzv76cMJHrX3WtgW6/LHd/vyjjgEN6QNP/LK/tWLCARQAAAEAUP/oA+0EPgAaAVqxAgJDVFhANA5/DwEPCwFAAFAAcAADAAQSHAsHGBwECwEOFQcIDg4CVQcMDQ0CVQcMDAwCVQcQCwsCVQcvKysrK83UxgA/7T/tEMRdMhDEXTIxMBtARwkMAR8cQxNDF1MTUxdgE2AXmwKbA5oNpBCkGgwIDRkKagJpA2oFdQxwDYANpgy1CbYKtQwMFgyGDOMCAw4iXw9vD38PAw8BuAKqQHkwAEAAUABgAHAAkACgAOAA8AAJAA8PCwAABBIcCwcYHAQLHA8BDyQOCA0NBlUOIhsAAQAkCysfAQEAAQEBQAsLBlUBQBAQBlUBSAwMBlUBGg0NBlUBSRwVJM8HAR8HPwcCBw4LCwZVBwoQEAZVBxIMDAZVBzEbNMQYKxD2KysrXXHtEPYrKysrXXJLUyNLUVpYuQAB/8A4We1y9CvtcgA/7T/tEjkvETkvEF3kEF3kMTAAXXEBXXFZARcGBiMiABE0EjYzMhYXByYmIyIGFRQWMzI2AzyxHe+u2v73cumJrdwfrxl/WoiqpIRqjgGFF7fPAR0BCqwBAoGvoRtrbMPT1sKCAAACAEv/6AQeBD4AFQAdAVNAFx8AHBUCVQNdBV0JVQtlA2sFbwllCwgVuP/ktA0NBlURuP/kQFINDQZVHRwNDQZVJxLZBfoU9hoEMRI6GTEcQRJNGkEcURJcGVIcYRJtGmEceAZ4FfYC9hgQABYBDw0XF1AWYBZwFgMWHA+QEKAQAhAQBBscCgcAugKqAAH/wLQQEAJVAbj/wEAQEBAGVRABAQGVExwECxdADbj/3LQNDQJVDbj/7rQNDQZVDbj/6rQMDAZVDbj/wEAJJyo0sA0BDRofuP/AsyUmNB+4/8BAQR4jNDAfAR8WMxAkB0AkKjQfBz8HTwcDByALCwJVBxgMDAJVBxwNDQJVBw4LCwZVBxwMDAZVBxYNDQZVBxkeNDcYK04Q9CsrKysrK10rTf3kThBxKyv2cSsrKytN7QA/7f1dKyvkP+0SOS9dPP1xPAEREjk5EjkxMAFdAF0rKysBcXIBFwYGIyIAERAAMzIAERQHIRYWMzI2ASEmJyYjIgYDXros7rnp/u8BFNzVAQ4B/OgKsoVjjP3aAlEMOFaJfKkBVhejtAEfAQMBDAEo/t7++RAgr7poAZWGQ2imAAEAhwAAA+YEPgAWAX1AEwUDBhMCqBC4EOMD5xPwA/YTBgS4//BAPAsNNHkQAZgQ0BjgGP8YBCAIFA4UFhIcBQcBBhYNCg0ODA4kGEAQEAJVGEALCwJVCygQEAJVCxQODgJVC7j/7EARDQ0CVQsEDAwCVQsiCwsCVQu4//RACwsLBlULFBAQBlULuP/5QAsNDQZVCwoPDwZVC7j/9kASDAwGVQtAMzY0/wsB/wsBC04YuP/AQBo0NjSwGPAYAnAYoBiwGMAYBBgDAjMVFiUBALj/9rQREQJVALj/+rQQEAJVALj/+kAXDg4CVQAEDAwCVQAKCwsCVQAECwsGVQC4//pAEQ8PBlUAAgwMBlUABA0NBlUAuP/AQBIzNjTwAAEAACAA0ADgAAQAThcQ9l1xKysrKysrKysrKzz9PPQ8EF1xK/ZdcSsrKysrKysrKysrKyvtPBA8AD88Pz/tETkBEjkxMEN5QBYGEQkKCAoHCgMGECYRBg4bAQ8KEhsBACsBKysqgQFdcQArXXEzETMVNjMyFhYXFhURIxE0JiYjIgYVEYeidd1goVAQCrQqa0hzpwQml69FcE0yff1zAoZubUGSzP28AAABAIUAAALGBD4AEQDJQDsvEwEQBAEjBDQEQwRTBGYEdAQGCREICQgJDRMRCQ0AAwgBCxwGBwEGAAoJKJAIAQgiIBMBEwIiESUBALj/wEAQMzY08AABAAAgANAA4AAEALj/+LQQEAJVALj/+EARDg4CVQAEDAwCVQAGCwsCVQC4//y0EBAGVQC4//RAFg8PBlUABgwMBlUACA0NBlUAThJHxBgrEPYrKysrKysrK11xKzz95BBd9HLkAD8/P+0ROTkROTkBERI5OQAQyYcOfcQxMABdcgFdMxEzFTY2MzIXByYjIgYHBhURhaI+aT9bXj5CQjteFB4EJqFxSDqnJ0c/YHL91AAAAQCD/+gD4AQmABgBT7kAGv/AQAkVFzQCIBMWNA+4//BAMxIUNCsTASQIExYMARMWCwYAChEcAwsAMxYlGBdAMzY0GkAQEAJVFygQEAJVFxIODgJVF7j/7EALDQ0CVRcEDAwCVRe4//RACwsLBlUXFBAQBlUXuP/4QAsNDQZVFwwPDwZVF7j/9kANDAwGVf8XAcAXARdOGrj/wEAVNDY0sBrwGgJwGqAasBr/GgQaDCUJuP/AQBAzNjTwCQEACSAJ0AngCQQJuP/4tBAQAlUJuP/4QBEODgJVCQQMDAJVCQoLCwZVCbj/9kAWDw8GVQkCDAwGVQkCDQ0GVQlOGUdQGCsQ9isrKysrKytdcSvtEF1xK/ZdcSsrKysrKysrKysrPP3kAD/tPz88OTkBERI5MTBDeUAaBBAODQ8NAgYHCAYIBQgDBhAEDBsADQgRGwAAKwErKiqBAF0BKysrITUGIyImJicmNREzERQXFhYzMjY2NREzEQM/fNVeo08QC7QLEW5RUY47tJy0SG1PNXMCkv2zjTFHUVOPiAI5+9oAAgCiBH8CCgXtAAsAFwBWQA4GhBJNA00MhABsGJ55GCsQ9v0Z9PQY7QCxBgJDVFiyD4QJuP/AQAkLDjQJCRWEAwE/7TMvK/0btAmED00GuAK0tQBNFYQDAT/9GfQY9hn0GO1ZMTATNDYzMhYVFAYjIiY3FBYzMjY1NCYjIgaia0lKampJS2pMPysrPz4sKz8FOklqa0xNamtPL0BALS1APwAAAQAoBKoCoQXCAAYASEATBQYBDwIfAgIChwBkBAMCPAE9A7j/wEARCQw0A2QAZAR/BjwFGQebehgrGU4Q9BhN/Rn2GP39Kxn2GO0ALzzt/V08PDwxMAE3MwMjAzMBZ27M4cDYzgUYqv7oARj//wBm/+cFdgcmAiYAJgAAAQcA3wGwAWQAFkAKAQAjIAgPQQEBIrkCIQApACsBKzX//wBQ/+gD7QXCAiYARgAAAQcA3wDKAAAAFkAKAQAgHQcOQQEBH7kCIgApACsBKzX//wCiAAAE6AcmAiYAKAAAAQcA3wEzAWQAKkASAQxAHiA0AAyvDAIvDF8MAgwCuP3/tEgrAQEQuQIhACkAKwErXXErNf//AEv/6AQeBcICJgBIAAABBwDfAOAAAAAVQAoCAR4KAEgnAgEhuQIiACkAKwErAP//AIcAAAPmBcICJgBRAAABBwDfAOIAAAAWQAoBABwZAQtBAQEauQIiACkAKwErNf//AKEAAAWtByYCJgA1AAABBwDfASIBZAAoQBACPyMB7yP/IwJfI48jAiMCuP9rtEgrAgEmuQIhACkAKwErXV1xNf//ADwAAALGBcICJgBVAAABBgDfFAAAHbcBPxJPEgISBrj/lrRIKwEBFbkCIgApACsBK101AAACACP/8gL9BboACgAiAPBAKm8FbAd/B44HBGABYAZgB3ABcARyB4ABgAQIABcYFQYKAAsNGwwOCxQhB7gCLUAkAQe3BgBAAgIBAAczAQqRAEABQAIaJBsUKxoVBiEcDgsaDCIbuAIwthgdJRcURRK4//K0EBACVRK4//a0Dg8CVRK4//y0DAwCVRK4/+y0EBAGVRK4/+i0Dw8GVRK4//a0DQ0GVRK4//RACgwMBlUAEgESGSO4ATaxZhgrThD0XSsrKysrKytN5Dz9PPTkPAA/7T88/TwBThD2Te395BDkAD88EO0Q7RDkERI5EjkBERI5ERI5ABEzM8kxMAFdAF0BNTMVFAYHJzY2NwMXBiMiJiY1ESM1MxE3ETMVIxEUFhYzMgJFuEhOLTMxApEaTDxibCyEhLO1tRMrKB4FAbm5ZX0iRBdXUvugnxA+ZaICY4wBB2z+jYz9k00sGv//AKH/5wUiBysCJgA4AAABBwDbAYoBPgA7QA8CARiAOjw0rxi/GP8YAxi4AxcAfT9yKxg1NQGxBgJDVFi3AgEAFRsMAEErNTUbtwECAh4GAGgnK1kA//8Ag//oA+AF7QImAFgAAAEHANsA3AAAABlADAIBABkfERFBAQICIrkCIgApACsBKzU1AAAAAAEAAAAC+uEAAAAAXw889Qg7CAAAAAAAouMnKgAAAAC4EYIh+q/9ZxA6CAwAAAAJAAEAAQAAAAAAAQAABz7+TgBDEAD6r/4zEDoAAQAAAAAAAAAAAAAAAAAABSgGAAEAAAAAAAI5AAACOQAAAjkAsALXAF4EcwAVBHMASQcdAHcFVgBYAYcAWgKqAHwCqgB8Ax0AQASsAHICOQCqAqoAQQI5ALoCOQAABHMAVQRzAN8EcwA8BHMAVgRzABoEcwBVBHMATQRzAGEEcwBTBHMAVQI5ALkCOQCqBKwAcASsAHIErABwBHMAWggfAG8FVv/9BVYAlgXHAGYFxwCeBVYAogTjAKgGOQBtBccApAI5AL8EAAA3BVYAlgRzAJYGqgCYBccAnAY5AGMFVgCeBjkAWAXHAKEFVgBcBOMAMAXHAKEFVgAJB40AGQVWAAkFVgAGBOMAKQI5AIsCOQAAAjkAJwPBADYEc//hAqoAWQRzAEoEcwCGBAAAUARzAEYEcwBLAjkAEwRzAEIEcwCHAccAiAHH/6IEAACIAccAgwaqAIcEcwCHBHMARARzAIcEcwBIAqoAhQQAAD8COQAkBHMAgwQAABoFxwAGBAAADwQAACEEAAAoAqwAOQIUALwCrAAvBKwAVwVW//0FVv/9BccAaAVWAKIFxwCcBjkAYwXHAKEEcwBKBHMASgRzAEoEcwBKBHMASgRzAEoEAABQBHMASwRzAEsEcwBLBHMASwI5AL0COQAjAjn/5QI5AAkEcwCHBHMARARzAEQEcwBEBHMARARzAEQEcwCDBHMAgwRzAIMEcwCDBHMASQMzAIAEcwBrBHMAGwRzAFECzQBtBEwAAQTjAJkF5QADBeUAAwgAAOECqgDeAqoAPQRkAE4IAAABBjkAUwW0AJoEZABOBGQATQRkAE0Ec//9BJwAoAP0ADgFtAB6BpYAoQRkAAACMQAAAvYALwLsAC0GJQB/Bx0ARATjAIEE4wCeAqoA6ASsAHIEZABUBHMALgRkADME5QAaBHMAhgRzAIwIAADvBVb//QVW//0GOQBjCAAAgQeNAFIEc//8CAAAAAKqAFMCqgBHAccAgAHHAGwEZABOA/QALwQAACEFVgAGAVb+OQRz/+QCqgBcAqoAXAQAABcEAAAXBHMASQI5ALkBxwBsAqoARwgAACUFVv/9BVYAogVW//0FVgCiBVYAogI5AI0COf/gAjkABAI5ABUGOQBjBjkAYwY5AGMFxwChBccAoQXHAKECOQDGAqoAGQKqAAYCqgAdAqoALgKqAOUCqgCiAqoAawKqADoCqgC3AqoAKARzAAABxwADBVYAXAQAAD8E4wApBAAAKAIUALwFx//9BHMASQVWAAYEAAAhBVYAngRzAIcErAByBKwAoQKqAGsCqgAZAqoAIQasAGsGrABrBqwAIQRzAAAGOQBtBHMAQgI5ALEFVgBcBAAAPwXHAGYEAABQBccAZgQAAFAEcwBGBGv/4QKqAfEFVv/9BHMASgVW//0EcwBKBccAngTrAEcFx//9BVYAogRzAEsFVgCiBHMASwRzAJYBxwBCBHMAlgJVAIgEcwCaAqwAgwXHAJwEcwCHBccAnARzAIcGOQBjBHMARAXHAKECqgCFBccAoQKqADwFVgBcBAAAPwTjADACOQAkBOMAMAMAACMFxwChBHMAgwXHAKEEcwCDBOMAKQQAACgE4wApBAAAKARoAKQGOQBgBmIAVQSgAEgEdABIA5EAYgTwAEQDKQAuBTAASARr/+EEAACwAusAUgjAADMIAABPBAAAmQgAAE8EAACZCAAATwQAAJgEAACYB9UBagXAAJ4EqwByBNUAnQSsAHEE1QIiBNUBBQWr/+kFAAHJBasCfgWr/+kFqwJ+Bav/6QWrAn4Fq//pBav/6QWr/+kFq//pBav/6QWrAcAFqwJ+BasBwAWrAcAFq//pBav/6QWr/+kFqwJ+BasBwAWrAcAFq//pBav/6QWr/+kFqwJ+BasBwAWrAcAFq//pBav/6QWr/+kFq//pBav/6QWr/+kFq//pBav/6QWr/+kFq//pBav/6QWr/+kFq//pBav/6QWr/+kFq//pBasC1gWrAGYFq//qBdX//wTVAJIIAAAAB+sBMAfrASAH6wEwB+sBIATVALIE1QCABNUAKggrAZgIawG4B1UAEAYAAPQGAABvBEAAOgVAADcEwAA/BBUAQAQAACUGAABVBeEAvwONAIkE1f/ZAYAAgALVAIYHFQBhApYADwTVAJIC1gCDAtYAgwTVALIC1gBwBVb//QRzAEoFxwBmBAAAUAXHAGYEAABQBVYAogRzAEsFVgCiBHMASwVWAKIEcwBLBjkAbQRzAEIGOQBtBHMAQgY5AG0EcwBCBccApARzAIcFxwAfBHMABgI5/84COf/OAjn/5AI5/+QCOf/2Ajn/9QI5AKMBxwBmBAAANwHH/6IFVgCWBAAAiAQAAIYEcwCWAcf/+gXHAJwEcwCHBckApQRzAIsGOQBjBHMARAY5AGMEcwBEBccAoQKqAGsFVgBcBAAAPwTjADACOQAMBccAoQRzAIMFxwChBHMAgwXHAKEEcwCDBccAoQRzAIMHjQAZBccABgVWAAYEAAAhAccAiQVW//0EcwBKCAAAAQcdAEQGOQBTBOMAgQI5ALkHjQAZBccABgeNABkFxwAGB40AGQXHAAYFVgAGBAAAIQHHAIoCqv/hBHMAGwTNAFoGrABrBqwAIgasACIGrABKAqoA4gKqAGsCqgDeAqr/6gVX//8GRv+nBrT/qAMS/6gGMv+nBtj/pwYF/6cBx/94BVb//QVWAJYFWP/+BVYAogTjACkFxwCkAjkAvwVWAJYFWAALBqoAmAXHAJwFMwBtBjkAYwXHAKQFVgCeBPIAlATjADAFVgAGBVYACQavAH8F+wBhAjkABAVWAAYEoABIA5EAYgRzAIsBxwBrBGAAiASaAIwEAAAZA4cASARzAIsEcwBcAccAiQQAAIYEAAAYBJwAoAQAABoDlQBcBHMARASNAIMD2wBWBGAAiAQzABEFtAB6Bj8AVwHH/8kEYACIBHMASARgAIgGPwBXBVcAogbrADIEVQChBcAAZAVWAFwCOQC/AjkABAQAADcIdQANCBUApAbVADEEqQChBRUACgXAAKAFVv/9BUAApwVWAJYEVQChBWsAAAVWAKIHYwAHBNUATgXAAKEFwAChBKkAoQVAABIGqgCYBccApAY5AGMFwACgBVYAngXHAGYE4wAwBRUACgYVAFIFVgAJBesAnwVVAFcHVQChB4AAoQZVAAAHFQCoBUAApQXAAFUIFQCkBccAGgRzAEoElQBbBEAAiALrAIgEqwAABHMASwVa//sDqwAyBHgAhwR4AIcDgACGBKsAGAWAAIwEawCIBHMARARVAIgEcwCHBAAAUAOqACYEAAAhBpUASwQAAA8ElQCKBCsARQZrAI0GlQCNBQAAKAXAAIsEKwCEBBUAMAYAAIkEVQAfBHMASwRzAAAC6wCJBBUASwQAAD8BxwCIAjkACQHH/6IHQAATBoAAgwRzAAADgACGBAAAIQRrAIgD6QChA0oAiAgAAEEIlQCgBYUALQKqAQECqgAeAqoAMQKqADECqgEBAqoAfgKqAH4CqgCMAqoAjAKqAQECqgAQAqoBAQKqASEDEAB9AqoAjAIzANICqgMLAqr/BAI5ALkEgQBpBFYAMgMxABkEEQAtBNEAlgH5AJsDDwBfBMoAmwS4AIwB+QCbBBMAKAOwAFADtAA8BMoAmwTPAFAB+QCbAtIAPASYAFoEPAAZBIgAbgRfAHMDsQAZA9QACgRmAJYEEwAoBY4AZAUkACgD8gCbA/IAmwPyAJsB4wBaA1YAWgaGAJsB+f+sBBMAKAQTACgDtP9XA7T/VwRIAC0FjgBkBY4AZAWOAGQFjgBkBIEAaQSBAGkEgQBpBFYAMgMxABkEEQAtBNEAlgJLAAADSgAABLgAjAJLAAAEEwAoA7AAUAO0ADwEzwBQAtIAPASYAFoEiABuBF8AcwPUAAoEZgCWBBMAKAWOAGQFJAAoAfkAmwRWADIDsABQBF8AcwSbADwAAP/cAAD/JQAA/9wAAP5RAo0AqwKNAKAC2gBDA00AeQGoAAABnABGAeUARgGcAEYBnABGAa0ASAGcAEYBsQBGAVEARgQ1AXwENQEuBDUAtwQ1AIEENQEsBDUAvgQ1AK8ENQCBBDUAmgQ1ANsENQCFAo0AwQQ1ALMGAAEABgABAAJCADYGAAEABDUAngQ1AJgENQDLBgABAAYAAQAGAAEABgABAAYAAQABsQBGBgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAFGwAABgABAAYAAQAGAAEABbUAgAW1AIAB9P/9AfT//QYAAQAGAAEABgABAAYAAQAEgQA2BDUANgQ9AAAEPQAAA+kAkAPpAJAGfwBaB3YAWgMnAAAEHgAABn8AWgd2AFoDJwAABB4AAAUbADIEtQBqBgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAHPADABsQBGAbEARgGxAEABsQBGBgABAAYAAQAAAP/cAAD+UQAA/xYAAP8WAAD/FgAA/xYAAP8WAAD/FgAA/xYAAP8WAAD/FgAA/9wAAP8WAAD/3AAA/yAAAP/cBHMASggAAAAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEAAo0AfwKNAF0GAAEABO4AFQNNAHkBqAAOAdYAIgGoAFYB1gBWA3UAeAN1AHgBqAAtAdYAWQUbADIEtQBqAfQAAAH0AAABqACTAdYAWQW1AIAFtQCAAfQAAAH0AAACQgAAAwAAPQW1AIAFtQCAAfQAAAH0AAAFtQCABbUAgAH0AAAB9AAABIEANgQ1ADYEPQAABD0AAASBADYENQA2BD0AAAQ9AAAEgQA2BDUANgQ9AAAEPQAAArMApQKzAKUCswClArMApQPpAJAD6QCQA+kAkAPpAJAGkgCEBpIAhAQ/AAAEPwAABpIAhAaSAIQEPwAABD8AAAjJAIQIyQCEBsUAAAbFAAAIyQCECMkAhAbFAAAGxQAABKcAAASnAAAEpwAABKcAAASnAAAEpwAABKcAAASnAAAEWgAqA5oANgQ1AAADJwAABFoAKgOaADYENQAAAycAAAZPAG0GTwBtAiQAAAIaAAAEpwCMBKcAjAIkAAACGgAABM8AcwTPAHMDJwAAAycAAAQNAI0EDQCNAagAAAGoAAACtABpArQAaQMnAAADJwAABDUAiwQ1AIsB9AAAAfQAAAJCADYDAAA9A5oAAAMnAAADdQB4A3UAeAUbADIEtQBqBRsAMgS1AGoB9AAAAfQAAARaAEAEzgBABFoAJgTOADAEWgBTBM4AQQRaAFMEzgBBBgABAAYAAQABnABGAZwARgYAAQAGAAEABgABAAFRAEYBsQBGBgABAAYAAQABrQBIAeUARgYAAQAGAAEABgABAAGxAEYBsQBGAbEARgGxAEYBsQBAAc8AMAYAAQABnABGAZwARgYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAKNAMoCjQDHAo0AxgYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAEAAAAIAAAAEAAAAAbcAGMFPwBEBtUAoQVbAIMAAP3cAAD8LwAA/KYAAP5UAAD81wAA/XMAAP4pAAD+DQAA/REAAPxnAAD9nQAA+/UAAPxyAAD+1QAA/tUAAP8CBBsAoAasAGsGrAAZAAD+tgAA/XMAAP4IAAD8pgAA/lMAAP0RAAD7yAAA+vQAAPqvAAD8cgAA+6oAAPtqAAD88QAA/H0AAPvdAAD8wQAA+5gAAP3qAAD+hAAA/cIAAPzxAAD9XwAA/nYAAP68AAD86wAA/WwAAP1YAAD8kAAA/RUAAPwsAAD8EwAA/BIAAPuWAAD7lgHHAIgFVv/9BHMASgVW//0EcwBKBVb//QRzAEoFVv/9BHMASgVW//0EcwBKBVb//QRzAEoFVv/9BHMASgVW//0EcwBKBVb//QRzAEoFVv/9BHMASgVW//0EcwBKBVb//QRzAEoFVgCiBHMASwVWAKIEcwBLBVYAogRzAEsFVgCiBHMASwVWAKIEcwBLBVYAogRzAEsFVgCiBHMASwVWAKIEcwBLAjkAYwHHAB8COQC6AccAfAY5AGMEcwBEBjkAYwRzAEQGOQBjBHMARAY5AGMEcwBEBjkAYwRzAEQGOQBjBHMARAY5AGMEcwBEBtwAYwU/AEQG3ABjBT8ARAbcAGMFPwBEBtwAYwU/AEQG3ABjBT8ARAXHAKEEcwCDBccAoQRzAIMG1QChBVsAgwbVAKEFWwCDBtUAoQVbAIMG1QChBVsAgwbVAKEFWwCDBVYABgQAACEFVgAGBAAAIQVWAAYEAAAhBVb//QRzAEoCOf/iAcf/sAY5AGMEcwBEBccAoQRzAIMFxwChBHMAgwXHAKEEcwCDBccAoQRzAIMFxwChBHMAgwAA/v4AAP7+AAD+/gAA/v4EVf/9AusADAdjAAcFWv/7BKkAoQOAAIYEqQChA4AAhgXHAKQEawCIBHP//QQAABQEc//9BAAAFAVWAAkEAAAPBVUAVwQrAEUFVQChBCsAiAYFAGMEcwBVBjkAYARzAEQAAAAAAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAAGmAAABpgAAAmoAAAJqAAACagAAAmoAAAJqAAACagAAAmoAAAJqAAACagAAAmoAAAJqAAACagAAAmoAAATWAAAE1gAABNYAAAX6AAAF+gAABfoAAAX6AAAF+gAABfoAAAX6AAAF+gAABfoAAAX6AAAF+gAABfoAAAX6AAAF+gAAB64AAAeuAAAJbAAACWwAAAlsAAAJbAAACWwAAAlsAAAJbAAACWwAAAlsAAALMgAACzIAAAsyAAALMgAADDgAAAw4AAAMOAAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAN1gAADdYAAA3WAAAOeAAADngAAA54AAAOeAAADuQAAA7kAAAO5AAADuQAAA7kAAAO5AAADuQAAA7kAAAO5AAADuQAAA7kAAAO5AAADuQAAA7kAAAO5AAADuQAAA7kAAAO5AAADuQAAA7kAAAO5AAADuQAAA7kAAAO5AAADuQAAA7kAAAO5AAADuQAAA7kAAAO5AAADxQAAA9EAAAPRAAAD0QAAA9EAAAPRAAAD0QAAA9EAAAPRAAAD0QAAA9EAAAPRAAAD0QAAA9EAAAPiAAAD7gAAA+4AAAPuAAAD7gAAA+4AAAPuAAAD7gAAA+4AAAPuAAAD7gAAA/oAAAP6AAAD+gAAA/oAAAP6AAAECoAABBgAAAQYAAAEGAAABBgAAAQYAAAEGAAABG8AAASEgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAASRgAAEkYAABJGAAEAAAUoAQAAPwBjAAUAAgAQAC8AVgAABA3//wADAAIAAAAIAGYAAQAAAAAAAwAMAAAAAQAAAAAABAAMAAwAAQAAAAAABgAMABgAAwAABAkAAQAYACQAAwAABAkAAgAOADwAAwAABAkAAwAYAEoAAwAABAkABAAYAGIAAwAABAkABgAYAHpGTk5QQUYrQXJpYWxGTk5QQUYrQXJpYWxGTk5QQUYrQXJpYWwARgBOAE4AUABBAEYAKwBBAHIAaQBhAGwAUgBlAGcAdQBsAGEAcgBGAE4ATgBQAEEARgArAEEAcgBpAGEAbABGAE4ATgBQAEEARgArAEEAcgBpAGEAbABGAE4ATgBQAEEARgArAEEAcgBpAGEAbAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsVQPQSIDFwDvAxcA/wMXAAMAHwMXAC8DFwBPAxcAXwMXAI8DFwCfAxcABgAPAxcAXwMXAG8DFwB/AxcAvwMXAPADFwAGAEADF7KSM0C4AxeyizNAuAMXs2psMkC4AxeyYTNAuAMXs1xdMkC4AxezV1kyQLgDF7NNUTJAuAMXs0RJMkC4AxeyOjNAuAMXszE0MkC4AxezLkIyQLgDF7MnLDJAuAMXsxIlMoC4AxezCg0ywEEWAxYA0AMWAAIAcAMWAAECxAAPAQEAHwCgAxUAsAMVAAIDBgAPAQEAHwBAAxKzJCYyn78DBAABAwIDAQBkAB//wAMBsg0RMkEKAv8C7wASAB8C7gLtAGQAH//AAu2zDhEyn0FKAuIArwLiAL8C4gADAuIC4gLhAuEAfwLgAAEAEALgAD8C4ACfAuAAvwLgAM8C4ADvAuAABgLgAuAC3wLfAt4C3gAPAt0ALwLdAD8C3QBfAt0AnwLdAL8C3QDvAt0ABwLdAt0AEALcAAEAAALcAAEAEALcAD8C3AACAtwC3AAQAtsAAQLbAtsADwLaAAEC2gLa/8AC07I3OTK5/8AC07IrLzK5/8AC07IfJTK5/8AC07IXGzK5/8AC07ISFjK4AtKy+SkfuALjsyArH6BBMALUALAC1AACAAAC1AAQAtQAIALUAFAC1ABgAtQAcALUAAYAYALWAHAC1gCAAtYAkALWAKAC1gCwAtYABgAAAtYAEALWACACygAgAswAIALWADAC1gBAAtYAUALWAAgC0LIgKx+4As+yJkIfQRYCzgLHABcAHwLNAsgAFwAfAswCxgAXAB8CywLFABcAHwLJAsUAHgAfAsoCxrIeHwBBCwLGAAACxwAQAsYAEALHAC8CxQAFAsGzJBIf/0ERAr8AAQAfAr8ALwK/AD8CvwBPAr8AXwK/AI8CvwAGAr8CIrJkHxJBCwK7AMoIAAAfArIA6QgAAB8CpgCiCABAah9AJkNJMkAgQ0kyQCY6PTJAIDo9Mp8gnyYCQCaWmTJAIJaZMkAmjpIyQCCOkjJAJoSMMkAghIwyQCZ6gTJAIHqBMkAmbHYyQCBsdjJAJmRqMkAgZGoyQCZaXzJAIFpfMkAmT1QyQCBPVDK4Ap63JCcfN09rASBBDwJ3ADACdwBAAncAUAJ3AAQCdwJ3AncA+QQAAB8Cm7IqKh+4AppAKykqH4C6AYC8AYBSAYCiAYBlAYB+AYCBAYA8AYBeAYArAYAcAYAeAYBAAYC7ATgAAQCAAUC0AYBAAYC7ATgAAQCAATlAGAGAygGArQGAcwGAJgGAJQGAJAGAIAE3QLgCIbJJM0C4AiGyRTNAuAIhs0FCMkC4AiGzPT4yD0EPAiEAPwIhAH8CIQADAL8CIQDPAiEA/wIhAAMAQAIhsyAiMkC4AiGzGR4yQLgCIrMqPzJAuAIhsy46Mm9BSALDAH8CwwCPAsMA3wLDAAQALwLDAGACwwDPAsMAAwAPAsMAPwLDAF8CwwDAAsMA7wLDAP8CwwAGAN8CIgABAI8CIgABAA8CIgAvAiIAPwIiAF8CIgB/AiIA7wIiAAYAvwIhAO8CIQACAG8CIQB/AiEArwIhAAMALwIhAD8CIQBPAiEAAwLDAsMCIgIiAiECIUAdEBwQKxBIA48cAQ8eAU8e/x4CNwAWFgAAABIRCBG4AQ229w349w0ACUEJAo4CjwAdAB8CkAKPAB0AHwKPsvkdH7gBmLImux9BFQGXAB4EAQAfATkAJgElAB8BOABzBAEAHwE1ABwIAQAfATQAHAKrAB8BMrIcVh+4AQ+yJiwfugEOAB4EAbYf+RzkH+kcuAIBth/oHLsf1yC4BAGyH9UcuAKrth/UHIkfyS+4CAGyH7wmuAEBsh+6ILgCAbYfuRw4H63KuAQBsh+BJrgBmrIffia4AZq2H30cRx9rHLgEAbIfZSa4AZqyH15zuAQBQA8fUiZaH0gciR9EHGIfQHO4CAG2Hz8cXh88JrgBmrIfNRy4BAG2HzAcux8rHLgEAbYfKhxWHykcuAEBsh8jHrgEAbIfVTe4AWhALAeWB1gHTwc2BzIHLAchBx8HHQcbBxQIEggQCA4IDAgKCAgIBggECAIIAAgUuP/gQCsAAAEAFAYQAAABAAYEAAABAAQQAAABABACAAABAAIAAAABAAACAQgCAEoAsBMDSwJLU0IBS7DAYwBLYiCw9lMjuAEKUVqwBSNCAbASSwBLVEKwOCtLuAf/UrA3K0uwB1BbWLEBAY5ZsDgrsAKIuAEAVFi4Af+xAQGOhRuwEkNYuQABARGFjRu5AAEBKIWNWVkAGBZ2Pxg/Ej4ROUZEPhE5RkQ+ETlGRD4ROUZEPhE5RmBEPhE5RmBEKysrKysrKysrKysYKysrKysrKysrKysYKx2wlktTWLCqHVmwMktTWLD/HVlLsJNTIFxYuQHyAfBFRLkB8QHwRURZWLkDPgHyRVJYuQHyAz5EWVlLuAFWUyBcWLkAIAHxRUS5ACYB8UVEWVi5CB4AIEVSWLkAIAgeRFlZS7gBmlMgXFi5ACUB8kVEuQAkAfJFRFlYuQkJACVFUli5ACUJCURZWUu4BAFTIFxYsXMkRUSxJCRFRFlYuRcgAHNFUli5AHMXIERZWUu4BAFTIFxYscolRUSxJSVFRFlYuRaAAMpFUli5AMoWgERZWUuwPlMgXFixHBxFRLEeHEVEWVi5ARoAHEVSWLkAHAEaRFlZS7BWUyBcWLEcHEVEsS8cRURZWLkBiQAcRVJYuQAcAYlEWVlLuAMBUyBcWLEcHEVEsRwcRURZWLkN4AAcRVJYuQAcDeBEWVkrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrK2VCKysBsztZY1xFZSNFYCNFZWAjRWCwi3ZoGLCAYiAgsWNZRWUjRSCwAyZgYmNoILADJmFlsFkjZUSwYyNEILE7XEVlI0UgsAMmYGJjaCCwAyZhZbBcI2VEsDsjRLEAXEVUWLFcQGVEsjtAO0UjYURZs0dQNDdFZSNFYCNFZWAjRWCwiXZoGLCAYiAgsTRQRWUjRSCwAyZgYmNoILADJmFlsFAjZUSwNCNEILFHN0VlI0UgsAMmYGJjaCCwAyZhZbA3I2VEsEcjRLEAN0VUWLE3QGVEskdAR0UjYURZAEtTQgFLUFixCABCWUNcWLEIAEJZswILChJDWGAbIVlCFhBwPrASQ1i5OyEYfhu6BAABqAALK1mwDCNCsA0jQrASQ1i5LUEtQRu6BAAEAAALK1mwDiNCsA8jQrASQ1i5GH47IRu6AagEAAALK1mwECNCsBEjQgArdHVzdQAYRWlERWlERWlEc3Nzc3R1c3R1KysrK3R1KysrKytzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzKysrRbBAYURzdAAAS7AqU0uwP1FaWLEHB0WwQGBEWQBLsDpTS7A/UVpYsQsLRbj/wGBEWQBLsC5TS7A6UVpYsQMDRbBAYERZAEuwLlNLsDxRWlixCQlFuP/AYERZKysrKysrKysrKysrKysrKysrdSsrKysrKytDXFi5AIACu7MBQB4BdABzWQOwHktUArASS1RasBJDXFpYugCfAiIAAQBzWQArdHMBKwFzKysrKysrKytzc3NzKwArKysrKysARWlEc0VpRHNFaURzdHVFaURzRWlERWlERWlEc3RFaURFaURzKysrKytzKwArcyt0dSsrKysrKysrKysrKysrc3R1KwA=" ); diff --git a/test/font/font_post_spec.js b/test/font/font_post_spec.js index 116d7716951d0..15b7edfde6161 100644 --- a/test/font/font_post_spec.js +++ b/test/font/font_post_spec.js @@ -1,4 +1,4 @@ -import { decodeFontData, ttx, verifyTtxOutput } from "./fontutils.js"; +import { ttx, verifyTtxOutput } from "./fontutils.js"; import { CMapFactory } from "../../src/core/cmap.js"; import { Font } from "../../src/core/fonts.js"; import { Name } from "../../src/core/primitives.js"; @@ -6,15 +6,15 @@ import { Stream } from "../../src/core/stream.js"; import { ToUnicodeMap } from "../../src/core/to_unicode_map.js"; describe("font_post", function () { - const font2109 = decodeFontData( + const font2109 = Uint8Array.fromBase64( // eslint-disable-next-line max-len "AAEAAAAMAIAAAwBAT1MvMgVKk3wAAADMAAAATmN2dCBsduxjAAABGgAAADpmcGdtT8I0ggAAAVQAAAAUZ2x5ZgUI920AAAFoAAA6smhlYWS059ujAAA8GgAAADZoaGVhvAJFCwAAPFAAAAAkaG10eDPBQ7AAADx0AAADtGxvY2EJxgAAAABAKAAAA7htYXhwGgKqAAAAQ+AAAAAgbmFtZbeHm10AAEQAAAAE0nBvc3QDAAAAAABI0gAAACBwcmVwi09VxAAASPIAAACJAAAEsAGQAAUAAQV4BRQAAAEeBXgFFAAAA4oAZAIGAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFsdHMAQPAg8RIGpAGQAAAGpAH0/of/8ANdBIQAUgGfAFIA2wBRAUoBiwJcAu8DUgF5AaUA3AOXAUoDzAHwAp0BcgN8ATFaYlpiAAIABEABACx2RSCwAyVFI2FoGCNoYEQtAAIAlgAABBoGQAADAAcAVkAgAQgIQAkCBwQEAQAGBQQDAgUEBwAHBgcBAgEDAAEBAEZ2LzcYAD88LzwQ/TwQ/TwBLzz9PC88/TwAMTABSWi5AAAACEloYbBAUlg4ETe5AAj/wDhZMxEhESUhESGWA4T9EgJY/agGQPnAlgUUAAAAAAAAAAAAAAABAAABlAPEAeYAAwA9QBEBBARABQADAgEAAwIBAAEBRnYvNxgALzwvPAEuLi4uADEwAUlouQABAARJaGGwQFJYOBE3uQAE/8A4WQEhNSEDxPw8A8QBlFIAAQDb/08DxQU5AA0ARUAUAQ4OQA8FDAUAAQgIBwcIAwoBDEZ2LzcYAC8vAYcuDsQO/A7EAS4uADEwAUlouQAMAA5JaGGwQFJYOBE3uQAO/8A4WRcBNjMyFxQHAQYjIic04QKTDxwlAQb9bQ8cJQFuBYYhKQ0N+nohKQ0AAAIA4P/iA9EE6AAVACcATkAcASgoQCkAHx4EDAsnFgQBACMGBRoGEBAFAQELRnYvNxgAPy8Q/RD9AS88/TwvPP08ADEwAUlouQALAChJaGGwQFJYOBE3uQAo/8A4WQEVEAcGBwYnJicmPQEQNzY3NhcWFxYHNCcmJyYHBh0BFBcWMzI3NjUD0X5hmJZgRCoWfmGYk2JGKRZSaz5+llE/a0J7lFI/AsrL/vmceAEBbk6cUnPLAQedeAEBbk+cVHzZn1wBAamDqrXill2pgqoAAQDdAAAD1gTaABQAbEAtARUVQBYCDgsLCgsMCBMTFBISEwISEwcQBRMUEwQLChQKCQMABgQTBQQBAQdGdi83GAA/PC8Q/Rc8AS88/TwQ/TwQ/YcuCMQO/AjEAQAuLjEwAUlouQAHABVJaGGwQFJYOBE3uQAV/8A4WSUyFRQjISInJjMhEQUGIyI1NDclEQOaPDz9ezQCAjgBGv70EwknKgF3UikpKSkEF1QGKR8Ndvt4AAEApwAAA8AE6AApAHNALgEqKkArBhkpGwkIAAsJCAkNCCknJykPAgEEIwcGBAcHAQAGBxMGHx8IBwEBCEZ2LzcYAD88LxD9EP08EP0BLzw8/Tw8hy4OxA78CMQOxAEuLi4uLgAuMTABSWi5AAgAKkloYbBAUlg4ETe5ACr/wDhZNyE1NDc2HQEhNTY3Njc2NzYnJicmBwYHBgciJyY3Njc2FxYXFgcGBwAH9wJ2Kin85+r8HlVrAQFaVXRnUlUcCiAmAQJEfLyVbnECAVMtcv7asVIgNQICOXJ50/YdVm5lck5LAQE6O2IjBSZBUpYCAWNmlGdpOXD+35kAAAEAvv/iA+oE6AA7AFlAIgE8PEA9BDAQMh4OABgEBCYEOhQGCBwGISIqBjY2CAEBDkZ2LzcYAD8vEP0vPP0Q/QEv/S/9Li4uLgAuLjEwAUlouQAOADxJaGGwQFJYOBE3uQA8/8A4WQEWFxYXFgcGBwYnJicmNTQzMhcWFxY3NjU0JyYjIicmNjMXFjc2NzYnJicmBwYHBgciNTQ3Njc2FxYXFgMBY0BEAQGBeKtXcnw0DycPFJaqgmNqxFJVNQIBHhRGZklOAQFVTW6zXA8JBQ4oVXSZj2ZsAQECmytWW2enamMBAScqOBASJw9vAQFOVH+tViQpFBUBATxAZGtBPAEBbxIGAQMmJzxSAQFWWo22AAACANEAAAPEBMoAAwAdAItAQQEeHkAfBhoZAwIDCAMAGxscGhobEgUNBhgXAQMABB0cCgMJAgEGGx0EAwMABhkYCQMIFxYLAwoGDxwbEA8BARlGdi83GAA/PC88EP0XPC8XPP0XPBD9PAEvFzz9FzwvPP2HLgjECPwOxAEuLi4AMTABSWi5ABkAHkloYbBAUlg4ETe5AB7/wDhZAREjASEyFRQrAREzMhUUIyEiJyY3NjsBESE1ATMRAvEr/mECYTw8REQ8PP7QNgIBDgsgmf3gAcirAakCzv0yKSn++ykpKREMDAEFXwMU/N8AAAEAv//jA+oEygApAGNAKAEqKkArDBYGFAIFKB4EDAYFBCkoJgcABQQGABoGECIGCCkAEAEBFEZ2LzcYAD8vPC/9EP0Q/TwQ/QEvPP08L/0Q/S4ALi4xMAFJaLkAFAAqSWhhsEBSWDgRN7kAKv/AOFkBMhUUIyERNjc2FxYXFgcGIyInJic0NzIXFhcWNzY1NCcmJyYHBgciNREDYDw8/haReKVlXwEBbXG9yaEjAycRE5GwnFpVS06Gd4kYFCcEyikp/m08AQF1b6e/eX2NHxcmBBKIAQFoYZ+HVVcBAUUMAy0CIAAAAgEL/+EEAwToACMAMQBYQCIBMjJAMwYaACIYJAQOAAQOKgQGJgYKHgYULgYCFAoBAQ5Gdi83GAA/Ly/9EP0Q/QEv/S/9EP0uLgAuLjEwAUlouQAOADJJaGGwQFJYOBE3uQAy/8A4WQE2NzYXFhcWBwYHBgMmJyY3Njc2NzYXFhcWBwYnJiMiBwYHFBcSMzI3Njc2JyYnJgcGAWOVu5RgWQECX2Oc8Gg/AgE+XtVnelA5FgEBJwsTJzzSlo8BGELvfUhCAQFESHRcWjsCB9kCAndul59vdgECAQyj05eIzmUxAQEiDRomAgEKFK6l1hjU/rZeVYB2VVwBAVI2AAABAM7//gO/BMoAEQBkQCYBEhJAEwkPEQAICwoKCwEABAoJAwIECAcFBwgCAQYICQgNAQEHRnYvNxgAPy88EP08EP0BLzz9PC88/TyHLg7EDvwOxAEuADEwAUlouQAHABJJaGGwQFJYOBE3uQAS/8A4WQE1IRUUBwY9ASEVAQYHIic0NwNs/bQpKQLx/rYMHyUEBgRRJkk0AgI4nIP74ScDJwgTAAMA4f/iA9EE6AAZACgANwBZQCMBODhAOQILADEECSEEDxoEFikEAjUGBR4GEy0GJRMFAQEJRnYvNxgAPy8v/RD9EP0BL/0v/S/9L/0uLgAxMAFJaLkACQA4SWhhsEBSWDgRN7kAOP/AOFkBFhcWBgcGJyYnJjcmJyYnJjc2NzYWFxYHBjc2JyYnJgYHBhcWFxY3NhM2JyYnJgcGBwYXFhcWNgMBzgEB3Zuda24BAdFbKDgBAWtokZHQAQE6KA0BUk5wcZwCAVVObWtPVBgBWVR5eFRYAQFYU3t6qgJ8YtGaywEBZWacy2gzOE9gj2JfAQHCkFxSOeRvSkcBAZBxakQ/AgFBRf4dd01IAQFKTHd5TksBAZoAAgEM/+ID/wTnACQAMgBTQB8BMzNANBAcACUrBBoIIwQQLwYCHwYWJwYMDBYBAQhGdi83GAA/LxD9EP0v/QEv/S88/S4ALi4xMAFJaLkACAAzSWhhsEBSWDgRN7kAM//AOFkBBgcGJyYnJicmNzYzMhMWFxYHBgcGBwYnJic0MzIWMzI3NjU0JwInJgcGFRQXFhcWNzYDqX/MXFBMKy0BAVphnPFpPwIBOFa5d4lXOBcDKRJSFt6QjBNX3XdLRENJdXVnGwK13wIBNzRVWmygcnz+8aTkrHWyXTwBASIOGScdmJbfKtIBVAIBZVt7eVlhAQF+IQAAAgAPAAAEowR3AAMAJAC2QFoBJSVAJgYgHREOAwAQDxADAwACEQgREh0dHhwcHQADAAEIJCMjJA4NDg8IDxAkIyMkCwUGFAUZHh0CAwEGIiQcGxIRDg0HBAYIAwAGEA8jIgMXFgkDCAEBGUZ2LzcYAD8XPD88Lzz9PBD9FzwQ/Rc8AS/9L/2HLg7ECPwIxIcuDsQO/AjEhy4IxAj8DsQIxAjEAS4uLi4uLgAxMAFJaLkAGQAlSWhhsEBSWDgRN7kAJf/AOFkBAyMDATIVFCMhIicmOwEDIQMzMhUUIyEiJyY7AQEjIicmMyEBA0fjHtwC/Tw8/tM1AgI5nHD95W6YPDz+0jQCAjhAAWryNQICOQGdAZAB0AJV/av+gikpKSkBLP7UKSkpKQPTKSn72wADAFMAAARABHcAGgAlADAAc0AzATExQDIPFg0EMCYlAxsEAQAgBAsrBA8lJAIDAQYGJyYaAwAGEzAvBhwbFBMBBwYDAQRGdi83GAA/PD88Lzz9PBD9FzwQ/Rc8AS/9L/0vPP0XPC4uLgAxMAFJaLkABAAxSWhhsEBSWDgRN7kAMf/AOFk3ESMiJyYzITIXFhcWBxYXFgcGIyEiJyY3NjMTITI3Njc2JyYjIREhMjc2NzYnJiMh+m41AgI5AgOKY2wBAaL2AQGgUV79mzUCAQ4LH8ABIr5JIAEBV0xj/rsBn51GHQECpk+G/tlSA9MpKU5UhpZdWsmqXzApEQwMAilxMjhfOzX8LXozOZBBHwABAHz/3wQzBJMAMABdQCUBMTFAMiAeACABAAQGBRcWBCsqCgcDEAYvGgYkLwMkAQMDASpGdi83GAA/Pz8Q/RD9EP0BLzz9PC88/TwuAC4uMTABSWi5ACoAMUloYbBAUlg4ETe5ADH/wDhZATU0NzYdARQHBgcGJyYnJiciBwYHBh0BFBIXFjc2MzIXFgcGBwYnJicmPQE0PgE3NgPBKSkMCxIlBAdScJJLTFItgv+6wZ4SEyYBASui3aWDLEZzhd2FxwQGOjUCAjnkGhELAQIzUz9WAR4gNpyoj7v+9gEBuRUmFi+yAgFgIVaOqKeD9oQBAgAAAgCYAAAEWwR3ABUAJABjQCkBJSVAJgsTBCQWBAEAHh0EDAskIwIDAQYGFxYVAwAGEBEQAQcGAwEERnYvNxgAPzw/PBD9FzwQ/Rc8AS88/TwvPP08Li4AMTABSWi5AAQAJUloYbBAUlg4ETe5ACX/wDhZJREjIicmMyEyFxYdARAHBiMhIicmOwEhMjc2NzY9ATQnLgEjIQEWRTUCAjkBucl3kfFegv5HNQICOZcBKmhcVDEufCmPQ/7WUgPTKSmNq8tx/uGkQCkpRD5jXV2Vk5kyQQABAFQAAAQWBHcAKwCaQEoBLCxALQcUCwMCBAgHHx4BAwAEERAdHAQYFysqIQMgBCYlIxgfKBgABQcIGgcWEA8CAwEGCB4dEgMRBhYrAAYgHxcWAwkIAQELRnYvNxgAPzw/PC88/TwQ/Rc8EP0XPBD9EP0Q/RD9AS88/Rc8Lzz9PC88/Rc8Lzz9PC4uADEwAUlouQALACxJaGGwQFJYOBE3uQAs/8A4WQERITU0NzYVESEiJyY3NjsBESMiJyYzIREUBwY9ASERITU0NzYVERQHBj0BAU0Cdykp/Hc1AgEOCx9ubjUCAjkDXikp/bQBJiopKSoCKP4q8jUCAjn+vCkRDAwD0ykp/uU0AgI4yf5VXTQCAjj+9DUCAjldAAEAmQAABFkEdwApAI9ARAEqKkArEwIFDgcpKBsDGgQLChkYBBQTJyYdAxwEIiEfGBskGCcWBxIpCgkDAAYEGhkMAwsGEignBhwbExIDBQQBAQdGdi83GAA/PD88Lzz9PBD9FzwQ/Rc8EP0Q/RD9AS88/Rc8Lzz9PC88/Rc8Lzz9ADEwAUlouQAHACpJaGGwQFJYOBE3uQAq/8A4WSUyFRQjISInJjsBESMiJyY3NjMhERQHBj0BIREhNTQ3NhURFAciPQEhEQKmPDz+LDUCAjlubjUCARcKFwOHKSr9jAEmKikpKv7aUikpKSkD0ykZCwX+5TQCAjjJ/lVdNAICOP70MQY3Xf4qAAEAff/fBGoEkgA4AHFAMgE5OUA6AhQzMjYFAiwrBA0MIwQdHAYDBSEHGjgABjQzBQMEMAYIJwYSGgMSAwgBAQxGdi83GAA/Pz8Q/RD9Lxc8/TwQ/QEvFzz9Lzz9PC/9Li4ALjEwAUlouQAMADlJaGGwQFJYOBE3uQA5/8A4WQEyFRQrAREGBwYnJj0BNDc+ATc2FzQ3Njc2NzIdARQHBgcGJyYnJiMiBwYdARQXFjMyNxEhIicmMwQuPDwYvLn2lZlBROeLwo0DAgwHEikMDBEkBAd5XmzviDWDfdaIlv7mNQICOQH6KSn+oGcBAYuP9ZeKe4GFAQFtLwoGCwUDN7oaEQoBAjRbNyvtXHKW1HZyRgEwKCoAAQBmAAAEVAR3ADMAmEBOATQ0QDUoBwUCEwIFDiEFHC0cBSgzMhcDFgQLCjEwGQMYBCUkMzAvJiUKCQcABgQkIxoZFhUMBwsGEDIxBhgXHx4RAxADKyoFAwQBAQdGdi83GAA/Fzw/FzwvPP08EP0XPBD9FzwBLzz9FzwvPP0XPC/9PBD9L/08EP0AMTABSWi5AAcANEloYbBAUlg4ETe5ADT/wDhZJTIVFCMhIicmOwERIyI1NDsBMhUUKwERIREjIicmOwEyFRQrAREzMhUUIyEiJyY7AREhEQG3PDz+6DUCAjldMzc37jw8aQIgbTUCAjnvPDwvVzw8/uk1AgI5bf3gUikpKSkD0ykpKSn+VgGqKSkpKfwtKSkpKQHX/ikAAQDeAAAD0gR3ABcAZEAqARgYQBkCCQISBRUOEhEGBQQSERMSBQMEBgAREAcDBgYLDAsBFwADAQ5Gdi83GAA/PD88EP0XPBD9FzwBLzz9PBD9PBD9PAAxMAFJaLkADgAYSWhhsEBSWDgRN7kAGP/AOFkBMhUUIyERITIVFCMhIicmMyERISInJjMDljw8/uwBFDw8/YA0AgI4ARr+5jQCAjgEdykp/C0pKSkpA9MpKQABAKf/3gSTBHcAHwBdQCUBICBAIQIOHQISEwQMCxoZBAYFGxoFAwQGABUGCQkBHwADAQtGdi83GAA/PD8Q/RD9FzwBLzz9PC88/TwuLgAuMTABSWi5AAsAIEloYbBAUlg4ETe5ACD/wDhZATIVFCsBERQGBwYnETQ3NhcWFQMWFxY3NjURISInJjMEVzw8vtqfr8opDRANAZeQq1Ip/r82AgI6BHcpKf0rntEBArcBLzUCAQ0NHv74iQECkklFAtUpKQAAAQBVAAAEfQR3ADgAmEBJATk5QDocIwYcEwcjExIkCCQlBwYGBygCBTYtCgUPJSQGAwUEMzI0MxIRCAcFBwQGADIxJiUaBRkGHisqHwMeATgNDAMAAwEtRnYvNxgAPxc8Pxc8EP0XPBD9FzwBLzz9Fzwv/S88/TyHLg7ECPwOxA7EDsQBLi4uAC4uMTABSWi5AC0AOUloYbBAUlg4ETe5ADn/wDhZATIVFCsBEQEjIicmOwEyFRQrAQEWFxYXFhczMhUUKwECJyYnBxEzMhUUIyEiJyY3NjsBESMiJyYzAeE8PJMCNlk2AgI67Dw8HP48aUU7PihZYjw8mYJXUoqlkzw8/q01AgEOCx9ubjUCAjkEdykp/gcB+SkpKSn+bCpDOm5H4ykpAWBlYC+V/pMpKSkRDAwD0ykpAAABAHsAAAQ+BHcAGQBwQDEBGhpAGwwCEAUXEBATCAcEDQwGBQQUEwoHDRUUBQMEBgATEgcDBgYNDg0BGQADARBGdi83GAA/PD88EP0XPBD9FzwQ/QEvPP08Lzz9PBD9PBD9ADEwAUlouQAQABpJaGGwQFJYOBE3uQAa/8A4WQEyFRQrAREhETQ3NhURISInJjsBESMiJyYzAog8PL4CISop/HY1AgI5w8M1AgI5BHcpKfwtAUY1AgI5/mgpKQPTKSkAAAEAFQAABKQEdwAuAKpAVgEvL0AwCS0XFikCLSwtLgguABYVFRYsKywtCC0uGBcXGBAFCR0FIhQTBAYFGhkEJiUnJhkYFRQFBwQGACUkGxoTEgcHBgYLIB8MAwsBLiwrAwADASJGdi83GAA/Fzw/FzwQ/Rc8EP0XPAEvPP08Lzz9PC/9L/2HLg7ECPwIxIcuDsQI/AjEAS4uAC4uLjEwAUlouQAiAC9JaGGwQFJYOBE3uQAv/8A4WQEyFRQrAREzMhUUIyEiJyYnNDsBESMBIwEjETMyFRQjISInJjsBESMiJyY7AQkBBFY8PC9BPDz+1hsPCwM4lxH+yl3+xBCTPDz+1jUCAjlFMzUCAjnJATYBMgR3KSn8LSkpDAsSKQPT/TICzvwtKSkpKQPTKSn9PQLDAAEAKwAABGYEdwAkAI9ARQElJUAmAh4IGgcGBwgICAkeHh8dHR4MBREiBQIJCAQXFh8eBAYFIB8YFwUFBAYAFhUKAwkGBg8OBwMGASQdHAMAAwEaRnYvNxgAPxc8Pxc8EP0XPBD9FzwBLzz9PC88/Twv/S/9hy4IxAj8CMQBLgAuLjEwAUlouQAaACVJaGGwQFJYOBE3uQAl/8A4WQEyFRQrAREjAREzMhUUIyEiJyY3NjsBESMiJyY7AQERIyInJjMEKjw8QGr9pJM8PP7XNgIBDgsgRG41AgI51gJelzUCAjkEdykp+9sD/vxUKSkpEQwMA9MpKfv/A68pKQAAAgBm/98ETwSSABMAIwBHQBkBJCRAJQAcBAoUBAAgBgYYBg4OAwYBAQpGdi83GAA/PxD9EP0BL/0v/QAxMAFJaLkACgAkSWhhsEBSWDgRN7kAJP/AOFkBFgcGBwYHBicmNTQ3Njc2FxYXFgc0JyYnJgcGFRQXFhcWNzYETgE+QntyiOKQgoKP4412bkBCUmx4vb15bGt4v715awI4nYiSU00BAcGv6euuvwEBVU+FiqfFmKkBAauYxceWqAEBqpYAAgCtAAAEQgR3AAwAKgBvQDEBKytALCQPBR0UBwQkKikMAwAEGhkbGgwDCwYfKhkYAw0GEQEABikoIB8DEhEBARRGdi83GAA/PD88Lzz9PBD9FzwQ/Rc8AS88/Rc8L/0vPP0AMTABSWi5ABQAK0loYbBAUlg4ETe5ACv/wDhZASEyNzY3Njc2JyYjIQEyFRQjISInJjc2OwERIyInJjMhMhcWFxYHBiMhEQGmAQZUTVQpJAEBXVZz/twBFDw8/is0AgEOCx5vbzQCAjgB3ZttdgEBd4Oh/v8CJyMmQjo+b0lD/C0pKSkRDAwD0ykpV1+Xmlli/n0AAgBm/xYETwSRAC8APwBuQCwBQEBAQSwbCwEgHQEfIAgBAAABOAQkMAQNLDwHFQcGEQMGFTQGKBEoAwEkRnYvNxgAPy8Q/S/9EP0Q/QEvPP0v/YcuDsQO/A7EAS4uLgAuLi4xMAFJaLkAJABASWhhsEBSWDgRN7kAQP/AOFkFBzY3NhcWFxY3NjM2FxYHBgcGJyYnJgcGBwYHIic0PwEmJyY1NDc2MzIXFhcWBwYTNCcmJyYHBhUUFxYXFjc2AmNtWytRWDohNkcZDycBAWgzOCtTViktSWI9BxUnARa3um5kgo/j4o+CAQGBjLlseL29eWxrd8C9eGwgUg8BASAVAQEvEQEqIi4XAQEaGgEBDBASAgIqFBCDLrKiy+qvwMGv6eWvvgJSxZipAQGqmMbGl6gBAaqZAAIAVAAABKIEdwAMADYAeUA4ATc3QDgPMg8bBSkgBwQwGBcMAwAEJiUnJgwDCwYrNiUkGRgFDQYRAQAGFxYsKwMeHRIDEQEBIEZ2LzcYAD8XPD88Lzz9PBD9FzwQ/Rc8AS88/Rc8L/0vPP0uLgAxMAFJaLkAIAA3SWhhsEBSWDgRN7kAN//AOFkBMzI3Njc2NzYnJiMhATIVFCsBJicmJyERMzIVFCMhIicmNzY7AREjIicmMyEyFxYXFgUWFxYXAU3gW1VjLicBAV9YZf7SAxk8PGlzPXGK/vuTPDz+rTUCAQ4LH25uNQICOQHwkGlxAQL+5GtcJ3ACUB8kQDc0YkVA/C0pKdBSmET+VCkpKREMDAPTKSlVW43EY0qCN74AAAEAtf/fA/0EkgA/AGpALQFAQEBBGiggAAEABAYFISAEJiUyBBoSBDoIBwMOBj4uBh4+AyMBHgEDAwElRnYvNxgAPz8/PxD9EP0Q/QEv/S/9Lzz9PC88/TwALi4uMTABSWi5ACUAQEloYbBAUlg4ETe5AED/wDhZATU0NzYdARQHBicmJyYnJgcGBwYXFhcWFxYXFgcGBwYnFRQHBj0BNDc2FxYXFhcWNzY3NicmJyYnJicmNzY3NgN+KSkpJgMGYFNsdFRfAQGnIXGuOasBAYR0qdSBKSkpJgMHcl99gl9sAQGJLZewU3oCAnZqmakEJRs1AgI50TUCAjRlOzQBAjtBcIg7DBMeGk+5ol5SAQGHLzUCAjniMgYCNHNCNwEBQEl8hT0UGh4zS5SUWE4BAQABAIwAAAQjBHcAIQB5QDYBIiJAIxUCECAHEAohIAQLCg0MBBQTHx4EFhUaEQcUIQoJAwAGBCAfDAMLBhQVFAMFBAEBE0Z2LzcYAD88PzwQ/Rc8EP0XPBD9PAEvPP08Lzz9PC88/TwQ/RD9ADEwAUlouQATACJJaGGwQFJYOBE3uQAi/8A4WSUyFRQjISInJjsBESERFAcGBwY1ESERFAcGBwYnJjURIREDUDw8/gk1AgI51f6wDAsSKQOXDAsSDxAK/rBSKSkpKQPT/uMaEQsBAjkBb/6RGhELAQENDB8BHfwtAAABABAAAASiBHcAIwCBQDsBJCRAJQIZGBoXGRoIGhsGBgcFBQYXFhcYCAgHBwgUBQ8hBQIbGhcWCQgFBwQGAAcGASMSEQMAAwEPRnYvNxgAPxc8PzwQ/Rc8AS/9L/2HLg7EDvwIxIcuCMQI/A7EAS4uAC4uMTABSWi5AA8AJEloYbBAUlg4ETe5ACT/wDhZATIVFCsBASMBIyInJicmJzQzITIVFCsBATMBIyInJicmJzQzBGY8PDv+anL+Y0AUDAQNAwI2AS08PJgBfQUBeJwVDAQNAwI3BHcpKfvbBCUDAg0JDikpKfwtA9MDAg0HECkAAAEAIgAABIgEdwAgALlAXwEhIUAiEhgJCAcGCgUYFxgZCBkaBwcIBgYHCQgJCggKCxYWFxUVFgUEBQYIBgcbGhobFxYXGAgYGQkJCggICQ0FEgIFHhwbFRQLCgUHBAYAGhkXAxYBIBAPAwADAR5Gdi83GAA/Fzw/FzwQ/Rc8AS/9L/2HLgjECPwIxIcuDsQI/AjEhy4IxAj8CMSHLgjECPwIxAEuLgAuLi4uLjEwAUlouQAeACFJaGGwQFJYOBE3uQAh/8A4WQEyFRQrARsBMxsBIyInJjMhMhUUKwEDIwsBIwMjIicmMwGHPDy7bd1+5GrANQICOQEqPDwacoHo5IF5HjUCAjkEdykp/DkDHPzkA8cpKSkp+9sDLPzUBCUpKQAAAQDQAAAD5gR3ABUAg0A6ARYWQBcADw4NAwIBDg0ODwgPEAMDBAICAwUEBAwLERAEFQATBwAJBwwQDwYABAMGDA0MAwEAAQEBRnYvNxgAPzw/PBD9PBD9PBD9EP0BLzz9PC88/TyHLgjECPwIxAEuLi4uLi4AMTABSWi5AAEAFkloYbBAUlg4ETe5ABb/wDhZKQE1ASEVFAcGBwY1ESEVASERNDcyFQPm/OoCmv3eDAsTKQLE/WYCdSkpdwOu8hoRCwECOQFEdfxQAR4yBjgAAAIAjP/fBDwDbAAMADcAb0AxATg4QDkPKiETLA8EACIhExIMBQAENzYGBBkCBh03DQYRCgYVJgYyMgIVARIRAQEZRnYvNxgAPzw/PxD9EP0Q/Twv/QEv/S88/Rc8EP0uAC4uLjEwAUlouQAZADhJaGGwQFJYOBE3uQA4/8A4WQEmJyYHBgcGFxYzMjcXMhUUKwE1BgcGJyYnJjc2NzYXFhc1NCcmJyYHBgciJyY3Njc2NzYXFhURA0RqmLBnSwEBST1eybm8PDy8s8uDVWABAZN0pjZFYi5WQmJbshMVJAIBMgVCmE99X20BmB8BAk85UFkvKLKSKSl2lQEBP0Z+mE8/AgEICwyFWCwiAQE5BgMpGhUCESgBAT1Hd/3hAAACACr/4AQ+BMoAGwAoAHJAMgEpKUAqBgwBGRAEACINDAEEAAQWFRwEBiUGChUUBg0XFgYAHwYDGwAODQEKAQMCARBGdi83GAA/Pz88LzwQ/RD9PBD9PBD9AS/9Lzz9FzwQ/TwALi4xMAFJaLkAEAApSWhhsEBSWDgRN7kAKf/AOFkBETYzMhIXFgcGIyInFSMiJyY3NjsBESMiJyYzATYmJyYGBwYWFxY3NgEjk9O99gEBen2+1ZHANQIBDgsfbm41AgI5A4gBzZiZyQEByZuZZ2MEyv3gwf78vr+Dh8GhKREMDAQlKin825nZAQHZm5zVAgJvawABAKj/4AQyA2sAKABZQCMBKSlAKh0bAB0BAAQIBxMEJAoHBRAGJxcGIScCIQEFAgEkRnYvNxgAPz8/EP0Q/RD9AS/9Lzz9PC4ALi4xMAFJaLkAJAApSWhhsEBSWDgRN7kAKf/AOFkBNTQ3NjcyHQEUBwYnJicmIyIGBwYXFjMyNzY3MhUUBwYjIiY1NAAzMgOvDAoTKiokBQpxXGqpygEBamen2pwSEidincbK+wEAy7wC+xsbEAoDOLo1AgIzXjctzqqmZWOUEQMnKkFo9crMAQAAAAIAev/fBJEEygAaACcAdUA0ASgoQCkEFAgEBAcYBAAbFRQIBAcEAQAhBA4CAQYGJAYKFhUGAB4GEhoAEgIKAQcGAQEORnYvNxgAPzw/Py88EP0Q/TwQ/RD9PAEv/S88/Rc8EP0Q/QAuLjEwAUlouQAOAChJaGGwQFJYOBE3uQAo/8A4WQERMzIXFisBNQYHBicmJyY+ATc2FxEjIicmMxM0JicmBgcGFhcWNzYD6m02AgI6wI3d/Xo6AQF1yXbUlW02AgI6bcmbnMkBAcucmmZkBMr7iCkpo8IBAeRtdXbUewEBxAHPKin825zWAQHXnZ3VAQFuawAAAgB9/+AEFgNrAB4AJgBUQB8BJydAKA0LJh8XDQEAAQAGJh8FBhMjBhsbAhMBARdGdi83GAA/PxD9EP0vPP08AS4uLi4uLgAuMTABSWi5ABcAJ0loYbBAUlg4ETe5ACf/wDhZASEWFxYXFjc2NzYzMhcUBwYHBiMiJyY1NDc2MzIXFgcmJyYjIgYHBBT8vBVwbahaYms+Eg4jBFc7P3Br04uPh4LD0X17URhqZ4+SyxsBk6VeXQEBHR8zDyknLR4TIYGF0sF7d4WBf4tVUqOPAAEA0QAABEAEygAwAHVANQExMUAyICIuIBIJBCsqAQMABBYVDwMODg0CAwEGBjAQDwMABhQmBhoaLCsVAxQCBwYBAQlGdi83GAA/PD8XPC8Q/RD9FzwQ/Rc8AS8XPP0XPC4uLi4uAC4xMAFJaLkACQAxSWhhsEBSWDgRN7kAMf/AOFkBESEyFxQjISInJjc2OwERIyInJjsBNTQ3NjMyFxYXFhcUByInJicmBwYdASEyFxYjAiIBaDEGN/1/NQIBDgsfxrIxBgI5smBXfHeBJwgUAysGFKJXWD9JAYA0AgI4Avv9VykpKREMDAKpKil8eEhAFgcDCRwmAgMWAQEqMFR8KikAAgB5/ocEZQNsACUAMgBwQDEBMzNANAQbABEEBAAmGxoBBAAECAcsBCEHBgYBFRYGDi8GHSkGJCQCDw4AAgECASFGdi83GAA/PD88PxD9L/0Q/TwQ/TwBL/0vPP0XPBD9LgAuLjEwAUlouQAhADNJaGGwQFJYOBE3uQAz/8A4WQE1MzIXFisBERQHBgcGKwEiJyY3NjMXFjc2PQEGIyInJicmNjc2EzYmJyYGBwYWFxY3NgNswDUCAjluIxg2ZnboNQIBDgsf65ZMFoTQsXd1AQHtss6GAcKPkL4BAb6SkWBeAreXKin8zFJALC1VKRIMDAEBkys99rR+e7Kz9wEB/lSPyAEByJGSxQEBZWIAAQBRAAAEVATKADAAiUBCATExQDILASIQACcQKgsQBxIQFS4EABYVBAgHHx4BAwAEKyoqKSAfFRQJBwgGDRoGAywrBgAwACUkDgMNAQMCAS5Gdi83GAA/Pxc8LzwQ/TwQ/RD9FzwBLzz9FzwvPP08EP0Q/RD9EP0Q/QAuMTABSWi5AC4AMUloYbBAUlg4ETe5ADH/wDhZARE2NzYXFhURMzIXFiMhIicmJzQ7ARE0JyYnJgcGBxEzMhcWIyEiJyY7AREjIicmMwFKj6i6WC1cNAICOP71Gw8LAzhcSUJnWEIpbl01AgI5/vQ0AgI4XW41AgI5BMr+B5kBAYtHS/4DKSkMCxIpAfdkODMBAS0cd/34KSkpKQQlKikAAgC3AAAD/gTzAAMAGAB1QDMBGRlAGggIDgQNDhABAAQDAhYFBAUEBBEQAgEHABAPBgMFBgoSEQYEAwALCgEYBAIBDUZ2LzcYAD88PzwvPBD9PBD9FzwQ/TwBLzz9PBD9Lzz9PBD9EP0AMTABSWi5AA0AGUloYbBAUlg4ETe5ABn/wDhZARUjNRMRITIXFiMhIicmMyERIyInJicmMwKBeXwBQjYBATj9KTQCAjgBQ/AcDwsBAjkE89TU/lv9BCkpKSkCqQsLEyoAAAIArv6HAyUE8wADABgAaUArARkZQBoKEgcFCgMCBAEAGAQECwoCAQcABQQGCRQVBg8DABAPAAoJAgESRnYvNxgAPzw/PC88EP08EP08EP08AS88/TwvPP08EP0uADEwAUlouQASABlJaGGwQFJYOBE3uQAZ/8A4WQEVIzUTISInJjMhERQHBiMhIicmMwUyNjUCznl+/hg0AgI4AjqsOlT++zQCAjgBA2mBBPPU1P4IKin8eMlYHikqAYVoAAABALkAAAR6BMoAKwC3QFsBLCxALSIrDyoeEA8ODxAIKyorHh4fAAABHR0AHh0eHwgrKwAqKisTBRonBSILBAQADw4BAwAECAcqKSAfBwUGBgEJCAYNHRwRAxAGFQ4NFhUCJSQCAwEBAQRGdi83GAA/Fzw/PC88EP0XPBD9PBD9FzwBLzz9FzwQ/Twv/S/9hy4IxA78CMSHLgjECMQIxA78CMQBLi4uAC4uMTABSWi5AAQALEloYbBAUlg4ETe5ACz/wDhZAREjIicmOwERIyInJjsBEQEjIicmMyEyFxYXFisBCQEzMhcWIyEiJyY7AQEBssE0AgI4b280AgI4wQFcKjQCAjgBBxsQDAECOl/+wAGVXzYCAjr+9jQCAjg6/p8Bbf6TKSkEJSop/QwBJSkqDAwSKf70/mMpKSkpAWoAAAEAtQAAA/4EygASAGBAJwETE0AUBAQOAAkODBAFAAEABA0MDAsCAwEGBg4NBgASAAcGAQEJRnYvNxgAPzwvPBD9PBD9FzwBLzz9PBD9EP0Q/QAxMAFJaLkACQATSWhhsEBSWDgRN7kAE//AOFkBESEyFxYjISInJjMhESMiJyYzAoIBQjYCAjr9KTQCAjgBQ+01AgI5BMr7iCkpKSkEJSopAAEAFAAABKUDbAA4AJhASwE5OUA6DzQFKhAADwQSHAQfNi8EABMSBAwLIB8EGRgnJgEDAAQzMjIxKCcaGQ0HDAYRJBYGAzMBBgAtLB8eEgURAQcDAjgAAgEvRnYvNxgAPzw/PD8XPBD9PBD9PBD9FzwBLzz9FzwvPP08Lzz9PBD9PBD9EP0Q/QAuLjEwAUlouQAvADlJaGGwQFJYOBE3uQA5/8A4WRMVNjc2FzY3NhcWFREzMhcWKwERNCYnJgcRMzIXFisBETQnJicmBxEzMhcWKwEiNTQ7AREjIicmM+NoanxDbHRWN0ZFNQICOZhGOGJuRTUCAjmYIiU2YHNFNQICOd02NkZGNQEBNwNOU28BAYmHAQE7Slj9wykpAoc5VwEBp/3gKSkCgjgsMAIDqf3gKSkpKQKpKikAAQBnAAAEPQNuADIAikBDATMzQDQNAQ0QCRIQFyQQACkQLDAEABgXBAoJISABAwAELSwsKyIhFxYLBwoGDxwGBS4tBgAnJhADDwEFAjIAAgEpRnYvNxgAPzw/Pxc8EP08EP0Q/Rc8AS88/Rc8Lzz9PBD9EP0Q/RD9EP0ALjEwAUlouQApADNJaGGwQFJYOBE3uQAz/8A4WQEVNjc2NzYXFhURMzIXFCsBIicmNzY7ARE0JyYnJgcGBxEzMhcWIyEiJyY7AREjIicmMwFPUjlLYbhYK0UxBjfbNgIBDgsgREdBYWFQLVldNAICOP70NQICOV1FNQICOQNOfFIeJwIDkEZB/fspKSkRDAwB9146NgEBOyFo/f0pKSkpAqkqKQAAAgCM/98EJANsAAwAGQBHQBkBGhpAGwATBAYNBAAXBgMQBgoKAgMBAQZGdi83GAA/PxD9EP0BL/0v/QAxMAFJaLkABgAaSWhhsEBSWDgRN7kAGv/AOFkBFgAHBgAnJjc2NzYABzYmIyIGBwYXFhcWNgQjAf73wsX+/AIChoPEvwEKUgHan6DWAgJua6Gg1wGlwf79AQEBAcXDgn8CAf74v5/U06CgamgBAdQAAAIAKv6HBD4DbAAfACsAeUA3ASwsQC0IDQERBRYdFgQAJg4NAQQABBoZIAQIKQYLGRgPAw4GExsaBgAjBgMUEwADAh8AAgEWRnYvNxgAPzw/PzwQ/RD9PBD9Fzwv/QEv/S88/Rc8EP08EP0ALi4xMAFJaLkAFgAsSWhhsEBSWDgRN7kALP/AOFkBFTY3NhceARcWBiMiJxEzMhcWIyEiJyY7AREjIicmMwE2JicmBgcGFhcWNgEjk9B4ZWlwAQH9utmLxzUCAjn+eTUCAjlubjUCAjkDhwHQlJTOAgLQlpTOA06WsQIBODrObLnysv4SKSkpKQQiKin+cpPEAQHFlJXCAQHGAAABAKUAAARAA2IAJQBtQC4BJiZAJwkfHgsBHBcJIwUAFBMBAwAEIB8RBgUVFAYZISAGABoZAQUCJQACARxGdi83GAA/PD8/PBD9PBD9PBD9AS88/Rc8EP0uLi4ALi4uLjEwAUlouQAcACZJaGGwQFJYOBE3uQAm/8A4WQEVNjc2NzIXFhcUByInJicmJyYBESEyFxYjISInJjsBESMiJyYzAfZ3OnReMUVMBSsGCwkQOjNs/uQBazYCAjr9fTUCAjnGlzUCAjkDTs9qKFABJiosKgEDBxA6AQP/AP4/KSkoJwKsKikAAAEAyv/fA+cDbQA/AGNAKQFAQEBBGyEPKCcFBDQEGxMEOgcHAioHJQAGPjAGHz4CJQEfAQICASdGdi83GAA/Pz8/EP0Q/RD9EP0BL/0v/S4uLi4ALi4xMAFJaLkAJwBASWhhsEBSWDgRN7kAQP/AOFkBNDc2HQEUBwYnJicmJyYnJgcGBwYXFhcWFxYXFgcGBwYnFAcGBwY9ATQ3NhcWFxYXFjc2NzYlJicmJyY3Njc2A2cpKioNDwoDCl9HYIZQOQEBRi2EtDq6AQGKbJbBfgQHHikpIggLDE3XcFd0AQH+0aY/jAEBfWGCqQMYNAICOo00AgELChpSJx0BATkpNDkpGw8VFUSeiEk5AQFjHg0WAQE4qTQCAis/EGsBASYyYpUhEhk3g3Q/MQECAAEAjf/fBCIEeQAnAGVALAEoKEApDw0dDwMnBwYDAAQhIBoDGRsaBgMFBgAJBhUlAxUBIB8BAwACAR1Gdi83GAA/Fzw/PxD9EP0XPAEvFzz9FzwuLi4ALjEwAUlouQAdAChJaGGwQFJYOBE3uQAo/8A4WQEhMhcWIyERFBcWNzY3MhUUBwYHBgcGJyY1ESMiJyY7ATU0NzY3NhUBsAG9NQICOf5D4MCKERAnDS2JdlODVWGYNAICOJgLCxMqA04qKf3epQICUwoDKQ8NLSEcAQE6Qn4CIiop8hsOCwMCOQAAAQBX/98EPwNOACEAfEA5ASIiQCMfARgFGx8EAAsEDhUUAQMABBwbDw4ECAcSBgMWFQkDCAYNHRwGABsaDgMNAgMBIQABAQtGdi83GAA/PD8/FzwQ/TwQ/Rc8EP0BLzz9PC88/Rc8EP0Q/RD9AC4xMAFJaLkACwAiSWhhsEBSWDgRN7kAIv/AOFkhNQYHBicmNREjIicmOwERFBYzMjcRIyInJjsBETMyFxQjA3GmxXg/UW41AgI5wGJQxqmYNAICOOpFMQY3eJcBAUJUdAISKin9m1FmtwISKin9BCkpAAABADgAAAR5A04AGwCEQD0BHBxAHRgQDQ8QCBARAAABGxsADQwNDggCAQECCgUFEwUYDw4GABsaERANDAMHAgYHFhUIAwcCAQABAQVGdi83GAA/PD8XPBD9FzwQ/TwBL/0v/YcuDsQO/AjEhy4IxAj8DsQBLi4AMTABSWi5AAUAHEloYbBAUlg4ETe5ABz/wDhZISMBIyInJjMhMhcWKwEBMwEjIicmMyEyFxYrAQKgi/6vVDQCAjgBNDUCAjmIAS0kASeJNAICOAE1NQICOVMC+yopKin9VwKpKikqKQABADX//wR7A04AJACzQFoBJSVAJiEUExIRAhUQAgECAwgDBBIRERIUExQVCBUWAAABJCQAEA8QEQgREgUEBAUBAAECCAIDFBQVExMUDQUIGgUhJCMWFRAPBgcFBgodHAsDCgIDAQEBCEZ2LzcYAD88Pxc8EP0XPAEv/S/9hy4IxAj8CMSHLg7ECPwIxIcuCMQI/AjEhy4OxAj8CMQBLi4ALi4uLi4xMAFJaLkACAAlSWhhsEBSWDgRN7kAJf/AOFkhBwsBJwMjIicmOwEyFxYrARsBMxsBIyInJicmOwEyFxYXFisBA3NmtLRmqig0AgI44jUCAjlpkq9htIxoHA8LAQI54RsQDAECOicBAg/98QEC+yopKin9dQII/fgCiwsLFCkMDBIpAAEAYwAABFADTgA5AMtAZQE6OkA7BSoOKykcDw0ADg0OAAABOQ8IDxAqKSocHB0rGxsrHBscDg4PDQwNHQgqKisAOQABKSkBCgUFFwUSEiYFITAFNRAPDQMMBgcsKykDKAYjNwYjMzIkAyMCFRQIAwcBARdGdi83GAA/Fzw/FzwQ/RD9FzwQ/Rc8AS/9L/08EP0v/YcuDsQIxAjEDvwIxAjECMSHLg7ECMQIxAj8DsQIxAjEAS4uLi4uLgAuLjEwAUlouQAXADpJaGGwQFJYOBE3uQA6/8A4WQkBMhcWFxQjISInJjsBCQEzMhcWIyEiJzQ3NjcJASInJic0OwEyFxYrAQkBIyInJicmOwEyFxYHBgcCkAF4IwwVBDj++DUCAjmI/sH+wok1AgI5/vU0AgYLNQF4/rIwDgMDN+A1AgI5YgEVARZiHA8LAQI54DUCARoEKAG6/pgEBx4pKSkBMv7OKSkpBRIPAwFoAUESCw0pKin+9QELCwsUKSoYDQEDAAEA5wAAA9YDTgAUAIFAOAEVFUAWCQ0MCwIBAAECCAIDDQ0ODAwNBAMECQoPDgQUEwYHChEHAAMCBgoODQYACwoBFAACAQtGdi83GAA/PD88EP08EP08EP0Q/QEvPP08Lzz9PIcuCMQI/A7EAS4uLi4uLgAxMAFJaLkACwAVSWhhsEBSWDgRN7kAFf/AOFkBFQEhNTQ3NhYVByE1ASEVFAcGPQEDv/2aAiopFhQB/RICZP4CKSoDTkr9TnE1AgEhF8NJArJwNAICOMMAAAEA6v6IBAsEywA5AGJAKAE6OkA7EhoYBRIOBCw5AAQFBCQEEjIEDCAGFCoGLjUGCQkCFAEBBEZ2LzcYAD8vLxD9L/0Q/QEv/S/9Lzz9PC/9EP0ALjEwAUlouQAEADpJaGGwQFJYOBE3uQA6/8A4WQEUIyI1ETQ3Njc2FhcWBxYXFhcSBQYnJic0NzIXFhcWMzI3NicmJyYnJicmJyYzNjc2NzYmJyYHBhUBPCooXVV4g60CAXZ2MJEBAv68elBaASkQDQgEFb95PjkCA2grVjFoOAICL384GAEBg151QCP+vjY2BQl1SUQBAaeCeFIqKHnI/p0CATk/dioEDAcdmU9Ie6VXIyoYAQEpKQFXJi5ddAEBTys3AP//AI7/4AQjBLAAJgBSAAAABgDoAAD//wBZ/+AEPwSwACYAWAAAAAYA6AAAAAIBNgQOA3oEsQAIABMAP0ATARQUQBUJAAQEDwQJEQYLAgEERnYvNxgALzwvPAEv/S/9ADEwAUlouQAEABRJaGGwQFJYOBE3uQAU/8A4WQEUBwYnJjc2FgUUBwYnJic0NzYWAddQTQICUSAwAaNQHhsUA1AgMARgTAMDUk4CATEgSwQBGBchTgIBMQAAAQAAAAEAANdCRmNfDzz1AAAH0AAAAAC08qznAAAAALTyrOcAAP4MBaAGpAAAAAsAAgABAAAAAQAABqT+DAAABLAAAP8QBaAAAQAAAAAAAAAAAAAAAAAAAO0EsACWAAAAAASwAAAEsAAABLAB6QSwANQEsABGBLAA3wSwAEwEsAD3BLABqASwAi8EsAFnBLAA4QSwAA0EsAHpBLAAAASwAekEsADbBLAA4ASwAN0EsACnBLAAvgSwANEEsAC/BLABCwSwAM4EsADhBLABDASwAekEsAHpBLAAWgSwAFoEsABZBLABCQSwANIEsAAPBLAAUwSwAHwEsACYBLAAVASwAJkEsAB9BLAAZgSwAN4EsACnBLAAVQSwAHsEsAAVBLAAKwSwAGYEsACtBLAAZgSwAFQEsAC1BLAAjASwAFEEsAAQBLAAIgSwAE4EsABfBLAA0ASwAi8EsADrBLAAuQSwAN8EsAAEBLABhASwAIwEsAAqBLAAqASwAHoEsAB9BLAA0QSwAHkEsABRBLAAtwSwAK4EsAC5BLAAtQSwABQEsABnBLAAjASwACoEsAB9BLAApQSwAMoEsACNBLAAVwSwADgEsAA1BLAAYwSwAJEEsADnBLABjQSwAi8EsAC5BLAAxASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAC1BLAAAASwABEEsACWBLAAlgSwAFcEsABXBLAAUASwAFkEsABaBLAAWgSwAWUEsAA7BLAAAASwAAoEsACiBLAAygSwAHwEsAASBLAAYgSwAGYEsABhBLAAAASwAA0EsACQBLAAYgSwAMAEsABWBLAAAASwABsEsAA7BLAAYASwAEMEsACxBLAAHgSwAMkEsAFOBLAAhwSwASAEsAAABLAArwSwALYEsACaBLAAUQSwAKcEsAGyBLABPgSwAGYEsADGBLAAqwSwAHoEsABVBLAAeASwAEAEsAARBLAAEQSwABEEsAARBLAAEQSwABEEsAAQBLAAfASwAFYEsABWBLAAVgSwAFYEsADgBLAA4ASwAOAEsADgBLAADASwAC0EsABmBLAAZgSwAGYEsABmBLAAZgSwAEIEsABNBLAAUgSwAFIEsABSBLAAUgSwAGEEsACTBLAA6gSwAI0EsACNBLAAjQSwAI0EsACNBLAAjQSwAA8EsACoBLAAfQSwAH0EsAB9BLAAfQSwALkEsAC5BLAAuQSwALkEsAB9BLAAaQSwAI4EsACOBLAAjgSwAI4EsACOBLAAcgSwAG0EsABZBLAAWQSwAFkEsABZBLAAkgSwAEgEsACSBLAAAASwAAAEsAGwBLAAtwSwATQEsAGwBLABNgSwAaYEsAE1BLABIQSwAfAAAAAAAAAAfgAAAH4AAAB+AAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAOAAAADgAAABXAAAAioAAALcAAAD2AAABOoAAAXWAAAGvAAAB7oAAAheAAAJdAAACmoAAApqAAAKagAACmoAAApqAAAKagAACmoAAApqAAALmAAADKYAAA2aAAAObgAAD4oAABCSAAARqAAAEsgAABN4AAAUPAAAFXYAABY4AAAXagAAGGgAABkoAAAaHgAAG1QAABx0AAAdpAAAHogAAB6IAAAfegAAIJwAACCcAAAgnAAAIWwAACFsAAAhbAAAIWwAACFsAAAhbAAAIWwAACKKAAAjgAAAJFQAACVMAAAmHAAAJyAAACguAAApSAAAKhIAACrQAAAsEAAALLIAAC3sAAAvDAAAL7gAADC+AAAwvgAAMaQAADLQAAAzsAAANJAAADVuAAA2lgAAOBYAADgWAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOOIAADjiAAA44gAAOfoAADn6AAA5+gAAOfoAADn6AAA5+gAAOfoAADn6AAA5+gAAOfoAADn6AAA5+gAAOfoAADn6AAA5+gAAOfoAADn6AAA5+gAAOfoAADn6AAA5+gAAOfoAADn6AAA6EAAAOhAAADoQAAA6EAAAOhAAADoQAAA6JgAAOiYAADomAAA6JgAAOiYAADomAAA6JgAAOiYAADomAAA6JgAAOrIAADqyAAA6sgAAOrIAADqyAAEAAADtAFUABQBYAAQAAgAIAEAACgAAAJ8BKgACAAEAAAAYASYAAAAAAAAAAACMAAAAAAAAAAAAAQAYAIwAAAAAAAAAAgAOAKQAAAAAAAAAAwBQALIAAAAAAAAABAAYAQIAAAAAAAAABQBIARoAAAAAAAAABgAWAWIAAAAAAAAABwAAAXgAAQAAAAAAAABGAXgAAQAAAAAAAQAMAb4AAQAAAAAAAgAHAcoAAQAAAAAAAwAoAdEAAQAAAAAABAAMAfkAAQAAAAAABQAkAgUAAQAAAAAABgALAikAAQAAAAAABwAAAjQAAwAABAkAAACMAjQAAwAABAkAAQAYAsAAAwAABAkAAgAOAtgAAwAABAkAAwBQAuYAAwAABAkABAAYAzYAAwAABAkABQBIA04AAwAABAkABgAWA5YAAwAABAkABwAAA6wAQwBvAHAAeQByAGkAZwBoAHQAIACpACAAMgAwADAAMAAgAFQAZQB4AGEAcwAgAEkAbgBzAHQAcgB1AG0AZQBuAHQAcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAC4AIAAgAEEAbABsACAAcgBpAGcAaAB0AHMAIAByAGUAcwBlAHIAdgBlAGQALgBEAGYAVwA1ACAAUAByAGkAbgB0AGUAcgBSAGUAZwB1AGwAYQByAE0AYQBjAHIAbwBtAGUAZABpAGEAIABGAG8AbgB0AG8AZwByAGEAcABoAGUAcgAgADQALgAxACAARABmAFcANQAgAFAAcgBpAG4AdABlAHIARABmAFcANQAgAFAAcgBpAG4AdABlAHIATQBhAGMAcgBvAG0AZQBkAGkAYQAgAEYAbwBuAHQAbwBnAHIAYQBwAGgAZQByACAANAAuADEAIAAxADAALwAxADQALwA5ADcARABmAFcANQBQAHIAaQBuAHQAZQByQ29weXJpZ2h0IKkgMjAwMCBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQuICBBbGwgcmlnaHRzIHJlc2VydmVkLkRmVzUgUHJpbnRlclJlZ3VsYXJNYWNyb21lZGlhIEZvbnRvZ3JhcGhlciA0LjEgRGZXNSBQcmludGVyRGZXNSBQcmludGVyTWFjcm9tZWRpYSBGb250b2dyYXBoZXIgNC4xIDEwLzE0Lzk3RGZXNVByaW50ZXIAQwBvAHAAeQByAGkAZwBoAHQAIACpACAAMgAwADAAMAAgAFQAZQB4AGEAcwAgAEkAbgBzAHQAcgB1AG0AZQBuAHQAcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAC4AIAAgAEEAbABsACAAcgBpAGcAaAB0AHMAIAByAGUAcwBlAHIAdgBlAGQALgBEAGYAVwA1ACAAUAByAGkAbgB0AGUAcgBSAGUAZwB1AGwAYQByAE0AYQBjAHIAbwBtAGUAZABpAGEAIABGAG8AbgB0AG8AZwByAGEAcABoAGUAcgAgADQALgAxACAARABmAFcANQAgAFAAcgBpAG4AdABlAHIARABmAFcANQAgAFAAcgBpAG4AdABlAHIATQBhAGMAcgBvAG0AZQBkAGkAYQAgAEYAbwBuAHQAbwBnAHIAYQBwAGgAZQByACAANAAuADEAIAAxADAALwAxADQALwA5ADcARABmAFcANQBQAHIAaQBuAHQAZQByAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAKxgYFxcWFhUVFBQTExISEREQEA8PDg4NDQwMCwsKCgkJCAgDAwICAQEAAAGNuAH/hUVoREVoREVoREVoREVoREVoREVoREVoREVoREVoREVoREVoREVoREVoREVoREVoREVoREVoREVoREVoREVoRLMFBEYAK7MHBkYAK7EEBEVoRLEGBkVoRA==" ); - const font2189 = decodeFontData( + const font2189 = Uint8Array.fromBase64( // eslint-disable-next-line max-len "AAEAAAANAIAAAwBQT1MvMh4+B14AAADcAAAATmNtYXDgP1MtAAABKgAABDpjdnQgLo0mKQAABWQAAAB8ZnBnbc8o3EMAAAXgAAADMGdseWahy/nuAAAJEAAAEjRoZWFkm0JpbAAAG0QAAAA2aGhlYQy+mqoAABt6AAAAJGhtdHjH3jT1AAAbngAAA5Rsb2NhOW89kgAAHzIAAAHMbWF4cAK6BnMAACD+AAAAIG5hbWW6+eSEAAAhHgAABONwb3N0v0GJkgAAJgEAAAggcHJlcOsuWysAAC4hAAAEngAAA2oCvAAFAAADAAQAAAACAAMABAAAAAQAAGYCcwAAAgIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIPACBjP+SwDpBxwBzQAAAAIAAQAAAAAAFAADAAEAAAEcAAABBgAAAQAAAAAAAAABAgAAAAIAAAAAAAAAAAAAAAAAAAABAAACBAUGBwgJawsMDQ4PEBITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDf0VGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYgDi4N7d1dLMyMXHxsPEwsG+wL+9ury7ubi1t7a0sq+xsHOjZGVpd3aXp6ybgIYAjI8AngAAZ5oAAAAAAI2RAJKVfmOZAGgAAG17fALh39CQlnKLbHpECqEArclmam5vcHF0dXh5fePc5Nva2djX1tTTANHOzcuTgQCDhIWHiACJigAAAAQDHgAAAFIAQAAFABIAfgC2AP8BMQFBAUIBUgFTAWABYQF4AZICxgLHAtgC2QLaAtsC3CATIBQgGCAZIBogHCAdIB4gICAhICIgJiAwIDkgOiEiIhIiFSIZ8AHwAv//AAAAIACgALgBMQFBAUIBUgFTAWABYQF4AZICxgLHAtgC2QLaAtsC3CATIBQgGCAZIBogHCAdIB4gICAhICIgJiAwIDkgOiEiIhIiFSIZ8AHwAv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSAQ4BOgHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAcgByAHIAAAAAgAEAAUABgAHAAgACQBrAAsADAANAA4ADwAQABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwB/AEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAAMAYwBkAGUAagBnAKIAaQCGAKwAjQBtAJkAEQCnAIMAowCeAKYAqwCAAJoAdgCIAJgAkQB7AKAAnQClAH4A4QDkAOMA3wDiAOAAjADeANoA3QDcANsA1gDZANgA1wCcANUA0QDUANMA0ADSAKoAjwDLAM4AzQDMAMoAnwCXAMUAyADHAMMAxgDEAJIAwgC+AMEAwAC/ALoAvQC8ALsAqQC5ALUAuAC3ALQAtgChAJUArwCyALEAsACuAKQArQCTAI4AlACQAJYAzwCzAMkAaACBAIoAhACFAIcAiQCCAHIAiwBEAAoAeABsAHoAeQBzAHQAdwB8AH0AbgBvAJsAqABmAHUAcABxAAAAjgAsBUwFagVqAAAAAP/jAAADpgPCA7gABv/+AAD/9gAABVQACgVoAAL/8AAA/+EAAAAAAAADwgAABUwADP5M/kYAAP/0AAADpgAM/kwAAAO6AAT/5wAABVoACAVcAAYFWAAIAxIDEgAAA7AACAViAAT/6QAAA6QADLABLLAAIz6wAC8tsAIsRWhELbADLEtTWEVosCCLIyEjISMhsAgrGyFLU1hFaLAgiyMhsAgrGyGwACNwsABFaLAgi7AIK1lZLbAELEtTWEVosCCLIyGwCCsbIbAAI3CwAEVosCCLsAgrWS2wBSy0AQEAAQUlPhDMRkQtsAYstAEBAAEFJT4QxEZELbAHLCCwAWBFRC2wCCwgIGBWsQEEJWAjQkItsAksAbAAFi2wCiywAAAWLbALLLEBCCVgQ1gZGxhZsAAjcLEABiUjPrAAI3CyAAEGJWAjPrAAI3CyAAIFJWAjPrAAI3CyAAMEJWAjPrAAI3CxAAA/GCAgsAFgPDwjQ7AGYSMgICAQsAQlZTiwAmA8sAFgICAQijiwAmA8LbAMLLEBBiVgQ1gZGxhZsAAjcLEABCUjPrAAI3CyAAEEJWAjPrAAI3CxAAA/GCAgsAFgPDwjQ7AGYSMgsAMlZTiwAWAjOC2wDSywACNwsQAGJSM+sAAjcLIAAQYlYCM+sAAjcLIAAgUlYCM+sAAjcLIAAwQlYCM+ECDUILABYCAgILABYDw8EIpDIGA4sANgPC2wDiywACNwsQAGJSM+sAAjcLIAAQYlYCM+sAAjcLIAAgUlYCM+sAAjcLIAAwQlYCM+ECCwAWDUICAgILADYDw8EIpDIGBlOLACYDwtsA8ssAAjcLEABCUjPrAAI3CyAAEEJWAjPhAg1LABYCA8I0MgYDgtsBAssAAjcLEABCUjPrAAI3CyAAEEJWAjPhAgsAFg1CA8I0MgYGU4LbARLLAAI3CxAAQlIz6wACNwsgABBCVgIz6xAAAQIz8gsAFgIIo8PCNDIGCwBmE4LbASLLAAI3CxAAQlIz6wACNwsgABBCVgIz6xAAAQIz8gILABYDw8I0MgYLAGYWU4LbATLBA8cEU4ERIXOS2wFCyzAQEAAbj/4bIAAAG4A+hISDgREhUXOS2wFSwXQ2U4LbAWLBdDOC2wFywREjktsBgsERI5OS2wGSwREhc5LbAaLBEzLbAbLBEzMy2wHCwRFzMtsB0sILABYC2wHiwAsAEjSLEAAEgBsAEjSLEAAEixAAEHLQACAEr/4wO2BWgAEAApAIhAEwEDKREQAAQHBhkdCAMCGAEtAhS5BWgFI7QSLQYIKbj/40AYEQopERAABAcCGRcMBwYjBAMCAhgBWwIGuwOZAnMDtgKHsw1bBtq4AW2wR7gBebJKCwkrKysVKisxKysrFSsrMENYARWyAQYdKrISCh0qsgMSFSuyCQYdKrIeCh0qsgMSFitZBTI3NhMCJyYjIgcGAxIXFjM1IicmJyYTAjc2NzYzMhcWFxYDEgcGBwYjAgCwgYEEBIGBsK6BhQIChYGuMRsaDRYCAhYNGhsxNRsaDRICAhINGhs1HbKxAWABZLCurrD+nP6gsbJGHR5GhwF1AXmHRR8ZGR9Fh/6H/ouHRh4dAAEAhwAAA2IFaAAZAH1AFQEDExEQAwcGGRkHAgADAgIXAUMCFLkFaAU/QB8SOwYaJQARChkJAQAEAwIZEAIEGxIFGgESEAIDFF0CvAH5AocBawKcAXexCwkrKysVKysrMSsrKxUqKzBDWAEVQAkZGBcWBAMDBhUrQAoJCAcGAwIBCwQdKrIDDBYrWQEjBRc2NzIXFgcRFAcGBwYnFSE1IicmJyY3Apwj/g4RO0FIDg8CAgQVI6ECykknKRMeBAVo5SMdAjMxWf1nUDEzHTUCJSUMDBs1nAABADEAAAOcBWgAIwCJQBcBAyMGAAMHBhkYDwMCFAEHAgIYAWECFLkFaAR9sxJfBhq4AQhAHAARChwLAAMDAhkiEwcDBBwBBRoBIhMHAQQUXQK8ArkDRwIsA2ICPbELCSsrKxUrKysxKysrFSorMENYARW0AQAHBx0qthcWFRQDDhUrQAsTEhEQBQQDAhkJHSqyAxIWK1khEyMGBwYnIQA3NicmJyYjBgcGBxc2NzY3FhcWFRQHBgcGARUDUEwlJyMlZP64ARt3dgIEeXaEqWloJyUiPj9Kbzs7CAwzWv6VAYlUFhkCAR+mpp2qWFYCbG2dDUItKQICSEhuMzw7XKz+TBcAAAEAIf/jA4kFaAA7AKhAFwEDOx0AAwcCGSkVBwY3BAMCAhgBaQIUuQVoBKC0EmcGCD24/+NAIxEKMy8IAwMCGS0RBwYYOzcEAwQcIQ0IGwEhDTs3BAUUZQIHuwMvAioDSgI7sg5jBrwDAANtApMDiQKosQsJKysrKxUrKysrMSsrKxUqKzBDWAEVtgMCAQAWBh0qsioMHSqyAxgVK7IFBh0qsg0HHSqyHgYdKrY7Ojk4AxoWK1kTNjc2MxYXFhcGBwYHFRYXFhcUBwYjIicmJyYnJiMiBwYVFBcWFxYXFjMkNzY1Jic2NzY3JicmIwYHBgd5Kzs6T107OQICS0xznGxvAi8xWDgtMScnKSkrLx4hJSI0MzUzJQEQjo8E60s0LwICYV6DoGpvOQQMRCknAjo5WGdFSBQjHW5zoFI7QB0bIyIdGyEhLzMfHxAOBgkEoJrA+mIpRkZUiU5LAmBgjQACADMAAAOuBWgAAwAOAJNAHQEDCwkFAwAFBwYZBwYLCgQBBwICGA0DAhcBQwIUuQVoBT+yEm8GugGVAfwBL7MMbQoauAH8QB0AEQoODAgGBAMCGQQABwYYAQcCFwoFGgEKARRlArwClQMYAhIDMQIjQAoLawZgjzKTMwsJKysrKxUrKysrMSsrKysVKyorMENYARW0AQADAhUrtAQOAwIWK1kTATMRJRUhESERMzUjESOTAYwE/hAB8AEOfX19AfwCH/3hBNH+0QEvzQNsAAEARv/jA7IFTAAtAJRAGwEDLSsAAwMCGSAMCwoqAQcGAhgUCwYXAXcCHrkFTARKsxJ1Bhy5A8ICorQScwoISrj/40AZEQokCAMCGCoYAAMEHC0FGgEtKhgABBRxArwDPgOTAuoDsAMCsQsJKysrFSsrKzErKysrFSsqKzBDWAEVsg0GHSqyIQwdKrIDFBUrtAEAAwgdKrIVBh0qsgMSFitZAQMzNhcWFxYXBgcGIyInJicmJyYnBgcGFRQXFhcWFxYzJDc2NTQnJicmIzchEwE38VTGy14+OQICNzpWMy8xLS0vMTQpICUlIDQzNTMlARKOjT9AZtfwMwIXZAVM/VYCWC1OUHFUNzscGx8jGBcCAh0fLTEfIBMSCAkGmpS2h2BePnKIAQIAAgBM/+MDwgVoABcALgCtQBsBAywuGAMLBhkaEgcGJAoLChcAAwIDGAF9AhS5BWgFTLISewa6AywDZAL0tAwtCggpuP/jQB4RCi4aFAMHAhkeDgMCLAYHBgIYFwAFGwEXAAIUeQK8AxgDowKNA8ACorMLWwbcuAFvsEm4AXuyTAsJKysrKxUrKisxKysrKxUqKzBDWAEVsgsGHSqyFQQdKrIlCR0qsgMWFSuyAQgdKrQUExsIHSqyAxQWK1kBBAcGBwYVFBcWFzY3Njc0JyYnIgcxEiUBNjcyFxYVFgcGBwYjJicmJyYnJjUmNwPC/oL4eUJFcnPfy3NwAlhctG1cYwHQ/cExNV0vLQIRCBgZKzslJRIRBgYCCgVoBO1xnp290aisBgSMh8Sse30CPwHLXP2JHQJnauhBYishIwI7PFJST04td04AAAEARv/jA88FTAAOAGhAEwEDDQIDAhgEBwIABwYCFwFfAh65BUwERLQSWQYIDrj/40APEQoFDgQDAgEGAwIZAX8CuQH5A7CwQ7gDz7JGCwkrKxUrMSsrKxUqKzBDWAEVQAkIBwYFAgEDBhUrtgQDAA4DBBYrWQUzASEDMzY3Njc2NzY7AQFqngHH/NliJBcrKTM1ODUz/h0Faf5aOyEfDhACAwAAAwBI/+MDuAVoABYALQBWAM9AHQEDUlYyJy0XFhIGCQcCGU4fBwY2CgMCAhgBhQIUuQVoBSu0EoUGCCG4/+NAKhEKVlIbAwMCMi4SAwsKAhlIJwcGLRYKBz4GDw4DGBcHAgAPCgIXAWUCC7sDmwKVA7gCqrMOgwYPuAE7sEW4AUazSA6BCrwDEwOFAqEDogK2swtlDty4AV+wWbgBarJcCwkrKysrKxUqKioxKysrFSorMENYARWyAAkdKrIgDB0qsi4HHSqyTwcdKrIDJxUrswALEx0qsjcWHSqyAywWK1kBJicmJyY1NDc2NzIXFhcWFxYVFAcGDwEWFxYXFAcGByInJicmJyY1NDc2NzY3JTY3NjcmJyYjBgcGBwYHBhUUFxYXFhcGBwYVFBcWFxYXMjc2NyYnJicCb11PJxcbLitHNSEhEhUIBg4TJslgUlACKytYNyMlFRIICBYMExAbARJpP0ACAnFxqoFRVjQxFBdMIy8rNXVLUhgXMWDmuIeHBAJFSm8DMTdSKzEwN0gzMQIXFiclLS8rQkFCNdM9XF94UDw/AhwbKy0xLy1GWCklIxKgLUpJc5FUUgIjIjo1OTwvi1IrJycrL05ShTU7PDVxBGdmwYtcXkgAAgA//+MDtgVoABUALgCrQBsBAy4sFgMHAhkaEAcGJAgDAhUACwoDGAEtAhS5BWgFI7ISewa6Ah8CWAHntAx9CggAuP/jQB8RCi4WEgMHAhkeDAcGLAQDAgIYFQAIGwEVAAIUWwIGuwOZAnMDtgKHsw15Bsq4AVWwP7gBYLJCCwkrKysrFSsqKzErKysrFSorMENYARWyAQYdKrQSERsIHSqyAxIVK7IJBh0qthYVFBMlCR0qsgMVFitZFyQ3NhM0JyYnBgcGFRQXFhcyNzECBQEGBwYjBicmNSY3Njc2NxYXFhcWFxYVFAc/AYH4+gRwcePJcXZaWrRvWmP+LwJAGRgZHFkvMQITDBYZJz0lJRATBgQIHQTw7AF61aaqBgSJicWqe38CQP41XAJ3CwoKAmpp50JkLx8dAgI4OVRSUE4xdk4AAQA/AAAEPQVMADUAtkAeAQMmJCMPDQwGCwoZMRoHBgMBAwICGDULBhcBOwIeuQVMBSezEt0GHLkDwgM7QCwSOwoaJQARCjEqHgMDAjUVBwEEBwYCGSMOBwIYDAIIGyUFGgElDAIDFMECBrsDuAKpA9cCvrINwQa5ATIBurCruAHJsrALCSsrKysVKysrKjErKysrFSsqKzBDWAEVshAJHSqyJwkdKrIDFBUrswAEBx0qQA41NDMyIiEgHh0cGwMUFitZAREhFRYXFgcRFgcGBxUhNSYnJicmNRE2NzY3MhcWFREUBwYHFSE1JicmNxE2JyYnJiMGBwYHAcn+dlITDgICDhFJAdtAEAgCAhopKS9CDgoKDkQB20kPEAICMxsxM1BSREM1Ay8CHSUCLzFU/GZGNTUCJSUCNRseHyMB6S4mJQI/Pmr+g0Y1NQIlJQI1NUYBd6ZmMR0aAiktOwACACcAAAIfBWoAEgAjAKtAHgEDIx8XEwQDAg4MCwMLCgIZAgAHBhgSCwYXAeECBbkFagQ3sxI7BiW5A6YDgUAnEjsKGiUAEQojHxsTBAMCEgYAAwcGAhkLAQgbDQkaAQ0LAQMU3wIHuAGvsIW4AbyziQ7BBrkBGwGjsJO4AbCymAsJKysrKxUrKyoxKysrKxUrKyowQ1gBFbYSERAPGAYdKrIDCxUrsgMHHSpACyMiISAWFRQTAxAWK1kBIRUWFxYHERYHBiMVITUiJyY3ARQXFjMyNzY3JicmJwYHBhUBsP53UhIPAgIPElIB+E4TEAL+2S8rQEEtKQICKS1BQCsvA6YlAi8xVP4MVC8vJSUvL1QD+kArLy8rQEEtKQICKS1BAAIASv/jA7YDwgAQACEAiEATAQMhERAABAcGGRkIAwIYAS0CHLkDwgN9tBItBggpuP/jQBgRCiEREAAEBwIZFQwHBh0EAwICGAFdAga7A5kCfQO2ApGzDV0G1bgBY7BHuAFvskoLCSsrKxUqKzErKysVKyswQ1gBFbIBBh0qshIGHSqyAw4VK7IJBh0qshoGHSqyAw4WK1kFNjc2NTQnJicGBwYVFBcWFzUiJyY3Jjc2MzIXFgcWBwYjAgDVcXBwcdXRcXR0cdFcGxwCAhwbXFwdGgICGh1cHQSUjcvLkY8EBI+Ry8uNlARGZmXf32dkZGff32VmAAEAIf/0ApME/AAbAIdAGQEDGhgEAwMCGRMKBwYYDwcCFwADGgHLAiW5A6YDRLQSewYjZLj/9EAaEQobFwUBAAUDAhkZDgUbAwQaARkOAwMUwQK5AR8Bp7CXuAG0spwLCSsrKxUrKysxKysrFSsrKyswQ1gBFbILBB0qthcWFRQDCRUrQA0SERAPCQgHAwIBAwoWK1kBIwYHFTMRFBcWFzY3NjcnBgcGIyYnJjcRMzUjAbQhh+t7P0BuYEREIh4RHh8pNQsMAt/fBPz4niL9iUpGRwICMzNWFyEhIwI2M0wCKWIAAAEAN//jBD0DpgApAKxAHAEDFBICAAQDAhklIwcGKSIHAh0LCwoDGAE7AiW5A6YDgUALEjsGGiUAEd0KCGq4/+NAIREKKQYAAwMCGRgRBwYhAQcCAhgkBRMIAhoBJBMCFMECBrsDsAKhA88CtrINwQa5ASsBs7CjuAHAsqgLCSsrKysVKiorMSsrKysVKiswQ1gBFbIMBR0qQAspKCcmISAfHgMOFSuyAwcdKkAKHBsaGBcWFQMPFitZASEVFhcWBxEGBwYHJicmJyY1ESEVFhcWBxEUFxYXNjc2PwEVITUiJyY3A8/+d1ISDgIaJSc6PQwIAgP+d1ITDgJBPnlaRUQvBAGHTRMQAgOmJQIvMVT+HCsnKAMDORofHRgCkiUCLzFU/kODUlQCAikpPAR3JS8vVAAAAQAU/+MFtAOmADcAp0AfAQM3HxEDBwIuLCsaGBcKCAcJAwICGTUBBwYYATsCJbkDpgOBtBJZBggOuP/jQBcRCg4JBwMDAhktEQIDBBwBLRECAxT1ArwFAQWHBHsFtASgsgvzBrkCzQWHsBS4BbSyFAsJKysrKxUrKzErKysVKyowQ1gBFbQANwIEHSqyEgQdKrIgBB0qtDc2AxMVK7QBAA0EHSqyGwQdKrIxBB0qsgMRFitZCQEzATY3NjM1IRUyFxYVBgcDIwMmNSYXNSEVMhcWFwMxAyYnJjU0NzY3NjM1IRUyFxYXFhcTMxMC5wECOAEUHx8eI/7sKxgZBB1vBI0QAlj+HjIYGSOGkwQGCgoIDBsa/ikZFRISJT7vOPcCkf1SAxdUHBclJQwRLz88/scBjSMhMQIlJRseWv6TAY8NFhUMEgsKAgQlJQYIHTOw/XACrgAAAQAAAAEAARVW4oBfDzz1AAEIAAAAAAAAAAAAAAAAAAAAAAD+j/4zCBAHHAACAAgAAgAAAAAAAQAABxz+MwAACAD+j/6RCBAAAQAAIAD/AHUAAAAAAAAAAOUAAAAAAAAAAAIAAAACAAAAAqoArARxAKgEAAApBAAATggAAI8GqgBSAqoAmAKqAFICqgAZBAAAcwSPACUCAABEAqoAMQKqADECAABaAjn/+gQAAEoEAACHBAAAMQQAACEEAAAzBAAARgQAAEwEAABGBAAASAQAAD8CqgCwAqoAmASPACUEjwAlBI8AJQQAAH0HcQBeBccAEgVWACkFxwBUBccAKQVWACkE4wApBjkATAY5ACkDHQArBAAAFwY5ACkFVgApB40AIwXHAB8GOQBMBOMAKQY5AEwFxwApBHMAbwVWAEwFxwAjBccAEggAABIFxwASBccAFAVWACECqgDDAjn/+gKqAEIEpgCTBAD/8AKqAJgEAABaBHMAKwONAEoEcwBUA40ASgKqAEIEAABOBHMAPwI5ACcCqv/HBHMAPwI5ACcGqgA/BHMAPwQAAEoEcwArBHMAVAONAD8DHQBUAqoAIQRzADcEAAASBccAFAQAACkEAAAQA40AGwMnAH8BwwCgAycAfQQpACcCqgCsBAAAgQQAACMBVv6PBAAAAAQAAAAEAABcBAAAFAI5AIEEAABUBAAAIwKqAFwCqgBaBHMAPwRzAD8EAP/wBAAAZAQAAG8CAABaBFIAAALNAEgCqgCYBAAAVAQAAFQEAAAjCAAAsAgAADEEAABzAqoAJQKqAOMCqgAUAqoAEgKqABQCqgAnAqoAwwKqABQCqgCDAqoAWAKqAGYCqgAUCAD/8AgA/+kCZgAMBVYAKQY5AEwIAABOAqQAHQXHAF4COQAnAjkAIwQAAEQFxwBKBHMAOwJmAEgEjwAlBHMANwgA//4FxwApBgAASASPACUE4wApBgAASASPACUBwwCgAzMAPwRzACsGAAAMAmYAFwX6ADcEjwAlBAAASgSPAI0CZgAMBfoANwQAABAEAAAQBHMANwRzADcEcwA3BHMANwMdAFQEAABKBAAASgQAAEoEAABKBAAASgRzAD8COQAnAjkAJwI5ACcCOQAnA40ASgONAEoDjQBKA40ASgONAEoEAABaBAAAWgQAAFoEAABaBAAAWgQAAFoFxwAUBccAFAXHACMFxwAjBccAIwXHACMEcwBvBjkATAY5AEwGOQBMBjkATAY5AEwFxwAfAx0AKwMdACsDHQArAx0AKwVWACkFVgApBVYAKQVWACkFxwBUBccAEgXHABIFxwASBccAEgXHABIFxwASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIsA9gF4AigCjwMjA8cEGQUGBagFqAWoBagFqAWoBagFqAWoBagFqAWoBagFqAWoBagFqAWoBagFqAWoBagFqAWoBagFqAWoBagFqAWoBagFqAWoBagFqAWoBagFqAWoBagFqAWoBagFqAWoBagFqAZXBugG6AboBugG6AboB2MHYwdjB2MHYwfVCG8IbwkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgkaCRoJGgABAAAA5QCZAAcAcAAEAAIAHgFnAB8AAAGKBAAAAgABAAAAEADGAAEAAAAAAAAAJgAAAAEAAAAAAAEADwAmAAEAAAAAAAIABAA1AAEAAAAAAAMABQA5AAEAAAAAAAQAFwA+AAEAAAAAAAUANQBVAAEAAAAAAAYAFACKAAEAAAAAAAcAwQCeAAMAAQQJAAAATAFfAAMAAQQJAAEAHgGrAAMAAQQJAAIACAHJAAMAAQQJAAMACgHRAAMAAQQJAAQALgHbAAMAAQQJAAUAagIJAAMAAQQJAAYAKAJzAAMAAQQJAAcBggKbQ29weXJpZ2h0IDE5ODgtMTk5MSBBZG9iZSBTeXN0ZW1zIEluYy5UaW1lc05ld1JvbWFuUFNCb2xkMzE1OTlUaW1lcyBOZXcgUm9tYW4gUFMgQm9sZENvbnZlcnRlcjogV2luZG93cyBUeXBlIDEgSW5zdGFsbGVyIFYxLjBkLgpGb250OiBWMS4xVGltZXNOZXdSb21hblBTLUJvbGRDb3B5cmlnaHQgKGMpIDE5ODgsIDE5OTAgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLlRpbWVzIE5ldyBSb21hbiBpcyBhIHRyYWRlbWFyayBvZiB0aGUgTW9ub3R5cGUgQ29ycG9yYXRpb24gUGxjIHJlZ2lzdGVyZWQgaW4gdGhlIFVTIFBhdGVudCBhbmQgVE0gT2ZmaWNlIGFuZCBlbHNld2hlcmUuAEMAbwBwAHkAcgBpAGcAaAB0ACAAMQA5ADgAOAAtADEAOQA5ADEAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMALgBUAGkAbQBlAHMATgBlAHcAUgBvAG0AYQBuAFAAUwBCAG8AbABkADMAMQA1ADkAOQBUAGkAbQBlAHMAIABOAGUAdwAgAFIAbwBtAGEAbgAgAFAAUwAgAEIAbwBsAGQAQwBvAG4AdgBlAHIAdABlAHIAOgAgAFcAaQBuAGQAbwB3AHMAIABUAHkAcABlACAAMQAgAEkAbgBzAHQAYQBsAGwAZQByACAAVgAxAC4AMABkAC7//wBGAG8AbgB0ADoAIABWADEALgAxAFQAaQBtAGUAcwBOAGUAdwBSAG8AbQBhAG4AUABTAC0AQgBvAGwAZABDAG8AcAB5AHIAaQBnAGgAdAAgACgAYwApACAAMQA5ADgAOAAsACAAMQA5ADkAMAAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AVABpAG0AZQBzACAATgBlAHcAIABSAG8AbQBhAG4AIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIAB0AGgAZQAgAE0AbwBuAG8AdAB5AHAAZQAgAEMAbwByAHAAbwByAGEAdABpAG8AbgAgAFAAbABjACAAcgBlAGcAaQBzAHQAZQByAGUAZAAgAGkAbgAgAHQAaABlACAAVQBTACAAUABhAHQAZQBuAHQAIABhAG4AZAAgAFQATQAgAE8AZgBmAGkAYwBlACAAYQBuAGQAIABlAGwAcwBlAHcAaABlAHIAZQAuAAIAAAAAAAD/MwBmAAAAAAAAAAAAAAAAAAAAAAAAAAAA5f//AAAAIP//ACEAIgAjACQAJQAmANUAKAApACoAKwAsAC3//wAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8A1ABhAGIAYwBkAGUAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAcgBzAHQAdQB2AHcAeAB5AHoAewB8AH0AfgDBAKIAowDaALQAxACkANsAJwDSAMcA3ADdAN4A3wDQAKAA4ADhAKYApQDiAOMA0wDIAMkA5ADAAGAAqwD2APUA+AD5APoArAD7APwA/gD/ANEArgC7//8ArwDOALwAvgD1//8AvwDPAKf//wDCALUAqv////8Asf////8A1v//AKH///////8AqP//////////AKkA2P//AJ0AnwCeAJz//wCbAJgAmgCZAJcAlgCTAJUAlACSAI8AkQCQAI4AjQCLAIwAiACKAIkAhwDZ//8A9ACGAPMA8v//AM0A8QCFAO8A7gCEAO0A7ADrAOoA6QDoAOYAgwCCAMwAgQDLAIAA5QDnBy5ub3RkZWYFc3BhY2UHbmJzcGFjZQZleGNsYW0IcXVvdGVkYmwKbnVtYmVyc2lnbgZkb2xsYXIHcGVyY2VudAlhbXBlcnNhbmQKcXVvdGVyaWdodAlwYXJlbmxlZnQKcGFyZW5yaWdodAhhc3RlcmlzawRwbHVzBWNvbW1hBmh5cGhlbglzZnRoeXBoZW4GcGVyaW9kBXNsYXNoBHplcm8Db25lA3R3bwV0aHJlZQRmb3VyBGZpdmUDc2l4BXNldmVuBWVpZ2h0BG5pbmUFY29sb24Jc2VtaWNvbG9uBGxlc3MFZXF1YWwHZ3JlYXRlcghxdWVzdGlvbgJhdAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoLYnJhY2tldGxlZnQJYmFja3NsYXNoDGJyYWNrZXRyaWdodAthc2NpaWNpcmN1bQp1bmRlcnNjb3JlCXF1b3RlbGVmdAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoJYnJhY2VsZWZ0A2JhcgpicmFjZXJpZ2h0CmFzY2lpdGlsZGUKZXhjbGFtZG93bgRjZW50CHN0ZXJsaW5nCGZyYWN0aW9uA3llbgZmbG9yaW4Hc2VjdGlvbghjdXJyZW5jeQtxdW90ZXNpbmdsZQxxdW90ZWRibGxlZnQNZ3VpbGxlbW90bGVmdA1ndWlsc2luZ2xsZWZ0Dmd1aWxzaW5nbHJpZ2h0AmZpAmZsBmVuZGFzaAZkYWdnZXIJZGFnZ2VyZGJsDnBlcmlvZGNlbnRlcmVkCXBhcmFncmFwaAZidWxsZXQOcXVvdGVzaW5nbGJhc2UMcXVvdGVkYmxiYXNlDXF1b3RlZGJscmlnaHQOZ3VpbGxlbW90cmlnaHQIZWxsaXBzaXMLcGVydGhvdXNhbmQMcXVlc3Rpb25kb3duBWdyYXZlBWFjdXRlCmNpcmN1bWZsZXgFdGlsZGUGbWFjcm9uBWJyZXZlCWRvdGFjY2VudAhkaWVyZXNpcwRyaW5nB2NlZGlsbGEGb2dvbmVrBWNhcm9uBmVtZGFzaAJBRQtvcmRmZW1pbmluZQZMc2xhc2gGT3NsYXNoAk9FDG9yZG1hc2N1bGluZQJhZQhkb3RsZXNzaQZsc2xhc2gGb3NsYXNoAm9lCmdlcm1hbmRibHMLb25lc3VwZXJpb3IKbG9naWNhbG5vdAJtdQl0cmFkZW1hcmsDRXRoB29uZWhhbGYJcGx1c21pbnVzBVRob3JuCm9uZXF1YXJ0ZXIGZGl2aWRlCWJyb2tlbmJhcgZkZWdyZWUFdGhvcm4NdGhyZWVxdWFydGVycwt0d29zdXBlcmlvcgpyZWdpc3RlcmVkBW1pbnVzA2V0aAhtdWx0aXBseQ10aHJlZXN1cGVyaW9yCWNvcHlyaWdodAl5ZGllcmVzaXMGeWFjdXRlBnVncmF2ZQl1ZGllcmVzaXMLdWNpcmN1bWZsZXgGdWFjdXRlBnNjYXJvbgZvdGlsZGUGb2dyYXZlCW9kaWVyZXNpcwtvY2lyY3VtZmxleAZvYWN1dGUGbnRpbGRlBmlncmF2ZQlpZGllcmVzaXMLaWNpcmN1bWZsZXgGaWFjdXRlBmVncmF2ZQllZGllcmVzaXMLZWNpcmN1bWZsZXgGZWFjdXRlCGNjZWRpbGxhBmF0aWxkZQVhcmluZwZhZ3JhdmUJYWRpZXJlc2lzC2FjaXJjdW1mbGV4BmFhY3V0ZQlZZGllcmVzaXMGWWFjdXRlBlVncmF2ZQlVZGllcmVzaXMLVWNpcmN1bWZsZXgGVWFjdXRlBlNjYXJvbgZPdGlsZGUGT2dyYXZlCU9kaWVyZXNpcwtPY2lyY3VtZmxleAZPYWN1dGUGTnRpbGRlBklncmF2ZQlJZGllcmVzaXMLSWNpcmN1bWZsZXgGSWFjdXRlBkVncmF2ZQlFZGllcmVzaXMLRWNpcmN1bWZsZXgGRWFjdXRlCENjZWRpbGxhBkF0aWxkZQVBcmluZwZBZ3JhdmUJQWRpZXJlc2lzC0FjaXJjdW1mbGV4BkFhY3V0ZbgB/4WwAUWwgFBYsQQAjY0bsQUBjY1ZsCdLUFiwQBqwABYAGLEDASu1OC8UBQQFKrUxLR4SBAYqsQoBK7QpHAwDBSq0PDYlAwYqsTMBK7I0AQYqsSABK7MnIQIGKrEHAStACzorIxoYFhAOCAkGKhtAEjgEMQQvBC0EHgQUBBIEBQQIAipADjwLNgspCyULHAsMCwYCKrM0MwECKrUnICEgAgIqQBQ6BysHIwcaBxgHFgcQBw4HCAcJAipZsEAasgEwAUWLRD0AuQFlAbmxAgK4AV2yOgIuuAFbskkCG7gBWbJCAiO4AVeyGQISuAFPsjcCLrgBQ7IaAhO4AT+yhQIIuAE9spMCB7gBO7JgAg+4ATWyjAIIuAExsr4CBbgBLbKtAga5ASkBHrECA7gBH7IQAgy5AR0B07ECAbgBGbJAAie4ARGyGAIRuAEPQE49Ai3/sAIG/RYCD/c1Ai7piAII52ECDuUhAh7hmQIH3UMCItt5AgrPTQIYyzECQ8k8Ai7HUAIWxVQCFMM/Aim1MgI4sR0CF60pAnCnLAK4f/9AFaUvAnCjJwJDnSUCMJlbAhGXGwIUibgB60ApAgGFHgIYfQ4CC3s4Ai53gQIJdZACB3MzAjBvZgINbf4CA2lkAg5nLQK4AVBAGWF2AgpfhAIJWRUCDlWmAgZRZwINTZ8CBke4AYFACQICQxQCDj0rArgBUEAhOxICDTllAg03TAIZMRwCFS0jAiUrJAIqKR8CGh1BAiUZuAFNtgICFaICBhO4AdmxAgGxSgQqAbkBYwGssQECuAFhsisBA7gBX7JLAQW4AVWyHAECuAFTsl0BBrgBUbJsAQm4AU2yXwEHuAFLslwBBrgBSbJWAQa5AUcD8LEBALgBRbJVAQW4AUGyJQEDuAE5sh8BA7kBNwE2sQEEuQEzATixAQS5AS8BN7EBBLgBK7LKAQ25AScBFrEBBbgBJbIwAQO4ASOyGAECuAEhshoBArgBG7LyAQi4AReyPgEEuAEVslMBBbgBE7JvAQq4AQ2yXgEHuAELsmABB7kBCQIKsQECuAEHsn4BFbgBBbJ/ARa4AQOyJgEDuAEBQBD1AQf7KgED+WoBCfWGASrzuAK5tgEB8WIBB++4Ad5ALwEC7WMBB+toAQjjVwEG35UBMNlPAQXXUQEF1YEBGdNZAQbReAEPzXcBDsGIATi/uAIAsgECvbgBsrYBArt1AQ25uAK+sgEBt7gCu0ANAQGzaQEJryQBA6uNAbgBUEANqZ0BFaGZAR6frgEOm7gCukAbAQGVGwECkxYBApF9AROPMwEDjXEBC4sUAQKHuAISQAsBAoN7ARGBcgEMf7gBtkAZAQJ5iwFwcVQBBWsuAQNlgwEeY20BCl2OAbh//7RbkwFDV7gBGbYBBVOgARJPuAEaQAsBBUs6AQRJPwEERbgBgUArAQNBggEcP7cBDjVlAQgzigFUL3kBECduAQolKQEDIxUBAiESAQIfZwEIG7gByLQBAhePAbgBULcRnAEXD6IBELFiBCoYsAOwAUWwMFBYQQIAAABCcLAARbAKixuwAFmxIQGIUliwCGNZQg==" ); - const font2374 = decodeFontData( + const font2374 = Uint8Array.fromBase64( // eslint-disable-next-line max-len "AAEAAAANAIAAAwBQT1MvMhBzLe8AAADcAAAAVmNtYXDxf/RCAAABNAAAAexjdnQg8yzagQAAAyAAAAfGZnBnbcOmHQEAAAroAAAGMWdseWaod7EbAAARHAAAAHZoZWFkz3sdgwAAEZQAAAA2aGhlYRLvEvYAABHMAAAAJGhtdHixQhbKAAAR8AAAGihsb2NhAAMDnAAALBgAABosbWF4cA0BEK4AAEZEAAAAIG5hbWVj6BQfAABGZAAABipwb3N0AYc0ZgAATJAAAAAncHJlcOQ4lKQAAEy4AAAPEwABAzUBkAAFAAAFmgUzAAABJQWaBTMAAAOgAGYCEgEFAgIGAwUEBQIDBAAAeoeAAAAAAAAACAAAAABNb25vAEAAIP/8BYz+RgEzByEBu0AAAf///wAAAAAAAAABAAMAAQAAAAwABAHgAAAABAAEAAEAAPD///8AAPAg//8AAAABAAQAAAADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMFjgAABUwAHwVMABwDlAAbAAD/4QAA/+QAAP/o/kr//AVrACP+av/gAxMAAACtAAAArQAAAAAAJQCWAJ8AJADwATEAwgDAAEoApgBBAFAAlABHAM8ArwAOAHkBywAEACMARACoACUBHwACAEYAFwEFAJkA2QBcAHIA5QDgACgASwDeARIAJABFAHAAFgA5/+kAFgBLAIj/uQDZAAoAQwCuALoBbAFTAC8AQwBIAiwBKwAlAI//wAAXACj/zf/YACUAnQDlAST/sQBIAJ0A5gARACcAfwCRABIAagDK//wAAAAkAGIApwF8AekAIQBgAIsENASK/2sAOwC1ANUBS/9rAE0AeQXYCbUAbACRAKMBFwHA/9//5wC+BAEAZQB/AIIAiACZALIAwAIuA0MFoAAgACYAPQBOAGEAZQB7ANkBEwExA0D/J/9C/5kATgCnAPICKwLGAwcAEQArAEkAXwCNAKEArwDWAOQA9QELATUBnQGrAasB0QHuBdgAAABLAHUAegCAAJ0ApgCnAKwAuQExATECFwIXAAIAFwApAFUAgACPAKUAsgCzANABSwFZAcABwQOlBTD+P/8U/xX/5///ACoAWACZAJ8AwQDkAPQBMAFZAasBqwMiA3QEHgR0BTL9gQBNAGQAnADQANEA1gDeAOUA9QD4ASoBKgHhAn4Cf/9X/6j/5QAAAAgAHwA4AFEAWgBvAHYAdwCiAMAAwgDEAPEB+wIJAn4CzwTFBXoF8P+SABIAJgBCAEsATwBRAFMAZACLAK4AsgC4ALgA1gD1AREBIAExATgBTgFSAWcBjwGWAbgB2QHZAgYCIQJxAuoDsAPLA9wENgUF/zoAEgAWAB4AHwAjAFcAaABsAH4AiACSAKUAqADFAMkBFQEmAS0BMAHWAdkB9gI7AkQCRAKjAs8C3gOFA48E/AWG/uD+6/77/4oABwBEAEcAWAB1AKoA5ADvARYBIAEpAWoBcwHjAn4CkAK0Aw4DEAMjAzUDQQNUA1kDiAOUA8gDzgRyBKsE2gVJBWEFqwdh/m7+0f9L/4QAAAABAAYAHgAnACwANAA3AGIAZgBqAGsAbABwAHAAcgB8AIEAigCOAJEAkgCgAKsAuAC/AMkA1QDdAOwA9AEAASEBMAFpAWoBbQF8AYUBjgGOAZkBrAHBAcUByQHhAfYB9gH2AiICIgIoAjYCPwJDAkYCZwKFAoUClALQAtYC6AMcA2MDfwOAA4ADngO2A9kEAAQEBP8FMgUyBUgFiwWnBssHKAdIB2IIzPzt/Sr9Wf3e/gD+Gv5b/pb+wf7n/1b/eQABACUALQAuAHwAhwCRAJkAoQClAKUAqgCvALYAxgDMANcA3QDsAPIBAgEFARcBGAEjASoBLAExAT8BRwFJAUkBTQFRAVEBVQFVAVcBWgFaAWEBYgFoAWgBfwGAAYIBgwGEAY0BlQGVAZUBmAGZAaUBqQG2AbYBtwG6AboB1QHfAeYB6gHyAgACAAIDAhcCJQInAi8COQJDAkMCRwJPAlICUgJnAm8CbwJwAnICdgJ+AqcCswK5AtYDEwMlAy0DYQNxA5kDrgPCA9QD+QQCBCwELwQ8BFYEZwSDBM8E0QTYBPsFHwVFBWgFngXCBhsGNAZVBmoGmAavBugG/AcGB1AHYgd8B9QH/wglAK0AxwCqALUAAAAAAAAAAAAAAAAALwbPAXMFFAR4At8AnAAYA3AFhwFVACUABgJUA2wDjgPSBWYB8AMgAdoBigNpA2v/owNGAvgDbwFWAr8BIgMfBToDZgCMAP8BqwLhAvQC5wQVAVQC6QEoBJEBtwJvA0MCBgAAAAAF0wQVBIMF6AAAAtcAOgJ9AcACxQODA4P/vQA6BZ4B3wWeAtEAIATgAhMA3wHAAYcClwAAAM4CaQKLAFgENAX7AGkBWgGpBXgBggE+AogBKgPUBJ4A5QMjAvMB8AGWAHoAzQFKBCQCXgI5AasAzwD9AR4A7QFxAHABlQBAAbsB3QG4AAEBqAOnAUwCDAGNAbACDQE3AQAAzQMhAdQDCgBZAAAAAAEmAhUBUALwAlUDvAbQAzUBAQDQANIAegEDATAAfAAAAAAAAAAAAP4AbgBmAJQCJwArAEUATQDTATIAGACXAEEA9P68/+kAFgXYBYsAkQChAywAUgAwAF0CywA6AJIA5QDlAFgAhgAyALoAmQCIADACmAB8/4ABZAAoAE0AZQACALgBagAvAQsAEQAXAQAAfwAEABYCIgCmAF8AAAD4AAoAygBDAEsB7gB3ASAA9AHAACgEXwAAAIwERQDCAGAAewCLAIsAZABdAMIAnACSBrUF0wBPARcAAAQg/p4AzADcAF4ARgDjADIAGgA8AJEAWgChBCwAQQAgAEkAcQCcAJz+SABAAEAAhgDLAQIAfQA6AD4AagBQBEgAKQCW/2oAlwBpAOAATAAbAMkAaf+XAEP/vQBS/4P/iwBf/6H/XABnAFP/qAAqAHb/sgA2AIcFWQJWBSsENADeAMkBxABIANsBiwCzAEgA2gEWASUBGADqAOoArgAAAD4FuwCKBNcAUwA//4z/1QAVACgAIgCZAGIASgDkAG0A7gDlAEgDwAAz/k4Csf9GA3AAeQXfAFH/p/8fAQoAaP9sAE8AvAClBwUAqwCAAB4FpQAlAABAQlVUQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhQTEhEQDw4NDAsKCQgHBgUEAwIBACxFI0ZgILAmYLAEJiNISC0sRSNGI2EgsCZhsAQmI0hILSxFI0ZgsCBhILBGYLAEJiNISC0sRSNGI2GwIGAgsCZhsCBhsAQmI0hILSxFI0ZgsEBhILBmYLAEJiNISC0sRSNGI2GwQGAgsCZhsEBhsAQmI0hILSwBECA8ADwtLCBFIyCwzUQjILgBWlFYIyCwjUQjWSCw7VFYIyCwTUQjWSCwkFFYIyCwDUQjWSEhLSwgIEUYaEQgsAFgIEWwRnZoikVgRC0sAbELCkMjQ2UKLSwAsQoLQyNDCy0sALAXI3CxARc+AbAXI3CxAhdFOrECAAgNLSxFsBojREWwGSNELSwgRbADJUVhZLBQUVhFRBshIVktLLABQ2MjYrAAI0KwDystLCBFsABDYEQtLAGwBkOwB0NlCi0sIGmwQGGwAIsgsSzAioy4EABiYCsMZCNkYVxYsANhWS0sRbARK7AXI0SwF3rkGC0sRbARK7AXI0QtLLASQ1iHRbARK7AXI0SwF3rkGwOKRRhpILAXI0SKiocgsKBRWLARK7AXI0SwF3rkGyGwF3rkWVkYLSywAiVGYIpGsEBhjEgtLEtTIFxYsAKFWViwAYVZLSwgsAMlRbAZI0RFsBojREVlI0UgsAMlYGogsAkjQiNoimpgYSCwGoqwAFJ5IbIaGkC5/+AAGkUgilRYIyGwPxsjWWFEHLEUAIpSebMZQCAZRSCKVFgjIbA/GyNZYUQtLLEQEUMjQwstLLEOD0MjQwstLLEMDUMjQwstLLEMDUMjQ2ULLSyxDg9DI0NlCy0ssRARQyNDZQstLEtSWEVEGyEhWS0sASCwAyUjSbBAYLAgYyCwAFJYI7ACJTgjsAIlZTgAimM4GyEhISEhWQEtLEuwZFFYRWmwCUNgihA6GyEhEFktLAGwBSUQIyCK9QCwAWAj7ewtLAGwBSUQIyCK9QCwAWEj7ewtLAGwBiUQ9QDt7C0sILABYAEQIDwAPC0sILABYQEQIDwAPC0ssCsrsCoqLSwAsAdDsAZDCy0sPrAqKi0sNS0sdrgCsCNwECC4ArBFILAAUFiwAWFZOi8YLSwhIQxkI2SLuEAAYi0sIbCAUVgMZCNki7ggAGIbsgBALytZsAJgLSwhsMBRWAxkI2SLuBVVYhuyAIAvK1mwAmAtLAxkI2SLuEAAYmAjIS0stAABAAAAFbAIJrAIJrAIJrAIJg8QFhNFaDqwARYtLLQAAQAAABWwCCawCCawCCawCCYPEBYTRWhlOrABFi0sS1MjS1FaWCBFimBEGyEhWS0sS1RYIEWKYEQbISFZLSxLUyNLUVpYOBshIVktLEtUWDgbISFZLSwBS1MjS1FasAIlsAQlsAYlSSNFGGlSWliwAiWwAiWwBSVGI0VpYEhZISEhLSywE0NYAxsCWS0ssBNDWAIbA1ktLEtUsBJDXFpYOBshIVktLLASQ1xYDLAEJbAEJQYMZCNkYWS4BwhRWLAEJbAEJQEgRrAQYEggRrAQYEhZCiEhGyEhWS0ssBJDXFgMsAQlsAQlBgxkI2RhZLgHCFFYsAQlsAQlASBGuP/wYEggRrj/8GBIWQohIRshIVktLEtTI0tRWliwOisbISFZLSxLUyNLUVpYsDsrGyEhWS0sS1MjS1FasBJDXFpYOBshIVktLAyKA0tUsAQmAktUWoqKCrASQ1xaWDgbISFZLSxGI0ZgiopGIyBGimCKYbj/gGIjIBAjirkDWANYinBFYCCwAFBYsAFhuP+6ixuwRoxZsBBgaAE6LSyxAgBCsSMBiFGxQAGIU1pYuRAAACCIVFiyAgECQ2BCWbEkAYhRWLkgAABAiFRYsgICAkNgQrEkAYhUWLICIAJDYEIASwFLUliyAggCQ2BCWRu5QAAAgIhUWLICBAJDYEJZuUAAAIBjuAEAiFRYsgIIAkNgQlm5QAABAGO4AgCIVFiyAhACQ2BCWblAAAIAY7gEAIhUWLICQAJDYEJZWVlZWS0ssAJDVFhLUyNLUVpYOBshIVkbISEhIVktAAAAAAIBHAAABRwFAAADAAcATbECAbsCvgAGAAcCv7IABQS4Ar60AwAKBwS4Ar61AQAZCAYFvwK+AAIAAwEpAAkBawFeABgrEPY8/TxOEPQ8Tf08AD88/TwQ/Dz9PDEwIREhESUhESEBHAQA/CADwPxABQD7ACAEwAAAAAEAAAADAAAAAAAAXw889Qg5CAAAAAAAouMdwgAAAAC51bUo+3T9jBAACA4AAAAJAAEAAQAAAAAAAQAAByH+RQBXEAD7dP4mEAAAAQAAAAAAAAAAAAAAAAAABooGOQEcAAAAAAIAAAACAAAAAqoA5ANEAIUEAAAlBAAAbAaqAEgGOQBLAXEAUQKqAFQCqgAuBAAAkQSDACUCAABuAqoAUwIAAJECOQADBAAASgQAAPAEAAAsBAAAUwQAACAEAABiBAAAWAQAAEwEAAB8BAAAUQI5ALACOQCOBIMAJQSDACUEgwAlA40AXAdeAGEFxwAQBVYAIgVWAEoFxwAjBOMAKgRzACEFxwBIBccAIwKqADMDHQAqBccAIgTjACkHHQAiBcf/5QXHAEgEcwAiBccASAVWACMEcwCABOMAPgXHAAsFxwASB40AGwXHAA8FxwATBOMAGgKqAKgCOQADAqoASwPBACUEAP/vAqoAdgONAEkEAP/7A40ARgQAAEQDjQBMAqoATwQAAD0EAAANAjkAPAI5/2MEAAARAjkAPQY5ABEEAAAMBAAARQQA//kEAABEAqoADQMdAGQCOQAUBAAAAgQAABEFxwANBAAAGwQAAAwDjQApA9cBGwGaAKED1wCxBFQAFAXHAA4FxwAOBVYASgTjACoFx//lBccASAXHAAsDjQBJA40ASQONAEkDjQBJA40ASQONAEkDjQBGA40ATAONAEwDjQBMA40ATAI5ADwCOQA8AjkADQI5AAIEAAAMBAAARQQAAEUEAABFBAAARQQAAEUEAAACBAAAAgQAAAIEAAACBAAAZQMzAGIEAACBBAAAPQQAAJwCzQBwA6D/8gQAACMGFABFBhQARQfXAB4CqgDsAqoAOQRkABkHHf/oBccASQW0ADUEZAAIBGQAGARkABgEAAACBJwAhgP0AEAFtAArBpYALgRkAD4CMQAAAjX/+gJ7AB0GJQBHBVYASQQAACcDjQBZAqoA5ASDACQEZABTBAAAAgRkAB4E5QAaBAAAQAQAAEAIAADmBccADgXHAA4FxwBIBx0ASwXHAEMEAP/uCAD/7QONAEMDjQBDAqoAuQKqAMEEZAAXA/QALwQAAAwFxwATAVb+qwQA/+kCqgB3AqoAcwRzABkEcwAXBAAAiwIAAJECqgDBA40AQwgAAEEFxwAOBOMAKgXHABAE4wAqBOMAKgKqADMCqgAyAqoAMgKqADIFxwBIBccASAXHAEgFxwALBccACwXHAAsCOQA8AqoAPAKqABYCqgAXAqoANwKqAOkCqgCWAqoAuwKqAE4CqgCUAqoAPATjABYCOQAeBHMAfgMdAGQE4wAaA40AKQGaAKEFxwAjBAAARAXHABMEAAAMBHMAJAQA//kEgwAlBIMApQJmAIgCZgAUAmYALAYAAIYGAACGBgAAKgQAACEFxwBIBAAAPQKqADMEcwCAAx0AZAVWAEoDjQBGBVYASgONAEYEAAAmBAD/7wKqAe8FxwAQA40ASQXHABADjQBJBccAIwUsAEQFxwAjBOMAKgONAEwE4wAqA40ATATjACkCOQA9BOMAKQNAADwE4wApAsAANgXH/+UEAAAMBcf/5QQAAAwFxwBIBAAARQVWACMCqgANBVYAIwKqAA0EcwCAAx0AZATjAD4COQAUBOMAPgNrABMFxwALBAAAAgXHAAsEAAACBOMAGgONACkE4wAaA40AKQSgACUFxwBMBdkARwQxAFcDxQBGA1wARwRQAEYDNwAMBJ4ARQQA/+8ElQDkAoUAAgfAACwIAABPBAAAmQgAAE8EAACZCAAATwQAAJgEAACYB9UBagXHAMAEgwAmBM0AmQSDACYE1QIiBNUBBQWr/+kFqwJ+BasCfgWr/+kFqwJ+Bav/6QWrAn4Fq//pBav/6QWr/+kFq//pBav/6QWrAcAFqwJ+BasBwAWrAcAFq//pBav/6QWr/+kFqwJ+BasBwAWrAcAFq//pBav/6QWr/+kFqwJ+BasBwAWrAcAFq//pBav/6QWr/+kFq//pBav/6QWr/+kFq//pBav/6QWr/+kFq//pBav/6QWr/+kFq//pBav/6QWr/+kFq//pBasC1gWrAGYFq//qBdX//wTVAJIIAAAAB+sBMAfrASAH6wEwB+sBIATVALIE1QCABNUAKggrAZgIawG4B1UAEAYAAPQGAABvBEAAOgVAADcEwAA/BBUAQAQAACUGAABVBasALwRrADsE1QADAcAAiQNVAKIGqwA0A9UAZATVAJIC1gCDAtYAgwTVALIC1gBwBccAEAONAEkFVgBKA40ARgVWAEoDjQBGBOMAKgONAEwE4wAqA40ATATjACoDjQBMBccASAQAAD0FxwBIBAAAPQXHAEgEAAA9BccAIwQAAA0FxwAjBAAADQKqABYCOf/eAqoAFwI5/98CqgAzAjn//gKqADMCOQA5Ax0AKgI5/2MFxwAiBAAAEQQAABEE4wApAjkAPQXH/+UEAAAMBZ0AJgP1AAwFxwBIBAAARQXHAEgEAABFBVYAIwKqAA0EcwCAAx0AZATjADsCOQAQBccACwQAAAIFxwALBAAAAgXHAAsEAAACBccADgQAAAIHjQAbBccADQXHABMEAAAMAjkAFgXHAA8DjQBJBx3/6AVWAEkFxwBJBAAAJwI5ALIHjQAbBccADQeNABsFxwANB40AGwXHAA0FxwATBAAADAKqALgCqv/bBAAAPQTNAFoGAACGBgAAKgYAADEGAAAlAqoAwwKqALsCqgDsAqr/6gXHABAFjf9cBnf/XANK/1wFx/+2Bof/XAXy/7MCJ/+xBccAEAVWACIFJQAyBOMAKgTjABoFxwAjAqoAMwXHACIFzQAcBx0AIgXH/+UFJQBPBccASAXHACUEcwAiBKgAIATjAD4FxwATBccADwXnABgF8gA8AqoAMgXHABMEMQBXA1wARwQvAAsCJwAlA/b/+gQSAG4DiQAAA1AARgQvAAsD1QBRAicAJQQIABUD4QAZBEoAdAOe/9MDkQBGBAAARQP+AFkDKwBGA/b/+gONABgFAgAcBUQASwInAAAD9v/6BAAARQP2//oFRABLBOMAKgYEADcEoAAlBUgASwRzAIACqgAzAqoAMgMdACoG+gANBvoAJwXuADYFVgAlBaoAGgXHACUFxwAQBJgAJAVWACIEoAAlBXUAGgTjACoHKwASBAIAKwXHACUFxwAlBVYAJQVtABIHHQAiBccAIwXHAEgFxwAlBHMAIgVWAEoE4wA+BaoAGgZSAEwFxwAPBccAJQUz//oIEgA5CBIAOQWmADYG+gAlBJgAJAVIADoIOQAmBVb/7gONAEkEEgBOA8cAMANIAB8EEgAaA40ATAWHABcDKQAYBEgALgRIAC4D4wAuA/4ADAUQAC4ESAAuBAAARQRIAC4EAP/5A40ARgN/AAwEAAAMBS8AVwQAABsESAAuBAYAHgYpAC4GKQAuBCMADAVgAC0DpgAuA28AGwX6AC0Drv//A40ATAPdABEDSAAfA28ARgMdAGQCOQA8AjkAAgI5/2MF0QAMBckALQQAAA0D4wAuBAAADARIAC4DmgAlAs8AHwgAAEEHogAQBAoADQKqAQECqgAcAqoAMgKqABICqgECAqoAjwKqAI8CqgCPAqoAkAKqAQICqgAcAqoBAgKqASEC2QBWAqoAjwJUAOACvgKvAr7/awI5ALAD2gBfA6QAMwKvACEDWgBDA8UATgI7AEMCSgBOA9AAWAPOAEMCIgBDA54AQwN2ADMDdAAPBA8AZAPiAE4CMgBDAnAAIQPNAF8DogBDA6IAQwOGAFgD3ABDA64APQPKAGkDwABDBOIAQwQAACEEdQBDBF0AQwREAEMBrABrAvkAawY2AJYCO/+dA54AQwOeAEMDdP9bA3T/WwOiADME4gBDBOIAQwTiAEME4gBDA9oAXwPaAF8D2gBfA6QAMwKvACEDWgBDA8UATgI7AEMCeQAMA84AQwIiAEMDngBDA3YAMwN0AA8D4gBOAnAAIQPNAF8DogBDA4YAWAOuAD0DygBpA8AAQwTiAEMEAAAhAjsAQwOkADMDdgAzA4YAWAQEAA8AAP/cAAD/JQAA/9wAAP5RAo0AqwKNAKAC2gBDA00AeQGo/7oBnABGAeUARgGcAEYBnABGAa0ASAGcAEYBsQBGAVEARgQ1AXwENQEuBDUAtwQ1AIEENQEsBDUAvgQ1AK8ENQCBBDUAmgQ1ANsENQCFAo0AwQQ1ALMGAAEABgABAAJCADYGAAEABDUAngQ1AJgENQDLBgABAAYAAQAGAAEABgABAAYAAQABsQBGBgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAFG/+6BgABAAYAAQAGAAEABbUAOgW1ADoB9P+6AfT/ugYAAQAGAAEABgABAAYAAQAEgQA2BDUANgQ9/7oEPf+6A+kASgPpAEoGfwAUB3YAFAMn/7oEHv+6Bn8AFAd2ABQDJ/+6BB7/ugUbADIEtQAkBgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAHPADABsQBGAbEARgGxAEABsQBGBgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABAAAGwgAAAAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEAAo0AfwKNAF0GAAEABO4AFQNNAHkBqAAOAdb/3AGoAFYB1gAQA3UAMgN1ADIBqAAtAdYAEwUbADIEtQAkAfT/ugH0/7oBqACTAdYAEwW1ADoFtQA6AfT/ugH0/7oCQgAAAwD/9wW1ADoFtQA6AfT/ugH0/7oFtQA6BbUAOgH0/7oB9P+6BIEANgQ1ADYEPf+6BD3/ugSBADYENQA2BD3/ugQ9/7oEgQA2BDUANgQ9/7oEPf+6ArMAXwKzAF8CswBfArMAXwPpAEoD6QBKA+kASgPpAEoGkgA+BpIAPgQ//7oEP/+6BpIAPgaSAD4EP/+6BD//ugjJAD4IyQA+BsX/ugbF/7oIyQA+CMkAPgbF/7oGxf+6BKf/ugSn/7oEp/+6BKf/ugSn/7oEp/+6BKf/ugSn/7oEWgAqA5oANgQ1/7oDJ/+6BFoAKgOaADYENf+6Ayf/ugZPACcGTwAnAiT/ugIa/7oEpwBGBKcARgIk/7oCGv+6BM8ALQTPAC0DJ/+6Ayf/ugQNAEcEDQBHAaj/ugGo/7oCtAAjArQAIwMn/7oDJ/+6BDUARQQ1AEUB9P+6AfT/ugJCADYDAP/3A5r/ugMn/7oDdQAyA3UAMgUbADIEtQAkBRsAMgS1ACQB9P+6AfT/ugRaAEAEzgBABFoAJgTOADAEWgBTBM4AQQRaAFMEzgBBBgABAAYAAQABnABGAZwARgYAAQAGAAEABgABAAFRAEYBsQBGBgABAAYAAQABrQBIAeUARgYAAQAGAAEABgABAAGxAEYBsQBGAbEARgGxAEYBsQBAAc8AMAYAAQABnABGAZwARgYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAKNAMoCjQDHAo0AxgYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAYAAQAGAAEABgABAAEA/7oIAP+6EAD/ugXHAEgEOwBFBjUACwRWAAIAAP3MAAD8FAAA/RMAAP5CAAD84AAA/dQAAP5iAAD+KwAA/bcAAPyYAAD9iAAA/AgAAPz+AAD+/wAA/wMAAP6eBBoAogYAAIgGAAAUAAD+cAAA/dQAAP32AAD9dwAA/mIAAP27AAD72AAA+9gAAPt0AAD8/gAA/IwAAPxGAAD9JwAA/LQAAPyoAAD8rgAA/EQAAP4UAAD+cAAA/ZEAAPxxAAD9wwAA/kcAAP5iAAD8wwAA/eEAAP2HAAD9SwAA/ZcAAP1LAAD8igAA/GIAAPwJAAD71wI5ADwFxwAQA40ASQXHABADjQBJBccAEAONAEkFxwAQA40ASQXHABADjQBJBccAEAONAEkFxwAQA40ASQXHABADjQBJBccAEAONAEkFxwAQA40ASQXHABADjQBJBccAEAONAEkE4wAqA40ATATjACoDjQBMBOMAKgONAEwE4wAqA40ATATjACoDjQBMBOMAKgONAEwE4wAqA40ATATjACoDjQBMAqoAMwI5ADwCqgAzAjkAPAXHAEgEAABFBccASAQAAEUFxwBIBAAARQXHAEgEAABFBccASAQAAEUFxwBIBAAARQXHAEgEAABFBccASAQ7AEUFxwBIBDsARQXHAEgEOwBFBccASAQ7AEUFxwBIBDsARQXHAAsEAAACBccACwQAAAIGNQALBFYAAgY1AAsEVgACBjUACwRWAAIGNQALBFYAAgY1AAsEVgACBccAEwQAAAwFxwATBAAADAXHABMEAAAMBccAEAONAEkCqgAzAjkABgXHAEgEAABFBccACwQAAAIFxwALBAAAAgXHAAsEAAACBccACwQAAAIFxwALBAAAAgAA/wkAAP8JAAD/CQAA/wkEoAAjA0gAHwcrABIFhwAXBVYAJQPjAC4FVgAlA+MALgXHACMESAAuBccAEwQAAAIFxwATBAAAAgXHAA8EAAAbBTP/+gQGAB4FMwAlBAAADQXHACsDjQBMBccASAQAAEUFtQA6AfT/ugIk/7oCGv+6BKcARgH0AJ4B9AAQAfQAGwH0ABAB9ABrAfT/+QIn/84BqAAPAaj/9QKqAKQCqgCkAagADgGoAFYBqABWAAD/zwGoAA8B1v+/Aaj/9QHW/80BqAAdAdb/9QGoAJMB1gATA3UAMgN1ADIDdQAyA3UAMgUbADIEtQAkBbUAOgW1ADoB9P+6AfT/ugW1ADoFtQA6AfT/ugH0/7oFtQA6BbUAOgH0/7oB9P+6BbUAOgW1ADoB9P+6AfT/ugW1ADoFtQA6AfT/ugH0/7oFtQA6BbUAOgH0/7oB9P+6BbUAOgW1ADoB9P+6AfT/ugSBADYENQA2BD3/ugQ9/7oEgQA2BDUANgQ9/7oEPf+6BIEANgQ1ADYEPf+6BD3/ugSBADYENQA2BD3/ugQ9/7oEgQA2BDUANgQ9/7oEPf+6BIEANgQ1ADYEPf+6BD3/ugKzADICswAyArMAXwKzAF8CswBfArMAXwKzADICswAyArMAXwKzAF8CswBfArMAXwKzAF8CswBfArMAOAKzADgCswBJArMASQPpAEoD6QBKA+kASgPpAEoD6QBKA+kASgPpAEoD6QBKA+kASgPpAEoD6QBKA+kASgPpAEoD6QBKA+kASgPpAEoGkgA+BpIAPgQ//7oEP/+6BpIAPgaSAD4EP/+6BD//ugaSAD4GkgA+BD//ugQ//7oIyQA+CMkAPgbF/7oGxf+6CMkAPgjJAD4Gxf+6BsX/ugSn/7oEp/+6BFoAKgOaADYENf+6Ayf/ugZPACcGTwAnBk8AJwIk/7oCGv+6Bk8AJwZPACcCJP+6Ahr/ugZPACcGTwAnAiT/ugIa/7oGTwAnBk8AJwIk/7oCGv+6Bk8AJwZPACcCJP+6Ahr/ugSnAEYEpwBGBKcARgSnAEYGfwAUB3YAFAMn/7oEHv+6Bn8AFAd2ABQDJ/+6BB7/ugTPAC0EzwAtAyf/ugMn/7oEzwAtBM8ALQMn/7oDJ/+6BM8ALQTPAC0DJ/+6Ayf/ugZ/ABQHdgAUAyf/ugQe/7oGfwAUB3YAFAMn/7oEHv+6Bn8AFAd2ABQDJ/+6BB7/ugZ/ABQHdgAUAyf/ugQe/7oGfwAUB3YAFAMn/7oEHv+6BA0ARwQNAEcBqP+6Aaj/ugQNAEcEDQBHAaj/ugGo/7oEDQBHBA0ARwGo/7oBqP+6BA0ARwQNAEcBqP+6Aaj/ugQ1AEUENQBFAfT/ugH0/7oENQBFBDUARQQ1AEUENQBFBDUARQQ1AEUB9P+6AfT/ugQ1AEUENQBFBIEANgQ1ADYEPf+6BD3/ugJCADYDAP/3AxoAGgMaABoDGgAaA3UAMgN1ADIDdQAyA3UAMgN1ADIDdQAyA3UAMgN1ADIDdQAyA3UAMgN1ADIDdQAyA3UAMgN1ADIDdQAyA3UAMgUb/7oEtf+6BRsAMgS1ACQB9P+6AfT/ugN1ADIDdQAyBRsAMgS1ACQB9P+6AfT/ugUbADIEtQAkBn8ARQZ/AEUGfwBFBn8ARQGoACgAAP4pAAD+ogAA/zAAAP8dAAD/EgAA/5IAAP5+CPwAMgitADIAAP+1AAD/tgAA/u0AAP9kAAD+fgAA/58BjQAAAvb//QAA/oIAAP8QBM0AMgAA/1gAAP9YAAD/ZAaSAD4GkgA+BD//ugQ//7oIyQA+CMkAPgbF/7oGxf+6BFoAKgOaADYENf+6Ayf/ugNNAHkCtAAjAkIANgH0/7oCkP+6AfQALwH0ADsB9AASAfQAsQH0AG0GfwAUB3YAFAIiAEMAAP7nArwAAAREAEMEWv/1BM7/9QRaAFMEzgBBBFoAUwTOAEEEWgBTBM4AQQRaAFMEzgBBBFoAUwTOAEEEWgBTBM4AQQQ1AHEENQCtBFoADwTOAA8AAAAAAAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAAAdgAAAHYAAAB2AAEAAAaKAPIAPAB2AAcAAgAQAC8AVgAABcoPEwADAAIAAAAUAPYAAQAAAAAAAAB/AAAAAQAAAAAAAQAPAH8AAQAAAAAAAgAHAI4AAQAAAAAAAwA5AJUAAQAAAAAABAAPAM4AAQAAAAAABQAMAN0AAQAAAAAABgARAOkAAQAAAAAABwBsAPoAAQAAAAAACAATAWYAAQAAAAAACQBDAXkAAwABBAkAAAD+AbwAAwABBAkAAQAeAroAAwABBAkAAgAOAtgAAwABBAkAAwByAuYAAwABBAkABAAeA1gAAwABBAkABQAYA3YAAwABBAkABgAiA44AAwABBAkABwDYA7AAAwABBAkACAAmBIgAAwABBAkACQCGBK5UeXBlZmFjZSCpIFRoZSBNb25vdHlwZSBDb3Jwb3JhdGlvbiBwbGMuIERhdGEgqSBUaGUgTW9ub3R5cGUgQ29ycG9yYXRpb24gcGxjL1R5cGUgU29sdXRpb25zIEluYy4gMTk5MC0xOTkyLiBBbGwgUmlnaHRzIFJlc2VydmVkVGltZXMgTmV3IFJvbWFuUmVndWxhck1vbm90eXBlOlRpbWVzIE5ldyBSb21hbiBSZWd1bGFyOlZlcnNpb24gMy4wMCAoTWljcm9zb2Z0KVRpbWVzIE5ldyBSb21hblZlcnNpb24gMy4wMFRpbWVzTmV3Um9tYW5QU01UVGltZXMgTmV3IFJvbWFuqCBUcmFkZW1hcmsgb2YgVGhlIE1vbm90eXBlIENvcnBvcmF0aW9uIHBsYyByZWdpc3RlcmVkIGluIHRoZSBVUyBQYXQgJiBUTSBPZmYuIGFuZCBlbHNld2hlcmUuTW9ub3R5cGUgVHlwb2dyYXBoeU1vbm90eXBlIFR5cGUgRHJhd2luZyBPZmZpY2UgLSBTdGFubGV5IE1vcmlzb24sIFZpY3RvciBMYXJkZW50IDE5MzIAVAB5AHAAZQBmAGEAYwBlACAAqQAgAFQAaABlACAATQBvAG4AbwB0AHkAcABlACAAQwBvAHIAcABvAHIAYQB0AGkAbwBuACAAcABsAGMALgAgAEQAYQB0AGEAIACpACAAVABoAGUAIABNAG8AbgBvAHQAeQBwAGUAIABDAG8AcgBwAG8AcgBhAHQAaQBvAG4AIABwAGwAYwAvAFQAeQBwAGUAIABTAG8AbAB1AHQAaQBvAG4AcwAgAEkAbgBjAC4AIAAxADkAOQAwAC0AMQA5ADkAMgAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZABUAGkAbQBlAHMAIABOAGUAdwAgAFIAbwBtAGEAbgBSAGUAZwB1AGwAYQByAE0AbwBuAG8AdAB5AHAAZQA6AFQAaQBtAGUAcwAgAE4AZQB3ACAAUgBvAG0AYQBuACAAUgBlAGcAdQBsAGEAcgA6AFYAZQByAHMAaQBvAG4AIAAzAC4AMAAwACAAKABNAGkAYwByAG8AcwBvAGYAdAApAFQAaQBtAGUAcwAgAE4AZQB3ACAAUgBvAG0AYQBuAFYAZQByAHMAaQBvAG4AIAAzAC4AMAAwAFQAaQBtAGUAcwBOAGUAdwBSAG8AbQBhAG4AUABTAE0AVABUAGkAbQBlAHMAIABOAGUAdwAgAFIAbwBtAGEAbgCuACAAVAByAGEAZABlAG0AYQByAGsAIABvAGYAIABUAGgAZQAgAE0AbwBuAG8AdAB5AHAAZQAgAEMAbwByAHAAbwByAGEAdABpAG8AbgAgAHAAbABjACAAcgBlAGcAaQBzAHQAZQByAGUAZAAgAGkAbgAgAHQAaABlACAAVQBTACAAUABhAHQAIAAmACAAVABNACAATwBmAGYALgAgAGEAbgBkACAAZQBsAHMAZQB3AGgAZQByAGUALgBNAG8AbgBvAHQAeQBwAGUAIABUAHkAcABvAGcAcgBhAHAAaAB5AE0AbwBuAG8AdAB5AHAAZQAgAFQAeQBwAGUAIABEAHIAYQB3AGkAbgBnACAATwBmAGYAaQBjAGUAIAAtACAAUwB0AGEAbgBsAGUAeQAgAE0AbwByAGkAcwBvAG4ALAAgAFYAaQBjAHQAbwByACAATABhAHIAZABlAG4AdAAgADEAOQAzADIAAAACAAAAAAAA/yEAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgJjMwC6AFT/wAPhs0VFMkC4A+GzKy4yQLgD4bIoKTK5/8AD4bIaHDK9A+ECrAAnAB//wAPfshYbMrn/wAPeskJCMrn/wAPesjY4Mrn/wAPesyotMt9BCgPeAO8D3gACA94D3wAoAB//wAPfsyguMvBBDQPfAAEDfgAPAQEAHwCgA90AsAPdAAIAQAPasyQmMp+/A8wAAQPKA8kAZAAf/8ADybINETJBCgPHA7cAEgAfA7YDtQBkAB//wAO1sw4RMgBBcwONAAEAwAONANADjQDgA40A8AONAAQAbwOnAH8DpwCPA6cArwOnAAQADwOnAB8DpwAvA6cATwOnAAQDqwOrAO8DpQABAA8DpQAvA6UAbwOlAI8DpQAEAFQDqgABAGsDqgABA6gDagAiAB8DjAOUABUAHwOLA5MAFQAfA6QDkwAaAB8DogOUAB4AHwOhA5MAHgAfA58DlAAeAB8DmwOUABoAHwOaA5MAHgAfA5kDlAAWAB8DmAOUABYAHwOXA5MAGwAfA5YDlAAbAB8DlQOTABsAHwN2A3UAGgAfA3QDdQAaAB8DoANzsh4fEEEeA5MAIAOTADADkwADACADlAAwA5QAQAOUAAMAAAOUAAEDgwNsAB4AHwOxA2wAMgAfA20DbAAyAB//wAN9siEjMrn/wAN9sxcZMqBBCgN9ALADfQDAA30A0AN9AAT/wAN8siEjMrn/wAN8sxcZMqBBLQN8ALADfADAA3wA0AN8AAQAMANzAEADcwACAAADcwAQA3MAIANzAAMA4ANzAPADcwACALADcwDAA3MA0ANzAAMAhANzAJADcwCgA3MAAwN3A2oAKQAfA4kDarIoH0C4A2ezOUAyP7sDZgABAEADZrMZHTKPuwNmAAEAQANmswkKMkC4A2azCQ4yQLgDZrMJDzI/uwNlAAEAQANlswkMMkC4A2WzGh0yQLgDZbMJDjJrQQ4DYwB7A2MAAgAUA2MAJANjADQDYwBEA2MABANjsiQvH7oDTgBtCABADh9/An8DfwR/BQQwRAESvwMyAFAIAAAfABIDLQA8CABAKR9fPAE3YAlwCYAJAxAJIAkwCUAJUAkFbwN/A48DAx8DLwM/A08DXwMFuP/Asgc6M7j/wEBHBjozkAugC7ALwAvQCwWwBsAG0AbgBvAGBSAGMAZABlAGYAZwBoAGkAagBgmQBpAHAmALcAuACwMQCyALMAtAC1ALBR8HAaBBhQNiAAEAAANiABADYgBwA2IAkANiAAQA8ANfAAEAIANeACADXwAwA18AQANeAAQAAANeAAADXwAQA18A0ANeAOADXwAFABADDwAgAw8AMAMPANADDwDgAw8ABQAAAw8AEAMPAFADDwBgAw8AcAMPANADDwAGAAADDwAQAw8AIAMPADADDwDgAw8A8AMPAAYDDwAnAAADDgAwAw4AAgDgAw4A8AMOAAIDDgBKAOADDQDwAw0AAgMNACcA0AL8AAEAEAL8ACAC/ABQAvwAAwDQAvwA4AL8AAIAAAL8ABAC/AAgAvwAMAL8AFAC/ABgAvwABgDgAvwA8AL8AAIAIAL8ADAC/ABAAvwAAwL8QGEnwCkBsCkBoCkBkCkBQDw/QTJAIj9BMhISEl8jXyVfKF+lBG8jbyVvKG+lBE8jTyVPKE+lBD8jPyU/KD+lBC8jLyUvKC+lBB8jHyUfKB+lBI9Mr0y/TM9MBF9Mb0x/TAM3uP/As7IrMDK4/8CzsiIlMrj/wLWyGRoyNw9BOwKvAAEAXwKvAJ8CrwDfAq8AAwAfAq8ALwKvAD8CrwBvAq8ABAKvAq8AHwKtAC8CrQA/Aq0ATwKtAF8CrQAFAN8CrQABAA8CrQAfAq0APwKtAF8CrQCfAq0ABQBfAq0A3wKtAAIADwKtAB8CrQA/Aq0AAwBAAqyyOjNPQUoCrABfAqwAnwKsAAMALwKsAD8CrAACAA8CrAA/AqwArwKsAAMAsAKsAOACrAACAE8CrABfAqwAoAKsAAMAHwKsAC8CrAA/AqwAAwAPA1oAAQAPA1oAHwNaAD8DWgBfA1oAcANaAAUAzwNXAN8DVwACAA8DVwAfA1cAcANXAK8DVwAEA1oDWgNXA1cCrQKtAqwCrAMsQA0xFR8AFhYAAAASEQgQQRACDABKAA0BqABKAA0BmABKAA0BiQBKAA0BPwBKAA0BJEAOSg32Sg2+Sg2GSg0nSg2+AigAQQANAZQAQQANASFAC0ENtEENT0ENKUENQRACFwAhAA0CFQAhAA0CBgAhAA0B6wAhAA0BTgAhAA0BLEAUIQ35IQ3zIQ3xIQ2dIQ1xIQ09IQ1BEAIcAB8ADQIUAB8ADQILAB8ADQGWAB8ADQFKAB8ADQEmQAsfDcYfDVcfDTcfDUENAZ4BQQANAEIBQQANAB4BQQANABsBQQANAfK0D0QPAAm7AfIARAANAgGyPCkfuAIAsjwpH7gB/7I8QR+4Af6yPEcfuAH9sjyeH7gB+rI8kx+8AfkBDwEBAB8B9rIk5B9BFQH0AUkEAQAfAfMBSQQBAB8B8QFJAKsAHwHwAUkAZwAfAaYAPAElAB8BpLI8gR9BFQGjAQ8BmgAfAaIAIggBAB8BoQBQBAEAHwGfAUkBmgAfAZ0BSQBnAB8BnLIsYh+4AZuyLHkfvAGaACwBAQAfAZeyLOQfuAGTsiyJH7gBkrIsbB+4AY+yJZ4fuAFqsjwqH0ERAWcAJAIBAB8BYwAlAqsAHwFMAQ8BmgAfAUgBSQBsAB8BR7IsiR+4AUWyLJ4fuAFEsix5H7gBQ7IjMR+4ASeyPIEfvAEjAFABAQAfAR+yI+QfQRUBHQAjAZoAHwEcACMIAQAfARsAJQgBAB8BDgEPBAEAHwENACIEAQAfAQiyI4EfuAEGtCXkH/c8uwElAB8A9QEPsp4f47wBSQFWAB8A4gFJsqsf0bkBSQQBsh/PLLgBJbYfziO7H8UkuAFWsh/ALLgIAbIfvyy4AgG1H7Ek5B+wuQFJAgG2H68sZx+tI7gIAbIfpSO4AgFACx+fPC0fmyNaH5kluAIBsh+BLLwEAQAfAG0BDwFWQAsfWSw+H0w8qx9GJbgBAbIfQDy4ASVACh86I3IfOTyrHzi4AUmzqx8xJLgEAbIfMCW4Aqu2Hyok5B8mI7gBVrIfVTe6AjUABwF1QCwHdAdiB1YHUQc7BzMHLQcgBx0HHAcUCBIIEAgOCAwICggICAYIBAgCCAAIFLj/4EArAAABABQGEAAAAQAGBAAAAQAEEAAAAQAQAgAAAQACAAAAAQAAAgEIAgBKALATA0sCS1NCAbASSwBLVEKwNytLuAf/UrA4K0uwCFBbWLEBAY5ZsDgrsAKIuAEAVFi4Af+xAQGOhRuwEkNYuQABAS+FjRu5AAEBfIWNWVkBS7DAYwBLYiCw9lMjuAEKUVqwBSNCGAAWdj8YPxI+ETlGRD4ROUZEPhE5RkQ+ETlGRD4ROUZgRD4ROUZgRCsrKysrKysrKysrGCsrKysrKysrKysrKysYHbCWS1NYsKodWbAyS1NYsP8dWUuwR1MgXFi5AnECb0VEuQJwAm9FRFlYuQF6AnFFUli5AnEBekRZWUuwR1MgXFi5ACICcEVEuQA8AnBFRFlYuQGzACJFUli5ACIBs0RZWUuwTFMgXFi5AUkAIkVEsSIiRURZWLkBwgFJRVJYuQFJAcJEWVlLsGdTIFxYuQAkAnFFRLkAUAJxRURZWLkCHgAkRVJYuQAkAh5EWVlLuAIBUyBcWLkBDwAiRUSxIiJFRFlYuQwAAQ9FUli5AQ8MAERZWUuwHFMgXFixJSVFRLEsJUVEWVixNyVFUlixJTdEWVlLsKtTIFxYsSUlRUSxIyVFRFlYuQFZACVFUli5ACUBWURZWUu4AQFTIFxYsSUlRUSxKCVFRFlYuQIIACVFUli5ACUCCERZWSsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrZUIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrAbNh3GRjRWUjRWAjRWVgI0VgsIt2aBiwgGIgILFk3EVlI0UgsAMmYGJjaCCwAyZhZbDcI2VEsGQjRCCxYWNFZSNFILADJmBiY2ggsAMmYWWwYyNlRLBhI0SxAGNFVFixY0BlRLJhQGFFI2FEWbOmf0NLRWUjRWAjRWVgI0VgsIl2aBiwgGIgILFDf0VlI0UgsAMmYGJjaCCwAyZhZbB/I2VEsEMjRCCxpktFZSNFILADJmBiY2ggsAMmYWWwSyNlRLCmI0SxAEtFVFixS0BlRLKmQKZFI2FEWUtSQgFLUFixCABCWUNcWLEIAEJZswILChJDWGAbIVlCFhBwPrASQ1i5OyEYfhu6BAABqAALK1mwDCNCsA0jQrASQ1i5LUEtQRu6BAAEAAALK1mwDiNCsA8jQrASQ1i5GH47IRu6AagEAAALK1mwECNCsBEjQgArABhFaURFaURFaURFaURzc3N0c3NzdHV1K3NzdHR1GEVpRHNzdCtLsCFTS7BGUVpYsDywPEWwQGBEWQErKysrdXV1dXV1dXVDWEAQvzzPPAJvPH88jzyfPK88BXV1WUNYQBK/Is8iAl8ibyJ/Io8inyKvIgZ1dVlDXFi2QDyfIu8iA3VZKysBdHR0dEVEc3N0dHV1RURzRURzdEVEc3R1c3Nzc3MAdXV1c3V1dSsrdXV1dSt1K0NYQSIAYwMtAAEAAwMtABMDLQAjAy0AMwMtAFMDLQAFAMMDLQDTAy0A4wMtAPMDLQAEAIMDLQCTAy0AowMtALMDLQAEAy0DLUUYaUR0dHV1WStDWLkAGAMyszA1Mji4AzKzYWYyOLgDMrNTWjI4uAMys0VOMji4AzKzPEEyGLgDMrI/MwpBDwMyAAEAugMyAMoDMgDaAzIA6gMyAPoDMgAFAzIDMkUYaUR0dSsrKysrK1lzAHMrASt1dQArKyt0ACsrK3MrdAErACsrAXNzc3R0cysrAHMrKwArKysBc3RzKwErKwErKysrKysrKysrKysrKwABc3UAc3MARWlEAHNzAXN0KysrKytzKwBzK3UrK3MrKysrKysrKysrAA==" ); diff --git a/test/font/font_test.html b/test/font/font_test.html index c8b09b700e9c6..4b8d5abcd3d5b 100644 --- a/test/font/font_test.html +++ b/test/font/font_test.html @@ -1,25 +1,24 @@ - + - - PDF.js font tests + + PDF.js font tests - + - - + + - - - - - + + + + diff --git a/test/font/fontutils.js b/test/font/fontutils.js index 1b2bbb0547dc5..d5e1972dbd935 100644 --- a/test/font/fontutils.js +++ b/test/font/fontutils.js @@ -14,22 +14,10 @@ * limitations under the License. */ -import { bytesToString, stringToBytes } from "../../src/shared/util.js"; - -function decodeFontData(base64) { - const str = atob(base64); - return stringToBytes(str); -} - -function encodeFontData(data) { - const str = bytesToString(data); - return btoa(str); -} - async function ttx(data) { const response = await fetch("/ttx", { method: "POST", - body: encodeFontData(data), + body: data.toBase64(), }); if (!response.ok) { @@ -45,4 +33,4 @@ function verifyTtxOutput(output) { } } -export { decodeFontData, encodeFontData, ttx, verifyTtxOutput }; +export { ttx, verifyTtxOutput }; diff --git a/test/integration/accessibility_spec.mjs b/test/integration/accessibility_spec.mjs index dd5e13cf0e415..2c04b5f00c0b3 100644 --- a/test/integration/accessibility_spec.mjs +++ b/test/integration/accessibility_spec.mjs @@ -181,7 +181,10 @@ describe("accessibility", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("tagged_stamp.pdf", ".annotationLayer"); + pages = await loadAndWait( + "tagged_stamp.pdf", + ".annotationLayer #pdfjs_internal_id_21R" + ); }); afterEach(async () => { @@ -302,4 +305,243 @@ describe("accessibility", () => { ); }); }); + + describe("MathML in AF entry from LaTeX", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("bug1937438_af_from_latex.pdf", ".textLayer"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the MathML is correctly inserted", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const isSanitizerSupported = await page.evaluate(() => { + try { + // eslint-disable-next-line no-undef + return typeof Sanitizer !== "undefined"; + } catch { + return false; + } + }); + if (isSanitizerSupported) { + const mathML = await page.$eval( + "span.structTree span[aria-owns='p58R_mc13'] > math", + el => el?.innerHTML ?? "" + ); + expect(mathML) + .withContext(`In ${browserName}`) + .toEqual( + ` x2 = |x| ` + ); + + // Check that the math corresponding element is hidden in the text + // layer. + const ariaHidden = await page.$eval("span#p58R_mc13", el => + el.getAttribute("aria-hidden") + ); + expect(ariaHidden).withContext(`In ${browserName}`).toEqual("true"); + } else { + // eslint-disable-next-line no-console + console.log( + `Pending in Chrome: Sanitizer API (in ${browserName}) is not supported` + ); + } + }) + ); + }); + }); + + describe("MathML with some attributes in AF entry from LaTeX", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("bug1997343.pdf", ".textLayer"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the MathML is correctly inserted", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const isSanitizerSupported = await page.evaluate(() => { + try { + // eslint-disable-next-line no-undef + return typeof Sanitizer !== "undefined"; + } catch { + return false; + } + }); + if (isSanitizerSupported) { + const mathML = await page.$eval( + "span.structTree span[aria-owns='p21R_mc64']", + el => el?.innerHTML ?? "" + ); + expect(mathML) + .withContext(`In ${browserName}`) + .toEqual( + ' 𝑛 𝑝 = 𝑛 mod 𝑝 ' + ); + } else { + // eslint-disable-next-line no-console + console.log( + `Pending in Chrome: Sanitizer API (in ${browserName}) is not supported` + ); + } + }) + ); + }); + }); + + describe("MathML tags in the struct tree", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("bug1937438_mml_from_latex.pdf", ".textLayer"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the MathML is correctly inserted", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const mathML = await page.$eval( + "span.structTree span[role='group'] span[role='group']:last-child > span math", + el => el?.innerHTML ?? "" + ); + expect(mathML) + .withContext(`In ${browserName}`) + .toEqual( + `𝑐=𝑎2+𝑏2` + ); + const ariaHidden = await page.$eval("span#p76R_mc16", el => + el.getAttribute("aria-hidden") + ); + expect(ariaHidden).withContext(`In ${browserName}`).toEqual("true"); + }) + ); + }); + }); + + describe("Artifacts must be aria-hidden", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("bug1937438_mml_from_latex.pdf", ".textLayer"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that some artifacts are aria-hidden", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const parentSquareRootHidden = await page.evaluate(() => { + for (const span of document.querySelectorAll(".textLayer span")) { + if (span.textContent === "√") { + return span.parentElement.getAttribute("aria-hidden"); + } + } + return false; + }); + expect(parentSquareRootHidden) + .withContext(`In ${browserName}`) + .toEqual("true"); + }) + ); + }); + }); + + describe("No alt-text with MathML", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("bug2004951.pdf", ".textLayer"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that there's no alt-text on the MathML node", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const isSanitizerSupported = await page.evaluate(() => { + try { + // eslint-disable-next-line no-undef + return typeof Sanitizer !== "undefined"; + } catch { + return false; + } + }); + const ariaLabel = await page.$eval( + "span[aria-owns='p3R_mc2']", + el => el.getAttribute("aria-label") || "" + ); + if (isSanitizerSupported) { + expect(ariaLabel).withContext(`In ${browserName}`).toEqual(""); + } else { + expect(ariaLabel) + .withContext(`In ${browserName}`) + .toEqual("cube root of , x plus y end cube root "); + } + }) + ); + }); + }); + + describe("Text elements must be aria-hidden when there's MathML and annotations", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("bug2009627.pdf", ".textLayer"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the text in text layer is aria-hidden", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const isSanitizerSupported = await page.evaluate(() => { + try { + // eslint-disable-next-line no-undef + return typeof Sanitizer !== "undefined"; + } catch { + return false; + } + }); + const ariaHidden = await page.evaluate(() => + Array.from( + document.querySelectorAll(".structTree :has(> math)") + ).map(el => + document + .getElementById(el.getAttribute("aria-owns")) + .getAttribute("aria-hidden") + ) + ); + if (isSanitizerSupported) { + expect(ariaHidden) + .withContext(`In ${browserName}`) + .toEqual(["true", "true", "true"]); + } else { + // eslint-disable-next-line no-console + console.log( + `Pending in Chrome: Sanitizer API (in ${browserName}) is not supported` + ); + } + }) + ); + }); + }); }); diff --git a/test/integration/annotation_spec.mjs b/test/integration/annotation_spec.mjs index 1ab1ee5ac2e4b..a5dcea58c39a9 100644 --- a/test/integration/annotation_spec.mjs +++ b/test/integration/annotation_spec.mjs @@ -15,6 +15,7 @@ import { closePages, + getAnnotationSelector, getQuerySelector, getRect, getSelector, @@ -28,7 +29,7 @@ describe("Annotation highlight", () => { beforeEach(async () => { pages = await loadAndWait( "annotation-highlight.pdf", - "[data-annotation-id='19R']" + getAnnotationSelector("19R") ); }); @@ -39,13 +40,17 @@ describe("Annotation highlight", () => { it("must check the popup position in the DOM", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - const areSiblings = await page.evaluate(() => { - const highlight = document.querySelector( - "[data-annotation-id='19R']" - ); - const popup = document.querySelector("[data-annotation-id='21R']"); - return highlight.nextElementSibling === popup; - }); + const highlightSelector = getAnnotationSelector("19R"); + const popupSelector = getAnnotationSelector("21R"); + const areSiblings = await page.evaluate( + (highlightSel, popupSel) => { + const highlight = document.querySelector(highlightSel); + const popup = document.querySelector(popupSel); + return highlight.nextElementSibling === popup; + }, + highlightSelector, + popupSelector + ); expect(areSiblings).withContext(`In ${browserName}`).toEqual(true); }) ); @@ -55,17 +60,17 @@ describe("Annotation highlight", () => { await Promise.all( pages.map(async ([browserName, page]) => { let hidden = await page.$eval( - "[data-annotation-id='21R']", + getAnnotationSelector("21R"), el => el.hidden ); expect(hidden).withContext(`In ${browserName}`).toEqual(true); - await page.hover("[data-annotation-id='19R']"); - await page.waitForSelector("[data-annotation-id='21R']", { + await page.hover(getAnnotationSelector("19R")); + await page.waitForSelector(getAnnotationSelector("21R"), { visible: true, timeout: 0, }); hidden = await page.$eval( - "[data-annotation-id='21R']", + getAnnotationSelector("21R"), el => el.hidden ); expect(hidden).withContext(`In ${browserName}`).toEqual(false); @@ -78,7 +83,7 @@ describe("Annotation highlight", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("bug1883609.pdf", "[data-annotation-id='23R']"); + pages = await loadAndWait("bug1883609.pdf", getAnnotationSelector("23R")); }); afterEach(async () => { @@ -89,8 +94,8 @@ describe("Annotation highlight", () => { await Promise.all( pages.map(async ([browserName, page]) => { for (const i of [23, 22, 14]) { - await page.click(`[data-annotation-id='${i}R']`); - await page.waitForSelector(`#pdfjs_internal_id_${i}R:focus`); + await page.click(getAnnotationSelector(`${i}R`)); + await page.waitForSelector(`#pdfjs_internal_id_${i}R:focus-within`); } }) ); @@ -103,7 +108,7 @@ describe("Checkbox annotation", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("issue12706.pdf", "[data-annotation-id='63R']"); + pages = await loadAndWait("issue12706.pdf", getAnnotationSelector("63R")); }); afterEach(async () => { @@ -111,13 +116,13 @@ describe("Checkbox annotation", () => { }); it("must let checkboxes with the same name behave like radio buttons", async () => { - const selectors = [63, 70, 79].map(n => `[data-annotation-id='${n}R']`); + const selectors = [63, 70, 79].map(n => getAnnotationSelector(`${n}R`)); await Promise.all( pages.map(async ([browserName, page]) => { for (const selector of selectors) { await page.click(selector); await page.waitForFunction( - `document.querySelector("${selector} > :first-child").checked` + `document.querySelector('${selector} > :first-child').checked` ); for (const otherSelector of selectors) { @@ -139,7 +144,7 @@ describe("Checkbox annotation", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("issue15597.pdf", "[data-annotation-id='7R']"); + pages = await loadAndWait("issue15597.pdf", getAnnotationSelector("7R")); }); afterEach(async () => { @@ -149,10 +154,10 @@ describe("Checkbox annotation", () => { it("must check the checkbox", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - const selector = "[data-annotation-id='7R']"; + const selector = getAnnotationSelector("7R"); await page.click(selector); await page.waitForFunction( - `document.querySelector("${selector} > :first-child").checked` + `document.querySelector('${selector} > :first-child').checked` ); expect(true).withContext(`In ${browserName}`).toEqual(true); }) @@ -164,7 +169,7 @@ describe("Checkbox annotation", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("bug1847733.pdf", "[data-annotation-id='18R']"); + pages = await loadAndWait("bug1847733.pdf", getAnnotationSelector("18R")); }); afterEach(async () => { @@ -174,13 +179,13 @@ describe("Checkbox annotation", () => { it("must check the checkbox", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - const selectors = [18, 30, 42, 54].map( - id => `[data-annotation-id='${id}R']` + const selectors = [18, 30, 42, 54].map(id => + getAnnotationSelector(`${id}R`) ); for (const selector of selectors) { await page.click(selector); await page.waitForFunction( - `document.querySelector("${selector} > :first-child").checked` + `document.querySelector('${selector} > :first-child').checked` ); } }) @@ -194,7 +199,7 @@ describe("Text widget", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("issue13271.pdf", "[data-annotation-id='24R']"); + pages = await loadAndWait("issue13271.pdf", getAnnotationSelector("24R")); }); afterEach(async () => { @@ -223,7 +228,7 @@ describe("Text widget", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("issue16473.pdf", "[data-annotation-id='22R']"); + pages = await loadAndWait("issue16473.pdf", getAnnotationSelector("22R")); }); afterEach(async () => { @@ -297,7 +302,7 @@ describe("Annotation and storage", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("issue14023.pdf", "[data-annotation-id='64R']"); + pages = await loadAndWait("issue14023.pdf", getAnnotationSelector("64R")); }); afterEach(async () => { @@ -312,9 +317,9 @@ describe("Annotation and storage", () => { // Text field. await page.type(getSelector("64R"), text1); // Checkbox. - await page.click("[data-annotation-id='65R']"); + await page.click(getAnnotationSelector("65R")); // Radio. - await page.click("[data-annotation-id='67R']"); + await page.click(getAnnotationSelector("67R")); for (const [pageNumber, textId, checkId, radio1Id, radio2Id] of [ [2, "18R", "19R", "21R", "20R"], @@ -351,9 +356,9 @@ describe("Annotation and storage", () => { // Text field. await page.type(getSelector("23R"), text2); // Checkbox. - await page.click("[data-annotation-id='24R']"); + await page.click(getAnnotationSelector("24R")); // Radio. - await page.click("[data-annotation-id='25R']"); + await page.click(getAnnotationSelector("25R")); for (const [pageNumber, textId, checkId, radio1Id, radio2Id] of [ [1, "64R", "65R", "67R", "68R"], @@ -398,7 +403,7 @@ describe("ResetForm action", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("resetform.pdf", "[data-annotation-id='63R']"); + pages = await loadAndWait("resetform.pdf", getAnnotationSelector("63R")); }); afterEach(async () => { @@ -413,8 +418,8 @@ describe("ResetForm action", () => { await page.type(getSelector(`${i}R`), base); } - const selectors = [69, 71, 75].map( - n => `[data-annotation-id='${n}R']` + const selectors = [69, 71, 75].map(n => + getAnnotationSelector(`${n}R`) ); for (const selector of selectors) { await page.click(selector); @@ -423,7 +428,7 @@ describe("ResetForm action", () => { await page.select(getSelector("78R"), "b"); await page.select(getSelector("81R"), "f"); - await page.click("[data-annotation-id='82R']"); + await page.click(getAnnotationSelector("82R")); await page.waitForFunction(`${getQuerySelector("63R")}.value === ""`); for (let i = 63; i <= 68; i++) { @@ -463,8 +468,8 @@ describe("ResetForm action", () => { await page.type(getSelector(`${i}R`), base); } - const selectors = [69, 71, 72, 73, 75].map( - n => `[data-annotation-id='${n}R']` + const selectors = [69, 71, 72, 73, 75].map(n => + getAnnotationSelector(`${n}R`) ); for (const selector of selectors) { await page.click(selector); @@ -473,7 +478,7 @@ describe("ResetForm action", () => { await page.select(getSelector("78R"), "b"); await page.select(getSelector("81R"), "f"); - await page.click("[data-annotation-id='84R']"); + await page.click(getAnnotationSelector("84R")); await page.waitForFunction(`${getQuerySelector("63R")}.value === ""`); for (let i = 63; i <= 68; i++) { @@ -525,7 +530,7 @@ describe("ResetForm action", () => { beforeEach(async () => { pages = await loadAndWait( "issue14438.pdf", - "[data-annotation-id='10R']" + getAnnotationSelector("10R") ); }); @@ -536,9 +541,10 @@ describe("ResetForm action", () => { it("must check that the FreeText annotation has a popup", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - await page.click("[data-annotation-id='10R']"); + const selector = getAnnotationSelector("10R"); + await page.click(selector); await page.waitForFunction( - `document.querySelector("[data-annotation-id='10R']").hidden === false` + `document.querySelector('${selector}').hidden === false` ); }) ); @@ -553,7 +559,7 @@ describe("ResetForm action", () => { beforeEach(async () => { pages = await loadAndWait( "annotation-caret-ink.pdf", - "[data-annotation-id='25R']" + getAnnotationSelector("25R") ); }); @@ -564,16 +570,17 @@ describe("ResetForm action", () => { it("must check that the Ink annotation has a popup", async () => { await Promise.all( pages.map(async ([browserName, page]) => { + const selector = getAnnotationSelector("25R"); await page.waitForFunction( - `document.querySelector("[data-annotation-id='25R']").hidden === false` + `document.querySelector('${selector}').hidden === false` ); await page.click("#editorFreeText"); await page.waitForFunction( - `document.querySelector("[data-annotation-id='25R']").hidden === true` + `document.querySelector('${selector}').hidden === true` ); await page.click("#editorFreeText"); await page.waitForFunction( - `document.querySelector("[data-annotation-id='25R']").hidden === false` + `document.querySelector('${selector}').hidden === false` ); }) ); @@ -588,7 +595,7 @@ describe("ResetForm action", () => { beforeEach(async () => { pages = await loadAndWait( "bug1844583.pdf", - "[data-annotation-id='8R']" + getAnnotationSelector("8R") ); }); @@ -616,7 +623,7 @@ describe("ResetForm action", () => { beforeEach(async () => { pages = await loadAndWait( "tagged_stamp.pdf", - "[data-annotation-id='20R']" + getAnnotationSelector("20R") ); }); @@ -627,50 +634,37 @@ describe("ResetForm action", () => { it("must check that the popup has the correct visibility", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - let hidden = await page.$eval( - "[data-annotation-id='21R']", - el => el.hidden - ); + const selector = getAnnotationSelector("21R"); + let hidden = await page.$eval(selector, el => el.hidden); expect(hidden).withContext(`In ${browserName}`).toEqual(true); - await page.focus("[data-annotation-id='20R']"); + + await page.focus(getAnnotationSelector("20R")); await page.keyboard.press("Enter"); await page.waitForFunction( - `document.querySelector("[data-annotation-id='21R']").hidden !== true` - ); - hidden = await page.$eval( - "[data-annotation-id='21R']", - el => el.hidden + `document.querySelector('${selector}').hidden !== true` ); + hidden = await page.$eval(selector, el => el.hidden); expect(hidden).withContext(`In ${browserName}`).toEqual(false); await page.keyboard.press("Enter"); await page.waitForFunction( - `document.querySelector("[data-annotation-id='21R']").hidden !== false` - ); - hidden = await page.$eval( - "[data-annotation-id='21R']", - el => el.hidden + `document.querySelector('${selector}').hidden !== false` ); + hidden = await page.$eval(selector, el => el.hidden); expect(hidden).withContext(`In ${browserName}`).toEqual(true); await page.keyboard.press("Enter"); await page.waitForFunction( - `document.querySelector("[data-annotation-id='21R']").hidden !== true` - ); - hidden = await page.$eval( - "[data-annotation-id='21R']", - el => el.hidden + `document.querySelector('${selector}').hidden !== true` ); + hidden = await page.$eval(selector, el => el.hidden); expect(hidden).withContext(`In ${browserName}`).toEqual(false); await page.keyboard.press("Escape"); await page.waitForFunction( - `document.querySelector("[data-annotation-id='21R']").hidden !== false` - ); - hidden = await page.$eval( - "[data-annotation-id='21R']", - el => el.hidden + `document.querySelector('${selector}').hidden !== false` ); + hidden = await page.$eval(selector, el => el.hidden); expect(hidden).withContext(`In ${browserName}`).toEqual(true); }) ); @@ -685,7 +679,7 @@ describe("ResetForm action", () => { beforeEach(async () => { pages = await loadAndWait( "highlights.pdf", - "[data-annotation-id='693R']" + getAnnotationSelector("693R") ); }); @@ -696,11 +690,13 @@ describe("ResetForm action", () => { it("must check that the highlight annotation has no popup and no aria-haspopup attribute", async () => { await Promise.all( pages.map(async ([browserName, page]) => { + const highlightSelector = getAnnotationSelector("693R"); + const popupSelector = getAnnotationSelector("694R"); await page.waitForFunction( // No aria-haspopup attribute, - `document.querySelector("[data-annotation-id='693R']").ariaHasPopup === null` + + `document.querySelector('${highlightSelector}').ariaHasPopup === null ` + // and no popup. - `&& document.querySelector("[data-annotation-id='694R']") === null` + `&& document.querySelector('${popupSelector}') === null` ); }) ); @@ -715,7 +711,7 @@ describe("ResetForm action", () => { beforeEach(async () => { pages = await loadAndWait( "rotated_ink.pdf", - "[data-annotation-id='18R']" + getAnnotationSelector("18R") ); }); @@ -726,9 +722,9 @@ describe("ResetForm action", () => { it("must check that the clickable area has been rotated", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - const rect = await getRect(page, "[data-annotation-id='18R']"); + const rect = await getRect(page, getAnnotationSelector("18R")); const promisePopup = page.waitForSelector( - "[data-annotation-id='19R']", + getAnnotationSelector("19R"), { visible: true } ); await page.mouse.move( @@ -751,7 +747,7 @@ describe("ResetForm action", () => { "bug1885505.pdf", ":is(" + [56, 58, 60, 65] - .map(id => `[data-annotation-id='${id}R']`) + .map(id => getAnnotationSelector(`${id}R`)) .join(", ") + ")" ); @@ -765,7 +761,7 @@ describe("ResetForm action", () => { await Promise.all( pages.map(async ([browserName, page]) => { const text = await page.$eval( - "[data-annotation-id='56R'] mark", + `${getAnnotationSelector("56R")} mark`, el => el.textContent ); expect(text).withContext(`In ${browserName}`).toEqual("Languages"); @@ -777,7 +773,7 @@ describe("ResetForm action", () => { await Promise.all( pages.map(async ([browserName, page]) => { const text = await page.$eval( - "[data-annotation-id='58R'] u", + `${getAnnotationSelector("58R")} u`, el => el.textContent ); expect(text).withContext(`In ${browserName}`).toEqual("machine"); @@ -789,7 +785,7 @@ describe("ResetForm action", () => { await Promise.all( pages.map(async ([browserName, page]) => { const text = await page.$eval( - "[data-annotation-id='60R'] u", + `${getAnnotationSelector("60R")} u`, el => el.textContent ); expect(text).withContext(`In ${browserName}`) @@ -803,7 +799,7 @@ a dynamic compiler for JavaScript based on our`); await Promise.all( pages.map(async ([browserName, page]) => { const text = await page.$eval( - "[data-annotation-id='65R'] s", + `${getAnnotationSelector("65R")} s`, el => el.textContent ); expect(text) @@ -814,4 +810,114 @@ a dynamic compiler for JavaScript based on our`); }); }); }); + + describe("Annotation without popup and enableComment set to true", () => { + describe("annotation-text-without-popup.pdf", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "annotation-text-without-popup.pdf", + getAnnotationSelector("4R"), + "page-fit", + null, + { enableComment: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the popup is shown", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const rect = await getRect(page, getAnnotationSelector("4R")); + + // Hover the annotation, the popup should be visible. + let promisePopup = page.waitForSelector("#commentPopup", { + visible: true, + }); + await page.mouse.move( + rect.x + rect.width / 2, + rect.y + rect.height / 2 + ); + await promisePopup; + + // Move the mouse away, the popup should be hidden. + promisePopup = page.waitForSelector("#commentPopup", { + visible: false, + }); + await page.mouse.move( + rect.x - rect.width / 2, + rect.y - rect.height / 2 + ); + await promisePopup; + + // Click the annotation, the popup should be visible. + promisePopup = page.waitForSelector("#commentPopup", { + visible: true, + }); + await page.mouse.click( + rect.x + rect.width / 2, + rect.y + rect.height / 2 + ); + await promisePopup; + + // Click again, the popup should be hidden. + promisePopup = page.waitForSelector("#commentPopup", { + visible: false, + }); + await page.mouse.click( + rect.x + rect.width / 2, + rect.y + rect.height / 2 + ); + await promisePopup; + }) + ); + }); + }); + }); + + describe("Annotation order in the DOM", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "comments.pdf", + ".page[data-page-number='1'] .annotationLayer #pdfjs_internal_id_661R" + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that annotations are in the visual order", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const sectionIds = await page.evaluate(() => + [ + ...document.querySelectorAll( + ".page[data-page-number='1'] .annotationLayer > section:not(.popupAnnotation)" + ), + ].map(el => el.id.split("_").pop()) + ); + expect(sectionIds) + .withContext(`In ${browserName}`) + .toEqual([ + "612R", + "693R", + "687R", + "690R", + "713R", + "673R", + "613R", + "680R", + "661R", + ]); + }) + ); + }); + }); }); diff --git a/test/integration/comment_spec.mjs b/test/integration/comment_spec.mjs new file mode 100644 index 0000000000000..3074e4a3d30ca --- /dev/null +++ b/test/integration/comment_spec.mjs @@ -0,0 +1,1179 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + awaitPromise, + clearInput, + closePages, + createPromise, + dragAndDrop, + getEditorSelector, + getRect, + highlightSpan, + kbModifierDown, + kbModifierUp, + kbRedo, + kbUndo, + loadAndWait, + scrollIntoView, + selectEditor, + switchToEditor, + waitAndClick, + waitForSerialized, + waitForTimeout, +} from "./test_utils.mjs"; + +const switchToHighlight = switchToEditor.bind(null, "Highlight"); +const switchToStamp = switchToEditor.bind(null, "Stamp"); +const switchToComment = switchToEditor.bind(null, "Comment"); +const switchToFreeText = switchToEditor.bind(null, "FreeText"); + +const editComment = async (page, editorSelector, comment) => { + const commentButtonSelector = `${editorSelector} button.comment`; + await waitAndClick(page, commentButtonSelector); + + const textInputSelector = "#commentManagerTextInput"; + await page.waitForSelector(textInputSelector, { + visible: true, + }); + await page.type(textInputSelector, comment); + await waitAndClick(page, "#commentManagerSaveButton"); + await page.waitForSelector("#commentManagerDialog", { + visible: false, + }); +}; + +describe("Comment", () => { + describe("Comment edit dialog must be visible in ltr", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "bug1989304.pdf", + ".annotationEditorLayer", + "page-width", + null, + { enableComment: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must set the comment dialog in the viewport (LTR)", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + + await scrollIntoView(page, ".textLayer span:last-of-type"); + await highlightSpan(page, 1, "..."); + const commentButtonSelector = `${getEditorSelector(0)} button.comment`; + await waitAndClick(page, commentButtonSelector); + + await page.waitForSelector("#commentManagerDialog", { + visible: true, + }); + const dialogRect = await getRect(page, "#commentManagerDialog"); + const viewport = await page.evaluate(() => ({ + width: document.documentElement.clientWidth, + height: document.documentElement.clientHeight, + })); + expect(dialogRect.x + dialogRect.width) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(viewport.width + 1); + expect(dialogRect.y + dialogRect.height) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(viewport.height + 1); + }) + ); + }); + }); + + describe("Comment edit dialog must be visible in rtl", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "bug1989304.pdf", + ".annotationEditorLayer", + "page-width", + null, + { enableComment: true, locale: "ar" } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must set the comment dialog in the viewport (RTL)", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + + await scrollIntoView(page, ".textLayer span:nth-of-type(4)"); + await highlightSpan(page, 1, "World"); + const commentButtonSelector = `${getEditorSelector(0)} button.comment`; + await waitAndClick(page, commentButtonSelector); + + await page.waitForSelector("#commentManagerDialog", { + visible: true, + }); + const dialogRect = await getRect(page, "#commentManagerDialog"); + const viewport = await page.evaluate(() => ({ + height: window.innerHeight, + })); + expect(dialogRect.x + dialogRect.width) + .withContext(`In ${browserName}`) + .toBeGreaterThanOrEqual(-1); + expect(dialogRect.y + dialogRect.height) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(viewport.height + 1); + }) + ); + }); + }); + + describe("Update comment position and color in reading mode", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "comments.pdf", + ".annotationEditorLayer", + "page-fit", + null, + { + enableComment: true, + highlightEditorColors: + "yellow=#FFFF00,green=#00FF00,blue=#0000FF,pink=#FF00FF,red=#FF0000", + } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must set the comment button at the right place", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToStamp(page); + + const stampSelector = getEditorSelector(8); + await selectEditor(page, stampSelector); + await dragAndDrop(page, stampSelector, [[100, 100]]); + await waitForSerialized(page, 1); + const rectCommentButton = await getRect( + page, + `${stampSelector} .annotationCommentButton` + ); + + await switchToStamp(page, /* disable = */ true); + const rectCommentButtonAfter = await getRect( + page, + `#pdfjs_internal_id_713R + .annotationCommentButton` + ); + + expect(Math.abs(rectCommentButtonAfter.x - rectCommentButton.x)) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(1); + expect(Math.abs(rectCommentButtonAfter.y - rectCommentButton.y)) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(1); + expect( + Math.abs(rectCommentButtonAfter.width - rectCommentButton.width) + ) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(1); + expect( + Math.abs(rectCommentButtonAfter.height - rectCommentButton.height) + ) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(1); + }) + ); + }); + + it("must set the right color to the comment button", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + + const highlightSelector = getEditorSelector(0); + await selectEditor(page, highlightSelector); + const colorButtonSelector = `${highlightSelector} .editToolbar button`; + await page.waitForSelector(`${colorButtonSelector}.colorPicker`); + await page.click(`${colorButtonSelector}.colorPicker`); + await page.waitForSelector(`${colorButtonSelector}[title = "Red"]`); + await page.click(`${colorButtonSelector}[title = "Red"]`); + await page.waitForSelector( + `.page[data-page-number = "1"] svg.highlight[fill = "#FF0000"]` + ); + + const commentButtonColor = await page.evaluate(selector => { + const button = document.querySelector( + `${selector} .annotationCommentButton` + ); + return window.getComputedStyle(button).backgroundColor; + }, highlightSelector); + + await switchToHighlight(page, /* disable = */ true); + + const commentButtonColorAfter = await page.evaluate(() => { + const button = document.querySelector( + "section[data-annotation-id='612R'] + .annotationCommentButton" + ); + return window.getComputedStyle(button).backgroundColor; + }); + + expect(commentButtonColorAfter) + .withContext(`In ${browserName}`) + .toEqual(commentButtonColor); + }) + ); + }); + }); + + describe("Comment buttons", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "tracemonkey.pdf", + ".annotationEditorLayer", + "page-fit", + null, + { enableComment: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the comment button has a title", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + await highlightSpan(page, 1, "Languages"); + + let commentButtonSelector = `${getEditorSelector(0)} button.comment`; + await page.waitForSelector(commentButtonSelector, { visible: true }); + let title = await page.evaluate( + selector => document.querySelector(selector).title, + commentButtonSelector + ); + expect(title).withContext(`In ${browserName}`).toEqual("Add comment"); + await page.click(commentButtonSelector); + + const textInputSelector = "#commentManagerTextInput"; + await page.waitForSelector(textInputSelector, { + visible: true, + }); + await page.type(textInputSelector, "Hello world!"); + + await page.click("#commentManagerSaveButton"); + + commentButtonSelector = `${getEditorSelector(0)} button.annotationCommentButton`; + await page.waitForSelector(commentButtonSelector, { + visible: true, + }); + title = await page.evaluate(selector => { + const button = document.querySelector(selector); + return button.title; + }, commentButtonSelector); + expect(title) + .withContext(`In ${browserName}`) + .toEqual("Show comment"); + }) + ); + }); + + it("must check that the comment button is added in the annotation layer", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + await highlightSpan(page, 1, "Abstract"); + + const comment = "Hello world!"; + await editComment(page, getEditorSelector(0), comment); + await page.hover("#editorHighlightButton"); + let buttonSelector = + ".annotationEditorLayer .annotationCommentButton"; + await page.waitForSelector(buttonSelector, { visible: true }); + await page.hover(buttonSelector); + const popupSelector = "#commentPopup"; + await page.waitForSelector(popupSelector, { + visible: true, + }); + let popupText = await page.evaluate( + selector => document.querySelector(selector).textContent, + `${popupSelector} .commentPopupText` + ); + expect(popupText).withContext(`In ${browserName}`).toEqual(comment); + + await page.hover("#editorHighlightButton"); + await switchToHighlight(page, /* disable = */ true); + + buttonSelector = ".annotationLayer .annotationCommentButton"; + await page.waitForSelector(buttonSelector, { + visible: true, + }); + await page.hover(buttonSelector); + + await page.waitForSelector(popupSelector, { + visible: true, + }); + popupText = await page.evaluate( + selector => document.querySelector(selector).textContent, + `${popupSelector} .commentPopupText` + ); + expect(popupText).withContext(`In ${browserName}`).toEqual(comment); + }) + ); + }); + + it("must check that the button is removed in the annotation layer", async () => { + await Promise.all( + pages.map(async ([, page]) => { + await switchToHighlight(page); + + await highlightSpan(page, 1, "Abstract"); + const editorSelector = getEditorSelector(0); + await editComment(page, editorSelector, "Hello world!"); + + await switchToHighlight(page, /* disable = */ true); + const buttonSelector = ".annotationLayer .annotationCommentButton"; + await page.waitForSelector(buttonSelector, { + visible: true, + }); + + await switchToHighlight(page); + await selectEditor(page, editorSelector); + await waitAndClick(page, `${editorSelector} button.deleteButton`); + await waitForSerialized(page, 0); + + await switchToHighlight(page, /* disable = */ true); + await page.waitForFunction( + sel => !document.querySelector(sel), + {}, + buttonSelector + ); + }) + ); + }); + }); + + describe("Focused element after editing", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "tracemonkey.pdf", + ".annotationEditorLayer", + "page-width", + null, + { enableComment: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the focus is moved on the comment button", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + await highlightSpan(page, 1, "Languages"); + + const commentButtonSelector = `${getEditorSelector(0)} button.comment`; + await waitAndClick(page, commentButtonSelector); + + await page.waitForSelector("#commentManagerCancelButton", { + visible: true, + }); + const handle = await createPromise(page, resolve => { + document + .querySelector("button.comment") + .addEventListener("focus", resolve, { once: true }); + }); + await page.click("#commentManagerCancelButton"); + await awaitPromise(handle); + + await waitAndClick(page, commentButtonSelector); + + const textInputSelector = "#commentManagerTextInput"; + await page.waitForSelector(textInputSelector, { + visible: true, + }); + await page.type(textInputSelector, "Hello world!"); + + await page.click("#commentManagerSaveButton"); + await page.waitForSelector("button.annotationCommentButton", { + visible: true, + }); + + await page.waitForFunction( + sel => document.activeElement === document.querySelector(sel), + {}, + "button.annotationCommentButton" + ); + }) + ); + }); + }); + + describe("Focused element after editing in reading mode", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "comments.pdf", + ".annotationLayer", + "page-width", + null, + { enableComment: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the focus is moved on the comment button", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const commentButtonSelector = `[data-annotation-id="612R"] + button.annotationCommentButton`; + await waitAndClick(page, commentButtonSelector); + const commentPopupSelector = "#commentPopup"; + const editButtonSelector = `${commentPopupSelector} button.commentPopupEdit`; + await waitAndClick(page, editButtonSelector); + + await page.waitForSelector("#commentManagerCancelButton", { + visible: true, + }); + let handle = await createPromise(page, resolve => { + document + .querySelector( + `[data-annotation-id="612R"] + button.annotationCommentButton` + ) + .addEventListener("focus", resolve, { once: true }); + }); + await page.click("#commentManagerCancelButton"); + await awaitPromise(handle); + + await waitAndClick(page, commentButtonSelector); + await waitAndClick(page, editButtonSelector); + + const textInputSelector = "#commentManagerTextInput"; + await page.waitForSelector(textInputSelector, { + visible: true, + }); + await page.type(textInputSelector, "Hello world!"); + + handle = await createPromise(page, resolve => { + document + .querySelector( + `[data-annotation-id="612R"] + button.annotationCommentButton` + ) + .addEventListener("focus", resolve, { once: true }); + }); + await page.click("#commentManagerSaveButton"); + await awaitPromise(handle); + }) + ); + }); + }); + + describe("Comment sidebar", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "comments.pdf", + ".annotationEditorLayer", + "page-fit", + null, + { enableComment: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the comment sidebar is resizable", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToComment(page); + + const sidebarSelector = "#editorCommentParamsToolbar"; + for (const extraWidth of [100, -100]) { + const rect = await getRect(page, sidebarSelector); + const resizerRect = await getRect( + page, + "#editorCommentsSidebarResizer" + ); + const startX = resizerRect.x + resizerRect.width / 2; + const startY = resizerRect.y + 2; + await page.mouse.move(startX, startY); + await page.mouse.down(); + + const steps = 20; + await page.mouse.move(startX - extraWidth, startY, { steps }); + await page.mouse.up(); + + const rectAfter = await getRect(page, sidebarSelector); + expect(Math.abs(rectAfter.width - (rect.width + extraWidth))) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(1); + expect(Math.abs(rectAfter.x - (rect.x - extraWidth))) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(1); + } + }) + ); + }); + + it("must check that the comment sidebar is resizable with the keyboard", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToComment(page); + + const sidebarSelector = "#editorCommentParamsToolbar"; + const handle = await createPromise(page, resolve => { + document + .getElementById("editorCommentsSidebarResizer") + .addEventListener("focus", () => resolve(), { once: true }); + }); + await page.focus(`${sidebarSelector} #editorCommentsSidebarResizer`); + await awaitPromise(handle); + + // Use Ctrl+ArrowLeft/Right to resize the sidebar. + for (const extraWidth of [10, -10]) { + const rect = await getRect(page, sidebarSelector); + const arrowKey = extraWidth > 0 ? "ArrowLeft" : "ArrowRight"; + for (let i = 0; i < Math.abs(extraWidth); i++) { + await kbModifierDown(page); + await page.keyboard.press(arrowKey); + await kbModifierUp(page); + } + + const rectAfter = await getRect(page, sidebarSelector); + expect(Math.abs(rectAfter.width - (rect.width + 10 * extraWidth))) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(1); + expect(Math.abs(rectAfter.x - (rect.x - 10 * extraWidth))) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(1); + } + + // Use ArrowLeft/Right to resize the sidebar. + for (const extraWidth of [10, -10]) { + const rect = await getRect(page, sidebarSelector); + const arrowKey = extraWidth > 0 ? "ArrowLeft" : "ArrowRight"; + for (let i = 0; i < Math.abs(extraWidth); i++) { + await page.keyboard.press(arrowKey); + } + + const rectAfter = await getRect(page, sidebarSelector); + expect(Math.abs(rectAfter.width - (rect.width + extraWidth))) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(1); + expect(Math.abs(rectAfter.x - (rect.x - extraWidth))) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(1); + } + }) + ); + }); + + it("must check that comments are in chronological order", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToComment(page); + + const checkDates = async () => { + const dates = await page.evaluate(() => + Array.from( + document.querySelectorAll( + `#editorCommentParamsToolbar ul > li > time` + ) + ).map(time => new Date(time.getAttribute("datetime"))) + ); + for (let i = 0; i < dates.length - 1; i++) { + expect(dates[i]) + .withContext(`In ${browserName}`) + .toBeGreaterThanOrEqual(dates[i + 1]); + } + }; + await checkDates(); + + // Add an highlight with a comment and check the order again. + await switchToHighlight(page); + await highlightSpan(page, 1, "Languages"); + const editorSelector = getEditorSelector(9); + const commentButtonSelector = `${editorSelector} button.comment`; + await waitAndClick(page, commentButtonSelector); + + const textInputSelector = "#commentManagerTextInput"; + await page.waitForSelector(textInputSelector, { + visible: true, + }); + await page.type(textInputSelector, "Hello world!"); + await page.click("#commentManagerSaveButton"); + await waitForSerialized(page, 1); + + await switchToComment(page); + await checkDates(); + }) + ); + }); + + it("must check that comments can be selected/unselected", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToComment(page); + + const firstElementSelector = + "#editorCommentsSidebarList li:first-child"; + await waitAndClick(page, firstElementSelector); + const popupSelector = "#commentPopup"; + await page.waitForSelector(popupSelector, { visible: true }); + const popupTextSelector = `${popupSelector} .commentPopupText`; + await page.waitForSelector(popupTextSelector, { + visible: true, + }); + const popupText = await page.evaluate( + selector => document.querySelector(selector).textContent, + popupTextSelector + ); + expect(popupText) + .withContext(`In ${browserName}`) + .toEqual("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + + // Click again to unselect the comment. + await waitAndClick(page, firstElementSelector); + await page.waitForSelector(popupSelector, { visible: false }); + }) + ); + }); + }); + + describe("Comment popup", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "tracemonkey.pdf", + ".annotationEditorLayer", + "page-fit", + null, + { enableComment: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the popup is deleted when the editor is", async () => { + await Promise.all( + pages.map(async ([, page]) => { + await switchToHighlight(page); + + await highlightSpan(page, 1, "Abstract"); + const editorSelector = getEditorSelector(0); + await editComment(page, editorSelector, "Hello world!"); + + await waitAndClick( + page, + `${editorSelector} button.annotationCommentButton` + ); + + const popupSelector = "#commentPopup"; + await page.waitForSelector(popupSelector, { visible: true }); + await waitAndClick(page, `${editorSelector} button.deleteButton`); + + // Check that the popup is removed from the DOM. + await page.waitForFunction( + sel => !document.querySelector(sel), + {}, + popupSelector + ); + }) + ); + }); + + it("must check that the focus is moved on the editor once the popup is deleted", async () => { + await Promise.all( + pages.map(async ([, page]) => { + await switchToHighlight(page); + + await highlightSpan(page, 1, "Abstract"); + const editorSelector = getEditorSelector(0); + await editComment(page, editorSelector, "Hello world!"); + + await waitAndClick( + page, + `${editorSelector} button.annotationCommentButton` + ); + + const popupSelector = "#commentPopup"; + await page.waitForSelector(popupSelector, { visible: true }); + const handle = await page.evaluateHandle( + sel => [ + new Promise(resolve => { + document + .querySelector(sel) + .addEventListener("focusin", resolve, { + once: true, + }); + }), + ], + editorSelector + ); + await waitAndClick( + page, + `${popupSelector} button.commentPopupDelete` + ); + await awaitPromise(handle); + }) + ); + }); + }); + + describe("Annotations order in reading mode", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "comments.pdf", + ".annotationEditorLayer", + "page-fit", + null, + { enableComment: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the annotations are in the right order", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + await highlightSpan( + page, + 1, + "method provides cheap inter-procedural type specialization, and an" + ); + await editComment(page, getEditorSelector(9), "Hello world!"); + + await highlightSpan(page, 1, "Andreas Gal"); + await editComment(page, getEditorSelector(10), "Hello world!"); + + await switchToHighlight(page, /* disable = */ true); + await page.waitForSelector( + ".annotationLayer section:nth-child(4).editorAnnotation" + ); + + const sectionIds = await page.evaluate(() => + [ + ...document.querySelectorAll( + ".page[data-page-number='1'] .annotationLayer > section:not(.popupAnnotation)" + ), + ].map(el => el.id.split("_").pop()) + ); + expect(sectionIds).withContext(`In ${browserName}`).toEqual([ + "612R", + "693R", + "10", // shortcut for pdfjs_internal_id_pdfjs_internal_editor_10 + "687R", + "690R", + "713R", + "9", // shortcut for pdfjs_internal_id_pdfjs_internal_editor_9 + "673R", + "613R", + "680R", + "661R", + ]); + }) + ); + }); + }); + + describe("Focus annotation after comment has been deleted (bug 1994738)", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "tracemonkey.pdf", + ".annotationEditorLayer", + "page-fit", + null, + { enableComment: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the annotation is focused", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + await highlightSpan(page, 1, "Abstract"); + const editorSelector = getEditorSelector(0); + await editComment(page, editorSelector, "Hello world!"); + + await switchToHighlight(page, /* disable = */ true); + await waitAndClick(page, ".annotationLayer .annotationCommentButton"); + + const handle = await createPromise(page, resolve => { + document + .querySelector(".annotationLayer section.editorAnnotation") + .addEventListener("focus", resolve, { once: true }); + }); + await waitAndClick(page, "button.commentPopupDelete"); + await awaitPromise(handle); + }) + ); + }); + }); + + describe("FreeText annotation doesn't have a popup (bug 1995028)", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "empty.pdf", + ".annotationEditorLayer", + "page-fit", + null, + { enableComment: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that comment button isn't in the annotation toolbar", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToFreeText(page); + + const rect = await getRect(page, ".annotationEditorLayer"); + const editorSelector = getEditorSelector(0); + const data = "Hello PDF.js World !!"; + await page.mouse.click(rect.x + 100, rect.y + 100); + await page.waitForSelector(editorSelector, { visible: true }); + await page.type(`${editorSelector} .internal`, data); + await page.keyboard.press("Escape"); + + await page.waitForSelector(`${editorSelector} .editToolbar`, { + visible: true, + }); + + // We want to be sure that the comment button isn't rendered. + // eslint-disable-next-line no-restricted-syntax + await waitForTimeout(100); + + const hasCommentButton = await page.evaluate( + selector => + !!document.querySelector( + `${selector} .editToolbar button.comment` + ), + editorSelector + ); + expect(hasCommentButton).withContext(`In ${browserName}`).toBe(false); + }) + ); + }); + }); + + describe("Save a comment in using CTRL+Enter", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "comments.pdf", + ".annotationEditorLayer", + "page-fit", + null, + { enableComment: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the comment is saved", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const commentButtonSelector = `[data-annotation-id="612R"] + button.annotationCommentButton`; + await waitAndClick(page, commentButtonSelector); + const commentPopupSelector = "#commentPopup"; + const editButtonSelector = `${commentPopupSelector} button.commentPopupEdit`; + await waitAndClick(page, editButtonSelector); + + const textInputSelector = "#commentManagerTextInput"; + await page.waitForSelector(textInputSelector, { + visible: true, + }); + await clearInput(page, textInputSelector, true); + const comment = "Comment saved using CTRL+Enter"; + await page.type(textInputSelector, comment); + await page.focus(textInputSelector); + + await page.keyboard.down("Control"); + await page.keyboard.press("Enter"); + await page.keyboard.up("Control"); + + await page.waitForSelector("#commentManagerDialog", { + visible: false, + }); + + await page.hover(commentButtonSelector); + await page.waitForSelector(commentPopupSelector, { + visible: true, + }); + const popupTextSelector = `${commentPopupSelector} .commentPopupText`; + const popupText = await page.evaluate( + selector => document.querySelector(selector).textContent, + popupTextSelector + ); + expect(popupText).withContext(`In ${browserName}`).toEqual(comment); + }) + ); + }); + }); + + describe("Undo deletion popup for comments (bug 1999154)", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "tracemonkey.pdf", + ".annotationEditorLayer", + "page-fit", + null, + { enableComment: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that deleting a comment can be undone using the undo button", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + await highlightSpan(page, 1, "Abstract"); + const editorSelector = getEditorSelector(0); + const comment = "Test comment for undo"; + await editComment(page, editorSelector, comment); + + // Stay in highlight mode - don't disable it + await waitAndClick( + page, + `${editorSelector} .annotationCommentButton` + ); + + await page.waitForSelector("#commentPopup", { visible: true }); + + // Capture the date before deletion + const dateBefore = await page.evaluate( + () => + document.querySelector("#commentPopup .commentPopupTime") + ?.textContent + ); + + await waitAndClick(page, "button.commentPopupDelete"); + + await page.waitForSelector("#editorUndoBar", { visible: true }); + await page.waitForSelector("#editorUndoBarUndoButton", { + visible: true, + }); + await page.click("#editorUndoBarUndoButton"); + + // Check that the comment is restored by hovering to show the popup + await page.hover(`${editorSelector} .annotationCommentButton`); + await page.waitForSelector("#commentPopup", { visible: true }); + const popupText = await page.evaluate( + () => + document.querySelector("#commentPopup .commentPopupText") + ?.textContent + ); + expect(popupText).withContext(`In ${browserName}`).toEqual(comment); + + // Check that the date is preserved + const dateAfter = await page.evaluate( + () => + document.querySelector("#commentPopup .commentPopupTime") + ?.textContent + ); + expect(dateAfter) + .withContext(`In ${browserName}`) + .toEqual(dateBefore); + }) + ); + }); + + it("must check that the undo deletion popup displays 'Comment removed' message", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + await highlightSpan(page, 1, "Abstract"); + const editorSelector = getEditorSelector(0); + await editComment(page, editorSelector, "Test comment"); + + // Stay in highlight mode - don't disable it + await waitAndClick( + page, + `${editorSelector} .annotationCommentButton` + ); + + await page.waitForSelector("#commentPopup", { visible: true }); + await waitAndClick(page, "button.commentPopupDelete"); + + await page.waitForFunction(() => { + const messageElement = document.querySelector( + "#editorUndoBarMessage" + ); + return messageElement && messageElement.textContent.trim() !== ""; + }); + const message = await page.waitForSelector("#editorUndoBarMessage"); + const messageText = await page.evaluate( + el => el.textContent, + message + ); + expect(messageText) + .withContext(`In ${browserName}`) + .toContain("Comment removed"); + }) + ); + }); + + it("must check that the undo bar closes when clicking the close button", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + await highlightSpan(page, 1, "Abstract"); + const editorSelector = getEditorSelector(0); + await editComment(page, editorSelector, "Test comment"); + + // Stay in highlight mode - don't disable it + await waitAndClick( + page, + `${editorSelector} .annotationCommentButton` + ); + + await page.waitForSelector("#commentPopup", { visible: true }); + await waitAndClick(page, "button.commentPopupDelete"); + + await page.waitForSelector("#editorUndoBar", { visible: true }); + await waitAndClick(page, "#editorUndoBarCloseButton"); + await page.waitForSelector("#editorUndoBar", { hidden: true }); + }) + ); + }); + + it("must check that deleting a comment can be undone using Ctrl+Z", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + await highlightSpan(page, 1, "Abstract"); + const editorSelector = getEditorSelector(0); + const comment = "Test comment for Ctrl+Z undo"; + await editComment(page, editorSelector, comment); + + // Stay in highlight mode - don't disable it + await waitAndClick( + page, + `${editorSelector} .annotationCommentButton` + ); + + await page.waitForSelector("#commentPopup", { visible: true }); + await waitAndClick(page, "button.commentPopupDelete"); + + await page.waitForSelector("#editorUndoBar", { visible: true }); + + // Use Ctrl+Z to undo + await kbUndo(page); + + // The undo bar should be hidden after undo + await page.waitForSelector("#editorUndoBar", { hidden: true }); + + // Check that the comment is restored by hovering to show the popup + await page.hover(`${editorSelector} .annotationCommentButton`); + await page.waitForSelector("#commentPopup", { visible: true }); + const popupText = await page.evaluate( + () => + document.querySelector("#commentPopup .commentPopupText") + ?.textContent + ); + expect(popupText).withContext(`In ${browserName}`).toEqual(comment); + }) + ); + }); + + it("must check that the comment popup is hidden after redo", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + await highlightSpan(page, 1, "Abstract"); + const editorSelector = getEditorSelector(0); + const comment = "Test comment for redo"; + await editComment(page, editorSelector, comment); + + // Show the popup by clicking the comment button + await waitAndClick( + page, + `${editorSelector} .annotationCommentButton` + ); + await page.waitForSelector("#commentPopup", { visible: true }); + + // Delete the comment + await waitAndClick(page, "button.commentPopupDelete"); + await page.waitForSelector("#editorUndoBar", { visible: true }); + + // Undo the deletion + await kbUndo(page); + await page.waitForSelector("#editorUndoBar", { hidden: true }); + + // Show the popup again by clicking the comment button + await waitAndClick( + page, + `${editorSelector} .annotationCommentButton` + ); + await page.waitForSelector("#commentPopup", { visible: true }); + + // Redo the deletion - popup should be hidden + await kbRedo(page); + await page.waitForSelector("#commentPopup", { hidden: true }); + }) + ); + }); + }); +}); diff --git a/test/integration/freetext_editor_spec.mjs b/test/integration/freetext_editor_spec.mjs index 545d7a7594cf2..df0f17662370a 100644 --- a/test/integration/freetext_editor_spec.mjs +++ b/test/integration/freetext_editor_spec.mjs @@ -19,12 +19,16 @@ import { closePages, copy, copyToClipboard, + countSerialized, + countStorageEntries, createPromise, dragAndDrop, firstPageOnTop, + getAnnotationSelector, getEditors, getEditorSelector, getFirstSerialized, + getNextEditorId, getRect, getSerialized, isCanvasMonochrome, @@ -84,12 +88,40 @@ const cancelFocusIn = async (page, selector) => { }, selector); }; +const createFreeTextEditor = async ({ + page, + x, + y, + data = null, + noFocusIn = false, +}) => { + const editorSelector = getEditorSelector(await getNextEditorId(page)); + const serializedCount = await countSerialized(page); + const storageEntriesCount = await countStorageEntries(page); + + await page.mouse.click(x, y); + await page.waitForSelector(editorSelector, { visible: true }); + if (data) { + await page.type(`${editorSelector} .internal`, data); + } + if (noFocusIn) { + await cancelFocusIn(page, editorSelector); + } + await commit(page); + + await waitForSelectedEditor(page, editorSelector); + await waitForStorageEntries(page, storageEntriesCount + 1); + await waitForSerialized(page, serializedCount + 1); + + return editorSelector; +}; + describe("FreeText Editor", () => { describe("FreeText", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("aboutstacks.pdf", ".annotationEditorLayer"); + pages = await loadAndWait("empty.pdf", ".annotationEditorLayer"); }); afterEach(async () => { @@ -102,15 +134,13 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - - await waitForSelectedEditor(page, editorSelector); - await waitForStorageEntries(page, 1); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data, + }); await page.waitForFunction( `document.getElementById("viewer-alert").textContent === "Text added"` @@ -142,13 +172,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const firstEditorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(firstEditorSelector, { visible: true }); - await page.type(`${firstEditorSelector} .internal`, data); - await commit(page); - await waitForStorageEntries(page, 1); + const firstEditorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); await selectEditor(page, firstEditorSelector); await copy(page); @@ -180,6 +209,57 @@ describe("FreeText Editor", () => { } }); + it("must copy/paste and check color", async () => { + // Run sequentially to avoid clipboard issues. + for (const [browserName, page] of pages) { + await switchToFreeText(page); + + const rect = await getRect(page, ".annotationEditorLayer"); + const firstEditorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); + + await page.evaluate(() => { + window.PDFViewerApplication.eventBus.dispatch( + "switchannotationeditorparams", + { + source: null, + type: window.pdfjsLib.AnnotationEditorParamsType.FREETEXT_COLOR, + value: "#FF0000", + } + ); + }); + + await selectEditor(page, firstEditorSelector); + await copy(page); + await paste(page); + const secondEditorSelector = getEditorSelector(1); + await page.waitForSelector(secondEditorSelector, { visible: true }); + await waitForStorageEntries(page, 2); + + const color = await page.$eval( + `${secondEditorSelector} .internal`, + el => getComputedStyle(el).color + ); + expect(color) + .withContext(`In ${browserName}`) + .toEqual("rgb(255, 0, 0)"); + + const inputSelector = `${secondEditorSelector} .basicColorPicker`; + await page.waitForSelector(inputSelector, { visible: true }); + + const buttonColor = await page.evaluate(sel => { + const input = document.querySelector(sel); + return input.value; + }, inputSelector); + + expect(buttonColor).withContext(`In ${browserName}`).toEqual("#ff0000"); + } + }); + it("must clear all", async () => { await Promise.all( pages.map(async ([browserName, page]) => { @@ -187,12 +267,12 @@ describe("FreeText Editor", () => { const rect = await getRect(page, ".annotationEditorLayer"); for (const n of [0, 1, 2]) { - const editorSelector = getEditorSelector(n); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100 * n, rect.y + 100 * n); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100 * n, + y: rect.y + 100 * n, + data: "Hello PDF.js World !!", + }); const hasEditor = await page.evaluate( sel => !!document.querySelector(sel), @@ -222,12 +302,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - let editorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + let editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); await selectEditor(page, editorSelector); await copy(page); @@ -258,65 +338,18 @@ describe("FreeText Editor", () => { } }); - it("must check that aria-owns is correct", async () => { - await Promise.all( - pages.map(async ([browserName, page]) => { - await switchToFreeText(page); - - await page.$eval(".textLayer", el => { - for (const span of el.querySelectorAll( - `span[role="presentation"]` - )) { - if (span.innerText.includes("Stacks are simple to create")) { - span.setAttribute("pdfjs", true); - } - } - }); - - await scrollIntoView(page, `span[pdfjs="true"]`); - - const stacksRect = await getRect(page, `span[pdfjs="true"]`); - const oldAriaOwns = await page.$eval(`span[pdfjs="true"]`, el => - el.getAttribute("aria-owns") - ); - - expect(oldAriaOwns).withContext(`In ${browserName}`).toEqual(null); - - const editorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click( - stacksRect.x + stacksRect.width + 1, - stacksRect.y + stacksRect.height / 2 - ); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - - const ariaOwns = await page.$eval(".textLayer", el => { - const span = el.querySelector(`span[pdfjs="true"]`); - return span?.getAttribute("aria-owns") || null; - }); - - expect(ariaOwns.endsWith("_0-editor")) - .withContext(`In ${browserName}`) - .toEqual(true); - await scrollIntoView(page, ".annotationEditorLayer"); - }) - ); - }); - it("must check that right click doesn't select", async () => { await Promise.all( pages.map(async ([browserName, page]) => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); expect(await getEditors(page, "selected")) .withContext(`In ${browserName}`) @@ -437,7 +470,7 @@ describe("FreeText Editor", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("aboutstacks.pdf", ".annotationEditorLayer"); + pages = await loadAndWait("empty.pdf", ".annotationEditorLayer"); }); afterEach(async () => { @@ -454,12 +487,12 @@ describe("FreeText Editor", () => { const editorCenters = []; let lastX = rect.x + rect.width / 10; for (let i = 0; i < 4; i++) { - const editorSelector = getEditorSelector(i); - const data = `FreeText ${i}`; - await page.mouse.click(lastX, rect.y + rect.height / 10); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + const editorSelector = await createFreeTextEditor({ + page, + x: lastX, + y: rect.y + rect.height / 10, + data: `FreeText ${i}`, + }); const editorRect = await getRect(page, editorSelector); lastX = editorRect.x + editorRect.width + 10; @@ -590,6 +623,56 @@ describe("FreeText Editor", () => { }); }); + describe("FreeText (accessibility)", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("attachment.pdf", ".annotationEditorLayer"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that aria-owns is correct", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToFreeText(page); + + await page.$eval(".textLayer", el => { + for (const span of el.querySelectorAll( + `span[role="presentation"]` + )) { + if (span.innerText.includes("This document contains")) { + span.setAttribute("pdfjs", true); + } + } + }); + + const oldAriaOwns = await page.$eval(`span[pdfjs="true"]`, el => + el.getAttribute("aria-owns") + ); + expect(oldAriaOwns).withContext(`In ${browserName}`).toEqual(null); + + const rect = await getRect(page, `span[pdfjs="true"]`); + await createFreeTextEditor({ + page, + x: rect.x + rect.width / 2, + y: rect.y + rect.height / 2, + data: "Hello PDF.js World !!", + }); + + const newAriaOwns = await page.$eval(`span[pdfjs="true"]`, el => + el.getAttribute("aria-owns") + ); + expect(newAriaOwns.endsWith("_0-editor")) + .withContext(`In ${browserName}`) + .toEqual(true); + }) + ); + }); + }); + describe("FreeText (bugs)", () => { let pages; @@ -605,7 +688,6 @@ describe("FreeText Editor", () => { await Promise.all( pages.map(async ([browserName, page]) => { await switchToFreeText(page); - let currentId = 0; const expected = []; const oneToFourteen = Array.from(new Array(14).keys(), x => x + 1); @@ -623,23 +705,19 @@ describe("FreeText Editor", () => { } const rect = await getRect(page, annotationLayerSelector); - const editorSelector = getEditorSelector(currentId); const data = `Hello PDF.js World !! on page ${pageNumber}`; expected.push(data); - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - - await waitForSelectedEditor(page, editorSelector); - await waitForStorageEntries(page, currentId + 1); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data, + }); const content = await page.$eval(editorSelector, el => el.innerText.trimEnd() ); expect(content).withContext(`In ${browserName}`).toEqual(data); - - currentId += 1; } const serialize = proprName => @@ -749,19 +827,16 @@ describe("FreeText Editor", () => { await Promise.all( pages.map(async ([browserName, page]) => { await switchToFreeText(page); - let currentId = 0; for (let step = 0; step < 3; step++) { await firstPageOnTop(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(currentId); - const data = `Hello ${step}`; - const x = Math.max(rect.x + 0.1 * rect.width, 10); - const y = Math.max(rect.y + 0.1 * rect.height, 10); - await page.mouse.click(x, y); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + await createFreeTextEditor({ + page, + x: Math.max(rect.x + 0.1 * rect.width, 10), + y: Math.max(rect.y + 0.1 * rect.height, 10), + data: `Hello ${step}`, + }); const promise = await waitForAnnotationEditorLayer(page); await page.evaluate(() => { @@ -769,7 +844,6 @@ describe("FreeText Editor", () => { }); await awaitPromise(promise); - currentId += 1; await page.waitForSelector( ".page[data-page-number='1'] .canvasWrapper", { @@ -919,7 +993,7 @@ describe("FreeText Editor", () => { // Check we've now a div containing the text. const newDivText = await page.$eval( - "[data-annotation-id='26R'] div.annotationContent", + `${getAnnotationSelector("26R")} div.annotationContent`, el => el.innerText.replaceAll("\xa0", " ") ); expect(newDivText) @@ -955,7 +1029,7 @@ describe("FreeText Editor", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("freetexts.pdf", "[data-annotation-id='32R']"); + pages = await loadAndWait("freetexts.pdf", getAnnotationSelector("32R")); }); afterEach(async () => { @@ -966,8 +1040,8 @@ describe("FreeText Editor", () => { await Promise.all( pages.map(async ([browserName, page]) => { // Show the popup on "Hello World from Firefox" - await page.click("[data-annotation-id='32R']"); - const popupSelector = "[data-annotation-id='popup_32R']"; + await page.click(getAnnotationSelector("32R")); + const popupSelector = getAnnotationSelector("popup_32R"); await page.waitForSelector(popupSelector, { visible: true }); await switchToFreeText(page); @@ -1074,7 +1148,7 @@ describe("FreeText Editor", () => { editorIds = await getEditors(page, "freeText"); expect(editorIds.length).withContext(`In ${browserName}`).toEqual(0); const hidden = await page.$eval( - "[data-annotation-id='51R']", + getAnnotationSelector("51R"), el => el.hidden ); expect(hidden).withContext(`In ${browserName}`).toBeTrue(); @@ -1092,9 +1166,11 @@ describe("FreeText Editor", () => { it("must delete an existing annotation with a popup", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - await page.click("[data-annotation-id='26R']"); + const selector = getAnnotationSelector("26R"); + await page.click(selector); + // Wait for the popup to be displayed. - const popupSelector = "[data-annotation-id='popup_26R'] .popup"; + const popupSelector = `${getAnnotationSelector("popup_26R")} .popup`; await page.waitForSelector(popupSelector, { visible: true }); await switchToFreeText(page); @@ -1122,7 +1198,7 @@ describe("FreeText Editor", () => { // Disable editing mode. await switchToFreeText(page, /* disable = */ true); - await page.waitForSelector(":not([data-annotation-id='26R'] .popup)"); + await page.waitForSelector(`:not(${selector} .popup)`); // Re-enable editing mode. await switchToFreeText(page); @@ -1134,10 +1210,10 @@ describe("FreeText Editor", () => { // Disable editing mode. await switchToFreeText(page, /* disable = */ true); - const popupAreaSelector = - "[data-annotation-id='26R'].popupTriggerArea"; + const popupAreaSelector = `${selector}.popupTriggerArea`; await page.waitForSelector(popupAreaSelector, { visible: true }); - await page.click("[data-annotation-id='26R']"); + await page.click(selector); + // Wait for the popup to be displayed. await page.waitForSelector(popupSelector, { visible: true }); }) @@ -1188,7 +1264,7 @@ describe("FreeText Editor", () => { await Promise.all( pages.map(async ([browserName, page]) => { const modeChangedHandle = await waitForAnnotationModeChanged(page); - await page.click("[data-annotation-id='26R']", { count: 2 }); + await page.click(getAnnotationSelector("26R"), { count: 2 }); await awaitPromise(modeChangedHandle); await page.waitForSelector(`${getEditorSelector(0)}-editor`); @@ -1225,7 +1301,7 @@ describe("FreeText Editor", () => { it("must not remove an empty annotation", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - await page.waitForSelector("[data-annotation-id='23R']"); + await page.waitForSelector(getAnnotationSelector("23R")); // Enter in editing mode. await switchToFreeText(page); @@ -1233,7 +1309,7 @@ describe("FreeText Editor", () => { // Disable editing mode. await switchToFreeText(page, /* disable = */ true); - await page.waitForSelector("[data-annotation-id='23R']"); + await page.waitForSelector(getAnnotationSelector("23R")); }) ); }); @@ -1241,21 +1317,20 @@ describe("FreeText Editor", () => { it("must hide the popup when editing", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - await page.click("[data-annotation-id='20R']"); + await page.click(getAnnotationSelector("20R")); + // Wait for the popup to be displayed. + const popupSelector = getAnnotationSelector("popup_20R"); await page.waitForFunction( - () => - document.querySelector("[data-annotation-id='popup_20R']") - .hidden === false + `document.querySelector('${popupSelector}').hidden === false` ); // Enter in editing mode. await switchToFreeText(page); + // Wait for the popup to be hidden. await page.waitForFunction( - () => - document.querySelector("[data-annotation-id='popup_20R']") - .hidden === true + `document.querySelector('${popupSelector}').hidden === true` ); // Exit editing mode. @@ -1263,9 +1338,7 @@ describe("FreeText Editor", () => { // Wait for the popup to be visible. await page.waitForFunction( - () => - document.querySelector("[data-annotation-id='popup_20R']") - .hidden === false + `document.querySelector('${popupSelector}').hidden === false` ); }) ); @@ -1295,12 +1368,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); // Make Chrome happy. await page.waitForFunction(() => { @@ -1387,9 +1460,8 @@ describe("FreeText Editor", () => { await Promise.all( pages.map(async ([browserName, page]) => { await switchToFreeText(page); - let currentId = 0; - const oneToFourteen = Array.from(new Array(14).keys(), x => x + 1); + const oneToFourteen = Array.from(new Array(14).keys(), x => x + 1); for (const pageNumber of oneToFourteen) { const pageSelector = `.page[data-page-number = "${pageNumber}"]`; @@ -1404,14 +1476,12 @@ describe("FreeText Editor", () => { } const rect = await getRect(page, annotationLayerSelector); - const editorSelector = getEditorSelector(currentId); - const data = `Hello PDF.js World !! on page ${pageNumber}`; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - - currentId += 1; + await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: `Hello PDF.js World !! on page ${pageNumber}`, + }); } await selectAll(page); @@ -1507,7 +1577,7 @@ describe("FreeText Editor", () => { // [26, 32, ...] are the annotation ids for (const n of [26, 32, 42, 57, 35, 1]) { const id = `${n}R`; - const rect = await getRect(page, `[data-annotation-id="${id}"]`); + const rect = await getRect(page, getAnnotationSelector(id)); const editorPng = await page.screenshot({ clip: rect, type: "png", @@ -1668,7 +1738,7 @@ describe("FreeText Editor", () => { [20, "TL"], ]) { const id = `${n}R`; - const rect = await getRect(page, `[data-annotation-id="${id}"]`); + const rect = await getRect(page, getAnnotationSelector(id)); const editorPng = await page.screenshot({ clip: rect, type: "png", @@ -1746,12 +1816,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); await page.focus("#editorFreeTextColor"); await kbUndo(page); @@ -1790,13 +1860,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - - const data = "Hello PDF.js World !!"; - const editorSelector = getEditorSelector(0); - await page.mouse.click(rect.x + 200, rect.y + 200); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 200, + y: rect.y + 200, + data: "Hello PDF.js World !!", + }); const [pageX, pageY] = await getFirstSerialized(page, x => x.rect); @@ -1853,12 +1922,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const data = "Hello PDF.js World !!"; - const editorSelector = getEditorSelector(0); - await page.mouse.click(rect.x + 200, rect.y + 200); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 200, + y: rect.y + 200, + data: "Hello PDF.js World !!", + }); await selectAll(page); await page.focus("#editorFreeTextFontSize"); @@ -1892,16 +1961,17 @@ describe("FreeText Editor", () => { const rect = await getRect(page, ".annotationEditorLayer"); const data = "Hello PDF.js World !!"; - let editorSelector = getEditorSelector(0); - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data, + }); const [pageX, pageY] = await getFirstSerialized(page, x => x.rect); await clearAll(page); - editorSelector = getEditorSelector(1); + const editorSelector = getEditorSelector(1); await page.mouse.click(rect.x + 100, rect.y + 100); await page.waitForSelector(editorSelector, { visible: true }); @@ -1965,13 +2035,13 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await cancelFocusIn(page, editorSelector); - await commit(page); + await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + noFocusIn: true, + }); const oneToFourteen = Array.from(new Array(14).keys(), x => x + 1); @@ -2018,23 +2088,21 @@ describe("FreeText Editor", () => { await switchToFreeText(page); let rect = await getRect(page, ".annotationEditorLayer"); - - const firstEditorSelector = getEditorSelector(0); - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(firstEditorSelector, { visible: true }); - await page.type(`${firstEditorSelector} .internal`, "A"); - await commit(page); + const firstEditorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "A", + }); // Create a new editor. rect = await getRect(page, firstEditorSelector); - const secondEditorSelector = getEditorSelector(1); - await page.mouse.click( - rect.x + 5 * rect.width, - rect.y + 5 * rect.height - ); - await page.waitForSelector(secondEditorSelector, { visible: true }); - await page.type(`${secondEditorSelector} .internal`, "B"); - await commit(page); + const secondEditorSelector = await createFreeTextEditor({ + page, + x: rect.x + 5 * rect.width, + y: rect.y + 5 * rect.height, + data: "B", + }); // Select the second editor. await selectEditor(page, secondEditorSelector); @@ -2097,15 +2165,12 @@ describe("FreeText Editor", () => { const allPositions = []; for (let i = 0; i < 10; i++) { - const editorSelector = getEditorSelector(i); - await page.mouse.click(rect.x + 10 + 30 * i, rect.y + 100 + 5 * i); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type( - `${editorSelector} .internal`, - String.fromCharCode(65 + i) - ); - await commit(page); - + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 10 + 30 * i, + y: rect.y + 100 + 5 * i, + data: String.fromCharCode(65 + i), + }); allPositions.push(await getRect(page, editorSelector)); } @@ -2156,13 +2221,13 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await cancelFocusIn(page, editorSelector); - await commit(page); + await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + noFocusIn: true, + }); await page.evaluate(() => { window.editingEvents = []; @@ -2209,12 +2274,13 @@ describe("FreeText Editor", () => { const page1Selector = `.page[data-page-number = "1"] > .annotationEditorLayer.freetextEditing`; let rect = await getRect(page, page1Selector); - const firstEditorSelector = getEditorSelector(0); - await page.mouse.click(rect.x + 10, rect.y + 10); - await page.waitForSelector(firstEditorSelector, { visible: true }); - await page.type(`${firstEditorSelector} .internal`, "Hello"); - await cancelFocusIn(page, firstEditorSelector); - await commit(page); + const firstEditorSelector = await createFreeTextEditor({ + page, + x: rect.x + 10, + y: rect.y + 10, + data: "Hello", + noFocusIn: true, + }); // Unselect. await unselectEditor(page, firstEditorSelector); @@ -2232,11 +2298,12 @@ describe("FreeText Editor", () => { }); rect = await getRect(page, page14Selector); - const secondEditorSelector = getEditorSelector(1); - await page.mouse.click(rect.x + 10, rect.y + 10); - await page.waitForSelector(secondEditorSelector, { visible: true }); - await page.type(`${secondEditorSelector} .internal`, "World"); - await commit(page); + await createFreeTextEditor({ + page, + x: rect.x + 10, + y: rect.y + 10, + data: "World", + }); for (let i = 0; i < 13; i++) { await page.keyboard.press("P"); @@ -2278,12 +2345,13 @@ describe("FreeText Editor", () => { const page1Selector = `.page[data-page-number = "1"] > .annotationEditorLayer.freetextEditing`; const rect = await getRect(page, page1Selector); - const editorSelector = getEditorSelector(0); - await page.mouse.click(rect.x + 10, rect.y + 10); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, "Hello"); - await cancelFocusIn(page, editorSelector); - await commit(page); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 10, + y: rect.y + 10, + data: "Hello", + noFocusIn: true, + }); // Unselect. await unselectEditor(page, editorSelector); @@ -2336,7 +2404,6 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const parentId = "p3R_mc8"; - const editorSelector = getEditorSelector(0); const rect = await page.evaluate(id => { const parent = document.getElementById(id); let span = null; @@ -2349,15 +2416,13 @@ describe("FreeText Editor", () => { const { x, y, width, height } = span.getBoundingClientRect(); return { x, y, width, height }; }, parentId); - await page.mouse.click( - rect.x + rect.width + 5, - rect.y + rect.height / 2 - ); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, "Hello Wolrd"); - await commit(page); - await waitForStorageEntries(page, 1); + await createFreeTextEditor({ + page, + x: rect.x + rect.width + 5, + y: rect.y + rect.height / 2, + data: "Hello World", + }); const id = await getFirstSerialized(page, x => x.structTreeParentId); expect(id).withContext(`In ${browserName}`).toEqual(parentId); @@ -2383,21 +2448,19 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - const internalEditorSelector = `${editorSelector} .internal`; - await page.type(internalEditorSelector, data); - await commit(page); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data, + }); await page.click(editorSelector, { count: 2 }); await page.waitForSelector( `${editorSelector} .overlay:not(.enabled)` ); - await page.click(internalEditorSelector, { - count: 3, - }); + await page.click(`${editorSelector} .internal`, { count: 3 }); const selection = await page.evaluate(() => document.getSelection().toString() ); @@ -2530,12 +2593,13 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data, + }); let handle = await createPromise(page, resolve => { document.addEventListener("selectionchange", resolve, { @@ -2584,12 +2648,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); // Delete it in using the button. await page.click(`${editorSelector} button.deleteButton`); @@ -2627,38 +2691,39 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); + const firstEditorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); + const secondEditorSelector = await createFreeTextEditor({ + page, + x: rect.x + 200, + y: rect.y + 200, + data: "Hello PDF.js World !!", + }); - const data = "Hello PDF.js World !!"; - - for (let i = 1; i <= 2; i++) { - const editorSelector = getEditorSelector(i - 1); - await page.mouse.click(rect.x + i * 100, rect.y + i * 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - } - - // Select the editor created previously. - const editorSelector = getEditorSelector(0); - await selectEditor(page, editorSelector); + // Select the first editor. + await selectEditor(page, firstEditorSelector); await selectAll(page); // Delete it in using the button. - await page.focus(`${editorSelector} button.deleteButton`); + await page.focus(`${firstEditorSelector} button.deleteButton`); await page.keyboard.press("Enter"); await page.waitForFunction( sel => !document.querySelector(sel), {}, - editorSelector + firstEditorSelector ); await waitForStorageEntries(page, 0); // Undo. await kbUndo(page); await waitForSerialized(page, 2); - await page.waitForSelector(editorSelector, { visible: true }); - await page.waitForSelector(getEditorSelector(1), { visible: true }); + await page.waitForSelector(firstEditorSelector, { visible: true }); + await page.waitForSelector(secondEditorSelector, { visible: true }); }) ); }); @@ -2743,14 +2808,14 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); const data = "Hello\nPDF.js\nWorld\n!!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data, + }); - await waitForSerialized(page, 1); const serialized = (await getSerialized(page))[0]; expect(serialized.value) .withContext(`In ${browserName}`) @@ -2777,12 +2842,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); await page.evaluate(() => { window.PDFViewerApplication.eventBus.dispatch( @@ -2878,13 +2943,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - await waitForSerialized(page, 1); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); await page.waitForSelector(`${editorSelector} button.deleteButton`); await page.click(`${editorSelector} button.deleteButton`); @@ -2928,13 +2992,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - await waitForSerialized(page, 1); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); await page.waitForSelector(`${editorSelector} button.deleteButton`); await page.click(`${editorSelector} button.deleteButton`); @@ -2973,13 +3036,13 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - - let editorSelector = getEditorSelector(0); const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + let editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data, + }); const waitForTextChange = (previous, edSelector) => page.waitForFunction( @@ -3129,11 +3192,10 @@ describe("FreeText Editor", () => { } // Check we've now a div containing the text. - await page.waitForSelector( - "[data-annotation-id='998R'] div.annotationContent" - ); + const selector = getAnnotationSelector("998R"); + await page.waitForSelector(`${selector} div.annotationContent`); const newDivText = await page.$eval( - "[data-annotation-id='998R'] div.annotationContent", + `${selector} div.annotationContent`, el => el.innerText.replaceAll("\xa0", " ") ); expect(newDivText) @@ -3141,18 +3203,12 @@ describe("FreeText Editor", () => { .toEqual("Hello World and edited in Firefox"); // Check that the canvas has nothing drawn at the annotation position. - await page.$eval( - "[data-annotation-id='998R']", - el => (el.hidden = true) - ); + await page.$eval(selector, el => (el.hidden = true)); let editorPng = await page.screenshot({ clip: editorRect, type: "png", }); - await page.$eval( - "[data-annotation-id='998R']", - el => (el.hidden = false) - ); + await page.$eval(selector, el => (el.hidden = false)); let editorImage = PNG.sync.read(Buffer.from(editorPng)); expect(editorImage.data.every(x => x === 0xff)) .withContext(`In ${browserName}`) @@ -3249,7 +3305,6 @@ describe("FreeText Editor", () => { describe("Undo deletion popup has the expected behaviour", () => { let pages; - const editorSelector = getEditorSelector(0); beforeEach(async () => { pages = await loadAndWait("tracemonkey.pdf", ".annotationEditorLayer"); @@ -3265,12 +3320,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - await waitForSerialized(page, 1); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); await page.waitForSelector(`${editorSelector} button.deleteButton`); await page.click(`${editorSelector} button.deleteButton`); @@ -3293,12 +3348,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - await waitForSerialized(page, 1); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); await page.waitForSelector(`${editorSelector} button.deleteButton`); await page.click(`${editorSelector} button.deleteButton`); @@ -3326,12 +3381,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); let rect = await getRect(page, ".annotationEditorLayer"); - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - await waitForSerialized(page, 1); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); await page.waitForSelector(`${editorSelector} button.deleteButton`); await page.click(`${editorSelector} button.deleteButton`); @@ -3339,13 +3394,12 @@ describe("FreeText Editor", () => { await page.waitForSelector("#editorUndoBar", { visible: true }); rect = await getRect(page, ".annotationEditorLayer"); - const secondEditorSelector = getEditorSelector(1); - const newData = "This is a new text box!"; - await page.mouse.click(rect.x + 150, rect.y + 150); - await page.waitForSelector(secondEditorSelector, { visible: true }); - await page.type(`${secondEditorSelector} .internal`, newData); - await commit(page); - await waitForSerialized(page, 1); + await createFreeTextEditor({ + page, + x: rect.x + 150, + y: rect.y + 150, + data: "This is a new text box!", + }); await page.waitForSelector("#editorUndoBar", { hidden: true }); }) ); @@ -3369,14 +3423,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - - const data = "Hello PDF.js World !!"; - await page.mouse.click(rect.x + 100, rect.y + 100); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - await waitForSerialized(page, 1); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); let alignment = await page.$eval( `${editorSelector} .internal`, @@ -3417,17 +3469,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - - const data = "Hello PDF.js World !!"; - await page.mouse.click( - rect.x + rect.width / 2, - rect.y + rect.height / 2 - ); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - await waitForSerialized(page, 1); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + rect.width / 2, + y: rect.y + rect.height / 2, + data: "Hello PDF.js World !!", + }); await switchToFreeText(page, /* disable */ true); @@ -3457,17 +3504,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - - const data = "Hello PDF.js World !!"; - await page.mouse.click( - rect.x + rect.width / 2, - rect.y + rect.height / 2 - ); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); - await waitForSerialized(page, 1); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + rect.width / 2, + y: rect.y + rect.height / 2, + data: "Hello PDF.js World !!", + }); await switchToFreeText(page, /* disable */ true); await switchToEditor("Ink", page); @@ -3522,15 +3564,12 @@ describe("FreeText Editor", () => { await switchToFreeText(page); const rect = await getRect(page, ".annotationEditorLayer"); - const editorSelector = getEditorSelector(0); - const data = "Hello PDF.js World !!"; - await page.mouse.click( - rect.x + rect.width / 2, - rect.y + rect.height / 2 - ); - await page.waitForSelector(editorSelector, { visible: true }); - await page.type(`${editorSelector} .internal`, data); - await commit(page); + const editorSelector = await createFreeTextEditor({ + page, + x: rect.x + rect.width / 2, + y: rect.y + rect.height / 2, + data: "Hello PDF.js World !!", + }); const colorPickerSelector = `${editorSelector} input.basicColorPicker`; await page.waitForSelector(colorPickerSelector, { visible: true }); @@ -3606,4 +3645,46 @@ describe("FreeText Editor", () => { ); }); }); + + describe("No exception when moving (issue 20571)", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "tracemonkey.pdf", + ".annotationEditorLayer", + 100 + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the buttons work correctly", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToFreeText(page); + + const rect = await getRect(page, ".annotationEditorLayer"); + await createFreeTextEditor({ + page, + x: rect.x + 100, + y: rect.y + 100, + data: "Hello PDF.js World !!", + }); + + await switchToFreeText(page, /* disable = */ true); + await switchToFreeText(page); + + const editorSelector = getEditorSelector(0); + await selectEditor(page, editorSelector); + await dragAndDrop(page, editorSelector, [[10, 10]]); + + await switchToFreeText(page, /* disable = */ true); + await switchToFreeText(page); + }) + ); + }); + }); }); diff --git a/test/integration/highlight_editor_spec.mjs b/test/integration/highlight_editor_spec.mjs index c23f9999ab38c..094ef2b9f0ee7 100644 --- a/test/integration/highlight_editor_spec.mjs +++ b/test/integration/highlight_editor_spec.mjs @@ -16,12 +16,14 @@ import { awaitPromise, closePages, + getAnnotationSelector, getEditorSelector, getFirstSerialized, getRect, getSerialized, getSpanRectFromText, getXY, + highlightSpan, kbBigMoveLeft, kbBigMoveUp, kbFocusNext, @@ -30,6 +32,7 @@ import { kbUndo, loadAndWait, scrollIntoView, + selectEditor, selectEditors, setCaretAt, switchToEditor, @@ -67,17 +70,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - // Here and elsewhere, we add a small delay between press and release - // to make sure that a pointerup event is triggered after - // selectionchange. - // It works with a value of 1ms, but we use 100ms to be sure. - await page.mouse.click(x, y, { count: 2, delay: 100 }); - - await page.waitForSelector(`${getEditorSelector(0)}`); - + await highlightSpan(page, 1, "Abstract"); await page.waitForFunction( `document.getElementById("viewer-alert").textContent === "Highlight added"` ); @@ -117,12 +110,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - - await page.waitForSelector(`${getEditorSelector(0)}`); + await highlightSpan(page, 1, "Abstract"); await page.waitForSelector( `.page[data-page-number = "1"] svg.highlightOutline.selected` ); @@ -167,12 +155,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - - await page.waitForSelector(`${getEditorSelector(0)}`); + await highlightSpan(page, 1, "Abstract"); await page.waitForSelector( `.page[data-page-number = "1"] svg.highlightOutline.selected` ); @@ -212,12 +195,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - let rect = await getSpanRectFromText(page, 1, "Abstract"); - let x = rect.x + rect.width / 2; - let y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - - await page.waitForSelector(`${getEditorSelector(0)}`); + await highlightSpan(page, 1, "Abstract"); await page.waitForSelector( `.page[data-page-number = "1"] svg.highlightOutline.selected` ); @@ -235,13 +213,8 @@ describe("Highlight Editor", () => { `.page[data-page-number = "14"] .textLayer .endOfContent` ); - rect = await getSpanRectFromText(page, 14, "References"); - x = rect.x + rect.width / 2; - y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - + await highlightSpan(page, 14, "References"); const editorSelector = getEditorSelector(1); - await page.waitForSelector(editorSelector); await page.waitForSelector( `.page[data-page-number = "14"] svg.highlightOutline.selected` ); @@ -300,12 +273,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - - await page.waitForSelector(`${getEditorSelector(0)}`); + await highlightSpan(page, 1, "Abstract"); await page.waitForSelector( `.page[data-page-number = "1"] svg.highlightOutline.selected` ); @@ -361,12 +329,7 @@ describe("Highlight Editor", () => { await switchToHighlight(page); const sel = getEditorSelector(0); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - - await page.waitForSelector(sel); + await highlightSpan(page, 1, "Abstract"); await page.waitForSelector( `.page[data-page-number = "1"] svg.highlightOutline.selected` ); @@ -471,13 +434,8 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - + await highlightSpan(page, 1, "Abstract"); const editorSelector = getEditorSelector(0); - await page.waitForSelector(editorSelector); await page.waitForSelector( `.page[data-page-number = "1"] svg.highlightOutline.selected` ); @@ -519,12 +477,7 @@ describe("Highlight Editor", () => { await switchToHighlight(page); const sel = getEditorSelector(0); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - - await page.waitForSelector(sel); + await highlightSpan(page, 1, "Abstract"); await page.waitForSelector( `.page[data-page-number = "1"] svg.highlightOutline.selected` ); @@ -534,7 +487,8 @@ describe("Highlight Editor", () => { await page.waitForSelector( `${sel} .editToolbar button[title = "Red"]` ); - await page.mouse.click(x, y - rect.height); + const rect = await getSpanRectFromText(page, 1, "Abstract"); + await page.mouse.click(rect.x, rect.y - rect.height); await page.waitForSelector( `${sel} .editToolbar button.colorPicker .dropdown.hidden` ); @@ -560,17 +514,16 @@ describe("Highlight Editor", () => { await switchToHighlight(page); const sel = getEditorSelector(0); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - - await page.waitForSelector(sel); + await highlightSpan(page, 1, "Abstract"); await page.waitForSelector( `.page[data-page-number = "1"] svg.highlightOutline.selected` ); await page.waitForSelector(`${sel} .editToolbar button.colorPicker`); + + const rect = await getSpanRectFromText(page, 1, "Abstract"); + const x = rect.x + rect.width / 2; + const y = rect.y + rect.height / 2; await page.mouse.click(x, y - rect.height); await page.waitForSelector( `.page[data-page-number = "1"] svg.highlightOutline:not(.selected)` @@ -829,16 +782,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText( - page, - 1, - "Questions courantes" - ); - const x = rect.x + 0.75 * rect.width; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - - await page.waitForSelector(`${getEditorSelector(0)}`); + await highlightSpan(page, 1, "Questions courantes", 0.75, 0.5); const usedColor = await page.evaluate(() => { const highlight = document.querySelector( `.page[data-page-number = "1"] .canvasWrapper > svg.highlight` @@ -1013,13 +957,8 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - + await highlightSpan(page, 1, "Abstract"); const editorSelector = getEditorSelector(0); - await page.waitForSelector(editorSelector); await unselectEditor(page, editorSelector); await setCaretAt( @@ -1071,14 +1010,12 @@ describe("Highlight Editor", () => { it("must check that an highlight can be left with the keyboard", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - await switchToHighlight(page); - if (browserName === "chrome") { - // Unfortunately, we can't test this on Chrome because we can't set - // the caret browsing mode to true. - return; + pending("Caret browsing mode cannot be used in Chrome."); } + await switchToHighlight(page); + let rect = await getSpanRectFromText( page, 1, @@ -1160,13 +1097,8 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - + await highlightSpan(page, 1, "Abstract"); const editorSelector = getEditorSelector(0); - await page.waitForSelector(editorSelector); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -1195,17 +1127,10 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - let rect = await getSpanRectFromText(page, 1, "Abstract"); - await page.mouse.click( - rect.x + rect.width / 2, - rect.y + rect.height / 2, - { count: 2, delay: 100 } - ); - + await highlightSpan(page, 1, "Abstract"); const editorSelector = getEditorSelector(0); - await page.waitForSelector(editorSelector); - rect = await getRect(page, ".annotationEditorLayer"); + const rect = await getRect(page, ".annotationEditorLayer"); const clickHandle = await waitForPointerUp(page); await page.mouse.move(rect.x + 5, rect.y + 5); @@ -1250,14 +1175,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Languages"); - await page.mouse.click( - rect.x + rect.width / 2, - rect.y + rect.height / 2, - { count: 2, delay: 100 } - ); - - await page.waitForSelector(getEditorSelector(0)); + await highlightSpan(page, 1, "Languages"); await waitForSerialized(page, 1); const quadPoints = await getFirstSerialized(page, e => e.quadPoints); // Expected quadPoints tL, tR, bL, bR with bL coordinate. @@ -1286,14 +1204,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Hello World"); - await page.mouse.click( - rect.x + rect.width / 4, - rect.y + rect.height / 2, - { count: 2, delay: 100 } - ); - - await page.waitForSelector(getEditorSelector(0)); + await highlightSpan(page, 1, "Hello World", 0.25); await waitForSerialized(page, 1); const quadPoints = await getFirstSerialized(page, e => e.quadPoints); // Expected quadPoints tL, tR, bL, bR with bL coordinate. @@ -1322,13 +1233,8 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - + await highlightSpan(page, 1, "Abstract"); const editorSelector = getEditorSelector(0); - await page.waitForSelector(editorSelector); await page.focus(`${editorSelector} button.colorPicker`); await page.keyboard.press("Escape"); @@ -1392,7 +1298,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - let rect = await getRect(page, ".annotationEditorLayer"); + const rect = await getRect(page, ".annotationEditorLayer"); const clickHandle = await waitForPointerUp(page); await page.mouse.move(rect.x + 20, rect.y + 20); await page.mouse.down(); @@ -1403,15 +1309,8 @@ describe("Highlight Editor", () => { const firstEditorSelector = getEditorSelector(0); await page.waitForSelector(firstEditorSelector); - rect = await getSpanRectFromText(page, 1, "Languages"); - await page.mouse.click( - rect.x + rect.width / 2, - rect.y + rect.height / 2, - { count: 2, delay: 100 } - ); - + await highlightSpan(page, 1, "Languages"); const secondEditorSelector = getEditorSelector(1); - await page.waitForSelector(secondEditorSelector); await page.click("#editorHighlightShowAll"); await page.waitForSelector(`${firstEditorSelector}.hidden`); @@ -1513,19 +1412,10 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - let rect = await getSpanRectFromText(page, 1, "Abstract"); - let x = rect.x + rect.width / 2; - let y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(getEditorSelector(0)); - - rect = await getSpanRectFromText(page, 1, "Languages"); - x = rect.x + rect.width / 2; - y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); + await highlightSpan(page, 1, "Abstract"); + await highlightSpan(page, 1, "Languages"); const editorSelector = getEditorSelector(1); - await page.waitForSelector(editorSelector); await page.focus(editorSelector); await kbFocusPrevious(page); @@ -1556,13 +1446,8 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - + await highlightSpan(page, 1, "Abstract"); const editorSelector = getEditorSelector(0); - await page.waitForSelector(editorSelector); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -1602,13 +1487,8 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - + await highlightSpan(page, 1, "Abstract"); const editorSelector = getEditorSelector(0); - await page.waitForSelector(editorSelector); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -1664,13 +1544,8 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - + await highlightSpan(page, 1, "Abstract"); const editorSelector = getEditorSelector(0); - await page.waitForSelector(editorSelector); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -1789,17 +1664,15 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); + await highlightSpan(page, 1, "Abstract"); const editorSelector = getEditorSelector(0); - const x = rect.x + rect.width / 2; - let y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); await waitForSerialized(page, 1); await unselectEditor(page, editorSelector); const clickHandle = await waitForPointerUp(page); - y = rect.y - rect.height; + const rect = await getSpanRectFromText(page, 1, "Abstract"); + const x = rect.x + rect.width / 2; + let y = rect.y - rect.height; await page.mouse.move(x, y); const counterHandle = await page.evaluateHandle(sel => { @@ -1854,9 +1727,7 @@ describe("Highlight Editor", () => { await Promise.all( pages.map(async ([browserName, page]) => { if (navigator.platform.includes("Win")) { - // Skip the test on Windows because it permafails. - // TODO: Remove this check once #20136 is fixed. - return; + pending("Fails consistently on Windows (issue #20136)."); } await switchToHighlight(page); @@ -1981,7 +1852,7 @@ describe("Highlight Editor", () => { await Promise.all( pages.map(async ([browserName, page]) => { const modeChangedHandle = await waitForAnnotationModeChanged(page); - await waitAndClick(page, "[data-annotation-id='687R']", { count: 2 }); + await waitAndClick(page, getAnnotationSelector("687R"), { count: 2 }); await awaitPromise(modeChangedHandle); await page.waitForSelector("#highlightParamsToolbarContainer"); @@ -2022,7 +1893,7 @@ describe("Highlight Editor", () => { await Promise.all( pages.map(async ([browserName, page]) => { const modeChangedHandle = await waitForAnnotationModeChanged(page); - await waitAndClick(page, "[data-annotation-id='24R']", { count: 2 }); + await waitAndClick(page, getAnnotationSelector("24R"), { count: 2 }); await awaitPromise(modeChangedHandle); await page.waitForSelector("#highlightParamsToolbarContainer"); @@ -2072,7 +1943,7 @@ describe("Highlight Editor", () => { await Promise.all( pages.map(async ([browserName, page]) => { const modeChangedHandle = await waitForAnnotationModeChanged(page); - await page.click("[data-annotation-id='693R']", { count: 2 }); + await page.click(getAnnotationSelector("693R"), { count: 2 }); await awaitPromise(modeChangedHandle); await page.waitForSelector("#highlightParamsToolbarContainer"); @@ -2203,11 +2074,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2233,11 +2100,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2259,11 +2122,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2285,24 +2144,20 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); await page.click(`${editorSelector} button.deleteButton`); - await waitForSerialized(page, 0); await page.waitForSelector("#editorUndoBar", { visible: true }); - const newRect = await getSpanRectFromText(page, 1, "Introduction"); - const newX = newRect.x + newRect.width / 2; - const newY = newRect.y + newRect.height / 2; - await page.mouse.click(newX, newY, { count: 2, delay: 100 }); + // TODO: remove the timeout and try to figure out a way to ensure that + // the previous operations are fully processed before creating a new + // highlight. + // eslint-disable-next-line no-restricted-syntax + await waitForTimeout(100); - await page.waitForSelector(getEditorSelector(1)); + await highlightSpan(page, 1, "Introduction"); await page.waitForSelector("#editorUndoBar", { hidden: true }); }) ); @@ -2313,11 +2168,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2336,11 +2187,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2359,11 +2206,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2382,11 +2225,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2406,11 +2245,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2429,11 +2264,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2489,11 +2320,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2522,17 +2349,8 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - let rect = await getSpanRectFromText(page, 1, "Abstract"); - let x = rect.x + rect.width / 2; - let y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); - - rect = await getSpanRectFromText(page, 1, "Languages"); - x = rect.x + rect.width / 2; - y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(getEditorSelector(1)); + await highlightSpan(page, 1, "Abstract"); + await highlightSpan(page, 1, "Languages"); await selectAll(page); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2566,11 +2384,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2613,11 +2427,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await waitForSerialized(page, 1); await page.waitForSelector(`${editorSelector} button.deleteButton`); @@ -2740,10 +2550,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); + await highlightSpan(page, 1, "Abstract"); const highlightSelector = `.page[data-page-number = "1"] .canvasWrapper > svg.highlight`; await page.waitForSelector(`${highlightSelector}[fill = "#AB0000"]`); @@ -2784,13 +2591,7 @@ describe("Highlight Editor", () => { pages.map(async ([browserName, page]) => { await switchToHighlight(page); - const rect = await getSpanRectFromText(page, 1, "Abstract"); - const x = rect.x + rect.width / 2; - const y = rect.y + rect.height / 2; - await page.mouse.click(x, y, { count: 2, delay: 100 }); - - const editorSelector = getEditorSelector(0); - await page.waitForSelector(editorSelector); + await highlightSpan(page, 1, "Abstract"); await page.waitForSelector( `.page[data-page-number = "1"] svg.highlightOutline.selected` ); @@ -2864,4 +2665,193 @@ describe("Highlight Editor", () => { ); }); }); + + describe("Highlight (edit existing and scroll)", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "highlights.pdf", + ".annotationEditorLayer", + null, + null, + { + highlightEditorColors: + "yellow=#FFFF00,green=#00FF00,blue=#0000FF,pink=#FF00FF,red=#FF0102", + } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that no extra annotations are added while in editing mode", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + + const editorSelector = getEditorSelector(7); + await page.waitForSelector(editorSelector); + + const oneToOne = Array.from(new Array(13).keys(), n => n + 2).concat( + Array.from(new Array(13).keys(), n => 13 - n) + ); + for (const pageNumber of oneToOne) { + await scrollIntoView( + page, + `.page[data-page-number = "${pageNumber}"]` + ); + } + + await page.waitForSelector(editorSelector); + + const count = await page.evaluate( + () => + document.querySelectorAll( + `.page[data-page-number = "1"] .annotationEditorLayer .highlightEditor` + ).length + ); + expect(count).withContext(`In ${browserName}`).toEqual(8); + }) + ); + }); + + it("must check that no extra annotations are added while in reading mode", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + + const editorSelector = getEditorSelector(7); + await page.waitForSelector(editorSelector); + + const oneToThirteen = Array.from(new Array(13).keys(), n => n + 2); + const thirteenToOne = Array.from(new Array(13).keys(), n => 13 - n); + for (const pageNumber of oneToThirteen) { + await scrollIntoView( + page, + `.page[data-page-number = "${pageNumber}"]` + ); + } + + await switchToHighlight(page, /* disable */ true); + + for (const pageNumber of thirteenToOne) { + await scrollIntoView( + page, + `.page[data-page-number = "${pageNumber}"]` + ); + } + + await page.waitForSelector( + `.page[data-page-number = "1"] .annotationEditorLayer.disabled` + ); + + await page.waitForFunction( + () => + document.querySelectorAll( + `.page[data-page-number = "1"] .annotationEditorLayer .highlightEditor` + ).length === 0 + ); + }) + ); + }); + }); + + describe("An ink between two highlights and focus", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "tracemonkey.pdf", + ".annotationEditorLayer", + null, + null, + { highlightEditorColors: "red=#AB0000" } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that focus move from an editor to an other", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await switchToHighlight(page); + + await highlightSpan(page, 1, "Languages"); + const editorSelector0 = getEditorSelector(0); + + await highlightSpan(page, 1, "Abstract"); + const editorSelector1 = getEditorSelector(1); + + await switchToEditor("Ink", page); + + const rect = await getSpanRectFromText( + page, + 1, + "University of California, Irvine" + ); + + const clickHandle = await waitForPointerUp(page); + await page.mouse.move(rect.x, rect.y); + await page.mouse.down(); + await page.mouse.move(rect.x + 50, rect.y + 50); + await page.mouse.up(); + await awaitPromise(clickHandle); + + await page.keyboard.press("Escape"); + await page.waitForSelector( + ".inkEditor.selectedEditor.draggable.disabled" + ); + + await selectEditor(page, editorSelector0); + for (let i = 0; i < 6; i++) { + await page.keyboard.press("Tab", { delay: 100 }); + } + await waitForSelectedEditor(page, editorSelector1); + }) + ); + }); + }); + + describe("All editors must be focusable", () => { + describe("bug1992868.pdf", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "bug1992868.pdf", + getAnnotationSelector("999R"), + "page-fit" + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the freetext annotation can be reached", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const modeChangedHandle = await waitForAnnotationModeChanged(page); + await page.click(getAnnotationSelector("997R"), { count: 2 }); + await awaitPromise(modeChangedHandle); + await page.waitForSelector("#highlightParamsToolbarContainer"); + + const editorSelector = getEditorSelector(0); + await page.waitForSelector(editorSelector); + await page.focus(editorSelector); + await waitForSelectedEditor(page, editorSelector); + + for (let i = 0; i < 4; i++) { + await page.keyboard.press("Tab", { delay: 100 }); + } + await waitForSelectedEditor(page, getEditorSelector(1)); + }) + ); + }); + }); + }); }); diff --git a/test/integration/ink_editor_spec.mjs b/test/integration/ink_editor_spec.mjs index a8ee95b7d3f43..f9b8a0a2c54a0 100644 --- a/test/integration/ink_editor_spec.mjs +++ b/test/integration/ink_editor_spec.mjs @@ -52,12 +52,21 @@ const commit = async page => { const switchToInk = switchToEditor.bind(null, "Ink"); +const drawLine = async (page, x0, y0, x1, y1) => { + const clickHandle = await waitForPointerUp(page); + await page.mouse.move(x0, y0); + await page.mouse.down(); + await page.mouse.move(x1, y1); + await page.mouse.up(); + await awaitPromise(clickHandle); +}; + describe("Ink Editor", () => { describe("Basic operations", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("aboutstacks.pdf", ".annotationEditorLayer"); + pages = await loadAndWait("empty.pdf", ".annotationEditorLayer"); }); afterEach(async () => { @@ -74,13 +83,7 @@ describe("Ink Editor", () => { for (let i = 0; i < 3; i++) { const x = rect.x + 100 + i * 100; const y = rect.y + 100 + i * 100; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(x, y); - await page.mouse.down(); - await page.mouse.move(x + 50, y + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); - + await drawLine(page, x, y, x + 50, y + 50); await commit(page); } @@ -107,15 +110,9 @@ describe("Ink Editor", () => { const rect = await getRect(page, ".annotationEditorLayer"); - const xStart = rect.x + 300; - const yStart = rect.y + 300; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(xStart, yStart); - await page.mouse.down(); - await page.mouse.move(xStart + 50, yStart + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); - + const x = rect.x + 300; + const y = rect.y + 300; + await drawLine(page, x, y, x + 50, y + 50); await commit(page); const rectBefore = await getRect(page, ".canvasWrapper .draw"); @@ -149,13 +146,7 @@ describe("Ink Editor", () => { const x = rect.x + 100; const y = rect.y + 100; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(x, y); - await page.mouse.down(); - await page.mouse.move(x + 50, y + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); - + await drawLine(page, x, y, x + 50, y + 50); await commit(page); const editorSelector = getEditorSelector(0); @@ -205,13 +196,7 @@ describe("Ink Editor", () => { const x = rect.x + 20; const y = rect.y + 20; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(x, y); - await page.mouse.down(); - await page.mouse.move(x + 50, y + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); - + await drawLine(page, x, y, x + 50, y + 50); await commit(page); await selectAll(page); @@ -244,13 +229,7 @@ describe("Ink Editor", () => { const x = rect.x + 20; const y = rect.y + 20; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(x, y); - await page.mouse.down(); - await page.mouse.move(x + 50, y + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); - + await drawLine(page, x, y, x + 50, y + 50); await commit(page); const oneToFourteen = Array.from(new Array(13).keys(), n => n + 2); @@ -299,12 +278,7 @@ describe("Ink Editor", () => { const x = rect.x + 20; const y = rect.y + 20; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(x, y); - await page.mouse.down(); - await page.mouse.move(x + 50, y + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + await drawLine(page, x, y, x + 50, y + 50); await page.mouse.click(rect.x - 10, rect.y + 10); await page.waitForSelector(`${getEditorSelector(0)}.disabled`); @@ -331,14 +305,9 @@ describe("Ink Editor", () => { const rect = await getRect(page, ".annotationEditorLayer"); - const xStart = rect.x + 300; - const yStart = rect.y + 300; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(xStart, yStart); - await page.mouse.down(); - await page.mouse.move(xStart + 50, yStart + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + const x = rect.x + 300; + const y = rect.y + 300; + await drawLine(page, x, y, x + 50, y + 50); await commit(page); const editorSelector = getEditorSelector(0); @@ -375,14 +344,9 @@ describe("Ink Editor", () => { const rect = await getRect(page, ".annotationEditorLayer"); - const xStart = rect.x + 300; - const yStart = rect.y + 300; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(xStart, yStart); - await page.mouse.down(); - await page.mouse.move(xStart + 50, yStart + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + const x = rect.x + 300; + const y = rect.y + 300; + await drawLine(page, x, y, x + 50, y + 50); await commit(page); const editorSelector = getEditorSelector(0); @@ -432,14 +396,9 @@ describe("Ink Editor", () => { const rect = await getRect(page, ".annotationEditorLayer"); - const xStart = rect.x + 300; - const yStart = rect.y + 300; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(xStart, yStart); - await page.mouse.down(); - await page.mouse.move(xStart + 50, yStart + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + const x = rect.x + 300; + const y = rect.y + 300; + await drawLine(page, x, y, x + 50, y + 50); await commit(page); const editorSelector = getEditorSelector(0); @@ -483,16 +442,11 @@ describe("Ink Editor", () => { await switchToInk(page); const rect = await getRect(page, ".annotationEditorLayer"); - let xStart = rect.x + 10; - const yStart = rect.y + 10; + let x = rect.x + 10; + const y = rect.y + 10; for (let i = 0; i < 5; i++) { - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(xStart, yStart); - await page.mouse.down(); - await page.mouse.move(xStart + 50, yStart + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); - xStart += 70; + await drawLine(page, x, y, x + 50, y + 50); + x += 70; } await commit(page); @@ -561,13 +515,7 @@ describe("Ink Editor", () => { const x = rect.x + 20; const y = rect.y + 20; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(x, y); - await page.mouse.down(); - await page.mouse.move(x + 50, y + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); - + await drawLine(page, x, y, x + 50, y + 50); await commit(page); const drawSelector = `.page[data-page-number = "1"] .canvasWrapper .draw`; @@ -636,12 +584,7 @@ describe("Ink Editor", () => { const x = rect.x + 20; const y = rect.y + 20; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(x, y); - await page.mouse.down(); - await page.mouse.move(x + 50, y + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + await drawLine(page, x, y, x + 50, y + 50); const drawSelector = `.canvasWrapper svg.draw path[d]:not([d=""])`; await page.waitForSelector(drawSelector); @@ -680,12 +623,7 @@ describe("Ink Editor", () => { const x = rect.x + 20; const y = rect.y + 20; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(x, y); - await page.mouse.down(); - await page.mouse.move(x + 50, y + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + await drawLine(page, x, y, x + 50, y + 50); await page.evaluate(() => { window.focusedIds = []; @@ -884,14 +822,9 @@ describe("Ink Editor", () => { await switchToInk(page); const rect = await getRect(page, ".annotationEditorLayer"); - const xStart = rect.x + 300; - const yStart = rect.y + 300; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(xStart, yStart); - await page.mouse.down(); - await page.mouse.move(xStart + 50, yStart + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + const x = rect.x + 300; + const y = rect.y + 300; + await drawLine(page, x, y, x + 50, y + 50); await commit(page); await page.waitForSelector(editorSelector); @@ -918,14 +851,9 @@ describe("Ink Editor", () => { await switchToInk(page); const rect = await getRect(page, ".annotationEditorLayer"); - const xStart = rect.x + 300; - const yStart = rect.y + 300; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(xStart, yStart); - await page.mouse.down(); - await page.mouse.move(xStart + 50, yStart + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + const x = rect.x + 300; + const y = rect.y + 300; + await drawLine(page, x, y, x + 50, y + 50); await commit(page); await page.waitForSelector(editorSelector); @@ -957,14 +885,9 @@ describe("Ink Editor", () => { await switchToInk(page); const rect = await getRect(page, ".annotationEditorLayer"); - const xStart = rect.x + 300; - const yStart = rect.y + 300; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(xStart, yStart); - await page.mouse.down(); - await page.mouse.move(xStart + 50, yStart + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + const x = rect.x + 300; + const y = rect.y + 300; + await drawLine(page, x, y, x + 50, y + 50); await commit(page); await page.waitForSelector(editorSelector); @@ -976,14 +899,9 @@ describe("Ink Editor", () => { await page.waitForSelector("#editorUndoBar", { visible: true }); const newRect = await getRect(page, ".annotationEditorLayer"); - const newXStart = newRect.x + 300; - const newYStart = newRect.y + 300; - const newClickHandle = await waitForPointerUp(page); - await page.mouse.move(newXStart, newYStart); - await page.mouse.down(); - await page.mouse.move(newXStart + 50, newYStart + 50); - await page.mouse.up(); - await awaitPromise(newClickHandle); + const newX = newRect.x + 300; + const newY = newRect.y + 300; + await drawLine(page, newX, newY, newX + 50, newY + 50); await commit(page); await page.waitForSelector(getEditorSelector(1)); @@ -1014,12 +932,7 @@ describe("Ink Editor", () => { const x = rect.x + 20; const y = rect.y + 20; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(x, y); - await page.mouse.down(); - await page.mouse.move(x + 50, y + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + await drawLine(page, x, y, x + 50, y + 50); const svgSelector = ".canvasWrapper svg.draw"; const strokeWidth = await page.$eval(svgSelector, el => @@ -1082,14 +995,9 @@ describe("Ink Editor", () => { page, `${pageSelector} .annotationEditorLayer` ); - const xStart = rect.x + 10; - const yStart = rect.y + 10; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(xStart, yStart); - await page.mouse.down(); - await page.mouse.move(xStart + 10, yStart + 10); - await page.mouse.up(); - await awaitPromise(clickHandle); + const x = rect.x + 10; + const y = rect.y + 10; + await drawLine(page, x, y, x + 10, y + 10); await commit(page); } @@ -1148,15 +1056,10 @@ describe("Ink Editor", () => { await switchToInk(page); const editorLayerRect = await getRect(page, ".annotationEditorLayer"); - const drawStartX = editorLayerRect.x + 100; - const drawStartY = editorLayerRect.y + 100; - - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(drawStartX, drawStartY); - await page.mouse.down(); - await page.mouse.move(drawStartX + 50, drawStartY + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + + const x = editorLayerRect.x + 100; + const y = editorLayerRect.y + 100; + await drawLine(page, x, y, x + 50, y + 50); await commit(page); const pageFinalPosition = await getRect( @@ -1217,10 +1120,9 @@ describe("The pen-drawn shape must maintain correct curvature regardless of the await Promise.all( pages.map(async ([browserName, page]) => { if (browserName === "chrome" && navigator.platform.includes("Win")) { - // Skip the test for Chrome on Windows because it doesn't allow to - // have elements outside the viewport and thus permafails with e.g. - // `Cannot move beyond viewport (x: -32, y: 241)`. - return; + pending( + "Chrome on Windows doesn't allow having elements outside the viewport." + ); } await switchToInk(page); @@ -1258,16 +1160,10 @@ describe("Should switch from an editor and mode to others by double clicking", ( await switchToInk(page); const editorLayerRect = await getRect(page, ".annotationEditorLayer"); - const drawStartX = editorLayerRect.x + 100; - const drawStartY = editorLayerRect.y + 100; - const inkSelector = getEditorSelector(0); - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(drawStartX, drawStartY); - await page.mouse.down(); - await page.mouse.move(drawStartX + 50, drawStartY + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + const x = editorLayerRect.x + 100; + const y = editorLayerRect.y + 100; + await drawLine(page, x, y, x + 50, y + 50); await commit(page); await switchToEditor("FreeText", page); @@ -1287,6 +1183,7 @@ describe("Should switch from an editor and mode to others by double clicking", ( await page.waitForSelector("#editorInkButton:not(.toggled)"); let modeChangedHandle = await waitForAnnotationModeChanged(page); + const inkSelector = getEditorSelector(0); await selectEditor(page, inkSelector, 2); await awaitPromise(modeChangedHandle); await page.waitForSelector("#editorInkButton.toggled"); @@ -1323,12 +1220,7 @@ describe("Ink must update its color", () => { const x = rect.x + 20; const y = rect.y + 20; - const clickHandle = await waitForPointerUp(page); - await page.mouse.move(x, y); - await page.mouse.down(); - await page.mouse.move(x + 50, y + 50); - await page.mouse.up(); - await awaitPromise(clickHandle); + await drawLine(page, x, y, x + 50, y + 50); await commit(page); const editorSelector = getEditorSelector(0); diff --git a/test/integration/jasmine-boot.js b/test/integration/jasmine-boot.js index 72a8412afe57a..44cb39bdb862c 100644 --- a/test/integration/jasmine-boot.js +++ b/test/integration/jasmine-boot.js @@ -30,12 +30,14 @@ async function runTests(results) { "annotation_spec.mjs", "autolinker_spec.mjs", "caret_browsing_spec.mjs", + "comment_spec.mjs", "copy_paste_spec.mjs", "document_properties_spec.mjs", "find_spec.mjs", "freetext_editor_spec.mjs", "highlight_editor_spec.mjs", "ink_editor_spec.mjs", + "reorganize_pages_spec.mjs", "scripting_spec.mjs", "signature_editor_spec.mjs", "stamp_editor_spec.mjs", diff --git a/test/integration/reorganize_pages_spec.mjs b/test/integration/reorganize_pages_spec.mjs new file mode 100644 index 0000000000000..647bea1cfabf8 --- /dev/null +++ b/test/integration/reorganize_pages_spec.mjs @@ -0,0 +1,633 @@ +/* Copyright 2026 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + awaitPromise, + clearInput, + closePages, + createPromise, + dragAndDrop, + getAnnotationSelector, + getRect, + getThumbnailSelector, + loadAndWait, + scrollIntoView, + waitForDOMMutation, +} from "./test_utils.mjs"; + +async function waitForThumbnailVisible(page, pageNums) { + await page.click("#viewsManagerToggleButton"); + + const thumbSelector = "#thumbnailsView .thumbnailImage"; + await page.waitForSelector(thumbSelector, { visible: true }); + if (!pageNums) { + return null; + } + if (!Array.isArray(pageNums)) { + pageNums = [pageNums]; + } + return Promise.all( + pageNums.map(pageNum => + page.waitForSelector(getThumbnailSelector(pageNum), { visible: true }) + ) + ); +} + +function waitForPagesEdited(page) { + return createPromise(page, resolve => { + window.PDFViewerApplication.eventBus.on( + "pagesedited", + ({ pagesMapper }) => { + resolve(Array.from(pagesMapper.getMapping())); + }, + { + once: true, + } + ); + }); +} + +async function waitForHavingContents(page, expected) { + await page.evaluate(() => { + // Make sure all the pages will be visible. + window.PDFViewerApplication.pdfViewer.scrollMode = 2 /* = ScrollMode.WRAPPED = */; + window.PDFViewerApplication.pdfViewer.updateScale({ + drawingDelay: 0, + scaleFactor: 0.01, + }); + }); + return page.waitForFunction( + ex => { + const buffer = []; + for (const textLayer of document.querySelectorAll(".textLayer")) { + buffer.push(parseInt(textLayer.textContent.trim(), 10)); + } + return ex.length === buffer.length && ex.every((v, i) => v === buffer[i]); + }, + {}, + expected + ); +} + +function getSearchResults(page) { + return page.evaluate(() => { + const pages = document.querySelectorAll(".page"); + const results = []; + for (let i = 0; i < pages.length; i++) { + const domPage = pages[i]; + const highlights = domPage.querySelectorAll("span.highlight"); + if (highlights.length === 0) { + continue; + } + results.push([ + i + 1, + Array.from(highlights).map(span => span.textContent), + ]); + } + return results; + }); +} + +function movePages(page, selectedPages, atIndex) { + return page.evaluate( + (selected, index) => { + const viewer = window.PDFViewerApplication.pdfViewer; + const pagesToMove = Array.from(selected).sort((a, b) => a - b); + viewer.pagesMapper.pagesNumber = + document.querySelectorAll(".page").length; + viewer.pagesMapper.movePages(new Set(pagesToMove), pagesToMove, index); + window.PDFViewerApplication.eventBus.dispatch("pagesedited", { + pagesMapper: viewer.pagesMapper, + index, + pagesToMove, + }); + }, + selectedPages, + atIndex + ); +} + +describe("Reorganize Pages View", () => { + describe("Drag & Drop", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "page_with_number.pdf", + "#viewsManagerToggleButton", + "page-fit", + null, + { enableSplitMerge: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("should show a drag marker when dragging a thumbnail", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + const rect1 = await getRect(page, getThumbnailSelector(1)); + const rect2 = await getRect(page, getThumbnailSelector(2)); + + const handleAddedMarker = await waitForDOMMutation( + page, + mutationList => { + for (const mutation of mutationList) { + if (mutation.type !== "childList") { + continue; + } + for (const node of mutation.addedNodes) { + if (node.classList.contains("dragMarker")) { + return true; + } + } + } + return false; + } + ); + const handleRemovedMarker = await waitForDOMMutation( + page, + mutationList => { + for (const mutation of mutationList) { + if (mutation.type !== "childList") { + continue; + } + for (const node of mutation.removedNodes) { + if (node.classList.contains("dragMarker")) { + return true; + } + } + } + return false; + } + ); + const dndPromise = dragAndDrop( + page, + getThumbnailSelector(1), + [[0, rect2.y - rect1.y + rect2.height / 2]], + 10 + ); + await dndPromise; + await awaitPromise(handleAddedMarker); + await awaitPromise(handleRemovedMarker); + }) + ); + }); + + it("should reorder thumbnails after dropping", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + const rect1 = await getRect(page, getThumbnailSelector(1)); + const rect2 = await getRect(page, getThumbnailSelector(2)); + + const handlePagesEdited = await waitForPagesEdited(page); + await dragAndDrop( + page, + getThumbnailSelector(1), + [[0, rect2.y - rect1.y + rect2.height / 2]], + 10 + ); + const pagesMapping = await awaitPromise(handlePagesEdited); + const expected = [ + 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + ]; + expect(pagesMapping) + .withContext(`In ${browserName}`) + .toEqual(expected); + await waitForHavingContents(page, expected); + }) + ); + }); + + it("should reorder thumbnails after dropping at position 0", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + const rect1 = await getRect(page, getThumbnailSelector(1)); + const rect2 = await getRect(page, getThumbnailSelector(2)); + + const handlePagesEdited = await waitForPagesEdited(page); + await dragAndDrop( + page, + getThumbnailSelector(2), + [[0, rect1.y - rect2.y - rect1.height]], + 10 + ); + const pagesMapping = await awaitPromise(handlePagesEdited); + const expected = [ + 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + ]; + expect(pagesMapping) + .withContext(`In ${browserName}`) + .toEqual(expected); + await waitForHavingContents(page, expected); + }) + ); + }); + + it("should reorder thumbnails after dropping two adjacent pages", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + const rect2 = await getRect(page, getThumbnailSelector(2)); + const rect4 = await getRect(page, getThumbnailSelector(4)); + await page.click(`.thumbnail:has(${getThumbnailSelector(1)}) input`); + + const handlePagesEdited = await waitForPagesEdited(page); + await dragAndDrop( + page, + getThumbnailSelector(2), + [[0, rect4.y - rect2.y]], + 10 + ); + const pagesMapping = await awaitPromise(handlePagesEdited); + const expected = [ + 3, 4, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + ]; + expect(pagesMapping) + .withContext(`In ${browserName}`) + .toEqual(expected); + await waitForHavingContents(page, expected); + }) + ); + }); + + it("should reorder thumbnails after dropping two non-adjacent pages", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + const rect1 = await getRect(page, getThumbnailSelector(1)); + const rect2 = await getRect(page, getThumbnailSelector(2)); + await (await page.$(".thumbnail[page-id='14'")).scrollIntoView(); + await page.waitForSelector(getThumbnailSelector(14), { + visible: true, + }); + await page.click(`.thumbnail:has(${getThumbnailSelector(14)}) input`); + await (await page.$(".thumbnail[page-id='1'")).scrollIntoView(); + await page.waitForSelector(getThumbnailSelector(1), { + visible: true, + }); + + const handlePagesEdited = await waitForPagesEdited(page); + await dragAndDrop( + page, + getThumbnailSelector(1), + [[0, rect2.y - rect1.y + rect2.height / 2]], + 10 + ); + const pagesMapping = await awaitPromise(handlePagesEdited); + const expected = [ + 2, 1, 14, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, + ]; + expect(pagesMapping) + .withContext(`In ${browserName}`) + .toEqual(expected); + await waitForHavingContents(page, expected); + }) + ); + }); + + it("should select the dropped page (bug 2010820)", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + const rect1 = await getRect(page, getThumbnailSelector(1)); + const rect2 = await getRect(page, getThumbnailSelector(2)); + + await page.click(getThumbnailSelector(2)); + await page.waitForSelector( + `${getThumbnailSelector(2)}[aria-current="page"]` + ); + + const handlePagesEdited = await waitForPagesEdited(page); + await dragAndDrop( + page, + getThumbnailSelector(1), + [[0, rect2.y - rect1.y + rect2.height / 2]], + 10 + ); + await awaitPromise(handlePagesEdited); + await page.waitForSelector( + `${getThumbnailSelector(2)}[aria-current="page"]` + ); + await page.waitForSelector( + `${getThumbnailSelector(1)}[aria-current="false"]` + ); + }) + ); + }); + }); + + describe("Search in pdf", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "page_with_number.pdf", + "#viewsManagerToggleButton", + "1", + null, + { enableSplitMerge: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("should check if the search is working after moving pages", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await page.click("#viewFindButton"); + await page.waitForSelector(":has(> #findHighlightAll)", { + visible: true, + }); + await page.click(":has(> #findHighlightAll)"); + + await page.waitForSelector("#findInput", { visible: true }); + await page.type("#findInput", "1"); + await page.keyboard.press("Enter"); + + await page.waitForFunction( + () => document.querySelectorAll("span.highlight").length === 10 + ); + + let results = await getSearchResults(page); + expect(results) + .withContext(`In ${browserName}`) + .toEqual([ + // Page number, [matches] + [1, ["1"]], + [10, ["1"]], + [11, ["1", "1"]], + [12, ["1"]], + [13, ["1"]], + [14, ["1"]], + [15, ["1"]], + [16, ["1"]], + [17, ["1"]], + ]); + + await movePages(page, [11, 2], 3); + await page.waitForFunction( + () => document.querySelectorAll("span.highlight").length === 0 + ); + + await clearInput(page, "#findInput", true); + await page.type("#findInput", "1"); + await page.keyboard.press("Enter"); + + await page.waitForFunction( + () => document.querySelectorAll("span.highlight").length === 10 + ); + + results = await getSearchResults(page); + expect(results) + .withContext(`In ${browserName}`) + .toEqual([ + // Page number, [matches] + [1, ["1"]], + [4, ["1", "1"]], + [11, ["1"]], + [12, ["1"]], + [13, ["1"]], + [14, ["1"]], + [15, ["1"]], + [16, ["1"]], + [17, ["1"]], + ]); + + await movePages(page, [13], 0); + await page.waitForFunction( + () => document.querySelectorAll("span.highlight").length === 0 + ); + + await clearInput(page, "#findInput", true); + await page.type("#findInput", "1"); + await page.keyboard.press("Enter"); + + await page.waitForFunction( + () => document.querySelectorAll("span.highlight").length === 10 + ); + + results = await getSearchResults(page); + expect(results) + .withContext(`In ${browserName}`) + .toEqual([ + // Page number, [matches] + [1, ["1"]], + [2, ["1"]], + [5, ["1", "1"]], + [12, ["1"]], + [13, ["1"]], + [14, ["1"]], + [15, ["1"]], + [16, ["1"]], + [17, ["1"]], + ]); + }) + ); + }); + }); + + describe("Links and outlines", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "page_with_number_and_link.pdf", + "#viewsManagerToggleButton", + "page-fit", + null, + { enableSplitMerge: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("should check that link is updated after moving pages", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + await movePages(page, [2], 10); + await scrollIntoView(page, getAnnotationSelector("107R")); + await page.click(getAnnotationSelector("107R")); + const currentPage = await page.$eval( + "#pageNumber", + el => el.valueAsNumber + ); + expect(currentPage).withContext(`In ${browserName}`).toBe(10); + }) + ); + }); + + it("should check that outlines are updated after moving pages", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + await movePages(page, [2, 4], 10); + + await page.click("#viewsManagerSelectorButton"); + await page.click("#outlinesViewMenu"); + await page.waitForSelector("#outlinesView", { visible: true }); + + await page.click("#outlinesView .treeItem:nth-child(2)"); + + const currentPage = await page.$eval( + "#pageNumber", + el => el.valueAsNumber + ); + // 9 because 2 and 4 were moved after page 10. + expect(currentPage).withContext(`In ${browserName}`).toBe(9); + }) + ); + }); + }); + + describe("Drag marker must have the right non-zero dimensions", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "page_with_number_and_link.pdf", + "#viewsManagerToggleButton", + "1", + null, + { + enableSplitMerge: true, + sidebarViewOnLoad: 2 /* = SidebarView.OUTLINES */, + } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("should check if the drag marker width is non-zero", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await page.waitForSelector("#outlinesView", { visible: true }); + await page.waitForSelector("#viewsManagerSelectorButton", { + visible: true, + }); + await page.click("#viewsManagerSelectorButton"); + await page.waitForSelector("#thumbnailsViewMenu", { visible: true }); + await page.click("#thumbnailsViewMenu"); + + const thumbSelector = "#thumbnailsView .thumbnailImage"; + await page.waitForSelector(thumbSelector, { visible: true }); + const rect1 = await getRect(page, getThumbnailSelector(1)); + const rect2 = await getRect(page, getThumbnailSelector(2)); + + const handleAddedMarker = await waitForDOMMutation( + page, + mutationList => { + for (const mutation of mutationList) { + if (mutation.type !== "childList") { + continue; + } + for (const node of mutation.addedNodes) { + if (node.classList.contains("dragMarker")) { + const rect = node.getBoundingClientRect(); + return rect.width !== 0; + } + } + } + return false; + } + ); + + await dragAndDrop( + page, + getThumbnailSelector(1), + [[0, rect2.y - rect1.y + rect2.height / 2]], + 10 + ); + + await awaitPromise(handleAddedMarker); + }) + ); + }); + }); + + describe("Save a pdf", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "page_with_number.pdf", + "#viewsManagerToggleButton", + "1", + null, + { enableSplitMerge: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("should check that a save is triggered", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + await page.waitForSelector("#viewsManagerStatusActionButton", { + visible: true, + }); + const rect1 = await getRect(page, getThumbnailSelector(1)); + const rect2 = await getRect(page, getThumbnailSelector(2)); + + await dragAndDrop( + page, + getThumbnailSelector(1), + [[0, rect2.y - rect1.y + rect2.height / 2]], + 10 + ); + + const handleSaveAs = await createPromise(page, resolve => { + window.PDFViewerApplication.eventBus.on( + "savepageseditedpdf", + ({ data }) => { + resolve(Array.from(data.pageIndices)); + }, + { + once: true, + } + ); + }); + + await page.click("#viewsManagerStatusActionButton"); + await page.waitForSelector("#viewsManagerStatusActionSaveAs", { + visible: true, + }); + await page.click("#viewsManagerStatusActionSaveAs"); + const pageIndices = await awaitPromise(handleSaveAs); + expect(pageIndices) + .withContext(`In ${browserName}`) + .toEqual([ + 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + ]); + }) + ); + }); + }); +}); diff --git a/test/integration/scripting_spec.mjs b/test/integration/scripting_spec.mjs index 3736216bfe03e..6dcb3aecc849f 100644 --- a/test/integration/scripting_spec.mjs +++ b/test/integration/scripting_spec.mjs @@ -17,7 +17,7 @@ import { awaitPromise, clearInput, closePages, - closeSinglePage, + getAnnotationSelector, getAnnotationStorage, getComputedStyleSelector, getFirstSerialized, @@ -245,7 +245,7 @@ describe("Interaction", () => { await waitForScripting(page); // click on a radio button - await page.click("[data-annotation-id='449R']"); + await page.click(getAnnotationSelector("449R")); // this field has no actions but it must be cleared on reset await page.type(getSelector("405R"), "employee"); @@ -254,7 +254,7 @@ describe("Interaction", () => { expect(checked).toEqual(true); // click on reset button - await page.click("[data-annotation-id='402R']"); + await page.click(getAnnotationSelector("402R")); await Promise.all( ["416R", "422R", "419R", "405R"].map(id => { @@ -403,7 +403,7 @@ describe("Interaction", () => { await page.click(getSelector(id)); } - await page.click("[data-annotation-id='97R']"); + await page.click(getAnnotationSelector("97R")); await page.waitForFunction( `${getQuerySelector("80R")}.value !== ""` ); @@ -427,6 +427,10 @@ describe("Interaction", () => { }); }); + afterEach(async () => { + await closePages(pages); + }); + it("must execute WillPrint and DidPrint actions", async () => { await Promise.all( pages.map(async ([browserName, page]) => { @@ -450,7 +454,6 @@ describe("Interaction", () => { await page.waitForFunction( `${getQuerySelector("50R")}.value === "DidPrint"` ); - await closeSinglePage(page); }) ); }); @@ -580,7 +583,7 @@ describe("Interaction", () => { page, getSelector("25R"), async () => { - await page.click("[data-annotation-id='26R']"); + await page.click(getAnnotationSelector("26R")); } ); expect(text) @@ -628,13 +631,13 @@ describe("Interaction", () => { await waitForScripting(page); // Click on ClearItems button. - await page.click("[data-annotation-id='34R']"); + await page.click(getAnnotationSelector("34R")); await page.waitForFunction( `${getQuerySelector("30R")}.children.length === 0` ); // Click on Restore button. - await page.click("[data-annotation-id='37R']"); + await page.click(getAnnotationSelector("37R")); await page.waitForFunction( `${getQuerySelector("30R")}.children.length !== 0` ); @@ -670,7 +673,7 @@ describe("Interaction", () => { ); // Click on AddItem button. - await page.click("[data-annotation-id='38R']"); + await page.click(getAnnotationSelector("38R")); await page.waitForFunction( `${getQuerySelector("30R")}.children.length === ${len}` @@ -699,7 +702,7 @@ describe("Interaction", () => { let len = 6; // Click on Restore button. await clearInput(page, getSelector("33R")); - await page.click("[data-annotation-id='37R']"); + await page.click(getAnnotationSelector("37R")); await page.waitForFunction( `${getQuerySelector("30R")}.children.length === ${len}` ); @@ -710,7 +713,7 @@ describe("Interaction", () => { await page.type(getSelector("39R"), `${num}`); // Click on DeleteItem button. - await page.click("[data-annotation-id='36R']"); + await page.click(getAnnotationSelector("36R")); await page.waitForFunction( `${getQuerySelector("30R")}.children.length === ${len}` @@ -781,7 +784,7 @@ describe("Interaction", () => { propName ); - await page.click(`[data-annotation-id='${id}R']`); + await page.click(getAnnotationSelector(`${id}R`)); await page.waitForFunction( `${getComputedStyleSelector( ref @@ -891,7 +894,7 @@ describe("Interaction", () => { ); // Click on execute button to eval the above code. - await page.click("[data-annotation-id='57R']"); + await page.click(getAnnotationSelector("57R")); await page.waitForFunction(`${getQuerySelector("56R")}.value !== ""`); const text = await page.$eval(getSelector("56R"), el => el.value); @@ -922,7 +925,7 @@ describe("Interaction", () => { `this.getField("Text2").display = display.${type};` ); - await page.click("[data-annotation-id='57R']"); + await page.click(getAnnotationSelector("57R")); await page.waitForFunction( `${getComputedStyleSelector( "56R" @@ -995,7 +998,7 @@ describe("Interaction", () => { page, getSelector("25R"), async () => { - await page.click("[data-annotation-id='26R']"); + await page.click(getAnnotationSelector("26R")); } ); expect(text).withContext(`In ${browserName}`).toEqual("Standard"); @@ -1032,13 +1035,13 @@ describe("Interaction", () => { await page.focus(getSelector("29R")); await typeAndWaitForSandbox(page, getSelector("29R"), "34"); - await page.click("[data-annotation-id='30R']"); + await page.click(getAnnotationSelector("30R")); await waitForSandboxTrip(page); await page.waitForFunction(`${getQuerySelector("29R")}.value === ""`); await page.focus(getSelector("29R")); await typeAndWaitForSandbox(page, getSelector("29R"), "12345"); - await page.click("[data-annotation-id='30R']"); + await page.click(getAnnotationSelector("30R")); await waitForSandboxTrip(page); await page.waitForFunction( `${getQuerySelector("29R")}.value === "12345"` @@ -1077,13 +1080,13 @@ describe("Interaction", () => { await page.focus(getSelector("30R")); await typeAndWaitForSandbox(page, getSelector("30R"), "-789"); - await page.click("[data-annotation-id='29R']"); + await page.click(getAnnotationSelector("29R")); await waitForSandboxTrip(page); await page.waitForFunction(`${getQuerySelector("30R")}.value === ""`); await page.focus(getSelector("30R")); await typeAndWaitForSandbox(page, getSelector("30R"), "(123) 456-7890"); - await page.click("[data-annotation-id='29R']"); + await page.click(getAnnotationSelector("29R")); await waitForSandboxTrip(page); await page.waitForFunction( `${getQuerySelector("30R")}.value === "(123) 456-7890"` @@ -1122,13 +1125,13 @@ describe("Interaction", () => { await page.focus(getSelector("30R")); await typeAndWaitForSandbox(page, getSelector("30R"), "-456"); - await page.click("[data-annotation-id='29R']"); + await page.click(getAnnotationSelector("29R")); await waitForSandboxTrip(page); await page.waitForFunction(`${getQuerySelector("30R")}.value === ""`); await page.focus(getSelector("30R")); await typeAndWaitForSandbox(page, getSelector("30R"), "123-4567"); - await page.click("[data-annotation-id='29R']"); + await page.click(getAnnotationSelector("29R")); await waitForSandboxTrip(page); await page.waitForFunction( `${getQuerySelector("30R")}.value === "123-4567"` @@ -1216,7 +1219,7 @@ describe("Interaction", () => { // The action triggers a `calculateNow` which in turn triggers a // `resetForm (inducing a `calculateNow`) and a `calculateNow`. // Without infinite loop prevention the field would be empty. - await page.click("[data-annotation-id='31R']"); + await page.click(getAnnotationSelector("31R")); await page.waitForFunction( `${getQuerySelector("28R")}.value === "123"` ); @@ -1317,8 +1320,11 @@ describe("Interaction", () => { pages.map(async ([browserName, page]) => { await waitForScripting(page); + const textWidgetSelector = getAnnotationSelector("35R"); + const pushButtonSelector = getAnnotationSelector("51R"); + let visibility = await page.$eval( - "[data-annotation-id='35R']", + textWidgetSelector, el => getComputedStyle(el).visibility ); expect(visibility) @@ -1326,7 +1332,7 @@ describe("Interaction", () => { .toEqual("visible"); visibility = await page.$eval( - "[data-annotation-id='51R']", + pushButtonSelector, el => getComputedStyle(el).visibility ); expect(visibility) @@ -1335,17 +1341,17 @@ describe("Interaction", () => { await page.click(getSelector("44R")); await page.waitForFunction( - `document.querySelector("[data-annotation-id='35R']").style.visibility === "hidden"` + `document.querySelector('${textWidgetSelector}').style.visibility === "hidden"` ); visibility = await page.$eval( - "[data-annotation-id='35R']", + textWidgetSelector, el => getComputedStyle(el).visibility ); expect(visibility).withContext(`In ${browserName}`).toEqual("hidden"); visibility = await page.$eval( - "[data-annotation-id='51R']", + pushButtonSelector, el => getComputedStyle(el).visibility ); expect(visibility).withContext(`In ${browserName}`).toEqual("hidden"); @@ -1387,7 +1393,7 @@ describe("Interaction", () => { return rotation === (360 + ((360 - (b + a)) % 360)) % 360; }, {}, - `[data-annotation-id='${ref}R']`, + getAnnotationSelector(`${ref}R`), base, angle ); @@ -1592,7 +1598,7 @@ describe("Interaction", () => { for (const exportValue of ["x3", "x2", "x1"]) { await clearInput(page, getSelector("27R")); await page.type(getSelector("27R"), exportValue); - await page.click("[data-annotation-id='28R']"); + await page.click(getAnnotationSelector("28R")); await page.waitForFunction( `${getQuerySelector("24R")}.value === "${exportValue}"` ); @@ -1877,27 +1883,25 @@ describe("Interaction", () => { pages.map(async ([browserName, page]) => { await waitForScripting(page); + const selector = getAnnotationSelector("9R"); const hasVisibleCanvas = await page.$eval( - `[data-annotation-id="9R"] > canvas`, + `${selector} > canvas`, elem => elem && !elem.hasAttribute("hidden") ); expect(hasVisibleCanvas) .withContext(`In ${browserName}`) .toEqual(true); - const hasHiddenInput = await page.$eval( - `[data-annotation-id="9R"] > input`, - elem => elem?.hasAttribute("hidden") + const hasHiddenInput = await page.$eval(`${selector} > input`, elem => + elem?.hasAttribute("hidden") ); expect(hasHiddenInput).withContext(`In ${browserName}`).toEqual(true); await page.click(getSelector("12R")); - await page.waitForSelector( - `[data-annotation-id="9R"] > canvas[hidden]` - ); + await page.waitForSelector(`${selector} > canvas[hidden]`); const hasHiddenCanvas = await page.$eval( - `[data-annotation-id="9R"] > canvas`, + `${selector} > canvas`, elem => elem?.hasAttribute("hidden") ); expect(hasHiddenCanvas) @@ -1905,7 +1909,7 @@ describe("Interaction", () => { .toEqual(true); const hasVisibleInput = await page.$eval( - `[data-annotation-id="9R"] > input`, + `${selector} > input`, elem => elem && !elem.hasAttribute("hidden") ); expect(hasVisibleInput) @@ -2282,7 +2286,7 @@ describe("Interaction", () => { pages.map(async ([browserName, page], i) => { await waitForScripting(page); - const buttonSelector = `[data-annotation-id="25R"`; + const buttonSelector = getAnnotationSelector("25R"); await page.waitForSelector(buttonSelector, { timeout: 0, }); @@ -2406,7 +2410,7 @@ describe("Interaction", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("bug1922766.pdf", "[data-annotation-id='44R']"); + pages = await loadAndWait("bug1922766.pdf", getAnnotationSelector("44R")); }); afterEach(async () => { @@ -2431,14 +2435,14 @@ describe("Interaction", () => { } }; await checkColor([255, 0, 0]); - await page.click("[data-annotation-id='44R']"); + await page.click(getAnnotationSelector("44R")); await checkColor([0, 0, 255]); - await page.click("[data-annotation-id='44R']"); + await page.click(getAnnotationSelector("44R")); await checkColor([255, 0, 0]); - await page.click("[data-annotation-id='43R']"); + await page.click(getAnnotationSelector("43R")); await waitForSandboxTrip(page); - await page.click("[data-annotation-id='44R']"); + await page.click(getAnnotationSelector("44R")); await checkColor([0, 0, 255]); }) ); @@ -2449,7 +2453,7 @@ describe("Interaction", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("bug1934157.pdf", "[data-annotation-id='24R']"); + pages = await loadAndWait("bug1934157.pdf", getAnnotationSelector("24R")); }); afterEach(async () => { @@ -2459,13 +2463,6 @@ describe("Interaction", () => { it("must check that date entered by the user is consistent", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - if (browserName === "firefox") { - // Skip the test for Firefox as it doesn't support timezone - // emulation for WebDriver BiDi yet. - // TODO: Remove this check once bug 1978027 is fixed. - return; - } - await waitForScripting(page); await page.emulateTimezone("Pacific/Honolulu"); @@ -2486,7 +2483,7 @@ describe("Interaction", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("issue19505.pdf", "[data-annotation-id='24R']"); + pages = await loadAndWait("issue19505.pdf", getAnnotationSelector("24R")); }); afterEach(async () => { @@ -2515,7 +2512,7 @@ describe("Interaction", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("dates.pdf", "[data-annotation-id='26R']"); + pages = await loadAndWait("dates.pdf", getAnnotationSelector("26R")); }); afterEach(async () => { @@ -2528,7 +2525,7 @@ describe("Interaction", () => { await waitForScripting(page); await waitForSandboxTrip(page); - const firstInputSelector = "[data-annotation-id='26R'] > input"; + const firstInputSelector = `${getAnnotationSelector("26R")} > input`; await page.waitForSelector(`${firstInputSelector}[type="text"]`); await page.click(firstInputSelector); await waitForSandboxTrip(page); @@ -2537,7 +2534,7 @@ describe("Interaction", () => { el.value = "1975-03-16"; }); - const secondInputSelector = "[data-annotation-id='27R'] > input"; + const secondInputSelector = `${getAnnotationSelector("27R")} > input`; await page.waitForSelector(`${secondInputSelector}[type="text"]`); await page.click(secondInputSelector); await waitForSandboxTrip(page); @@ -2546,7 +2543,7 @@ describe("Interaction", () => { el.value = "01:23:45"; }); - const thirdInputSelector = "[data-annotation-id='28R'] > input"; + const thirdInputSelector = `${getAnnotationSelector("28R")} > input`; await page.waitForSelector(`${thirdInputSelector}[type="text"]`); await page.click(thirdInputSelector); await waitForSandboxTrip(page); @@ -2588,11 +2585,61 @@ describe("Interaction", () => { }); }); + describe("Date HTML element in different timezone", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "dates.pdf", + getAnnotationSelector("26R"), + null, + null, + async page => { + // Make sure that 00:00 UTC is the day before in the local timezone. + await page.emulateTimezone("Pacific/Niue"); + } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the inputs are correct", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForScripting(page); + await waitForSandboxTrip(page); + + const firstInputSelector = `${getAnnotationSelector("26R")} > input`; + await page.waitForSelector(`${firstInputSelector}[type="text"]`); + await page.click(firstInputSelector); + await waitForSandboxTrip(page); + await page.waitForSelector(`${firstInputSelector}[type="date"]`); + await page.$eval(firstInputSelector, el => { + el.value = "2025-10-05"; + }); + const secondInputSelector = `${getAnnotationSelector("27R")} > input`; + await page.waitForSelector(`${secondInputSelector}[type="text"]`); + await page.click(secondInputSelector); + await waitForSandboxTrip(page); + const firstInputValue = await page.$eval( + firstInputSelector, + el => el.value + ); + expect(firstInputValue) + .withContext(`In ${browserName}`) + .toEqual("05-Oct-25"); + }) + ); + }); + }); + describe("Date HTML element with initial values", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("dates_save.pdf", "[data-annotation-id='26R']"); + pages = await loadAndWait("dates_save.pdf", getAnnotationSelector("26R")); }); afterEach(async () => { @@ -2605,7 +2652,7 @@ describe("Interaction", () => { await waitForScripting(page); await waitForSandboxTrip(page); - const firstInputSelector = "[data-annotation-id='26R'] > input"; + const firstInputSelector = `${getAnnotationSelector("26R")} > input`; await page.waitForSelector(`${firstInputSelector}[type="text"]`); await page.click(firstInputSelector); await waitForSandboxTrip(page); @@ -2618,7 +2665,7 @@ describe("Interaction", () => { .withContext(`In ${browserName}`) .toEqual("2025-07-01"); - const secondInputSelector = "[data-annotation-id='27R'] > input"; + const secondInputSelector = `${getAnnotationSelector("27R")} > input`; await page.waitForSelector(`${secondInputSelector}[type="text"]`); await page.click(secondInputSelector); await waitForSandboxTrip(page); @@ -2631,7 +2678,7 @@ describe("Interaction", () => { .withContext(`In ${browserName}`) .toEqual("00:34:56"); - const thirdInputSelector = "[data-annotation-id='28R'] > input"; + const thirdInputSelector = `${getAnnotationSelector("28R")} > input`; await page.waitForSelector(`${thirdInputSelector}[type="text"]`); await page.click(thirdInputSelector); await waitForSandboxTrip(page); diff --git a/test/integration/signature_editor_spec.mjs b/test/integration/signature_editor_spec.mjs index ce94f44dcd750..83f99d33e9b85 100644 --- a/test/integration/signature_editor_spec.mjs +++ b/test/integration/signature_editor_spec.mjs @@ -177,7 +177,7 @@ describe("Signature Editor", () => { const editorSelector = getEditorSelector(0); await page.waitForSelector(editorSelector, { visible: true }); await page.waitForSelector( - `.canvasWrapper > svg use[href="#path_p1_0"]`, + `.canvasWrapper > svg use[href="#path_0"]`, { visible: true } ); @@ -282,7 +282,7 @@ describe("Signature Editor", () => { }); await page.waitForSelector( - ".canvasWrapper > svg use[href='#path_p1_0']" + ".canvasWrapper > svg use[href='#path_0']" ); }) ); @@ -340,7 +340,7 @@ describe("Signature Editor", () => { }); await page.waitForSelector( - ".canvasWrapper > svg use[href='#path_p1_0']" + ".canvasWrapper > svg use[href='#path_0']" ); }) ); @@ -427,7 +427,7 @@ describe("Signature Editor", () => { const editorSelector = getEditorSelector(0); await page.waitForSelector(editorSelector, { visible: true }); await page.waitForSelector( - `.canvasWrapper > svg use[href="#path_p1_0"]`, + `.canvasWrapper > svg use[href="#path_0"]`, { visible: true } ); @@ -527,13 +527,13 @@ describe("Signature Editor", () => { const editorSelector = getEditorSelector(0); await page.waitForSelector(editorSelector, { visible: true }); await page.waitForSelector( - `.canvasWrapper > svg use[href="#path_p1_0"]`, + `.canvasWrapper > svg use[href="#path_0"]`, { visible: true } ); const color = await page.evaluate(() => { const use = document.querySelector( - `.canvasWrapper > svg use[href="#path_p1_0"]` + `.canvasWrapper > svg use[href="#path_0"]` ); return use.parentNode.getAttribute("fill"); }); @@ -583,13 +583,13 @@ describe("Signature Editor", () => { const editorSelector = getEditorSelector(0); await page.waitForSelector(editorSelector, { visible: true }); await page.waitForSelector( - `.canvasWrapper > svg use[href="#path_p1_0"]`, + `.canvasWrapper > svg use[href="#path_0"]`, { visible: true } ); const color = await page.evaluate(() => { const use = document.querySelector( - `.canvasWrapper > svg use[href="#path_p1_0"]` + `.canvasWrapper > svg use[href="#path_0"]` ); return use.parentNode.getAttribute("fill"); }); @@ -672,7 +672,7 @@ describe("Signature Editor", () => { }); const { width, height } = await getRect( page, - ".canvasWrapper > svg use[href='#path_p1_0']" + ".canvasWrapper > svg use[href='#path_0']" ); expect(Math.abs(contentWidth / width - contentHeight / height)) diff --git a/test/integration/stamp_editor_spec.mjs b/test/integration/stamp_editor_spec.mjs index 23c309a29bd4e..20196ee27b804 100644 --- a/test/integration/stamp_editor_spec.mjs +++ b/test/integration/stamp_editor_spec.mjs @@ -1824,4 +1824,71 @@ describe("Stamp Editor", () => { ); }); }); + + describe("Stamp (move between pages)", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "firefox_stamp.pdf", + getAnnotationSelector("24R"), + "50" + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must move a stamp annotation from page 1 to page 2", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForPageRendered(page, 1); + await waitForPageRendered(page, 2); + await waitForAnnotationEditorLayer(page, 1); + await waitForAnnotationEditorLayer(page, 2); + + const modeChangedHandle = await waitForAnnotationModeChanged(page); + + await page.click(getAnnotationSelector("24R"), { count: 2 }); + await awaitPromise(modeChangedHandle); + + const editorSelector = getEditorSelector(0); + await waitForSelectedEditor(page, editorSelector); + + await scrollIntoView( + page, + `.page[data-page-number="2"] .annotationEditorLayer` + ); + + const editorRect = await getRect(page, editorSelector); + const page2Rect = await getRect( + page, + `.page[data-page-number="2"] .annotationEditorLayer` + ); + + const deltaX = + page2Rect.x + + page2Rect.width / 2 - + (editorRect.x + editorRect.width / 2); + const deltaY = + page2Rect.y + + page2Rect.height / 3 - + (editorRect.y + editorRect.height / 2); + + await dragAndDrop(page, editorSelector, [[deltaX, deltaY]], 10); + + await page.waitForFunction( + sel => { + const editorDiv = document.querySelector(sel); + const pageDiv = editorDiv?.closest(".page"); + return pageDiv?.getAttribute("data-page-number") === "2"; + }, + {}, + editorSelector + ); + }) + ); + }); + }); }); diff --git a/test/integration/test_utils.mjs b/test/integration/test_utils.mjs index 55f5f82b3d0c1..f7d0785daf07f 100644 --- a/test/integration/test_utils.mjs +++ b/test/integration/test_utils.mjs @@ -49,7 +49,7 @@ function loadAndWait(filename, selector, zoom, setups, options, viewport) { : options; // Options must be handled in app.js::_parseHashParams. - for (const [key, value] of Object.entries(optionsObject)) { + for (const [key, value] of Object.entries(optionsObject || {})) { app_options += `&${key}=${encodeURIComponent(value)}`; } } @@ -158,6 +158,24 @@ async function waitForSandboxTrip(page) { await awaitPromise(handle); } +async function waitForDOMMutation(page, callback) { + return page.evaluateHandle( + cb => [ + new Promise(resolve => { + const mutationObserver = new MutationObserver(mutationList => { + // eslint-disable-next-line no-eval + if (eval(`(${cb})`)(mutationList)) { + mutationObserver.disconnect(); + resolve(); + } + }); + mutationObserver.observe(document, { childList: true, subtree: true }); + }), + ], + callback.toString() + ); +} + function waitForTimeout(milliseconds) { /** * Wait for the given number of milliseconds. @@ -234,6 +252,10 @@ function getAnnotationSelector(id) { return `[data-annotation-id="${id}"]`; } +function getThumbnailSelector(pageNumber) { + return `.thumbnailImage[data-l10n-args='{"page":${pageNumber}}']`; +} + async function getSpanRectFromText(page, pageNumber, text) { await page.waitForSelector( `.page[data-page-number="${pageNumber}"] > .textLayer .endOfContent` @@ -310,6 +332,12 @@ async function waitForEvent({ } } +async function countStorageEntries(page) { + return page.evaluate( + () => window.PDFViewerApplication.pdfDocument.annotationStorage.size + ); +} + async function waitForStorageEntries(page, nEntries) { return page.waitForFunction( n => window.PDFViewerApplication.pdfDocument.annotationStorage.size === n, @@ -318,6 +346,14 @@ async function waitForStorageEntries(page, nEntries) { ); } +async function countSerialized(page) { + return page.evaluate( + () => + window.PDFViewerApplication.pdfDocument.annotationStorage.serializable.map + ?.size ?? 0 + ); +} + async function waitForSerialized(page, nEntries) { return page.waitForFunction( n => { @@ -887,6 +923,30 @@ async function moveEditor(page, selector, n, pressKey) { } } +async function getNextEditorId(page) { + return page.evaluate(() => + window.PDFViewerApplication.pdfViewer._layerProperties.annotationEditorUIManager.getNextEditorId() + ); +} + +async function highlightSpan( + page, + pageIndex, + text, + xRatio = 0.5, + yRatio = 0.5 +) { + const nextId = await getNextEditorId(page); + const rect = await getSpanRectFromText(page, pageIndex, text); + const x = rect.x + rect.width * xRatio; + const y = rect.y + rect.height * yRatio; + // We add a small delay between press and release to make sure that a + // pointerup event is triggered after selectionchange. + // It works with a value of 1ms, but we use 100ms to be sure. + await page.mouse.click(x, y, { count: 2, delay: 100 }); + await page.waitForSelector(getEditorSelector(nextId)); +} + // Unicode bidi isolation characters, Fluent adds these markers to the text. const FSI = "\u2068"; const PDI = "\u2069"; @@ -900,6 +960,8 @@ export { closeSinglePage, copy, copyToClipboard, + countSerialized, + countStorageEntries, createPromise, dragAndDrop, firstPageOnTop, @@ -911,12 +973,15 @@ export { getEditors, getEditorSelector, getFirstSerialized, + getNextEditorId, getQuerySelector, getRect, getSelector, getSerialized, getSpanRectFromText, + getThumbnailSelector, getXY, + highlightSpan, isCanvasMonochrome, kbBigMoveDown, kbBigMoveLeft, @@ -949,6 +1014,7 @@ export { waitAndClick, waitForAnnotationEditorLayer, waitForAnnotationModeChanged, + waitForDOMMutation, waitForEntryInStorage, waitForEvent, waitForNoElement, diff --git a/test/integration/text_layer_spec.mjs b/test/integration/text_layer_spec.mjs index a9c7fa41e6075..47799fef4bd3f 100644 --- a/test/integration/text_layer_spec.mjs +++ b/test/integration/text_layer_spec.mjs @@ -117,6 +117,7 @@ describe("Text layer", () => { `.page[data-page-number = "1"] .endOfContent` ); }); + afterEach(async () => { await closePages(pages); }); @@ -226,6 +227,7 @@ describe("Text layer", () => { `.page[data-page-number = "1"] .endOfContent` ); }); + afterEach(async () => { await closePages(pages); }); @@ -315,6 +317,7 @@ describe("Text layer", () => { `.page[data-page-number = "1"] .endOfContent` ); }); + afterEach(async () => { await closePages(pages); }); @@ -456,6 +459,7 @@ describe("Text layer", () => { { timeout: 0 } ); }); + afterEach(async () => { await closeSinglePage(page); await browser.close(); diff --git a/test/integration/thumbnail_view_spec.mjs b/test/integration/thumbnail_view_spec.mjs index 9ad648050542c..8232ef20d619c 100644 --- a/test/integration/thumbnail_view_spec.mjs +++ b/test/integration/thumbnail_view_spec.mjs @@ -1,11 +1,23 @@ -import { closePages, loadAndWait } from "./test_utils.mjs"; +import { + awaitPromise, + closePages, + kbFocusNext, + loadAndWait, +} from "./test_utils.mjs"; + +function waitForThumbnailVisible(page, pageNum) { + return page.waitForSelector( + `.thumbnailImage[data-l10n-args='{"page":${pageNum}}']`, + { visible: true } + ); +} describe("PDF Thumbnail View", () => { describe("Works without errors", () => { let pages; beforeEach(async () => { - pages = await loadAndWait("tracemonkey.pdf", "#sidebarToggleButton"); + pages = await loadAndWait("tracemonkey.pdf", "#viewsManagerToggleButton"); }); afterEach(async () => { @@ -15,19 +27,176 @@ describe("PDF Thumbnail View", () => { it("should render thumbnails without errors", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - await page.click("#sidebarToggleButton"); + await page.click("#viewsManagerToggleButton"); - const thumbSelector = "#thumbnailView .thumbnailImage"; + const thumbSelector = "#thumbnailsView .thumbnailImage"; await page.waitForSelector(thumbSelector, { visible: true }); - await page.waitForSelector( - '#thumbnailView .thumbnail[data-loaded="true"]' - ); + await waitForThumbnailVisible(page, 1); const src = await page.$eval(thumbSelector, el => el.src); expect(src) .withContext(`In ${browserName}`) - .toMatch(/^data:image\//); + .toMatch(/^blob:http:/); + }) + ); + }); + }); + + describe("The view is scrolled correctly", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("tracemonkey.pdf", "#viewsManagerToggleButton"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + async function goToPage(page, number) { + const handle = await page.evaluateHandle( + num => [ + new Promise(resolve => { + const container = document.getElementById("viewsManagerContent"); + container.addEventListener("scrollend", resolve, { once: true }); + // eslint-disable-next-line no-undef + PDFViewerApplication.pdfLinkService.goToPage(num); + }), + ], + number + ); + return awaitPromise(handle); + } + + it("should scroll the view", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await page.click("#viewsManagerToggleButton"); + + await waitForThumbnailVisible(page, 1); + + for (const pageNum of [14, 1, 13, 2]) { + await goToPage(page, pageNum); + const thumbSelector = `.thumbnailImage[data-l10n-args='{"page":${pageNum}}']`; + await page.waitForSelector( + `.thumbnail ${thumbSelector}[aria-current="page"]`, + { visible: true } + ); + const src = await page.$eval(thumbSelector, el => el.src); + expect(src) + .withContext(`In ${browserName}`) + .toMatch(/^blob:http:/); + } + }) + ); + }); + }); + + describe("The view is accessible with the keyboard", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("tracemonkey.pdf", "#viewsManagerToggleButton"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + async function isElementFocused(page, selector) { + await page.waitForSelector(selector, { visible: true }); + + return page.$eval(selector, el => el === document.activeElement); + } + + it("should navigate with the keyboard", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await page.click("#viewsManagerToggleButton"); + + await waitForThumbnailVisible(page, 1); + await waitForThumbnailVisible(page, 2); + await waitForThumbnailVisible(page, 3); + + await kbFocusNext(page); + expect(await isElementFocused(page, "#viewsManagerSelectorButton")) + .withContext(`In ${browserName}`) + .toBe(true); + + await kbFocusNext(page); + expect( + await isElementFocused(page, "#viewsManagerStatusActionButton") + ) + .withContext(`In ${browserName}`) + .toBe(true); + + await kbFocusNext(page); + expect( + await isElementFocused( + page, + `#thumbnailsView .thumbnailImage[data-l10n-args='{"page":1}']` + ) + ) + .withContext(`In ${browserName}`) + .toBe(true); + + await page.keyboard.press("ArrowDown"); + expect( + await isElementFocused( + page, + `#thumbnailsView .thumbnailImage[data-l10n-args='{"page":2}']` + ) + ) + .withContext(`In ${browserName}`) + .toBe(true); + + await page.keyboard.press("ArrowUp"); + expect( + await isElementFocused( + page, + `#thumbnailsView .thumbnailImage[data-l10n-args='{"page":1}']` + ) + ) + .withContext(`In ${browserName}`) + .toBe(true); + + await page.keyboard.press("ArrowDown"); + await page.keyboard.press("ArrowDown"); + expect( + await isElementFocused( + page, + `#thumbnailsView .thumbnailImage[data-l10n-args='{"page":3}']` + ) + ) + .withContext(`In ${browserName}`) + .toBe(true); + await page.keyboard.press("Enter"); + const currentPage = await page.$eval( + "#pageNumber", + el => el.valueAsNumber + ); + expect(currentPage).withContext(`In ${browserName}`).toBe(3); + + await page.keyboard.press("End"); + expect( + await isElementFocused( + page, + `#thumbnailsView .thumbnailImage[data-l10n-args='{"page":14}']` + ) + ) + .withContext(`In ${browserName}`) + .toBe(true); + + await page.keyboard.press("Home"); + expect( + await isElementFocused( + page, + `#thumbnailsView .thumbnailImage[data-l10n-args='{"page":1}']` + ) + ) + .withContext(`In ${browserName}`) + .toBe(true); }) ); }); diff --git a/test/integration/viewer_spec.mjs b/test/integration/viewer_spec.mjs index 907a8745bf347..68f5e69c703ff 100644 --- a/test/integration/viewer_spec.mjs +++ b/test/integration/viewer_spec.mjs @@ -17,6 +17,7 @@ import { awaitPromise, closePages, createPromise, + getRect, getSpanRectFromText, loadAndWait, scrollIntoView, @@ -363,12 +364,12 @@ describe("PDF viewer", () => { .toBeLessThan(originalCanvasSize * factor ** 2); expect(canvasSize) - .withContext(`In ${browserName}, <= MAX_CANVAS_PIXELS`) - .toBeLessThanOrEqual(MAX_CANVAS_PIXELS.get(browserName)); + .withContext(`In ${browserName}, <= MAX_CANVAS_PIXELS / 4`) + .toBeLessThanOrEqual(MAX_CANVAS_PIXELS.get(browserName) / 4); expect(canvasSize) - .withContext(`In ${browserName}, > MAX_CANVAS_PIXELS * 0.99`) - .toBeGreaterThan(MAX_CANVAS_PIXELS.get(browserName) * 0.99); + .withContext(`In ${browserName}, > MAX_CANVAS_PIXELS / 4 * 0.95`) + .toBeGreaterThan((MAX_CANVAS_PIXELS.get(browserName) / 4) * 0.95); }) ); }); @@ -565,10 +566,10 @@ describe("PDF viewer", () => { .toBe(2); expect(after[0].width) .withContext(`In ${browserName}`) - .toBe(582 * pixelRatio); + .toBe(Math.floor(291 * pixelRatio)); expect(after[0].height) .withContext(`In ${browserName}`) - .toBe(823 * pixelRatio); + .toBe(Math.floor(411.5 * pixelRatio)); // The dimensions of the detail canvas are capped to 800x600 but // it depends on the visible area which depends itself of the @@ -1259,6 +1260,40 @@ describe("PDF viewer", () => { }); }); + describe("File param with encoded characters (issue 20420)", () => { + let pages; + + beforeEach(async () => { + const baseURL = new URL(global.integrationBaseUrl); + const url = `${baseURL.origin}/build/generic/web/compressed.tracemonkey-pldi-09.pdf?token=%2Ffoo`; + pages = await loadAndWait( + encodeURIComponent(url), + ".textLayer .endOfContent" + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must not double-decode the file param", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const pdfUrl = await page.evaluate( + () => window.PDFViewerApplication.url + ); + + expect(pdfUrl) + .withContext(`In ${browserName}`) + .toContain("token=%2Ffoo"); + expect(pdfUrl) + .withContext(`In ${browserName}`) + .not.toContain("token=/foo"); + }) + ); + }); + }); + describe("Keyboard scrolling on startup (bug 843653)", () => { let pages; @@ -1358,25 +1393,26 @@ describe("PDF viewer", () => { describe("Pinch-zoom", () => { let pages; + beforeEach(async () => { pages = await loadAndWait( "tracemonkey.pdf", `.page[data-page-number = "1"] .endOfContent` ); }); + it("keeps the content under the pinch centre fixed on the screen", async () => { await Promise.all( pages.map(async ([browserName, page]) => { if (browserName === "firefox") { - // Firefox does not support touch events on devices - // with no touch screen. - return; + pending( + "Touch events are not supported on devices without touch screen in Firefox." + ); } if (browserName === "chrome") { - // Skip the test for Chrome as it doesn't support pinch zoom - // emulation for WebDriver BiDi yet. - // TODO: Remove this check once the issue is fixed. - return; + pending( + "Pinch zoom emulation is not supported for WebDriver BiDi in Chrome." + ); } const rect = await getSpanRectFromText(page, 1, "type-stable"); @@ -1414,4 +1450,51 @@ describe("PDF viewer", () => { ); }); }); + + describe("Scroll into view", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "tracemonkey_annotation_on_page_8.pdf", + `.page[data-page-number = "1"] .endOfContent` + ); + }); + + it("Check that the top right corner of the annotation is centered vertically", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const handle = await page.evaluateHandle(() => [ + new Promise(resolve => { + const container = document.getElementById("viewerContainer"); + container.addEventListener("scrollend", resolve, { + once: true, + }); + window.PDFViewerApplication.pdfLinkService.goToXY( + 8, + 43.55, + 198.36, + { + center: "vertical", + } + ); + }), + ]); + await awaitPromise(handle); + const annotationSelector = + ".page[data-page-number='8'] .stampAnnotation"; + await page.waitForSelector(annotationSelector, { visible: true }); + const rect = await getRect(page, annotationSelector); + const containerRect = await getRect(page, "#viewerContainer"); + expect( + Math.abs( + 2 * (Math.ceil(rect.y) - containerRect.y) - containerRect.height + ) + ) + .withContext(`In ${browserName}`) + .toBeLessThanOrEqual(1); + }) + ); + }); + }); }); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 59455a89d8809..0b8d7667d0b1d 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -620,6 +620,7 @@ !autoprint.pdf !bug1811694.pdf !bug1811510.pdf +!issue20324.pdf !bug1815476.pdf !issue16021.pdf !bug1770750.pdf @@ -671,6 +672,7 @@ !issue17730.pdf !bug1883609.pdf !issue19550.pdf +!issue20453.pdf !issue17808.pdf !issue17871_bottom_right.pdf !issue17871_top_right.pdf @@ -731,6 +733,7 @@ !bug1885505.pdf !bug1974436.pdf !firefox_logo.pdf +!firefox_stamp.pdf !issue20062.pdf !issue20102.pdf !issue20065.pdf @@ -742,3 +745,128 @@ !tracemonkey_with_annotations.pdf !tracemonkey_with_editable_annotations.pdf !bug1980958.pdf +!tracemonkey_annotation_on_page_8.pdf +!issue20232.pdf +!bug1989304.pdf +!comments.pdf +!issue20319_1.pdf +!issue20319_2.pdf +!issue20439.pdf +!bug1992868.pdf +!bug1937438_af_from_latex.pdf +!bug1937438_from_word.pdf +!bug1937438_mml_from_latex.pdf +!bug1997343.pdf +!doc_1_3_pages.pdf +!doc_2_3_pages.pdf +!doc_3_3_pages.pdf +!labelled_pages.pdf +!extract_link.pdf +!two_paragraphs.pdf +!paragraph_and_link.pdf +!issue20225.pdf +!issue20513.pdf +!issue20516.pdf +!issue20489.pdf +!bug2004951.pdf +!bitmap-composite-and-xnor-halftone.pdf +!bitmap-composite-and-xnor-refine.pdf +!bitmap-composite-and-xnor-text.pdf +!bitmap-composite-and-xnor.pdf +!bitmap-composite-or-xor-replace-halftone.pdf +!bitmap-composite-or-xor-replace-refine.pdf +!bitmap-composite-or-xor-replace-text.pdf +!bitmap-composite-or-xor-replace.pdf +!bitmap-customat-tpgdon.pdf +!bitmap-customat.pdf +!bitmap-halftone-10bpp-mmr.pdf +!bitmap-halftone-10bpp.pdf +!bitmap-halftone-composite.pdf +!bitmap-halftone-grid.pdf +!bitmap-halftone-refine.pdf +!bitmap-halftone-skip-dummy.pdf +!bitmap-halftone-skip-grid-template1.pdf +!bitmap-halftone-skip-grid-template2.pdf +!bitmap-halftone-skip-grid-template3.pdf +!bitmap-halftone-skip-grid.pdf +!bitmap-halftone-template1.pdf +!bitmap-halftone-template2.pdf +!bitmap-halftone-template3.pdf +!bitmap-halftone.pdf +!bitmap-initially-unknown-size.pdf +!bitmap-mmr.pdf +!bitmap-p32-eof.pdf +!bitmap-randomaccess.pdf +!bitmap-refine-customat-tpgron.pdf +!bitmap-refine-customat.pdf +!bitmap-refine-lossless.pdf +!bitmap-refine-page-subrect.pdf +!bitmap-refine-page.pdf +!bitmap-refine-refine.pdf +!bitmap-refine-template1-tpgron.pdf +!bitmap-refine-template1.pdf +!bitmap-refine-tpgron.pdf +!bitmap-refine.pdf +!bitmap-stripe-initially-unknown-height.pdf +!bitmap-stripe-last-implicit.pdf +!bitmap-stripe-single-no-end-of-stripe.pdf +!bitmap-stripe-single.pdf +!bitmap-stripe.pdf +!bitmap-symbol-big-segmentid.pdf +!bitmap-symbol-context-reuse.pdf +!bitmap-symbol-empty.pdf +!bitmap-symbol-negative-sbdsoffset.pdf +!bitmap-symbol-refine.pdf +!bitmap-symbol-symbolrefine-textrefine.pdf +!bitmap-symbol-symbolrefineone-customat.pdf +!bitmap-symbol-symbolrefineone-template1.pdf +!bitmap-symbol-symbolrefineone.pdf +!bitmap-symbol-symbolrefineseveral.pdf +!bitmap-symbol-symhuff-texthuff.pdf +!bitmap-symbol-symhuff-texthuffB10B13.pdf +!bitmap-symbol-symhuffB5B3-texthuffB7B9B12.pdf +!bitmap-symbol-symhuffcustom-texthuffcustom.pdf +!bitmap-symbol-symhuffrefine-textrefine.pdf +!bitmap-symbol-symhuffrefineone.pdf +!bitmap-symbol-symhuffrefineseveral.pdf +!bitmap-symbol-symhuffuncompressed-texthuff.pdf +!bitmap-symbol-textbottomleft.pdf +!bitmap-symbol-textbottomlefttranspose.pdf +!bitmap-symbol-textbottomright.pdf +!bitmap-symbol-textbottomrighttranspose.pdf +!bitmap-symbol-textcomposite.pdf +!bitmap-symbol-texthuffrefine.pdf +!bitmap-symbol-texthuffrefineB15.pdf +!bitmap-symbol-texthuffrefinecustom.pdf +!bitmap-symbol-texthuffrefinecustomdims.pdf +!bitmap-symbol-texthuffrefinecustompos.pdf +!bitmap-symbol-texthuffrefinecustomposdims.pdf +!bitmap-symbol-texthuffrefinecustomsize.pdf +!bitmap-symbol-textrefine-customat.pdf +!bitmap-symbol-textrefine-negative-delta-width.pdf +!bitmap-symbol-textrefine.pdf +!bitmap-symbol-texttopright.pdf +!bitmap-symbol-texttoprighttranspose.pdf +!bitmap-symbol-texttranspose.pdf +!bitmap-symbol.pdf +!bitmap-template1-customat-tpgdon.pdf +!bitmap-template1-customat.pdf +!bitmap-template1-tpgdon.pdf +!bitmap-template1.pdf +!bitmap-template2-customat-tpgdon.pdf +!bitmap-template2-customat.pdf +!bitmap-template2-tpgdon.pdf +!bitmap-template2.pdf +!bitmap-template3-customat-tpgdon.pdf +!bitmap-template3-customat.pdf +!bitmap-template3-tpgdon.pdf +!bitmap-template3.pdf +!bitmap-tpgdon.pdf +!bitmap-trailing-7fff-stripped-harder-refine.pdf +!bitmap-trailing-7fff-stripped-harder.pdf +!bitmap-trailing-7fff-stripped.pdf +!bitmap.pdf +!bomb_giant.pdf +!bug2009627.pdf +!page_with_number.pdf +!page_with_number_and_link.pdf diff --git a/test/pdfs/JBIG2Globals.pdf.link b/test/pdfs/JBIG2Globals.pdf.link new file mode 100644 index 0000000000000..a4aa000f55bcc --- /dev/null +++ b/test/pdfs/JBIG2Globals.pdf.link @@ -0,0 +1 @@ +https://github.com/pdfminer/pdfminer.six/files/8399364/64.pdf diff --git a/test/pdfs/bitmap-composite-and-xnor-halftone.pdf b/test/pdfs/bitmap-composite-and-xnor-halftone.pdf new file mode 100644 index 0000000000000..2b32494bc2cb3 Binary files /dev/null and b/test/pdfs/bitmap-composite-and-xnor-halftone.pdf differ diff --git a/test/pdfs/bitmap-composite-and-xnor-refine.pdf b/test/pdfs/bitmap-composite-and-xnor-refine.pdf new file mode 100644 index 0000000000000..bcd6f47f21051 Binary files /dev/null and b/test/pdfs/bitmap-composite-and-xnor-refine.pdf differ diff --git a/test/pdfs/bitmap-composite-and-xnor-text.pdf b/test/pdfs/bitmap-composite-and-xnor-text.pdf new file mode 100644 index 0000000000000..584433df275ad Binary files /dev/null and b/test/pdfs/bitmap-composite-and-xnor-text.pdf differ diff --git a/test/pdfs/bitmap-composite-and-xnor.pdf b/test/pdfs/bitmap-composite-and-xnor.pdf new file mode 100644 index 0000000000000..2ff5a471b583e Binary files /dev/null and b/test/pdfs/bitmap-composite-and-xnor.pdf differ diff --git a/test/pdfs/bitmap-composite-or-xor-replace-halftone.pdf b/test/pdfs/bitmap-composite-or-xor-replace-halftone.pdf new file mode 100644 index 0000000000000..7d72fab81b73b Binary files /dev/null and b/test/pdfs/bitmap-composite-or-xor-replace-halftone.pdf differ diff --git a/test/pdfs/bitmap-composite-or-xor-replace-refine.pdf b/test/pdfs/bitmap-composite-or-xor-replace-refine.pdf new file mode 100644 index 0000000000000..e251748a43cfc Binary files /dev/null and b/test/pdfs/bitmap-composite-or-xor-replace-refine.pdf differ diff --git a/test/pdfs/bitmap-composite-or-xor-replace-text.pdf b/test/pdfs/bitmap-composite-or-xor-replace-text.pdf new file mode 100644 index 0000000000000..924bb417b36ff Binary files /dev/null and b/test/pdfs/bitmap-composite-or-xor-replace-text.pdf differ diff --git a/test/pdfs/bitmap-composite-or-xor-replace.pdf b/test/pdfs/bitmap-composite-or-xor-replace.pdf new file mode 100644 index 0000000000000..2bd3f35ff8e8d Binary files /dev/null and b/test/pdfs/bitmap-composite-or-xor-replace.pdf differ diff --git a/test/pdfs/bitmap-customat-tpgdon.pdf b/test/pdfs/bitmap-customat-tpgdon.pdf new file mode 100644 index 0000000000000..b440a5f25d1d4 Binary files /dev/null and b/test/pdfs/bitmap-customat-tpgdon.pdf differ diff --git a/test/pdfs/bitmap-customat.pdf b/test/pdfs/bitmap-customat.pdf new file mode 100644 index 0000000000000..b18bc21793a85 Binary files /dev/null and b/test/pdfs/bitmap-customat.pdf differ diff --git a/test/pdfs/bitmap-halftone-10bpp-mmr.pdf b/test/pdfs/bitmap-halftone-10bpp-mmr.pdf new file mode 100644 index 0000000000000..b81b72fa3d1fa Binary files /dev/null and b/test/pdfs/bitmap-halftone-10bpp-mmr.pdf differ diff --git a/test/pdfs/bitmap-halftone-10bpp.pdf b/test/pdfs/bitmap-halftone-10bpp.pdf new file mode 100644 index 0000000000000..68daf4bb6e761 Binary files /dev/null and b/test/pdfs/bitmap-halftone-10bpp.pdf differ diff --git a/test/pdfs/bitmap-halftone-composite.pdf b/test/pdfs/bitmap-halftone-composite.pdf new file mode 100644 index 0000000000000..0ebb3abdea118 Binary files /dev/null and b/test/pdfs/bitmap-halftone-composite.pdf differ diff --git a/test/pdfs/bitmap-halftone-grid.pdf b/test/pdfs/bitmap-halftone-grid.pdf new file mode 100644 index 0000000000000..39828d3716368 Binary files /dev/null and b/test/pdfs/bitmap-halftone-grid.pdf differ diff --git a/test/pdfs/bitmap-halftone-refine.pdf b/test/pdfs/bitmap-halftone-refine.pdf new file mode 100644 index 0000000000000..50d7115979876 Binary files /dev/null and b/test/pdfs/bitmap-halftone-refine.pdf differ diff --git a/test/pdfs/bitmap-halftone-skip-dummy.pdf b/test/pdfs/bitmap-halftone-skip-dummy.pdf new file mode 100644 index 0000000000000..8c43e9bbf6710 Binary files /dev/null and b/test/pdfs/bitmap-halftone-skip-dummy.pdf differ diff --git a/test/pdfs/bitmap-halftone-skip-grid-template1.pdf b/test/pdfs/bitmap-halftone-skip-grid-template1.pdf new file mode 100644 index 0000000000000..cc1deb750151e Binary files /dev/null and b/test/pdfs/bitmap-halftone-skip-grid-template1.pdf differ diff --git a/test/pdfs/bitmap-halftone-skip-grid-template2.pdf b/test/pdfs/bitmap-halftone-skip-grid-template2.pdf new file mode 100644 index 0000000000000..228b53229c656 Binary files /dev/null and b/test/pdfs/bitmap-halftone-skip-grid-template2.pdf differ diff --git a/test/pdfs/bitmap-halftone-skip-grid-template3.pdf b/test/pdfs/bitmap-halftone-skip-grid-template3.pdf new file mode 100644 index 0000000000000..b58fc9d89c62e Binary files /dev/null and b/test/pdfs/bitmap-halftone-skip-grid-template3.pdf differ diff --git a/test/pdfs/bitmap-halftone-skip-grid.pdf b/test/pdfs/bitmap-halftone-skip-grid.pdf new file mode 100644 index 0000000000000..b556639f5c360 Binary files /dev/null and b/test/pdfs/bitmap-halftone-skip-grid.pdf differ diff --git a/test/pdfs/bitmap-halftone-template1.pdf b/test/pdfs/bitmap-halftone-template1.pdf new file mode 100644 index 0000000000000..6b37b97910385 Binary files /dev/null and b/test/pdfs/bitmap-halftone-template1.pdf differ diff --git a/test/pdfs/bitmap-halftone-template2.pdf b/test/pdfs/bitmap-halftone-template2.pdf new file mode 100644 index 0000000000000..269e7b9013fe4 Binary files /dev/null and b/test/pdfs/bitmap-halftone-template2.pdf differ diff --git a/test/pdfs/bitmap-halftone-template3.pdf b/test/pdfs/bitmap-halftone-template3.pdf new file mode 100644 index 0000000000000..d0d1b7a052813 Binary files /dev/null and b/test/pdfs/bitmap-halftone-template3.pdf differ diff --git a/test/pdfs/bitmap-halftone.pdf b/test/pdfs/bitmap-halftone.pdf new file mode 100644 index 0000000000000..b05df7f1c590d Binary files /dev/null and b/test/pdfs/bitmap-halftone.pdf differ diff --git a/test/pdfs/bitmap-initially-unknown-size.pdf b/test/pdfs/bitmap-initially-unknown-size.pdf new file mode 100644 index 0000000000000..13153bf794dc3 Binary files /dev/null and b/test/pdfs/bitmap-initially-unknown-size.pdf differ diff --git a/test/pdfs/bitmap-mmr.pdf b/test/pdfs/bitmap-mmr.pdf new file mode 100644 index 0000000000000..b7099a499822f Binary files /dev/null and b/test/pdfs/bitmap-mmr.pdf differ diff --git a/test/pdfs/bitmap-p32-eof.pdf b/test/pdfs/bitmap-p32-eof.pdf new file mode 100644 index 0000000000000..a122b406fce56 Binary files /dev/null and b/test/pdfs/bitmap-p32-eof.pdf differ diff --git a/test/pdfs/bitmap-randomaccess.pdf b/test/pdfs/bitmap-randomaccess.pdf new file mode 100644 index 0000000000000..ec76f40a0ae27 Binary files /dev/null and b/test/pdfs/bitmap-randomaccess.pdf differ diff --git a/test/pdfs/bitmap-refine-customat-tpgron.pdf b/test/pdfs/bitmap-refine-customat-tpgron.pdf new file mode 100644 index 0000000000000..2157691e0b1e1 Binary files /dev/null and b/test/pdfs/bitmap-refine-customat-tpgron.pdf differ diff --git a/test/pdfs/bitmap-refine-customat.pdf b/test/pdfs/bitmap-refine-customat.pdf new file mode 100644 index 0000000000000..69f4ae8c0a735 Binary files /dev/null and b/test/pdfs/bitmap-refine-customat.pdf differ diff --git a/test/pdfs/bitmap-refine-lossless.pdf b/test/pdfs/bitmap-refine-lossless.pdf new file mode 100644 index 0000000000000..5f0889021878d Binary files /dev/null and b/test/pdfs/bitmap-refine-lossless.pdf differ diff --git a/test/pdfs/bitmap-refine-page-subrect.pdf b/test/pdfs/bitmap-refine-page-subrect.pdf new file mode 100644 index 0000000000000..e06ef671650ec Binary files /dev/null and b/test/pdfs/bitmap-refine-page-subrect.pdf differ diff --git a/test/pdfs/bitmap-refine-page.pdf b/test/pdfs/bitmap-refine-page.pdf new file mode 100644 index 0000000000000..4b5f892894467 Binary files /dev/null and b/test/pdfs/bitmap-refine-page.pdf differ diff --git a/test/pdfs/bitmap-refine-refine.pdf b/test/pdfs/bitmap-refine-refine.pdf new file mode 100644 index 0000000000000..7447f32405121 Binary files /dev/null and b/test/pdfs/bitmap-refine-refine.pdf differ diff --git a/test/pdfs/bitmap-refine-template1-tpgron.pdf b/test/pdfs/bitmap-refine-template1-tpgron.pdf new file mode 100644 index 0000000000000..d86b014fb9818 Binary files /dev/null and b/test/pdfs/bitmap-refine-template1-tpgron.pdf differ diff --git a/test/pdfs/bitmap-refine-template1.pdf b/test/pdfs/bitmap-refine-template1.pdf new file mode 100644 index 0000000000000..190208ff64413 Binary files /dev/null and b/test/pdfs/bitmap-refine-template1.pdf differ diff --git a/test/pdfs/bitmap-refine-tpgron.pdf b/test/pdfs/bitmap-refine-tpgron.pdf new file mode 100644 index 0000000000000..345775d993c00 Binary files /dev/null and b/test/pdfs/bitmap-refine-tpgron.pdf differ diff --git a/test/pdfs/bitmap-refine.pdf b/test/pdfs/bitmap-refine.pdf new file mode 100644 index 0000000000000..f7a4c677d8a55 Binary files /dev/null and b/test/pdfs/bitmap-refine.pdf differ diff --git a/test/pdfs/bitmap-stripe-initially-unknown-height.pdf b/test/pdfs/bitmap-stripe-initially-unknown-height.pdf new file mode 100644 index 0000000000000..228481823019a Binary files /dev/null and b/test/pdfs/bitmap-stripe-initially-unknown-height.pdf differ diff --git a/test/pdfs/bitmap-stripe-last-implicit.pdf b/test/pdfs/bitmap-stripe-last-implicit.pdf new file mode 100644 index 0000000000000..481cebe0ae466 Binary files /dev/null and b/test/pdfs/bitmap-stripe-last-implicit.pdf differ diff --git a/test/pdfs/bitmap-stripe-single-no-end-of-stripe.pdf b/test/pdfs/bitmap-stripe-single-no-end-of-stripe.pdf new file mode 100644 index 0000000000000..32b1e93591a54 Binary files /dev/null and b/test/pdfs/bitmap-stripe-single-no-end-of-stripe.pdf differ diff --git a/test/pdfs/bitmap-stripe-single.pdf b/test/pdfs/bitmap-stripe-single.pdf new file mode 100644 index 0000000000000..f145dcc2829d6 Binary files /dev/null and b/test/pdfs/bitmap-stripe-single.pdf differ diff --git a/test/pdfs/bitmap-stripe.pdf b/test/pdfs/bitmap-stripe.pdf new file mode 100644 index 0000000000000..0f43af5cfe59a Binary files /dev/null and b/test/pdfs/bitmap-stripe.pdf differ diff --git a/test/pdfs/bitmap-symbol-big-segmentid.pdf b/test/pdfs/bitmap-symbol-big-segmentid.pdf new file mode 100644 index 0000000000000..09c60e4f13484 Binary files /dev/null and b/test/pdfs/bitmap-symbol-big-segmentid.pdf differ diff --git a/test/pdfs/bitmap-symbol-context-reuse.pdf b/test/pdfs/bitmap-symbol-context-reuse.pdf new file mode 100644 index 0000000000000..633c3e9a16888 Binary files /dev/null and b/test/pdfs/bitmap-symbol-context-reuse.pdf differ diff --git a/test/pdfs/bitmap-symbol-empty.pdf b/test/pdfs/bitmap-symbol-empty.pdf new file mode 100644 index 0000000000000..90882046fe50c Binary files /dev/null and b/test/pdfs/bitmap-symbol-empty.pdf differ diff --git a/test/pdfs/bitmap-symbol-negative-sbdsoffset.pdf b/test/pdfs/bitmap-symbol-negative-sbdsoffset.pdf new file mode 100644 index 0000000000000..e5f0434a2d6a1 Binary files /dev/null and b/test/pdfs/bitmap-symbol-negative-sbdsoffset.pdf differ diff --git a/test/pdfs/bitmap-symbol-refine.pdf b/test/pdfs/bitmap-symbol-refine.pdf new file mode 100644 index 0000000000000..63b28e84e0f79 Binary files /dev/null and b/test/pdfs/bitmap-symbol-refine.pdf differ diff --git a/test/pdfs/bitmap-symbol-symbolrefine-textrefine.pdf b/test/pdfs/bitmap-symbol-symbolrefine-textrefine.pdf new file mode 100644 index 0000000000000..957a81caa18b2 Binary files /dev/null and b/test/pdfs/bitmap-symbol-symbolrefine-textrefine.pdf differ diff --git a/test/pdfs/bitmap-symbol-symbolrefineone-customat.pdf b/test/pdfs/bitmap-symbol-symbolrefineone-customat.pdf new file mode 100644 index 0000000000000..4bc38de035a43 Binary files /dev/null and b/test/pdfs/bitmap-symbol-symbolrefineone-customat.pdf differ diff --git a/test/pdfs/bitmap-symbol-symbolrefineone-template1.pdf b/test/pdfs/bitmap-symbol-symbolrefineone-template1.pdf new file mode 100644 index 0000000000000..1faab0ac1c6ba Binary files /dev/null and b/test/pdfs/bitmap-symbol-symbolrefineone-template1.pdf differ diff --git a/test/pdfs/bitmap-symbol-symbolrefineone.pdf b/test/pdfs/bitmap-symbol-symbolrefineone.pdf new file mode 100644 index 0000000000000..37a5c921efa44 Binary files /dev/null and b/test/pdfs/bitmap-symbol-symbolrefineone.pdf differ diff --git a/test/pdfs/bitmap-symbol-symbolrefineseveral.pdf b/test/pdfs/bitmap-symbol-symbolrefineseveral.pdf new file mode 100644 index 0000000000000..f1c0e410c695c Binary files /dev/null and b/test/pdfs/bitmap-symbol-symbolrefineseveral.pdf differ diff --git a/test/pdfs/bitmap-symbol-symhuff-texthuff.pdf b/test/pdfs/bitmap-symbol-symhuff-texthuff.pdf new file mode 100644 index 0000000000000..38c66341b295e Binary files /dev/null and b/test/pdfs/bitmap-symbol-symhuff-texthuff.pdf differ diff --git a/test/pdfs/bitmap-symbol-symhuff-texthuffB10B13.pdf b/test/pdfs/bitmap-symbol-symhuff-texthuffB10B13.pdf new file mode 100644 index 0000000000000..7d882bd3b6fc4 Binary files /dev/null and b/test/pdfs/bitmap-symbol-symhuff-texthuffB10B13.pdf differ diff --git a/test/pdfs/bitmap-symbol-symhuffB5B3-texthuffB7B9B12.pdf b/test/pdfs/bitmap-symbol-symhuffB5B3-texthuffB7B9B12.pdf new file mode 100644 index 0000000000000..8bf428ed84f28 Binary files /dev/null and b/test/pdfs/bitmap-symbol-symhuffB5B3-texthuffB7B9B12.pdf differ diff --git a/test/pdfs/bitmap-symbol-symhuffcustom-texthuffcustom.pdf b/test/pdfs/bitmap-symbol-symhuffcustom-texthuffcustom.pdf new file mode 100644 index 0000000000000..98281019735e4 Binary files /dev/null and b/test/pdfs/bitmap-symbol-symhuffcustom-texthuffcustom.pdf differ diff --git a/test/pdfs/bitmap-symbol-symhuffrefine-textrefine.pdf b/test/pdfs/bitmap-symbol-symhuffrefine-textrefine.pdf new file mode 100644 index 0000000000000..ae0ccab63ea9d Binary files /dev/null and b/test/pdfs/bitmap-symbol-symhuffrefine-textrefine.pdf differ diff --git a/test/pdfs/bitmap-symbol-symhuffrefineone.pdf b/test/pdfs/bitmap-symbol-symhuffrefineone.pdf new file mode 100644 index 0000000000000..92782bc7e092d Binary files /dev/null and b/test/pdfs/bitmap-symbol-symhuffrefineone.pdf differ diff --git a/test/pdfs/bitmap-symbol-symhuffrefineseveral.pdf b/test/pdfs/bitmap-symbol-symhuffrefineseveral.pdf new file mode 100644 index 0000000000000..f1ff9985d375c Binary files /dev/null and b/test/pdfs/bitmap-symbol-symhuffrefineseveral.pdf differ diff --git a/test/pdfs/bitmap-symbol-symhuffuncompressed-texthuff.pdf b/test/pdfs/bitmap-symbol-symhuffuncompressed-texthuff.pdf new file mode 100644 index 0000000000000..4b71bccd8b7aa Binary files /dev/null and b/test/pdfs/bitmap-symbol-symhuffuncompressed-texthuff.pdf differ diff --git a/test/pdfs/bitmap-symbol-textbottomleft.pdf b/test/pdfs/bitmap-symbol-textbottomleft.pdf new file mode 100644 index 0000000000000..b7f62e12550ad Binary files /dev/null and b/test/pdfs/bitmap-symbol-textbottomleft.pdf differ diff --git a/test/pdfs/bitmap-symbol-textbottomlefttranspose.pdf b/test/pdfs/bitmap-symbol-textbottomlefttranspose.pdf new file mode 100644 index 0000000000000..d9136e2860e01 Binary files /dev/null and b/test/pdfs/bitmap-symbol-textbottomlefttranspose.pdf differ diff --git a/test/pdfs/bitmap-symbol-textbottomright.pdf b/test/pdfs/bitmap-symbol-textbottomright.pdf new file mode 100644 index 0000000000000..c8ce5d29a265e Binary files /dev/null and b/test/pdfs/bitmap-symbol-textbottomright.pdf differ diff --git a/test/pdfs/bitmap-symbol-textbottomrighttranspose.pdf b/test/pdfs/bitmap-symbol-textbottomrighttranspose.pdf new file mode 100644 index 0000000000000..db49bd20c2bb4 Binary files /dev/null and b/test/pdfs/bitmap-symbol-textbottomrighttranspose.pdf differ diff --git a/test/pdfs/bitmap-symbol-textcomposite.pdf b/test/pdfs/bitmap-symbol-textcomposite.pdf new file mode 100644 index 0000000000000..49a1b0175a424 Binary files /dev/null and b/test/pdfs/bitmap-symbol-textcomposite.pdf differ diff --git a/test/pdfs/bitmap-symbol-texthuffrefine.pdf b/test/pdfs/bitmap-symbol-texthuffrefine.pdf new file mode 100644 index 0000000000000..4713ed284cc29 Binary files /dev/null and b/test/pdfs/bitmap-symbol-texthuffrefine.pdf differ diff --git a/test/pdfs/bitmap-symbol-texthuffrefineB15.pdf b/test/pdfs/bitmap-symbol-texthuffrefineB15.pdf new file mode 100644 index 0000000000000..4c6c41e533e43 Binary files /dev/null and b/test/pdfs/bitmap-symbol-texthuffrefineB15.pdf differ diff --git a/test/pdfs/bitmap-symbol-texthuffrefinecustom.pdf b/test/pdfs/bitmap-symbol-texthuffrefinecustom.pdf new file mode 100644 index 0000000000000..0f1a8ddddc520 Binary files /dev/null and b/test/pdfs/bitmap-symbol-texthuffrefinecustom.pdf differ diff --git a/test/pdfs/bitmap-symbol-texthuffrefinecustomdims.pdf b/test/pdfs/bitmap-symbol-texthuffrefinecustomdims.pdf new file mode 100644 index 0000000000000..a81b9a85241b4 Binary files /dev/null and b/test/pdfs/bitmap-symbol-texthuffrefinecustomdims.pdf differ diff --git a/test/pdfs/bitmap-symbol-texthuffrefinecustompos.pdf b/test/pdfs/bitmap-symbol-texthuffrefinecustompos.pdf new file mode 100644 index 0000000000000..2f16688831a62 Binary files /dev/null and b/test/pdfs/bitmap-symbol-texthuffrefinecustompos.pdf differ diff --git a/test/pdfs/bitmap-symbol-texthuffrefinecustomposdims.pdf b/test/pdfs/bitmap-symbol-texthuffrefinecustomposdims.pdf new file mode 100644 index 0000000000000..923673c322423 Binary files /dev/null and b/test/pdfs/bitmap-symbol-texthuffrefinecustomposdims.pdf differ diff --git a/test/pdfs/bitmap-symbol-texthuffrefinecustomsize.pdf b/test/pdfs/bitmap-symbol-texthuffrefinecustomsize.pdf new file mode 100644 index 0000000000000..de0429a49f2fa Binary files /dev/null and b/test/pdfs/bitmap-symbol-texthuffrefinecustomsize.pdf differ diff --git a/test/pdfs/bitmap-symbol-textrefine-customat.pdf b/test/pdfs/bitmap-symbol-textrefine-customat.pdf new file mode 100644 index 0000000000000..2530b9c451d7f Binary files /dev/null and b/test/pdfs/bitmap-symbol-textrefine-customat.pdf differ diff --git a/test/pdfs/bitmap-symbol-textrefine-negative-delta-width.pdf b/test/pdfs/bitmap-symbol-textrefine-negative-delta-width.pdf new file mode 100644 index 0000000000000..2cd30467e7cac Binary files /dev/null and b/test/pdfs/bitmap-symbol-textrefine-negative-delta-width.pdf differ diff --git a/test/pdfs/bitmap-symbol-textrefine.pdf b/test/pdfs/bitmap-symbol-textrefine.pdf new file mode 100644 index 0000000000000..be51c22fe2537 Binary files /dev/null and b/test/pdfs/bitmap-symbol-textrefine.pdf differ diff --git a/test/pdfs/bitmap-symbol-texttopright.pdf b/test/pdfs/bitmap-symbol-texttopright.pdf new file mode 100644 index 0000000000000..cddb1bbe5dbac Binary files /dev/null and b/test/pdfs/bitmap-symbol-texttopright.pdf differ diff --git a/test/pdfs/bitmap-symbol-texttoprighttranspose.pdf b/test/pdfs/bitmap-symbol-texttoprighttranspose.pdf new file mode 100644 index 0000000000000..ffa8b1c9888ae Binary files /dev/null and b/test/pdfs/bitmap-symbol-texttoprighttranspose.pdf differ diff --git a/test/pdfs/bitmap-symbol-texttranspose.pdf b/test/pdfs/bitmap-symbol-texttranspose.pdf new file mode 100644 index 0000000000000..d867357fef46c Binary files /dev/null and b/test/pdfs/bitmap-symbol-texttranspose.pdf differ diff --git a/test/pdfs/bitmap-symbol.pdf b/test/pdfs/bitmap-symbol.pdf new file mode 100644 index 0000000000000..9211a1ede5673 Binary files /dev/null and b/test/pdfs/bitmap-symbol.pdf differ diff --git a/test/pdfs/bitmap-template1-customat-tpgdon.pdf b/test/pdfs/bitmap-template1-customat-tpgdon.pdf new file mode 100644 index 0000000000000..a68b151335b41 Binary files /dev/null and b/test/pdfs/bitmap-template1-customat-tpgdon.pdf differ diff --git a/test/pdfs/bitmap-template1-customat.pdf b/test/pdfs/bitmap-template1-customat.pdf new file mode 100644 index 0000000000000..04d4b26f899c2 Binary files /dev/null and b/test/pdfs/bitmap-template1-customat.pdf differ diff --git a/test/pdfs/bitmap-template1-tpgdon.pdf b/test/pdfs/bitmap-template1-tpgdon.pdf new file mode 100644 index 0000000000000..702299f730a0d Binary files /dev/null and b/test/pdfs/bitmap-template1-tpgdon.pdf differ diff --git a/test/pdfs/bitmap-template1.pdf b/test/pdfs/bitmap-template1.pdf new file mode 100644 index 0000000000000..1c49f1a76983e Binary files /dev/null and b/test/pdfs/bitmap-template1.pdf differ diff --git a/test/pdfs/bitmap-template2-customat-tpgdon.pdf b/test/pdfs/bitmap-template2-customat-tpgdon.pdf new file mode 100644 index 0000000000000..1f7871d5743b1 Binary files /dev/null and b/test/pdfs/bitmap-template2-customat-tpgdon.pdf differ diff --git a/test/pdfs/bitmap-template2-customat.pdf b/test/pdfs/bitmap-template2-customat.pdf new file mode 100644 index 0000000000000..2c676097f2cd3 Binary files /dev/null and b/test/pdfs/bitmap-template2-customat.pdf differ diff --git a/test/pdfs/bitmap-template2-tpgdon.pdf b/test/pdfs/bitmap-template2-tpgdon.pdf new file mode 100644 index 0000000000000..81988ddd0648c Binary files /dev/null and b/test/pdfs/bitmap-template2-tpgdon.pdf differ diff --git a/test/pdfs/bitmap-template2.pdf b/test/pdfs/bitmap-template2.pdf new file mode 100644 index 0000000000000..0e5199ef90be7 Binary files /dev/null and b/test/pdfs/bitmap-template2.pdf differ diff --git a/test/pdfs/bitmap-template3-customat-tpgdon.pdf b/test/pdfs/bitmap-template3-customat-tpgdon.pdf new file mode 100644 index 0000000000000..1c985863bd2bf Binary files /dev/null and b/test/pdfs/bitmap-template3-customat-tpgdon.pdf differ diff --git a/test/pdfs/bitmap-template3-customat.pdf b/test/pdfs/bitmap-template3-customat.pdf new file mode 100644 index 0000000000000..9be22c7636980 Binary files /dev/null and b/test/pdfs/bitmap-template3-customat.pdf differ diff --git a/test/pdfs/bitmap-template3-tpgdon.pdf b/test/pdfs/bitmap-template3-tpgdon.pdf new file mode 100644 index 0000000000000..663b79ab7bf2c Binary files /dev/null and b/test/pdfs/bitmap-template3-tpgdon.pdf differ diff --git a/test/pdfs/bitmap-template3.pdf b/test/pdfs/bitmap-template3.pdf new file mode 100644 index 0000000000000..d7388f3f0be59 Binary files /dev/null and b/test/pdfs/bitmap-template3.pdf differ diff --git a/test/pdfs/bitmap-tpgdon.pdf b/test/pdfs/bitmap-tpgdon.pdf new file mode 100644 index 0000000000000..3b14bc5203333 Binary files /dev/null and b/test/pdfs/bitmap-tpgdon.pdf differ diff --git a/test/pdfs/bitmap-trailing-7fff-stripped-harder-refine.pdf b/test/pdfs/bitmap-trailing-7fff-stripped-harder-refine.pdf new file mode 100644 index 0000000000000..df29d912abc46 Binary files /dev/null and b/test/pdfs/bitmap-trailing-7fff-stripped-harder-refine.pdf differ diff --git a/test/pdfs/bitmap-trailing-7fff-stripped-harder.pdf b/test/pdfs/bitmap-trailing-7fff-stripped-harder.pdf new file mode 100644 index 0000000000000..2c74cf923ed24 Binary files /dev/null and b/test/pdfs/bitmap-trailing-7fff-stripped-harder.pdf differ diff --git a/test/pdfs/bitmap-trailing-7fff-stripped.pdf b/test/pdfs/bitmap-trailing-7fff-stripped.pdf new file mode 100644 index 0000000000000..e2a3fae28f259 Binary files /dev/null and b/test/pdfs/bitmap-trailing-7fff-stripped.pdf differ diff --git a/test/pdfs/bomb_giant.pdf b/test/pdfs/bomb_giant.pdf new file mode 100755 index 0000000000000..bbc7a43af92ad Binary files /dev/null and b/test/pdfs/bomb_giant.pdf differ diff --git a/test/pdfs/bug1937438_af_from_latex.pdf b/test/pdfs/bug1937438_af_from_latex.pdf new file mode 100755 index 0000000000000..b9e8973582747 Binary files /dev/null and b/test/pdfs/bug1937438_af_from_latex.pdf differ diff --git a/test/pdfs/bug1937438_from_word.pdf b/test/pdfs/bug1937438_from_word.pdf new file mode 100755 index 0000000000000..8e6c88fc2a025 Binary files /dev/null and b/test/pdfs/bug1937438_from_word.pdf differ diff --git a/test/pdfs/bug1937438_mml_from_latex.pdf b/test/pdfs/bug1937438_mml_from_latex.pdf new file mode 100755 index 0000000000000..2082e4df6b003 Binary files /dev/null and b/test/pdfs/bug1937438_mml_from_latex.pdf differ diff --git a/test/pdfs/bug1989304.pdf b/test/pdfs/bug1989304.pdf new file mode 100755 index 0000000000000..c4aa51f62f643 Binary files /dev/null and b/test/pdfs/bug1989304.pdf differ diff --git a/test/pdfs/bug1992868.pdf b/test/pdfs/bug1992868.pdf new file mode 100755 index 0000000000000..62fd271c4826a Binary files /dev/null and b/test/pdfs/bug1992868.pdf differ diff --git a/test/pdfs/bug1997343.pdf b/test/pdfs/bug1997343.pdf new file mode 100755 index 0000000000000..378d0fc41c516 Binary files /dev/null and b/test/pdfs/bug1997343.pdf differ diff --git a/test/pdfs/bug2004951.pdf b/test/pdfs/bug2004951.pdf new file mode 100755 index 0000000000000..83a9e4fffee7f Binary files /dev/null and b/test/pdfs/bug2004951.pdf differ diff --git a/test/pdfs/bug2009627.pdf b/test/pdfs/bug2009627.pdf new file mode 100755 index 0000000000000..0b8189108f9b0 Binary files /dev/null and b/test/pdfs/bug2009627.pdf differ diff --git a/test/pdfs/comments.pdf b/test/pdfs/comments.pdf new file mode 100644 index 0000000000000..bb0857f025cab Binary files /dev/null and b/test/pdfs/comments.pdf differ diff --git a/test/pdfs/doc_1_3_pages.pdf b/test/pdfs/doc_1_3_pages.pdf new file mode 100755 index 0000000000000..f71ed36ab7403 Binary files /dev/null and b/test/pdfs/doc_1_3_pages.pdf differ diff --git a/test/pdfs/doc_2_3_pages.pdf b/test/pdfs/doc_2_3_pages.pdf new file mode 100755 index 0000000000000..3ccb2f4227c39 Binary files /dev/null and b/test/pdfs/doc_2_3_pages.pdf differ diff --git a/test/pdfs/doc_3_3_pages.pdf b/test/pdfs/doc_3_3_pages.pdf new file mode 100755 index 0000000000000..63222e8991d42 Binary files /dev/null and b/test/pdfs/doc_3_3_pages.pdf differ diff --git a/test/pdfs/extract_link.pdf b/test/pdfs/extract_link.pdf new file mode 100755 index 0000000000000..e9e4be4329610 Binary files /dev/null and b/test/pdfs/extract_link.pdf differ diff --git a/test/pdfs/firefox_stamp.pdf b/test/pdfs/firefox_stamp.pdf new file mode 100644 index 0000000000000..72329237dca63 Binary files /dev/null and b/test/pdfs/firefox_stamp.pdf differ diff --git a/test/pdfs/issue13425.pdf.link b/test/pdfs/issue13425.pdf.link new file mode 100644 index 0000000000000..96cd322c69574 --- /dev/null +++ b/test/pdfs/issue13425.pdf.link @@ -0,0 +1 @@ +https://github.com/mozilla/pdf.js/files/6529459/20200927_204903_509.pdf diff --git a/test/pdfs/issue18062.pdf.link b/test/pdfs/issue18062.pdf.link new file mode 100644 index 0000000000000..7f65a9a0fc35a --- /dev/null +++ b/test/pdfs/issue18062.pdf.link @@ -0,0 +1 @@ +https://github.com/mozilla/pdf.js/files/15274065/1.pdf diff --git a/test/pdfs/issue20225.pdf b/test/pdfs/issue20225.pdf new file mode 100755 index 0000000000000..135c1b4755457 Binary files /dev/null and b/test/pdfs/issue20225.pdf differ diff --git a/test/pdfs/issue20232.pdf b/test/pdfs/issue20232.pdf new file mode 100644 index 0000000000000..b3af724a91d2e Binary files /dev/null and b/test/pdfs/issue20232.pdf differ diff --git a/test/pdfs/issue20302.pdf.link b/test/pdfs/issue20302.pdf.link new file mode 100644 index 0000000000000..e2de78703a0e2 --- /dev/null +++ b/test/pdfs/issue20302.pdf.link @@ -0,0 +1 @@ +https://github.com/user-attachments/files/22526382/JADC2.via.ABMS.PDF diff --git a/test/pdfs/issue20319_1.pdf b/test/pdfs/issue20319_1.pdf new file mode 100644 index 0000000000000..0fe77c69957d9 Binary files /dev/null and b/test/pdfs/issue20319_1.pdf differ diff --git a/test/pdfs/issue20319_2.pdf b/test/pdfs/issue20319_2.pdf new file mode 100644 index 0000000000000..0878fb50b11df Binary files /dev/null and b/test/pdfs/issue20319_2.pdf differ diff --git a/test/pdfs/issue20324.pdf b/test/pdfs/issue20324.pdf new file mode 100644 index 0000000000000..c5f2a1d4ffc8d Binary files /dev/null and b/test/pdfs/issue20324.pdf differ diff --git a/test/pdfs/issue20426.pdf.link b/test/pdfs/issue20426.pdf.link new file mode 100644 index 0000000000000..6db965138c47c --- /dev/null +++ b/test/pdfs/issue20426.pdf.link @@ -0,0 +1 @@ +https://github.com/user-attachments/files/23383534/test.1.pdf diff --git a/test/pdfs/issue20439.pdf b/test/pdfs/issue20439.pdf new file mode 100644 index 0000000000000..5ed98c756706f Binary files /dev/null and b/test/pdfs/issue20439.pdf differ diff --git a/test/pdfs/issue20453.pdf b/test/pdfs/issue20453.pdf new file mode 100644 index 0000000000000..1285d9731d7a7 Binary files /dev/null and b/test/pdfs/issue20453.pdf differ diff --git a/test/pdfs/issue20489.pdf b/test/pdfs/issue20489.pdf new file mode 100644 index 0000000000000..1261d4d0b8723 Binary files /dev/null and b/test/pdfs/issue20489.pdf differ diff --git a/test/pdfs/issue20513.pdf b/test/pdfs/issue20513.pdf new file mode 100644 index 0000000000000..dafedc3e3fe46 Binary files /dev/null and b/test/pdfs/issue20513.pdf differ diff --git a/test/pdfs/issue20516.pdf b/test/pdfs/issue20516.pdf new file mode 100644 index 0000000000000..77695291b93d7 Binary files /dev/null and b/test/pdfs/issue20516.pdf differ diff --git a/test/pdfs/labelled_pages.pdf b/test/pdfs/labelled_pages.pdf new file mode 100755 index 0000000000000..68e389f40c5d4 Binary files /dev/null and b/test/pdfs/labelled_pages.pdf differ diff --git a/test/pdfs/page_with_number.pdf b/test/pdfs/page_with_number.pdf new file mode 100755 index 0000000000000..bea6e535068ae Binary files /dev/null and b/test/pdfs/page_with_number.pdf differ diff --git a/test/pdfs/page_with_number_and_link.pdf b/test/pdfs/page_with_number_and_link.pdf new file mode 100755 index 0000000000000..b229650aa9559 Binary files /dev/null and b/test/pdfs/page_with_number_and_link.pdf differ diff --git a/test/pdfs/paragraph_and_link.pdf b/test/pdfs/paragraph_and_link.pdf new file mode 100755 index 0000000000000..610abe5b8a1d1 Binary files /dev/null and b/test/pdfs/paragraph_and_link.pdf differ diff --git a/test/pdfs/tracemonkey_annotation_on_page_8.pdf b/test/pdfs/tracemonkey_annotation_on_page_8.pdf new file mode 100755 index 0000000000000..3684386a52770 Binary files /dev/null and b/test/pdfs/tracemonkey_annotation_on_page_8.pdf differ diff --git a/test/pdfs/two_paragraphs.pdf b/test/pdfs/two_paragraphs.pdf new file mode 100755 index 0000000000000..5bfc685a8f98c Binary files /dev/null and b/test/pdfs/two_paragraphs.pdf differ diff --git a/test/pdfs/xfa_bug1998843.pdf.link b/test/pdfs/xfa_bug1998843.pdf.link new file mode 100644 index 0000000000000..a11e526866e36 --- /dev/null +++ b/test/pdfs/xfa_bug1998843.pdf.link @@ -0,0 +1 @@ +https://bugzilla.mozilla.org/attachment.cgi?id=9525217 diff --git a/test/resources/reftest-analyzer.html b/test/resources/reftest-analyzer.html index 00f9eaa0d4ec3..2dcc774214919 100644 --- a/test/resources/reftest-analyzer.html +++ b/test/resources/reftest-analyzer.html @@ -1,4 +1,4 @@ - + - - Reftest analyzer - - - - - -

-

Reftest analyzer

-

- Paste your log into this textarea:
-
- -

-

-
...or load it from a file:
- -

-
-
Loading log...
-
-
-
- - - - - - - - - - - - - - - - - -
Pixel at:
Test:
Reference:
-
-
? -
-

Move the mouse over the reftest image on the right to show - magnified pixels on the left. The color information above is for - the pixel centered in the magnified view.

-

The test is shown in the upper triangle of each pixel and - the reference is shown in the lower triangle.

+ + Reftest analyzer + + + + + +
+

Reftest analyzer

+

+ Paste your log into this textarea:
+
+ +

+

+
...or load it from a file:
+ +

+
+
Loading log...
+
+
+
+ + + + + + + + + + + + + + + + + +
Pixel at:
Test:
Reference:
+
+
+ ? +
+

+ Move the mouse over the reftest image on the right to show magnified pixels on the left. The color information above is for the pixel centered + in the magnified view. +

+

The test is shown in the upper triangle of each pixel and the reference is shown in the lower triangle.

+
+
+ + + +
-
- - - +
+
-
-
-
-
-
-
- - - - Shortcuts: n=next p=previous t=toggle d=differences -
-
- - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - + + + + - - + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
+
-
- + diff --git a/test/test.mjs b/test/test.mjs index c6e432e1f6aba..ee9cf73408a4f 100644 --- a/test/test.mjs +++ b/test/test.mjs @@ -672,6 +672,7 @@ function checkRefTestResults(browser, id, results) { case "partial": case "text": case "highlight": + case "extract": checkEq(task, results, browser, session.masterMode); break; case "fbf": @@ -731,6 +732,7 @@ function refTestPostHandler(parsedUrl, req, res) { var snapshot = data.snapshot; var baselineSnapshot = data.baselineSnapshot; var lastPageNum = data.lastPageNum; + var numberOfTasks = data.numberOfTasks; session = getSession(browser); monitorBrowserTimeout(session, handleSessionTimeout); @@ -773,7 +775,10 @@ function refTestPostHandler(parsedUrl, req, res) { }); } - var isDone = taskResults.at(-1)?.[lastPageNum - 1]; + const lastTaskResults = taskResults.at(-1); + const isDone = + lastTaskResults?.[lastPageNum - 1] || + lastTaskResults?.filter(result => !!result).length === numberOfTasks; if (isDone) { checkRefTestResults(browser, id, taskResults); session.remaining--; diff --git a/test/test_manifest.json b/test/test_manifest.json index b83b54648956a..a87b74e0274e9 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -541,8 +541,7 @@ "maxX": 0.5, "minY": 0.25, "maxY": 0.5 - }, - "knownPartialMismatch": true + } }, { "id": "bug1753983", @@ -673,8 +672,7 @@ "maxX": 0.5, "minY": 0.25, "maxY": 0.5 - }, - "knownPartialMismatch": true + } }, { "id": "bug1473809", @@ -780,8 +778,7 @@ "maxX": 0.5, "minY": 0.25, "maxY": 0.5 - }, - "knownPartialMismatch": "Gives slightly different results in Firefox when running in headless mode" + } }, { "id": "issue2128", @@ -1556,8 +1553,7 @@ "maxX": 0.5, "minY": 0.25, "maxY": 0.5 - }, - "knownPartialMismatch": "Gives slightly different results in Firefox when running in headless mode" + } }, { "id": "bug1811668", @@ -1952,6 +1948,14 @@ "type": "eq", "forms": true }, + { + "id": "issue20426", + "file": "pdfs/issue20426.pdf", + "md5": "b9a753df595f1dd30505a67c96373dd8", + "link": true, + "rounds": 1, + "type": "eq" + }, { "id": "issue13845", "file": "pdfs/issue13845.pdf", @@ -2813,6 +2817,13 @@ "rounds": 1, "type": "eq" }, + { + "id": "issue20439", + "file": "pdfs/issue20439.pdf", + "md5": "3c7e888b26ff00943ec1610d93235efc", + "rounds": 1, + "type": "eq" + }, { "id": "issue15942", "file": "pdfs/issue15942.pdf", @@ -2904,8 +2915,7 @@ "maxX": 0.5, "minY": 0.25, "maxY": 0.5 - }, - "knownPartialMismatch": true + } }, { "id": "bug1245391-text", @@ -3250,8 +3260,7 @@ "maxX": 0.5, "minY": 0.25, "maxY": 0.5 - }, - "knownPartialMismatch": true + } }, { "id": "bug1337429", @@ -4547,6 +4556,13 @@ "rounds": 1, "type": "eq" }, + { + "id": "issue20453", + "file": "pdfs/issue20453.pdf", + "md5": "20b5f2a2ea2933328edf023ef48a0759", + "rounds": 1, + "type": "eq" + }, { "id": "issue19611", "file": "pdfs/issue19611.pdf", @@ -8080,8 +8096,7 @@ "maxX": 0.5, "minY": 0.25, "maxY": 0.5 - }, - "knownPartialMismatch": "Half pixel rendering at the edge of the image" + } }, { "id": "issue16454", @@ -11270,8 +11285,7 @@ "maxX": 0.5, "minY": 0.25, "maxY": 0.5 - }, - "knownPartialMismatch": "One-bit difference in two pixels at the edge" + } }, { "id": "issue14724", @@ -13028,5 +13042,892 @@ "md5": "ae4f643ee9bb0fd725277a9d1e0fb1df", "rounds": 1, "type": "load" + }, + { + "id": "issue20232", + "file": "pdfs/issue20232.pdf", + "md5": "cc53e96a8fd9eafbfbb74de564f37047", + "rounds": 1, + "type": "eq" + }, + { + "id": "issue20302-save-print", + "file": "pdfs/issue20302.pdf", + "md5": "d8db2fa1889fd14effcfa5b597b6fe7b", + "rounds": 1, + "lastPage": 1, + "type": "eq", + "link": true, + "save": true, + "print": true, + "annotationStorage": { + "pdfjs_internal_editor_0": { + "annotationType": 3, + "color": [0, 0, 0], + "fontSize": 10, + "value": "Hello World", + "pageIndex": 0, + "rect": [115, 325, 171, 342], + "rotation": 0 + } + } + }, + { + "id": "tracemonkey-extract_0_2_12", + "file": "pdfs/tracemonkey.pdf", + "md5": "9a192d8b1a7dc652a19835f6f08098bd", + "rounds": 1, + "type": "extract", + "includePages": [0, 2, 12], + "pageMapping": { "1": 1, "3": 2, "13": 3 } + }, + { + "id": "bug900822-encrypted-extract_0", + "file": "pdfs/bug900822.pdf", + "md5": "70e2a3c5922574eeda169c955cf9d084", + "rounds": 1, + "type": "extract", + "includePages": [0], + "pageMapping": { "1": 1 } + }, + { + "id": "xfa_bug1998843", + "file": "pdfs/xfa_bug1998843.pdf", + "md5": "b7b25e5b05b2b903d0a6727c9f962a91", + "link": true, + "rounds": 1, + "enableXfa": true, + "lastPage": 1, + "type": "eq" + }, + { + "id": "issue20513", + "file": "pdfs/issue20513.pdf", + "md5": "19a3a347773518242fa3cf1c04a9a1e4", + "rounds": 1, + "type": "eq" + }, + { + "id": "issue20489", + "file": "pdfs/issue20489.pdf", + "md5": "b85c798b9a4cc2cd4337d335321cc612", + "rounds": 1, + "type": "eq" + }, + { + "id": "issue13425", + "file": "pdfs/issue13425.pdf", + "md5": "36854e6ad43b8e0446d3d64e8f2950bf", + "rounds": 1, + "link": true, + "type": "eq" + }, + { + "id": "issue18062", + "file": "pdfs/issue18062.pdf", + "md5": "b8fb6d5622f0a2f45be8e26da7de969c", + "rounds": 1, + "link": true, + "type": "eq" + }, + { + "id": "JBIG2Globals", + "file": "pdfs/JBIG2Globals.pdf", + "md5": "78ee015a604678a4efbdcd993e0d77aa", + "rounds": 1, + "link": true, + "type": "eq" + }, + { + "id": "JBIG2Globals_nowasm", + "file": "pdfs/JBIG2Globals.pdf", + "md5": "78ee015a604678a4efbdcd993e0d77aa", + "rounds": 1, + "link": true, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_composite_and_xnor_halftone", + "file": "pdfs/bitmap-composite-and-xnor-halftone.pdf", + "md5": "a77d3da5d6c91d6cc655471c038da2f0", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_composite_and_xnor_refine", + "file": "pdfs/bitmap-composite-and-xnor-refine.pdf", + "md5": "e0c09e61d4a7724f2e1308f187a4c414", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_composite_and_xnor_text", + "file": "pdfs/bitmap-composite-and-xnor-text.pdf", + "md5": "a6d69e1860c25b0b4e9c424668005e4e", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_composite_and_xnor", + "file": "pdfs/bitmap-composite-and-xnor.pdf", + "md5": "12c6ada861fd8e421b7d0d6348574341", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_composite_or_xor_replace_halftone", + "file": "pdfs/bitmap-composite-or-xor-replace-halftone.pdf", + "md5": "8adf5710547917a2d3986e3e610651c8", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_composite_or_xor_replace_refine", + "file": "pdfs/bitmap-composite-or-xor-replace-refine.pdf", + "md5": "03f601e7fe85e0bfcca7089efa40b831", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_composite_or_xor_replace_text", + "file": "pdfs/bitmap-composite-or-xor-replace-text.pdf", + "md5": "b3e37786c4cfc98923829454f0ec7f21", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_composite_or_xor_replace", + "file": "pdfs/bitmap-composite-or-xor-replace.pdf", + "md5": "24677d71c5df2d27da552e65805553e2", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_customat_tpgdon", + "file": "pdfs/bitmap-customat-tpgdon.pdf", + "md5": "da567101b5f54e439d110997fef344de", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_customat", + "file": "pdfs/bitmap-customat.pdf", + "md5": "f4f1a5dfd6cd95a237e05b72f19762fe", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_10bpp_mmr", + "file": "pdfs/bitmap-halftone-10bpp-mmr.pdf", + "md5": "1cad7f6f560df2a0111d3593fbc51ebd", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_10bpp", + "file": "pdfs/bitmap-halftone-10bpp.pdf", + "md5": "4a7857edfb67c241947e4780e65b74b2", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_composite", + "file": "pdfs/bitmap-halftone-composite.pdf", + "md5": "a46ef5da5687b8a2800ca3555af7d66a", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_grid", + "file": "pdfs/bitmap-halftone-grid.pdf", + "md5": "0efdf0b9d397c52cc4bb68fb51d7f16a", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_refine", + "file": "pdfs/bitmap-halftone-refine.pdf", + "md5": "5cea98829b0d42eb4948e61a1de0b6bc", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_skip_dummy", + "file": "pdfs/bitmap-halftone-skip-dummy.pdf", + "md5": "46359ae6a5863ad20ba5b4cea3f398d2", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_skip_grid_template1", + "file": "pdfs/bitmap-halftone-skip-grid-template1.pdf", + "md5": "d21fb5040dca82e703ffb9904cdd25e3", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_skip_grid_template2", + "file": "pdfs/bitmap-halftone-skip-grid-template2.pdf", + "md5": "ed0e16b55692114dc7fb31aeb16b87c8", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_skip_grid_template3", + "file": "pdfs/bitmap-halftone-skip-grid-template3.pdf", + "md5": "93f9dc98185ea945e9b59f9a151168ff", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_skip_grid", + "file": "pdfs/bitmap-halftone-skip-grid.pdf", + "md5": "e0452decae31de349addd4e7049885e1", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_template1", + "file": "pdfs/bitmap-halftone-template1.pdf", + "md5": "63054038653d317330145eb13cfad258", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_template2", + "file": "pdfs/bitmap-halftone-template2.pdf", + "md5": "0fcb87492a7f214a119688b8032a1023", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone_template3", + "file": "pdfs/bitmap-halftone-template3.pdf", + "md5": "158d8d260d9307cd68f8bafcf75eaa88", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_halftone", + "file": "pdfs/bitmap-halftone.pdf", + "md5": "4791f79b95cc89ff85ccb3bfddba8c96", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_initially_unknown_size", + "file": "pdfs/bitmap-initially-unknown-size.pdf", + "md5": "2841f0d2d16ec8357c7b1908dbbaf351", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_mmr", + "file": "pdfs/bitmap-mmr.pdf", + "md5": "1a7c5fd82f677a1dc59cdffed59137e6", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_p32_eof", + "file": "pdfs/bitmap-p32-eof.pdf", + "md5": "7088483fbe20e574d9b27237df59858b", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_randomaccess", + "file": "pdfs/bitmap-randomaccess.pdf", + "md5": "11a3e831c4a5bc86e3bbdbf8fbd4d68e", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_refine_customat_tpgron", + "file": "pdfs/bitmap-refine-customat-tpgron.pdf", + "md5": "0a996e86abf30eb4164dba726a57ec1d", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_refine_customat", + "file": "pdfs/bitmap-refine-customat.pdf", + "md5": "04f33f12b957c270d1d3d75cf13986b3", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_refine_lossless", + "file": "pdfs/bitmap-refine-lossless.pdf", + "md5": "2d9b2e9254cbf4faf0c4213e5765c269", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_refine_page_subrect", + "file": "pdfs/bitmap-refine-page-subrect.pdf", + "md5": "2d377f293fc8294737d38cc6f93223e2", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_refine_page", + "file": "pdfs/bitmap-refine-page.pdf", + "md5": "567edcc44c4b7a97cd6934d126937db0", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_refine_refine", + "file": "pdfs/bitmap-refine-refine.pdf", + "md5": "ea6ce30d00d2f8830f631a7148a341e7", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_refine_template1_tpgron", + "file": "pdfs/bitmap-refine-template1-tpgron.pdf", + "md5": "79fde0d9f427bc97df2aabb85fee7ffc", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_refine_template1", + "file": "pdfs/bitmap-refine-template1.pdf", + "md5": "28d6b6ed08bc11a4e04d0f08cffff475", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_refine_tpgron", + "file": "pdfs/bitmap-refine-tpgron.pdf", + "md5": "f2a6d11f7bd2661fda927403fae49e4f", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_refine", + "file": "pdfs/bitmap-refine.pdf", + "md5": "ea12446bec650af20aa323b12a65e1a0", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_stripe_initially_unknown_height", + "file": "pdfs/bitmap-stripe-initially-unknown-height.pdf", + "md5": "994f24e1a2342021d96dd4983431360d", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_stripe_last_implicit", + "file": "pdfs/bitmap-stripe-last-implicit.pdf", + "md5": "43837c2415655455ca65d4b53e213dd8", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_stripe_single_no_end_of_stripe", + "file": "pdfs/bitmap-stripe-single-no-end-of-stripe.pdf", + "md5": "d80a71a28272583170e0a7f914ea9069", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_stripe_single", + "file": "pdfs/bitmap-stripe-single.pdf", + "md5": "2237ef0a6eaae86581eb5ebe9430af32", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_stripe", + "file": "pdfs/bitmap-stripe.pdf", + "md5": "0ffde3ed882e92cdbc4b9aa18db24b08", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_big_segmentid", + "file": "pdfs/bitmap-symbol-big-segmentid.pdf", + "md5": "c8bf7ee5a479c1ee1adf9b1032257b37", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_context_reuse", + "file": "pdfs/bitmap-symbol-context-reuse.pdf", + "md5": "3d79e2d087515c2fdbed6fec0ad86e91", + "rounds": 1, + "type": "skip-because-failing", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_empty", + "file": "pdfs/bitmap-symbol-empty.pdf", + "md5": "16ff6f22b1d59a7f7bc0ad31ddabfc25", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_manyrefs", + "file": "pdfs/issue20439.pdf", + "md5": "3c7e888b26ff00943ec1610d93235efc", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_negative_sbdsoffset", + "file": "pdfs/bitmap-symbol-negative-sbdsoffset.pdf", + "md5": "5169c0dd1f26e79237a65c028d4b580e", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_refine", + "file": "pdfs/bitmap-symbol-refine.pdf", + "md5": "3322963ec3c2b3652c90af5aac3b58f8", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symbolrefine_textrefine", + "file": "pdfs/bitmap-symbol-symbolrefine-textrefine.pdf", + "md5": "bda5cf6a3dc876de5ac2bc076371b2a7", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symbolrefineone_customat", + "file": "pdfs/bitmap-symbol-symbolrefineone-customat.pdf", + "md5": "d67f45685e34f20c7fa07e150097f3a0", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symbolrefineone_template1", + "file": "pdfs/bitmap-symbol-symbolrefineone-template1.pdf", + "md5": "15a39ecea87de8ed1c78c0930aab4bef", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symbolrefineone", + "file": "pdfs/bitmap-symbol-symbolrefineone.pdf", + "md5": "3746d882563237e2393c71dc7f2e8166", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symbolrefineseveral", + "file": "pdfs/bitmap-symbol-symbolrefineseveral.pdf", + "md5": "ca9e4e311153891efeb96fe3feb99d04", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symhuff_texthuff", + "file": "pdfs/bitmap-symbol-symhuff-texthuff.pdf", + "md5": "ee1856f1df3cf10714580399bb46a625", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symhuff_texthuffB10B13", + "file": "pdfs/bitmap-symbol-symhuff-texthuffB10B13.pdf", + "md5": "4350b99f5ead4b659643dffbe272643b", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symhuffB5B3_texthuffB7B9B12", + "file": "pdfs/bitmap-symbol-symhuffB5B3-texthuffB7B9B12.pdf", + "md5": "ddaba35e1fc50fe5efb4856b56ddd9ac", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symhuffcustom_texthuffcustom", + "file": "pdfs/bitmap-symbol-symhuffcustom-texthuffcustom.pdf", + "md5": "f263eb271c15cf6e45ca3a5d349b85ab", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symhuffrefine_textrefine", + "file": "pdfs/bitmap-symbol-symhuffrefine-textrefine.pdf", + "md5": "b08310fef3bc6fb135ae2476222aa7ac", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symhuffrefineone", + "file": "pdfs/bitmap-symbol-symhuffrefineone.pdf", + "md5": "4ec0a1801baeaaacf92789b80a09bbfd", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symhuffrefineseveral", + "file": "pdfs/bitmap-symbol-symhuffrefineseveral.pdf", + "md5": "d799afc007ca54c13119a86e71e12023", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_symhuffuncompressed_texthuff", + "file": "pdfs/bitmap-symbol-symhuffuncompressed-texthuff.pdf", + "md5": "e552a77516645faeb4adda60340337ac", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_textbottomleft", + "file": "pdfs/bitmap-symbol-textbottomleft.pdf", + "md5": "3b8f453aa05baffec624291d4e17f97a", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_textbottomlefttranspose", + "file": "pdfs/bitmap-symbol-textbottomlefttranspose.pdf", + "md5": "214e98a76d189932bb912b9031d68446", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_textbottomright", + "file": "pdfs/bitmap-symbol-textbottomright.pdf", + "md5": "e8354ea479cc578aaf62f5105dffb848", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_textbottomrighttranspose", + "file": "pdfs/bitmap-symbol-textbottomrighttranspose.pdf", + "md5": "bbd7f1822bb4da7b4fc9d52ac390a062", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_textcomposite", + "file": "pdfs/bitmap-symbol-textcomposite.pdf", + "md5": "6cb309575ed177c00a12a45f04a7d086", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_texthuffrefine", + "file": "pdfs/bitmap-symbol-texthuffrefine.pdf", + "md5": "3302283333e831b36e08fbb15a0842fa", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_texthuffrefineB15", + "file": "pdfs/bitmap-symbol-texthuffrefineB15.pdf", + "md5": "b6d491848685401795404b630561d4db", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_texthuffrefinecustom", + "file": "pdfs/bitmap-symbol-texthuffrefinecustom.pdf", + "md5": "a9b54b635b9267ae2327ea7803d2abbc", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_texthuffrefinecustomdims", + "file": "pdfs/bitmap-symbol-texthuffrefinecustomdims.pdf", + "md5": "f0cb756069702611ee77e1c695d5b18a", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_texthuffrefinecustompos", + "file": "pdfs/bitmap-symbol-texthuffrefinecustompos.pdf", + "md5": "ad22f4d6703fd83ededf5d356bcc673b", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_texthuffrefinecustomposdims", + "file": "pdfs/bitmap-symbol-texthuffrefinecustomposdims.pdf", + "md5": "ca4a404744f6efed9b5016d94d14b0bb", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_texthuffrefinecustomsize", + "file": "pdfs/bitmap-symbol-texthuffrefinecustomsize.pdf", + "md5": "e5568f865bf1f294d67dc7f199871f29", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_textrefine_customat", + "file": "pdfs/bitmap-symbol-textrefine-customat.pdf", + "md5": "1d3aff50c775034420e02cdbfcca0d7c", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_textrefine_negative_delta_width", + "file": "pdfs/bitmap-symbol-textrefine-negative-delta-width.pdf", + "md5": "b5f5825e6fa8bdada571c58df860a727", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_textrefine", + "file": "pdfs/bitmap-symbol-textrefine.pdf", + "md5": "4a242bf4b85f515d19b53fd3ebb65c8f", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_texttopright", + "file": "pdfs/bitmap-symbol-texttopright.pdf", + "md5": "a69cba023f5abf3c2a6e5626ba56ab44", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_texttoprighttranspose", + "file": "pdfs/bitmap-symbol-texttoprighttranspose.pdf", + "md5": "e0b1fc022bf507a1ccd53d475f1886f4", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol_texttranspose", + "file": "pdfs/bitmap-symbol-texttranspose.pdf", + "md5": "a23a2c40403d539d4262481bc8e1cd90", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_symbol", + "file": "pdfs/bitmap-symbol.pdf", + "md5": "0cc955e37519f779444c84a4a4bc6f0b", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_template1_customat_tpgdon", + "file": "pdfs/bitmap-template1-customat-tpgdon.pdf", + "md5": "256d406fd2fab60747d900619245e35c", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_template1_customat", + "file": "pdfs/bitmap-template1-customat.pdf", + "md5": "8a2ac48d97b5042192d2b4a2106f918d", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_template1_tpgdon", + "file": "pdfs/bitmap-template1-tpgdon.pdf", + "md5": "4014fcdc5c263f6174bdd08ce564068a", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_template1", + "file": "pdfs/bitmap-template1.pdf", + "md5": "a63bcf2f545950139d3753b1bc0e02de", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_template2_customat_tpgdon", + "file": "pdfs/bitmap-template2-customat-tpgdon.pdf", + "md5": "28e16035900ea4a8e7b3ba32fd71c51b", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_template2_customat", + "file": "pdfs/bitmap-template2-customat.pdf", + "md5": "17f2e6c4968257e94237a1218bccc6fb", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_template2_tpgdon", + "file": "pdfs/bitmap-template2-tpgdon.pdf", + "md5": "648a4345fad43da9e52c190aa61d89b3", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_template2", + "file": "pdfs/bitmap-template2.pdf", + "md5": "809f22283f3d5d2c26ab9de64caf681a", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_template3_customat_tpgdon", + "file": "pdfs/bitmap-template3-customat-tpgdon.pdf", + "md5": "8441c64ded69dea250543ea6cc01f5e1", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_template3_customat", + "file": "pdfs/bitmap-template3-customat.pdf", + "md5": "3a920c2115c751f2bfeff198c04ca6a8", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_template3_tpgdon", + "file": "pdfs/bitmap-template3-tpgdon.pdf", + "md5": "11cc6b7f7ae109211c0b7a3d9c7bdee8", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_template3", + "file": "pdfs/bitmap-template3.pdf", + "md5": "d91f1c341817b8c20a6e8e7fb5c5aaa6", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_tpgdon", + "file": "pdfs/bitmap-tpgdon.pdf", + "md5": "6bcf8f02d776d87a4972316863f593b3", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_trailing_7fff_stripped_harder_refine", + "file": "pdfs/bitmap-trailing-7fff-stripped-harder-refine.pdf", + "md5": "38bbef1a67579625ad159ac6634ba79d", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_trailing_7fff_stripped_harder", + "file": "pdfs/bitmap-trailing-7fff-stripped-harder.pdf", + "md5": "7eadf55c6689431a162fb084fd3970ba", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "jbig2_bitmap_trailing_7fff_stripped", + "file": "pdfs/bitmap-trailing-7fff-stripped.pdf", + "md5": "157322e2f6b83743635d9994607c1c57", + "rounds": 1, + "type": "eq", + "useWasm": false + }, + { + "id": "bomb_giant_contents_image_stream", + "file": "pdfs/bomb_giant.pdf", + "md5": "e515a9abb11ab74332e57e371bfae61e", + "rounds": 1, + "type": "eq" } ] diff --git a/test/test_slave.html b/test/test_slave.html index 8d202ce3778fd..b8eb0beea4a2a 100644 --- a/test/test_slave.html +++ b/test/test_slave.html @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/web/images/pages_closeButton.svg b/web/images/pages_closeButton.svg new file mode 100644 index 0000000000000..92fc5ecf65c02 --- /dev/null +++ b/web/images/pages_closeButton.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/images/pages_selected.svg b/web/images/pages_selected.svg new file mode 100644 index 0000000000000..32c4816410037 --- /dev/null +++ b/web/images/pages_selected.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/web/images/pages_viewArrow.svg b/web/images/pages_viewArrow.svg new file mode 100644 index 0000000000000..a4932d42769d3 --- /dev/null +++ b/web/images/pages_viewArrow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/images/pages_viewButton.svg b/web/images/pages_viewButton.svg new file mode 100644 index 0000000000000..24c518d4331bf --- /dev/null +++ b/web/images/pages_viewButton.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/images/toolbarButton-sidebarToggle.svg b/web/images/toolbarButton-viewsManagerToggle.svg similarity index 100% rename from web/images/toolbarButton-sidebarToggle.svg rename to web/images/toolbarButton-viewsManagerToggle.svg diff --git a/web/menu.css b/web/menu.css new file mode 100644 index 0000000000000..5ed86cb1c2836 --- /dev/null +++ b/web/menu.css @@ -0,0 +1,205 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +button.hasPopupMenu { + &[aria-expanded="true"] + menu { + visibility: visible; + } + + &[aria-expanded="false"] + menu { + visibility: hidden; + } +} + +.popupMenu { + --menuitem-checkmark-icon: url(images/checkmark.svg); + --menu-mark-icon-size: 0; + --menu-icon-size: 16px; + --menuitem-gap: 5px; + --menuitem-border-color: transparent; + --menuitem-active-bg: color-mix( + in srgb, + var(--menu-text-color), + transparent 79% + ); + --menuitem-text-active-fg: var(--menu-text-color); + --menuitem-focus-bg: color-mix( + in srgb, + var(--menu-text-color), + transparent 93% + ); + --menuitem-focus-outline-color: light-dark(#0062fa, #00cadb); + --menuitem-focus-border-color: light-dark(white, black); + + --menu-bg: light-dark(white, #23222b); + --menu-background-blend-mode: normal; + --menu-box-shadow: + 0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), + 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --menu-border-color: light-dark(rgb(21 20 26 / 0.1), rgb(251 251 254 / 0.1)); + --menuitem-border-radius: 8px; + --menu-backdrop-filter: none; + --menu-text-color: light-dark(#15141a, #fbfbfe); + --menuitem-text-hover-fg: var(--menu-text-color); + --menuitem-hover-bg: color-mix( + in srgb, + var(--menu-text-color), + transparent 86% + ); + --menuitem-hover-background-blend-mode: normal; + + @media screen and (forced-colors: active) { + --menu-bg: Canvas; + --menu-background-blend-mode: normal; + --menu-box-shadow: none; + --menu-backdrop-filter: none; + --menu-text-color: ButtonText; + --menu-border-color: CanvasText; + --menuitem-border-color: none; + --menuitem-hover-bg: SelectedItemText; + --menuitem-text-hover-fg: SelectedItem; + --menuitem-active-bg: SelectedItemText; + --menuitem-text-active-fg: SelectedItem; + --menuitem-focus-outline-color: CanvasText; + --menuitem-focus-border-color: none; + } + + display: flex; + flex-direction: column; + width: max-content; + height: auto; + position: relative; + left: 0; + top: 1px; + margin: 0; + padding: 5px; + box-sizing: border-box; + + background: var(--menu-bg); + background-blend-mode: var(--menu-background-blend-mode); + box-shadow: var(--menu-box-shadow); + border-radius: 6px; + border: 1px solid var(--menu-border-color); + backdrop-filter: var(--menu-backdrop-filter); + + &.withMark { + --menu-mark-icon-size: 16px; + } + + > li { + display: flex; + align-items: center; + list-style: none; + width: 100%; + height: 24px; + padding-inline: calc(var(--menu-mark-icon-size) + var(--menuitem-gap)) + var(--menuitem-gap); + gap: var(--menuitem-gap); + box-sizing: border-box; + border-radius: var(--menuitem-border-radius); + border: 1px solid var(--menuitem-border-color); + background: transparent; + + &:has(button.selected)::before { + content: ""; + display: inline-block; + width: 11px; + height: 11px; + mask-repeat: no-repeat; + mask-position: center; + mask-image: var(--menuitem-checkmark-icon); + background-color: var(--menu-text-color); + position: absolute; + margin-inline-start: -16px; + } + + &:has(button:disabled) { + opacity: 0.62; + pointer-events: none; + } + + &:hover { + background: var(--menuitem-hover-bg); + background-blend-mode: var(--menuitem-hover-background-blend-mode); + > button { + &:not(.noIcon)::before { + background-color: var(--menuitem-text-hover-fg); + } + > span { + color: var(--menuitem-text-hover-fg); + } + } + &:has(button.selected)::before { + background-color: var(--menuitem-text-hover-fg); + } + } + + &:active { + background-color: var(--menuitem-active-bg); + > button > span { + color: var(--menuitem-text-active-fg); + } + } + + &:has(> button:focus-visible) { + border-color: var(--menuitem-focus-border-color); + background-color: var(--menuitem-focus-bg); + outline: 2px solid var(--menuitem-focus-outline-color); + outline-offset: 2px; + } + + > button { + display: flex; + flex-direction: row; + align-items: center; + width: 100%; + height: auto; + padding: var(--menuitem-gap); + gap: var(--menuitem-gap); + background: transparent; + border: none; + + &:not(.noIcon)::before { + display: inline-block; + width: var(--menu-icon-size); + height: var(--menu-icon-size); + content: ""; + mask-size: cover; + mask-position: center; + background-color: var(--menu-text-color); + } + + &:focus-visible { + outline: none; + } + + > span { + display: inline-block; + width: max-content; + height: auto; + text-align: start; + color: var(--menu-text-color); + user-select: none; + padding-inline-start: 6px; + + font: menu; + font-size: 13px; + font-style: normal; + font-weight: 510; + line-height: normal; + } + } + } +} diff --git a/web/menu.js b/web/menu.js new file mode 100644 index 0000000000000..27218093da33b --- /dev/null +++ b/web/menu.js @@ -0,0 +1,231 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { noContextMenu, stopEvent } from "pdfjs-lib"; + +class Menu { + #triggeringButton; + + #menu; + + #menuItems; + + #openMenuAC = null; + + #menuAC = new AbortController(); + + #lastIndex = -1; + + /** + * Create a menu for the given button. + * @param {HTMLElement} menuContainer + * @param {HTMLElement} triggeringButton + * @param {Array|null} menuItems + */ + constructor(menuContainer, triggeringButton, menuItems) { + this.#menu = menuContainer; + this.#triggeringButton = triggeringButton; + if (Array.isArray(menuItems)) { + this.#menuItems = menuItems; + } else { + this.#menuItems = []; + for (const button of this.#menu.querySelectorAll("button")) { + this.#menuItems.push(button); + } + } + this.#setUpMenu(); + } + + /** + * Close the menu. + */ + #closeMenu() { + if (!this.#openMenuAC) { + return; + } + const menu = this.#menu; + this.#triggeringButton.ariaExpanded = "false"; + this.#openMenuAC.abort(); + this.#openMenuAC = null; + if (menu.contains(document.activeElement)) { + // If the menu is closed while focused, focus the actions button. + setTimeout(() => { + if (!menu.contains(document.activeElement)) { + this.#triggeringButton.focus(); + } + }, 0); + } + this.#lastIndex = -1; + } + + /** + * Set up the menu. + */ + #setUpMenu() { + this.#triggeringButton.addEventListener("click", e => { + if (this.#openMenuAC) { + this.#closeMenu(); + return; + } + + const menu = this.#menu; + this.#triggeringButton.ariaExpanded = "true"; + this.#openMenuAC = new AbortController(); + const signal = AbortSignal.any([ + this.#menuAC.signal, + this.#openMenuAC.signal, + ]); + window.addEventListener( + "pointerdown", + ({ target }) => { + if (target !== this.#triggeringButton && !menu.contains(target)) { + this.#closeMenu(); + } + }, + { signal } + ); + window.addEventListener("blur", this.#closeMenu.bind(this), { signal }); + }); + + const { signal } = this.#menuAC; + + this.#menu.addEventListener( + "keydown", + e => { + switch (e.key) { + case "Escape": + this.#closeMenu(); + stopEvent(e); + break; + case "ArrowDown": + case "Tab": + this.#goToNextItem(e.target, true); + stopEvent(e); + break; + case "ArrowUp": + case "ShiftTab": + this.#goToNextItem(e.target, false); + stopEvent(e); + break; + case "Home": + this.#menuItems + .find( + item => !item.disabled && !item.classList.contains("hidden") + ) + .focus(); + stopEvent(e); + break; + case "End": + this.#menuItems + .findLast( + item => !item.disabled && !item.classList.contains("hidden") + ) + .focus(); + stopEvent(e); + break; + default: + const char = e.key.toLocaleLowerCase(); + this.#goToNextItem(e.target, true, item => + item.textContent.trim().toLowerCase().startsWith(char) + ); + stopEvent(e); + break; + } + }, + { signal, capture: true } + ); + this.#menu.addEventListener("contextmenu", noContextMenu, { signal }); + this.#menu.addEventListener("click", this.#closeMenu.bind(this), { + signal, + capture: true, + }); + this.#triggeringButton.addEventListener( + "keydown", + e => { + switch (e.key) { + case " ": + case "Enter": + case "ArrowDown": + case "Home": + if (!this.#openMenuAC) { + this.#triggeringButton.click(); + } + this.#menuItems + .find( + item => !item.disabled && !item.classList.contains("hidden") + ) + .focus(); + stopEvent(e); + break; + case "ArrowUp": + case "End": + if (!this.#openMenuAC) { + this.#triggeringButton.click(); + } + this.#menuItems + .findLast( + item => !item.disabled && !item.classList.contains("hidden") + ) + .focus(); + stopEvent(e); + break; + case "Escape": + this.#closeMenu(); + stopEvent(e); + break; + } + }, + { signal } + ); + } + + /** + * Go to the next/previous menu item. + * @param {HTMLElement} element + * @param {boolean} forward + */ + #goToNextItem(element, forward, check = () => true) { + const index = + this.#lastIndex === -1 + ? this.#menuItems.indexOf(element) + : this.#lastIndex; + const len = this.#menuItems.length; + const increment = forward ? 1 : len - 1; + for ( + let i = (index + increment) % len; + i !== index; + i = (i + increment) % len + ) { + const menuItem = this.#menuItems[i]; + if ( + !menuItem.disabled && + !menuItem.classList.contains("hidden") && + check(menuItem) + ) { + menuItem.focus(); + this.#lastIndex = i; + break; + } + } + } + + destroy() { + this.#closeMenu(); + this.#menuAC?.abort(); + this.#menuAC = null; + } +} + +export { Menu }; diff --git a/web/new_alt_text_manager.js b/web/new_alt_text_manager.js index d9554b7798aa9..a7e73c8ab16ac 100644 --- a/web/new_alt_text_manager.js +++ b/web/new_alt_text_manager.js @@ -141,6 +141,15 @@ class NewAltTextManager { textarea.addEventListener("input", () => { this.#toggleTitleAndDisclaimer(); }); + textarea.addEventListener("keydown", e => { + if ( + (e.ctrlKey || e.metaKey) && + e.key === "Enter" && + !saveButton.disabled + ) { + this.#save(); + } + }); eventBus._on("enableguessalttext", ({ value }) => { this.#toggleGuessAltText(value, /* isInitial = */ false); @@ -444,7 +453,7 @@ class NewAltTextManager { } #close() { - const canvas = this.#imagePreview.firstChild; + const canvas = this.#imagePreview.firstElementChild; canvas.remove(); canvas.width = canvas.height = 0; this.#imageData = null; @@ -619,7 +628,7 @@ class ImageAltTextSettings { async #download(isFromUI = false) { if (isFromUI) { this.#downloadModelButton.disabled = true; - const span = this.#downloadModelButton.firstChild; + const span = this.#downloadModelButton.firstElementChild; span.setAttribute( "data-l10n-id", "pdfjs-editor-alt-text-settings-downloading-model-button" diff --git a/web/pdf_attachment_viewer.js b/web/pdf_attachment_viewer.js index d80270466a3dc..6d36e4a153830 100644 --- a/web/pdf_attachment_viewer.js +++ b/web/pdf_attachment_viewer.js @@ -118,20 +118,18 @@ class PDFAttachmentViewer extends BaseTreeViewer { } const fragment = document.createDocumentFragment(); + const ul = document.createElement("ul"); + fragment.append(ul); let attachmentsCount = 0; for (const name in attachments) { const item = attachments[name]; - - const div = document.createElement("div"); - div.className = "treeItem"; - + const li = document.createElement("li"); + ul.append(li); const element = document.createElement("a"); + li.append(element); this._bindLink(element, item); element.textContent = this._normalizeTextContent(item.filename); - div.append(element); - - fragment.append(div); attachmentsCount++; } diff --git a/web/pdf_find_controller.js b/web/pdf_find_controller.js index 19abf3fca7dad..64ca3d6a37a79 100644 --- a/web/pdf_find_controller.js +++ b/web/pdf_find_controller.js @@ -77,8 +77,7 @@ const DIACRITICS_EXCEPTION = new Set([ let DIACRITICS_EXCEPTION_STR; // Lazily initialized, see below. const DIACRITICS_REG_EXP = /\p{M}+/gu; -const SPECIAL_CHARS_REG_EXP = - /([.*+?^${}()|[\]\\])|(\p{P})|(\s+)|(\p{M})|(\p{L})/gu; +const SPECIAL_CHARS_REG_EXP = /([+^$|])|(\p{P}+)|(\s+)|(\p{M})|(\p{L})/gu; const NOT_DIACRITIC_FROM_END_REG_EXP = /([^\p{M}])\p{M}*$/u; const NOT_DIACRITIC_FROM_START_REG_EXP = /^\p{M}*([^\p{M}])/u; @@ -440,6 +439,7 @@ class PDFFindController { this.#reset(); eventBus._on("find", this.#onFind.bind(this)); eventBus._on("findbarclose", this.#onFindBarClose.bind(this)); + eventBus._on("pagesedited", this.#onPagesEdited.bind(this)); } get highlightMatches() { @@ -708,6 +708,18 @@ class PDFFindController { #convertToRegExpString(query, hasDiacritics) { const { matchDiacritics } = this.#state; let isUnicode = false; + const addExtraWhitespaces = (original, fixed) => { + if (original === query) { + return fixed; + } + if (query.startsWith(original)) { + return `${fixed}[ ]*`; + } + if (query.endsWith(original)) { + return `[ ]*${fixed}`; + } + return `[ ]*${fixed}[ ]*`; + }; query = query.replaceAll( SPECIAL_CHARS_REG_EXP, ( @@ -723,11 +735,11 @@ class PDFFindController { if (p1) { // Escape characters like *+?... to not interfere with regexp syntax. - return `[ ]*\\${p1}[ ]*`; + return addExtraWhitespaces(p1, RegExp.escape(p1)); } if (p2) { - // Allow whitespaces around punctuation signs. - return `[ ]*${p2}[ ]*`; + // Allow whitespaces around group of punctuation signs. + return addExtraWhitespaces(p2, RegExp.escape(p2)); } if (p3) { // Replace spaces by \s+ to be sure to match any spaces. @@ -1115,6 +1127,25 @@ class PDFFindController { } } + #onPagesEdited({ pagesMapper }) { + if (this._extractTextPromises.length === 0) { + return; + } + this.#onFindBarClose(); + this._dirtyMatch = true; + const prevTextPromises = this._extractTextPromises; + const extractTextPromises = (this._extractTextPromises.length = []); + for (let i = 0, ii = pagesMapper.length; i < ii; i++) { + const prevPageIndex = pagesMapper.getPrevPageNumber(i + 1) - 1; + if (prevPageIndex === -1) { + continue; + } + extractTextPromises.push( + prevTextPromises[prevPageIndex] || Promise.resolve() + ); + } + } + #onFindBarClose(evt) { const pdfDocument = this._pdfDocument; // Since searching is asynchronous, ensure that the removal of highlighted diff --git a/web/pdf_find_utils.js b/web/pdf_find_utils.js index 78b747706b4e0..dc32e073d2172 100644 --- a/web/pdf_find_utils.js +++ b/web/pdf_find_utils.js @@ -13,6 +13,8 @@ * limitations under the License. */ +import { FeatureTest } from "pdfjs-lib"; + const CharacterType = { SPACE: 0, ALPHA_LETTER: 1, @@ -114,8 +116,13 @@ function getCharacterType(charCode) { let NormalizeWithNFKC; function getNormalizeWithNFKC() { - /* eslint-disable no-irregular-whitespace */ - NormalizeWithNFKC ||= ` ¨ª¯²-µ¸-º¼-¾IJ-ijĿ-ŀʼnſDŽ-njDZ-dzʰ-ʸ˘-˝ˠ-ˤʹͺ;΄-΅·ϐ-ϖϰ-ϲϴ-ϵϹևٵ-ٸक़-य़ড়-ঢ়য়ਲ਼ਸ਼ਖ਼-ਜ਼ਫ਼ଡ଼-ଢ଼ำຳໜ-ໝ༌གྷཌྷདྷབྷཛྷཀྵჼᴬ-ᴮᴰ-ᴺᴼ-ᵍᵏ-ᵪᵸᶛ-ᶿẚ-ẛάέήίόύώΆ᾽-῁ΈΉ῍-῏ΐΊ῝-῟ΰΎ῭-`ΌΏ´-῾ - ‑‗․-… ″-‴‶-‷‼‾⁇-⁉⁗ ⁰-ⁱ⁴-₎ₐ-ₜ₨℀-℃℅-ℇ℉-ℓℕ-№ℙ-ℝ℠-™ℤΩℨK-ℭℯ-ℱℳ-ℹ℻-⅀ⅅ-ⅉ⅐-ⅿ↉∬-∭∯-∰〈-〉①-⓪⨌⩴-⩶⫝̸ⱼ-ⱽⵯ⺟⻳⼀-⿕ 〶〸-〺゛-゜ゟヿㄱ-ㆎ㆒-㆟㈀-㈞㈠-㉇㉐-㉾㊀-㏿ꚜ-ꚝꝰꟲ-ꟴꟸ-ꟹꭜ-ꭟꭩ豈-嗀塚晴凞-羽蘒諸逸-都飯-舘並-龎ff-stﬓ-ﬗיִײַ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-﷼︐-︙︰-﹄﹇-﹒﹔-﹦﹨-﹫ﹰ-ﹲﹴﹶ-ﻼ!-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ¢-₩`; + if ( + (typeof PDFJSDev === "undefined" && FeatureTest.platform.isFirefox) || + (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) + ) { + /* eslint-disable no-irregular-whitespace */ + NormalizeWithNFKC ||= `\xA0¨ª¯²-µ¸-º¼-¾IJ-ijĿ-ŀʼnſDŽ-njDZ-dzʰ-ʸ˘-˝ˠ-ˤʹͺ;΄-΅·ϐ-ϖϰ-ϲϴ-ϵϹևٵ-ٸक़-य़ড়-ঢ়য়ਲ਼ਸ਼ਖ਼-ਜ਼ਫ਼ଡ଼-ଢ଼ำຳໜ-ໝ༌གྷཌྷདྷབྷཛྷཀྵჼᴬ-ᴮᴰ-ᴺᴼ-ᵍᵏ-ᵪᵸᶛ-ᶿẚ-ẛάέήίόύώΆ᾽-῁ΈΉ῍-῏ΐΊ῝-῟ΰΎ῭-`ΌΏ´-῾ - ‑‗․-… ″-‴‶-‷‼‾⁇-⁉⁗ ⁰-ⁱ⁴-₎ₐ-ₜ₨℀-℃℅-ℇ℉-ℓℕ-№ℙ-ℝ℠-™ℤΩℨK-ℭℯ-ℱℳ-ℹ℻-⅀ⅅ-ⅉ⅐-ⅿ↉∬-∭∯-∰〈-〉①-⓪⨌⩴-⩶⫝̸ⱼ-ⱽⵯ⺟⻳⼀-⿕ 〶〸-〺゛-゜ゟヿㄱ-ㆎ㆒-㆟㈀-㈞㈠-㉇㉐-㉾㊀-㏿ꚜ-ꚝꝰ꟱-ꟴꟸ-ꟹꭜ-ꭟꭩ豈-嗀塚晴凞-羽蘒諸逸-都飯-舘並-龎ff-stﬓ-ﬗיִײַ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-﷼︐-︙︰-﹄﹇-﹒﹔-﹦﹨-﹫ﹰ-ﹲﹴﹶ-ﻼ!-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ¢-₩`; + } if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) { const ranges = []; @@ -145,7 +152,24 @@ function getNormalizeWithNFKC() { } } } - if (ranges.join("") !== NormalizeWithNFKC) { + + const rangesStr = ranges.join(""); + if (!NormalizeWithNFKC) { + NormalizeWithNFKC = rangesStr; + } else if (rangesStr !== NormalizeWithNFKC) { + for (let i = 1; i < rangesStr.length; i++) { + if (rangesStr[i] !== NormalizeWithNFKC[i]) { + console.log( + `Difference at index ${i}: ` + + `U+${rangesStr.charCodeAt(i).toString(16).toUpperCase().padStart(4, "0")}` + + `!== U+${NormalizeWithNFKC.charCodeAt(i) + .toString(16) + .toUpperCase() + .padStart(4, "0")}` + ); + break; + } + } throw new Error( "getNormalizeWithNFKC - update the `NormalizeWithNFKC` string." ); diff --git a/web/pdf_layer_viewer.js b/web/pdf_layer_viewer.js index c5759a6b9f565..e8290b4c0124e 100644 --- a/web/pdf_layer_viewer.js +++ b/web/pdf_layer_viewer.js @@ -171,8 +171,12 @@ class PDFLayerViewer extends BaseTreeViewer { queue.push({ parent: itemsDiv, groups: groupId.order }); } else { const group = optionalContentConfig.getGroup(groupId); - + const label = document.createElement("label"); const input = document.createElement("input"); + label.append( + input, + document.createTextNode(this._normalizeTextContent(group.name)) + ); this._bindLink(element, { groupId, input }); input.type = "checkbox"; input.checked = group.visible; @@ -182,10 +186,6 @@ class PDFLayerViewer extends BaseTreeViewer { visible: input.checked, }); - const label = document.createElement("label"); - label.textContent = this._normalizeTextContent(group.name); - - label.append(input); element.append(label); layersCount++; } diff --git a/web/pdf_link_service.js b/web/pdf_link_service.js index 9f46a04750be8..885de2bc83130 100644 --- a/web/pdf_link_service.js +++ b/web/pdf_link_service.js @@ -244,12 +244,14 @@ class PDFLinkService { * @param {number} pageNumber - The page number to scroll to. * @param {number} x - The x-coordinate to scroll to in page coordinates. * @param {number} y - The y-coordinate to scroll to in page coordinates. + * @param {Object} [options] */ - goToXY(pageNumber, x, y) { + goToXY(pageNumber, x, y, options = {}) { this.pdfViewer.scrollPageIntoView({ pageNumber, destArray: [null, { name: "XYZ" }, x, y], ignoreDestinationZoom: true, + ...options, }); } diff --git a/web/pdf_page_detail_view.js b/web/pdf_page_detail_view.js index 52cf13c453380..b1f814ec31bba 100644 --- a/web/pdf_page_detail_view.js +++ b/web/pdf_page_detail_view.js @@ -187,19 +187,17 @@ class PDFPageDetailView extends BasePDFPageView { } _getRenderingContext(canvas, transform) { - const baseContext = this.pageView._getRenderingContext(canvas, transform); - const recordedGroups = this.pdfPage.recordedGroups; + const baseContext = this.pageView._getRenderingContext( + canvas, + transform, + false + ); + const recordedBBoxes = this.pdfPage.recordedBBoxes; - if (!recordedGroups || !this.enableOptimizedPartialRendering) { - return { ...baseContext, recordOperations: false }; + if (!recordedBBoxes || !this.enableOptimizedPartialRendering) { + return baseContext; } - // TODO: There is probably a better data structure for this. - // The indexes are always checked in increasing order, so we can just try - // to build a pre-sorted array which should have faster lookups. - // Needs benchmarking. - const filteredIndexes = new Set(); - const { viewport: { width: vWidth, height: vHeight }, } = this.pageView; @@ -215,23 +213,19 @@ class PDFPageDetailView extends BasePDFPageView { const detailMaxX = (aMinX + aWidth) / vWidth; const detailMaxY = (aMinY + aHeight) / vHeight; - for (let i = 0, ii = recordedGroups.length; i < ii; i++) { - const group = recordedGroups[i]; - if ( - group.minX <= detailMaxX && - group.maxX >= detailMinX && - group.minY <= detailMaxY && - group.maxY >= detailMinY - ) { - filteredIndexes.add(group.idx); - group.dependencies.forEach(filteredIndexes.add, filteredIndexes); - } - } - return { ...baseContext, - recordOperations: false, - filteredOperationIndexes: filteredIndexes, + operationsFilter(index) { + if (recordedBBoxes.isEmpty(index)) { + return false; + } + return ( + recordedBBoxes.minX(index) <= detailMaxX && + recordedBBoxes.maxX(index) >= detailMinX && + recordedBBoxes.minY(index) <= detailMaxY && + recordedBBoxes.maxY(index) >= detailMinY + ); + }, }; } @@ -273,7 +267,10 @@ class PDFPageDetailView extends BasePDFPageView { canvasWrapper.prepend(newCanvas); } }, hideUntilComplete); - canvas.setAttribute("aria-hidden", "true"); + canvas.ariaHidden = true; + if (this.enableOptimizedPartialRendering) { + canvas.className = "detailView"; + } const { width, height } = viewport; diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index 8a983c0ef63d8..b3364661a2ede 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -22,6 +22,7 @@ /** @typedef {import("./interfaces").IRenderableView} IRenderableView */ // eslint-disable-next-line max-len /** @typedef {import("./pdf_rendering_queue").PDFRenderingQueue} PDFRenderingQueue */ +/** @typedef {import("./comment_manager.js").CommentManager} CommentManager */ import { AbortException, @@ -102,6 +103,7 @@ import { XfaLayerBuilder } from "./xfa_layer_builder.js"; * the necessary layer-properties. * @property {boolean} [enableAutoLinking] - Enable creation of hyperlinks from * text that look like URLs. The default value is `true`. + * @property {CommentManager} [commentManager] - The comment manager instance. */ const DEFAULT_LAYER_PROPERTIES = @@ -136,6 +138,8 @@ class PDFPageView extends BasePDFPageView { #canvasWrapper = null; + #commentManager = null; + #enableAutoLinking = true; #hasRestrictedScaling = false; @@ -197,6 +201,7 @@ class PDFPageView extends BasePDFPageView { this.capCanvasAreaFactor = options.capCanvasAreaFactor ?? AppOptions.get("capCanvasAreaFactor"); this.#enableAutoLinking = options.enableAutoLinking !== false; + this.#commentManager = options.commentManager || null; this.l10n = options.l10n; if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) { @@ -314,6 +319,25 @@ class PDFPageView extends BasePDFPageView { ); } + updatePageNumber(newPageNumber) { + if (this.id === newPageNumber) { + return; + } + this.id = newPageNumber; + this.renderingId = `page${newPageNumber}`; + if (this.pdfPage) { + this.pdfPage.pageNumber = newPageNumber; + } + // TODO: do we set the page label ? + this.setPageLabel(this.pageLabel); + const { div } = this; + div.setAttribute("data-page-number", newPageNumber); + div.setAttribute("data-l10n-args", JSON.stringify({ page: newPageNumber })); + this._textHighlighter.pageIdx = newPageNumber - 1; + // Don't update the page index for the draw layer, since it's just used as + // an identifier. + } + setPdfPage(pdfPage) { if ( (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) && @@ -488,7 +512,7 @@ class PDFPageView extends BasePDFPageView { const treeDom = await this.structTreeLayer?.render(); if (treeDom) { this.l10n.pause(); - this.structTreeLayer?.addElementsToTextLayer(); + this.structTreeLayer?.updateTextLayer(); if (this.canvas && treeDom.parentNode !== this.canvas) { // Pause translation when inserting the structTree in the DOM. this.canvas.append(treeDom); @@ -516,11 +540,9 @@ class PDFPageView extends BasePDFPageView { if (!this.annotationLayer) { return; // Rendering was cancelled while the textLayerPromise resolved. } - await this.annotationLayer.injectLinkAnnotations({ - inferredLinks: Autolinker.processLinks(this), - viewport: this.viewport, - structTreeLayer: this.structTreeLayer, - }); + await this.annotationLayer.injectLinkAnnotations( + Autolinker.processLinks(this) + ); } catch (ex) { console.error("#injectLinkAnnotations:", ex); error = ex; @@ -798,6 +820,16 @@ class PDFPageView extends BasePDFPageView { this.maxCanvasDim, this.capCanvasAreaFactor ); + if (this.#needsRestrictedScaling && this.enableDetailCanvas) { + // If we are going to have a high-res detail view, further reduce + // the canvas resolution to improve rendering performance. + // When enableOptimizedPartialRendering is enabled the factor can be + // higher since less data will be rendered and it's more acceptable to + // have a lower quality (the canvas is exposed less time to the user). + const factor = this.enableOptimizedPartialRendering ? 4 : 2; + outputScale.sx /= factor; + outputScale.sy /= factor; + } } } @@ -923,7 +955,7 @@ class PDFPageView extends BasePDFPageView { return canvasWrapper; } - _getRenderingContext(canvas, transform) { + _getRenderingContext(canvas, transform, recordOperations) { return { canvas, transform, @@ -933,8 +965,7 @@ class PDFPageView extends BasePDFPageView { annotationCanvasMap: this._annotationCanvasMap, pageColors: this.pageColors, isEditing: this.#isEditing, - recordOperations: - this.enableOptimizedPartialRendering && !this.recordedGroups, + recordOperations, }; } @@ -1006,6 +1037,7 @@ class PDFPageView extends BasePDFPageView { annotationCanvasMap: this._annotationCanvasMap, accessibilityManager: this._accessibilityManager, annotationEditorUIManager, + commentManager: this.#commentManager, onAppend: annotationLayerDiv => { this.#addLayer(annotationLayerDiv, "annotationLayer"); }, @@ -1052,12 +1084,17 @@ class PDFPageView extends BasePDFPageView { this.#scaleRoundY = sfy[1]; } + const recordBBoxes = + this.enableOptimizedPartialRendering && + this.#hasRestrictedScaling && + !this.recordedBBoxes; + // Rendering area const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; const resultPromise = this._drawCanvas( - this._getRenderingContext(canvas, transform), + this._getRenderingContext(canvas, transform, recordBBoxes), () => { prevCanvas?.remove(); this._resetCanvas(); @@ -1074,6 +1111,10 @@ class PDFPageView extends BasePDFPageView { ); } ).then(async () => { + if (this.renderingState !== RenderingStates.FINISHED) { + // The rendering has been cancelled. + return; + } this.structTreeLayer ||= new StructTreeLayerBuilder( pdfPage, viewport.rawDims @@ -1094,26 +1135,29 @@ class PDFPageView extends BasePDFPageView { if (!annotationEditorUIManager) { return; } - this.drawLayer ||= new DrawLayerBuilder({ - pageIndex: this.id, - }); + this.drawLayer ||= new DrawLayerBuilder(); await this.#renderDrawLayer(); this.drawLayer.setParent(canvasWrapper); - this.annotationEditorLayer ||= new AnnotationEditorLayerBuilder({ - uiManager: annotationEditorUIManager, - pdfPage, - l10n, - structTreeLayer: this.structTreeLayer, - accessibilityManager: this._accessibilityManager, - annotationLayer: this.annotationLayer?.annotationLayer, - textLayer: this.textLayer, - drawLayer: this.drawLayer.getDrawLayer(), - onAppend: annotationEditorLayerDiv => { - this.#addLayer(annotationEditorLayerDiv, "annotationEditorLayer"); - }, - }); - this.#renderAnnotationEditorLayer(); + if ( + this.annotationLayer || + this.#annotationMode === AnnotationMode.DISABLE + ) { + this.annotationEditorLayer ||= new AnnotationEditorLayerBuilder({ + uiManager: annotationEditorUIManager, + pdfPage, + l10n, + structTreeLayer: this.structTreeLayer, + accessibilityManager: this._accessibilityManager, + annotationLayer: this.annotationLayer?.annotationLayer, + textLayer: this.textLayer, + drawLayer: this.drawLayer.getDrawLayer(), + onAppend: annotationEditorLayerDiv => { + this.#addLayer(annotationEditorLayerDiv, "annotationEditorLayer"); + }, + }); + this.#renderAnnotationEditorLayer(); + } }); if (pdfPage.isPureXfa) { diff --git a/web/pdf_text_extractor.js b/web/pdf_text_extractor.js new file mode 100644 index 0000000000000..630e8d5b08228 --- /dev/null +++ b/web/pdf_text_extractor.js @@ -0,0 +1,89 @@ +/* Copyright 2024 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * This class manages the interaction of extracting the text content of the page + * and passing it back to the external service. + */ +class PdfTextExtractor { + /** @type {PDFViewer} */ + #pdfViewer; + + #externalServices; + + /** + * @type {?Promise} + */ + #textPromise; + + #pendingRequests = new Set(); + + constructor(externalServices) { + this.#externalServices = externalServices; + + window.addEventListener("requestTextContent", ({ detail }) => { + this.extractTextContent(detail.requestId); + }); + } + + /** + * The PDF viewer is required to get the page text. + * + * @param {PDFViewer | null} + */ + setViewer(pdfViewer) { + this.#pdfViewer = pdfViewer; + if (this.#pdfViewer && this.#pendingRequests.size) { + // Handle any pending requests that came in while things were loading. + for (const pendingRequest of this.#pendingRequests) { + this.extractTextContent(pendingRequest); + } + this.#pendingRequests.clear(); + } + } + + /** + * Builds up all of the text from a PDF. + * + * @param {number} requestId + */ + async extractTextContent(requestId) { + if (!this.#pdfViewer) { + this.#pendingRequests.add(requestId); + return; + } + + if (!this.#textPromise) { + const textPromise = (this.#textPromise = this.#pdfViewer.getAllText()); + + // After the text resolves, cache the text for a little bit in case + // multiple consumers call it. + textPromise.then(() => { + setTimeout(() => { + if (this.#textPromise === textPromise) { + this.#textPromise = null; + } + }, 5000); + }); + } + + this.#externalServices.reportText({ + text: await this.#textPromise, + requestId, + }); + } +} + +export { PdfTextExtractor }; diff --git a/web/pdf_thumbnail_view.js b/web/pdf_thumbnail_view.js index 4903c6bcfeb76..3293f1b2d51af 100644 --- a/web/pdf_thumbnail_view.js +++ b/web/pdf_thumbnail_view.js @@ -23,20 +23,17 @@ // eslint-disable-next-line max-len /** @typedef {import("./pdf_rendering_queue").PDFRenderingQueue} PDFRenderingQueue */ -import { OutputScale, RenderingCancelledException } from "pdfjs-lib"; +import { + FeatureTest, + OutputScale, + RenderingCancelledException, +} from "pdfjs-lib"; import { AppOptions } from "./app_options.js"; import { RenderingStates } from "./ui_utils.js"; const DRAW_UPSCALE_FACTOR = 2; // See comment in `PDFThumbnailView.draw` below. const MAX_NUM_SCALING_STEPS = 3; -const THUMBNAIL_WIDTH = 98; // px - -function zeroCanvas(c) { - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - c.width = 0; - c.height = 0; -} +const THUMBNAIL_WIDTH = 126; // px /** * @typedef {Object} PDFThumbnailViewOptions @@ -61,12 +58,15 @@ function zeroCanvas(c) { */ class TempImageFactory { - static #tempCanvas = null; - static getCanvas(width, height) { - const tempCanvas = (this.#tempCanvas ||= document.createElement("canvas")); - tempCanvas.width = width; - tempCanvas.height = height; + let tempCanvas; + if (FeatureTest.isOffscreenCanvasSupported) { + tempCanvas = new OffscreenCanvas(width, height); + } else { + tempCanvas = document.createElement("canvas"); + tempCanvas.width = width; + tempCanvas.height = height; + } // Since this is a temporary canvas, we need to fill it with a white // background ourselves. `#getPageDrawContext` uses CSS rules for this. @@ -75,14 +75,7 @@ class TempImageFactory { ctx.fillStyle = "rgb(255, 255, 255)"; ctx.fillRect(0, 0, width, height); ctx.restore(); - return [tempCanvas, tempCanvas.getContext("2d")]; - } - - static destroyCanvas() { - if (this.#tempCanvas) { - zeroCanvas(this.#tempCanvas); - } - this.#tempCanvas = null; + return [tempCanvas, ctx]; } } @@ -104,9 +97,10 @@ class PDFThumbnailView { maxCanvasPixels, maxCanvasDim, pageColors, + enableSplitMerge = false, }) { this.id = id; - this.renderingId = "thumbnail" + id; + this.renderingId = `thumbnail${id}`; this.pageLabel = null; this.pdfPage = null; @@ -125,44 +119,49 @@ class PDFThumbnailView { this.renderTask = null; this.renderingState = RenderingStates.INITIAL; this.resume = null; + this.placeholder = null; + + const imageContainer = (this.div = document.createElement("div")); + imageContainer.className = "thumbnail"; + imageContainer.classList.add("mcThumbnail"); + imageContainer.setAttribute("page-number", id); + imageContainer.setAttribute("page-id", id); + + if (enableSplitMerge) { + const checkbox = (this.checkbox = document.createElement("input")); + checkbox.type = "checkbox"; + checkbox.tabIndex = -1; + imageContainer.append(checkbox); + } - const anchor = document.createElement("a"); - anchor.href = linkService.getAnchorUrl("#page=" + id); - anchor.setAttribute("data-l10n-id", "pdfjs-thumb-page-title"); - anchor.setAttribute("data-l10n-args", this.#pageL10nArgs); - anchor.onclick = function () { - linkService.goToPage(id); - return false; - }; - this.anchor = anchor; - - const div = document.createElement("div"); - div.className = "thumbnail"; - div.classList.add("mcThumbnail"); - div.setAttribute("data-page-number", this.id); - this.div = div; + const image = (this.image = document.createElement("img")); + image.classList.add("thumbnailImage", "missingThumbnailImage"); + image.role = "button"; + image.tabIndex = -1; + image.draggable = false; this.#updateDims(); - const img = document.createElement("div"); - img.className = "thumbnailImage"; - this._placeholderImg = img; + imageContainer.append(image); + container.append(imageContainer); + } - div.append(img); - anchor.append(div); - container.append(anchor); + updateId(newId) { + this.id = newId; + this.renderingId = `thumbnail${newId}`; + this.div.setAttribute("page-number", newId); + // TODO: do we set the page label ? + this.setPageLabel(this.pageLabel); } #updateDims() { const { width, height } = this.viewport; const ratio = width / height; - this.canvasWidth = THUMBNAIL_WIDTH; - this.canvasHeight = (this.canvasWidth / ratio) | 0; - this.scale = this.canvasWidth / width; + const canvasWidth = (this.canvasWidth = THUMBNAIL_WIDTH); + const canvasHeight = (this.canvasHeight = (canvasWidth / ratio) | 0); + this.scale = canvasWidth / width; - const { style } = this.div; - style.setProperty("--thumbnail-width", `${this.canvasWidth}px`); - style.setProperty("--thumbnail-height", `${this.canvasHeight}px`); + this.image.style.height = `${canvasHeight}px`; } setPdfPage(pdfPage) { @@ -176,14 +175,16 @@ class PDFThumbnailView { reset() { this.cancelRendering(); this.renderingState = RenderingStates.INITIAL; - - this.div.removeAttribute("data-loaded"); - this.image?.replaceWith(this._placeholderImg); this.#updateDims(); - if (this.image) { - this.image.removeAttribute("src"); - delete this.image; + const { image } = this; + const url = image.src; + if (url) { + URL.revokeObjectURL(url); + image.removeAttribute("data-l10n-id"); + image.removeAttribute("data-l10n-args"); + image.src = ""; + this.image.classList.add("missingThumbnailImage"); } } @@ -199,6 +200,16 @@ class PDFThumbnailView { this.reset(); } + toggleCurrent(isCurrent) { + if (isCurrent) { + this.image.ariaCurrent = "page"; + this.image.tabIndex = 0; + } else { + this.image.ariaCurrent = false; + this.image.tabIndex = -1; + } + } + /** * PLEASE NOTE: Most likely you want to use the `this.reset()` method, * rather than calling this one directly. @@ -214,7 +225,6 @@ class PDFThumbnailView { #getPageDrawContext(upscaleFactor = 1) { // Keep the no-thumbnail outline visible, i.e. `data-loaded === false`, // until rendering/image conversion is complete, to avoid display issues. - const canvas = document.createElement("canvas"); const outputScale = new OutputScale(); const width = upscaleFactor * this.canvasWidth, height = upscaleFactor * this.canvasHeight; @@ -225,6 +235,9 @@ class PDFThumbnailView { this.maxCanvasPixels, this.maxCanvasDim ); + // Because of: https://bugzilla.mozilla.org/show_bug.cgi?id=2003060 + // we need use a HTMLCanvasElement here. + const canvas = document.createElement("canvas"); canvas.width = (width * outputScale.sx) | 0; canvas.height = (height * outputScale.sy) | 0; @@ -235,23 +248,23 @@ class PDFThumbnailView { return { canvas, transform }; } - #convertCanvasToImage(canvas) { + async #convertCanvasToImage(canvas) { if (this.renderingState !== RenderingStates.FINISHED) { throw new Error("#convertCanvasToImage: Rendering has not finished."); } const reducedCanvas = this.#reduceImage(canvas); - - const image = document.createElement("img"); - image.className = "thumbnailImage"; + const { image } = this; + const { promise, resolve } = Promise.withResolvers(); + reducedCanvas.toBlob(resolve); + const blob = await promise; + image.src = URL.createObjectURL(blob); image.setAttribute("data-l10n-id", "pdfjs-thumb-page-canvas"); image.setAttribute("data-l10n-args", this.#pageL10nArgs); - image.src = reducedCanvas.toDataURL(); - this.image = image; - - this.div.setAttribute("data-loaded", true); - this._placeholderImg.replaceWith(image); - - zeroCanvas(reducedCanvas); + image.classList.remove("missingThumbnailImage"); + if (!FeatureTest.isOffscreenCanvasSupported) { + // Clean up the canvas element since it is no longer needed. + reducedCanvas.width = reducedCanvas.height = 0; + } } async draw() { @@ -304,7 +317,6 @@ class PDFThumbnailView { await renderTask.promise; } catch (e) { if (e instanceof RenderingCancelledException) { - zeroCanvas(canvas); return; } error = e; @@ -318,8 +330,7 @@ class PDFThumbnailView { } this.renderingState = RenderingStates.FINISHED; - this.#convertCanvasToImage(canvas); - zeroCanvas(canvas); + await this.#convertCanvasToImage(canvas); this.eventBus.dispatch("thumbnailrendered", { source: this, @@ -450,14 +461,8 @@ class PDFThumbnailView { */ setPageLabel(label) { this.pageLabel = typeof label === "string" ? label : null; - - this.anchor.setAttribute("data-l10n-args", this.#pageL10nArgs); - - if (this.renderingState !== RenderingStates.FINISHED) { - return; - } - this.image?.setAttribute("data-l10n-args", this.#pageL10nArgs); + this.image.setAttribute("data-l10n-args", this.#pageL10nArgs); } } -export { PDFThumbnailView, TempImageFactory }; +export { PDFThumbnailView }; diff --git a/web/pdf_thumbnail_viewer.js b/web/pdf_thumbnail_viewer.js index 836dd5e8630d2..a11636c4c315f 100644 --- a/web/pdf_thumbnail_viewer.js +++ b/web/pdf_thumbnail_viewer.js @@ -21,16 +21,30 @@ /** @typedef {import("./pdf_rendering_queue").PDFRenderingQueue} PDFRenderingQueue */ import { + binarySearchFirstItem, getVisibleElements, isValidRotation, RenderingStates, - scrollIntoView, watchScroll, } from "./ui_utils.js"; -import { PDFThumbnailView, TempImageFactory } from "./pdf_thumbnail_view.js"; +import { MathClamp, noContextMenu, PagesMapper, stopEvent } from "pdfjs-lib"; +import { Menu } from "./menu.js"; +import { PDFThumbnailView } from "./pdf_thumbnail_view.js"; -const THUMBNAIL_SCROLL_MARGIN = -19; -const THUMBNAIL_SELECTED_CLASS = "selected"; +const SCROLL_OPTIONS = { + behavior: "instant", + block: "nearest", + inline: "nearest", + container: "nearest", +}; + +// This value is based on the one used in Firefox. +// See +// https://searchfox.org/firefox-main/rev/04cf27582307a9c351e991c740828d54cf786b76/dom/events/EventStateManager.cpp#2675-2698 +// This threshold is used to distinguish between a click and a drag. +const DRAG_THRESHOLD_IN_PIXELS = 5; +const PIXELS_TO_SCROLL_WHEN_DRAGGING = 20; +const SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT = 15; /** * @typedef {Object} PDFThumbnailViewerOptions @@ -52,12 +66,54 @@ const THUMBNAIL_SELECTED_CLASS = "selected"; * events. * @property {boolean} [enableHWA] - Enables hardware acceleration for * rendering. The default value is `false`. + * @property {boolean} [enableSplitMerge] - Enables split and merge features. + * The default value is `false`. + * @property {Object} [manageMenu] - The menu elements to manage saving edited + * PDF. */ /** * Viewer control to display thumbnails for pages in a PDF document. */ class PDFThumbnailViewer { + static #draggingScaleFactor = 0; + + #enableSplitMerge = false; + + #dragAC = null; + + #draggedContainer = null; + + #thumbnailsPositions = null; + + #lastDraggedOverIndex = NaN; + + #selectedPages = null; + + #draggedImageX = 0; + + #draggedImageY = 0; + + #draggedImageWidth = 0; + + #draggedImageHeight = 0; + + #draggedImageOffsetX = 0; + + #draggedImageOffsetY = 0; + + #dragMarker = null; + + #pageNumberToRemove = NaN; + + #currentScrollBottom = 0; + + #currentScrollTop = 0; + + #pagesMapper = PagesMapper.instance; + + #manageSaveAsButton = null; + /** * @param {PDFThumbnailViewerOptions} options */ @@ -71,7 +127,10 @@ class PDFThumbnailViewer { pageColors, abortSignal, enableHWA, + enableSplitMerge, + manageMenu, }) { + this.scrollableContainer = container.parentElement; this.container = container; this.eventBus = eventBus; this.linkService = linkService; @@ -80,13 +139,29 @@ class PDFThumbnailViewer { this.maxCanvasDim = maxCanvasDim; this.pageColors = pageColors || null; this.enableHWA = enableHWA || false; + this.#enableSplitMerge = enableSplitMerge || false; + + if (this.#enableSplitMerge && manageMenu) { + const { button, menu, copy, cut, delete: del, saveAs } = manageMenu; + this._manageMenu = new Menu(menu, button, [copy, cut, del, saveAs]); + this.#manageSaveAsButton = saveAs; + saveAs.addEventListener("click", () => { + this.eventBus.dispatch("savepageseditedpdf", { + source: this, + data: this.#pagesMapper.getPageMappingForSaving(), + }); + }); + } else { + manageMenu.button.hidden = true; + } this.scroll = watchScroll( - this.container, + this.scrollableContainer, this.#scrollUpdated.bind(this), abortSignal ); this.#resetView(); + this.#addEventListeners(); } #scrollUpdated() { @@ -99,7 +174,7 @@ class PDFThumbnailViewer { #getVisibleThumbs() { return getVisibleElements({ - scrollEl: this.container, + scrollEl: this.scrollableContainer, views: this._thumbnails, }); } @@ -114,24 +189,26 @@ class PDFThumbnailViewer { console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.'); return; } - if (pageNumber !== this._currentPageNumber) { const prevThumbnailView = this._thumbnails[this._currentPageNumber - 1]; - // Remove the highlight from the previous thumbnail... - prevThumbnailView.div.classList.remove(THUMBNAIL_SELECTED_CLASS); - // ... and add the highlight to the new thumbnail. - thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); + prevThumbnailView.toggleCurrent(/* isCurrent = */ false); + thumbnailView.toggleCurrent(/* isCurrent = */ true); + this._currentPageNumber = pageNumber; } const { first, last, views } = this.#getVisibleThumbs(); // If the thumbnail isn't currently visible, scroll it into view. if (views.length > 0) { let shouldScroll = false; - if (pageNumber <= first.id || pageNumber >= last.id) { + if ( + pageNumber <= this.#pagesMapper.getPageNumber(first.id) || + pageNumber >= this.#pagesMapper.getPageNumber(last.id) + ) { shouldScroll = true; } else { for (const { id, percent } of views) { - if (id !== pageNumber) { + const mappedPageNumber = this.#pagesMapper.getPageNumber(id); + if (mappedPageNumber !== pageNumber) { continue; } shouldScroll = percent < 100; @@ -139,7 +216,7 @@ class PDFThumbnailViewer { } } if (shouldScroll) { - scrollIntoView(thumbnailView.div, { top: THUMBNAIL_SCROLL_MARGIN }); + thumbnailView.div.scrollIntoView(SCROLL_OPTIONS); } } @@ -174,7 +251,6 @@ class PDFThumbnailViewer { thumbnail.reset(); } } - TempImageFactory.destroyCanvas(); } #resetView() { @@ -209,10 +285,11 @@ class PDFThumbnailViewer { .then(firstPdfPage => { const pagesCount = pdfDocument.numPages; const viewport = firstPdfPage.getViewport({ scale: 1 }); + const fragment = document.createDocumentFragment(); for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { const thumbnail = new PDFThumbnailView({ - container: this.container, + container: fragment, eventBus: this.eventBus, id: pageNum, defaultViewport: viewport.clone(), @@ -223,6 +300,7 @@ class PDFThumbnailViewer { maxCanvasDim: this.maxCanvasDim, pageColors: this.pageColors, enableHWA: this.enableHWA, + enableSplitMerge: this.#enableSplitMerge, }); this._thumbnails.push(thumbnail); } @@ -233,7 +311,8 @@ class PDFThumbnailViewer { // Ensure that the current thumbnail is always highlighted on load. const thumbnailView = this._thumbnails[this._currentPageNumber - 1]; - thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); + thumbnailView.toggleCurrent(/* isCurrent = */ true); + this.container.append(fragment); }) .catch(reason => { console.error("Unable to initialize thumbnail viewer", reason); @@ -316,6 +395,611 @@ class PDFThumbnailViewer { } return false; } + + static #getScaleFactor(image) { + return (PDFThumbnailViewer.#draggingScaleFactor ||= parseFloat( + getComputedStyle(image).getPropertyValue("--thumbnail-dragging-scale") + )); + } + + #updateThumbnails() { + const pagesMapper = this.#pagesMapper; + this.container.replaceChildren(); + const prevThumbnails = this._thumbnails; + const newThumbnails = (this._thumbnails = []); + const fragment = document.createDocumentFragment(); + for (let i = 0, ii = pagesMapper.pagesNumber; i < ii; i++) { + const prevPageIndex = pagesMapper.getPrevPageNumber(i + 1) - 1; + if (prevPageIndex === -1) { + continue; + } + const newThumbnail = prevThumbnails[prevPageIndex]; + newThumbnails.push(newThumbnail); + newThumbnail.updateId(i + 1); + newThumbnail.checkbox.checked = false; + fragment.append(newThumbnail.div); + } + this.container.append(fragment); + } + + #onStartDragging(draggedThumbnail) { + this.#currentScrollTop = this.scrollableContainer.scrollTop; + this.#currentScrollBottom = + this.#currentScrollTop + this.scrollableContainer.clientHeight; + this.#dragAC = new AbortController(); + this.container.classList.add("isDragging"); + const startPageNumber = parseInt( + draggedThumbnail.getAttribute("page-number"), + 10 + ); + this.#lastDraggedOverIndex = startPageNumber - 1; + if (!this.#selectedPages?.has(startPageNumber)) { + this.#pageNumberToRemove = startPageNumber; + this.#selectPage(startPageNumber, true); + } + + for (const selected of this.#selectedPages) { + const thumbnail = this._thumbnails[selected - 1]; + const placeholder = (thumbnail.placeholder = + document.createElement("div")); + placeholder.classList.add("thumbnailImage", "placeholder"); + const { div, image } = thumbnail; + div.classList.add("isDragging"); + placeholder.style.height = getComputedStyle(image).height; + image.after(placeholder); + if (selected !== startPageNumber) { + image.classList.add("hidden"); + continue; + } + if (this.#selectedPages.size === 1) { + image.classList.add("draggingThumbnail"); + this.#draggedContainer = image; + continue; + } + // For multiple selected thumbnails, only the one being dragged is shown + // (with the dragging style), while the others are hidden. + const draggedContainer = (this.#draggedContainer = + document.createElement("div")); + draggedContainer.classList.add( + "draggingThumbnail", + "thumbnailImage", + "multiple" + ); + draggedContainer.style.height = getComputedStyle(image).height; + image.replaceWith(draggedContainer); + image.classList.remove("thumbnailImage"); + draggedContainer.append(image); + draggedContainer.setAttribute( + "data-multiple-count", + this.#selectedPages.size + ); + } + } + + #onStopDragging(isDropping = false) { + const draggedContainer = this.#draggedContainer; + this.#draggedContainer = null; + const lastDraggedOverIndex = this.#lastDraggedOverIndex; + this.#lastDraggedOverIndex = NaN; + this.#dragMarker?.remove(); + this.#dragMarker = null; + this.#dragAC.abort(); + this.#dragAC = null; + + this.container.classList.remove("isDragging"); + for (const selected of this.#selectedPages) { + const thumbnail = this._thumbnails[selected - 1]; + const { div, placeholder, image } = thumbnail; + placeholder.remove(); + image.classList.remove("draggingThumbnail", "hidden"); + div.classList.remove("isDragging"); + } + + if (draggedContainer.classList.contains("multiple")) { + // Restore the dragged image to its thumbnail. + const originalImage = draggedContainer.firstElementChild; + draggedContainer.replaceWith(originalImage); + originalImage.classList.add("thumbnailImage"); + } else { + draggedContainer.style.translate = ""; + } + + const selectedPages = this.#selectedPages; + if ( + !isNaN(lastDraggedOverIndex) && + isDropping && + !( + selectedPages.size === 1 && + (selectedPages.has(lastDraggedOverIndex + 1) || + selectedPages.has(lastDraggedOverIndex + 2)) + ) + ) { + const newIndex = lastDraggedOverIndex + 1; + const pagesToMove = Array.from(selectedPages).sort((a, b) => a - b); + const pagesMapper = this.#pagesMapper; + const currentPageId = pagesMapper.getPageId(this._currentPageNumber); + const newCurrentPageId = pagesMapper.getPageId( + isNaN(this.#pageNumberToRemove) + ? pagesToMove[0] + : this.#pageNumberToRemove + ); + + this.eventBus.dispatch("beforepagesedited", { + source: this, + pagesMapper, + }); + + pagesMapper.movePages(selectedPages, pagesToMove, newIndex); + + this.#updateThumbnails(); + + this._currentPageNumber = pagesMapper.getPageNumber(currentPageId); + this.#computeThumbnailsPosition(); + + selectedPages.clear(); + this.#pageNumberToRemove = NaN; + + const isIdentity = (this.#manageSaveAsButton.disabled = + !this.#pagesMapper.hasBeenAltered()); + if (!isIdentity) { + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper, + index: newIndex, + pagesToMove, + }); + } + + const newCurrentPageNumber = pagesMapper.getPageNumber(newCurrentPageId); + setTimeout(() => { + this.linkService.goToPage(newCurrentPageNumber); + }, 0); + } + + if (!isNaN(this.#pageNumberToRemove)) { + this.#selectPage(this.#pageNumberToRemove, false); + this.#pageNumberToRemove = NaN; + } + } + + #moveDraggedContainer(dx, dy) { + this.#draggedImageOffsetX += dx; + this.#draggedImageOffsetY += dy; + this.#draggedImageX += dx; + this.#draggedImageY += dy; + this.#draggedContainer.style.translate = `${this.#draggedImageOffsetX}px ${this.#draggedImageOffsetY}px`; + if ( + this.#draggedImageY + this.#draggedImageHeight > + this.#currentScrollBottom + ) { + this.scrollableContainer.scrollTop = Math.min( + this.scrollableContainer.scrollTop + PIXELS_TO_SCROLL_WHEN_DRAGGING, + this.scrollableContainer.scrollHeight + ); + } else if (this.#draggedImageY < this.#currentScrollTop) { + this.scrollableContainer.scrollTop = Math.max( + this.scrollableContainer.scrollTop - PIXELS_TO_SCROLL_WHEN_DRAGGING, + 0 + ); + } + + const positionData = this.#findClosestThumbnail( + this.#draggedImageX + this.#draggedImageWidth / 2, + this.#draggedImageY + this.#draggedImageHeight / 2 + ); + if (!positionData) { + return; + } + let dragMarker = this.#dragMarker; + if (!dragMarker) { + dragMarker = this.#dragMarker = document.createElement("div"); + dragMarker.className = "dragMarker"; + this.container.firstChild.before(dragMarker); + } + + const [index, space] = positionData; + const dragMarkerStyle = dragMarker.style; + const { bbox, x: xPos } = this.#thumbnailsPositions; + let x, y, width, height; + if (index < 0) { + if (xPos.length === 1) { + y = bbox[1] - SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT; + x = bbox[4]; + width = bbox[2]; + } else { + y = bbox[1]; + x = bbox[0] - SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT; + height = bbox[3]; + } + } else if (xPos.length === 1) { + y = bbox[index * 4 + 1] + bbox[index * 4 + 3] + space; + x = bbox[index * 4]; + width = bbox[index * 4 + 2]; + } else { + y = bbox[index * 4 + 1]; + x = bbox[index * 4] + bbox[index * 4 + 2] + space; + height = bbox[index * 4 + 3]; + } + dragMarkerStyle.translate = `${x}px ${y}px`; + dragMarkerStyle.width = width ? `${width}px` : ""; + dragMarkerStyle.height = height ? `${height}px` : ""; + } + + #computeThumbnailsPosition() { + // Collect the center of each thumbnail. + // This is used to determine the closest thumbnail when dragging. + // TODO: handle the RTL case. + const positionsX = []; + const positionsY = []; + const positionsLastX = []; + const bbox = new Float32Array(this._thumbnails.length * 4); + let prevX = -Infinity; + let prevY = -Infinity; + let reminder = -1; + let firstRightX; + let lastRightX; + let firstBottomY; + for (let i = 0, ii = this._thumbnails.length; i < ii; i++) { + const { div } = this._thumbnails[i]; + const { + offsetTop: y, + offsetLeft: x, + offsetWidth: w, + offsetHeight: h, + } = div; + if (w === 0) { + // The thumbnail view isn't visible. + return; + } + bbox[i * 4] = x; + bbox[i * 4 + 1] = y; + bbox[i * 4 + 2] = w; + bbox[i * 4 + 3] = h; + if (x > prevX) { + prevX = x + w / 2; + firstRightX ??= prevX + w; + positionsX.push(prevX); + } + if (reminder > 0 && i >= ii - reminder) { + const cx = x + w / 2; + positionsLastX.push(cx); + lastRightX ??= cx + w; + } + if (y > prevY) { + if (reminder === -1 && positionsX.length > 1) { + reminder = ii % positionsX.length; + } + prevY = y + h / 2; + firstBottomY ??= prevY + h; + positionsY.push(prevY); + } + } + const space = + positionsX.length > 1 + ? (positionsX[1] - firstRightX) / 2 + : (positionsY[1] - firstBottomY) / 2; + this.#thumbnailsPositions = { + x: positionsX, + y: positionsY, + lastX: positionsLastX, + space, + lastSpace: (positionsLastX.at(-1) - lastRightX) / 2, + bbox, + }; + } + + #addEventListeners() { + this.eventBus.on("resize", ({ source }) => { + if (source.thumbnailsView === this.container) { + this.#computeThumbnailsPosition(); + } + }); + this.container.addEventListener("keydown", e => { + switch (e.key) { + case "ArrowLeft": + this.#goToNextItem(e.target, false, true); + stopEvent(e); + break; + case "ArrowRight": + this.#goToNextItem(e.target, true, true); + stopEvent(e); + break; + case "ArrowDown": + this.#goToNextItem(e.target, true, false); + stopEvent(e); + break; + case "ArrowUp": + this.#goToNextItem(e.target, false, false); + stopEvent(e); + break; + case "Home": + this._thumbnails[0].image.focus(); + stopEvent(e); + break; + case "End": + this._thumbnails.at(-1).image.focus(); + stopEvent(e); + break; + case "Enter": + case " ": + this.#goToPage(e); + break; + } + }); + this.container.addEventListener("click", e => { + const { target } = e; + if (target instanceof HTMLInputElement) { + const pageNumber = parseInt( + target.parentElement.getAttribute("page-number"), + 10 + ); + this.#selectPage(pageNumber, target.checked); + return; + } + this.#goToPage(e); + }); + this.#addDragListeners(); + } + + #selectPage(pageNumber, checked) { + const set = (this.#selectedPages ??= new Set()); + if (checked) { + set.add(pageNumber); + } else { + set.delete(pageNumber); + } + } + + #addDragListeners() { + if (!this.#enableSplitMerge) { + return; + } + this.container.addEventListener("pointerdown", e => { + const { + target: draggedImage, + clientX: clickX, + clientY: clickY, + pointerId: dragPointerId, + } = e; + if ( + !isNaN(this.#lastDraggedOverIndex) || + !draggedImage.classList.contains("thumbnailImage") + ) { + // We're already handling a drag, or the target is not draggable. + return; + } + + const thumbnail = draggedImage.parentElement; + const pointerDownAC = new AbortController(); + const { signal: pointerDownSignal } = pointerDownAC; + let prevDragX = clickX; + let prevDragY = clickY; + let prevScrollTop = this.scrollableContainer.scrollTop; + + // When dragging, the thumbnail is scaled down. To keep the cursor at the + // same position on the thumbnail, we need to adjust the offset + // accordingly. + const scaleFactor = PDFThumbnailViewer.#getScaleFactor(draggedImage); + this.#draggedImageOffsetX = + ((scaleFactor - 1) * e.layerX + draggedImage.offsetLeft) / scaleFactor; + this.#draggedImageOffsetY = + ((scaleFactor - 1) * e.layerY + draggedImage.offsetTop) / scaleFactor; + + this.#draggedImageX = thumbnail.offsetLeft + this.#draggedImageOffsetX; + this.#draggedImageY = thumbnail.offsetTop + this.#draggedImageOffsetY; + this.#draggedImageWidth = draggedImage.offsetWidth / scaleFactor; + this.#draggedImageHeight = draggedImage.offsetHeight / scaleFactor; + + this.container.addEventListener( + "pointermove", + ev => { + const { clientX: x, clientY: y, pointerId } = ev; + if ( + pointerId !== dragPointerId || + (Math.abs(x - clickX) <= DRAG_THRESHOLD_IN_PIXELS && + Math.abs(y - clickY) <= DRAG_THRESHOLD_IN_PIXELS) + ) { + // Not enough movement to be considered a drag. + return; + } + + if (isNaN(this.#lastDraggedOverIndex)) { + // First movement while dragging. + this.#onStartDragging(thumbnail); + const stopDragging = (_e, isDropping = false) => { + this.#onStopDragging(isDropping); + pointerDownAC.abort(); + }; + const { signal } = this.#dragAC; + window.addEventListener( + "touchmove", + stopEvent /* Prevent the container from scrolling */, + { passive: false, signal } + ); + window.addEventListener("contextmenu", noContextMenu, { signal }); + this.scrollableContainer.addEventListener( + "scrollend", + () => { + const { + scrollableContainer: { clientHeight, scrollTop }, + } = this; + this.#currentScrollTop = scrollTop; + this.#currentScrollBottom = scrollTop + clientHeight; + const dy = scrollTop - prevScrollTop; + prevScrollTop = scrollTop; + this.#moveDraggedContainer(0, dy); + }, + { passive: true, signal } + ); + window.addEventListener( + "pointerup", + upEv => { + if (upEv.pointerId !== dragPointerId) { + return; + } + // Prevent the subsequent click event after pointerup. + window.addEventListener("click", stopEvent, { + capture: true, + once: true, + signal, + }); + stopEvent(upEv); + stopDragging(upEv, /* isDropping = */ true); + }, + { signal } + ); + window.addEventListener("blur", stopDragging, { signal }); + window.addEventListener("pointercancel", stopDragging, { signal }); + window.addEventListener("wheel", stopEvent, { + passive: false, + signal, + }); + } + + const dx = x - prevDragX; + const dy = y - prevDragY; + prevDragX = x; + prevDragY = y; + this.#moveDraggedContainer(dx, dy); + }, + { passive: true, signal: pointerDownSignal } + ); + window.addEventListener( + "pointerup", + ({ pointerId }) => { + if (pointerId !== dragPointerId) { + return; + } + pointerDownAC.abort(); + }, + { signal: pointerDownSignal } + ); + window.addEventListener("dragstart", stopEvent, { + capture: true, + signal: pointerDownSignal, + }); + }); + } + + #goToPage(e) { + const { target } = e; + if (target.classList.contains("thumbnailImage")) { + const pageNumber = parseInt( + target.parentElement.getAttribute("page-number"), + 10 + ); + this.linkService.goToPage(pageNumber); + stopEvent(e); + } + } + + /** + * Go to the next/previous menu item. + * @param {HTMLElement} element + * @param {boolean} forward + * @param {boolean} horizontal + */ + #goToNextItem(element, forward, horizontal) { + let currentPageNumber = parseInt( + element.parentElement.getAttribute("page-number"), + 10 + ); + if (isNaN(currentPageNumber)) { + currentPageNumber = this._currentPageNumber; + } + + const increment = forward ? 1 : -1; + let nextThumbnail; + if (horizontal) { + const nextPageNumber = MathClamp( + currentPageNumber + increment, + 1, + this._thumbnails.length + 1 + ); + nextThumbnail = this._thumbnails[nextPageNumber - 1]; + } else { + const currentThumbnail = this._thumbnails[currentPageNumber - 1]; + const { x: currentX, y: currentY } = + currentThumbnail.div.getBoundingClientRect(); + let firstWithDifferentY; + for ( + let i = currentPageNumber - 1 + increment; + i >= 0 && i < this._thumbnails.length; + i += increment + ) { + const thumbnail = this._thumbnails[i]; + const { x, y } = thumbnail.div.getBoundingClientRect(); + if (!firstWithDifferentY && y !== currentY) { + firstWithDifferentY = thumbnail; + } + if (x === currentX) { + nextThumbnail = thumbnail; + break; + } + } + if (!nextThumbnail) { + nextThumbnail = firstWithDifferentY; + } + } + if (nextThumbnail) { + nextThumbnail.image.focus(); + } + } + + #findClosestThumbnail(x, y) { + if (!this.#thumbnailsPositions) { + this.#computeThumbnailsPosition(); + } + const { + x: positionsX, + y: positionsY, + lastX: positionsLastX, + space: spaceBetweenThumbnails, + lastSpace: lastSpaceBetweenThumbnails, + } = this.#thumbnailsPositions; + const lastDraggedOverIndex = this.#lastDraggedOverIndex; + let xPos = lastDraggedOverIndex % positionsX.length; + let yPos = Math.floor(lastDraggedOverIndex / positionsX.length); + let xArray = yPos === positionsY.length - 1 ? positionsLastX : positionsX; + if ( + positionsY[yPos] <= y && + y < (positionsY[yPos + 1] ?? Infinity) && + xArray[xPos] <= x && + x < (xArray[xPos + 1] ?? Infinity) + ) { + // Fast-path: we're still in the same thumbnail. + return null; + } + + yPos = binarySearchFirstItem(positionsY, cy => y < cy) - 1; + xArray = + yPos === positionsY.length - 1 && positionsLastX.length > 0 + ? positionsLastX + : positionsX; + xPos = Math.max(0, binarySearchFirstItem(xArray, cx => x < cx) - 1); + if (yPos < 0) { + if (xPos <= 0) { + xPos = -1; + } + yPos = 0; + } + const index = MathClamp( + yPos * positionsX.length + xPos, + -1, + this._thumbnails.length - 1 + ); + if (index === lastDraggedOverIndex) { + // No change. + return null; + } + this.#lastDraggedOverIndex = index; + const space = + yPos === positionsY.length - 1 && positionsLastX.length > 0 && xPos >= 0 + ? lastSpaceBetweenThumbnails + : spaceBetweenThumbnails; + + return [index, space]; + } } export { PDFThumbnailViewer }; diff --git a/web/pdf_viewer.css b/web/pdf_viewer.css index 7ced088491472..fbc9187b6f99b 100644 --- a/web/pdf_viewer.css +++ b/web/pdf_viewer.css @@ -17,9 +17,13 @@ @import url(text_layer_builder.css); @import url(annotation_layer_builder.css); @import url(xfa_layer_builder.css); -/* Ignored in GECKOVIEW builds: */ +/* Ignored in GECKOVIEW: begin */ @import url(annotation_editor_layer_builder.css); +@import url(menu.css); +@import url(tree.css); +@import url(views_manager.css); @import url(sidebar.css); +/* Ignored in GECKOVIEW: end */ :root { color-scheme: light dark; @@ -99,6 +103,10 @@ .structTree { contain: strict; } + + &.detailView { + image-rendering: pixelated; + } } } } diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index 4241804476dfc..70943ad47669b 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -33,6 +33,7 @@ import { AnnotationEditorUIManager, AnnotationMode, MathClamp, + PagesMapper, PermissionFlag, PixelsPerInch, shadow, @@ -288,6 +289,8 @@ class PDFViewer { #viewerAlert = null; + #pagesMapper = PagesMapper.instance; + /** * @param {PDFViewerOptions} options */ @@ -299,6 +302,10 @@ class PDFViewer { `The API version "${version}" does not match the Viewer version "${viewerVersion}".` ); } + if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) { + this.pagesMapper = PagesMapper.instance; + } + this.container = options.container; this.viewer = options.viewer || options.container.firstElementChild; this.#viewerAlert = options.viewerAlert || null; @@ -876,6 +883,7 @@ class PDFViewer { this.#annotationEditorMode = AnnotationEditorType.NONE; this.#printingAllowed = true; + this.#pagesMapper.pagesNumber = 0; } this.pdfDocument = pdfDocument; @@ -1057,6 +1065,7 @@ class PDFViewer { enableHWA: this.#enableHWA, enableAutoLinking: this.#enableAutoLinking, minDurationToUpdateCanvas: this.#minDurationToUpdateCanvas, + commentManager: this.#commentManager, }); this._pages.push(pageView); } @@ -1072,6 +1081,20 @@ class PDFViewer { this._updateSpreadMode(); } + eventBus._on( + "annotationeditorlayerrendered", + evt => { + if (this.#annotationEditorUIManager) { + // Ensure that the Editor buttons, in the toolbar, are updated. + eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode: this.#annotationEditorMode, + }); + } + }, + { once: true, signal } + ); + // Fetch all the pages since the viewport is needed before printing // starts to create the correct size canvas. Wait until one page is // rendered so we don't tie up too many resources early on. @@ -1090,14 +1113,6 @@ class PDFViewer { ); } - if (this.#annotationEditorUIManager) { - // Ensure that the Editor buttons, in the toolbar, are updated. - eventBus.dispatch("annotationeditormodechanged", { - source: this, - mode: this.#annotationEditorMode, - }); - } - // In addition to 'disableAutoFetch' being set, also attempt to reduce // resource usage when loading *very* long/large documents. if ( @@ -1164,6 +1179,42 @@ class PDFViewer { }); } + async onBeforePagesEdited({ pagesMapper }) { + await this._pagesCapability.promise; + this._currentPageId = pagesMapper.getPageId(this._currentPageNumber); + } + + onPagesEdited({ pagesMapper }) { + this._currentPageNumber = pagesMapper.getPageNumber(this._currentPageId); + const prevPages = this._pages; + const newPages = (this._pages = []); + for (let i = 0, ii = pagesMapper.pagesNumber; i < ii; i++) { + const prevPageNumber = pagesMapper.getPrevPageNumber(i + 1) - 1; + if (prevPageNumber === -1) { + continue; + } + const page = prevPages[prevPageNumber]; + newPages[i] = page; + page.updatePageNumber(i + 1); + } + + const viewerElement = + this._scrollMode === ScrollMode.PAGE ? null : this.viewer; + if (viewerElement) { + viewerElement.replaceChildren(); + const fragment = document.createDocumentFragment(); + for (let i = 0, ii = pagesMapper.pagesNumber; i < ii; i++) { + const { div } = newPages[i]; + div.setAttribute("data-page-number", i + 1); + fragment.append(div); + } + viewerElement.append(fragment); + } + setTimeout(() => { + this.forceRendering(); + }); + } + /** * @param {Array|null} labels */ @@ -1554,6 +1605,9 @@ class PDFViewer { * The default value is `false`. * @property {boolean} [ignoreDestinationZoom] - Ignore the zoom argument in * the destination array. The default value is `false`. + * @property {string} [center] - Center the view on the specified coordinates. + * The default value is `null`. Possible values are: `null` (don't center), + * `horizontal`, `vertical` and `both`. */ /** @@ -1565,6 +1619,7 @@ class PDFViewer { destArray = null, allowNegativeOffset = false, ignoreDestinationZoom = false, + center = null, }) { if (!this.pdfDocument) { return; @@ -1687,7 +1742,20 @@ class PDFViewer { let left = Math.min(boundingRect[0][0], boundingRect[1][0]); let top = Math.min(boundingRect[0][1], boundingRect[1][1]); - if (!allowNegativeOffset) { + if (center) { + if (center === "both" || center === "vertical") { + top -= + (this.container.clientHeight - + Math.abs(boundingRect[1][1] - boundingRect[0][1])) / + 2; + } + if (center === "both" || center === "horizontal") { + left -= + (this.container.clientWidth - + Math.abs(boundingRect[1][0] - boundingRect[0][0])) / + 2; + } + } else if (!allowNegativeOffset) { // Some bad PDF generators will create destinations with e.g. top values // that exceeds the page height. Ensure that offsets are not negative, // to prevent a previous page from becoming visible (fixes bug 874482). @@ -1756,20 +1824,20 @@ class PDFViewer { this._spreadMode === SpreadMode.NONE && (this._scrollMode === ScrollMode.PAGE || this._scrollMode === ScrollMode.VERTICAL); - const currentId = this._currentPageNumber; + const currentPageNumber = this._currentPageNumber; let stillFullyVisible = false; for (const page of visiblePages) { if (page.percent < 100) { break; } - if (page.id === currentId && isSimpleLayout) { + if (page.id === currentPageNumber && isSimpleLayout) { stillFullyVisible = true; break; } } this._setCurrentPageNumber( - stillFullyVisible ? currentId : visiblePages[0].id + stillFullyVisible ? this._currentPageNumber : visiblePages[0].id ); this._updateLocation(visible.first); @@ -2477,6 +2545,7 @@ class PDFViewer { await this.#annotationEditorUIManager.updateMode( mode, editId, + /* isFromUser = */ true, isFromKeyboard, mustEnterInEditMode, editComment @@ -2502,6 +2571,8 @@ class PDFViewer { if (!isEditing) { this.pdfDocument.annotationStorage.resetModifiedIds(); } + // We need to cleanup whatever pages being rendered. + this.cleanup(); for (const pageView of this._pages) { pageView.toggleEditingMode(isEditing); } diff --git a/web/pdfjs.js b/web/pdfjs.js index 4898002fe7091..f85e5bcede613 100644 --- a/web/pdfjs.js +++ b/web/pdfjs.js @@ -22,13 +22,16 @@ const { AnnotationLayer, AnnotationMode, AnnotationType, + applyOpacity, build, ColorPicker, createValidAbsoluteUrl, + CSSConstants, DOMSVGFactory, DrawLayer, FeatureTest, fetchData, + findContrastColor, getDocument, getFilenameFromUrl, getPdfFilenameFromUrl, @@ -46,6 +49,7 @@ const { normalizeUnicode, OPS, OutputScale, + PagesMapper, PasswordResponses, PDFDataRangeTransport, PDFDateString, @@ -53,6 +57,7 @@ const { PermissionFlag, PixelsPerInch, RenderingCancelledException, + renderRichText, ResponseException, setLayerDimensions, shadow, @@ -77,13 +82,16 @@ export { AnnotationLayer, AnnotationMode, AnnotationType, + applyOpacity, build, ColorPicker, createValidAbsoluteUrl, + CSSConstants, DOMSVGFactory, DrawLayer, FeatureTest, fetchData, + findContrastColor, getDocument, getFilenameFromUrl, getPdfFilenameFromUrl, @@ -101,6 +109,7 @@ export { normalizeUnicode, OPS, OutputScale, + PagesMapper, PasswordResponses, PDFDataRangeTransport, PDFDateString, @@ -108,6 +117,7 @@ export { PermissionFlag, PixelsPerInch, RenderingCancelledException, + renderRichText, ResponseException, setLayerDimensions, shadow, diff --git a/web/preferences.js b/web/preferences.js index f290ed9d77fa1..1978be96af330 100644 --- a/web/preferences.js +++ b/web/preferences.js @@ -22,9 +22,7 @@ import { AppOptions, OptionKind } from "./app_options.js"; */ class BasePreferences { #defaults = Object.freeze( - typeof PDFJSDev === "undefined" - ? AppOptions.getAll(OptionKind.PREFERENCE, /* defaultOnly = */ true) - : PDFJSDev.eval("DEFAULT_PREFERENCES") + AppOptions.getAll(OptionKind.PREFERENCE, /* defaultOnly = */ true) ); #initializedPromise = null; @@ -37,14 +35,6 @@ class BasePreferences { throw new Error("Cannot initialize BasePreferences."); } - if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("CHROME")) { - Object.defineProperty(this, "defaults", { - get() { - return this.#defaults; - }, - }); - } - this.#initializedPromise = this._readFromStorage(this.#defaults).then( ({ browserPrefs, prefs }) => { if ( @@ -135,6 +125,10 @@ class BasePreferences { return AppOptions.get(name); } + get defaults() { + return this.#defaults; + } + get initializedPromise() { return this.#initializedPromise; } diff --git a/web/sidebar.css b/web/sidebar.css index 2091e0c22dab9..2a29beb63e75d 100644 --- a/web/sidebar.css +++ b/web/sidebar.css @@ -22,16 +22,67 @@ --sidebar-box-shadow: 0 0.25px 0.75px light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 2px 6px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --sidebar-backdrop-filter: none; + --sidebar-border-radius: 8px; + --sidebar-padding: 5px; + --sidebar-min-width: 180px; + --sidebar-max-width: 632px; + --sidebar-width: 239px; + --resizer-width: 4px; + --resizer-hover-bg-color: light-dark(#0062fa, #00cadb); @media screen and (forced-colors: active) { --sidebar-bg-color: Canvas; --sidebar-border-color: CanvasText; --sidebar-box-shadow: none; + --resizer-hover-bg-color: CanvasText; } - border-radius: 8px; + border-radius: var(--sidebar-border-radius); box-shadow: var(--sidebar-box-shadow); border: 1px solid var(--sidebar-border-color); background-color: var(--sidebar-bg-color); inset-block-start: calc(100% + var(--doorhanger-height) - 2px); + padding-block: var(--sidebar-padding); + width: var(--sidebar-width); + min-width: var(--sidebar-min-width); + max-width: var(--sidebar-max-width); + backdrop-filter: var(--sidebar-backdrop-filter); + box-sizing: border-box; + + .sidebarResizer { + width: var(--resizer-width); + background-color: transparent; + forced-color-adjust: none; + cursor: ew-resize; + position: absolute; + inset-block: calc(var(--sidebar-padding) + var(--sidebar-border-radius)); + inset-inline-start: calc(0px - var(--resizer-width) / 2); + transition: background-color 0.5s ease-in-out; + box-sizing: border-box; + border: 1px solid transparent; + border-block-width: 0; + background-clip: content-box; + + &:hover { + background-color: var(--resizer-hover-bg-color); + } + &:focus-visible { + background-color: var(--resizer-hover-bg-color); + outline: none; + } + } + + &.resizing { + cursor: ew-resize; + user-select: none; + + :not(.sidebarResizer) { + pointer-events: none; + } + + .sidebarResizer { + background-color: var(--resizer-hover-bg-color); + } + } } diff --git a/web/sidebar.js b/web/sidebar.js new file mode 100644 index 0000000000000..e4e5606305c52 --- /dev/null +++ b/web/sidebar.js @@ -0,0 +1,219 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { noContextMenu, stopEvent } from "pdfjs-lib"; + +// Timeout before ending resize operation. +const RESIZE_TIMEOUT = 400; // ms + +/** + * Viewer control to display a sidebar with resizer functionality. + */ +class Sidebar { + #initialWidth = 0; + + #width = 0; + + #coefficient; + + #resizeTimeout = null; + + #resizer; + + #isResizerOnTheLeft; + + #isKeyboardResizing = false; + + #resizeObserver; + + #prevX = 0; + + /** + * @typedef {Object} SidebarElements + * @property {HTMLElement} sidebar - The sidebar element. + * @property {HTMLElement} resizer - The sidebar resizer element. + * @property {HTMLElement} toggleButton - The button used to toggle the + * sidebar. + */ + + /** + * Create a sidebar with resizer functionality. + * @param {SidebarElements} sidebarElements + * @param {boolean} ltr + * @param {boolean} isResizerOnTheLeft + */ + constructor({ sidebar, resizer, toggleButton }, ltr, isResizerOnTheLeft) { + this._sidebar = sidebar; + this.#coefficient = ltr === isResizerOnTheLeft ? -1 : 1; + this.#resizer = resizer; + this.#isResizerOnTheLeft = isResizerOnTheLeft; + + const style = window.getComputedStyle(sidebar); + this.#initialWidth = this.#width = parseFloat( + style.getPropertyValue("--sidebar-width") + ); + resizer.ariaValueMin = + parseFloat(style.getPropertyValue("--sidebar-min-width")) || 0; + resizer.ariaValueMax = + parseFloat(style.getPropertyValue("--sidebar-max-width")) || Infinity; + resizer.ariaValueNow = this.#width; + + this.#makeSidebarResizable(); + toggleButton.addEventListener("click", this.toggle.bind(this)); + this._isOpen = false; + sidebar.hidden = true; + + this.#resizeObserver = new ResizeObserver( + ([ + { + borderBoxSize: [{ inlineSize }], + }, + ]) => { + if (!isNaN(this.#prevX)) { + this.#prevX += this.#coefficient * (inlineSize - this.#width); + } + this.#setWidth(inlineSize); + } + ); + this.#resizeObserver.observe(sidebar); + } + + #makeSidebarResizable() { + const sidebarStyle = this._sidebar.style; + let pointerMoveAC; + const cancelResize = () => { + this.#resizeTimeout = null; + this._sidebar.classList.remove("resizing"); + pointerMoveAC?.abort(); + pointerMoveAC = null; + this.#isKeyboardResizing = false; + this.onStopResizing(); + this.#prevX = NaN; + }; + this.#resizer.addEventListener("pointerdown", e => { + if (pointerMoveAC) { + cancelResize(); + return; + } + this.onStartResizing(); + const { clientX } = e; + stopEvent(e); + this.#prevX = clientX; + pointerMoveAC = new AbortController(); + const { signal } = pointerMoveAC; + const sidebar = this._sidebar; + sidebar.classList.add("resizing"); + const parentStyle = sidebar.parentElement.style; + parentStyle.minWidth = 0; + window.addEventListener("contextmenu", noContextMenu, { signal }); + window.addEventListener( + "pointermove", + ev => { + if (!pointerMoveAC || Math.abs(ev.clientX - this.#prevX) < 1) { + return; + } + stopEvent(ev); + sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * (ev.clientX - this.#prevX))}px`; + }, + { signal, capture: true } + ); + window.addEventListener("blur", cancelResize, { signal }); + window.addEventListener( + "pointerup", + ev => { + if (pointerMoveAC) { + cancelResize(); + stopEvent(ev); + } + }, + { signal } + ); + }); + this.#resizer.addEventListener("keydown", e => { + const { key } = e; + const isArrowLeft = key === "ArrowLeft"; + if (isArrowLeft || key === "ArrowRight") { + if (!this.#isKeyboardResizing) { + this._sidebar.classList.add("resizing"); + this.#isKeyboardResizing = true; + this.onStartResizing(); + } + + const base = e.ctrlKey || e.metaKey ? 10 : 1; + const dx = base * (isArrowLeft ? -1 : 1); + clearTimeout(this.#resizeTimeout); + this.#resizeTimeout = setTimeout(cancelResize, RESIZE_TIMEOUT); + sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * dx)}px`; + stopEvent(e); + } + }); + } + + #setWidth(newWidth) { + this.#width = newWidth; + this.#resizer.ariaValueNow = Math.round(newWidth); + if (this.#isResizerOnTheLeft) { + this._sidebar.parentElement.style.insetInlineStart = `${(this.#initialWidth - newWidth).toFixed(3)}px`; + } + this.onResizing(newWidth); + } + + /** + * Get the current width of the sidebar in pixels. + * @returns {number} + */ + get width() { + return this.#width; + } + + /** + * Set the width of the sidebar in pixels. + * @param {number} newWidth + */ + set width(newWidth) { + this._sidebar.style.width = `${newWidth}px`; + } + + /** + * Callback to be executed when the user starts resizing the sidebar. + */ + onStartResizing() {} + + /** + * Callback to be executed when the user stops resizing the sidebar. + */ + onStopResizing() {} + + /** + * Callback to be executed when the sidebar is being resized. + * @param {number} newWidth - The new width of the sidebar in pixels. + */ + onResizing(_newWidth) {} + + /** + * Toggle the sidebar's visibility. + * @param {boolean} [visibility] - The visibility state to set. + */ + toggle(visibility = !this._isOpen) { + this._sidebar.hidden = !(this._isOpen = visibility); + } + + destroy() { + this.#resizeObserver?.disconnect(); + this.#resizeObserver = null; + } +} + +export { Sidebar }; diff --git a/web/struct_tree_layer_builder.js b/web/struct_tree_layer_builder.js index dbc9d7ee48100..8f561eac5d319 100644 --- a/web/struct_tree_layer_builder.js +++ b/web/struct_tree_layer_builder.js @@ -15,6 +15,7 @@ /** @typedef {import("../src/display/api").PDFPageProxy} PDFPageProxy */ +import { FeatureTest, shadow } from "pdfjs-lib"; import { removeNullCharacters } from "./ui_utils.js"; const PDF_ROLE_TO_HTML_ROLE = { @@ -73,6 +74,95 @@ const PDF_ROLE_TO_HTML_ROLE = { Artifact: null, }; +const MathMLElements = new Set([ + "math", + "merror", + "mfrac", + "mi", + "mmultiscripts", + "mn", + "mo", + "mover", + "mpadded", + "mprescripts", + "mroot", + "mrow", + "ms", + "mspace", + "msqrt", + "mstyle", + "msub", + "msubsup", + "msup", + "mtable", + "mtd", + "mtext", + "mtr", + "munder", + "munderover", + "semantics", +]); +const MathMLNamespace = "http://www.w3.org/1998/Math/MathML"; + +class MathMLSanitizer { + static get sanitizer() { + // From https://w3c.github.io/mathml-docs/mathml-safe-list. + + return shadow( + this, + "sanitizer", + FeatureTest.isSanitizerSupported + ? // eslint-disable-next-line no-undef + new Sanitizer({ + elements: [...MathMLElements].map(name => ({ + name, + namespace: MathMLNamespace, + })), + replaceWithChildrenElements: [ + { + name: "maction", + namespace: MathMLNamespace, + }, + ], + attributes: [ + "dir", + "displaystyle", + "mathbackground", + "mathcolor", + "mathsize", + "scriptlevel", + "encoding", + "display", + "linethickness", + "intent", + "arg", + "form", + "fence", + "separator", + "lspace", + "rspace", + "stretchy", + "symmetric", + "maxsize", + "minsize", + "largeop", + "movablelimits", + "width", + "height", + "depth", + "voffset", + "accent", + "accentunder", + "columnspan", + "rowspan", + ], + comments: false, + }) + : null + ); + } +} + const HEADING_PATTERN = /^H(\d+)$/; /** @@ -94,6 +184,10 @@ class StructTreeLayerBuilder { #elementsToAddToTextLayer = null; + #elementsToHideInTextLayer = null; + + #elementsToStealFromTextLayer = null; + /** * @param {StructTreeLayerBuilderOptions} options */ @@ -214,15 +308,49 @@ class StructTreeLayerBuilder { return true; } - addElementsToTextLayer() { - if (!this.#elementsToAddToTextLayer) { - return; + updateTextLayer() { + if (this.#elementsToAddToTextLayer) { + for (const [id, img] of this.#elementsToAddToTextLayer) { + document.getElementById(id)?.append(img); + } + this.#elementsToAddToTextLayer.clear(); + this.#elementsToAddToTextLayer = null; } - for (const [id, img] of this.#elementsToAddToTextLayer) { - document.getElementById(id)?.append(img); + if (this.#elementsToHideInTextLayer) { + for (const id of this.#elementsToHideInTextLayer) { + const elem = document.getElementById(id); + if (elem) { + elem.ariaHidden = true; + } + } + this.#elementsToHideInTextLayer.length = 0; + this.#elementsToHideInTextLayer = null; + } + if (this.#elementsToStealFromTextLayer) { + for ( + let i = 0, ii = this.#elementsToStealFromTextLayer.length; + i < ii; + i += 2 + ) { + const element = this.#elementsToStealFromTextLayer[i]; + const ids = this.#elementsToStealFromTextLayer[i + 1]; + let textContent = ""; + for (const id of ids) { + const elem = document.getElementById(id); + if (elem) { + textContent += elem.textContent.trim() || ""; + // Aria-hide the element in order to avoid duplicate reading of the + // math content by screen readers. + elem.ariaHidden = "true"; + } + } + if (textContent) { + element.textContent = textContent; + } + } + this.#elementsToStealFromTextLayer.length = 0; + this.#elementsToStealFromTextLayer = null; } - this.#elementsToAddToTextLayer.clear(); - this.#elementsToAddToTextLayer = null; } #walk(node) { @@ -230,9 +358,21 @@ class StructTreeLayerBuilder { return null; } - const element = document.createElement("span"); + let element; if ("role" in node) { const { role } = node; + if (MathMLElements.has(role)) { + element = document.createElementNS(MathMLNamespace, role); + const ids = []; + (this.#elementsToStealFromTextLayer ||= []).push(element, ids); + for (const { type, id } of node.children || []) { + if (type === "content" && id) { + ids.push(id); + } + } + } else { + element = document.createElement("span"); + } const match = role.match(HEADING_PATTERN); if (match) { element.setAttribute("role", "heading"); @@ -243,8 +383,38 @@ class StructTreeLayerBuilder { if (role === "Figure" && this.#addImageInTextLayer(node, element)) { return element; } + if (role === "Formula") { + if (node.mathML && MathMLSanitizer.sanitizer) { + element.setHTML(node.mathML, { + sanitizer: MathMLSanitizer.sanitizer, + }); + // Hide all the corresponding content elements in the text layer in + // order to avoid screen readers reading both the MathML and the + // text content. + for (const { id } of node.children || []) { + if (!id) { + continue; + } + (this.#elementsToHideInTextLayer ||= []).push(id); + } + // For now, we don't want to keep the alt text if there's valid + // MathML (see https://github.com/w3c/mathml-aam/issues/37). + // TODO: Revisit this decision in the future. + delete node.alt; + } + if ( + !node.mathML && + node.children.length === 1 && + node.children[0].role !== "math" + ) { + element = document.createElementNS(MathMLNamespace, "math"); + delete node.alt; + } + } } + element ||= document.createElement("span"); + this.#setAttributes(node, element); if (node.children) { diff --git a/web/stubs-geckoview.js b/web/stubs-geckoview.js index eabba37d208cd..daf7d94ffbf0b 100644 --- a/web/stubs-geckoview.js +++ b/web/stubs-geckoview.js @@ -24,10 +24,10 @@ const PDFFindBar = null; const PDFLayerViewer = null; const PDFOutlineViewer = null; const PDFPresentationMode = null; -const PDFSidebar = null; const PDFThumbnailViewer = null; const SecondaryToolbar = null; const SignatureManager = null; +const ViewsManager = null; export { AltTextManager, @@ -41,8 +41,8 @@ export { PDFLayerViewer, PDFOutlineViewer, PDFPresentationMode, - PDFSidebar, PDFThumbnailViewer, SecondaryToolbar, SignatureManager, + ViewsManager, }; diff --git a/web/text_accessibility.js b/web/text_accessibility.js index e9178baad9579..001493a80124e 100644 --- a/web/text_accessibility.js +++ b/web/text_accessibility.js @@ -238,14 +238,10 @@ class TextAccessibilityManager { return id; } - const elementToCompare = contentElement || element; const index = binarySearchFirstItem( children, node => - TextAccessibilityManager.#compareElementPositions( - elementToCompare, - node - ) < 0 + TextAccessibilityManager.#compareElementPositions(element, node) < 0 ); if (index === 0) { diff --git a/web/text_layer_builder.css b/web/text_layer_builder.css index 8dbac995cbe35..a2eb5ad667c19 100644 --- a/web/text_layer_builder.css +++ b/web/text_layer_builder.css @@ -14,6 +14,8 @@ */ .textLayer { + color-scheme: only light; + position: absolute; text-align: initial; inset: 0; @@ -38,19 +40,30 @@ transform-origin: 0% 0%; } + /* We multiply the font size by --min-font-size, and then scale the text + * elements by 1/--min-font-size. This allows us to effectively ignore the + * minimum font size enforced by the browser, so that the text layer s + * can always match the size of the text in the canvas. */ + --min-font-size: 1; + --text-scale-factor: calc(var(--total-scale-factor) * var(--min-font-size)); + --min-font-size-inv: calc(1 / var(--min-font-size)); + > :not(.markedContent), .markedContent span:not(.markedContent) { z-index: 1; + + --font-height: 0; /* set by text_layer.js */ + font-size: calc(var(--text-scale-factor) * var(--font-height)); + + --scale-x: 1; + --rotate: 0deg; + transform: rotate(var(--rotate)) scaleX(var(--scale-x)) + scale(var(--min-font-size-inv)); } - /* Only necessary in Google Chrome, see issue 14205, and most unfortunately - * the problem doesn't show up in "text" reference tests. */ - /*#if !MOZCENTRAL*/ - span.markedContent { - top: 0; - height: 0; + .markedContent { + display: contents; } - /*#endif*/ span[role="img"] { user-select: none; diff --git a/web/text_layer_builder.js b/web/text_layer_builder.js index cee7e0bab9cd8..184c244a3d90a 100644 --- a/web/text_layer_builder.js +++ b/web/text_layer_builder.js @@ -321,6 +321,7 @@ class TextLayerBuilder { if (endDiv) { endDiv.style.width = parentTextLayer.style.width; endDiv.style.height = parentTextLayer.style.height; + endDiv.style.userSelect = "text"; anchor.parentElement.insertBefore( endDiv, modifyStart ? anchor : anchor.nextSibling diff --git a/web/toggle_button.css b/web/toggle_button.css index 3b903769e977e..0b2de6442e7e3 100644 --- a/web/toggle_button.css +++ b/web/toggle_button.css @@ -26,6 +26,7 @@ --border-color-interactive: light-dark(#8f8f9d, #f9f9fa); --border-color-interactive-hover: var(--border-color-interactive); --border-color-interactive-active: var(--border-color-interactive); + --focus-outline-offset: 2px; @media (forced-colors: active) { --color-accent-primary: ButtonText; diff --git a/web/tree.css b/web/tree.css new file mode 100644 index 0000000000000..2dd628dc4b76e --- /dev/null +++ b/web/tree.css @@ -0,0 +1,126 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.treeView { + --treeitem-color: light-dark(rgb(0 0 0 / 0.8), rgb(255 255 255 / 0.8)); + --treeitem-bg-color: light-dark(rgb(0 0 0 / 0.15), rgb(255 255 255 / 0.15)); + --treeitem-hover-color: light-dark(rgb(0 0 0 / 0.9), rgb(255 255 255 / 0.9)); + --treeitem-selected-color: light-dark( + rgb(0 0 0 / 0.9), + rgb(255 255 255 / 0.9) + ); + --treeitem-selected-bg-color: light-dark( + rgb(0 0 0 / 0.25), + rgb(255 255 255 / 0.25) + ); + --treeitem-expanded-icon: url(images/treeitem-expanded.svg); + --treeitem-collapsed-icon: url(images/treeitem-collapsed.svg); + + &.withNesting { + .treeItemToggler { + &::before { + /* All matching images have a size of 16x16 + * All relevant containers have a size of 28x28 */ + position: absolute; + display: inline-block; + width: 16px; + height: 16px; + inset-inline-end: 4px; + + content: ""; + background-color: var(--toolbar-icon-bg-color); + mask-image: var(--treeitem-expanded-icon); + mask-size: cover; + } + + position: relative; + float: var(--inline-start); + height: 0; + width: 0; + color: rgb(255 255 255 / 0.5); + + &.treeItemsHidden { + &::before { + mask-image: var(--treeitem-collapsed-icon); + transform: scaleX(var(--dir-factor)); + } + + ~ .treeItems { + display: none; + } + } + + &:hover + a, + &:hover ~ .treeItems { + background-color: var(--treeitem-bg-color); + background-clip: padding-box; + border-radius: 2px; + color: var(--treeitem-hover-color); + } + } + + > .treeItem, + .treeItem > .treeItems { + margin-inline-start: 20px; + } + } + + &#layersView .treeItem > a { + * { + cursor: pointer; + } + + > label { + display: flex; + align-items: center; + padding-inline-start: 4px; + > input { + margin-top: 1px; + } + } + } + + .treeItem { + > a { + text-decoration: none; + display: inline-block; + /* Subtract the right padding (left, in RTL mode) of the container: */ + min-width: calc(100% - 4px); + height: auto; + margin-bottom: 1px; + padding: 2px 0 5px; + padding-inline-start: 4px; + border-radius: 2px; + color: var(--treeitem-color); + font-size: 13px; + line-height: 15px; + user-select: none; + white-space: normal; + cursor: default; + + &:hover { + background-color: var(--treeitem-bg-color); + background-clip: padding-box; + border-radius: 2px; + color: var(--treeitem-hover-color); + } + } + + &.selected > a { + background-color: var(--treeitem-selected-bg-color); + color: var(--treeitem-selected-color); + } + } +} diff --git a/web/ui_utils.js b/web/ui_utils.js index ac4bcf17b1b91..a4199e611a73b 100644 --- a/web/ui_utils.js +++ b/web/ui_utils.js @@ -709,7 +709,7 @@ class ProgressBar { } set percent(val) { - this.#percent = MathClamp(val, 0, 100); + this.#percent = val; if (isNaN(val)) { this.#classList.add("indeterminate"); @@ -850,6 +850,13 @@ function toggleCheckedBtn(button, toggle, view = null) { view?.classList.toggle("hidden", !toggle); } +function toggleSelectedBtn(button, toggle, view = null) { + button.classList.toggle("selected", toggle); + button.setAttribute("aria-selected", toggle); + + view?.classList.toggle("hidden", !toggle); +} + function toggleExpandedBtn(button, toggle, view = null) { button.classList.toggle("toggled", toggle); button.setAttribute("aria-expanded", toggle); @@ -916,6 +923,7 @@ export { TextLayerMode, toggleCheckedBtn, toggleExpandedBtn, + toggleSelectedBtn, UNKNOWN_SCALE, VERTICAL_PADDING, watchScroll, diff --git a/web/viewer-geckoview.css b/web/viewer-geckoview.css index 398f3151fff80..c904a27df06a5 100644 --- a/web/viewer-geckoview.css +++ b/web/viewer-geckoview.css @@ -16,12 +16,6 @@ @import url(pdf_viewer.css); :root { - --dir-factor: 1; - --scale-select-width: 140px; - - --toolbar-icon-opacity: 1; - --doorhanger-icon-opacity: 0.9; - --main-color: light-dark(rgb(12 12 13), rgb(249 249 250)); --body-bg-color: light-dark(rgb(212 212 215), rgb(42 42 46)); --scrollbar-color: light-dark(auto, rgb(121 121 123)); @@ -46,10 +40,6 @@ --toolbarButton-download-icon: url(images/gv-toolbarButton-download.svg); } -:root:dir(rtl) { - --dir-factor: -1; -} - @media screen and (forced-colors: active) { :root { --dialog-button-border: 1px solid Highlight; diff --git a/web/viewer-geckoview.html b/web/viewer-geckoview.html index 7bd679b619c78..315a3df0f246d 100644 --- a/web/viewer-geckoview.html +++ b/web/viewer-geckoview.html @@ -1,4 +1,4 @@ - + - - + + PDF.js viewer - - - + + + - - - - - - + + + + + + - - - + + + - + - - - - + + +
-
-
+
+
@@ -119,16 +117,21 @@
- +
- - + +
-
- -
+
+ +
+
diff --git a/web/viewer-snippet-chrome-extension.html b/web/viewer-snippet-chrome-extension.html index 5c8b404c8c1b4..3187cd49577ea 100644 --- a/web/viewer-snippet-chrome-extension.html +++ b/web/viewer-snippet-chrome-extension.html @@ -1,4 +1,4 @@ - - + + diff --git a/web/viewer-snippet-chrome-overlays.html b/web/viewer-snippet-chrome-overlays.html index 1089963d1a76f..fff0eb2f32786 100644 --- a/web/viewer-snippet-chrome-overlays.html +++ b/web/viewer-snippet-chrome-overlays.html @@ -4,7 +4,9 @@ users with recognizing which checkbox they have to click when they visit chrome://extensions. --> -

- Click on - "Allow access to file URLs" - at + word-break: break-all; + " + > + Click on "Allow access to file URLs" at chrome://extensions -
+
to view this PDF file.

or select the file again: - +

diff --git a/web/viewer-snippet.html b/web/viewer-snippet.html index 3baf94773bfd4..15d0d71a47450 100644 --- a/web/viewer-snippet.html +++ b/web/viewer-snippet.html @@ -1,3 +1,3 @@ - + diff --git a/web/viewer.css b/web/viewer.css index 336dcc6e2d52b..d77e44be672e8 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -90,11 +90,6 @@ rgb(255 255 255 / 0.25), rgb(255 255 255 / 0.25) ); - --thumbnail-hover-color: light-dark(rgb(0 0 0 / 0.1), rgb(255 255 255 / 0.1)); - --thumbnail-selected-color: light-dark( - rgb(0 0 0 / 0.2), - rgb(255 255 255 / 0.2) - ); --doorhanger-bg-color: light-dark(rgb(255 255 255), #42414d); --doorhanger-border-color: light-dark(rgb(12 12 13 / 0.2), rgb(39 39 43)); --doorhanger-hover-color: light-dark(rgb(12 12 13), rgb(249 249 250)); @@ -107,8 +102,6 @@ ); --loading-icon: url(images/loading.svg); - --treeitem-expanded-icon: url(images/treeitem-expanded.svg); - --treeitem-collapsed-icon: url(images/treeitem-collapsed.svg); --toolbarButton-editorComment-icon: url(images/comment-editButton.svg); --toolbarButton-editorFreeText-icon: url(images/toolbarButton-editorFreeText.svg); --toolbarButton-editorHighlight-icon: url(images/toolbarButton-editorHighlight.svg); @@ -116,7 +109,7 @@ --toolbarButton-editorStamp-icon: url(images/toolbarButton-editorStamp.svg); --toolbarButton-editorSignature-icon: url(images/toolbarButton-editorSignature.svg); --toolbarButton-menuArrow-icon: url(images/toolbarButton-menuArrow.svg); - --toolbarButton-sidebarToggle-icon: url(images/toolbarButton-sidebarToggle.svg); + --toolbarButton-viewsManagerToggle-icon: url(images/toolbarButton-viewsManagerToggle.svg); --toolbarButton-secondaryToolbarToggle-icon: url(images/toolbarButton-secondaryToolbarToggle.svg); --toolbarButton-pageUp-icon: url(images/toolbarButton-pageUp.svg); --toolbarButton-pageDown-icon: url(images/toolbarButton-pageDown.svg); @@ -292,29 +285,6 @@ body { margin: 0; } -#sidebarContainer { - position: absolute; - inset-block: var(--toolbar-height) 0; - inset-inline-start: calc(-1 * var(--sidebar-width)); - width: var(--sidebar-width); - visibility: hidden; - z-index: 1; - font: message-box; - border-top: 1px solid transparent; - border-inline-end: var(--doorhanger-border-color-whcm); - transition-property: inset-inline-start; - transition-duration: var(--sidebar-transition-duration); - transition-timing-function: var(--sidebar-transition-timing-function); -} - -#outerContainer:is(.sidebarMoving, .sidebarOpen) #sidebarContainer { - visibility: visible; -} - -#outerContainer.sidebarOpen #sidebarContainer { - inset-inline-start: 0; -} - #mainContainer { position: absolute; inset: 0; @@ -346,11 +316,6 @@ body { transition-timing-function: var(--sidebar-transition-timing-function); } -#outerContainer.sidebarOpen #viewerContainer:not(.pdfPresentationMode) { - inset-inline-start: var(--sidebar-width); - transition-property: inset-inline-start; -} - #sidebarContainer :is(input, button, select) { font: message-box; } @@ -398,25 +363,6 @@ body { } } -#sidebarResizer { - position: absolute; - inset-block: 0; - inset-inline-end: -6px; - width: 6px; - z-index: 200; - cursor: ew-resize; -} - -#outerContainer.sidebarOpen #loadingBar { - inset-inline-start: var(--sidebar-width); -} - -#outerContainer.sidebarResizing - :is(#sidebarContainer, #viewerContainer, #loadingBar) { - /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */ - transition-duration: 0s; -} - .doorHanger, .doorHangerRight { border-radius: 2px; @@ -514,21 +460,8 @@ body { box-sizing: border-box; } -.treeItemToggler::before { - /* All matching images have a size of 16x16 - * All relevant containers have a size of 28x28 */ - position: absolute; - display: inline-block; - width: 16px; - height: 16px; - - content: ""; - background-color: var(--toolbar-icon-bg-color); - mask-size: cover; -} - -#sidebarToggleButton::before { - mask-image: var(--toolbarButton-sidebarToggle-icon); +#viewsManagerToggleButton::before { + mask-image: var(--toolbarButton-viewsManagerToggle-icon); background-color: rgb(1 1 1); /*TODO: consider 0 opacity*/ transform: scaleX(var(--dir-factor)); } @@ -732,150 +665,6 @@ body { inset-inline-end: 4px; } } - -#thumbnailView, -#outlineView, -#attachmentsView, -#layersView { - position: absolute; - width: calc(100% - 8px); - inset-block: 0; - padding: 4px 4px 0; - overflow: auto; - user-select: none; -} - -#thumbnailView { - width: calc(100% - 60px); - padding: 10px 30px 0; -} - -#thumbnailView > a:is(:active, :focus) { - outline: 0; -} - -.thumbnail { - /* Define these variables here, and not in :root, since the individual - thumbnails may have different sizes. */ - --thumbnail-width: 0; - --thumbnail-height: 0; - - float: var(--inline-start); - width: var(--thumbnail-width); - height: var(--thumbnail-height); - margin: 0 10px 5px; - padding: 1px; - border: 7px solid transparent; - border-radius: 2px; -} - -#thumbnailView > a:last-of-type > .thumbnail { - margin-bottom: 10px; -} - -a:focus > .thumbnail, -.thumbnail:hover { - border-color: var(--thumbnail-hover-color); -} - -.thumbnail.selected { - border-color: var(--thumbnail-selected-color) !important; -} - -.thumbnailImage { - width: var(--thumbnail-width); - height: var(--thumbnail-height); - opacity: 0.9; -} - -a:focus > .thumbnail > .thumbnailImage, -.thumbnail:hover > .thumbnailImage { - opacity: 0.95; -} - -.thumbnail.selected > .thumbnailImage { - opacity: 1 !important; -} - -.thumbnail:not([data-loaded]) > .thumbnailImage { - width: calc(var(--thumbnail-width) - 2px); - height: calc(var(--thumbnail-height) - 2px); - border: 1px dashed rgb(132 132 132); -} - -.treeWithDeepNesting > .treeItem, -.treeItem > .treeItems { - margin-inline-start: 20px; -} - -.treeItem > a { - text-decoration: none; - display: inline-block; - /* Subtract the right padding (left, in RTL mode) of the container: */ - min-width: calc(100% - 4px); - height: auto; - margin-bottom: 1px; - padding: 2px 0 5px; - padding-inline-start: 4px; - border-radius: 2px; - color: var(--treeitem-color); - font-size: 13px; - line-height: 15px; - user-select: none; - white-space: normal; - cursor: pointer; -} - -#layersView .treeItem > a * { - cursor: pointer; -} - -#layersView .treeItem > a > label { - padding-inline-start: 4px; -} - -#layersView .treeItem > a > label > input { - float: var(--inline-start); - margin-top: 1px; -} - -.treeItemToggler { - position: relative; - float: var(--inline-start); - height: 0; - width: 0; - color: rgb(255 255 255 / 0.5); -} - -.treeItemToggler::before { - inset-inline-end: 4px; - mask-image: var(--treeitem-expanded-icon); -} - -.treeItemToggler.treeItemsHidden::before { - mask-image: var(--treeitem-collapsed-icon); - transform: scaleX(var(--dir-factor)); -} - -.treeItemToggler.treeItemsHidden ~ .treeItems { - display: none; -} - -.treeItem.selected > a { - background-color: var(--treeitem-selected-bg-color); - color: var(--treeitem-selected-color); -} - -.treeItemToggler:hover, -.treeItemToggler:hover + a, -.treeItemToggler:hover ~ .treeItems, -.treeItem > a:hover { - background-color: var(--treeitem-bg-color); - background-clip: padding-box; - border-radius: 2px; - color: var(--treeitem-hover-color); -} - #outlineOptionsContainer { display: none; @@ -1113,7 +902,6 @@ dialog :link { } .menuContainer { - width: 100%; height: auto; max-height: calc( var(--viewer-container-height) - var(--toolbar-height) - @@ -1769,7 +1557,7 @@ dialog :link { #sidebarContainer { background-color: var(--sidebar-narrow-bg-color); } - #outerContainer.sidebarOpen #viewerContainer { + #outerContainer.viewsManagerOpen #viewerContainer { inset-inline-start: 0 !important; } } @@ -1828,8 +1616,26 @@ dialog :link { border-bottom-color: #34495d; } +/* MC Custom Styling for Views Manager (formerly sidebar) */ +#viewsManager, .mcSidebar { background-color: #202c37 !important; + color-scheme: dark; +} + +#viewsManagerHeader { + background-color: #202c37 !important; +} + +#viewsManagerContent { + background-color: #202c37 !important; +} + +#thumbnailsView, +#outlinesView, +#attachmentsView, +#layersView { + background-color: #202c37 !important; } .mcThumbnail { diff --git a/web/viewer.html b/web/viewer.html index ede1c121acef7..6075533f473bb 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -1,4 +1,4 @@ - + - - - - - + + + + + PDF.js viewer - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - +
-
-
-
-
- - - - -
-
- -
-
-
- - -
-
-
-
-
-
- - - -
-
-
-
- + + +
- +
+
- +
@@ -232,7 +381,14 @@ - + @@ -245,13 +401,24 @@
-
-
-
+
@@ -498,7 +844,8 @@
-
+
+
@@ -506,7 +853,7 @@
- +
@@ -586,7 +933,7 @@
- +
@@ -600,7 +947,7 @@
- +
@@ -609,7 +956,9 @@
- +
@@ -624,17 +973,43 @@
- +
-
+
+
+ + +
+
- +
@@ -643,15 +1018,23 @@
- +
- +
- - - + + +
@@ -670,7 +1053,15 @@
- + +
@@ -680,8 +1071,12 @@
- - + + @@ -699,7 +1094,9 @@
- +
@@ -711,13 +1108,37 @@
- - - + + +
- +
@@ -725,7 +1146,17 @@
- +
@@ -736,7 +1167,7 @@ - +
@@ -744,14 +1175,16 @@
- +
- +
- + @@ -763,72 +1196,68 @@
- +
- - + +
- + - -
-
- -
-
-
- - - - - + +
+
+
- -
-
- - -
-
-
- - -
-
- -
+ +
+
+ - - - +
- - -
- - +
+ + +
+
+ +
+ +
+ + +
- -
+ - - + +
@@ -840,11 +1269,12 @@
- - - - - + + + + + + - - + + + +
diff --git a/web/viewer.js b/web/viewer.js index d7ac70a471ba3..7b36345884a08 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -108,24 +108,42 @@ function getViewerConfiguration() { ), documentPropertiesButton: document.getElementById("documentProperties"), }, - sidebar: { - // Divs (and sidebar button) + viewsManager: { outerContainer: document.getElementById("outerContainer"), - sidebarContainer: document.getElementById("sidebarContainer"), - toggleButton: document.getElementById("sidebarToggleButton"), - resizer: document.getElementById("sidebarResizer"), - // Buttons - thumbnailButton: document.getElementById("viewThumbnail"), - outlineButton: document.getElementById("viewOutline"), - attachmentsButton: document.getElementById("viewAttachments"), - layersButton: document.getElementById("viewLayers"), - // Views - thumbnailView: document.getElementById("thumbnailView"), - outlineView: document.getElementById("outlineView"), + toggleButton: document.getElementById("viewsManagerToggleButton"), + sidebarContainer: document.getElementById("viewsManager"), + resizer: document.getElementById("viewsManagerResizer"), + thumbnailButton: document.getElementById("thumbnailsViewMenu"), + outlineButton: document.getElementById("outlinesViewMenu"), + attachmentsButton: document.getElementById("attachmentsViewMenu"), + layersButton: document.getElementById("layersViewMenu"), + viewsManagerSelectorButton: document.getElementById( + "viewsManagerSelectorButton" + ), + viewsManagerSelectorOptions: document.getElementById( + "viewsManagerSelectorOptions" + ), + thumbnailsView: document.getElementById("thumbnailsView"), + outlinesView: document.getElementById("outlinesView"), attachmentsView: document.getElementById("attachmentsView"), layersView: document.getElementById("layersView"), - // View-specific options - currentOutlineItemButton: document.getElementById("currentOutlineItem"), + viewsManagerAddFileButton: document.getElementById( + "viewsManagerAddFileButton" + ), + viewsManagerCurrentOutlineButton: document.getElementById( + "viewsManagerCurrentOutlineButton" + ), + viewsManagerHeaderLabel: document.getElementById( + "viewsManagerHeaderLabel" + ), + manageMenu: { + button: document.getElementById("viewsManagerStatusActionButton"), + menu: document.getElementById("viewsManagerStatusActionOptions"), + copy: document.getElementById("viewsManagerStatusActionCopy"), + cut: document.getElementById("viewsManagerStatusActionCut"), + delete: document.getElementById("viewsManagerStatusActionDelete"), + saveAs: document.getElementById("viewsManagerStatusActionSaveAs"), + }, }, findBar: { bar: document.getElementById("findbar"), @@ -262,6 +280,9 @@ function getViewerConfiguration() { editorCommentsSidebarList: document.getElementById( "editorCommentsSidebarList" ), + editorCommentsSidebarResizer: document.getElementById( + "editorCommentsSidebarResizer" + ), editorFreeTextFontSize: document.getElementById("editorFreeTextFontSize"), editorFreeTextColor: document.getElementById("editorFreeTextColor"), editorInkColor: document.getElementById("editorInkColor"), @@ -286,13 +307,8 @@ function getViewerConfiguration() { editCommentDialog: { dialog: document.getElementById("commentManagerDialog"), toolbar: document.getElementById("commentManagerToolbar"), - actions: document.getElementById("commentActionsButton"), - menu: document.getElementById("commentActionsMenu"), - editMenuItem: document.getElementById("commentActionsEditButton"), - deleteMenuItem: document.getElementById("commentActionsDeleteButton"), - closeButton: document.getElementById("commentCloseButton"), + title: document.getElementById("commentManagerTitle"), textInput: document.getElementById("commentManagerTextInput"), - textView: document.getElementById("commentManagerTextView"), cancelButton: document.getElementById("commentManagerCancelButton"), saveButton: document.getElementById("commentManagerSaveButton"), }, diff --git a/web/views_manager.css b/web/views_manager.css new file mode 100644 index 0000000000000..d9c17cf664e5a --- /dev/null +++ b/web/views_manager.css @@ -0,0 +1,740 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#outerContainer { + &.viewsManagerMoving { + #viewsManager { + visibility: visible; + } + } + + &.viewsManagerOpen { + #viewsManager { + visibility: visible; + inset-inline-start: 1px; + } + + #viewerContainer:not(.pdfPresentationMode) { + inset-inline-start: var(--viewsManager-width, 0); + transition-property: inset-inline-start; + } + } + + &.viewsManagerResizing :is(#sidebarContainer, #viewerContainer, #loadingBar) { + /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */ + transition-duration: 0s; + } +} + +#viewsManager { + --views-manager-button-icon: url(images/pages_viewButton.svg); + --views-manager-button-arrow-icon: url(images/pages_viewArrow.svg); + --views-manager-add-file-button-icon: url(images/toolbarButton-zoomIn.svg); + --current-outline-button-icon: url(images/toolbarButton-currentOutlineItem.svg); + --menuitem-thumbnailsView-icon: url(images/pages_viewButton.svg); + --menuitem-outlinesView-icon: url(images/toolbarButton-viewOutline.svg); + --menuitem-attachmentsView-icon: url(images/toolbarButton-viewAttachments.svg); + --menuitem-layersView-icon: url(images/toolbarButton-viewLayers.svg); + --manage-button-icon: url(images/toolbarButton-pageDown.svg); + --close-button-icon: url(images/pages_closeButton.svg); + --undo-label-icon: url(images/altText_done.svg); + --pages-selected-icon: url(images/pages_selected.svg); + --spinner-icon: url(images/altText_spinner.svg); + + --sidebar-bg-color: light-dark(rgb(255 255 255 / 0.92), rgb(35 34 43 / 0.92)); + --sidebar-backdrop-filter: blur(7px); + --sidebar-width: 230px; + --sidebar-min-width: min-content; + --sidebar-max-width: 50vw; + + --text-color: light-dark(#15141a, #fbfbfe); + --button-fg: var(--text-color); + --button-no-bg: transparent; + --button-bg: light-dark(rgb(21 20 26 / 0.07), rgb(251 251 254 / 0.07)); + --button-border-color: transparent; + --button-hover-bg: light-dark(rgb(21 20 26 / 0.14), rgb(251 251 254 / 0.14)); + --button-hover-fg: var(--text-color); + --button-hover-border-color: var(--button-border-color); + --button-active-bg: light-dark(rgb(21 20 26 / 0.21), rgb(251 251 254 / 0.21)); + --button-active-fg: var(--text-color); + --button-active-border-color: var(--button-border-color); + --button-focus-no-bg: color-mix(in srgb, var(--text-color), transparent 93%); + --button-focus-outline-color: light-dark(#0062fa, #00cadb); + --button-focus-border-color: light-dark(white, black); + --status-border-color: transparent; + --status-actions-bg: light-dark( + rgb(21 20 26 / 0.03), + rgb(251 251 254 / 0.03) + ); + --status-undo-bg: light-dark(rgb(0 98 250 / 0.08), rgb(0 202 219 / 0.08)); + --status-waiting-bg: var(--status-undo-bg); + --indicator-color: light-dark(#0062fa, #00cadb); + --status-warning-bg: light-dark(#ffe8ea, #6e001f); + --indicator-warning-color: light-dark(#b20037, #ffa0aa); + --header-shadow: + 0 0.25px 0.75px -0.75px light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), + 0 2px 6px -6px light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --image-outline: none; + --image-border-width: 6px; + --image-border-color: light-dark(#cfcfd8, #3a3944); + --image-hover-border-color: #bfbfc9; + --image-current-border-color: var(--button-focus-outline-color); + --image-current-focused-outline-color: var(--image-hover-border-color); + --image-page-number-bg: light-dark(#f0f0f4, #23222b); + --image-page-number-fg: var(--text-color); + --image-current-page-number-bg: var(--image-current-border-color); + --image-current-page-number-fg: light-dark(#fff, #15141a); + --image-shadow: + 0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), + 0 0 0 1px var(--image-border-color), + 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --image-hover-shadow: + 0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), + 0 0 0 1px light-dark(rgb(21 20 26 / 0.1), rgb(251 251 254 / 0.1)), + 0 0 0 var(--image-border-width) var(--image-hover-border-color), + 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --image-current-shadow: + 0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), + 0 0 0 var(--image-border-width) var(--image-current-border-color), + 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --image-dragging-placeholder-bg: light-dark( + rgb(0 98 250 / 0.08), + rgb(0 202 219 / 0.08) + ); + --multiple-dragging-bg: white; + --image-multiple-dragging-shadow: + 0 0 0 var(--image-border-width) var(--image-current-border-color), + var(--image-border-width) var(--image-border-width) 0 + calc(var(--image-border-width) / 2) var(--multiple-dragging-bg), + var(--image-border-width) var(--image-border-width) 0 + calc(3 * var(--image-border-width) / 2) var(--image-current-border-color); + --image-dragging-shadow: 0 0 0 var(--image-border-width) + var(--image-current-border-color); + --multiple-dragging-text-color: light-dark(#fbfbfe, #15141a); + + @media screen and (forced-colors: active) { + --text-color: CanvasText; + --button-fg: ButtonText; + --button-bg: ButtonFace; + --button-no-bg: ButtonFace; + --button-border-color: ButtonText; + --button-hover-bg: SelectedItemText; + --button-hover-fg: SelectedItem; + --button-hover-border-color: SelectedItem; + --button-active-bg: SelectedItemText; + --button-active-fg: SelectedItem; + --button-active-border-color: ButtonText; + --button-focus-no-bg: ButtonFace; + --button-focus-outline-color: CanvasText; + --button-focus-border-color: none; + --status-border-color: CanvasText; + --status-undo-bg: none; + --indicator-color: CanvasText; + --status-warning-bg: none; + --indicator-warning-color: CanvasText; + --header-shadow: none; + --image-shadow: 0 0 0 1px CanvasText; + --image-outline: 1px solid CanvasText; + --image-border-color: CanvasText; + --image-hover-border-color: SelectedItem; + --image-current-border-color: ButtonBorder; + --image-current-focused-outline-color: var(--image-hover-border-color); + --image-page-number-bg: ButtonFace; + --image-page-number-fg: CanvasText; + --multiple-dragging-bg: Canvas; + } + + display: flex; + padding-bottom: 16px; + flex-direction: column; + align-items: flex-start; + height: calc( + var(--viewer-container-height) - var(--toolbar-height) - + var(--doorhanger-height) + ); + position: absolute; + + inset-inline-start: calc( + -1 * var(--viewsManager-width, --sidebar-width) - 1px + ); + transition-property: inset-inline-start; + transition-duration: var(--sidebar-transition-duration); + transition-timing-function: var(--sidebar-transition-timing-function); + + .sidebarResizer { + inset-inline-start: 100%; + } + + .viewsManagerButton { + width: auto; + color: var(--button-fg); + border-radius: 8px; + border: 1px solid var(--button-border-color); + background: var(--button-bg); + + &:hover { + background-color: var(--button-hover-bg) !important; + color: var(--button-hover-fg) !important; + border-color: var(--button-hover-border-color) !important; + + &::before { + background-color: var(--button-hover-fg) !important; + } + } + &:active { + background: var(--button-active-bg) !important; + color: var(--button-active-fg) !important; + border-color: var(--button-active-border-color) !important; + + &::before { + background-color: var(--button-active-fg) !important; + } + } + &:focus-visible { + outline: 2px solid var(--button-focus-outline-color); + outline-offset: 2px; + border-color: var(--button-focus-border-color); + } + + &.viewsCloseButton { + width: 32px; + height: 32px; + padding: 4px; + border-radius: 8px; + + &::before { + mask-image: var(--close-button-icon); + } + } + } + + #viewsManagerHeader { + display: flex; + flex-direction: column; + align-items: flex-start; + align-self: stretch; + width: 100%; + box-shadow: var(--header-shadow); + flex: 0 0 auto; + + .viewsManagerLabel { + flex: 1 0 0; + color: var(--text-color); + text-align: center; + height: fit-content; + user-select: none; + + font: menu; + font-size: 15px; + font-style: normal; + font-weight: 400; + line-height: normal; + } + + #viewsManagerTitle { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch; + justify-content: space-between; + width: auto; + padding: 12px 16px 12px 8px; + + #viewsManagerSelector { + width: 48px; + height: 32px; + display: block; + + > button { + background: var(--button-no-bg); + width: 100%; + height: 100%; + + &:focus-visible { + background-color: var(--button-focus-no-bg); + } + + &::before { + mask-repeat: no-repeat; + mask-image: var(--views-manager-button-icon); + background-color: var(--button-fg); + + &:hover { + background-color: var(--button-hover-fg) !important; + } + &:active { + background-color: var(--button-active-fg) !important; + } + } + + &::after { + content: ""; + display: inline-block; + width: 12px; + height: 12px; + margin-left: 8px; + mask-repeat: no-repeat; + mask-position: center; + mask-image: var(--views-manager-button-arrow-icon); + background-color: var(--button-fg); + + &:hover { + background-color: var(--button-hover-fg) !important; + } + &:active { + background-color: var(--button-active-fg) !important; + } + } + } + + > .popupMenu { + min-width: 182px; + z-index: 1; + + > li > button { + &#thumbnailsViewMenu::before { + mask-image: var(--menuitem-thumbnailsView-icon); + } + &#outlinesViewMenu::before { + mask-image: var(--menuitem-outlinesView-icon); + } + &#attachmentsViewMenu::before { + mask-image: var(--menuitem-attachmentsView-icon); + } + &#layersViewMenu::before { + mask-image: var(--menuitem-layersView-icon); + } + } + } + } + + #viewsManagerAddFileButton { + background: var(--button-no-bg); + width: 32px; + height: 32px; + + &:focus-visible { + background-color: var(--button-focus-no-bg); + } + + &::before { + mask-repeat: no-repeat; + mask-image: var(--views-manager-add-file-button-icon); + } + } + + #viewsManagerCurrentOutlineButton { + background: var(--button-no-bg); + width: 32px; + height: 32px; + + &:focus-visible { + background-color: var(--button-focus-no-bg); + } + + &::before { + mask-repeat: no-repeat; + mask-image: var(--current-outline-button-icon); + } + } + } + + #viewsManagerStatus { + display: flex; + align-items: center; + align-self: stretch; + justify-content: space-between; + width: auto; + border: 1px solid var(--status-border-color); + + > div { + min-height: 64px; + width: 100%; + padding-inline: 16px; + } + + .viewsManagerStatusLabel { + display: flex; + align-items: center; + gap: 8px; + + font: menu; + font-size: 13px; + } + + #viewsManagerStatusAction { + display: flex; + justify-content: space-between; + align-items: center; + align-self: stretch; + background-color: var(--status-actions-bg); + + > span.selected::before { + content: ""; + display: inline-block; + width: var(--icon-size); + height: var(--icon-size); + mask-repeat: no-repeat; + mask-position: center; + background-color: var(--indicator-color); + mask-image: var(--pages-selected-icon); + } + + #actionSelector { + height: 32px; + min-width: 115px; + width: auto; + display: block; + + #viewsManagerStatusActionButton { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + width: 100%; + height: 100%; + padding: 4px 16px; + + &::after { + content: ""; + display: inline-block; + width: var(--icon-size); + height: var(--icon-size); + mask-repeat: no-repeat; + mask-position: center; + mask-image: var(--manage-button-icon); + background-color: var(--button-fg); + + &:hover { + background-color: var(--button-hover-fg) !important; + } + &:active { + background-color: var(--button-active-fg) !important; + } + } + } + + > .popupMenu { + width: auto; + z-index: 1; + } + } + } + + #viewsManagerStatusUndo { + display: flex; + justify-content: space-between; + align-items: center; + align-self: stretch; + background-color: var(--status-undo-bg); + + > span::before { + content: ""; + display: inline-block; + width: var(--icon-size); + height: var(--icon-size); + mask-repeat: no-repeat; + mask-position: center; + mask-image: var(--undo-label-icon); + background-color: var(--indicator-color); + } + + > div { + display: flex; + align-items: center; + gap: 8px; + width: auto; + + #viewsManagerStatusUndoButton { + width: auto; + min-height: 24px; + padding: 4px 8px; + } + } + } + + #viewsManagerStatusWarning { + display: flex; + align-items: center; + justify-content: space-between; + background-color: var(--status-warning-bg); + + > span { + align-items: flex-start; + + &::before { + content: ""; + display: inline-block; + width: var(--icon-size); + height: var(--icon-size); + mask-repeat: no-repeat; + mask-position: center; + background-color: var(--indicator-warning-color); + mask-image: var(--undo-label-icon); + flex: 0 0 auto; + } + } + } + + #viewsManagerStatusWaiting { + display: flex; + align-items: center; + justify-content: space-between; + background-color: var(--status-waiting-bg); + + > span::before { + content: ""; + display: inline-block; + width: var(--icon-size); + height: var(--icon-size); + mask-repeat: no-repeat; + mask-position: center; + background-color: var(--indicator-color); + mask-image: var(--spinner-icon); + flex: 0 0 auto; + } + } + } + } + + #viewsManagerContent { + width: 100%; + flex: 1 1 0%; + overflow: auto; + + &:has(#thumbnailsView.isDragging) { + overflow-x: hidden; + } + + #thumbnailsView { + --thumbnail-width: 126px; + + display: flex; + flex-flow: row wrap; + align-items: center; + justify-content: space-evenly; + padding: 20px 32px; + gap: 20px; + width: 100%; + box-sizing: border-box; + position: relative; + + &.isDragging { + cursor: grabbing; + + > .thumbnail { + > .thumbnailImage:hover { + cursor: grabbing; + + &:not([aria-current="page"]) { + box-shadow: var(--image-shadow); + } + } + + > input { + pointer-events: none; + } + } + + > .dragMarker { + position: absolute; + top: 0; + left: 0; + border: 2px solid var(--indicator-color); + contain: strict; + } + } + + > .thumbnail { + display: inline-flex; + justify-content: center; + align-items: center; + gap: 16px; + width: auto; + height: auto; + position: relative; + scroll-margin-top: 20px; + + &:not(.isDragging)::after { + content: attr(page-number); + border-radius: 8px; + background-color: var(--image-page-number-bg); + color: var(--image-page-number-fg); + position: absolute; + bottom: 5px; + inset-inline-end: calc(var(--thumbnail-width) / 2); + min-width: 32px; + height: 16px; + text-align: center; + translate: calc(var(--dir-factor) * 50%); + + font: menu; + font-size: 13px; + font-style: normal; + font-weight: 400; + line-height: normal; + + pointer-events: none; + user-select: none; + } + + &:has([aria-current="page"]):not(.isDragging)::after { + background-color: var(--image-current-page-number-bg); + color: var(--image-current-page-number-fg); + } + + &.isDragging > input { + visibility: hidden; + } + + > input { + margin: 0; + } + + > .thumbnailImage { + --thumbnail-dragging-scale: 1.4; + + width: var(--thumbnail-width); + border: none; + border-radius: 8px; + box-shadow: var(--image-shadow); + box-sizing: content-box; + outline: var(--image-outline); + user-select: none; + + &.missingThumbnailImage { + content-visibility: hidden; + } + + &:hover { + cursor: pointer; + box-shadow: var(--image-hover-shadow); + } + + &:focus-visible { + &:not([aria-current="page"]) { + box-shadow: var(--image-hover-shadow); + outline: none; + } + + &[aria-current="page"] { + outline: var(--image-border-width) solid + var(--image-current-focused-outline-color); + outline-offset: var(--image-border-width); + } + } + + &[aria-current="page"] { + box-shadow: var(--image-current-shadow); + } + + &.placeholder { + background-color: var(--image-dragging-placeholder-bg); + box-shadow: none !important; + } + + &.draggingThumbnail { + position: absolute; + left: 0; + top: 0; + z-index: 1; + transform-origin: 0 0 0; + scale: calc(1 / var(--thumbnail-dragging-scale)); + pointer-events: none; + box-shadow: var(--image-dragging-shadow); + + &.multiple { + box-shadow: var(--image-multiple-dragging-shadow); + + > img { + position: absolute; + top: 0; + left: 0; + + width: var(--thumbnail-width); + border: none; + border-radius: 8px; + box-sizing: content-box; + outline: none; + user-select: none; + } + + &::after { + content: attr(data-multiple-count); + border-radius: calc(8px * var(--thumbnail-dragging-scale)); + background-color: var(--indicator-color); + color: var(--multiple-dragging-text-color); + position: absolute; + inset-block-end: calc(4px * var(--thumbnail-dragging-scale)); + inset-inline-start: calc(4px * var(--thumbnail-dragging-scale)); + min-width: calc(32px * var(--thumbnail-dragging-scale)); + height: calc(16px * var(--thumbnail-dragging-scale)); + text-align: center; + font: menu; + font-size: calc(13px * var(--thumbnail-dragging-scale)); + font-style: normal; + font-weight: 400; + line-height: normal; + contain: strict; + } + } + } + } + } + } + + #attachmentsView { + --attachment-color: light-dark(rgb(0 0 0 / 0.8), rgb(255 255 255 / 0.8)); + --attachment-bg-color: light-dark( + rgb(0 0 0 / 0.15), + rgb(255 255 255 / 0.15) + ); + --attachment-hover-color: light-dark( + rgb(0 0 0 / 0.9), + rgb(255 255 255 / 0.9) + ); + + > ul { + list-style-type: none; + padding: 0; + + > li > a { + text-decoration: none; + display: inline-block; + /* Subtract the right padding (left, in RTL mode) of the container: */ + min-width: calc(100% - 4px); + height: auto; + margin-bottom: 1px; + padding: 2px 0 5px; + padding-inline-start: 4px; + border-radius: 2px; + color: var(--attachment-color); + font-size: 13px; + line-height: 15px; + user-select: none; + white-space: normal; + cursor: pointer; + + &:hover { + background-color: var(--attachment-bg-color); + background-clip: padding-box; + border-radius: 2px; + color: var(--attachment-hover-color); + } + } + } + } + } +} diff --git a/web/pdf_sidebar.js b/web/views_manager.js similarity index 67% rename from web/pdf_sidebar.js rename to web/views_manager.js index b85a0372ad2b0..c9a19b5e5a8f8 100644 --- a/web/pdf_sidebar.js +++ b/web/views_manager.js @@ -20,13 +20,14 @@ import { docStyle, PresentationModeState, SidebarView, - toggleCheckedBtn, toggleExpandedBtn, + toggleSelectedBtn, } from "./ui_utils.js"; +import { Menu } from "./menu.js"; +import { Sidebar } from "./sidebar.js"; -const SIDEBAR_WIDTH_VAR = "--sidebar-width"; -const SIDEBAR_MIN_WIDTH = 200; // pixels -const SIDEBAR_RESIZING_CLASS = "sidebarResizing"; +const SIDEBAR_WIDTH_VAR = "--viewsManager-width"; +const SIDEBAR_RESIZING_CLASS = "viewsManagerResizing"; const UI_NOTIFICATION_CLASS = "pdfSidebarNotification"; /** @@ -66,19 +67,43 @@ const UI_NOTIFICATION_CLASS = "pdfSidebarNotification"; * find the current outline item. */ -class PDFSidebar { - #isRTL = false; - - #mouseAC = null; - - #outerContainerWidth = null; - - #width = null; +class ViewsManager extends Sidebar { + static #l10nDescription = null; /** * @param {PDFSidebarOptions} options */ - constructor({ elements, eventBus, l10n }) { + constructor({ + elements: { + outerContainer, + sidebarContainer, + toggleButton, + resizer, + thumbnailButton, + outlineButton, + attachmentsButton, + layersButton, + thumbnailsView, + outlinesView, + attachmentsView, + layersView, + viewsManagerCurrentOutlineButton, + viewsManagerSelectorButton, + viewsManagerSelectorOptions, + viewsManagerHeaderLabel, + }, + eventBus, + l10n, + }) { + super( + { + sidebar: sidebarContainer, + resizer, + toggleButton, + }, + l10n.getDirection() === "ltr", + /* isResizerOnTheLeft = */ false + ); this.isOpen = false; this.active = SidebarView.THUMBS; this.isInitialViewSet = false; @@ -91,26 +116,41 @@ class PDFSidebar { this.onToggled = null; this.onUpdateThumbnails = null; - this.outerContainer = elements.outerContainer; - this.sidebarContainer = elements.sidebarContainer; - this.toggleButton = elements.toggleButton; - this.resizer = elements.resizer; + this.outerContainer = outerContainer; + this.sidebarContainer = sidebarContainer; + this.toggleButton = toggleButton; + this.resizer = resizer; - this.thumbnailButton = elements.thumbnailButton; - this.outlineButton = elements.outlineButton; - this.attachmentsButton = elements.attachmentsButton; - this.layersButton = elements.layersButton; + this.thumbnailButton = thumbnailButton; + this.outlineButton = outlineButton; + this.attachmentsButton = attachmentsButton; + this.layersButton = layersButton; - this.thumbnailView = elements.thumbnailView; - this.outlineView = elements.outlineView; - this.attachmentsView = elements.attachmentsView; - this.layersView = elements.layersView; + this.thumbnailsView = thumbnailsView; + this.outlinesView = outlinesView; + this.attachmentsView = attachmentsView; + this.layersView = layersView; - this._currentOutlineItemButton = elements.currentOutlineItemButton; + this.viewsManagerCurrentOutlineButton = viewsManagerCurrentOutlineButton; + this.viewsManagerHeaderLabel = viewsManagerHeaderLabel; this.eventBus = eventBus; - this.#isRTL = l10n.getDirection() === "rtl"; + this.menu = new Menu( + viewsManagerSelectorOptions, + viewsManagerSelectorButton, + [thumbnailButton, outlineButton, attachmentsButton, layersButton] + ); + + ViewsManager.#l10nDescription ||= Object.freeze({ + pagesTitle: "pdfjs-views-manager-pages-title", + outlinesTitle: "pdfjs-views-manager-outlines-title", + attachmentsTitle: "pdfjs-views-manager-attachments-title", + layersTitle: "pdfjs-views-manager-layers-title", + notificationButton: "pdfjs-toggle-views-manager-notification-button", + toggleButton: "pdfjs-toggle-views-manager-button", + }); + this.#addEventListeners(); } @@ -121,10 +161,11 @@ class PDFSidebar { this.#hideUINotification(/* reset = */ true); this.switchView(SidebarView.THUMBS); - this.outlineButton.disabled = false; - this.attachmentsButton.disabled = false; - this.layersButton.disabled = false; - this._currentOutlineItemButton.disabled = true; + this.outlineButton.disabled = + this.attachmentsButton.disabled = + this.layersButton.disabled = + false; + this.viewsManagerCurrentOutlineButton.disabled = true; } /** @@ -168,6 +209,7 @@ class PDFSidebar { switchView(view, forceOpen = false) { const isViewChanged = view !== this.active; let forceRendering = false; + let titleL10nId = null; switch (view) { case SidebarView.NONE: @@ -176,21 +218,25 @@ class PDFSidebar { } return; // Closing will trigger rendering and dispatch the event. case SidebarView.THUMBS: + titleL10nId = "pagesTitle"; if (this.isOpen && isViewChanged) { forceRendering = true; } break; case SidebarView.OUTLINE: + titleL10nId = "outlinesTitle"; if (this.outlineButton.disabled) { return; } break; case SidebarView.ATTACHMENTS: + titleL10nId = "attachmentsTitle"; if (this.attachmentsButton.disabled) { return; } break; case SidebarView.LAYERS: + titleL10nId = "layersTitle"; if (this.layersButton.disabled) { return; } @@ -199,27 +245,34 @@ class PDFSidebar { console.error(`PDFSidebar.switchView: "${view}" is not a valid view.`); return; } + + this.viewsManagerCurrentOutlineButton.hidden = view !== SidebarView.OUTLINE; + this.viewsManagerHeaderLabel.setAttribute( + "data-l10n-id", + ViewsManager.#l10nDescription[titleL10nId] || "" + ); + // Update the active view *after* it has been validated above, // in order to prevent setting it to an invalid state. this.active = view; // Update the CSS classes (and aria attributes), for all buttons and views. - toggleCheckedBtn( + toggleSelectedBtn( this.thumbnailButton, view === SidebarView.THUMBS, - this.thumbnailView + this.thumbnailsView ); - toggleCheckedBtn( + toggleSelectedBtn( this.outlineButton, view === SidebarView.OUTLINE, - this.outlineView + this.outlinesView ); - toggleCheckedBtn( + toggleSelectedBtn( this.attachmentsButton, view === SidebarView.ATTACHMENTS, this.attachmentsView ); - toggleCheckedBtn( + toggleSelectedBtn( this.layersButton, view === SidebarView.LAYERS, this.layersView @@ -243,10 +296,20 @@ class PDFSidebar { return; } this.isOpen = true; + this.onResizing(this.width); + this._sidebar.hidden = false; toggleExpandedBtn(this.toggleButton, true); - - this.outerContainer.classList.add("sidebarMoving", "sidebarOpen"); - + this.switchView(this.active); + + // Changing `hidden` above may cause a reflow which would prevent the + // CSS transition from being applied correctly, so we need to delay + // adding the relevant CSS classes. + queueMicrotask(() => { + this.outerContainer.classList.add( + "viewsManagerMoving", + "viewsManagerOpen" + ); + }); if (this.active === SidebarView.THUMBS) { this.onUpdateThumbnails(); } @@ -261,10 +324,11 @@ class PDFSidebar { return; } this.isOpen = false; + this._sidebar.hidden = true; toggleExpandedBtn(this.toggleButton, false); - this.outerContainer.classList.add("sidebarMoving"); - this.outerContainer.classList.remove("sidebarOpen"); + this.outerContainer.classList.add("viewsManagerMoving"); + this.outerContainer.classList.remove("viewsManagerOpen"); this.onToggled(); this.#dispatchEvent(); @@ -276,6 +340,7 @@ class PDFSidebar { } toggle(evt = null) { + super.toggle(); if (this.isOpen) { this.close(evt); } else { @@ -297,7 +362,7 @@ class PDFSidebar { #showUINotification() { this.toggleButton.setAttribute( "data-l10n-id", - "pdfjs-toggle-sidebar-notification-button" + ViewsManager.#l10nDescription.notificationButton ); if (!this.isOpen) { @@ -317,7 +382,7 @@ class PDFSidebar { if (reset) { this.toggleButton.setAttribute( "data-l10n-id", - "pdfjs-toggle-sidebar-button" + ViewsManager.#l10nDescription.toggleButton ); } } @@ -327,16 +392,12 @@ class PDFSidebar { this.sidebarContainer.addEventListener("transitionend", evt => { if (evt.target === this.sidebarContainer) { - outerContainer.classList.remove("sidebarMoving"); + outerContainer.classList.remove("viewsManagerMoving"); // Ensure that rendering is triggered after opening/closing the sidebar. eventBus.dispatch("resize", { source: this }); } }); - this.toggleButton.addEventListener("click", evt => { - this.toggle(evt); - }); - // Buttons for switching views. this.thumbnailButton.addEventListener("click", () => { this.switchView(SidebarView.THUMBS); @@ -361,7 +422,7 @@ class PDFSidebar { }); // Buttons for view-specific options. - this._currentOutlineItemButton.addEventListener("click", () => { + this.viewsManagerCurrentOutlineButton.addEventListener("click", () => { eventBus.dispatch("currentoutlineitem", { source: this }); }); @@ -385,7 +446,7 @@ class PDFSidebar { if (!this.isInitialViewSet) { return; } - this._currentOutlineItemButton.disabled = !enabled; + this.viewsManagerCurrentOutlineButton.disabled = !enabled; }); }); @@ -410,105 +471,20 @@ class PDFSidebar { this.onUpdateThumbnails(); } }); - - // Handle resizing of the sidebar. - this.resizer.addEventListener("mousedown", evt => { - if (evt.button !== 0) { - return; - } - // Disable the `transition-duration` rules when sidebar resizing begins, - // in order to improve responsiveness and to avoid visual glitches. - outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); - - this.#mouseAC = new AbortController(); - const opts = { signal: this.#mouseAC.signal }; - - window.addEventListener("mousemove", this.#mouseMove.bind(this), opts); - window.addEventListener("mouseup", this.#mouseUp.bind(this), opts); - window.addEventListener("blur", this.#mouseUp.bind(this), opts); - }); - - eventBus._on("resize", evt => { - // When the *entire* viewer is resized, such that it becomes narrower, - // ensure that the sidebar doesn't end up being too wide. - if (evt.source !== window) { - return; - } - // Always reset the cached width when the viewer is resized. - this.#outerContainerWidth = null; - - if (!this.#width) { - // The sidebar hasn't been resized, hence no need to adjust its width. - return; - } - // NOTE: If the sidebar is closed, we don't need to worry about - // visual glitches nor ensure that rendering is triggered. - if (!this.isOpen) { - this.#updateWidth(this.#width); - return; - } - outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); - const updated = this.#updateWidth(this.#width); - - Promise.resolve().then(() => { - outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); - // Trigger rendering if the sidebar width changed, to avoid - // depending on the order in which 'resize' events are handled. - if (updated) { - eventBus.dispatch("resize", { source: this }); - } - }); - }); } - /** - * @type {number} - */ - get outerContainerWidth() { - return (this.#outerContainerWidth ||= this.outerContainer.clientWidth); + onStartResizing() { + this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); } - /** - * returns {boolean} Indicating if the sidebar width was updated. - */ - #updateWidth(width = 0) { - // Prevent the sidebar from becoming too narrow, or from occupying more - // than half of the available viewer width. - const maxWidth = Math.floor(this.outerContainerWidth / 2); - if (width > maxWidth) { - width = maxWidth; - } - if (width < SIDEBAR_MIN_WIDTH) { - width = SIDEBAR_MIN_WIDTH; - } - // Only update the UI when the sidebar width did in fact change. - if (width === this.#width) { - return false; - } - this.#width = width; - - docStyle.setProperty(SIDEBAR_WIDTH_VAR, `${width}px`); - return true; - } - - #mouseMove(evt) { - let width = evt.clientX; - // For sidebar resizing to work correctly in RTL mode, invert the width. - if (this.#isRTL) { - width = this.outerContainerWidth - width; - } - this.#updateWidth(width); - } - - #mouseUp(evt) { - // Re-enable the `transition-duration` rules when sidebar resizing ends... - this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); - // ... and ensure that rendering will always be triggered. + onStopResizing() { this.eventBus.dispatch("resize", { source: this }); + this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); + } - this.#mouseAC?.abort(); - this.#mouseAC = null; + onResizing(newWidth) { + docStyle.setProperty(SIDEBAR_WIDTH_VAR, `${newWidth}px`); } } -export { PDFSidebar }; +export { ViewsManager };