[
  {
    "path": ".changeset/README.md",
    "content": "# Changesets\n\nHello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works\nwith multi-package repos, or single-package repos to help you version and publish your code. You can\nfind the full documentation for it [in our repository](https://github.com/changesets/changesets)\n\nWe have a quick list of common questions to get you started engaging with this project in\n[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)\n"
  },
  {
    "path": ".changeset/config.json",
    "content": "{\n  \"$schema\": \"https://unpkg.com/@changesets/config@2.3.0/schema.json\",\n  \"changelog\": [\n    \"@changesets/changelog-github\",\n    { \"repo\": \"diegomura/react-pdf\" }\n  ],\n  \"commit\": false,\n  \"access\": \"public\",\n  \"baseBranch\": \"master\",\n  \"updateInternalDependencies\": \"patch\",\n  \"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH\": {\n    \"updateInternalDependents\": \"always\"\n  },\n  \"ignore\": []\n}\n"
  },
  {
    "path": ".changeset/dirty-rocks-jam.md",
    "content": "---\n\"@react-pdf/textkit\": patch\n---\n\nfeat(textkit): various improvements\n"
  },
  {
    "path": ".changeset/eighty-taxis-cross.md",
    "content": "---\n\"@react-pdf/fns\": patch\n---\n\nfeat(fns): various improvements\n"
  },
  {
    "path": ".changeset/five-rockets-battle.md",
    "content": "---\n\"@react-pdf/textkit\": patch\n---\n\nfix: cannot read units for Em\n"
  },
  {
    "path": ".changeset/pretty-carrots-obey.md",
    "content": "---\n\"@react-pdf/font\": patch\n---\n\nfeat(font): various improvements\n"
  },
  {
    "path": ".gitattributes",
    "content": "packages/* linguist-vendored=false\nexamples/* linguist-vendored=false\n"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\n\n- Using welcoming and inclusive language\n- Being respectful of differing viewpoints and experiences\n- Gracefully accepting constructive criticism\n- Focusing on what is best for the community\n- Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n- The use of sexualized language or imagery and unwelcome sexual attention or advances\n- Trolling, insulting/derogatory comments, and personal or political attacks\n- Public or private harassment\n- Publishing others' private information, such as a physical or electronic address, without explicit permission\n- Other conduct which could reasonably be considered inappropriate in a professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at diegomuracciole@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contribute\n\n## Introduction\n\nFirst, thank you for considering contributing to react-pdf!\n\nWe welcome any type of contribution, not only code. You can help with\n\n- **QA**: file bug reports, the more details you can give the better (e.g. screenshots with the console open)\n- **Marketing**: writing blog posts, howto's, printing stickers, ...\n- **Community**: presenting the project at meetups, organizing a dedicated meetup for the local community, ...\n- **Code**: take a look at the [open issues](https://github.com/diegomura/react-pdf/issues). Even if you can't write code, commenting on them, showing that you care about a given issue matters. It helps us triage them.\n- **Money**: we welcome financial contributions in full transparency on our [open collective](https://opencollective.com/react-pdf).\n\n## Your First Contribution\n\nWorking on your first Pull Request? You can learn how from this _free_ series, [How to Contribute to an Open Source Project on GitHub](https://app.egghead.io/series/how-to-contribute-to-an-open-source-project-on-github).\n\n## Set up your development environment\n\nreact-pdf is a monorepo. That means the whole solution is broken into small pieces, or packages, each of which solves a specific problem. No need to worry much about it, since [Lerna](https://lerna.js.org/) does most of the work for us. If you are not familiarized with it it's always helpful to have an overall idea of how it works.\n\nHere I present a quick guide about how to setup your development environment exactly as I have it when working on react-pdf. Please bare in mind small differences can be present depending on which environment you are running this library (on the web, node, electron, etc).\n\n### 1. Clone react-pdf project\n\nThis goes without saying but first you need to download the code:\n\n```sh\ngit clone https://github.com/diegomura/react-pdf.git\ncd react-pdf\n```\n\n### 2. Install Node 18\n\nIf you have `nvm` installed all you have to do is:\n\n```sh\nnvm install 18\nnvm use\n```\n\nOther versions should work although I can't guarantee it.\n\n### 3. Install dependencies and boostrap monorepo\n\nWe need to download this project dependencies in order to make it work. Because this is a monorepo, we also have to bind all the internal packages together so they are aware of each other. Both things can be done by running:\n\n```sh\nyarn install\n```\n\n### 4. Build & watch codebase\n\nIn order to to quickly iterate in your development process, react-pdf has a watch script that builds all the required modules and waits for changes to happen to re-compile the affected packages. This is handy because enables you to have this process running on the background and just focus on coding what you want. All you have to do is:\n\n```sh\nyarn watch\n```\n\n### 5. Setup testing project\n\nNow that we have react-pdf built and running, we need to setup a testing project to use as a development target. This might not be the most straightforward way to set up your dev environment but enables use of the lib as an \"external\" agent, just as end users will do. It's also extensible for testing in different environments, whether it is a web or node project, or electron or native app. I usually have a web project (just a plain [create react app](https://reactjs.org/docs/create-a-new-react-app.html) project), and a Node one.\n\n### 6. Link your react-pdf build to your testing project\n\nNow all we have to do is make our testing project point to our react-pdf watch instance so we can apply changes to it and see them working. For that I use `yarn link`.\n\nOn another terminal:\n\n```sh\ncd react-pdf/packages/renderer # navigate to react-pdf renderer package\nyarn link\n```\n\nIn our testing project:\n\n```sh\nyarn link @react-pdf/renderer\n```\n\nIf everything went well, now your testing project should be running your local react-pdf build and any change in the codebase should be immediately accesible from your project.\n\n<details>\n <summary>A comment about react and react-dom</summary>\n  I observed that it's sometimes needed to apply the same linking process to both react and react-dom. This is becuase otherwise your local react-pdf build and your testing project will be using each a different react and react-dom instance, making react complain. All you have to do is\n\n<pre>\n# on your react-pdf project\n\ncd react-pdf/node_modules/react\nyarn link\ncd ../react-dom\nyarn link\n\n# on your testing project\n\nyarn link react\nyarn link react-dom\n</pre>\n</details>\n\n## Submitting code\n\nAny code change should be submitted as a pull request. The description should explain what the code does and give steps to execute it. The pull request should also contain tests.\n\n## Code review process\n\nThe bigger the pull request, the longer it will take to review and merge. Try to break down large pull requests in smaller chunks that are easier to review and merge.\nIt is also always helpful to have some context for your pull request. What was the purpose? Why does it matter to you?\n\n## Financial contributions\n\nWe also welcome financial contributions in full transparency on our [open collective](https://opencollective.com/react-pdf).\nAnyone can file an expense. If the expense makes sense for the development of the community, it will be \"merged\" in the ledger of our open collective by the core contributors and the person who filed the expense will be reimbursed.\n\n## Questions\n\nIf you have any questions, create an [issue](https://github.com/diegomura/react-pdf/issues) (protip: do a quick search first to see if someone else didn't ask the same question before!).\nYou can also reach us at hello@react-pdf.opencollective.com.\n\n## Credits\n\n### Contributors\n\nThank you to all the people who have already contributed to react-pdf!\n<a href=\"/diegomura/react-pdf/graphs/contributors\"><img src=\"https://opencollective.com/react-pdf/contributors.svg?width=890\" /></a>\n\n### Backers\n\nThank you to all our backers! [[Become a backer](https://opencollective.com/react-pdf#backer)]\n\n<a href=\"https://opencollective.com/react-pdf#backers\" target=\"_blank\"><img src=\"https://opencollective.com/react-pdf/backers.svg?width=890\"></a>\n\n<!-- This `CONTRIBUTING.md` is based on @nayafia's template https://github.com/nayafia/contributing-template -->\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: diegomura\nopen_collective: react-pdf\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior including code snippet (if applies):\n\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n_You can make use of [react-pdf REPL](https://react-pdf.org/repl) to share the snippet_\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Desktop (please complete the following information):**\n\n- OS: [e.g. MacOS, Windows]\n- Browser [e.g. chrome, safari]\n- React-pdf version [e.g. v1.1.0]\n\n<!-- Love react-pdf? Please consider supporting our collective:\n👉  https://opencollective.com/react-pdf/donate -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: new feature\nassignees: ''\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/no-response.yml",
    "content": "# Configuration for probot-no-response - https://github.com/probot/no-response\n\ndaysUntilClose: 14\nresponseRequiredLabel: incomplete\ncloseComment: >\n  This issue has been automatically closed because there has been no response\n  to our request for more information from the original author. With only the\n  information that is currently in the issue, we don't have enough information\n  to take action. Please reach out if you have or find the answers we need so\n  that we can investigate further.\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: CI\n\non:\n  pull_request:\n    branches:\n      - '**'\n  push:\n    branches:\n      - '**'\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\nenv:\n  FORCE_COLOR: 2\n  HUSKY: 0\n  NODE_VERSION: 20\n\njobs:\n  lint:\n    name: Lint\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Cache Yarn cache\n        uses: actions/cache@v4\n        env:\n          cache-name: yarn-cache\n        with:\n          path: ~/.cache/yarn\n          key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-${{ env.cache-name }}-\n\n      - name: Use Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ env.NODE_VERSION }}\n\n      - name: Install dependencies and build\n        run: yarn --frozen-lockfile\n\n      - name: Check size\n        run: yarn lint\n\n  size:\n    name: Check size\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Cache Yarn cache\n        uses: actions/cache@v4\n        env:\n          cache-name: yarn-cache\n        with:\n          path: ~/.cache/yarn\n          key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-${{ env.cache-name }}-\n\n      - name: Use Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ env.NODE_VERSION }}\n\n      - name: Install dependencies and build\n        run: yarn --frozen-lockfile\n\n      - name: Check size\n        run: yarn --cwd packages/renderer run size\n\n  test:\n    name: Run unit tests (Node.js ${{ matrix.node_version }}; React ${{ matrix.react_version }})\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        # We aim to test all maintained LTS versions of Node.js as well as the latest stable version\n        node_version: [18, 20, 21]\n        react_version: [16, 17, 18]\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Cache Yarn cache\n        uses: actions/cache@v4\n        env:\n          cache-name: yarn-cache\n        with:\n          path: ~/.cache/yarn\n          key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-${{ env.cache-name }}-\n\n      - name: Use Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node_version }}\n\n      - name: Install dependencies and build\n        run: yarn --frozen-lockfile\n\n      - name: Run tests\n        run: REACT_VERSION=${{ matrix.react_version }} yarn test\n\n  e2e-node:\n    name: Run E2E tests (Node.js ${{ matrix.node_version }}; ${{ matrix.cjs_or_esm == 'cjs' ? 'CJS' : 'ESM' }})    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        cjs_or_esm: [cjs, esm]\n        node_version: [18, 20, 21]\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Cache Yarn cache\n        uses: actions/cache@v4\n        env:\n          cache-name: yarn-cache\n        with:\n          path: ~/.cache/yarn\n          key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-${{ env.cache-name }}-\n\n      - name: Use Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node_version }}\n\n      - name: Install dependencies and build\n        run: yarn --frozen-lockfile\n\n      - name: Run E2E tests\n        run: yarn --cwd e2e/node-${{ matrix.cjs_or_esm }} run start\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non:\n  push:\n    branches:\n      - master\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\nenv:\n  FORCE_COLOR: 2\n  HUSKY: 0\n  NODE_VERSION: 20\n\njobs:\n  test:\n    name: Run tests (Node.js ${{ matrix.node_version }}; React ${{ matrix.react_version }})\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        # We aim to test all maintained LTS versions of Node.js as well as the latest stable version\n        node_version: [18, 20, 21]\n        react_version: [16, 17, 18, 19]\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Cache Yarn cache\n        uses: actions/cache@v4\n        env:\n          cache-name: yarn-cache\n        with:\n          path: ~/.cache/yarn\n          key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-${{ env.cache-name }}-\n\n      - name: Use Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node_version }}\n\n      - name: Install dependencies and build\n        run: yarn --frozen-lockfile\n\n      - name: Run tests\n        run: REACT_VERSION=${{ matrix.react_version }} yarn test\n\n  release:\n    # Prevents this action from running on forks\n    if: github.repository_owner == 'diegomura'\n    name: Create Release PR or Publish to npm\n    needs: [test]\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits\n          fetch-depth: 0\n\n      - name: Cache Yarn cache\n        uses: actions/cache@v4\n        env:\n          cache-name: yarn-cache\n        with:\n          path: ~/.cache/yarn\n          key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-${{ env.cache-name }}-\n\n      - name: Use Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ env.NODE_VERSION }}\n\n      - name: Install dependencies and build\n        run: yarn --frozen-lockfile\n\n      - name: Create Release PR or Publish to npm\n        uses: changesets/action@v1\n        with:\n          # This expects you to have a script called release which does a build for your packages and calls changeset publish\n          publish: yarn release\n          version: yarn version-packages\n          commit: 'chore: release packages'\n          title: 'chore: release packages'\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\n*.log\ndist\ncoverage\n.jshintrc\n.idea\n.DS_Store\n.cache\n.parcel-cache\n"
  },
  {
    "path": ".husky/pre-commit",
    "content": "yarn lint-staged\n"
  },
  {
    "path": ".nvmrc",
    "content": "18\n"
  },
  {
    "path": ".prettierignore",
    "content": "yoga-layout\nlib\npackages/pdfkit\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"singleQuote\": true\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Diego Muracciole <diegomuracciole@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n  <p align=\"center\">React renderer for creating PDF files on the browser and server<p>\n  <p align=\"center\">\n    <a href=\"https://www.npmjs.com/package/@react-pdf/renderer\">\n      <img src=\"https://img.shields.io/npm/v/@react-pdf/renderer?style=flat&colorA=000000&colorB=000000\" />\n    </a>\n     <a href=\"https://opencollective.com/react-pdf\">\n      <img src=\"https://img.shields.io/opencollective/all/react-pdf?style=flat&colorA=000000&colorB=000000\" />\n    </a>\n    <a href=\"https://github.com/diegomura/react-pdf/blob/master/LICENSE\">\n      <img src=\"https://img.shields.io/github/license/diegomura/react-pdf?style=flat&colorA=000000&colorB=000000\" />\n    </a>\n    <a href=\"https://blockchain.com/btc/address/bc1qj223udztpmt5dck46dw0yap08yum63ht56h90v\">\n      <img src=\"https://img.shields.io/badge/BTC-f5f5f5?style=flat&colorA=000000&colorB=000000\" />\n    </a>\n     <a href=\"https://blockchain.com/eth/address/0x4e1DB76bA0858BbCAa4DD804418D0D9EcF77B1cC\">\n      <img src=\"https://img.shields.io/badge/ETH-f5f5f5?style=flat&colorA=000000&colorB=000000\" />\n    </a>\n  </p>\n</p>\n\n## Lost?\n\nThis package is used to _create_ PDFs using React. If you wish to _display_ existing PDFs, you may be looking for [react-pdf](https://github.com/wojtekmaj/react-pdf).\n\n## How to install\n\n```sh\nyarn add @react-pdf/renderer\n```\n\n## How it works\n\n```jsx\nimport React from 'react';\nimport { Document, Page, Text, View, StyleSheet } from '@react-pdf/renderer';\n\n// Create styles\nconst styles = StyleSheet.create({\n  page: {\n    flexDirection: 'row',\n    backgroundColor: '#E4E4E4',\n  },\n  section: {\n    margin: 10,\n    padding: 10,\n    flexGrow: 1,\n  },\n});\n\n// Create Document Component\nconst MyDocument = () => (\n  <Document>\n    <Page size=\"A4\" style={styles.page}>\n      <View style={styles.section}>\n        <Text>Section #1</Text>\n      </View>\n      <View style={styles.section}>\n        <Text>Section #2</Text>\n      </View>\n    </Page>\n  </Document>\n);\n```\n\n### `Web.` Render in DOM\n\n```jsx\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { PDFViewer } from '@react-pdf/renderer';\n\nconst App = () => (\n  <PDFViewer>\n    <MyDocument />\n  </PDFViewer>\n);\n\nReactDOM.render(<App />, document.getElementById('root'));\n```\n\n### `Node.` Save in a file\n\n```jsx\nimport React from 'react';\nimport ReactPDF from '@react-pdf/renderer';\n\nReactPDF.render(<MyDocument />, `${__dirname}/example.pdf`);\n```\n\n## Contributors\n\nThis project exists thanks to all the people who contribute. Looking to contribute? Please check our [[contribute]](https://github.com/diegomura/react-pdf/blob/master/.github/CONTRIBUTING.md) document for more details about how to setup a development environment and submitting code.\n\n<a href=\"https://github.com/diegomura/react-pdf/blob/master/.github/CONTRIBUTING.md\"><img src=\"https://opencollective.com/react-pdf/contributors.svg?width=890\" /></a>\n\n## Sponsors\n\nThank you to all our sponsors! [[Become a sponsors](https://opencollective.com/react-pdf#sponsors)]\n\n<a href=\"https://opencollective.com/react-pdf#sponsors\" target=\"_blank\"><img src=\"https://opencollective.com/react-pdf/sponsors.svg?width=890\"></a>\n\n## Backers\n\nThank you to all our backers! [[Become a backer](https://opencollective.com/react-pdf#backer)]\n\n<a href=\"https://opencollective.com/react-pdf#backers\" target=\"_blank\"><img src=\"https://opencollective.com/react-pdf/backers.svg?width=890\"></a>\n\n## License\n\nMIT © [Diego Muracciole](http://github.com/diegomura)\n\n---\n\n[![](https://img.shields.io/npm/dt/@react-pdf/renderer.svg?style=flat)](https://www.npmjs.com/package/@react-pdf/renderer)\n"
  },
  {
    "path": "babel.config.js",
    "content": "export default {\n  presets: [\n    [\n      '@babel/preset-env',\n      {\n        loose: true,\n        targets: {\n          node: '18',\n          browsers: '>0.25%, not dead',\n        },\n      },\n    ],\n    ['@babel/preset-react', { runtime: 'automatic' }],\n  ],\n  plugins: [\n    ['@babel/plugin-transform-runtime', { version: '^7.19.6' }],\n    ['@babel/plugin-proposal-class-properties', { loose: true }],\n    '@babel/plugin-proposal-optional-chaining',\n  ],\n};\n"
  },
  {
    "path": "e2e/node-cjs/CHANGELOG.md",
    "content": "# @react-pdf/e2e-node-cjs\n\n## 2.0.24\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.3.2\n\n## 2.0.23\n\n### Patch Changes\n\n- Updated dependencies [[`dcc7b403`](https://github.com/diegomura/react-pdf/commit/dcc7b40313b5662b9bd16678fbc0b62eeaf65d71)]:\n  - @react-pdf/renderer@4.3.1\n\n## 2.0.22\n\n### Patch Changes\n\n- Updated dependencies [[`01b4ff5c`](https://github.com/diegomura/react-pdf/commit/01b4ff5cb00420dd37c2f28fb95822dd18cdd982), [`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a)]:\n  - @react-pdf/renderer@4.3.0\n\n## 2.0.21\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.4\n\n## 2.0.20\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.3\n\n## 2.0.19\n\n### Patch Changes\n\n- Updated dependencies [[`226467e3`](https://github.com/diegomura/react-pdf/commit/226467e39443d3690b8f8c3298aa8278b43fbfa6)]:\n  - @react-pdf/renderer@4.2.2\n\n## 2.0.18\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.1\n\n## 2.0.17\n\n### Patch Changes\n\n- Updated dependencies [[`7cd71714`](https://github.com/diegomura/react-pdf/commit/7cd7171472b0f300db56b7805c5f966bf4ced6e2), [`685890bd`](https://github.com/diegomura/react-pdf/commit/685890bd841b7d2480157117fcd3cbb1334f6324)]:\n  - @react-pdf/renderer@4.2.0\n\n## 2.0.16\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.6\n\n## 2.0.15\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.5\n\n## 2.0.14\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.4\n\n## 2.0.13\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.3\n\n## 2.0.12\n\n### Patch Changes\n\n- Updated dependencies [[`aab7d958`](https://github.com/diegomura/react-pdf/commit/aab7d95870d9073e4acb004aa0cce9cfa19b7f0e)]:\n  - @react-pdf/renderer@4.1.2\n\n## 2.0.11\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.1\n\n## 2.0.10\n\n### Patch Changes\n\n- Updated dependencies [[`52b2f253`](https://github.com/diegomura/react-pdf/commit/52b2f25349bee0c09399bc2e7e5e89db5e1433fd)]:\n  - @react-pdf/renderer@4.1.0\n\n## 2.0.9\n\n### Patch Changes\n\n- Updated dependencies [[`7add014c`](https://github.com/diegomura/react-pdf/commit/7add014c6bc9cff649dd1a56fc47214888613b6b)]:\n  - @react-pdf/renderer@4.0.2\n\n## 2.0.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.0.1\n\n## 2.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`afe4bcfe`](https://github.com/diegomura/react-pdf/commit/afe4bcfe6f4b991cf22341242fc27d169b758d47), [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119)]:\n  - @react-pdf/renderer@4.0.0\n\n## 2.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`ed94775`](https://github.com/diegomura/react-pdf/commit/ed94775f4d44db0886ff08c71d09f446bace6392)]:\n  - @react-pdf/renderer@3.4.5\n\n## 2.0.5\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.4.4\n\n## 2.0.4\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.4.3\n\n## 2.0.3\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.4.2\n\n## 2.0.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.4.1\n\n## 2.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`fab09cc`](https://github.com/diegomura/react-pdf/commit/fab09cc9814326fdb44d2bcb7097ba9960d441d1)]:\n  - @react-pdf/renderer@3.4.0\n"
  },
  {
    "path": "e2e/node-cjs/index.js",
    "content": "const fs = require('node:fs/promises');\nconst assert = require('node:assert');\nconst { test } = require('node:test');\nconst { jsx } = require('react/jsx-runtime');\nconst { Document, Page, Text, renderToBuffer } = require('@react-pdf/renderer');\n\nconst MyDocument = () =>\n  jsx(Document, {\n    children: jsx(Page, {\n      size: 'A4',\n      children: jsx(Text, {\n        children: 'Hello world',\n      }),\n    }),\n  });\n\nfunction removeMovingParts(buffer) {\n  return Buffer.from(\n    buffer\n      .toString('ascii')\n      .replace(/\\(D:[0-9]{14}Z\\)/g, '(D:20240101000000Z)')\n      .replace(\n        /\\/ID \\[.*\\]/,\n        '/ID [<00000000000000000000000000000000> <00000000000000000000000000000000>]',\n      ),\n  );\n}\n\ntest('rendering a PDF', async () => {\n  const bufferPromise = renderToBuffer(jsx(MyDocument, {}));\n  const referenceBufferPromise = fs.readFile('../reference.pdf');\n\n  const [buffer, referenceBuffer] = await Promise.all([\n    bufferPromise,\n    referenceBufferPromise,\n  ]);\n\n  const bufferAsciiWithIDsRemoved = removeMovingParts(buffer);\n  const referenceBufferAsciiWithIDsRemoved = removeMovingParts(referenceBuffer);\n\n  assert.deepStrictEqual(\n    bufferAsciiWithIDsRemoved,\n    referenceBufferAsciiWithIDsRemoved,\n  );\n});\n"
  },
  {
    "path": "e2e/node-cjs/package.json",
    "content": "{\n  \"name\": \"@react-pdf/e2e-node-cjs\",\n  \"version\": \"2.0.24\",\n  \"license\": \"MIT\",\n  \"private\": true,\n  \"type\": \"commonjs\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"repository\": \"git@github.com:diegomura/react-pdf.git\",\n  \"scripts\": {\n    \"dev\": \"node --watch ./index.js\",\n    \"start\": \"node ./index.js\"\n  },\n  \"dependencies\": {\n    \"@react-pdf/renderer\": \"^4.3.2\",\n    \"react\": \"^18.2.0\"\n  }\n}\n"
  },
  {
    "path": "e2e/node-esm/CHANGELOG.md",
    "content": "# @react-pdf/e2e-node-esm\n\n## 2.0.24\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.3.2\n\n## 2.0.23\n\n### Patch Changes\n\n- Updated dependencies [[`dcc7b403`](https://github.com/diegomura/react-pdf/commit/dcc7b40313b5662b9bd16678fbc0b62eeaf65d71)]:\n  - @react-pdf/renderer@4.3.1\n\n## 2.0.22\n\n### Patch Changes\n\n- Updated dependencies [[`01b4ff5c`](https://github.com/diegomura/react-pdf/commit/01b4ff5cb00420dd37c2f28fb95822dd18cdd982), [`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a)]:\n  - @react-pdf/renderer@4.3.0\n\n## 2.0.21\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.4\n\n## 2.0.20\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.3\n\n## 2.0.19\n\n### Patch Changes\n\n- Updated dependencies [[`226467e3`](https://github.com/diegomura/react-pdf/commit/226467e39443d3690b8f8c3298aa8278b43fbfa6)]:\n  - @react-pdf/renderer@4.2.2\n\n## 2.0.18\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.1\n\n## 2.0.17\n\n### Patch Changes\n\n- Updated dependencies [[`7cd71714`](https://github.com/diegomura/react-pdf/commit/7cd7171472b0f300db56b7805c5f966bf4ced6e2), [`685890bd`](https://github.com/diegomura/react-pdf/commit/685890bd841b7d2480157117fcd3cbb1334f6324)]:\n  - @react-pdf/renderer@4.2.0\n\n## 2.0.16\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.6\n\n## 2.0.15\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.5\n\n## 2.0.14\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.4\n\n## 2.0.13\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.3\n\n## 2.0.12\n\n### Patch Changes\n\n- Updated dependencies [[`aab7d958`](https://github.com/diegomura/react-pdf/commit/aab7d95870d9073e4acb004aa0cce9cfa19b7f0e)]:\n  - @react-pdf/renderer@4.1.2\n\n## 2.0.11\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.1\n\n## 2.0.10\n\n### Patch Changes\n\n- Updated dependencies [[`52b2f253`](https://github.com/diegomura/react-pdf/commit/52b2f25349bee0c09399bc2e7e5e89db5e1433fd)]:\n  - @react-pdf/renderer@4.1.0\n\n## 2.0.9\n\n### Patch Changes\n\n- Updated dependencies [[`7add014c`](https://github.com/diegomura/react-pdf/commit/7add014c6bc9cff649dd1a56fc47214888613b6b)]:\n  - @react-pdf/renderer@4.0.2\n\n## 2.0.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.0.1\n\n## 2.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`afe4bcfe`](https://github.com/diegomura/react-pdf/commit/afe4bcfe6f4b991cf22341242fc27d169b758d47), [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119)]:\n  - @react-pdf/renderer@4.0.0\n\n## 2.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`ed94775`](https://github.com/diegomura/react-pdf/commit/ed94775f4d44db0886ff08c71d09f446bace6392)]:\n  - @react-pdf/renderer@3.4.5\n\n## 2.0.5\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.4.4\n\n## 2.0.4\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.4.3\n\n## 2.0.3\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.4.2\n\n## 2.0.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.4.1\n\n## 2.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`fab09cc`](https://github.com/diegomura/react-pdf/commit/fab09cc9814326fdb44d2bcb7097ba9960d441d1)]:\n  - @react-pdf/renderer@3.4.0\n"
  },
  {
    "path": "e2e/node-esm/index.js",
    "content": "import fs from 'node:fs/promises';\nimport assert from 'node:assert';\nimport { test } from 'node:test';\nimport { jsx } from 'react/jsx-runtime';\nimport { Document, Page, Text, renderToBuffer } from '@react-pdf/renderer';\n\nconst MyDocument = () =>\n  jsx(Document, {\n    children: jsx(Page, {\n      size: 'A4',\n      children: jsx(Text, {\n        children: 'Hello world',\n      }),\n    }),\n  });\n\nfunction removeMovingParts(buffer) {\n  return Buffer.from(\n    buffer\n      .toString('ascii')\n      .replace(/\\(D:[0-9]{14}Z\\)/g, '(D:20240101000000Z)')\n      .replace(\n        /\\/ID \\[.*\\]/,\n        '/ID [<00000000000000000000000000000000> <00000000000000000000000000000000>]',\n      ),\n  );\n}\n\ntest('rendering a PDF', async () => {\n  const bufferPromise = renderToBuffer(jsx(MyDocument, {}));\n  const referenceBufferPromise = fs.readFile('../reference.pdf');\n\n  const [buffer, referenceBuffer] = await Promise.all([\n    bufferPromise,\n    referenceBufferPromise,\n  ]);\n\n  const bufferAsciiWithIDsRemoved = removeMovingParts(buffer);\n  const referenceBufferAsciiWithIDsRemoved = removeMovingParts(referenceBuffer);\n\n  assert.deepStrictEqual(\n    bufferAsciiWithIDsRemoved,\n    referenceBufferAsciiWithIDsRemoved,\n  );\n});\n"
  },
  {
    "path": "e2e/node-esm/package.json",
    "content": "{\n  \"name\": \"@react-pdf/e2e-node-esm\",\n  \"version\": \"2.0.24\",\n  \"license\": \"MIT\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"repository\": \"git@github.com:diegomura/react-pdf.git\",\n  \"scripts\": {\n    \"dev\": \"node --watch ./index.js\",\n    \"start\": \"node ./index.js\"\n  },\n  \"dependencies\": {\n    \"@react-pdf/renderer\": \"^4.3.2\",\n    \"react\": \"^18.2.0\"\n  }\n}\n"
  },
  {
    "path": "eslint.config.ts",
    "content": "import { version } from 'react';\nimport reactPlugin from 'eslint-plugin-react';\nimport tsPlugin from '@typescript-eslint/eslint-plugin';\nimport tsParser from '@typescript-eslint/parser';\nimport vitestPlugin from '@vitest/eslint-plugin';\nimport prettierPlugin from 'eslint-plugin-prettier';\n\nconst baseConfig = {\n  languageOptions: {\n    parser: tsParser,\n    sourceType: 'module',\n  },\n  plugins: {\n    '@typescript-eslint': tsPlugin,\n  },\n};\n\nconst ignoreConfig = {\n  ignores: [\n    '**/dist',\n    '**/lib',\n    '**/node_modules',\n    '**/packages/pdfkit/**',\n    '**/packages/png-js/**',\n    '**/packages/yoga/**',\n    '**/packages/examples/**',\n  ],\n};\n\nconst globalsConfig = {\n  languageOptions: {\n    globals: {\n      atob: false,\n      Blob: false,\n      BROWSER: false,\n      Buffer: false,\n      console: false,\n      fetch: false,\n      global: false,\n      module: false,\n      process: false,\n      TextDecoder: false,\n      TextEncoder: false,\n      URL: false,\n      window: false,\n    },\n  },\n};\n\nconst jsConfig = {\n  rules: {\n    'array-callback-return': ['error', { allowImplicit: true }],\n    'block-scoped-var': 'error',\n    complexity: ['off', 20],\n    'constructor-super': 'error',\n    'default-case': ['error', { commentPattern: '^no default$' }],\n    'default-case-last': 'error',\n    'dot-notation': ['error', { allowKeywords: true }],\n    eqeqeq: ['error', 'always', { null: 'ignore' }],\n    'for-direction': 'error',\n    'grouped-accessor-pairs': 'error',\n    'guard-for-in': 'error',\n    'getter-return': 'error',\n    'max-classes-per-file': ['error', 1],\n    'no-alert': 'error',\n    'no-caller': 'error',\n    'no-async-promise-executor': 'error',\n    'no-case-declarations': 'error',\n    'no-class-assign': 'error',\n    'no-compare-neg-zero': 'error',\n    'no-constructor-return': 'error',\n    'no-await-in-loop': 'error',\n    'no-console': 'warn',\n    'no-cond-assign': 'error',\n    'no-const-assign': 'error',\n    'no-constant-condition': 'warn',\n    'no-else-return': ['error', { allowElseIf: false }],\n    'no-control-regex': 'error',\n    'no-debugger': 'error',\n    'no-delete-var': 'error',\n    'no-dupe-args': 'error',\n    'no-dupe-class-members': 'error',\n    'no-dupe-else-if': 'error',\n    'no-dupe-keys': 'error',\n    'no-duplicate-case': 'error',\n    'no-empty': 'error',\n    'no-eval': 'error',\n    'no-empty-character-class': 'error',\n    'no-empty-pattern': 'error',\n    'no-empty-static-block': 'error',\n    'no-extend-native': 'error',\n    'no-extra-bind': 'error',\n    'no-ex-assign': 'error',\n    'no-extra-boolean-cast': 'error',\n    'no-fallthrough': 'error',\n    'no-func-assign': 'error',\n    'no-global-assign': 'error',\n    'no-import-assign': 'error',\n    'no-invalid-regexp': 'error',\n    'no-implied-eval': 'error',\n    'no-iterator': 'error',\n    'no-irregular-whitespace': 'error',\n    'no-loss-of-precision': 'error',\n    'no-lone-blocks': 'error',\n    'no-loop-func': 'error',\n    'no-labels': ['error', { allowLoop: false, allowSwitch: false }],\n    'no-misleading-character-class': 'error',\n    'no-new-native-nonconstructor': 'error',\n    'no-nonoctal-decimal-escape': 'error',\n    'no-obj-calls': 'error',\n    'no-new-func': 'error',\n    'no-octal': 'error',\n    'no-octal-escape': 'error',\n    'no-proto': 'error',\n    'no-prototype-builtins': 'error',\n    'no-script-url': 'error',\n    'no-return-await': 'error',\n    'no-redeclare': 'error',\n    'no-return-assign': ['error', 'always'],\n    'no-regex-spaces': 'error',\n    'no-new-wrappers': 'error',\n    'no-self-assign': 'error',\n    'no-setter-return': 'error',\n    'no-extra-label': 'error',\n    'no-sequences': 'error',\n    'no-throw-literal': 'error',\n    'no-template-curly-in-string': 'error',\n    'no-shadow-restricted-names': 'error',\n    'no-sparse-arrays': 'error',\n    'no-this-before-super': 'error',\n    'no-undef': 'error',\n    'no-unreachable': 'error',\n    'no-unsafe-finally': 'error',\n    'no-unsafe-negation': 'error',\n    'no-unsafe-optional-chaining': 'error',\n    'no-unused-labels': 'error',\n    'no-negated-in-lhs': 'off',\n    'no-unused-vars': ['error', { ignoreRestSiblings: true }],\n    'no-useless-backreference': 'error',\n    'no-useless-concat': 'error',\n    'no-useless-catch': 'error',\n    'no-useless-escape': 'error',\n    'no-useless-return': 'error',\n    'no-void': 'error',\n    'no-with': 'error',\n    'prefer-promise-reject-errors': ['error', { allowEmptyReject: true }],\n    'prefer-regex-literals': ['error', { disallowRedundantWrapping: true }],\n    'prefer-const': 'error',\n    'prefer-rest-params': 'error',\n    'prefer-spread': 'error',\n    radix: 'error',\n    'require-yield': 'error',\n    'use-isnan': 'error',\n    'valid-typeof': 'error',\n    yoda: 'error',\n  },\n};\n\nconst reactConfig = {\n  settings: {\n    react: { version },\n  },\n  plugins: {\n    react: reactPlugin,\n  },\n  rules: {\n    'react/display-name': 'error',\n    'react/jsx-key': 'error',\n    'react/jsx-no-comment-textnodes': 'error',\n    'react/jsx-no-duplicate-props': 'error',\n    'react/jsx-no-target-blank': 'error',\n    'react/jsx-no-undef': 'error',\n    'react/jsx-uses-vars': 'error',\n    'react/no-children-prop': 'error',\n    'react/no-danger-with-children': 'error',\n    'react/no-deprecated': 'error',\n    'react/no-direct-mutation-state': 'error',\n    'react/no-find-dom-node': 'error',\n    'react/no-is-mounted': 'error',\n    'react/no-render-return-value': 'error',\n    'react/no-string-refs': 'error',\n    'react/no-unescaped-entities': 'error',\n    'react/no-unknown-property': 'error',\n    'react/require-render-return': 'error',\n  },\n  languageOptions: {\n    parserOptions: {\n      jsxPragma: null,\n      ecmaFeatures: {\n        jsx: true,\n      },\n    },\n  },\n};\n\nconst vitestConfig = {\n  files: ['**/*.test.js', '**/*.test.ts'],\n  plugins: {\n    vitest: vitestPlugin,\n  },\n  rules: {\n    'vitest/expect-expect': 'error',\n    'vitest/no-identical-title': 'error',\n    'vitest/no-commented-out-tests': 'error',\n    'vitest/valid-title': 'error',\n    'vitest/valid-expect': 'error',\n    'vitest/valid-describe-callback': 'error',\n    'vitest/require-local-test-context-for-concurrent-snapshots': 'error',\n    'vitest/no-import-node-test': 'error',\n    'vitest/max-nested-describe': ['error', { max: 3 }],\n  },\n};\n\nconst tsConfig = {\n  files: ['**/*.ts', '**/*.tsx', '**/*.mts', '**/*.cts'],\n  rules: {\n    'constructor-super': 'off',\n    'getter-return': 'off',\n    'no-class-assign': 'off',\n    'no-const-assign': 'off',\n    'no-dupe-args': 'off',\n    'no-dupe-class-members': 'off',\n    'no-dupe-keys': 'off',\n    'no-func-assign': 'off',\n    'no-import-assign': 'off',\n    'no-new-native-nonconstructor': 'off',\n    'no-promise-executor-return': 'error',\n    'no-obj-calls': 'off',\n    'no-redeclare': 'off',\n    'no-setter-return': 'off',\n    'no-this-before-super': 'off',\n    'no-undef': 'off',\n    'no-unreachable': 'off',\n    'no-unsafe-negation': 'off',\n    'no-unused-vars': 'off',\n    '@typescript-eslint/ban-ts-comment': 'error',\n    '@typescript-eslint/no-array-constructor': 'error',\n    '@typescript-eslint/no-duplicate-enum-values': 'error',\n    '@typescript-eslint/no-empty-object-type': 'error',\n    '@typescript-eslint/no-explicit-any': 'off',\n    '@typescript-eslint/no-extra-non-null-assertion': 'error',\n    '@typescript-eslint/no-misused-new': 'error',\n    '@typescript-eslint/no-namespace': 'error',\n    '@typescript-eslint/no-non-null-asserted-optional-chain': 'error',\n    '@typescript-eslint/no-require-imports': 'error',\n    '@typescript-eslint/no-this-alias': 'error',\n    '@typescript-eslint/no-unnecessary-type-constraint': 'error',\n    '@typescript-eslint/no-unsafe-declaration-merging': 'error',\n    '@typescript-eslint/no-unsafe-function-type': 'error',\n    '@typescript-eslint/no-unused-expressions': 'error',\n    '@typescript-eslint/no-unused-vars': 'error',\n    '@typescript-eslint/no-wrapper-object-types': 'error',\n    '@typescript-eslint/prefer-as-const': 'error',\n    '@typescript-eslint/prefer-namespace-keyword': 'error',\n    '@typescript-eslint/triple-slash-reference': 'error',\n  },\n};\n\nconst prettierConfig = {\n  plugins: {\n    prettier: prettierPlugin,\n  },\n  rules: {\n    'prettier/prettier': 'error',\n  },\n};\n\nconst config = [\n  baseConfig,\n  ignoreConfig,\n  globalsConfig,\n  jsConfig,\n  reactConfig,\n  vitestConfig,\n  tsConfig,\n  prettierConfig,\n];\n\nexport default config;\n"
  },
  {
    "path": "lerna.json",
    "content": "{\n  \"version\": \"independent\",\n  \"packages\": [\"packages/*\", \"packages/examples/*\", \"e2e/*\"],\n  \"npmClient\": \"yarn\"\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"private\": true,\n  \"name\": \"@react-pdf/root\",\n  \"version\": \"2.0.0\",\n  \"license\": \"MIT\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"type\": \"module\",\n  \"repository\": \"git@github.com:diegomura/react-pdf.git\",\n  \"workspaces\": [\n    \"packages/*\",\n    \"packages/examples/*\",\n    \"e2e/*\"\n  ],\n  \"scripts\": {\n    \"prepare\": \"husky\",\n    \"build\": \"lerna run build\",\n    \"watch\": \"lerna run watch --parallel\",\n    \"typecheck\": \"lerna run typecheck --parallel\",\n    \"prepublish\": \"lerna run build\",\n    \"lint\": \"eslint packages\",\n    \"test\": \"vitest\",\n    \"dev\": \"lerna run dev --scope @react-pdf/examples --\",\n    \"changeset\": \"changeset\",\n    \"version-packages\": \"changeset version\",\n    \"release\": \"changeset publish\"\n  },\n  \"devDependencies\": {\n    \"@babel/cli\": \"^7.20.7\",\n    \"@babel/core\": \"^7.20.7\",\n    \"@babel/plugin-proposal-class-properties\": \"^7.18.6\",\n    \"@babel/plugin-proposal-optional-chaining\": \"^7.20.7\",\n    \"@babel/plugin-transform-nullish-coalescing-operator\": \"^7.26.6\",\n    \"@babel/plugin-transform-runtime\": \"^7.19.6\",\n    \"@babel/preset-env\": \"^7.20.2\",\n    \"@babel/preset-react\": \"^7.18.6\",\n    \"@changesets/changelog-github\": \"^0.4.8\",\n    \"@changesets/cli\": \"^2.26.0\",\n    \"@rollup/plugin-alias\": \"^5.1.0\",\n    \"@rollup/plugin-babel\": \"^6.0.0\",\n    \"@rollup/plugin-commonjs\": \"^25.0.0\",\n    \"@rollup/plugin-json\": \"^6.1.0\",\n    \"@rollup/plugin-node-resolve\": \"^15.2.0\",\n    \"@rollup/plugin-replace\": \"^5.0.0\",\n    \"@rollup/plugin-terser\": \"^0.4.4\",\n    \"@rollup/plugin-typescript\": \"^12.1.2\",\n    \"@testing-library/react\": \"^14.0.0\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.23.0\",\n    \"@typescript-eslint/parser\": \"^8.23.0\",\n    \"@typescript-eslint/utils\": \"^8.23.0\",\n    \"@vitejs/plugin-react\": \"^4.2.1\",\n    \"@vitest/eslint-plugin\": \"^1.1.27\",\n    \"babel-plugin-add-module-exports\": \"^1.0.0\",\n    \"canvas\": \"^2.11.2\",\n    \"chalk\": \"^2.4.2\",\n    \"eslint\": \"^9.20.0\",\n    \"eslint-config-prettier\": \"^10.0.1\",\n    \"eslint-plugin-prettier\": \"^5.2.3\",\n    \"eslint-plugin-react\": \"^7.37.4\",\n    \"husky\": \"^9.0.0\",\n    \"jest-image-snapshot\": \"^6.1.0\",\n    \"jiti\": \"^2.4.2\",\n    \"jsdom\": \"^23.2.0\",\n    \"lerna\": \"^8.0.2\",\n    \"lint-staged\": \"^10.5.4\",\n    \"pdfjs-dist\": \"3.2.146\",\n    \"prettier\": \"^3.2.0\",\n    \"react\": \"^18.2.0\",\n    \"react-16\": \"npm:react@^16.8.0\",\n    \"react-17\": \"npm:react@^17.0.0\",\n    \"react-19\": \"npm:react@19.0.0-rc-66855b96-20241106\",\n    \"react-19-2\": \"npm:react@^19.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-dom-16\": \"npm:react-dom@^16.8.0\",\n    \"react-dom-17\": \"npm:react-dom@^17.0.0\",\n    \"react-dom-19\": \"npm:react-dom@19.0.0-rc-66855b96-20241106\",\n    \"react-dom-19-2\": \"npm:react-dom@^19.2.0\",\n    \"rimraf\": \"^2.6.3\",\n    \"rollup\": \"^4.34.6\",\n    \"rollup-plugin-copy\": \"^3.5.0\",\n    \"rollup-plugin-delete\": \"^2.1.0\",\n    \"rollup-plugin-dts\": \"^6.1.1\",\n    \"rollup-plugin-ignore\": \"^1.0.10\",\n    \"rollup-plugin-local-resolve\": \"^1.0.7\",\n    \"rollup-plugin-polyfill-node\": \"^0.13.0\",\n    \"vitest\": \"^1.2.0\",\n    \"vitest-fetch-mock\": \"^0.2.2\"\n  },\n  \"lint-staged\": {\n    \"*.{js,jsx,ts,tsx}\": [\n      \"yarn lint\",\n      \"prettier --write\"\n    ]\n  },\n  \"collective\": {\n    \"type\": \"opencollective\",\n    \"url\": \"https://opencollective.com/react-pdf\",\n    \"logo\": \"https://opencollective.com/opencollective/logo.txt\"\n  },\n  \"packageManager\": \"yarn@1.22.19\"\n}\n"
  },
  {
    "path": "packages/examples/dev.sh",
    "content": "#!/bin/bash\n\n# Get the directory of the script\nscriptDir=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n\n# Get the list of directories adjacent to the script\ndirs=()\nfor dir in \"$scriptDir\"/*/ ; do\n    [ -d \"$dir\" ] && dirs+=(\"$(basename \"$dir\")\")\ndone\n\n# Check if any directories were found\nif [ ${#dirs[@]} -eq 0 ]; then\n    echo \"No example directories found.\"\n    exit 1\nfi\n\nif [ -n \"$1\" ]; then\n    # First argument provided\n    selectedDir=\"$1\"\n    if [[ \" ${dirs[@]} \" =~ \" $selectedDir \" ]]; then\n        echo \"Selected example: $selectedDir\"\n    else\n        echo \"Example '$selectedDir' does not exist adjacent to the script.\"\n        exit 1\n    fi\nelse\n    # No argument provided, prompt the user to select one\n    echo \"Please select an example:\"\n    select selectedDir in \"${dirs[@]}\"; do\n        if [ -n \"$selectedDir\" ]; then\n            echo \"You selected: $selectedDir\"\n            break\n        else\n            echo \"Invalid selection.\"\n        fi\n    done\nfi\n\n# Run 'yarn dev' inside the selected directory\ncd \"$scriptDir/$selectedDir\" || { echo \"Failed to change directory to $scriptDir/$selectedDir\"; exit 1; }\n\necho \"Running 'yarn dev' in $scriptDir/$selectedDir\"\nyarn dev\n"
  },
  {
    "path": "packages/examples/next-14/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n.yarn/install-state.gz\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# local env files\n.env*.local\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n"
  },
  {
    "path": "packages/examples/next-14/CHANGELOG.md",
    "content": "# next-14\n\n## 0.1.17\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.3.2\n\n## 0.1.16\n\n### Patch Changes\n\n- Updated dependencies [[`dcc7b403`](https://github.com/diegomura/react-pdf/commit/dcc7b40313b5662b9bd16678fbc0b62eeaf65d71)]:\n  - @react-pdf/renderer@4.3.1\n\n## 0.1.15\n\n### Patch Changes\n\n- Updated dependencies [[`01b4ff5c`](https://github.com/diegomura/react-pdf/commit/01b4ff5cb00420dd37c2f28fb95822dd18cdd982), [`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a)]:\n  - @react-pdf/renderer@4.3.0\n\n## 0.1.14\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.4\n\n## 0.1.13\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.3\n\n## 0.1.12\n\n### Patch Changes\n\n- Updated dependencies [[`226467e3`](https://github.com/diegomura/react-pdf/commit/226467e39443d3690b8f8c3298aa8278b43fbfa6)]:\n  - @react-pdf/renderer@4.2.2\n\n## 0.1.11\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.1\n\n## 0.1.10\n\n### Patch Changes\n\n- Updated dependencies [[`7cd71714`](https://github.com/diegomura/react-pdf/commit/7cd7171472b0f300db56b7805c5f966bf4ced6e2), [`685890bd`](https://github.com/diegomura/react-pdf/commit/685890bd841b7d2480157117fcd3cbb1334f6324)]:\n  - @react-pdf/renderer@4.2.0\n\n## 0.1.9\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.6\n\n## 0.1.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.5\n\n## 0.1.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.4\n\n## 0.1.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.3\n\n## 0.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`aab7d958`](https://github.com/diegomura/react-pdf/commit/aab7d95870d9073e4acb004aa0cce9cfa19b7f0e)]:\n  - @react-pdf/renderer@4.1.2\n\n## 0.1.4\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.1\n\n## 0.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`52b2f253`](https://github.com/diegomura/react-pdf/commit/52b2f25349bee0c09399bc2e7e5e89db5e1433fd)]:\n  - @react-pdf/renderer@4.1.0\n\n## 0.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`7add014c`](https://github.com/diegomura/react-pdf/commit/7add014c6bc9cff649dd1a56fc47214888613b6b)]:\n  - @react-pdf/renderer@4.0.2\n\n## 0.1.1\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.0.1\n"
  },
  {
    "path": "packages/examples/next-14/README.md",
    "content": "This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).\n\n## Getting Started\n\nFirst, run the development server:\n\n```bash\nnpm run dev\n# or\nyarn dev\n# or\npnpm dev\n# or\nbun dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n\nYou can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.\n\nThis project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.\n\n## Learn More\n\nTo learn more about Next.js, take a look at the following resources:\n\n- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.\n- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.\n\nYou can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!\n\n## Deploy on Vercel\n\nThe easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.\n\nCheck out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.\n"
  },
  {
    "path": "packages/examples/next-14/app/globals.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n"
  },
  {
    "path": "packages/examples/next-14/app/layout.js",
    "content": "import './globals.css';\n\nexport const metadata = {\n  title: 'Create Next App',\n  description: 'Generated by create next app',\n};\n\nexport default function RootLayout({ children }) {\n  return (\n    <html lang=\"en\">\n      <body className=\"antialiased\">{children}</body>\n    </html>\n  );\n}\n"
  },
  {
    "path": "packages/examples/next-14/app/page.js",
    "content": "'use client';\n\nimport {\n  Document,\n  Page,\n  PDFViewer,\n  PDFDownloadLink,\n  Text,\n} from '@react-pdf/renderer';\n\nexport default function Home() {\n  const doc = (\n    <Document>\n      <Page\n        style={{\n          padding: 40,\n          paddingTop: 32,\n        }}\n      >\n        <Text>Hello world from client</Text>\n      </Page>\n    </Document>\n  );\n\n  return (\n    <div>\n      <PDFViewer className=\"w-full h-svh\">{doc}</PDFViewer>\n\n      <PDFDownloadLink document={doc}>Download</PDFDownloadLink>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/examples/next-14/jsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"paths\": {\n      \"@/*\": [\"./*\"]\n    }\n  }\n}\n"
  },
  {
    "path": "packages/examples/next-14/next.config.mjs",
    "content": "/** @type {import('next').NextConfig} */\nconst nextConfig = {};\n\nexport default nextConfig;\n"
  },
  {
    "path": "packages/examples/next-14/package.json",
    "content": "{\n  \"name\": \"next-14\",\n  \"version\": \"0.1.17\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"next dev\",\n    \"start\": \"next start\",\n    \"lint\": \"next lint\"\n  },\n  \"dependencies\": {\n    \"@react-pdf/renderer\": \"^4.3.2\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"next\": \"15.4.10\"\n  },\n  \"devDependencies\": {\n    \"postcss\": \"^8\",\n    \"tailwindcss\": \"^3.4.17\"\n  }\n}\n"
  },
  {
    "path": "packages/examples/next-14/postcss.config.mjs",
    "content": "/** @type {import('postcss-load-config').Config} */\nconst config = {\n  plugins: {\n    tailwindcss: {},\n  },\n};\n\nexport default config;\n"
  },
  {
    "path": "packages/examples/next-14/tailwind.config.js",
    "content": "/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n  content: [\n    './pages/**/*.{js,ts,jsx,tsx,mdx}',\n    './components/**/*.{js,ts,jsx,tsx,mdx}',\n    './app/**/*.{js,ts,jsx,tsx,mdx}',\n  ],\n  theme: {\n    extend: {\n      colors: {\n        background: 'var(--background)',\n        foreground: 'var(--foreground)',\n      },\n    },\n  },\n  plugins: [],\n};\n"
  },
  {
    "path": "packages/examples/next-15/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.*\n.yarn/*\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/versions\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# env files (can opt-in for committing if needed)\n.env*\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n"
  },
  {
    "path": "packages/examples/next-15/CHANGELOG.md",
    "content": "# next-15\n\n## 0.1.17\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.3.2\n\n## 0.1.16\n\n### Patch Changes\n\n- Updated dependencies [[`dcc7b403`](https://github.com/diegomura/react-pdf/commit/dcc7b40313b5662b9bd16678fbc0b62eeaf65d71)]:\n  - @react-pdf/renderer@4.3.1\n\n## 0.1.15\n\n### Patch Changes\n\n- Updated dependencies [[`01b4ff5c`](https://github.com/diegomura/react-pdf/commit/01b4ff5cb00420dd37c2f28fb95822dd18cdd982), [`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a)]:\n  - @react-pdf/renderer@4.3.0\n\n## 0.1.14\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.4\n\n## 0.1.13\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.3\n\n## 0.1.12\n\n### Patch Changes\n\n- Updated dependencies [[`226467e3`](https://github.com/diegomura/react-pdf/commit/226467e39443d3690b8f8c3298aa8278b43fbfa6)]:\n  - @react-pdf/renderer@4.2.2\n\n## 0.1.11\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.1\n\n## 0.1.10\n\n### Patch Changes\n\n- Updated dependencies [[`7cd71714`](https://github.com/diegomura/react-pdf/commit/7cd7171472b0f300db56b7805c5f966bf4ced6e2), [`685890bd`](https://github.com/diegomura/react-pdf/commit/685890bd841b7d2480157117fcd3cbb1334f6324)]:\n  - @react-pdf/renderer@4.2.0\n\n## 0.1.9\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.6\n\n## 0.1.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.5\n\n## 0.1.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.4\n\n## 0.1.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.3\n\n## 0.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`aab7d958`](https://github.com/diegomura/react-pdf/commit/aab7d95870d9073e4acb004aa0cce9cfa19b7f0e)]:\n  - @react-pdf/renderer@4.1.2\n\n## 0.1.4\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.1\n\n## 0.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`52b2f253`](https://github.com/diegomura/react-pdf/commit/52b2f25349bee0c09399bc2e7e5e89db5e1433fd)]:\n  - @react-pdf/renderer@4.1.0\n\n## 0.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`7add014c`](https://github.com/diegomura/react-pdf/commit/7add014c6bc9cff649dd1a56fc47214888613b6b)]:\n  - @react-pdf/renderer@4.0.2\n\n## 0.1.1\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.0.1\n"
  },
  {
    "path": "packages/examples/next-15/README.md",
    "content": "This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).\n\n## Getting Started\n\nFirst, run the development server:\n\n```bash\nnpm run dev\n# or\nyarn dev\n# or\npnpm dev\n# or\nbun dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n\nYou can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.\n\nThis project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.\n\n## Learn More\n\nTo learn more about Next.js, take a look at the following resources:\n\n- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.\n- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.\n\nYou can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!\n\n## Deploy on Vercel\n\nThe easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.\n\nCheck out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.\n"
  },
  {
    "path": "packages/examples/next-15/app/globals.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n"
  },
  {
    "path": "packages/examples/next-15/app/layout.js",
    "content": "import './globals.css';\n\nexport const metadata = {\n  title: 'Create Next App',\n  description: 'Generated by create next app',\n};\n\nexport default function RootLayout({ children }) {\n  return (\n    <html lang=\"en\">\n      <body className=\"antialiased\">{children}</body>\n    </html>\n  );\n}\n"
  },
  {
    "path": "packages/examples/next-15/app/page.js",
    "content": "'use client';\n\nimport {\n  Document,\n  Page,\n  PDFViewer,\n  PDFDownloadLink,\n  Text,\n} from '@react-pdf/renderer';\n\nexport default function Home() {\n  const doc = (\n    <Document>\n      <Page\n        style={{\n          padding: 40,\n          paddingTop: 32,\n        }}\n      >\n        <Text>Hello world from client</Text>\n      </Page>\n    </Document>\n  );\n\n  return (\n    <div>\n      <PDFViewer className=\"w-full h-svh\">{doc}</PDFViewer>\n\n      <PDFDownloadLink document={doc}>Download</PDFDownloadLink>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/examples/next-15/jsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"paths\": {\n      \"@/*\": [\"./*\"]\n    }\n  }\n}\n"
  },
  {
    "path": "packages/examples/next-15/next.config.mjs",
    "content": "/** @type {import('next').NextConfig} */\nconst nextConfig = {};\n\nexport default nextConfig;\n"
  },
  {
    "path": "packages/examples/next-15/package.json",
    "content": "{\n  \"name\": \"next-15\",\n  \"version\": \"0.1.17\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"next dev\",\n    \"start\": \"next start\",\n    \"lint\": \"next lint\"\n  },\n  \"dependencies\": {\n    \"@react-pdf/renderer\": \"^4.3.2\",\n    \"react\": \"19.1.0\",\n    \"react-dom\": \"19.1.0\",\n    \"next\": \"15.4.10\"\n  },\n  \"devDependencies\": {\n    \"postcss\": \"^8\",\n    \"tailwindcss\": \"^3.4.17\"\n  }\n}\n"
  },
  {
    "path": "packages/examples/next-15/postcss.config.mjs",
    "content": "/** @type {import('postcss-load-config').Config} */\nconst config = {\n  plugins: {\n    tailwindcss: {},\n  },\n};\n\nexport default config;\n"
  },
  {
    "path": "packages/examples/next-15/tailwind.config.js",
    "content": "/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n  content: [\n    './pages/**/*.{js,ts,jsx,tsx,mdx}',\n    './components/**/*.{js,ts,jsx,tsx,mdx}',\n    './app/**/*.{js,ts,jsx,tsx,mdx}',\n  ],\n  theme: {\n    extend: {\n      colors: {\n        background: 'var(--background)',\n        foreground: 'var(--foreground)',\n      },\n    },\n  },\n  plugins: [],\n};\n"
  },
  {
    "path": "packages/examples/package.json",
    "content": "{\n  \"name\": \"@react-pdf/examples\",\n  \"version\": \"0.0.0\",\n  \"license\": \"MIT\",\n  \"private\": true,\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"repository\": \"git@github.com:diegomura/react-pdf.git\",\n  \"scripts\": {\n    \"dev\": \"./dev.sh\"\n  }\n}\n"
  },
  {
    "path": "packages/examples/vite/.gitignore",
    "content": "lib\nnode_modules\n"
  },
  {
    "path": "packages/examples/vite/CHANGELOG.md",
    "content": "# @react-pdf/examples\n\n## 3.3.20\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.3.2\n\n## 3.3.19\n\n### Patch Changes\n\n- Updated dependencies [[`dcc7b403`](https://github.com/diegomura/react-pdf/commit/dcc7b40313b5662b9bd16678fbc0b62eeaf65d71)]:\n  - @react-pdf/renderer@4.3.1\n\n## 3.3.18\n\n### Patch Changes\n\n- Updated dependencies [[`01b4ff5c`](https://github.com/diegomura/react-pdf/commit/01b4ff5cb00420dd37c2f28fb95822dd18cdd982), [`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a)]:\n  - @react-pdf/renderer@4.3.0\n\n## 3.3.17\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.4\n\n## 3.3.16\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.3\n\n## 3.3.15\n\n### Patch Changes\n\n- Updated dependencies [[`226467e3`](https://github.com/diegomura/react-pdf/commit/226467e39443d3690b8f8c3298aa8278b43fbfa6)]:\n  - @react-pdf/renderer@4.2.2\n\n## 3.3.14\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.2.1\n\n## 3.3.13\n\n### Patch Changes\n\n- Updated dependencies [[`7cd71714`](https://github.com/diegomura/react-pdf/commit/7cd7171472b0f300db56b7805c5f966bf4ced6e2), [`685890bd`](https://github.com/diegomura/react-pdf/commit/685890bd841b7d2480157117fcd3cbb1334f6324)]:\n  - @react-pdf/renderer@4.2.0\n\n## 3.3.12\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.6\n\n## 3.3.11\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.5\n\n## 3.3.10\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.4\n\n## 3.3.9\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.3\n\n## 3.3.8\n\n### Patch Changes\n\n- Updated dependencies [[`aab7d958`](https://github.com/diegomura/react-pdf/commit/aab7d95870d9073e4acb004aa0cce9cfa19b7f0e)]:\n  - @react-pdf/renderer@4.1.2\n\n## 3.3.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.1.1\n\n## 3.3.6\n\n### Patch Changes\n\n- Updated dependencies [[`52b2f253`](https://github.com/diegomura/react-pdf/commit/52b2f25349bee0c09399bc2e7e5e89db5e1433fd)]:\n  - @react-pdf/renderer@4.1.0\n\n## 3.3.5\n\n### Patch Changes\n\n- Updated dependencies [[`7add014c`](https://github.com/diegomura/react-pdf/commit/7add014c6bc9cff649dd1a56fc47214888613b6b)]:\n  - @react-pdf/renderer@4.0.2\n\n## 3.3.4\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@4.0.1\n\n## 3.3.3\n\n### Patch Changes\n\n- Updated dependencies [[`afe4bcfe`](https://github.com/diegomura/react-pdf/commit/afe4bcfe6f4b991cf22341242fc27d169b758d47), [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119)]:\n  - @react-pdf/renderer@4.0.0\n\n## 3.3.2\n\n### Patch Changes\n\n- [#2747](https://github.com/diegomura/react-pdf/pull/2747) [`5af35ec`](https://github.com/diegomura/react-pdf/commit/5af35ec9743cc0d7bf75f5ca789627517ff35816) Thanks [@andrew-spare](https://github.com/andrew-spare)! - fix: font selection regression\n\n- Updated dependencies [[`ed94775`](https://github.com/diegomura/react-pdf/commit/ed94775f4d44db0886ff08c71d09f446bace6392)]:\n  - @react-pdf/renderer@3.4.5\n\n## 3.3.1\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.4.4\n\n## 3.3.0\n\n### Minor Changes\n\n- [#2640](https://github.com/diegomura/react-pdf/pull/2640) [`67c265a`](https://github.com/diegomura/react-pdf/commit/67c265a7e39cc0baa319f49137219677904695e6) Thanks [@nikgraf](https://github.com/nikgraf)! - Add support for fontFamily fallbacks e.g. fontFamily: ['Roboto', 'NotoSansArabic']\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.4.3\n\n## 3.2.13\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.4.2\n\n## 3.2.12\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.4.1\n\n## 3.2.11\n\n### Patch Changes\n\n- Updated dependencies [[`fab09cc`](https://github.com/diegomura/react-pdf/commit/fab09cc9814326fdb44d2bcb7097ba9960d441d1)]:\n  - @react-pdf/renderer@3.4.0\n\n## 3.2.10\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.3.8\n\n## 3.2.9\n\n### Patch Changes\n\n- Updated dependencies [[`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71)]:\n  - @react-pdf/renderer@3.3.7\n\n## 3.2.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.3.6\n\n## 3.2.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.3.5\n\n## 3.2.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.3.4\n\n## 3.2.5\n\n### Patch Changes\n\n- Updated dependencies [[`b5380a1`](https://github.com/diegomura/react-pdf/commit/b5380a1a0a7397b4111d68ce97b4acb702d34d51)]:\n  - @react-pdf/renderer@3.3.3\n\n## 3.2.4\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.3.2\n\n## 3.2.3\n\n### Patch Changes\n\n- [#2529](https://github.com/diegomura/react-pdf/pull/2529) [`a35b1ba`](https://github.com/diegomura/react-pdf/commit/a35b1ba18d293df51293600d8d56015094d222d8) Thanks [@diegomura](https://github.com/diegomura)! - fix: jpeg exif orientation rendering\n\n- Updated dependencies [[`a35b1ba`](https://github.com/diegomura/react-pdf/commit/a35b1ba18d293df51293600d8d56015094d222d8)]:\n  - @react-pdf/renderer@3.3.1\n\n## 3.2.2\n\n### Patch Changes\n\n- [#2518](https://github.com/diegomura/react-pdf/pull/2518) [`3c62070`](https://github.com/diegomura/react-pdf/commit/3c6207035d2f02109bb2b5ef8804febc5a05b488) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Fix invalid prop (style) in Resume example\n\n* [#2521](https://github.com/diegomura/react-pdf/pull/2521) [`214207b`](https://github.com/diegomura/react-pdf/commit/214207b62bc8061a46a7cb220901e193d327effe) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Fix invalid display property in objectFit example\n\n- [#2517](https://github.com/diegomura/react-pdf/pull/2517) [`bc0d4f4`](https://github.com/diegomura/react-pdf/commit/bc0d4f42fe5d8b8bd2fb560b753041fbf013ab33) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Fix invalid props (xmlns, id) in SVG example\n\n- Updated dependencies [[`64f7bba`](https://github.com/diegomura/react-pdf/commit/64f7bba0d840d17188e50086169c84c415abd8d5), [`e817223`](https://github.com/diegomura/react-pdf/commit/e8172231d07d10ece4ca960641f9ee52c5d4660d), [`cf73180`](https://github.com/diegomura/react-pdf/commit/cf7318069e63170e160a36602359fc8cbc3386c2), [`0f5c43f`](https://github.com/diegomura/react-pdf/commit/0f5c43fa6f3c0b53c067200cc1ac21e651504760), [`66a40b2`](https://github.com/diegomura/react-pdf/commit/66a40b2e41cefe11f1ef8d467ba449a8861adb69)]:\n  - @react-pdf/renderer@3.3.0\n\n## 3.2.1\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.2.1\n\n## 3.2.0\n\n### Minor Changes\n\n- [#2409](https://github.com/diegomura/react-pdf/pull/2409) [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Add support for native ESM\n\n* [#2496](https://github.com/diegomura/react-pdf/pull/2496) [`c8fe2c8`](https://github.com/diegomura/react-pdf/commit/c8fe2c86639cb8e44f26f78e62fc67379a8e3ceb) Thanks [@diegomura](https://github.com/diegomura)! - fix: copyright and registered symbol rendering\n\n### Patch Changes\n\n- Updated dependencies [[`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37)]:\n  - @react-pdf/renderer@3.2.0\n\n## 3.1.0\n\n### Minor Changes\n\n- [#2491](https://github.com/diegomura/react-pdf/pull/2491) [`ed8524f`](https://github.com/diegomura/react-pdf/commit/ed8524f867f71fc8407faeb74edc4574e99a1137) Thanks [@diegomura](https://github.com/diegomura)! - feat: add minPresenceAhead example\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.1.17\n\n## 3.0.0\n\n### Major Changes\n\n- [#2487](https://github.com/diegomura/react-pdf/pull/2487) [`3f31046`](https://github.com/diegomura/react-pdf/commit/3f310460dcadb7bd65adeab0309812aa757cde29) Thanks [@diegomura](https://github.com/diegomura)! - add dev script\n\n### Patch Changes\n\n- [#2479](https://github.com/diegomura/react-pdf/pull/2479) [`45b2bd3`](https://github.com/diegomura/react-pdf/commit/45b2bd37037c605727ad5783f2f2a438dc19cac4) Thanks [@diegomura](https://github.com/diegomura)! - fix linting\n\n- Updated dependencies [[`8654d00`](https://github.com/diegomura/react-pdf/commit/8654d003023dd0899cddfc2ea2f5a552e01cf570)]:\n  - @react-pdf/renderer@3.1.16\n\n## 2.0.14\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.1.15\n\n## 2.0.13\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.1.14\n\n## 2.0.12\n\n### Patch Changes\n\n- Updated dependencies [[`3b5e1c7`](https://github.com/diegomura/react-pdf/commit/3b5e1c7c71a0f830ae2b70da8aac2b2bd5015ca3)]:\n  - @react-pdf/renderer@3.1.13\n\n## 2.0.11\n\n### Patch Changes\n\n- Updated dependencies [[`6d408c8`](https://github.com/diegomura/react-pdf/commit/6d408c838b1aa9bea0db63bf36b2a6932a20404c)]:\n  - @react-pdf/renderer@3.1.12\n\n## 2.0.10\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.1.11\n\n## 2.0.9\n\n### Patch Changes\n\n- Updated dependencies [[`113de53`](https://github.com/diegomura/react-pdf/commit/113de537b0fa9bae06a69e7c8daa988fe319fc6a), [`d6018d5`](https://github.com/diegomura/react-pdf/commit/d6018d5a80492270ff5f5b4c00e694f7dc1cd93f)]:\n  - @react-pdf/renderer@3.1.10\n\n## 2.0.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.1.9\n\n## 2.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`5832ff2`](https://github.com/diegomura/react-pdf/commit/5832ff20e1ce4a0e49cf5249dcdf4b304eab04c6), [`37bfa1b`](https://github.com/diegomura/react-pdf/commit/37bfa1ba26386d1725f42ba5e108d8c72aa71e85)]:\n  - @react-pdf/renderer@3.1.8\n\n## 2.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`b194b61`](https://github.com/diegomura/react-pdf/commit/b194b619b19a7683b64d47eaa2573635e6884e8d)]:\n  - @react-pdf/renderer@3.1.7\n\n## 2.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`9a5e0be`](https://github.com/diegomura/react-pdf/commit/9a5e0befb89756db07ce053192a136df9d4ba905), [`f6667e7`](https://github.com/diegomura/react-pdf/commit/f6667e75449c241d02f9f44fb717a71443c555c1)]:\n  - @react-pdf/renderer@3.1.6\n\n## 2.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`f4d2b68`](https://github.com/diegomura/react-pdf/commit/f4d2b68765d146e4718140f65eeceb7e69e2cfee), [`75150ca`](https://github.com/diegomura/react-pdf/commit/75150ca137b709fcab6e7cefee9dfac6b48d5aaa)]:\n  - @react-pdf/renderer@3.1.5\n\n## 2.0.3\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/renderer@3.1.4\n\n## 2.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81), [`d1f3d5b`](https://github.com/diegomura/react-pdf/commit/d1f3d5b9b4103705e95e2160347ee253d842ed5d), [`7eefc33`](https://github.com/diegomura/react-pdf/commit/7eefc3323390c59bf6d4f923749526831572ef1a), [`3b054b7`](https://github.com/diegomura/react-pdf/commit/3b054b711f5dc0b1c4fd29feaf85b430baad2663), [`9996158`](https://github.com/diegomura/react-pdf/commit/9996158636edf2118c4a6dcce08a00408b982993)]:\n  - @react-pdf/renderer@3.0.0\n\n## 2.0.1\n\n### Patch Changes\n\n- [#1827](https://github.com/diegomura/react-pdf/pull/1827) [`7c1d373`](https://github.com/diegomura/react-pdf/commit/7c1d373a06b04369e762069be4b96d4e40371ecc) Thanks [@diegomura](https://github.com/diegomura)! - refactor: remove ramda from layout package\n\n- Updated dependencies [[`6c799ec`](https://github.com/diegomura/react-pdf/commit/6c799ec1bbe17106df6db109df4a62c70e39bd24)]:\n  - @react-pdf/renderer@2.1.2\n"
  },
  {
    "path": "packages/examples/vite/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n> React-pdf examples\n\n## Catalog\n\n<table>\n\t<tbody>\n\t\t<tr>\n\t\t\t<td align=\"center\" valign=\"top\">\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/text/\">\n\t\t\t\t\t<img width=\"150\" height=\"150\" src=\"https://github.com/diegomura/react-pdf/blob/master/packages/examples/src/text/thumb.png?raw=true\">\n\t\t\t\t</a>\n\t\t\t\t<br>\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/text/\">Text</a>\n\t\t\t</td>\n\t\t\t<td align=\"center\" valign=\"top\">\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/resume/\">\n\t\t\t\t\t<img width=\"150\" height=\"150\" src=\"https://github.com/diegomura/react-pdf/blob/master/packages/examples/src/resume/thumb.png?raw=true\">\n\t\t\t\t</a>\n\t\t\t\t<br>\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/resume/\">Resume</a>\n\t\t\t</td>\n\t\t\t<td align=\"center\" valign=\"top\">\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/fractals/\">\n\t\t\t\t\t<img width=\"150\" height=\"150\" src=\"https://github.com/diegomura/react-pdf/blob/master/packages/examples/src/fractals/thumb.png?raw=true\">\n\t\t\t\t</a>\n\t\t\t\t<br>\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/fractals/\">Fractals</a>\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n<table>\n\t<tbody>\n\t\t<tr>\n\t\t\t<td align=\"center\" valign=\"top\">\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/knobs/\">\n\t\t\t\t\t<img width=\"150\" height=\"150\" src=\"https://github.com/diegomura/react-pdf/blob/master/packages/examples/src/knobs/thumb.png?raw=true\">\n\t\t\t\t</a>\n\t\t\t\t<br>\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/knobs/\">Knobs</a>\n\t\t\t</td>\n\t\t\t<td align=\"center\" valign=\"top\">\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/pageWrap/\">\n\t\t\t\t\t<img width=\"150\" height=\"150\" src=\"https://github.com/diegomura/react-pdf/blob/master/packages/examples/src/pageWrap/thumb.png?raw=true\">\n\t\t\t\t</a>\n\t\t\t\t<br>\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/pageWrap/\">Page wrap</a>\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n\n## License\n\nMIT © [Diego Muracciole](http://github.com/diegomura)\n"
  },
  {
    "path": "packages/examples/vite/declarations.d.ts",
    "content": "declare module '*.jpg' {\n  const src: string;\n  export default src;\n}\n\ndeclare module '*.jpeg' {\n  const src: string;\n  export default src;\n}\n\ndeclare module '*.png' {\n  const src: string;\n  export default src;\n}\n\ndeclare module '*.ttf' {\n  const src: string;\n  export default src;\n}\n"
  },
  {
    "path": "packages/examples/vite/package.json",
    "content": "{\n  \"name\": \"@react-pdf/vite-example\",\n  \"version\": \"3.3.20\",\n  \"license\": \"MIT\",\n  \"private\": true,\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"repository\": \"git@github.com:diegomura/react-pdf.git\",\n  \"scripts\": {\n    \"dev\": \"vite ./src --open\",\n    \"build:site\": \"vite build ./src\"\n  },\n  \"dependencies\": {\n    \"@react-pdf/renderer\": \"^4.3.2\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\",\n    \"react-dom\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n  },\n  \"devDependencies\": {\n    \"@vitejs/plugin-react\": \"^4.2.1\",\n    \"autoprefixer\": \"^10.4.20\",\n    \"postcss\": \"^8.4.47\",\n    \"tailwindcss\": \"^3.4.17\",\n    \"vite\": \"^5.0.11\"\n  }\n}\n"
  },
  {
    "path": "packages/examples/vite/postcss.config.js",
    "content": "module.exports = {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n  },\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/duplicated-images/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, Image, StyleSheet } from '@react-pdf/renderer';\n\nimport Quijote1 from '../../../public/quijote1.jpg';\n\nconst styles = StyleSheet.create({\n  body: {\n    paddingTop: 35,\n    paddingBottom: 65,\n    paddingHorizontal: 35,\n  },\n  image: {\n    marginVertical: 15,\n    marginHorizontal: 0,\n    width: 520,\n    height: 200,\n    backgroundColor: 'red',\n    objectFit: 'fill',\n    objectPositionX: 'center',\n    objectPositionY: 'center',\n    borderWith: 2,\n    padding: 2,\n    borderColor: 'blue',\n    borderStyle: 'solid',\n  },\n  image2: {\n    marginVertical: 15,\n    marginHorizontal: 0,\n    width: 300,\n    backgroundColor: 'green',\n    objectFit: 'fill',\n    objectPositionX: 'center',\n    objectPositionY: 'center',\n    borderWith: 2,\n    padding: 2,\n    borderColor: 'blue',\n    borderStyle: 'solid',\n  },\n});\n\nconst MyDoc = () => {\n  return (\n    <Page style={styles.body}>\n      <Image style={styles.image} src={Quijote1} />\n      <Image style={styles.image2} src={Quijote1} />\n      <Image style={styles.image} src={Quijote1} />\n      <Image style={styles.image2} src={Quijote1} />\n    </Page>\n  );\n};\n\nconst DuplicatedImages = () => {\n  return (\n    <Document>\n      <MyDoc />\n    </Document>\n  );\n};\n\nexport default {\n  id: 'duplicated-images',\n  name: 'Duplicated Images',\n  description: '',\n  Document: DuplicatedImages,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/ellipsis/index.tsx",
    "content": "import React from 'react';\nimport {\n  Document,\n  Page,\n  Text,\n  View,\n  StyleSheet,\n  Font,\n} from '@react-pdf/renderer';\n\nimport RobotoFont from '../../../public/Roboto-Regular.ttf';\n\nconst styles = StyleSheet.create({\n  body: {\n    paddingTop: 35,\n    paddingBottom: 65,\n    paddingHorizontal: 35,\n  },\n  text: {\n    fontSize: 15,\n    maxLines: 1,\n    fontColor: '#000000',\n    textOverflow: 'ellipsis',\n    fontFamily: 'Roboto',\n  },\n});\n\nFont.register({\n  family: 'Roboto',\n  fonts: [\n    {\n      src: RobotoFont,\n      fontWeight: 400,\n    },\n  ],\n});\n\nconst MyDoc = () => {\n  return (\n    <Page style={styles.body}>\n      <View style={{ width: 70 }}>\n        <Text style={styles.text}>And here here</Text>\n      </View>\n    </Page>\n  );\n};\n\nconst Ellipsis = () => {\n  return (\n    <Document>\n      <MyDoc />\n    </Document>\n  );\n};\n\nexport default {\n  id: 'ellipsis',\n  name: 'Ellipsis',\n  description: '',\n  Document: Ellipsis,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/emoji/index.tsx",
    "content": "import React from 'react';\nimport {\n  Document,\n  Page,\n  View,\n  Text,\n  Font,\n  StyleSheet,\n} from '@react-pdf/renderer';\n\nconst styles = StyleSheet.create({\n  container: {\n    height: 700,\n    marginVertical: 70,\n    marginHorizontal: '10%',\n  },\n  text: {\n    fontSize: 100,\n    textAlign: 'center',\n  },\n});\n\nFont.registerEmojiSource({\n  format: 'png',\n  url: 'https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/',\n});\n\nconst Emoji = () => (\n  <Document>\n    <Page>\n      <View style={styles.container}>\n        <Text style={styles.text}>😀💩👻🙈</Text>\n      </View>\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'emoji',\n  name: 'Emoji',\n  description: '',\n  Document: Emoji,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/font-family-fallback/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, Text, StyleSheet, Font } from '@react-pdf/renderer';\n\nimport RobotoFont from '../../../public/Roboto-Regular.ttf';\nimport RobotoBoldFont from '../../../public/Roboto-Bold.ttf';\nimport RobotItalicFont from '../../../public/Roboto-Italic.ttf';\n\nimport NotoSansArabicFont from '../../../public/NotoSansArabic-Regular.ttf';\n\nconst styles = StyleSheet.create({\n  body: {\n    paddingTop: 35,\n    paddingBottom: 45,\n    paddingHorizontal: 35,\n    position: 'relative',\n  },\n  regular: {\n    fontFamily: ['Roboto', 'NotoSansArabic'],\n    fontSize: '14',\n    fontWeight: 900,\n  },\n  default: {\n    fontFamily: ['Courier-Bold', 'NotoSansArabic'],\n    fontSize: '14',\n  },\n});\n\nFont.register({\n  family: 'Roboto',\n  fonts: [\n    {\n      src: RobotoFont,\n      fontStyle: 'normal',\n      fontWeight: 'normal',\n    },\n    {\n      src: RobotItalicFont,\n      fontStyle: 'italic',\n      fontWeight: 'normal',\n    },\n    {\n      src: RobotoBoldFont,\n      fontStyle: 'normal',\n      fontWeight: 'bold',\n    },\n  ],\n});\n\nFont.register({\n  family: 'NotoSansArabic',\n  fonts: [\n    {\n      src: NotoSansArabicFont,\n      fontWeight: 400,\n    },\n  ],\n});\n\nconst MyDoc = () => {\n  return (\n    <Page style={styles.body}>\n      <Text style={{ fontFamily: 'Courier', marginBottom: '20px' }}>\n        This font is default Courier\n      </Text>\n\n      <Text style={{ fontSize: 10 }}>\n        The following is partially Roboto and Noto Sans Arabic\n      </Text>\n      <Text style={[styles.regular, { marginBottom: '20px' }]}>\n        Roboto / امتحان\n      </Text>\n\n      <Text style={{ fontSize: 10 }}>\n        The following is partially Courier-Bold and Noto Sans Arabic\n      </Text>\n      <Text style={[styles.default, { marginBottom: '20px' }]}>\n        Courier-Bold / امتحان\n      </Text>\n\n      <Text style={{ fontSize: 10 }}>\n        The following are multiple font families, weights, and styles all on the\n        same line\n      </Text>\n      <Text style={{ fontFamily: 'Roboto' }}>\n        Roboto Normal{' / '}\n        <Text style={{ fontWeight: 'bold' }}>Roboto Bold</Text>\n        {' / '}\n        <Text style={{ fontStyle: 'italic' }}>Roboto Italic</Text>\n        {' / '}\n        <Text style={{ fontFamily: 'Courier' }}>Courier</Text>\n      </Text>\n    </Page>\n  );\n};\n\nconst FontFamilyFallback = () => {\n  return (\n    <Document>\n      <MyDoc />\n    </Document>\n  );\n};\n\nexport default {\n  id: 'font-family-fallback',\n  name: 'Font Family Fallback',\n  description: '',\n  Document: FontFamilyFallback,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/font-weight/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, Text, StyleSheet, Font } from '@react-pdf/renderer';\n\nimport RobotoFont from '../../../public/Roboto-Regular.ttf';\nimport RobotoFontMedium from '../../../public/Roboto-Medium.ttf';\nimport RobotoFontBold from '../../../public/Roboto-Bold.ttf';\nimport RobotoFontBlack from '../../../public/Roboto-Black.ttf';\n\nconst styles = StyleSheet.create({\n  body: {\n    paddingTop: 35,\n    paddingBottom: 45,\n    paddingHorizontal: 35,\n    position: 'relative',\n  },\n  regular: {\n    fontFamily: 'Roboto',\n    fontWeight: 400,\n  },\n  medium: {\n    fontFamily: 'Roboto',\n    fontWeight: 500,\n  },\n  bold: {\n    fontWeight: 600,\n    fontFamily: 'Roboto',\n  },\n  black: {\n    fontWeight: 900,\n    fontFamily: 'Roboto',\n  },\n});\n\nFont.register({\n  family: 'Roboto',\n  fonts: [\n    {\n      src: RobotoFont,\n      fontWeight: 400,\n    },\n    {\n      src: RobotoFontMedium,\n      fontWeight: 500,\n    },\n    {\n      src: RobotoFontBold,\n      fontWeight: 700,\n    },\n    {\n      src: RobotoFontBlack,\n      fontWeight: 900,\n    },\n  ],\n});\n\nconst MyDoc = () => {\n  return (\n    <Page style={styles.body}>\n      <Text style={styles.regular}>Regular text</Text>\n      <Text style={styles.medium}>Medium text</Text>\n      <Text style={styles.bold}>Bold text</Text>\n      <Text style={styles.black}>Black text</Text>\n    </Page>\n  );\n};\n\nconst FontWeight = () => {\n  return (\n    <Document>\n      <MyDoc />\n    </Document>\n  );\n};\n\nexport default {\n  id: 'font-weight',\n  name: 'Font Weight',\n  description: '',\n  Document: FontWeight,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/forms/index.tsx",
    "content": "import React from 'react';\n\nimport {\n  Document,\n  Page,\n  View,\n  Text,\n  Checkbox,\n  FieldSet,\n  TextInput,\n  Select,\n  List,\n  StyleSheet,\n} from '@react-pdf/renderer';\n\nconst styles = StyleSheet.create({\n  fieldset: {\n    flexDirection: 'column',\n    backgroundColor: 'rgba(182,28,28,0.62)',\n    width: '50%',\n    marginBottom: 50,\n  },\n});\n\nconst MyDoc = () => {\n  return (\n    <Page style={{ alignItems: 'center', justifyContent: 'center' }}>\n      <FieldSet name=\"user-info\" style={styles.fieldset}>\n        <Text>TextInput</Text>\n        <TextInput\n          name=\"username\"\n          value=\"foo\"\n          align=\"center\"\n          style={{ height: '50px' }}\n        />\n\n        {/* Nested works as well */}\n        <View>\n          <Text>TextInput</Text>\n          <TextInput\n            name=\"password\"\n            value=\"bar\"\n            align=\"center\"\n            style={{ height: '50px' }}\n            password\n          />\n        </View>\n\n        <Text>Checkbox (not checked)</Text>\n        <Checkbox name=\"checkbox-default\" style={{ height: '20px' }} />\n\n        <Text>Checkbox (checked)</Text>\n        <Checkbox name=\"checkbox-checked\" checked style={{ height: '20px' }} />\n\n        <Text>Select</Text>\n        <Select\n          name=\"combo\"\n          select={['', 'option 1', 'option 2']}\n          value=\"\"\n          defaultValue=\"\"\n          style={{ height: '20px' }}\n        />\n\n        <Text>List</Text>\n        <List\n          name=\"list\"\n          select={['', 'option 1', 'option 2']}\n          value=\"\"\n          defaultValue=\"\"\n          style={{ height: '50px' }}\n        />\n      </FieldSet>\n\n      <FieldSet name=\"user-details\" style={styles.fieldset}>\n        <Text>TextInput (multiline)</Text>\n        <TextInput\n          name=\"details\"\n          value=\"hello\"\n          align=\"center\"\n          multiline\n          style={{ fontSize: 8, height: '100px' }}\n        />\n      </FieldSet>\n\n      <View style={styles.fieldset}>\n        <Text>TextInput (no FieldSet)</Text>\n        <TextInput\n          name=\"textinput-no-fieldset\"\n          value=\"no fieldset\"\n          align=\"center\"\n          style={{ height: '50px' }}\n        />\n\n        <Text>Checkbox (checked, no FieldSet)</Text>\n        <Checkbox\n          name=\"checkbox-no-fieldset\"\n          checked\n          style={{ height: '20px' }}\n        />\n      </View>\n    </Page>\n  );\n};\n\nconst Forms = () => {\n  return (\n    <Document>\n      <MyDoc />\n    </Document>\n  );\n};\n\nexport default {\n  id: 'forms',\n  name: 'Forms',\n  description: '',\n  Document: Forms,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/fractals/Fractal.tsx",
    "content": "import React from 'react';\nimport { Text, View, StyleSheet } from '@react-pdf/renderer';\n\nconst palette = [\n  '#781c81',\n  '#521b80',\n  '#442f8b',\n  '#3f4c9f',\n  '#4069b4',\n  '#4582c1',\n  '#4e96bd',\n  '#5aa6a9',\n  '#68b090',\n  '#7ab878',\n  '#8dbc64',\n  '#a2be56',\n  '#b7bd4b',\n  '#c9b843',\n  '#d8ae3d',\n  '#e29e37',\n  '#e78632',\n  '#e6672d',\n  '#e14427',\n  '#d92120',\n];\n\nconst styles = StyleSheet.create({\n  row: {\n    flexGrow: 1,\n    width: '100%',\n    flexDirection: 'row',\n  },\n  column: {\n    flexGrow: 1,\n    height: '100%',\n    flexDirection: 'column',\n  },\n  text: {\n    margin: 10,\n    fontSize: 10,\n    color: 'white',\n  },\n});\n\nconst toggle = (direction) => (direction === 'column' ? 'row' : 'column');\n\nconst Fractal = ({ steps, direction = 'column' }) => {\n  if (steps === 0) {\n    return null;\n  }\n\n  const fractalStyle = {\n    flexGrow: 1,\n    minWidth: 40,\n    minHeight: 40,\n    alignItems: 'center',\n    justifyContent: 'center',\n    backgroundColor: palette[steps % palette.length],\n  };\n\n  return (\n    <View style={styles[direction]}>\n      <Fractal direction={toggle(direction)} steps={steps - 1} />\n      <View style={fractalStyle}>\n        <Text style={styles.text}>{steps}</Text>\n      </View>\n    </View>\n  );\n};\n\nexport default Fractal;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/fractals/index.tsx",
    "content": "import React from 'react';\nimport { Page, Document } from '@react-pdf/renderer';\n\nimport Fractal from './Fractal';\n\nconst Fractals = () => (\n  <Document>\n    <Page size=\"A4\">\n      <Fractal steps={18} />\n    </Page>\n\n    <Page orientation=\"landscape\" size=\"A4\">\n      <Fractal steps={14} />\n    </Page>\n\n    <Page size=\"B4\">\n      <Fractal steps={10} />\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'fractals',\n  name: 'Fractals',\n  description: '',\n  Document: Fractals,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/go-to/index.tsx",
    "content": "import React from 'react';\nimport { Page, Document, Link, View, Image } from '@react-pdf/renderer';\n\nconst GoTo = () => (\n  <Document>\n    <Page size=\"A4\">\n      <Link href=\"#myDest\">Link to Image</Link>\n    </Page>\n\n    <Page size=\"A4\">\n      <View style={{ height: 300, backgroundColor: 'black' }} />\n      <Image id=\"myDest\" src=\"https://react-pdf.org/images/logo.png\" />\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'go-to',\n  name: 'Go To',\n  description: '',\n  Document: GoTo,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/image-stress-test/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, Image } from '@react-pdf/renderer';\n\nconst IMAGES = [\n  'https://images.unsplash.com/photo-1726557116827-5f2a95d57cab?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726669251120-46ff8c7ce9a3?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726706805887-0ac0e0d3a721?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726527612459-54b061d9c48d?q=80&w=3432&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726533815259-8fe320ac2493?q=80&w=3474&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726392660865-cbf2dc1459b6?q=80&w=3475&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726533862204-8110e6193fe9?q=80&w=3474&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726688205209-c80317c116d3?q=80&w=3493&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726486896376-4d1340e2f672?q=80&w=3474&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725727532120-8b2d88f47fe3?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726121678240-9126d5017990?q=80&w=3558&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726408093361-238693a8d51d?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724279797190-8371a9939494?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726090102306-49df28adaf0f?q=80&w=3474&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1723877896976-8eb1cc6f07b1?q=80&w=2821&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725817901136-70a686d60386?q=80&w=3428&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726247419938-a8980d9fa429?q=80&w=3432&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726092707889-c4ef049d22df?q=80&w=3474&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726436877670-020a158bef47?q=80&w=3542&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725610588109-71d0def86e19?q=80&w=3500&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726182916337-38dca644bc65?q=80&w=3474&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725610588095-f117c0e2a921?q=80&w=3500&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726138400966-63461367804d?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726182886720-9bcfa08da27a?q=80&w=3474&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725714356329-f56f6054f169?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726182875049-a8283fed88da?w=800&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8MjU3fHx8ZW58MHx8fHx8',\n  'https://images.unsplash.com/photo-1725882393508-6652bd21b22c?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726059968922-0396248fdaea?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725652800358-ae3a752cfb68?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726044781679-7c3f20a185ec?q=80&w=3329&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725715443838-1574b8eb1c3a?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725714835081-118a2b0456b2?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725961476494-efa87ae3106a?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725714834280-0c7584637d06?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1726041453467-5fa7dce0251d?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725733802754-c2a87bda47b2?q=80&w=3474&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725610588086-b9e38da987f7?q=80&w=3500&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725663656850-7bc515816fcd?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725900737080-54b5a571b38c?q=80&w=3474&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1709141425206-f5cdeab3e718?q=80&w=3301&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725922638181-3dbab8df0f95?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725864832531-f50f4639dd00?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725961475845-a656bc03c758?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1723662887372-b6f42b6ccd50?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725493280276-658ff7d29fd3?q=80&w=3542&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725832062946-2ec9aae5c4e2?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725638265979-4ff4b828ed5c?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725006705487-36dd870acb7a?q=80&w=3304&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725610588145-a508e5cfe90b?q=80&w=3500&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725610588149-adc351ad606d?q=80&w=3500&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725615357444-6123528686cf?q=80&w=3538&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724589613596-e269be5c0849?q=80&w=3432&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725113114049-31121918636c?q=80&w=3432&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725565175662-3618048d8be2?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1723039914210-a6f13a6931af?q=80&w=3542&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725492114409-01a24b173dbe?q=80&w=3000&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725133306731-fd82b613300f?q=80&w=3542&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725493280155-e8f61af1b65b?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724582586529-62622e50c0b3?q=80&w=3328&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725493279974-ab7bc4e537c8?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725468697616-e35f25d5b0c4?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725449670931-b53a7cb689b9?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724123301969-22859c2a3823?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724437208913-3b82b15fc078?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724699174715-ac3751fe8995?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725053864071-f37ebb5a9d22?q=80&w=3473&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725042893312-5ec0dea9e369?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725072730410-51ca1348c521?w=800&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8NjQ1fHx8ZW58MHx8fHx8',\n  'https://images.unsplash.com/photo-1724525647096-116d4bacbd5f?q=80&w=3432&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724596314963-c71d1e58204d?q=80&w=3328&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725113160838-9efa2a25aa0b?q=80&w=3432&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725267385461-cab515fc1bbe?w=800&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8NjY5fHx8ZW58MHx8fHx8',\n  'https://images.unsplash.com/photo-1725067807346-7340abf76b0d?q=80&w=3536&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725181959662-af4acf689235?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724591634731-5c6004fe6136?q=80&w=3542&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724748860101-589aa7ee8b29?w=800&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8NjgyfHx8ZW58MHx8fHx8',\n  'https://images.unsplash.com/photo-1724786594301-9a00b6ee8704?q=80&w=3295&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724963475892-a3274091955e?q=80&w=3432&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725006709387-d820b307a1f2?q=80&w=3538&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1725014880788-9faccc7ca16e?w=800&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8NzIyfHx8ZW58MHx8fHx8',\n  'https://images.unsplash.com/photo-1724908549265-06972c22ca37?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724858103760-62648ebfa2a3?q=80&w=3130&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724757090342-59922ed19e39?q=80&w=3300&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n  'https://images.unsplash.com/photo-1724689545475-67ff5bc78fac?q=80&w=3360&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',\n];\n\nconst ImageStressTest = () => (\n  <Document>\n    <Page style={{ padding: '20 40' }}>\n      {IMAGES.map((src) => (\n        <Image\n          key={src}\n          src={src}\n          style={{ width: '100%', marginBottom: 10 }}\n        />\n      ))}\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'image-steess-test',\n  name: 'Image Stress Test',\n  description: '',\n  Document: ImageStressTest,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/index.ts",
    "content": "import duplicatedImages from './duplicated-images';\nimport ellipsis from './ellipsis';\nimport emoji from './emoji';\nimport fontFamilyFallback from './font-family-fallback';\nimport fontWeight from './font-weight';\nimport fractals from './fractals';\nimport goTo from './go-to';\nimport imageStressTest from './image-stress-test';\nimport JpgOrientation from './jpg-orientation';\nimport knobs from './knobs';\nimport link from './link';\nimport mediaQueries from './media-queries';\nimport minPresenceAhead from './min-presence-ahead';\nimport multilineText from './multiline-text';\nimport objectFit from './object-fit';\nimport pageWrap from './page-wrap';\nimport resume from './resume';\nimport svg from './svg';\nimport svgTransform from './svg-transform';\nimport transformOrigin from './transform-origin';\nimport forms from './forms';\nimport softHyphens from './soft-hyphens';\n\nconst EXAMPLES = [\n  duplicatedImages,\n  ellipsis,\n  emoji,\n  fontFamilyFallback,\n  fontWeight,\n  fractals,\n  goTo,\n  JpgOrientation,\n  knobs,\n  link,\n  mediaQueries,\n  minPresenceAhead,\n  multilineText,\n  objectFit,\n  pageWrap,\n  resume,\n  svg,\n  svgTransform,\n  transformOrigin,\n  imageStressTest,\n  forms,\n  softHyphens,\n];\n\nexport default EXAMPLES;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/jpg-orientation/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, Image, View } from '@react-pdf/renderer';\n\nimport Orientation1 from './images/orientation-1.jpeg';\nimport Orientation2 from './images/orientation-2.jpeg';\nimport Orientation3 from './images/orientation-3.jpeg';\nimport Orientation4 from './images/orientation-4.jpeg';\nimport Orientation5 from './images/orientation-5.jpeg';\nimport Orientation6 from './images/orientation-6.jpeg';\nimport Orientation7 from './images/orientation-7.jpeg';\nimport Orientation8 from './images/orientation-8.jpeg';\n\nconst JpgOrientation = () => (\n  <Document>\n    <Page>\n      <View style={{ flexDirection: 'row', flexWrap: 'wrap' }}>\n        <Image src={Orientation1} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation2} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation3} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation4} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation5} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation6} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation7} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation8} style={{ width: 220, margin: 5 }} />\n      </View>\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'jpg-orientation',\n  name: 'Jpg Orientation',\n  description: '',\n  Document: JpgOrientation,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/knobs/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, View, Text, StyleSheet } from '@react-pdf/renderer';\n\nconst styles = StyleSheet.create({\n  select: {\n    height: '9%',\n    alignItems: 'center',\n    flexDirection: 'row',\n    paddingHorizontal: '30px',\n  },\n  bar: {\n    flexGrow: 1,\n    height: '10px',\n    backgroundColor: 'gray',\n  },\n  barMiddle: {\n    width: '50%',\n    height: '100%',\n    backgroundColor: 'lightgray',\n    margin: 'auto',\n  },\n  knob: {\n    alignItems: 'center',\n    justifyContent: 'center',\n    width: '20px',\n    height: '20px',\n    borderRadius: 10,\n    borderWidth: 3,\n    borderColor: 'orange',\n    position: 'absolute',\n    backgroundColor: 'white',\n    fontSize: 8,\n    top: -6,\n  },\n  text: {\n    fontSize: 10,\n  },\n});\n\nconst Knob = ({ value }) => (\n  <View style={[styles.knob, { left: `${value - 3}%` }]}>\n    <Text style={{ fontSize: 8 }}>{value}</Text>\n  </View>\n);\n\nconst Select = (props) => (\n  <View style={styles.select}>\n    <Text style={[styles.text, { marginRight: '15px' }]}>0%</Text>\n    <View style={styles.bar}>\n      <View style={styles.barMiddle} />\n      <Knob {...props} />\n    </View>\n    <Text style={[styles.text, { marginLeft: '15px' }]}>100%</Text>\n  </View>\n);\n\nconst Knobs = () => (\n  <Document>\n    <Page size=\"A5\">\n      <Select value={0} />\n      <Select value={10} />\n      <Select value={20} />\n      <Select value={30} />\n      <Select value={40} />\n      <Select value={50} />\n      <Select value={60} />\n      <Select value={70} />\n      <Select value={80} />\n      <Select value={90} />\n      <Select value={100} />\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'knobs',\n  name: 'Knobs',\n  description: '',\n  Document: Knobs,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/link/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, Link, Text, View } from '@react-pdf/renderer';\n\nconst LinkExample = () => (\n  <Document>\n    <Page>\n      <Link src=\"https://google.com\">Some text link</Link>\n\n      <Link src=\"https://google.com\">\n        Some <Text style={{ backgroundColor: 'red' }}>stylized</Text> text link\n      </Link>\n\n      <Link src=\"https://google.com\">\n        <Text>\n          Some <Text style={{ backgroundColor: 'red' }}>stylized</Text> text\n          link\n        </Text>\n      </Link>\n\n      <Link src=\"https://google.com\">\n        <View style={{ width: 40, height: 40, backgroundColor: 'red' }} />\n      </Link>\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'link',\n  name: 'Link',\n  description: '',\n  Document: LinkExample,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/media-queries/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, View, StyleSheet } from '@react-pdf/renderer';\n\nconst styles = StyleSheet.create({\n  body: {\n    padding: 35,\n  },\n  content: {\n    padding: 20,\n    '@media max-width: 400': {\n      flexDirection: 'column',\n    },\n    '@media min-width: 400': {\n      flexDirection: 'row',\n    },\n  },\n  block: {\n    height: 150,\n    width: 150,\n    backgroundColor: 'red',\n  },\n});\n\nconst MediaComponent = () => (\n  <View style={styles.content}>\n    <View style={[styles.block, { backgroundColor: 'red' }]} />\n    <View style={[styles.block, { backgroundColor: 'green' }]} />\n  </View>\n);\n\nconst MediaQueries = () => (\n  <Document>\n    <Page style={styles.body} size={[500, 600]}>\n      <MediaComponent />\n    </Page>\n    <Page style={styles.body} size={[300, 600]}>\n      <MediaComponent />\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'media-queries',\n  name: 'Media Queries',\n  description: '',\n  Document: MediaQueries,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/min-presence-ahead/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, View, Text } from '@react-pdf/renderer';\n\nconst palette = [\n  '#781c81',\n  '#521b80',\n  '#442f8b',\n  '#3f4c9f',\n  '#4069b4',\n  '#4582c1',\n  '#4e96bd',\n  '#5aa6a9',\n  '#68b090',\n  '#7ab878',\n  '#8dbc64',\n  '#a2be56',\n];\n\nconst MinPresenceAhead = () => (\n  <Document>\n    <Page style={{ padding: 20 }}>\n      {palette.map((color, i) => {\n        const minPresenceAhead = i === 8 ? 82 : 0;\n\n        return (\n          <View\n            key={color}\n            wrap={false}\n            minPresenceAhead={i === 8 ? 90 : 0}\n            style={{\n              width: '100%',\n              height: 80,\n              color: 'white',\n              backgroundColor: color,\n            }}\n          >\n            <Text>Index: {i}</Text>\n            <Text>MinPresenceAhead: {minPresenceAhead}</Text>\n          </View>\n        );\n      })}\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'min-presence-ahead',\n  name: 'Min Presence Ahead',\n  description: '',\n  Document: MinPresenceAhead,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/multiline-text/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, View, Text, StyleSheet } from '@react-pdf/renderer';\n\nconst styles = StyleSheet.create({\n  body: {\n    margin: 50,\n  },\n  highlight: {\n    backgroundColor: 'tomato',\n    textDecoration: 'line-through underline',\n  },\n});\n\nconst MultilineText = () => (\n  <Document>\n    <Page size=\"A4\">\n      <View style={styles.body}>\n        <Text style={{ backgroundColor: 'lightgray' }}>\n          Single line text with{' '}\n          <Text style={styles.highlight}>inline text highlighted</Text> Again\n          Black Text\n        </Text>\n\n        <Text style={{ backgroundColor: 'lightgray' }}>\n          Nested Text with{' '}\n          <Text style={styles.highlight}>inline text highlighted</Text> in a\n          long, long, long, long, long, long long\n        </Text>\n      </View>\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'multiline-text',\n  name: 'Multiline Text',\n  description: '',\n  Document: MultilineText,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/object-fit/index.tsx",
    "content": "import React from 'react';\nimport {\n  Document,\n  Page,\n  View,\n  Image,\n  Text,\n  StyleSheet,\n} from '@react-pdf/renderer';\n\nconst styles = StyleSheet.create({\n  image: {\n    objectFit: 'contain',\n    objectPosition: '0%',\n    width: '100%',\n    height: '100%',\n  },\n  surrounding: {\n    width: '200pt',\n    height: '200pt',\n    border: '1px solid red',\n    backgroundColor: 'tomato',\n    marginBottom: '10',\n  },\n});\n\nconst ObjectFit = () => (\n  <Document>\n    <Page>\n      <View style={styles.surrounding}>\n        <Image\n          src=\"https://upload.wikimedia.org/wikipedia/commons/0/0c/Cow_female_black_white.jpg\"\n          style={styles.image}\n        />\n        <Text style={{ textDecoration: 'none' }}>Object Fit Contain</Text>\n      </View>\n      <View style={styles.surrounding}>\n        <Image\n          src=\"https://upload.wikimedia.org/wikipedia/commons/0/0c/Cow_female_black_white.jpg\"\n          style={[styles.image, { objectFit: 'cover' }]}\n        />\n        <Text>Object Fit: Auto</Text>\n      </View>\n      <View style={styles.surrounding}>\n        <Image\n          src=\"https://upload.wikimedia.org/wikipedia/commons/0/0c/Cow_female_black_white.jpg\"\n          style={[styles.image, { objectFit: 'none' }]}\n        />\n        <Text>Object Fit: None</Text>\n      </View>\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'object-fit',\n  name: 'Object Fit',\n  description: '',\n  Document: ObjectFit,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/page-wrap/index.tsx",
    "content": "import React from 'react';\nimport {\n  Document,\n  Font,\n  Text,\n  Page,\n  Image,\n  StyleSheet,\n} from '@react-pdf/renderer';\n\nimport Quijote1 from '../../../public/quijote1.jpg';\nimport Quijote2 from '../../../public/quijote2.png';\n\nFont.register({\n  family: 'Oswald',\n  src: 'https://fonts.gstatic.com/s/oswald/v13/Y_TKV6o8WovbUd3m_X9aAA.ttf',\n});\n\nconst styles = StyleSheet.create({\n  body: {\n    paddingTop: 35,\n    paddingBottom: 65,\n    paddingHorizontal: 35,\n  },\n  title: {\n    fontSize: 24,\n    textAlign: 'center',\n    fontFamily: ['Oswald', 'Helvetica'],\n  },\n  author: {\n    fontSize: 12,\n    textAlign: 'center',\n    marginBottom: 40,\n  },\n  subtitle: {\n    fontSize: 18,\n    margin: 12,\n    fontFamily: 'Oswald',\n  },\n  text: {\n    margin: 12,\n    fontSize: 14,\n    textAlign: 'justify',\n    fontFamily: 'Times-Roman',\n  },\n  image: {\n    marginVertical: 15,\n    marginHorizontal: 100,\n  },\n  header: {\n    fontSize: 12,\n    marginBottom: 20,\n    textAlign: 'center',\n    color: 'grey',\n  },\n  pageNumber: {\n    position: 'absolute',\n    fontSize: 12,\n    bottom: 30,\n    left: 0,\n    right: 0,\n    textAlign: 'center',\n    color: 'grey',\n  },\n});\n\nconst PageWrap = () => (\n  <Document>\n    <Page style={styles.body}>\n      <Text style={styles.header} fixed>\n        ~ Created with react-pdf ~\n      </Text>\n      <Text style={styles.title}>Don Quijote de la Mancha</Text>\n      <Text style={styles.author}>Miguel de Cervantes</Text>\n      <Image style={styles.image} src={Quijote1} />\n      <Text style={styles.subtitle}>\n        Capítulo I: Que trata de la condición y ejercicio del famoso hidalgo D.\n        Quijote de la Mancha\n      </Text>\n      <Text style={styles.text}>\n        En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha\n        mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga\n        antigua, rocín flaco y galgo corredor. Una olla de algo más vaca que\n        carnero, salpicón las más noches, duelos y quebrantos los sábados,\n        lentejas los viernes, algún palomino de añadidura los domingos,\n        consumían las tres partes de su hacienda. El resto della concluían sayo\n        de velarte, calzas de velludo para las fiestas con sus pantuflos de lo\n        mismo, los días de entre semana se honraba con su vellori de lo más\n        fino. Tenía en su casa una ama que pasaba de los cuarenta, y una sobrina\n        que no llegaba a los veinte, y un mozo de campo y plaza, que así\n        ensillaba el rocín como tomaba la podadera. Frisaba la edad de nuestro\n        hidalgo con los cincuenta años, era de complexión recia, seco de carnes,\n        enjuto de rostro; gran madrugador y amigo de la caza. Quieren decir que\n        tenía el sobrenombre de Quijada o Quesada (que en esto hay alguna\n        diferencia en los autores que deste caso escriben), aunque por\n        conjeturas verosímiles se deja entender que se llama Quijana; pero esto\n        importa poco a nuestro cuento; basta que en la narración dél no se salga\n        un punto de la verdad\n      </Text>\n      <Text style={styles.text}>\n        Es, pues, de saber, que este sobredicho hidalgo, los ratos que estaba\n        ocioso (que eran los más del año) se daba a leer libros de caballerías\n        con tanta afición y gusto, que olvidó casi de todo punto el ejercicio de\n        la caza, y aun la administración de su hacienda; y llegó a tanto su\n        curiosidad y desatino en esto, que vendió muchas hanegas de tierra de\n        sembradura, para comprar libros de caballerías en que leer; y así llevó\n        a su casa todos cuantos pudo haber dellos; y de todos ningunos le\n        parecían tan bien como los que compuso el famoso Feliciano de Silva:\n        porque la claridad de su prosa, y aquellas intrincadas razones suyas, le\n        parecían de perlas; y más cuando llegaba a leer aquellos requiebros y\n        cartas de desafío, donde en muchas partes hallaba escrito: la razón de\n        la sinrazón que a mi razón se hace, de tal manera mi razón enflaquece,\n        que con razón me quejo de la vuestra fermosura, y también cuando leía:\n        los altos cielos que de vuestra divinidad divinamente con las estrellas\n        se fortifican, y os hacen merecedora del merecimiento que merece la\n        vuestra grandeza.\n      </Text>\n      <Text style={styles.text}>\n        Con estas y semejantes razones perdía el pobre caballero el juicio, y\n        desvelábase por entenderlas, y desentrañarles el sentido, que no se lo\n        sacara, ni las entendiera el mismo Aristóteles, si resucitara para sólo\n        ello. No estaba muy bien con las heridas que don Belianis daba y\n        recibía, porque se imaginaba que por grandes maestros que le hubiesen\n        curado, no dejaría de tener el rostro y todo el cuerpo lleno de\n        cicatrices y señales; pero con todo alababa en su autor aquel acabar su\n        libro con la promesa de aquella inacabable aventura, y muchas veces le\n        vino deseo de tomar la pluma, y darle fin al pie de la letra como allí\n        se promete; y sin duda alguna lo hiciera, y aun saliera con ello, si\n        otros mayores y continuos pensamientos no se lo estorbaran. Tuvo muchas\n        veces competencia con el cura de su lugar (que era hombre docto graduado\n        en Sigüenza), sobre cuál había sido mejor caballero, Palmerín de\n        Inglaterra o Amadís de Gaula; mas maese Nicolás, barbero del mismo\n        pueblo, decía que ninguno llegaba al caballero del Febo, y que si alguno\n        se le podía comparar, era don Galaor, hermano de Amadís de Gaula, porque\n        tenía muy acomodada condición para todo; que no era caballero\n        melindroso, ni tan llorón como su hermano, y que en lo de la valentía no\n        le iba en zaga.\n      </Text>\n      <Text style={styles.text}>\n        En resolución, él se enfrascó tanto en su lectura, que se le pasaban las\n        noches leyendo de claro en claro, y los días de turbio en turbio, y así,\n        del poco dormir y del mucho leer, se le secó el cerebro, de manera que\n        vino a perder el juicio. Llenósele la fantasía de todo aquello que leía\n        en los libros, así de encantamientos, como de pendencias, batallas,\n        desafíos, heridas, requiebros, amores, tormentas y disparates\n        imposibles, y asentósele de tal modo en la imaginación que era verdad\n        toda aquella máquina de aquellas soñadas invenciones que leía, que para\n        él no había otra historia más cierta en el mundo.\n      </Text>\n      <Text style={styles.subtitle} break>\n        Capítulo II: Que trata de la primera salida que de su tierra hizo el\n        ingenioso Don Quijote\n      </Text>\n      <Image style={styles.image} src={Quijote2} />\n      <Text style={styles.text}>\n        Hechas, pues, estas prevenciones, no quiso aguardar más tiempo a poner\n        en efeto su pensamiento, apretándole a ello la falta que él pensaba que\n        hacía en el mundo su tardanza, según eran los agravios que pensaba\n        deshacer, tuertos que enderezar, sinrazones que emendar y abusos que\n        mejorar y deudas que satisfacer. Y así, sin dar parte a persona alguna\n        de su intención y sin que nadie le viese, una mañana, antes del día, que\n        era uno de los calurosos del mes de Julio, se armó de todas sus armas,\n        subió sobre Rocinante, puesta su mal compuesta celada, embrazó su\n        adarga, tomó su lanza y por la puerta falsa de un corral salió al campo\n        con grandísimo contento y alborozo de ver con cuánta facilidad había\n        dado principio a su buen deseo. Mas apenas se vio en el campo cuando le\n        asaltó un pensamiento terrible, y tal, que por poco le hiciera dejar la\n        comenzada empresa; y fue que le vino a la memoria que no era armado\n        caballero, y que, conforme a ley de caballería, ni podía ni debía tomar\n        armas con ningún caballero; y puesto que lo fuera, había de llevar armas\n        blancas, como novel caballero, sin empresa en el escudo, hasta que por\n        su esfuerzo la ganase. Estos pensamientos le hicieron titubear en su\n        propósito; mas pudiendo más su locura que otra razón alguna, propuso de\n        hacerse armar caballero del primero que topase, a imitación de otros\n        muchos que así lo hicieron, según él había leído en los libros que tal\n        le tenían. En lo de las armas blancas, pensaba limpiarlas de manera, en\n        teniendo lugar, que lo fuesen más que un arminio; y con esto se quietó18\n        y prosiguió su camino, sin llevar otro que aquel que su caballo quería,\n        creyendo que en aquello consistía la fuerza de las aventuras\n      </Text>\n      <Text style={styles.text}>\n        Yendo, pues, caminando nuestro flamante aventurero, iba hablando consigo\n        mesmo, y diciendo: —¿Quién duda, sino que en los venideros tiempos,\n        cuando salga a luz la verdadera historia de mis famosos hechos, que el\n        sabio que los escribiere no ponga, cuando llegue a contar esta mi\n        primera salida tan de mañana, desta manera?: Apenas había el rubicundo\n        Apolo tendido por la faz de la ancha y espaciosa tierra las doradas\n        hebras de sus hermosos cabellos, y apenas los pequeños y pintados\n        pajarillos con sus arpadas lenguas habían saludado con dulce y meliflua\n        armonía la venida de la rosada Aurora, que, dejando la blanda cama del\n        celoso marido, por las puertas y balcones del manchego horizonte a los\n        mortales se mostraba, cuando el famoso caballero don Quijote de la\n        Mancha, dejando las ociosas plumas, subió sobre su famoso caballo\n        Rocinante y comenzó a caminar por el antiguo y conocido Campo de\n        Montiel.\n      </Text>\n      <Text style={styles.text}>\n        Y era la verdad que por él caminaba; y añadió diciendo: —Dichosa edad y\n        siglo dichoso aquel adonde saldrán a luz las famosas hazañas mías,\n        dignas de entallarse en bronces, esculpirse en mármoles y pintarse en\n        tablas, para memoria en lo futuro. ¡Oh tú, sabio encantador, quienquiera\n        que seas, a quien ha de tocar el ser coronista desta peregrina historia!\n        Ruégote que no te olvides de mi buen Rocinante, compañero eterno mío en\n        todos mis caminos y carreras.\n      </Text>\n      <Text style={styles.text}>\n        Luego volvía diciendo, como si verdaderamente fuera enamorado: —¡Oh\n        princesa Dulcinea, señora deste cautivo corazón! Mucho agravio me\n        habedes fecho en despedirme y reprocharme con el riguroso afincamiento\n        de mandarme no parecer ante la vuestra fermosura. Plégaos, señora, de\n        membraros deste vuestro sujeto corazón, que tantas cuitas por vuestro\n        amor padece. Con estos iba ensartando otros disparates, todos al modo de\n        los que sus libros le habían enseñado, imitando en cuanto podía su\n        lenguaje. Con esto caminaba tan despacio, y el sol entraba tan apriesa y\n        con tanto ardor, que fuera bastante a derretirle los sesos, si algunos\n        tuviera\n      </Text>\n      <Text style={styles.text}>\n        Casi todo aquel día caminó sin acontecerle cosa que de contar fuese, de\n        lo cual se desesperaba, porque quisiera topar luego luego con quien\n        hacer experiencia del valor de su fuerte brazo. Autores hay que dicen\n        que la primera aventura que le avino fue la del Puerto Lápice, otros\n        dicen que la de los molinos de viento; pero lo que yo he podido\n        averiguar en este caso, y lo que he hallado escrito en los anales de la\n        Mancha, es que él anduvo todo aquel día, y, al anochecer, su rocín y él\n        se hallaron cansados y muertos de hambre, y que, mirando a todas partes\n        por ver si descubriría algún castillo o alguna majada de pastores donde\n        recogerse y adonde pudiese remediar su mucha hambre y necesidad, vio, no\n        lejos del camino por donde iba, una venta,que fue como si viera una\n        estrella que, no a los portales, sino a los alcázares de su redención le\n        encaminaba. Diose priesa a caminar, y llegó a ella a tiempo que\n        anochecía.\n      </Text>\n\n      <Text\n        fixed\n        style={styles.pageNumber}\n        render={({ pageNumber, totalPages }) => `${pageNumber} / ${totalPages}`}\n      />\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'page-wrap',\n  name: 'Page Wrap',\n  description: '',\n  Document: PageWrap,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/resume/Education.tsx",
    "content": "import React from 'react';\nimport { Text, View, StyleSheet } from '@react-pdf/renderer';\n\nimport Title from './Title';\n\nconst styles = StyleSheet.create({\n  container: {\n    marginBottom: 10,\n  },\n  school: {\n    fontFamily: 'Lato Bold',\n    fontSize: 10,\n  },\n  degree: {\n    fontFamily: 'Lato',\n    fontSize: 10,\n  },\n  candidate: {\n    fontFamily: 'Lato Italic',\n    fontSize: 10,\n  },\n});\n\nconst Education = () => (\n  <View style={styles.container}>\n    <Title>Education</Title>\n    <Text style={styles.school}>Jedi Academy</Text>\n    <Text style={styles.degree}>Jedi Master</Text>\n    <Text style={styles.candidate}>A long, long time ago</Text>\n  </View>\n);\n\nexport default Education;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/resume/Experience.tsx",
    "content": "import React from 'react';\nimport { Text, View, StyleSheet } from '@react-pdf/renderer';\n\nimport Title from './Title';\nimport List, { Item } from './List';\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    paddingTop: 30,\n    paddingLeft: 15,\n    '@media max-width: 400': {\n      paddingTop: 10,\n      paddingLeft: 0,\n    },\n  },\n  entryContainer: {\n    marginBottom: 10,\n  },\n  date: {\n    fontSize: 11,\n    fontFamily: 'Lato Italic',\n  },\n  detailLeftColumn: {\n    flexDirection: 'column',\n    marginLeft: 10,\n    marginRight: 10,\n  },\n  detailRightColumn: {\n    flexDirection: 'column',\n    flexGrow: 9,\n  },\n  bulletPoint: {\n    fontSize: 10,\n  },\n  details: {\n    fontSize: 10,\n    fontFamily: 'Lato',\n  },\n  headerContainer: {\n    flexDirection: 'row',\n    marginBottom: 10,\n  },\n  leftColumn: {\n    flexDirection: 'column',\n    flexGrow: 9,\n  },\n  rightColumn: {\n    flexDirection: 'column',\n    flexGrow: 1,\n    alignItems: 'flex-end',\n    justifySelf: 'flex-end',\n  },\n  title: {\n    fontSize: 11,\n    color: 'black',\n    textDecoration: 'none',\n    fontFamily: 'Lato Bold',\n  },\n});\n\nconst ExperienceEntry = ({ company, details, position, date }) => {\n  const title = `${company} | ${position}`;\n  return (\n    <View style={styles.entryContainer}>\n      <View style={styles.headerContainer}>\n        <View style={styles.leftColumn}>\n          <Text style={styles.title}>{title}</Text>\n        </View>\n        <View style={styles.rightColumn}>\n          <Text style={styles.date}>{date}</Text>\n        </View>\n      </View>\n      <List>\n        {details.map((detail) => (\n          <Item key={detail.company}>{detail}</Item>\n        ))}\n      </List>\n    </View>\n  );\n};\n\nconst experienceData = [\n  {\n    company: 'Jedi Temple, Coruseant',\n    date: 'A long time ago...',\n    details: [\n      'Started a new Jedi Temple in order to train the next generation of Jedi Masters',\n      'Discovered and trained a new generation of Jedi Knights, which he recruited from within the New Republic',\n      'Communicates with decesased Jedi Masters such as Anakin Skywalker, Yoda, Obi-Wan Kenobi in order to learn the secrets of the Jedi Order',\n    ],\n    position: 'Head Jedi Master',\n  },\n  {\n    company: 'Rebel Alliance',\n    date: 'A long time ago...',\n    details: [\n      'Lead legions of troops into battle while demonstrating bravery, competence and honor',\n      'Created complicated battle plans in conjunction with other Rebel leaders in order to ensure the greatest chance of success',\n      'Defeated Darth Vader in single-combat, and convinced him to betray his mentor, the Emperor',\n    ],\n    position: 'General',\n  },\n  {\n    company: 'Rebel Alliance',\n    date: 'A long time ago...',\n    details: [\n      'Destroyed the Death Star by using the force to find its only weakness and delivering a torpedo into the center of the ship',\n      'Commanded of squadron of X-Wings into battle',\n      'Defeated an enemy AT-AT single handedly after his ship was destroyed',\n      'Awarded a medal for valor and bravery in battle for his successful destruction of the Death Star',\n    ],\n    position: 'Lieutenant Commander',\n  },\n  {\n    company: 'Tatooine Moisture Refinery',\n    date: 'A long time ago...',\n    details: [\n      'Replaced damaged power converters',\n      'Performed menial labor thoughout the farm in order to ensure its continued operation',\n    ],\n    position: 'Moisture Farmer',\n  },\n];\n\nconst Experience = () => (\n  <View style={styles.container}>\n    <Title>Experience</Title>\n    {experienceData.map(({ company, date, details, position }) => (\n      <ExperienceEntry\n        company={company}\n        date={date}\n        details={details}\n        key={company + position}\n        position={position}\n      />\n    ))}\n  </View>\n);\n\nexport default Experience;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/resume/Header.tsx",
    "content": "import React from 'react';\nimport { Link, Text, View, StyleSheet } from '@react-pdf/renderer';\n\nconst styles = StyleSheet.create({\n  container: {\n    flexDirection: 'row',\n    borderBottomWidth: 2,\n    borderBottomColor: '#112131',\n    borderBottomStyle: 'solid',\n    alignItems: 'stretch',\n  },\n  detailColumn: {\n    flexDirection: 'column',\n    flexGrow: 9,\n    textTransform: 'uppercase',\n  },\n  linkColumn: {\n    flexDirection: 'column',\n    flexGrow: 2,\n    alignSelf: 'flex-end',\n    justifySelf: 'flex-end',\n  },\n  name: {\n    fontSize: 24,\n    fontFamily: 'Lato Bold',\n  },\n  subtitle: {\n    fontSize: 10,\n    justifySelf: 'flex-end',\n    fontFamily: 'Lato',\n  },\n  link: {\n    fontFamily: 'Lato',\n    fontSize: 10,\n    color: 'black',\n    textDecoration: 'none',\n    alignSelf: 'flex-end',\n    justifySelf: 'flex-end',\n  },\n});\n\nconst Header = () => (\n  <View style={styles.container}>\n    <View style={styles.detailColumn}>\n      <Text style={styles.name}>Luke Skywalker</Text>\n      <Text style={styles.subtitle}>Jedi Master</Text>\n    </View>\n    <View style={styles.linkColumn}>\n      <Link href=\"mailto:luke@theforce.com\" style={styles.link}>\n        luke@theforce.com\n      </Link>\n    </View>\n  </View>\n);\n\nexport default Header;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/resume/List.tsx",
    "content": "import React from 'react';\nimport { Text, View, StyleSheet } from '@react-pdf/renderer';\n\nconst styles = StyleSheet.create({\n  item: {\n    flexDirection: 'row',\n    marginBottom: 5,\n  },\n  bulletPoint: {\n    width: 10,\n    fontSize: 10,\n  },\n  itemContent: {\n    flex: 1,\n    fontSize: 10,\n    fontFamily: 'Lato',\n  },\n});\n\nconst List = ({ children }) => children;\n\nexport const Item = ({ children }) => (\n  <View style={styles.item}>\n    <Text style={styles.bulletPoint}>•</Text>\n    <Text style={styles.itemContent}>{children}</Text>\n  </View>\n);\n\nexport default List;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/resume/Skills.tsx",
    "content": "import React from 'react';\nimport { Text, View, StyleSheet } from '@react-pdf/renderer';\n\nimport Title from './Title';\nimport List, { Item } from './List';\n\nconst styles = StyleSheet.create({\n  title: {\n    fontFamily: 'Lato Bold',\n    fontSize: 11,\n    marginBottom: 10,\n  },\n  skills: {\n    fontFamily: 'Lato',\n    fontSize: 10,\n    marginBottom: 10,\n  },\n});\n\nconst SkillEntry = ({ name, skills }) => (\n  <View>\n    <Text style={styles.title}>{name}</Text>\n    <List>\n      {skills.map((skill) => (\n        <Item key={skill}>{skill}</Item>\n      ))}\n    </List>\n  </View>\n);\n\nconst Skills = () => (\n  <View>\n    <Title>Skills</Title>\n    <SkillEntry\n      name=\"Combat Abilities\"\n      skills={[\n        'Completed Jedi Master training and built a lightsaber from scratch in order to do battle against the Empire',\n        'Defeated the Rancor and rescued Princess Leia from Jabba the Hutt',\n        'Competent fighter pilot as well as an excelent shot with nearly any weapon',\n      ]}\n    />\n  </View>\n);\n\nexport default Skills;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/resume/Title.tsx",
    "content": "import React from 'react';\nimport { Text, StyleSheet } from '@react-pdf/renderer';\n\nconst styles = StyleSheet.create({\n  title: {\n    fontFamily: 'Lato Bold',\n    fontSize: 14,\n    marginBottom: 10,\n    textTransform: 'uppercase',\n  },\n});\n\nconst Title = ({ children }) => <Text style={styles.title}>{children}</Text>;\n\nexport default Title;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/resume/index.tsx",
    "content": "import React from 'react';\nimport {\n  Text,\n  Font,\n  Page,\n  View,\n  Image,\n  Document,\n  StyleSheet,\n} from '@react-pdf/renderer';\n\nimport Header from './Header';\nimport Skills from './Skills';\nimport Education from './Education';\nimport Experience from './Experience';\n\nconst styles = StyleSheet.create({\n  page: {\n    padding: 30,\n  },\n  container: {\n    flex: 1,\n    flexDirection: 'row',\n    '@media max-width: 400': {\n      flexDirection: 'column',\n    },\n  },\n  image: {\n    marginBottom: 10,\n  },\n  leftColumn: {\n    flexDirection: 'column',\n    width: 170,\n    paddingTop: 30,\n    paddingRight: 15,\n    '@media max-width: 400': {\n      width: '100%',\n      paddingRight: 0,\n    },\n    '@media orientation: landscape': {\n      width: 200,\n    },\n  },\n  footer: {\n    fontSize: 12,\n    fontFamily: 'Lato Bold',\n    textAlign: 'center',\n    marginTop: 15,\n    paddingTop: 5,\n    borderWidth: 3,\n    borderColor: 'gray',\n    borderStyle: 'dashed',\n    '@media orientation: landscape': {\n      marginTop: 10,\n    },\n  },\n});\n\nFont.register({\n  family: 'Open Sans',\n  src: `https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVZ0e.ttf`,\n});\n\nFont.register({\n  family: 'Lato',\n  src: `https://fonts.gstatic.com/s/lato/v16/S6uyw4BMUTPHjx4wWw.ttf`,\n});\n\nFont.register({\n  family: 'Lato Italic',\n  src: `https://fonts.gstatic.com/s/lato/v16/S6u8w4BMUTPHjxsAXC-v.ttf`,\n});\n\nFont.register({\n  family: 'Lato Bold',\n  src: `https://fonts.gstatic.com/s/lato/v16/S6u9w4BMUTPHh6UVSwiPHA.ttf`,\n});\n\nconst IMAGE_SRC =\n  'https://i.guim.co.uk/img/media/a23aeb1f7ff20bb80f68852da17743b0e557f8ed/0_224_3504_2102/master/3504.jpg?width=1200&height=1200&quality=85&auto=format&fit=crop&s=9e9a99e479ee60270b69ede4d869b20f';\n\nconst Resume = (props) => (\n  <Page {...props} style={styles.page}>\n    <Header />\n    <View style={styles.container}>\n      <View style={styles.leftColumn}>\n        <Image src={IMAGE_SRC} style={styles.image} />\n        <Education />\n        <Skills />\n      </View>\n      <Experience />\n    </View>\n    <Text style={styles.footer}>This IS the candidate you are looking for</Text>\n  </Page>\n);\n\nconst ResumeDocument = () => (\n  <Document\n    author=\"Luke Skywalker\"\n    keywords=\"awesome, resume, start wars\"\n    subject=\"The resume of Luke Skywalker\"\n    title=\"Resume\"\n  >\n    <Resume size=\"A4\" />\n    <Resume orientation=\"landscape\" size=\"A4\" />\n    <Resume size={[380, 1250]} />\n  </Document>\n);\n\nexport default {\n  id: 'resume',\n  name: 'Resume',\n  description: '',\n  Document: ResumeDocument,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/soft-hyphens/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, Font, Text, StyleSheet } from '@react-pdf/renderer';\n\nconst shy = '\\u00ad';\n\nFont.register({\n  family: 'Oswald',\n  src: 'https://fonts.gstatic.com/s/oswald/v13/Y_TKV6o8WovbUd3m_X9aAA.ttf',\n});\n\nconst styles = StyleSheet.create({\n  body: {\n    padding: 20,\n  },\n  text: {\n    fontFamily: 'Oswald',\n    fontSize: 20,\n    width: 100,\n    border: '1px solid red',\n  },\n});\n\nconst SoftHyphens = () => (\n  <Document>\n    <Page style={styles.body}>\n      <Text\n        style={styles.text}\n      >{`Potentieel broeikas${shy}gas${shy}emissie${shy}rapport`}</Text>\n    </Page>\n  </Document>\n);\n\nexport default {\n  id: 'soft-hyphens',\n  name: 'Soft Hyphens',\n  description: '',\n  Document: SoftHyphens,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/svg/Car.tsx",
    "content": "import * as React from 'react';\nimport {\n  Svg,\n  Defs,\n  LinearGradient,\n  RadialGradient,\n  Stop,\n  Path,\n  G,\n} from '@react-pdf/renderer';\n\nconst Car = () => (\n  <Svg id=\"svg2\" width=\"100%\" height=\"600\" viewBox=\"0 0 900 600\">\n    <Defs>\n      <LinearGradient id=\"linearGradient4399\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient5360\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#ebf1f1\" stopOpacity=\"1\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient5297\">\n        <Stop offset=\"0\" stopColor=\"#dfa60e\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#dfa60e\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4695\">\n        <Stop offset=\"0\" stopColor=\"#fffb86\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4424\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4298\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4371\">\n        <Stop offset=\"0\" stopColor=\"#bdbdbd\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#bdbdbd\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4345\">\n        <Stop offset=\"0\" stopColor=\"#dfeff5\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#dfeff5\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4337\">\n        <Stop offset=\"0\" stopColor=\"#dfeff5\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#dfeff5\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4277\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4269\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4259\">\n        <Stop offset=\"0\" stopColor=\"#dfeff5\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#dfeff5\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4247\">\n        <Stop offset=\"0\" stopColor=\"#dfeff5\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#dfeff5\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4235\">\n        <Stop offset=\"0\" stopColor=\"#dfeff5\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#dfeff5\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4273\">\n        <Stop offset=\"0\" stopColor=\"#161616\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#161616\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4431\">\n        <Stop offset=\"0\" stopColor=\"#1c1f24\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#373e48\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4278\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4270\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4262\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4254\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4246\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4238\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4228\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4147\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#d6e9e8\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4139\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4127\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4115\">\n        <Stop offset=\"0\" stopColor=\"#fefefe\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fefefe\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4102\">\n        <Stop offset=\"0\" stopColor=\"#fefefe\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fefefe\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4091\">\n        <Stop offset=\"0\" stopColor=\"#fefefe\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fefefe\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4076\">\n        <Stop offset=\"0\" stopColor=\"#d7d7d7\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#d7d7d7\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4781\">\n        <Stop offset=\"0\" stopColor=\"#1a3451\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#1a3451\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4672\">\n        <Stop offset=\"0\" stopColor=\"#e4e4e4\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#e4e4e4\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4662\">\n        <Stop offset=\"0\" stopColor=\"#e3ecf6\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#e3ecf6\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4652\">\n        <Stop offset=\"0\" stopColor=\"#e3ecf6\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#e3ecf6\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4642\">\n        <Stop offset=\"0\" stopColor=\"#3f4e50\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#3f4e50\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4558\">\n        <Stop offset=\"0\" stopColor=\"#131313\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#131313\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4479\">\n        <Stop offset=\"0\" stopColor=\"#e3dcc1\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#e3dcc1\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4447\">\n        <Stop offset=\"0\" stopColor=\"#0f0b03\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#0f0b03\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4433\">\n        <Stop offset=\"0\" stopColor=\"#231002\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#231002\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4372\">\n        <Stop offset=\"0\" stopColor=\"#e1e1e1\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#e1e1e1\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4362\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4291\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4281\">\n        <Stop offset=\"0\" stopColor=\"#c7c7c7\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#c7c7c7\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4265\">\n        <Stop offset=\"0\" stopColor=\"#bca714\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#bca714\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4253\">\n        <Stop offset=\"0\" stopColor=\"#84750f\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#e5b027\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4231\">\n        <Stop offset=\"0\" stopColor=\"#4b5657\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"0.785\" stopColor=\"#57524b\" stopOpacity=\"0.665\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#4b5657\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4220\">\n        <Stop offset=\"0\" stopColor=\"#637083\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#637083\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4207\">\n        <Stop offset=\"0\" stopColor=\"#262e2e\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#262e2e\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4186\">\n        <Stop offset=\"0\" stopColor=\"#262e2e\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#262e2e\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4114\">\n        <Stop offset=\"0\" stopColor=\"#090b0b\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#090b0b\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4097\">\n        <Stop offset=\"0\" stopColor=\"#e7ecec\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#e7ecec\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4085\">\n        <Stop offset=\"0\" stopColor=\"#c5d0d1\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#c5d0d1\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3916\">\n        <Stop offset=\"0\" stopColor=\"#8e8e8e\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#8e8e8e\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4402\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4312\">\n        <Stop offset=\"0\" stopColor=\"#c9d4e7\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#c9d4e7\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4300\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4258\">\n        <Stop offset=\"0\" stopColor=\"#dedede\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#dedede\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4232\">\n        <Stop offset=\"0\" stopColor=\"#887077\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#887077\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4222\">\n        <Stop offset=\"0\" stopColor=\"#282123\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#282123\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4212\">\n        <Stop offset=\"0\" stopColor=\"#d5ccce\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#d5ccce\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4206\">\n        <Stop offset=\"0\" stopColor=\"#281700\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0.235\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4192\">\n        <Stop offset=\"0\" stopColor=\"#ede9ea\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#ede9ea\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4182\">\n        <Stop offset=\"0\" stopColor=\"#746164\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#746164\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4151\">\n        <Stop offset=\"0\" stopColor=\"#281700\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#5a3502\" stopOpacity=\"0.237\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4143\">\n        <Stop offset=\"0\" stopColor=\"#f9cb53\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fffffd\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4061\">\n        <Stop offset=\"0\" stopColor=\"#d4d969\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#d4d969\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4061\"\n        id=\"linearGradient4067\"\n        x1=\"708.086\"\n        x2=\"710.521\"\n        y1=\"416.542\"\n        y2=\"423.02\"\n        gradientTransform=\"translate(-74.868 -105.378)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient id=\"linearGradient4069\">\n        <Stop offset=\"0\" stopColor=\"#1f2116\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#1f2116\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4069\"\n        id=\"linearGradient4075\"\n        x1=\"713.037\"\n        x2=\"716.147\"\n        y1=\"416.542\"\n        y2=\"423.02\"\n        gradientTransform=\"translate(-74.868 -105.378)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient id=\"linearGradient4125\">\n        <Stop offset=\"0\" stopColor=\"#1c1001\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4113\">\n        <Stop offset=\"0\" stopColor=\"#f9c176\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#f9c176\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4000\">\n        <Stop offset=\"0\" stopColor=\"#f0d866\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#f0d866\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3986\">\n        <Stop offset=\"0\" stopColor=\"#6a510d\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#6a510d\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3967\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3957\">\n        <Stop offset=\"0\" stopColor=\"#b6a038\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#b6a038\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3931\">\n        <Stop offset=\"0\" stopColor=\"#1a1c23\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#1a1c23\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3921\">\n        <Stop offset=\"0\" stopColor=\"#cab714\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#cab714\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3784\">\n        <Stop offset=\"0\" stopColor=\"#e0e2e8\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#e0e2e8\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3774\">\n        <Stop offset=\"0\" stopColor=\"#e0e2e8\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#e0e2e8\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3764\">\n        <Stop offset=\"0\" stopColor=\"#b2b7c5\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#b2b7c5\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3732\">\n        <Stop offset=\"0\" stopColor=\"#bfbfbf\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#bfbfbf\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3681\">\n        <Stop offset=\"0\" stopColor=\"#d8f3f6\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#d8f3f6\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3887\">\n        <Stop offset=\"0\" stopColor=\"#1b1815\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#1b1815\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3645\">\n        <Stop offset=\"0\" stopColor=\"#c7eef2\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#c7eef2\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3708\">\n        <Stop offset=\"0\" stopColor=\"#b4c1d1\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#b4c1d1\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3698\">\n        <Stop offset=\"0\" stopColor=\"#405069\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#405069\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3687\">\n        <Stop offset=\"0\" stopColor=\"#8190aa\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#8190aa\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3611\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3599\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3589\">\n        <Stop offset=\"0\" stopColor=\"#443c30\" stopOpacity=\"0\"></Stop>\n        <Stop offset=\"0\" stopColor=\"#443c30\" stopOpacity=\"0\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#303c44\" stopOpacity=\"1\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3571\">\n        <Stop offset=\"0\" stopColor=\"#565656\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#565656\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3549\">\n        <Stop offset=\"0\" stopColor=\"#392b1b\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#392b1b\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3539\">\n        <Stop offset=\"0\" stopColor=\"#392b1b\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#392b1b\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3529\">\n        <Stop offset=\"0\" stopColor=\"#392b1b\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#392b1b\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3515\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3504\">\n        <Stop offset=\"0\" stopColor=\"#1e1125\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#111d25\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3480\">\n        <Stop offset=\"0\" stopColor=\"#676986\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#676986\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3462\">\n        <Stop offset=\"0\" stopColor=\"#e0b80d\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#f6dc6d\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3443\">\n        <Stop offset=\"0\" stopColor=\"#63441b\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#63441b\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3433\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3401\">\n        <Stop offset=\"0\" stopColor=\"#00006b\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#00006b\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3393\">\n        <Stop offset=\"0\" stopColor=\"#1a1400\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#544400\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3382\">\n        <Stop offset=\"0\" stopColor=\"#e9fdff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#e9fdff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3374\">\n        <Stop offset=\"0\" stopColor=\"#eaaa00\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#eaaa00\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3346\">\n        <Stop offset=\"0\" stopColor=\"#00006b\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#00006b\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3328\">\n        <Stop offset=\"0\" stopColor=\"#2e3f54\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#2e3f54\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3312\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3302\">\n        <Stop offset=\"0\" stopColor=\"#bfac28\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#624715\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3292\">\n        <Stop offset=\"0\" stopColor=\"#fbf6ed\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fbf6ed\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3284\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3276\">\n        <Stop offset=\"0\" stopColor=\"#2c210b\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#2c210b\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3265\">\n        <Stop offset=\"0\" stopColor=\"#e3eef8\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#e3eef8\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3254\">\n        <Stop offset=\"0\" stopColor=\"#583116\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#583116\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3236\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3226\">\n        <Stop offset=\"0\" stopColor=\"#4c1658\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#162458\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3212\">\n        <Stop offset=\"0\" stopColor=\"#0d2133\" stopOpacity=\"0\"></Stop>\n        <Stop offset=\"0.714\" stopColor=\"#0d2133\" stopOpacity=\"0\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#0d2133\" stopOpacity=\"0.897\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3202\">\n        <Stop offset=\"0\" stopColor=\"#ddbe3b\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#ddbe3b\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3176\">\n        <Stop offset=\"0\" stopColor=\"#e3eef8\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#5295d2\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3160\">\n        <Stop offset=\"0\" stopColor=\"#6f521d\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#6f521d\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3144\">\n        <Stop offset=\"0\" stopColor=\"#a3e5e7\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#a3e5e7\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3135\">\n        <Stop offset=\"0\" stopColor=\"#94b4e2\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#8a8925\" stopOpacity=\"1\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4181\">\n        <Stop offset=\"0\" stopColor=\"#1c2e3b\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#1c2e3b\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4166\">\n        <Stop offset=\"0\" stopColor=\"#edd135\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#edec35\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4152\">\n        <Stop offset=\"0\" stopColor=\"#1d1504\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#1d1504\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4144\">\n        <Stop offset=\"0\" stopColor=\"#694312\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#977f1a\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4134\">\n        <Stop offset=\"0\" stopColor=\"#92cadb\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#92cadb\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4124\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4100\">\n        <Stop offset=\"0\" stopColor=\"#fdfbf9\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fdfbf9\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4078\">\n        <Stop offset=\"0\" stopColor=\"#613c24\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#613c24\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4068\">\n        <Stop offset=\"0\" stopColor=\"#709ac9\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#709ac9\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4040\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4022\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient4001\">\n        <Stop offset=\"0\" stopColor=\"#201c14\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"0.507\" stopColor=\"#201c14\" stopOpacity=\"0.498\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#201c14\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3989\">\n        <Stop offset=\"0\" stopColor=\"#977f1a\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#977f1a\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3979\">\n        <Stop offset=\"0\" stopColor=\"#201c14\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#201c14\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3869\">\n        <Stop offset=\"0\" stopColor=\"#dfc61d\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#dfc61d\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3851\">\n        <Stop offset=\"0\" stopColor=\"#7b6752\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#7b6752\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3833\">\n        <Stop offset=\"0\" stopColor=\"#eff4f4\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#eff4f4\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3802\">\n        <Stop offset=\"0\" stopColor=\"#e8ebf1\" stopOpacity=\"0\"></Stop>\n        <Stop offset=\"0.819\" stopColor=\"#e8ebf1\" stopOpacity=\"0\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#e8ebf1\" stopOpacity=\"1\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3782\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3747\">\n        <Stop offset=\"0\" stopColor=\"#e6e1d7\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3733\">\n        <Stop offset=\"0\" stopColor=\"#debe39\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#debe39\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3725\">\n        <Stop offset=\"0\" stopColor=\"#6d899b\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#d9e6e6\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3713\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#d9e6e6\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3701\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3691\">\n        <Stop offset=\"0\" stopColor=\"#021d2a\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#021d2a\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3668\">\n        <Stop offset=\"0\" stopColor=\"#858b94\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#858b94\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3656\">\n        <Stop offset=\"0\" stopColor=\"#d4f0fc\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#d4f0fc\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3638\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3610\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3578\">\n        <Stop offset=\"0\" stopColor=\"#cce5f8\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#cce5f8\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3554\">\n        <Stop offset=\"0\" stopColor=\"#e7eef4\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#b8f2f4\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3536\">\n        <Stop offset=\"0\" stopColor=\"#030303\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#030303\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3526\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3516\">\n        <Stop offset=\"0\" stopColor=\"#223f69\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#223f69\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3503\">\n        <Stop offset=\"0\" stopColor=\"#2b4268\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#2b4268\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3489\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3471\">\n        <Stop offset=\"0\" stopColor=\"#647e9d\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#64969d\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3461\">\n        <Stop offset=\"0\" stopColor=\"#000\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#000\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3453\">\n        <Stop offset=\"0\" stopColor=\"#e9f0f1\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#dddcca\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3303\">\n        <Stop offset=\"0\" stopColor=\"#1f2429\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#1f2429\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3289\">\n        <Stop offset=\"0\" stopColor=\"#97a4af\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#97a4af\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3279\">\n        <Stop offset=\"0\" stopColor=\"#b3890d\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#b3890d\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3269\">\n        <Stop offset=\"0\" stopColor=\"#6c6654\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#6c6654\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3263\">\n        <Stop offset=\"0\" stopColor=\"#2a3737\" stopOpacity=\"0.829\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#2a3737\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3255\">\n        <Stop offset=\"0\" stopColor=\"#d09e1c\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fceeaf\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3201\">\n        <Stop offset=\"0\" stopColor=\"#2a3737\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#2a3737\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3191\">\n        <Stop offset=\"0\" stopColor=\"#f9dd67\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#f9dd67\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3173\">\n        <Stop offset=\"0\" stopColor=\"#f6f6bf\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#f6f6bf\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3163\">\n        <Stop offset=\"0\" stopColor=\"#635646\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#635646\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3155\">\n        <Stop offset=\"0\" stopColor=\"#d5b42a\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#d5b42a\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3145\">\n        <Stop offset=\"0\" stopColor=\"#fff\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3137\">\n        <Stop offset=\"0\" stopColor=\"#c6c6e9\" stopOpacity=\"0.235\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0.789\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3127\">\n        <Stop offset=\"0\" stopColor=\"#e4b125\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#f9dd67\" stopOpacity=\"0.171\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3105\">\n        <Stop offset=\"0\" stopColor=\"#fef7d9\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#fef7d9\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient id=\"linearGradient3097\">\n        <Stop offset=\"0\" stopColor=\"#c09c07\" stopOpacity=\"1\"></Stop>\n        <Stop offset=\"1\" stopColor=\"#c09c07\" stopOpacity=\"0\"></Stop>\n      </LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3097\"\n        id=\"linearGradient3103\"\n        x1=\"578.82\"\n        x2=\"549.177\"\n        y1=\"619.832\"\n        y2=\"293.018\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3105\"\n        id=\"linearGradient3111\"\n        x1=\"635.802\"\n        x2=\"592.544\"\n        y1=\"431.433\"\n        y2=\"354.186\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3137\"\n        id=\"linearGradient3143\"\n        x1=\"526.297\"\n        x2=\"520.667\"\n        y1=\"341.857\"\n        y2=\"331.979\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3145\"\n        id=\"linearGradient3151\"\n        x1=\"648.12\"\n        x2=\"155.123\"\n        y1=\"281.91\"\n        y2=\"396.756\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3155\"\n        id=\"linearGradient3161\"\n        x1=\"497.199\"\n        x2=\"369.676\"\n        y1=\"475.129\"\n        y2=\"284.239\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3163\"\n        id=\"linearGradient3169\"\n        x1=\"278.91\"\n        x2=\"630.341\"\n        y1=\"382.105\"\n        y2=\"313.813\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3173\"\n        id=\"linearGradient3179\"\n        x1=\"300.847\"\n        x2=\"585.625\"\n        y1=\"381.955\"\n        y2=\"299.948\"\n        gradientTransform=\"translate(-77.89 -100.39)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3191\"\n        id=\"linearGradient3197\"\n        x1=\"516.468\"\n        x2=\"474.345\"\n        y1=\"240.593\"\n        y2=\"316.924\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3263\"\n        id=\"linearGradient3207\"\n        x1=\"1062.22\"\n        x2=\"660.035\"\n        y1=\"561.752\"\n        y2=\"324.926\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3201\"\n        id=\"linearGradient3211\"\n        x1=\"480.532\"\n        x2=\"477.962\"\n        y1=\"592.433\"\n        y2=\"481.788\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3269\"\n        id=\"linearGradient3275\"\n        x1=\"708.28\"\n        x2=\"738.932\"\n        y1=\"348.272\"\n        y2=\"351.773\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3279\"\n        id=\"linearGradient3285\"\n        x1=\"704.078\"\n        x2=\"747.796\"\n        y1=\"383.286\"\n        y2=\"380.315\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3289\"\n        id=\"linearGradient3295\"\n        x1=\"302.664\"\n        x2=\"315.181\"\n        y1=\"551.522\"\n        y2=\"506.957\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3453\"\n        id=\"linearGradient3459\"\n        x1=\"688.764\"\n        x2=\"685.008\"\n        y1=\"185.161\"\n        y2=\"213.89\"\n        gradientTransform=\"matrix(1.17775 0 0 .5551 -194.578 -15.364)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3461\"\n        id=\"linearGradient3467\"\n        x1=\"674.721\"\n        x2=\"676.426\"\n        y1=\"299.554\"\n        y2=\"185.664\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3471\"\n        id=\"linearGradient3477\"\n        x1=\"742.419\"\n        x2=\"675.081\"\n        y1=\"250.532\"\n        y2=\"238.648\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3471\"\n        id=\"linearGradient3481\"\n        x1=\"462.151\"\n        x2=\"517.616\"\n        y1=\"242.609\"\n        y2=\"252.513\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3471\"\n        id=\"linearGradient3485\"\n        x1=\"469.083\"\n        x2=\"472.555\"\n        y1=\"283.052\"\n        y2=\"263.901\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3503\"\n        id=\"linearGradient3509\"\n        x1=\"684.874\"\n        x2=\"679.272\"\n        y1=\"164.613\"\n        y2=\"268.604\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3516\"\n        id=\"linearGradient3522\"\n        x1=\"563.317\"\n        x2=\"563.011\"\n        y1=\"192.752\"\n        y2=\"218.501\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3526\"\n        id=\"linearGradient3532\"\n        x1=\"642.98\"\n        x2=\"597.586\"\n        y1=\"146.955\"\n        y2=\"292.613\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3536\"\n        id=\"linearGradient3542\"\n        x1=\"631.775\"\n        x2=\"631.199\"\n        y1=\"196.675\"\n        y2=\"205.779\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3536\"\n        id=\"linearGradient3546\"\n        x1=\"730.515\"\n        x2=\"719.435\"\n        y1=\"231.689\"\n        y2=\"233.09\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3536\"\n        id=\"linearGradient3550\"\n        x1=\"720.01\"\n        x2=\"714.533\"\n        y1=\"212.781\"\n        y2=\"217.683\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3554\"\n        id=\"linearGradient3560\"\n        x1=\"488.218\"\n        x2=\"496.746\"\n        y1=\"234.49\"\n        y2=\"242.893\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3578\"\n        id=\"linearGradient3584\"\n        x1=\"615.005\"\n        x2=\"714.039\"\n        y1=\"219.211\"\n        y2=\"219.211\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3578\"\n        id=\"linearGradient3586\"\n        x1=\"504.086\"\n        x2=\"578.857\"\n        y1=\"233.819\"\n        y2=\"233.819\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3578\"\n        id=\"linearGradient3588\"\n        x1=\"480.318\"\n        x2=\"530.33\"\n        y1=\"235.8\"\n        y2=\"235.8\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3610\"\n        id=\"linearGradient3616\"\n        x1=\"629.552\"\n        x2=\"628.677\"\n        y1=\"200.914\"\n        y2=\"216.784\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3638\"\n        id=\"linearGradient3644\"\n        x1=\"745.993\"\n        x2=\"727.567\"\n        y1=\"222.65\"\n        y2=\"229.088\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3656\"\n        id=\"linearGradient3662\"\n        x1=\"774.535\"\n        x2=\"792.9\"\n        y1=\"222.195\"\n        y2=\"254.876\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3668\"\n        id=\"linearGradient3674\"\n        x1=\"783.613\"\n        x2=\"755.602\"\n        y1=\"277.358\"\n        y2=\"208.73\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3691\"\n        id=\"linearGradient3697\"\n        x1=\"742.331\"\n        x2=\"742.331\"\n        y1=\"238.501\"\n        y2=\"232.059\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3701\"\n        id=\"linearGradient3707\"\n        x1=\"749.855\"\n        x2=\"734.104\"\n        y1=\"250.38\"\n        y2=\"252.856\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3725\"\n        id=\"linearGradient3723\"\n        x1=\"776.611\"\n        x2=\"795.518\"\n        y1=\"253.198\"\n        y2=\"245.495\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3747\"\n        id=\"linearGradient3753\"\n        x1=\"799.269\"\n        x2=\"790.717\"\n        y1=\"250.611\"\n        y2=\"346.549\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3979\"\n        id=\"linearGradient3985\"\n        x1=\"443.115\"\n        x2=\"478.897\"\n        y1=\"426.194\"\n        y2=\"396.978\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4068\"\n        id=\"linearGradient4074\"\n        x1=\"511.032\"\n        x2=\"463.191\"\n        y1=\"481.892\"\n        y2=\"347.412\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3135\"\n        id=\"linearGradient3142\"\n        x1=\"209.316\"\n        x2=\"192.298\"\n        y1=\"339.378\"\n        y2=\"391.588\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3144\"\n        id=\"linearGradient3150\"\n        x1=\"207.218\"\n        x2=\"198.619\"\n        y1=\"344.353\"\n        y2=\"385.231\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3226\"\n        id=\"linearGradient3232\"\n        x1=\"211.99\"\n        x2=\"207.791\"\n        y1=\"342.223\"\n        y2=\"347.828\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3265\"\n        id=\"linearGradient3272\"\n        x1=\"203.117\"\n        x2=\"216.366\"\n        y1=\"349.285\"\n        y2=\"354.39\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3276\"\n        id=\"linearGradient3282\"\n        x1=\"203.603\"\n        x2=\"216.123\"\n        y1=\"354.094\"\n        y2=\"357.254\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3284\"\n        id=\"linearGradient3290\"\n        x1=\"183.48\"\n        x2=\"162.625\"\n        y1=\"437.745\"\n        y2=\"366.921\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3328\"\n        id=\"linearGradient3334\"\n        x1=\"205.426\"\n        x2=\"212.49\"\n        y1=\"366.938\"\n        y2=\"366.938\"\n        gradientTransform=\"translate(-76.44 -98.427)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3346\"\n        id=\"linearGradient3352\"\n        x1=\"204.909\"\n        x2=\"210.41\"\n        y1=\"367.282\"\n        y2=\"367.282\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3374\"\n        id=\"linearGradient3380\"\n        x1=\"167.644\"\n        x2=\"159.87\"\n        y1=\"395.646\"\n        y2=\"392.552\"\n        gradientTransform=\"translate(-77.697 -99.056)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3382\"\n        id=\"linearGradient3388\"\n        x1=\"155.133\"\n        x2=\"180.155\"\n        y1=\"377.425\"\n        y2=\"387.051\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3401\"\n        id=\"linearGradient3407\"\n        x1=\"204.909\"\n        x2=\"210.41\"\n        y1=\"367.282\"\n        y2=\"367.282\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3443\"\n        id=\"linearGradient3449\"\n        x1=\"197.689\"\n        x2=\"187.375\"\n        y1=\"388.727\"\n        y2=\"372.397\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3480\"\n        id=\"linearGradient3486\"\n        x1=\"484.08\"\n        x2=\"468.736\"\n        y1=\"415.622\"\n        y2=\"390.868\"\n        gradientTransform=\"rotate(-7.13 -370.763 989.778)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3529\"\n        id=\"linearGradient3535\"\n        x1=\"184.108\"\n        x2=\"214.535\"\n        y1=\"344.052\"\n        y2=\"344.052\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3539\"\n        id=\"linearGradient3545\"\n        x1=\"150.039\"\n        x2=\"177.748\"\n        y1=\"418.619\"\n        y2=\"418.619\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3549\"\n        id=\"linearGradient3555\"\n        x1=\"113.611\"\n        x2=\"159.87\"\n        y1=\"436.806\"\n        y2=\"397.612\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3571\"\n        id=\"linearGradient3577\"\n        x1=\"592.7\"\n        x2=\"574.765\"\n        y1=\"533.747\"\n        y2=\"460.543\"\n        gradientTransform=\"matrix(1.08124 .23375 -.1865 .99339 -76.47 -235.766)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3645\"\n        id=\"linearGradient3651\"\n        x1=\"575.841\"\n        x2=\"620.26\"\n        y1=\"502.138\"\n        y2=\"502.138\"\n        gradientTransform=\"translate(-77.842 -99.943)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3887\"\n        id=\"linearGradient3893\"\n        x1=\"621.141\"\n        x2=\"626.515\"\n        y1=\"428.826\"\n        y2=\"480.652\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3732\"\n        id=\"linearGradient3738\"\n        x1=\"815.762\"\n        x2=\"827.732\"\n        y1=\"361.48\"\n        y2=\"339.227\"\n        gradientTransform=\"rotate(1.887 3918.914 -1983.251)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3732\"\n        id=\"linearGradient3742\"\n        x1=\"815.762\"\n        x2=\"828.435\"\n        y1=\"361.48\"\n        y2=\"333.249\"\n        gradientTransform=\"rotate(180 789.421 321.688)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3732\"\n        id=\"linearGradient3746\"\n        x1=\"815.762\"\n        x2=\"828.435\"\n        y1=\"361.48\"\n        y2=\"333.249\"\n        gradientTransform=\"rotate(-177.489 787.207 323.142)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3764\"\n        id=\"linearGradient3762\"\n        x1=\"817.964\"\n        x2=\"838.041\"\n        y1=\"402.394\"\n        y2=\"379.011\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3774\"\n        id=\"linearGradient3780\"\n        x1=\"841.268\"\n        x2=\"825.565\"\n        y1=\"397.074\"\n        y2=\"364.524\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3784\"\n        id=\"linearGradient3791\"\n        x1=\"829.595\"\n        x2=\"823.867\"\n        y1=\"374.558\"\n        y2=\"367.763\"\n        gradientTransform=\"translate(-77.617 -103.623)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3921\"\n        id=\"linearGradient3927\"\n        x1=\"793.745\"\n        x2=\"810.66\"\n        y1=\"387.008\"\n        y2=\"365.622\"\n        gradientTransform=\"translate(-78.385 -101.33)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3931\"\n        id=\"linearGradient3945\"\n        x1=\"678.099\"\n        x2=\"668.188\"\n        y1=\"473.21\"\n        y2=\"455.422\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3957\"\n        id=\"linearGradient3963\"\n        x1=\"753.352\"\n        x2=\"756.972\"\n        y1=\"408.003\"\n        y2=\"412.575\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3967\"\n        id=\"linearGradient3973\"\n        x1=\"665.914\"\n        x2=\"835.642\"\n        y1=\"456.849\"\n        y2=\"384.238\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3986\"\n        id=\"linearGradient3992\"\n        x1=\"676.376\"\n        x2=\"698.508\"\n        y1=\"397.079\"\n        y2=\"395.338\"\n        gradientTransform=\"rotate(3.546 2054.668 -538.91)scale(.96427)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3986\"\n        id=\"linearGradient3996\"\n        x1=\"682.842\"\n        x2=\"686.572\"\n        y1=\"372.46\"\n        y2=\"376.19\"\n        gradientTransform=\"rotate(3.546 2054.668 -538.91)scale(.96427)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4000\"\n        id=\"linearGradient4006\"\n        x1=\"699.005\"\n        x2=\"690.551\"\n        y1=\"423.81\"\n        y2=\"412.993\"\n        gradientTransform=\"rotate(3.546 2054.668 -538.91)scale(.96427)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3986\"\n        id=\"linearGradient4026\"\n        x1=\"676.376\"\n        x2=\"698.508\"\n        y1=\"397.079\"\n        y2=\"395.338\"\n        gradientTransform=\"translate(12.66 -4.923)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3986\"\n        id=\"linearGradient4028\"\n        x1=\"682.842\"\n        x2=\"686.572\"\n        y1=\"372.46\"\n        y2=\"376.19\"\n        gradientTransform=\"translate(12.66 -4.923)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4000\"\n        id=\"linearGradient4030\"\n        x1=\"699.005\"\n        x2=\"690.551\"\n        y1=\"423.81\"\n        y2=\"412.993\"\n        gradientTransform=\"translate(12.66 -4.923)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3986\"\n        id=\"linearGradient4047\"\n        x1=\"676.376\"\n        x2=\"698.508\"\n        y1=\"397.079\"\n        y2=\"395.338\"\n        gradientTransform=\"scale(.90396)rotate(3.547 1999.258 534.806)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3986\"\n        id=\"linearGradient4049\"\n        x1=\"682.842\"\n        x2=\"686.572\"\n        y1=\"372.46\"\n        y2=\"376.19\"\n        gradientTransform=\"scale(.90396)rotate(3.547 1999.258 534.806)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4000\"\n        id=\"linearGradient4051\"\n        x1=\"699.005\"\n        x2=\"690.551\"\n        y1=\"423.81\"\n        y2=\"412.993\"\n        gradientTransform=\"scale(.90396)rotate(3.547 1999.258 534.806)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3986\"\n        id=\"linearGradient4053\"\n        x1=\"676.376\"\n        x2=\"698.508\"\n        y1=\"397.079\"\n        y2=\"395.338\"\n        gradientTransform=\"translate(12.66 -4.923)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3986\"\n        id=\"linearGradient4055\"\n        x1=\"682.842\"\n        x2=\"686.572\"\n        y1=\"372.46\"\n        y2=\"376.19\"\n        gradientTransform=\"translate(12.66 -4.923)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4000\"\n        id=\"linearGradient4057\"\n        x1=\"699.005\"\n        x2=\"690.551\"\n        y1=\"423.81\"\n        y2=\"412.993\"\n        gradientTransform=\"translate(12.66 -4.923)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4143\"\n        id=\"linearGradient4149\"\n        x1=\"427.686\"\n        x2=\"416.648\"\n        y1=\"512.701\"\n        y2=\"501.673\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4182\"\n        id=\"linearGradient4188\"\n        x1=\"419.102\"\n        x2=\"417.089\"\n        y1=\"506.691\"\n        y2=\"492.489\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4232\"\n        id=\"linearGradient4250\"\n        x1=\"417.876\"\n        x2=\"417.188\"\n        y1=\"509.769\"\n        y2=\"494.588\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4312\"\n        id=\"linearGradient4318\"\n        x1=\"805.679\"\n        x2=\"807.251\"\n        y1=\"286.579\"\n        y2=\"288.711\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4402\"\n        id=\"linearGradient4408\"\n        x1=\"800.951\"\n        x2=\"810.123\"\n        y1=\"285.134\"\n        y2=\"287.332\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3916\"\n        id=\"linearGradient4062\"\n        x1=\"286.061\"\n        x2=\"311.559\"\n        y1=\"573.175\"\n        y2=\"461.276\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3916\"\n        id=\"linearGradient4070\"\n        x1=\"277.109\"\n        x2=\"291.169\"\n        y1=\"593.565\"\n        y2=\"457.794\"\n        gradientTransform=\"translate(-77.682 -100.103)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4186\"\n        id=\"linearGradient4193\"\n        x1=\"264.137\"\n        x2=\"266.323\"\n        y1=\"490.369\"\n        y2=\"487.634\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4186\"\n        id=\"linearGradient4197\"\n        x1=\"267.618\"\n        x2=\"266.323\"\n        y1=\"484.65\"\n        y2=\"487.634\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4186\"\n        id=\"linearGradient4201\"\n        x1=\"269.608\"\n        x2=\"262.645\"\n        y1=\"486.639\"\n        y2=\"486.39\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4220\"\n        id=\"linearGradient4344\"\n        x1=\"637.584\"\n        x2=\"638.33\"\n        y1=\"250.102\"\n        y2=\"253.833\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4265\"\n        id=\"linearGradient4350\"\n        x1=\"594.565\"\n        x2=\"602.273\"\n        y1=\"267.15\"\n        y2=\"267.15\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4281\"\n        id=\"linearGradient4352\"\n        x1=\"644.671\"\n        x2=\"675.882\"\n        y1=\"249.688\"\n        y2=\"252.423\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4372\"\n        id=\"linearGradient4378\"\n        x1=\"678.925\"\n        x2=\"720.895\"\n        y1=\"266.698\"\n        y2=\"269.4\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4220\"\n        id=\"linearGradient4413\"\n        x1=\"637.584\"\n        x2=\"638.33\"\n        y1=\"250.102\"\n        y2=\"253.833\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4265\"\n        id=\"linearGradient4419\"\n        x1=\"594.565\"\n        x2=\"602.273\"\n        y1=\"267.15\"\n        y2=\"267.15\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4281\"\n        id=\"linearGradient4421\"\n        x1=\"644.671\"\n        x2=\"675.882\"\n        y1=\"249.688\"\n        y2=\"252.423\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4372\"\n        id=\"linearGradient4429\"\n        x1=\"678.925\"\n        x2=\"720.895\"\n        y1=\"266.698\"\n        y2=\"269.4\"\n        gradientTransform=\"matrix(.8587 .03886 -.04414 .83993 -121.838 -86.43)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4433\"\n        id=\"linearGradient4439\"\n        x1=\"668.061\"\n        x2=\"734.875\"\n        y1=\"253.421\"\n        y2=\"258.944\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4447\"\n        id=\"linearGradient4515\"\n        x1=\"608.903\"\n        x2=\"650.425\"\n        y1=\"276.42\"\n        y2=\"244.77\"\n        gradientTransform=\"translate(60.487 -133.634)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4479\"\n        id=\"linearGradient4523\"\n        x1=\"712.806\"\n        x2=\"753.963\"\n        y1=\"114.624\"\n        y2=\"136.258\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4558\"\n        id=\"linearGradient4564\"\n        x1=\"560\"\n        x2=\"635.595\"\n        y1=\"199.236\"\n        y2=\"275.052\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4642\"\n        id=\"linearGradient4823\"\n        x1=\"606.378\"\n        x2=\"609.515\"\n        y1=\"234.728\"\n        y2=\"217.819\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4652\"\n        id=\"linearGradient4825\"\n        x1=\"590.575\"\n        x2=\"591.067\"\n        y1=\"207.8\"\n        y2=\"221.514\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4662\"\n        id=\"linearGradient4827\"\n        x1=\"604.886\"\n        x2=\"609.515\"\n        y1=\"204.888\"\n        y2=\"217.819\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4781\"\n        id=\"linearGradient4833\"\n        x1=\"563.972\"\n        x2=\"565.73\"\n        y1=\"217.645\"\n        y2=\"226.789\"\n        gradientTransform=\"translate(-14.418 -60.487)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4076\"\n        id=\"linearGradient4083\"\n        x1=\"602.771\"\n        x2=\"602.771\"\n        y1=\"486.475\"\n        y2=\"433.986\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4091\"\n        id=\"linearGradient4098\"\n        x1=\"600.284\"\n        x2=\"597.3\"\n        y1=\"531.224\"\n        y2=\"501.892\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4102\"\n        id=\"linearGradient4109\"\n        x1=\"598.295\"\n        x2=\"615.529\"\n        y1=\"489.329\"\n        y2=\"466.452\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4115\"\n        id=\"linearGradient4123\"\n        x1=\"558.833\"\n        x2=\"597.3\"\n        y1=\"515.569\"\n        y2=\"490.702\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4127\"\n        id=\"linearGradient4135\"\n        x1=\"273.532\"\n        x2=\"264.585\"\n        y1=\"428.286\"\n        y2=\"413.864\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4139\"\n        id=\"linearGradient4145\"\n        x1=\"249.66\"\n        x2=\"257.617\"\n        y1=\"399.938\"\n        y2=\"425.302\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4147\"\n        id=\"linearGradient4153\"\n        x1=\"249.66\"\n        x2=\"277.019\"\n        y1=\"399.938\"\n        y2=\"413.864\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4228\"\n        id=\"linearGradient4234\"\n        x1=\"187.088\"\n        x2=\"244.762\"\n        y1=\"432.515\"\n        y2=\"432.515\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4362\"\n        id=\"linearGradient4236\"\n        x1=\"600.035\"\n        x2=\"607.744\"\n        y1=\"283.686\"\n        y2=\"283.686\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4238\"\n        id=\"linearGradient4244\"\n        x1=\"459.851\"\n        x2=\"477.137\"\n        y1=\"267.579\"\n        y2=\"267.579\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4246\"\n        id=\"linearGradient4252\"\n        x1=\"407.233\"\n        x2=\"431.147\"\n        y1=\"315.058\"\n        y2=\"315.058\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4254\"\n        id=\"linearGradient4260\"\n        x1=\"410.047\"\n        x2=\"480.38\"\n        y1=\"319.66\"\n        y2=\"319.66\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4262\"\n        id=\"linearGradient4268\"\n        x1=\"392.463\"\n        x2=\"409.343\"\n        y1=\"327.718\"\n        y2=\"327.718\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4270\"\n        id=\"linearGradient4276\"\n        x1=\"374.738\"\n        x2=\"399.496\"\n        y1=\"326.709\"\n        y2=\"326.709\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4278\"\n        id=\"linearGradient4284\"\n        x1=\"317.206\"\n        x2=\"407.419\"\n        y1=\"328.478\"\n        y2=\"328.478\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4431\"\n        id=\"linearGradient4438\"\n        x1=\"880.428\"\n        x2=\"738.358\"\n        y1=\"437.117\"\n        y2=\"833.835\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4273\"\n        id=\"linearGradient4279\"\n        x1=\"613.42\"\n        x2=\"605.159\"\n        y1=\"435.972\"\n        y2=\"501.443\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4235\"\n        id=\"linearGradient4243\"\n        x1=\"587.308\"\n        x2=\"618.753\"\n        y1=\"450.174\"\n        y2=\"426.07\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4247\"\n        id=\"linearGradient4256\"\n        x1=\"625.539\"\n        x2=\"638.988\"\n        y1=\"522.992\"\n        y2=\"490.168\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4259\"\n        id=\"linearGradient4266\"\n        x1=\"617.166\"\n        x2=\"629.435\"\n        y1=\"517.519\"\n        y2=\"486.685\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4269\"\n        id=\"linearGradient4275\"\n        x1=\"630.032\"\n        x2=\"625.077\"\n        y1=\"462.892\"\n        y2=\"442.501\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4277\"\n        id=\"linearGradient4283\"\n        x1=\"610.161\"\n        x2=\"619.283\"\n        y1=\"461.57\"\n        y2=\"461.57\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4337\"\n        id=\"linearGradient4343\"\n        x1=\"609.174\"\n        x2=\"620.719\"\n        y1=\"512.84\"\n        y2=\"485.984\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4345\"\n        id=\"linearGradient4351\"\n        x1=\"600.887\"\n        x2=\"612.921\"\n        y1=\"513.196\"\n        y2=\"483.853\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4371\"\n        id=\"linearGradient4377\"\n        x1=\"531.079\"\n        x2=\"531.079\"\n        y1=\"529.252\"\n        y2=\"461.088\"\n        gradientTransform=\"translate(-72.37 -100.736)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4371\"\n        id=\"linearGradient4381\"\n        x1=\"531.079\"\n        x2=\"531.079\"\n        y1=\"529.252\"\n        y2=\"461.088\"\n        gradientTransform=\"translate(-86.404 -100.068)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4371\"\n        id=\"linearGradient4385\"\n        x1=\"531.079\"\n        x2=\"531.079\"\n        y1=\"529.252\"\n        y2=\"461.088\"\n        gradientTransform=\"translate(-97.096 -100.068)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4298\"\n        id=\"linearGradient4307\"\n        x1=\"806.455\"\n        x2=\"742.049\"\n        y1=\"424.808\"\n        y2=\"422.235\"\n        gradientTransform=\"rotate(3.761 2262.553 -836.186)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4424\"\n        id=\"linearGradient4430\"\n        x1=\"551.877\"\n        x2=\"429.819\"\n        y1=\"567.982\"\n        y2=\"541.827\"\n        gradientTransform=\"translate(-78.385 -102.99)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3713\"\n        id=\"linearGradient5059\"\n        x1=\"798.319\"\n        x2=\"788.551\"\n        y1=\"234.291\"\n        y2=\"244.341\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient5297\"\n        id=\"linearGradient5303\"\n        x1=\"645.685\"\n        x2=\"583.466\"\n        y1=\"289.037\"\n        y2=\"294.498\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient5360\"\n        id=\"linearGradient5358\"\n        x1=\"294.232\"\n        x2=\"260.169\"\n        y1=\"394.538\"\n        y2=\"419.768\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3638\"\n        id=\"linearGradient3499\"\n        x1=\"745.993\"\n        x2=\"727.567\"\n        y1=\"222.65\"\n        y2=\"229.088\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4642\"\n        id=\"linearGradient3501\"\n        x1=\"606.378\"\n        x2=\"609.515\"\n        y1=\"234.728\"\n        y2=\"217.819\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4652\"\n        id=\"linearGradient3505\"\n        x1=\"590.575\"\n        x2=\"591.067\"\n        y1=\"207.8\"\n        y2=\"221.514\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4662\"\n        id=\"linearGradient3507\"\n        x1=\"604.886\"\n        x2=\"609.515\"\n        y1=\"204.888\"\n        y2=\"217.819\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4781\"\n        id=\"linearGradient3513\"\n        x1=\"563.972\"\n        x2=\"565.73\"\n        y1=\"217.645\"\n        y2=\"226.789\"\n        gradientTransform=\"translate(-14.418 -60.487)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient3713\"\n        id=\"linearGradient3517\"\n        x1=\"798.319\"\n        x2=\"788.551\"\n        y1=\"234.291\"\n        y2=\"244.341\"\n        gradientTransform=\"translate(-78.385 -99.4)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <LinearGradient\n        xlinkHref=\"#linearGradient4143\"\n        id=\"linearGradient3519\"\n        x1=\"427.686\"\n        x2=\"416.648\"\n        y1=\"512.701\"\n        y2=\"501.673\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></LinearGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3127\"\n        id=\"radialGradient3133\"\n        cx=\"220.483\"\n        cy=\"374.91\"\n        r=\"109.139\"\n        fx=\"220.483\"\n        fy=\"374.91\"\n        gradientTransform=\"matrix(2.30693 -.8504 .10402 .28219 -405.54 334.458)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3255\"\n        id=\"radialGradient3261\"\n        cx=\"489.145\"\n        cy=\"481.274\"\n        r=\"124.737\"\n        fx=\"489.145\"\n        fy=\"481.274\"\n        gradientTransform=\"matrix(2.21266 -.78765 .2033 .57113 -761.098 427.206)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3289\"\n        id=\"radialGradient3299\"\n        cx=\"192.001\"\n        cy=\"427.626\"\n        r=\"104.798\"\n        fx=\"192.001\"\n        fy=\"427.626\"\n        gradientTransform=\"matrix(.16512 -.0461 .13426 .48095 -6.46 167.164)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3303\"\n        id=\"radialGradient3309\"\n        cx=\"140.157\"\n        cy=\"390.742\"\n        r=\"104.798\"\n        fx=\"140.157\"\n        fy=\"390.742\"\n        gradientTransform=\"matrix(.04066 -.13398 .48446 .14704 -45.651 342.52)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3489\"\n        id=\"radialGradient3495\"\n        cx=\"592.632\"\n        cy=\"238.648\"\n        r=\"136.423\"\n        fx=\"592.632\"\n        fy=\"238.648\"\n        gradientTransform=\"matrix(1 0 0 .30734 -78.385 65.9)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3733\"\n        id=\"radialGradient3743\"\n        cx=\"805.719\"\n        cy=\"280.532\"\n        r=\"21.205\"\n        fx=\"805.719\"\n        fy=\"280.532\"\n        gradientTransform=\"matrix(1.24064 -.84432 .61215 .8995 -444.165 606.874)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3782\"\n        id=\"radialGradient3790\"\n        cx=\"479.676\"\n        cy=\"392.987\"\n        r=\"25.254\"\n        fx=\"479.676\"\n        fy=\"392.987\"\n        gradientTransform=\"matrix(.78087 .59577 -.18518 .22076 174.458 15.688)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3782\"\n        id=\"radialGradient3794\"\n        cx=\"505.531\"\n        cy=\"557.568\"\n        r=\"25.254\"\n        fx=\"505.531\"\n        fy=\"557.568\"\n        gradientTransform=\"matrix(1.2605 -.38031 .09748 .29906 -299.829 369.895)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3782\"\n        id=\"radialGradient3798\"\n        cx=\"509.222\"\n        cy=\"371.019\"\n        r=\"25.254\"\n        fx=\"509.222\"\n        fy=\"371.019\"\n        gradientTransform=\"matrix(1.22222 -.07535 .01912 .28213 -169.128 321.024)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3802\"\n        id=\"radialGradient3808\"\n        cx=\"462.927\"\n        cy=\"412.081\"\n        r=\"25.254\"\n        fx=\"462.927\"\n        fy=\"412.081\"\n        gradientTransform=\"matrix(.96 0 0 1.2451 18.517 -101)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3833\"\n        id=\"radialGradient3839\"\n        cx=\"471.57\"\n        cy=\"412.081\"\n        r=\"25.254\"\n        fx=\"471.57\"\n        fy=\"412.081\"\n        gradientTransform=\"matrix(1 0 0 1.2451 0 -101)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3851\"\n        id=\"radialGradient3857\"\n        cx=\"473.019\"\n        cy=\"418.077\"\n        r=\"22.031\"\n        fx=\"473.019\"\n        fy=\"418.077\"\n        gradientTransform=\"matrix(.91056 -.41339 .62532 1.37739 -297.494 -69.606)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3869\"\n        id=\"radialGradient3875\"\n        cx=\"480.676\"\n        cy=\"403.629\"\n        r=\"17.331\"\n        fx=\"480.676\"\n        fy=\"403.629\"\n        gradientTransform=\"matrix(2.6861 .066 -.0133 .5416 -884.31 52.081)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4144\"\n        id=\"radialGradient3995\"\n        cx=\"450.768\"\n        cy=\"430.669\"\n        r=\"67.121\"\n        fx=\"450.768\"\n        fy=\"430.669\"\n        gradientTransform=\"matrix(1.21558 -.94133 .43538 .56222 -361.245 512.589)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3989\"\n        id=\"radialGradient3999\"\n        cx=\"481.894\"\n        cy=\"386.057\"\n        r=\"67.121\"\n        fx=\"481.894\"\n        fy=\"386.057\"\n        gradientTransform=\"matrix(1.42424 -.08376 .04175 .70986 -309.834 42.333)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4001\"\n        id=\"radialGradient4007\"\n        cx=\"473.05\"\n        cy=\"418.471\"\n        r=\"26.054\"\n        fx=\"473.05\"\n        fy=\"418.471\"\n        gradientTransform=\"matrix(1.7061 -.41466 .41738 1.7173 -579.058 -200.778)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4022\"\n        id=\"radialGradient4028\"\n        cx=\"479.822\"\n        cy=\"402.549\"\n        r=\"14.36\"\n        fx=\"479.822\"\n        fy=\"402.549\"\n        gradientTransform=\"matrix(1 0 0 1.24138 0 -99.767)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4022\"\n        id=\"radialGradient4032\"\n        cx=\"479.822\"\n        cy=\"402.549\"\n        r=\"14.36\"\n        fx=\"479.822\"\n        fy=\"402.549\"\n        gradientTransform=\"matrix(1 0 0 1.24138 0 -99.767)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4022\"\n        id=\"radialGradient4036\"\n        cx=\"479.822\"\n        cy=\"402.549\"\n        r=\"14.36\"\n        fx=\"479.822\"\n        fy=\"402.549\"\n        gradientTransform=\"matrix(1 0 0 1.24138 0 -99.767)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4040\"\n        id=\"radialGradient4046\"\n        cx=\"466.948\"\n        cy=\"413.814\"\n        r=\"8.418\"\n        fx=\"466.948\"\n        fy=\"413.814\"\n        gradientTransform=\"matrix(1 0 0 .58823 0 170.394)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4040\"\n        id=\"radialGradient4050\"\n        cx=\"466.948\"\n        cy=\"413.814\"\n        r=\"8.418\"\n        fx=\"466.948\"\n        fy=\"413.814\"\n        gradientTransform=\"matrix(1 0 0 .58823 0 170.394)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4040\"\n        id=\"radialGradient4054\"\n        cx=\"466.948\"\n        cy=\"413.814\"\n        r=\"8.418\"\n        fx=\"466.948\"\n        fy=\"413.814\"\n        gradientTransform=\"matrix(1 0 0 .58823 0 170.394)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4040\"\n        id=\"radialGradient4058\"\n        cx=\"466.948\"\n        cy=\"413.814\"\n        r=\"8.418\"\n        fx=\"466.948\"\n        fy=\"413.814\"\n        gradientTransform=\"matrix(1 0 0 .58823 0 170.394)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4078\"\n        id=\"radialGradient4084\"\n        cx=\"460.501\"\n        cy=\"492.96\"\n        r=\"67.116\"\n        fx=\"460.501\"\n        fy=\"492.96\"\n        gradientTransform=\"matrix(.97916 -.20308 .11477 .55337 -125.367 203.222)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4078\"\n        id=\"radialGradient4088\"\n        cx=\"425.973\"\n        cy=\"336.024\"\n        r=\"67.116\"\n        fx=\"425.973\"\n        fy=\"336.024\"\n        gradientTransform=\"matrix(.97916 -.20308 .11477 .55337 -125.367 203.222)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4078\"\n        id=\"radialGradient4092\"\n        cx=\"426.521\"\n        cy=\"404.561\"\n        r=\"67.116\"\n        fx=\"426.521\"\n        fy=\"404.561\"\n        gradientTransform=\"matrix(.97916 -.20308 .11477 .55337 -125.367 203.222)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4100\"\n        id=\"radialGradient4106\"\n        cx=\"419.17\"\n        cy=\"447.712\"\n        r=\"67.116\"\n        fx=\"419.17\"\n        fy=\"447.712\"\n        gradientTransform=\"matrix(1.28171 -1.16916 .55588 .6094 -443.233 538.773)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4124\"\n        id=\"radialGradient4130\"\n        cx=\"381.115\"\n        cy=\"426.09\"\n        r=\"50.98\"\n        fx=\"381.115\"\n        fy=\"426.09\"\n        gradientTransform=\"matrix(1.47594 .04857 -.0306 .92996 -246.735 -88.548)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4134\"\n        id=\"radialGradient4140\"\n        cx=\"398.834\"\n        cy=\"426.792\"\n        r=\"37.413\"\n        fx=\"398.834\"\n        fy=\"426.792\"\n        gradientTransform=\"matrix(.19265 .17206 -.80304 .89912 586.346 -124.04)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4152\"\n        id=\"radialGradient4158\"\n        cx=\"440.319\"\n        cy=\"445.031\"\n        r=\"60.556\"\n        fx=\"440.319\"\n        fy=\"445.031\"\n        gradientTransform=\"matrix(1 0 0 .6259 -78.385 67.09)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4166\"\n        id=\"radialGradient4172\"\n        cx=\"414.657\"\n        cy=\"480.4\"\n        r=\"67.121\"\n        fx=\"414.657\"\n        fy=\"480.4\"\n        gradientTransform=\"matrix(1.24358 -.23873 .04606 .23991 -201.514 355.73)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4181\"\n        id=\"radialGradient4187\"\n        cx=\"472.576\"\n        cy=\"413.274\"\n        r=\"18.667\"\n        fx=\"472.576\"\n        fy=\"413.274\"\n        gradientTransform=\"matrix(1.30812 -.16364 .0425 .33976 -241.255 249.97)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3160\"\n        id=\"radialGradient3166\"\n        cx=\"205.999\"\n        cy=\"367.332\"\n        r=\"13.572\"\n        fx=\"205.999\"\n        fy=\"367.332\"\n        gradientTransform=\"matrix(.84222 -.53914 1.03895 1.623 -427.522 -218.898)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3176\"\n        id=\"radialGradient3182\"\n        cx=\"207.704\"\n        cy=\"368.071\"\n        r=\"14.071\"\n        fx=\"207.704\"\n        fy=\"368.071\"\n        gradientTransform=\"matrix(.81183 .5839 -1.45132 2.01785 494.891 -595.318)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3202\"\n        id=\"radialGradient3208\"\n        cx=\"204.737\"\n        cy=\"362.011\"\n        r=\"12.205\"\n        fx=\"197.861\"\n        fy=\"357.639\"\n        gradientTransform=\"matrix(1 0 0 .74648 -81.194 -13.406)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3212\"\n        id=\"radialGradient3218\"\n        cx=\"201.209\"\n        cy=\"362.693\"\n        r=\"13.572\"\n        fx=\"201.209\"\n        fy=\"362.693\"\n        gradientTransform=\"matrix(1.52596 .18616 -.16188 1.32694 -126.416 -254.503)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3236\"\n        id=\"radialGradient3242\"\n        cx=\"164.463\"\n        cy=\"330.811\"\n        r=\"8.144\"\n        fx=\"164.463\"\n        fy=\"330.811\"\n        gradientTransform=\"matrix(1 0 0 .1194 0 291.311)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3236\"\n        id=\"radialGradient3246\"\n        cx=\"164.463\"\n        cy=\"330.811\"\n        r=\"8.144\"\n        fx=\"164.463\"\n        fy=\"330.811\"\n        gradientTransform=\"matrix(1 0 0 .1194 0 291.311)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3236\"\n        id=\"radialGradient3250\"\n        cx=\"164.463\"\n        cy=\"330.811\"\n        r=\"8.144\"\n        fx=\"164.463\"\n        fy=\"330.811\"\n        gradientTransform=\"matrix(1 0 0 .1194 0 291.311)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3254\"\n        id=\"radialGradient3260\"\n        cx=\"211.094\"\n        cy=\"354.807\"\n        r=\"24.675\"\n        fx=\"211.094\"\n        fy=\"354.807\"\n        gradientTransform=\"matrix(.51531 -.857 1.46801 .88272 -496.932 118.39)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3292\"\n        id=\"radialGradient3298\"\n        cx=\"163.869\"\n        cy=\"385.37\"\n        r=\"36.718\"\n        fx=\"163.869\"\n        fy=\"385.37\"\n        gradientTransform=\"matrix(.42716 .33301 -1.13757 1.45917 457.896 -331.15)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3302\"\n        id=\"radialGradient3308\"\n        cx=\"194.203\"\n        cy=\"375.725\"\n        r=\"36.718\"\n        fx=\"194.203\"\n        fy=\"375.725\"\n        gradientTransform=\"matrix(.6971 .71697 -1 .97228 359.08 -223.275)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3312\"\n        id=\"radialGradient3318\"\n        cx=\"196.314\"\n        cy=\"364.188\"\n        r=\"9.97\"\n        fx=\"196.314\"\n        fy=\"364.188\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3312\"\n        id=\"radialGradient3322\"\n        cx=\"196.314\"\n        cy=\"364.188\"\n        r=\"9.97\"\n        fx=\"196.314\"\n        fy=\"364.188\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3393\"\n        id=\"radialGradient3399\"\n        cx=\"188.527\"\n        cy=\"375.744\"\n        r=\"13.306\"\n        fx=\"188.527\"\n        fy=\"375.744\"\n        gradientTransform=\"matrix(1.13505 .87521 -1.28423 1.66551 378.818 -514.278)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3433\"\n        id=\"radialGradient3439\"\n        cx=\"196.485\"\n        cy=\"386.555\"\n        r=\"3.76\"\n        fx=\"196.485\"\n        fy=\"386.555\"\n        gradientTransform=\"matrix(.29424 -.23795 2.0831 2.5758 -744.773 -659.565)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3462\"\n        id=\"radialGradient3468\"\n        cx=\"173.966\"\n        cy=\"382.582\"\n        r=\"4.126\"\n        fx=\"173.966\"\n        fy=\"382.582\"\n        gradientTransform=\"matrix(1 0 0 4.54167 0 -1354.977)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3504\"\n        id=\"radialGradient3510\"\n        cx=\"205.526\"\n        cy=\"385.104\"\n        r=\"36.367\"\n        fx=\"205.526\"\n        fy=\"385.104\"\n        gradientTransform=\"matrix(.82996 .55782 -.93594 1.39254 316.996 -364.148)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3515\"\n        id=\"radialGradient3521\"\n        cx=\"154.325\"\n        cy=\"447.325\"\n        r=\"36.367\"\n        fx=\"154.325\"\n        fy=\"447.325\"\n        gradientTransform=\"matrix(.45869 -.28226 .06122 .09948 -14.005 316.432)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3515\"\n        id=\"radialGradient3525\"\n        cx=\"300.194\"\n        cy=\"73.224\"\n        r=\"36.367\"\n        fx=\"300.194\"\n        fy=\"73.224\"\n        gradientTransform=\"matrix(.40196 .1148 -.03208 .11231 9.854 196.295)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3589\"\n        id=\"radialGradient3595\"\n        cx=\"602.947\"\n        cy=\"490.518\"\n        r=\"43.516\"\n        fx=\"602.947\"\n        fy=\"490.518\"\n        gradientTransform=\"matrix(1.5013 -.05412 .20617 3.29523 -399.074 -1075.738)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3599\"\n        id=\"radialGradient3605\"\n        cx=\"593.913\"\n        cy=\"482.753\"\n        r=\"43.516\"\n        fx=\"593.913\"\n        fy=\"482.753\"\n        gradientTransform=\"matrix(1 0 0 2.16201 0 -560.965)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3611\"\n        id=\"radialGradient3617\"\n        cx=\"619.237\"\n        cy=\"398.238\"\n        r=\"23.541\"\n        fx=\"619.237\"\n        fy=\"398.238\"\n        gradientTransform=\"matrix(1.72333 0 0 .48238 -536.503 98.602)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3611\"\n        id=\"radialGradient3621\"\n        cx=\"619.237\"\n        cy=\"398.238\"\n        r=\"23.541\"\n        fx=\"619.237\"\n        fy=\"398.238\"\n        gradientTransform=\"matrix(1.67904 2.05966 -.49851 .54354 -281.37 -1180.781)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3687\"\n        id=\"radialGradient3693\"\n        cx=\"620.077\"\n        cy=\"485.957\"\n        r=\"21.114\"\n        fx=\"620.077\"\n        fy=\"485.957\"\n        gradientTransform=\"matrix(.99208 .08938 -.10416 1.2596 56.93 -155.101)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3698\"\n        id=\"radialGradient3704\"\n        cx=\"605.287\"\n        cy=\"502.169\"\n        r=\"21.114\"\n        fx=\"605.287\"\n        fy=\"502.169\"\n        gradientTransform=\"matrix(.53617 -.6447 1.51465 1.7579 -479.86 42.184)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3708\"\n        id=\"radialGradient3714\"\n        cx=\"605.426\"\n        cy=\"495.91\"\n        r=\"22.316\"\n        fx=\"605.426\"\n        fy=\"495.91\"\n        gradientTransform=\"matrix(1.09959 -1.30095 .79959 .67583 -535.2 863.325)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient3681\"\n        id=\"radialGradient3917\"\n        cx=\"597.915\"\n        cy=\"528.538\"\n        r=\"26.297\"\n        fx=\"597.915\"\n        fy=\"528.538\"\n        gradientTransform=\"matrix(1 0 0 .79562 0 108.022)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4113\"\n        id=\"radialGradient4119\"\n        cx=\"526.596\"\n        cy=\"412.699\"\n        r=\"12.64\"\n        fx=\"526.596\"\n        fy=\"412.699\"\n        gradientTransform=\"matrix(1.12505 -.19936 .03695 .20851 -159.483 335.711)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4125\"\n        id=\"radialGradient4123\"\n        cx=\"526.922\"\n        cy=\"464.452\"\n        r=\"12.64\"\n        fx=\"526.922\"\n        fy=\"464.452\"\n        gradientTransform=\"matrix(1.38908 0 0 .39346 -281.24 145.102)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4151\"\n        id=\"radialGradient4157\"\n        cx=\"428.298\"\n        cy=\"492.748\"\n        r=\"19.732\"\n        fx=\"428.298\"\n        fy=\"492.748\"\n        gradientTransform=\"matrix(2.00814 .10222 .1293 .84855 -493.55 33.794)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4192\"\n        id=\"radialGradient4198\"\n        cx=\"422.664\"\n        cy=\"503.637\"\n        r=\"5.565\"\n        fx=\"422.664\"\n        fy=\"503.637\"\n        gradientTransform=\"matrix(1.49026 -.21419 .24752 1.72219 -409.517 -372.308)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4206\"\n        id=\"radialGradient4204\"\n        cx=\"423.858\"\n        cy=\"490.216\"\n        r=\"19.732\"\n        fx=\"423.858\"\n        fy=\"490.216\"\n        gradientTransform=\"matrix(1.1468 .00084 .0709 .83586 -99.829 82.988)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4212\"\n        id=\"radialGradient4218\"\n        cx=\"410.426\"\n        cy=\"502.762\"\n        r=\"4.849\"\n        fx=\"410.426\"\n        fy=\"502.762\"\n        gradientTransform=\"matrix(.98983 .14227 -.36677 2.55183 188.574 -838.593)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4222\"\n        id=\"radialGradient4228\"\n        cx=\"405.577\"\n        cy=\"504.226\"\n        r=\"4.849\"\n        fx=\"405.577\"\n        fy=\"504.226\"\n        gradientTransform=\"matrix(1 0 0 1.35897 0 -180.479)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4232\"\n        id=\"radialGradient4238\"\n        cx=\"410.426\"\n        cy=\"506.605\"\n        r=\"4.849\"\n        fx=\"410.426\"\n        fy=\"506.605\"\n        gradientTransform=\"matrix(1 0 0 1.35897 0 -180.479)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4258\"\n        id=\"radialGradient4264\"\n        cx=\"149.969\"\n        cy=\"441.128\"\n        r=\"2.919\"\n        fx=\"149.969\"\n        fy=\"441.128\"\n        gradientTransform=\"matrix(1 0 0 1.98681 -78.385 -534.71)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4300\"\n        id=\"radialGradient4306\"\n        cx=\"420.249\"\n        cy=\"498.162\"\n        r=\"1.492\"\n        fx=\"420.249\"\n        fy=\"498.162\"\n        gradientTransform=\"matrix(1 0 0 1.5 0 -249.081)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4085\"\n        id=\"radialGradient4093\"\n        cx=\"219.184\"\n        cy=\"463.985\"\n        r=\"105.508\"\n        fx=\"219.184\"\n        fy=\"463.985\"\n        gradientTransform=\"matrix(1 0 0 .40281 -78.385 190.197)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4097\"\n        id=\"radialGradient4105\"\n        cx=\"340.862\"\n        cy=\"590.446\"\n        r=\"105.508\"\n        fx=\"340.862\"\n        fy=\"590.446\"\n        gradientTransform=\"matrix(.9968 .0799 -.02 .2495 -65.487 253.49)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4114\"\n        id=\"radialGradient4120\"\n        cx=\"187.42\"\n        cy=\"418.411\"\n        r=\"104.798\"\n        fx=\"187.42\"\n        fy=\"418.411\"\n        gradientTransform=\"matrix(.15772 .05034 -.11371 .3563 127.053 202.284)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4097\"\n        id=\"radialGradient4180\"\n        cx=\"182.487\"\n        cy=\"328.248\"\n        r=\"105.508\"\n        fx=\"182.487\"\n        fy=\"328.248\"\n        gradientTransform=\"matrix(.9968 .0799 -.02 .2495 -65.487 253.49)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4207\"\n        id=\"radialGradient4213\"\n        cx=\"476.249\"\n        cy=\"402.012\"\n        r=\"67.121\"\n        fx=\"476.249\"\n        fy=\"402.012\"\n        gradientTransform=\"matrix(1 0 0 .83494 -78.385 -29.112)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4231\"\n        id=\"radialGradient4346\"\n        cx=\"676.019\"\n        cy=\"273.289\"\n        r=\"60.178\"\n        fx=\"676.019\"\n        fy=\"273.289\"\n        gradientTransform=\"matrix(.86316 0 0 .10929 92.862 227.447)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4253\"\n        id=\"radialGradient4348\"\n        cx=\"603.651\"\n        cy=\"286.454\"\n        r=\"60.178\"\n        fx=\"603.651\"\n        fy=\"286.454\"\n        gradientTransform=\"matrix(.29433 -.11576 .037 .09406 418.732 306.329)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4291\"\n        id=\"radialGradient4354\"\n        cx=\"604.511\"\n        cy=\"257.576\"\n        r=\"3.233\"\n        fx=\"604.511\"\n        fy=\"257.576\"\n        gradientTransform=\"matrix(1 0 0 .5 0 128.788)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4291\"\n        id=\"radialGradient4356\"\n        cx=\"604.511\"\n        cy=\"257.576\"\n        r=\"3.233\"\n        fx=\"604.511\"\n        fy=\"257.576\"\n        gradientTransform=\"matrix(1 0 0 .5 0 128.788)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4231\"\n        id=\"radialGradient4415\"\n        cx=\"676.019\"\n        cy=\"273.289\"\n        r=\"60.178\"\n        fx=\"676.019\"\n        fy=\"273.289\"\n        gradientTransform=\"matrix(.86316 0 0 .10929 92.862 227.447)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4253\"\n        id=\"radialGradient4417\"\n        cx=\"603.651\"\n        cy=\"286.454\"\n        r=\"60.178\"\n        fx=\"603.651\"\n        fy=\"286.454\"\n        gradientTransform=\"matrix(.29433 -.11576 .037 .09406 418.732 306.329)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4291\"\n        id=\"radialGradient4423\"\n        cx=\"604.511\"\n        cy=\"257.576\"\n        r=\"3.233\"\n        fx=\"604.511\"\n        fy=\"257.576\"\n        gradientTransform=\"matrix(1 0 0 .5 0 128.788)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4291\"\n        id=\"radialGradient4425\"\n        cx=\"604.511\"\n        cy=\"257.576\"\n        r=\"3.233\"\n        fx=\"604.511\"\n        fy=\"257.576\"\n        gradientTransform=\"matrix(1 0 0 .5 0 128.788)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4447\"\n        id=\"radialGradient4517\"\n        cx=\"747.15\"\n        cy=\"166.782\"\n        r=\"39.927\"\n        fx=\"747.15\"\n        fy=\"166.782\"\n        gradientTransform=\"matrix(-.51429 -.5953 .18282 -.15794 1100.91 615.382)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4447\"\n        id=\"radialGradient4519\"\n        cx=\"683.797\"\n        cy=\"134.886\"\n        r=\"39.927\"\n        fx=\"683.797\"\n        fy=\"134.886\"\n        gradientTransform=\"matrix(.73986 -.32014 .11748 .27151 161.536 317.336)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4447\"\n        id=\"radialGradient4521\"\n        cx=\"709.059\"\n        cy=\"210.962\"\n        r=\"39.927\"\n        fx=\"709.059\"\n        fy=\"210.962\"\n        gradientTransform=\"matrix(.40146 .07086 -.01525 .08642 436.108 54.692)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4672\"\n        id=\"radialGradient4829\"\n        cx=\"590.426\"\n        cy=\"211.723\"\n        r=\"4.106\"\n        fx=\"590.426\"\n        fy=\"211.723\"\n        gradientTransform=\"matrix(2 0 0 .97942 -590.426 4.357)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4672\"\n        id=\"radialGradient4831\"\n        cx=\"594.532\"\n        cy=\"215.829\"\n        r=\"4.106\"\n        fx=\"594.532\"\n        fy=\"215.829\"\n        gradientTransform=\"matrix(.88652 0 0 .97942 71.572 4.357)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4695\"\n        id=\"radialGradient4701\"\n        cx=\"552.008\"\n        cy=\"340.004\"\n        r=\"31.367\"\n        fx=\"552.008\"\n        fy=\"340.004\"\n        gradientTransform=\"matrix(-.4271 1.49623 -.74213 -.21184 956.988 -512.885)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4399\"\n        id=\"radialGradient4405\"\n        cx=\"739.799\"\n        cy=\"216.445\"\n        r=\"35.907\"\n        fx=\"739.799\"\n        fy=\"216.445\"\n        gradientTransform=\"matrix(.80948 .3715 -.14024 .30557 92.801 -233.564)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4672\"\n        id=\"radialGradient3509\"\n        cx=\"590.426\"\n        cy=\"211.723\"\n        r=\"4.106\"\n        fx=\"590.426\"\n        fy=\"211.723\"\n        gradientTransform=\"matrix(2 0 0 .97942 -590.426 4.357)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n      <RadialGradient\n        xlinkHref=\"#linearGradient4672\"\n        id=\"radialGradient3511\"\n        cx=\"594.532\"\n        cy=\"215.829\"\n        r=\"4.106\"\n        fx=\"594.532\"\n        fy=\"215.829\"\n        gradientTransform=\"matrix(.88652 0 0 .97942 71.572 4.357)\"\n        gradientUnits=\"userSpaceOnUse\"\n      ></RadialGradient>\n    </Defs>\n    <G fillOpacity=\"1\" strokeLinejoin=\"miter\" strokeOpacity=\"1\" opacity=\"1\">\n      <Path\n        fill=\"url(#linearGradient4438)\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.6\"\n        d=\"M995.928 476.826a445.917 154.735 0 1 1-891.834 0 445.917 154.735 0 1 1 891.834 0\"\n        opacity=\"0.762\"\n        transform=\"rotate(-10.481 -52.246 958.069)\"\n      ></Path>\n      <Path\n        fill=\"#06060a\"\n        fillRule=\"evenodd\"\n        stroke=\"#000\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M164.838 433.188s40.098 15.947 77.016 28.976 168.378 25.315 181.408 25.315 59.9 13.19 79.265 9.772c18.459-3.257 36.918-22.802 36.918-22.802s3.257-45.604 33.66-60.806S673 352.838 683.858 350.666s41.261-8.686 41.261-8.686l26.06-15.202s-10.858-26.06-21.717-26.06-47.775-6.514-112.924 4.344c-65.15 10.858-349.633 45.604-377.865 58.634-28.23 13.03-93.38 43.432-93.38 43.432z\"\n        opacity=\"0.974\"\n      ></Path>\n    </G>\n    <G strokeOpacity=\"1\" opacity=\"1\">\n      <Path\n        fill=\"url(#linearGradient4307)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M703.369 289.218c45.73-9.307 71.52-9.186 51.277 27.46 3.042.143-8.03 9.305-5.09 8.465.615-.294 2.412-.713 1.083.185-2.045 1.654-4.357 2.962-6.703 4.14-11.735 3.349-61.6 5.221-100.762-1.81-1.112-2.109-.518-7.256 1.895-13.62 4.8-13.586 11.438-28.348 13.824-30.354 2.773-2.007 5.48-2.726 7.992-3.431 1.72-.204 3.293-.365 4.94-.127 3.274 1.143 7.028 4.657 10.047 6.314 2.38 1.484 4.958 3.278 7.657 5.237.458-.022 1.072-.01 1.553 1.437.786 1.256 11.243-4.428 12.287-3.896\"\n        opacity=\"0.852\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4430)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M507.314 479.377c-60.785 2.908-121.798-2.93-182.598-11.852-10.537-2.814-19.721-9.716-25.975-18.576-2.48-2.91-4.932-5.843-7.423-8.743-2.781-5.359-.112-12.182 4.628-15.475 11.46-11.661 27.405-17.893 43.372-20.162 24.423-3.996 48.138-12.857 73.116-12.99 13.311-.084 26.376 2.805 39.28 5.758 13.383 2.941 26.787 6.075 39.636 10.896 11.11 4.94 21.772 12.24 28.059 22.882 2.749 6.856 20.31.432 21.301 7.58.068 6.488-8.164 23.41-14.196 25.58-2.98 1.73-15.778 14.179-19.2 15.102\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M522.71 392.797c-6.914 36.821 4.088 71.673-14.079 82.113-7.286 4.188-42.113-2.08-49.548-3.687-25.972-5.615-40.163-47.18-30.477-98.77s38.626-88.904 64.599-83.29c25.972 5.616 39.19 52.043 29.504 103.634\"\n        color=\"#000\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M268.954 429.008s159.094 22.694 299.72-47.619c162.465-81.232 198.505-132.865 202.706-141.268 4.202-8.404 10.18-56.21-3.827-59.012-14.005-2.8-65.826-11.204-100.84 7.003s-210.084 86.835-219.888 96.639-155.462 131.652-177.87 144.257\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3577)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M522.71 392.797c-6.914 36.821 4.088 71.673-14.079 82.113-7.286 4.188-42.113-2.08-49.548-3.687-25.972-5.615-40.163-47.18-30.477-98.77s38.626-88.904 64.599-83.29c25.972 5.616 39.19 52.043 29.504 103.634\"\n        color=\"#000\"\n        opacity=\"0.535\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M637.43 482.753a43.516 94.083 0 1 1-87.033 0 43.516 94.083 0 1 1 87.032 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(1.08124 .23375 -.1865 .99339 -37.573 -235.766)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3595)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M637.43 482.753a43.516 94.083 0 1 1-87.033 0 43.516 94.083 0 1 1 87.032 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(1.08124 .23375 -.1865 .99339 -37.573 -235.766)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3605)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M637.43 482.753a43.516 94.083 0 1 1-87.033 0 43.516 94.083 0 1 1 87.032 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(.7777 .19023 -.13415 .80845 126.663 -119.18)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#c1c1c1\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"0.5\"\n        d=\"M553.064 408.785c-2.984 15.648-19.07 46.347-33.373 46.347-14.304 0-25.913-12.297-25.913-27.449 0-15.151 11.609-27.448 25.913-27.448s34.865-6.602 33.373 8.55\"\n        opacity=\"0.417\"\n      ></Path>\n      <Path\n        fill=\"#2b3034\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M626.899 482.279a21.114 55.665 0 1 1-42.228 0 21.114 55.665 0 1 1 42.228 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(1.30617 .35672 -.22955 1.07491 -154.298 -347.017)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3693)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M626.899 482.279a21.114 55.665 0 1 1-42.228 0 21.114 55.665 0 1 1 42.228 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(1.30617 .35672 -.22955 1.07491 -154.298 -347.017)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#212e3d\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M626.899 482.279a21.114 55.665 0 1 1-42.228 0 21.114 55.665 0 1 1 42.228 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(1.17368 .32054 -.20627 .96588 -87.616 -273.668)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3704)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M626.899 482.279a21.114 55.665 0 1 1-42.228 0 21.114 55.665 0 1 1 42.228 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(1.17368 .32054 -.20627 .96588 -87.616 -273.668)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#303038\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M523.146 335.194c-10.025 6.59-19.53 23.301-24.03 44.375-4.754 22.259-2.588 43.062 4.562 53.656.645.318 1.309.593 2 .781 12.52 3.42 27.417-15.834 33.218-43s.334-52.018-12.187-55.437a11.1 11.1 0 0 0-3.563-.375\"\n        color=\"#000\"\n        opacity=\"1\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3714)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M523.146 335.194c-10.025 6.59-19.53 23.301-24.03 44.375-4.754 22.259-2.588 43.062 4.562 53.656.645.318 1.309.593 2 .781 12.52 3.42 27.417-15.834 33.218-43s.334-52.018-12.187-55.437a11.1 11.1 0 0 0-3.563-.375\"\n        color=\"#000\"\n        opacity=\"1\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"#000\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M695.671 308.233s9.724 17.504 20.421 19.449c16.377 2.977 27.635-.271 33.063-3.89 8.752-5.835 15.559-28.156 17.504-54.456 1.075-14.547 2.917-33.063 0-40.842-2.918-7.78-9.725-15.56-9.725-15.56s-2.917-2.916-7.78 0c-4.861 2.918-18.475 23.34-26.255 28.201-7.78 4.863-15.559 21.394-15.559 26.256s-10.697 40.842-11.669 40.842z\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3617)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M555.614 310.997s-10.4-26.426-29.899-28.724c-19.498-2.298-31.198-5.745-37.698 1.149-6.5 6.893-11.699 20.68 9.1 18.383s49.397 3.447 58.497 9.192\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3621)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M563.188 363.8s17.177-42.204.554-68.098-24.46-43.76-37.917-43.76c-13.457-.001-32.772 9.32-10.132 31.588 22.639 22.27 44.566 62.922 47.495 80.27\"\n      ></Path>\n      <Path\n        fill=\"#1a1c2c\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M517.834 343.225c-1.262.07-2.536.398-3.813.938-6.364 8.497-11.812 20.919-14.906 35.406-3.565 16.694-3.245 32.57.156 43.937.005.005-.005.027 0 .032 1.212 1.042 2.547 1.79 4 2.187 10.456 2.856 22.875-13.222 27.72-35.906 4.843-22.684.298-43.426-10.157-46.281a9.4 9.4 0 0 0-3-.313\"\n        color=\"#000\"\n        opacity=\"1\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#262932\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2.555\"\n        d=\"M626.899 482.279a21.114 55.665 0 1 1-42.228 0 21.114 55.665 0 1 1 42.228 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(.34308 .0937 -.0603 .28234 338.396 192.627)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#0c0912\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2.555\"\n        d=\"M626.899 482.279a21.114 55.665 0 1 1-42.228 0 21.114 55.665 0 1 1 42.228 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(.34308 .0937 -.0603 .28234 340.7 193.01)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#74849d\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"#abbcd1\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2.555\"\n        d=\"M626.899 482.279a21.114 55.665 0 1 1-42.228 0 21.114 55.665 0 1 1 42.228 0z\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(.18617 .05084 -.03272 .1532 423.22 281.295)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#192028\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2.555\"\n        d=\"M626.899 482.279a21.114 55.665 0 1 1-42.228 0 21.114 55.665 0 1 1 42.228 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(.18617 .05084 -.03272 .1532 426.067 281.838)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3651)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M516.675 430.727s12.45-5.914 20.854-29.57 3.424-29.57 3.424-29.57-1.556 21.166-3.424 24.278c-1.867 3.113-7.47 8.093-5.914 6.226 1.557-1.868 3.735-8.093 4.358-12.762s-1.245-7.16-1.245-7.16-3.424 20.855-8.093 27.703-12.139 14.63-14.63 15.563c-2.49.934-5.602.623-5.602.623s3.424 2.801 6.537 1.556 4.046-.623 4.046-.623 1.556 4.047-2.801 4.047-7.16 1.556-10.583-1.556-5.603-7.16-5.603-7.16.311 9.338 9.027 10.272 9.96-1.556 9.649-1.867\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4266)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"2\"\n        d=\"M512.428 440.463s24.953 7.294 37.622-54.897\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4256)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"2.566\"\n        d=\"M515.115 445.838s26.68 7.798 40.226-58.697\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4351)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.574\"\n        d=\"M504.141 426.093s19.638 5.74 29.608-43.202\"\n        opacity=\"0.758\"\n      ></Path>\n      <Path\n        fill=\"#cbe8fd\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M519.259 387.26s.575-6.142 2.303-7.293c1.728-1.152 4.223-2.304 2.687-2.496-1.535-.192-3.647-.383-3.647-.383s-3.839 3.455-3.839 4.99-1.151 4.799-1.151 4.799.575-1.536 3.647.384\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4343)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"2.019\"\n        d=\"M508.176 430.707s20.996 6.137 31.656-46.193\"\n        opacity=\"0.758\"\n      ></Path>\n      <Path\n        fill=\"#cbe8fd\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M526.36 386.301s-2.303 5.95-4.414 6.334c-2.112.384-2.495.384-2.495.384s1.535 2.304 2.879 1.536c1.343-.768 4.607-5.375 4.03-8.254\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4243)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.166\"\n        d=\"M537.298 327.535s-26.68-7.8-40.226 58.697\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m513.444 375.636-3.978-25.364s1.99-4.476 7.46-5.47c5.47-.995 7.46 0 7.46 0l-2.984 24.369s-5.47-.995-7.958 6.465\"\n      ></Path>\n      <Path\n        fill=\"#c7eef2\"\n        fillOpacity=\"0.149\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M474.839 392.242s11.733-60.287 33.162-74.15c18.7-12.097 26.015-7.829 30.9-5.657 4.887 2.171 4.344-8.144-.542-10.858s-12.992-4.932-23.71-2.354c-3.338.803-13.75 6.697-15.38 8.869-1.628 2.171-10.858 17.373-13.572 22.802-2.715 5.429-7.058 30.403-7.058 30.403z\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4083)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m513.444 375.636-1.491-30.337s-2.958-2.664 5.47-1.99c4.92.394 6.963 1.492 6.963 1.492l-2.984 24.37s-5.47-.995-7.958 6.465\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M511.213 467.707s-20.63-7.058-29.317-22.26c-8.686-15.201-8.686-19.544-12.487-36.917-.906-4.143-2.714-41.261-3.257-36.918s-16.83 20.087-15.201 26.602-5.972 8.687-4.887 13.03-17.728 8.56-14.658 24.431c3.065 15.848 10.315 30.946 36.375 24.43 9.993-2.498 20.63 12.488 24.974 12.488 4.343 0 19.544-4.344 18.458-4.886\"\n        opacity=\"0.654\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M511.953 401.995h6.465l3.481-2.487v14.423s-6.465 8.952-8.455 9.947c-1.989.994-5.47.497-5.47.497z\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3893)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M525.864 334.124s8.446-1.92 13.82 3.071 8.446 16.892 8.446 24.954c0 8.061 0 25.72-1.92 28.024-1.919 2.303-5.758 1.152-4.606-11.9 1.152-13.053.384-29.177-3.839-35.32-3.397-4.94-6.142-8.445-11.9-8.829\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4275)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.5\"\n        d=\"M549.282 389.789s8.062-41.844-7.294-52.594\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4098)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M512.45 404.979h6.465l2.487-2.487.497 11.439s-4.476 6.963-8.455 9.947c-1.779 1.334-2.984-.498-2.984-.498z\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4283)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.46\"\n        d=\"M538.72 386.376s7.422-38.518-6.713-48.413\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3917)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"0.5\"\n        d=\"M624.212 528.538a26.297 20.922 0 1 1-52.594 0 26.297 20.922 0 1 1 52.594 0\"\n        opacity=\"0.617\"\n        transform=\"matrix(.69343 0 0 1.31193 334.647 -400.85)\"\n      ></Path>\n      <Path\n        fill=\"#1e2128\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"0.5\"\n        d=\"M834.993 368.13a8.687 40.718 0 1 1-17.373 0 8.687 40.718 0 1 1 17.373 0\"\n        opacity=\"0.829\"\n        transform=\"matrix(1.35272 .0502 -.095 .96724 -332.422 -125.832)\"\n      ></Path>\n      <Path\n        fill=\"#1e2128\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"0.5\"\n        d=\"M754.24 232.319c-6.486-.24-13.49 17.229-15.625 38.969s1.389 39.571 7.875 39.812 13.49-17.197 15.625-38.937-1.389-39.603-7.875-39.844m-1.844 5.094c5.682.21 8.777 15.833 6.907 34.875s-7.975 34.335-13.657 34.125c-5.68-.211-8.776-15.833-6.906-34.875s7.975-34.336 13.656-34.125\"\n        opacity=\"0.829\"\n      ></Path>\n      <Path\n        fill=\"#3f4654\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"0.5\"\n        d=\"M752.362 237.944c-.962-.036-1.947.39-2.911 1.197 3.979 3.974 5.884 17.375 4.334 33.155-1.524 15.52-5.903 28.48-10.545 32.38.75.748 1.572 1.163 2.458 1.196 5.595.208 11.615-14.823 13.457-33.576 1.842-18.752-1.198-34.144-6.793-34.352\"\n        opacity=\"0.829\"\n      ></Path>\n      <Path\n        fill=\"#1e2128\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"0.5\"\n        d=\"M748.69 236.975c-.86 1.316-1.697 2.9-2.5 4.688 3.245 4.06 4.73 15.562 3.407 29.03-1.378 14.03-5.394 25.735-9.594 29.032.326 1.563.7 3.003 1.125 4.281 5.297-1.457 10.737-15.8 12.47-33.437 1.617-16.469-.564-30.327-4.907-33.594\"\n        opacity=\"0.829\"\n      ></Path>\n      <Path\n        fill=\"#b2b7c5\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M759.594 267.373s3.257.272 2.714 4.887-3.07 27.337-11.4 35.289c-5.973 5.7-8.144-1.63-8.144-1.63s3.8 2.987 5.7-.27 10.587-14.388 11.13-38.276\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3762)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M750.093 269.274s4.615-2.986 4.072 1.628c-.543 4.615-1.122 21.964-8.958 30.403-3.53 3.8-5.158 0-5.158 0s-1.357 2.986.543-.271 8.958-7.872 9.501-31.76\"\n      ></Path>\n      <Path\n        fill=\"#b2b7c5\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M757.694 249.186s2.171-1.9 2.171 2.986 1.629 15.744.815 16.016-1.9-2.172-1.63-6.787c.272-4.614-1.356-12.486-1.356-12.215\"\n        opacity=\"0.738\"\n      ></Path>\n      <Path\n        fill=\"#b2b7c5\"\n        fillOpacity=\"0.295\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M743.85 303.748c2.443-1.9 3.528-8.686 5.7-9.5s6.515-.272 3.8 3.257-3.528 10.044-5.7 9.5c-2.172-.542-2.986-2.17-3.8-3.257\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3742)\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M748.193 311.349s10.587-5.972 12.487-31.217 1.9-27.689 1.9-27.689\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3746)\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M744.195 312.363s10.838-5.503 13.842-30.64c3.005-25.138 3.112-27.579 3.112-27.579\"\n      ></Path>\n      <Path\n        fill=\"#23262f\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"0.5\"\n        d=\"M829.211 373.253a2.687 8.83 0 1 1-5.374 0 2.687 8.83 0 1 1 5.374 0\"\n        opacity=\"1\"\n        transform=\"rotate(6.271 1723.385 -379.418)\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3780)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"0.5\"\n        d=\"M829.211 373.253a2.687 8.83 0 1 1-5.374 0 2.687 8.83 0 1 1 5.374 0\"\n        opacity=\"1\"\n        transform=\"rotate(6.271 1723.385 -379.418)\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3791)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m749.29 261.952-4.222 1.152-1.92 5.374s4.991 3.84 4.991 1.92 1.536-8.062 1.152-8.446\"\n      ></Path>\n      <Path\n        fill=\"#e0e2e8\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m747.371 245.06 2.687 15.357s4.607-8.062-2.687-15.356\"\n        opacity=\"0.15\"\n      ></Path>\n      <Path\n        fill=\"#e0e2e8\"\n        fillOpacity=\"0.112\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M738.158 272.701c.15-9.747 3.07-37.621 14.588-40.692 11.517-3.072 11.133 23.8 11.133 23.8s1.151-16.506-.384-21.881-1.92-9.213-6.526-11.9c-3.648-2.128-6.812.528-10.366 5.374-4.222 5.758-10.703 27.926-11.516 43.38-.768 14.588-1.536 30.327 2.303 37.238s9.981 9.597 13.436 8.061 8.062-13.052 8.83-15.74c.768-2.687-4.607 15.356-9.214 12.67-4.606-2.688-12.902-.15-12.284-40.31\"\n      ></Path>\n      <Path\n        fill=\"#e0e2e8\"\n        fillOpacity=\"0.328\"\n        fillRule=\"evenodd\"\n        stroke=\"#000\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M744.3 229.321s7.678-10.365 11.133-8.062 8.83 10.75 8.83 10.75-.384-4.607-3.84-13.053c-3.668-8.968-11.132-5.374-13.052-3.455-1.92 1.92-3.071 13.82-3.071 13.82z\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3738)\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M754.602 231.134s-10.34 4.075-14.856 28.985c-4.044 22.311.013 27.352.013 27.352\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4109)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m525.38 371.657 6.466-10.941s.995 18.899-.497 23.375-2.487.497-2.487.497.497-9.947-3.481-12.93\"\n      ></Path>\n      <Path\n        fill=\"#5d5d5d\"\n        fillOpacity=\"0.162\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M469.516 412.593s0 43.607 18.287 56.97c18.287 13.364 40.793-6.33 40.793-6.33s16.88-15.473 20.397-28.837-10.55 21.1-28.837 21.1-32.353-29.54-35.167-41.496-13.363-19.694-15.473-1.407\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4123)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M509.963 381.604h-10.941s-2.984 22.38-1.492 31.332c6.465-5.968 12.433-11.438 12.433-11.438s-3.481-12.931 0-19.894\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4279)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M496.243 402.043s7.204-24.034 17.05-28.958 15.303-9.023 17.414 2.23c2.11 11.254 11.253-10.55 9.846-14.066-1.406-3.517-4.22-21.803-11.253-23.913s-11.064-.306-17.584 11.253c-18.97 33.634-14.066 42.904-15.473 53.454\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"#161616\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M469.679 422.883s0-38.792 5.968-58.686 12.93-44.76 21.883-51.723c8.952-6.962 21.883-8.952 15.914-13.925s-13.925-14.92-25.86-2.984c-11.937 11.936-23.873 40.782-26.857 58.686s-2.984 60.675-2.984 60.675 0 19.893 11.936 7.957\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4377)\"\n        strokeDasharray=\"2.9, 2.9\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2.9\"\n        d=\"M509.022 474.286s-24.726 1.337-38.76-26.062-9.355-65.49-9.355-65.49\"\n        opacity=\"0.067\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4381)\"\n        strokeDasharray=\"2.9, 2.9\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2.9\"\n        d=\"M494.989 474.955s-24.726 1.336-38.76-26.063-9.356-65.49-9.356-65.49\"\n        opacity=\"0.067\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4385)\"\n        strokeDasharray=\"2.9, 2.9\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2.9\"\n        d=\"M484.296 474.955s-24.726 1.336-38.76-26.063-9.355-65.49-9.355-65.49\"\n        opacity=\"0.067\"\n      ></Path>\n    </G>\n    <G strokeLinejoin=\"miter\" strokeOpacity=\"1\" opacity=\"1\">\n      <Path\n        fill=\"#ffbe00\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M547.334 87.913c-41.429 0-84.643 5.71-90 6.78-5.357 1.072-10.01 5-11.438 5s-4.28 1.416-6.78 2.845c-2.5 1.428-4.3 5.375-7.157 7.875s-47.844 50.343-47.844 50.343l-3.937 1.438S285.9 173.97 229.115 188.256s-90.361 36.433-110.719 48.22c-20.357 11.785-7.852 9.29-16.78 15.718-8.93 6.428-21.43 29.277-25 38.562-3.572 9.286-5 30.375-5 32.875s1.78 12.5 1.78 12.5-1.78 2.853-1.78 6.782 6.437 5 6.437 5c.714.357 4.272 18.205 42.843 41.062s121.782 39.281 121.782 39.281 49.28 8.224 66.78 8.938 90.938-8.969 90.938-8.969 26.21 2.183 42.282-18.531 21.223-26.647 36.937-70.219 31.897-52.803 37.969-56.375c6.071-3.571 30.303-14.022 43.875-2.594s13.714 20.97 18 35.97 6.13 50.297 1.812 55.374c-6.387 7.513-21.08 12.487-18.937 12.844s9.281-1.438 9.281-1.438l15.719-9.28s81.062-47.51 108.562-63.938 34.657-25.344 34.657-25.344l-1.094-3.938s.719-5.714 3.219-12.5 9.052-31.616 13.593-45.718c4.56-14.16 6.224-19.567 11.938-22.782s10.559 9.991 10.937 17.344c.837 16.256-1.812 30.813-1.812 30.813l1.062-1.782 5.375-8.937s3.732-8.923 6.688-16.938l-.094-.03c4.771-13.58 3.789-26.439 2.688-32.188-1.072-5.598-3.466-9.04-12.282-17.907-.01-.003-.021.004-.03 0-1.738-.674-2.404-1.707-7.688-5.437-6.072-4.286-21.094-8.567-26.094-9.281s-5.688-.375-5.688-.375l-1.437-3.907s-22.491-42.513-56.063-52.156c-33.571-9.643-85.009-11.062-126.437-11.062\"\n      ></Path>\n      <G\n        fill=\"#e1eee5\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        transform=\"translate(-78.385 -99.4)\"\n      >\n        <Path d=\"m504.086 258.33 48.527-4.952 26.244-41.594-44.07-2.476z\"></Path>\n        <Path d=\"m498.639 259.876 31.691-52.549-50.713 54.844z\"></Path>\n        <Path d=\"M615.005 203.366s13.864 13.865 26.244 19.311c12.38 5.447 29.215 12.38 35.157 12.38 8.913 0 37.633-1.486 37.633-1.486l-1.485-19.311s-1.486-2.971-12.875-3.962c-9.386-.816-52.983-4.952-52.983-4.952z\"></Path>\n      </G>\n      <Path\n        fill=\"#2b3545\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m440.873 107.23-45.163 50.074-11.91 6.648s.722 2.627 8.075 2.89c2.964.106 9.268-.57 13.648-1.416 6.485-1.252 12.24-4.975 12.24-4.975l-18.18 2.408 45.491-55.98z\"\n      ></Path>\n      <G\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        transform=\"translate(-78.385 -99.4)\"\n      >\n        <Path\n          fill=\"url(#linearGradient3586)\"\n          d=\"m479.945 260.476 72.668-7.098 26.244-41.594-58.555-4.086z\"\n        ></Path>\n        <Path\n          fill=\"url(#linearGradient3588)\"\n          d=\"m498.639 259.876 31.691-52.549-50.713 54.844z\"\n        ></Path>\n        <Path\n          fill=\"url(#linearGradient3584)\"\n          d=\"M615.005 203.366s13.864 13.865 26.244 19.311c12.38 5.447 29.215 12.38 35.157 12.38 8.913 0 37.633-1.486 37.633-1.486l-1.485-19.311s-1.486-2.971-12.875-3.962c-9.386-.816-52.983-4.952-52.983-4.952z\"\n        ></Path>\n      </G>\n      <Path\n        fill=\"#152032\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m390.103 166.403 86.134-9.103 23.11-43.418-45.519-4.201-15.406-3.502s13.305-3.501 17.507-3.501 75.63.7 78.431.7 6.303 4.902 9.804 8.403 25.91 14.706 30.112 16.807 24.51 7.003 24.51 7.003l37.815-1.4 6.303 41.316s-32.213 4.202-52.521 3.501c-20.309-.7-121.149-7.002-133.054-7.002-11.904 0-67.226-4.202-67.226-5.603\"\n      ></Path>\n      <G\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        strokeLinecap=\"butt\"\n        opacity=\"1\"\n        transform=\"translate(-139.557 33.886)\"\n      >\n        <Path\n          stroke=\"#614d19\"\n          strokeDasharray=\"none\"\n          strokeWidth=\"5.3\"\n          d=\"M675.557 139.926s9.323-24.105 39.387-21.1c25.602 2.56 35.167 24.265 35.167 24.265\"\n        ></Path>\n        <Path\n          stroke=\"url(#linearGradient4515)\"\n          strokeDasharray=\"none\"\n          strokeWidth=\"5.3\"\n          d=\"M675.557 139.926s9.323-24.105 39.387-21.1c25.602 2.56 35.167 24.265 35.167 24.265\"\n        ></Path>\n        <Path\n          stroke=\"url(#radialGradient4517)\"\n          strokeDasharray=\"none\"\n          strokeWidth=\"5.3\"\n          d=\"M675.557 139.926s9.323-24.105 39.387-21.1c25.602 2.56 35.167 24.265 35.167 24.265\"\n        ></Path>\n        <Path\n          stroke=\"url(#radialGradient4519)\"\n          strokeDasharray=\"none\"\n          strokeWidth=\"5.3\"\n          d=\"M675.557 139.926s9.323-24.105 39.387-21.1c25.602 2.56 35.167 24.265 35.167 24.265\"\n        ></Path>\n        <Path\n          stroke=\"url(#radialGradient4521)\"\n          strokeDasharray=\"none\"\n          strokeWidth=\"5.3\"\n          d=\"M675.557 139.926s9.323-24.105 39.387-21.1c25.602 2.56 35.167 24.265 35.167 24.265\"\n        ></Path>\n        <Path\n          stroke=\"url(#linearGradient4523)\"\n          strokeWidth=\"1\"\n          d=\"M674.884 140.08s10.747-19.599 27.354-21.136c13.428-1.244 21.634 0 31.83 6.216s16.66 17.407 16.66 17.407\"\n        ></Path>\n      </G>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3169)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.9\"\n        d=\"M182.33 251.123s-3.93 6.072-2.858 8.572-.714 5 11.786 7.857c18.03 4.121 51.786 7.5 65 10s48.929 7.143 65.357 2.857c16.429-4.286 37.143-14.643 67.5-29.643s79.643-33.571 102.857-40.357c23.215-6.786 48.572-15 50.715-15.714 2.142-.715 5.357-1.786 2.857-3.572s-10.715-2.857-10.715-2.857\"\n        opacity=\"0.542\"\n      ></Path>\n      <Path\n        fill=\"#e9f0f1\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3467)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.7\"\n        d=\"M476.053 97.319c-4.925 0-28.393.744-29.782 1.375s-6.707 2.932-7.843 3.437c-.481.214-1.331 2.122-2.157 4.25.047-.03.139-.075.157-.093.714-.715 5.196-2.474 6.625-3.188 1.428-.714 11.78-1.259 15.53-1.437s41.974-.366 76.438 1.062c34.465 1.429 85.884 7.143 93.563 8.75 7.678 1.607 12.312 4.643 14.812 12.5s4.657 41.603 4.657 43.031c0 1.429-1.625 3.21-4.125 5.532s-6.072 2.696-36.25 4.125-86.42-1.255-148.563-4.47c-62.143-3.213-70.357-5.704-75-7.312-4.643-1.607-2.5-3.03-2.5-3.03.008.003.042-.047.063-.063-1.186.045-2.064.062-2.094.062-.631 1.01-1.624 1.894-1.75 3.156s.986 3.4 2.375 4.032c1.389.631 12.132 3.026 17.687 3.53 5.556.506 78.535 6.713 103.032 7.345 24.496.631 89.91 1.376 98.75 1.25 8.838-.127 37.498-.771 40.78-1.782 3.284-1.01 9.338-3.022 9.97-7.062.63-4.04.19-25.604-3.282-47.469-3.221-20.29-34.837-19.785-50-21.719-9.032-1.151-57.964-4.686-64.656-4.812s-51.513-1-56.437-1z\"\n      ></Path>\n      <Path\n        fill=\"#03222f\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M649.846 108.595s10.379-.774 15.435-.258 18.896 1.548 22.621 2.322c3.726.774 6.121 1.29 7.718 3.096 5.063 3.539-2.538.61-.087 3.49 3.298 8.634 15.764 50.17 15.764 50.17s-21.266 4.387-29.782 6.192-22.62 4.902-22.62 4.902-3.194.516-3.46-3.612c-.267-4.127-4.525-42.825-5.59-48.5-1.064-5.677-3.459-12.384-3.193-14.19s2.928-3.612 3.194-3.612\"\n      ></Path>\n      <Path\n        fill=\"#213447\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m633.1 113.532 8.403 61.275s8.403-8.404 7.703-11.205c-.7-2.8-5.207-40.151-7.003-42.717-2.45-3.501-5.602-6.653-9.103-7.353\"\n      ></Path>\n      <Path\n        fill=\"#d4f0fc\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M649.683 110.071s9.849-.757 14.647-.252 17.93 1.515 21.466 2.273c3.535.757 5.808 1.262 7.323 3.03s2.525 2.778 5.556 12.627c3.03 9.849 12.374 39.901 12.374 39.901s-23.233 4.293-31.314 6.061c-8.082 1.768-21.466 4.798-21.466 4.798s-3.03.505-3.283-3.535-4.293-41.922-5.303-47.477c-1.01-5.556-3.283-12.122-3.03-13.89.252-1.768 2.777-3.536 3.03-3.536\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3662)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M649.683 110.071s9.849-.757 14.647-.252 17.93 1.515 21.466 2.273c3.535.757 5.808 1.262 7.323 3.03s2.525 2.778 5.556 12.627c3.03 9.849 12.374 39.901 12.374 39.901s-23.233 4.293-31.314 6.061c-8.082 1.768-21.466 4.798-21.466 4.798s-3.03.505-3.283-3.535-4.293-41.922-5.303-47.477c-1.01-5.556-3.283-12.122-3.03-13.89.252-1.768 2.777-3.536 3.03-3.536\"\n      ></Path>\n      <Path\n        fill=\"#042b3d\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M655.49 112.344s29.295 1.01 32.578 2.273 3.788.758 5.051 3.283 14.395 49.245 14.395 49.245l-36.618 8.081z\"\n      ></Path>\n      <Path\n        fill=\"#d1e3ec\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M656.501 114.365s16.415.505 22.476 1.262c6.06.758 10.102.758 11.617 2.526s5.303 17.677 5.303 17.677l8.586 32.325-33.082 6.566z\"\n      ></Path>\n      <Path\n        fill=\"#def3fd\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3499)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.6\"\n        d=\"m649.683 118.405 2.525-2.273 1.01-.505 13.89 56.064-10.86 1.767-6.06-48.74z\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3275)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.7\"\n        d=\"M658.044 178.98s-8.572 3.929-10.715 5.357c-2.142 1.43-5 4.286-5.357 6.786s3.572 12.5 7.857 19.643 7.5 17.857 7.858 21.071 3.214 35.715 1.428 47.5c-1.786 11.786-7.143 46.43-7.143 46.43\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3753)\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M712.687 169.695s17.142 9.285 20.357 15.714c3.214 6.428 7.5 12.857 7.5 20.714 0 6.429-11.746 49.881-13.215 54.286-2.5 7.5-5.714 18.571-10 23.214s-16.071 13.572-20.714 16.072l-4.643 2.5\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3111)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M469.276 312.929s14.798-9.399 38.105-21.996c5.839-3.157 6.493-7.011 13.302-10.471 3.317-1.686 12.457-2.9 15.97-4.623 24.536-12.04 53.555-24.728 83.156-34.215 77.247-24.759 112.9-34.662 117.85-35.652 4.953-.99 9.122-9.145 18.843-12.076 7.586-2.286 6.391-1.914 11.135-7.532 4.99-5.91 3.695-15.055 3.695-15.055.48-1.439-18.432-17.99-43.576-15.845-23.764 2.027 10.894 2.97 19.807 12.874 4.863 5.404-6.699 16.341-15.073 15.796-6.974-.455-14.87-14.046-19.37-14.946-9.904-1.981-17.055 2.121-24.977 3.112-7.923.99-17.827 9.903-33.672 21.787-15.846 11.885-86.16 27.73-123.793 50.508s-58.43 69.324-61.402 68.334\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3103)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M767.365 167.881v17.282s-14.849 8.925-21.781 10.906c-6.933 1.98-15.849 11.882-22.781 15.844-6.933 3.961-87.154 20.813-144.594 46.562a2169 2169 0 0 0-37.125 17.063c7.258-.748 14.733.218 20.375 4.968 13.571 11.429 13.714 20.97 18 35.97s6.13 50.297 1.812 55.374c-6.387 7.513-21.08 12.487-18.937 12.844s9.281-1.438 9.281-1.438l15.719-9.28s81.062-47.51 108.562-63.938 34.657-25.344 34.657-25.344l-1.094-3.938s.719-5.714 3.219-12.5 9.052-31.616 13.593-45.718c4.56-14.16 6.224-19.567 11.938-22.782s10.559 9.991 10.937 17.344c.837 16.256-1.812 30.813-1.812 30.813l1.062-1.782 5.375-8.937s3.737-8.922 6.688-16.938l-.094-.03c4.771-13.58 3.789-26.439 2.688-32.188-1.074-5.605-3.47-9.046-12.313-17.938-1.078-.436-1.846-1.035-3.375-2.219M505.21 292.944c-13.668 6.86-23.303 11.963-29 15.031-12.875 6.933-19.799 6.938-37.625 19.813s-36.653 39.616-68.344 51.5c-42.88 8.65-50.132 7.971-107.781 1.812-88.735-9.48-172.33-37.027-189.281-46.25l.218 1.281s-1.78 2.853-1.78 6.782 6.437 5 6.437 5c.714.357 4.272 18.205 42.843 41.062s121.782 39.281 121.782 39.281 49.28 8.224 66.78 8.938 90.938-8.969 90.938-8.969 26.21 2.183 42.282-18.531 21.223-26.647 36.937-70.219c9.045-25.078 18.258-38.733 25.594-46.531\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3151)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M77.077 324.667s-2.8 8.403 7.703 14.005c10.505 5.602 98.74 36.415 136.555 36.415s8.403-38.516 14.706-60.224c6.302-21.709 11.204-76.33 55.322-80.533 44.118-4.201 152.661-13.305 155.462-14.005s74.23-17.507 81.933-22.41c7.703-4.901 18.908-9.103-24.51-11.904-43.417-2.801-90.336-4.202-101.54-7.703s-18.908 4.202-22.41-4.202c-3.5-8.403-2.1-10.504-9.103-10.504s-49.72 7.703-87.535 14.006c-37.815 6.302-85.434 19.608-112.745 30.812s-53.922 30.112-53.922 30.112 9.104-6.302 18.208-.7 14.705 15.406 12.605 20.308c-2.101 4.902-17.507 26.61-24.51 32.213-7.003 5.602-34.314 32.213-38.516 32.913s-5.602 1.4-7.703 1.4\"\n        opacity=\"0.608\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3133)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M122.966 236.49s11.262 1.458 16.164 5.66c4.902 4.201 5.816 13.091 5.816 17.293 0 4.201-6.244 14.103-6.244 14.103l-7.003 11.205s19.608-16.107 34.314-27.311 56.723-35.715 71.428-43.418c14.706-7.703 76.331-28.711 84.734-30.812 8.404-2.1 24.51-4.202 21.009-8.403s-21.009 0-36.415 1.4c-7.112.647-84.734 16.107-106.442 23.11-21.71 7.002-68.958 31.57-77.361 37.172\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3161)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M507.834 188.725c-1.612-.006-4.935.218-11.063 1.531-9.804 2.101-31.727 8.356-41.53 11.157-9.805 2.8-67.947 19.623-93.157 23.125S234.634 240.3 204.52 255.006s-38.5 31.85-53.906 33.25c-15.406 1.401-19.605-4.22-22.406-.718S85.467 332.38 79.865 332.38c0 0 37.124 20.31 71.438 27.313 29.632 6.047 99.989 22.674 123.156 23.5.128.256.28.487.531.687 4.22 3.377 39.679 1.688 63.031.844 22.288-.805 16.078 2.752 48.688-13.531-15.258 6.083-54.667 12.125-68.938 12.125-14.626 0-23.175-4.456-30.968-12.281 2.567-10.227 4.095-24.21 8.75-31.657 7.002-11.204 16.096-22.241 24.5-27.843s67.946-52.685 77.75-59.688 65.139-28.016 91.75-35.719c26.61-7.703 43.414-10.517 53.218-14.718s20.299-9.088 9.094-7.688-81.922 22.406-89.625 22.406-35.736 9.783-39.937 6.282c-4.202-3.502 20.332-13.28 32.937-16.782 12.605-3.501 53.906-16.812 53.906-16.812s-.345-.09-1.312-.094M386.709 371.194c1.889-.753 3.446-1.475 4.5-2.219-1.745.873-2.942 1.44-4.5 2.219\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3179)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"0.8\"\n        d=\"M182.825 251.123s-3.929 5.081-2.858 7.581c1.072 2.5-.714 5 11.786 7.857 18.03 4.122 51.786 7.5 65 10s48.929 7.143 65.357 2.858c16.429-4.286 37.143-14.643 67.5-29.643s79.643-33.572 102.857-40.357c23.215-6.786 48.572-15 50.715-15.715s5.357-1.785 2.857-3.571-10.714-2.857-10.714-2.857\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3197)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M85.343 330.501s-2.801-.348 7.703 5.254 90.474 39.332 128.289 39.332 8.403-38.516 14.706-60.224c6.302-21.709 11.204-76.33 55.322-80.533 44.118-4.201 152.661-13.305 155.462-14.005s74.23-17.507 81.933-22.41c7.703-4.901 18.908-9.103-24.51-11.904-43.417-2.801-90.336-4.202-101.54-7.703s-18.908 4.202-22.41-4.202c-3.5-8.403-2.1-10.504-9.103-10.504s-49.72 7.703-87.535 14.006c-37.815 6.302-85.434 19.608-112.745 30.812s-53.922 30.112-53.922 30.112 9.104-6.302 18.208-.7 23.944 7.14 21.843 12.042-26.745 34.877-33.748 40.479-34.314 32.213-38.516 32.913 2.664 7.235.563 7.235\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3207)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m767.365 167.881 5.094 4.22c0 9.449-6.617 20.609-15.406 22.25-6.453 1.203-12.543 6.29-14.938 9.812-4.054 5.961-11.8 3.658-19.312 6.366s-87.154 22.197-144.594 47.946a2169 2169 0 0 0-37.125 17.063c7.258-.748 14.733.218 20.375 4.968 13.571 11.429 13.714 20.97 18 35.97s6.13 50.297 1.812 55.374c-6.387 7.513-21.08 12.487-18.937 12.844s9.281-1.438 9.281-1.438l15.719-9.28s81.062-47.51 108.562-63.938 34.657-25.344 34.657-25.344l-1.094-3.938s.719-5.714 3.219-12.5 9.052-31.616 13.593-45.718c4.56-14.16 6.224-19.567 11.938-22.782s10.559 9.991 10.937 17.344c.837 16.256-1.812 30.813-1.812 30.813l1.062-1.782 5.375-8.937s3.737-8.922 6.688-16.938l-.094-.03c4.771-13.58 3.789-26.439 2.688-32.188-1.074-5.605-3.47-9.046-12.313-17.938-1.078-.436-1.846-1.035-3.375-2.219M505.21 292.944c-13.668 6.86-23.303 11.963-29 15.031-12.875 6.933-19.799 6.938-37.625 19.813s-36.653 39.616-68.344 51.5c-42.88 8.65-50.132 7.971-107.781 1.812-88.735-9.48-172.33-37.027-189.281-46.25l.218 1.281s-1.78 2.853-1.78 6.782 6.437 5 6.437 5c.714.357 4.272 18.205 42.843 41.062s121.782 39.281 121.782 39.281 49.28 8.224 66.78 8.938 90.938-8.969 90.938-8.969 26.21 2.183 42.282-18.531 21.223-26.647 36.937-70.219c9.045-25.078 18.258-38.733 25.594-46.531\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3211)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M767.365 167.881v17.282s-12.974 12.894-19.906 14.875c-6.933 1.98-17.724 6.183-24.656 10.145-6.933 3.961-87.154 22.543-144.594 48.292a2169 2169 0 0 0-37.125 17.063c7.258-.748 14.733.218 20.375 4.968 13.571 11.429 13.714 20.97 18 35.97s6.13 50.297 1.812 55.374c-6.387 7.513-21.08 12.487-18.937 12.844s9.281-1.438 9.281-1.438l15.719-9.28s81.062-47.51 108.562-63.938 34.657-25.344 34.657-25.344l-1.094-3.938s.719-5.714 3.219-12.5 9.052-31.616 13.593-45.718c4.56-14.16 6.224-19.567 11.938-22.782s10.559 9.991 10.937 17.344c.837 16.256-1.812 30.813-1.812 30.813l1.062-1.782 5.375-8.937s3.737-8.922 6.688-16.938l-.094-.03c4.771-13.58 3.789-26.439 2.688-32.188-1.074-5.605-3.47-9.046-12.313-17.938-1.078-.436-1.846-1.035-3.375-2.219M505.21 292.944c-13.668 6.86-23.303 11.963-29 15.031-12.875 6.933-19.799 6.938-37.625 19.813s-36.653 39.616-68.344 51.5c-42.88 8.65-50.132 7.971-107.781 1.812-76.817-8.207-149.788-29.948-179-41.625-3.048-1.218-5.176-8.432-6.938-13.437-.516 2.242-1.187 4.25-1.187 4.25s-3.719 8.696-3.719 12.625c0 3.928 6.438 5 6.438 5 .714.357 4.272 18.205 42.843 41.062s121.782 39.281 121.782 39.281 49.28 8.224 66.78 8.938 90.938-8.969 90.938-8.969 26.21 2.183 42.282-18.531 21.223-26.647 36.937-70.219c9.045-25.078 18.258-38.733 25.594-46.531M76.52 326.038c.848-3.685 1.28-7.976-2.375-4.813.746.406 1.517 2.375 2.375 4.813\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3261)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M614.688 200.252c-29.21.14-79.851 8.872-112.594 18.125-37.686 10.65-95.08 41.332-114 51.719 5.327.513 10.699 2.457 15.75 6.687 17.823 14.927 19.15 40.284 16.437 53.157.907-1.433-13.856 27.055-13.043 25.428 6.933-13.865 76.206-42.522 93.566-58.997 5.728-5.435 19.894-18.53 40.761-22.202 49.052-8.63 101.45-62.016 95.216-69.636-2.507-3.064-10.664-4.336-22.093-4.28\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3459)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.7\"\n        d=\"M712.074 127.982c-26.95-25.55-40.584-26.768-81.86-27.652-5.747-.123-20.75-2.143-29.222-2.638-53.026-3.1-146.624-.996-140.297-2.391 11.86-2.616 38.656-7.327 91.77-7.838 52.401-.505 91.483 3.512 119.899 10.84 17.785 4.587 40.41 28.196 39.71 29.679\"\n        opacity=\"1\"\n      ></Path>\n      <G\n        fillRule=\"evenodd\"\n        strokeLinecap=\"butt\"\n        transform=\"translate(-34.075 -38.561)\"\n      >\n        <G>\n          <G transform=\"translate(-43.959 -60.487)\">\n            <Path\n              fill=\"#80989b\"\n              fillOpacity=\"1\"\n              stroke=\"none\"\n              strokeWidth=\"1\"\n              d=\"m585.53 212.722 19.341-1.055s4.093-.342 4.572 4.923c.352 3.869-.703 7.385-.703 7.385l-26.375-.351s-2.11-2.814-1.055-5.627 3.868-5.275 4.22-5.275\"\n            ></Path>\n            <Path\n              fill=\"#ccdbed\"\n              fillOpacity=\"0.726\"\n              stroke=\"none\"\n              strokeWidth=\"1\"\n              d=\"M583.068 221.162c1.407.352 20.397.352 21.803.352s2.11-1.055 2.11-2.462-1.406-4.923-3.868-5.627-17.232-.351-17.232-.351-2.813 2.11-3.165 3.868.352 4.22.352 4.22\"\n            ></Path>\n            <Path\n              fill=\"url(#linearGradient3501)\"\n              fillOpacity=\"1\"\n              stroke=\"none\"\n              strokeWidth=\"1\"\n              d=\"m585.53 212.722 19.341-1.055s4.093-.342 4.572 4.923c.352 3.869-.703 7.385-.703 7.385l-26.375-.351s-2.11-2.814-1.055-5.627 3.868-5.275 4.22-5.275\"\n            ></Path>\n            <Path\n              fill=\"url(#linearGradient3505)\"\n              fillOpacity=\"1\"\n              stroke=\"none\"\n              strokeWidth=\"1\"\n              d=\"M583.068 221.162c1.407.352 20.397.352 21.803.352s2.11-1.055 2.11-2.462-1.406-4.923-3.868-5.627-17.232-.351-17.232-.351-2.813 2.11-3.165 3.868.352 4.22.352 4.22\"\n            ></Path>\n            <Path\n              fill=\"url(#linearGradient3507)\"\n              fillOpacity=\"1\"\n              stroke=\"none\"\n              strokeWidth=\"1\"\n              d=\"m585.53 212.722 19.341-1.055s4.093-.342 4.572 4.923c.352 3.869-.703 7.385-.703 7.385l-26.375-.351s-2.11-2.814-1.055-5.627 3.868-5.275 4.22-5.275\"\n            ></Path>\n            <Path\n              fill=\"none\"\n              fillOpacity=\"0.75\"\n              stroke=\"#1f3157\"\n              strokeDasharray=\"none\"\n              strokeWidth=\"1.6\"\n              d=\"M592.563 208.502s-2.462 2.813-.703 4.923c1.758 2.11 5.978 1.407 5.978 1.407\"\n            ></Path>\n            <Path\n              fill=\"none\"\n              fillOpacity=\"0.75\"\n              stroke=\"url(#radialGradient3509)\"\n              strokeDasharray=\"none\"\n              strokeWidth=\"1.6\"\n              d=\"M592.563 208.502s-2.462 2.813-.703 4.923c1.758 2.11 5.978 1.407 5.978 1.407\"\n            ></Path>\n            <Path\n              fill=\"none\"\n              fillOpacity=\"0.75\"\n              stroke=\"url(#radialGradient3511)\"\n              strokeDasharray=\"none\"\n              strokeWidth=\"1.6\"\n              d=\"M592.563 208.502s-2.462 2.813-.703 4.923c1.758 2.11 5.978 1.407 5.978 1.407\"\n            ></Path>\n          </G>\n          <Path\n            fill=\"url(#linearGradient3513)\"\n            fillOpacity=\"1\"\n            stroke=\"none\"\n            strokeWidth=\"1\"\n            d=\"m539.11 160.323 23.21.352 2.461 3.165s-5.627-1.055-8.44-1.407c-2.813-.351-15.825.704-15.825.704s-4.924.351-1.407-2.814\"\n          ></Path>\n        </G>\n        <G opacity=\"0.871\">\n          <G transform=\"translate(-43.959 -60.487)\">\n            <Path\n              fill=\"#80989b\"\n              fillOpacity=\"1\"\n              stroke=\"none\"\n              strokeWidth=\"1\"\n              d=\"m585.53 212.722 19.341-1.055s4.093-.342 4.572 4.923c.352 3.869-.703 7.385-.703 7.385l-26.375-.351s-2.11-2.814-1.055-5.627 3.868-5.275 4.22-5.275\"\n            ></Path>\n            <Path\n              fill=\"#ccdbed\"\n              fillOpacity=\"0.726\"\n              stroke=\"none\"\n              strokeWidth=\"1\"\n              d=\"M583.068 221.162c1.407.352 20.397.352 21.803.352s2.11-1.055 2.11-2.462-1.406-4.923-3.868-5.627-17.232-.351-17.232-.351-2.813 2.11-3.165 3.868.352 4.22.352 4.22\"\n            ></Path>\n            <Path\n              fill=\"url(#linearGradient4823)\"\n              fillOpacity=\"1\"\n              stroke=\"none\"\n              strokeWidth=\"1\"\n              d=\"m585.53 212.722 19.341-1.055s4.093-.342 4.572 4.923c.352 3.869-.703 7.385-.703 7.385l-26.375-.351s-2.11-2.814-1.055-5.627 3.868-5.275 4.22-5.275\"\n            ></Path>\n            <Path\n              fill=\"url(#linearGradient4825)\"\n              fillOpacity=\"1\"\n              stroke=\"none\"\n              strokeWidth=\"1\"\n              d=\"M583.068 221.162c1.407.352 20.397.352 21.803.352s2.11-1.055 2.11-2.462-1.406-4.923-3.868-5.627-17.232-.351-17.232-.351-2.813 2.11-3.165 3.868.352 4.22.352 4.22\"\n            ></Path>\n            <Path\n              fill=\"url(#linearGradient4827)\"\n              fillOpacity=\"1\"\n              stroke=\"none\"\n              strokeWidth=\"1\"\n              d=\"m585.53 212.722 19.341-1.055s4.093-.342 4.572 4.923c.352 3.869-.703 7.385-.703 7.385l-26.375-.351s-2.11-2.814-1.055-5.627 3.868-5.275 4.22-5.275\"\n            ></Path>\n            <Path\n              fill=\"none\"\n              fillOpacity=\"0.75\"\n              stroke=\"#1f3157\"\n              strokeDasharray=\"none\"\n              strokeWidth=\"1.6\"\n              d=\"M592.563 208.502s-2.462 2.813-.703 4.923c1.758 2.11 5.978 1.407 5.978 1.407\"\n            ></Path>\n            <Path\n              fill=\"none\"\n              fillOpacity=\"0.75\"\n              stroke=\"url(#radialGradient4829)\"\n              strokeDasharray=\"none\"\n              strokeWidth=\"1.6\"\n              d=\"M592.563 208.502s-2.462 2.813-.703 4.923c1.758 2.11 5.978 1.407 5.978 1.407\"\n            ></Path>\n            <Path\n              fill=\"none\"\n              fillOpacity=\"0.75\"\n              stroke=\"url(#radialGradient4831)\"\n              strokeDasharray=\"none\"\n              strokeWidth=\"1.6\"\n              d=\"M592.563 208.502s-2.462 2.813-.703 4.923c1.758 2.11 5.978 1.407 5.978 1.407\"\n            ></Path>\n          </G>\n          <Path\n            fill=\"url(#linearGradient4833)\"\n            fillOpacity=\"1\"\n            stroke=\"none\"\n            strokeWidth=\"1\"\n            d=\"m539.11 160.323 23.21.352 2.461 3.165s-5.627-1.055-8.44-1.407c-2.813-.351-15.825.704-15.825.704s-4.924.351-1.407-2.814\"\n          ></Path>\n        </G>\n      </G>\n      <Path\n        fill=\"url(#linearGradient3477)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.7\"\n        d=\"M476.053 97.319c-4.925 0-28.393.744-29.782 1.375s-6.707 2.932-7.843 3.437c-.481.214-1.331 2.122-2.157 4.25.047-.03.139-.075.157-.093.714-.715 5.196-2.474 6.625-3.188 1.428-.714 11.78-1.259 15.53-1.437s41.974-.366 76.438 1.062c34.465 1.429 85.884 7.143 93.563 8.75 7.678 1.607 12.312 4.643 14.812 12.5s4.657 41.603 4.657 43.031c0 1.429-1.625 3.21-4.125 5.532s-6.072 2.696-36.25 4.125-86.42-1.255-148.563-4.47c-62.143-3.213-70.357-5.704-75-7.312-4.643-1.607-2.5-3.03-2.5-3.03.008.003.042-.047.063-.063-1.186.045-2.064.062-2.094.062-.631 1.01-1.624 1.894-1.75 3.156s.986 3.4 2.375 4.032c1.389.631 12.132 3.026 17.687 3.53 5.556.506 78.535 6.713 103.032 7.345 24.496.631 89.91 1.376 98.75 1.25 8.838-.127 37.498-.771 40.78-1.782 3.284-1.01 9.338-3.022 9.97-7.062.63-4.04.19-25.604-3.282-47.469-3.221-20.29-34.837-19.785-50-21.719-9.032-1.151-57.964-4.686-64.656-4.812s-51.513-1-56.437-1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3481)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.7\"\n        d=\"M476.053 97.319c-4.925 0-28.393.744-29.782 1.375s-6.707 2.932-7.843 3.437c-.481.214-1.331 2.122-2.157 4.25.047-.03.139-.075.157-.093.714-.715 5.196-2.474 6.625-3.188 1.428-.714 11.78-1.259 15.53-1.437s41.974-.366 76.438 1.062c34.465 1.429 85.884 7.143 93.563 8.75 7.678 1.607 12.312 4.643 14.812 12.5s4.657 41.603 4.657 43.031c0 1.429-1.625 3.21-4.125 5.532s-6.072 2.696-36.25 4.125-86.42-1.255-148.563-4.47c-62.143-3.213-70.357-5.704-75-7.312-4.643-1.607-2.5-3.03-2.5-3.03.008.003.042-.047.063-.063-1.186.045-2.064.062-2.094.062-.631 1.01-1.624 1.894-1.75 3.156s.986 3.4 2.375 4.032c1.389.631 12.132 3.026 17.687 3.53 5.556.506 78.535 6.713 103.032 7.345 24.496.631 89.91 1.376 98.75 1.25 8.838-.127 37.498-.771 40.78-1.782 3.284-1.01 9.338-3.022 9.97-7.062.63-4.04.19-25.604-3.282-47.469-3.221-20.29-34.837-19.785-50-21.719-9.032-1.151-57.964-4.686-64.656-4.812s-51.513-1-56.437-1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3485)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.7\"\n        d=\"M476.053 97.319c-4.925 0-28.393.744-29.782 1.375s-6.707 2.932-7.843 3.437c-.481.214-1.331 2.122-2.157 4.25.047-.03.139-.075.157-.093.714-.715 5.196-2.474 6.625-3.188 1.428-.714 11.78-1.259 15.53-1.437s41.974-.366 76.438 1.062c34.465 1.429 85.884 7.143 93.563 8.75 7.678 1.607 12.312 4.643 14.812 12.5s4.657 41.603 4.657 43.031c0 1.429-1.625 3.21-4.125 5.532s-6.072 2.696-36.25 4.125-86.42-1.255-148.563-4.47c-62.143-3.213-70.357-5.704-75-7.312-4.643-1.607-2.5-3.03-2.5-3.03.008.003.042-.047.063-.063-1.186.045-2.064.062-2.094.062-.631 1.01-1.624 1.894-1.75 3.156s.986 3.4 2.375 4.032c1.389.631 12.132 3.026 17.687 3.53 5.556.506 78.535 6.713 103.032 7.345 24.496.631 89.91 1.376 98.75 1.25 8.838-.127 37.498-.771 40.78-1.782 3.284-1.01 9.338-3.022 9.97-7.062.63-4.04.19-25.604-3.282-47.469-3.221-20.29-34.837-19.785-50-21.719-9.032-1.151-57.964-4.686-64.656-4.812s-51.513-1-56.437-1\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3495)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.7\"\n        d=\"M476.053 97.319c-4.925 0-28.393.744-29.782 1.375s-6.707 2.932-7.843 3.437c-.481.214-1.331 2.122-2.157 4.25.047-.03.139-.075.157-.093.714-.715 5.196-2.474 6.625-3.188 1.428-.714 11.78-1.259 15.53-1.437s41.974-.366 76.438 1.062c34.465 1.429 85.884 7.143 93.563 8.75 7.678 1.607 12.312 4.643 14.812 12.5s4.657 41.603 4.657 43.031c0 1.429-1.625 3.21-4.125 5.532s-6.072 2.696-36.25 4.125-86.42-1.255-148.563-4.47c-62.143-3.213-70.357-5.704-75-7.312-4.643-1.607-2.5-3.03-2.5-3.03.008.003.042-.047.063-.063-1.186.045-2.064.062-2.094.062-.631 1.01-1.624 1.894-1.75 3.156s.986 3.4 2.375 4.032c1.389.631 12.132 3.026 17.687 3.53 5.556.506 78.535 6.713 103.032 7.345 24.496.631 89.91 1.376 98.75 1.25 8.838-.127 37.498-.771 40.78-1.782 3.284-1.01 9.338-3.022 9.97-7.062.63-4.04.19-25.604-3.282-47.469-3.221-20.29-34.837-19.785-50-21.719-9.032-1.151-57.964-4.686-64.656-4.812s-51.513-1-56.437-1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3509)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M552.567 123.686s20.309 10.504 30.113 12.605 54.621 3.502 54.621 3.502l.7 22.409-4.201 7.002-84.034-5.602-28.711-12.605s32.913-18.907 31.512-27.31\"\n      ></Path>\n      <Path\n        fill=\"#152032\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m426.196 159.425 30.7-50.012h-3.96l-32.682 51.498z\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3522)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M440.061 106.442s13.37 2.97 21.788 3.466c8.418.495 41.099-1.98 46.546-1.98s28.225-2.972 28.225-2.972-38.129-2.476-43.08-2.476-41.595 0-46.547 1.486-7.922 2.97-6.932 2.476\"\n      ></Path>\n      <Path\n        fill=\"#334d77\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m399.952 166.853 76.257-8.913 20.302-33.672 7.427-12.38h-3.961l-25.749 42.586-51.993 4.951 32.741-50.072-2.826-.145-31.896 50.217z\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3532)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M467.271 101.538c-4.648.02-7.75.08-8.687.125-3.75.178-14.103.723-15.531 1.437s-5.911 2.473-6.625 3.188c-.1.1-.718.413-1.594.843-.876 1.15-1.787 2.33-2.875 3.282-2.857 2.5-47.844 50.343-47.844 50.343l-2.25.813c-.13.166-.226.293-.25.281 0 0-2.143 1.424 2.5 3.031s12.857 4.099 75 7.313 118.384 5.897 148.563 4.469c30.178-1.429 33.75-1.804 36.25-4.125 2.5-2.322 4.125-4.103 4.125-5.532 0-1.428-2.157-35.174-4.657-43.03-2.5-7.858-7.134-10.894-14.812-12.5-7.679-1.608-59.098-7.322-93.563-8.75-25.848-1.072-53.804-1.247-67.75-1.188\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3542)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M467.271 101.538c-4.648.02-7.75.08-8.687.125-3.75.178-14.103.723-15.531 1.437s-5.911 2.473-6.625 3.188c-.1.1-.718.413-1.594.843-.876 1.15-1.787 2.33-2.875 3.282-2.857 2.5-47.844 50.343-47.844 50.343l-2.25.813c-.13.166-.226.293-.25.281 0 0-2.143 1.424 2.5 3.031s12.857 4.099 75 7.313 118.384 5.897 148.563 4.469c30.178-1.429 33.75-1.804 36.25-4.125 2.5-2.322 4.125-4.103 4.125-5.532 0-1.428-2.157-35.174-4.657-43.03-2.5-7.858-7.134-10.894-14.812-12.5-7.679-1.608-59.098-7.322-93.563-8.75-25.848-1.072-53.804-1.247-67.75-1.188\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3546)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M467.271 101.538c-4.648.02-7.75.08-8.687.125-3.75.178-14.103.723-15.531 1.437s-5.911 2.473-6.625 3.188c-.1.1-.718.413-1.594.843-.876 1.15-1.787 2.33-2.875 3.282-2.857 2.5-47.844 50.343-47.844 50.343l-2.25.813c-.13.166-.226.293-.25.281 0 0-2.143 1.424 2.5 3.031s12.857 4.099 75 7.313 118.384 5.897 148.563 4.469c30.178-1.429 33.75-1.804 36.25-4.125 2.5-2.322 4.125-4.103 4.125-5.532 0-1.428-2.157-35.174-4.657-43.03-2.5-7.858-7.134-10.894-14.812-12.5-7.679-1.608-59.098-7.322-93.563-8.75-25.848-1.072-53.804-1.247-67.75-1.188\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3550)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M467.271 101.538c-4.648.02-7.75.08-8.687.125-3.75.178-14.103.723-15.531 1.437s-5.911 2.473-6.625 3.188c-.1.1-.718.413-1.594.843-.876 1.15-1.787 2.33-2.875 3.282-2.857 2.5-47.844 50.343-47.844 50.343l-2.25.813c-.13.166-.226.293-.25.281 0 0-2.143 1.424 2.5 3.031s12.857 4.099 75 7.313 118.384 5.897 148.563 4.469c30.178-1.429 33.75-1.804 36.25-4.125 2.5-2.322 4.125-4.103 4.125-5.532 0-1.428-2.157-35.174-4.657-43.03-2.5-7.858-7.134-10.894-14.812-12.5-7.679-1.608-59.098-7.322-93.563-8.75-25.848-1.072-53.804-1.247-67.75-1.188\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3560)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M467.271 101.538c-4.648.02-7.75.08-8.687.125-3.75.178-14.103.723-15.531 1.437s-5.911 2.473-6.625 3.188c-.1.1-.718.413-1.594.843-.876 1.15-1.787 2.33-2.875 3.282-2.857 2.5-47.844 50.343-47.844 50.343l-2.25.813c-.13.166-.226.293-.25.281 0 0-2.143 1.424 2.5 3.031s12.857 4.099 75 7.313 118.384 5.897 148.563 4.469c30.178-1.429 33.75-1.804 36.25-4.125 2.5-2.322 4.125-4.103 4.125-5.532 0-1.428-2.157-35.174-4.657-43.03-2.5-7.858-7.134-10.894-14.812-12.5-7.679-1.608-59.098-7.322-93.563-8.75-25.848-1.072-53.804-1.247-67.75-1.188\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3285)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.7\"\n        d=\"M658.044 178.98s-8.572 3.929-10.715 5.357c-2.142 1.43-5 4.286-5.357 6.786s3.572 12.5 7.857 19.643 7.5 17.857 7.858 21.071 3.214 35.715 1.428 47.5c-1.786 11.786-7.143 46.43-7.143 46.43\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3616)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M438.072 105.83s5.158 2.741 11.847 3.59c13.083 1.66 31.262 1.661 36.822 1.661 8.404 0 47.62-.7 47.62-.7s42.016-2.1 64.425.7c22.409 2.801 38.866 4.902 38.866 4.902s3.851-4.902-31.863-7.703c-37.238-2.92-90.336-5.602-90.336-5.602s-34.993-1.594-54.272-1.05c-24.51.7-23.11 4.201-23.11 4.201\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3674)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M660.76 134.19s22.61-.07 26.962-3.501c2.818-2.221-.7-7.003.896-13.07l2.605-.235s2.1 8.753 5.602 22.059a4992 4992 0 0 1 7.353 28.36l-32.563 7.004z\"\n      ></Path>\n      <Path\n        fill=\"#03222f\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M662.511 137.692s28.362-1.4 30.463-2.101c2.1-.7 2.8-1.4 2.8-1.4l-5.251-16.107-3.502-1.75s3.502 13.305 2.101 14.005-12.955 3.501-16.807 3.851-11.204.7-11.204.7z\"\n        opacity=\"0.117\"\n      ></Path>\n      <Path\n        fill=\"#a0bcc8\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m543.115 111.069 13.313 9.812s20.985 10.843 26.937 12.594 22.783 3.163 34.688 2.813c4.138-.122 10.934-.09 18.062-.032l-.312-3.156c-13.678.054-27.838.197-35.282.031-15.756-.35-21.352-2.441-31.156-7.343s-26.25-14.72-26.25-14.72m146.719 18.906s-11.222 5.276-19.625 3.875c-1.706-.284-4.982-.48-9.188-.594l1.157 3.313c1.132.015 4.401.062 4.875.062 4.201 0 15.76-2.08 19.611-2.43s3.17-4.226 3.17-4.226\"\n      ></Path>\n      <Path\n        fill=\"#264c5f\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m667.764 171.305-14.006-55.322s-1.05-.7-3.151 1.05 2.1-1.05 2.45.35c.35 1.401 12.606 54.272 12.606 54.272z\"\n      ></Path>\n      <Path\n        fill=\"#264c5f\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m656.91 175.157 10.854-2.101.35 1.75-10.504 2.102z\"\n      ></Path>\n      <Path\n        fill=\"#172f3b\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M652.708 112.132s-4.552 0-4.552 2.45c0 2.452 3.151 0 4.552-2.45\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3697)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3644)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.6\"\n        d=\"m649.683 118.405 2.525-2.273 1.01-.505 13.89 56.064-10.86 1.767-6.06-48.74z\"\n        opacity=\"0.388\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3707)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.6\"\n        d=\"m649.683 118.405 2.525-2.273 1.01-.505 13.89 56.064-10.86 1.767-6.06-48.74z\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3723)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M692.503 112.074s14.088 38.548 15.527 43.825c2.1 7.703 4.902 13.305 4.902 13.305s2.804-6.539 7.488-10.746c3.426-3.077 8.835-4.255 10.019-3.96 2.8.7-24.631-34.721-37.936-42.424\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3743)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M712.068 169.578s15.338 6.071 19.54 13.074c4.201 7.003 18.934-7.498 17.533-12.4s-8.181-14.851-17.285-14.851-9.632-1.139-12.433 3.763-7.355 11.115-7.355 10.414\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3517)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M697.239 115.218s9.352 35.404 10.79 40.681c2.102 7.703 4.903 13.305 4.903 13.305s2.804-6.539 7.488-10.746c3.426-3.077 8.8-3.92 10.019-3.96 4.015-.13-13.801-32.739-30.358-40.774-1.485-.72-.634 4.077-2.842 1.494\"\n        opacity=\"0.792\"\n      ></Path>\n      <Path\n        fill=\"#e5c645\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M77.204 326.223s2.431 12.642 15.56 16.531c7.1 2.104-19.45-6.32-19.45-6.32l-.972-10.697s1.459 1.459 4.862.486\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3945)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M561.313 384.712c4.227.25 6.217-.746 9.325-1.119l44.512-25.612s76.34-45.507 87.282-51.972 28.472-21.261 28.472-21.261-3.108-2.611-.621-11.066-.498-6.962-.498-6.962-80.568 44.262-96.483 53.214c-15.914 8.952-46.252 27.354-48.241 28.846-1.99 1.492-1.292 8.913-1.99 15.417-.994 9.279-4.973 10.444-11.438 14.423s-8.455 5.098-10.32 6.092\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4564)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M539.306 119.508s27.85 16.91 36.803 17.904c8.952.995 11.936 16.91 25.861 19.894s39.787 8.952 39.787 8.952 0 7.957-4.973 8.952c-4.974.994-34.814 0-34.814 0l-129.307-4.974 23.872-30.834s39.787-15.915 42.771-19.894\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2\"\n        d=\"M736.095 205.602c.698-.507 1.513-.807 2.292-1.16 1.12-.491 1.975-1.306 2.73-2.245.717-.953 1.292-1.998 1.847-3.05.418-.91 1.073-1.674 1.732-2.417.711-.703 1.218-1.566 1.842-2.338 1.325-.808 3.159-.597 4.61-.146.777.586 3.965.804.917.713.882-.176 1.666-.642 2.468-1.029.89-.431 1.797-.828 2.683-1.269.811-.421 1.55-.958 2.299-1.48a49 49 0 0 1 2.584-1.57c.804-.511 1.714-.794 2.603-1.114.912-.375 1.643-.87 2.103-1.754.357-.875.54-1.81.77-2.724.177-.87.387-1.731.643-2.582.288-.94.556-1.887.832-2.83.234-.791.396-1.597.521-2.41.141-.912.134-1.834.2-2.751.244-.96.695-1.856 1.113-2.75 2.54.358 2.148 1.064 1.735 2.96-.269.871-.386 1.775-.58 2.664-.261 1.09-.553 2.172-.78 3.27-.21 1.17-.424 2.338-.786 3.471-.293 1.017-.954 1.811-1.655 2.574-.818.83-1.624 1.669-2.367 2.567-.64.801-1.379 1.46-2.303 1.906-.86.399-1.806.545-2.7.848-.813.304-1.609.651-2.414.977-.892.356-1.777.731-2.667 1.095a12 12 0 0 0-2.632 1.373c-.82.542-1.581 1.161-2.452 1.617-.847.39-1.661.715-2.261 1.45-.391.993-1.025 1.628-1.939 2.158-.954.413-1.854.873-2.668 1.523-.807.703-1.504 1.524-2.13 2.388-.482.927-1.159 1.501-2.06 1.996-.896.396-1.791.787-2.664 1.233-.765.499-1.558.902-2.437 1.15-.989.2-1.986.343-2.969.571-.92.224-1.82.524-2.707.854-.93.342-1.743.9-2.493 1.537-.697.653-1.56 1.011-2.461 1.28-.871.303-1.79.38-2.694.526-.953.182-1.857-1.459-2.792-1.21-.948.147-1.881.31-2.783.641-.88.332-1.663.86-2.463 1.345a33 33 0 0 1-2.301 1.576c-1.555.839-3.375 1.01-3.742-.927-.167-1.168.33-1.928 1.432-2.244.955-.153 1.926-.167 2.887-.292 1.113-.135 2.163-.525 3.196-.938a10.9 10.9 0 0 1 3.105-.81c1.264-.054 2.475 1.63 3.661 1.212 1.329-.47 2.519-1.226 3.708-1.965 1.402-.91 2.952-1.53 4.515-2.098 1.248-.432 2.503-.836 3.733-1.32l1.775.213c-1.235.494-2.499.896-3.758 1.322-1.552.558-3.095 1.162-4.487 2.063-1.186.752-2.372 1.523-3.7 2.004-1.171.433-2.37.782-3.627.838-1.075.103-2.127-1.67-3.125-1.245-1.029.423-2.07.842-3.18.987-.96.128-1.922.183-2.885.272-1.059.22-1.579.835-1.42 1.964.093.408 1.018 1.003.61 1.096-2.87.66-1.109-.09-.54-.324.821-.461 1.559-1.033 2.333-1.566.774-.523 1.57-1.013 2.428-1.39.914-.325 1.84-.557 2.81-.654.939-.236 1.835 1.395 2.782 1.193.898-.16 1.82-.207 2.688-.506.888-.253 1.768-.55 2.447-1.207.779-.621 1.564-1.232 2.503-1.6.895-.313 1.786-.64 2.706-.877.986-.208 1.974-.39 2.966-.566.9-.21 1.69-.607 2.47-1.102.853-.47 1.737-.86 2.634-1.239.905-.434 1.603-.986 2.05-1.91.653-.866 1.358-1.7 2.159-2.434.817-.66 1.672-1.178 2.66-1.555.93-.493 1.561-1.08 1.93-2.084.583-.794 1.382-1.168 2.284-1.527.858-.459 1.629-1.04 2.423-1.6.837-.55 1.687-1.054 2.63-1.413.895-.347 1.78-.72 2.664-1.095.812-.324 1.618-.661 2.43-.984.897-.31 1.832-.476 2.715-.825.905-.43 1.672-1.02 2.276-1.83.768-.888 1.584-1.73 2.4-2.572.677-.745 1.323-1.52 1.63-2.498.387-1.121.608-2.284.815-3.449.222-1.096.488-2.182.727-3.275.198-.889.36-1.787.592-2.667.475-1.73-.367-2.47 1.951-2.835-.423.87-.836 1.752-1.103 2.684-.083.92-.055 1.848-.19 2.763a16.4 16.4 0 0 1-.536 2.435c-.282.943-.552 1.889-.831 2.832q-.374 1.272-.636 2.573c-.231.93-.466 1.86-.765 2.771-.504.91-1.154 1.464-2.111 1.886-.886.336-1.82.561-2.624 1.084a48 48 0 0 0-2.575 1.552c-.746.544-1.501 1.083-2.328 1.502-.863.479-1.78.85-2.67 1.275-.804.396-1.586.86-2.456 1.1-1.844.021-2.967.006-4.57-.753-2.104-.565 1.848-.476-.95.04-.654.75-1.124 1.651-1.855 2.342-.65.734-1.296 1.482-1.724 2.375-.578 1.055-1.163 2.11-1.88 3.08-.744.96-1.583 1.812-2.704 2.332-.765.364-1.571.656-2.28 1.128z\"\n        color=\"#000\"\n        opacity=\"0.709\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2\"\n        d=\"M645.772 232.47c2.664-1.178 5.393-2.197 8.122-3.213a99 99 0 0 0 5.835-2.296c12.897-1.013-.866 2.952 5.528-.85 1.815-1.19 3.294-2.785 4.805-4.324.916-2.91 6.853-3.227 4.583.394.263-.079 1.06-.187.79-.236-7.382-1.33 3.506-.58 3.932-.534 2.756.401-2.82.01-2.116.035l4.538.185c.357.056.71.137 1.07.168.306.027 1.226.015.92.006-.947-.03-1.894-.043-2.841-.065 1.843-.371 3.486-1.194 5.356-1.477 1.887-.148 3.671-.723 5.426-1.394 2.08-.263 3.776-1.166 5.468-2.347 3.193-2.832 4.216-4.602 8.904-4.441.33.02 1.325.057.993.061-5.879.072 1.443.092 3.943.859.294-.018 1.175-.015.883-.052-4.584-.585-1.513-.557.678-1.928 5.726.3.4 1.557-1.47 2.64-1.618 1.003-3.489 1.17-5.312 1.52-1.856.52-3.769 2.742-5.624 3.26-3.008.987-6.206.474-9.313.333 6.443-.517-.629.493-2.203 1.008-1.8.693-3.646 1.215-5.52 1.67-2.211.578-4.398 1.244-6.613 1.808-1.96.28-3.72.964-5.428 1.933-1.6 1.016-3.191 2.034-4.998 2.629-1.69.397-3.415.574-5.111.948q-2.79.617-5.592 1.183c-1.733.345-3.397.881-5.004 1.61-1.629.75-3.14 1.718-4.663 2.656-1.621.91-3.304 1.698-4.98 2.5-1.639.834-3.488.965-5.23 1.467-1.73.647-3.524.962-5.354 1.135-2.08.16-4.18.094-6.259.064-.313-.005-1.252-.06-.938-.059 3.451.015 3.2-.002 1.582.17-1.936.242-3.626 1.213-5.272 2.194l-.768.58-3.669-.328.741-.639c1.686-.969 3.377-2.029 5.33-2.34 14.575-1.756-.458.94 5.614-.185 1.813-.15 3.609-.406 5.32-1.061 1.718-.569 3.573-.605 5.213-1.422 1.708-.743 3.354-1.608 5.013-2.452 1.53-.922 3-1.95 4.625-2.703 1.628-.76 3.313-1.357 5.085-1.682 1.847-.417 3.708-.767 5.556-1.182 1.693-.398 3.405-.636 5.12-.921 1.826-.511 3.4-1.571 5.02-2.536 1.676-1.064 3.425-1.798 5.416-2.044 2.228-.539 4.42-1.21 6.631-1.807 1.86-.455 3.696-.962 5.485-1.646 3.18-1.05 6.062-1.458 9.5-1.106 4.797.304-3.925.518 1.99-.258 1.869-.496 3.763-.764 5.623-1.286 1.799-.353 3.682-2.432 5.29-3.404 3.167-1.745 4.802-2.796 8.873-1.888-2.729 1.872-5.426 2.723-8.93 2.053-1.836-.971-1.226-.416 2.303-1.041.125-.022-5.862 2.67-7.19 2.214 4.962-.243-.126.193-1.66 2.261-1.65 1.217-3.313 2.286-5.418 2.45-1.769.663-3.548 1.33-5.45 1.476-1.904.216-3.515.972-5.34 1.495-.095.002-3.918.194-5.369.027-.375-.044-1.488-.103-1.118-.176 6.477-1.274-.006 1.154-2.456-.357 7.16-.932-3.02 1.746-4.733.181 2.07-2.96 7.6-3.157 2.724.102-1.495 1.563-2.927 3.195-4.723 4.428-2.356 1.395-11.637 1.33-5.541.9-1.96.802-3.902 1.644-5.92 2.301-2.733 1.007-5.476 1.994-8.133 3.195z\"\n        color=\"#000\"\n        opacity=\"0.552\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M658.166 179.53c-5.405 2.115-9.098 3.58-11.633 5.5-2.536 1.92-3.84 3.859-4.032 5.907-.196 2.093.767 5.79 2.094 9.593s3.031 7.636 4.563 9.72l.11-.36c-1.394-1.896-3.007-5.89-4.203-9.672-1.195-3.779-1.718-7.536-1.564-9.188.16-1.696 1.217-3.363 3.625-5.187s6.14-3.746 11.5-5.844z\"\n        opacity=\"0.43\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient5303)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M537.515 181.694c1.323 0 69.5 4.303 91.673.993-28.793 9.598-113.185 25.814-113.185 25.814s17.21-5.626 22.504-10.259c5.296-4.633 7.281-7.943-2.978-6.62-10.26 1.325-35.412 1.987-22.174 0 13.238-1.985 23.829-8.935 24.16-9.928\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient5059)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M699.431 113.574c-9.496-12.086-33.288-18.075-58.892-21.284-25.454-3.19-5.805 15.358-.605 15.721s18.381.121 18.381.121 23.582.726 30.112 2.54c6.53 1.813 9.311 4.837 9.311 4.837 2.267 1.482 1.936-.281 1.693-1.935\"\n        color=\"#000\"\n        opacity=\"0.792\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4405)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M699.431 113.574c-9.496-12.086-33.288-18.075-58.892-21.284-25.454-3.19 1.152 26.343 3.842 21.878 3.49-5.794 13.934-6.036 13.934-6.036s23.582.726 30.112 2.54c6.53 1.813 9.311 4.837 9.311 4.837 2.267 1.482 1.936-.281 1.693-1.935\"\n        color=\"#000\"\n        opacity=\"0.13\"\n        visibility=\"visible\"\n      ></Path>\n    </G>\n    <G strokeLinejoin=\"miter\" strokeOpacity=\"1\" opacity=\"1\">\n      <Path\n        fill=\"url(#radialGradient3308)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3290)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M106.424 245.705s8.806-8.092 14.877-9.163c6.072-1.072 14.243-.062 17.814 4.224 3.572 4.286 8.442 12.908 5.714 20.357-4.628 12.643-26.446 33.867-39.242 45.296-12.244 10.936-20.758 16.49-24.329 17.918-3.571 1.43-5.4 3.067-7.543 1.281s-.776-16.446.4-23.066c.97-5.46 7.168-23.153 12.9-31.028 7.19-9.877 11.2-15.621 13.467-17.396 3.763-2.944 6.656-5.566 5.942-8.423z\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3260)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M103.217 253.534c2.917-2.674 4.133-7.293 8.022-9.724s6.807-6.564 14.1-5.835c7.294.73 14.1 5.348 14.83 9.724s.973 13.371.243 15.316c-.729 1.945-25.283 28.93-27.228 30.389s-14.343 10.94-18.962 9.238c-4.62-1.702-3.16-31.604 2.917-40.113 6.078-8.509 6.32-9.238 6.078-8.995\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3468)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M178.092 382.582a4.126 18.737 0 1 1-8.252 0 4.126 18.737 0 1 1 8.252 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"rotate(28.36 329.835 169.86)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#131001\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M302.403 329.765s-12.38 20.302-15.846 30.205c-3.466 9.904 1.486 13.865 4.457 15.846s13.37 7.923 31.196 7.427c17.826-.495 33.839-3.15 33.839-3.15l31.029-10.22s-41.595 15.846-63.383 11.885c-21.787-3.962-37.138-6.437-35.652-19.312s15.846-32.681 14.36-32.681\"\n        opacity=\"0.579\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3999)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M351.94 283.818c6.061-4.294 31.567-23.486 51.77-6.566s19.193 47.224 15.153 57.578-13.89 25.76-29.547 33.84c-15.658 8.082-40.406 13.132-51.013 13.637s-27.78 0-36.365-2.777c-8.587-2.778-16.668-9.85-14.648-18.94 2.02-9.092 12.364-25.767 16.92-31.82 17.678-23.487 41.67-40.66 47.73-44.952\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3995)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M351.94 283.818c6.061-4.294 31.567-23.486 51.77-6.566s19.193 47.224 15.153 57.578-13.89 25.76-29.547 33.84c-15.658 8.082-40.406 13.132-51.013 13.637s-27.78 0-36.365-2.777c-8.587-2.778-16.668-9.85-14.648-18.94 2.02-9.092 12.364-25.767 16.92-31.82 17.678-23.487 41.67-40.66 47.73-44.952\"\n      ></Path>\n      <Path\n        fill=\"#f8ffff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M383.959 270.413c-14.507.46-27.865 10.454-32.031 13.406-6.061 4.293-30.041 21.451-47.72 44.937-4.555 6.053-14.885 22.753-16.905 31.844s6.038 16.16 14.625 18.938 25.768 3.286 36.375 2.78c10.606-.504 35.342-5.574 51-13.655 15.657-8.082 25.522-23.49 29.562-33.844s5.047-40.643-15.156-57.563c-6.314-5.287-13.156-7.052-19.75-6.843m-3.125 2.937c1.002-.021 1.984.024 2.969.188 10.504 1.75 17.86 5.62 23.812 16.125s11.553 32.192 3.5 50.75c-8.053 18.557-39.921 31.167-49.375 33.968s-47.616 3.851-54.969 1.75-19.27-9.088-12.968-23.093 15.797-28.695 25.562-38.875c14.92-15.555 23.63-21.781 31.156-26.25 10.154-6.03 20.626-14.357 30.313-14.563\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4213)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M351.94 283.818c6.061-4.294 31.567-23.486 51.77-6.566s19.193 47.224 15.153 57.578-13.89 25.76-29.547 33.84c-15.658 8.082-40.406 13.132-51.013 13.637s-27.78 0-36.365-2.777c-8.587-2.778-16.668-9.85-14.648-18.94 2.02-9.092 12.364-25.767 16.92-31.82 17.678-23.487 41.67-40.66 47.73-44.952\"\n      ></Path>\n      <Path\n        fill=\"#acb7cd\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.6\"\n        d=\"M491.211 412.081a25.254 31.443 0 1 1-50.507 0 25.254 31.443 0 1 1 50.507 0\"\n        opacity=\"0.792\"\n        transform=\"matrix(1.05063 -.13143 .1378 1.10165 -158.436 -79.057)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3798)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.6\"\n        d=\"M491.211 412.081a25.254 31.443 0 1 1-50.507 0 25.254 31.443 0 1 1 50.507 0\"\n        opacity=\"0.792\"\n        transform=\"matrix(1.05063 -.13143 .1378 1.10165 -158.436 -79.057)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3790)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.6\"\n        d=\"M491.211 412.081a25.254 31.443 0 1 1-50.507 0 25.254 31.443 0 1 1 50.507 0\"\n        opacity=\"0.792\"\n        transform=\"matrix(1.05063 -.13143 .1378 1.10165 -158.436 -79.057)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3794)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"url(#radialGradient4007)\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.79\"\n        d=\"M414.462 310.703c2.392 19.121-6.63 35.659-22.226 37.61-15.595 1.95-28.065-11.898-30.457-31.02-2.392-19.12 6.196-36.31 21.79-38.26 15.596-1.95 28.5 12.55 30.893 31.67z\"\n        opacity=\"0.792\"\n      ></Path>\n      <Path\n        fill=\"#acb7cd\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.6\"\n        d=\"M491.211 412.081a25.254 31.443 0 1 1-50.507 0 25.254 31.443 0 1 1 50.507 0\"\n        opacity=\"0.792\"\n        transform=\"matrix(.97281 -.1217 .11826 .94539 -114.118 -19.2)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3808)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.6\"\n        d=\"M491.211 412.081a25.254 31.443 0 1 1-50.507 0 25.254 31.443 0 1 1 50.507 0\"\n        opacity=\"0.867\"\n        transform=\"matrix(.97281 -.1217 .11826 .94539 -114.118 -19.2)\"\n      ></Path>\n      <Path\n        fill=\"#8eacb3\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.6\"\n        d=\"M491.211 412.081a25.254 31.443 0 1 1-50.507 0 25.254 31.443 0 1 1 50.507 0\"\n        opacity=\"0.792\"\n        transform=\"matrix(.87553 -.10952 .11044 .88288 -66.12 .456)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3839)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.6\"\n        d=\"M491.211 412.081a25.254 31.443 0 1 1-50.507 0 25.254 31.443 0 1 1 50.507 0\"\n        opacity=\"0.792\"\n        transform=\"matrix(.87553 -.10952 .11044 .88288 -66.12 .456)\"\n      ></Path>\n      <Path\n        fill=\"#b3a28e\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.6\"\n        d=\"M383.884 285.476c-11.391 1.425-19.427 13.441-18.89 27.495 8.005.648 20.425 1.248 26.985-.541 4.52-1.234 10.841-4.1 16.493-6.882-3.49-12.719-13.736-21.43-24.588-20.072\"\n        opacity=\"0.792\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3857)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.6\"\n        d=\"M383.884 285.476c-11.391 1.425-19.427 13.441-18.89 27.495 8.005.648 20.425 1.248 26.985-.541 4.52-1.234 10.841-4.1 16.493-6.882-3.49-12.719-13.736-21.43-24.588-20.072\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4074)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M383.959 270.413c-14.507.46-27.865 10.454-32.031 13.406-6.061 4.293-30.041 21.451-47.72 44.937-4.555 6.053-14.885 22.753-16.905 31.844s6.038 16.16 14.625 18.938 25.768 3.286 36.375 2.78c10.606-.504 35.342-5.574 51-13.655 15.657-8.082 25.522-23.49 29.562-33.844s5.047-40.643-15.156-57.563c-6.314-5.287-13.156-7.052-19.75-6.843m-3.125 2.937c1.002-.021 1.984.024 2.969.188 10.504 1.75 17.86 5.62 23.812 16.125s11.553 32.192 3.5 50.75c-8.053 18.557-39.921 31.167-49.375 33.968s-47.616 3.851-54.969 1.75-19.27-9.088-12.968-23.093 15.797-28.695 25.562-38.875c14.92-15.555 23.63-21.781 31.156-26.25 10.154-6.03 20.626-14.357 30.313-14.563\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4084)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M383.959 270.413c-14.507.46-27.865 10.454-32.031 13.406-6.061 4.293-30.041 21.451-47.72 44.937-4.555 6.053-14.885 22.753-16.905 31.844s6.038 16.16 14.625 18.938 25.768 3.286 36.375 2.78c10.606-.504 35.342-5.574 51-13.655 15.657-8.082 25.522-23.49 29.562-33.844s5.047-40.643-15.156-57.563c-6.314-5.287-13.156-7.052-19.75-6.843m-3.125 2.937c1.002-.021 1.984.024 2.969.188 10.504 1.75 17.86 5.62 23.812 16.125s11.553 32.192 3.5 50.75c-8.053 18.557-39.921 31.167-49.375 33.968s-47.616 3.851-54.969 1.75-19.27-9.088-12.968-23.093 15.797-28.695 25.562-38.875c14.92-15.555 23.63-21.781 31.156-26.25 10.154-6.03 20.626-14.357 30.313-14.563\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4088)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M383.959 270.413c-14.507.46-27.865 10.454-32.031 13.406-6.061 4.293-30.041 21.451-47.72 44.937-4.555 6.053-14.885 22.753-16.905 31.844s6.038 16.16 14.625 18.938 25.768 3.286 36.375 2.78c10.606-.504 35.342-5.574 51-13.655 15.657-8.082 25.522-23.49 29.562-33.844s5.047-40.643-15.156-57.563c-6.314-5.287-13.156-7.052-19.75-6.843m-3.125 2.937c1.002-.021 1.984.024 2.969.188 10.504 1.75 17.86 5.62 23.812 16.125s11.553 32.192 3.5 50.75c-8.053 18.557-39.921 31.167-49.375 33.968s-47.616 3.851-54.969 1.75-19.27-9.088-12.968-23.093 15.797-28.695 25.562-38.875c14.92-15.555 23.63-21.781 31.156-26.25 10.154-6.03 20.626-14.357 30.313-14.563\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4092)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M383.959 270.413c-14.507.46-27.865 10.454-32.031 13.406-6.061 4.293-30.041 21.451-47.72 44.937-4.555 6.053-14.885 22.753-16.905 31.844s6.038 16.16 14.625 18.938 25.768 3.286 36.375 2.78c10.606-.504 35.342-5.574 51-13.655 15.657-8.082 25.522-23.49 29.562-33.844s5.047-40.643-15.156-57.563c-6.314-5.287-13.156-7.052-19.75-6.843m-3.125 2.937c1.002-.021 1.984.024 2.969.188 10.504 1.75 17.86 5.62 23.812 16.125s11.553 32.192 3.5 50.75c-8.053 18.557-39.921 31.167-49.375 33.968s-47.616 3.851-54.969 1.75-19.27-9.088-12.968-23.093 15.797-28.695 25.562-38.875c14.92-15.555 23.63-21.781 31.156-26.25 10.154-6.03 20.626-14.357 30.313-14.563\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4106)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M384.66 271.813c-14.508.46-28.566 9.054-32.732 12.006-6.061 4.293-30.041 21.451-47.72 44.937-4.555 6.053-14.885 22.753-16.905 31.844s6.038 16.16 14.625 18.938 25.768 3.286 36.375 2.78c10.606-.504 35.342-5.574 51-13.655 15.657-8.082 25.522-23.49 29.562-33.844s5.047-40.643-15.156-57.563c-6.314-5.287-12.456-5.652-19.05-5.443\"\n        opacity=\"0.625\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4158)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M392.524 366.903s15.846-11.884 18.817-17.331 10.399-21.293 10.399-27.235 1.98-16.34-.496-14.36-2.475 5.942-2.475 9.408c0 3.467-3.962 17.331-3.962 20.302s-7.923 14.36-10.398 16.836c-2.476 2.476-10.399 6.438-13.37 9.409-2.971 2.97-11.389 6.437-13.37 7.427s-8.418 2.971-12.38 3.466c-3.96.496-14.36.496-16.835 1.981s-5.942 4.457-10.399 4.457-15.845-.495-18.816-.99c-2.971-.496-2.476-.496-7.923-1.981s-10.399-3.962-9.903-1.981c.495 1.98 10.893 5.942 14.855 6.437s24.758 1.486 31.69 0 18.322-4.952 24.76-6.437c6.437-1.486 19.806-8.418 19.806-9.408\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M359.126 283.089s9.52-7.678 19.008-9.614c3.882-.792 14.718 2.618 16.676 3.653 2.672 1.412 9.09 8.843 10.81 10.624s4.976 7.862 4.976 7.862-10.013-16.214-21.805-18.731-21.527 1.445-29.665 6.206\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4172)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M351.94 283.818c6.061-4.294 31.567-23.486 51.77-6.566s19.193 47.224 15.153 57.578-13.89 25.76-29.547 33.84c-15.658 8.082-40.406 13.132-51.013 13.637s-27.78 0-36.365-2.777c-8.587-2.778-16.668-9.85-14.648-18.94 2.02-9.092 12.364-25.767 16.92-31.82 17.678-23.487 41.67-40.66 47.73-44.952\"\n        opacity=\"0.55\"\n      ></Path>\n      <Path\n        fill=\"#2e221c\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M362.997 302.067s5.005-13.85 12.927-16.339c7.923-2.488 14.894-2.611 19.5.306 6.22 3.938 9.828 6.755 12.193 11.699s5.59 12.774 5.13 17.074.215-8.261-3.195-15.57c-3.23-6.926-12.746-16.12-19.256-16.305-6.51-.183-14.157.524-16.43 2.305s-9.303 7.402-10.869 16.83\"\n        opacity=\"0.529\"\n      ></Path>\n      <Path\n        fill=\"#97705c\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M397.058 344.965s11.792-5.468 14.739-13.82c2.947-8.354 3.653-14.68 3.653-14.68s-.551 15.539-5.372 20.883-12.99 7.862-13.02 7.617\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3875)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M401.998 306.67s-5.037-12.345-13.39-11.3-15.6-1.043-17.872 4.73-2.947 12.346-2.947 12.346 5.958 3.746 9.274 2.333c3.317-1.413 3.316-9.397 7.738-9.95s10.441-.308 10.441-.308z\"\n        opacity=\"0.5\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"url(#linearGradient3985)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"3.1\"\n        d=\"M488.24 412.824a21.788 27.235 0 1 1-43.575 0 21.788 27.235 0 1 1 43.575 0z\"\n        opacity=\"0.5\"\n        transform=\"rotate(-7.13 -370.268 997.726)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4028)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"3.1\"\n        d=\"M479.822 413.319a14.36 17.826 0 1 1-28.72 0 14.36 17.826 0 1 1 28.72 0\"\n        opacity=\"1\"\n        transform=\"rotate(-7.13 -370.763 989.778)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4032)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"3.1\"\n        d=\"M479.822 413.319a14.36 17.826 0 1 1-28.72 0 14.36 17.826 0 1 1 28.72 0\"\n        opacity=\"0.45\"\n        transform=\"matrix(1.19756 -.1498 .1586 1.2679 -232.891 -143.162)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4036)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"3.1\"\n        d=\"M479.822 413.319a14.36 17.826 0 1 1-28.72 0 14.36 17.826 0 1 1 28.72 0\"\n        opacity=\"0.45\"\n        transform=\"matrix(-1.09787 .50129 -.53073 -1.16234 1116.898 561.683)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4046)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"3.1\"\n        d=\"M475.366 413.814a8.418 4.952 0 1 1-16.836 0 8.418 4.952 0 1 1 16.836 0\"\n        opacity=\"0.867\"\n        transform=\"rotate(-7.13 -370.763 989.778)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4050)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"3.1\"\n        d=\"M475.366 413.814a8.418 4.952 0 1 1-16.836 0 8.418 4.952 0 1 1 16.836 0\"\n        opacity=\"0.867\"\n        transform=\"matrix(.87553 -.10952 .08689 .69459 -65.815 73.761)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4054)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"3.1\"\n        d=\"M475.366 413.814a8.418 4.952 0 1 1-16.836 0 8.418 4.952 0 1 1 16.836 0\"\n        opacity=\"0.417\"\n        transform=\"matrix(.56348 -.679 .53867 .44703 -114 430.514)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4058)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"3.1\"\n        d=\"M475.366 413.814a8.418 4.952 0 1 1-16.836 0 8.418 4.952 0 1 1 16.836 0\"\n        opacity=\"0.417\"\n        transform=\"matrix(.56348 -.679 .53867 .44703 -116.026 438.253)\"\n      ></Path>\n      <Path\n        fill=\"#bcb37c\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"3.1\"\n        d=\"M475.366 413.814a8.418 4.952 0 1 1-16.836 0 8.418 4.952 0 1 1 16.836 0\"\n        opacity=\"0.417\"\n        transform=\"matrix(.56348 -.679 .53867 .44703 -116.026 438.253)\"\n      ></Path>\n      <Path\n        fill=\"#bcb37c\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"3.1\"\n        d=\"M475.366 413.814a8.418 4.952 0 1 1-16.836 0 8.418 4.952 0 1 1 16.836 0\"\n        opacity=\"0.417\"\n        transform=\"matrix(.56348 -.679 .53867 .44703 -83.779 460.668)\"\n      ></Path>\n      <Path\n        fill=\"#bcb37c\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"3.1\"\n        d=\"M475.366 413.814a8.418 4.952 0 1 1-16.836 0 8.418 4.952 0 1 1 16.836 0\"\n        opacity=\"0.417\"\n        transform=\"matrix(-.1333 -1.1022 .8039 .43427 105.26 651.28)\"\n      ></Path>\n      <Path\n        fill=\"#fdfbf9\"\n        fillOpacity=\"0.461\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M295.47 360.465c31.692-28.72 46.547-40.604 46.547-40.604l10.894-11.884s-6.438 1.98-9.904 6.933c-3.466 4.951-12.38 12.874-15.845 15.35-3.467 2.476-23.769 21.292-23.769 21.292z\"\n      ></Path>\n      <Path\n        fill=\"#fdfbf9\"\n        fillOpacity=\"0.461\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M324.19 326.794c7.428-3.962 14.856-11.884 17.332-13.865s9.408-11.39 9.408-11.39l5.447-6.932s-7.428 8.914-9.904 11.39c-2.475 2.475-9.408 8.913-11.884 9.903s-8.913 9.408-10.398 10.894\"\n      ></Path>\n      <Path\n        fill=\"#fdfbf9\"\n        fillOpacity=\"0.461\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M290.519 358.485s7.923-2.476 13.37-9.904c5.446-7.427 5.446-9.903 9.408-13.37s7.923-7.922 7.923-7.922l3.961-5.447s-4.952 0-7.428 3.466-6.932 8.418-8.418 11.39c-1.485 2.97 0 3.465-4.951 8.417-4.952 4.952-8.418 10.399-8.418 10.399z\"\n      ></Path>\n      <Path\n        fill=\"#fdfbf9\"\n        fillOpacity=\"0.461\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M295.966 367.893s9.408-11.389 11.884-13.37 2.97-4.951 8.418-7.922 11.884-10.399 11.884-10.399l6.932-5.447 9.409-7.428s4.951-5.942 6.932-6.932c1.98-.99 2.971-2.971 4.952-3.961s-1.486 2.97-1.486 2.97-7.427 3.962-8.418 5.943-.495 1.98-8.913 8.418-10.398 7.427-11.884 10.398c-1.485 2.971-6.932 9.904-10.399 11.884s-4.951 3.467-8.417 7.428-10.4 7.923-10.894 8.418\"\n      ></Path>\n      <Path\n        fill=\"#fdfbf9\"\n        fillOpacity=\"0.461\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M380.685 291.87s3.991-7.985-.615-4.914-4.851 9.09-8.904 12.592c-4.054 3.501-7.739 5.958-7.739 5.958z\"\n      ></Path>\n      <Path\n        fill=\"#fdfbf9\"\n        fillOpacity=\"0.461\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m358.206 291.688 10.072-3.257s-.799-6.387 1.473-8.168c2.273-1.782-4.053 7.493-4.053 7.493l-3.623 2.949z\"\n      ></Path>\n      <Path\n        fill=\"#fdfbf9\"\n        fillOpacity=\"0.461\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M298.442 370.864c2.475-.99 34.167-17.826 34.167-17.826l21.787-10.894-4.952-4.457s-6.437 4.952-12.379 8.914-17.33 11.884-20.302 14.36c-2.971 2.475-18.321 10.893-18.321 9.903\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#radialGradient4130)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.6\"\n        d=\"M292.995 366.408s-3.962-15.35 15.35-38.624c19.312-23.273 35.653-36.643 43.575-40.604 7.923-3.962 19.807-12.875 24.759-13.865s16.34 2.476 16.34 2.476\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4140)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M295.966 367.893s14.855-37.633 25.254-47.041c10.398-9.409 48.527-43.08 48.527-43.08s-25.75 14.36-37.634 25.749-27.234 28.72-33.671 43.08c-6.438 14.36-1.981 22.282-2.476 21.292\"\n      ></Path>\n      <Path\n        fill=\"#483317\"\n        fillOpacity=\"0.855\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M414.807 327.784s1.217 17.725-29.215 37.138c-28.72 18.321-67.839 11.884-67.839 11.884s35.365 5.985 74.771-18.321c21.4-13.2 16.836-19.312 22.283-30.701\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M355.882 376.063s26.244-5.199 40.109-18.816 16.34-18.322 18.321-27.73c1.98-9.408 2.476 14.113-15.35 27.235-17.827 13.122-25.75 15.102-43.08 19.311\"\n      ></Path>\n      <Path\n        fill=\"#2e221c\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M413.165 324.44s-3.333 14.345-10.907 17.752-14.48 4.353-19.4 2c-6.64-3.176-10.556-5.547-13.489-10.177-2.932-4.63-7.06-12.025-7.11-16.348-.052-4.324.762 8.228 5.011 15.083 4.027 6.496 14.561 14.502 21.048 13.916s13.996-2.192 16.042-4.23c2.046-2.037 8.364-8.448 8.805-17.995\"\n        opacity=\"0.683\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4187)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M395.98 310.417s-.369-2.948-4.791-2.395-9.151 2.642-9.151 2.642-2.027 3.746-5.036 3.624c-3.01-.123-10.012-4.237-10.012-4.237s-1.105 3.132.615 4.913 9.336 2.825 11.301 2.579 7.8-1.475 7.8-1.475 3.686 5.528 8.353 2.947c4.668-2.58 10.011-3.747 9.151-6.634-.86-2.886-7.248-2.087-8.23-1.964\"\n        opacity=\"0.708\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3142)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M113.184 246.97s5.105-5.348 8.023-5.592 10.202-.823 14.343 6.078c4.376 7.293 5.349 14.83 5.349 14.83s-6.321 12.155-13.858 19.691c-7.536 7.537-9.238 10.211-9.238 10.211s-10.453-10.19-10.453-22.852c0-12.642 1.215-17.018 5.834-22.366\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3399)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M114.834 274.071c0 14.803 15.144 11.69-14.096 24.754-8.49 3.794-8.595-6.513-8.595-21.316s8.235-24.066 17.534-24.066c9.3 0 5.157 5.825 5.157 20.628\"\n        color=\"#000\"\n        opacity=\"0.403\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3150)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M119.991 288.785s-8.509-6.564-9.481-17.747-.243-18.72 3.16-22.366 12.156-6.321 17.99.486c5.835 6.807 8.51 14.83 8.51 14.83s-13.372 19.934-20.179 24.797\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3182)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M112.455 253.534c2.189-4.975 7.224-5.516 12.155-4.62 5.349.973 8.995 6.565 11.183 10.698 2.188 4.132 1.702 8.265 1.702 8.265l-16.531 20.908s-8.954-7.585-10.21-18.477c-.73-6.32-.409-11.98 1.7-16.774\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3166)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M120.928 248.569c-3.6.007-6.827 1.237-8.47 4.969-2.102 4.778-2.438 10.423-1.718 16.718 4.264-1.675 13.266-4.678 19.219-2.875a55 55 0 0 1 6.125 2.25l1.406-1.75s.5-4.148-1.687-8.28c-2.188-4.134-5.84-9.716-11.188-10.688a20.6 20.6 0 0 0-3.687-.344\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3208)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"3\"\n        d=\"M135.748 261.984c0 7.876-4.982 4.057-11.72 4.057-6.737 0-12.69 3.819-12.69-4.057s5.467-14.268 12.205-14.268c6.737 0 12.205 6.392 12.205 14.268\"\n        color=\"#000\"\n        opacity=\"0.717\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3218)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M120.928 248.569c-3.6.007-6.827 1.237-8.47 4.969-2.102 4.778-2.438 10.423-1.718 16.718 4.264-1.675 13.266-4.678 19.219-2.875a55 55 0 0 1 6.125 2.25l1.406-1.75s.5-4.148-1.687-8.28c-2.188-4.134-5.84-9.716-11.188-10.688a20.6 20.6 0 0 0-3.687-.344\"\n      ></Path>\n      <Path\n        fill=\"#583916\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M110.024 258.153s.972-7.293 3.646-9.238 7.294-6.321 13.128-3.16 9.968 10.21 11.426 14.343-1.458-7.293-5.105-10.94-9.481-6.564-12.885-5.348c-3.403 1.215-10.696 3.89-10.21 14.343\"\n        opacity=\"0.679\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3232)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M111.24 249.158c1.458-1.945 6.077-7.293 9.48-8.023s9.968 0 13.128 3.404 9.238 15.802 6.564 15.316c-2.674-.487-4.133-4.133-5.105-6.564s-2.674-6.078-5.591-7.78-4.133-2.674-8.266-1.945c-4.133.73-10.21 5.349-10.21 5.592\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3242)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"3\"\n        d=\"M172.607 330.81a8.144.972 0 1 1-16.289 0 8.144.972 0 1 1 16.289 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(.53731 0 0 1 33.325 -87.001)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3246)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"3\"\n        d=\"M172.607 330.81a8.144.972 0 1 1-16.289 0 8.144.972 0 1 1 16.289 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(.50276 .18957 -.3528 .9357 161.31 -95.69)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3250)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"3\"\n        d=\"M172.607 330.81a8.144.972 0 1 1-16.289 0 8.144.972 0 1 1 16.289 0\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"matrix(.39199 .3675 -.68394 .72954 292.72 -54.32)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3272)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M111.482 252.805c1.945-2.188 1.46-4.863 6.321-6.321 4.862-1.459 7.78-2.188 11.67 1.215s6.077 6.807 6.806 8.995 1.702 8.023 1.702 8.023-4.862-13.614-11.669-14.83-10.21-1.458-14.83 2.918\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3282)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M112.698 252.805s1.79-3.136 5.956-4.012c3.693-.776 8.873.516 10.94 2.067 3.89 2.917 6.248 8.16 6.564 9.36.608 2.309 1.58 6.928 1.58 6.928s-3.282-12.642-8.144-15.073c-4.862-2.43-8.387-3.282-10.818-2.796s-4.012 1.338-6.078 3.526\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3298)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"#abbcd1\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M106.08 246.049s8.806-8.092 14.877-9.164 14.243-.06 17.814 4.225c3.572 4.286 8.442 12.908 5.715 20.357-4.629 12.642-26.447 33.867-39.243 45.296C93 317.699 84.486 323.253 80.914 324.68s-5.4 3.067-7.543 1.28c-2.143-1.785-.776-16.446.4-23.065.97-5.46 7.169-23.153 12.9-31.029 7.19-9.876 11.2-15.62 13.468-17.395 3.762-2.944 6.655-5.566 5.941-8.423z\"\n        opacity=\"0.673\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3318)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M211.097 364.188a9.97 9.97 0 1 1-19.94 0 9.97 9.97 0 1 1 19.94 0\"\n        color=\"#000\"\n        opacity=\"0.673\"\n        transform=\"matrix(1 0 0 1.44828 -77.01 -262.313)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3322)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M211.097 364.188a9.97 9.97 0 1 1-19.94 0 9.97 9.97 0 1 1 19.94 0\"\n        color=\"#000\"\n        opacity=\"0.673\"\n        transform=\"matrix(.72414 0 0 1.04875 -20.151 -118.731)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3407)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M210.41 367.282a2.75 2.75 0 1 1-5.501 0 2.75 2.75 0 1 1 5.5 0\"\n        color=\"#000\"\n        opacity=\"0.673\"\n        transform=\"matrix(.64645 0 0 1 -3.994 -99.886)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3334)\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M122.422 267.877s8.752-.972 13.128 1.459\"\n        opacity=\"0.849\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3352)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.4\"\n        d=\"M210.41 367.282a2.75 2.75 0 1 1-5.501 0 2.75 2.75 0 1 1 5.5 0\"\n        color=\"#000\"\n        opacity=\"0.673\"\n        transform=\"matrix(.64145 -.08024 .12412 .99227 213.93 -33.815)\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3388)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M78.39 319.11s3.095-24.067 7.22-31.974c4.127-7.908 10.315-17.534 13.066-24.41 2.75-6.877 3.094-9.627 3.094-9.627s-13.752 13.408-16.847 19.253c-3.094 5.845-10.026 20.388-11.69 33.693-1.374 11.002 0 16.159 0 16.159z\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3380)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M79.079 319.454s3.094-24.067 7.22-31.974c4.125-7.908 10.314-17.535 13.064-24.41 2.75-6.877 3.094-9.627 3.094-9.627s-13.752 13.408-16.846 19.253-10.026 20.388-11.69 33.693c-1.375 11.002 0 16.159 0 16.159z\"\n        opacity=\"0.403\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"0.764\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M74.953 316.015c0-1.375 1.375-12.033 1.719-15.127s1.719-7.908 2.407-9.283 3.094-5.157 3.094-5.157l5.5-8.595 6.877-12.033s4.813-.688 1.375 2.063c-3.438 2.75-6.532 8.595-8.595 11.001-2.063 2.407-3.782 6.189-5.157 8.94s-3.438 14.44-3.438 14.44l-2.063 8.938z\"\n        opacity=\"0.711\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"0.764\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M78.39 317.047c.689-7.22 2.751-14.784 2.751-14.784s1.032-6.532 1.72-7.907.343-2.75 1.718-4.47 2.75-3.094 2.75-3.094.345 3.438-1.03 5.157c-1.376 1.72-2.751.344-3.439 6.532-.687 6.189-.687 5.845-1.375 8.596-.687 2.75-2.063 8.938-3.094 9.97\"\n        opacity=\"0.711\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"0.764\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m78.39 317.047 11.347-22.348.343-5.844 2.407-5.157s1.375-3.095 1.375-1.72 2.063 1.032 0 5.502-3.094 7.22-4.125 8.939-5.845 13.064-6.533 14.783c-.687 1.72-4.125 5.845-4.813 5.845\"\n        opacity=\"0.711\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"0.764\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m89.393 277.853 6.532-6.876 3.438-6.876 4.47-5.157.687 1.719s-1.031 1.719-2.75 3.781-4.814 5.845-6.189 7.22-3.438 5.501-3.438 5.501z\"\n        opacity=\"0.711\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"0.764\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M100.395 256.88c1.375-.687 6.876-5.156 6.876-5.156v3.782z\"\n        opacity=\"0.711\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"0.516\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m88.705 285.76 6.532-10.314 7.564-6.532 2.75-4.126s-.687 7.22-2.062 8.252c-1.375 1.031-6.189 5.157-6.189 5.157l-5.844 5.5z\"\n        opacity=\"0.711\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"0.764\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M107.614 251.38s9.97-8.252 13.753-9.283 5.844-2.407 5.844-2.407h-4.469s-5.5 2.063-6.876 3.095c-1.375 1.031-7.908 8.595-8.252 8.595\"\n        opacity=\"0.711\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3449)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M115.866 290.23s-7.22-9.97-7.736-14.44-.687-9.97-.687-9.97 2.234-.344 2.406.344-.172-.688.172 1.203c.344 1.89.344 5.673 1.032 7.22.687 1.547 2.578 5.5 4.297 7.392 1.72 1.89 3.954 5.157 3.954 5.157z\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3439)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M118.273 287.995s-5.501-7.048-6.36-8.423c-.86-1.375-1.72-1.89-.689.86s6.189 8.938 6.189 8.938z\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3486)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M405.664 309.655s-19.532-17.652-27.037-16.714c-7.506.94-9.042-5.798-.427-3.411s23.54 10.915 27.464 20.125\"\n      ></Path>\n      <Path\n        fill=\"#bdd1e0\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M126.146 236.131a27 27 0 0 0-4.843.407c-6.072 1.071-14.875 9.156-14.875 9.156a3.7 3.7 0 0 1 0 1.75c3.837-3.504 11.677-9.758 18.28-9.25 9.105.7 14.707 7.336 15.407 11.187.7 3.852 3.148 12.258-8.406 25.563S83.74 319.05 81.99 320.1c-1.641.985-6.99 4.453-9.094 3.438.18 1.013.432 1.776.813 2.093 2.143 1.786 3.99.148 7.562-1.28 3.572-1.43 12.069-7.002 24.313-17.938 12.796-11.429 34.622-32.64 39.25-45.282 2.727-7.449-2.147-16.089-5.719-20.375-2.678-3.214-7.942-4.592-12.969-4.625\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3510)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M126.146 236.131a27 27 0 0 0-4.843.407c-6.072 1.071-14.875 9.156-14.875 9.156a3.7 3.7 0 0 1 0 1.75c3.837-3.504 11.677-9.758 18.28-9.25 9.105.7 14.707 7.336 15.407 11.187.7 3.852 3.148 12.258-8.406 25.563S83.74 319.05 81.99 320.1c-1.641.985-6.99 4.453-9.094 3.438.18 1.013.432 1.776.813 2.093 2.143 1.786 3.99.148 7.562-1.28 3.572-1.43 12.069-7.002 24.313-17.938 12.796-11.429 34.622-32.64 39.25-45.282 2.727-7.449-2.147-16.089-5.719-20.375-2.678-3.214-7.942-4.592-12.969-4.625\"\n        opacity=\"0.742\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3521)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M126.146 236.131a27 27 0 0 0-4.843.407c-6.072 1.071-14.875 9.156-14.875 9.156a3.7 3.7 0 0 1 0 1.75c3.837-3.504 11.677-9.758 18.28-9.25 9.105.7 14.707 7.336 15.407 11.187.7 3.852 3.148 12.258-8.406 25.563S83.74 319.05 81.99 320.1c-1.641.985-6.99 4.453-9.094 3.438.18 1.013.432 1.776.813 2.093 2.143 1.786 3.99.148 7.562-1.28 3.572-1.43 12.069-7.002 24.313-17.938 12.796-11.429 34.622-32.64 39.25-45.282 2.727-7.449-2.147-16.089-5.719-20.375-2.678-3.214-7.942-4.592-12.969-4.625\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3525)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M126.146 236.131a27 27 0 0 0-4.843.407c-6.072 1.071-14.875 9.156-14.875 9.156a3.7 3.7 0 0 1 0 1.75c3.837-3.504 11.677-9.758 18.28-9.25 9.105.7 14.707 7.336 15.407 11.187.7 3.852 3.148 12.258-8.406 25.563S83.74 319.05 81.99 320.1c-1.641.985-6.99 4.453-9.094 3.438.18 1.013.432 1.776.813 2.093 2.143 1.786 3.99.148 7.562-1.28 3.572-1.43 12.069-7.002 24.313-17.938 12.796-11.429 34.622-32.64 39.25-45.282 2.727-7.449-2.147-16.089-5.719-20.375-2.678-3.214-7.942-4.592-12.969-4.625\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3535)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M106.24 248.286s5.844-5.501 8.938-7.22c3.094-1.72 7.22-2.75 10.658-2.407 3.438.344 10.314 3.782 10.314 3.782s-8.595-3.094-11.345-2.75-12.377 5.157-16.503 9.282c-4.126 4.126-2.063-.344-2.063-.687\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3545)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M71.859 321.516s-1.72 3.782 4.813 2.75c6.532-1.03 22.691-12.72 22.691-12.72s-15.815 13.752-22.347 15.127-4.814-4.125-5.157-5.157\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3555)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M77.36 326.33s-3.439-22.004-1.72-30.255c1.72-8.252-6.188 18.91-2.75 28.192 2.75 2.406 4.47 2.75 4.47 2.063\"\n      ></Path>\n    </G>\n    <G strokeLinejoin=\"miter\">\n      <Path\n        fill=\"url(#radialGradient4204)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"url(#linearGradient3519)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1.169\"\n        d=\"M430.195 499.405a19.147 9.947 0 1 1-38.295 0 19.147 9.947 0 1 1 38.295 0z\"\n        opacity=\"0.804\"\n        transform=\"matrix(.85336 .208 -.16483 1.07687 66.696 -221.297)\"\n      ></Path>\n      <Path\n        fill=\"#17110e\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m586.056 360.716 142.735-80.071 1.99 4.476-137.265 79.076-8.952 6.963z\"\n      ></Path>\n      <Path\n        fill=\"#9ab1bf\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m585.995 359.952 6.526 4.743 137.762-79.574-1.492-4.476z\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3963)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m585.995 359.952 6.526 4.743 137.762-79.574-1.492-4.476z\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3973)\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m588.029 361.25 4.923 3.867 122.03-71.037\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3992)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m605.431 273.088 9.107-3.52s2.33 20.566 2.437 26.578c.108 6.013.804 21.912.804 21.912l-9.082-4.647s-1.347-32.516-3.266-40.323\"\n        opacity=\"0.754\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3996)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m605.431 273.088 9.107-3.52s2.33 20.566 2.437 26.578c.108 6.013.804 21.912.804 21.912l-9.082-4.647s-1.347-32.516-3.266-40.323\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4006)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m611.827 321.053 6.445-3.204-9.126-3.93s-.745 4.279 2.681 7.134\"\n        opacity=\"0.642\"\n      ></Path>\n      <G\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        transform=\"scale(.94944)rotate(3.547 2062.874 -411.457)\"\n      >\n        <Path\n          fill=\"url(#linearGradient4026)\"\n          d=\"m695.502 369.65 9.2-4.227s3.73 21.137 4.228 27.354 2.238 22.629 2.238 22.629l-9.698-4.228s-3.481-33.57-5.968-41.527\"\n          opacity=\"0.754\"\n        ></Path>\n        <Path\n          fill=\"url(#linearGradient4028)\"\n          d=\"m695.502 369.65 9.2-4.227s3.73 21.137 4.228 27.354 2.238 22.629 2.238 22.629l-9.698-4.228s-3.481-33.57-5.968-41.527\"\n          opacity=\"1\"\n        ></Path>\n        <Path\n          fill=\"url(#linearGradient4030)\"\n          d=\"m705.2 418.887 6.465-3.73-9.698-3.481s-.497 4.476 3.233 7.211\"\n          opacity=\"0.642\"\n        ></Path>\n      </G>\n      <Path\n        fill=\"url(#linearGradient4047)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m628.5 265.256 8.537-3.3s2.183 19.28 2.284 24.916c.101 5.637.754 20.542.754 20.542l-8.514-4.357s-1.263-30.482-3.062-37.8\"\n        opacity=\"0.754\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4049)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m628.5 265.256 8.537-3.3s2.183 19.28 2.284 24.916c.101 5.637.754 20.542.754 20.542l-8.514-4.357s-1.263-30.482-3.062-37.8\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4051)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m634.496 310.22 6.041-3.003-8.555-3.683s-.699 4.01 2.514 6.687\"\n        opacity=\"0.642\"\n      ></Path>\n      <G\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        transform=\"rotate(3.549 1719.854 622.237)scale(.89005)\"\n      >\n        <Path\n          fill=\"url(#linearGradient4053)\"\n          d=\"m695.502 369.65 9.2-4.227s3.73 21.137 4.228 27.354 2.238 22.629 2.238 22.629l-9.698-4.228s-3.481-33.57-5.968-41.527\"\n          opacity=\"0.754\"\n        ></Path>\n        <Path\n          fill=\"url(#linearGradient4055)\"\n          d=\"m695.502 369.65 9.2-4.227s3.73 21.137 4.228 27.354 2.238 22.629 2.238 22.629l-9.698-4.228s-3.481-33.57-5.968-41.527\"\n          opacity=\"1\"\n        ></Path>\n        <Path\n          fill=\"url(#linearGradient4057)\"\n          d=\"m705.2 418.887 6.465-3.73-9.698-3.481s-.497 4.476 3.233 7.211\"\n          opacity=\"0.642\"\n        ></Path>\n      </G>\n      <Path\n        fill=\"#331409\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"#dade7b\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeOpacity=\"0.523\"\n        strokeWidth=\"2.069\"\n        d=\"M464.067 316.443c1.053 3.452-8.617 9.374-15.89 11.593s-9.408-.103-10.46-3.555-.628-6.732 6.645-8.95c7.273-2.22 18.653-2.54 19.705.912z\"\n        opacity=\"0.642\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4119)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"#232408\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeOpacity=\"0.776\"\n        strokeWidth=\"1.039\"\n        d=\"M462.747 316.931c.95 3.023-7.778 8.21-14.342 10.153s-8.49-.09-9.44-3.113-.567-5.897 5.997-7.84c6.565-1.943 16.835-2.223 17.785.8z\"\n        opacity=\"0.804\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4123)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeOpacity=\"0.776\"\n        strokeWidth=\"1.039\"\n        d=\"M462.747 316.931c.95 3.023-7.778 8.21-14.342 10.153s-8.49-.09-9.44-3.113-.567-5.897 5.997-7.84c6.565-1.943 16.835-2.223 17.785.8\"\n        opacity=\"0.804\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4075)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4067)\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m625.657 318.697.352 4.923 14.418-7.736.352-4.22z\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4157)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"url(#linearGradient4149)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1.169\"\n        d=\"M430.195 499.405a19.147 9.947 0 1 1-38.295 0 19.147 9.947 0 1 1 38.295 0z\"\n        opacity=\"0.804\"\n        transform=\"matrix(.85336 .208 -.16483 1.07687 66.696 -221.297)\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4250)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1.169\"\n        d=\"M422.735 500.151a8.703 11.687 0 1 1-17.406 0 8.703 11.687 0 1 1 17.406 0\"\n        opacity=\"1\"\n        transform=\"matrix(.99543 -.14307 .11865 .82551 -135.58 48.917)\"\n      ></Path>\n      <Path\n        fill=\"#2f2728\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M336.646 393.016s8.704 1.236 10.149 3.87 2.789 4.573 2.543 7.806-9.592 7.419-9.592 7.419 6.807-7.019 5.063-11.742-8.213-7.701-8.163-7.353\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4198)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M336.646 393.016s8.704 1.236 10.149 3.87 2.789 4.573 2.543 7.806-9.592 7.419-9.592 7.419 5.015-5.505 3.27-10.228-6.42-9.215-6.37-8.867\"\n        opacity=\"0.521\"\n      ></Path>\n      <Path\n        fill=\"#251f20\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1.169\"\n        d=\"M422.735 500.151a8.703 11.687 0 1 1-17.406 0 8.703 11.687 0 1 1 17.406 0\"\n        opacity=\"1\"\n        transform=\"matrix(.99543 -.14307 .11865 .82551 -135.58 48.917)\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4188)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1.169\"\n        d=\"M422.735 500.151a8.703 11.687 0 1 1-17.406 0 8.703 11.687 0 1 1 17.406 0\"\n        opacity=\"1\"\n        transform=\"matrix(.99543 -.14307 .11865 .82551 -135.58 48.917)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4218)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1.169\"\n        d=\"M415.275 502.762a4.849 6.59 0 1 1-9.698 0 4.849 6.59 0 1 1 9.698 0\"\n        opacity=\"1\"\n        transform=\"rotate(-8.179 -328.492 997.505)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4228)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1.169\"\n        d=\"M415.275 502.762a4.849 6.59 0 1 1-9.698 0 4.849 6.59 0 1 1 9.698 0\"\n        opacity=\"1\"\n        transform=\"rotate(-8.179 -328.492 997.505)\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4238)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1.169\"\n        d=\"M415.275 502.762a4.849 6.59 0 1 1-9.698 0 4.849 6.59 0 1 1 9.698 0\"\n        opacity=\"1\"\n        transform=\"rotate(-8.179 -328.492 997.505)\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"0.531\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M331.668 390.556s9.698 1.492 13.18 4.476 6.714 7.46 6.216 11.439c-.497 3.979-5.719 5.47-9.2 6.217-3.482.746-8.206-.498-8.206-.498s6.714.249 11.19-2.486 6.216-6.466 3.232-9.947c-2.984-3.482-5.968-6.217-10.444-6.466-4.476-.248-8.454-.994-5.968-2.735\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m735.115 187.288-1.062.125c.402.117.375.148 0 .28-.432.126-.898.2-1.344.25-.063.013-.125.019-.188.032-.538-.095-1.618.024-1.625-.031-.375.061-.59.151-.656.25-.061.02-.129.036-.187.062-.034.028-.041.04-.063.063-.39.115-.77.275-1.156.406a6.2 6.2 0 0 0-1.375.563c.712.424 1.67.114 2.437-.094.282-.078.564-.137.844-.219.006.01-.006.022 0 .031.737.454 1.601.34 2.438.282.77-.04.399-.528-.032-.75a.6.6 0 0 0 .188-.22c.111-.039.229-.085.344-.124l-.282-.031c.127-.027.244-.048.375-.063a7.4 7.4 0 0 0 1.313-.281c.456-.107.412-.34.031-.531m-2.625 1.625c.087.092.103.178-.094.218-.036-.002-.022.004-.062 0 .018-.008.017-.045.031-.062.06-.04.093-.1.125-.156\"\n        color=\"#000\"\n        opacity=\"0.809\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"0.129\"\n        d=\"M722.464 193.341s-4.721-.352.284-3.082c5.134-2.8 5.567-1.073 7.3-2.255 2.502-1.706 4.384-.97 5.542 1.513.796 1.706-1.386.723-4.23.95-4.518.362-1.202-.63-4.273 1.077-3.433 1.907-3.6 2.707-4.623 1.797\"\n        opacity=\"0.483\"\n      ></Path>\n      <Path\n        fill=\"#3f5b8b\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M722.015 191.657s-.176-1.935 3.692-4.045c3.969-2.164 3.408-1.812 4.748-2.725 1.934-1.319 4.204-1.215 5.099.703.615 1.319-.528 2.11-2.726 2.286-3.492.28-2.989.44-5.362 1.758-2.654 1.475-4.66 2.726-5.451 2.023\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4318)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M722.015 191.657s-.176-1.935 3.692-4.045c3.969-2.164 3.408-1.812 4.748-2.725 1.934-1.319 4.204-1.215 5.099.703.615 1.319-.528 2.11-2.726 2.286-3.492.28-2.989.44-5.362 1.758-2.654 1.475-4.66 2.726-5.451 2.023\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4408)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"0.1\"\n        d=\"M722.015 191.657s-.176-1.935 3.692-4.045c3.969-2.164 3.408-1.812 4.748-2.725 1.934-1.319 4.204-1.215 5.099.703.615 1.319-.528 2.11-2.726 2.286-3.492.28-2.989.44-5.362 1.758-2.654 1.475-4.66 2.726-5.451 2.023z\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"0.1\"\n        d=\"M438.496 326.802c.274.711.833 1.105 1.507 1.392.805.29 1.65.462 2.481.661 1.351.368 2.71.324 4.08.115 1.825-.44 4-1.578 5.996-2.569 2.395-1.188 4.757-2.437 7.054-3.804 1.259-.783 3.568-4.462 4.765-5.243l-1.584 3.887c-1.217.788-.594.393-1.872 1.183-2.314 1.369-4.692 3.252-7.102 4.445-2.734 1.364-5.593 2.941-8.633 3.485-1.4.206-2.684-.6-4.064-.972-.849-.196-.532-.654-1.347-.968-.708-.326-.93-1.375-1.254-2.103z\"\n        color=\"#000\"\n        opacity=\"1\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M730.344 185.372c-.415.19-2.925 1.428-3.323 1.653-.413.22-.78.507-1.134.808-.332.313-.668.616-1.049.868-.387.245-.782.461-1.107.787-.298.31-.453.71-.594 1.108-.13.253-.065.128-.195.374l-1.066-.052c.129-.242.064-.122.194-.359.148-.41.301-.826.604-1.152.323-.344.707-.574 1.113-.81.379-.25.717-.547 1.052-.852a5.4 5.4 0 0 1 1.128-.832c.397-.23.808-.429 1.229-.613z\"\n        color=\"#000\"\n        opacity=\"1\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"0.531\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M72.833 335.929s4.22 9.143 4.572 10.902c.351 1.758-4.924 0-5.627-3.165s.703-6.682 1.055-7.737\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4264)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M72.833 335.929s4.22 9.143 4.572 10.902c.351 1.758-4.924 0-5.627-3.165s.703-6.682 1.055-7.737\"\n      ></Path>\n      <Path\n        fill=\"#728c8c\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M178.738 376.88s2.984 1.491 3.73 2.983 4.476 5.222 4.476 5.222l5.719 4.974s-1.243 4.476-2.984 3.481-3.233-4.476-4.725-5.47c-1.492-.995-4.227-3.482-5.222-4.228-.994-.746-3.232-.995-3.73-2.984-.497-1.99.249-4.476 2.736-3.979\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4193)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M178.738 376.88s2.984 1.491 3.73 2.983 4.476 5.222 4.476 5.222l5.719 4.974s-1.243 4.476-2.984 3.481-3.233-4.476-4.725-5.47c-1.492-.995-4.227-3.482-5.222-4.228-.994-.746-3.232-.995-3.73-2.984-.497-1.99.249-4.476 2.736-3.979\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4197)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M178.738 376.88s2.984 1.491 3.73 2.983 4.476 5.222 4.476 5.222l5.719 4.974s-1.243 4.476-2.984 3.481-3.233-4.476-4.725-5.47c-1.492-.995-4.227-3.482-5.222-4.228-.994-.746-3.232-.995-3.73-2.984-.497-1.99.249-4.476 2.736-3.979\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4201)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M178.738 376.88s2.984 1.491 3.73 2.983 4.476 5.222 4.476 5.222l5.719 4.974s-1.243 4.476-2.984 3.481-3.233-4.476-4.725-5.47c-1.492-.995-4.227-3.482-5.222-4.228-.994-.746-3.232-.995-3.73-2.984-.497-1.99.249-4.476 2.736-3.979\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"#c4d3ac\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4135)\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m179.732 319.437 10.942-11.936 7.46.497-10.942 13.428z\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4153)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4145)\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m179.732 319.437 10.942-11.936 7.46.497-10.942 13.428z\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient5358)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"m179.732 319.437 10.942-11.936 7.46.497-10.942 13.428z\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"2\"\n        d=\"M185.97 312.678c-.6.394-3.508 4.548-4.02 5.047-.49.482-.952.99-1.369 1.537-.612.29.323.302.3.298-1.07-.16-.78-.007-.213-.221.839-.243 1.518-.127 2.335.151-.243.935-2.124.068-.638-.133 1.008-.334 1.591.245 2.43.473.38.428 1.007.35 1.392.726.166.407.44.712.75 1.014l-1.027.082a3.9 3.9 0 0 1-.75-1.009c-.404-.315-1.214.122-1.607-.248-1.82-.581.734-.844-.163-.886-.473.029-2.181.765-1.413-.029 2.302-.42.232-.01-.298-.02-.63.265-2.497.69-2.128-.267.439-.542.915-1.051 1.407-1.547.506-.506 1.029-.998 1.624-1.4z\"\n        color=\"#000\"\n        opacity=\"1\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"2\"\n        d=\"M191.996 315.262c.372-.46.744-.918 1.098-1.391a46 46 0 0 1 1.7-2.118c.457-.526.903-1.061 1.373-1.575.348-.37.707-.73 1.065-1.092.32-.321.562-.692.774-1.088-1.25-.41.612-.295-.41-.07-.504.126-1.023.163-1.54.194-.852.032-1.708.067-2.557-.026-.091-.012-2.99-.816-3.082-.828l3.82.644.287.033c1.146.087-1.066.037.517.022.512-.027 1.029-.055 1.529-.178.782-.18 2.008-.544 2.47.254a3.8 3.8 0 0 1-.793 1.12c-.34.376-.709.725-1.06 1.092-.483.509-.94 1.042-1.405 1.568-.59.68-1.159 1.379-1.682 2.112-.345.476-5.387 5.908-5.756 6.366z\"\n        color=\"#000\"\n        opacity=\"1\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M186.883 313.758c.288 2.952 0 3.24 0 3.24l5.4-6.336z\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeOpacity=\"1\"\n        strokeWidth=\"1\"\n        d=\"M190.05 315.414c-2.375 1.296-3.167 1.584-3.167 1.584.4-2.252 3.203-4.264 5.4-6.336z\"\n      ></Path>\n    </G>\n    <Path\n      fill=\"url(#radialGradient4306)\"\n      fillOpacity=\"1\"\n      fillRule=\"nonzero\"\n      stroke=\"none\"\n      strokeDasharray=\"none\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"miter\"\n      strokeOpacity=\"1\"\n      strokeWidth=\"1.169\"\n      d=\"M421.74 498.162a1.492 2.238 0 1 1-2.983 0 1.492 2.238 0 1 1 2.984 0\"\n      opacity=\"0.729\"\n      transform=\"rotate(-44.31 256.677 543.417)\"\n    ></Path>\n    <G strokeLinejoin=\"miter\" strokeOpacity=\"1\">\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M87.77 346.242s16.195 4.824 25.702 7.581c9.506 2.757 32.392 9.993 44.363 13.094 11.972 3.102 67.25 13.44 83.798 16.196s34.505 6.202 42.251 16.54 9.155 15.506 8.803 18.263c-.353 2.757-1.057 9.304-8.099 9.993s-47.18-1.378-82.037-11.027-64.609-18.435-87.319-32.219c-14.856-9.016-26.054-21.191-29.223-28.428-3.169-7.236.176-11.199 1.76-9.993\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3309)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M103.839 352.543s11.884 17.826 20.797 20.797 21.788 10.894 50.012 18.321c28.225 7.428 80.218 19.807 91.607 21.293 11.39 1.485 25.254 3.466 25.254 3.466s4.457 4.952-8.418 8.418c-4.992 1.344-65.363-8.418-65.363-8.418s-54.469-13.865-73.285-20.797c-18.817-6.933-31.126-13.13-40.604-20.302-9.161-6.933-15.846-17.331-15.846-17.331s-7.923-10.894-4.456-11.39c3.466-.495 20.797 5.943 20.302 5.943\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4062)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.8\"\n        d=\"m108.115 353.444-.937 1.531s1.208.694 3.406 1.844l1.562 3.469c-.202-.117-.875-.5-.875-.5l-.906 1.53s1.048.598 3 1.626l1.125 2.5-.062-.031-.907 1.53s.948.52 2.188 1.188l.625 1.407.906-.407-.094-.25c1.612.837 3.676 1.898 6.438 3.188l.125.281.25-.125c5.519 2.565 13.298 5.92 23.406 9.625l.656 1.094.844-.5-.031-.063c2.217.803 4.502 1.606 6.937 2.438 1.686.576 3.428 1.163 5.22 1.75l1.062 2 .906-.469-.563-1.062c4.086 1.323 8.467 2.644 13.094 4l1.25 2.5 1.063-.563-.75-1.469a549 549 0 0 0 14.28 3.907l1.97 3.406 1.03-.594-1.374-2.406c5.228 1.345 10.72 2.714 16.5 4.031l1.594 2.938 1.406-.782-.906-1.687a675 675 0 0 0 17.406 3.656l1 2.281 1.562-.687-.53-1.219c4.763.924 9.673 1.873 14.75 2.75l1.062 2.969 1.625-.563-.75-2.062c4.954.843 10.092 1.619 15.343 2.406l.344 1.188 1.531-.407-.156-.53c4.93.728 9.965 1.453 15.156 2.124l.938 2.781 1.781-.593-.656-1.938c2.677.34 5.347.677 8.094 1l.218-1.781c-3.036-.357-5.986-.748-8.937-1.125l-1.188-3.563c2.243.281 4.46.575 6.75.844l.22-1.781c-2.58-.303-5.077-.62-7.595-.938l-1.406-4.28c1.875.232 3.717.462 5.625.687l.188-1.782c-2.187-.257-4.295-.544-6.438-.812l-1.187-3.531-1.813.593.906 2.688a848 848 0 0 1-14.406-1.969l-1.312-4.656c3.604.525 7.258 1.036 11 1.531l.25-1.781c-37.017-4.897-67.261-11.331-91.188-17.813l-.469 1.72c.454.122.948.251 1.407.374l-.407.219 2.782 4.781c-4.601-1.22-8.97-2.44-13.125-3.656l-2.657-5.219-1.062.563 2.125 4.187a475 475 0 0 1-13.469-4.219l-1.75-3.312-.906.469 1.25 2.406c-1.154-.384-2.33-.778-3.438-1.156a401 401 0 0 1-9.687-3.438l-1.656-2.844-.875.5 1.03 1.782a339 339 0 0 1-8.062-3.157l-1.218-2.28-.907.468.657 1.219a262 262 0 0 1-10.407-4.532l-.593-1.343-.907.406.125.312c-6.28-2.957-9.406-4.812-9.406-4.812m3.938 4.125c1.719.873 3.883 1.954 6.562 3.187l1.594 3.594c-2.938-1.393-5.107-2.471-6.563-3.25zm7.937 3.812a269 269 0 0 0 10.656 4.563l2.094 3.937a267 267 0 0 1-11.156-4.843zm-5.187 2.313c1.69.865 3.778 1.898 6.5 3.156l1.187 2.719c-3.495-1.68-5.36-2.66-6.531-3.313zm17.28 2.812a355 355 0 0 0 8.188 3.125l2.407 4.125a345 345 0 0 1-8.47-3.28zm-9.405.97a273 273 0 0 0 11.406 4.874l1.656 3.063c-4.789-1.965-8.701-3.679-11.844-5.157zm19.062 2.687c2.444.89 4.974 1.792 7.688 2.718 1.707.583 3.465 1.187 5.28 1.782l2.157 4.062c-1.24-.41-2.5-.813-3.687-1.219a403 403 0 0 1-9.032-3.187zm-6.219 2.75c2.64 1.046 5.49 2.122 8.563 3.25l1.906 3.28a339 339 0 0 1-8.812-3.437zm20.594 2.187a487 487 0 0 0 13.344 4.094l2.094 4.156a473 473 0 0 1-13.282-4.156zm25.563 1.25a589 589 0 0 0 17.5 4.375l2.718 5.031a604 604 0 0 1-17.218-4.218zm-36.125.375c2.244.813 4.561 1.626 7.03 2.469 1.778.607 3.607 1.225 5.5 1.844l1.72 3.25c-1.164-.387-2.352-.775-3.47-1.157a400 400 0 0 1-8.905-3.156zm25.5 2.938a549 549 0 0 0 13.25 3.625l2.5 4.312a535 535 0 0 1-13.657-3.812zm30.187 1.53a664 664 0 0 0 19.688 4.22l2.093 4.875a668 668 0 0 1-19.062-4.063zm-41.781.282a486 486 0 0 0 13.219 4.063l1.687 3.343c-4.692-1.39-9.07-2.804-13.187-4.156zm26.469 2.25a608 608 0 0 0 17.093 4.156l2.313 4.282a600 600 0 0 1-16.906-4.157zm37.03 2.094a733 733 0 0 0 16.345 3.031l1.656 4.75a731 731 0 0 1-15.906-2.906zm-48.687.156a548 548 0 0 0 13.782 3.781l2.03 3.5a536 536 0 0 1-14.124-3.937zm30.844 2.375a680 680 0 0 0 18.781 3.938l1.844 4.218a671 671 0 0 1-18.312-3.875zm36.094.813c5.409.917 10.989 1.804 16.75 2.656l1.312 4.656a794 794 0 0 1-16.375-2.562zm-51.531 1.03a610 610 0 0 0 16.78 4.063l1.876 3.5a600 600 0 0 1-16.656-4.093zm36.25 2.47c5.075.974 10.293 1.954 15.718 2.875l1.5 4.187a737 737 0 0 1-15.375-2.812zm-17.375 2.062a679 679 0 0 0 18.03 3.781l1.532 3.5a667 667 0 0 1-17.687-3.78zm35.03 1.125a799 799 0 0 0 16.22 2.531l1.187 4.188c-5.453-.812-10.771-1.629-15.906-2.5zm17.938 2.781c4.705.677 9.563 1.314 14.5 1.938l1.438 4.281a845 845 0 0 1-14.75-2.031zm-32.906.25c4.921.948 9.968 1.915 15.219 2.813l1.219 3.437a735 735 0 0 1-14.907-2.75zm17.156 3.125a799 799 0 0 0 15.75 2.47l.97 3.468c-5.31-.801-10.498-1.611-15.5-2.469zm17.47 2.72a849 849 0 0 0 14.843 2.03l1.187 3.563a838 838 0 0 1-15.062-2.094z\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4070)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1.8\"\n        d=\"m108.818 352.74-.937 1.532s1.208.694 3.406 1.844l1.563 3.468-.875-.5-.907 1.532s1.049.597 3 1.625l1.125 2.5-.062-.032-.906 1.532s.948.518 2.187 1.187l.625 1.406.906-.406-.093-.25c1.61.837 3.675 1.897 6.437 3.188l.125.28.25-.124c5.52 2.564 13.298 5.92 23.406 9.625l.657 1.094.843-.5-.03-.063c2.216.802 4.502 1.606 6.937 2.438 1.686.575 3.427 1.163 5.218 1.75l1.063 2 .906-.47-.562-1.062c4.086 1.324 8.467 2.644 13.093 4l1.25 2.5 1.063-.562-.75-1.469a549 549 0 0 0 14.281 3.906l1.969 3.407 1.031-.594-1.375-2.406c5.228 1.345 10.72 2.714 16.5 4.03l1.594 2.938 1.406-.781-.906-1.687a675 675 0 0 0 17.406 3.656l1 2.281 1.563-.687-.532-1.22c4.765.924 9.674 1.874 14.75 2.75l1.063 2.97 1.625-.563-.75-2.062c4.955.842 10.093 1.618 15.344 2.406l.343 1.187 1.532-.406-.157-.531c4.93.729 9.965 1.454 15.157 2.125l.937 2.781 1.781-.594-.656-1.937c2.678.34 5.347.677 8.094 1l.219-1.781c-3.036-.357-5.987-.748-8.938-1.125l-1.187-3.563c2.243.281 4.459.575 6.75.844l.218-1.781c-2.578-.303-5.076-.62-7.593-.938l-1.407-4.281c1.876.232 3.717.463 5.625.687l.188-1.781c-2.187-.257-4.295-.545-6.438-.812l-1.187-3.532-1.813.594.907 2.688a848 848 0 0 1-14.407-1.97l-1.312-4.655c3.604.525 7.258 1.036 11 1.53l.25-1.78c-37.017-4.897-67.26-11.331-91.188-17.813l-.468 1.719c.453.123.948.252 1.406.375l-.406.219 2.781 4.78c-4.6-1.22-8.969-2.439-13.125-3.655l-2.656-5.22-1.063.563 2.125 4.188a475 475 0 0 1-13.469-4.219l-1.75-3.312-.906.468 1.25 2.407c-1.154-.384-2.33-.778-3.437-1.157a401 401 0 0 1-9.688-3.437l-1.656-2.844-.875.5 1.031 1.781a339 339 0 0 1-8.062-3.156l-1.219-2.281-.906.469.656 1.218a262 262 0 0 1-10.406-4.531l-.594-1.344-.906.407.125.312c-6.281-2.957-9.407-4.812-9.407-4.812m3.938 4.126c1.719.873 3.884 1.954 6.562 3.187l1.594 3.594c-2.938-1.393-5.106-2.472-6.562-3.25zm7.937 3.812a269 269 0 0 0 10.657 4.563l2.093 3.937a267 267 0 0 1-11.156-4.844zm-5.187 2.313c1.69.865 3.778 1.897 6.5 3.156l1.187 2.719c-3.494-1.68-5.359-2.66-6.53-3.313zm17.281 2.812a355 355 0 0 0 8.188 3.125l2.406 4.125a345 345 0 0 1-8.469-3.281zm-9.406.969a273 273 0 0 0 11.406 4.875l1.656 3.062c-4.788-1.964-8.701-3.678-11.843-5.156zm19.062 2.687c2.444.89 4.974 1.792 7.688 2.719 1.707.583 3.466 1.187 5.281 1.781l2.156 4.063c-1.239-.411-2.5-.814-3.687-1.219a403 403 0 0 1-9.031-3.187zm-6.218 2.75c2.64 1.047 5.49 2.123 8.562 3.25l1.906 3.282a339 339 0 0 1-8.812-3.438zm20.593 2.188a487 487 0 0 0 13.344 4.094l2.094 4.156a473 473 0 0 1-13.281-4.156zm25.563 1.25a589 589 0 0 0 17.5 4.375l2.719 5.031a604 604 0 0 1-17.219-4.219zm-36.125.375c2.245.813 4.562 1.625 7.031 2.469 1.777.606 3.606 1.224 5.5 1.843l1.719 3.25c-1.164-.386-2.352-.774-3.469-1.156a400 400 0 0 1-8.906-3.156zm25.5 2.937a549 549 0 0 0 13.25 3.625l2.5 4.313a535 535 0 0 1-13.656-3.813zm30.187 1.532a664 664 0 0 0 19.688 4.218l2.094 4.875a668 668 0 0 1-19.063-4.062zm-41.78.28a486 486 0 0 0 13.218 4.063l1.687 3.344c-4.691-1.39-9.07-2.804-13.187-4.156zm26.468 2.25a608 608 0 0 0 17.094 4.157l2.312 4.281a600 600 0 0 1-16.906-4.156zm37.031 2.095a733 733 0 0 0 16.344 3.03l1.656 4.75a731 731 0 0 1-15.906-2.905zm-48.687.156a548 548 0 0 0 13.781 3.781l2.031 3.5a536 536 0 0 1-14.125-3.937zm30.843 2.375a680 680 0 0 0 18.782 3.937l1.843 4.219a671 671 0 0 1-18.312-3.875zm36.094.812q8.112 1.378 16.75 2.657l1.313 4.656a794 794 0 0 1-16.375-2.563zm-51.531 1.032a610 610 0 0 0 16.781 4.062l1.875 3.5a600 600 0 0 1-16.656-4.094zm36.25 2.468c5.075.975 10.294 1.955 15.719 2.875l1.5 4.188a737 737 0 0 1-15.375-2.813zm-17.375 2.063a679 679 0 0 0 18.031 3.781l1.531 3.5a667 667 0 0 1-17.687-3.781zm35.031 1.125a799 799 0 0 0 16.219 2.531l1.187 4.188c-5.453-.812-10.771-1.63-15.906-2.5zm17.938 2.781c4.704.677 9.562 1.313 14.5 1.938l1.437 4.28a845 845 0 0 1-14.75-2.03zm-32.907.25c4.921.948 9.968 1.915 15.22 2.813l1.218 3.437a735 735 0 0 1-14.906-2.75zm17.157 3.125a799 799 0 0 0 15.75 2.469l.968 3.469c-5.308-.802-10.497-1.612-15.5-2.47zm17.468 2.719a849 849 0 0 0 14.844 2.031l1.188 3.563a838 838 0 0 1-15.063-2.094z\"\n        opacity=\"0.529\"\n      ></Path>\n      <Path\n        fill=\"#2c3339\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M103.839 352.543s11.884 17.826 20.797 20.797 21.788 10.894 50.012 18.321c28.225 7.428 80.218 19.807 91.607 21.293 11.39 1.485 25.254 3.466 25.254 3.466s4.457 4.952-8.418 8.418c-4.992 1.344-65.363-8.418-65.363-8.418s-54.469-13.865-73.285-20.797c-18.817-6.933-31.126-13.13-40.604-20.302-9.161-6.933-15.846-17.331-15.846-17.331s-7.923-10.894-4.456-11.39c3.466-.495 20.797 5.943 20.302 5.943\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4120)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M103.839 352.543s11.884 17.826 20.797 20.797 21.788 10.894 50.012 18.321c28.225 7.428 80.218 19.807 91.607 21.293 11.39 1.485 25.254 3.466 25.254 3.466s4.457 4.952-8.418 8.418c-4.992 1.344-65.363-8.418-65.363-8.418s-54.469-13.865-73.285-20.797c-18.817-6.933-31.126-13.13-40.604-20.302-9.161-6.933-15.846-17.331-15.846-17.331s-7.923-10.894-4.456-11.39c3.466-.495 20.797 5.943 20.302 5.943\"\n        opacity=\"0.567\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3295)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M103.839 352.543s11.884 17.826 20.797 20.797 21.788 10.894 50.012 18.321c28.225 7.428 80.218 19.807 91.607 21.293 11.39 1.485 25.254 3.466 25.254 3.466s4.457 4.952-8.418 8.418c-4.992 1.344-65.363-8.418-65.363-8.418s-54.469-13.865-73.285-20.797c-18.817-6.933-31.126-13.13-40.604-20.302-9.161-6.933-15.846-17.331-15.846-17.331s-7.923-10.894-4.456-11.39c3.466-.495 20.797 5.943 20.302 5.943\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient3299)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M103.839 352.543s11.884 17.826 20.797 20.797 21.788 10.894 50.012 18.321c28.225 7.428 80.218 19.807 91.607 21.293 11.39 1.485 25.254 3.466 25.254 3.466s4.457 4.952-8.418 8.418c-4.992 1.344-65.363-8.418-65.363-8.418s-54.469-13.865-73.285-20.797c-18.817-6.933-31.126-13.13-40.604-20.302-9.161-6.933-15.846-17.331-15.846-17.331s-7.923-10.894-4.456-11.39c3.466-.495 20.797 5.943 20.302 5.943\"\n        opacity=\"0.567\"\n      ></Path>\n      <Path\n        fill=\"#7c7c7c\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M84.146 343.038c-1.682.05-3.906 4.03-1.093 10.593 3.214 7.5 14.555 20.124 29.625 29.47 23.035 14.285 53.236 23.374 88.593 33.374s76.045 12.152 83.188 11.438c7.143-.715 7.861-7.518 8.219-10.375s-1.05-8.192-8.907-18.907-26.089-14.299-42.875-17.156c-16.785-2.857-72.857-13.567-85-16.781-12.142-3.214-35.357-10.705-45-13.563-9.642-2.857-26.062-7.875-26.062-7.875a1.07 1.07 0 0 0-.688-.218m-.625 3.562c3.467-.495 20.808 5.938 20.313 5.938 0 0 27.805 8.372 36.719 11.343 62.371 16.662 83.319 20.289 128.687 28.688 11.39 1.485 22.281 23.844 22.281 23.844s4.437 4.97-8.437 8.437c-4.992 1.344-65.344-8.437-65.344-8.437s-54.496-13.85-73.312-20.782c-18.817-6.932-31.116-13.14-40.594-20.312-9.16-6.933-15.844-17.344-15.844-17.344s-7.935-10.88-4.469-11.375\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4093)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M84.146 343.038c-1.682.05-3.906 4.03-1.093 10.593 3.214 7.5 14.555 20.124 29.625 29.47 23.035 14.285 53.236 23.374 88.593 33.374s76.045 12.152 83.188 11.438c7.143-.715 7.861-7.518 8.219-10.375s-1.05-8.192-8.907-18.907-26.089-14.299-42.875-17.156c-16.785-2.857-72.857-13.567-85-16.781-12.142-3.214-35.357-10.705-45-13.563-9.642-2.857-26.062-7.875-26.062-7.875a1.07 1.07 0 0 0-.688-.218m-.625 3.562c3.467-.495 20.808 5.938 20.313 5.938 0 0 27.805 8.372 36.719 11.343 62.371 16.662 83.319 20.289 128.687 28.688 11.39 1.485 22.281 23.844 22.281 23.844s4.437 4.97-8.437 8.437c-4.992 1.344-65.344-8.437-65.344-8.437s-54.496-13.85-73.312-20.782c-18.817-6.932-31.116-13.14-40.594-20.312-9.16-6.933-15.844-17.344-15.844-17.344s-7.935-10.88-4.469-11.375\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4105)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M84.146 343.038c-1.682.05-3.906 4.03-1.093 10.593 3.214 7.5 14.555 20.124 29.625 29.47 23.035 14.285 53.236 23.374 88.593 33.374s76.045 12.152 83.188 11.438c7.143-.715 7.861-7.518 8.219-10.375s-1.05-8.192-8.907-18.907-26.089-14.299-42.875-17.156c-16.785-2.857-72.857-13.567-85-16.781-12.142-3.214-35.357-10.705-45-13.563-9.642-2.857-26.062-7.875-26.062-7.875a1.07 1.07 0 0 0-.688-.218m-.625 3.562c3.467-.495 20.808 5.938 20.313 5.938 0 0 27.805 8.372 36.719 11.343 62.371 16.662 83.319 20.289 128.687 28.688 11.39 1.485 22.281 23.844 22.281 23.844s4.437 4.97-8.437 8.437c-4.992 1.344-65.344-8.437-65.344-8.437s-54.496-13.85-73.312-20.782c-18.817-6.932-31.116-13.14-40.594-20.312-9.16-6.933-15.844-17.344-15.844-17.344s-7.935-10.88-4.469-11.375\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"#212a2a\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M291.571 418.571s1.407 5.979-9.143 7.034-60.487-9.144-60.487-9.144 60.135 10.55 65.059 6.682 5.275-4.22 4.571-4.572\"\n      ></Path>\n      <Path\n        fill=\"#212a2a\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M84.79 353.16s6.681 11.606 13.011 16.88c6.33 5.276 15.826 14.068 35.52 21.804C153.013 399.581 207.17 414 207.17 414l20.396 3.868s-56.97-15.474-72.092-20.045S103.428 382.7 84.79 353.16\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4180)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M84.146 343.038c-1.682.05-3.906 4.03-1.093 10.593 3.214 7.5 14.555 20.124 29.625 29.47 23.035 14.285 53.236 23.374 88.593 33.374s76.045 12.152 83.188 11.438c7.143-.715 7.861-7.518 8.219-10.375s-1.05-8.192-8.907-18.907-26.089-14.299-42.875-17.156c-16.785-2.857-72.857-13.567-85-16.781-12.142-3.214-35.357-10.705-45-13.563-9.642-2.857-26.062-7.875-26.062-7.875a1.07 1.07 0 0 0-.688-.218m-.625 3.562c3.467-.495 20.808 5.938 20.313 5.938 0 0 27.805 8.372 36.719 11.343 62.371 16.662 83.319 20.289 128.687 28.688 11.39 1.485 22.281 23.844 22.281 23.844s4.437 4.97-8.437 8.437c-4.992 1.344-65.344-8.437-65.344-8.437s-54.496-13.85-73.312-20.782c-18.817-6.932-31.116-13.14-40.594-20.312-9.16-6.933-15.844-17.344-15.844-17.344s-7.935-10.88-4.469-11.375\"\n        opacity=\"1\"\n      ></Path>\n      <G opacity=\"1\" transform=\"translate(-74.315 -84.128)\">\n        <Path\n          fill=\"#758084\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m596.803 265.658-.498-4.974s1.741-1.243 2.984-1.492c1.244-.248 2.736-2.984 5.222-3.232 2.487-.25 4.228 1.492 4.228 1.492s6.962-3.233 20.142-5.471 31.58-3.73 31.58-3.73l16.164.249.995 1.492s15.417 1.243 18.401 1.492 13.926 1.989 15.666 2.238 4.974 1.492 4.974 1.492l-.249 1.243s-33.57-3.233-42.522-2.735c-8.952.497-44.263 4.227-44.263 4.227l-.746-1.74s31.58-5.72 39.538-5.72-24.37 0-39.787 3.979-23.126 8.454-23.126 8.454l-2.984 1.74-.497 1.493s-4.476.746-5.222-.497\"\n        ></Path>\n        <Path\n          fill=\"url(#linearGradient4344)\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m596.803 265.658-.498-4.974s1.741-1.243 2.984-1.492c1.244-.248 2.736-2.984 5.222-3.232 2.487-.25 4.228 1.492 4.228 1.492s6.962-3.233 20.142-5.471 31.58-3.73 31.58-3.73l16.164.249.995 1.492s15.417 1.243 18.401 1.492 13.926 1.989 15.666 2.238 4.974 1.492 4.974 1.492l-.249 1.243s-33.57-3.233-42.522-2.735c-8.952.497-44.263 4.227-44.263 4.227l-.746-1.74s31.58-5.72 39.538-5.72-24.37 0-39.787 3.979-23.126 8.454-23.126 8.454l-2.984 1.74-.497 1.493s-4.476.746-5.222-.497\"\n        ></Path>\n        <Path\n          fill=\"url(#radialGradient4346)\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m596.803 265.658-.498-4.974s1.741-1.243 2.984-1.492c1.244-.248 2.736-2.984 5.222-3.232 2.487-.25 4.228 1.492 4.228 1.492s6.962-3.233 20.142-5.471 31.58-3.73 31.58-3.73l16.164.249.995 1.492s15.417 1.243 18.401 1.492 13.926 1.989 15.666 2.238 4.974 1.492 4.974 1.492l-.249 1.243s-33.57-3.233-42.522-2.735c-8.952.497-44.263 4.227-44.263 4.227l-.746-1.74s31.58-5.72 39.538-5.72-24.37 0-39.787 3.979-23.126 8.454-23.126 8.454l-2.984 1.74-.497 1.493s-4.476.746-5.222-.497\"\n        ></Path>\n        <Path\n          fill=\"url(#radialGradient4348)\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m596.803 265.658-.498-4.974s1.741-1.243 2.984-1.492c1.244-.248 2.736-2.984 5.222-3.232 2.487-.25 4.228 1.492 4.228 1.492s6.962-3.233 20.142-5.471 31.58-3.73 31.58-3.73l16.164.249.995 1.492s15.417 1.243 18.401 1.492 13.926 1.989 15.666 2.238 4.974 1.492 4.974 1.492l-.249 1.243s-33.57-3.233-42.522-2.735c-8.952.497-44.263 4.227-44.263 4.227l-.746-1.74s31.58-5.72 39.538-5.72-24.37 0-39.787 3.979-23.126 8.454-23.126 8.454l-2.984 1.74-.497 1.493s-4.476.746-5.222-.497\"\n        ></Path>\n        <Path\n          fill=\"#1c1903\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m597.051 266.155 5.222.249-.497 1.492-4.476.248z\"\n        ></Path>\n        <Path\n          fill=\"url(#linearGradient4350)\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m597.051 266.155 5.222.249-.497 1.492-4.476.248z\"\n        ></Path>\n        <Path\n          fill=\"#393306\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"M602.025 266.652s1.243-2.735 3.73-3.73c2.486-.994 18.153-7.46 22.131-8.206s32.078-4.227 39.041-3.73 9.947-.248 9.947-.248l-1.99-.746s-21.634.248-24.12.994-23.624 2.487-28.846 4.228-17.655 7.708-17.655 7.708z\"\n        ></Path>\n        <Path\n          fill=\"none\"\n          fillOpacity=\"0.75\"\n          fillRule=\"evenodd\"\n          stroke=\"#000\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"M629.378 258.198z\"\n        ></Path>\n        <Path\n          fill=\"url(#linearGradient4439)\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m629.378 257.452.249 1.492s36.803-4.476 45.755-4.228 41.03 2.487 41.03 2.487v-.995s-35.808-3.232-43.517-2.735-43.765 3.73-43.517 3.979\"\n        ></Path>\n        <Path\n          fill=\"none\"\n          fillOpacity=\"0.75\"\n          fillRule=\"evenodd\"\n          stroke=\"url(#linearGradient4352)\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"M613.96 255.96s38.793-9.45 61.422-6.714\"\n        ></Path>\n        <Path\n          fill=\"url(#radialGradient4354)\"\n          fillOpacity=\"1\"\n          fillRule=\"nonzero\"\n          stroke=\"none\"\n          strokeDasharray=\"none\"\n          strokeLinecap=\"round\"\n          strokeWidth=\"1.2\"\n          d=\"M607.744 257.576a3.233 1.616 0 1 1-6.465 0 3.233 1.616 0 1 1 6.465 0\"\n          opacity=\"0.867\"\n          transform=\"rotate(-24.261 604.138 259.31)\"\n        ></Path>\n        <Path\n          fill=\"url(#radialGradient4356)\"\n          fillOpacity=\"1\"\n          fillRule=\"nonzero\"\n          stroke=\"none\"\n          strokeDasharray=\"none\"\n          strokeLinecap=\"round\"\n          strokeWidth=\"1.2\"\n          d=\"M607.744 257.576a3.233 1.616 0 1 1-6.465 0 3.233 1.616 0 1 1 6.465 0\"\n          opacity=\"0.867\"\n          transform=\"matrix(.61481 .03567 -.02194 .99936 232.784 -18.413)\"\n        ></Path>\n      </G>\n      <G\n        opacity=\"1\"\n        transform=\"matrix(.8587 .03886 -.04414 .83993 -119.017 -73.445)\"\n      >\n        <Path\n          fill=\"#758084\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m596.803 265.658-.498-4.974s1.741-1.243 2.984-1.492c1.244-.248 2.736-2.984 5.222-3.232 2.487-.25 4.228 1.492 4.228 1.492s6.962-3.233 20.142-5.471 31.58-3.73 31.58-3.73l16.164.249.995 1.492s15.417 1.243 18.401 1.492 13.926 1.989 15.666 2.238 4.974 1.492 4.974 1.492l-.249 1.243s-33.57-3.233-42.522-2.735c-8.952.497-44.263 4.227-44.263 4.227l-.746-1.74s31.58-5.72 39.538-5.72-24.37 0-39.787 3.979-23.126 8.454-23.126 8.454l-2.984 1.74-.497 1.493s-4.476.746-5.222-.497\"\n        ></Path>\n        <Path\n          fill=\"url(#linearGradient4413)\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m596.803 265.658-.498-4.974s1.741-1.243 2.984-1.492c1.244-.248 2.736-2.984 5.222-3.232 2.487-.25 4.228 1.492 4.228 1.492s6.962-3.233 20.142-5.471 31.58-3.73 31.58-3.73l16.164.249.995 1.492s15.417 1.243 18.401 1.492 13.926 1.989 15.666 2.238 4.974 1.492 4.974 1.492l-.249 1.243s-33.57-3.233-42.522-2.735c-8.952.497-44.263 4.227-44.263 4.227l-.746-1.74s31.58-5.72 39.538-5.72-24.37 0-39.787 3.979-23.126 8.454-23.126 8.454l-2.984 1.74-.497 1.493s-4.476.746-5.222-.497\"\n        ></Path>\n        <Path\n          fill=\"url(#radialGradient4415)\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m596.803 265.658-.498-4.974s1.741-1.243 2.984-1.492c1.244-.248 2.736-2.984 5.222-3.232 2.487-.25 4.228 1.492 4.228 1.492s6.962-3.233 20.142-5.471 31.58-3.73 31.58-3.73l16.164.249.995 1.492s15.417 1.243 18.401 1.492 13.926 1.989 15.666 2.238 4.974 1.492 4.974 1.492l-.249 1.243s-33.57-3.233-42.522-2.735c-8.952.497-44.263 4.227-44.263 4.227l-.746-1.74s31.58-5.72 39.538-5.72-24.37 0-39.787 3.979-23.126 8.454-23.126 8.454l-2.984 1.74-.497 1.493s-4.476.746-5.222-.497\"\n        ></Path>\n        <Path\n          fill=\"url(#radialGradient4417)\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m596.803 265.658-.498-4.974s1.741-1.243 2.984-1.492c1.244-.248 2.736-2.984 5.222-3.232 2.487-.25 4.228 1.492 4.228 1.492s6.962-3.233 20.142-5.471 31.58-3.73 31.58-3.73l16.164.249.995 1.492s15.417 1.243 18.401 1.492 13.926 1.989 15.666 2.238 4.974 1.492 4.974 1.492l-.249 1.243s-33.57-3.233-42.522-2.735c-8.952.497-44.263 4.227-44.263 4.227l-.746-1.74s31.58-5.72 39.538-5.72-24.37 0-39.787 3.979-23.126 8.454-23.126 8.454l-2.984 1.74-.497 1.493s-4.476.746-5.222-.497\"\n        ></Path>\n        <Path\n          fill=\"#1c1903\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m597.051 266.155 5.222.249-.497 1.492-4.476.248z\"\n        ></Path>\n        <Path\n          fill=\"url(#linearGradient4419)\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m597.051 266.155 5.222.249-.497 1.492-4.476.248z\"\n        ></Path>\n        <Path\n          fill=\"#393306\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"M602.025 266.652s1.243-2.735 3.73-3.73c2.486-.994 18.153-7.46 22.131-8.206s32.078-4.227 39.041-3.73 9.947-.248 9.947-.248l-1.99-.746s-21.634.248-24.12.994-23.624 2.487-28.846 4.228-17.655 7.708-17.655 7.708z\"\n        ></Path>\n        <Path\n          fill=\"none\"\n          fillOpacity=\"0.75\"\n          fillRule=\"evenodd\"\n          stroke=\"#000\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"M629.378 258.198z\"\n        ></Path>\n        <Path\n          fill=\"#231002\"\n          fillOpacity=\"1\"\n          fillRule=\"evenodd\"\n          stroke=\"none\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"m629.378 257.452.249 1.492s36.803-4.476 45.755-4.228 41.03 2.487 41.03 2.487v-.995s-35.808-3.232-43.517-2.735-43.765 3.73-43.517 3.979\"\n        ></Path>\n        <Path\n          fill=\"none\"\n          fillOpacity=\"0.75\"\n          fillRule=\"evenodd\"\n          stroke=\"url(#linearGradient4421)\"\n          strokeLinecap=\"butt\"\n          strokeWidth=\"1\"\n          d=\"M613.96 255.96s38.793-9.45 61.422-6.714\"\n        ></Path>\n        <Path\n          fill=\"url(#radialGradient4423)\"\n          fillOpacity=\"1\"\n          fillRule=\"nonzero\"\n          stroke=\"none\"\n          strokeDasharray=\"none\"\n          strokeLinecap=\"round\"\n          strokeWidth=\"1.2\"\n          d=\"M607.744 257.576a3.233 1.616 0 1 1-6.465 0 3.233 1.616 0 1 1 6.465 0\"\n          opacity=\"0.867\"\n          transform=\"rotate(-24.261 604.138 259.31)\"\n        ></Path>\n        <Path\n          fill=\"url(#radialGradient4425)\"\n          fillOpacity=\"1\"\n          fillRule=\"nonzero\"\n          stroke=\"none\"\n          strokeDasharray=\"none\"\n          strokeLinecap=\"round\"\n          strokeWidth=\"1.2\"\n          d=\"M607.744 257.576a3.233 1.616 0 1 1-6.465 0 3.233 1.616 0 1 1 6.465 0\"\n          opacity=\"0.867\"\n          transform=\"matrix(.61481 .03567 -.02194 .99936 232.784 -18.413)\"\n        ></Path>\n      </G>\n    </G>\n    <G strokeLinejoin=\"miter\" strokeOpacity=\"1\" opacity=\"1\">\n      <Path\n        fill=\"url(#linearGradient4234)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M125.583 322.565s12.66 5.627 19.694 4.22c7.033-1.406 21.1-2.813 21.1-2.813v8.44h-15.473l-8.44 2.814v4.22l-15.474-5.627 12.66 7.033s-7.033 2.814-12.66 2.814-18.287-2.814-18.287-2.814l9.847-2.813v-4.22l-2.813-5.627z\"\n        opacity=\"0.57\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M148.09 349.292c5.627 1.407 7.034 5.627 16.88 5.627s19.694 2.813 19.694 2.813-1.407-4.22-11.254-7.033-15.473-4.22-7.033-4.22 15.473-1.407 7.033-4.22-14.066-1.407-14.066-1.407 7.033 9.847-1.407 7.034c-8.44-2.814-11.253 2.813-9.847 1.406\"\n        opacity=\"0.526\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M104.483 346.479s19.694 0 29.54 4.22a386 386 0 0 1 18.287 8.44l-11.253-7.033 7.033-2.814-15.473-1.406-9.847-4.22-11.253-1.407z\"\n        opacity=\"0.646\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M148.09 271.925s-14.067 11.253-14.067 15.474c0 4.22 10.55 2.813 16.177.703s33.76-14.77 33.76-14.77 18.287-9.144 23.21-10.55 4.22-4.924 1.407-3.517-27.43 13.363-31.65 12.66 9.143-7.033 16.177-9.847 21.803-9.846 21.803-9.846-8.44 1.406-18.286 5.626-22.507 10.55-25.32 11.254c-2.814.703-14.067.703-14.067.703l5.626-7.737z\"\n        opacity=\"0.374\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4284)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M238.82 248.012s14.771-7.737 26.024-9.144 25.32-6.33 25.32-6.33-3.516-1.407 3.517-6.33c7.034-4.923 14.77-6.33 17.584-7.033s11.253-2.11 11.253-2.11l6.33-4.22s1.407-4.22-3.516-2.11c-4.924 2.11-26.024 6.33-30.244 8.44s-7.033 4.22-11.253 7.033-7.034 2.11-10.55 5.627-19.694 7.736-23.21 9.846-10.55 6.33-11.254 6.33\"\n        opacity=\"0.646\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4276)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M300.715 233.241c-3.517-2.813-7.034-3.516-1.407-7.033s14.067-4.923 14.067-4.923h7.737s-.704 6.33-4.22 7.736c-3.517 1.407-15.474 4.924-16.177 4.22\"\n        opacity=\"0.646\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4268)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M314.078 233.241c6.33-1.406 7.034-.703 10.55-4.22s6.33-5.626 6.33-5.626l-6.33 2.813-8.44 3.517z\"\n        opacity=\"0.646\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4260)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M331.662 226.208c8.44-2.813 11.956-2.813 17.583-2.813s11.957-.704 17.584-1.407 4.923 0 13.363-1.407c8.44-1.406 21.803-3.516 21.803-3.516s-2.11-2.814-4.923-2.814-18.99 3.517-26.023 2.814c-7.034-.704-16.88-.704-16.88-.704s-7.737 2.11-11.254 3.517-11.253 7.033-11.253 6.33\"\n        opacity=\"0.529\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4252)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M328.848 219.175c4.22 0 8.44 0 14.77-2.11s9.144-3.517 9.144-3.517l-7.034-1.407s-9.143 2.11-11.956 3.517c-2.814 1.407-4.924 3.517-4.924 3.517\"\n        opacity=\"0.646\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M181.147 229.725c2.813 0 10.55 1.406 16.177 0 5.627-1.407 10.55-5.627 10.55-5.627s4.22.703 7.033-2.11 7.034-7.737 2.814-7.033-12.66 2.813-12.66 2.813l1.406 3.517s0 3.516-4.923 4.22-13.363 2.813-13.363 2.813z\"\n        opacity=\"0.646\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M157.937 237.461c10.55-2.813 16.177-4.923 19.693-7.736 3.517-2.814 9.847-7.034 9.847-7.034s4.22-2.813-4.22.704c-8.44 3.516-21.803 7.736-26.023 9.846l-14.067 7.034z\"\n        opacity=\"0.646\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M197.324 204.405s28.837-4.924 49.234-11.957c20.396-7.034 70.334-16.177 75.257-16.88 4.923-.704 15.473-3.517 9.847 1.406-5.627 4.924 15.033-4.936 17.847-4.936 2.813 0 21.84-3.647 21.84-6.46s-36.17 5.77-41.094 6.473-77.367 14.77-88.62 17.583c-11.254 2.814-39.388 10.55-39.388 10.55z\"\n        opacity=\"0.646\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M704.431 172.051c2.814 0 2.11 2.813 4.924.703 2.813-2.11 5.626-1.406 5.626-1.406l7.737 4.22s6.33 4.923 1.407 4.22c-4.924-.704-9.847-3.517-9.847-3.517l-11.254.703-41.69 5.785z\"\n        opacity=\"0.646\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m739.598 158.688 4.923 2.813 2.814 4.923 4.22 1.407.703 4.22 2.11.703 3.517-3.516-2.11-3.517s-4.22 1.407-4.22-1.407-2.11-4.22-2.11-4.22h-4.22z\"\n        opacity=\"0.646\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2\"\n        d=\"M621.302 239.45c2.818-1.973 5.464-4.18 8.09-6.399 3.861-3.554 4.496-5.25 9.847-3.903 1.057 4.084-3.792 3.063-3.027 2.899 3.326-1.549 4.443-1.426 8.471-.729 2.917 1.486-4.846 3.38 2.237-1.272 2.695-2.743 6.258-.97 9.618-.802-6.038.522.67-.905 2.05-1.207 2.131-.277 4.167-.887 6.178-1.621 1.776-.694 3.5-1.484 5.329-2.033 1.896-.487 3.75-1.107 5.585-1.786 1.856-.692 3.82-.958 5.784-1.1 1.98-.07 3.914-.367 5.822-.884 1.744-.593 3.585-.881 5.21-1.765 1.46-1.52 2.87-2.363 4.947-2.735 2.002-.019 3.936-.41 5.841-.993 1.925-.66 3.908-1.103 5.85-1.708 2.089-.667 4.136-1.447 6.114-2.394 1.718-.772 3.072-2.061 4.429-3.328 1.705-1.485 3.167-3.2 4.512-5.01 1.98-4.22 4.742 1.175 6.806 1.7.318.012 1.272.04.954.034-10.014-.222 10.602.134.794.029 1.913-.367 3.474-1.63 5.247-2.406 1.88-.665 3.723-1.354 5.275-2.63.885-.884 1.428-2.03 2.092-3.078l3.793.216c-.689 1.074-1.238 2.253-2.118 3.187-1.521 1.373-3.346 2.094-5.272 2.754-1.849.699-3.36 1.975-5.244 2.548-13.717-.008 5.873-.295-9.255-.195-5.005-2.334 3.876-5.27.664-1.92-1.343 1.81-2.77 3.561-4.431 5.09-1.417 1.257-2.75 2.65-4.509 3.43a47 47 0 0 1-6.096 2.453c-1.939.599-3.911 1.077-5.84 1.705-1.887.637-3.835 1.083-5.84 1.053-2.094.276-3.536.956-4.935 2.589-1.569 1.021-3.472 1.265-5.23 1.86-1.897.596-3.85.872-5.836.966-1.942.113-3.904.325-5.742.997-1.847.659-3.695 1.325-5.597 1.813-1.86.498-3.583 1.316-5.38 1.996-2.003.744-4.018 1.455-6.157 1.68-3.262.642-5.965 1.97-9.52 1.253-5.112-.55 3.756-1.947-2.211.606-2.514 1.695-7.55 4.664-9.716 1.197 6.86-1.151.638-.127-.888.939-5.211 1.644-5.482.283-4.536-3.249 7.387-1.872-.957 1.678-2.514 4.063-2.577 2.2-5.16 4.4-7.853 6.457z\"\n        color=\"#000\"\n        opacity=\"0.23\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2\"\n        d=\"M628.74 237.725c-.977.33-1.976.657-2.969.938-2.503.797-4.916 1.797-7.375 2.718-2.408.887-4.827 1.726-7.218 2.657l3.75.437c2.374-.889 4.748-1.74 7.125-2.625 2.47-.942 4.937-1.948 7.468-2.719 1.008-.267 1.982-.604 2.97-.937zm-17.187 6.844c-1.425.231-2.863.355-4.282.625-1.975.437-3.926 1.018-5.75 1.906-1.712.837-3.4 1.805-5.28 2.219-.598.092-.859.166-1.063.219-1.015.026-2.354.067-4.47.156-1.95.438-3.717 1.134-5.25 2.469-1.665 1.012-3.529 1.659-5.062 2.875-.912.831-2.798 1.721-3.375 2.25l-.53-.094c.06-.19-.81-.276-1.595-.25-2.327-.389-3.976-.568-1.03.469.03.03.046.06.093.093-2.751-.32-6.793-3.962-7.969.438-1.643 2.747-3.653 5.317-6.469 6.937-1.1-.029-2.854.006-5.593.157-1.765.947-3.383 2.187-5.344 2.718-1.811.4-3.708.227-5.438 1-2.125.844-4.268 1.722-6.312 2.75-2.445 1.284-4.786 2.71-7.156 4.125l3.78.407c2.302-1.476 4.636-2.898 7.063-4.157 2.087-1.01 4.233-1.85 6.407-2.656 1.743-.728 3.635-.494 5.437-.969 1.466-.489 2.771-1.314 4.094-2.093 1.248.093 5.617-.293 6.719-.844 2.775-1.788 4.801-4.373 6.5-7.156.061-.081.103-.144.156-.22.179.048.345.083.562.126 1.76-.122 3.033-.225 3.97-.344.287.138.653.289 1.218.469 4.565.558 5.613-.353 8.594-2.813 1.558-1.151 3.403-1.795 5.03-2.843 1.496-1.369 3.312-1.954 5.25-2.344 5.117-1.186-7.802 1.999 5.563-.344 1.876-.494 3.545-1.49 5.282-2.312 1.813-.86 3.731-1.425 5.687-1.844 1.449-.203 2.9-.356 4.344-.594zm-53.844 20.875c.186.01.589.022.781.031-.013.027-.041.043-.031.063-.584.095-.964.145-1.313.218.187-.105.373-.213.563-.312\"\n        color=\"#000\"\n        opacity=\"0.443\"\n        visibility=\"visible\"\n      ></Path>\n      <G\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2\"\n        color=\"#000\"\n        transform=\"translate(-78.385 -99.4)\"\n        visibility=\"visible\"\n      >\n        <Path\n          d=\"M281.13 464.297c5.118.096 10.256-.333 15.329.406 5.3 1.142 10.662 1.71 16.074 1.876 5.056-.29 9.859.845 14.489 2.768 4.317 2.292 9.057 3.42 13.895 3.814 19.63.709-2.536.758 4.377.321 33.625-4.14-2.651 6.6 13.05-2.741l10.338.833c-5.099 5.362-30.654 3.55-10.82 3.434l-2.377.01c-8.245.717-16.54.325-24.773-.344-4.874-.564-9.572-1.875-13.97-4.095-4.627-1.759-9.376-2.666-14.355-2.432-5.402-.244-10.74-.919-16.048-1.964-5.095-.482-10.208-.212-15.32-.284z\"\n          opacity=\"0.43\"\n        ></Path>\n        <Path\n          d=\"M363.549 478.72c5.114-.313 9.985 1.289 14.913 2.342 5.715.438 10.775.873 15.779 3.83 3.465 2.603 11.061 2.357-3.4 1.448l10.212 1.442c-8.507.228-11.256 2.003-17.033-1.807-5.02-2.716-10.278-2.805-15.84-3.522-4.83-1.167-9.674-2.38-14.692-2.14z\"\n          opacity=\"0.43\"\n        ></Path>\n        <Path\n          d=\"M295.673 462.82c5.741-2.35 11.399-1.287 17.754-.703 2.543.234-5.112.07-7.66-.098-1.615-.106 3.218-.366 4.824-.571 1.746-.401 33.322 6.135 13.12 4.698 6.198-3.055 1.567-1.314 14.842-.05l-10.264 1.098c9.037-1.316 10.435-2.58 5.647.288-2.695.165-34.106-1.146-13.144-4.55-40.91 5.192.97-3.025-14.886 1.105z\"\n          opacity=\"0.43\"\n        ></Path>\n      </G>\n      <G\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2\"\n        color=\"#000\"\n        transform=\"translate(-78.385 -99.4)\"\n        visibility=\"visible\"\n      >\n        <Path\n          d=\"M199.938 392.531c-3.694 5.763-7.868 12.196-14.687 14.265-10 5.35-21.171 10.02-27.684 19.67-2.925 4.167-7.48 9.853-4.005 15.034 4.463 4.63 11.835 2.794 17.606 2.486 2.342-.281 4.63-.438 6.363 1.295 2.606 1.45 6.467-.191 8.531 1.75 3.33 5.003 10.398 5.814 16.063 4.656 8.911.511 15.147 8.35 23.84 9.7 6.246 1.299 12.646 1.99 18.754 3.613 12.556-5.664-12.151-7.385-15.76-7.916-9.095-1.8-15.927-9.916-25.615-9.709-3.92-.09-9.172 1.766-11.531-2.562-1.644-3.664-5.778-2.015-8.782-2.75-1.65-1.405-3.245-3.156-5.75-2.844-3.576.253-7.02-.056-10.437.875-2.638-.284-6.674 1.277-8.438-1.25-.323-3.9 2.661-7.473 4.858-10.483 8.134-10.827 22.027-14.332 32.767-21.83 4.147-3.716 18.89-29.864 21.552-34.5-1.834-.067-16.305 18.678-17.645 20.5\"\n          opacity=\"0.583\"\n        ></Path>\n        <Path\n          d=\"M198.5 395.219c-5.53 4.929-9.845 11.694-17.156 14-9.94 6.043-18.673 14.304-28.625 20.406-2.275 3.562 1.588 7.098 3.937 9.5 3.6 3.709 9.078 2.832 13.688 2.344 1.29.305.924 2.313 2.719 1.719 3.016-.554 6.14-.248 8.28 2.125 6.97 3.713 15.556 2.922 22.189 7.415 1.472.668 4.693 2.91 5.624 1.116-5.072-1.297-9.35-4.836-14.625-5.656-5.118-1.19-10.895-1.523-14.75-5.407-3.626-1.302-7.739-.471-11.437-1.719-3.33.247-6.863.844-9.486-1.778-2.596-1.945-6.571-5.382-4.92-8.878 2.379-2.973 6.442-3.693 9.118-6.5 8.602-6.536 17.11-13.42 26.756-18.219 3.546-2.888 6.287-6.753 9.563-9.812-.273-.197-.578-.699-.875-.656\"\n          opacity=\"1\"\n        ></Path>\n      </G>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2\"\n        d=\"M128.959 288.475c-4.765 3.943-6.712 9.971-10.813 14.531-2.599-2.689-3.794 2.215-5.687 3.282-6.159 5.894-13.545 10.442-21.75 12.937-3.448 5.654-9.621 9.496-15.188 12.156 2.982.048 1.735 4.062 3.907 5.032.502 1.886 1.586 4.2 3.937 3.437 3.422-.122 4.975 4.385 8.656 3.344 8.773-1.459 15.45 6.873 24.125 6.531 9.596 2.558 18.024 8.584 27.907 10.094 1.249.402 3.958 1.149 4.687.031-12.682-.653-23.071-9.162-35.437-11.219-5.246-1.154-10.092-3.507-14.875-5.75-2.182-.248-5.577.258-5.25-2.968-1.261-4.525-4.001-8.438-5.5-12.875 8.416.826 12.383-8.09 18.562-12.032 8.142-5.637 15.389-12.96 19.719-21.875.837-1.703 3.617-3.288 3.594-4.812-.185-.156-.453-.138-.594.156M95.615 318.35c3.803.135 1.85 6.104-1.312 5.188-3.264-.741-1.19-5.173 1.312-5.188\"\n        color=\"#000\"\n        opacity=\"0.857\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#cee5e9\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M432.084 237.381s-7.493 3.508-16.219 7.97c-8.726 4.46-18.668 9.842-23.594 13.655l-4.405 3.59c4.77-3.693 19.728-11.888 28.437-16.34s20.638-10.686 20.638-10.686z\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#radialGradient4701)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M467.022 235.952c-.185.185-7.888 3.848-10.007 4.378-3.12.78-2.578 1.815-4.378 4.066-.326.407-.626.834-.939 1.25-1.008 1.345 3.356-.954 5.004-.625.178.036-3.74 3.18-7.193 5.942-1.568 1.254-4.41 3.128-.938 3.128 3.728 0 8.94-3.688 12.197-5.317 1.7-.85 2.203.626 4.378.626 3.238 0 6.88-2.972 9.695-4.379 3.178-1.589 5.654-1.96 9.069-2.814 3.324-.831 6.676-1.357 10.007-2.19 1.701-.425 4.566-3.272 5.63-4.69 1.094-1.46 4.822-2.43 6.567-3.128 1.295-.518 5.458-2.075 2.502-2.814-2.07-.518-4.741.833-6.568 1.563-.384.154 2.172-2.193-.312-2.814-1.661-.416-3.9 0-5.63 0-1.931 0-2.26.938-4.378.938-1.772 0-4.141-.607-6.567 0-2.521.63-4.538 1.603-6.88 2.189-2.439.61-4.389 1.69-6.88 2.19-1.47.293-2.979 1.381-4.379 2.501\"\n        opacity=\"0.443\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"3\"\n        d=\"M353.803 166.406c-66.801 9.607-135.501 18.136-196.567 48.644-12.757 6.328-25.536 12.884-36.496 22.012 8.03-.163 13.115-7.084 20.106-9.894 57.912-33.252 124.53-45.857 190.02-54.324 9.095-1.296 37.537-7.048 46.523-8.977-1.356-.591-21.98 2.276-23.586 2.54\"\n      ></Path>\n      <G\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"3\"\n        color=\"#000\"\n        transform=\"translate(-62.385 -113.4)\"\n        visibility=\"visible\"\n      >\n        <Path\n          d=\"M451.548 267.126c-.416 6.535-5.783 11.378-11.24 14.238-14.933 8.276-31.264 13.635-46.263 21.767-1.346 1.403-5.23 1.792-4.975-.619 2.261-1.785 5.134-2.534 7.608-3.975 14.968-7.14 30.796-12.595 44.95-21.354 3.149-2.174 5.976-5.349 6.466-9.28.572-1.476 2.323-.588 3.454-.777\"\n          opacity=\"0.57\"\n        ></Path>\n        <Path\n          d=\"M503.66 281.601c-26.438 2.183-52.075 9.363-77.696 15.84-17.444 4.57-34.471 10.686-51.005 17.871-5.25 2.53-10.23 5.58-15.1 8.772H343.3c14.04-9.542 30.307-14.91 46.184-20.512 16.722-5.542 33.882-9.615 50.96-13.883 15.012-3.563 30.189-6.722 45.587-7.993 5.874-.261 11.753-.005 17.63-.095\"\n          opacity=\"0.57\"\n        ></Path>\n        <Path\n          d=\"M340.107 325.06c12.998-4.734 25.29-11.361 38.707-14.942 14.388-4.29 29.014-7.72 43.595-11.268 13.588-2.913 27.272-5.735 41.181-6.476 9.087-.824 18.205-1.434 27.334-1.123 3.178.04 6.356.09 9.533.088h-16.98c5.887-.038 11.775-.06 17.662-.133-10.216-.077-20.371 1.27-30.547 1.962-19.404 2.557-38.538 6.842-57.464 11.771-12.843 3.287-25.63 6.951-37.83 12.198-6.084 2.383-11.766 5.784-18.045 7.658-3.007.589-6.132.111-9.187.266z\"\n          opacity=\"0.57\"\n        ></Path>\n        <Path\n          d=\"M302.253 333.125c12.137-5.026 24.953-8.215 36.98-13.534 4.26-1.726 8.503-3.491 12.793-5.141h15.844c-13.407 5.16-26.547 11.057-40.275 15.347-2.896 1.055-5.762 2.188-8.624 3.328z\"\n          opacity=\"0.57\"\n        ></Path>\n        <Path\n          d=\"M548.198 292.36c-7.148 2.146-14.698 1.556-22.058 1.902-12.544-.06-25.038-1.427-37.58-1.6 4.018-.046 8.036-.041 12.053-.008-13.16-.126-26.42 1.02-39.479-1.158-6.936-.631-13.878-1.316-20.833-1.647-.957.18-6.332.05-3.004-.423 9.025-1.088 18.135-.865 27.204-.704-4.843 1.424-9.94 1.631-14.821 2.91-5.242 1.094-10.49 2.48-15.253 4.986-1.152 1.185 2.626 1.414.066 1.281-4.318.094-8.644.384-12.96.078 2.71-1.856 6.22-1.812 8.996-3.563 2.735-1.337 5.93-3.09 6.732-6.25.142-3.363-3.513-5.051-6.349-5.461-2.327-.395-4.69-.418-7.042-.516 5.663-.055 11.34-.045 16.978-.631-3.21.188-7.368 2.587-6.663 6.284.71 1.266 5.253 2.276 1.892 3.305-3.217.506-7.046 2.05-9.92-.247 1.036-3.161 6.666-2.88 6.16-6.923-.275-3.824-4.13-5.886-7.338-7.046-1.364-.298-3.427-1.952-.626-1.428 4.728.484 9.428 1.269 14.135 1.877 3.729 1.473-1.788 3.972-1.411 6.5-.487 3.775-1.553 7.52-3.724 10.693-2.662 4.202-6.806 7.306-11.453 9.007-7.584 3.422-15.54 5.89-23.508 8.234-3.917 1.185-7.663 2.916-11.529 4.195-4.218.576-8.485-.077-12.723.233-1.174.132-5.19.034-2.27-.854 7.505-3.188 15.418-5.228 23.124-7.831 5.422-2.057 11-3.97 15.921-7.083 5.64-4.1 9.08-10.884 9.49-17.8 1.075-5.316 6.96-8.234 12.034-7.686 5.591.16 11.453 1.795 15.565 5.743 2.355 2.676.962 7.16-2.604 7.821-8.421 3.615-18.334 4.148-26.896.713-2.698-1.815-.8-6.044 1.92-6.756 5.746-2.122 12.028-1.143 17.965-.605 3.484.542 7.056.344 10.51 1.03 2.595.572 5.603 2.578 5.156 5.603-1.32 3.634-5.32 5.037-8.448 6.712-9.041 4.039-19.433 4.492-28.986 2.15 7.213-4.64 15.928-5.678 24.174-7.24 8.846-1.287 17.748-2.233 26.682-2.617-.443 2.107-4.386.704-6.21 1.325-3.017.14-6.05.245-9.026.793 4.182.554 8.437-.078 12.603.697 7.401.632 14.842 1.03 22.162 2.356-2.982.716-6.075.026-9.104.122-1.417-.047-3.005-.257-.725-.184 15.929.012 31.88-.306 47.78.873 3.097.158 6.193.346 9.278.663-5.231.157-10.462-.117-15.692-.2 4.458-.012 8.942-.438 13.25-1.626z\"\n          opacity=\"0.57\"\n        ></Path>\n        <Path\n          d=\"M448.952 289.228c9.38.016 18.76-.025 28.14.005-3.814 1.017-7.808.357-11.702.633-11.034.104-22.09.172-33.096-.757 6.75.698 13.515 1.244 20.27 1.884 3.968 2.623 8.92 2.507 13.487 2.512-4.78.194-9.56.594-14.347.424 3.56-1.51 7.533-1.283 11.24-2.222 2.607-.602 6.253-.683 8.143-1.985-.654-1.326-5.963-.454-2.438-.705 4.438.074 8.877.075 13.315.091-9.143-.084-18.162 2.165-26.55 5.698-4.86 1.729-9.716 4.034-14.984 3.942-3.236.18-6.484.349-9.723.124 3.678-1.71 7.854-1.464 11.738-2.394 14.31-2.323 28.77-4.272 43.302-3.815 9.275-.021 18.551-.014 27.827.049-10.438-.202-20.875-.488-31.315-.623 4.233-.037 8.467-.021 12.7-.001-18.296-.115-36.53 1.978-54.58 4.805-10.34 1.85-20.528 4.448-30.697 7.058-4.795 1.323-9.541 2.857-14.122 4.805-5.373.34-10.766.063-16.14.115.811-1.373 5.21-2.031 7.288-3.02 11.63-3.705 23.623-6.093 35.53-8.704 11.023-1.87 22.156-3.011 33.27-4.167 17.393-1.32 34.854-.952 52.276-.722 1.155.013 4.195.247 1.484.276-7.057.28-14.121.105-21.182.124 4.247-.004 8.493-.01 12.74.008-16.257-.4-32.382 2.159-48.347 4.923-8.095 1.224-16.36 2.015-24.519.932 10.952-3.37 21.47-9.045 33.174-9.216 8.871-.517 17.758-.057 26.636-.192 2.25.098 1.312 2.138-.424 1.104-3.692-.579-6.916 1.968-10.549 2.079-9.57 1.698-19.343 1.957-29.022 1.222-4.102-.116-8.53-.137-12.063-2.525 8.918-1.125 17.946-2.088 26.926-1.16 2.91.095-2.127.066-2.993.077-2.793.009-5.586.012-8.38-.049 2.562-.13 7.423.087 8.52-.587-8.879-.15-17.759.027-26.638-.046z\"\n          opacity=\"0.57\"\n        ></Path>\n        <Path\n          d=\"M427.955 291.345c-6.937 3.9-13.958 7.804-21.497 10.41-4.223.797-8.56 1.01-12.837 1.087-3.451-1.988 2.18-3.68 3.707-4.701 6.522-3.926 13.866-6.668 21.526-7.005 3.806-.404.257 3.88-1.825 3.565-9.17 4.263-18.947 6.944-28.419 10.42h-15.822c9.161-3.347 18.415-6.455 27.525-9.93 6.928-1.967 14.056-3.293 21.254-3.665 3.429 1.785-2.484 3.645-4.019 4.555-7.985 4.203-16.098 8.623-25.028 10.388-3.66.275-3.841-5.793-.186-5.753 6.108-2.52 12.023-5.494 17.718-8.836 3.562-1.23 7.394-.171 11.076-.533 2.275-.005 4.551-.013 6.827-.002\"\n          opacity=\"0.57\"\n        ></Path>\n      </G>\n      <Path\n        fill=\"url(#linearGradient4236)\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.2\"\n        d=\"M607.744 283.686a3.854 1.368 0 1 1-7.709 0 3.854 1.368 0 1 1 7.71 0\"\n        opacity=\"0.57\"\n        transform=\"matrix(2.09988 .07335 -.0858 1.25998 -855.812 -226.262)\"\n      ></Path>\n      <G\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        color=\"#000\"\n        opacity=\"1\"\n        transform=\"translate(-78.385 -101.4)\"\n        visibility=\"visible\"\n      >\n        <Path\n          d=\"M572.13 195.825c1.9.25 11.087-.062 2.915.144 4.139-.621 8.18-.008 12.275.295 2.49.24 4.985.259 7.484.212-8.534.387.341-.346 2.332-.449 4.023-.438 8.023-.137 12.038.01 2.463-.01 4.906.421 7.333.808 2.28.469 4.61.305 6.918.409 2.496.385 5.017.403 7.534.333 2.591.045 5.188.081 7.774.259 2.566.186 5.137.02 7.706.035 2.32.083 4.64.126 6.962.095 2.387.01 4.773.195 7.132.561 2.289.397 4.594.683 6.9.962 2.394.249 4.823.166 7.195.585 2.467.24 4.912.68 7.383.868 7.69 1.146-13.549-2.035 7.2.277 2.295.118 4.59.275 6.888.364 2.342-.004 4.54.836 6.815 1.271 2.394.408 4.654 1.217 6.907 2.086 2.161.9 4.257 1.958 6.475 2.712 5.538 1.44.528 2.308-.86-1.045-1.313-1.959-.849 3.06-3.982 1.763-2.202-.8-4.303-1.851-6.477-2.726-2.245-.867-4.522-1.6-6.904-2.002-2.255-.474-4.463-1.238-6.797-1.198-2.284-.11-4.571-.214-6.85-.402-7.418-.762 10.644-.065-7.224-.262-2.478-.23-4.938-.633-7.413-.899-2.38-.33-4.793-.309-7.181-.569-2.31-.284-4.618-.59-6.915-.972-2.35-.325-4.72-.515-7.094-.49-2.316.024-4.629-.037-6.944-.103-2.577.024-5.156.117-7.73-.063a132 132 0 0 0-7.76-.218c-2.53.048-5.05-.048-7.565-.359-2.307-.076-4.632.017-6.906-.47-2.428-.382-4.871-.759-7.336-.749-9.825-.435 1.962-.024-2.378-.246-3.99.184-7.932.853-11.944.706a68 68 0 0 1-7.516-.255c-9.246-.796.015-.122-2.646-.503-4.188.116-8.39.353-12.577.068z\"\n          opacity=\"1\"\n        ></Path>\n        <Path\n          d=\"M605.433 196.452c2.48-.027 4.955-.027 7.429.15 2.22.183 4.444.218 6.669.212-9.033-.185 3.959.08 7.194.62 2.508.421 5.025.775 7.532 1.195 2.45.49 4.94.521 7.419.722 2.494.283 4.94.797 7.45.925.393.005 1.57.014 1.178.015-8.817.027 4.107-.03 6.064.124 2.31-.014 4.536.593 6.82.826 7.811.7-12.79-1.096 7.334.253 2.59.31 5.207.34 7.792.677 2.515.505 5.043.958 7.602 1.159 2.5.132 5.008.241 7.5.487 2.274.27 4.531.523 6.823.553 2.434-.057 4.712.712 7.055 1.21 2.295.51 4.612.9 6.918 1.347 2.25.344 1.57.574 3.448 1.833l3.566 6.53-.883-.687c-1.714-1.457-3.14-3.192-4.83-4.671-1.886-1.179-3.928-2-6.139-2.33-2.32-.412-4.627-.874-6.933-1.362-2.329-.545-4.628-1.174-7.05-1.112-2.287-.064-4.542-.353-6.815-.59-2.495-.225-5-.338-7.5-.485-2.551-.256-5.069-.731-7.593-1.176-2.59-.285-5.197-.392-7.79-.65-7.393-.472 11.462.137-7.351-.274-2.267-.278-4.5-.801-6.796-.81-2.456-.168-1.759-.085 2.414-.142.41-.006-.82.015-1.23.022-2.809.051-5.62.095-8.427-.013-2.503-.177-4.953-.707-7.451-.931-2.48-.166-4.96-.29-7.406-.77-2.516-.416-5.043-.756-7.557-1.19-8.979-1.448 8.696.128-7.203-.538-2.205-.007-4.411-.05-6.609-.253-2.477-.142-4.954-.12-7.434-.117z\"\n          opacity=\"1\"\n        ></Path>\n      </G>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M465.919 178.257c2.517.077 5.01.213 7.51.507 2.475.246 4.87.943 7.312 1.375 9.545.564-1.086.457 2.087.353 4.082-.162 8.166-.232 12.25-.317q3.654-.071 7.308-.147l-3.515.074 2.416-.053c2.91-.061 5.82-.097 8.732-.136 2.439.118 4.831.657 7.241 1.02 2.497.246 5.013.243 7.511.46 1.937.28 10.796.019 2.49.185 4.056-.359 8.054.002 12.062.51 2.345.453 4.706.547 7.086.495 2.647.203 5.305.081 7.952.233 2.617.23 5.245.105 7.868.132 2.422.055 4.843.105 7.266.091 2.529-.039 5.047.193 7.576.215 6.942-.143-6.386.195 3.064-.38 4.166-.208 8.337-.349 12.505-.155 10.853.29-2.786.591 2.46.289 2.49-.19 4.983-.253 7.477-.326 16.064-.821-4.372.683 7.54-.425 2.556-.336 5.125-.5 7.698-.633 4.038-.565 8.033-.684 12.118-.777 2.241.151 4.48.315 6.726.384.376.007 1.503.014 1.127.021-7.845.145-.871-.452 1.083-.843 2.495-.37 4.917-.9 7.257-1.843 1.26-.476 2.462-1.087 3.664-1.692 0 0-3.531 3.775-6.042 4.117-3.951.757-7.835 1.599-11.93 1.082-2.238-.11-4.472-.253-6.709-.358 8.436-.212-.58.12-2.5.547-2.542.16-5.092.24-7.615.624-2.472.259-16.836.797-7.563.459-2.5.048-5 .124-7.494.303-4.06.292-8.096.259-12.142-.092-5.723-.233 4.986-.21-2.882-.047-4.209.26-8.412.685-12.636.592-2.545-.043-5.085-.267-7.63-.199-2.39-.021-4.778-.04-7.166-.11-2.64.011-5.285.067-7.92-.146-2.65-.104-5.307-.072-7.958-.2-2.386.027-4.746-.142-7.1-.56-1.812-.205-10.5-.833-2.4-.648-4.045.09-8.11.304-12.152-.027-2.505-.185-5.024-.2-7.52-.494-2.397-.375-4.782-.904-7.215-.954 1.186-.037 2.372-.067 3.558-.11 3.722-.136-14.896.394-11.174.238q-3.667.08-7.333.15c8.353-.177-.652-.004-2.587.107-3.914.15-7.867.453-11.743-.243-2.44-.458-4.847-1.113-7.326-1.341-2.492-.285-4.987-.355-7.49-.504z\"\n        color=\"#000\"\n        opacity=\"1\"\n        visibility=\"visible\"\n      ></Path>\n      <G\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        color=\"#000\"\n        transform=\"translate(-78.385 -99.4)\"\n        visibility=\"visible\"\n      >\n        <Path\n          d=\"M833.152 263.298c2.62-1.598 5.03-.725 4.2 2.346l-2.215-.063c.38-1.22 1.605-3.912.205-2.071z\"\n          opacity=\"1\"\n        ></Path>\n        <Path\n          d=\"m843.955 277.362-.076 1.243-2.206-.014.09-1.229z\"\n          opacity=\"1\"\n        ></Path>\n        <Path\n          d=\"M803.163 302.586c1.286-.32 2.587-.566 3.882-.843 1.401-.3 2.795-.632 4.192-.952a161 161 0 0 1 3.425-.745 22 22 0 0 0 2.953-.769c.933-.33 1.833-.742 2.728-1.163.93-.447 1.821-.972 2.676-1.549a19 19 0 0 0 2.297-1.908c.797-.874 1.44-1.873 2.144-2.82.91-1.224 2.026-2.23 3.303-3.053 1.946-1.064 4.09-1.689 6.198-2.342 1.349-.387 2.682-.9 4.096-.944 1.835.058 1.12-.045 2.16.142l-1.183.167c-.724-.118-.66-.07.206-.124-1.443.006-2.81.511-4.187.899-2.094.64-4.219 1.262-6.15 2.317-1.267.808-2.376 1.8-3.276 3.012-.7.95-1.335 1.953-2.117 2.84-.709.712-1.491 1.342-2.306 1.93a21 21 0 0 1-2.676 1.567c-.893.424-1.791.84-2.72 1.179-.972.33-1.963.594-2.973.78-1.146.24-2.293.48-3.435.742-1.403.316-2.804.647-4.21.951-1.277.277-2.561.52-3.827.846z\"\n          opacity=\"1\"\n        ></Path>\n        <Path\n          d=\"M833.18 285.626c-1.585.468-3.054 1.242-4.48 2.063-1.679.946-3.085 2.197-4.188 3.77l-.398.684-1.15-.06.409-.694a12.8 12.8 0 0 1 4.214-3.816c1.4-.82 2.841-1.593 4.387-2.104z\"\n          opacity=\"1\"\n        ></Path>\n        <Path\n          d=\"M817.48 287.03c1.256-.925 2.675-1.604 4.043-2.348 1.893-1.003 3.61-2.285 5.33-3.554l.806-.593 1.116.105-.81.592c-1.724 1.266-3.442 2.55-5.329 3.57-1.34.742-2.724 1.428-3.967 2.33z\"\n          opacity=\"1\"\n        ></Path>\n        <Path\n          d=\"M807.3 282.705c-.605-1.276-1.579-2.231-2.647-3.122-1.993-1.476-4.132-2.744-6.246-4.037-1.359-.805-.68-.41-2.034-1.185l1.614-.17c1.348.779.673.382 2.025 1.19 2.122 1.309 4.269 2.587 6.283 4.057 1.098.904 2.112 1.873 2.715 3.187z\"\n          opacity=\"1\"\n        ></Path>\n        <Path\n          d=\"M807.395 255.326c-2.263-.208 2.058-.11 2.618.018-2.888.042-.337-.047 1.252.002.792.196 5.168-.23 3.577.405-1.94.03-3.88.02-5.819.015-2.277-.476 5.389.236 6.065.279 1.221.209 6.525-.093 1.071.26a63 63 0 0 0-4.498-.475c-3.442-.366.554-.466 2.075-.433a66 66 0 0 1 6.42.899c3.247.685-1.46.589-2.827.327-1.41-.606-5.681-.533-.485-.945 1.52.19 3.013.557 4.463 1.045 1.183.984-3.17-.19-3.96-.42 2.215-.307 4.175.514 6.267 1.076 3.39.608.192.619-1.56.114-.994-.986 3.86.633 4.908.925 3.523.576.54.759-1.346.113-.818-.91 3.463.652 4.396.923 2.534.229 3.157 1.53-.267.538-3.13-.994 2.256.228 3.168.51 1.165.593 6.202 1.03 1.1.79-1.155-.775-5.312-1.274-.46-.81 1.095.638 2.281 1.084 3.479 1.48.195.067.789.164.585.2-4.619.802-1.86-.41 1.319 1.092 3.4 1.034.292.954-1.506.203 2.116-.145 3.402.84 5.098 1.82.156.078.64.242.466.235-3.964-.173-2.586-1.95-.064-.574 2.668.854 1.945 1.935-.917.81-1.022-.448-1.998-.99-2.96-1.555-1.046-.599-2.144-1.097-3.237-1.603a50 50 0 0 1-3.18-1.486 19.6 19.6 0 0 0-3.135-1.267 15.8 15.8 0 0 0-3.6-.931c-2.453-.93 8.073 1.416 1.193.27-.902-.81-2-1.348-3.103-1.826-1.132-.26-2.076-.921-3.095-1.439l-.465-.188 1.71-.2.455.203c1.008.545 1.99 1.128 3.107 1.427 1.085.52 2.204 1.032 3.07 1.891-1.865 1.14-3.778-.481-1.17-.382 1.238.196 2.427.53 3.604.959 1.076.353 2.122.779 3.131 1.294a55 55 0 0 0 3.171 1.481c1.098.507 2.196 1.016 3.246 1.62.958.554 1.931 1.087 2.947 1.53 1.452.57-1.989.639-2.47-.426-2.23-1.218 4.784-.009-.385.335-1.016-.561-3.933-1.46-1.727-2.197 2.607 1.107-.914 1.063-1.842.183-3.18-1.552 1.605-1.307-1.954-1.265-1.19-.41-2.366-.877-3.448-1.529 1.47-.826 2.339-.22 3.819.458-1.536.746-2.838.067-4.442-.391-2.907-.91-2.514-1.353.194-.94 1.279.395-2.589.688-3.098-.105-1.42-.42-4.412-1.403-1.03-1.349 2.647.961-1.079.837-2.005.313-1.362-.386-5.086-1.447-1.554-1.36 2.387.739-.993.914-1.806.324-.934-.257-5.455-.961-2.917-1.514 1.377.386 3.3.887.576.852-1.434-.482-2.913-.846-4.42-1.003 1.288-.422 2.495.229 3.813.456 2.402.429.206.375-.49.136a57 57 0 0 0-6.425-.876c1.285-.076-1.521-.29 1.247-.072a73 73 0 0 1 4.486.487c-1.413.537-2.867.302-4.365.229-1.113-.076-6.192-.388-2.742-.794 2.095.012-1.246.017 2.454-.006 1.579.543-2.786.014-3.526.106-1.547-.054-4.271-.508-1.332-.519 5.604.62-1.98.292-2.611.516z\"\n          opacity=\"1\"\n        ></Path>\n      </G>\n      <Path\n        fill=\"#1c2e3b\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M349.444 289.408s14.113-10.646 21.293-11.884 17.578-1.98 22.283 0c4.704 1.98 8.665 5.447 8.665 5.447s-5.447-8.17-20.797-7.923c-15.35.248-31.444 14.36-31.444 14.36\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient3927)\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M726.801 258.822s-2.984 10.444-6.465 16.91-7.957 12.93-15.915 17.903l-7.957 4.974\"\n        opacity=\"0.75\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M466.703 311.312s18.286-12.66 20.396-11.957c2.11.704-11.253 11.957-11.253 11.957l-7.033 7.737-7.034 4.22s8.44-7.034 4.924-11.957\"\n        opacity=\"0.646\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M421.977 300.025c6.609-.186 15.495-9.43 23.574-11.083 3.399-.695 26.736-12.583 30.41-11.726 2.83.66-20.682 12.274-22.178 13.474-1.824 1.462-5.634 1.808-7.668 2.982-2.59 1.496-6.243 2.601-8.75 3.608-2.251.903-3.44 1.986-4.875 2.814-1.487.859-3.79 3.38-4.906 4.638-1.859 2.097-3.664 3.199-5.218 4.096-2.795 1.614-3.33 2.17-2.335-1.54.797-2.972 4.113-2.317 1.946-7.263\"\n        opacity=\"0.409\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"0.75\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M422.267 315.644c-.17 1.816.511 3.677 1.327 5.308.932 1.864 2.558-3.49 4.422-4.423 1.459-.73 3.806-3.631 4.423-4.865 1.057-2.114 5.314-3.097 7.519-3.538 2.492-.499 4.804-2.418 7.518-3.096 3.058-.765 4.675-2.97 7.519-3.538.899-.18 4.998-4.114 5.307-4.423 1.875-1.875 4.356-3.155 5.308-4.423 1.742-2.323-5.364 2.24-7.961 3.538-.264.132-.59 0-.885 0-2.536 0-4.163 2.901-6.192 4.423-2.55 1.913-5.514 2.035-7.518 3.538-2.147 1.61-4.386 2.424-7.077 3.096-2.547.637-4.506 1.936-5.307 3.538-.367.735-4.644 2.765-5.307 3.096-1.014.507-1.971 1.095-3.096 1.77\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"#fff600\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M492.959 215.225c-6.17 2.06-26.885 8.935-32.68 11.306 2.106 1.21 18.326-6.441 20.464-6.645 4.32-1.306 16.7-6.004 20.79-7.594.008-.45-8.179 2.778-8.574 2.933\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"2\"\n        d=\"M422.718 251.158c-6.97 4.08-27.323 13.27-33.165 18.817.562 1.31 5.004 2.134 5.439.814 4.657-5.317 21.728-15.767 28.288-18.975-.186-.548.261-.883-.562-.656\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient3143)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M378.198 270.745s113.445-49.02 132.353-55.322c18.907-6.303 105.742-26.61 108.543-26.61s-15.406 2.8-41.316 8.403c-25.91 5.602-104.342 21.008-128.152 31.512s-72.829 41.317-71.428 42.017\"\n        opacity=\"1\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"3\"\n        d=\"M493.602 181.557c4.3-.052 8.58.415 12.877.562 15.555.112-21.912.105-3.269.02 10.634-1.328 19.38-.227 29.225 1.898 4.31.547 8.646.905 12.97 1.343 18.848.297-17.614 1.395-3.674-.343 9.818-1.218 19.828-.683 29.669-.676 3.813.063 7.627.083 11.44.084-29.797 2.065-12.805-1.01-5.818-1.262 11.783-.14 22.346.79 8.535 1.517-3.7.192-7.405.26-11.11.297-9.491.043-18.983.02-28.475.02-4.221.025-8.42.126-12.608-.454-4.175-.908-8.41-1.397-12.65-1.876-6.904-1.038-26.173-.66 3.79-.626-4.062.142-8.021 1.025-12.078 1.27-3.86.235-7.716.497-11.584.565-9.862.084-19.725-.013-29.587-.037-3.915.954 22.464-.777 4.683.94-9.788.407-19.726 1.227-29.438-.198-4.109-.921-8.257-1.596-12.408-2.287-3.917-.746-7.87-1.193-11.827-1.655-4.007-.376-8.044-.372-12.035-.904-1.54.92-6.173-.022-5.164-1.504.142-.208 3.71-.924 4.33-.926 6.378-.025 12.754.126 19.13.189 23.405 1.853-16.779 1.433-4.01.814 10.932-2.552 18.747-.614 27.73 3.303h-16.95c-19.39-8.476 16.561.992 6.064-3.303-9.883.473-19.871.934-29.638-.814 39.154-.507-.823-.709 15.513 2.241 3.974.523 7.986.552 11.975.904 3.916.465 7.834.889 11.706 1.655 4.168.689 8.335 1.348 12.457 2.287 13.554 1.884-21.79.33-4.395.197 9.678-.831 19.276-1.975 29.072-.939 21.057.049-13.915.074-4.182.037 3.92-.068 7.828-.336 11.742-.564 4.035-.255 7.975-1.147 12.018-1.271 9.916-.01 20.02-.543 29.92.626 4.227.477 8.45.944 12.606 1.876 4.14.564 8.29.488 12.463.453-28.184.002-11.707.018-5.182-.02 3.732-.036 7.463-.103 11.19-.296 5.476-.29 35.716-2.851 25.328-1.517-9.488.35-18.163 3.877-28.08 1.262-3.803 0-7.605-.021-11.406-.084 30.187-.027 11.23-.432 4.287.676-9.987 1.247-20.108.91-30.138.343-4.353-.433-8.717-.8-13.055-1.343-6.881-1.455-24.81-3.743 4.529-1.899-10.15.045-20.3.138-30.45-.019-4.34-.14-8.663-.629-13.008-.562z\"\n        color=\"#000\"\n        opacity=\"0.57\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M541.709 274.1c-6.087.319-11.334 2.492-16.5 3.781-10.162 2.536-19.556 9.45-30.844 27.25-7.52 11.858-11.136 22.15-15.312 34.032-4.177 11.88-17.483 44.496-29.88 61.832l12.067-17.582c9.809-18.464 14.574-32.057 18.75-43.938s7.761-22.053 15.219-33.812c11.217-17.688 20.329-24.345 30.219-26.813 8.428-2.103 16.514-6.32 27.906-1.781l.375-.938c-4.404-1.754-8.348-2.222-12-2.03\"\n        opacity=\"0.57\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M539.709 274.1c-6.087.319-11.334 2.492-16.5 3.781-10.162 2.536-19.556 9.45-30.844 27.25-7.52 11.858-11.136 22.15-15.312 34.032-4.177 11.88-17.483 44.496-29.88 61.832l12.067-17.582c9.809-18.464 14.574-32.057 18.75-43.938s7.761-22.053 15.219-33.812c11.217-17.688 20.329-24.345 30.219-26.813 8.428-2.103 16.514-6.32 27.906-1.781l.375-.938c-4.404-1.754-8.348-2.222-12-2.03\"\n        opacity=\"0.57\"\n      ></Path>\n      <Path\n        fill=\"#fff\"\n        fillOpacity=\"0.585\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m521.915 176.447.879 3.165 4.396-1.934 5.099-2.99 9.495-3.34-8.088 2.11s-1.803-1.67-3.517-1.583c-1.714.088-3.34 1.934-3.34 1.934l-1.76 1.231-2.11.528z\"\n      ></Path>\n      <Path\n        fill=\"url(#linearGradient4244)\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m381.466 168.592.615 2.693 3.86-1.454 4.51-2.313 8.302-2.437-7.04 1.458s-1.473-1.473-2.949-1.466-2.954 1.495-2.954 1.495l-1.564.965-1.836.362z\"\n      ></Path>\n      <Path\n        fill=\"none\"\n        fillOpacity=\"0.585\"\n        fillRule=\"evenodd\"\n        stroke=\"url(#linearGradient4429)\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"0.51\"\n        d=\"M410.03 166.48s38.047-6.864 74.78 2.644\"\n        opacity=\"0.683\"\n      ></Path>\n      <Path\n        fill=\"#131313\"\n        fillOpacity=\"0.726\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m522.794 182.25 4.923.527.176-1.407 1.583-1.758 2.11-1.231 2.11-1.407s-5.1 3.341-6.155 3.869c-1.055.527-4.044.527-4.044.527z\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"evenodd\"\n        stroke=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"m723.74 283.288-137.562 75 .5.875 136.754-75.777z\"\n        opacity=\"0.339\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M530.446 184.725c-1.411-.126-2.826-.291-4.196-.662-1.23-.451-2.43-.966-3.753-.994 5.913-.49-1.05.565 3.058 1.3 4.19.368-6.935-.283 4.285.116 3.508.248-2.003-.122-3.12-.313-1.817-.205-7.84-.133.05-.192 4.677.346-2.406.562 1.318-.023-5.266-1.832 2.054-1.1-.767-.73-2.205.144-.84 1.153.498 1.294.205.002.82.009.615.008-5.628-.023-.873-.09.436-.283l3.177.456c-2.45.356-4.941.47-7.414.272-1.49-.317-2.808-2.09-.454-2.195 2.297-.422 6.052-1.036 7.068 1.625-2.497.44-5.258.708-7.668-.112 2.264-.671 4.013-.941 6.325-.557 4.355 1.07-.963 1.693-3.23 1.24-4.508-.163 8.013.178-4.263-.184-4.59-1.393 2.195-3.805 3.266-2.207 1.311.128 2.507.654 3.752 1.056 1.369.325 2.767.5 4.168.616z\"\n        color=\"#000\"\n        opacity=\"0.483\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M524.95 182.287c4.12 1.935-1.441.964.103.724 1.386-.267 2.747-.649 4.111-1.012.533-.052-2.132-.209-1.596-.193 2.505.076 3.336-.083 1.578.158-4.198.723 4.948.855-1.933.745 1.808-.16 3.556-.678 5.295-1.169 2.076-.562 4.11-1.253 6.064-2.151.7-.426 4.358-2.043 2.6-2.358-.261-.021-1.043-.067-.782-.064 4.848.054.59.504-.905 1.047-1.41.548-2.754 1.242-4.149 1.823-.962.685-3.988 1.211-1.246 1.12-5.1.419 1.043-1.277 2.376-1.893 1.397-.717 2.815-1.385 4.234-2.056 5.794.206-1.599 1.769-3.23 2.364-2.718 1.215-4.564 1.851-7.476 1.267 2.394-.492 4.71-1.302 7.066-1.95 2.082-.565 4.192-1.015 6.294-1.497 4.947.773.348 1.7-1.275 2.262-6.025-.522 1.417-1.5 3.016-1.896 1.868-.452 3.705-1.024 5.575-1.467 3.861.147 3.044 1.097.204 1.469-1.783.17-3.566.34-5.348.528-5.14-.237-2.368-.85.289-1.312 1.872-.291 3.722-.7 5.588-1.025.856-.656 6.48-.027 4.295.128-1.734.231-3.442.62-5.16.941-2.15.418-4.321.698-6.492.976l-3.116-.454c2.181-.258 4.362-.524 6.517-.952 1.702-.323 3.391-.711 5.102-.983 3.728-.363 6.199.586 1.995.789-1.883.302-3.745.72-5.63 1.016-1.333.232-7.944 1.6-6.54.41 1.784-.171 3.566-.353 5.35-.523 1.196-.128 8.42-1.612 6.13-.575-1.927.4-3.812.97-5.724 1.439-3.143.795-5.939 1.748-9.248 1.084 2.692-.811 4.533-2.055 7.631-1.424-2.152.452-4.307.899-6.434 1.462-2.315.627-4.587 1.398-6.903 2.016-7.7-.699-1.08-.628 1.283-2.098 3.293-1.214 5.743-2.524 9.403-1.636-1.432.671-2.86 1.348-4.274 2.055-2.897 1.323-5.273 2.364-8.647 2.018-2.848-.37.134-1.584 1.272-1.967 1.374-.625 2.735-1.28 4.135-1.843 2.566-.947 5.157-1.773 7.963-.935 1.627 1.475-1.414 2.238-2.636 3.048-1.952.917-3.987 1.626-6.066 2.2-1.728.496-3.456 1.025-5.245 1.256-.722 0-8.191.222-4.349-1.68 1.204-.224 7.455-.805 6.285.889q-2.014.602-4.07 1.048c-1.716.353-5.692 1.098-6.486-1.226z\"\n        color=\"#000\"\n        opacity=\"0.483\"\n        visibility=\"visible\"\n      ></Path>\n      <Path\n        fill=\"#000\"\n        fillOpacity=\"1\"\n        fillRule=\"nonzero\"\n        stroke=\"none\"\n        strokeDasharray=\"none\"\n        strokeLinecap=\"butt\"\n        strokeWidth=\"1\"\n        d=\"M381.433 173.918c4.05-.378 8.128-.477 12.191-.4 2.483.43 4.991.786 7.404 1.537-.187.95-1.749.264-2.497.477-3.25-.088-6.512-.37-9.69-1.055-1.366-.606.551-1.07 1.205-1.05 4.045-.815 8.124-1.513 12.085-2.689-.51.264-2.153.43-1.591 1.192 1.106.24 2.257.056 3.375-.008.723.04 2.569-.481 1.017-.817-1.072.02-2.118-.219-3.194-.199-1.186-.04-2.373-.041-3.56-.067 1.631-.862 3.543-.698 5.326-.796 2.626-.01 5.273.143 7.836.738.844.64-1.018.914-1.46.906-5.192.877-10.103 2.832-15.081 4.472-1.11.416-2.227.754-3.403.418l-7.893-1.006c3.52-.992 6.94-2.291 10.398-3.47 5.453-1.742 11.239-2.905 16.977-2.232.815.217 2.74.103 2.502 1.31-.84.637-1.993.636-2.994.85-3.697.488-7.435.181-11.144.03-1.457-.098-2.917-.258-4.338-.61-.837-.983 1.152-1.046 1.777-1.206 3.453-.554 7.002-.511 10.451.039 1.417.282 2.896.648 4.084 1.488-.38.774-1.967.572-2.777 1.007-4.842 1.188-9.746 2.13-14.67 2.906-2.227.289-4.53.505-6.739.003-1.16-.942.744-1.546 1.516-1.682 2.82-.631 5.759-.513 8.611-.166 1.87.244 3.72.632 5.543 1.11-3.998.01-8 .027-11.987.348q-4.64-.69-9.28-1.378\"\n        color=\"#000\"\n        opacity=\"0.483\"\n        visibility=\"visible\"\n      ></Path>\n    </G>\n    <Path\n      fill=\"none\"\n      fillOpacity=\"0.585\"\n      fillRule=\"evenodd\"\n      stroke=\"url(#linearGradient4378)\"\n      strokeDasharray=\"none\"\n      strokeLinecap=\"butt\"\n      strokeLinejoin=\"miter\"\n      strokeOpacity=\"1\"\n      strokeWidth=\"0.6\"\n      d=\"M554.972 172.403s43.783-10.199 87.038-.88\"\n      opacity=\"0.683\"\n    ></Path>\n  </Svg>\n);\n\nexport default Car;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/svg/Heart.tsx",
    "content": "import React from 'react';\n\nimport { Svg, G, Path } from '@react-pdf/renderer';\n\nconst Heart = () => (\n  <Svg viewBox=\"-40 0 150 100\">\n    <G fill=\"grey\" transform=\"translate(-36 45.5)\">\n      <Path d=\"M 10,30 A 20,20 0,0,1 50,30 A 20,20 0,0,1 90,30 Q 90,60 50,90 Q 10,60 10,30 z\" />\n    </G>\n\n    <Path\n      d=\"M 10,30 A 20,20 0,0,1 50,30 A 20,20 0,0,1 90,30 Q 90,60 50,90 Q 10,60 10,30 z\"\n      fill=\"none\"\n      stroke=\"red\"\n    />\n  </Svg>\n);\n\nexport default Heart;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/svg/Pattern.tsx",
    "content": "import React from 'react';\nimport { Svg, G, Path } from '@react-pdf/renderer';\n\nconst Chart = () => {\n  return (\n    <Svg\n      width=\"512pt\"\n      height=\"512pt\"\n      preserveAspectRatio=\"xMinYMin slice\"\n      viewBox=\"0 0 512 512\"\n    >\n      <G strokeWidth=\"0.25\">\n        <Path\n          fill=\"#1a0035\"\n          stroke=\"#1a0035\"\n          d=\"M0 0h13.47c3.81 4 9.12 6.02 14.15 8.01.86-2.7 1.72-5.4 2.85-8.01h5.32c-.7 1.77-1.42 3.58-1.38 5.51v1.7c5.06 4.72 10.55 8.98 15.26 14.08 7.79 8.42 16.53 16.26 27.06 21.07 4.87 2.24 9.92 4.21 15.23 5.12.64 1.13 1.28 2.26 1.93 3.4-5.88 5.04-14.86 5.88-19.18 12.75-5.54 3.82-10.54 8.68-13.24 14.94-2.67 5.55-2.99 12.23-.56 17.92l-1.38 3.03c-.85-.54-1.71-1.07-2.57-1.6l-.12 1.21c-9.25-10.79-18.79-21.35-28.88-31.37.27-1.54.52-3.09 1.03-4.57 3.36-13.79-3.97-27.96-13.77-37.4-3.87-4.28-9.72-5.7-15.22-6.42V16c4.35.49 8.77 1.27 12.69 3.31 16.05 8.95 25.83 28.86 20.83 46.94 3.04 4.35 6.43 8.54 10.63 11.84-.68.64-1.34 1.31-1.98 1.99 2.28 3.22 5.49 5.6 8.13 8.5 2.3 2.26 4.2 5.14 7.32 6.36-.45-4.34-2.02-8.52-1.94-12.92.05-2.21-.41-4.36-1.14-6.43 2.02-3.64 4.25-7.34 4.93-11.51 1.15-9.57-.23-19.79-5.6-27.97-5.91-9.16-13.49-17.47-23.01-22.94-5.95-3.28-11.87-7.06-18.7-8.16C8.13 4.34 4.04 4.24 0 3.7z\"\n        ></Path>\n        <Path\n          fill=\"#48004b\"\n          stroke=\"#48004b\"\n          d=\"M13.47 0h17c-1.13 2.61-1.99 5.31-2.85 8.01C22.59 6.02 17.28 4 13.47 0z\"\n        ></Path>\n        <Path\n          fill=\"#0a0121\"\n          stroke=\"#0a0121\"\n          d=\"M35.79 0h5.96C46.81 4.05 52.38 7.46 57 12.06c6.28 6.06 12.85 11.88 20.41 16.3a88 88 0 0 0 26.18 10.41c1.48 2.72 4.45 3.27 7.26 3.63-.18.33-.52 1-.69 1.33-4.47-.02-8.88-.89-13.06-2.45-5.42-1.88-10.84-3.85-15.83-6.7-4.77-2.73-9.44-5.63-13.76-9.04C58.03 18.38 50.26 8.99 39.9 3c-2.31-1.65-4.14 1-5.49 2.51-.04-1.93.68-3.74 1.38-5.51z\"\n        ></Path>\n        <Path\n          fill=\"#1f1361\"\n          stroke=\"#1f1361\"\n          d=\"M41.75 0h3.87C57.58 6.63 69.44 14.17 83 17.02c-3.8 2.53-4.43 7.29-5.59 11.34-7.56-4.42-14.13-10.24-20.41-16.3C52.38 7.46 46.81 4.05 41.75 0z\"\n        ></Path>\n        <Path\n          fill=\"#150031\"\n          stroke=\"#150031\"\n          d=\"M45.62 0h8.01c10.76 5.21 21.39 11.18 33.31 13.33 13.65 2.31 28.2.75 40.51-5.82 3.52.49 7.06-.01 10.54-.61 3.08.33 6.17.68 9.26.97 1.96.28 3.93.5 5.91.72 2.82.36 5.62.84 8.4 1.48 4.04 1.06 7.99 2.6 11.56 4.8 1.36.96 3.19 2.12 2.72 4.07-1.57 2.32-3.91 3.97-6.25 5.43-3.97-.57-6.88 2.36-10.02 4.19-9.3 5.78-20.39 7.15-30.68 10.32-6.37 1.61-12.72 3.28-18.98 5.3l.25-.45c.17-.33.51-1 .69-1.33-2.81-.36-5.78-.91-7.26-3.63 6.05-.2 12.14.3 18.17-.33 11.12-2.95 21.96-6.85 32.5-11.45 4.39-1.74 8.78-3.75 12.25-7.03-3.29-2.98-7.71-3.94-11.83-5.21-6.26-1.53-12.41-3.6-18.71-4.89-6.55 2.42-12.62 6.22-19.55 7.62-11 2.1-22.54 2.55-33.42-.46C69.44 14.17 57.58 6.63 45.62 0z\"\n        ></Path>\n        <Path\n          fill=\"#ff8d59\"\n          stroke=\"#ff8d59\"\n          d=\"M53.63 0h86.24c-4.21 2.39-8.16 5.21-12.42 7.51-12.31 6.57-26.86 8.13-40.51 5.82C75.02 11.18 64.39 5.21 53.63 0z\"\n        ></Path>\n        <Path\n          fill=\"#180325\"\n          stroke=\"#180325\"\n          d=\"M139.87 0h10.16c.22.64.65 1.93.87 2.57-4.58.47-8.78 2.44-12.91 4.33-3.48.6-7.02 1.1-10.54.61 4.26-2.3 8.21-5.12 12.42-7.51z\"\n        ></Path>\n        <Path\n          fill=\"#10000f\"\n          stroke=\"#10000f\"\n          d=\"M150.03 0h26.92c3.78 2.4 7.86 4.47 11.15 7.55 1.22 1.82 2.47 3.61 3.78 5.36l-1.7.04c-4.58-4.75-10.67-7.83-17.1-9.16-7.25-1.75-14.79-1.69-22.18-1.22-.22-.64-.65-1.93-.87-2.57z\"\n        ></Path>\n        <Path\n          fill=\"#fc3762\"\n          stroke=\"#fc3762\"\n          d=\"M176.95 0h15.39c-.99 2.47-1.57 5.06-2.08 7.66-.54-.03-1.62-.08-2.16-.11-3.29-3.08-7.37-5.15-11.15-7.55z\"\n        ></Path>\n        <Path\n          fill=\"#170032\"\n          stroke=\"#170032\"\n          d=\"M192.34 0h7.36c-1.83 5.66-3.58 12.35-.49 17.89 2.55 4.89 6.29 9.55 11.64 11.46 7.42 2.74 15.58 2.78 22.93 5.82 2.15.69 4.44 2.07 6.74 1.13 7.52-2.77 13.54-8.25 20.04-12.75 10.37-7.23 20.03-15.4 29.67-23.55h3.97c-4.91 7.77-12.69 12.84-19.65 18.57-3.19 2.65-7.09 4.37-9.85 7.54-5.66 4-10.58 8.89-15.3 13.94 1.05 2.62 2.05 5.86 5.41 6.04-1.02.66-2.07 1.28-3.1 1.91-9.03-8.53-21.64-12.06-33.75-13.03-4.83-.57-9.68.01-14.49.49-2.66-2.16-6.04-1.44-9.14-1.77-1.35-1.29-2.37-2.86-3.48-4.35 3.67-4.89 3.56-11.86-.67-16.39l1.7-.04c-1.31-1.75-2.56-3.54-3.78-5.36.54.03 1.62.08 2.16.11.51-2.6 1.09-5.19 2.08-7.66z\"\n        ></Path>\n        <Path\n          fill=\"#f40047\"\n          stroke=\"#f40047\"\n          d=\"M199.7 0h2.24c4.96 5.84 11.6 10.28 19.07 12.14 9.18 2.39 18.77 1.12 27.99-.35 9.74-1.51 18.91-5.28 28.1-8.66 2.09-.81 4.37-1.38 5.91-3.13h7.22c-9.64 8.15-19.3 16.32-29.67 23.55-6.5 4.5-12.52 9.98-20.04 12.75-2.3.94-4.59-.44-6.74-1.13-7.35-3.04-15.51-3.08-22.93-5.82-5.35-1.91-9.09-6.57-11.64-11.46-3.09-5.54-1.34-12.23.49-17.89z\"\n        ></Path>\n        <Path\n          fill=\"#1a003b\"\n          stroke=\"#1a003b\"\n          d=\"M201.94 0h16.64c2.3 3.01 4.77 5.99 8.08 7.92-.37 2.97-2.99 4.07-5.65 4.22-7.47-1.86-14.11-6.3-19.07-12.14z\"\n        ></Path>\n        <Path\n          fill=\"#13b2a0\"\n          stroke=\"#13b2a0\"\n          d=\"M218.58 0h48.58c-.37 1.04-.72 2.08-1.05 3.13-9.27 3.69-19.14 6.02-29.13 6.25-3.5.1-6.98-.43-10.32-1.46-3.31-1.93-5.78-4.91-8.08-7.92z\"\n        ></Path>\n        <Path\n          fill=\"#31afc4\"\n          stroke=\"#31afc4\"\n          d=\"M267.16 0h7.27c-2.79 1-5.55 2.08-8.32 3.13.33-1.05.68-2.09 1.05-3.13z\"\n        ></Path>\n        <Path\n          fill=\"#09031c\"\n          stroke=\"#09031c\"\n          d=\"M274.43 0h8.58c-1.54 1.75-3.82 2.32-5.91 3.13-9.19 3.38-18.36 7.15-28.1 8.66-9.22 1.47-18.81 2.74-27.99.35 2.66-.15 5.28-1.25 5.65-4.22 3.34 1.03 6.82 1.56 10.32 1.46 9.99-.23 19.86-2.56 29.13-6.25 2.77-1.05 5.53-2.13 8.32-3.13z\"\n        ></Path>\n        <Path\n          fill=\"#250655\"\n          stroke=\"#250655\"\n          d=\"M294.2 0h12.23c-3.98 9.13-10.91 16.61-18.14 23.31-5.02 5.28-11.88 8.12-18.45 10.94 1.95-3.43 7.33-4.54 6.92-9.11 2.18-2.41 4.92-4.66 5.42-8.08-5.61 3.42-11.23 6.88-17.48 9.05 2.76-3.17 6.66-4.89 9.85-7.54 6.96-5.73 14.74-10.8 19.65-18.57z\"\n        ></Path>\n        <Path\n          fill=\"#0e0122\"\n          stroke=\"#0e0122\"\n          d=\"M306.43 0h3.77c-1.1 2.32-2.13 4.67-3.32 6.95-2.75 5.33-5.94 10.52-10.3 14.7-3.81 3.86-7.93 7.5-12.77 10-8.05 4.13-17.16 6.96-23.55 13.67-1.37 1.16-1.77 2.92-2.09 4.6 2.97-.66 5.36-2.61 7.93-4.12 6.26-3.8 13.13-6.39 19.92-9.03 8-3 15.59-7.1 22-12.8 3.43-2.85 5.05-7.12 6.75-11.1 1.49-4.33-.68-8.68-1.64-12.87h5.45c.99 5.27 1.59 10.79.25 16.05-4.03 13.23-11.89 25.53-23.22 33.64a71.2 71.2 0 0 1-19.7 9.57c-3.67.94-7.36 1.82-10.93 3.09 8.98 1.18 18.31 3.6 27.21.55 5.55-1.8 10.67-4.88 15.16-8.59 10.04-9.01 18.78-20.44 20.93-34.09.76 2.8 1.31 5.67 1.1 8.58-2.53 8.13-8.18 14.6-12.69 21.64-2.41 3.92-4.06 8.41-3.48 13.07 5.22 2.11 10.71 3.67 15.54 6.65 6.2 3.82 12.26 7.94 17.43 13.09.24.2.72.58.96.77.34 2.66-.15 5.46 1.01 7.97 2.12 4.99 1.49 10.76-.34 15.75-2.43 7.36-10.1 12.59-17.84 12.25 2.03 3.47 3.78 7.39 7.37 9.55 9.06 7.18 15.06 17.31 22.32 26.15 5.6 7.21 11.86 13.95 19.05 19.61 2.13 1.65 3.94 3.65 5.91 5.49 1.91-1.44 2.45-4.03 3.48-6.09.45.93.91 1.85 1.37 2.78l2.12.16c-.48 1.03-.94 2.06-1.39 3.1-1.8 4.14-3.59 8.29-5.56 12.35-3.44 4.77-8.52 8-13.34 11.2-10.59 6.96-22.18 13.14-29.96 23.47-4.88 5.99-7.85 13.7-6.6 21.5-3.12-4.6-2.42-10.68-.96-15.76 5.33-8.86 11.87-17.39 20.85-22.82 6.77-4.18 13.41-8.59 20.38-12.44 1.61-.73 3.07-1.74 4.2-3.11-1.93-2.8-4.16-6.8-8.21-6.04-4.72 1.44-9.82 2.09-14.06 4.78-4.77 3-10.18 5.03-14.28 9.02-5.73 2.9-9.87 7.8-13.63 12.85-5.25 3.26-6.51 9.88-7.91 15.43-.84 2.2.5 4.86 2.91 5.22 1.66-2.1 1.1-4.99 1.56-7.47.48 3.63.11 7.3.52 10.93 1.64 5.82 6.16 10.34 7.77 16.19 1.5 4.17 1.23 9.32 4.9 12.38.01.59.02 1.77.03 2.36-.64 1.28-1.31 2.55-1.98 3.81-1.76-.29-3.52-.58-5.25-.98-.21-.45-.64-1.35-.85-1.8 1.12.88 2.36 1.54 3.72 2 .49-7.72-.92-15.68-4.77-22.44-6.15-11.5-14.13-21.93-22.48-31.9 3.31-.56 5.24 2.8 7.62 4.5-.03-2.83-.5-5.67-.13-8.48 1.09-3.56 2.64-6.97 3.36-10.65 3.11-4.99 6.64-9.93 11.69-13.13 6.74-4.3 13.71-8.35 21.12-11.4 1.59-.22 3.18-.53 4.73-.97-1.73-4.01-4.75-7.15-7.94-10.03-1.77-1.43-2.55-3.57-2.79-5.78 3.32 3.85 6.69 7.7 10.59 10.99 3.87 3.21 7.91 6.3 12.41 8.6 1.77.99 3.5 2.04 5.2 3.15 2.51 1.13 5.32 4.87 8.15 2.93 1.7-2.58-1.31-4.59-2.72-6.45-1.23-1.34-2.48-2.65-3.75-3.94-1.88-1.88-3.75-3.78-5.72-5.57-11.05-10.24-18.93-23.19-28.57-34.66-2.44-2.93-4.72-6-7.06-9.01-4.51-5.73-7.53-12.43-11.75-18.35-7.35-10.71-15.07-21.44-24.96-29.97-6.4-5.44-13.39-10.84-21.66-13.12-4.22-1.33-8.47-2.73-12.92-2.92l-1.33-.2c-.13-1.5-.12-3-.12-4.49l-.08.72c-.54-.16-1.62-.48-2.17-.64l-.25-.43 1.32-1.44A43 43 0 0 0 251.71 48c1.03-.63 2.08-1.25 3.1-1.91 4.62-4.44 9.4-8.71 15.03-11.84 6.57-2.82 13.43-5.66 18.45-10.94 7.23-6.7 14.16-14.18 18.14-23.31z\"\n        ></Path>\n        <Path\n          fill=\"#0cc2b0\"\n          stroke=\"#0cc2b0\"\n          d=\"M310.2 0h2.93c.96 4.19 3.13 8.54 1.64 12.87-1.81-.42-3.62-.84-5.42-1.26-.83-1.55-1.65-3.11-2.47-4.66 1.19-2.28 2.22-4.63 3.32-6.95z\"\n        ></Path>\n        <Path\n          fill=\"#ff9565\"\n          stroke=\"#ff9565\"\n          d=\"M318.58 0h12.11c-.45 6.78-.98 13.57-2.41 20.22-2.15 13.65-10.89 25.08-20.93 34.09-4.49 3.71-9.61 6.79-15.16 8.59-3.72.27-7.49.83-11.2.32-2.04-.8-3.49-2.55-5.08-3.96a71.2 71.2 0 0 0 19.7-9.57c11.33-8.11 19.19-20.41 23.22-33.64 1.34-5.26.74-10.78-.25-16.05z\"\n        ></Path>\n        <Path\n          fill=\"#1a0034\"\n          stroke=\"#1a0034\"\n          d=\"M330.69 0h18.56c-5.66 2.4-13.39 5.28-13.14 12.72 5.98 0 12.04-.59 17.93.75 5.26 1.12 10.46 2.49 15.68 3.77 15.57 4.74 32.4 4.74 48.11.65.76.76 1.53 1.53 2.3 2.29-1.19.77-2.38 1.53-3.58 2.27-5.25-1.06-10.33 1.44-15.55 1.63-11.94.62-24.33 1.06-35.64-3.5-6.63-1.35-13.42-5.85-20.24-3.16.65.9 1.31 1.79 1.97 2.69-3.32-.26-5.59-3.77-9.04-3.1-1.57.59-2.36 2.26-3.24 3.58-2.18 2.92-1.76 6.7-1.97 10.14-.51-.44-1.03-.88-1.53-1.31-.35 1.29-.69 2.59-1.03 3.88a25.6 25.6 0 0 1-.9-4.5c.21-2.91-.34-5.78-1.1-8.58 1.43-6.65 1.96-13.44 2.41-20.22z\"\n        ></Path>\n        <Path\n          fill=\"#fd895a\"\n          stroke=\"#fd895a\"\n          d=\"M349.25 0h18.54c.68 5.6 1.88 11.37 5.89 15.62q-1.995.81-3.96 1.62c-5.22-1.28-10.42-2.65-15.68-3.77-5.89-1.34-11.95-.75-17.93-.75-.25-7.44 7.48-10.32 13.14-12.72z\"\n        ></Path>\n        <Path\n          fill=\"#fe925e\"\n          stroke=\"#fe925e\"\n          d=\"M367.79 0h57.63c2.95.86 5.88 1.79 8.86 2.57 1.36.99 2.64 2.09 3.85 3.26-6.67 4.16-12.52 9.97-20.3 12.06-15.71 4.09-32.54 4.09-48.11-.65q1.965-.81 3.96-1.62c-4.01-4.25-5.21-10.02-5.89-15.62z\"\n        ></Path>\n        <Path\n          fill=\"#522346\"\n          stroke=\"#522346\"\n          d=\"M425.42 0h14.77c-.49.8-1.08 1.59-1.51 2.41-1.8-1.26-3.87-1.87-6.06-1.83.41.5 1.24 1.49 1.66 1.99-2.98-.78-5.91-1.71-8.86-2.57z\"\n        ></Path>\n        <Path\n          fill=\"#0b0227\"\n          stroke=\"#0b0227\"\n          d=\"M440.19 0h2.57c-.33 3.58-.85 7.21-.19 10.78.4.28 1.19.82 1.59 1.1-.53-.22-1.58-.64-2.1-.86-.47 1.56-.92 3.12-1.43 4.67-.36-2.63-.72-5.26-.96-7.9l-1.06.98c-1.92 1.65-3.92 3.22-5.93 4.76a121.6 121.6 0 0 0-17.49 15.51l-.51.5c-2.41 2.44-4.93 4.77-7.41 7.14-9.14 8-16.77 18.29-28.19 23.23-6.74 3.1-14.29 3.05-21.54 2.83 1.02-.76 2.04-1.55 3.06-2.33-1.84-.61-3.54-1.54-4.8-3.04 8.62 2.23 17.78.14 25.33-4.32 10.38-5.71 16.91-16.16 26.66-22.7-2.54.64-5.13 1-7.74 1.02-15.79.44-31.96-.43-46.97-5.69-5.16-1.68-9.68-5.15-15.09-6-.99.74-1.88 1.6-2.74 2.47l-.44-1.56c.88-1.32 1.67-2.99 3.24-3.58 3.45-.67 5.72 2.84 9.04 3.1 12.64 4.03 25.56 7.79 38.92 8.22 6.45.13 12.94.09 19.35-.76 4.17-.52 7.63-3.11 11.19-5.12 1.2-.74 2.39-1.5 3.58-2.27-.77-.76-1.54-1.53-2.3-2.29 7.78-2.09 13.63-7.9 20.3-12.06a36 36 0 0 0-3.85-3.26c-.42-.5-1.25-1.49-1.66-1.99 2.19-.04 4.26.57 6.06 1.83.43-.82 1.02-1.61 1.51-2.41z\"\n        ></Path>\n        <Path\n          fill=\"#ffa15c\"\n          stroke=\"#ffa15c\"\n          d=\"M442.76 0h12.25c-1.53 4.73-3.05 9.46-4.24 14.28l-.6 2.25c-1.93-1.65-3.86-3.31-6.01-4.65-.4-.28-1.19-.82-1.59-1.1-.66-3.57-.14-7.2.19-10.78z\"\n        ></Path>\n        <Path\n          fill=\"#3d0042\"\n          stroke=\"#3d0042\"\n          d=\"M455.01 0h33.53c-3.42 1.53-6.99 2.7-10.53 3.93-6.66 2.33-12.23 6.81-17.9 10.85-3.57 2.18-5.47 6.12-8.86 8.49.02-2.99 1.72-6.39-.48-8.99 1.19-4.82 2.71-9.55 4.24-14.28z\"\n        ></Path>\n        <Path\n          fill=\"#18003b\"\n          stroke=\"#18003b\"\n          d=\"M488.54 0H512v7.93c-16.51-3.79-36.01-.8-47.68 12.42.16-1.29.3-2.59.43-3.89-1.82.18-3.86.52-4.64-1.68 5.67-4.04 11.24-8.52 17.9-10.85 3.54-1.23 7.11-2.4 10.53-3.93z\"\n        ></Path>\n        <Path\n          fill=\"#f00044\"\n          stroke=\"#f00044\"\n          d=\"M137.99 6.9c4.13-1.89 8.33-3.86 12.91-4.33 7.39-.47 14.93-.53 22.18 1.22-1.28-.17-2.56-.3-3.84-.41-4.36-.66-8.79-.86-13.18-.35-4.83.31-9.61 1.32-14.08 3.18 1.75.57 3.5 1.16 5.27 1.66-3.09-.29-6.18-.64-9.26-.97z\"\n        ></Path>\n        <Path\n          fill=\"#21b9a2\"\n          stroke=\"#21b9a2\"\n          d=\"M34.41 5.51C35.76 4 37.59 1.35 39.9 3c10.36 5.99 18.13 15.38 27.61 22.54 4.32 3.41 8.99 6.31 13.76 9.04.03.98.07 1.97.11 2.95-.94.93-1.88 1.85-2.82 2.78-.7.04-1.41.08-2.11.13l.28 1.92C66.2 37.55 57.46 29.71 49.67 21.29c-4.71-5.1-10.2-9.36-15.26-14.08z\"\n        ></Path>\n        <Path\n          fill=\"#ff8067\"\n          stroke=\"#ff8067\"\n          d=\"M141.98 6.21c4.47-1.86 9.25-2.87 14.08-3.18-.91 1.88-1.88 3.73-2.9 5.56-1.98-.22-3.95-.44-5.91-.72-1.77-.5-3.52-1.09-5.27-1.66z\"\n        ></Path>\n        <Path\n          fill=\"#fdd794\"\n          stroke=\"#fdd794\"\n          d=\"M156.06 3.03c4.39-.51 8.82-.31 13.18.35-1.04.34-2.08.69-3.11 1.05 1.32.35 2.64.69 3.96 1.03-1.14.39-2.28.79-3.42 1.18-.25.46-.74 1.37-.99 1.83-1.38.53-2.75 1.06-4.12 1.6-2.78-.64-5.58-1.12-8.4-1.48 1.02-1.83 1.99-3.68 2.9-5.56z\"\n        ></Path>\n        <Path\n          fill=\"#fd724d\"\n          stroke=\"#fd724d\"\n          d=\"M0 3.7c4.04.54 8.13.64 12.16 1.31 6.83 1.1 12.75 4.88 18.7 8.16 9.52 5.47 17.1 13.78 23.01 22.94 5.37 8.18 6.75 18.4 5.6 27.97-.68 4.17-2.91 7.87-4.93 11.51-2.12 3.71-6.79 4.55-10.39 2.5-4.2-3.3-7.59-7.49-10.63-11.84 5-18.08-4.78-37.99-20.83-46.94C8.77 17.27 4.35 16.49 0 16z\"\n        ></Path>\n        <Path\n          fill=\"#fef1b5\"\n          stroke=\"#fef1b5\"\n          d=\"M166.13 4.43c1.03-.36 2.07-.71 3.11-1.05 1.28.11 2.56.24 3.84.41 6.43 1.33 12.52 4.41 17.1 9.16 4.23 4.53 4.34 11.5.67 16.39a24.8 24.8 0 0 1-6.55 4.81c-14.9 7.68-30.57 14.24-47.18 17.09-18.61 3.14-38.05 6.84-53.58 18.29-10.84 7.74-18.86 20.03-19.19 33.61-1.24-2.16-2.44-4.36-3.44-6.65-2.43-5.69-2.11-12.37.56-17.92 2.7-6.26 7.7-11.12 13.24-14.94 8.04-4.87 16.77-8.47 25.06-12.87 11.25-6.02 23.98-8.11 36.18-11.32 11.98-3.06 23.38-8.17 33.64-15.07 2.34-1.46 4.68-3.11 6.25-5.43.47-1.95-1.36-3.11-2.72-4.07-3.57-2.2-7.52-3.74-11.56-4.8 1.37-.54 2.74-1.07 4.12-1.6.25-.46.74-1.37.99-1.83 1.14-.39 2.28-.79 3.42-1.18-1.32-.34-2.64-.68-3.96-1.03z\"\n        ></Path>\n        <Path\n          fill=\"#22c6b3\"\n          stroke=\"#22c6b3\"\n          d=\"M296.58 21.65c4.36-4.18 7.55-9.37 10.3-14.7.82 1.55 1.64 3.11 2.47 4.66 1.8.42 3.61.84 5.42 1.26-1.7 3.98-3.32 8.25-6.75 11.1-1.72-.91-3.33-2.16-5.26-2.59-1.4.04-2.66.8-3.95 1.25-.56-.24-1.67-.74-2.23-.98z\"\n        ></Path>\n        <Path\n          fill=\"#0c7663\"\n          stroke=\"#0c7663\"\n          d=\"M464.32 20.35C475.99 7.13 495.49 4.14 512 7.93v13.33c-14.29-3.85-29.78-2.25-43.33 3.53-3.68 1.68-7.26 3.67-10.3 6.36.63-4.22 3.59-7.44 5.95-10.8z\"\n        ></Path>\n        <Path\n          fill=\"#1b0026\"\n          stroke=\"#1b0026\"\n          d=\"m438.61 8.77 1.06-.98c.24 2.64.6 5.27.96 7.9-2.62 7.89-8.78 13.79-13.43 20.47-5.32 7.01-9.51 15-11.38 23.65-.95 5.23-1.68 10.51-2.25 15.8l-.7.39c-1.54-5.23.64-10.8-1.18-16.07-2.21.44-4.17 1.53-5.8 3.06-5.59 4.9-12.43 8.07-19.48 10.25-4.99.05-10.31 2.58-14.94-.26 4.85-.14 9.8.09 14.51-1.29 11.82-3.54 22.01-11.61 28.4-22.15 1.3-2 2.51-4.05 3.65-6.15 2.52-3.73 5.24-7.32 7.91-10.94 4.48-5.39 10.07-10.2 12.51-16.95.37-2.23.21-4.49.16-6.73z\"\n        ></Path>\n        <Path\n          fill=\"#fa3153\"\n          stroke=\"#fa3153\"\n          d=\"M432.68 13.53c2.01-1.54 4.01-3.11 5.93-4.76.05 2.24.21 4.5-.16 6.73-2.02-.36-4-.93-5.77-1.97z\"\n        ></Path>\n        <Path\n          fill=\"#131c56\"\n          stroke=\"#131c56\"\n          d=\"M116.42 17.48c6.93-1.4 13-5.2 19.55-7.62 6.3 1.29 12.45 3.36 18.71 4.89-.16 4.08.11 8.18-.42 12.24-10.54 4.6-21.38 8.5-32.5 11.45-6.03.63-12.12.13-18.17.33a88 88 0 0 1-26.18-10.41c1.16-4.05 1.79-8.81 5.59-11.34 10.88 3.01 22.42 2.56 33.42.46z\"\n        ></Path>\n        <Path\n          fill=\"#aab857\"\n          stroke=\"#aab857\"\n          d=\"M442.06 11.02c.52.22 1.57.64 2.1.86 2.15 1.34 4.08 3 6.01 4.65-1.36 5.31-2.92 10.56-4.26 15.88-1.2 4.4-2.94 8.63-4.43 12.93-4.86 12.65-13.75 24.43-26.53 29.76l-1.38.51c.57-5.29 1.3-10.57 2.25-15.8 1.87-8.65 6.06-16.64 11.38-23.65 4.65-6.68 10.81-12.58 13.43-20.47.51-1.55.96-3.11 1.43-4.67z\"\n        ></Path>\n        <Path\n          fill=\"#fd4648\"\n          stroke=\"#fd4648\"\n          d=\"M415.19 29.04a121.6 121.6 0 0 1 17.49-15.51c1.77 1.04 3.75 1.61 5.77 1.97-2.44 6.75-8.03 11.56-12.51 16.95.72-2.08 1.76-4.03 3.03-5.82-2.54-.4-5.08-1.36-7.68-1.06-2.24.73-4.19 2.13-6.1 3.47z\"\n        ></Path>\n        <Path\n          fill=\"#290d62\"\n          stroke=\"#290d62\"\n          d=\"M154.68 14.75c4.12 1.27 8.54 2.23 11.83 5.21-3.47 3.28-7.86 5.29-12.25 7.03.53-4.06.26-8.16.42-12.24z\"\n        ></Path>\n        <Path\n          fill=\"#210038\"\n          stroke=\"#210038\"\n          d=\"M450.77 14.28c2.2 2.6.5 6 .48 8.99 3.39-2.37 5.29-6.31 8.86-8.49.78 2.2 2.82 1.86 4.64 1.68-.13 1.3-.27 2.6-.43 3.89-2.36 3.36-5.32 6.58-5.95 10.8-.66.68-1.29 1.39-1.92 2.09.35.45.71.91 1.07 1.36-3.95 2.83-7.01 6.6-10.39 10.02-.46-.24-1.38-.72-1.83-.95-.41-3.8 2.58-7.63.61-11.26 1.34-5.32 2.9-10.57 4.26-15.88z\"\n        ></Path>\n        <Path\n          fill=\"#3d005b\"\n          stroke=\"#3d005b\"\n          d=\"M345.12 17.42c6.82-2.69 13.61 1.81 20.24 3.16 11.31 4.56 23.7 4.12 35.64 3.5 5.22-.19 10.3-2.69 15.55-1.63-3.56 2.01-7.02 4.6-11.19 5.12-6.41.85-12.9.89-19.35.76-13.36-.43-26.28-4.19-38.92-8.22-.66-.9-1.32-1.79-1.97-2.69z\"\n        ></Path>\n        <Path\n          fill=\"#37005a\"\n          stroke=\"#37005a\"\n          d=\"M264.7 26.11c6.25-2.17 11.87-5.63 17.48-9.05-.5 3.42-3.24 5.67-5.42 8.08.41 4.57-4.97 5.68-6.92 9.11-5.63 3.13-10.41 7.4-15.03 11.84-3.36-.18-4.36-3.42-5.41-6.04 4.72-5.05 9.64-9.94 15.3-13.94z\"\n        ></Path>\n        <Path\n          fill=\"#110027\"\n          stroke=\"#110027\"\n          d=\"M468.67 24.79c13.55-5.78 29.04-7.38 43.33-3.53v6.16c-11.6-3.32-24.33-3.07-35.8.7-8.06 2.89-15.35 7.66-21.89 13.12-5.49 4.57-9.53 10.52-14.17 15.87-2.03-4.04 2.83-7.55 1.34-11.77 1.49-4.3 3.23-8.53 4.43-12.93 1.97 3.63-1.02 7.46-.61 11.26.45.23 1.37.71 1.83.95 3.38-3.42 6.44-7.19 10.39-10.02-.36-.45-.72-.91-1.07-1.36.63-.7 1.26-1.41 1.92-2.09 3.04-2.69 6.62-4.68 10.3-6.36z\"\n        ></Path>\n        <Path\n          fill=\"#5b007a\"\n          stroke=\"#5b007a\"\n          d=\"M0 19.37c5.5.72 11.35 2.14 15.22 6.42 9.8 9.44 17.13 23.61 13.77 37.4C19.88 56 11.25 47.47 0 43.74z\"\n        ></Path>\n        <Path\n          fill=\"#0ea9a9\"\n          stroke=\"#0ea9a9\"\n          d=\"M335.25 22.15c.86-.87 1.75-1.73 2.74-2.47 5.41.85 9.93 4.32 15.09 6 15.01 5.26 31.18 6.13 46.97 5.69 2.61-.02 5.2-.38 7.74-1.02-9.75 6.54-16.28 16.99-26.66 22.7-7.55 4.46-16.71 6.55-25.33 4.32-10.1-4.58-16.89-14.49-20.12-24.84-1.21-3.35-.85-6.92-.43-10.38z\"\n        ></Path>\n        <Path\n          fill=\"#3bccbd\"\n          stroke=\"#3bccbd\"\n          d=\"M298.81 22.63c1.29-.45 2.55-1.21 3.95-1.25 1.93.43 3.54 1.68 5.26 2.59-6.41 5.7-14 9.8-22 12.8-.29-1.52-.56-3.05-.9-4.56l-1.31-.56c4.84-2.5 8.96-6.14 12.77-10 .56.24 1.67.74 2.23.98z\"\n        ></Path>\n        <Path\n          fill=\"#12072f\"\n          stroke=\"#12072f\"\n          d=\"M332.84 30.73c.21-3.44-.21-7.22 1.97-10.14l.44 1.56c-.42 3.46-.78 7.03.43 10.38 3.23 10.35 10.02 20.26 20.12 24.84 1.26 1.5 2.96 2.43 4.8 3.04-1.02.78-2.04 1.57-3.06 2.33-.33.01-.99.03-1.32.03.76.94 1.51 1.87 2.28 2.8-.93 1.65-1.87 3.29-2.8 4.94-.48-.04-1.45-.11-1.93-.15-1.76-4.32-4.55-8.1-7.82-11.38-7.1-7.24-12.04-16.29-15.67-25.68.34-1.29.68-2.59 1.03-3.88.5.43 1.02.87 1.53 1.31z\"\n        ></Path>\n        <Path\n          fill=\"#10000f\"\n          stroke=\"#10000f\"\n          d=\"M159.57 28.56c3.14-1.83 6.05-4.76 10.02-4.19a108.4 108.4 0 0 1-33.64 15.07c-12.2 3.21-24.93 5.3-36.18 11.32-8.29 4.4-17.02 8-25.06 12.87 4.32-6.87 13.3-7.71 19.18-12.75-.65-1.14-1.29-2.27-1.93-3.4 2.66.3 5.4.37 8-.41 3.28-1.09 6.64-1.9 9.95-2.89 6.26-2.02 12.61-3.69 18.98-5.3 10.29-3.17 21.38-4.54 30.68-10.32z\"\n        ></Path>\n        <Path\n          fill=\"#ff6359\"\n          stroke=\"#ff6359\"\n          d=\"M421.29 25.57c2.6-.3 5.14.66 7.68 1.06-1.27 1.79-2.31 3.74-3.03 5.82-2.67 3.62-5.39 7.21-7.91 10.94.58-3.12 3.75-6.14 1.85-9.35-.94-2.22-3.37-3.17-5.2-4.5l.51-.5c1.91-1.34 3.86-2.74 6.1-3.47z\"\n        ></Path>\n        <Path\n          fill=\"#fdeeae\"\n          stroke=\"#fdeeae\"\n          d=\"M476.2 28.12c11.47-3.77 24.2-4.02 35.8-.7v21.6c-2.45-1.23-4.99-2.29-7.63-3.03-10.72-3.59-22.48-2.9-33.2.32-10.37 3.33-18.81 10.84-25.72 19.02-4.56 4.7-8.88 9.7-14.1 13.7a51 51 0 0 0-7.15 3.34c-2.8-1.55-5.99-1.96-9.13-2.22 1.65-1.21 3.16-2.59 4.49-4.15 8.03-4.87 15.14-11.2 20.58-18.89 4.64-5.35 8.68-11.3 14.17-15.87 6.54-5.46 13.83-10.23 21.89-13.12z\"\n        ></Path>\n        <Path\n          fill=\"#5a006f\"\n          stroke=\"#5a006f\"\n          d=\"M300.44 34.5c3.57-2.05 6.47-5.29 10.47-6.53-1.67 4.26-5.11 7.46-7.88 11.01-9.93 11.31-24.62 17.23-39.04 20.27-1.81-1.77-2.96-4.17-2.72-6.74 6.19-2.27 11.41-6.52 17.66-8.64 7.4-2.53 14.76-5.37 21.51-9.37z\"\n        ></Path>\n        <Path\n          fill=\"#eb0047\"\n          stroke=\"#eb0047\"\n          d=\"M316.69 50.44c4.51-7.04 10.16-13.51 12.69-21.64.17 1.52.46 3.03.9 4.5 3.63 9.39 8.57 18.44 15.67 25.68 3.27 3.28 6.06 7.06 7.82 11.38.84 1.86 1.7 3.72 2.57 5.57.51 1.58.21 3.32-1.46 4.02-2.62 1.61-5.44 3.86-8.7 3.3-5.17-5.15-11.23-9.27-17.43-13.09-4.83-2.98-10.32-4.54-15.54-6.65-.58-4.66 1.07-9.15 3.48-13.07z\"\n        ></Path>\n        <Path\n          fill=\"#0d0121\"\n          stroke=\"#0d0121\"\n          d=\"M184.3 34.15a24.8 24.8 0 0 0 6.55-4.81c1.11 1.49 2.13 3.06 3.48 4.35 3.1.33 6.48-.39 9.14 1.77-10.24 1.52-19.67 6.14-28.27 11.73-5.46 3.71-10.99 7.7-14.79 13.19-1.2 1.9-3.01 4.25-1.44 6.46-.42-.1-1.27-.29-1.69-.39q-.885-.96-1.71-1.95c-1.8-.23-3.55.04-4.83 1.46-11.39-6.28-25.01-9.95-37.87-6.28 5.08 1.46 10.29 2.68 15 5.16 7.07 3.3 13.11 8.31 19.21 13.09l-2.78.56c-2.86-1.76-5.51-3.88-8.64-5.2-.07 2.55.28 5.24-.86 7.62-1.47 3.29-2.05 6.87-3.34 10.22-.32-.58-.94-1.74-1.25-2.31 1.37-5.34 2.69-11.03 1.27-16.5-.44-1.92-2.3-2.96-3.58-4.26-2.08 3.37-3.76 6.97-5.14 10.68-3.44 8.87-10.18 15.8-15.31 23.66-4.85 7.81-8.33 16.49-10.26 25.48-.92 3.77-2.01 7.48-3.08 11.21-2.51 5.99-7.06 10.75-11.94 14.9-2.44 1.98-5.1 3.66-7.81 5.23-4.26 2.37-8.71 4.43-13.35 5.94-2.79.82-5.63 1.42-8.49 1.87-1.85-.63-3.71-1.21-5.57-1.77 4.69-1.21 9.66-1.54 13.97-3.92-.59-.3-1.78-.88-2.38-1.17 9.53-3.47 19.07-8.09 26.1-15.59 2.46-2.9 5.64-6.42 4.76-10.52-2.31-4.56-7.94-5.7-12.46-6.85-3.16 6.06-7.6 11.68-13.59 15.14-13.42 7.71-28.95 11.09-44.32 11.5-6.35.77-12.7-.03-19.03-.51v-4.09c9.32.41 18.7.61 27.97-.73 14.1-1.57 29.15-4.73 39.64-15.01 1.53-1.77 4.21-4.34 1.89-6.55 1.02-.38 2.05-.74 3.07-1.1-.2-4.61-2.78-8.55-5.07-12.38-3.11-5.1-6.84-9.77-10.66-14.35l.12-1.21c.86.53 1.72 1.06 2.57 1.6l1.38-3.03c1 2.29 2.2 4.49 3.44 6.65.33-13.58 8.35-25.87 19.19-33.61 15.53-11.45 34.97-15.15 53.58-18.29 16.61-2.85 32.28-9.41 47.18-17.09z\"\n        ></Path>\n        <Path\n          fill=\"#fe875d\"\n          stroke=\"#fe875d\"\n          d=\"M414.68 29.54c1.83 1.33 4.26 2.28 5.2 4.5 1.9 3.21-1.27 6.23-1.85 9.35-1.14 2.1-2.35 4.15-3.65 6.15q-1.065-1.23-2.1-2.46c.15-2.87-.69-5.62-1.67-8.27-1.48-.09-2.8-.6-3.34-2.13 2.48-2.37 5-4.7 7.41-7.14z\"\n        ></Path>\n        <Path\n          fill=\"#35e0ce\"\n          stroke=\"#35e0ce\"\n          d=\"M260.26 45.32c6.39-6.71 15.5-9.54 23.55-13.67l1.31.56c.34 1.51.61 3.04.9 4.56-6.79 2.64-13.66 5.23-19.92 9.03-2.57 1.51-4.96 3.46-7.93 4.12.32-1.68.72-3.44 2.09-4.6z\"\n        ></Path>\n        <Path\n          fill=\"#36c69b\"\n          stroke=\"#36c69b\"\n          d=\"M81.27 34.58c4.99 2.85 10.41 4.82 15.83 6.7 1 1.91 1.94 3.84 2.86 5.79-2.6.78-5.34.71-8 .41-5.31-.91-10.36-2.88-15.23-5.12l-.28-1.92c.7-.05 1.41-.09 2.11-.13.94-.93 1.88-1.85 2.82-2.78-.04-.98-.08-1.97-.11-2.95z\"\n        ></Path>\n        <Path\n          fill=\"#ff9462\"\n          stroke=\"#ff9462\"\n          d=\"M175.2 47.19c8.6-5.59 18.03-10.21 28.27-11.73 4.81-.48 9.66-1.06 14.49-.49 12.11.97 24.72 4.5 33.75 13.03 3.13 3.15 5.74 6.78 7.76 10.73l-1.32 1.44-.59-.32c-2.96-2.05-5.72-4.46-9.03-5.97-10.36-5.15-21.74-9.16-33.48-8.22-11.11.85-22.01 5.7-29.71 13.82-4.71 4.31-8.26 9.68-12.66 14.27-5.04-1.21-8.82-5.25-13.71-6.91-1.57-2.21.24-4.56 1.44-6.46 3.8-5.49 9.33-9.48 14.79-13.19z\"\n        ></Path>\n        <Path\n          fill=\"#ff9c68\"\n          stroke=\"#ff9c68\"\n          d=\"M379.08 59.91c11.42-4.94 19.05-15.23 28.19-23.23.54 1.53 1.86 2.04 3.34 2.13.98 2.65 1.82 5.4 1.67 8.27q1.035 1.23 2.1 2.46c-6.39 10.54-16.58 18.61-28.4 22.15-4.71 1.38-9.66 1.15-14.51 1.29-4.98-1.03-9.91-3.16-12.97-7.41-.77-.93-1.52-1.86-2.28-2.8.33 0 .99-.02 1.32-.03 7.25.22 14.8.27 21.54-2.83z\"\n        ></Path>\n        <Path\n          fill=\"#2e004c\"\n          stroke=\"#2e004c\"\n          d=\"M61.02 42.02c-.07-1.72 2.18-.41 2.96-.11 6.37 3.67 12.22 8.36 19.15 10.99.3.28.9.86 1.2 1.15-3.96 2.53-8.51 3.99-12.3 6.82-2.36 1.83-5.07 3.13-7.94 3.96-.75-.93-1.56-1.82-2.12-2.88-.47-6.64.41-13.37-.95-19.93z\"\n        ></Path>\n        <Path\n          fill=\"#a0ebaa\"\n          stroke=\"#a0ebaa\"\n          d=\"M97.1 41.28c4.18 1.56 8.59 2.43 13.06 2.45l-.25.45c-3.31.99-6.67 1.8-9.95 2.89-.92-1.95-1.86-3.88-2.86-5.79z\"\n        ></Path>\n        <Path\n          fill=\"#29003e\"\n          stroke=\"#29003e\"\n          d=\"M165.97 45.89c4.42-1.45 8.4-4.26 13.12-4.75-3.81 3.17-8.22 5.61-11.77 9.15-2.32 2.51-5.91 3.26-8.12 5.91-1.86 1.75-2.39 4.34-3.3 6.63-.96-.48-1.92-.97-2.87-1.44-1.97.5-4.06 1.76-6.08.74-3.91-1.52-7.88-2.89-11.84-4.31-1.37-.35-2.23-1.49-3.01-2.58 5.07-2.21 10.7-2.33 15.93-4.03 6.13-1.26 11.97-3.51 17.94-5.32z\"\n        ></Path>\n        <Path\n          fill=\"#060121\"\n          stroke=\"#060121\"\n          d=\"M0 43.74C11.25 47.47 19.88 56 28.99 63.19c-.51 1.48-.76 3.03-1.03 4.57C19.95 59.24 10.44 52.23 0 46.98z\"\n        ></Path>\n        <Path\n          fill=\"#0f0227\"\n          stroke=\"#0f0227\"\n          d=\"M471.17 46.31c10.72-3.22 22.48-3.91 33.2-.32-6.59.92-13.14-1.8-19.72-.28-5.09 1.17-10.59 1.02-15.26 3.63-3.94 2.07-8.39 3.58-11.25 7.18 1.3 1.06 2.61 2.12 3.87 3.26-6.83-1.43-13.21 4.86-12.4 11.67-1.06-1.76-1.71-3.7-2.37-5.63l-1.79-.49c6.91-8.18 15.35-15.69 25.72-19.02z\"\n        ></Path>\n        <Path\n          fill=\"#1e003d\"\n          stroke=\"#1e003d\"\n          d=\"M484.65 45.71c6.58-1.52 13.13 1.2 19.72.28 2.64.74 5.18 1.8 7.63 3.03v3.99c-7.88-1.7-15.89-2.76-23.94-3.14-3.12.28-5.92 1.78-8.63 3.21 3.86 2.33 8.66 1.78 12.64 3.87 6.23 3.01 12.93 5.3 19.93 5.21v6.33c-10.32-1.97-19.96-7.52-30.73-6.97 6.72 2.99 12.91 7.09 18.77 11.53 3.9 2.88 8.24 5.13 11.96 8.26V97.4c-7.47-10.12-17.02-18.52-26.54-26.68.36-1.55-.82-2.52-1.92-3.3-4.5-3.18-9.69-6.9-15.48-5.02-1.35-.33-2.72-.58-4.1-.62-.63-.68-1.3-1.35-1.95-2-1.26-1.14-2.57-2.2-3.87-3.26 2.86-3.6 7.31-5.11 11.25-7.18 4.67-2.61 10.17-2.46 15.26-3.63z\"\n        ></Path>\n        <Path\n          fill=\"#0f0226\"\n          stroke=\"#0f0226\"\n          d=\"M185.34 59.48c7.7-8.12 18.6-12.97 29.71-13.82 11.74-.94 23.12 3.07 33.48 8.22-2.25.55-4.58.71-6.89.47-14.11-6.76-32.13-7.72-45.44 1.44-3.69 1.04-6.83 4.22-10.86 3.69z\"\n        ></Path>\n        <Path\n          fill=\"#02000f\"\n          stroke=\"#02000f\"\n          d=\"M414.95 75.1c12.78-5.33 21.67-17.11 26.53-29.76 1.49 4.22-3.37 7.73-1.34 11.77-5.44 7.69-12.55 14.02-20.58 18.89-1.73.85-3.45 1.69-5.16 2.58.18-1.16.37-2.32.55-3.48z\"\n        ></Path>\n        <Path\n          fill=\"#ff9d64\"\n          stroke=\"#ff9d64\"\n          d=\"M0 46.98c10.44 5.25 19.95 12.26 27.96 20.78 10.09 10.02 19.63 20.58 28.88 31.37 3.82 4.58 7.55 9.25 10.66 14.35 2.29 3.83 4.87 7.77 5.07 12.38-5.33-2.01-9.8-5.75-14.14-9.36-7.96-7.34-15.55-15.12-22.52-23.41-8.89-9.81-16.7-20.76-27.24-28.93C6.1 62.14 3.12 60.77 0 59.84z\"\n        ></Path>\n        <Path\n          fill=\"#3d005a\"\n          stroke=\"#3d005a\"\n          d=\"M196.2 55.79c13.31-9.16 31.33-8.2 45.44-1.44 2.92 2.23 6.4 3.81 8.71 6.74-10.56-.03-21.25 1.22-31.13 5.14-9.54 4.45-17.99 12.12-21.9 22.05-1.77 4.09-2.49 8.51-3.61 12.8-2.77-7.14-7.76-13.08-10.71-20.12-1.7-3.7.35-7.65 1.88-11.02 2.55-5.58 6.68-10.21 11.32-14.15z\"\n        ></Path>\n        <Path\n          fill=\"#300048\"\n          stroke=\"#300048\"\n          d=\"M479.43 53.08c2.71-1.43 5.51-2.93 8.63-3.21 8.05.38 16.06 1.44 23.94 3.14v9.15c-7 .09-13.7-2.2-19.93-5.21-3.98-2.09-8.78-1.54-12.64-3.87z\"\n        ></Path>\n        <Path\n          fill=\"#190037\"\n          stroke=\"#190037\"\n          d=\"M241.64 54.35c2.31.24 4.64.08 6.89-.47 3.31 1.51 6.07 3.92 9.03 5.97l.59.32.25.43c.55.16 1.63.48 2.17.64l.08-.72c0 1.49-.01 2.99.12 4.49.49 2.97 1.4 5.91 1.33 8.94-.61 1.42-2.36 1.77-3.47 2.66-.06-.49-.16-1.47-.21-1.96.1-1.8.41-3.59.4-5.4-2.01-2.06-5.41-1.21-8.02-1.49 1.55-1.08 2.96-2.34 4.36-3.61-5.26-.87-10.65-.72-15.85.41-13.32 3.04-28.24 7.5-35.84 19.84-5.25 7.89-5.91 17.72-4.46 26.86-2.49-3.93-5.66-7.41-7.62-11.66-1.14-1.77-2.46-5.09-5.12-3.94-9.39-12.42-22.14-21.95-35.53-29.7 1.28-1.42 3.03-1.69 4.83-1.46q.825.99 1.71 1.95c.42.1 1.27.29 1.69.39 4.89 1.66 8.67 5.7 13.71 6.91 4.4-4.59 7.95-9.96 12.66-14.27 4.03.53 7.17-2.65 10.86-3.69-4.64 3.94-8.77 8.57-11.32 14.15-1.53 3.37-3.58 7.32-1.88 11.02 2.95 7.04 7.94 12.98 10.71 20.12 1.12-4.29 1.84-8.71 3.61-12.8 3.91-9.93 12.36-17.6 21.9-22.05 9.88-3.92 20.57-5.17 31.13-5.14-2.31-2.93-5.79-4.51-8.71-6.74z\"\n        ></Path>\n        <Path\n          fill=\"#fdf1b4\"\n          stroke=\"#fdf1b4\"\n          d=\"M112.87 59.68c12.86-3.67 26.48 0 37.87 6.28 13.39 7.75 26.14 17.28 35.53 29.7 6.73 8.67 9.95 19.27 14.23 29.21 4.99 10.01 11.12 19.62 19.21 27.43 12.28 11.67 31.17 14.59 47.03 9.55 12.45-3.89 22.54-12.48 33.59-19.04 2.78.15 4.45 2.18 4.74 4.83-3.78 3-6.96 6.64-10.57 9.82-6.69 5.4-14.15 9.98-22.38 12.6-10.3 3.69-21.37 3.89-32.19 3.81-12.06.19-23.29-6.5-30.96-15.47-3.56-3.89-6.32-8.39-9.06-12.87-4.56-8.69-8.35-17.75-12.97-26.4-2.93-5.97-6.46-11.73-11.16-16.48-3.09-3.39-6.48-6.5-10.05-9.38-6.29-5.02-12.25-10.46-18.65-15.34-6.1-4.78-12.14-9.79-19.21-13.09-4.71-2.48-9.92-3.7-15-5.16z\"\n        ></Path>\n        <Path\n          fill=\"#120229\"\n          stroke=\"#120229\"\n          d=\"M0 59.84c3.12.93 6.1 2.3 8.67 4.32 10.54 8.17 18.35 19.12 27.24 28.93 6.97 8.29 14.56 16.07 22.52 23.41 4.34 3.61 8.81 7.35 14.14 9.36-1.02.36-2.05.72-3.07 1.1-3.11-.76-6.78-2.73-9.66-.33-9.38 6.31-20.76 8.34-31.74 9.88-9.11 1.55-18.4.76-27.4-1.12-.17-.33-.52-1-.7-1.34v-3.48c10.98 3.13 22.58 2.89 33.79 1.33 3.33-.47 6.65-1 9.98-1.49-.01-.17-.02-.51-.02-.68-2.55-.38-5.1-.82-7.61-1.44-11.28-2.27-21.87-8.4-28.69-17.76-2.04-3.4-4.15-6.82-7.45-9.17v-6.47c.87-.13 1.75-.27 2.62-.4-.79-3.83 1.25-7.24 3.13-10.39.15 1.37.29 2.74.4 4.12-.51 5.04-1.73 10.76 1.32 15.26 5.71 9.34 14.91 16.68 25.49 19.65 8.46 2.32 17.62 3.21 26.05.27-.9-2.94-3.58-4.62-5.73-6.58-11.95-11.2-22.65-23.62-33.09-36.21-.08-1.09.49-2.43-.52-3.28-3.08-3.58-7.22-6.09-10.12-9.85-2.4-3.08-5.96-4.81-9.55-6.1z\"\n        ></Path>\n        <Path\n          fill=\"#db6b6c\"\n          stroke=\"#db6b6c\"\n          d=\"M264.98 62.35c3.57-1.27 7.26-2.15 10.93-3.09 1.59 1.41 3.04 3.16 5.08 3.96 3.71.51 7.48-.05 11.2-.32-8.9 3.05-18.23.63-27.21-.55z\"\n        ></Path>\n        <Path\n          fill=\"#2c0047\"\n          stroke=\"#2c0047\"\n          d=\"M405.89 62.99c1.63-1.53 3.59-2.62 5.8-3.06 1.82 5.27-.36 10.84 1.18 16.07-7.64 4.2-16.51 5.11-24.93 6.82-3.04.81-6.04-.19-8.73-1.57-2.32-2.22-5.1-3.84-8.1-4.98 5.18-.46 10.56-.63 15.3-3.03 7.05-2.18 13.89-5.35 19.48-10.25z\"\n        ></Path>\n        <Path\n          fill=\"#fd2f47\"\n          stroke=\"#fd2f47\"\n          d=\"M449.61 71.45c-.81-6.81 5.57-13.1 12.4-11.67.65.65 1.32 1.32 1.95 2 3.01 4.88 4.49 10.46 6.05 15.92-.44.65-1.32 1.96-1.76 2.62-4.48.32-8.49 2.39-11.95 5.16-3.13-4.21-5.02-9.11-6.69-14.03z\"\n        ></Path>\n        <Path\n          fill=\"#13032e\"\n          stroke=\"#13032e\"\n          d=\"M463.96 61.78c1.38.04 2.75.29 4.1.62 5.79-1.88 10.98 1.84 15.48 5.02 1.1.78 2.28 1.75 1.92 3.3-4.41-3.16-9.11-6.22-14.55-7.19 2.14 13.86 7.01 27.66 16.04 38.57 6.49 7.88 15.7 12.88 25.05 16.61v4.8c-5.3-2.08-10.62-4.19-15.42-7.31-13.38-8.81-22.54-23.14-26.57-38.5-1.56-5.46-3.04-11.04-6.05-15.92z\"\n        ></Path>\n        <Path\n          fill=\"#f7004a\"\n          stroke=\"#f7004a\"\n          d=\"M481.27 61.52c10.77-.55 20.41 5 30.73 6.97v12.82c-3.72-3.13-8.06-5.38-11.96-8.26-5.86-4.44-12.05-8.54-18.77-11.53z\"\n        ></Path>\n        <Path\n          fill=\"#280148\"\n          stroke=\"#280148\"\n          d=\"M0 61.38c3.59 1.29 7.15 3.02 9.55 6.1 2.9 3.76 7.04 6.27 10.12 9.85 1.01.85.44 2.19.52 3.28-2.92-2.48-5.77-5.03-8.44-7.79-2.54 4.87-3.62 10.31-5.6 15.4-.11-1.38-.25-2.75-.4-4.12-1.88 3.15-3.92 6.56-3.13 10.39-.87.13-1.75.27-2.62.4z\"\n        ></Path>\n        <Path\n          fill=\"#4c006d\"\n          stroke=\"#4c006d\"\n          d=\"M72.47 85.54c8.09-11.33 20.24-19.45 33.47-23.57 3.36-1.11 7.07-.27 9.81 1.9-9.45 8.52-19.08 16.84-28.11 25.81-7.21 7.33-12.08 16.64-15.42 26.28-2.5-3.87-4.97-8.23-4.75-12.99-.09-6.14 2.15-12.09 5-17.43z\"\n        ></Path>\n        <Path\n          fill=\"#39005a\"\n          stroke=\"#39005a\"\n          d=\"M239.31 64.56c5.2-1.13 10.59-1.28 15.85-.41-1.4 1.27-2.81 2.53-4.36 3.61-5.11 1.77-9.88 4.33-14.84 6.46 2.84-2.4 4.65-5.93 3.35-9.66z\"\n        ></Path>\n        <Path\n          fill=\"#0aacab\"\n          stroke=\"#0aacab\"\n          d=\"M470.91 63.53c5.44.97 10.14 4.03 14.55 7.19 9.52 8.16 19.07 16.56 26.54 26.68v21.31c-9.35-3.73-18.56-8.73-25.05-16.61-9.03-10.91-13.9-24.71-16.04-38.57z\"\n        ></Path>\n        <Path\n          fill=\"#45006a\"\n          stroke=\"#45006a\"\n          d=\"M203.47 84.4c7.6-12.34 22.52-16.8 35.84-19.84 1.3 3.73-.51 7.26-3.35 9.66-11.23 6.61-21.59 14.96-29.15 25.66-2.81 4.47-4.35 9.6-7.22 14.05-.15-.67-.44-2-.58-2.67-1.45-9.14-.79-18.97 4.46-26.86z\"\n        ></Path>\n        <Path\n          fill=\"#11021d\"\n          stroke=\"#11021d\"\n          d=\"m260.77 65.01 1.33.2c1.79 3.57 3.7 7.2 6.89 9.75 5.11 4.22 9.91 8.79 14.61 13.48 7.14 6.52 13.55 13.78 20.44 20.57 1.56 1.84 3.09 3.69 4.67 5.51-2.45-.46-4.15-2.41-6-3.9-.32-.3-.96-.91-1.28-1.21.37 2.38.85 4.74 1.42 7.08-8.49-9.46-17.14-18.79-25.31-28.54-3.85-4.78-9.38-7.84-13.16-12.69-1.09 4.43-3.34 8.43-5.73 12.28-2.16 3.46-4.46 7.57-2.97 11.76 2.23 5.95 7.78 9.58 12.47 13.48 7.72 5.56 16.29 10.7 25.93 11.79 4.88.53 9.91 1.37 14.75.06l-.11-1.75c1.09.86 1.25 2.19 1.32 3.49-1.72.56-3.74.87-4.57 2.73-7.77 1.28-15.55-.59-22.94-2.87-8.79-3.89-17.02-9.12-23.97-15.78-3.75-3.88-7.17-8.82-7.05-14.44.52-7.06 5.77-12.58 7.12-19.4 1.11-.89 2.86-1.24 3.47-2.66.07-3.03-.84-5.97-1.33-8.94z\"\n        ></Path>\n        <Path\n          fill=\"#feb680\"\n          stroke=\"#feb680\"\n          d=\"M262.1 65.21c4.45.19 8.7 1.59 12.92 2.92-.17.36-.5 1.1-.66 1.47q3.45 1.395 6.81 3.03c1.36 4.38 2.18 8.9 3.74 13.22-.33.65-.99 1.94-1.31 2.59-4.7-4.69-9.5-9.26-14.61-13.48-3.19-2.55-5.1-6.18-6.89-9.75z\"\n        ></Path>\n        <Path\n          fill=\"#2ab390\"\n          stroke=\"#2ab390\"\n          d=\"M283.04 67.44c7.28-.66 14.56-2.48 21.9-1.34 13.41 2.26 26.56 8.05 36.03 18.02 3.79 4.41 7.21 9.88 6.66 15.95.01 8.11-6.72 15.51-14.71 16.48-2.62.36-3.85-2.48-5.16-4.22-6-10.07-13.43-19.17-21.3-27.83-6.96-6.69-14.67-12.87-23.42-17.06z\"\n        ></Path>\n        <Path\n          fill=\"#08b5b4\"\n          stroke=\"#08b5b4\"\n          d=\"M108.34 74.22c3.95-3.47 8.09-7.3 13.49-8.16-1.13 6.33-3.1 12.67-6.92 17.93-4.08 5.81-8.51 12-15.09 15.11.8-4.65 6.55-6.22 6.99-10.91 3.65-2.82 3.42-7.6 4.02-11.73-.78.14-1.56.28-2.35.43-.03-.79-.08-1.57-.13-2.35z\"\n        ></Path>\n        <Path\n          fill=\"#17003a\"\n          stroke=\"#17003a\"\n          d=\"M358.5 65.57c3.06 4.25 7.99 6.38 12.97 7.41 4.63 2.84 9.95.31 14.94.26-4.74 2.4-10.12 2.57-15.3 3.03 3 1.14 5.78 2.76 8.1 4.98-7.15-.93-14.17-2.78-21.07-4.85.24.78.49 1.56.74 2.35-.31-.09-.92-.28-1.22-.37-.47-.8-.91-1.62-1.32-2.45-.87-1.85-1.73-3.71-2.57-5.57.48.04 1.45.11 1.93.15.93-1.65 1.87-3.29 2.8-4.94z\"\n        ></Path>\n        <Path\n          fill=\"#050c2f\"\n          stroke=\"#050c2f\"\n          d=\"M431.35 79.03c5.22-4 9.54-9 14.1-13.7l1.79.49c-1.76 1.99-3.58 4.02-4.16 6.7-1.29 3.02-3.91 5.1-6.21 7.33-5.74 5.38-11.79 10.83-19.26 13.67-4.43 1.67-9.24 1.88-13.92 1.58 1.71-.79 3.38-1.65 5.07-2.49-.49-.34-1.47-1.04-1.96-1.38 2.5-.45 4.95-1.17 7.35-2 2.54-.8 4.93-2 7.25-3.3 3.59-1.88 6.84-4.32 9.95-6.9z\"\n        ></Path>\n        <Path\n          fill=\"#160036\"\n          stroke=\"#160036\"\n          d=\"M447.24 65.82c.66 1.93 1.31 3.87 2.37 5.63 1.67 4.92 3.56 9.82 6.69 14.03 3.39 4.73 6.48 9.66 9.45 14.66-.08 2.43-.1 4.86.03 7.28-1.59-2.4-2.9-5.23-5.51-6.69.55 1.13 1.13 2.24 1.73 3.36-.77.84-1.54 1.67-2.3 2.51-3.07-7.71-7.42-14.79-10.94-22.29-1.98-3.89-3.37-8.07-5.68-11.79.58-2.68 2.4-4.71 4.16-6.7z\"\n        ></Path>\n        <Path\n          fill=\"#10002a\"\n          stroke=\"#10002a\"\n          d=\"M235.96 74.22c4.96-2.13 9.73-4.69 14.84-6.46 2.61.28 6.01-.57 8.02 1.49.01 1.81-.3 3.6-.4 5.4-8.22 3.72-16.02 9.41-20.22 17.59-3.64 7.28-5.04 16.31-1.26 23.83 5.15 10.56 16.26 16.97 27.33 19.66 11.48 2.25 23.54 1.74 34.76-1.64 4.27-1.43 8.73-2.77 12.34-5.58-1.97.11-3.94.34-5.9.59.83-1.86 2.85-2.17 4.57-2.73-.07-1.3-.23-2.63-1.32-3.49-2.04-2.06-4.08-4.11-5.87-6.39-.57-2.34-1.05-4.7-1.42-7.08.32.3.96.91 1.28 1.21 1.53 4.02 4.78 6.95 7.36 10.28 1.6 1.87 3.83 4.69 6.55 2.91 2.32 2.87 4.52 5.83 6.73 8.79 3.81 5.56 7.56 11.16 11.33 16.75-3.25.36-4.34-3.94-6.69-5.58-.79 4.16-.54 8.43-1.23 12.61-.36.09-1.07.26-1.43.35-1.31 2.18-.79 7.16-4.23 6.73 2.7-7 3.48-14.9 1.69-22.18-8.49 3.13-14.82 10.23-20.57 16.97a1129 1129 0 0 1-23.47 28.62c1.9.91 3.82 1.81 5.61 2.94-.75 1.23-1.5 2.47-2.25 3.7-4.1-3.27-8.52-6.16-13.22-8.5a54 54 0 0 0-9.55-3.26c-4.38-1.26-8.96-1.45-13.48-1.28-2.76.12-5.5.53-8.19 1.09-1.29.38-2.59.75-3.78 1.39-.06.87-.18 2.61-.25 3.48-1.46.86-2.51-.28-3.5-1.28.78-1.97 2.35-3.93 2.04-6.14-2.13-2.05-5.17-2.64-7.82-3.72-4.26-2-8.5-4.17-12.09-7.27-1.38-1.16-2.68-2.41-4-3.64-.19-1.16-.39-2.3-.6-3.45.43-.84.87-1.69 1.3-2.53 7.67 8.97 18.9 15.66 30.96 15.47 10.82.08 21.89-.12 32.19-3.81 8.23-2.62 15.69-7.2 22.38-12.6 3.61-3.18 6.79-6.82 10.57-9.82 1.33-1.14 2.65-2.28 4.02-3.39 1.7-1.36 3.41-2.72 5.15-4.03 1.62-1.21 3.29-2.35 4.96-3.49l-2.96-3.44c-1.81 1.1-3.61 2.2-5.4 3.31-1.67 1.03-3.32 2.09-4.99 3.11-1.82 1.08-3.68 2.07-5.52 3.1-11.05 6.56-21.14 15.15-33.59 19.04-15.86 5.04-34.75 2.12-47.03-9.55-8.09-7.81-14.22-17.42-19.21-27.43-4.28-9.94-7.5-20.54-14.23-29.21 2.66-1.15 3.98 2.17 5.12 3.94 1.96 4.25 5.13 7.73 7.62 11.66.14.67.43 2 .58 2.67 2.87-4.45 4.41-9.58 7.22-14.05 7.56-10.7 17.92-19.05 29.15-25.66z\"\n        ></Path>\n        <Path\n          fill=\"#fddb9b\"\n          stroke=\"#fddb9b\"\n          d=\"M275.02 68.13c8.27 2.28 15.26 7.68 21.66 13.12-.01.52-.04 1.55-.05 2.06 3.57 3.84 7.24 7.62 10.45 11.79-1.61.6-3.31.63-4.99.41.73 1.33 1.44 2.68 2.1 4.05l-3.49-.03c1.41 5.35 7.59 7.31 9.37 12.45-4.9-3.45-8.3-8.58-13.15-12.09 1.77 3.5 5.11 5.78 7.12 9.12-6.89-6.79-13.3-14.05-20.44-20.57.32-.65.98-1.94 1.31-2.59-1.56-4.32-2.38-8.84-3.74-13.22a109 109 0 0 0-6.81-3.03c.16-.37.49-1.11.66-1.47z\"\n        ></Path>\n        <Path\n          fill=\"#ff9161\"\n          stroke=\"#ff9161\"\n          d=\"M122.76 78.74c1.38-3.71 3.06-7.31 5.14-10.68 1.28 1.3 3.14 2.34 3.58 4.26 1.42 5.47.1 11.16-1.27 16.5-3.78 12.05-10.25 22.96-16.58 33.8-5.25 9-8.42 19.08-14.04 27.86-.57-.44-1.69-1.32-2.26-1.76.36-1.77 1.89-3.81.61-5.51-2.18-2.65-1.29-6.11-1.08-9.21-.91 1.7-1.85 3.38-2.75 5.09 1.07-3.73 2.16-7.44 3.08-11.21 1.93-8.99 5.41-17.67 10.26-25.48 5.13-7.86 11.87-14.79 15.31-23.66z\"\n        ></Path>\n        <Path\n          fill=\"#1dbfa6\"\n          stroke=\"#1dbfa6\"\n          d=\"M242.25 74.48c4.84-1.83 9.6-4.45 14.83-4.87.15.43.44 1.29.59 1.73-5.2 1.23-9.28 4.95-13.68 7.77-.58-1.54-1.17-3.09-1.74-4.63z\"\n        ></Path>\n        <Path\n          fill=\"#540077\"\n          stroke=\"#540077\"\n          d=\"M6.15 88.22c1.98-5.09 3.06-10.53 5.6-15.4 2.67 2.76 5.52 5.31 8.44 7.79 10.44 12.59 21.14 25.01 33.09 36.21 2.15 1.96 4.83 3.64 5.73 6.58-8.43 2.94-17.59 2.05-26.05-.27-10.58-2.97-19.78-10.31-25.49-19.65-3.05-4.5-1.83-10.22-1.32-15.26z\"\n        ></Path>\n        <Path\n          fill=\"#00556b\"\n          stroke=\"#00556b\"\n          d=\"M443.08 72.52c2.31 3.72 3.7 7.9 5.68 11.79 3.52 7.5 7.87 14.58 10.94 22.29 2.91 7.63 4.15 16.09 2.25 24.11-5.97-6.35-12.96-11.62-20.09-16.58-5.4-4.06-11.85-6.19-17.87-9.08-9.09-3.91-19.08-5.27-28.01-9.6 2.56-.19 5.14-.3 7.71-.35 4.68.3 9.49.09 13.92-1.58 7.47-2.84 13.52-8.29 19.26-13.67 2.3-2.23 4.92-4.31 6.21-7.33z\"\n        ></Path>\n        <Path\n          fill=\"#1e0033\"\n          stroke=\"#1e0033\"\n          d=\"M134.8 80.91c1.14-2.38.79-5.07.86-7.62 3.13 1.32 5.78 3.44 8.64 5.2l2.78-.56c6.4 4.88 12.36 10.32 18.65 15.34 3.57 2.88 6.96 5.99 10.05 9.38.05 1.5.34 2.97.88 4.37.46 1.69.82 3.41 1.26 5.11-2.87-2.14-6.14-3.8-9.71-4.32-11.76-1.27-24.28-.39-34.76 5.55-6.38 3.57-11.27 9.17-15.35 15.13-5.23 6.99-9.17 14.97-11.12 23.5-1.1 4.97-.71 10.13-.11 15.14l.03.66c-1.14 4.19-1.27 9.13 1.78 12.58 1.79 1.86 3.31 3.97 3.45 6.64-2.01-.26-4.01-.59-6.02-.85.12-.46.38-1.37.5-1.82-4.65-3.64-9.43-7.77-11.43-13.52-.58-1.29-.86-2.86-2.1-3.71-3.23 2.68-5.89 6.03-9.53 8.21-.07-1.74-.15-3.48-.26-5.21l.12-.11c2.12-1.89 4.22-3.81 6.15-5.89 3.85-4.16 6.93-8.92 10.03-13.63 5.62-8.78 8.79-18.86 14.04-27.86 6.33-10.84 12.8-21.75 16.58-33.8.31.57.93 1.73 1.25 2.31 1.29-3.35 1.87-6.93 3.34-10.22z\"\n        ></Path>\n        <Path\n          fill=\"#19b9b7\"\n          stroke=\"#19b9b7\"\n          d=\"M99.13 83.02c3.08-2.82 5.96-5.85 9.22-8.48.05.78.1 1.56.13 2.35.79-.15 1.57-.29 2.35-.43-.6 4.13-.37 8.91-4.02 11.73-.44 4.69-6.19 6.26-6.99 10.91-.46 1.62-2.1 2.36-3.32 3.33-6.88 4.55-13.03 10.12-20.12 14.36-.25-5.81 2.59-11.08 5.68-15.79 4.71-6.85 11.04-12.34 17.07-17.98z\"\n        ></Path>\n        <Path\n          fill=\"#3ecbba\"\n          stroke=\"#3ecbba\"\n          d=\"M219.25 90.05c6.74-6.42 14.69-11.42 23-15.57.57 1.54 1.16 3.09 1.74 4.63-7.72 5.43-12.69 13.67-19.74 19.82-.41-.31-1.24-.93-1.65-1.24-.03-.77-.05-1.55-.07-2.32-.97-.53-1.91-1.08-2.87-1.6-.12-1.19-.27-2.37-.39-3.55z\"\n        ></Path>\n        <Path\n          fill=\"#1ab7ae\"\n          stroke=\"#1ab7ae\"\n          d=\"M238.2 92.24c4.2-8.18 12-13.87 20.22-17.59.05.49.15 1.47.21 1.96-1.35 6.82-6.6 12.34-7.12 19.4-.12 5.62 3.3 10.56 7.05 14.44 6.95 6.66 15.18 11.89 23.97 15.78 5.11 3.43 11.66 3.11 17.35 5.14-.29.91-.57 1.81-.85 2.72-11.22 3.38-23.28 3.89-34.76 1.64-11.07-2.69-22.18-9.1-27.33-19.66-3.78-7.52-2.38-16.55 1.26-23.83z\"\n        ></Path>\n        <Path\n          fill=\"#d80049\"\n          stroke=\"#d80049\"\n          d=\"M258.65 87.54c2.39-3.85 4.64-7.85 5.73-12.28 3.78 4.85 9.31 7.91 13.16 12.69-6.2 1.28-12.68.56-18.89-.41z\"\n        ></Path>\n        <Path\n          fill=\"#08001e\"\n          stroke=\"#08001e\"\n          d=\"m412.87 76 .7-.39 1.38-.51c-.18 1.16-.37 2.32-.55 3.48-1.04.53-2.07 1.07-3.11 1.59-8.11 3.37-16.66 5.75-25.39 6.68 6 4.39 13.69 5.29 20.9 4.38.49.34 1.47 1.04 1.96 1.38-1.69.84-3.36 1.7-5.07 2.49-2.57.05-5.15.16-7.71.35 8.93 4.33 18.92 5.69 28.01 9.6 6.02 2.89 12.47 5.02 17.87 9.08 7.13 4.96 14.12 10.23 20.09 16.58 1.7 2.36 3.78 4.41 6.04 6.23 8.46 8.32 16.95 17.35 28.34 21.58 5 1.9 10.31 2.96 15.67 3v4.7c-4.69-.42-9.47-.38-14-1.78-5.3-1.58-10.17-4.27-14.85-7.17-8.84-6.59-15.22-15.7-23.09-23.3-9.31-8.93-19.21-17.63-31.09-22.98-14.46-6.79-30.66-9.84-43.95-19.06-6.8-4.88-13.92-9.58-21.98-12.07-1.39-.39-2.79-.74-4.16-1.11-.25-.79-.5-1.57-.74-2.35 6.9 2.07 13.92 3.92 21.07 4.85 2.69 1.38 5.69 2.38 8.73 1.57 8.42-1.71 17.29-2.62 24.93-6.82z\"\n        ></Path>\n        <Path\n          fill=\"#360051\"\n          stroke=\"#360051\"\n          d=\"M44.15 78.09c3.6 2.05 8.27 1.21 10.39-2.5.73 2.07 1.19 4.22 1.14 6.43-.08 4.4 1.49 8.58 1.94 12.92-3.12-1.22-5.02-4.1-7.32-6.36-2.64-2.9-5.85-5.28-8.13-8.5.64-.68 1.3-1.35 1.98-1.99z\"\n        ></Path>\n        <Path\n          fill=\"#6e0033\"\n          stroke=\"#6e0033\"\n          d=\"M356.34 75.93c.41.83.85 1.65 1.32 2.45.3.09.91.28 1.22.37 1.37.37 2.77.72 4.16 1.11-4.53-1.6-8.82 1.14-12.27 3.81l.81 1.1c-1.48-.3-2.97-.49-4.44-.75-.24-.19-.72-.57-.96-.77 3.26.56 6.08-1.69 8.7-3.3 1.67-.7 1.97-2.44 1.46-4.02z\"\n        ></Path>\n        <Path\n          fill=\"#dce6b3\"\n          stroke=\"#dce6b3\"\n          d=\"M414.4 78.58c1.71-.89 3.43-1.73 5.16-2.58a26.4 26.4 0 0 1-4.49 4.15c3.14.26 6.33.67 9.13 2.22a51 51 0 0 1 7.15-3.34c-3.11 2.58-6.36 5.02-9.95 6.9-2.26.36-4.46 1.37-6.75 1.38-2.9-1.73-5.77-3.57-9.08-4.46 1.97-.75 3.86-1.69 5.72-2.68 1.04-.52 2.07-1.06 3.11-1.59z\"\n        ></Path>\n        <Path\n          fill=\"#5f0032\"\n          stroke=\"#5f0032\"\n          d=\"M137.47 77.14c4.45.8 7.51 4.81 10.78 7.67 5.89 5.75 12.17 11.27 16.56 18.31-2.58 1.82-5.85 1.16-8.8 1.27-5.06-.24-9.99 1.07-14.9 2.11-5.34 1.3-9.7 4.95-14.92 6.56 1.17-3.84 3.26-7.28 5.13-10.79 3.96-7.8 5.24-16.54 6.15-25.13z\"\n        ></Path>\n        <Path\n          fill=\"#fe4848\"\n          stroke=\"#fe4848\"\n          d=\"M470.01 77.7c4.03 15.36 13.19 29.69 26.57 38.5.02 1.19-.34 2.6.59 3.58 2.36 3.11 4.38 6.45 6.43 9.76-.63.17-1.89.52-2.53.69.86.67 1.73 1.34 2.61 1.99-17.21-3.47-29.04-17.98-37.93-32.08-2.97-5-6.06-9.93-9.45-14.66 3.46-2.77 7.47-4.84 11.95-5.16.44-.66 1.32-1.97 1.76-2.62z\"\n        ></Path>\n        <Path\n          fill=\"#fdf0b2\"\n          stroke=\"#fdf0b2\"\n          d=\"M350.77 83.67c3.45-2.67 7.74-5.41 12.27-3.81 8.06 2.49 15.18 7.19 21.98 12.07 13.29 9.22 29.49 12.27 43.95 19.06 11.88 5.35 21.78 14.05 31.09 22.98 7.87 7.6 14.25 16.71 23.09 23.3.93 3.13 4.08 4.4 6.69 5.84 4.73 2.35 9.79 4.42 15.13 4.66 2.36.14 4.75.3 7.03 1.02v8.77c-9.11.27-18.62-.57-26.8-4.91-11.49-5.91-19.94-15.97-28.1-25.7-4.64-5.7-9.69-11.03-14.72-16.38-5.22-5.95-12.51-9.53-19.71-12.49q-2.34-.9-4.71-1.68c-8.6-3.24-17.35-6.07-25.97-9.28-12.85-4.03-23.5-12.52-35.05-19.09-1.75-1.15-3.56-2.21-5.36-3.26z\"\n        ></Path>\n        <Path\n          fill=\"#39cab7\"\n          stroke=\"#39cab7\"\n          d=\"M385.9 86.85c8.73-.93 17.28-3.31 25.39-6.68-1.86.99-3.75 1.93-5.72 2.68-1.82.69-3.67 1.31-5.52 1.89-3.39 1-6.84 1.82-10.09 3.21 4.87 2.84 10.67 3.31 16.17 2.65 2.69-.36 5.35-.9 8.02-1.37-2.4.83-4.85 1.55-7.35 2-7.21.91-14.9.01-20.9-4.38z\"\n        ></Path>\n        <Path\n          fill=\"#fee6a4\"\n          stroke=\"#fee6a4\"\n          d=\"M296.63 83.31c.01-.51.04-1.54.05-2.06 9.89 8.53 17.61 19.26 24.96 29.97-1.05 3.2 1.81 5.71 2.28 8.72-.42 1.24-1.67 1.93-2.52 2.85 4.11 1.97 4.23 6.89 5.66 10.66-1.23-.31-2.47-.61-3.71-.85-2.21-2.96-4.41-5.92-6.73-8.79-2.53-3.18-5.06-6.39-7.91-9.29-1.58-1.82-3.11-3.67-4.67-5.51-2.01-3.34-5.35-5.62-7.12-9.12 4.85 3.51 8.25 8.64 13.15 12.09-1.78-5.14-7.96-7.1-9.37-12.45l3.49.03c-.66-1.37-1.37-2.72-2.1-4.05 1.68.22 3.38.19 4.99-.41-3.21-4.17-6.88-7.95-10.45-11.79z\"\n        ></Path>\n        <Path\n          fill=\"#bae6ba\"\n          stroke=\"#bae6ba\"\n          d=\"M400.05 84.74c1.85-.58 3.7-1.2 5.52-1.89 3.31.89 6.18 2.73 9.08 4.46 2.29-.01 4.49-1.02 6.75-1.38-2.32 1.3-4.71 2.5-7.25 3.3-2.67.47-5.33 1.01-8.02 1.37-3.18-.51-4.81-3.23-6.08-5.86z\"\n        ></Path>\n        <Path\n          fill=\"#20003a\"\n          stroke=\"#20003a\"\n          d=\"M347.14 84.02c1.47.26 2.96.45 4.44.75 1.8 1.05 3.61 2.11 5.36 3.26 1.25 2.45 3.5 4.25 4.44 6.89-5.38 7.24-3.24 17.05-1.23 25.13-1.58 2.62.98 5.1.64 7.71-5.6-.42-11.2-.97-16.81-.27 3.43.08 6.95.03 10.21 1.29-5.6-.31-11.36-.66-16.85.76-3.59-2.16-5.34-6.08-7.37-9.55 7.74.34 15.41-4.89 17.84-12.25 1.83-4.99 2.46-10.76.34-15.75-1.16-2.51-.67-5.31-1.01-7.97z\"\n        ></Path>\n        <Path\n          fill=\"#98e2bd\"\n          stroke=\"#98e2bd\"\n          d=\"M389.96 87.95c3.25-1.39 6.7-2.21 10.09-3.21 1.27 2.63 2.9 5.35 6.08 5.86-5.5.66-11.3.19-16.17-2.65z\"\n        ></Path>\n        <Path\n          fill=\"#f1004b\"\n          stroke=\"#f1004b\"\n          d=\"M258.65 87.54c6.21.97 12.69 1.69 18.89.41 8.17 9.75 16.82 19.08 25.31 28.54 1.79 2.28 3.83 4.33 5.87 6.39l.11 1.75c-4.84 1.31-9.87.47-14.75-.06-9.64-1.09-18.21-6.23-25.93-11.79-4.69-3.9-10.24-7.53-12.47-13.48-1.49-4.19.81-8.3 2.97-11.76z\"\n        ></Path>\n        <Path\n          fill=\"#0b0223\"\n          stroke=\"#0b0223\"\n          d=\"M356.94 88.03c11.55 6.57 22.2 15.06 35.05 19.09 8.62 3.21 17.37 6.04 25.97 9.28-4.81 1.38-9.42-.86-13.79-2.59-1.32-.76-2.54.51-3.72.99-6.93-2.77-14.14-4.88-20.66-8.61-6.48-3.2-11.89-8.17-18.41-11.27-.94-2.64-3.19-4.44-4.44-6.89z\"\n        ></Path>\n        <Path\n          fill=\"#55d5c0\"\n          stroke=\"#55d5c0\"\n          d=\"M208.02 103.57c2.77-5.15 7.07-9.32 11.25-13.35.12 1.18.27 2.36.39 3.55.96.52 1.9 1.07 2.87 1.6.02.77.04 1.55.07 2.32.41.31 1.24.93 1.65 1.24-5.33 5-10.64 10.04-15.75 15.28l-2.49-4.23 2.61-1.35c-.22-1.68-.44-3.37-.6-5.06z\"\n        ></Path>\n        <Path\n          fill=\"#ff7d52\"\n          stroke=\"#ff7d52\"\n          d=\"M361.38 94.92c6.52 3.1 11.93 8.07 18.41 11.27 6.52 3.73 13.73 5.84 20.66 8.61l-.32.18c-5.84 2.35-11.21 6.2-14.51 11.64-3.54 5.77-4.72 12.79-3.94 19.47-7.15-8.67-17.45-15.07-21.53-26.04-2.01-8.08-4.15-17.89 1.23-25.13z\"\n        ></Path>\n        <Path\n          fill=\"#0b7860\"\n          stroke=\"#0b7860\"\n          d=\"M206.41 125.97c5.93-11.6 17.05-19.13 25.36-28.83-2.62 6.44-3.26 13.88-.38 20.36 3.73 11.1 13.9 18.59 24.48 22.59 7.98 3.11 16.72 2.57 25.11 2.25 5.4-.21 10.6-1.99 16.02-2.05-9.54 5.73-17.88 14.02-29.04 16.57-7.12 2.29-14.69 2-22.06 1.71-10.45-1.14-20.6-6-27.5-14.03-5.19-5.33-9.12-11.73-11.99-18.57z\"\n        ></Path>\n        <Path\n          fill=\"#310049\"\n          stroke=\"#310049\"\n          d=\"M96.92 106.11c2.8-1.89 4.83-4.83 8.08-6.04-1.21 4.14-3.56 7.81-4.91 11.9-1.21 2.86-2.51 5.73-4.33 8.26.53-4.03 1.3-8.03 2.02-12.03-1.3.25-2.59.5-3.87.79.86-1.1 1.85-2.09 3.01-2.88z\"\n        ></Path>\n        <Path\n          fill=\"#120048\"\n          stroke=\"#120048\"\n          d=\"M460.27 100.73c2.61 1.46 3.92 4.29 5.51 6.69.13.36.38 1.06.51 1.41 1.02 4.09 3.44 7.83 3.48 12.13.14 5.37.25 10.91-1.78 15.98-2.26-1.82-4.34-3.87-6.04-6.23 1.9-8.02.66-16.48-2.25-24.11.76-.84 1.53-1.67 2.3-2.51-.6-1.12-1.18-2.23-1.73-3.36z\"\n        ></Path>\n        <Path\n          fill=\"#120026\"\n          stroke=\"#120026\"\n          d=\"M465.75 100.14c8.89 14.1 20.72 28.61 37.93 32.08-1.85 1.02-3.88 1.63-5.94 2.02-.28.76-.54 1.52-.8 2.28-13.36-4.87-22.81-16.34-30.65-27.69-.13-.35-.38-1.05-.51-1.41-.13-2.42-.11-4.85-.03-7.28z\"\n        ></Path>\n        <Path\n          fill=\"#fd9360\"\n          stroke=\"#fd9360\"\n          d=\"M0 101.36c3.3 2.35 5.41 5.77 7.45 9.17 6.82 9.36 17.41 15.49 28.69 17.76-.49.24-1.48.71-1.97.95-.1.66-.29 2-.38 2.66-11.21 1.56-22.81 1.8-33.79-1.33z\"\n        ></Path>\n        <Path\n          fill=\"#140123\"\n          stroke=\"#140123\"\n          d=\"M175.78 102.65c4.7 4.75 8.23 10.51 11.16 16.48 4.62 8.65 8.41 17.71 12.97 26.4-1.23-.44-2.33-1.16-3.33-1.98-.98-.09-1.97-.17-2.94-.24-2.08-3.8-3.39-8.04-6.11-11.47-.51.56-1.53 1.7-2.04 2.26l-.6.6c.5-1.44 1-2.87 1.44-4.32 1.04-2.98-.18-6.07-1.06-8.91-2-5.26-3.84-11-8.61-14.45-.54-1.4-.83-2.87-.88-4.37z\"\n        ></Path>\n        <Path\n          fill=\"#72d9bf\"\n          stroke=\"#72d9bf\"\n          d=\"M203.16 120.25c-1.83-6.01 1.85-11.74 4.86-16.68.16 1.69.38 3.38.6 5.06l-2.61 1.35 2.49 4.23c-1.78 2.01-3.43 4.15-5.34 6.04z\"\n        ></Path>\n        <Path\n          fill=\"#fc1746\"\n          stroke=\"#fc1746\"\n          d=\"M133.45 113.36c10.48-5.94 23-6.82 34.76-5.55 3.57.52 6.84 2.18 9.71 4.32.73 1.6 1.46 3.2 2.18 4.81-5.66.8-11.41 1.05-16.94 2.61-8.62 2.01-16.54 6.11-24.1 10.59-5.7 3.52-10.54 8.28-14.64 13.54-1.6-5.28-3.09-10.6-6.32-15.19 4.08-5.96 8.97-11.56 15.35-15.13z\"\n        ></Path>\n        <Path\n          fill=\"#0d0230\"\n          stroke=\"#0d0230\"\n          d=\"M176.66 107.02c4.77 3.45 6.61 9.19 8.61 14.45.88 2.84 2.1 5.93 1.06 8.91l-.6-.81c-1.02-1.95-1.53-4.52-3.71-5.53-17.48-.02-36.1 4.54-48.83 17.19-7.06 7.69-12.42 17.37-13.58 27.86-.45 3.65-.64 7.32-1.11 10.97l-.13.58c-.52.01-1.05.05-1.56.11q-.87 1.335-2.07 2.34c-.33-.18-1-.53-1.34-.71.76-.49 1.49-1.01 2.21-1.55-.82-6.7-.41-13.54 1-20.14.29-.83.59-1.66.88-2.49 1.67-5.11 3.76-10.14 6.93-14.52 4.1-5.26 8.94-10.02 14.64-13.54 7.56-4.48 15.48-8.58 24.1-10.59 5.53-1.56 11.28-1.81 16.94-2.61-.72-1.61-1.45-3.21-2.18-4.81-.44-1.7-.8-3.42-1.26-5.11z\"\n        ></Path>\n        <Path\n          fill=\"#4b0060\"\n          stroke=\"#4b0060\"\n          d=\"M93.91 108.99c1.28-.29 2.57-.54 3.87-.79-.72 4-1.49 8-2.02 12.03-.77 3.69-1.53 7.39-2.66 10.99-3.12-1.54-5.72-4.03-9.06-5.16-2.29-1.03-4.95-1.39-6.9-3.05.29-2.28 2.72-3.29 4.26-4.68 4.32-2.91 8.17-6.47 12.51-9.34z\"\n        ></Path>\n        <Path\n          fill=\"#036259\"\n          stroke=\"#036259\"\n          d=\"M466.29 108.83c7.84 11.35 17.29 22.82 30.65 27.69 4.78 1.95 9.93 2.67 15.06 2.88v22.12c-5.36-.04-10.67-1.1-15.67-3-11.39-4.23-19.88-13.26-28.34-21.58 2.03-5.07 1.92-10.61 1.78-15.98-.04-4.3-2.46-8.04-3.48-12.13z\"\n        ></Path>\n        <Path\n          fill=\"#2b0a38\"\n          stroke=\"#2b0a38\"\n          d=\"M302.71 110.62c1.85 1.49 3.55 3.44 6 3.9 2.85 2.9 5.38 6.11 7.91 9.29-2.72 1.78-4.95-1.04-6.55-2.91-2.58-3.33-5.83-6.26-7.36-10.28z\"\n        ></Path>\n        <Path\n          fill=\"#feeeaf\"\n          stroke=\"#feeeaf\"\n          d=\"M323.92 119.94c-.47-3.01-3.33-5.52-2.28-8.72 4.22 5.92 7.24 12.62 11.75 18.35 2.34 3.01 4.62 6.08 7.06 9.01 9.64 11.47 17.52 24.42 28.57 34.66-2.32.11-4.01-1.62-5.99-2.48-2.7.87-5.11 2.4-7.58 3.76-3.9-3.29-7.27-7.14-10.59-10.99-3.49-4.66-7-9.3-10.18-14.18-3.77-5.59-7.52-11.19-11.33-16.75 1.24.24 2.48.54 3.71.85-1.43-3.77-1.55-8.69-5.66-10.66.85-.92 2.1-1.61 2.52-2.85z\"\n        ></Path>\n        <Path\n          fill=\"#170136\"\n          stroke=\"#170136\"\n          d=\"M400.45 114.8c1.18-.48 2.4-1.75 3.72-.99 4.37 1.73 8.98 3.97 13.79 2.59q2.37.78 4.71 1.68c.22.94.46 1.88.7 2.82-.52.09-1.55.28-2.07.37.15.44.46 1.31.61 1.75-6.45-2.3-13.28-3.65-20.14-2.48-3.87.71-7.34 2.66-10.67 4.66 1.48-2.14 2.66-4.61 4.8-6.2 1.57-1.16 3.11-2.39 4.23-4.02z\"\n        ></Path>\n        <Path\n          fill=\"#170024\"\n          stroke=\"#170024\"\n          d=\"M385.62 126.62c3.3-5.44 8.67-9.29 14.51-11.64-1.12 1.63-2.66 2.86-4.23 4.02-2.14 1.59-3.32 4.06-4.8 6.2-5.52 6.95-7.61 16.52-5.36 25.07 3.01 5.03 4.93 10.57 7.63 15.75 3.2-5.54 6.25-11.22 10.31-16.18-.37 1.9-.31 3.84-.17 5.76-4.49 7.05-8.33 14.5-11.92 22.04l-2.12-.16c-.46-.93-.92-1.85-1.37-2.78 2.03-6.23-1.37-12.08-4.33-17.32-.09-3.86-1.26-7.55-2.09-11.29-.78-6.68.4-13.7 3.94-19.47z\"\n        ></Path>\n        <Path\n          fill=\"#fd634f\"\n          stroke=\"#fd634f\"\n          d=\"M497.17 119.78c-.93-.98-.57-2.39-.59-3.58 4.8 3.12 10.12 5.23 15.42 7.31v9.84c-2.75-.54-5.55-.76-8.32-1.13-.88-.65-1.75-1.32-2.61-1.99.64-.17 1.9-.52 2.53-.69-2.05-3.31-4.07-6.65-6.43-9.76z\"\n        ></Path>\n        <Path\n          fill=\"#120129\"\n          stroke=\"#120129\"\n          d=\"M423.37 120.9c-.24-.94-.48-1.88-.7-2.82 7.2 2.96 14.49 6.54 19.71 12.49 5.03 5.35 10.08 10.68 14.72 16.38 8.16 9.73 16.61 19.79 28.1 25.7 8.18 4.34 17.69 5.18 26.8 4.91v3.11c-8.34 2.38-16.55 5.19-24.86 7.68-1.35-.39-2.66-.81-3.99-1.23.2-.59.58-1.77.78-2.36 3.52-1.12 7.88-1.29 10.36-4.34-6.89-.17-13.75.7-20.64.35-11.09-.84-21.98-6.17-28.58-15.26-5.53-7.27-7.62-16.57-7.63-25.56-7.23 5.59-15.14 11.47-18.47 20.34-.46-.89-.91-1.77-1.36-2.65l-1.31-.16c.56-1.27 1.11-2.54 1.71-3.8l.33-.47c2.62-3.21 5.67-6.03 8.76-8.77 2.49-2.17 5.13-4.15 7.82-6.07.38-.29 1.16-.87 1.55-1.16.46-2.61.3-5.27.07-7.89-1.93.6-3.85 1.25-5.69 2.08a49 49 0 0 0-6.78 3.78c-1.06.7-2.1 1.41-3.13 2.15-2.71-.18-4.88 1.57-7.17 2.7.65-.81 1.28-1.65 1.94-2.45 4.79-4.36 10.87-6.86 16.06-10.67-2.94-2.09-6.38-3.15-9.86-3.89-.15-.44-.46-1.31-.61-1.75.52-.09 1.55-.28 2.07-.37z\"\n        ></Path>\n        <Path\n          fill=\"#36005e\"\n          stroke=\"#36005e\"\n          d=\"M401.77 120.54c6.86-1.17 13.69.18 20.14 2.48 3.48.74 6.92 1.8 9.86 3.89-5.19 3.81-11.27 6.31-16.06 10.67-1.77-2.05-2.02-4.72-2.16-7.31-4.3-2.87-9.6-3.79-13.67-7.05.63-.89 1.26-1.79 1.89-2.68z\"\n        ></Path>\n        <Path\n          fill=\"#080121\"\n          stroke=\"#080121\"\n          d=\"M360.79 127.76c.34-2.61-2.22-5.09-.64-7.71 4.08 10.97 14.38 17.37 21.53 26.04.83 3.74 2 7.43 2.09 11.29-4.59-8.69-11.03-16.27-18.59-22.53-3.15-2.84-6.99-4.75-10.99-6.07-3.26-1.26-6.78-1.21-10.21-1.29 5.61-.7 11.21-.15 16.81.27z\"\n        ></Path>\n        <Path\n          fill=\"#250b59\"\n          stroke=\"#250b59\"\n          d=\"M391.1 125.2c3.33-2 6.8-3.95 10.67-4.66-.63.89-1.26 1.79-1.89 2.68 4.07 3.26 9.37 4.18 13.67 7.05.14 2.59.39 5.26 2.16 7.31-.66.8-1.29 1.64-1.94 2.45-3.9 2.68-7.14 6.14-10.09 9.81-4.06 4.96-7.11 10.64-10.31 16.18-2.7-5.18-4.62-10.72-7.63-15.75-2.25-8.55-.16-18.12 5.36-25.07z\"\n        ></Path>\n        <Path\n          fill=\"#0aa3a7\"\n          stroke=\"#0aa3a7\"\n          d=\"M133.19 141.23c12.73-12.65 31.35-17.21 48.83-17.19 2.18 1.01 2.69 3.58 3.71 5.53-6.67 2.93-11.86 8.16-17.18 12.97-3 2.68-4.83 6.6-8.52 8.48-6.16 3.25-12.28 6.58-18.55 9.61-5.38 2.67-10.9 5.37-15.3 9.55a49.4 49.4 0 0 0-7.68 9.88c.47-3.65.66-7.32 1.11-10.97 1.16-10.49 6.52-20.17 13.58-27.86z\"\n        ></Path>\n        <Path\n          fill=\"#f7004b\"\n          stroke=\"#f7004b\"\n          d=\"M59.84 126.63c2.88-2.4 6.55-.43 9.66.33 2.32 2.21-.36 4.78-1.89 6.55-10.49 10.28-25.54 13.44-39.64 15.01-9.27 1.34-18.65 1.14-27.97.73v-15.2c.18.34.53 1.01.7 1.34 9 1.88 18.29 2.67 27.4 1.12 10.98-1.54 22.36-3.57 31.74-9.88z\"\n        ></Path>\n        <Path\n          fill=\"#2ba7b2\"\n          stroke=\"#2ba7b2\"\n          d=\"M282.53 126.23c7.39 2.28 15.17 4.15 22.94 2.87 1.96-.25 3.93-.48 5.9-.59-3.61 2.81-8.07 4.15-12.34 5.58.28-.91.56-1.81.85-2.72-5.69-2.03-12.24-1.71-17.35-5.14z\"\n        ></Path>\n        <Path\n          fill=\"#ffb485\"\n          stroke=\"#ffb485\"\n          d=\"M36.14 128.29c2.51.62 5.06 1.06 7.61 1.44 0 .17.01.51.02.68-3.33.49-6.65 1.02-9.98 1.49.09-.66.28-2 .38-2.66.49-.24 1.48-.71 1.97-.95z\"\n        ></Path>\n        <Path\n          fill=\"#08a6ad\"\n          stroke=\"#08a6ad\"\n          d=\"M76.94 127.21c4.52 1.15 10.15 2.29 12.46 6.85.88 4.1-2.3 7.62-4.76 10.52-7.03 7.5-16.57 12.12-26.1 15.59-13.11 3.92-26.92 4.22-40.51 4.34-6.09.13-12.02-1.42-18.03-2.15v-9.02c6.33.48 12.68 1.28 19.03.51 15.37-.41 30.9-3.79 44.32-11.5 5.99-3.46 10.43-9.08 13.59-15.14z\"\n        ></Path>\n        <Path\n          fill=\"#fe2645\"\n          stroke=\"#fe2645\"\n          d=\"M106.98 151.99c1.95-8.53 5.89-16.51 11.12-23.5 3.23 4.59 4.72 9.91 6.32 15.19-3.17 4.38-5.26 9.41-6.93 14.52-1.2-1.83-2.21-3.77-3.09-5.76-2.11-.53-4.21-1.08-6.26-1.79-.29.34-.87 1-1.16 1.34z\"\n        ></Path>\n        <Path\n          fill=\"#20b7a8\"\n          stroke=\"#20b7a8\"\n          d=\"M337.34 129.54c5.49-1.42 11.25-1.07 16.85-.76 4 1.32 7.84 3.23 10.99 6.07-.56.59-1.12 1.18-1.67 1.77.92 2.9 1.82 5.82 3.1 8.59-1.57 2.02-3.68 3.51-6.3 3.59-.18.4-.54 1.19-.72 1.58-.36.04-1.08.1-1.43.14.69 1.66 1.25 3.38 1.5 5.17-7.26-8.84-13.26-18.97-22.32-26.15z\"\n        ></Path>\n        <Path\n          fill=\"#ff6e50\"\n          stroke=\"#ff6e50\"\n          d=\"M430.85 131.4c1.84-.83 3.76-1.48 5.69-2.08.23 2.62.39 5.28-.07 7.89-.39.29-1.17.87-1.55 1.16-1.51-2.24-1.89-5.22-4.07-6.97z\"\n        ></Path>\n        <Path\n          fill=\"#080218\"\n          stroke=\"#080218\"\n          d=\"M168.55 142.54c5.32-4.81 10.51-10.04 17.18-12.97l.6.81c-.44 1.45-.94 2.88-1.44 4.32-4.34 4.05-9.45 7.23-13.46 11.65-5 5.05-7.92 12.72-5.52 19.69-1.18-1.22-2.49-2.31-3.81-3.38-1.36 1.25-2.7 2.52-4.2 3.6l-1.63.12c3.42-3.3 5.03-7.88 5.68-12.49-6.56 3.87-13.16 7.67-20.04 10.92-6.72 3.16-13.55 6.79-18.06 12.89-2.18.9.73 2.7.9.52 8.94-1.68 18.34-2.95 26.07-8.15-.16 1.86-.06 3.72.27 5.55-2.4.97-4.82 1.88-7.23 2.82 2.95.39 5.92.73 8.83 1.38.48.35 1.45 1.03 1.94 1.38-.5.53-.99 1.07-1.48 1.61.66.16 2 .48 2.67.64-.33.34-.98 1.04-1.3 1.39-9.93-2.7-20.4-4.69-30.65-2.66-2.2.3-4.04 1.6-5.86 2.77.92 1.04 1.84 2.11 2.81 3.12-2.2-1.24-6.28-1.69-6.08-4.98q1.2-1.005 2.07-2.34c.51-.06 1.04-.1 1.56-.11l.13-.58c2.13-3.6 4.71-6.93 7.68-9.88 4.4-4.18 9.92-6.88 15.3-9.55 6.27-3.03 12.39-6.36 18.55-9.61 3.69-1.88 5.52-5.8 8.52-8.48z\"\n        ></Path>\n        <Path\n          fill=\"#770038\"\n          stroke=\"#770038\"\n          d=\"M187.53 131.84c2.72 3.43 4.03 7.67 6.11 11.47 2.89 5.76 5.93 11.47 9.48 16.85-3.02-1.62-6.2-4.33-9.86-2.92-3.68 4.39.92 10.69-1.51 15.44a73.6 73.6 0 0 1-4.34-17.09c-.39-6.95-1.28-13.93-.25-20.87-.42-.15-1.25-.46-1.67-.62.51-.56 1.53-1.7 2.04-2.26z\"\n        ></Path>\n        <Path\n          fill=\"#ff9768\"\n          stroke=\"#ff9768\"\n          d=\"M424.07 135.18a49 49 0 0 1 6.78-3.78c2.18 1.75 2.56 4.73 4.07 6.97-2.69 1.92-5.33 3.9-7.82 6.07-2.52-2.47-2.92-5.92-3.03-9.26z\"\n        ></Path>\n        <Path\n          fill=\"#1b0033\"\n          stroke=\"#1b0033\"\n          d=\"M503.68 132.22c2.77.37 5.57.59 8.32 1.13v6.05c-5.13-.21-10.28-.93-15.06-2.88.26-.76.52-1.52.8-2.28 2.06-.39 4.09-1 5.94-2.02z\"\n        ></Path>\n        <Path\n          fill=\"#ffab77\"\n          stroke=\"#ffab77\"\n          d=\"M94.11 139.09c.9-1.71 1.84-3.39 2.75-5.09-.21 3.1-1.1 6.56 1.08 9.21 1.28 1.7-.25 3.74-.61 5.51.57.44 1.69 1.32 2.26 1.76-3.1 4.71-6.18 9.47-10.03 13.63-3.25-1.5-5-4.73-7.83-6.74.35-1.09 1.25-2.21.44-3.38 4.88-4.15 9.43-8.91 11.94-14.9z\"\n        ></Path>\n        <Path\n          fill=\"#fe7151\"\n          stroke=\"#fe7151\"\n          d=\"M171.43 146.35c4.01-4.42 9.12-7.6 13.46-11.65l.6-.6c.42.16 1.25.47 1.67.62-1.03 6.94-.14 13.92.25 20.87-.95 1.65-1.51 3.47-1.97 5.31-3.13-1.18-6.52-2.09-9.09-4.33-1.02-2.33-2.35-4.49-5.02-5.14.03-1.69.06-3.39.1-5.08z\"\n        ></Path>\n        <Path\n          fill=\"#3bc2ae\"\n          stroke=\"#3bc2ae\"\n          d=\"M310.84 136.6c1.79-1.11 3.59-2.21 5.4-3.31l2.96 3.44c-1.67 1.14-3.34 2.28-4.96 3.49-1.13-1.21-2.27-2.42-3.4-3.62z\"\n        ></Path>\n        <Path\n          fill=\"#15b0ab\"\n          stroke=\"#15b0ab\"\n          d=\"M365.18 134.85c7.56 6.26 14 13.84 18.59 22.53 2.96 5.24 6.36 11.09 4.33 17.32-1.03 2.06-1.57 4.65-3.48 6.09-1.97-1.84-3.78-3.84-5.91-5.49-7.19-5.66-13.45-12.4-19.05-19.61-.25-1.79-.81-3.51-1.5-5.17.35-.04 1.07-.1 1.43-.14.18-.39.54-1.18.72-1.58 2.62-.08 4.73-1.57 6.3-3.59-1.28-2.77-2.18-5.69-3.1-8.59.55-.59 1.11-1.18 1.67-1.77z\"\n        ></Path>\n        <Path\n          fill=\"#ffab7d\"\n          stroke=\"#ffab7d\"\n          d=\"M420.94 137.33c1.03-.74 2.07-1.45 3.13-2.15.11 3.34.51 6.79 3.03 9.26-3.09 2.74-6.14 5.56-8.76 8.77 1.5-4.26.93-8.82 1.27-13.24-.42 0-1.25.01-1.67.01.99-.9 1.98-1.79 3-2.65z\"\n        ></Path>\n        <Path\n          fill=\"#640070\"\n          stroke=\"#640070\"\n          d=\"M440.92 137.09c.21-1.68 2.17-.7 2.76.12 6.56 6.25 11.43 13.94 17.15 20.9 4.5 5.77 10.15 10.6 16.19 14.69 2.49 1.86 5.99 2.21 8.01 4.66-4.87.22-9.79.52-14.63-.08-10.54-2.29-20.05-9.09-25.46-18.43-3.79-6.55-4.97-14.43-4.02-21.86z\"\n        ></Path>\n        <Path\n          fill=\"#5acbad\"\n          stroke=\"#5acbad\"\n          d=\"M305.85 139.71c1.67-1.02 3.32-2.08 4.99-3.11 1.13 1.2 2.27 2.41 3.4 3.62-1.74 1.31-3.45 2.67-5.15 4.03-1.09-1.51-2.17-3.03-3.24-4.54z\"\n        ></Path>\n        <Path\n          fill=\"#13030e\"\n          stroke=\"#13030e\"\n          d=\"M413.77 140.03c2.29-1.13 4.46-2.88 7.17-2.7-1.02.86-2.01 1.75-3 2.65-.56.48-1.11.98-1.64 1.48-4.71 4.29-9.2 8.87-12.79 14.14-.14-1.92-.2-3.86.17-5.76 2.95-3.67 6.19-7.13 10.09-9.81z\"\n        ></Path>\n        <Path\n          fill=\"#9fd7ad\"\n          stroke=\"#9fd7ad\"\n          d=\"M300.33 142.81c1.84-1.03 3.7-2.02 5.52-3.1 1.07 1.51 2.15 3.03 3.24 4.54-1.37 1.11-2.69 2.25-4.02 3.39-.29-2.65-1.96-4.68-4.74-4.83z\"\n        ></Path>\n        <Path\n          fill=\"#f8cb93\"\n          stroke=\"#f8cb93\"\n          d=\"M416.3 141.46c.53-.5 1.08-1 1.64-1.48.42 0 1.25-.01 1.67-.01-.34 4.42.23 8.98-1.27 13.24l-.33.47c-.44.51-1.3 1.53-1.73 2.04-.51-4.76.6-9.51.02-14.26z\"\n        ></Path>\n        <Path\n          fill=\"#fe5b44\"\n          stroke=\"#fe5b44\"\n          d=\"M418.97 160.29c3.33-8.87 11.24-14.75 18.47-20.34.01 8.99 2.1 18.29 7.63 25.56-.75 5.64-7.24 6.25-10.12 10.33-1.22 1.54-2.71 2.83-4.37 3.86-.22.4-.65 1.21-.87 1.61-1.13.23-2.26.45-3.37.68-3.52-2.71-6.4-6.4-7.67-10.7-.81-3.62-.46-7.4.3-11z\"\n        ></Path>\n        <Path\n          fill=\"#fd8356\"\n          stroke=\"#fd8356\"\n          d=\"M302.22 158.25c5.75-6.74 12.08-13.84 20.57-16.97 1.79 7.28 1.01 15.18-1.69 22.18-.35.99-.71 1.98-1.04 2.98-4.14 9.3-10.66 18.21-20.12 22.55-4.81 1.7-10.31 3.39-15.19 1.06l-.39-.24c-1.79-1.13-3.71-2.03-5.61-2.94 7.98-9.41 15.8-18.95 23.47-28.62z\"\n        ></Path>\n        <Path\n          fill=\"#feeaaf\"\n          stroke=\"#feeaaf\"\n          d=\"M403.51 155.6c3.59-5.27 8.08-9.85 12.79-14.14.58 4.75-.53 9.5-.02 14.26-2.6 3.49-4.9 7.17-7.41 10.72-4.06 6.05-8.24 12.01-12.58 17.86-1.83-1.51-3.83-2.82-6.09-3.56.45-1.04.91-2.07 1.39-3.1 3.59-7.54 7.43-14.99 11.92-22.04z\"\n        ></Path>\n        <Path\n          fill=\"#200339\"\n          stroke=\"#200339\"\n          d=\"M193.64 143.31c.97.07 1.96.15 2.94.24 1 .82 2.1 1.54 3.33 1.98 2.74 4.48 5.5 8.98 9.06 12.87-.43.84-.87 1.69-1.3 2.53.21 1.15.41 2.29.6 3.45-1.62-1.52-3.35-2.91-5.15-4.22-3.55-5.38-6.59-11.09-9.48-16.85z\"\n        ></Path>\n        <Path\n          fill=\"#1e003d\"\n          stroke=\"#1e003d\"\n          d=\"M327.99 143.77c2.35 1.64 3.44 5.94 6.69 5.58 3.18 4.88 6.69 9.52 10.18 14.18.24 2.21 1.02 4.35 2.79 5.78 3.19 2.88 6.21 6.02 7.94 10.03-1.55.44-3.14.75-4.73.97l2-2.09c-6.29-3.19-10.66-8.76-15.31-13.85-3.09-3.92-5.49-8.31-7.7-12.76-1.94 5.93-2.4 12.33-5.39 17.89-3.68 6.69-7.36 14.05-14.32 17.9 2.11-2.77 3.76-5.84 5.27-8.96 1.82-3.91 5.43-7.32 4.65-12 .33-1 .69-1.99 1.04-2.98 3.44.43 2.92-4.55 4.23-6.73.36-.09 1.07-.26 1.43-.35.69-4.18.44-8.45 1.23-12.61z\"\n        ></Path>\n        <Path\n          fill=\"#fe7e53\"\n          stroke=\"#fe7e53\"\n          d=\"M165.91 166.04c-2.4-6.97.52-14.64 5.52-19.69-.04 1.69-.07 3.39-.1 5.08 2.67.65 4 2.81 5.02 5.14 2.57 2.24 5.96 3.15 9.09 4.33.46-1.84 1.02-3.66 1.97-5.31.75 5.85 2.22 11.59 4.34 17.09.98 3.01 2.34 5.9 4 8.61 1.81 2.7 4.18 5.02 6.99 6.68.28.17.82.51 1.1.69-13.01-1.85-25.73-7.57-34.72-17.32-1.09-1.75-2.16-3.52-3.21-5.3z\"\n        ></Path>\n        <Path\n          fill=\"#fe3443\"\n          stroke=\"#fe3443\"\n          d=\"M108.14 150.65c2.05.71 4.15 1.26 6.26 1.79.88 1.99 1.89 3.93 3.09 5.76-.29.83-.59 1.66-.88 2.49a23.2 23.2 0 0 0-3.07 5.75q-2.52-.615-5.04-1.2c-.32-1.78-.64-3.55-.96-5.32-.24 2.4-.5 4.8-.67 7.21-.6-5.01-.99-10.17.11-15.14.29-.34.87-1 1.16-1.34z\"\n        ></Path>\n        <Path\n          fill=\"#3a0058\"\n          stroke=\"#3a0058\"\n          d=\"M324.46 169.5c2.99-5.56 3.45-11.96 5.39-17.89 2.21 4.45 4.61 8.84 7.7 12.76 4.65 5.09 9.02 10.66 15.31 13.85l-2 2.09c-7.41 3.05-14.38 7.1-21.12 11.4-5.05 3.2-8.58 8.14-11.69 13.13-3.43 4.32-5.28 9.64-5.56 15.13-4.91-9.49-12.24-17.84-21.23-23.65.6-.28 1.78-.86 2.37-1.14 6.15-.94 11.48-4.32 16.51-7.78 6.96-3.85 10.64-11.21 14.32-17.9z\"\n        ></Path>\n        <Path\n          fill=\"#310055\"\n          stroke=\"#310055\"\n          d=\"M300.82 154.58c.63-.08 1.26-.16 1.9-.23-5.56 6.62-11.03 13.33-17.8 18.78-.05-.47-.14-1.4-.19-1.87-1.62.31-3.25.61-4.86.97 2.44-3.16 6.5-4.3 9.29-7.07 1.72-1.7 4.2-2.48 5.51-4.61 1.68-2.35 4.3-3.76 6.15-5.97z\"\n        ></Path>\n        <Path\n          fill=\"#17022d\"\n          stroke=\"#17022d\"\n          d=\"M416.28 155.72c.43-.51 1.29-1.53 1.73-2.04-.6 1.26-1.15 2.53-1.71 3.8l1.31.16c.45.88.9 1.76 1.36 2.65-.76 3.6-1.11 7.38-.3 11 1.27 4.3 4.15 7.99 7.67 10.7 7.1 5.09 16.06 6.77 24.65 6.62 8.47-.09 16.91-1.07 25.25-2.47 2.57-.4 5.15-.81 7.69-1.38-.2.59-.58 1.77-.78 2.36 1.33.42 2.64.84 3.99 1.23-3.25 1.03-6.56 1.92-9.95 2.38-12.59 1.81-25.43 4.5-38.15 2.24-5.87-.92-10.66-4.63-15.86-7.2-1.1-.76-2.15-1.59-3.2-2.41l3.34.09c-1.61-1.29-3.32-2.46-4.85-3.84-3.39-4.55-4.4-10.25-5.04-15.76-1.06 1.69-2.11 3.39-3.12 5.12-.36-.64-1.08-1.9-1.44-2.53 2.51-3.55 4.81-7.23 7.41-10.72z\"\n        ></Path>\n        <Path\n          fill=\"#ffd08f\"\n          stroke=\"#ffd08f\"\n          d=\"M74.36 159.22c2.71-1.57 5.37-3.25 7.81-5.23.81 1.17-.09 2.29-.44 3.38 2.83 2.01 4.58 5.24 7.83 6.74-1.93 2.08-4.03 4-6.15 5.89-4.48-1.16-6.76-5.58-10.93-7.28 1-.96 2.45-1.85 1.88-3.5z\"\n        ></Path>\n        <Path\n          fill=\"#ff775a\"\n          stroke=\"#ff775a\"\n          d=\"M141.91 164.81c6.88-3.25 13.48-7.05 20.04-10.92-.65 4.61-2.26 9.19-5.68 12.49-1.83 1.22-3.6 2.51-5.45 3.69-7.73 5.2-17.13 6.47-26.07 8.15l-.9-.52c4.51-6.1 11.34-9.73 18.06-12.89z\"\n        ></Path>\n        <Path\n          fill=\"#870038\"\n          stroke=\"#870038\"\n          d=\"M193.26 157.24c3.66-1.41 6.84 1.3 9.86 2.92 1.8 1.31 3.53 2.7 5.15 4.22 1.32 1.23 2.62 2.48 4 3.64.11.48.33 1.42.44 1.89-2.1 1.44-4.5 2.08-6.94 1.09-1.51 3.93-4.62 6.64-7.53 9.51-.14-.29-.43-.88-.58-1.17-.64.65-1.27 1.3-1.91 1.95-1.66-2.71-3.02-5.6-4-8.61 2.43-4.75-2.17-11.05 1.51-15.44z\"\n        ></Path>\n        <Path\n          fill=\"#f4efd3\"\n          stroke=\"#f4efd3\"\n          d=\"M483.15 157.27c4.68 2.9 9.55 5.59 14.85 7.17 4.53 1.4 9.31 1.36 14 1.78v2.57c-2.28-.72-4.67-.88-7.03-1.02-5.34-.24-10.4-2.31-15.13-4.66-2.61-1.44-5.76-2.71-6.69-5.84z\"\n        ></Path>\n        <Path\n          fill=\"#fce1a2\"\n          stroke=\"#fce1a2\"\n          d=\"M61.01 165.16c4.64-1.51 9.09-3.57 13.35-5.94.57 1.65-.88 2.54-1.88 3.5 4.17 1.7 6.45 6.12 10.93 7.28l-.12.11c-13.81 12.63-34 17.96-52.27 13.97.17-.43.49-1.29.66-1.72-1.3-.38-2.59-.75-3.89-1.1 4.09-1.39 1.67-6.6 4.24-9.29 1.78-1.02 3.92-1.05 5.9-1.38 7.93-.83 16-1.24 23.61-3.81z\"\n        ></Path>\n        <Path\n          fill=\"#ff4f43\"\n          stroke=\"#ff4f43\"\n          d=\"M106.87 167.13c.17-2.41.43-4.81.67-7.21.32 1.77.64 3.54.96 5.32q2.52.585 5.04 1.2a23.2 23.2 0 0 1 3.07-5.75c-1.41 6.6-1.82 13.44-1 20.14-.72.54-1.45 1.06-2.21 1.55-3.56-4.04-5.06-9.48-6.5-14.59z\"\n        ></Path>\n        <Path\n          fill=\"#0a0211\"\n          stroke=\"#0a0211\"\n          d=\"M18.03 164.51c13.59-.12 27.4-.42 40.51-4.34.6.29 1.79.87 2.38 1.17-4.31 2.38-9.28 2.71-13.97 3.92 1.86.56 3.72 1.14 5.57 1.77-4.57.73-9.16 1.47-13.79 1.62-12.94.36-25.99.42-38.73-2.18v-4.11c6.01.73 11.94 2.28 18.03 2.15z\"\n        ></Path>\n        <Path\n          fill=\"#130531\"\n          stroke=\"#130531\"\n          d=\"M157.9 166.26c1.5-1.08 2.84-2.35 4.2-3.6 1.32 1.07 2.63 2.16 3.81 3.38 1.05 1.78 2.12 3.55 3.21 5.3.67 2.07 2.02 4.6-.41 6.11-2.83-1.95-4.79-4.79-6.85-7.47-3.68 1.21-6.79 4.57-10.77 5.64-.33-1.83-.43-3.69-.27-5.55 1.85-1.18 3.62-2.47 5.45-3.69z\"\n        ></Path>\n        <Path\n          fill=\"#310044\"\n          stroke=\"#310044\"\n          d=\"M413.43 163.85c.64 5.51 1.65 11.21 5.04 15.76 1.53 1.38 3.24 2.55 4.85 3.84l-3.34-.09c1.05.82 2.1 1.65 3.2 2.41-1.47.31-2.92.62-4.38.92l-.88 2.41c-5.23-.74-10.42-1.71-15.66-2.35-2.25-.65-.75-3.1.21-4.29 3.22-4.13 5.19-9.02 7.84-13.49 1.01-1.73 2.06-3.43 3.12-5.12z\"\n        ></Path>\n        <Path\n          fill=\"#fdecb0\"\n          stroke=\"#fdecb0\"\n          d=\"M52.52 167.03c2.86-.45 5.7-1.05 8.49-1.87l.53 1.62c-7.61 2.57-15.68 2.98-23.61 3.81-1.98.33-4.12.36-5.9 1.38-2.57 2.69-.15 7.9-4.24 9.29 1.3.35 2.59.72 3.89 1.1-.17.43-.49 1.29-.66 1.72-5.45-1.18-10.81-2.78-16.07-4.65C10 177.69 5 176.11 0 174.54v-8.07c12.74 2.6 25.79 2.54 38.73 2.18 4.63-.15 9.22-.89 13.79-1.62z\"\n        ></Path>\n        <Path\n          fill=\"#ff6748\"\n          stroke=\"#ff6748\"\n          d=\"M434.95 175.84c2.88-4.08 9.37-4.69 10.12-10.33 6.6 9.09 17.49 14.42 28.58 15.26 1.73 1.57 3.95 2.31 6.18 2.86-3.37.66-6.75 1.23-10.1 1.92 2.12.58 4.31.81 6.51.59-8.34 1.4-16.78 2.38-25.25 2.47-8.59.15-17.55-1.53-24.65-6.62 1.11-.23 2.24-.45 3.37-.68.22-.4.65-1.21.87-1.61 1.66-1.03 3.15-2.32 4.37-3.86z\"\n        ></Path>\n        <Path\n          fill=\"#6b0035\"\n          stroke=\"#6b0035\"\n          d=\"M83.55 175.32c3.64-2.18 6.3-5.53 9.53-8.21 1.24.85 1.52 2.42 2.1 3.71 2 5.75 6.78 9.88 11.43 13.52-.12.45-.38 1.36-.5 1.82-7.6-.09-13.88 4.94-19.6 9.33-2.64 1.88-4.28 4.71-5.8 7.5-3.67-2.91-7.39-5.85-11.84-7.5-7.77-3.68-16.25-5.82-24.77-6.76-.32-.36-.94-1.08-1.25-1.44 5.35-.08 10.76.33 16.08-.56 9-1.71 17.09-6.38 24.62-11.41z\"\n        ></Path>\n        <Path\n          fill=\"#1d0324\"\n          stroke=\"#1d0324\"\n          d=\"M299.94 188.99c9.46-4.34 15.98-13.25 20.12-22.55.78 4.68-2.83 8.09-4.65 12-1.51 3.12-3.16 6.19-5.27 8.96-5.03 3.46-10.36 6.84-16.51 7.78-3.09-1.48-6.81-2.15-8.88-5.13 4.88 2.33 10.38.64 15.19-1.06z\"\n        ></Path>\n        <Path\n          fill=\"#0d0020\"\n          stroke=\"#0d0020\"\n          d=\"M408.87 166.44c.36.63 1.08 1.89 1.44 2.53-2.65 4.47-4.62 9.36-7.84 13.49-.96 1.19-2.46 3.64-.21 4.29 5.24.64 10.43 1.61 15.66 2.35 5.17.52 9.42 3.72 13.78 6.24 9.3 5.09 16.78 13.6 20.4 23.58 1.31 3.54 1.45 7.37 2.61 10.95 4.46-4.78 6.72-11.19 11.5-15.69 1.94-1.93 3.93-3.79 5.89-5.7 12.6-8.4 26.51-14.51 39.9-21.5v3.8c-5.1 1.61-9.79 4.18-14.48 6.7-10.23 5.25-20.3 11.38-27.92 20.14-4.79 5.33-8.18 11.7-12.51 17.37-4.33 5.78-7.85 12.63-7.69 20.03-.29 5.85 1.85 11.54 5.18 16.28-1.48 3.04.87 5.81 2.09 8.47-.41.07-1.23.22-1.64.29-1.59-1.8-1.96-5.52-4.57-5.89-2.89 3.55-5.02 7.66-7.97 11.17-.19-.68-.55-2.02-.73-2.7l-3.59-.42c.67-1.27 1.3-2.56 1.91-3.86-6.1.14-11.86 2.3-17.35 4.76-5.09 2.17-10.31 4.02-15.45 6.07-8.04 3.25-16.45 6.3-23.17 11.95-4.13 4.11-7.82 8.67-11.07 13.51h-.8c-.69-.16-2.08-.48-2.77-.65.54-8.02.65-16.25 3.41-23.9 2.45-6.66 5.97-13.32 11.76-17.66 3.2-2.36 7-3.75 10.84-4.66 11.94-1.7 24.2 0 35.18 5 4.33 2.12 9.07 3.07 13.72 4.26 1.68-2.5 3.02-5.21 4.13-8.01-1.26-2.09-2.54-4.17-4.01-6.12.38-.61 1.14-1.85 1.52-2.47q.84 1.08 1.68 2.19c-.81-2.44-1.57-4.89-2.27-7.35 1.21-2.87 3.32-5.55 3.16-8.82.33-4.56 2.23-8.9 2-13.53.2-12.57-7.29-24.17-17.15-31.46-9.65-6.9-21.4-11.47-33.39-11.03-3.28-.2-5.29 2.91-6.71 5.4.46.28 1.38.82 1.84 1.09-1.85 1.32-3.71 2.77-4.34 5.07-2.6 5.33-6.08 10.37-10.68 14.17-2.71 2.29-5.17 4.83-7.71 7.29-.25.23-.75.67-1.01.89.55.6 1.11 1.21 1.67 1.81-2.09 1.48-4.11 3.1-5.73 5.09-4.94 5.77-7.99 13.13-8.94 20.63-2.85 2.46-5.13 5.43-7.65 8.19 4.08-9.53 6.29-19.85 11.67-28.8 8.15-12.77 20.87-22.48 26.62-36.81 1.63-3.89 4.83-6.76 7.21-10.16 4.34-5.85 8.52-11.81 12.58-17.86z\"\n        ></Path>\n        <Path\n          fill=\"#12012f\"\n          stroke=\"#12012f\"\n          d=\"M106.9 167.79c1.44 5.11 2.94 10.55 6.5 14.59.34.18 1.01.53 1.34.71-.2 3.29 3.88 3.74 6.08 4.98 6.43 6.33 14.05 11.27 20.5 17.58 10.93 10.57 22.32 20.83 35.31 28.83 5.52 3.16 11.12 6.2 16.7 9.26 1.97-5.63 2.76-11.74 1.99-17.66-2.43-12.26-9.58-23.42-19.51-30.97-6.24-4.95-13.72-7.99-21.29-10.27.32-.35.97-1.05 1.3-1.39-.67-.16-2.01-.48-2.67-.64.49-.54.98-1.08 1.48-1.61-.49-.35-1.46-1.03-1.94-1.38 6.65 1.19 12.93 3.78 19.05 6.55 4.04 2.01 7.57 4.89 10.99 7.81 4.12 3.56 7.17 8.13 10.05 12.7 4.82-.57 9.19-2.66 13.31-5.09l1.02-.54.27 2.18c-1.75 1.37-2.84 3.18-1.52 5.31-2.96 2.93-5.95 6.16-7.18 10.23-.62 5.55.12 11.16-.27 16.73l1.39.02c.13.65.39 1.93.52 2.57-4.11 4.49-6.99 9.87-9.36 15.44-2.54-.07-5.5.85-7.5-1.23.96.26 2.89.79 3.85 1.05 1.74-2.05 3.06-4.43 3.54-7.1-12.06-6.83-25.17-12.31-35.42-21.88-8.7-7.49-16.48-15.97-25.28-23.35 2.31 7.37 3.97 15.05 7.96 21.77-.5.93-.99 1.86-1.49 2.79-2.58-3.19-3.31-8.48-7.52-9.89-4.06-7.46-3.62-17.28-10.11-23.3-5.23-.12-9.72 3.66-13.43 7.02-9.12 8.69-12.35 22.04-10.33 34.24l-.72 3.21c-2.53-6.26-1.14-13.13-1.29-19.68-.21-3.82 1.82-7.18 2.74-10.78 4.97-6.94 11.42-12.77 18.94-16.84-6.92-2.41-14.43.14-20.45 3.72-4.56 2.97-9.51 7.27-9.36 13.21-.06 3.21 2.13 5.7 3.81 8.2-.6.74-1.19 1.48-1.79 2.22 1.43 5.4-1.09 10.67-1.14 16.08-1.91 7.97-8.39 13.63-12.19 20.67l-1.13-.93c-.51-2.8-1.12-5.6-1.29-8.45 6.54-5.36 11.36-13.13 12.92-21.46.64-9.82-6.52-18.47-15-22.56-.3-1.64-.47-3.31-.41-4.97 4.45 1.65 8.17 4.59 11.84 7.5 1.52-2.79 3.16-5.62 5.8-7.5 5.72-4.39 12-9.42 19.6-9.33 2.01.26 4.01.59 6.02.85-.14-2.67-1.66-4.78-3.45-6.64-3.05-3.45-2.92-8.39-1.78-12.58z\"\n        ></Path>\n        <Path\n          fill=\"#970039\"\n          stroke=\"#970039\"\n          d=\"M212.27 168.02c3.59 3.1 7.83 5.27 12.09 7.27-2.91-.18-5.85.24-8.54 1.38-3.09 1.04-4.93 3.91-7.28 5.98.28.22.84.66 1.11.88-2.11.92-4.23 1.98-5.29 4.18-.4.06-1.21.19-1.62.26-2.81-1.66-5.18-3.98-6.99-6.68.64-.65 1.27-1.3 1.91-1.95.15.29.44.88.58 1.17 2.91-2.87 6.02-5.58 7.53-9.51 2.44.99 4.84.35 6.94-1.09-.11-.47-.33-1.41-.44-1.89z\"\n        ></Path>\n        <Path\n          fill=\"#00657c\"\n          stroke=\"#00657c\"\n          d=\"M151.09 175.62c3.98-1.07 7.09-4.43 10.77-5.64 2.06 2.68 4.02 5.52 6.85 7.47 2.04 1.54 4.1 3.04 6.22 4.47l-1.47.48c-.02.78-.02 1.57-.02 2.35-.42.41-1.28 1.21-1.7 1.62-6.12-2.77-12.4-5.36-19.05-6.55-2.91-.65-5.88-.99-8.83-1.38 2.41-.94 4.83-1.85 7.23-2.82z\"\n        ></Path>\n        <Path\n          fill=\"#150222\"\n          stroke=\"#150222\"\n          d=\"M31.02 184.08c18.27 3.99 38.46-1.34 52.27-13.97.11 1.73.19 3.47.26 5.21-7.53 5.03-15.62 9.7-24.62 11.41-5.32.89-10.73.48-16.08.56-7.15.28-13.89-2.25-20.82-3.48-.77.86-1.53 1.73-2.3 2.6-2.59-1.58-4.85-3.71-4.78-6.98 5.26 1.87 10.62 3.47 16.07 4.65z\"\n        ></Path>\n        <Path\n          fill=\"#4b0061\"\n          stroke=\"#4b0061\"\n          d=\"M279.87 172.23c1.61-.36 3.24-.66 4.86-.97.05.47.14 1.4.19 1.87-3.13 3.16-5.48 7.02-8.7 10.07-1.71 1.61-3.83-.25-5.58-.8-3.47-1.82-7.71-1.8-10.88-4.21 2.41-1.75 5.47-1.53 8.25-2.13 4.13-.68 7.93-2.5 11.86-3.83z\"\n        ></Path>\n        <Path\n          fill=\"#fce696\"\n          stroke=\"#fce696\"\n          d=\"M355.45 174.52c2.47-1.36 4.88-2.89 7.58-3.76 1.98.86 3.67 2.59 5.99 2.48 1.97 1.79 3.84 3.69 5.72 5.57-2.19.96-5.86 1.01-5.39 4.28-.37.01-1.11.02-1.49.03-4.5-2.3-8.54-5.39-12.41-8.6z\"\n        ></Path>\n        <Path\n          fill=\"#0d031e\"\n          stroke=\"#0d031e\"\n          d=\"M169.12 171.34c8.99 9.75 21.71 15.47 34.72 17.32-.28-.18-.82-.52-1.1-.69.41-.07 1.22-.2 1.62-.26 8.22.34 16.42-.6 24.64-.47.84 3.82 4.86 7.12 3.24 11.22-.61-1.57-1.24-3.12-1.88-4.67-3.94 4.4-5.3 10.43-5.1 16.21-.1 4.07.08 8.23 1.58 12.08q-3.285.645-6.51 1.56c2.15-5.35 2.59-11.13 2.46-16.83-2.81 4.31-5.99 8.37-8.87 12.63-1.3 1.9-2.56 3.82-3.8 5.75-2.91 4.62-6.22 8.97-9.8 13.1-.13-.64-.39-1.92-.52-2.57 5.2-7.19 9.5-14.97 14.74-22.13 3.18-5.31 7.42-9.91 10.31-15.39-7.15 1.69-13.38 5.95-18.99 10.54-1.32-2.13-.23-3.94 1.52-5.31l-.27-2.18c2.4-1.26 4.82-2.46 7.22-3.7 4.5-2.78 9.99-3.84 14.05-7.27-6.68.1-13.28 1.27-19.91 1.99-2.81.1-5.63.12-8.43-.19-5.26-.68-10.49-1.99-15.2-4.47-3.38-1.78-6.68-3.68-9.91-5.69a144 144 0 0 1-6.22-4.47c2.43-1.51 1.08-4.04.41-6.11z\"\n        ></Path>\n        <Path\n          fill=\"#0d002a\"\n          stroke=\"#0d002a\"\n          d=\"M0 174.54c5 1.57 10 3.15 14.95 4.89-.07 3.27 2.19 5.4 4.78 6.98 1.95 1.6 3.77 3.36 5.9 4.75 8.11 6.2 14.75 14.08 22.73 20.45 5.84 5.49 13.15 9.54 17.57 16.41 2.74 4.27 5.12 9.03 5.34 14.19-1.85-1.42-3.49-3.48-5.98-3.64-5.51-10.92-15.07-18.8-23.99-26.83-9.86-8.87-17.82-20.12-29.71-26.5-1.43-.8-2.88-1.57-4.42-2.12-2.35-.87-4.78-1.51-7.17-2.28z\"\n        ></Path>\n        <Path\n          fill=\"#a9003c\"\n          stroke=\"#a9003c\"\n          d=\"M215.82 176.67c2.69-1.14 5.63-1.56 8.54-1.38 2.65 1.08 5.69 1.67 7.82 3.72.31 2.21-1.26 4.17-2.04 6.14-.38.7-.76 1.39-1.14 2.09-8.22-.13-16.42.81-24.64.47 1.06-2.2 3.18-3.26 5.29-4.18-.27-.22-.83-.66-1.11-.88 2.35-2.07 4.19-4.94 7.28-5.98z\"\n        ></Path>\n        <Path\n          fill=\"#934f70\"\n          stroke=\"#934f70\"\n          d=\"M124.75 178.22c-.17 2.18-3.08.38-.9-.52z\"\n        ></Path>\n        <Path\n          fill=\"#fdce72\"\n          stroke=\"#fdce72\"\n          d=\"M374.74 178.81c1.27 1.29 2.52 2.6 3.75 3.94-1.74 1.29-3.54 2.48-5.43 3.52-1.7-1.11-3.43-2.16-5.2-3.15.38-.01 1.12-.02 1.49-.03-.47-3.27 3.2-3.32 5.39-4.28z\"\n        ></Path>\n        <Path\n          fill=\"#1c0331\"\n          stroke=\"#1c0331\"\n          d=\"M0 180.84c2.39.77 4.82 1.41 7.17 2.28-.76-.1-2.28-.28-3.04-.37-.27.16-.8.48-1.07.64.62 2.83 2.81 4.8 4.88 6.63 1.45 1.41 2.88 2.83 4.25 4.31 8.18 8.98 14.7 19.34 23.38 27.88-1.74.76-3.52 1.4-5.32 1.98-5.15-5.01-9.99-10.38-14.1-16.29-5.18-6.82-9.65-14.3-16.15-20z\"\n        ></Path>\n        <Path\n          fill=\"#ffb077\"\n          stroke=\"#ffb077\"\n          d=\"M237.67 181.56c2.69-.56 5.43-.97 8.19-1.09 1.11 1.18 2.23 2.36 3.35 3.54-1.66.87-3.31 1.77-4.93 2.7-.42-.08-1.26-.23-1.68-.31-1.79-.8-3.55-1.65-5.33-2.47z\"\n        ></Path>\n        <Path\n          fill=\"#ffc887\"\n          stroke=\"#ffc887\"\n          d=\"M245.86 180.47c4.52-.17 9.1.02 13.48 1.28-.73.14-2.19.41-2.92.54.41 1.53.84 3.05 1.26 4.58-.79.51-1.57 1.03-2.35 1.55.95.83 1.9 1.67 2.89 2.47-4.47-1.93-9.16-3.3-13.94-4.18 1.62-.93 3.27-1.83 4.93-2.7-1.12-1.18-2.24-2.36-3.35-3.54z\"\n        ></Path>\n        <Path\n          fill=\"#f8d796\"\n          stroke=\"#f8d796\"\n          d=\"M384.64 193.09c1.97-4.06 3.76-8.21 5.56-12.35 2.26.74 4.26 2.05 6.09 3.56-2.38 3.4-5.58 6.27-7.21 10.16-1.59-.12-3.24-.19-4.44-1.37z\"\n        ></Path>\n        <Path\n          fill=\"#ff7361\"\n          stroke=\"#ff7361\"\n          d=\"M473.65 180.77c6.89.35 13.75-.52 20.64-.35-2.48 3.05-6.84 3.22-10.36 4.34-2.54.57-5.12.98-7.69 1.38-2.2.22-4.39-.01-6.51-.59 3.35-.69 6.73-1.26 10.1-1.92-2.23-.55-4.45-1.29-6.18-2.86z\"\n        ></Path>\n        <Path\n          fill=\"#440068\"\n          stroke=\"#440068\"\n          d=\"M487.14 188.35c8.31-2.49 16.52-5.3 24.86-7.68v6.31c-13.39 6.99-27.3 13.1-39.9 21.5 1.69-5.94 5.86-11.3 5.09-17.75 3.39-.46 6.7-1.35 9.95-2.38z\"\n        ></Path>\n        <Path\n          fill=\"#fd9360\"\n          stroke=\"#fd9360\"\n          d=\"M118.01 184.95c1.82-1.17 3.66-2.47 5.86-2.77 10.25-2.03 20.72-.04 30.65 2.66 7.57 2.28 15.05 5.32 21.29 10.27 9.93 7.55 17.08 18.71 19.51 30.97.77 5.92-.02 12.03-1.99 17.66-5.58-3.06-11.18-6.1-16.7-9.26-12.99-8-24.38-18.26-35.31-28.83-6.45-6.31-14.07-11.25-20.5-17.58-.97-1.01-1.89-2.08-2.81-3.12z\"\n        ></Path>\n        <Path\n          fill=\"#0c9691\"\n          stroke=\"#0c9691\"\n          d=\"m173.46 182.4 1.47-.48c3.23 2.01 6.53 3.91 9.91 5.69-.29.25-.86.74-1.14.99-.35 1.1-.63 2.22-.93 3.34l-.04 2.24c-3.42-2.92-6.95-5.8-10.99-7.81.42-.41 1.28-1.21 1.7-1.62 0-.78 0-1.57.02-2.35z\"\n        ></Path>\n        <Path\n          fill=\"#e56573\"\n          stroke=\"#e56573\"\n          d=\"M233.89 182.95c1.19-.64 2.49-1.01 3.78-1.39l-.4 2.37c1.78.82 3.54 1.67 5.33 2.47-2.98-.12-5.98-.35-8.96.03.07-.87.19-2.61.25-3.48z\"\n        ></Path>\n        <Path\n          fill=\"#fee2a0\"\n          stroke=\"#fee2a0\"\n          d=\"M256.42 182.29c.73-.13 2.19-.4 2.92-.54 3.27.79 6.48 1.87 9.55 3.26-2.12 2.43.95 3.94 2.42 5.52.44 2.01.84 4.18 2.46 5.62.94 1.3 3.21 2.62 2.03 4.48 1.4.89 2.73 2.8 3.45 4.52-6.46-5.51-13.17-10.89-21.03-14.26-.99-.8-1.94-1.64-2.89-2.47.78-.52 1.56-1.04 2.35-1.55-.42-1.53-.85-3.05-1.26-4.58z\"\n        ></Path>\n        <Path\n          fill=\"#fd214a\"\n          stroke=\"#fd214a\"\n          d=\"M3.06 183.39c.27-.16.8-.48 1.07-.64.45 2.78 2.12 5.09 3.81 7.27-2.07-1.83-4.26-3.8-4.88-6.63z\"\n        ></Path>\n        <Path\n          fill=\"#fcda93\"\n          stroke=\"#fcda93\"\n          d=\"M4.13 182.75c.76.09 2.28.27 3.04.37 1.54.55 2.99 1.32 4.42 2.12.32 3.03 1.24 6.03.6 9.09-1.37-1.48-2.8-2.9-4.25-4.31-1.69-2.18-3.36-4.49-3.81-7.27z\"\n        ></Path>\n        <Path\n          fill=\"#09bbb2\"\n          stroke=\"#09bbb2\"\n          d=\"M342.16 188.54c4.33-2.33 9.01-4.1 13.83-5.11 4.55-1.09 9.19 1.19 12.29 4.44-6.13 1.15-11.77 3.85-17.57 5.94-1.89-.32-5.43.81-4.39-2.32-1.39-.96-2.77-1.99-4.16-2.95z\"\n        ></Path>\n        <Path\n          fill=\"#ffb55e\"\n          stroke=\"#ffb55e\"\n          d=\"M378.49 182.75c1.41 1.86 4.42 3.87 2.72 6.45-2.83 1.94-5.64-1.8-8.15-2.93 1.89-1.04 3.69-2.23 5.43-3.52z\"\n        ></Path>\n        <Path\n          fill=\"#26003a\"\n          stroke=\"#26003a\"\n          d=\"M19.73 186.41c.77-.87 1.53-1.74 2.3-2.6 6.93 1.23 13.67 3.76 20.82 3.48.31.36.93 1.08 1.25 1.44-3 .56-5.98 1.3-9.05 1.31-2.92.17-6.09-.56-8.7 1.14l-.72-.02c-2.13-1.39-3.95-3.15-5.9-4.75z\"\n        ></Path>\n        <Path\n          fill=\"#170032\"\n          stroke=\"#170032\"\n          d=\"M229 187.24c.38-.7.76-1.39 1.14-2.09.99 1 2.04 2.14 3.5 1.28 2.98-.38 5.98-.15 8.96-.03.42.08 1.26.23 1.68.31 4.78.88 9.47 2.25 13.94 4.18 7.86 3.37 14.57 8.75 21.03 14.26 5.44 5.43 10.44 11.29 15.14 17.37 6.97 9.11 14.33 17.93 20.71 27.47 5.02 7.41 10.16 14.74 15.63 21.82.21.45.64 1.35.85 1.8 1.73.4 3.49.69 5.25.98.67-1.26 1.34-2.53 1.98-3.81.19.53.58 1.59.78 2.12 3.72-4.29 7.43-8.58 11.2-12.83 2.52-2.76 4.8-5.73 7.65-8.19l-.24 2.41c-4.11 9.09-15.15 13.51-17.71 23.64-.26 3.73-.32 7.49-.35 11.23a90 90 0 0 0-3.39-2.5c-2.3 3.82-2.29 8.52-3.27 12.79-2.58 4.99-7.23 8.54-9.76 13.54-.8 4.42-.8 9.23 1.14 13.38-1.08 3.48-2.97 7.93-7.36 7.51 2.27-10.55 1.26-21.98-3.75-31.62-11.02-23.86-35.14-40-60.58-44.64-.52-1.03-1.04-2.04-1.56-3.06-7.43-1.29-13.02-6.93-17.82-12.35-4.02-4.52-7.09-9.76-10.92-14.42-2.92 3.26-4.56 7.52-7.93 10.4.62-2.97 2.67-5.41 2.98-8.47.16-.4.47-1.19.63-1.59.61-1.49 1.23-2.98 1.78-4.49q3.225-.915 6.51-1.56c3.1 8.2 8.08 15.91 15.18 21.2 8.36 6.31 17.89 10.75 27.63 14.47 12.1 5.61 23.95 12.17 33.66 21.44 4.9 5.23 12.36 9 19.63 7.11 4.15-1.29 8.06-3.97 10.16-7.87-4.8-.3-9.77-.06-14.28-1.98-5.56-2-10.31-5.56-15.02-9.01 1.97.35 3.97.16 5.93-.2 6.15 3.18 12.5 8.14 19.8 7.04-1.7-1.93-3.67-3.57-5.69-5.14-4.72-3.62-7.07-9.39-11.6-13.19-2.96 2.13-6.28 3.73-9.85 4.5.45.99.9 1.98 1.38 2.97-2.43-1.17-3.98-3.36-5.08-5.74 3.84-.02 8.47.26 11.23-2.97 1.1-2.39.19-5.89-2.38-6.96-3.86-1-7.91-1.23-11.69-2.57-6.86-2.5-13.36-6.28-18.37-11.67-9.85-10.09-15.61-23.37-25.35-33.55-3.75-3.98-9-5.92-14.05-7.62 4.39 15.24 10.88 30.29 22.09 41.82-.24 1.01-.42 2.05-.65 3.07-1.01.52-2.03 1.01-3.03 1.53a99 99 0 0 1-4.56-4.37c-10.08-9.7-15.26-22.98-19.69-35.93 1.62-4.1-2.4-7.4-3.24-11.22z\"\n        ></Path>\n        <Path\n          fill=\"#fdeeac\"\n          stroke=\"#fdeeac\"\n          d=\"M12.19 194.33c.64-3.06-.28-6.06-.6-9.09 11.89 6.38 19.85 17.63 29.71 26.5 8.92 8.03 18.48 15.91 23.99 26.83 1.69 3.09 2.98 6.4 3.73 9.85-2.46 3.92.49 8.73-.17 13.07-.49-.12-1.49-.36-1.99-.48-.74.83-1.48 1.68-2.21 2.53-.99-1.35-1.81-3.04-3.64-3.41-2.04-5.15-4.29-10.23-6.97-15.08-4.75-8.67-11.96-15.53-18.47-22.84-8.68-8.54-15.2-18.9-23.38-27.88z\"\n        ></Path>\n        <Path\n          fill=\"#fef3b6\"\n          stroke=\"#fef3b6\"\n          d=\"M271.31 190.53c-1.47-1.58-4.54-3.09-2.42-5.52 4.7 2.34 9.12 5.23 13.22 8.5 9.11 7.89 16.92 17.13 25.09 25.96 8.35 9.97 16.33 20.4 22.48 31.9 3.85 6.76 5.26 14.72 4.77 22.44-1.36-.46-2.6-1.12-3.72-2-5.47-7.08-10.61-14.41-15.63-21.82-6.38-9.54-13.74-18.36-20.71-27.47-4.7-6.08-9.7-11.94-15.14-17.37-.72-1.72-2.05-3.63-3.45-4.52 1.18-1.86-1.09-3.18-2.03-4.48-1.62-1.44-2.02-3.61-2.46-5.62z\"\n        ></Path>\n        <Path\n          fill=\"#181658\"\n          stroke=\"#181658\"\n          d=\"M418.8 186.69c1.46-.3 2.91-.61 4.38-.92 5.2 2.57 9.99 6.28 15.86 7.2 12.72 2.26 25.56-.43 38.15-2.24.77 6.45-3.4 11.81-5.09 17.75-1.96 1.91-3.95 3.77-5.89 5.7-4.78 4.5-7.04 10.91-11.5 15.69-1.16-3.58-1.3-7.41-2.61-10.95-3.62-9.98-11.1-18.49-20.4-23.58-4.36-2.52-8.61-5.72-13.78-6.24z\"\n        ></Path>\n        <Path\n          fill=\"#f40049\"\n          stroke=\"#f40049\"\n          d=\"M0 187.9c6.5 5.7 10.97 13.18 16.15 20 4.11 5.91 8.95 11.28 14.1 16.29 6.61 6.05 13.34 12.05 18.63 19.34-5.45-.97-11.04-1.2-16.33-2.94-5.26-1.71-10.24-4.23-14.94-7.13-6.53-4-11.88-9.53-17.61-14.53z\"\n        ></Path>\n        <Path\n          fill=\"#2ebda7\"\n          stroke=\"#2ebda7\"\n          d=\"M183.7 188.6c.28-.25.85-.74 1.14-.99 4.71 2.48 9.94 3.79 15.2 4.47-.65.55-1.3 1.1-1.95 1.66 1.77.2 3.55.39 5.33.58-.76 1.32-1.08 2.81-1.17 4.31 1.01.22 2.03.44 3.05.66.26.83.52 1.67.79 2.5-4.12 2.43-8.49 4.52-13.31 5.09-2.88-4.57-5.93-9.14-10.05-12.7l.04-2.24c.3-1.12.58-2.24.93-3.34z\"\n        ></Path>\n        <Path\n          fill=\"#0c0621\"\n          stroke=\"#0c0621\"\n          d=\"M35.05 190.04c3.07-.01 6.05-.75 9.05-1.31 8.52.94 17 3.08 24.77 6.76-.06 1.66.11 3.33.41 4.97-13.12-7.16-28.25-8.79-42.93-9.28 2.61-1.7 5.78-.97 8.7-1.14z\"\n        ></Path>\n        <Path\n          fill=\"#560070\"\n          stroke=\"#560070\"\n          d=\"M94.45 193.48c6.02-3.58 13.53-6.13 20.45-3.72-7.52 4.07-13.97 9.9-18.94 16.84-1.85 2.47-3.42 5.12-5.03 7.75-2.05-2.48-3.87-5.13-5.84-7.66-.15-5.94 4.8-10.24 9.36-13.21z\"\n        ></Path>\n        <Path\n          fill=\"#1fc4c1\"\n          stroke=\"#1fc4c1\"\n          d=\"M321.84 204.34c3.98-7.66 12.62-12.02 20.15-15.93l.17.13c1.39.96 2.77 1.99 4.16 2.95-1.04 3.13 2.5 2 4.39 2.32-8.89 5.19-17.97 10.61-24.22 19.02-.58-1.11-1.14-2.22-1.7-3.32-.81.03-1.62.07-2.42.11.14-1.14.28-2.27.37-3.41-.22-.47-.68-1.4-.9-1.87z\"\n        ></Path>\n        <Path\n          fill=\"#1a0039\"\n          stroke=\"#1a0039\"\n          d=\"M356.94 193.87c4.24-2.69 9.34-3.34 14.06-4.78 4.05-.76 6.28 3.24 8.21 6.04-1.13 1.37-2.59 2.38-4.2 3.11.61-1.01 1.2-2.03 1.79-3.05-5.07-2.11-10.18.4-15.2 1.31-6.54 1.41-12.58 4.4-18.94 6.39 4.1-3.99 9.51-6.02 14.28-9.02z\"\n        ></Path>\n        <Path\n          fill=\"#55b4ad\"\n          stroke=\"#55b4ad\"\n          d=\"M208.47 192.27c6.63-.72 13.23-1.89 19.91-1.99-4.06 3.43-9.55 4.49-14.05 7.27-.35-1.25-.7-2.5-1.04-3.74-1.61-.53-3.2-1.07-4.82-1.54z\"\n        ></Path>\n        <Path\n          fill=\"#250042\"\n          stroke=\"#250042\"\n          d=\"m284.36 189.81.39.24c2.07 2.98 5.79 3.65 8.88 5.13-.59.28-1.77.86-2.37 1.14 8.99 5.81 16.32 14.16 21.23 23.65.28-5.49 2.13-10.81 5.56-15.13-.72 3.68-2.27 7.09-3.36 10.65-.37 2.81.1 5.65.13 8.48-2.38-1.7-4.31-5.06-7.62-4.5-8.17-8.83-15.98-18.07-25.09-25.96.75-1.23 1.5-2.47 2.25-3.7z\"\n        ></Path>\n        <Path\n          fill=\"#078865\"\n          stroke=\"#078865\"\n          d=\"m25.63 191.16.72.02c14.68.49 29.81 2.12 42.93 9.28 8.48 4.09 15.64 12.74 15 22.56-1.56 8.33-6.38 16.1-12.92 21.46-.02-.57-.07-1.7-.09-2.27-.22-5.16-2.6-9.92-5.34-14.19-4.42-6.87-11.73-10.92-17.57-16.41-7.98-6.37-14.62-14.25-22.73-20.45z\"\n        ></Path>\n        <Path\n          fill=\"#39cab7\"\n          stroke=\"#39cab7\"\n          d=\"M393.34 195.84c1.42-2.49 3.43-5.6 6.71-5.4 11.99-.44 23.74 4.13 33.39 11.03 9.86 7.29 17.35 18.89 17.15 31.46.23 4.63-1.67 8.97-2 13.53-4.65-7.12-10.74-13.07-16.73-19.03-7.52-7.66-15.86-14.4-23.86-21.53-3.96-3.41-8.29-6.38-12.82-8.97-.46-.27-1.38-.81-1.84-1.09z\"\n        ></Path>\n        <Path\n          fill=\"#dbeab2\"\n          stroke=\"#dbeab2\"\n          d=\"M497.52 197.48c4.69-2.52 9.38-5.09 14.48-6.7v3.84c-3.3 3.79-7.56 6.58-11.1 10.14-.15-1.61-.29-3.22-.41-4.83-1-.82-2-1.64-2.97-2.45z\"\n        ></Path>\n        <Path\n          fill=\"#3cc1b1\"\n          stroke=\"#3cc1b1\"\n          d=\"M200.04 192.08c2.8.31 5.62.29 8.43.19 1.62.47 3.21 1.01 4.82 1.54.34 1.24.69 2.49 1.04 3.74-2.4 1.24-4.82 2.44-7.22 3.7l-1.02.54c-.27-.83-.53-1.67-.79-2.5-1.02-.22-2.04-.44-3.05-.66.09-1.5.41-2.99 1.17-4.31-1.78-.19-3.56-.38-5.33-.58.65-.56 1.3-1.11 1.95-1.66z\"\n        ></Path>\n        <Path\n          fill=\"#f8004b\"\n          stroke=\"#f8004b\"\n          d=\"M238.08 192.34c5.05 1.7 10.3 3.64 14.05 7.62 9.74 10.18 15.5 23.46 25.35 33.55 5.01 5.39 11.51 9.17 18.37 11.67 3.78 1.34 7.83 1.57 11.69 2.57 2.57 1.07 3.48 4.57 2.38 6.96-2.76 3.23-7.39 2.95-11.23 2.97-9.19-2.72-17.59-7.54-25.55-12.78-4.75-3.02-9.14-6.61-12.97-10.74-11.21-11.53-17.7-26.58-22.09-41.82z\"\n        ></Path>\n        <Path\n          fill=\"#30b393\"\n          stroke=\"#30b393\"\n          d=\"M105.56 199.61c3.71-3.36 8.2-7.14 13.43-7.02 6.49 6.02 6.05 15.84 10.11 23.3 6.23 15.41 19.81 26.88 35 33.01 6.71 3.25 14.19 4.7 20.74 8.3.7 3.38-4.12 3.88-6.24 5.39-11.78 6.68-25.7 7.54-38.93 6.65-8.66-1.56-17.59-3.06-25.27-7.64-10.19-5.75-17.46-16.14-19.17-27.75-2.02-12.2 1.21-25.55 10.33-34.24z\"\n        ></Path>\n        <Path\n          fill=\"#046d60\"\n          stroke=\"#046d60\"\n          d=\"M371.3 204.29c4.82-3.2 9.9-6.43 13.34-11.2 1.2 1.18 2.85 1.25 4.44 1.37-5.75 14.33-18.47 24.04-26.62 36.81-2.35.78-4.7 1.57-7.06 2.31-2.45-2.47-6.01-2.67-9.11-3.79-.61.3-1.23.61-1.84.92-1.04-.99-2.08-1.97-3.11-2.95 7.78-10.33 19.37-16.51 29.96-23.47z\"\n        ></Path>\n        <Path\n          fill=\"#2db08f\"\n          stroke=\"#2db08f\"\n          d=\"M225.26 210c-.2-5.78 1.16-11.81 5.1-16.21.64 1.55 1.27 3.1 1.88 4.67 4.43 12.95 9.61 26.23 19.69 35.93-3.74 2.45-6.6 5.94-9.91 8.89-7.1-5.29-12.08-13-15.18-21.2-1.5-3.85-1.68-8.01-1.58-12.08z\"\n        ></Path>\n        <Path\n          fill=\"#340056\"\n          stroke=\"#340056\"\n          d=\"M361.6 196.5c5.02-.91 10.13-3.42 15.2-1.31-.59 1.02-1.18 2.04-1.79 3.05-6.97 3.85-13.61 8.26-20.38 12.44-8.98 5.43-15.52 13.96-20.85 22.82-2.08 2.74-3.48 5.88-4.89 8.98-.72-1.42-1.74-2.81-1.62-4.48-.01-7.44-.26-15.01 1.76-22.26 3.76-5.05 7.9-9.95 13.63-12.85 6.36-1.99 12.4-4.98 18.94-6.39z\"\n        ></Path>\n        <Path\n          fill=\"#0c0224\"\n          stroke=\"#0c0224\"\n          d=\"M500.9 204.76c3.54-3.56 7.8-6.35 11.1-10.14v7.3c-5.83 4.67-11.54 9.62-16.06 15.6-2.97 3.66-5.91 7.43-7.65 11.86-4.84 9.28-3.38 21.12-10.79 29.15-2.49 3.21-6.54 4.2-10.23 5.27 3.29 3.53 7.58 7.02 12.71 6.61 3.79-.64 6.64-3.55 9.3-6.1 5.69-5.73 7.92-13.71 10.63-21.08 1.89-5.36 3.76-10.77 6.58-15.73 1.66-2.74 3.69-5.21 5.51-7.84v10.46c-.85.84-1.78 1.69-2.09 2.9-.5 1.23-1 2.46-1.52 3.68l-1.73 2.01c-.37-.86-.73-1.73-1.08-2.59-4.49 5.92-5.78 13.42-7.92 20.36-.02 3.97-2.3 7.25-3.7 10.83-2.11 2.56-4.85 4.5-7.8 5.99-3.68.62-6.8-2.29-10.51-1.36-.25.9-.5 1.8-.74 2.71-6.47-4.48-13.72-9.49-15.75-17.58-.08-6.24 5.18-10.66 8.89-15.07 11.73-11.73 20.63-25.96 32.85-37.24z\"\n        ></Path>\n        <Path\n          fill=\"#1e003f\"\n          stroke=\"#1e003f\"\n          d=\"M395.18 196.93c4.53 2.59 8.86 5.56 12.82 8.97 8 7.13 16.34 13.87 23.86 21.53-.53 1.93-1.05 3.86-1.58 5.8-2.07-1.51-4.14-3.03-6.3-4.39.51-.08 1.53-.22 2.04-.29-3.69-2.86-8.13-4.69-11.39-8.11-3.79-3.93-8.07-7.35-11.63-11.5-3.28-2.72-6.96-4.96-9.79-8.2-.6.32-1.78.94-2.37 1.26.63-2.3 2.49-3.75 4.34-5.07z\"\n        ></Path>\n        <Path\n          fill=\"#eb004c\"\n          stroke=\"#eb004c\"\n          d=\"M205.86 208.74c5.61-4.59 11.84-8.85 18.99-10.54-2.89 5.48-7.13 10.08-10.31 15.39-5.24 7.16-9.54 14.94-14.74 22.13l-1.39-.02c.39-5.57-.35-11.18.27-16.73 1.23-4.07 4.22-7.3 7.18-10.23z\"\n        ></Path>\n        <Path\n          fill=\"#fdf0b3\"\n          stroke=\"#fdf0b3\"\n          d=\"M469.6 217.62c7.62-8.76 17.69-14.89 27.92-20.14.97.81 1.97 1.63 2.97 2.45.12 1.61.26 3.22.41 4.83-12.22 11.28-21.12 25.51-32.85 37.24-3.71 4.41-8.97 8.83-8.89 15.07 2.03 8.09 9.28 13.1 15.75 17.58 11.75 7.58 23.17 16.65 37.09 19.81v10.03c-15.37-1.33-29.38-8.91-41.8-17.61-6.11-4.18-11.36-9.54-15.62-15.58-3.33-4.74-5.47-10.43-5.18-16.28-.16-7.4 3.36-14.25 7.69-20.03 4.33-5.67 7.72-12.04 12.51-17.37z\"\n        ></Path>\n        <Path\n          fill=\"#3a0055\"\n          stroke=\"#3a0055\"\n          d=\"M256.11 199.14c8.78.57 15.21 7.24 22.55 11.27 10.87 8.53 16.17 21.94 26.3 31.19-7.51 1.73-14.87-2.45-20.58-6.94-4.36-5.65-10.15-9.99-14.27-15.83-2.13-2.51-4.39-4.94-5.94-7.87-2.25-4.23-5.45-7.83-8.06-11.82z\"\n        ></Path>\n        <Path\n          fill=\"#f30047\"\n          stroke=\"#f30047\"\n          d=\"M130.15 201.22c8.8 7.38 16.58 15.86 25.28 23.35 10.25 9.57 23.36 15.05 35.42 21.88-.48 2.67-1.8 5.05-3.54 7.1-.96-.26-2.89-.79-3.85-1.05-17.03-6.01-35.25-13.63-45.35-29.51-3.99-6.72-5.65-14.4-7.96-21.77z\"\n        ></Path>\n        <Path\n          fill=\"#54006f\"\n          stroke=\"#54006f\"\n          d=\"M390.84 202c.59-.32 1.77-.94 2.37-1.26 2.83 3.24 6.51 5.48 9.79 8.2 3.56 4.15 7.84 7.57 11.63 11.5 3.26 3.42 7.7 5.25 11.39 8.11-.51.07-1.53.21-2.04.29-11.48-7.25-25.32-11.64-38.97-9.98-4.54.49-8.25 3.4-12.56 4.6 2.54-2.46 5-5 7.71-7.29 4.6-3.8 8.08-8.84 10.68-14.17z\"\n        ></Path>\n        <Path\n          fill=\"#10ada9\"\n          stroke=\"#10ada9\"\n          d=\"M495.94 217.52c4.52-5.98 10.23-10.93 16.06-15.6v17.74c-1.82 2.63-3.85 5.1-5.51 7.84-1.07.07-2.14.15-3.2.23-2.51-2.4-4.83-6.39-8.9-4.98.54-1.74 1.03-3.49 1.55-5.23z\"\n        ></Path>\n        <Path\n          fill=\"#3bd6c5\"\n          stroke=\"#3bd6c5\"\n          d=\"M321.84 204.34c.22.47.68 1.4.9 1.87-.09 1.14-.23 2.27-.37 3.41.8-.04 1.61-.08 2.42-.11.56 1.1 1.12 2.21 1.7 3.32-3.66 5.11-5.82 11.07-7.18 17.16-3.39-8.3-2.57-18.21 2.53-25.65z\"\n        ></Path>\n        <Path\n          fill=\"#190035\"\n          stroke=\"#190035\"\n          d=\"M85.09 206.69c1.97 2.53 3.79 5.18 5.84 7.66 1.61-2.63 3.18-5.28 5.03-7.75-.92 3.6-2.95 6.96-2.74 10.78.15 6.55-1.24 13.42 1.29 19.68l.72-3.21c1.71 11.61 8.98 22 19.17 27.75 7.68 4.58 16.61 6.08 25.27 7.64 6.45 3.49 14.32-.16 20.81 3.55-11.46 2.58-23.4 2-34.92.16-12.04-2.63-24.43-4.35-35.71-9.58-5.29-1.97-10.01-5.99-15.94-5.7-.55-1.52-.98-3.13-1.26-4.74l1.13.93c3.26 1.03 6.94.51 9.88 2.54 7.24 4.26 14.84 8.35 23.3 9.51-3.76-3.36-5.93-7.98-8.97-11.92-4.77-7.25-9.18-15.25-9.18-24.18-.97 1.1-1.94 2.21-2.84 3.38.05-5.41 2.57-10.68 1.14-16.08.6-.74 1.19-1.48 1.79-2.22-1.68-2.5-3.87-4.99-3.81-8.2z\"\n        ></Path>\n        <Path\n          fill=\"#fd4b4a\"\n          stroke=\"#fd4b4a\"\n          d=\"M213.92 219.44c2.88-4.26 6.06-8.32 8.87-12.63.13 5.7-.31 11.48-2.46 16.83-.55 1.51-1.17 3-1.78 4.49a654 654 0 0 1-4.63-8.69z\"\n        ></Path>\n        <Path\n          fill=\"#0b031d\"\n          stroke=\"#0b031d\"\n          d=\"M129.1 215.89c4.21 1.41 4.94 6.7 7.52 9.89.5-.93.99-1.86 1.49-2.79 10.1 15.88 28.32 23.5 45.35 29.51 2 2.08 4.96 1.16 7.5 1.23-1.5 3.44-3.71 6.64-4.54 10.33.39 2.17 1.59 4.06 2.5 6.04-.91-1.83-2.14-3.47-3.38-5.08-2.42 5.22-6.31 9.6-10.8 13.15-6.62 4.93-14.19 8.5-21.92 11.32-8.27 2.33-16.79 3.64-25.37 4.05.07 3.63.15 7.27.22 10.9 5.32-.33 10.65-.16 15.98-.39.61.36 1.83 1.09 2.44 1.46-3.55 1.52-7.42 1.41-11.17.85-1.56-.05-4.46-.85-4.72 1.42 1.07.96 2.34 1.63 3.63 2.24 8.15 3.9 16.3 7.84 24.35 11.96 1.58 2.57 3.77 4.62 6.46 6.02 2.03 1.45 3.85 3.16 5.85 4.67l.24 2.29c-.92-.26-1.84-.53-2.75-.81-11.52-9.74-24.82-17.18-38.46-23.53-12.09-4.51-24.96-7.35-36.16-14-8.03-4.81-14.36-12.34-17.69-21.1-3.77-8.6-4.35-18.09-6.65-27.1-.75-3.45-2.04-6.76-3.73-9.85 2.49.16 4.13 2.22 5.98 3.64.02.57.07 1.7.09 2.27.17 2.85.78 5.65 1.29 8.45.28 1.61.71 3.22 1.26 4.74 1.82 5.15 4.71 9.99 8.88 13.57 11.26 9.3 24.86 16.02 39.37 18.17 16.11 1.08 32.3-3.84 45.97-12.22 5.86-3.41 10.53-8.42 14.58-13.78-5.91 5.77-14.35 7.87-22.23 9.38-6.49-3.71-14.36-.06-20.81-3.55 13.23.89 27.15.03 38.93-6.65 2.12-1.51 6.94-2.01 6.24-5.39-6.55-3.6-14.03-5.05-20.74-8.3-15.19-6.13-28.77-17.6-35-33.01z\"\n        ></Path>\n        <Path\n          fill=\"#180038\"\n          stroke=\"#180038\"\n          d=\"M321.12 231.17c1.4-5.55 2.66-12.17 7.91-15.43-2.02 7.25-1.77 14.82-1.76 22.26-.12 1.67.9 3.06 1.62 4.48 1.41-3.1 2.81-6.24 4.89-8.98-1.46 5.08-2.16 11.16.96 15.76 3.77 5.59 4.04 12.64 4.04 19.16-3.67-3.06-3.4-8.21-4.9-12.38-1.61-5.85-6.13-10.37-7.77-16.19-.41-3.63-.04-7.3-.52-10.93-.46 2.48.1 5.37-1.56 7.47-2.41-.36-3.75-3.02-2.91-5.22z\"\n        ></Path>\n        <Path\n          fill=\"#21ac96\"\n          stroke=\"#21ac96\"\n          d=\"M488.29 229.38c1.74-4.43 4.68-8.2 7.65-11.86-.52 1.74-1.01 3.49-1.55 5.23 4.07-1.41 6.39 2.58 8.9 4.98 1.06-.08 2.13-.16 3.2-.23-2.82 4.96-4.69 10.37-6.58 15.73a102 102 0 0 0-4.67-3.61c-.59.63-1.17 1.27-1.74 1.91a47.5 47.5 0 0 0-3.5-5.14c-.68.4-1.36.81-2.02 1.23.35-2.73.94-5.5.31-8.24z\"\n        ></Path>\n        <Path\n          fill=\"#090119\"\n          stroke=\"#090119\"\n          d=\"M0 218.93c5.73 5 11.08 10.53 17.61 14.53 4.7 2.9 9.68 5.42 14.94 7.13 5.29 1.74 10.88 1.97 16.33 2.94.29.42.86 1.26 1.15 1.67.9 1.51 1.43 3.19 1.85 4.88-1.53 1.06-2.88 2.34-4.11 3.73-4.34 2.81-9.44 4.25-13.58 7.41-8.41 6.5-16.6 13.43-23.25 21.77-3.52 4.2-7.75 7.78-10.94 12.26v-3.47c9.4-11.65 18.77-23.66 31.11-32.38 5.76-4.55 12.69-7.22 18.72-11.36-1.2-.66-2.33-1.64-3.78-1.59-4.87-.29-9.87.27-14.34 2.35C19.53 254.32 7.96 262 0 272.92v-3.68c3.76-4.78 8.34-8.78 12.9-12.76-4.24.9-8.56 1.35-12.9 1.18v-4.16c6.13.73 12.64 1.38 18.41-1.34 5.09-2.43 10.08-5.24 15.66-6.44-12.06-4.35-23.52-10.99-32.62-20.08-.36-.24-1.09-.72-1.45-.96z\"\n        ></Path>\n        <Path\n          fill=\"#1b0029\"\n          stroke=\"#1b0029\"\n          d=\"M372.45 223.46c4.31-1.2 8.02-4.11 12.56-4.6 13.65-1.66 27.49 2.73 38.97 9.98 2.16 1.36 4.23 2.88 6.3 4.39.53-1.94 1.05-3.87 1.58-5.8 5.99 5.96 12.08 11.91 16.73 19.03.16 3.27-1.95 5.95-3.16 8.82-4.36-12.47-15.64-21.07-27.31-26.3-10.15-4.25-20.99-8.41-32.2-7.11-4.51.5-8.99 1.8-12.81 4.29-.56-.6-1.12-1.21-1.67-1.81.26-.22.76-.66 1.01-.89z\"\n        ></Path>\n        <Path\n          fill=\"#ff6d4f\"\n          stroke=\"#ff6d4f\"\n          d=\"M210.12 225.19c1.24-1.93 2.5-3.85 3.8-5.75a654 654 0 0 0 4.63 8.69c-.16.4-.47 1.19-.63 1.59-1 1.78-2 3.55-2.97 5.35-2.8-.64-2.86-2.94-2.65-5.22-.62-.2-1.24-.4-1.86-.58-.11-1.36-.21-2.73-.32-4.08z\"\n        ></Path>\n        <Path\n          fill=\"#150723\"\n          stroke=\"#150723\"\n          d=\"M30.25 224.19c1.8-.58 3.58-1.22 5.32-1.98 6.51 7.31 13.72 14.17 18.47 22.84l-4.01.15c-.29-.41-.86-1.25-1.15-1.67-5.29-7.29-12.02-13.29-18.63-19.34z\"\n        ></Path>\n        <Path\n          fill=\"#fe8759\"\n          stroke=\"#fe8759\"\n          d=\"M373.11 226.16c3.82-2.49 8.3-3.79 12.81-4.29 11.21-1.3 22.05 2.86 32.2 7.11 11.67 5.23 22.95 13.83 27.31 26.3.7 2.46 1.46 4.91 2.27 7.35q-.84-1.11-1.68-2.19c-9.03-10.49-23.29-13.38-36.07-16.64-6.95-1.51-13.73-4.16-20.91-4.26-6.93.03-13.8 2.02-19.77 5.52-1.63-1.01-4.16-1.61-3.91-4.02-1.09-3.61 2.52-6.27 2.02-9.79 1.62-1.99 3.64-3.61 5.73-5.09z\"\n        ></Path>\n        <Path\n          fill=\"#50c4cf\"\n          stroke=\"#50c4cf\"\n          d=\"M0 224.68c.36.24 1.09.72 1.45.96-.36.18-1.09.53-1.45.7z\"\n        ></Path>\n        <Path\n          fill=\"#21baae\"\n          stroke=\"#21baae\"\n          d=\"M1.45 225.64c9.1 9.09 20.56 15.73 32.62 20.08-5.58 1.2-10.57 4.01-15.66 6.44-5.77 2.72-12.28 2.07-18.41 1.34v-27.16c.36-.17 1.09-.52 1.45-.7z\"\n        ></Path>\n        <Path\n          fill=\"#ff895f\"\n          stroke=\"#ff895f\"\n          d=\"M200.32 238.29c3.58-4.13 6.89-8.48 9.8-13.1.11 1.35.21 2.72.32 4.08.62.18 1.24.38 1.86.58-.21 2.28-.15 4.58 2.65 5.22-3.8 6.97-8.58 13.32-12.99 19.9-4.64 6.89-7.36 14.85-11.93 21.79 1.1-2.33-.03-4.59-1.11-6.66-.91-1.98-2.11-3.87-2.5-6.04.83-3.69 3.04-6.89 4.54-10.33 2.37-5.57 5.25-10.95 9.36-15.44z\"\n        ></Path>\n        <Path\n          fill=\"#2a003e\"\n          stroke=\"#2a003e\"\n          d=\"M214.94 238.19c3.37-2.88 5.01-7.14 7.93-10.4 3.83 4.66 6.9 9.9 10.92 14.42 4.8 5.42 10.39 11.06 17.82 12.35.52 1.02 1.04 2.03 1.56 3.06l-.91-.11c.32.16.97.46 1.3.62-2.09 1.01-4.1 2.65-6.53 2.65-6.36-.18-12.75.19-19.05 1.1-5.17.76-9.88 3.24-15 4.16-2.72.56-5.97-.36-8.16 1.75-4.05 3.62-7.24 8.07-11.07 11.91-1.61 1.81-4.35.93-6.46 1.29.95-1.39 1.88-2.79 2.74-4.23 4.57-6.94 7.29-14.9 11.93-21.79 4.41-6.58 9.19-12.93 12.99-19.9.97-1.8 1.97-3.57 2.97-5.35-.31 3.06-2.36 5.5-2.98 8.47z\"\n        ></Path>\n        <Path\n          fill=\"#065e57\"\n          stroke=\"#065e57\"\n          d=\"M334.74 249.26c-1.25-7.8 1.72-15.51 6.6-21.5 1.03.98 2.07 1.96 3.11 2.95.61-.31 1.23-.62 1.84-.92 3.1 1.12 6.66 1.32 9.11 3.79 2.36-.74 4.71-1.53 7.06-2.31-5.38 8.95-7.59 19.27-11.67 28.8-3.77 4.25-7.48 8.54-11.2 12.83-.2-.53-.59-1.59-.78-2.12-.01-.59-.02-1.77-.03-2.36 0-6.52-.27-13.57-4.04-19.16z\"\n        ></Path>\n        <Path\n          fill=\"#43005d\"\n          stroke=\"#43005d\"\n          d=\"M85.97 233.19c.9-1.17 1.87-2.28 2.84-3.38 0 8.93 4.41 16.93 9.18 24.18 3.04 3.94 5.21 8.56 8.97 11.92-8.46-1.16-16.06-5.25-23.3-9.51-2.94-2.03-6.62-1.51-9.88-2.54 3.8-7.04 10.28-12.7 12.19-20.67z\"\n        ></Path>\n        <Path\n          fill=\"#230041\"\n          stroke=\"#230041\"\n          d=\"M481.68 230.55c.97-1.72 2.84-.17 2.1 1.38.02 5.5-1.37 10.86-2.52 16.19-1.67 6.34-6.35 12.91-13.34 13.64-4.59 1.71-8.27-5.03-5.93-8.73 5.03-8.69 13.2-14.97 19.69-22.48z\"\n        ></Path>\n        <Path\n          fill=\"#27af8c\"\n          stroke=\"#27af8c\"\n          d=\"M488.29 229.38c.63 2.74.04 5.51-.31 8.24.66-.42 1.34-.83 2.02-1.23 1.28 1.63 2.44 3.35 3.5 5.14.57-.64 1.15-1.28 1.74-1.91 1.59 1.16 3.15 2.36 4.67 3.61-2.71 7.37-4.94 15.35-10.63 21.08-2.66 2.55-5.51 5.46-9.3 6.1-5.13.41-9.42-3.08-12.71-6.61 3.69-1.07 7.74-2.06 10.23-5.27 7.41-8.03 5.95-19.87 10.79-29.15z\"\n        ></Path>\n        <Path\n          fill=\"#fdecae\"\n          stroke=\"#fdecae\"\n          d=\"M509.91 233.02c.31-1.21 1.24-2.06 2.09-2.9V235a6.7 6.7 0 0 1-2.09-1.98z\"\n        ></Path>\n        <Path\n          fill=\"#faa257\"\n          stroke=\"#faa257\"\n          d=\"M367.38 231.25c.5 3.52-3.11 6.18-2.02 9.79-.25 2.41 2.28 3.01 3.91 4.02-2.23 1.31-4.45 2.67-6.5 4.26-1.78 1.39-3.37 3.05-4.57 4.97l.24-2.41c.95-7.5 4-14.86 8.94-20.63z\"\n        ></Path>\n        <Path\n          fill=\"#f26e55\"\n          stroke=\"#f26e55\"\n          d=\"M508.39 236.7c.52-1.22 1.02-2.45 1.52-3.68.54.8 1.24 1.46 2.09 1.98v12.49c-3.02-2.81-4.45-6.68-3.61-10.79z\"\n        ></Path>\n        <Path\n          fill=\"#29b892\"\n          stroke=\"#29b892\"\n          d=\"M242.02 243.28c3.31-2.95 6.17-6.44 9.91-8.89a99 99 0 0 0 4.56 4.37c4.08 3.69 8.58 6.9 13.36 9.64-1 2.38-.95 4.91 1.04 6.75l-1.24 2.6c-9.74-3.72-19.27-8.16-27.63-14.47z\"\n        ></Path>\n        <Path\n          fill=\"#080216\"\n          stroke=\"#080216\"\n          d=\"M259.52 237.23c.23-1.02.41-2.06.65-3.07 3.83 4.13 8.22 7.72 12.97 10.74 7.96 5.24 16.36 10.06 25.55 12.78 1.1 2.38 2.65 4.57 5.08 5.74 1.98 1.28 3.97 2.55 5.96 3.82-1.96.36-3.96.55-5.93.2l-.17-.05c-10.15-8.21-22.57-12.57-33.78-18.99-4.78-2.74-9.28-5.95-13.36-9.64 1-.52 2.02-1.01 3.03-1.53z\"\n        ></Path>\n        <Path\n          fill=\"#1a0038\"\n          stroke=\"#1a0038\"\n          d=\"M497.66 256.48c2.14-6.94 3.43-14.44 7.92-20.36.35.86.71 1.73 1.08 2.59l1.73-2.01c-.84 4.11.59 7.98 3.61 10.79v6.64c-2.19-1.51-4.6-2.64-7.02-3.71-3.99 5.42-6.18 12.1-11.02 16.89 1.4-3.58 3.68-6.86 3.7-10.83z\"\n        ></Path>\n        <Path\n          fill=\"#16002e\"\n          stroke=\"#16002e\"\n          d=\"M369.27 245.06c5.97-3.5 12.84-5.49 19.77-5.52 7.18.1 13.96 2.75 20.91 4.26 12.78 3.26 27.04 6.15 36.07 16.64-.38.62-1.14 1.86-1.52 2.47-3.73-4.09-8.62-6.92-13.67-9.05-12.21-5.06-25.93-5.52-38.88-3.79-11.89 2.28-22.49 9.68-28.77 20.03l-1.75-.45c1.4-3.67 4.32-6.38 6.93-9.19 3.12-3.07 6.38-6.23 10.54-7.83 3.61-1.43 7.01-3.55 10.91-4.12 3.74-.58 7.49-1.1 11.13-2.18-7.3-1.05-14.72.11-21.98-1.29-6.05-1.31-10.65 3.54-15.73 5.81-.11-.38-.34-1.15-.46-1.53 2.05-1.59 4.27-2.95 6.5-4.26z\"\n        ></Path>\n        <Path\n          fill=\"#11002f\"\n          stroke=\"#11002f\"\n          d=\"m50.03 245.2 4.01-.15c2.68 4.85 4.93 9.93 6.97 15.08 2.94 10.08 5.77 20.4 11.33 29.43 4.17 6.73 10.13 12.16 16.69 16.5 9.13 5.76 19.7 8.38 29.74 12.05 9.92 3.38 19.2 8.65 27.01 15.66-1.89.63-3.79 1.25-5.55 2.2-5.12 4.4-10.88 7.98-16.3 12.01-.31-.75-.93-2.23-1.24-2.98 5.45-3.52 11.29-6.79 15.42-11.93-1.38-2.14-2.91-4.18-4.65-6.04-4.51 4.65-9.08 9.25-13.9 13.57-2.18 3.17-4.78 5.94-8.11 7.93-2.95 2.67-5.6 5.67-8.54 8.37-4.39 4.07-4.37 10.44-6.33 15.72-1.79 5.56-5.89 10.17-10.92 13.06-.19-.33-.56-.99-.74-1.31 3.24-3.17 7.13-6.11 8.77-10.49.61-3.66.16-7.38-.01-11.06-3.26 1.58-5.14 5.63-9.18 5.33 6.83-5.28 11.27-12.88 17.66-18.59 2.4-2.19 4.82-4.36 7.32-6.44 2.48-1.77 4.87-3.66 7.09-5.76 1.23-1.15 2.46-2.3 3.68-3.46 2.36-2.2 4.67-4.58 5.84-7.65l-1.97.04c.24-.57.71-1.71.95-2.29-.7-.43-1.39-.86-2.07-1.31-3-2.3-6.67-4.14-10.51-4.07-5.21 1.27-10.65 1.39-15.73 3.15q-1.545.465-3.09.96l-2.31.68.18-4.72c1.02-.37 2.04-.76 3.05-1.15.03-.4.1-1.19.13-1.58l.04-1.35c-4.82-.38-9.34-2.13-14.03-3.09 1.07-.31 2.13-.68 3.16-1.09-4.94-5.17-10.99-9.47-14.67-15.76-4.38-7.37-7.22-15.57-9.46-23.82-2.56 2.17-4.35 5.05-5.69 8.1-2.25 4.58-5.83 8.32-8.31 12.77-3.17 5.63-5.82 11.52-8.93 17.18-1.87 3.56-4.12 6.96-5.37 10.81-.58-.43-1.16-.85-1.74-1.27q-1.035.99-2.07 2.01c-.14 1.13-.3 2.26-.44 3.4-8.28-6.74-17.2-12.8-27.21-16.65v-6.36c7.96.18 13.4 6.76 20.28 9.83 1.39-4.42.84-9.15 2.09-13.6 1.82-6.96 5.54-13.21 9.37-19.23 4.61-7.36 11.74-12.69 19.16-16.97 1.46-1.09 3.69-1.83 3.94-3.89-.99-2.98-4.23-4.14-7.07-3.17 1.23-1.39 2.58-2.67 4.11-3.73-.42-1.69-.95-3.37-1.85-4.88z\"\n        ></Path>\n        <Path\n          fill=\"#21003e\"\n          stroke=\"#21003e\"\n          d=\"M363.23 250.85c5.08-2.27 9.68-7.12 15.73-5.81 7.26 1.4 14.68.24 21.98 1.29-3.64 1.08-7.39 1.6-11.13 2.18-3.9.57-7.3 2.69-10.91 4.12-4.16 1.6-7.42 4.76-10.54 7.83-2.61 2.81-5.53 5.52-6.93 9.19-3.31 6.37-5.03 13.35-6.37 20.34-.05 3.82.65 7.6.71 11.42-4.37-8-.71-17.48-4.32-25.63-2.32 2.08-5.25 3.14-8.25 3.75-.91-.54-1.81-1.07-2.71-1.6 2.56-10.13 13.6-14.55 17.71-23.64 1.2-1.92 2.79-3.58 4.57-4.97.12.38.35 1.15.46 1.53z\"\n        ></Path>\n        <Path\n          fill=\"#fef3bc\"\n          stroke=\"#fef3bc\"\n          d=\"M31.71 248.8c4.47-2.08 9.47-2.64 14.34-2.35 1.45-.05 2.58.93 3.78 1.59-6.03 4.14-12.96 6.81-18.72 11.36C18.77 268.12 9.4 280.13 0 291.78v-18.86c7.96-10.92 19.53-18.6 31.71-24.12z\"\n        ></Path>\n        <Path\n          fill=\"#fdf2b6\"\n          stroke=\"#fdf2b6\"\n          d=\"M68.85 261.49c.66-4.34-2.29-9.15.17-13.07 2.3 9.01 2.88 18.5 6.65 27.1 3.33 8.76 9.66 16.29 17.69 21.1 11.2 6.65 24.07 9.49 36.16 14 13.64 6.35 26.94 13.79 38.46 23.53 5.46 5.11 10.99 10.22 15.63 16.13 9.48 11.32 14.41 25.65 24.08 36.83-.06.47-.18 1.43-.23 1.9-1.05-1.43-2.2-2.8-3.38-4.12-1.64-1.62-3.04-3.81-5.36-4.47-2.88.4-5.48 1.83-8.14 2.92-4.36-5.65-8.08-11.78-12.8-17.15-9.93-11.5-20.72-22.24-32-32.42-7.81-7.01-17.09-12.28-27.01-15.66-10.04-3.67-20.61-6.29-29.74-12.05-6.56-4.34-12.52-9.77-16.69-16.5-5.56-9.03-8.39-19.35-11.33-29.43 1.83.37 2.65 2.06 3.64 3.41.73-.85 1.47-1.7 2.21-2.53.5.12 1.5.36 1.99.48z\"\n        ></Path>\n        <Path\n          fill=\"#1cc2a6\"\n          stroke=\"#1cc2a6\"\n          d=\"M270.89 255.15c-1.99-1.84-2.04-4.37-1.04-6.75 11.21 6.42 23.63 10.78 33.78 18.99-1.54.06-3.08.17-4.62.26-.45 1.58-1.53 3.37-.52 4.98 1.68 2.13 3.75 3.99 4.82 6.56-9.71-9.27-21.56-15.83-33.66-21.44z\"\n        ></Path>\n        <Path\n          fill=\"#fd2347\"\n          stroke=\"#fd2347\"\n          d=\"M363.18 270.1c6.28-10.35 16.88-17.75 28.77-20.03.46.69.91 1.38 1.38 2.08.26 4.31.74 8.66-.08 12.94.74.9 1.48 1.79 2.23 2.69-3.84.91-7.64 2.3-10.84 4.66-5.79 4.34-9.31 11-11.76 17.66-1.66-3.31-4.47-5.65-7.71-7.3-2.91-1.36-3.13-4.84-4.35-7.42.7-1.8 1.48-3.57 2.36-5.28z\"\n        ></Path>\n        <Path\n          fill=\"#fc1549\"\n          stroke=\"#fc1549\"\n          d=\"M391.95 250.07c12.95-1.73 26.67-1.27 38.88 3.79.54 1.28 1.09 2.56 1.63 3.85-2.14 3.79-1.68 8.16-.59 12.2-.3.72-.91 2.16-1.21 2.87-10.98-5-23.24-6.7-35.18-5-.75-.9-1.49-1.79-2.23-2.69.82-4.28.34-8.63.08-12.94-.47-.7-.92-1.39-1.38-2.08z\"\n        ></Path>\n        <Path\n          fill=\"#4d006d\"\n          stroke=\"#4d006d\"\n          d=\"M493.96 267.31c4.84-4.79 7.03-11.47 11.02-16.89 2.42 1.07 4.83 2.2 7.02 3.71v35.42c-10.66-2.22-20.3-7.81-28.73-14.55.95-.58 1.91-1.15 2.89-1.7 2.95-1.49 5.69-3.43 7.8-5.99z\"\n        ></Path>\n        <Path\n          fill=\"#3e005d\"\n          stroke=\"#3e005d\"\n          d=\"M47.77 253.81c2.84-.97 6.08.19 7.07 3.17-.25 2.06-2.48 2.8-3.94 3.89-7.42 4.28-14.55 9.61-19.16 16.97-3.83 6.02-7.55 12.27-9.37 19.23-1.25 4.45-.7 9.18-2.09 13.6-6.88-3.07-12.32-9.65-20.28-9.83v-5.59c3.19-4.48 7.42-8.06 10.94-12.26 6.65-8.34 14.84-15.27 23.25-21.77 4.14-3.16 9.24-4.6 13.58-7.41z\"\n        ></Path>\n        <Path\n          fill=\"#fd244b\"\n          stroke=\"#fd244b\"\n          d=\"M430.83 253.86c5.05 2.13 9.94 4.96 13.67 9.05 1.47 1.95 2.75 4.03 4.01 6.12-1.11 2.8-2.45 5.51-4.13 8.01-4.65-1.19-9.39-2.14-13.72-4.26.3-.71.91-2.15 1.21-2.87-1.09-4.04-1.55-8.41.59-12.2-.54-1.29-1.09-2.57-1.63-3.85z\"\n        ></Path>\n        <Path\n          fill=\"#fe0438\"\n          stroke=\"#fe0438\"\n          d=\"M0 257.66c4.34.17 8.66-.28 12.9-1.18-4.56 3.98-9.14 7.98-12.9 12.76z\"\n        ></Path>\n        <Path\n          fill=\"#35004f\"\n          stroke=\"#35004f\"\n          d=\"M302.39 260.45c3.57-.77 6.89-2.37 9.85-4.5 4.53 3.8 6.88 9.57 11.6 13.19 2.02 1.57 3.99 3.21 5.69 5.14-7.3 1.1-13.65-3.86-19.8-7.04-1.99-1.27-3.98-2.54-5.96-3.82-.48-.99-.93-1.98-1.38-2.97z\"\n        ></Path>\n        <Path\n          fill=\"#fe9265\"\n          stroke=\"#fe9265\"\n          d=\"m252.26 257.51.91.11c25.44 4.64 49.56 20.78 60.58 44.64 5.01 9.64 6.02 21.07 3.75 31.62-.46 2.09-.94 4.17-1.25 6.29l-1.29-.82c-.39-2.22-.63-4.45-.97-6.67-1.27-10.45-5.81-20.21-11.55-28.94-7.16-10.09-15.07-19.66-23.55-28.67-7.31-7.11-15.96-12.92-25.33-16.94-.33-.16-.98-.46-1.3-.62z\"\n        ></Path>\n        <Path\n          fill=\"#f50049\"\n          stroke=\"#f50049\"\n          d=\"M73.91 257.67c5.93-.29 10.65 3.73 15.94 5.7 11.28 5.23 23.67 6.95 35.71 9.58 11.52 1.84 23.46 2.42 34.92-.16 7.88-1.51 16.32-3.61 22.23-9.38-4.05 5.36-8.72 10.37-14.58 13.78-13.67 8.38-29.86 13.3-45.97 12.22-14.51-2.15-28.11-8.87-39.37-18.17-4.17-3.58-7.06-8.42-8.88-13.57z\"\n        ></Path>\n        <Path\n          fill=\"#15002c\"\n          stroke=\"#15002c\"\n          d=\"M247.03 260.78c2.43 0 4.44-1.64 6.53-2.65 9.37 4.02 18.02 9.83 25.33 16.94 8.48 9.01 16.39 18.58 23.55 28.67-.48.17-1.43.49-1.91.65-1.04-.26-2.06-.53-3.09-.78-3.26-3.71-5.74-8.15-9.72-11.18 1.32 9.33.52 19.21-4.59 27.35 7.99 8.38 17.89 14.79 25.23 23.82 1.21 1.29 2.35 3.02 4.29 3.17l1.06-.52c-.53 3.43.92 6.55 2.46 9.51.97 1.35.36 2.91-.21 4.29a93 93 0 0 0-3.66-4.94c-8.03-10.34-17.56-19.38-27.06-28.35-6.86-6.22-12.67-13.48-19.46-19.77-8.6-8.07-17.36-16.47-28.28-21.3-11.19-4.56-23.82-6.39-35.65-3.36-8.72 2.68-15.82 8.95-21.69 15.73-6.77 9.04-11.33 19.51-15.52 29.94-2.69-1.4-4.88-3.45-6.46-6.02l1.89.08c5.35-6.14 8.77-13.58 12.06-20.96-3.72 1.61-7.24 3.69-11.09 4.97-8.89 3.15-18.53 2.64-27.76 1.8.14.54.41 1.61.55 2.15-1.29-.61-2.56-1.28-3.63-2.24.26-2.27 3.16-1.47 4.72-1.42 3.75.56 7.62.67 11.17-.85-.61-.37-1.83-1.1-2.44-1.46 5.65-.44 11.44-.52 16.8-2.61 6.56-2.36 12.65-5.99 17.66-10.87 3.35-2.9 6.57-5.98 9.18-9.58 2.11-.36 4.85.52 6.46-1.29 3.83-3.84 7.02-8.29 11.07-11.91 2.19-2.11 5.44-1.19 8.16-1.75 5.12-.92 9.83-3.4 15-4.16 6.3-.91 12.69-1.28 19.05-1.1z\"\n        ></Path>\n        <Path\n          fill=\"#ff7958\"\n          stroke=\"#ff7958\"\n          d=\"M48.07 266.64c2.51-1.41 4.99-3.13 7.9-3.55 1.36.11 1.38 1.86 1.54 2.86.37 2.87-1.91 5.04-3.22 7.35-1.76-2.49-3.76-4.82-6.22-6.66z\"\n        ></Path>\n        <Path\n          fill=\"#29b490\"\n          stroke=\"#29b490\"\n          d=\"M207.21 272.22c11.21-7.53 25.48-10.25 38.7-7.63 12.62 2.83 24.36 10.12 31.88 20.73 6.31 9.05 7.8 21.25 3.34 31.42-9.28-9.68-17.65-20.41-28.7-28.22-10.59-8.33-23.98-12.99-37.47-12.7-5.65.35-11.22 1.37-16.69 2.81 3.08-2 5.82-4.47 8.94-6.41z\"\n        ></Path>\n        <Path\n          fill=\"#32b78e\"\n          stroke=\"#32b78e\"\n          d=\"M185.54 265.02c1.24 1.61 2.47 3.25 3.38 5.08 1.08 2.07 2.21 4.33 1.11 6.66-.86 1.44-1.79 2.84-2.74 4.23-2.61 3.6-5.83 6.68-9.18 9.58.17-2.85 2.12-4.96 3.76-7.11-1.38-1.32-2.73-2.68-3.89-4.21q-1.62-.555-3.24-1.08c4.49-3.55 8.38-7.93 10.8-13.15z\"\n        ></Path>\n        <Path\n          fill=\"#ff9a6a\"\n          stroke=\"#ff9a6a\"\n          d=\"M25.45 305.05c2.24-14.91 9.65-30.06 22.62-38.41 2.46 1.84 4.46 4.17 6.22 6.66-4.45 7.8-10.16 14.86-14.08 22.98-4.05 7.75-6.75 16.46-13.22 22.67-4-3.48-1.36-9.38-1.54-13.9z\"\n        ></Path>\n        <Path\n          fill=\"#10b7ae\"\n          stroke=\"#10b7ae\"\n          d=\"M299.01 267.65c1.54-.09 3.08-.2 4.62-.26l.17.05c4.71 3.45 9.46 7.01 15.02 9.01 4.51 1.92 9.48 1.68 14.28 1.98-2.1 3.9-6.01 6.58-10.16 7.87-7.27 1.89-14.73-1.88-19.63-7.11-1.07-2.57-3.14-4.43-4.82-6.56-1.01-1.61.07-3.4.52-4.98z\"\n        ></Path>\n        <Path\n          fill=\"#25002c\"\n          stroke=\"#25002c\"\n          d=\"M355.06 289.99c1.34-6.99 3.06-13.97 6.37-20.34l1.75.45c-.88 1.71-1.66 3.48-2.36 5.28-4.47 11.55-2.47 25.21 4.48 35.37.94 1.58 2.25 2.99 4.17 3.25.69.17 2.08.49 2.77.65-1.93 1.36-3.88 2.71-5.93 3.89l.28-1.61c.04-.24.13-.73.18-.97-1.99-.83-3.99-1.65-5.86-2.72.52-.12 1.56-.37 2.07-.5-2.34-3.83-5.81-6.97-7.21-11.33-.06-3.82-.76-7.6-.71-11.42z\"\n        ></Path>\n        <Path\n          fill=\"#620032\"\n          stroke=\"#620032\"\n          d=\"M54.07 278.95c1.34-3.05 3.13-5.93 5.69-8.1 2.24 8.25 5.08 16.45 9.46 23.82 3.68 6.29 9.73 10.59 14.67 15.76-1.03.41-2.09.78-3.16 1.09-6.08.89-12.06 3.29-16.37 7.79-4.5 4.73-8.74 10.1-10.58 16.47-.37 1.04-.74 2.09-1.12 3.13-7.38-6.06-13.25-13.81-21.2-19.2 1.25-3.85 3.5-7.25 5.37-10.81-.01.65-.02 1.95-.03 2.6 3.92-3 6.66-7.16 9.53-11.1 3.43-5.13 6.87-10.43 8.57-16.42.77-1.76.34-3.58-.83-5.03z\"\n        ></Path>\n        <Path\n          fill=\"#1f0759\"\n          stroke=\"#1f0759\"\n          d=\"M77.85 275.02c-.35-1.22-1.15-4 1.06-3.72 6.81 7.73 15.55 13.6 24.88 17.9 6.34 2.58 13.37 2.4 19.93 4.16 1.16 3.37 1.25 7.92-.46 11.26-10.39-2.99-21.08-5.79-30.27-11.71-6.1-4.9-13.03-9.9-15.14-17.89z\"\n        ></Path>\n        <Path\n          fill=\"#4c0073\"\n          stroke=\"#4c0073\"\n          d=\"M382.48 278.59c3.93-4.55 9.59-7.39 15.57-7.94 7.95-.63 16.06.21 23.67 2.66 3.21.93 6.57 1.62 9.4 3.51-9.07 3.45-18.29 6.54-27.35 10.03-7.85 3.93-16.51 6.8-22.95 12.99-2.95 2.74-4.91 6.33-7.7 9.22.18-10.77 2.79-21.76 9.36-30.47z\"\n        ></Path>\n        <Path\n          fill=\"#0c002e\"\n          stroke=\"#0c002e\"\n          d=\"M456.67 279.77c-1.22-2.66-3.57-5.43-2.09-8.47 4.26 6.04 9.51 11.4 15.62 15.58-1.15.48-2.3.97-3.4 1.55l-.84 1.16c-1.38 1.16-2.9 2.14-4.47 3.01-1.34-.33-2.68-.64-4.01-.96-.01-1.01-.01-2.01.01-3.02.46-3.12-.93-5.96-2.46-8.56.41-.07 1.23-.22 1.64-.29z\"\n        ></Path>\n        <Path\n          fill=\"#170034\"\n          stroke=\"#170034\"\n          d=\"M475.65 271.94c3.71-.93 6.83 1.98 10.51 1.36-.98.55-1.94 1.12-2.89 1.7 8.43 6.74 18.07 12.33 28.73 14.55v4.91c-13.92-3.16-25.34-12.23-37.09-19.81.24-.91.49-1.81.74-2.71z\"\n        ></Path>\n        <Path\n          fill=\"#2fb48c\"\n          stroke=\"#2fb48c\"\n          d=\"M450.46 274.17c2.61.37 2.98 4.09 4.57 5.89 1.53 2.6 2.92 5.44 2.46 8.56-3.69 5.22-8.68 9.29-12.62 14.28-4.36 5.32-7.7 11.36-11.58 17.02-2.27 3.04-4.47 6.16-7.32 8.7-4.75.81-9.34-1.73-12.52-5.06-1.67-1.35-.55-3.39-.11-5.03 2.96-8.62 10.67-14.1 17.08-20.06 4.4-4.01 8.26-8.57 12.07-13.13 2.95-3.51 5.08-7.62 7.97-11.17z\"\n        ></Path>\n        <Path\n          fill=\"#370054\"\n          stroke=\"#370054\"\n          d=\"M343.2 279.53c3-.61 5.93-1.67 8.25-3.75 3.61 8.15-.05 17.63 4.32 25.63 1.4 4.36 4.87 7.5 7.21 11.33-.51.13-1.55.38-2.07.5-9.23-5.65-16.48-14.14-20.77-24.08.03-3.74.09-7.5.35-11.23.9.53 1.8 1.06 2.71 1.6z\"\n        ></Path>\n        <Path\n          fill=\"#fe3a40\"\n          stroke=\"#fe3a40\"\n          d=\"M360.82 275.38c1.22 2.58 1.44 6.06 4.35 7.42 3.24 1.65 6.05 3.99 7.71 7.3-2.76 7.65-2.87 15.88-3.41 23.9-1.92-.26-3.23-1.67-4.17-3.25-6.95-10.16-8.95-23.82-4.48-35.37z\"\n        ></Path>\n        <Path\n          fill=\"#20b69e\"\n          stroke=\"#20b69e\"\n          d=\"M152.82 289.49c7.73-2.82 15.3-6.39 21.92-11.32q1.62.525 3.24 1.08c1.16 1.53 2.51 2.89 3.89 4.21-1.64 2.15-3.59 4.26-3.76 7.11-5.01 4.88-11.1 8.51-17.66 10.87-.44-.54-1.34-1.61-1.78-2.15-1.07-.16-2.14-.3-3.2-.45.55-.93 1.11-1.87 1.51-2.88-.96-.45-1.95-.84-2.94-1.22 1.3-1.46 2.59-2.91 3.88-4.37-1.7-.32-3.4-.64-5.1-.88z\"\n        ></Path>\n        <Path\n          fill=\"#fecc86\"\n          stroke=\"#fecc86\"\n          d=\"M422.73 283.12c5.49-2.46 11.25-4.62 17.35-4.76-.61 1.3-1.24 2.59-1.91 3.86-2.73 3.7-6.21 6.78-9.96 9.42-2.37-2.45-4.6-5.15-5.48-8.52z\"\n        ></Path>\n        <Path\n          fill=\"#dc003d\"\n          stroke=\"#dc003d\"\n          d=\"M45.76 291.72c2.48-4.45 6.06-8.19 8.31-12.77 1.17 1.45 1.6 3.27.83 5.03-1.7 5.99-5.14 11.29-8.57 16.42-2.87 3.94-5.61 8.1-9.53 11.1.01-.65.02-1.95.03-2.6 3.11-5.66 5.76-11.55 8.93-17.18z\"\n        ></Path>\n        <Path\n          fill=\"#fdeeb0\"\n          stroke=\"#fdeeb0\"\n          d=\"M201.85 282.33c11.83-3.03 24.46-1.2 35.65 3.36 10.92 4.83 19.68 13.23 28.28 21.3 6.79 6.29 12.6 13.55 19.46 19.77 9.5 8.97 19.03 18.01 27.06 28.35.28 1 .55 2 .81 3.01-2.2-1.89-4.5-3.67-6.95-5.22l-2.31 2.16c-1.23-.54-2.45-1.07-3.67-1.59-.41.13-1.23.4-1.64.54.37 1.29.73 2.6.73 3.97-5.11-5.27-10.1-10.65-15.33-15.79a96 96 0 0 0-5.74-6.19c-10.46-11.93-21.7-23.33-34.57-32.69-8.84-6.32-19.73-10.01-30.67-8.93-13.39.64-24.9 10.2-30.49 22-3.06 5.86-6.11 11.84-10.66 16.72-.33-.11-.99-.32-1.32-.43-2-1.51-3.82-3.22-5.85-4.67 4.19-10.43 8.75-20.9 15.52-29.94 5.87-6.78 12.97-13.05 21.69-15.73z\"\n        ></Path>\n        <Path\n          fill=\"#150020\"\n          stroke=\"#150020\"\n          d=\"m438.17 282.22 3.59.42c.18.68.54 2.02.73 2.7-3.81 4.56-7.67 9.12-12.07 13.13l-3.33-.56c1.09-1.18 2.03-2.51 2.89-3.87-4.18 1.91-7.02 5.69-10.93 7.97-8.1 3.78-17.02 5.44-25.06 9.38-1.51-.77-3.01-1.54-4.51-2.32 8.03-3.09 16.24-5.72 24.11-9.19 5.12-2.27 10.07-4.96 14.62-8.24 3.75-2.64 7.23-5.72 9.96-9.42z\"\n        ></Path>\n        <Path\n          fill=\"#fedf99\"\n          stroke=\"#fedf99\"\n          d=\"M407.28 289.19c5.14-2.05 10.36-3.9 15.45-6.07.88 3.37 3.11 6.07 5.48 8.52-4.55 3.28-9.5 5.97-14.62 8.24-2.09-.59-4.23-.93-6.37-1.15-.28-.32-.83-.97-1.11-1.29l2.28-.72c-.93-2.41-1.05-4.99-1.11-7.53z\"\n        ></Path>\n        <Path\n          fill=\"#53006e\"\n          stroke=\"#53006e\"\n          d=\"M325.39 289.48c3.09-.86 5.81-2.6 8.45-4.37.78 2.6-.45 5.14-1.34 7.53-2.35 6.09-6.42 11.35-10.77 16.15-.24-.13-.72-.4-.97-.54-3.66-5.92-5.35-13.01-10.51-17.97 5.04.03 10.26.88 15.14-.8z\"\n        ></Path>\n        <Path\n          fill=\"#0b021b\"\n          stroke=\"#0b021b\"\n          d=\"M333.48 299.45c.98-4.27.97-8.97 3.27-12.79 1.14.81 2.28 1.63 3.39 2.5 4.29 9.94 11.54 18.43 20.77 24.08 1.87 1.07 3.87 1.89 5.86 2.72-.05.24-.14.73-.18.97l-1.1.31c-3.73-.77-7.49-1.96-11.34-1.49-8.45 1.2-17.05 3.85-23.56 9.62-3.7 3.27-6.65 7.41-8.43 12.04-1.3 2.96-1.81 6.16-2.21 9.35-.42 1.7-.92 3.39-1.4 5.08-1.53-3.71-2.41-7.64-2.3-11.67.31-2.12.79-4.2 1.25-6.29 4.39.42 6.28-4.03 7.36-7.51.93-3.35 4.54-4.53 7.12-6.33 6.64-4.24 14.28-6.58 22.07-7.5-3.24-2.62-6.68-5.08-9.28-8.38-3.46-4.16-5.72-9.12-7.81-14.06-.33 3.38-1.58 6.55-3.48 9.35z\"\n        ></Path>\n        <Path\n          fill=\"#0c011e\"\n          stroke=\"#0c011e\"\n          d=\"M470.2 286.88c12.42 8.7 26.43 16.28 41.8 17.61v12.05c-4.2 4.54-6.09 10.69-9.27 15.94-6.78 13.22-15.23 25.96-26.95 35.33-4.66 3.61-9.31 7.28-14.32 10.39-.69.43-1.31.95-1.84 1.57 2.14.22 4.29.31 6.45.38 5.21-.12 10.05 2.57 15.31 1.92 10.92 1.98 20.75 7.3 30.62 12.12v3.2c-9.5-4.58-19.02-9.3-29.04-12.63-7.08-2.43-14.72-2.44-22.06-1.4.85 1.64 1.71 3.3 2.95 4.7 4.47 5.11 9.11 10.11 14.41 14.39-.17.53-.51 1.59-.67 2.12.61 1.27 1.33 2.6.84 4.06-12.16-9.98-21.21-23.25-28.04-37.31 1.16.41 2.33.83 3.5 1.25.17-4.47-.17-8.95-1.19-13.3-1.13.68-2.28 1.35-3.38 2.08 1.01-6.74 3.23-13.27 6.27-19.35 3.37-5.06 7.46-9.57 11.71-13.89 6.84-6.47 14.57-11.95 22.6-16.84-9.19 3.52-18.64 6.6-27.12 11.72-5.21 3.36-10.25 7.5-12.88 13.27a33.7 33.7 0 0 0-2.79 8.25c-.91-1.4-.98-3.08-1.08-4.68.68-5.76 4.76-10.22 8.85-13.96 10.02-9.47 23.54-13.56 36.36-17.66 3.08-.88 6.14-1.89 9.05-3.26-3.7-1.64-7.68-2.44-11.47-3.82-6.59-3.16-12.68-7.24-18.78-11.24-1.17-1.03-2.73-.42-4.08-.3l.84-1.16c1.1-.58 2.25-1.07 3.4-1.55z\"\n        ></Path>\n        <Path\n          fill=\"#0b0519\"\n          stroke=\"#0b0519\"\n          d=\"M444.87 302.9c3.94-4.99 8.93-9.06 12.62-14.28-.02 1.01-.02 2.01-.01 3.02 1.33.32 2.67.63 4.01.96-8.25 4.53-16.42 11.06-18.95 20.56-4.03.97-5.46 5.43-9.25 6.76 3.88-5.66 7.22-11.7 11.58-17.02z\"\n        ></Path>\n        <Path\n          fill=\"#f00048\"\n          stroke=\"#f00048\"\n          d=\"M465.96 289.59c1.35-.12 2.91-.73 4.08.3 6.1 4 12.19 8.08 18.78 11.24 2.04 1.85 3.75 4.27 2.42 7.08-12.82 4.1-26.34 8.19-36.36 17.66-4.09 3.74-8.17 8.2-8.85 13.96-1.86-.65-2.46-2.59-3.28-4.16-1.05-7.43-2.61-15.16-.21-22.51 2.53-9.5 10.7-16.03 18.95-20.56 1.57-.87 3.09-1.85 4.47-3.01z\"\n        ></Path>\n        <Path\n          fill=\"#18b8b0\"\n          stroke=\"#18b8b0\"\n          d=\"M127.45 293.54c8.58-.41 17.1-1.72 25.37-4.05 1.7.24 3.4.56 5.1.88-1.29 1.46-2.58 2.91-3.88 4.37.99.38 1.98.77 2.94 1.22-.4 1.01-.96 1.95-1.51 2.88 1.06.15 2.13.29 3.2.45.44.54 1.34 1.61 1.78 2.15-5.36 2.09-11.15 2.17-16.8 2.61-5.33.23-10.66.06-15.98.39-.07-3.63-.15-7.27-.22-10.9z\"\n        ></Path>\n        <Path\n          fill=\"#ee0048\"\n          stroke=\"#ee0048\"\n          d=\"M336.96 290.1c2.09 4.94 4.35 9.9 7.81 14.06 2.6 3.3 6.04 5.76 9.28 8.38-7.79.92-15.43 3.26-22.07 7.5-2.58 1.8-6.19 2.98-7.12 6.33-1.94-4.15-1.94-8.96-1.14-13.38 2.53-5 7.18-8.55 9.76-13.54 1.9-2.8 3.15-5.97 3.48-9.35z\"\n        ></Path>\n        <Path\n          fill=\"#fdedab\"\n          stroke=\"#fdedab\"\n          d=\"M384.11 301.14c6.72-5.65 15.13-8.7 23.17-11.95.06 2.54.18 5.12 1.11 7.53l-2.28.72c.28.32.83.97 1.11 1.29 2.14.22 4.28.56 6.37 1.15-7.87 3.47-16.08 6.1-24.11 9.19-5.14 1.78-10.14 3.97-15.34 5.56l-1.1.02c3.25-4.84 6.94-9.4 11.07-13.51z\"\n        ></Path>\n        <Path\n          fill=\"#066659\"\n          stroke=\"#066659\"\n          d=\"M287.72 292.43c3.98 3.03 6.46 7.47 9.72 11.18 3.97 5.61 7.19 11.74 9.9 18.06 3.33 7.98 3.69 16.71 5.31 25.1-1.94-.15-3.08-1.88-4.29-3.17-7.34-9.03-17.24-15.44-25.23-23.82 5.11-8.14 5.91-18.02 4.59-27.35z\"\n        ></Path>\n        <Path\n          fill=\"#0f0224\"\n          stroke=\"#0f0224\"\n          d=\"M182.47 316.38c5.59-11.8 17.1-21.36 30.49-22 10.94-1.08 21.83 2.61 30.67 8.93 12.87 9.36 24.11 20.76 34.57 32.69-5.73-1.8-7.91-8.6-13.65-10.33-.31 2.97.17 6.46-2.15 8.76-2.67 2.68-3.09 6.98-6.41 9.08 2.06-6.4 5.71-13.42 2.73-20.12-1.98-.3-3.42 1.41-4.94 2.39-7.02 5.64-13.8 12.13-17.45 20.53-2.42 5.02-2.99 10.72-2.5 16.23-.28 7.5.63 15.26-1.97 22.48-1.33 4.36-3.88 8.24-7.16 11.39 4.13-.43 8.32-1.04 12.1-2.88 1.46 1.18 2.91 2.36 4.36 3.55-3.26.43-6.52.96-9.71 1.79-4.79.43-10.06.56-14.12-2.45-3.65-2.63-6.51-6.14-9.64-9.31-9.67-11.18-14.6-25.51-24.08-36.83l.27-1.29c1.59.92 3.18 1.87 4.76 2.82l.57-3.6c.46.17 1.39.52 1.85.69.68 3.48 1.98 6.78 3.27 10.07-.37-5.55 1.19-10.93 3.33-15.99 3.26-5.37 7.61-10.2 13.19-13.19 13.35-7.22 29.72-6.15 42.56-14.57-6.39-5.26-12.81-10.73-20.54-13.93-10.41-4.62-23.22-5.8-33.42-.01-5.23 2.73-9.51 7.16-11.9 12.57-.86 2.22-2.77 3.29-5.08 2.53z\"\n        ></Path>\n        <Path\n          fill=\"#420058\"\n          stroke=\"#420058\"\n          d=\"M419.05 302.01c3.91-2.28 6.75-6.06 10.93-7.97-.86 1.36-1.8 2.69-2.89 3.87-3.97 4.1-8.53 7.58-12.38 11.8-3.1 3.3-4.12 7.85-5.41 12.05-6.64-1.52-12.45-6.06-19.57-5.75-1.09-2.77 2.53-3.49 4.26-4.62 8.04-3.94 16.96-5.6 25.06-9.38z\"\n        ></Path>\n        <Path\n          fill=\"#f00044\"\n          stroke=\"#f00044\"\n          d=\"M199.45 301.28c10.2-5.79 23.01-4.61 33.42.01 7.73 3.2 14.15 8.67 20.54 13.93-12.84 8.42-29.21 7.35-42.56 14.57-5.58 2.99-9.93 7.82-13.19 13.19-1.1.99-2.23 1.94-3.36 2.9-2.34-3.41-1.87-8.26-5.19-11-1.37-6.91-2.36-13.99-1.56-21.03 2.39-5.41 6.67-9.84 11.9-12.57z\"\n        ></Path>\n        <Path\n          fill=\"#0b0021\"\n          stroke=\"#0b0021\"\n          d=\"m427.09 297.91 3.33.56c-6.41 5.96-14.12 11.44-17.08 20.06-.44 1.64-1.56 3.68.11 5.03 3.18 3.33 7.77 5.87 12.52 5.06l.06 1.82c-1.59.42-3.2.77-4.8 1.13 4.72 4.32 9 9.08 13.63 13.48-.05.63-.14 1.88-.19 2.51-7.61-9.02-16.95-16.45-27.13-22.37-1.24-.73-2.5-1.46-3.75-2.15a56 56 0 0 0-6.06-2.81c-3.45-1.07-7.29-2.41-10.74-.65 3.35 3.97 7.74 6.81 11.75 10.04.48.39 1.45 1.18 1.94 1.57-6.07 2.47-8.67-6.65-14.68-5.34 1.62 1.76 4.61 3.24 3.81 6.12-.74 3.85-2.53 7.45-2.86 11.4-.67 2.83-1.78 5.73-1.25 8.67 1.04 3.57 3.74 6.3 6.31 8.85 3 2.79 6.11 5.81 10.15 6.97 3.44.98 6.99 1.46 10.45 2.39 6.61 2.08 14.04.09 20.44 2.88-3.87.31-7.75.43-11.61.73-10.13.26-20.65-1.46-29.28-7.04-5.38-3.5-9.39-9.35-9.71-15.87-.34-4.12 1.13-8.06 2.55-11.84 1.35-3.24 1.84-6.74 1.82-10.23-2.85.75-5.12 2.65-7.27 4.56-5.99 5.06-11.91 10.47-15.66 17.48-.87 1.05-1.78 2.06-2.69 3.08.15-1.38.31-2.75.48-4.12-1.75 1.03-3.38 2.75-5.59 2.46 7.79-10.27 17.53-18.78 27.87-26.38 2.48-1.17 1.01-3.49.4-5.38-19.3 7.41-35.92 21.34-47.13 38.67-2.94 5.4-6.42 10.95-6.85 17.24.37-.03 1.12-.07 1.49-.09 1.57 1.22-.14 2.1-.9 3.05-.91-1.22-2.23-2.27-2.61-3.8.17-2.3.86-4.52 1.28-6.77.88-6.91 5.03-12.69 9.03-18.15 4.33-5.94 9.99-10.71 15.46-15.55 5.08-4.26 10.37-8.42 16.37-11.31 2.54-1.11 4.99-2.41 7.4-3.76 4.15-.62 8.66-1.01 11.83-4.1 7.12-.31 12.93 4.23 19.57 5.75 1.29-4.2 2.31-8.75 5.41-12.05 3.85-4.22 8.41-7.7 12.38-11.8z\"\n        ></Path>\n        <Path\n          fill=\"#1d0d57\"\n          stroke=\"#1d0d57\"\n          d=\"M161.04 306.07c3.85-1.28 7.37-3.36 11.09-4.97-3.29 7.38-6.71 14.82-12.06 20.96l-1.89-.08c-8.05-4.12-16.2-8.06-24.35-11.96-.14-.54-.41-1.61-.55-2.15 9.23.84 18.87 1.35 27.76-1.8z\"\n        ></Path>\n        <Path\n          fill=\"#c1004a\"\n          stroke=\"#c1004a\"\n          d=\"M488.82 301.13c3.79 1.38 7.77 2.18 11.47 3.82-2.91 1.37-5.97 2.38-9.05 3.26 1.33-2.81-.38-5.23-2.42-7.08z\"\n        ></Path>\n        <Path\n          fill=\"#0e0021\"\n          stroke=\"#0e0021\"\n          d=\"M297.44 303.61c1.03.25 2.05.52 3.09.78.48-.16 1.43-.48 1.91-.65 5.74 8.73 10.28 18.49 11.55 28.94-.38 4.52-.19 9.05-.28 13.57l-1.06.52c-1.62-8.39-1.98-17.12-5.31-25.1-2.71-6.32-5.93-12.45-9.9-18.06z\"\n        ></Path>\n        <Path\n          fill=\"#fdf1b2\"\n          stroke=\"#fdf1b2\"\n          d=\"M0 307.2c10.01 3.85 18.93 9.91 27.21 16.65 7.26 6.13 14.18 12.7 20.48 19.82 11.15 12.72 18.97 27.86 29.58 40.98 7.06 8.33 13.33 17.33 20.84 25.28 6.97 7.64 15.22 13.92 22.55 21.17 1.54 1.59 2.97 3.28 4.33 5.03-2.85-.15-5.68-.55-8.49-1.06.37 1.28.67 2.6.77 3.95-1.19-.6-2.37-1.16-3.53-1.8-8.62-5.42-17.04-11.45-23.62-19.31-10.82-12.73-20.13-26.62-30.27-39.87-10.39-15.39-23.93-28.25-35.04-43.07C17.25 326.52 9.79 317.7 0 311.72z\"\n        ></Path>\n        <Path\n          fill=\"#220034\"\n          stroke=\"#220034\"\n          d=\"M374.14 314.63c5.2-1.59 10.2-3.78 15.34-5.56 1.5.78 3 1.55 4.51 2.32-1.73 1.13-5.35 1.85-4.26 4.62-3.17 3.09-7.68 3.48-11.83 4.1 1.94-1.04 3.66-2.48 3.93-4.79-2.92.03-5.75.76-8.51 1.66.21-.59.61-1.76.82-2.35z\"\n        ></Path>\n        <Path\n          fill=\"#0ba8a9\"\n          stroke=\"#0ba8a9\"\n          d=\"M502.84 309.87c1.06-.67 2.32-.46 3.52-.47q.435 1.755.9 3.51c-.42 1.65-.79 3.32-1.32 4.95-8.58 19.29-20.34 37.89-37.64 50.49-3.72 2.55-7.28 5.4-11.35 7.37-1.95-9.11-2.68-18.99 1.09-27.75 4.09-9.49 11.68-16.97 19.89-23 7.71-5.96 16.19-10.8 24.91-15.1z\"\n        ></Path>\n        <Path\n          fill=\"#fdfedb\"\n          stroke=\"#fdfedb\"\n          d=\"M462.78 322.99c8.48-5.12 17.93-8.2 27.12-11.72-8.03 4.89-15.76 10.37-22.6 16.84-.34-1.14-.67-2.28-1-3.42-1.18-.57-2.35-1.14-3.52-1.7z\"\n        ></Path>\n        <Path\n          fill=\"#100126\"\n          stroke=\"#100126\"\n          d=\"M0 311.72c9.79 5.98 17.25 14.8 24.81 23.25 11.11 14.82 24.65 27.68 35.04 43.07 10.14 13.25 19.45 27.14 30.27 39.87 6.58 7.86 15 13.89 23.62 19.31l-2.87 1.08c-5.19-3.19-10.34-6.46-15.39-9.86-7.02-6.12-13-13.3-19.04-20.35-2.93-4.25-5.81-8.55-9.08-12.54-3.91-4.74-6.74-10.22-10.48-15.08-1.3 2.92-2.25 6.39-5.27 8.04-6.54 3.95-14.26 5.63-21.84 5.86 3.54 3.38 8.63 4.25 12.36 7.37 7.33 4.91 12.07 12.51 18.43 18.46 6.06 6.45 12.79 12.52 20.73 16.56 8.4 3.33 17.51 4.32 26.42 5.39 4.57.98 9.23 1.45 13.9 1.56.14-.62.42-1.86.57-2.48 2.47 1.03 4.94 2.11 7.37 3.24-1.3-2.89-2.64-5.8-4.56-8.34-1.36-1.75-2.79-3.44-4.33-5.03q1.725-1.71 3.45-3.39c3.55 3.63 6.56 7.75 9.03 12.18 4.83-7.07 8.25-15.22 14.49-21.26 2.69-2.39 5.29-4.91 7.44-7.81.86-.61 1.72-1.22 2.58-1.81 4.03-.73 6.92-5.02 11.19-4.27-2.65 1.68-5.21 3.49-7.62 5.5-8.65 7.49-15.89 16.49-21.72 26.31-1.65 2.95-3.85 5.84-4.07 9.34 1.61.48 3.21 1.02 4.78 1.63 2.78 4.29 5.76 8.43 8.84 12.51 1.55 1.88 1.99 4.29 2.12 6.67l-.3-.09c-2.99-5.05-6.57-9.73-10.41-14.15-1.28-1.34-2.5-2.96-4.38-3.44-1.17.94-2.13 2.09-3.09 3.23-.61 1.2-1.66 2.36-1.36 3.82 1.47 3.83 4.29 6.9 6.44 10.35-1.76-1.11-3.5-2.23-5.2-3.42-1.14 3.93-.98 8.05-.89 12.11.13 5.07.06 10.16.55 15.22.88 7.44 3.07 14.68 5.72 21.67h-5.36c-3.09-7.32-5.65-15.02-6.2-23 .1-10.49 2.48-20.85 2.09-31.36-6.99 4.65-12.19 11.65-16.44 18.8l-2.14-2.26c-6.57 6.31-10.66 14.59-14.35 22.79-2.68 4.88-5.61 9.66-7.25 15.03h-2.78c.35-.77.7-1.54 1.05-2.29 7.74-15.42 15.06-31.31 26.49-44.44 3.09-4.21 7.21-7.44 11.3-10.6 2.25-1.64 3.71-4.17 3.92-6.95-.8-1.8-2.99-1.36-4.57-1.42-5.28.37-10.28 2.49-14.91 4.94-1.19.66-2.37 1.35-3.56 2.03-.54-.48-1.62-1.42-2.16-1.89 4.43-2.25 8.84-4.61 13.66-5.95-18.33.21-38.22-2.54-52.42-15.2-2.53-2.58-4.89-5.32-7.25-8.05-1.84-2.3-3.66-4.61-5.53-6.87a74 74 0 0 0-15.06-14.09c-1.46-1.05-3-1.99-4.59-2.8a59 59 0 0 0-4.93-2.02c-6.6-1.5-13.51-1.19-20.19-.34 5.27 3.4 11.46 4.97 16.99 7.88.87.47 1.73.96 2.59 1.45 3.95 2.23 7.71 4.82 11.18 7.75 4.56 4.11 8.73 8.64 12.93 13.12.91 1.02 1.78 2.07 2.68 3.11-2.54-.66-4.51-2.39-6.24-4.26-2.69-3.07-5.22-6.46-8.96-8.31.17 1.28.35 2.57.54 3.86-.57-.03-1.71-.08-2.28-.11-5.45-8.31-13.87-14.11-22.86-18.02-4.44-1.94-8.82-4.16-13.64-4.98v-3.8c7.73-.77 15.32-2.52 23.05-3.26 8.92-.4 18.95-.19 26.25-6.18 3.31-2.48 4.07-7.31 2.22-10.91-2.61-5.3-7-9.42-10.85-13.82-3-3.64-6.06-7.24-9.24-10.72.93 4.88 1.08 9.86.65 14.81-1.11 6.78-4.71 13.15-10.53 16.96-6.31 4.4-13.84 7.1-21.55 7.38v-2.86c7.5-2.16 15.26-4.65 21.34-9.74 5.13-4.19 7.05-11.12 7.11-17.51-.36-4.32-1.55-8.54-1.74-12.88 0-3.21-2.6-5.46-4.27-7.93-4.65 8.81-10.41 16.98-16.59 24.8-1.7 2.06-3.86 3.67-5.85 5.43v-4.54c5.68-4.6 10.23-10.41 14.34-16.4 1.97-3.21 4.27-6.5 4.58-10.36.01-2.45-2.08-4.11-3.43-5.92C11.6 337.44 5.45 343.16 0 349.31v-4c4.56-2.95 8.97-7.01 10.11-12.55-3.64 1.86-6.02 5.56-10.11 6.66v-1.76c3.18-.98 5.09-4.01 7.56-6.06 1.08-1.33 3.14-2.34 3.14-4.24-2.94-3.6-6.85-6.21-10.7-8.72z\"\n        ></Path>\n        <Path\n          fill=\"#090225\"\n          stroke=\"#090225\"\n          d=\"M64.36 319.31c4.31-4.5 10.29-6.9 16.37-7.79 4.69.96 9.21 2.71 14.03 3.09l-.04 1.35c-8.16-2.01-17.3-1.73-24.33 3.37-7.2 5.42-13.14 13.5-13.91 22.72-.46 5.21 2.14 10.07 5 14.24.52-9.09 5.09-17.25 10.53-24.3 5.13-6.11 11.9-10.86 19.53-13.3l-.18 4.72c-5.44 2.08-10.55 5.18-14.78 9.22-5.96 6.53-10.34 14.63-12.11 23.32-1.06 4.46 1.98 8.23 4.48 11.54 4.5-4.64 9.24-9.08 13.25-14.17 6.94-9.41 15.86-17.48 26.23-22.96 1.48-.78 2.97-1.51 4.46-2.23 3.66-1.21 7.47-2.46 10.11-5.44.68.45 1.37.88 2.07 1.31-.24.58-.71 1.72-.95 2.29-2.62.63-5.09 1.78-7.49 2.99-1.46.73-2.91 1.47-4.38 2.19-.49.24-1.45.71-1.93.95-2.83 1.42-5.6 2.97-8.18 4.83-8.28 5.58-14.78 13.28-20.87 21.09-3.06 3.9-6.79 7.26-9.71 11.27-1.64 1.89.92 3.63 2.05 4.98 2.89-1.31 5.79-2.63 8.39-4.47-.66 3.92-4.94 4.75-7.9 6.39.66 2.38 2.06 4.45 4.06 5.93-.22.55-.67 1.65-.89 2.21-10.61-13.12-18.43-28.26-29.58-40.98 2.11.74 4.22 1.49 6.29 2.33.17-3.41.04-6.82-.2-10.22 1.84-6.37 6.08-11.74 10.58-16.47z\"\n        ></Path>\n        <Path\n          fill=\"#190032\"\n          stroke=\"#190032\"\n          d=\"M433.29 319.92c3.79-1.33 5.22-5.79 9.25-6.76-2.4 7.35-.84 15.08.21 22.51.31 2.68.2 5.57 1.78 7.91 1.71 2.64 1.96 5.83 2.56 8.85.29 3.17.76 6.33 1.74 9.37l.49-.45c1.1-.73 2.25-1.4 3.38-2.08 1.02 4.35 1.36 8.83 1.19 13.3-1.17-.42-2.34-.84-3.5-1.25-4.4-8.44-9.74-16.37-15.72-23.76.05-.63.14-1.88.19-2.51 1.42 1.35 2.83 2.7 4.24 4.06 1.19-5.12-.17-10.33-.78-15.43-.86-4.79-.73-9.67-.74-14.52-4.36 3.27-6.21 9.33-11.55 11.28l-.06-1.82c2.85-2.54 5.05-5.66 7.32-8.7z\"\n        ></Path>\n        <Path\n          fill=\"#1b0034\"\n          stroke=\"#1b0034\"\n          d=\"M182.47 316.38c2.31.76 4.22-.31 5.08-2.53-.8 7.04.19 14.12 1.56 21.03.52 4.69 1.1 9.38 1.95 14.02-.46-.17-1.39-.52-1.85-.69l-.57 3.6c-1.58-.95-3.17-1.9-4.76-2.82l-.27 1.29c-4.64-5.91-10.17-11.02-15.63-16.13.91.28 1.83.55 2.75.81l-.24-2.29c.33.11.99.32 1.32.43 4.55-4.88 7.6-10.86 10.66-16.72z\"\n        ></Path>\n        <Path\n          fill=\"#024663\"\n          stroke=\"#024663\"\n          d=\"M70.39 319.33c7.03-5.1 16.17-5.38 24.33-3.37-.03.39-.1 1.18-.13 1.58-1.01.39-2.03.78-3.05 1.15-7.63 2.44-14.4 7.19-19.53 13.3-5.44 7.05-10.01 15.21-10.53 24.3-2.86-4.17-5.46-9.03-5-14.24.77-9.22 6.71-17.3 13.91-22.72z\"\n        ></Path>\n        <Path\n          fill=\"#2ad6c3\"\n          stroke=\"#2ad6c3\"\n          d=\"M330.59 325.37c6.51-5.77 15.11-8.42 23.56-9.62 3.85-.47 7.61.72 11.34 1.49-7.83 1.84-15.69 4.25-22.12 9.29-4.12-.19-8.42-1.1-12.18 1.16z\"\n        ></Path>\n        <Path\n          fill=\"#2e0045\"\n          stroke=\"#2e0045\"\n          d=\"M366.31 318.54c2.05-1.18 4-2.53 5.93-3.89h.8l1.1-.02c-.21.59-.61 1.76-.82 2.35 2.76-.9 5.59-1.63 8.51-1.66-.27 2.31-1.99 3.75-3.93 4.79-2.41 1.35-4.86 2.65-7.4 3.76-.31-.35-.93-1.06-1.24-1.41-2.94-.01-5.85.51-8.79.66 2.01-1.42 4.52-2.4 5.84-4.58z\"\n        ></Path>\n        <Path\n          fill=\"#0f002a\"\n          stroke=\"#0f002a\"\n          d=\"m365.49 317.24 1.1-.31-.28 1.61c-1.32 2.18-3.83 3.16-5.84 4.58-4.68 1.19-8.93 3.6-12.5 6.84-5.26 4.54-10.44 9.22-15.07 14.41.67-3.82 3.1-6.88 4.64-10.31-.14-.51-.43-1.52-.58-2.02 1.93-2.07 4.12-3.87 6.41-5.51 6.43-5.04 14.29-7.45 22.12-9.29z\"\n        ></Path>\n        <Path\n          fill=\"#e7004c\"\n          stroke=\"#e7004c\"\n          d=\"M502.73 332.48c3.18-5.25 5.07-11.4 9.27-15.94v17.17c-1.33 3.44-3.21 6.63-5.12 9.77-.81-.98-1.62-1.97-2.42-2.94 1.22-1.11 2.44-2.21 3.67-3.3a224 224 0 0 1-5.4-4.76z\"\n        ></Path>\n        <Path\n          fill=\"#1f0040\"\n          stroke=\"#1f0040\"\n          d=\"M27.65 320.45q1.035-1.02 2.07-2.01c.58.42 1.16.84 1.74 1.27 7.95 5.39 13.82 13.14 21.2 19.2.38-1.04.75-2.09 1.12-3.13.24 3.4.37 6.81.2 10.22-2.07-.84-4.18-1.59-6.29-2.33-6.3-7.12-13.22-13.69-20.48-19.82.14-1.14.3-2.27.44-3.4z\"\n        ></Path>\n        <Path\n          fill=\"#3a0031\"\n          stroke=\"#3a0031\"\n          d=\"M112.49 318.62c3.84-.07 7.51 1.77 10.51 4.07-2.64 2.98-6.45 4.23-10.11 5.44 1.47-1.29 2.86-2.67 4.26-4.04-6.04-4.01-13.6-2.08-20.39-2.32 5.08-1.76 10.52-1.88 15.73-3.15z\"\n        ></Path>\n        <Path\n          fill=\"#8a295a\"\n          stroke=\"#8a295a\"\n          d=\"M245.96 323.86c3.45-2.23 6.86-5.12 11.05-5.68-2.35 2.55-5.13 4.64-7.95 6.63l-1.16-.9c-.49-.01-1.46-.04-1.94-.05z\"\n        ></Path>\n        <Path\n          fill=\"#019aa8\"\n          stroke=\"#019aa8\"\n          d=\"M0 318.64c3.85 2.51 7.76 5.12 10.7 8.72 0 1.9-2.06 2.91-3.14 4.24-2.47 2.05-4.38 5.08-7.56 6.06z\"\n        ></Path>\n        <Path\n          fill=\"#febc78\"\n          stroke=\"#febc78\"\n          d=\"M386.99 319.58c3.45-1.76 7.29-.42 10.74.65-.06 1.36-.1 2.73-.13 4.1.82.57 1.62 1.17 2.42 1.79-.39 1.18-.81 2.35-1.28 3.5-4.01-3.23-8.4-6.07-11.75-10.04z\"\n        ></Path>\n        <Path\n          fill=\"#26004c\"\n          stroke=\"#26004c\"\n          d=\"M426.03 330.44c5.34-1.95 7.19-8.01 11.55-11.28.01 4.85-.12 9.73.74 14.52.61 5.1 1.97 10.31.78 15.43-1.41-1.36-2.82-2.71-4.24-4.06-4.63-4.4-8.91-9.16-13.63-13.48 1.6-.36 3.21-.71 4.8-1.13z\"\n        ></Path>\n        <Path\n          fill=\"#fef9bf\"\n          stroke=\"#fef9bf\"\n          d=\"M337.23 359.25c11.21-17.33 27.83-31.26 47.13-38.67.61 1.89 2.08 4.21-.4 5.38-10.34 7.6-20.08 16.11-27.87 26.38-7.65 8.41-14.99 17.28-24.22 24.06-.37.02-1.12.06-1.49.09.43-6.29 3.91-11.84 6.85-17.24z\"\n        ></Path>\n        <Path\n          fill=\"#fdcf89\"\n          stroke=\"#fdcf89\"\n          d=\"M397.6 324.33c.03-1.37.07-2.74.13-4.1 2.07.82 4.1 1.75 6.06 2.81-.44 3.36-.09 6.77-.69 10.11-.81-.67-1.61-1.32-2.42-1.96-.49-.39-1.46-1.18-1.94-1.57.47-1.15.89-2.32 1.28-3.5-.8-.62-1.6-1.22-2.42-1.79z\"\n        ></Path>\n        <Path\n          fill=\"#680037\"\n          stroke=\"#680037\"\n          d=\"M93.67 322.73q1.545-.495 3.09-.96c6.79.24 14.35-1.69 20.39 2.32-1.4 1.37-2.79 2.75-4.26 4.04-1.49.72-2.98 1.45-4.46 2.23.12-1.01.23-2.01.34-3.01-1.91-1.44-3.7-3.12-5.89-4.11-3.04-.49-6.14-.4-9.21-.51z\"\n        ></Path>\n        <Path\n          fill=\"#48006b\"\n          stroke=\"#48006b\"\n          d=\"M360.47 323.12c2.94-.15 5.85-.67 8.79-.66.31.35.93 1.06 1.24 1.41-6 2.89-11.29 7.05-16.37 11.31-5.47 4.84-11.13 9.61-15.46 15.55-4 5.46-8.15 11.24-9.03 18.15-.78.62-1.56 1.24-2.32 1.88.03-2.75-.06-5.5-.22-8.23.51-6.43 2.62-12.58 5.8-18.16 4.63-5.19 9.81-9.87 15.07-14.41 3.57-3.24 7.82-5.65 12.5-6.84z\"\n        ></Path>\n        <Path\n          fill=\"#840039\"\n          stroke=\"#840039\"\n          d=\"m91.36 323.41 2.31-.68c3.07.11 6.17.02 9.21.51 2.19.99 3.98 2.67 5.89 4.11-.11 1-.22 2-.34 3.01-10.37 5.48-19.29 13.55-26.23 22.96-4.01 5.09-8.75 9.53-13.25 14.17-2.5-3.31-5.54-7.08-4.48-11.54 1.77-8.69 6.15-16.79 12.11-23.32 4.23-4.04 9.34-7.14 14.78-9.22z\"\n        ></Path>\n        <Path\n          fill=\"#35c0a7\"\n          stroke=\"#35c0a7\"\n          d=\"M253.78 325.78c1.52-.98 2.96-2.69 4.94-2.39 2.98 6.7-.67 13.72-2.73 20.12-.1.23-.29.68-.39.9-2.22 4.53-4.37 9.17-5.28 14.17-1.01 5.45-1.33 11-2.14 16.48-.66-.64-1.33-1.28-1.99-1.9-.55.82-1.11 1.64-1.66 2.47-.42-1.36-.84-2.71-1.25-4.06-1.68.69-3.51 2.4-5.27.93-.14 1.06-.29 2.13-.42 3.21-.24-.3-.72-.89-.95-1.18-.5.35-1 .7-1.49 1.06-.24-4.36.38-8.91-1.32-13.05-.49-5.51.08-11.21 2.5-16.23 3.65-8.4 10.43-14.89 17.45-20.53z\"\n        ></Path>\n        <Path\n          fill=\"#fef8bc\"\n          stroke=\"#fef8bc\"\n          d=\"M449.9 336.26c2.63-5.77 7.67-9.91 12.88-13.27 1.17.56 2.34 1.13 3.52 1.7.33 1.14.66 2.28 1 3.42-4.25 4.32-8.34 8.83-11.71 13.89-2.27.87-4.02 2.55-5.72 4.22-1.41-3.35 1.91-6.67.03-9.96z\"\n        ></Path>\n        <Path\n          fill=\"#1d034b\"\n          stroke=\"#1d034b\"\n          d=\"M232.82 325.98c2.41-1.49 6.07-3.19 8.59-1.16-3.66 2.66-7.2 5.95-11.69 7.06 1.83-1.76 3.53-3.65 5.21-5.55-.53-.08-1.58-.26-2.11-.35z\"\n        ></Path>\n        <Path\n          fill=\"#fb946e\"\n          stroke=\"#fb946e\"\n          d=\"M232.94 333.29c3.92-3.65 8.56-6.48 13.02-9.43.48.01 1.45.04 1.94.05l1.16.9c-5.17 3.7-8.91 8.88-13.23 13.44 1.24-3.04 3.23-5.65 5.08-8.33-2.75.91-5.25 2.39-7.97 3.37z\"\n        ></Path>\n        <Path\n          fill=\"#fde19c\"\n          stroke=\"#fde19c\"\n          d=\"M403.1 333.15c.6-3.34.25-6.75.69-10.11 1.25.69 2.51 1.42 3.75 2.15.16 1.3.51 2.57.9 3.82-.4 3.39 1.98 6.06 3.46 8.87-1.32-.2-2.64-.39-3.94-.63-1.65-1.34-3.25-2.74-4.86-4.1z\"\n        ></Path>\n        <Path\n          fill=\"#3bcda5\"\n          stroke=\"#3bcda5\"\n          d=\"M116.63 329.28c2.4-1.21 4.87-2.36 7.49-2.99l1.97-.04c-1.17 3.07-3.48 5.45-5.84 7.65-2.01-.87-3.22-2.5-3.62-4.62z\"\n        ></Path>\n        <Path\n          fill=\"#430068\"\n          stroke=\"#430068\"\n          d=\"M211.25 333.21c6.85-3.33 14.33-5 21.57-7.23.53.09 1.58.27 2.11.35-1.68 1.9-3.38 3.79-5.21 5.55-11.03 7.59-19.19 18.45-25.94 29.86-1.16 1.49-2.43 2.91-3.69 4.33-2.94-5.63-1.97-12.21-.91-18.21 1.79-6.2 6.11-11.94 12.07-14.65z\"\n        ></Path>\n        <Path\n          fill=\"#180039\"\n          stroke=\"#180039\"\n          d=\"M264.55 325.67c5.74 1.73 7.92 8.53 13.65 10.33 2 1.98 3.92 4.04 5.74 6.19.08 3.2 2.7 5.13 4.72 7.21 3.35 3.31 6.22 7.07 9.6 10.35 3.1 3.05 6.17 6.29 7.79 10.41-3.05-2.04-6.87-3.08-9.22-6.04-6.11-7.82-14-14.01-20.37-21.61-3.74-3.53-7.68-6.95-10.1-11.6-1.66 4.82-2.72 9.86-5.06 14.42-1.19 2.5-2.74 4.89-3.31 7.64 1.62 2.64 3.89 4.8 6.04 7.01-2.26.27-4.53.55-6.78.91a34 34 0 0 0-1.96-1.04c-.18.36-.52 1.08-.69 1.44-3.43-5.46 2.67-11.12 1-16.88.1-.22.29-.67.39-.9 3.32-2.1 3.74-6.4 6.41-9.08 2.32-2.3 1.84-5.79 2.15-8.76z\"\n        ></Path>\n        <Path\n          fill=\"#41d4bd\"\n          stroke=\"#41d4bd\"\n          d=\"M322.16 337.41c1.78-4.63 4.73-8.77 8.43-12.04l.6 2.32c3.76-2.26 8.06-1.35 12.18-1.16-2.29 1.64-4.48 3.44-6.41 5.51-3.87 4.01-7.28 8.55-9.41 13.73-1.56-.58-3.44-.58-4.71-1.74-.3-2.2-.35-4.43-.68-6.62z\"\n        ></Path>\n        <Path\n          fill=\"#12002c\"\n          stroke=\"#12002c\"\n          d=\"M386 325.85c6.01-1.31 8.61 7.81 14.68 5.34.81.64 1.61 1.29 2.42 1.96 1.61 1.36 3.21 2.76 4.86 4.1 17.44 15.55 31.27 34.65 43.27 54.59 5.01 8.98 10.23 18.03 17.7 25.22 11.1 11.46 27.25 17.21 43.07 16.8v.88c-2 .19-4 .39-5.99.6 1.72.34 3.44.68 5.17 1.04-.75 2.94-3.94 3.29-6.48 3.23.69-.39 1.39-.78 2.09-1.18-3.79-.79-7.66-1.12-11.44-1.95-8.99-2.62-17.57-6.64-24.96-12.45-4.28-4.55-8.82-8.92-12.13-14.28-4.58-6.19-7.24-14.24-14.44-18.02-.14-.44-.4-1.31-.53-1.75-3.25 2.85-6.32 5.89-9.62 8.69-.64-1.69-2.41-.95-3.73-.87 3.74-3.62 7.79-6.88 11.84-10.14-1.39-2.01-2.73-4.19-4.89-5.43-2.41.39-4.37 2-6.5 3.08-6.46 3.74-13.75 5.63-20.96 7.29-3.48-.4-6.93-1.03-10.3-1.92 1.7-.47 3.4-.94 5.12-1.36 4.72-.98 9.48-1.87 14.03-3.53 5.64-2.08 11.45-4.37 15.77-8.71-.34-1.33-.65-2.64-1-3.95-6.4-2.79-13.83-.8-20.44-2.88 5.79.08 11.73.25 17.25-1.82-.29-1.11-.35-2.34-1.11-3.25-6.15-8.12-13.86-14.81-20.93-22.07-4.73-4.93-10.03-9.32-15.68-13.15-1.66 4.49-2.74 9.24-5.19 13.41.33-3.95 2.12-7.55 2.86-11.4.8-2.88-2.19-4.36-3.81-6.12z\"\n        ></Path>\n        <Path\n          fill=\"#fdf0b1\"\n          stroke=\"#fdf0b1\"\n          d=\"M408.44 329.01c-.39-1.25-.74-2.52-.9-3.82 10.18 5.92 19.52 13.35 27.13 22.37 5.98 7.39 11.32 15.32 15.72 23.76 6.83 14.06 15.88 27.33 28.04 37.31 4.18 3.75 8.93 6.82 13.93 9.37 6.31 3.07 12.83 5.82 19.64 7.57v8.29c-15.82.41-31.97-5.34-43.07-16.8-7.47-7.19-12.69-16.24-17.7-25.22-12-19.94-25.83-39.04-43.27-54.59 1.3.24 2.62.43 3.94.63-1.48-2.81-3.86-5.48-3.46-8.87z\"\n        ></Path>\n        <Path\n          fill=\"#200046\"\n          stroke=\"#200046\"\n          d=\"M133.46 327.03c1.74 1.86 3.27 3.9 4.65 6.04-4.13 5.14-9.97 8.41-15.42 11.93.31.75.93 2.23 1.24 2.98-.7.55-1.38 1.13-2.06 1.71-2.06-3.26-5.82-2.05-8.75-.99-.42-.04-1.25-.13-1.67-.17 3.33-1.99 5.93-4.76 8.11-7.93 4.82-4.32 9.39-8.92 13.9-13.57z\"\n        ></Path>\n        <Path\n          fill=\"#72daaf\"\n          stroke=\"#72daaf\"\n          d=\"M112.25 331.47c1.47-.72 2.92-1.46 4.38-2.19.4 2.12 1.61 3.75 3.62 4.62-1.22 1.16-2.45 2.31-3.68 3.46-1.22-2.08-1.86-4.91-4.32-5.89z\"\n        ></Path>\n        <Path\n          fill=\"#ff7863\"\n          stroke=\"#ff7863\"\n          d=\"M379.55 333.44c2.15-1.91 4.42-3.81 7.27-4.56.02 3.49-.47 6.99-1.82 10.23-2.13-1.56-4.55-3.03-5.45-5.67z\"\n        ></Path>\n        <Path\n          fill=\"#fef9b9\"\n          stroke=\"#fef9b9\"\n          d=\"M15.49 330.1c1.35 1.81 3.44 3.47 3.43 5.92-.31 3.86-2.61 7.15-4.58 10.36-4.11 5.99-8.66 11.8-14.34 16.4v-13.47c5.45-6.15 11.6-11.87 15.49-19.21z\"\n        ></Path>\n        <Path\n          fill=\"#ffc379\"\n          stroke=\"#ffc379\"\n          d=\"M232.94 333.29c2.72-.98 5.22-2.46 7.97-3.37-1.85 2.68-3.84 5.29-5.08 8.33-1.19 2.42-2.99 4.48-4.43 6.75-2.91-.9-5.75-2.03-8.33-3.66l-.09-.06c3.29-2.68 6.19-6 9.96-7.99z\"\n        ></Path>\n        <Path\n          fill=\"#3d005b\"\n          stroke=\"#3d005b\"\n          d=\"M392.14 329.96c5.65 3.83 10.95 8.22 15.68 13.15 7.07 7.26 14.78 13.95 20.93 22.07.76.91.82 2.14 1.11 3.25-5.52 2.07-11.46 1.9-17.25 1.82-3.46-.93-7.01-1.41-10.45-2.39-4.04-1.16-7.15-4.18-10.15-6.97-2.57-2.55-5.27-5.28-6.31-8.85-.53-2.94.58-5.84 1.25-8.67 2.45-4.17 3.53-8.92 5.19-13.41z\"\n        ></Path>\n        <Path\n          fill=\"#400060\"\n          stroke=\"#400060\"\n          d=\"M266.36 330.91c2.42 4.65 6.36 8.07 10.1 11.6 6.37 7.6 14.26 13.79 20.37 21.61 2.35 2.96 6.17 4 9.22 6.04.58 1.11 1.17 2.23 1.78 3.34-3.11.03-6.2.21-9.29.47-12.5-1.27-24.69-6.17-34.51-13.99-2.15-2.21-4.42-4.37-6.04-7.01.57-2.75 2.12-5.14 3.31-7.64 2.34-4.56 3.4-9.6 5.06-14.42z\"\n        ></Path>\n        <Path\n          fill=\"#a3d9ac\"\n          stroke=\"#a3d9ac\"\n          d=\"M110.32 332.42c.48-.24 1.44-.71 1.93-.95 2.46.98 3.1 3.81 4.32 5.89-2.22 2.1-4.61 3.99-7.09 5.76 1.18-1.8 2.41-3.57 3.75-5.26-.94-1.83-1.93-3.64-2.91-5.44z\"\n        ></Path>\n        <Path\n          fill=\"#f60045\"\n          stroke=\"#f60045\"\n          d=\"M475.78 367.81c11.72-9.37 20.17-22.11 26.95-35.33a224 224 0 0 0 5.4 4.76c-1.23 1.09-2.45 2.19-3.67 3.3.8.97 1.61 1.96 2.42 2.94-4.42 7.52-8.51 15.26-13.78 22.24a49.9 49.9 0 0 1-10.57 8.86c-5.69 3.1-12.25 3.92-18.59 4.64-.62-.26-1.86-.76-2.48-1.02 5.01-3.11 9.66-6.78 14.32-10.39z\"\n        ></Path>\n        <Path\n          fill=\"#0c0052\"\n          stroke=\"#0c0052\"\n          d=\"M0 339.42c4.09-1.1 6.47-4.8 10.11-6.66-1.14 5.54-5.55 9.6-10.11 12.55z\"\n        ></Path>\n        <Path\n          fill=\"#deeaaa\"\n          stroke=\"#deeaaa\"\n          d=\"M102.14 337.25c2.58-1.86 5.35-3.41 8.18-4.83.98 1.8 1.97 3.61 2.91 5.44-1.34 1.69-2.57 3.46-3.75 5.26-2.5 2.08-4.92 4.25-7.32 6.44-.26-.61-.78-1.84-1.05-2.45 1.81-3 1.9-6.55 1.03-9.86z\"\n        ></Path>\n        <Path\n          fill=\"#20002b\"\n          stroke=\"#20002b\"\n          d=\"M313.99 332.68c.34 2.22.58 4.45.97 6.67l1.29.82c-.11 4.03.77 7.96 2.3 11.67.48-1.69.98-3.38 1.4-5.08.18 5.68.39 11.52 2.97 16.73-.58 1.66-1.15 3.32-1.72 4.99-1.45-2.48-2.98-4.91-4.54-7.32-.24-.38-.47-.75-.7-1.11.57-1.38 1.18-2.94.21-4.29-1.54-2.96-2.99-6.08-2.46-9.51.09-4.52-.1-9.05.28-13.57z\"\n        ></Path>\n        <Path\n          fill=\"#0d001b\"\n          stroke=\"#0d001b\"\n          d=\"M327.55 345.77c2.13-5.18 5.54-9.72 9.41-13.73.15.5.44 1.51.58 2.02-1.54 3.43-3.97 6.49-4.64 10.31-3.18 5.58-5.29 11.73-5.8 18.16-.53 2.16-1.03 4.34-1.44 6.54-.98.69-1.98 1.37-2.96 2.06-.5-.89-1-1.77-1.5-2.65.57-1.67 1.14-3.33 1.72-4.99.47 1.16.96 2.33 1.45 3.51-.58-7.21.53-14.51 3.18-21.23z\"\n        ></Path>\n        <Path\n          fill=\"#15002d\"\n          stroke=\"#15002d\"\n          d=\"M145.78 333.77c11.28 10.18 22.07 20.92 32 32.42 4.72 5.37 8.44 11.5 12.8 17.15 3.71 4.94 7.67 9.82 12.69 13.49.72.54 1.49 1.01 2.26 1.51 1.3.75 2.63 1.47 3.96 2.18 7.05 3.82 14.9 5.74 22.73 7.14 12.42 2.09 24.87 6.22 34.68 14.37-2.8 1.62-4.89-1.73-7.6-2.07 1.08 1.12 2.5 2.19 2.03 3.99-5.59-4.26-11.84-7.7-18.55-9.85-13.26-4.02-27.44-6.2-41.17-3.34-3.94.9-7.65 2.67-10.92 5.04-4.25 3.45-8.07 7.41-11.66 11.53l-2.22.71c3.19-7.79 8.74-14.59 15.98-18.94 2.65-1.71 4.63-4.22 5.81-7.13-2.17-6.94-10.56-4.28-15.73-2.99-4.89 1.36-9.49 3.54-14.03 5.76-4.27-.75-7.16 3.54-11.19 4.27 5.49-5.45 12.59-8.69 19.54-11.8-3.4-.46-6.76.4-10.14.69-14.77 1.25-30.5.86-43.82-6.44.12-1.15.21-2.3.33-3.44 2.94.99 5.9 3.02 9.12 2.09 18.11 6.09 38.34 6.34 56.46.19-2.38-3.57-5.08-7.48-9.21-9.08-5.69-.76-11.45-1.19-17-2.77-12.91-3.62-25.68-8.88-35.98-17.65.64-1.72 1.28-3.45 1.92-5.17 10.05 7.71 21.88 12.94 34.22 15.65 4.88 1.19 9.92 1.35 14.85 2.22-1.12-2.24-2.61-4.26-4.37-6.04-10.52-11.08-20.92-22.47-33.34-31.49 1.76-.95 3.66-1.57 5.55-2.2z\"\n        ></Path>\n        <Path\n          fill=\"#fe8e5c\"\n          stroke=\"#fe8e5c\"\n          d=\"M363.89 350.92c3.75-7.01 9.67-12.42 15.66-17.48.9 2.64 3.32 4.11 5.45 5.67-1.42 3.78-2.89 7.72-2.55 11.84.32 6.52 4.33 12.37 9.71 15.87 8.63 5.58 19.15 7.3 29.28 7.04-2.22.54-4.41 1.17-6.61 1.79 1.93.25 3.87.47 5.81.69-.2 1.58-.51 3.16-1.11 4.66.7.49 1.42.98 2.13 1.48-1.53.56-3.05 1.12-4.57 1.69.3.4.89 1.22 1.19 1.62-4.55 1.66-9.31 2.55-14.03 3.53-9.12.66-18.71 1.4-27.4-2.04-7.81-2.98-14.38-9.84-15.78-18.24-1.3-6.16.2-12.51 2.82-18.12z\"\n        ></Path>\n        <Path\n          fill=\"#0a051b\"\n          stroke=\"#0a051b\"\n          d=\"M506.88 343.48c1.91-3.14 3.79-6.33 5.12-9.77v9.39c-4.46 6.04-7.2 13.13-11.23 19.45-1.81 1.55-3.69 3.03-5.51 4.56-.54-.35-1.62-1.04-2.16-1.39 5.27-6.98 9.36-14.72 13.78-22.24z\"\n        ></Path>\n        <Path\n          fill=\"#ff1843\"\n          stroke=\"#ff1843\"\n          d=\"M189.11 334.88c3.32 2.74 2.85 7.59 5.19 11 1.13-.96 2.26-1.91 3.36-2.9-2.14 5.06-3.7 10.44-3.33 15.99-1.29-3.29-2.59-6.59-3.27-10.07-.85-4.64-1.43-9.33-1.95-14.02z\"\n        ></Path>\n        <Path\n          fill=\"#ef004a\"\n          stroke=\"#ef004a\"\n          d=\"M123.93 347.98c5.42-4.03 11.18-7.61 16.3-12.01 12.42 9.02 22.82 20.41 33.34 31.49 1.76 1.78 3.25 3.8 4.37 6.04-4.93-.87-9.97-1.03-14.85-2.22-12.34-2.71-24.17-7.94-34.22-15.65-2.48-1.8-4.86-3.74-7-5.94.68-.58 1.36-1.16 2.06-1.71z\"\n        ></Path>\n        <Path\n          fill=\"#660a29\"\n          stroke=\"#660a29\"\n          d=\"M442.75 335.67c.82 1.57 1.42 3.51 3.28 4.16.1 1.6.17 3.28 1.08 4.68.01 2.64 0 5.27-.02 7.92-.6-3.02-.85-6.21-2.56-8.85-1.58-2.34-1.47-5.23-1.78-7.91z\"\n        ></Path>\n        <Path\n          fill=\"#3e0059\"\n          stroke=\"#3e0059\"\n          d=\"M5.85 361.89c6.18-7.82 11.94-15.99 16.59-24.8 1.67 2.47 4.27 4.72 4.27 7.93.19 4.34 1.38 8.56 1.74 12.88-.06 6.39-1.98 13.32-7.11 17.51-6.08 5.09-13.84 7.58-21.34 9.74v-17.83c1.99-1.76 4.15-3.37 5.85-5.43z\"\n        ></Path>\n        <Path\n          fill=\"#fffddd\"\n          stroke=\"#fffddd\"\n          d=\"M449.9 336.26c1.88 3.29-1.44 6.61-.03 9.96 1.7-1.67 3.45-3.35 5.72-4.22-3.04 6.08-5.26 12.61-6.27 19.35l-.49.45c-.98-3.04-1.45-6.2-1.74-9.37.02-2.65.03-5.28.02-7.92.57-2.86 1.51-5.64 2.79-8.25z\"\n        ></Path>\n        <Path\n          fill=\"#feedaf\"\n          stroke=\"#feedaf\"\n          d=\"M81.27 358.34c6.09-7.81 12.59-15.51 20.87-21.09.87 3.31.78 6.86-1.03 9.86.27.61.79 1.84 1.05 2.45-6.39 5.71-10.83 13.31-17.66 18.59-.85.63-1.69 1.29-2.5 1.97-2.6 1.84-5.5 3.16-8.39 4.47-1.13-1.35-3.69-3.09-2.05-4.98 2.92-4.01 6.65-7.37 9.71-11.27z\"\n        ></Path>\n        <Path\n          fill=\"#63e2b7\"\n          stroke=\"#63e2b7\"\n          d=\"M322.16 337.41c.33 2.19.38 4.42.68 6.62 1.27 1.16 3.15 1.16 4.71 1.74-2.65 6.72-3.76 14.02-3.18 21.23-.49-1.18-.98-2.35-1.45-3.51-2.58-5.21-2.79-11.05-2.97-16.73.4-3.19.91-6.39 2.21-9.35z\"\n        ></Path>\n        <Path\n          fill=\"#ffd69b\"\n          stroke=\"#ffd69b\"\n          d=\"M205.69 364.5c4.4-8.65 10.37-16.47 17.38-23.16 2.58 1.63 5.42 2.76 8.33 3.66-6.98 11.86-17.11 21.33-26.69 31.01-2.1-3.62-1.06-8.11.98-11.51z\"\n        ></Path>\n        <Path\n          fill=\"#130127\"\n          stroke=\"#130127\"\n          d=\"M283.94 342.19c5.23 5.14 10.22 10.52 15.33 15.79 5.75 6.13 11.08 12.69 15.34 19.96 4.13 6.43 7.96 13.05 12.13 19.46-1.86.55-2.73-1.28-3.64-2.5-2.53-3.7-4.58-7.7-7.12-11.4l-2.04.12c-.75-.58-1.51-1.15-2.25-1.72-2.34 1.91-4.23 4.32-4.81 7.34-4.6 2.13-9.59 3.33-14.61 3.96-5.04-.54-11.01 1.31-15.28-2.17-.96-.8-2.2-.95-3.36-1.22l-.28 2.34c-5.71-4.77-11.92-8.89-17.94-13.24-.51 2.76-1.08 5.52-1.96 8.19-.85-4.43 1.49-9.05-.73-13.28-2.59 3.07-2.7 7.26-4.05 10.89-1.14 3.77-4.27 6.44-5.78 10.03 9.69-.52 19.73.36 28.49 4.87 1.59.8 2.72 2.22 3.93 3.49-10.43-5.48-22.47-7.65-34.15-6.02-1.45-1.19-2.9-2.37-4.36-3.55 6.74-3.69 10.44-11.07 11.38-18.47.81-5.48 1.13-11.03 2.14-16.48.91-5 3.06-9.64 5.28-14.17 1.67 5.76-4.43 11.42-1 16.88-1.2 5.05-2.31 11.28 1.61 15.47 5.94 6.31 14.74 8.72 22.94 10.55 10.21 1.8 21.97 1.09 30.44-5.46.1-.43.3-1.28.4-1.7.17-.62.51-1.84.68-2.45-3.14-3.48-8.21-1.93-12.13-3.73 3.09-.26 6.18-.44 9.29-.47-.61-1.11-1.2-2.23-1.78-3.34-1.62-4.12-4.69-7.36-7.79-10.41-3.38-3.28-6.25-7.04-9.6-10.35-2.02-2.08-4.64-4.01-4.72-7.21z\"\n        ></Path>\n        <Path\n          fill=\"#07a29f\"\n          stroke=\"#07a29f\"\n          d=\"M500.77 362.55c4.03-6.32 6.77-13.41 11.23-19.45v44.91c-3.13-1.45-6.43-2.75-8.94-5.2-5.61-5.26-5.73-13.77-2.29-20.26z\"\n        ></Path>\n        <Path\n          fill=\"#0c0026\"\n          stroke=\"#0c0026\"\n          d=\"M113.12 348.7c2.93-1.06 6.69-2.27 8.75.99 2.14 2.2 4.52 4.14 7 5.94-.64 1.72-1.28 3.45-1.92 5.17-3.74-3.09-6.77-6.89-9.88-10.57-3.6 1.76-7 4.63-7.93 8.7-1.83 7.15 1.39 14.54 5.96 19.97 4.75 5.22 11.12 8.57 17.58 11.21-3.22.93-6.18-1.1-9.12-2.09-.12 1.14-.21 2.29-.33 3.44-5.15-2.12-8.01-7.31-12.99-9.59 4.12 12.88 13.74 24 26.19 29.42-2.31.15-4.6.44-6.9.74-3.62-2.43-6.82-5.41-9.89-8.5-4.66-4.83-8.47-10.64-9.96-17.26-2.07-9.27-5.59-18.66-3.94-28.3 1.16-3.91 4.53-6.58 7.38-9.27z\"\n        ></Path>\n        <Path\n          fill=\"#006376\"\n          stroke=\"#006376\"\n          d=\"M102.91 356.9c2.94-2.7 5.59-5.7 8.54-8.37.42.04 1.25.13 1.67.17-2.85 2.69-6.22 5.36-7.38 9.27-1.65 9.64 1.87 19.03 3.94 28.3 1.49 6.62 5.3 12.43 9.96 17.26-1.09.94-1.05 2.42-1.32 3.72-3.99 0-5.65 5.46-3.83 8.53-.43.31-1.29.92-1.72 1.23-11.22-8.41-18.29-20.7-27.11-31.33 5.03-2.89 9.13-7.5 10.92-13.06 1.96-5.28 1.94-11.65 6.33-15.72z\"\n        ></Path>\n        <Path\n          fill=\"#320047\"\n          stroke=\"#320047\"\n          d=\"M195.51 360.26c1.34-4.08 1.02-8.86 3.67-12.4-1.06 6-2.03 12.58.91 18.21 1.26-1.42 2.53-2.84 3.69-4.33-.49 3.85-2.68 7.26-3.17 11.16-3.8-3.38-1.2-9.37-5.1-12.64z\"\n        ></Path>\n        <Path\n          fill=\"#ff7a57\"\n          stroke=\"#ff7a57\"\n          d=\"M31.43 348.86c3.18 3.48 6.24 7.08 9.24 10.72-2.59.46-3.54-3.11-5.97-3.07-.75 2.43-.35 5.46-2.62 7.16.43-4.95.28-9.93-.65-14.81z\"\n        ></Path>\n        <Path\n          fill=\"#180032\"\n          stroke=\"#180032\"\n          d=\"M356.09 352.34c2.21.29 3.84-1.43 5.59-2.46-.17 1.37-.33 2.74-.48 4.12.91-1.02 1.82-2.03 2.69-3.08-2.62 5.61-4.12 11.96-2.82 18.12 1.4 8.4 7.97 15.26 15.78 18.24 8.69 3.44 18.28 2.7 27.4 2.04-1.72.42-3.42.89-5.12 1.36 3.37.89 6.82 1.52 10.3 1.92-7.92 2.35-16.28 2.31-24.45 1.95-7.09-.76-14.07-3.21-19.66-7.72-3.41-4-6.4-8.45-8.5-13.26-.84-4.52-.77-9.16-1.3-13.72-3.6 2.25-5.55 6.21-8.71 8.96-3.67 4.12-8.48 6.91-12.52 10.59.42 2.03 2.12 3.46 3.35 5.04 4.2 4.66 8.28 9.46 12.98 13.64 2.7 2.43 5.57 4.68 8.69 6.57-2.72-.49-5.4.18-7.89 1.24a82 82 0 0 1-2.56-1.74c-6.63-4.97-12.65-10.83-17.35-17.68-3.5-4.77-5.87-10.23-8.81-15.34.98-.69 1.98-1.37 2.96-2.06.41-2.2.91-4.38 1.44-6.54.16 2.73.25 5.48.22 8.23.76-.64 1.54-1.26 2.32-1.88-.42 2.25-1.11 4.47-1.28 6.77.38 1.53 1.7 2.58 2.61 3.8.76-.95 2.47-1.83.9-3.05 9.23-6.78 16.57-15.65 24.22-24.06z\"\n        ></Path>\n        <Path\n          fill=\"#fdecae\"\n          stroke=\"#fdecae\"\n          d=\"M109.14 358.93c.93-4.07 4.33-6.94 7.93-8.7 3.11 3.68 6.14 7.48 9.88 10.57 10.3 8.77 23.07 14.03 35.98 17.65 5.55 1.58 11.31 2.01 17 2.77 4.13 1.6 6.83 5.51 9.21 9.08-18.12 6.15-38.35 5.9-56.46-.19-6.46-2.64-12.83-5.99-17.58-11.21-4.57-5.43-7.79-12.82-5.96-19.97z\"\n        ></Path>\n        <Path\n          fill=\"#fee6a1\"\n          stroke=\"#fee6a1\"\n          d=\"M300.18 353.47c1.22.52 2.44 1.05 3.67 1.59l2.31-2.16c2.45 1.55 4.75 3.33 6.95 5.22-.26-1.01-.53-2.01-.81-3.01 1.27 1.61 2.5 3.25 3.66 4.94.23.36.46.73.7 1.11-1.03 4.54 3.91 7.67 4.24 12.13-2.31 1.22-4.74 2.46-6.29 4.65-4.26-7.27-9.59-13.83-15.34-19.96 0-1.37-.36-2.68-.73-3.97.41-.14 1.23-.41 1.64-.54z\"\n        ></Path>\n        <Path\n          fill=\"#fe6143\"\n          stroke=\"#fe6143\"\n          d=\"M34.7 356.51c2.43-.04 3.38 3.53 5.97 3.07 3.85 4.4 8.24 8.52 10.85 13.82 1.85 3.6 1.09 8.43-2.22 10.91-7.3 5.99-17.33 5.78-26.25 6.18-7.73.74-15.32 2.49-23.05 3.26v-5.74c7.71-.28 15.24-2.98 21.55-7.38 5.82-3.81 9.42-10.18 10.53-16.96 2.27-1.7 1.87-4.73 2.62-7.16z\"\n        ></Path>\n        <Path\n          fill=\"#1b0e51\"\n          stroke=\"#1b0e51\"\n          d=\"M206.17 378.21c7.08-7.67 15.22-14.3 21.94-22.3 2.03-.97 2.2 2.15 2.63 3.41 1.37 10.84 1.01 22.36-4.03 32.29-1.85 2.66-5.89 3.04-8.29.89-4.96-3.88-9.33-8.68-12.25-14.29z\"\n        ></Path>\n        <Path\n          fill=\"#fdf1b7\"\n          stroke=\"#fdf1b7\"\n          d=\"M255.29 359.85c.66.32 1.31.67 1.96 1.04 6.7 4.86 13.87 9.17 21.7 11.98 9.13 3.61 19.07 4.19 28.79 4.47.74.94 1.49 1.87 2.25 2.81-.1.42-.3 1.27-.4 1.7-8.47 6.55-20.23 7.26-30.44 5.46-8.2-1.83-17-4.24-22.94-10.55-3.92-4.19-2.81-10.42-1.61-15.47.17-.36.51-1.08.69-1.44z\"\n        ></Path>\n        <Path\n          fill=\"#060017\"\n          stroke=\"#060017\"\n          d=\"M257.25 360.89c2.25-.36 4.52-.64 6.78-.91 9.82 7.82 22.01 12.72 34.51 13.99 3.92 1.8 8.99.25 12.13 3.73-.17.61-.51 1.83-.68 2.45-.76-.94-1.51-1.87-2.25-2.81-9.72-.28-19.66-.86-28.79-4.47-7.83-2.81-15-7.12-21.7-11.98z\"\n        ></Path>\n        <Path\n          fill=\"#4f0071\"\n          stroke=\"#4f0071\"\n          d=\"M346.81 368.81c3.16-2.75 5.11-6.71 8.71-8.96.53 4.56.46 9.2 1.3 13.72 2.1 4.81 5.09 9.26 8.5 13.26-1.05-.16-2.09-.3-3.13-.43-3.95 3.8-7.89 7.62-11.57 11.68-4.7-4.18-8.78-8.98-12.98-13.64-1.23-1.58-2.93-3.01-3.35-5.04 4.04-3.68 8.85-6.47 12.52-10.59z\"\n        ></Path>\n        <Path\n          fill=\"#fcf0af\"\n          stroke=\"#fcf0af\"\n          d=\"M320.9 373.29c-.33-4.46-5.27-7.59-4.24-12.13 1.56 2.41 3.09 4.84 4.54 7.32.5.88 1 1.76 1.5 2.65 2.94 5.11 5.31 10.57 8.81 15.34 4.7 6.85 10.72 12.71 17.35 17.68 1.21 1.93 1.47 4.16.87 6.35.67.57 1.35 1.13 2.04 1.71.81 3.34 1.94 6.58 3.23 9.77l-2.22.32c-10.96-5.45-19.52-14.69-26.04-24.9-4.17-6.41-8-13.03-12.13-19.46 1.55-2.19 3.98-3.43 6.29-4.65z\"\n        ></Path>\n        <Path\n          fill=\"#230046\"\n          stroke=\"#230046\"\n          d=\"M84.5 368.15c4.04.3 5.92-3.75 9.18-5.33.17 3.68.62 7.4.01 11.06-1.64 4.38-5.53 7.32-8.77 10.49-2.31-.45-4.63-.9-6.76-1.93-2-1.48-3.4-3.55-4.06-5.93 2.96-1.64 7.24-2.47 7.9-6.39.81-.68 1.65-1.34 2.5-1.97z\"\n        ></Path>\n        <Path\n          fill=\"#29ba98\"\n          stroke=\"#29ba98\"\n          d=\"M233.83 362.54c1.7 4.14 1.08 8.69 1.32 13.05.49-.36.99-.71 1.49-1.06.23.29.71.88.95 1.18.13-1.08.28-2.15.42-3.21 1.76 1.47 3.59-.24 5.27-.93.41 1.35.83 2.7 1.25 4.06.55-.83 1.11-1.65 1.66-2.47.66.62 1.33 1.26 1.99 1.9-.94 7.4-4.64 14.78-11.38 18.47-3.78 1.84-7.97 2.45-12.1 2.88 3.28-3.15 5.83-7.03 7.16-11.39 2.6-7.22 1.69-14.98 1.97-22.48z\"\n        ></Path>\n        <Path\n          fill=\"#0f0055\"\n          stroke=\"#0f0055\"\n          d=\"M495.26 367.11c1.82-1.53 3.7-3.01 5.51-4.56-3.44 6.49-3.32 15 2.29 20.26-1.18.53-2.34 1.07-3.5 1.61-3.6-2.64-5.83-6.55-7.77-10.46.78-2.46 1.92-4.79 3.47-6.85z\"\n        ></Path>\n        <Path\n          fill=\"#160234\"\n          stroke=\"#160234\"\n          d=\"M482.53 374.58c3.91-2.44 7.48-5.44 10.57-8.86.54.35 1.62 1.04 2.16 1.39-1.55 2.06-2.69 4.39-3.47 6.85-3.94 3.2-8.96 4.49-13.52 6.53 1.03.53 2.05 1.06 3.11 1.58-5.26.65-10.1-2.04-15.31-1.92-2.16-.07-4.31-.16-6.45-.38.53-.62 1.15-1.14 1.84-1.57.62.26 1.86.76 2.48 1.02 6.34-.72 12.9-1.54 18.59-4.64z\"\n        ></Path>\n        <Path\n          fill=\"#ffa067\"\n          stroke=\"#ffa067\"\n          d=\"M421.44 373.86c3.86-.3 7.74-.42 11.61-.73.35 1.31.66 2.62 1 3.95-4.32 4.34-10.13 6.63-15.77 8.71-.3-.4-.89-1.22-1.19-1.62 1.52-.57 3.04-1.13 4.57-1.69-.71-.5-1.43-.99-2.13-1.48.6-1.5.91-3.08 1.11-4.66-1.94-.22-3.88-.44-5.81-.69 2.2-.62 4.39-1.25 6.61-1.79z\"\n        ></Path>\n        <Path\n          fill=\"#23003d\"\n          stroke=\"#23003d\"\n          d=\"M248.67 384.71c1.35-3.63 1.46-7.82 4.05-10.89 2.22 4.23-.12 8.85.73 13.28.88-2.67 1.45-5.43 1.96-8.19 6.02 4.35 12.23 8.47 17.94 13.24l.28-2.34c1.16.27 2.4.42 3.36 1.22 4.27 3.48 10.24 1.63 15.28 2.17-4.98.65-9.91 1.65-14.92 2.03 0 .33.02 1 .03 1.34.92 3.96 5.79 5.45 6.83 9.48-2.5-.84-5.04-1.58-7.61-2.16-.32-.2-.97-.59-1.29-.79-1.21-1.27-2.34-2.69-3.93-3.49-8.76-4.51-18.8-5.39-28.49-4.87 1.51-3.59 4.64-6.26 5.78-10.03z\"\n        ></Path>\n        <Path\n          fill=\"#470055\"\n          stroke=\"#470055\"\n          d=\"M478.27 380.49c4.56-2.04 9.58-3.33 13.52-6.53 1.94 3.91 4.17 7.82 7.77 10.46 3.88 2.82 8.17 5.01 12.44 7.19v2.58c-9.87-4.82-19.7-10.14-30.62-12.12-1.06-.52-2.08-1.05-3.11-1.58z\"\n        ></Path>\n        <Path\n          fill=\"#f7e29c\"\n          stroke=\"#f7e29c\"\n          d=\"M190.58 383.34c2.66-1.09 5.26-2.52 8.14-2.92 2.32.66 3.72 2.85 5.36 4.47-.84 1.95-2.23 3.83-2.19 6.05.47 1.95 1.15 3.87 1.38 5.89-5.02-3.67-8.98-8.55-12.69-13.49z\"\n        ></Path>\n        <Path\n          fill=\"#3b005e\"\n          stroke=\"#3b005e\"\n          d=\"M51.61 388.51c3.02-1.65 3.97-5.12 5.27-8.04 3.74 4.86 6.57 10.34 10.48 15.08 3.27 3.99 6.15 8.29 9.08 12.54-3-1.06-4.88-4.65-8.19-4.65-4.14 1.22-8.1 3.85-9.87 7.93-.8.55-1.6 1.1-2.41 1.65 1.47.2 2.96.38 4.4.76.28 2.12.18 4.27.19 6.42-6.36-5.95-11.1-13.55-18.43-18.46-3.73-3.12-8.82-3.99-12.36-7.37 7.58-.23 15.3-1.91 21.84-5.86z\"\n        ></Path>\n        <Path\n          fill=\"#17003c\"\n          stroke=\"#17003c\"\n          d=\"M78.16 382.44c2.13 1.03 4.45 1.48 6.76 1.93.18.32.55.98.74 1.31 8.82 10.63 15.89 22.92 27.11 31.33 3.96 3.36 7.83 6.86 11.34 10.7q-1.725 1.68-3.45 3.39c-7.33-7.25-15.58-13.53-22.55-21.17-7.51-7.95-13.78-16.95-20.84-25.28.22-.56.67-1.66.89-2.21z\"\n        ></Path>\n        <Path\n          fill=\"#3d005f\"\n          stroke=\"#3d005f\"\n          d=\"M110.24 381.87c4.98 2.28 7.84 7.47 12.99 9.59 13.32 7.3 29.05 7.69 43.82 6.44 3.38-.29 6.74-1.15 10.14-.69-6.95 3.11-14.05 6.35-19.54 11.8-.86.59-1.72 1.2-2.58 1.81-2.54 1.01-5.08 2.26-7.83 2.59-3.67-.27-7.2-1.45-10.81-2.12-12.45-5.42-22.07-16.54-26.19-29.42z\"\n        ></Path>\n        <Path\n          fill=\"#130335\"\n          stroke=\"#130335\"\n          d=\"M306.88 389.24c.58-3.02 2.47-5.43 4.81-7.34.74.57 1.5 1.14 2.25 1.72l2.04-.12c2.54 3.7 4.59 7.7 7.12 11.4.91 1.22 1.78 3.05 3.64 2.5 6.52 10.21 15.08 19.45 26.04 24.9 10.92 5.95 23.94 6.5 35.98 4.57 3.38-.58 6.76-1.18 10.06-2.17 4.09-1.13 7.97-2.95 11.61-5.12 1.7-.21 3.44-.41 5.15-.18 1.26 1.63 1.74 3.69 2.5 5.59-5.78 1.75-11.14 4.75-17.08 5.97-5.25 1.13-10.51 2.53-15.91 2.54 1.13.3 2.26.59 3.41.88-3.6.74-7.31 1.16-10.95.44-3.63-1.89-7.92-.29-11.62-1.92-2.39-.94-4.73-2.02-7.17-2.82.96 1.65 1.97 3.28 3.02 4.89-2.7-.66-5.25-1.82-6.94-4.09l-2.94.08c-4.1-2.8-8.03-5.83-11.92-8.9-4.76-3.69-8.43-8.55-13.06-12.39-4.85-7.28-9.63-14.63-13.29-22.6-2.31.51-4.59 1.19-6.75 2.17z\"\n        ></Path>\n        <Path\n          fill=\"#61007d\"\n          stroke=\"#61007d\"\n          d=\"M430.39 385.31c2.13-1.08 4.09-2.69 6.5-3.08 2.16 1.24 3.5 3.42 4.89 5.43-4.05 3.26-8.1 6.52-11.84 10.14-6.5 6.63-14.97 10.88-23.87 13.23-8.22 1.93-16.74 1.67-25.11 1.25-7.79-.45-15.06-3.64-21.65-7.63-3.12-1.89-5.99-4.14-8.69-6.57 3.68-4.06 7.62-7.88 11.57-11.68 1.04.13 2.08.27 3.13.43 5.59 4.51 12.57 6.96 19.66 7.72 8.17.36 16.53.4 24.45-1.95 7.21-1.66 14.5-3.55 20.96-7.29z\"\n        ></Path>\n        <Path\n          fill=\"#098567\"\n          stroke=\"#098567\"\n          d=\"M460.9 383.36c7.34-1.04 14.98-1.03 22.06 1.4 10.02 3.33 19.54 8.05 29.04 12.63v22.29c-4.96-1.69-9.98-3.23-14.75-5.39-6.73-3.26-13.04-7.33-18.99-11.84-5.3-4.28-9.94-9.28-14.41-14.39-1.24-1.4-2.1-3.06-2.95-4.7z\"\n        ></Path>\n        <Path\n          fill=\"#0e0a3d\"\n          stroke=\"#0e0a3d\"\n          d=\"M499.56 384.42c1.16-.54 2.32-1.08 3.5-1.61 2.51 2.45 5.81 3.75 8.94 5.2v3.6c-4.27-2.18-8.56-4.37-12.44-7.19z\"\n        ></Path>\n        <Path\n          fill=\"#c1dc8e\"\n          stroke=\"#c1dc8e\"\n          d=\"M201.89 390.94c-.04-2.22 1.35-4.1 2.19-6.05 1.18 1.32 2.33 2.69 3.38 4.12.02.97.04 1.94.07 2.91-.98 2.03-1.57 4.2-2 6.42-.77-.5-1.54-.97-2.26-1.51-.23-2.02-.91-3.94-1.38-5.89z\"\n        ></Path>\n        <Path\n          fill=\"#640036\"\n          stroke=\"#640036\"\n          d=\"M306.88 389.24c2.16-.98 4.44-1.66 6.75-2.17 3.66 7.97 8.44 15.32 13.29 22.6.74 2.29 2.41 4.04 3.58 6.09.22 1.52-.56 2.95-1.03 4.34 1.71 1.36 3.53 2.56 5.4 3.7-4.28.3-7.73-2.59-11.56-3.97.08.62.22 1.85.3 2.47-4.99-2.89-9.73-6.19-14.27-9.73-6.93-5.9-13.74-12.41-22.49-15.48-2.67-.86-5.51-.55-8.26-.53l-1.21.01c-.01-.34-.03-1.01-.03-1.34 5.01-.38 9.94-1.38 14.92-2.03 5.02-.63 10.01-1.83 14.61-3.96z\"\n        ></Path>\n        <Path\n          fill=\"#89d78c\"\n          stroke=\"#89d78c\"\n          d=\"M207.69 387.11c3.13 3.17 5.99 6.68 9.64 9.31-2.93.68-5.61 2.08-7.84 4.1-1.33-.71-2.66-1.43-3.96-2.18.43-2.22 1.02-4.39 2-6.42-.03-.97-.05-1.94-.07-2.91.05-.47.17-1.43.23-1.9z\"\n        ></Path>\n        <Path\n          fill=\"#fe8257\"\n          stroke=\"#fe8257\"\n          d=\"M433.67 398.67c3.3-2.8 6.37-5.84 9.62-8.69.13.44.39 1.31.53 1.75 1.42 9.95.87 20.23 4.03 29.9 2.17 8.44 6.62 16.62 14.01 21.55 4.04 3.09 9.24 3.75 14.16 4.06-7.03.09-14.17.36-21.05-1.39-13-3.31-25.59-10.44-33.05-21.86-1.96-3.7-4.07-8.53-1.64-12.49 3.3-5.35 8.9-8.6 13.39-12.83z\"\n        ></Path>\n        <Path\n          fill=\"#580032\"\n          stroke=\"#580032\"\n          d=\"M443.82 391.73c7.2 3.78 9.86 11.83 14.44 18.02 3.31 5.36 7.85 9.73 12.13 14.28-6.78-2.63-10.74-9.88-17.42-12.78-5.63.57-2.61 7.11-5.12 10.38-3.16-9.67-2.61-19.95-4.03-29.9z\"\n        ></Path>\n        <Path\n          fill=\"#fb4047\"\n          stroke=\"#fb4047\"\n          d=\"M7.07 396.06c6.68-.85 13.59-1.16 20.19.34-2.47 1.05-5.06 2.02-7.09 3.85.59 1.76 2.54 2.57 3.89 3.69-5.53-2.91-11.72-4.48-16.99-7.88z\"\n        ></Path>\n        <Path\n          fill=\"#fd3f4a\"\n          stroke=\"#fd3f4a\"\n          d=\"M278.59 396.56c2.75-.02 5.59-.33 8.26.53 8.75 3.07 15.56 9.58 22.49 15.48-.92.56-1.82 1.15-2.73 1.72 1.15 1.75 2.02 3.65 2.47 5.71.71 3.09 2.62 5.7 3.78 8.63-9.18-6.17-16.81-14.28-24.09-22.52-3.16-3.42-6.26-6.98-10.18-9.55z\"\n        ></Path>\n        <Path\n          fill=\"#f95c48\"\n          stroke=\"#f95c48\"\n          d=\"M20.17 400.25c2.03-1.83 4.62-2.8 7.09-3.85a59 59 0 0 1 4.93 2.02c-1.84 2.33-3.68 4.65-5.54 6.97-.86-.49-1.72-.98-2.59-1.45-1.35-1.12-3.3-1.93-3.89-3.69z\"\n        ></Path>\n        <Path\n          fill=\"#4cc59e\"\n          stroke=\"#4cc59e\"\n          d=\"M209.49 400.52c2.23-2.02 4.91-3.42 7.84-4.1 4.06 3.01 9.33 2.88 14.12 2.45-2.08.74-4.2 1.35-6.36 1.8 2.37 2.33 4.8 4.61 7.13 6.99-7.83-1.4-15.68-3.32-22.73-7.14z\"\n        ></Path>\n        <Path\n          fill=\"#34c7b0\"\n          stroke=\"#34c7b0\"\n          d=\"M231.45 398.87c3.19-.83 6.45-1.36 9.71-1.79 11.68-1.63 23.72.54 34.15 6.02.32.2.97.59 1.29.79 8.46 5.65 15.59 13.44 19.49 22.92.18.55.55 1.64.73 2.18-3.18-2.53-4.42-6.58-7.09-9.55-.84 3.62.63 7.46-1.1 11.01-.57.24-1.73.74-2.31.98.13 1.16.27 2.33.41 3.5-.92-.96-1.83-1.93-2.74-2.88-.89.52-1.77 1.06-2.64 1.6.04-1.02.08-2.03.11-3.04-1.8 1.39-1.68 3.82-2.17 5.84-3.41-5.38-7.5-10.33-12.39-14.42-9.81-8.15-22.26-12.28-34.68-14.37-2.33-2.38-4.76-4.66-7.13-6.99 2.16-.45 4.28-1.06 6.36-1.8z\"\n        ></Path>\n        <Path\n          fill=\"#0d0029\"\n          stroke=\"#0d0029\"\n          d=\"M284.21 406.05c-1.04-4.03-5.91-5.52-6.83-9.48l1.21-.01c3.92 2.57 7.02 6.13 10.18 9.55 7.28 8.24 14.91 16.35 24.09 22.52 1.93 1.36 3.86 2.74 5.83 4.06-4.85-.12-8.18-4.12-12.44-5.86-3.94-1.41-6.06-5.47-10.08-6.72.29 2.22.53 4.5-.08 6.7-3.9-9.48-11.03-17.27-19.49-22.92 2.57.58 5.11 1.32 7.61 2.16z\"\n        ></Path>\n        <Path\n          fill=\"#0b001c\"\n          stroke=\"#0b001c\"\n          d=\"M429.94 397.8c1.32-.08 3.09-.82 3.73.87-4.49 4.23-10.09 7.48-13.39 12.83-2.43 3.96-.32 8.79 1.64 12.49 7.46 11.42 20.05 18.55 33.05 21.86 6.88 1.75 14.02 1.48 21.05 1.39 10.15-.03 19.07-5.27 28.68-7.63 2.54.06 5.73-.29 6.48-3.23-1.73-.36-3.45-.7-5.17-1.04 1.99-.21 3.99-.41 5.99-.6v5.46c-9.36 4.92-19.73 7.31-29.94 9.74-13.35 3.05-27.6 1.57-40.02-4.23-4.32-2.01-8.58-4.22-12.37-7.13-4.55-3.84-9.21-8.01-11.59-13.59-.76-1.9-1.24-3.96-2.5-5.59-1.71-.23-3.45-.03-5.15.18 4.08-2.57 7.08-6.42 9.55-10.5-5.45 2.54-10.99 5.03-16.93 6.18-8.25 1.71-16.74 1.53-25.1.93-9.53-1.16-18.55-5.07-26.53-10.3 2.49-1.06 5.17-1.73 7.89-1.24 6.59 3.99 13.86 7.18 21.65 7.63 8.37.42 16.89.68 25.11-1.25 8.9-2.35 17.37-6.6 23.87-13.23z\"\n        ></Path>\n        <Path\n          fill=\"#0baaa7\"\n          stroke=\"#0baaa7\"\n          d=\"M0 397.55c4.82.82 9.2 3.04 13.64 4.98 8.99 3.91 17.41 9.71 22.86 18.02 6.29 10.26 7.97 22.42 10.98 33.87 1.93 7.44 5.26 14.42 9.31 20.93-.13.04-.4.1-.53.13-5.48-4.2-11.79-7.15-17.08-11.59-6.82-5.62-12.59-12.61-16.46-20.57-3.28-6.95-4.55-14.59-7.1-21.79-3.04-8.85-8.15-17.22-15.62-22.99z\"\n        ></Path>\n        <Path\n          fill=\"#ff5e47\"\n          stroke=\"#ff5e47\"\n          d=\"M182.87 398.98c5.17-1.29 13.56-3.95 15.73 2.99-1.18 2.91-3.16 5.42-5.81 7.13-1.36-.33-2.78-.48-4.06-1.05-1.17-1.41-2.11-2.99-3.12-4.5.06-2.03-.95-3.6-2.74-4.57z\"\n        ></Path>\n        <Path\n          fill=\"#150035\"\n          stroke=\"#150035\"\n          d=\"M0 398.54c7.47 5.77 12.58 14.14 15.62 22.99 2.55 7.2 3.82 14.84 7.1 21.79 3.87 7.96 9.64 14.95 16.46 20.57 5.29 4.44 11.6 7.39 17.08 11.59-.25.6-.73 1.79-.98 2.39 2.42 1.56 4.89 3.07 7.02 5.03l-1.95.46c-7.56-6.01-17.15-8.76-24.44-15.16-5.82-4.6-10.82-10.24-14.2-16.88-5.85-9.67-8.18-20.89-13.18-30.95-2.39-4.86-5.27-9.46-8.53-13.78z\"\n        ></Path>\n        <Path\n          fill=\"#fb7853\"\n          stroke=\"#fb7853\"\n          d=\"M26.65 405.39c1.86-2.32 3.7-4.64 5.54-6.97 1.59.81 3.13 1.75 4.59 2.8-.94 2.96 4.2 4.24 1.96 7.2.49.83.99 1.65 1.49 2.48-.8.74-1.6 1.49-2.4 2.24a73 73 0 0 0-11.18-7.75z\"\n        ></Path>\n        <Path\n          fill=\"#fe6f4c\"\n          stroke=\"#fe6f4c\"\n          d=\"M168.84 404.74c4.54-2.22 9.14-4.4 14.03-5.76 1.79.97 2.8 2.54 2.74 4.57 1.01 1.51 1.95 3.09 3.12 4.5 1.28.57 2.7.72 4.06 1.05-7.24 4.35-12.79 11.15-15.98 18.94l2.22-.71c-1.23 4.49-5.54 6.41-8.79 9.22-4-1.82-7.8-4.64-10.16-8.41.74-5.94.11-11.98 1.14-17.9 2.41-2.01 4.97-3.82 7.62-5.5z\"\n        ></Path>\n        <Path\n          fill=\"#fd8c5b\"\n          stroke=\"#fd8c5b\"\n          d=\"M38.74 408.42c2.24-2.96-2.9-4.24-1.96-7.2a74 74 0 0 1 15.06 14.09c-1.78 3.4-1.24 7.27-1.08 10.95-4.2-4.48-8.37-9.01-12.93-13.12.8-.75 1.6-1.5 2.4-2.24-.5-.83-1-1.65-1.49-2.48z\"\n        ></Path>\n        <Path\n          fill=\"#420064\"\n          stroke=\"#420064\"\n          d=\"M58.38 411.37c1.77-4.08 5.73-6.71 9.87-7.93 3.31 0 5.19 3.59 8.19 4.65 6.04 7.05 12.02 14.23 19.04 20.35 5.05 3.4 10.2 6.67 15.39 9.86 1.38 1.03 2.67 2.16 3.98 3.28-2.38.18-4.76.4-7.14.57-8.91-1.07-18.02-2.06-26.42-5.39-7.94-4.04-14.67-10.11-20.73-16.56-.01-2.15.09-4.3-.19-6.42-1.44-.38-2.93-.56-4.4-.76.81-.55 1.61-1.1 2.41-1.65z\"\n        ></Path>\n        <Path\n          fill=\"#180035\"\n          stroke=\"#180035\"\n          d=\"M478.26 402.45c5.95 4.51 12.26 8.58 18.99 11.84-.3.72-.6 1.45-.88 2.18-1.34.5-2.68 1.01-4.01 1.53-5-2.55-9.75-5.62-13.93-9.37.49-1.46-.23-2.79-.84-4.06.16-.53.5-1.59.67-2.12z\"\n        ></Path>\n        <Path\n          fill=\"#007f88\"\n          stroke=\"#007f88\"\n          d=\"M118.32 407.25c.27-1.3.23-2.78 1.32-3.72 3.07 3.09 6.27 6.07 9.89 8.5 5.45 3.57 11.99 4.64 18.1 6.6-6.24 6.04-9.66 14.19-14.49 21.26-2.47-4.43-5.48-8.55-9.03-12.18-3.51-3.84-7.38-7.34-11.34-10.7.43-.31 1.29-.92 1.72-1.23-1.82-3.07-.16-8.53 3.83-8.53z\"\n        ></Path>\n        <Path\n          fill=\"#cdecb2\"\n          stroke=\"#cdecb2\"\n          d=\"M348.86 404.15c.83.59 1.69 1.17 2.56 1.74 7.98 5.23 17 9.14 26.53 10.3.42.47 1.27 1.4 1.69 1.87.65 1.45 1.17 2.96 1.97 4.34 2.23 1.71 4.81 2.9 7.15 4.47-12.04 1.93-25.06 1.38-35.98-4.57l2.22-.32c-1.29-3.19-2.42-6.43-3.23-9.77-.69-.58-1.37-1.14-2.04-1.71.6-2.19.34-4.42-.87-6.35z\"\n        ></Path>\n        <Path\n          fill=\"#fb9a6e\"\n          stroke=\"#fb9a6e\"\n          d=\"M0 406.59c3.26 4.32 6.14 8.92 8.53 13.78-2.13.92-2.73-2.14-4.03-3.26-1.9 1.71-3.53 3.73-4.5 6.12z\"\n        ></Path>\n        <Path\n          fill=\"#fd9a63\"\n          stroke=\"#fd9a63\"\n          d=\"M201.61 410.76c13.73-2.86 27.91-.68 41.17 3.34 6.71 2.15 12.96 5.59 18.55 9.85 8.72 7.55 14.61 17.74 20.9 27.31 5.24 7.73 11.24 15.05 18.52 20.96 4.82 3.94 9.79 7.74 14.05 12.31.35 3.19 1.49 6.2 2.82 9.1-1.01.23-2.02.46-3.02.7-.25 1.34-.5 2.68-.75 4.04-1.21-.34-2.45-.8-3.73-.51-2.55-2.7-5.33-5.17-8.22-7.5-6.55-5.52-13.11-11.1-18.73-17.59-4-4.6-7.05-9.91-10.5-14.9-8.98-13.46-19.97-26.94-35.68-32.61-3.99-1.76-8.33-2.39-12.55-3.37-3.85-1.89-8.19-1.17-12.31-1.12a338 338 0 0 1 3.28-1.7c-3.78-1.43-7.09-3.98-11.11-4.78-1.8-.11-1.87-2.37-2.69-3.53z\"\n        ></Path>\n        <Path\n          fill=\"#510036\"\n          stroke=\"#510036\"\n          d=\"M326.92 409.67c4.63 3.84 8.3 8.7 13.06 12.39 3.89 3.07 7.82 6.1 11.92 8.9 1.13 1.18 2.15 2.45 3.16 3.74-11.04-2.47-21.76-6.55-31.45-12.4-.08-.62-.22-1.85-.3-2.47 3.83 1.38 7.28 4.27 11.56 3.97-1.87-1.14-3.69-2.34-5.4-3.7.47-1.39 1.25-2.82 1.03-4.34-1.17-2.05-2.84-3.8-3.58-6.09z\"\n        ></Path>\n        <Path\n          fill=\"#f6f8b7\"\n          stroke=\"#f6f8b7\"\n          d=\"M403.05 415.26c5.94-1.15 11.48-3.64 16.93-6.18-2.47 4.08-5.47 7.93-9.55 10.5-3.64 2.17-7.52 3.99-11.61 5.12-5.26-4.48-12.07-8.03-19.18-6.64-.42-.47-1.27-1.4-1.69-1.87 8.36.6 16.85.78 25.1-.93z\"\n        ></Path>\n        <Path\n          fill=\"#19003d\"\n          stroke=\"#19003d\"\n          d=\"M129.53 412.03c2.3-.3 4.59-.59 6.9-.74 3.61.67 7.14 1.85 10.81 2.12 2.75-.33 5.29-1.58 7.83-2.59-2.15 2.9-4.75 5.42-7.44 7.81-6.11-1.96-12.65-3.03-18.1-6.6z\"\n        ></Path>\n        <Path\n          fill=\"#fe7a51\"\n          stroke=\"#fe7a51\"\n          d=\"M139.5 436.55c5.83-9.82 13.07-18.82 21.72-26.31-1.03 5.92-.4 11.96-1.14 17.9 2.36 3.77 6.16 6.59 10.16 8.41 3.25-2.81 7.56-4.73 8.79-9.22 3.59-4.12 7.41-8.08 11.66-11.53 1.97 1.36 4.17 2.5 5.71 4.38.31 2.59-.52 5.18-.64 7.78-11.21 5.86-21.43 13.92-33.81 17.3-7.07 1.78-14.44 2.91-21.74 2.26a63 63 0 0 0-4.78-1.63c.22-3.5 2.42-6.39 4.07-9.34z\"\n        ></Path>\n        <Path\n          fill=\"#ff8a59\"\n          stroke=\"#ff8a59\"\n          d=\"M190.69 415.8c3.27-2.37 6.98-4.14 10.92-5.04.82 1.16.89 3.42 2.69 3.53 4.02.8 7.33 3.35 11.11 4.78-1.1.56-2.19 1.13-3.28 1.7 4.12-.05 8.46-.77 12.31 1.12-9.93-.8-19.97 1.2-28.68 6.07.12-2.6.95-5.19.64-7.78-1.54-1.88-3.74-3.02-5.71-4.38z\"\n        ></Path>\n        <Path\n          fill=\"#6e0033\"\n          stroke=\"#6e0033\"\n          d=\"M447.85 421.63c2.51-3.27-.51-9.81 5.12-10.38 6.68 2.9 10.64 10.15 17.42 12.78 7.39 5.81 15.97 9.83 24.96 12.45 3.78.83 7.65 1.16 11.44 1.95-.7.4-1.4.79-2.09 1.18-9.61 2.36-18.53 7.6-28.68 7.63-4.92-.31-10.12-.97-14.16-4.06-7.39-4.93-11.84-13.11-14.01-21.55z\"\n        ></Path>\n        <Path\n          fill=\"#fe5048\"\n          stroke=\"#fe5048\"\n          d=\"M306.61 414.29c.91-.57 1.81-1.16 2.73-1.72 4.54 3.54 9.28 6.84 14.27 9.73 9.69 5.85 20.41 9.93 31.45 12.4 4.67 1.49 9.29 3.12 14.01 4.46 4.75 1.35 9.65 3.79 12.18 8.21l-.26.54c-6.82 1.35-14.08.22-20.97-.74-6.89-1.17-13.84-2.3-20.47-4.59-7.35-2.38-14.15-6.12-20.86-9.89-1.97-1.32-3.9-2.7-5.83-4.06-1.16-2.93-3.07-5.54-3.78-8.63-.45-2.06-1.32-3.96-2.47-5.71z\"\n        ></Path>\n        <Path\n          fill=\"#05002b\"\n          stroke=\"#05002b\"\n          d=\"M496.37 416.47c.28-.73.58-1.46.88-2.18 4.77 2.16 9.79 3.7 14.75 5.39v5.89c-6.81-1.75-13.33-4.5-19.64-7.57 1.33-.52 2.67-1.03 4.01-1.53z\"\n        ></Path>\n        <Path\n          fill=\"#ff9d60\"\n          stroke=\"#ff9d60\"\n          d=\"M50.76 426.26c-.16-3.68-.7-7.55 1.08-10.95 1.87 2.26 3.69 4.57 5.53 6.87.49 4.29 3.63 8.26 1.55 12.66-1.88-1.78-3.64-3.66-5.48-5.47-.9-1.04-1.77-2.09-2.68-3.11z\"\n        ></Path>\n        <Path\n          fill=\"#fe8f5e\"\n          stroke=\"#fe8f5e\"\n          d=\"M0 423.23c.97-2.39 2.6-4.41 4.5-6.12 1.3 1.12 1.9 4.18 4.03 3.26 5 10.06 7.33 21.28 13.18 30.95 3.38 6.64 8.38 12.28 14.2 16.88 7.29 6.4 16.88 9.15 24.44 15.16 7.72 7.33 11.16 18.14 10.41 28.64h-8.71c-.35-3.79-1.66-7.41-3.83-10.54-3.21-4.67-7.76-8.15-12.51-11.13-10.45-7.38-21.42-14.63-29.19-24.99-5.79-8-11.46-16.13-16.52-24.62z\"\n        ></Path>\n        <Path\n          fill=\"#11002e\"\n          stroke=\"#11002e\"\n          d=\"M38.24 416.8c3.74 1.85 6.27 5.24 8.96 8.31-1.44-.62-2.9-1.17-4.37-1.71 1.12 3.42 2.84 6.59 4.86 9.55 2.29 4.96 2.39 10.51 3.69 15.74 1.47 7.48 4.02 14.86 8.5 21.1-.67 1.55-1.18 3.17-1.62 4.81-.37.19-1.1.56-1.47.75-4.05-6.51-7.38-13.49-9.31-20.93-3.01-11.45-4.69-23.61-10.98-33.87.57.03 1.71.08 2.28.11-.19-1.29-.37-2.58-.54-3.86z\"\n        ></Path>\n        <Path\n          fill=\"#e3f3b2\"\n          stroke=\"#e3f3b2\"\n          d=\"M379.64 418.06c7.11-1.39 13.92 2.16 19.18 6.64-3.3.99-6.68 1.59-10.06 2.17-2.34-1.57-4.92-2.76-7.15-4.47-.8-1.38-1.32-2.89-1.97-4.34z\"\n        ></Path>\n        <Path\n          fill=\"#1e003d\"\n          stroke=\"#1e003d\"\n          d=\"M259.3 419.96c2.71.34 4.8 3.69 7.6 2.07 4.89 4.09 8.98 9.04 12.39 14.42 3.81 5.7 7.16 11.71 11.06 17.36-.97.34-1.94.69-2.9 1.05-1.33-1.77-2.56-4.16-5.22-3.6-6.29-9.57-12.18-19.76-20.9-27.31.47-1.8-.95-2.87-2.03-3.99z\"\n        ></Path>\n        <Path\n          fill=\"#25c2b3\"\n          stroke=\"#25c2b3\"\n          d=\"M288.63 430.45c1.73-3.55.26-7.39 1.1-11.01 2.67 2.97 3.91 7.02 7.09 9.55.73 1.81 1.43 3.63 2.18 5.44 1.79 6.39 3.81 12.72 5.85 19.04-1.13-.42-2.27-.83-3.39-1.24-.04 1.02-.04 2.06-.16 3.09-2.52 1.75-5.78 1.17-8.67 1.58q-1.17-1.53-2.28-3.09c-3.9-5.65-7.25-11.66-11.06-17.36.49-2.02.37-4.45 2.17-5.84-.03 1.01-.07 2.02-.11 3.04.87-.54 1.75-1.08 2.64-1.6.91.95 1.82 1.92 2.74 2.88-.14-1.17-.28-2.34-.41-3.5.58-.24 1.74-.74 2.31-.98z\"\n        ></Path>\n        <Path\n          fill=\"#18003a\"\n          stroke=\"#18003a\"\n          d=\"M296.17 420.11c4.02 1.25 6.14 5.31 10.08 6.72 4.26 1.74 7.59 5.74 12.44 5.86 6.71 3.77 13.51 7.51 20.86 9.89 6.63 2.29 13.58 3.42 20.47 4.59.71 1.07 1.42 2.14 2.13 3.22-2.36 1.5-4.92 2.63-7.56 3.52-2.71-2.16-6.31-2.02-9.54-2.71-6.82-1.3-13.4-3.68-19.7-6.54-7.71-4.23-14.43-9.97-21.07-15.67-.47 3.66 1.16 7.09 1.86 10.61.11 2.41.33 4.82.45 7.23-2.03.32-2.32-2.09-2.96-3.46-1.25-3.1-1.66-6.89-4.63-8.94-.75-1.81-1.45-3.63-2.18-5.44-.18-.54-.55-1.63-.73-2.18.61-2.2.37-4.48.08-6.7z\"\n        ></Path>\n        <Path\n          fill=\"#160032\"\n          stroke=\"#160032\"\n          d=\"M195.76 427.96c8.71-4.87 18.75-6.87 28.68-6.07 4.22.98 8.56 1.61 12.55 3.37 2.23 1.95 4.41 4.01 5.88 6.62-.57-.08-1.69-.23-2.25-.3-2.94.35-3.63 3.14-4.46 5.5.15-2.24.61-5.21-1.8-6.45-5.8-3.63-13.14-5.04-19.78-3.08-2.7.73-5.32 1.77-7.77 3.12-14.51 8.16-28.3 19.44-35.15 35.01-3.18 6.25-3.53 13.4-3.88 20.26 1.27 6.28 5.15 11.61 7.56 17.48-.52.16-1.55.49-2.06.65-.53-.76-1.07-1.51-1.6-2.25-2.31-3.2-4.46-6.53-6.37-9.99-.87-1.67-1.79-3.31-2.72-4.94-3.59-6.85-7.63-13.45-11.42-20.19-.13-2.38-.57-4.79-2.12-6.67-3.08-4.08-6.06-8.22-8.84-12.51 7.3.65 14.67-.48 21.74-2.26 12.38-3.38 22.6-11.44 33.81-17.3z\"\n        ></Path>\n        <Path\n          fill=\"#17004a\"\n          stroke=\"#17004a\"\n          d=\"M42.83 423.4c1.47.54 2.93 1.09 4.37 1.71 1.73 1.87 3.7 3.6 6.24 4.26 1.84 1.81 3.6 3.69 5.48 5.47 2.28 2.11 4.68 4.21 7.05 6.17.73 3.26 3.78 4.86 6.04 6.96-3.04.11-5.9-1.13-8.91-1.28-3.14-2.41-6.21-4.96-8.61-8.13-1.87-2.29-3.66-5.04-6.8-5.61-2.02-2.96-3.74-6.13-4.86-9.55z\"\n        ></Path>\n        <Path\n          fill=\"#ffbd70\"\n          stroke=\"#ffbd70\"\n          d=\"M57.37 422.18c2.36 2.73 4.72 5.47 7.25 8.05-.72 2.1-1.59 4.27-1.24 6.54.98 1.85 2.42 3.41 3.73 5.04l-1.14-.8c-2.37-1.96-4.77-4.06-7.05-6.17 2.08-4.4-1.06-8.37-1.55-12.66z\"\n        ></Path>\n        <Path\n          fill=\"#007989\"\n          stroke=\"#007989\"\n          d=\"M401 430.96c5.94-1.22 11.3-4.22 17.08-5.97 2.38 5.58 7.04 9.75 11.59 13.59a180 180 0 0 0-2.95 4.78c-3.91-1.53-7.9-2.82-11.97-3.84-8.59-2.4-17.34-4.49-26.25-5.14-1.15-.29-2.28-.58-3.41-.88 5.4-.01 10.66-1.41 15.91-2.54z\"\n        ></Path>\n        <Path\n          fill=\"#080422\"\n          stroke=\"#080422\"\n          d=\"M236.99 425.26c15.71 5.67 26.7 19.15 35.68 32.61-1.02 1.16-2.04 2.32-3.05 3.5-4.39-8.21-10.31-15.52-16.85-22.1-2.9-2.96-6.3-5.36-9.9-7.39-1.47-2.61-3.65-4.67-5.88-6.62z\"\n        ></Path>\n        <Path\n          fill=\"#860038\"\n          stroke=\"#860038\"\n          d=\"M214.58 427.55c6.64-1.96 13.98-.55 19.78 3.08 2.41 1.24 1.95 4.21 1.8 6.45-.39 1.13-1.11 2.3-2.39 2.54-4.41 1.22-9.1 1.51-13.25 3.6-.98-4.17-.72-8.71-3.48-12.28.39-.34 1.17-1.02 1.57-1.36-1.35-.68-2.69-1.36-4.03-2.03z\"\n        ></Path>\n        <Path\n          fill=\"#960038\"\n          stroke=\"#960038\"\n          d=\"M206.81 430.67c2.45-1.35 5.07-2.39 7.77-3.12 1.34.67 2.68 1.35 4.03 2.03-.4.34-1.18 1.02-1.57 1.36 2.76 3.57 2.5 8.11 3.48 12.28-6.05 2.87-11.66 6.6-16.79 10.9-.63-1.67-1.31-3.32-1.75-5.04.97-1.66 3.46-2.83 2.85-5.07-.91-2.12-2.18-4.17-1.94-6.58 1.13-.05 2.28-.01 3.41-.17 1.43-1.82 2.28-3.98 3.3-6.03z\"\n        ></Path>\n        <Path\n          fill=\"#0b2654\"\n          stroke=\"#0b2654\"\n          d=\"M306.14 439.6c-.7-3.52-2.33-6.95-1.86-10.61 6.64 5.7 13.36 11.44 21.07 15.67 6.3 2.86 12.88 5.24 19.7 6.54 3.23.69 6.83.55 9.54 2.71-8.64 2.95-16.07 9.22-20.67 17.07-4.11 6.97-2.67 15.71-6.78 22.63-1.4-1.76-2.73-3.57-3.85-5.5-2.42-4.38-4.98-8.75-5.82-13.75-3.73-11.6-7.44-23.22-11.33-34.76z\"\n        ></Path>\n        <Path\n          fill=\"#16002f\"\n          stroke=\"#16002f\"\n          d=\"M358.76 430.08c2.44.8 4.78 1.88 7.17 2.82 3.7 1.63 7.99.03 11.62 1.92l-3.63.8c.88.74 1.78 1.46 2.66 2.21 9.96 9.21 18.98 19.38 28.89 28.65 7.22 7.15 14.2 14.61 22.32 20.78 6.99 5.7 15.32 9.37 22.78 14.36.86 1.82.64 3.81.16 5.7-.37-1.26-.75-2.52-1.15-3.76-.38-.17-1.14-.52-1.53-.7-7.67-3.78-15.6-7.28-22.34-12.64-10.54-7.68-18.56-18.16-28.53-26.49.4 7.8 4.54 14.74 8.17 21.45-2.04-.61-4.05-1.92-6.26-1.36-3.87-8-7.45-16.2-10.44-24.56-.11-1.78-.69-3.71-2.65-4.17-2.48.65-4.17 2.69-5.99 4.35-6.18 4.73-12.23 11.28-12.36 19.53-.01 14.46 10.56 26.87 23.02 33.03h-14.52c-4.52-5.69-9.48-11.34-11.81-18.34-2.27-6.61-1.93-13.7-1.7-20.58-5.59 6.19-8.1 14.72-7.4 22.98-.18 5.79 2.8 10.93 5.31 15.94h-3.22c-1.68-2.39-3.58-4.63-5.15-7.09-1.38-3.14-1.68-6.75-3.96-9.46-3.27 3.95-6.71 7.76-10.52 11.2-1.69 1.36-2.63 3.3-3.21 5.35h-2.73c-.26-1.18-.45-2.38-.51-3.58 13.2-8.46 17.38-24.54 26.89-36.2 6.12-8.31 14.6-14.41 23.4-19.59.15-.58.45-1.76.6-2.34-.21-1.01-.41-2.02-.89-2.92-2.53-4.42-7.43-6.86-12.18-8.21-4.72-1.34-9.34-2.97-14.01-4.46-1.01-1.29-2.03-2.56-3.16-3.74l2.94-.08c1.69 2.27 4.24 3.43 6.94 4.09-1.05-1.61-2.06-3.24-3.02-4.89z\"\n        ></Path>\n        <Path\n          fill=\"#fef4b3\"\n          stroke=\"#fef4b3\"\n          d=\"M63.38 436.77c-.35-2.27.52-4.44 1.24-6.54 14.2 12.66 34.09 15.41 52.42 15.2-4.82 1.34-9.23 3.7-13.66 5.95-5.66 2.16-11.8.94-17.5-.33-6.88-1.6-13.12-5.11-18.77-9.24-1.31-1.63-2.75-3.19-3.73-5.04z\"\n        ></Path>\n        <Path\n          fill=\"#a80039\"\n          stroke=\"#a80039\"\n          d=\"M171.66 465.68c6.85-15.57 20.64-26.85 35.15-35.01l2.79.56c-1.02 2.05-1.87 4.21-3.3 6.03-1.13.16-2.28.12-3.41.17-.24 2.41 1.03 4.46 1.94 6.58.61 2.24-1.88 3.41-2.85 5.07.44 1.72 1.12 3.37 1.75 5.04-10.03 8.77-20.19 18.39-25.17 31.04-2.37 5.69-2.21 11.9-2.32 17.94l-.9.32c-2.41-5.87-6.29-11.2-7.56-17.48.35-6.86.7-14.01 3.88-20.26z\"\n        ></Path>\n        <Path\n          fill=\"#0e0321\"\n          stroke=\"#0e0321\"\n          d=\"M236.16 437.08c.83-2.36 1.52-5.15 4.46-5.5-.27 5.81-2.03 11.59-.98 17.42 2.45 15.12 11.98 28.2 23.58 37.79 10.81 8.11 23.75 12.87 36.77 16.06 3.73.92 7.29 2.37 10.82 3.88-.8-6.65-7.73-9.79-12.48-13.46q1.785-1.47 3.57-2.91c2.89 2.33 5.67 4.8 8.22 7.5 4.01 4.14 6.77 9.19 9.62 14.14h-10.49c-1.03-1.37-1.61-3.26-3.31-3.96-6.87-3.23-14.61-3.65-21.7-6.19-6.54-2.05-12.55-5.38-18.61-8.52-17.17-9.48-28.45-28.09-30.36-47.43-8.46 7.34-16.58 17.2-16.16 29.05-.82 14 5.51 27.86 15.96 37.05h-7.23c-7.65-6.96-10.69-17.6-12.58-27.45 1.62-5.07 2.07-10.37 2.74-15.62.43-3.66 2.38-6.85 3.76-10.2-3.91 1.17-5.74 5.46-8.99 7.74-1.68 4.66-4.58 8.79-8.01 12.33-2.23 2.29-2.85 5.54-3.74 8.5-2.21 3.8-4.65 7.51-6.21 11.65-1.58 4.3-3.91 8.4-4.34 13.05h-3.62c1.65-6.39 4.29-12.44 6.89-18.48 3.63-7.86 8.07-15.31 13.07-22.37 1.57-2.29 3.28-4.49 5.03-6.65 1.28-1.57 2.55-3.15 3.85-4.7 1.83-2.15 3.77-4.2 5.75-6.21 3.78-4 8.09-7.44 12.3-10.97-5.56.63-11.13 1.94-15.93 4.94-1.76 1.03-3.5 2.13-5.21 3.26-3.19 2.06-6.1 4.52-8.85 7.13-4.55 4.19-8.71 8.77-12.62 13.56-3.25 3.41-5.71 7.48-7.82 11.67-4.67 8.78-5.49 19.17-3.58 28.82h-3.06c-.53-2.87-1.6-5.61-3.39-7.93.51-.16 1.54-.49 2.06-.65l.9-.32c.11-6.04-.05-12.25 2.32-17.94 4.98-12.65 15.14-22.27 25.17-31.04 5.13-4.3 10.74-8.03 16.79-10.9 4.15-2.09 8.84-2.38 13.25-3.6 1.28-.24 2-1.41 2.39-2.54z\"\n        ></Path>\n        <Path\n          fill=\"#f7004a\"\n          stroke=\"#f7004a\"\n          d=\"M240.62 431.58c.56.07 1.68.22 2.25.3 3.6 2.03 7 4.43 9.9 7.39 6.54 6.58 12.46 13.89 16.85 22.1 6.65 12.86 16.53 24.03 28.71 31.9 4.75 3.67 11.68 6.81 12.48 13.46-3.53-1.51-7.09-2.96-10.82-3.88-13.02-3.19-25.96-7.95-36.77-16.06-11.6-9.59-21.13-22.67-23.58-37.79-1.05-5.83.71-11.61.98-17.42z\"\n        ></Path>\n        <Path\n          fill=\"#0a2857\"\n          stroke=\"#0a2857\"\n          d=\"M47.69 432.95c3.14.57 4.93 3.32 6.8 5.61 2.4 3.17 5.47 5.72 8.61 8.13 7.66 7.23 18.06 10.07 27.81 13.27-2.92 3.77-5.8 7.59-8.19 11.73-3.58 5.81-5.44 12.44-8.22 18.63-3.67-7.65-9.16-14.11-14.62-20.53-4.48-6.24-7.03-13.62-8.5-21.1-1.3-5.23-1.4-10.78-3.69-15.74z\"\n        ></Path>\n        <Path\n          fill=\"#eee99f\"\n          stroke=\"#eee99f\"\n          d=\"M116.5 435.07c2.81.51 5.64.91 8.49 1.06 1.92 2.54 3.26 5.45 4.56 8.34-2.43-1.13-4.9-2.21-7.37-3.24-1.65-.71-3.29-1.44-4.91-2.21-.1-1.35-.4-2.67-.77-3.95z\"\n        ></Path>\n        <Path\n          fill=\"#0f0235\"\n          stroke=\"#0f0235\"\n          d=\"M299 434.43c2.97 2.05 3.38 5.84 4.63 8.94.64 1.37.93 3.78 2.96 3.46-.12-2.41-.34-4.82-.45-7.23 3.89 11.54 7.6 23.16 11.33 34.76.84 5 3.4 9.37 5.82 13.75-3.99-2.74-6.01-7.45-9.63-10.63-2.54-8.13-6.36-15.83-8.81-24.01-2.04-6.32-4.06-12.65-5.85-19.04z\"\n        ></Path>\n        <Path\n          fill=\"#15021a\"\n          stroke=\"#15021a\"\n          d=\"m373.92 435.62 3.63-.8c3.64.72 7.35.3 10.95-.44 8.91.65 17.66 2.74 26.25 5.14.84.54 1.68 1.1 2.52 1.67-.3 1.05-.61 2.1-.89 3.16-9.36-3.1-19.07-4.88-28.66-7.09-4.1-.98-8.33-1.08-12.52-1.11l1.38 1.68c-.88-.75-1.78-1.47-2.66-2.21z\"\n        ></Path>\n        <Path\n          fill=\"#330041\"\n          stroke=\"#330041\"\n          d=\"M113.74 437.22c1.16.64 2.34 1.2 3.53 1.8 1.62.77 3.26 1.5 4.91 2.21-.15.62-.43 1.86-.57 2.48-4.67-.11-9.33-.58-13.9-1.56 2.38-.17 4.76-.39 7.14-.57-1.31-1.12-2.6-2.25-3.98-3.28z\"\n        ></Path>\n        <Path\n          fill=\"#fd8b5c\"\n          stroke=\"#fd8b5c\"\n          d=\"M375.2 436.15c4.19.03 8.42.13 12.52 1.11 9.59 2.21 19.3 3.99 28.66 7.09 8.51 2.59 16.32 7.25 22.9 13.22 7.84 8.4 12.45 19.69 12.37 31.22.06 4.3-.07 8.63-1.08 12.83-7.46-4.99-15.79-8.66-22.78-14.36-8.12-6.17-15.1-13.63-22.32-20.78-9.91-9.27-18.93-19.44-28.89-28.65z\"\n        ></Path>\n        <Path\n          fill=\"#350052\"\n          stroke=\"#350052\"\n          d=\"M178.17 444.21c3.28-2.01 5.74-5.65 9.78-6.13-.49 2.5-3.13 3.47-4.72 5.17-7.25 6.2-11.7 14.85-15.52 23.42-1.65 3.77-2.19 8-4.45 11.51-3.09-5.61-6.94-10.74-10.11-16.29-1.92-3.5-5.22-5.96-7.12-9.46 3.66-.25 7.33-.55 10.93-1.28 7.3-1.43 15.03-2.46 21.21-6.94z\"\n        ></Path>\n        <Path\n          fill=\"#089999\"\n          stroke=\"#089999\"\n          d=\"M426.72 443.36c.96-1.61 1.94-3.2 2.95-4.78 3.79 2.91 8.05 5.12 12.37 7.13a602 602 0 0 1-5.3 3.47c-3.12-2.29-6.44-4.34-10.02-5.82z\"\n        ></Path>\n        <Path\n          fill=\"#170631\"\n          stroke=\"#170631\"\n          d=\"M414.75 439.52c4.07 1.02 8.06 2.31 11.97 3.84 3.58 1.48 6.9 3.53 10.02 5.82 3.19 2.57 6.19 5.42 8.73 8.64-2.12 1.17-4.05-.99-6.19-.25-6.58-5.97-14.39-10.63-22.9-13.22.28-1.06.59-2.11.89-3.16-.84-.57-1.68-1.13-2.52-1.67z\"\n        ></Path>\n        <Path\n          fill=\"#28bcb0\"\n          stroke=\"#28bcb0\"\n          d=\"M482.06 449.94c10.21-2.43 20.58-4.82 29.94-9.74v.89c-4.72 4.01-10.21 6.98-14.98 10.91-5.96 5.21-13.55 7.83-20.41 11.57-8.09 2.91-15.27 7.7-22.34 12.48-1.01-6.84-4.73-12.8-8.8-18.23-2.54-3.22-5.54-6.07-8.73-8.64 1.77-1.15 3.54-2.3 5.3-3.47 12.42 5.8 26.67 7.28 40.02 4.23z\"\n        ></Path>\n        <Path\n          fill=\"#220040\"\n          stroke=\"#220040\"\n          d=\"M0 440.72c5.06 8.49 10.73 16.62 16.52 24.62-.04 1.25-.08 2.5-.13 3.75-2.3-1.33-4.43-3.56-7.3-3.37-3.14-3.64-6.28-7.31-9.09-11.22z\"\n        ></Path>\n        <Path\n          fill=\"#140032\"\n          stroke=\"#140032\"\n          d=\"m65.97 441.01 1.14.8c5.65 4.13 11.89 7.64 18.77 9.24 5.7 1.27 11.84 2.49 17.5.33.54.47 1.62 1.41 2.16 1.89-7.54 4.56-14.12 10.86-18.53 18.53-4.76 8.06-7.51 17.08-9.89 26.07-1.3 4.71-3.15 9.28-3.91 14.13h-2.45c.75-10.5-2.69-21.31-10.41-28.64l1.95-.46c4.95 4.65 6.8 11.71 12.19 15.97.51-2.82 1.41-5.82.01-8.55 2.78-6.19 4.64-12.82 8.22-18.63 2.39-4.14 5.27-7.96 8.19-11.73-9.75-3.2-20.15-6.04-27.81-13.27 3.01.15 5.87 1.39 8.91 1.28-2.26-2.1-5.31-3.7-6.04-6.96z\"\n        ></Path>\n        <Path\n          fill=\"#e5b369\"\n          stroke=\"#e5b369\"\n          d=\"M217.81 447.56c4.8-3 10.37-4.31 15.93-4.94-4.21 3.53-8.52 6.97-12.3 10.97-1.31-.16-2.61-.28-3.92-.43.11-1.87.2-3.74.29-5.6z\"\n        ></Path>\n        <Path\n          fill=\"#0b0422\"\n          stroke=\"#0b0422\"\n          d=\"M497.02 452c4.77-3.93 10.26-6.9 14.98-10.91v5.57c-10.06 6.98-18.33 16.49-24.14 27.25-.82.78-1.67 1.53-2.51 2.28.91-2.4 1.8-4.81 2.49-7.28-2.87 3.26-4.61 7.29-6.89 10.95-2.15 2.67-4.46 5.21-6.71 7.79-.47-1.21-.94-2.41-1.41-3.61-3.93 2.07-6.63 6.91-11.52 6.57 13.06-8.74 22.46-21.52 32.7-33.19-3.15 2.24-6.59 4-10.1 5.58-10.16 4.96-20.45 10.14-28.85 17.84.89 4.46.56 9.01.41 13.52-1.3-1.02-1.72-2.59-2.15-4.08-.42-.37-1.26-1.12-1.67-1.49.08-11.53-4.53-22.82-12.37-31.22 2.14-.74 4.07 1.42 6.19.25 4.07 5.43 7.79 11.39 8.8 18.23 7.07-4.78 14.25-9.57 22.34-12.48 6.86-3.74 14.45-6.36 20.41-11.57z\"\n        ></Path>\n        <Path\n          fill=\"#fb114b\"\n          stroke=\"#fb114b\"\n          d=\"M109.1 451.24c4.63-2.45 9.63-4.57 14.91-4.94 1.58.06 3.77-.38 4.57 1.42-.21 2.78-1.67 5.31-3.92 6.95-4.09 3.16-8.21 6.39-11.3 10.6.5-2.9-.06-5.78-1.92-8.09.6-2.38-.8-4.32-2.34-5.94z\"\n        ></Path>\n        <Path\n          fill=\"#2fb191\"\n          stroke=\"#2fb191\"\n          d=\"M219.11 474.95c-.42-11.85 7.7-21.71 16.16-29.05 1.91 19.34 13.19 37.95 30.36 47.43 6.06 3.14 12.07 6.47 18.61 8.52 7.09 2.54 14.83 2.96 21.7 6.19 1.7.7 2.28 2.59 3.31 3.96h-74.18c-10.45-9.19-16.78-23.05-15.96-37.05z\"\n        ></Path>\n        <Path\n          fill=\"#0d001e\"\n          stroke=\"#0d001e\"\n          d=\"M381.25 447.37c.48.9.68 1.91.89 2.92-12.65 1.18-25.82 3.9-36.14 11.75-6.39 4.85-11 12-12.47 19.92-.86 5-1.78 10-2.68 15-.69 3.81.22 7.64.4 11.46.06 1.2.25 2.4.51 3.58h-3.17c-.89-3.8-1.01-7.78-2.44-11.44-2.32-6.24-6.76-11.35-11.35-16.03-4.26-4.57-9.23-8.37-14.05-12.31-7.28-5.91-13.28-13.23-18.52-20.96 2.66-.56 3.89 1.83 5.22 3.6.96-.36 1.93-.71 2.9-1.05q1.11 1.56 2.28 3.09c5.99 7.85 13.8 13.97 21.03 20.58 3.62 3.18 5.64 7.89 9.63 10.63 1.12 1.93 2.45 3.74 3.85 5.5 4.11-6.92 2.67-15.66 6.78-22.63 4.6-7.85 12.03-14.12 20.67-17.07 2.64-.89 5.2-2.02 7.56-3.52-.71-1.08-1.42-2.15-2.13-3.22 6.89.96 14.15 2.09 20.97.74z\"\n        ></Path>\n        <Path\n          fill=\"#2db690\"\n          stroke=\"#2db690\"\n          d=\"M487.86 473.91c5.81-10.76 14.08-20.27 24.14-27.25v12.06c-3.32 6.17-8.24 11.94-8.53 19.28-.67 7.21 3.01 14.2 8.53 18.66V512h-18.72c-5.58-4.28-9.42-10.87-9.63-17.97-.1-6.91 1.71-13.72 4.21-20.12z\"\n        ></Path>\n        <Path\n          fill=\"#c6bc76\"\n          stroke=\"#c6bc76\"\n          d=\"M212.6 450.82c1.71-1.13 3.45-2.23 5.21-3.26-.09 1.86-.18 3.73-.29 5.6 1.31.15 2.61.27 3.92.43-1.98 2.01-3.92 4.06-5.75 6.21-1.14-2.96-1.63-6.14-3.09-8.98z\"\n        ></Path>\n        <Path\n          fill=\"#e7dfc1\"\n          stroke=\"#e7dfc1\"\n          d=\"M132.99 452.25c.96-1.14 1.92-2.29 3.09-3.23 1.88.48 3.1 2.1 4.38 3.44 3.84 4.42 7.42 9.1 10.41 14.15-2.56-.12-3.64-2.68-5.1-4.36-2.85-3.49-5.22-7.39-8.49-10.53-1.43.2-2.86.39-4.29.53z\"\n        ></Path>\n        <Path\n          fill=\"#92cc83\"\n          stroke=\"#92cc83\"\n          d=\"M203.75 457.95c2.75-2.61 5.66-5.07 8.85-7.13 1.46 2.84 1.95 6.02 3.09 8.98-1.3 1.55-2.57 3.13-3.85 4.7-3.57-.91-5.87-3.85-8.09-6.55z\"\n        ></Path>\n        <Path\n          fill=\"#fa044c\"\n          stroke=\"#fa044c\"\n          d=\"M346 462.04c10.32-7.85 23.49-10.57 36.14-11.75-.15.58-.45 1.76-.6 2.34-8.8 5.18-17.28 11.28-23.4 19.59-9.51 11.66-13.69 27.74-26.89 36.2-.18-3.82-1.09-7.65-.4-11.46.9-5 1.82-10 2.68-15 1.47-7.92 6.08-15.07 12.47-19.92z\"\n        ></Path>\n        <Path\n          fill=\"#fd214a\"\n          stroke=\"#fd214a\"\n          d=\"M105.54 453.27c1.19-.68 2.37-1.37 3.56-2.03 1.54 1.62 2.94 3.56 2.34 5.94 1.86 2.31 2.42 5.19 1.92 8.09-11.43 13.13-18.75 29.02-26.49 44.44-.5-1.75-.44-3.55-.2-5.31-4.61 1.36-7.12-3.58-9.55-6.53 2.38-8.99 5.13-18.01 9.89-26.07 4.41-7.67 10.99-13.97 18.53-18.53z\"\n        ></Path>\n        <Path\n          fill=\"#fef2b4\"\n          stroke=\"#fef2b4\"\n          d=\"M131.63 456.07c-.3-1.46.75-2.62 1.36-3.82 1.43-.14 2.86-.33 4.29-.53 3.27 3.14 5.64 7.04 8.49 10.53 1.46 1.68 2.54 4.24 5.1 4.36l.3.09c3.79 6.74 7.83 13.34 11.42 20.19-.35.2-1.07.6-1.42.8-1.3-1.94-2.72-4.33-5.45-3.33l-.24 2.19c-1.88-.22-3.64.23-5 1.6l-.64-1.02c-4.08-6.82-7.16-14.22-11.77-20.71-2.15-3.45-4.97-6.52-6.44-10.35z\"\n        ></Path>\n        <Path\n          fill=\"#18bab6\"\n          stroke=\"#18bab6\"\n          d=\"M301.46 452.23c1.12.41 2.26.82 3.39 1.24 2.45 8.18 6.27 15.88 8.81 24.01-7.23-6.61-15.04-12.73-21.03-20.58 2.89-.41 6.15.17 8.67-1.58.12-1.03.12-2.07.16-3.09z\"\n        ></Path>\n        <Path\n          fill=\"#f1004a\"\n          stroke=\"#f1004a\"\n          d=\"M0 454.5c2.81 3.91 5.95 7.58 9.09 11.22 5.68 7.38 12.57 13.71 19.92 19.37 7.41 5.54 15.68 9.83 23.08 15.37l.55 1.1c-16.32-.34-32.62-5.02-46.42-13.79-2-1.28-4.08-2.41-6.22-3.43z\"\n        ></Path>\n        <Path\n          fill=\"#05032b\"\n          stroke=\"#05032b\"\n          d=\"M380.01 459.44c1.82-1.66 3.51-3.7 5.99-4.35 1.96.46 2.54 2.39 2.65 4.17-.84-.93-1.71-1.84-2.57-2.73-3.1 8.93-4.71 18.59-2.94 27.98.74 3.55 2.85 6.58 4.55 9.72-8.25-9.89-10.21-24.03-5.49-35.95z\"\n        ></Path>\n        <Path\n          fill=\"#049d9f\"\n          stroke=\"#049d9f\"\n          d=\"M386.08 456.53c.86.89 1.73 1.8 2.57 2.73 2.99 8.36 6.57 16.56 10.44 24.56 5.18 8.6 11.97 16.42 20.76 21.47 1.7 2.36 3.64 4.54 5.59 6.71h-15.2c-8.22-4.86-16.79-9.95-22.55-17.77-1.7-3.14-3.81-6.17-4.55-9.72-1.77-9.39-.16-19.05 2.94-27.98z\"\n        ></Path>\n        <Path\n          fill=\"#09a5a5\"\n          stroke=\"#09a5a5\"\n          d=\"M494.01 457.42c-10.24 11.67-19.64 24.45-32.7 33.19-1.93 1.25-3.72 2.69-5.56 4.05-.07-.07-.21-.23-.28-.3.15-4.51.48-9.06-.41-13.52 8.4-7.7 18.69-12.88 28.85-17.84 3.51-1.58 6.95-3.34 10.1-5.58z\"\n        ></Path>\n        <Path\n          fill=\"#2cad91\"\n          stroke=\"#2cad91\"\n          d=\"M112.34 476.44c4.25-7.15 9.45-14.15 16.44-18.8.39 10.51-1.99 20.87-2.09 31.36.55 7.98 3.11 15.68 6.2 23H102.5c-.78-12.57 3.56-24.85 9.84-35.56z\"\n        ></Path>\n        <Path\n          fill=\"#5acba0\"\n          stroke=\"#5acba0\"\n          d=\"M191.13 471.51c3.91-4.79 8.07-9.37 12.62-13.56 2.22 2.7 4.52 5.64 8.09 6.55-1.75 2.16-3.46 4.36-5.03 6.65-.8-2.52-3.28-1.55-5.2-1.51-1.78.41-3.26-.81-4.76-1.52-1.74 1.38-3.43 3.05-5.72 3.39z\"\n        ></Path>\n        <Path\n          fill=\"#1a0438\"\n          stroke=\"#1a0438\"\n          d=\"M269.62 461.37c1.01-1.18 2.03-2.34 3.05-3.5 3.45 4.99 6.5 10.3 10.5 14.9 5.62 6.49 12.18 12.07 18.73 17.59q-1.785 1.44-3.57 2.91c-12.18-7.87-22.06-19.04-28.71-31.9z\"\n        ></Path>\n        <Path\n          fill=\"#210032\"\n          stroke=\"#210032\"\n          d=\"M212.77 466.47c3.25-2.28 5.08-6.57 8.99-7.74-1.38 3.35-3.33 6.54-3.76 10.2-.67 5.25-1.12 10.55-2.74 15.62-.36-1.17-.76-2.32-1.15-3.47-2.87 10.06-5.63 20.35-4.88 30.92h-5.01c-.1-5.32-.37-10.68.5-15.95 1.13-7.29 4.26-14.04 6.24-21.1-4.61 2.96-6.56 8.27-9.94 12.35.89-2.96 1.51-6.21 3.74-8.5 3.43-3.54 6.33-7.67 8.01-12.33z\"\n        ></Path>\n        <Path\n          fill=\"#0e0122\"\n          stroke=\"#0e0122\"\n          d=\"M503.47 478c.29-7.34 5.21-13.11 8.53-19.28v5.64c-4.89 2.58-6.15 8.53-6.99 13.54.31 5.71 2.48 11.74 6.99 15.5v3.26c-5.52-4.46-9.2-11.45-8.53-18.66z\"\n        ></Path>\n        <Path\n          fill=\"#fceaa7\"\n          stroke=\"#fceaa7\"\n          d=\"M367.65 478.97c.13-8.25 6.18-14.8 12.36-19.53l2.19-1.16c-4.72 11.92-2.76 26.06 5.49 35.95 5.76 7.82 14.33 12.91 22.55 17.77h-19.57c-12.46-6.16-23.03-18.57-23.02-33.03z\"\n        ></Path>\n        <Path\n          fill=\"#2b003d\"\n          stroke=\"#2b003d\"\n          d=\"M132.87 463c1.7 1.19 3.44 2.31 5.2 3.42 4.61 6.49 7.69 13.89 11.77 20.71-.58 2.31-.47 4.69-.12 7.03-4.19-3.8-6.96-8.92-8.85-14.19-.99-3.25-3.73-5.54-6.28-7.58-1.65-.5-1.86 1.77-2.61 2.72-.09-4.06-.25-8.18.89-12.11z\"\n        ></Path>\n        <Path\n          fill=\"#f40048\"\n          stroke=\"#f40048\"\n          d=\"M397.18 463.73c9.97 8.33 17.99 18.81 28.53 26.49 6.74 5.36 14.67 8.86 22.34 12.64.48.47 1.43 1.42 1.9 1.89-.86 2.63-1.68 6.14-4.79 6.9-4.06-.16-7.68-2.25-11.39-3.68-11.38-4.64-22.09-12.02-28.42-22.79-3.63-6.71-7.77-13.65-8.17-21.45z\"\n        ></Path>\n        <Path\n          fill=\"#17032c\"\n          stroke=\"#17032c\"\n          d=\"M9.09 465.72c2.87-.19 5 2.04 7.3 3.37.05-1.25.09-2.5.13-3.75 7.77 10.36 18.74 17.61 29.19 24.99 4.75 2.98 9.3 6.46 12.51 11.13-.76 1.39-1.53 2.77-2.3 4.16-1.29-1.71-2.48-3.5-3.83-5.16-7.4-5.54-15.67-9.83-23.08-15.37-7.35-5.66-14.24-11.99-19.92-19.37z\"\n        ></Path>\n        <Path\n          fill=\"#1f003e\"\n          stroke=\"#1f003e\"\n          d=\"M505.01 477.9c.84-5.01 2.1-10.96 6.99-13.54v29.04c-4.51-3.76-6.68-9.79-6.99-15.5z\"\n        ></Path>\n        <Path\n          fill=\"#3abe9f\"\n          stroke=\"#3abe9f\"\n          d=\"M191.13 471.51c2.29-.34 3.98-2.01 5.72-3.39 1.5.71 2.98 1.93 4.76 1.52 1.92-.04 4.4-1.01 5.2 1.51-5 7.06-9.44 14.51-13.07 22.37-.16-1.42-.32-2.83-.46-4.25-1.12-1.06-2.24-2.13-3.37-3.18-.75.09-1.49.19-2.23.29-1.34-1.22-2.82-2.28-4.37-3.2 2.11-4.19 4.57-8.26 7.82-11.67z\"\n        ></Path>\n        <Path\n          fill=\"#130435\"\n          stroke=\"#130435\"\n          d=\"M480.95 479.86c2.28-3.66 4.02-7.69 6.89-10.95-.69 2.47-1.58 4.88-2.49 7.28.84-.75 1.69-1.5 2.51-2.28-2.5 6.4-4.31 13.21-4.21 20.12.21 7.1 4.05 13.69 9.63 17.97h-5.03c-3.12-3.01-6.01-6.41-7.69-10.44-.78-2.63-.61-5.42-1.13-8.1-1.74-.17-1.94 2.24-2.89 3.27-.43-.56-.86-1.1-1.28-1.64 2.38-4.88 4.31-9.98 5.69-15.23z\"\n        ></Path>\n        <Path\n          fill=\"#1d003d\"\n          stroke=\"#1d003d\"\n          d=\"M59.88 469.79c5.46 6.42 10.95 12.88 14.62 20.53 1.4 2.73.5 5.73-.01 8.55-5.39-4.26-7.24-11.32-12.19-15.97-2.13-1.96-4.6-3.47-7.02-5.03.25-.6.73-1.79.98-2.39.13-.03.4-.09.53-.13.37-.19 1.1-.56 1.47-.75.44-1.64.95-3.26 1.62-4.81z\"\n        ></Path>\n        <Path\n          fill=\"#390054\"\n          stroke=\"#390054\"\n          d=\"M131.98 475.11c.75-.95.96-3.22 2.61-2.72 2.55 2.04 5.29 4.33 6.28 7.58 1.89 5.27 4.66 10.39 8.85 14.19 5.05 5.53 9.18 11.84 13.66 17.84h-25.13c-2.65-6.99-4.84-14.23-5.72-21.67-.49-5.06-.42-10.15-.55-15.22z\"\n        ></Path>\n        <Path\n          fill=\"#05705e\"\n          stroke=\"#05705e\"\n          d=\"M355.24 496.06c-.7-8.26 1.81-16.79 7.4-22.98-.23 6.88-.57 13.97 1.7 20.58 2.33 7 7.29 12.65 11.81 18.34h-15.6c-2.51-5.01-5.49-10.15-5.31-15.94z\"\n        ></Path>\n        <Path\n          fill=\"#17033c\"\n          stroke=\"#17033c\"\n          d=\"m110.2 474.18 2.14 2.26c-6.28 10.71-10.62 22.99-9.84 35.56H88.6c1.64-5.37 4.57-10.15 7.25-15.03 3.69-8.2 7.78-16.48 14.35-22.79z\"\n        ></Path>\n        <Path\n          fill=\"#2f0154\"\n          stroke=\"#2f0154\"\n          d=\"M201.02 487.3c3.38-4.08 5.33-9.39 9.94-12.35-1.98 7.06-5.11 13.81-6.24 21.1-.87 5.27-.6 10.63-.5 15.95h-13.75c.43-4.65 2.76-8.75 4.34-13.05 1.56-4.14 4-7.85 6.21-11.65z\"\n        ></Path>\n        <Path\n          fill=\"#ff9364\"\n          stroke=\"#ff9364\"\n          d=\"M474.24 487.65c2.25-2.58 4.56-5.12 6.71-7.79-1.38 5.25-3.31 10.35-5.69 15.23-1.53 2.97-3.46 5.69-5.24 8.51-3.05 3.33-6.72 5.98-10.51 8.4h-7.75c2.3-4.56 6.53-7.56 10.02-11.14 4.45-4.12 8.4-8.72 12.46-13.21z\"\n        ></Path>\n        <Path\n          fill=\"#f4004c\"\n          stroke=\"#f4004c\"\n          d=\"M214.11 481.08c.39 1.15.79 2.3 1.15 3.47 1.89 9.85 4.93 20.49 12.58 27.45h-18.61c-.75-10.57 2.01-20.86 4.88-30.92z\"\n        ></Path>\n        <Path\n          fill=\"#0d0319\"\n          stroke=\"#0d0319\"\n          d=\"M399.09 483.82c2.21-.56 4.22.75 6.26 1.36 6.33 10.77 17.04 18.15 28.42 22.79 3.71 1.43 7.33 3.52 11.39 3.68 3.11-.76 3.93-4.27 4.79-6.9-.47-.47-1.42-1.42-1.9-1.89.39.18 1.15.53 1.53.7.4 1.24.78 2.5 1.15 3.76-.9 1.82-1.85 3.77-3.79 4.68h-12.51c-5.03-1.84-9.81-4.3-14.58-6.71-8.79-5.05-15.58-12.87-20.76-21.47z\"\n        ></Path>\n        <Path\n          fill=\"#fee6a0\"\n          stroke=\"#fee6a0\"\n          d=\"M155.72 484.36c2.73-1 4.15 1.39 5.45 3.33.35-.2 1.07-.6 1.42-.8.93 1.63 1.85 3.27 2.72 4.94.49 1.63 1.14 3.28 1.09 5-1.8 1.57-3.93 2.7-5.88 4.09-3.67-3.99-7.2-8.13-10.04-12.77 1.36-1.37 3.12-1.82 5-1.6z\"\n        ></Path>\n        <Path\n          fill=\"#2bb897\"\n          stroke=\"#2bb897\"\n          d=\"M179.73 512c-1.91-9.65-1.09-20.04 3.58-28.82 1.55.92 3.03 1.98 4.37 3.2.74-.1 1.48-.2 2.23-.29 1.13 1.05 2.25 2.12 3.37 3.18.14 1.42.3 2.83.46 4.25-2.6 6.04-5.24 12.09-6.89 18.48z\"\n        ></Path>\n        <Path\n          fill=\"#13003d\"\n          stroke=\"#13003d\"\n          d=\"M461.31 490.61c4.89.34 7.59-4.5 11.52-6.57.47 1.2.94 2.4 1.41 3.61-4.06 4.49-8.01 9.09-12.46 13.21-3.49 3.58-7.72 6.58-10.02 11.14h-4.82c1.94-.91 2.89-2.86 3.79-4.68.48-1.89.7-3.88-.16-5.7 1.01-4.2 1.14-8.53 1.08-12.83.41.37 1.25 1.12 1.67 1.49.43 1.49.85 3.06 2.15 4.08.07.07.21.23.28.3 1.84-1.36 3.63-2.8 5.56-4.05z\"\n        ></Path>\n        <Path\n          fill=\"#0e0621\"\n          stroke=\"#0e0621\"\n          d=\"M0 484.34a57 57 0 0 1 6.22 3.43c13.8 8.77 30.1 13.45 46.42 13.79l-.55-1.1c1.35 1.66 2.54 3.45 3.83 5.16.77-1.39 1.54-2.77 2.3-4.16 2.17 3.13 3.48 6.75 3.83 10.54h-6.37v-5.64c-13.24-.43-26.57-2.88-38.69-8.36-5.78-2.68-12.11-4.58-16.99-8.83z\"\n        ></Path>\n        <Path\n          fill=\"#ffa871\"\n          stroke=\"#ffa871\"\n          d=\"M314.8 484.53c4.59 4.68 9.03 9.79 11.35 16.03 1.43 3.66 1.55 7.64 2.44 11.44h-8.85c-2.85-4.95-5.61-10-9.62-14.14 1.28-.29 2.52.17 3.73.51.25-1.36.5-2.7.75-4.04 1-.24 2.01-.47 3.02-.7-1.33-2.9-2.47-5.91-2.82-9.1z\"\n        ></Path>\n        <Path\n          fill=\"#12002f\"\n          stroke=\"#12002f\"\n          d=\"M149.72 494.16c-.35-2.34-.46-4.72.12-7.03l.64 1.02c2.84 4.64 6.37 8.78 10.04 12.77 1.66 1.9 3.31 3.82 5.08 5.62 2.32 2.25 5.05 4.06 7.96 5.46h-10.18c-4.48-6-8.61-12.31-13.66-17.84z\"\n        ></Path>\n        <Path\n          fill=\"#04a7a8\"\n          stroke=\"#04a7a8\"\n          d=\"M0 489.17c4.88 4.25 11.21 6.15 16.99 8.83 12.12 5.48 25.45 7.93 38.69 8.36V512H12.52c-4.18-2.2-8.1-4.9-12.52-6.63z\"\n        ></Path>\n        <Path\n          fill=\"#ffb07a\"\n          stroke=\"#ffb07a\"\n          d=\"M165.31 491.83c1.91 3.46 4.06 6.79 6.37 9.99-1.63 2.04-3.79 3.52-6.08 4.72-1.77-1.8-3.42-3.72-5.08-5.62 1.95-1.39 4.08-2.52 5.88-4.09.05-1.72-.6-3.37-1.09-5z\"\n        ></Path>\n        <Path\n          fill=\"#27003f\"\n          stroke=\"#27003f\"\n          d=\"M476.54 496.73c.95-1.03 1.15-3.44 2.89-3.27.52 2.68.35 5.47 1.13 8.1 1.68 4.03 4.57 7.43 7.69 10.44h-22.62c-.88-3.51 4.2-4.88 4.39-8.4 1.78-2.82 3.71-5.54 5.24-8.51.42.54.85 1.08 1.28 1.64z\"\n        ></Path>\n        <Path\n          fill=\"#280244\"\n          stroke=\"#280244\"\n          d=\"M337.7 506.65c3.81-3.44 7.25-7.25 10.52-11.2 2.28 2.71 2.58 6.32 3.96 9.46 1.57 2.46 3.47 4.7 5.15 7.09h-22.84c.58-2.05 1.52-3.99 3.21-5.35z\"\n        ></Path>\n        <Path\n          fill=\"#fa1348\"\n          stroke=\"#fa1348\"\n          d=\"M73.21 512c.76-4.85 2.61-9.42 3.91-14.13 2.43 2.95 4.94 7.89 9.55 6.53-.24 1.76-.3 3.56.2 5.31-.35.75-.7 1.52-1.05 2.29z\"\n        ></Path>\n        <Path\n          fill=\"#ff9667\"\n          stroke=\"#ff9667\"\n          d=\"M171.68 501.82c.53.74 1.07 1.49 1.6 2.25 1.79 2.32 2.86 5.06 3.39 7.93h-3.11c-2.91-1.4-5.64-3.21-7.96-5.46 2.29-1.2 4.45-2.68 6.08-4.72z\"\n        ></Path>\n        <Path\n          fill=\"#440f24\"\n          stroke=\"#440f24\"\n          d=\"M459.51 512c3.79-2.42 7.46-5.07 10.51-8.4-.19 3.52-5.27 4.89-4.39 8.4z\"\n        ></Path>\n        <Path\n          fill=\"#171229\"\n          stroke=\"#171229\"\n          d=\"M0 505.37c4.42 1.73 8.34 4.43 12.52 6.63H0z\"\n        ></Path>\n        <Path\n          fill=\"#20a7aa\"\n          stroke=\"#20a7aa\"\n          d=\"M419.85 505.29c4.77 2.41 9.55 4.87 14.58 6.71h-8.99c-1.95-2.17-3.89-4.35-5.59-6.71z\"\n        ></Path>\n      </G>\n    </Svg>\n  );\n};\n\nexport default Chart;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/svg/Star.tsx",
    "content": "import React from 'react';\n\nimport { Svg, Path } from '@react-pdf/renderer';\n\nconst Star = () => (\n  <Svg width={16} height={16} viewBox=\"0 0 16 16\">\n    <Path\n      fillRule=\"evenodd\"\n      stroke=\"black\"\n      fill=\"red\"\n      d=\"M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z\"\n    />\n  </Svg>\n);\n\nexport default Star;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/svg/Svg1.tsx",
    "content": "import React from 'react';\nimport { Rect, Svg, G, Path, Text, Tspan } from '@react-pdf/renderer';\n\nconst Svg1 = () => (\n  <Svg width=\"400\" viewBox=\"0 0 600 400\">\n    <Rect fill=\"#ffffff\" x=\"0\" y=\"0\" width=\"600\" height=\"400\" rx=\"0\" ry=\"0\" />\n    <Rect fill=\"none\" x=\"10\" y=\"10\" width=\"580\" height=\"375\" />\n    <Rect fill=\"none\" x=\"10\" y=\"10\" width=\"580\" height=\"375\" />\n    <G>\n      <G transform=\"translate(10,10) scale(1 1)\">\n        <Path\n          fill=\"#e1f3ef\"\n          d=\"M 289.97026371226053 42.00000302824253 A 146 146 0 1 1 267.8372206592401 43.69195721688695 L 290 188 A 0 0 0 1 0 290 188 Z\"\n          transform=\"translate(0,0)\"\n          stroke=\"#ffffff\"\n          strokeWidth=\"1\"\n          strokeLinejoin=\"round\"\n        />\n        <Path\n          fill=\"#725573\"\n          d=\"M 267.98153975936066 43.66986659525537 A 146 146 0 0 1 280.0229902761958 42.34129179149255 L 290 188 A 0 0 0 0 0 290 188 Z\"\n          transform=\"translate(0,0)\"\n          stroke=\"#ffffff\"\n          strokeWidth=\"1\"\n          strokeLinejoin=\"round\"\n        />\n        <Path\n          fill=\"#bad5d9\"\n          d=\"M 280.16865394863237 42.33138761277962 A 146 146 0 0 1 289.7972089290416 42.00014083643251 L 290 188 A 0 0 0 0 0 290 188 Z\"\n          transform=\"translate(0,0)\"\n          stroke=\"#ffffff\"\n          strokeWidth=\"1\"\n          strokeLinejoin=\"round\"\n        />\n      </G>\n      <G transform=\"translate(10,10) scale(1 1)\" />\n    </G>\n    <G visibility=\"visible\" transform=\"translate(10,10) scale(1 1)\">\n      <Path\n        fill=\"none\"\n        stroke=\"#e1f3ef\"\n        strokeWidth=\"1\"\n        d=\"M 308.267200557376 363.4992347258824 C 303.267200557376 363.4992347258824 301.91032777309874 345.5504493561899 301.4580368450064 339.5675208996257 L 301.00574591691407 333.5845924430615\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#725573\"\n        strokeWidth=\"1\"\n        d=\"M 198.01149501227187 35 C 203.01149501227187 35 272.81601016149165 30.937240272462915 273.46856673763756 36.90164886971116 L 274.12112331378347 42.866057466959404\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#bad5d9\"\n        strokeWidth=\"1\"\n        d=\"M 279.1013042228135 12 C 284.1013042228135 12 284.70457992729905 30.088763774538094 284.905671828794 36.08539299828981 L 285.106763730289 42.08202222204153\"\n      />\n      <G transform=\"translate(313,353)\">\n        <Text\n          x=\"5\"\n          style={{\n            fontSize: '11',\n            fontWeight: 'bold',\n            color: '#000000',\n            fill: '#000000',\n          }}\n          y=\"16\"\n        >\n          <Tspan\n            x=\"5\"\n            y=\"16\"\n            fill=\"#FFFFFF\"\n            stroke=\"#FFFFFF\"\n            strokeWidth=\"2\"\n            strokeLinejoin=\"round\"\n          >\n            USD\n          </Tspan>\n          <Tspan x=\"5\" y=\"16\">\n            USD\n          </Tspan>\n        </Text>\n      </G>\n      <G transform=\"translate(161,25)\">\n        <Text\n          x=\"5\"\n          style={{\n            fontSize: '11',\n            fontWeight: 'bold',\n            color: '#000000',\n            fill: '#000000',\n          }}\n          y=\"16\"\n        >\n          <Tspan\n            x=\"5\"\n            y=\"16\"\n            fill=\"#FFFFFF\"\n            stroke=\"#FFFFFF\"\n            strokeWidth=\"2\"\n            strokeLinejoin=\"round\"\n          >\n            EUR\n          </Tspan>\n          <Tspan x=\"5\" y=\"16\">\n            EUR\n          </Tspan>\n        </Text>\n      </G>\n      <G transform=\"translate(241,2)\">\n        <Text\n          x=\"5\"\n          style={{\n            fontSize: '11',\n            fontWeight: 'bold',\n            color: '#000000',\n            fill: '#000000',\n          }}\n          y=\"16\"\n        >\n          <Tspan\n            x=\"5\"\n            y=\"16\"\n            fill=\"#FFFFFF\"\n            stroke=\"#FFFFFF\"\n            strokeWidth=\"2\"\n            strokeLinejoin=\"round\"\n          >\n            CHF\n          </Tspan>\n          <Tspan x=\"5\" y=\"16\">\n            CHF\n          </Tspan>\n        </Text>\n      </G>\n    </G>\n    <G>\n      <Rect\n        fill=\"none\"\n        rx=\"0\"\n        ry=\"0\"\n        x=\"0\"\n        y=\"0\"\n        width=\"8\"\n        height=\"8\"\n        visibility=\"hidden\"\n      />\n    </G>\n  </Svg>\n);\n\nexport default Svg1;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/svg/Svg2.tsx",
    "content": "import React from 'react';\nimport {\n  Rect,\n  Svg,\n  G,\n  Path,\n  Text,\n  Defs,\n  ClipPath,\n  Tspan,\n  LinearGradient,\n  Stop,\n} from '@react-pdf/renderer';\n\nconst Svg2 = () => (\n  <Svg width=\"400\" viewBox=\"0 0 600 400\">\n    <Defs>\n      <LinearGradient x1=\"0\" x2=\"0\" y1=\"0\" y2=\"1\" id=\"highcharts-5xj7ee9-2948\">\n        <Stop offset=\"0\" stopColor=\"#B5E2D5\" stopOpacity=\"0.7\" />\n        <Stop offset=\"0.5\" stopColor=\"rgb(225,243,239)\" stopOpacity=\"0.5\" />\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"1\" />\n      </LinearGradient>\n\n      <ClipPath id=\"highcharts-5xj7ee9-2949\">\n        <Rect x=\"0\" y=\"0\" width=\"544\" height=\"319\" fill=\"none\" />\n      </ClipPath>\n    </Defs>\n\n    <Rect fill=\"#ffffff\" x=\"0\" y=\"0\" width=\"600\" height=\"400\" rx=\"0\" ry=\"0\" />\n    <Rect fill=\"none\" x=\"46\" y=\"45\" width=\"544\" height=\"319\" />\n    <G>\n      <Path fill=\"none\" d=\"M 58.5 45 L 58.5 364\" opacity=\"1\" />\n      <Path fill=\"none\" d=\"M 167.5 45 L 167.5 364\" opacity=\"1\" />\n      <Path fill=\"none\" d=\"M 276.5 45 L 276.5 364\" opacity=\"1\" />\n      <Path fill=\"none\" d=\"M 384.5 45 L 384.5 364\" opacity=\"1\" />\n      <Path fill=\"none\" d=\"M 492.5 45 L 492.5 364\" opacity=\"1\" />\n    </G>\n    <G>\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 364.5 L 590 364.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 318.5 L 590 318.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 273.5 L 590 273.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 227.5 L 590 227.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 182.5 L 590 182.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 136.5 L 590 136.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 91.5 L 590 91.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 44.5 L 590 44.5\"\n        opacity=\"1\"\n      />\n    </G>\n    <Rect\n      fill=\"none\"\n      stroke=\"#cccccc\"\n      strokeWidth=\"1\"\n      x=\"45.5\"\n      y=\"44.5\"\n      width=\"545\"\n      height=\"320\"\n    />\n    <G>\n      <Path\n        fill=\"none\"\n        stroke=\"#ccd6eb\"\n        strokeWidth=\"1\"\n        d=\"M 58.5 364 L 58.5 374\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#ccd6eb\"\n        strokeWidth=\"1\"\n        d=\"M 167.5 364 L 167.5 374\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#ccd6eb\"\n        strokeWidth=\"1\"\n        d=\"M 276.5 364 L 276.5 374\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#ccd6eb\"\n        strokeWidth=\"1\"\n        d=\"M 384.5 364 L 384.5 374\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#ccd6eb\"\n        strokeWidth=\"1\"\n        d=\"M 492.5 364 L 492.5 374\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#ccd6eb\"\n        strokeWidth=\"1\"\n        d=\"M 46 364.5 L 590 364.5\"\n      />\n    </G>\n    <G>\n      <Path fill=\"none\" d=\"M 46 45 L 46 364\" />\n    </G>\n    <G>\n      <G\n        transform=\"translate(46,45) scale(1 1)\"\n        clip-Path=\"url(#highcharts-5xj7ee9-2949)\"\n      >\n        <Path\n          fill=\"url(#highcharts-5xj7ee9-2948)\"\n          d=\"M 0 229.26985714285718 L 2.0797378481704 230.31799999999998 L 4.1594756963408 228.6014761904762 L 6.2392135445112 229.46125714285716 L 8.3189513926816 228.27640000000002 L 10.398689240852 226.6905142857143 L 12.478427089022 227.21914285714286 L 14.558164937193 230.3909142857143 L 16.637902785363 230.26331428571427 L 18.717640633534 229.35188571428571 L 20.797378481704 224.44840000000002 L 22.877116329874 210.4306285714286 L 24.956854178045 177.0358857142857 L 27.036592026215 166.08051428571426 L 29.116329874386 169.36165714285715 L 31.196067722556 175.3892380952381 L 33.275805570726 223.51874285714285 L 35.355543418897 233.1981142857143 L 37.435281267067 207.86040000000003 L 39.515019115238 190.16957142857143 L 41.594756963408 181.68417142857143 L 43.674494811578 162.9452 L 45.754232659749 165.57011428571428 L 47.833970507919 180.21980952380952 L 49.91370835609 183.41588571428574 L 51.99344620426 212.05297142857142 L 54.07318405243 217.15697142857144 L 56.152921900601 217.3757142857143 L 58.232659748771 223.1906285714286 L 60.312397596942 206.2562857142857 L 62.392135445112 197.06908571428573 L 64.471873293282 189.6865142857143 L 66.551611141453 188.33152380952382 L 68.631348989623 176.52548571428574 L 70.711086837794 152.8648 L 72.790824685964 160.33851428571433 L 74.870562534134 156.2872142857143 L 76.950300382305 154.97931428571428 L 79.030038230475 181.192 L 81.109776078646 191.10834285714287 L 83.189513926816 183.83514285714284 L 85.269251774986 188.26468571428572 L 87.348989623157 185.45748571428572 L 89.428727471327 188.17354285714288 L 91.508465319498 136.9330285714286 L 93.588203167668 111.66519047619047 L 95.667941015838 112.30622857142856 L 97.747678864009 90.55954285714287 L 99.827416712179 77.56257142857146 L 101.90715456035 101.60150000000002 L 103.98689240852 108.73342857142859 L 106.06663025669 112.8166285714286 L 108.14636810486 155.23451428571428 L 110.22610595303 172.6428 L 112.3058438012 193.19247619047619 L 114.38558164937 181.68417142857143 L 116.46531949754 174.83022857142856 L 118.54505734571 169.9632 L 120.62479519388 139.8131428571429 L 122.70453304205 104.68668571428569 L 124.78427089022 98.7806285714286 L 126.86400873839 77.32560000000001 L 128.94374658656 86.05708571428573 L 131.02348443474 106.01737142857141 L 133.10322228291 139.63085714285717 L 135.18296013108 165.64302857142857 L 137.26269797925 203.9959428571429 L 139.34243582742 225.0165238095238 L 141.42217367559 229.71645714285714 L 143.50191152376 214.53205714285716 L 145.58164937193 202.95691428571428 L 147.6613872201 202.40550000000002 L 149.74112506827 194.35302857142858 L 151.82086291644 199.6757714285714 L 153.90060076461 218.81577142857145 L 155.98033861278 170.11814285714283 L 158.06007646095 146.13845714285713 L 160.13981430912 143.02137142857143 L 162.21955215729 142.96668571428572 L 164.29929000546 170.91108571428572 L 166.37902785363 238.90821428571428 L 168.4587657018 247.50754285714288 L 170.53850354997 250.5517142857143 L 172.61824139814 248.1273142857143 L 174.69797924631 241.14880952380952 L 176.77771709448 239.7057142857143 L 178.85745494265 227.21914285714286 L 180.93719279082 220.74800000000005 L 183.016930639 218.67450000000002 L 185.09666848717 226.52645714285717 L 187.17640633534 225.87022857142858 L 189.25614418351 224.4484 L 191.33588203168 209.50097142857143 L 193.41561987985 210.79520000000002 L 195.49535772802 216.39137142857146 L 197.57509557619 216.08148571428572 L 199.65483342436 239.23177142857145 L 201.73457127253 260.1824761904762 L 203.8143091207 255.78331428571428 L 205.89404696887 258.0801142857143 L 207.97378481704 264.7882285714286 L 210.05352266521 268.3245714285714 L 212.13326051338 278.69207142857147 L 214.21299836155 260.8690857142857 L 216.29273620972 257.6426285714286 L 218.37247405789 247.74451428571427 L 220.45221190606 241.39185714285713 L 222.53194975423 247.8721142857143 L 224.6116876024 242.53114285714287 L 226.69142545057 237.15371428571427 L 228.77116329874 237.40435714285712 L 230.85090114691 230.24508571428572 L 232.93063899508 214.47737142857142 L 235.01037684326 214.25862857142857 L 237.09011469143 211.25091428571432 L 239.1698525396 211.92537142857145 L 241.24959038777 225.14108571428574 L 243.32932823594 222.46148571428571 L 245.40906608411 214.69611428571432 L 247.48880393228 210.9957142857143 L 249.56854178045 208.26142857142855 L 251.64827962862 208.4984 L 253.72801747679 222.58908571428572 L 255.80775532496 235.71821428571428 L 257.88749317313 248.94760000000002 L 259.9672310213 243.31497142857143 L 262.04696886947 243.18737142857142 L 264.12670671764 241.07285714285715 L 266.20644456581 199.35980952380953 L 268.28618241398 153.32051428571432 L 270.36592026215 153.9038285714286 L 272.44565811032 157.13028571428575 L 274.52539595849 157.03914285714288 L 276.60513380666 203.68605714285712 L 278.68487165483 236.33342857142856 L 280.764609503 193.58742857142857 L 282.84434735117 93.58852380952382 L 284.92408519934 82.84885714285713 L 287.00382304752 67.02645714285711 L 289.08356089569 63.39897142857143 L 291.16329874386 81.46348571428572 L 293.24303659203 48.89814285714283 L 295.3227744402 45.425599999999974 L 297.40251228837 48.34217142857142 L 299.48225013654 41.178342857142866 L 301.56198798471 88.39034285714288 L 303.64172583288 131.1363428571429 L 305.72146368105 144.57080000000002 L 307.80120152922 171.54908571428575 L 309.88093937739 182.49838095238098 L 311.96067722556 165.97114285714287 L 314.04041507373 158.35160000000002 L 316.1201529219 156.54697142857142 L 318.19989077007 139.50325714285717 L 320.27962861824 173.17142857142858 L 322.35936646641 184.49137142857145 L 324.43910431458 192.78537142857144 L 326.51884216275 205.89171428571427 L 328.59858001092 226.45961904761904 L 330.67831785909 226.14365714285714 L 332.75805570726 187.59022857142855 L 334.83779355543 136.82365714285714 L 336.9175314036 84.17042857142857 L 338.99726925177 71.20080000000002 L 341.07700709995 71.54714285714289 L 343.15674494812 107.36628571428571 L 345.23648279629 142.54742857142858 L 347.31622064446 219.472 L 349.39595849263 221.98754285714284 L 351.4756963408 232.12262857142858 L 353.55543418897 196.10297142857144 L 355.63517203714 189.8657619047619 L 357.71490988531 183.3612 L 359.79464773348 151.1695428571429 L 361.87438558165 147.56028571428575 L 363.95412342982 156.9252142857143 L 366.03386127799 161.23171428571428 L 368.11359912616 162.52594285714287 L 370.19333697433 192.11091428571427 L 372.2730748225 166.75497142857142 L 374.35281267067 140.78533333333337 L 376.43255051884 122.47777142857143 L 378.51228836701 57.63874285714286 L 380.59202621518 45.49851428571429 L 382.67176406335 48.282928571428556 L 384.75150191152 44.09491428571431 L 386.83123975969 50.456685714285754 L 388.91097760786 86.95028571428574 L 390.99071545603 65.01523809523815 L 393.07045330421 75.15639999999999 L 395.15019115238 87.05965714285716 L 397.22992900055 119.59765714285712 L 399.30966684872 228.58628571428574 L 401.38940469689 235.14857142857144 L 403.46914254506 189.12142857142857 L 405.54888039323 157.8412 L 407.6286182414 154.45068571428573 L 409.70835608957 154.396 L 411.78809393774 157.51308571428572 L 413.86783178591 220.71154285714286 L 415.94756963408 242.7498857142857 L 418.02730748225 241.69262857142857 L 420.10704533042 246.54142857142858 L 422.18678317859 243.4608 L 424.26652102676 229.26074285714287 L 426.34625887493 212.47222857142856 L 428.4259967231 208.7855 L 430.50573457127 207.75102857142858 L 432.58547241944 213.5659428571429 L 434.66521026761 214.9513142857143 L 436.74494811578 225.6697142857143 L 438.82468596395 217.53977142857144 L 440.90442381212 211.85245714285713 L 442.98416166029 213.67531428571428 L 445.06389950847 212.74565714285717 L 447.14363735664 216.1452857142857 L 449.22337520481 234.18245714285712 L 451.30311305298 237.66411428571428 L 453.38285090115 236.20582857142858 L 455.46258874932 248.3825142857143 L 457.54232659749 243.93474285714285 L 459.62206444566 242.31240000000003 L 461.70180229383 249.7678857142857 L 463.781540142 259.17990476190477 L 465.86127799017 266.84805714285716 L 467.94101583834 273.7566857142857 L 470.02075368651 267.0121142857143 L 472.10049153468 260.75971428571427 L 474.18022938285 256.18434285714284 L 476.25996723102 257.9889714285714 L 478.33970507919 258.99154285714286 L 480.41944292736 231.2112 L 482.49918077553 216.85923809523808 L 484.5789186237 214.09457142857144 L 486.65865647187 209.4098285714286 L 488.73839432004 211.70662857142855 L 490.81813216821 231.68514285714286 L 492.89787001638 225.81554285714287 L 494.97760786455 223.82862857142857 L 497.05734571273 218.76108571428574 L 499.1370835609 223.5005142857143 L 501.21682140907 235.13338095238095 L 503.29655925724 237.68234285714286 L 505.37629710541 244.08057142857143 L 507.45603495358 251.66365714285712 L 509.53577280175 248.6605 L 511.61551064992 247.01537142857143 L 513.69524849809 221.34954285714286 L 515.77498634626 149.43782857142855 L 517.85472419443 141.89120000000003 L 519.9344620426 143.51354285714288 L 522.01419989077 147.23217142857143 L 524.09393773894 188.06417142857143 L 526.17367558711 216.95645714285715 L 528.25341343528 197.30909523809524 L 530.33315128345 196.1941142857143 L 532.41288913162 204.21468571428574 L 534.49262697979 203.55845714285715 L 536.57236482796 228.65464285714285 L 538.65210267613 231.6486857142857 L 540.7318405243 219.83657142857146 L 542.81157837247 208.47409523809526 L 542.81157837247 319 L 540.7318405243 319 L 538.65210267613 319 L 536.57236482796 319 L 534.49262697979 319 L 532.41288913162 319 L 530.33315128345 319 L 528.25341343528 319 L 526.17367558711 319 L 524.09393773894 319 L 522.01419989077 319 L 519.9344620426 319 L 517.85472419443 319 L 515.77498634626 319 L 513.69524849809 319 L 511.61551064992 319 L 509.53577280175 319 L 507.45603495358 319 L 505.37629710541 319 L 503.29655925724 319 L 501.21682140907 319 L 499.1370835609 319 L 497.05734571273 319 L 494.97760786455 319 L 492.89787001638 319 L 490.81813216821 319 L 488.73839432004 319 L 486.65865647187 319 L 484.5789186237 319 L 482.49918077553 319 L 480.41944292736 319 L 478.33970507919 319 L 476.25996723102 319 L 474.18022938285 319 L 472.10049153468 319 L 470.02075368651 319 L 467.94101583834 319 L 465.86127799017 319 L 463.781540142 319 L 461.70180229383 319 L 459.62206444566 319 L 457.54232659749 319 L 455.46258874932 319 L 453.38285090115 319 L 451.30311305298 319 L 449.22337520481 319 L 447.14363735664 319 L 445.06389950847 319 L 442.98416166029 319 L 440.90442381212 319 L 438.82468596395 319 L 436.74494811578 319 L 434.66521026761 319 L 432.58547241944 319 L 430.50573457127 319 L 428.4259967231 319 L 426.34625887493 319 L 424.26652102676 319 L 422.18678317859 319 L 420.10704533042 319 L 418.02730748225 319 L 415.94756963408 319 L 413.86783178591 319 L 411.78809393774 319 L 409.70835608957 319 L 407.6286182414 319 L 405.54888039323 319 L 403.46914254506 319 L 401.38940469689 319 L 399.30966684872 319 L 397.22992900055 319 L 395.15019115238 319 L 393.07045330421 319 L 390.99071545603 319 L 388.91097760786 319 L 386.83123975969 319 L 384.75150191152 319 L 382.67176406335 319 L 380.59202621518 319 L 378.51228836701 319 L 376.43255051884 319 L 374.35281267067 319 L 372.2730748225 319 L 370.19333697433 319 L 368.11359912616 319 L 366.03386127799 319 L 363.95412342982 319 L 361.87438558165 319 L 359.79464773348 319 L 357.71490988531 319 L 355.63517203714 319 L 353.55543418897 319 L 351.4756963408 319 L 349.39595849263 319 L 347.31622064446 319 L 345.23648279629 319 L 343.15674494812 319 L 341.07700709995 319 L 338.99726925177 319 L 336.9175314036 319 L 334.83779355543 319 L 332.75805570726 319 L 330.67831785909 319 L 328.59858001092 319 L 326.51884216275 319 L 324.43910431458 319 L 322.35936646641 319 L 320.27962861824 319 L 318.19989077007 319 L 316.1201529219 319 L 314.04041507373 319 L 311.96067722556 319 L 309.88093937739 319 L 307.80120152922 319 L 305.72146368105 319 L 303.64172583288 319 L 301.56198798471 319 L 299.48225013654 319 L 297.40251228837 319 L 295.3227744402 319 L 293.24303659203 319 L 291.16329874386 319 L 289.08356089569 319 L 287.00382304752 319 L 284.92408519934 319 L 282.84434735117 319 L 280.764609503 319 L 278.68487165483 319 L 276.60513380666 319 L 274.52539595849 319 L 272.44565811032 319 L 270.36592026215 319 L 268.28618241398 319 L 266.20644456581 319 L 264.12670671764 319 L 262.04696886947 319 L 259.9672310213 319 L 257.88749317313 319 L 255.80775532496 319 L 253.72801747679 319 L 251.64827962862 319 L 249.56854178045 319 L 247.48880393228 319 L 245.40906608411 319 L 243.32932823594 319 L 241.24959038777 319 L 239.1698525396 319 L 237.09011469143 319 L 235.01037684326 319 L 232.93063899508 319 L 230.85090114691 319 L 228.77116329874 319 L 226.69142545057 319 L 224.6116876024 319 L 222.53194975423 319 L 220.45221190606 319 L 218.37247405789 319 L 216.29273620972 319 L 214.21299836155 319 L 212.13326051338 319 L 210.05352266521 319 L 207.97378481704 319 L 205.89404696887 319 L 203.8143091207 319 L 201.73457127253 319 L 199.65483342436 319 L 197.57509557619 319 L 195.49535772802 319 L 193.41561987985 319 L 191.33588203168 319 L 189.25614418351 319 L 187.17640633534 319 L 185.09666848717 319 L 183.016930639 319 L 180.93719279082 319 L 178.85745494265 319 L 176.77771709448 319 L 174.69797924631 319 L 172.61824139814 319 L 170.53850354997 319 L 168.4587657018 319 L 166.37902785363 319 L 164.29929000546 319 L 162.21955215729 319 L 160.13981430912 319 L 158.06007646095 319 L 155.98033861278 319 L 153.90060076461 319 L 151.82086291644 319 L 149.74112506827 319 L 147.6613872201 319 L 145.58164937193 319 L 143.50191152376 319 L 141.42217367559 319 L 139.34243582742 319 L 137.26269797925 319 L 135.18296013108 319 L 133.10322228291 319 L 131.02348443474 319 L 128.94374658656 319 L 126.86400873839 319 L 124.78427089022 319 L 122.70453304205 319 L 120.62479519388 319 L 118.54505734571 319 L 116.46531949754 319 L 114.38558164937 319 L 112.3058438012 319 L 110.22610595303 319 L 108.14636810486 319 L 106.06663025669 319 L 103.98689240852 319 L 101.90715456035 319 L 99.827416712179 319 L 97.747678864009 319 L 95.667941015838 319 L 93.588203167668 319 L 91.508465319498 319 L 89.428727471327 319 L 87.348989623157 319 L 85.269251774986 319 L 83.189513926816 319 L 81.109776078646 319 L 79.030038230475 319 L 76.950300382305 319 L 74.870562534134 319 L 72.790824685964 319 L 70.711086837794 319 L 68.631348989623 319 L 66.551611141453 319 L 64.471873293282 319 L 62.392135445112 319 L 60.312397596942 319 L 58.232659748771 319 L 56.152921900601 319 L 54.07318405243 319 L 51.99344620426 319 L 49.91370835609 319 L 47.833970507919 319 L 45.754232659749 319 L 43.674494811578 319 L 41.594756963408 319 L 39.515019115238 319 L 37.435281267067 319 L 35.355543418897 319 L 33.275805570726 319 L 31.196067722556 319 L 29.116329874386 319 L 27.036592026215 319 L 24.956854178045 319 L 22.877116329874 319 L 20.797378481704 319 L 18.717640633534 319 L 16.637902785363 319 L 14.558164937193 319 L 12.478427089022 319 L 10.398689240852 319 L 8.3189513926816 319 L 6.2392135445112 319 L 4.1594756963408 319 L 2.0797378481704 319 L 0 319\"\n        />\n        <Path\n          fill=\"none\"\n          d=\"M 0 229.26985714285718 L 2.0797378481704 230.31799999999998 L 4.1594756963408 228.6014761904762 L 6.2392135445112 229.46125714285716 L 8.3189513926816 228.27640000000002 L 10.398689240852 226.6905142857143 L 12.478427089022 227.21914285714286 L 14.558164937193 230.3909142857143 L 16.637902785363 230.26331428571427 L 18.717640633534 229.35188571428571 L 20.797378481704 224.44840000000002 L 22.877116329874 210.4306285714286 L 24.956854178045 177.0358857142857 L 27.036592026215 166.08051428571426 L 29.116329874386 169.36165714285715 L 31.196067722556 175.3892380952381 L 33.275805570726 223.51874285714285 L 35.355543418897 233.1981142857143 L 37.435281267067 207.86040000000003 L 39.515019115238 190.16957142857143 L 41.594756963408 181.68417142857143 L 43.674494811578 162.9452 L 45.754232659749 165.57011428571428 L 47.833970507919 180.21980952380952 L 49.91370835609 183.41588571428574 L 51.99344620426 212.05297142857142 L 54.07318405243 217.15697142857144 L 56.152921900601 217.3757142857143 L 58.232659748771 223.1906285714286 L 60.312397596942 206.2562857142857 L 62.392135445112 197.06908571428573 L 64.471873293282 189.6865142857143 L 66.551611141453 188.33152380952382 L 68.631348989623 176.52548571428574 L 70.711086837794 152.8648 L 72.790824685964 160.33851428571433 L 74.870562534134 156.2872142857143 L 76.950300382305 154.97931428571428 L 79.030038230475 181.192 L 81.109776078646 191.10834285714287 L 83.189513926816 183.83514285714284 L 85.269251774986 188.26468571428572 L 87.348989623157 185.45748571428572 L 89.428727471327 188.17354285714288 L 91.508465319498 136.9330285714286 L 93.588203167668 111.66519047619047 L 95.667941015838 112.30622857142856 L 97.747678864009 90.55954285714287 L 99.827416712179 77.56257142857146 L 101.90715456035 101.60150000000002 L 103.98689240852 108.73342857142859 L 106.06663025669 112.8166285714286 L 108.14636810486 155.23451428571428 L 110.22610595303 172.6428 L 112.3058438012 193.19247619047619 L 114.38558164937 181.68417142857143 L 116.46531949754 174.83022857142856 L 118.54505734571 169.9632 L 120.62479519388 139.8131428571429 L 122.70453304205 104.68668571428569 L 124.78427089022 98.7806285714286 L 126.86400873839 77.32560000000001 L 128.94374658656 86.05708571428573 L 131.02348443474 106.01737142857141 L 133.10322228291 139.63085714285717 L 135.18296013108 165.64302857142857 L 137.26269797925 203.9959428571429 L 139.34243582742 225.0165238095238 L 141.42217367559 229.71645714285714 L 143.50191152376 214.53205714285716 L 145.58164937193 202.95691428571428 L 147.6613872201 202.40550000000002 L 149.74112506827 194.35302857142858 L 151.82086291644 199.6757714285714 L 153.90060076461 218.81577142857145 L 155.98033861278 170.11814285714283 L 158.06007646095 146.13845714285713 L 160.13981430912 143.02137142857143 L 162.21955215729 142.96668571428572 L 164.29929000546 170.91108571428572 L 166.37902785363 238.90821428571428 L 168.4587657018 247.50754285714288 L 170.53850354997 250.5517142857143 L 172.61824139814 248.1273142857143 L 174.69797924631 241.14880952380952 L 176.77771709448 239.7057142857143 L 178.85745494265 227.21914285714286 L 180.93719279082 220.74800000000005 L 183.016930639 218.67450000000002 L 185.09666848717 226.52645714285717 L 187.17640633534 225.87022857142858 L 189.25614418351 224.4484 L 191.33588203168 209.50097142857143 L 193.41561987985 210.79520000000002 L 195.49535772802 216.39137142857146 L 197.57509557619 216.08148571428572 L 199.65483342436 239.23177142857145 L 201.73457127253 260.1824761904762 L 203.8143091207 255.78331428571428 L 205.89404696887 258.0801142857143 L 207.97378481704 264.7882285714286 L 210.05352266521 268.3245714285714 L 212.13326051338 278.69207142857147 L 214.21299836155 260.8690857142857 L 216.29273620972 257.6426285714286 L 218.37247405789 247.74451428571427 L 220.45221190606 241.39185714285713 L 222.53194975423 247.8721142857143 L 224.6116876024 242.53114285714287 L 226.69142545057 237.15371428571427 L 228.77116329874 237.40435714285712 L 230.85090114691 230.24508571428572 L 232.93063899508 214.47737142857142 L 235.01037684326 214.25862857142857 L 237.09011469143 211.25091428571432 L 239.1698525396 211.92537142857145 L 241.24959038777 225.14108571428574 L 243.32932823594 222.46148571428571 L 245.40906608411 214.69611428571432 L 247.48880393228 210.9957142857143 L 249.56854178045 208.26142857142855 L 251.64827962862 208.4984 L 253.72801747679 222.58908571428572 L 255.80775532496 235.71821428571428 L 257.88749317313 248.94760000000002 L 259.9672310213 243.31497142857143 L 262.04696886947 243.18737142857142 L 264.12670671764 241.07285714285715 L 266.20644456581 199.35980952380953 L 268.28618241398 153.32051428571432 L 270.36592026215 153.9038285714286 L 272.44565811032 157.13028571428575 L 274.52539595849 157.03914285714288 L 276.60513380666 203.68605714285712 L 278.68487165483 236.33342857142856 L 280.764609503 193.58742857142857 L 282.84434735117 93.58852380952382 L 284.92408519934 82.84885714285713 L 287.00382304752 67.02645714285711 L 289.08356089569 63.39897142857143 L 291.16329874386 81.46348571428572 L 293.24303659203 48.89814285714283 L 295.3227744402 45.425599999999974 L 297.40251228837 48.34217142857142 L 299.48225013654 41.178342857142866 L 301.56198798471 88.39034285714288 L 303.64172583288 131.1363428571429 L 305.72146368105 144.57080000000002 L 307.80120152922 171.54908571428575 L 309.88093937739 182.49838095238098 L 311.96067722556 165.97114285714287 L 314.04041507373 158.35160000000002 L 316.1201529219 156.54697142857142 L 318.19989077007 139.50325714285717 L 320.27962861824 173.17142857142858 L 322.35936646641 184.49137142857145 L 324.43910431458 192.78537142857144 L 326.51884216275 205.89171428571427 L 328.59858001092 226.45961904761904 L 330.67831785909 226.14365714285714 L 332.75805570726 187.59022857142855 L 334.83779355543 136.82365714285714 L 336.9175314036 84.17042857142857 L 338.99726925177 71.20080000000002 L 341.07700709995 71.54714285714289 L 343.15674494812 107.36628571428571 L 345.23648279629 142.54742857142858 L 347.31622064446 219.472 L 349.39595849263 221.98754285714284 L 351.4756963408 232.12262857142858 L 353.55543418897 196.10297142857144 L 355.63517203714 189.8657619047619 L 357.71490988531 183.3612 L 359.79464773348 151.1695428571429 L 361.87438558165 147.56028571428575 L 363.95412342982 156.9252142857143 L 366.03386127799 161.23171428571428 L 368.11359912616 162.52594285714287 L 370.19333697433 192.11091428571427 L 372.2730748225 166.75497142857142 L 374.35281267067 140.78533333333337 L 376.43255051884 122.47777142857143 L 378.51228836701 57.63874285714286 L 380.59202621518 45.49851428571429 L 382.67176406335 48.282928571428556 L 384.75150191152 44.09491428571431 L 386.83123975969 50.456685714285754 L 388.91097760786 86.95028571428574 L 390.99071545603 65.01523809523815 L 393.07045330421 75.15639999999999 L 395.15019115238 87.05965714285716 L 397.22992900055 119.59765714285712 L 399.30966684872 228.58628571428574 L 401.38940469689 235.14857142857144 L 403.46914254506 189.12142857142857 L 405.54888039323 157.8412 L 407.6286182414 154.45068571428573 L 409.70835608957 154.396 L 411.78809393774 157.51308571428572 L 413.86783178591 220.71154285714286 L 415.94756963408 242.7498857142857 L 418.02730748225 241.69262857142857 L 420.10704533042 246.54142857142858 L 422.18678317859 243.4608 L 424.26652102676 229.26074285714287 L 426.34625887493 212.47222857142856 L 428.4259967231 208.7855 L 430.50573457127 207.75102857142858 L 432.58547241944 213.5659428571429 L 434.66521026761 214.9513142857143 L 436.74494811578 225.6697142857143 L 438.82468596395 217.53977142857144 L 440.90442381212 211.85245714285713 L 442.98416166029 213.67531428571428 L 445.06389950847 212.74565714285717 L 447.14363735664 216.1452857142857 L 449.22337520481 234.18245714285712 L 451.30311305298 237.66411428571428 L 453.38285090115 236.20582857142858 L 455.46258874932 248.3825142857143 L 457.54232659749 243.93474285714285 L 459.62206444566 242.31240000000003 L 461.70180229383 249.7678857142857 L 463.781540142 259.17990476190477 L 465.86127799017 266.84805714285716 L 467.94101583834 273.7566857142857 L 470.02075368651 267.0121142857143 L 472.10049153468 260.75971428571427 L 474.18022938285 256.18434285714284 L 476.25996723102 257.9889714285714 L 478.33970507919 258.99154285714286 L 480.41944292736 231.2112 L 482.49918077553 216.85923809523808 L 484.5789186237 214.09457142857144 L 486.65865647187 209.4098285714286 L 488.73839432004 211.70662857142855 L 490.81813216821 231.68514285714286 L 492.89787001638 225.81554285714287 L 494.97760786455 223.82862857142857 L 497.05734571273 218.76108571428574 L 499.1370835609 223.5005142857143 L 501.21682140907 235.13338095238095 L 503.29655925724 237.68234285714286 L 505.37629710541 244.08057142857143 L 507.45603495358 251.66365714285712 L 509.53577280175 248.6605 L 511.61551064992 247.01537142857143 L 513.69524849809 221.34954285714286 L 515.77498634626 149.43782857142855 L 517.85472419443 141.89120000000003 L 519.9344620426 143.51354285714288 L 522.01419989077 147.23217142857143 L 524.09393773894 188.06417142857143 L 526.17367558711 216.95645714285715 L 528.25341343528 197.30909523809524 L 530.33315128345 196.1941142857143 L 532.41288913162 204.21468571428574 L 534.49262697979 203.55845714285715 L 536.57236482796 228.65464285714285 L 538.65210267613 231.6486857142857 L 540.7318405243 219.83657142857146 L 542.81157837247 208.47409523809526\"\n          stroke=\"#56bd9f\"\n          strokeWidth=\"2\"\n          stroke-linejoin=\"round\"\n          stroke-linecap=\"round\"\n        />\n      </G>\n      <G transform=\"translate(46,45) scale(1 1)\" clip-Path=\"none\" />\n    </G>\n    <G>\n      <Text\n        x=\"59.369743309667\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"middle\"\n        transform=\"translate(0,0)\"\n        y=\"383\"\n        opacity=\"1\"\n      >\n        2015\n      </Text>\n      <Text\n        x=\"167.81321682141\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"middle\"\n        transform=\"translate(0,0)\"\n        y=\"383\"\n        opacity=\"1\"\n      >\n        2016\n      </Text>\n      <Text\n        x=\"276.55379574003\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"middle\"\n        transform=\"translate(0,0)\"\n        y=\"383\"\n        opacity=\"1\"\n      >\n        2017\n      </Text>\n      <Text\n        x=\"384.99726925177\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"middle\"\n        transform=\"translate(0,0)\"\n        y=\"383\"\n        opacity=\"1\"\n      >\n        2018\n      </Text>\n      <Text\n        x=\"493.44074276352\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"middle\"\n        transform=\"translate(0,0)\"\n        y=\"383\"\n        opacity=\"1\"\n      >\n        2019\n      </Text>\n    </G>\n    <G>\n      <Text\n        x=\"31\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"362\"\n        opacity=\"1\"\n      >\n        0%\n      </Text>\n      <Text\n        x=\"31\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"316\"\n        opacity=\"1\"\n      >\n        5%\n      </Text>\n      <Text\n        x=\"31\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"271\"\n        opacity=\"1\"\n      >\n        10%\n      </Text>\n      <Text\n        x=\"31\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"225\"\n        opacity=\"1\"\n      >\n        15%\n      </Text>\n      <Text\n        x=\"31\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"180\"\n        opacity=\"1\"\n      >\n        20%\n      </Text>\n      <Text\n        x=\"31\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"134\"\n        opacity=\"1\"\n      >\n        25%\n      </Text>\n      <Text\n        x=\"31\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"89\"\n        opacity=\"1\"\n      >\n        30%\n      </Text>\n      <Text\n        x=\"0\"\n        style={{ color: '#666666', fontSize: '11', fill: '#666666' }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"-9999\"\n      >\n        35%\n      </Text>\n    </G>\n    <G transform=\"translate(0,0)\">\n      <G transform=\"translate(0,10)\">\n        <Text x=\"46\" y=\"15\" style={{ color: '#666666', fill: '#666666' }}>\n          Zoom\n        </Text>\n        <G transform=\"translate(158,0)\">\n          <Rect fill=\"none\" x=\"0\" y=\"0\" width=\"32\" height=\"22\" rx=\"2\" ry=\"2\" />\n          <Text\n            x=\"4.59375\"\n            style={{ fontWeight: 'normal', color: '#333333', fill: '#333333' }}\n            y=\"14\"\n          >\n            YTD\n          </Text>\n        </G>\n        <G transform=\"translate(232,0)\">\n          <Rect\n            fill=\"rgb(225, 243, 239)\"\n            fillOpacity=\" .50\"\n            x=\"0\"\n            y=\"0\"\n            width=\"32\"\n            height=\"22\"\n            rx=\"2\"\n            ry=\"2\"\n          />\n          <Text\n            x=\"8.6640625\"\n            style={{ fontWeight: 'bold', fill: '#000000' }}\n            y=\"14\"\n          >\n            All\n          </Text>\n        </G>\n      </G>\n      <G transform=\"translate(331,10)\">\n        <G transform=\"translate(0,0)\" fill=\"#666666\">\n          <Text x=\"2\" y=\"14\" style={{ fontSize: '12', fill: '#666666' }}>\n            From\n          </Text>\n        </G>\n        <G transform=\"translate(38,0)\">\n          <Rect\n            fill=\"none\"\n            x=\"0.5\"\n            y=\"0.5\"\n            width=\"94\"\n            height=\"21\"\n            stroke=\"#cccccc\"\n            strokeWidth=\"1\"\n          />\n          <Text\n            x=\"11.9140625\"\n            y=\"14\"\n            style={{ fontSize: '12', fill: '#333333' }}\n          >\n            <Tspan>Nov 17, 2014</Tspan>\n          </Text>\n        </G>\n        <G transform=\"translate(142,0)\" fill=\"#666666\">\n          <Text x=\"2\" y=\"14\" style={{ fontSize: '12', fill: '#666666' }}>\n            To\n          </Text>\n        </G>\n        <G transform=\"translate(165,0)\">\n          <Rect\n            fill=\"none\"\n            x=\"0.5\"\n            y=\"0.5\"\n            width=\"94\"\n            height=\"21\"\n            stroke=\"#cccccc\"\n            strokeWidth=\"1\"\n          />\n          <Text\n            x=\"11.9140625\"\n            y=\"14\"\n            style={{ fontSize: '12', fill: '#333333' }}\n          >\n            <Tspan>Nov 22, 2019</Tspan>\n          </Text>\n        </G>\n      </G>\n    </G>\n  </Svg>\n);\n\nexport default Svg2;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/svg/Svg4.tsx",
    "content": "import React from 'react';\nimport {\n  Svg,\n  Stop,\n  Defs,\n  Circle,\n  LinearGradient,\n  RadialGradient,\n} from '@react-pdf/renderer';\n\nconst Svg4 = () => (\n  <Svg viewBox=\"0 0 10 20\" width=\"170\">\n    <Defs>\n      <LinearGradient id=\"myLinearGradient\">\n        <Stop offset=\"5%\" stopColor=\"gold\" />\n        <Stop offset=\"95%\" stopColor=\"red\" />\n      </LinearGradient>\n\n      <RadialGradient id=\"myRadialGradient\">\n        <Stop offset=\"10%\" stopColor=\"gold\" />\n        <Stop offset=\"95%\" stopColor=\"red\" />\n      </RadialGradient>\n    </Defs>\n\n    <Circle cx=\"5\" cy=\"5\" r=\"4\" fill=\"url('#myLinearGradient')\" />\n    <Circle cx=\"5\" cy=\"14\" r=\"4\" fill=\"url('#myRadialGradient')\" />\n  </Svg>\n);\n\nexport default Svg4;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/svg/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, StyleSheet } from '@react-pdf/renderer';\n\nimport Svg0 from './svg';\nimport Svg1 from './Svg1';\nimport Svg2 from './Svg2';\nimport Svg4 from './Svg4';\nimport Star from './Star';\nimport Heart from './Heart';\nimport Pattern from './Pattern';\nimport Car from './Car';\n\nconst styles = StyleSheet.create({\n  page: {\n    fontSize: 20,\n    color: 'black',\n    padding: '10',\n  },\n});\n\nconst App = () => {\n  return (\n    <Document title=\"Hey!\" subject=\"Test\">\n      <Page size=\"A4\" style={styles.page}>\n        <Star />\n        <Svg0 />\n        <Svg1 />\n        <Svg2 />\n        <Svg4 />\n        <Heart />\n        <Pattern />\n        <Car />\n      </Page>\n    </Document>\n  );\n};\n\nexport default {\n  id: 'svg',\n  name: 'Svg',\n  description: '',\n  Document: App,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/svg/svg.tsx",
    "content": "import React from 'react';\nimport { Svg, G, Polygon } from '@react-pdf/renderer';\n\nconst Tiger = () => (\n  <Svg style={{ width: 400, height: 400 }}>\n    <G transform=\"scale(1) translate(100,10)\">\n      <Polygon\n        fill=\"#f2cc99\"\n        points=\" 69,18 82,8 99,3 118,5 135,12 149,21 156,13 165,9 177,13 183,28 180,50 164,91 155,107 154,114 151,121 141,127 139,136 155,206 157,251 126,342 133,357 128,376 83,376 75,368 67,350 61,350 53,369 4,369 2,361 5,354 12,342 16,321 4,257 4,244 7,218 9,179 26,127 43,93 32,77 30,70 24,67 16,49 17,35 18,23 30,12 40,7 53,7 62,12\"\n      />\n      <Polygon\n        fill=\"#e5b27f\"\n        points=\" 142,79 136,74 138,82 133,78 133,84 127,78 128,85 124,80 125,87 119,82 119,90 125,99 125,96 128,100 128,94 131,98 132,93 135,97 136,93 138,97 139,94 141,98 143,94 144,85\"\n      />\n      <Polygon\n        fill=\"#eb8080\"\n        points=\" 127,101 132,100 137,99 144,101 143,105 135,110\"\n      />\n      <Polygon\n        fill=\"#f2cc99\"\n        points=\" 178,229 157,248 139,296 126,349 137,356 158,357 183,342 212,332 235,288 235,261 228,252 212,250 188,251\"\n      />\n      <G fill=\"#9c826b\">\n        <Polygon points=\" 56,229 48,241 48,250 57,281 63,325 71,338 81,315 76,321 79,311 83,301 75,308 80,298 73,303 76,296 71,298 74,292 69,293 74,284 78,278 71,278 74,274 68,273 70,268 66,267 68,261 60,266 62,259 65,253 57,258 59,251 55,254 55,248 60,237 54,240 58,234 54,236\" />\n        <Polygon points=\" 74,363 79,368 81,368 85,362 89,363 92,370 96,373 101,372 108,361 110,371 113,373 116,371 120,358 122,363 123,371 126,371 129,367 132,357 135,361 130,376 127,377 94,378 84,376 76,371\" />\n        <Polygon points=\" 212,250 219,251 228,258 236,270 235,287 225,304 205,332 177,343 171,352 158,357 166,352 168,346 168,339 165,333 155,327 155,323 161,320 165,316 169,316 167,312 171,313 168,308 173,309 170,306 177,306 175,308 177,311 174,311 176,316 171,315 174,319 168,320 168,323 175,327 179,332 183,326 184,332 189,323 190,328 194,320 194,325 199,316 201,320 204,313 206,316 208,310 211,305 219,298 226,288 229,279 228,266 224,259 217,253\" />\n        <Polygon points=\" 151,205 151,238 149,252 141,268 128,282 121,301 130,300 126,313 118,324 116,337 120,346 133,352 133,340 137,333 145,329 156,327 153,319 153,291 157,271 170,259 178,277 193,250 174,216\" />\n        <Polygon points=\" 78,127 90,142 95,155 108,164 125,167 139,175 150,206 152,191 141,140 121,148 100,136\" />\n        <Polygon points=\" 21,58 35,63 38,68 32,69 42,74 40,79 47,80 54,83 45,94 34,81 32,73 24,66\" />\n        <Polygon points=\" 71,34 67,34 66,27 59,24 54,17 48,17 39,22 30,26 28,31 31,39 38,46 29,45 36,54 41,61 41,70 50,69 54,71 55,58 67,52 76,43 76,39 68,44\" />\n        <Polygon points=\" 139,74 141,83 143,89 144,104 148,104 155,106 154,86 157,77 155,72 150,77 144,77\" />\n        <Polygon points=\" 105,44 102,53 108,58 111,62 112,55\" />\n        <Polygon points=\" 141,48 141,54 144,58 139,62 137,66 136,59 137,52\" />\n        <Polygon points=\" 98,135 104,130 105,134 108,132 108,135 112,134 113,137 116,136 116,139 119,139 124,141 128,140 133,138 140,133 139,140 126,146 104,144\" />\n        <Polygon points=\" 97,116 103,119 103,116 111,118 116,117 122,114 127,107 135,111 142,107 141,114 145,118 149,121 145,125 140,124 127,121 113,125 100,124\" />\n        <Polygon points=\" 147,33 152,35 157,34 153,31 160,31 156,28 161,28 159,24 163,25 163,21 165,22 170,23 167,17 172,21 174,18 175,23 176,22 177,28 177,33 174,37 176,39 174,44 171,49 168,53 164,57 159,68 156,70 154,60 150,51 146,43 144,35\" />\n        <Polygon points=\" 85,72 89,74 93,75 100,76 105,75 102,79 94,79 88,76\" />\n        <Polygon points=\" 86,214 79,221 76,232 82,225 78,239 82,234 78,245 81,243 79,255 84,250 84,267 87,254 90,271 90,257 95,271 93,256 95,249 92,252 93,243 89,253 89,241 86,250 87,236 83,245 87,231 82,231 90,219 84,221\" />\n      </G>\n      <G fill=\"#ffcc7f\">\n        <Polygon points=\" 93,68 96,72 100,73 106,72 108,66 105,63 100,62\" />\n        <Polygon points=\" 144,64 142,68 142,73 146,74 150,73 154,64 149,62\" />\n      </G>\n      <G fill=\"#9c826b\">\n        <Polygon points=\" 57,91 42,111 52,105 41,117 53,112 46,120 53,116 50,124 57,119 55,127 61,122 60,130 67,126 66,134 71,129 72,136 77,130 76,137 80,133 82,138 86,135 96,135 94,129 86,124 83,117 77,123 79,117 73,120 75,112 68,116 71,111 65,114 69,107 63,110 68,102 61,107 66,98 61,103 63,97 57,99\" />\n        <Polygon points=\" 83,79 76,79 67,82 75,83 65,88 76,87 65,92 76,91 68,96 77,95 70,99 80,98 72,104 80,102 76,108 85,103 92,101 87,98 93,96 86,94 91,93 85,91 93,89 99,89 105,93 107,85 102,82 92,80\" />\n        <Polygon points=\" 109,77 111,83 109,89 113,94 117,90 117,81 114,78\" />\n        <Polygon points=\" 122,128 127,126 134,127 136,129 134,130 130,128 124,129\" />\n        <Polygon points=\" 78,27 82,32 80,33 82,36 78,37 82,40 78,42 81,46 76,47 78,49 74,50 82,52 87,50 83,48 91,46 86,45 91,42 88,40 92,37 86,34 90,31 86,29 89,26\" />\n        <Polygon points=\" 82,17 92,20 79,21 90,25 81,25 94,28 93,26 101,30 101,26 107,33 108,28 111,40 113,34 115,45 117,39 119,54 121,46 124,58 126,47 129,59 130,49 134,58 133,44 137,48 133,37 137,40 133,32 126,20 135,26 132,19 138,23 135,17 142,18 132,11 116,6 94,6 78,11 92,12 80,14 90,16\" />\n        <Polygon points=\" 142,234 132,227 124,223 115,220 110,225 118,224 127,229 135,236 122,234 115,237 113,242 121,238 139,243 121,245 111,254 95,254 102,244 104,235 110,229 100,231 104,224 113,216 122,215 132,217 141,224 145,230 149,240\" />\n        <Polygon points=\" 115,252 125,248 137,249 143,258 134,255 125,254\" />\n        <Polygon points=\" 114,212 130,213 140,219 147,225 144,214 137,209 128,207\" />\n        <Polygon points=\" 102,263 108,258 117,257 131,258 116,260 109,265\" />\n        <Polygon points=\" 51,241 35,224 40,238 23,224 31,242 19,239 28,247 17,246 25,250 37,254 39,263 44,271 47,294 48,317 51,328 60,351 60,323 53,262 47,246\" />\n        <Polygon points=\" 2,364 9,367 14,366 18,355 20,364 26,366 31,357 35,364 39,364 42,357 47,363 53,360 59,357 54,369 7,373\" />\n        <Polygon points=\" 7,349 19,345 25,339 18,341 23,333 28,326 23,326 27,320 23,316 25,311 20,298 15,277 12,264 9,249 10,223 3,248 5,261 15,307 17,326 11,343\" />\n        <Polygon points=\" 11,226 15,231 25,236 18,227\" />\n        <Polygon points=\" 13,214 19,217 32,227 23,214 16,208 15,190 24,148 31,121 24,137 14,170 8,189\" />\n        <Polygon points=\" 202,254 195,258 199,260 193,263 197,263 190,268 196,268 191,273 188,282 200,272 194,272 201,266 197,265 204,262 200,258 204,256\" />\n      </G>\n      <G fill=\"#845433\">\n        <Polygon points=\" 151,213 165,212 179,225 189,246 187,262 179,275 176,263 177,247 171,233 163,230 165,251 157,264 146,298 145,321 133,326 143,285 154,260 153,240\" />\n        <Polygon points=\" 91,132 95,145 97,154 104,148 107,155 109,150 111,158 115,152 118,159 120,153 125,161 126,155 133,164 132,154 137,163 137,152 142,163 147,186 152,192 148,167 141,143 124,145 105,143\" />\n      </G>\n      <G fill=\"#9c826b\">\n        <Polygon points=\" 31,57 23,52 26,51 20,44 23,42 21,36 22,29 25,23 24,32 30,43 26,41 30,50 26,48\" />\n        <Polygon points=\" 147,21 149,28 155,21 161,16 167,14 175,15 173,11 161,9\" />\n        <Polygon points=\" 181,39 175,51 169,57 171,65 165,68 165,75 160,76 162,91 171,71 180,51\" />\n        <Polygon points=\" 132,346 139,348 141,346 142,341 147,342 143,355 133,350\" />\n        <Polygon points=\" 146,355 151,352 155,348 157,343 160,349 151,356 147,357\" />\n        <Polygon points=\" 99,266 100,281 94,305 86,322 78,332 72,346 73,331 91,291\" />\n        <Polygon points=\" 20,347 32,342 45,340 54,345 45,350 42,353 38,350 31,353 29,356 23,350 19,353 15,349\" />\n        <Polygon points=\" 78,344 86,344 92,349 88,358 84,352\" />\n        <Polygon points=\" 93,347 104,344 117,345 124,354 121,357 116,351 112,351 108,355 102,351\" />\n      </G>\n      <G fill=\"#000000\">\n        <Polygon points=\" 105,12 111,18 113,24 113,29 119,34 116,23 112,16\" />\n        <Polygon points=\" 122,27 125,34 127,43 128,34 125,29\" />\n        <Polygon points=\" 115,13 122,19 122,15 113,10\" />\n      </G>\n      <G fill=\"#ffe5b2\">\n        <Polygon points=\" 116,172 107,182 98,193 98,183 90,199 89,189 84,207 88,206 87,215 95,206 93,219 91,230 98,216 97,226 104,214 112,209 104,208 113,202 126,200 139,207 132,198 142,203 134,192 142,195 134,187 140,185 130,181 136,177 126,177 125,171 116,180\" />\n        <Polygon points=\" 74,220 67,230 67,221 59,235 63,233 60,248 70,232 65,249 71,243 67,256 73,250 69,262 73,259 71,267 76,262 72,271 78,270 76,275 82,274 78,290 86,279 86,289 92,274 88,275 87,264 82,270 82,258 77,257 78,247 73,246 77,233 72,236\" />\n        <Polygon points=\" 133,230 147,242 148,250 145,254 138,247 129,246 142,245 138,241 128,237 137,238\" />\n        <Polygon points=\" 133,261 125,261 116,263 111,267 125,265\" />\n        <Polygon points=\" 121,271 109,273 103,279 99,305 92,316 85,327 83,335 89,340 97,341 94,336 101,336 96,331 103,330 97,327 108,325 99,322 109,321 100,318 110,317 105,314 110,312 107,310 113,308 105,306 114,303 105,301 115,298 107,295 115,294 108,293 117,291 109,289 117,286 109,286 118,283 112,281 118,279 114,278 119,276 115,274\" />\n        <Polygon points=\" 79,364 74,359 74,353 76,347 80,351 83,356 82,360\" />\n        <Polygon points=\" 91,363 93,356 97,353 103,355 105,360 103,366 99,371 94,368\" />\n        <Polygon points=\" 110,355 114,353 118,357 117,363 113,369 111,362\" />\n        <Polygon points=\" 126,354 123,358 124,367 126,369 129,361 129,357\" />\n        <Polygon points=\" 30,154 24,166 20,182 23,194 29,208 37,218 41,210 41,223 46,214 46,227 52,216 52,227 61,216 59,225 68,213 73,219 70,207 77,212 69,200 77,202 70,194 78,197 68,187 76,182 64,182 58,175 58,185 53,177 50,186 46,171 44,182 39,167 36,172 36,162 30,166\" />\n        <Polygon points=\" 44,130 41,137 45,136 43,150 48,142 48,157 53,150 52,164 60,156 61,169 64,165 66,175 70,167 74,176 77,168 80,183 85,172 90,182 93,174 98,181 99,173 104,175 105,169 114,168 102,163 95,157 94,166 90,154 87,162 82,149 75,159 72,148 68,155 67,143 62,148 62,138 58,145 56,133 52,142 52,128 49,134 47,125\" />\n        <Polygon points=\" 13,216 19,219 36,231 22,223 16,222 22,227 12,224 13,220 16,220\" />\n        <Polygon points=\" 10,231 14,236 25,239 27,237 19,234\" />\n        <Polygon points=\" 9,245 14,242 25,245 13,245\" />\n        <Polygon points=\" 33,255 26,253 18,254 25,256 18,258 27,260 18,263 27,265 19,267 29,270 21,272 29,276 21,278 30,281 22,283 31,287 24,288 32,292 23,293 34,298 26,299 37,303 32,305 39,309 33,309 39,314 34,314 40,318 34,317 40,321 34,321 41,326 33,326 40,330 33,332 39,333 33,337 42,337 54,341 49,337 52,335 47,330 50,330 45,325 49,325 45,321 48,321 45,316 46,306 45,286 43,274 36,261\" />\n        <Polygon points=\" 7,358 9,351 14,351 17,359 11,364\" />\n        <Polygon points=\" 44,354 49,351 52,355 49,361\" />\n        <Polygon points=\" 32,357 37,353 40,358 36,361\" />\n        <Polygon points=\" 139,334 145,330 154,330 158,334 154,341 152,348 145,350 149,340 147,336 141,339 139,345 136,342 136,339\" />\n        <Polygon points=\" 208,259 215,259 212,255 220,259 224,263 225,274 224,283 220,292 208,300 206,308 203,304 199,315 197,309 195,318 193,313 190,322 190,316 185,325 182,318 180,325 172,321 178,320 176,313 186,312 180,307 188,307 184,303 191,302 186,299 195,294 187,290 197,288 192,286 201,283 194,280 203,277 198,275 207,271 200,269 209,265 204,265 212,262\" />\n        <Polygon points=\" 106,126 106,131 109,132 111,134 115,132 115,135 119,133 118,137 123,137 128,137 133,134 136,130 136,127 132,124 118,128 112,128 106,126 106,126 106,126\" />\n        <Polygon points=\" 107,114 101,110 98,102 105,97 111,98 119,102 121,108 118,112 113,115\" />\n        <Polygon points=\" 148,106 145,110 146,116 150,118 152,111 151,107\" />\n        <Polygon points=\" 80,55 70,52 75,58 63,57 72,61 57,61 67,66 57,67 62,69 54,71 61,73 54,77 63,78 53,85 60,84 56,90 69,84 63,82 75,76 70,75 77,72 72,71 78,69 72,66 81,67 78,64 82,63 80,60 86,62\" />\n        <Polygon points=\" 87,56 91,52 96,50 102,56 98,56 92,60\" />\n        <Polygon points=\" 85,68 89,73 98,76 106,74 96,73 91,70\" />\n        <Polygon points=\" 115,57 114,64 111,64 115,75 122,81 122,74 126,79 126,74 131,78 130,72 133,77 131,68 126,61 119,57\" />\n        <Polygon points=\" 145,48 143,53 147,59 151,59 150,55\" />\n        <Polygon points=\" 26,22 34,15 43,10 52,10 59,16 47,15 32,22\" />\n        <Polygon points=\" 160,19 152,26 149,34 154,33 152,30 157,30 155,26 158,27 157,23 161,23\" />\n      </G>\n      <G fill=\"#000000\">\n        <Polygon points=\" 98,117 105,122 109,122 105,117 113,120 121,120 130,112 128,108 123,103 123,99 128,101 132,106 135,109 142,105 142,101 145,101 145,91 148,101 145,105 136,112 135,116 143,124 148,120 150,122 142,128 133,122 121,125 112,126 103,125 100,129 96,124\" />\n        <Polygon points=\" 146,118 152,118 152,115 149,115\" />\n        <Polygon points=\" 148,112 154,111 154,109 149,109\" />\n        <Polygon points=\" 106,112 108,115 114,116 118,114\" />\n        <Polygon points=\" 108,108 111,110 116,110 119,108\" />\n        <Polygon points=\" 106,104 109,105 117,106 115,104\" />\n        <Polygon points=\" 50,25 41,26 34,33 39,43 49,58 36,51 47,68 55,69 54,59 61,57 74,46 60,52 67,42 57,48 61,40 54,45 60,36 59,29 48,38 52,30 47,32\" />\n        <Polygon points=\" 147,34 152,41 155,49 161,53 157,47 164,47 158,43 168,44 159,40 164,37 169,37 164,33 169,34 165,28 170,30 170,25 173,29 175,27 176,32 173,36 175,39 172,42 172,46 168,49 170,55 162,57 158,63 155,58 153,50 149,46\" />\n        <Polygon points=\" 155,71 159,80 157,93 157,102 155,108 150,101 149,93 154,101 152,91 151,83 155,79\" />\n        <Polygon points=\" 112,78 115,81 114,91 112,87 113,82\" />\n        <Polygon points=\" 78,28 64,17 58,11 47,9 36,10 28,16 21,26 18,41 20,51 23,61 33,65 28,68 37,74 36,81 43,87 48,90 43,100 40,98 39,90 31,80 30,72 22,71 17,61 14,46 16,28 23,17 33,9 45,6 54,6 65,12\" />\n        <Polygon points=\" 67,18 76,9 87,5 101,2 118,3 135,8 149,20 149,26 144,19 132,12 121,9 105,7 89,8 76,14 70,20\" />\n        <Polygon points=\" 56,98 48,106 56,103 47,112 56,110 52,115 57,113 52,121 62,115 58,123 65,119 63,125 69,121 68,127 74,125 74,129 79,128 83,132 94,135 93,129 85,127 81,122 76,126 75,121 71,124 71,117 66,121 66,117 62,117 64,112 60,113 60,110 57,111 61,105 57,107 60,101 55,102\" />\n        <Polygon points=\" 101,132 103,138 106,134 106,139 112,136 111,142 115,139 114,143 119,142 125,145 131,142 135,138 140,134 140,129 143,135 145,149 150,171 149,184 145,165 141,150 136,147 132,151 131,149 126,152 125,150 121,152 117,148 111,152 110,148 105,149 104,145 98,150 96,138 94,132 94,130 98,132\" />\n        <Polygon points=\" 41,94 32,110 23,132 12,163 6,190 7,217 5,236 3,247 9,230 12,211 12,185 18,160 26,134 35,110 43,99\" />\n        <Polygon points=\" 32,246 41,250 50,257 52,267 53,295 53,323 59,350 54,363 51,365 44,366 42,360 40,372 54,372 59,366 62,353 71,352 75,335 73,330 66,318 68,302 64,294 67,288 63,286 63,279 59,275 58,267 56,262 50,247 42,235 44,246 32,236 35,244\" />\n        <Polygon points=\" 134,324 146,320 159,322 173,327 179,337 179,349 172,355 158,357 170,350 174,343 170,333 163,328 152,326 134,329\" />\n        <Polygon points=\" 173,339 183,334 184,338 191,329 194,332 199,323 202,325 206,318 209,320 213,309 221,303 228,296 232,289 234,279 233,269 230,262 225,256 219,253 208,252 198,252 210,249 223,250 232,257 237,265 238,277 238,291 232,305 221,323 218,335 212,342 200,349 178,348\" />\n        <Polygon points=\" 165,296 158,301 156,310 156,323 162,324 159,318 162,308 162,304\" />\n        <Polygon points=\" 99,252 105,244 107,234 115,228 121,228 131,235 122,233 113,235 109,246 121,239 133,243 121,243 110,251\" />\n        <Polygon points=\" 117,252 124,247 134,249 136,253 126,252\" />\n        <Polygon points=\" 117,218 132,224 144,233 140,225 132,219 117,218 117,218 117,218\" />\n        <Polygon points=\" 122,212 134,214 143,221 141,213 132,210\" />\n        <Polygon points=\" 69,352 70,363 76,373 86,378 97,379 108,379 120,377 128,378 132,373 135,361 133,358 132,366 127,375 121,374 121,362 119,367 117,374 110,376 110,362 107,357 106,371 104,375 97,376 90,375 90,368 86,362 83,364 86,369 85,373 78,370 73,362 71,351\" />\n        <Polygon points=\" 100,360 96,363 99,369 102,364\" />\n        <Polygon points=\" 115,360 112,363 114,369 117,364\" />\n        <Polygon points=\" 127,362 125,364 126,369 128,365\" />\n        <Polygon points=\" 5,255 7,276 11,304 15,320 13,334 6,348 2,353 0,363 5,372 12,374 25,372 38,372 44,369 42,367 36,368 31,369 30,360 27,368 20,370 16,361 15,368 10,369 3,366 3,359 6,352 11,348 17,331 19,316 12,291 9,274\" />\n        <Polygon points=\" 10,358 7,362 10,366 11,362\" />\n        <Polygon points=\" 25,357 22,360 24,366 27,360\" />\n        <Polygon points=\" 37,357 34,361 36,365 38,361\" />\n        <Polygon points=\" 49,356 46,359 47,364 50,360\" />\n        <Polygon points=\" 130,101 132,102 135,101 139,102 143,103 142,101 137,100 133,100\" />\n        <Polygon points=\" 106,48 105,52 108,56 109,52\" />\n        <Polygon points=\" 139,52 139,56 140,60 142,58 141,56\" />\n        <Polygon points=\" 25,349 29,351 30,355 33,350 37,348 42,351 45,347 49,345 44,343 36,345\" />\n        <Polygon points=\" 98,347 105,351 107,354 109,349 115,349 120,353 118,349 113,346 104,346\" />\n        <Polygon points=\" 83,348 87,352 87,357 89,351 87,348\" />\n        <Polygon points=\" 155,107 163,107 170,107 186,108 175,109 155,109\" />\n        <Polygon points=\" 153,114 162,113 175,112 192,114 173,114 154,115\" />\n        <Polygon points=\" 152,118 164,120 180,123 197,129 169,123 151,120\" />\n        <Polygon points=\" 68,109 87,106 107,106 106,108 88,108\" />\n        <Polygon points=\" 105,111 95,112 79,114 71,116 85,115 102,113\" />\n        <Polygon points=\" 108,101 98,99 87,99 78,99 93,100 105,102\" />\n        <Polygon points=\" 85,63 91,63 97,60 104,60 108,62 111,69 112,75 110,74 108,71 103,73 106,69 105,65 103,64 103,67 102,70 99,70 97,66 94,67 97,72 88,67 84,66\" />\n        <Polygon points=\" 140,74 141,66 144,61 150,61 156,62 153,70 150,73 152,65 150,65 151,68 149,71 146,71 144,66 143,70 143,74\" />\n        <Polygon points=\" 146,20 156,11 163,9 172,9 178,14 182,18 184,32 182,42 182,52 177,58 176,67 171,76 165,90 157,105 160,92 164,85 168,78 167,73 173,66 172,62 175,59 174,55 177,53 180,46 181,29 179,21 173,13 166,11 159,13 153,18 148,23\" />\n        <Polygon points=\" 150,187 148,211 150,233 153,247 148,267 135,283 125,299 136,292 131,313 122,328 122,345 129,352 133,359 133,367 137,359 148,356 140,350 131,347 129,340 132,332 140,328 137,322 140,304 154,265 157,244 155,223 161,220 175,229 186,247 185,260 176,275 178,287 185,277 188,261 196,253 189,236 174,213\" />\n        <Polygon points=\" 147,338 142,341 143,345 141,354 147,343\" />\n        <Polygon points=\" 157,342 156,349 150,356 157,353 163,346 162,342\" />\n        <Polygon points=\" 99,265 96,284 92,299 73,339 73,333 87,300\" />\n      </G>\n    </G>\n  </Svg>\n);\n\nexport default Tiger;\n"
  },
  {
    "path": "packages/examples/vite/src/examples/svg-transform/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, Svg, G, Rect } from '@react-pdf/renderer';\n\nconst COLORS = ['red', 'green', 'blue', 'yellow', 'purple'];\n\nconst randBetween = (min, max) =>\n  Math.floor(Math.random() * (max - min + 1) + min);\n\nconst SvgTransform = () => {\n  return (\n    <Document>\n      <Page size={[600, 600]}>\n        <Svg width=\"600\" height=\"600\">\n          {Array.from({ length: 200 }).map((_, i) => (\n            <G\n              key={i}\n              style={{\n                transform: `translate(${randBetween(0, 600)}, ${randBetween(0, 600)}) rotate(${randBetween(-180, 180)}deg)`,\n              }}\n            >\n              <Rect fill={COLORS[i % COLORS.length]} width=\"200\" height=\"50\" />\n            </G>\n          ))}\n        </Svg>\n      </Page>\n    </Document>\n  );\n};\n\nexport default {\n  id: 'svg-transform',\n  name: 'Svg Transform',\n  description: '',\n  Document: SvgTransform,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/examples/transform-origin/index.tsx",
    "content": "import React from 'react';\nimport { Document, Page, View } from '@react-pdf/renderer';\n\nconst Box = ({ origin }) => (\n  <View\n    debug\n    style={{\n      margin: 5,\n      width: 80,\n      height: 80,\n      transformOrigin: origin,\n    }}\n  />\n);\n\nconst TransformOrigin = () => {\n  return (\n    <Document>\n      <Page style={{ flexWrap: 'wrap', flexDirection: 'row' }}>\n        <Box origin=\"left\" />\n        <Box origin=\"center\" />\n        <Box origin=\"right\" />\n        <Box origin=\"top\" />\n        <Box origin=\"bottom\" />\n        <Box origin={10} />\n        <Box origin=\"10 10\" />\n        <Box origin=\"top left\" />\n        <Box origin=\"left top\" />\n        <Box origin=\"top right\" />\n        <Box origin=\"right top\" />\n        <Box origin=\"top center\" />\n        <Box origin=\"center top\" />\n        <Box origin=\"center center\" />\n        <Box origin=\"center bottom\" />\n        <Box origin=\"bottom center\" />\n        <Box origin=\"bottom left\" />\n        <Box origin=\"left bottom\" />\n        <Box origin=\"bottom right\" />\n        <Box origin=\"right bottom\" />\n        <Box origin=\"10 bottom\" />\n        <Box origin=\"bottom 10\" />\n        <Box origin=\"top 10\" />\n        <Box origin=\"10 top\" />\n        <Box origin=\"left 10\" />\n        <Box origin=\"10mm 1in\" />\n      </Page>\n    </Document>\n  );\n};\n\nexport default {\n  id: 'transform-origin',\n  name: 'Transform Origin',\n  description: '',\n  Document: TransformOrigin,\n};\n"
  },
  {
    "path": "packages/examples/vite/src/index.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n"
  },
  {
    "path": "packages/examples/vite/src/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite + React</title>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/index.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "packages/examples/vite/src/index.tsx",
    "content": "import './index.css';\n\nimport React, { useEffect, useState } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { PDFViewer } from '@react-pdf/renderer';\n\nimport EXAMPLES from './examples';\n\nconst ExamplesPage = () => {\n  const [hash, setHash] = useState(\n    window.location.hash.substring(1) || 'page-wrap',\n  );\n\n  const index = EXAMPLES.findIndex((example) => example.id === hash);\n\n  useEffect(() => {\n    const listener = (event) =>\n      setHash(event.target.location.hash.substring(1));\n\n    window.addEventListener('popstate', listener);\n\n    return () => window.removeEventListener('popstate', listener);\n  });\n\n  const { Document } = EXAMPLES[index];\n\n  return (\n    <main className=\"w-screen h-screen flex\">\n      <nav className=\"bg-slate-100 w-60\">\n        <ul>\n          {EXAMPLES.map((example) => (\n            <li\n              key={example.id}\n              className=\"hover:bg-slate-200 w-full px-4 py-1 cursor-pointer transition-all border-b border-slate-300 flex\"\n            >\n              <a href={`#${example.id}`} className=\"flex-1\">\n                {example.name}\n              </a>\n            </li>\n          ))}\n        </ul>\n      </nav>\n\n      <div key={hash} className=\"h-full flex-1\">\n        <PDFViewer showToolbar={false} className=\"size-full\">\n          <Document />\n        </PDFViewer>\n      </div>\n    </main>\n  );\n};\n\nconst MOUNT_ELEMENT = document.createElement('div');\n\ndocument.body.appendChild(MOUNT_ELEMENT);\n\nconst root = createRoot(MOUNT_ELEMENT);\n\nroot.render(<ExamplesPage />);\n"
  },
  {
    "path": "packages/examples/vite/tailwind.config.js",
    "content": "/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n  content: ['./src/index.html', './src/**/*.{js,ts,jsx,tsx}'],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n};\n"
  },
  {
    "path": "packages/examples/vite/vite.config.js",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n});\n"
  },
  {
    "path": "packages/fns/.gitignore",
    "content": "lib\n"
  },
  {
    "path": "packages/fns/CHANGELOG.md",
    "content": "# @react-pdf/fns\n\n## 3.1.2\n\n### Patch Changes\n\n- [#3092](https://github.com/diegomura/react-pdf/pull/3092) [`481b536f`](https://github.com/diegomura/react-pdf/commit/481b536f4ad145fb227829399b85a35838a506f8) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert layout package to TS\n\n## 3.1.1\n\n### Patch Changes\n\n- [#3082](https://github.com/diegomura/react-pdf/pull/3082) [`24fe4bf8`](https://github.com/diegomura/react-pdf/commit/24fe4bf894fff055121926488b30d0bf212a9c45) Thanks [@diegomura](https://github.com/diegomura)! - feat: rework and type stylesheet package\n\n- [#3077](https://github.com/diegomura/react-pdf/pull/3077) [`442ce355`](https://github.com/diegomura/react-pdf/commit/442ce35534f916b9146a35fd03870387ed488d92) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert textkit package to TS\n\n- [#3070](https://github.com/diegomura/react-pdf/pull/3070) [`3007d34a`](https://github.com/diegomura/react-pdf/commit/3007d34ad3e10bf32ada3631938f5bb08e1c549f) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert fns package to TS\n\n## 3.1.0\n\n### Minor Changes\n\n- [`d36ace66`](https://github.com/diegomura/react-pdf/commit/d36ace66c77d57d845894e89772be7ae0cdd25ee) Thanks [@diegomura](https://github.com/diegomura)! - feat: add without fn\n\n## 3.0.0\n\n### Major Changes\n\n- [#2871](https://github.com/diegomura/react-pdf/pull/2871) [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119) Thanks [@diegomura](https://github.com/diegomura)! - feat!: drop cjs support\n\n## 2.2.1\n\n### Patch Changes\n\n- [#2605](https://github.com/diegomura/react-pdf/pull/2605) [`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - fix: fix CJS compatibility\n\n## 2.2.0\n\n### Minor Changes\n\n- [#2600](https://github.com/diegomura/react-pdf/pull/2600) [`8350154`](https://github.com/diegomura/react-pdf/commit/83501541e3a050021e18e112bb472b2dabc142a7) Thanks [@diegomura](https://github.com/diegomura)! - feat: bidi support\n\n## 2.1.0\n\n### Minor Changes\n\n- [#2409](https://github.com/diegomura/react-pdf/pull/2409) [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Add support for native ESM\n\n## 2.0.1\n\n### Patch Changes\n\n- [#2215](https://github.com/diegomura/react-pdf/pull/2215) [`eff1ff0`](https://github.com/diegomura/react-pdf/commit/eff1ff0fefcd710994e4654904ef55843af76a17) Thanks [@jeetiss](https://github.com/jeetiss)! - add @babel/runtime as dependency\n\n## 2.0.0\n\n### Major Changes\n\n- [#1891](https://github.com/diegomura/react-pdf/pull/1891) [`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - feat: compatibility with modern web bundlers and browsers\n\n## 1.0.0\n\n### Major Changes\n\n- [#1838](https://github.com/diegomura/react-pdf/pull/1838) [`9bdb5c9`](https://github.com/diegomura/react-pdf/commit/9bdb5c934a822340754cd4c892d399f91f6218de) Thanks [@diegomura](https://github.com/diegomura)! - feat: create fns package\n"
  },
  {
    "path": "packages/fns/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n# @react-pdf/fns\n\n> Lightweight utility functions for react-pdf\n\nA collection of functional programming utilities used internally by react-pdf. Zero dependencies, tree-shakeable, and fully typed.\n\n## Installation\n\n```bash\nyarn add @react-pdf/fns\n```\n\n## Table of Contents\n\n- [adjust](#adjust)\n- [asyncCompose](#asynccompose)\n- [capitalize](#capitalize)\n- [castArray](#castarray)\n- [compose](#compose)\n- [dropLast](#droplast)\n- [evolve](#evolve)\n- [get](#get)\n- [isNil](#isnil)\n- [last](#last)\n- [mapValues](#mapvalues)\n- [matchPercent](#matchpercent)\n- [omit](#omit)\n- [parseFloat](#parsefloat)\n- [pick](#pick)\n- [repeat](#repeat)\n- [reverse](#reverse)\n- [upperFirst](#upperfirst)\n- [without](#without)\n\n## Functions\n\n### adjust\n\nApplies a function to the value at the given index of an array.\n\n```js\nimport { adjust } from '@react-pdf/fns';\n\nadjust(1, (x) => x * 2, [1, 2, 3]); // => [1, 4, 3]\nadjust(-1, (x) => x + 10, [1, 2, 3]); // => [1, 2, 13]\n```\n\n---\n\n### asyncCompose\n\nPerforms right-to-left function composition with async functions support. `asyncCompose(f, g, h)(x)` is equivalent to `await f(await g(await h(x)))`.\n\n```js\nimport { asyncCompose } from '@react-pdf/fns';\n\nconst addAsync = async (x) => x + 1;\nconst double = (x) => x * 2;\n\nconst fn = asyncCompose(double, addAsync);\nawait fn(5); // => 12\n```\n\n---\n\n### capitalize\n\nCapitalizes the first letter of each word in a string.\n\n```js\nimport { capitalize } from '@react-pdf/fns';\n\ncapitalize('hello world'); // => 'Hello World'\ncapitalize('foo bar baz'); // => 'Foo Bar Baz'\n```\n\n---\n\n### castArray\n\nWraps a value in an array if it isn't one already.\n\n```js\nimport { castArray } from '@react-pdf/fns';\n\ncastArray('foo'); // => ['foo']\ncastArray(['foo']); // => ['foo']\ncastArray(123); // => [123]\n```\n\n---\n\n### compose\n\nPerforms right-to-left function composition. `compose(f, g, h)(x)` is equivalent to `f(g(h(x)))`.\n\n```js\nimport { compose } from '@react-pdf/fns';\n\nconst add1 = (x) => x + 1;\nconst double = (x) => x * 2;\n\nconst fn = compose(double, add1);\nfn(5); // => 12\n```\n\n---\n\n### dropLast\n\nDrops the last element from an array or string.\n\n```js\nimport { dropLast } from '@react-pdf/fns';\n\ndropLast([1, 2, 3]); // => [1, 2]\ndropLast('hello'); // => 'hell'\n```\n\n---\n\n### evolve\n\nApplies transformations to an object's values based on a transformation map.\n\n```js\nimport { evolve } from '@react-pdf/fns';\n\nevolve(\n  { count: (n) => n + 1, name: (s) => s.toUpperCase() },\n  { name: 'item', count: 5 },\n);\n// => { name: 'ITEM', count: 6 }\n```\n\n---\n\n### get\n\nRetrieves a value at a given path from an object with a default fallback.\n\n```js\nimport { get } from '@react-pdf/fns';\n\nget({ a: { b: 1 } }, ['a', 'b'], 0); // => 1\nget({ a: { b: 1 } }, ['a', 'c'], 0); // => 0\nget({ a: { b: 1 } }, 'a', {}); // => { b: 1 }\n```\n\n---\n\n### isNil\n\nChecks if a value is `null` or `undefined`.\n\n```js\nimport { isNil } from '@react-pdf/fns';\n\nisNil(null); // => true\nisNil(undefined); // => true\nisNil(0); // => false\nisNil(''); // => false\n```\n\n---\n\n### last\n\nReturns the last element of an array or last character of a string.\n\n```js\nimport { last } from '@react-pdf/fns';\n\nlast([1, 2, 3]); // => 3\nlast('abc'); // => 'c'\nlast([]); // => undefined\n```\n\n---\n\n### mapValues\n\nMaps over the values of an object, applying a function to each value.\n\n```js\nimport { mapValues } from '@react-pdf/fns';\n\nmapValues({ a: 1, b: 2 }, (v) => v * 2); // => { a: 2, b: 4 }\nmapValues({ x: 'foo', y: 'bar' }, (v, k) => `${k}:${v}`);\n// => { x: 'x:foo', y: 'y:bar' }\n```\n\n---\n\n### matchPercent\n\nParses a percentage string and returns both the numeric value and decimal percent.\n\n```js\nimport { matchPercent } from '@react-pdf/fns';\n\nmatchPercent('50%'); // => { value: 50, percent: 0.5 }\nmatchPercent('-25%'); // => { value: -25, percent: -0.25 }\nmatchPercent('abc'); // => null\n```\n\n---\n\n### omit\n\nCreates a new object excluding specified keys.\n\n```js\nimport { omit } from '@react-pdf/fns';\n\nomit('b', { a: 1, b: 2, c: 3 }); // => { a: 1, c: 3 }\nomit(['a', 'c'], { a: 1, b: 2, c: 3 }); // => { b: 2 }\n```\n\n---\n\n### parseFloat\n\nParses a string to a float. Non-string values pass through unchanged.\n\n```js\nimport { parseFloat } from '@react-pdf/fns';\n\nparseFloat('3.14'); // => 3.14\nparseFloat('10px'); // => 10\nparseFloat(42); // => 42\nparseFloat(null); // => null\n```\n\n---\n\n### pick\n\nCreates a new object with only the specified keys.\n\n```js\nimport { pick } from '@react-pdf/fns';\n\npick(['a', 'c'], { a: 1, b: 2, c: 3 }); // => { a: 1, c: 3 }\npick(['x'], { a: 1, b: 2 }); // => {}\n```\n\n---\n\n### repeat\n\nCreates an array with an element repeated a specified number of times.\n\n```js\nimport { repeat } from '@react-pdf/fns';\n\nrepeat('a', 3); // => ['a', 'a', 'a']\nrepeat(0, 4); // => [0, 0, 0, 0]\n```\n\n---\n\n### reverse\n\nReturns a new array with elements in reverse order (does not mutate original).\n\n```js\nimport { reverse } from '@react-pdf/fns';\n\nreverse([1, 2, 3]); // => [3, 2, 1]\nreverse(['a', 'b', 'c']); // => ['c', 'b', 'a']\n```\n\n---\n\n### upperFirst\n\nConverts the first character of a string to uppercase.\n\n```js\nimport { upperFirst } from '@react-pdf/fns';\n\nupperFirst('hello'); // => 'Hello'\nupperFirst('hELLO'); // => 'HELLO'\n```\n\n---\n\n### without\n\nReturns a new array excluding the specified values.\n\n```js\nimport { without } from '@react-pdf/fns';\n\nwithout([2, 4], [1, 2, 3, 4, 5]); // => [1, 3, 5]\nwithout(['b'], ['a', 'b', 'c']); // => ['a', 'c']\n```\n\n## License\n\nMIT\n"
  },
  {
    "path": "packages/fns/jest.config.js",
    "content": "export default {\n  testRegex: 'tests/.*?(test)\\\\.js$',\n};\n"
  },
  {
    "path": "packages/fns/package.json",
    "content": "{\n  \"name\": \"@react-pdf/fns\",\n  \"version\": \"3.1.2\",\n  \"license\": \"MIT\",\n  \"description\": \"React-pdf helper functions\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"type\": \"module\",\n  \"main\": \"./lib/index.js\",\n  \"types\": \"./lib/index.d.ts\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/fns\"\n  },\n  \"scripts\": {\n    \"test\": \"vitest\",\n    \"build\": \"rollup -c\",\n    \"watch\": \"rollup -c -w\",\n    \"typecheck\": \"tsc --noEmit\"\n  },\n  \"files\": [\n    \"lib\"\n  ]\n}\n"
  },
  {
    "path": "packages/fns/rollup.config.js",
    "content": "import typescript from '@rollup/plugin-typescript';\nimport { dts } from 'rollup-plugin-dts';\nimport del from 'rollup-plugin-delete';\n\nconst config = [\n  {\n    input: 'src/index.ts',\n    output: { format: 'es', dir: 'lib' },\n    plugins: [typescript()],\n  },\n  {\n    input: './lib/types/index.d.ts',\n    output: [{ file: 'lib/index.d.ts', format: 'es' }],\n    plugins: [dts(), del({ targets: 'lib/types', hook: 'buildEnd' })],\n  },\n];\n\nexport default config;\n"
  },
  {
    "path": "packages/fns/src/adjust.ts",
    "content": "/**\n * Applies a function to the value at the given index of an array\n *\n * @param index\n * @param fn\n * @param collection\n * @returns Copy of the array with the element at the given index replaced with the result of the function application.\n */\nconst adjust = <T>(\n  index: number,\n  fn: (value: T) => T,\n  collection: T[],\n): T[] => {\n  if (index >= collection.length) return collection;\n  if (index < 0 && Math.abs(index) > collection.length) return collection;\n\n  const i = index < 0 ? collection.length + index : index;\n\n  return Object.assign([], collection, { [i]: fn(collection[i]) });\n};\n\nexport default adjust;\n"
  },
  {
    "path": "packages/fns/src/asyncCompose.ts",
    "content": "/* eslint-disable no-await-in-loop */\n\ntype Fn = (arg: any, ...args: any[]) => Promise<any> | any;\n\ntype ComposedInput<T extends Fn[]> = T extends [\n  ...any,\n  (arg: infer A, ...args: any[]) => Promise<any> | any,\n]\n  ? A\n  : never;\n\ntype ComposedOutput<T extends Fn[]> = T extends [\n  (arg: any, ...args: any[]) => Promise<infer R> | infer R,\n  ...any,\n]\n  ? R\n  : never;\n\n/**\n * Performs right-to-left function composition with async functions support.\n * asyncCompose(f, g, h)(x) is equivalent to f(g(h(x))), awaiting each result.\n *\n * @param fns - Functions to compose (can be sync or async)\n * @returns Composed async function that applies functions from right to left\n */\nconst asyncCompose =\n  <T extends Fn[]>(...fns: T) =>\n  async (\n    value: ComposedInput<T>,\n    ...args: Parameters<T[0]> extends [any, ...infer Rest] ? Rest : []\n  ): Promise<ComposedOutput<T>> => {\n    let result = value;\n\n    for (let i = fns.length - 1; i >= 0; i -= 1) {\n      result = await fns[i](result, ...args);\n    }\n\n    return result as ComposedOutput<T>;\n  };\n\nexport default asyncCompose;\n"
  },
  {
    "path": "packages/fns/src/capitalize.ts",
    "content": "/**\n * Capitalize first letter of each word\n *\n * @param value - Any string\n * @returns Capitalized string\n */\nconst capitalize = (value?: string | null): typeof value => {\n  if (!value) return value;\n  return value.replace(/(^|\\s)\\S/g, (l) => l.toUpperCase());\n};\n\nexport default capitalize;\n"
  },
  {
    "path": "packages/fns/src/castArray.ts",
    "content": "/**\n * Casts value to array\n *\n * @template T - The type of the value.\n * @param value - The value to cast into an array.\n * @returns The value as-is if already an array, otherwise wrapped in an array.\n */\nconst castArray = <T>(value: T | T[]): T[] => {\n  return Array.isArray(value) ? value : [value];\n};\n\nexport default castArray;\n"
  },
  {
    "path": "packages/fns/src/compose.ts",
    "content": "type Fn = (arg: any, ...args: any[]) => any;\n\ntype ComposedInput<T extends Fn[]> = T extends [\n  ...any,\n  (arg: infer A, ...args: any[]) => any,\n]\n  ? A\n  : never;\n\ntype ComposedOutput<T extends Fn[]> = T extends [\n  (arg: any, ...args: any[]) => infer R,\n  ...any,\n]\n  ? R\n  : never;\n\n/**\n * Performs right-to-left function composition.\n * compose(f, g, h)(x) is equivalent to f(g(h(x)))\n *\n * @param fns - Functions to compose\n * @returns Composed function that applies functions from right to left\n */\nconst compose =\n  <T extends Fn[]>(...fns: T) =>\n  (value: ComposedInput<T>, ...args: any[]): ComposedOutput<T> => {\n    let result: unknown = value;\n\n    for (let i = fns.length - 1; i >= 0; i -= 1) {\n      result = fns[i](result, ...args);\n    }\n\n    return result as ComposedOutput<T>;\n  };\n\nexport default compose;\n"
  },
  {
    "path": "packages/fns/src/dropLast.ts",
    "content": "/**\n * Drops the last element from an array or string.\n *\n * @param value - The array or string to drop the last element from\n * @returns A new array or string with the last element removed\n */\nfunction dropLast(value: string): string;\nfunction dropLast<T>(value: T[]): T[];\nfunction dropLast<T>(value: string | T[]): string | T[] {\n  return value.slice(0, -1);\n}\n\nexport default dropLast;\n"
  },
  {
    "path": "packages/fns/src/evolve.ts",
    "content": "/**\n * Applies a set of transformations to an object and returns a new object with the transformed values.\n *\n * @example\n * evolve({ count: (n) => n + 1 }, { name: 'item', count: 5 })\n * // => { name: 'item', count: 6 }\n *\n * @param transformations - The transformations to apply\n * @param object - The object to transform\n * @returns The transformed object\n */\nfunction evolve<T extends Record<string, any>>(\n  transformations: Partial<{ [K in keyof T]: (value: T[K]) => T[K] }>,\n  object: T,\n): T {\n  const result: Record<string, any> = {};\n  const keys = Object.keys(object);\n\n  for (let i = 0; i < keys.length; i += 1) {\n    const key = keys[i];\n    const transformation = transformations[key];\n\n    if (typeof transformation === 'function') {\n      result[key] = transformation(object[key]);\n    } else {\n      result[key] = object[key];\n    }\n  }\n\n  return result as T;\n}\n\nexport default evolve;\n"
  },
  {
    "path": "packages/fns/src/get.ts",
    "content": "import isNil from './isNil.js';\nimport castArray from './castArray.js';\n\n/**\n * Retrieves the value at a given path from an object.\n *\n * @example\n * get({ a: { b: 1 } }, ['a', 'b'], 0) // => 1\n * get({ a: { b: 1 } }, ['a', 'c'], 0) // => 0\n *\n * @param target - The object to retrieve the value from\n * @param path - The path of the value to retrieve\n * @param defaultValue - The default value to return if the path does not exist\n * @returns The value at the given path, or the default value if the path does not exist\n */\nconst get = (\n  target: any,\n  path: (string | number)[] | string | number,\n  defaultValue: any,\n): any => {\n  if (isNil(target)) return defaultValue;\n\n  const _path = castArray(path);\n\n  let result = target;\n\n  for (let i = 0; i < _path.length; i += 1) {\n    if (isNil(result)) return defaultValue;\n\n    result = result[_path[i]];\n  }\n\n  return isNil(result) ? defaultValue : result;\n};\n\nexport default get;\n"
  },
  {
    "path": "packages/fns/src/index.ts",
    "content": "export { default as adjust } from './adjust.js';\nexport { default as asyncCompose } from './asyncCompose.js';\nexport { default as capitalize } from './capitalize.js';\nexport { default as castArray } from './castArray.js';\nexport { default as compose } from './compose.js';\nexport { default as dropLast } from './dropLast.js';\nexport { default as evolve } from './evolve.js';\nexport { default as get } from './get.js';\nexport { default as isNil } from './isNil.js';\nexport { default as last } from './last.js';\nexport { default as mapValues } from './mapValues.js';\nexport { default as matchPercent } from './matchPercent.js';\nexport { default as omit } from './omit.js';\nexport { default as pick } from './pick.js';\nexport { default as repeat } from './repeat.js';\nexport { default as reverse } from './reverse.js';\nexport { default as upperFirst } from './upperFirst.js';\nexport { default as without } from './without.js';\nexport { default as parseFloat } from './parseFloat.js';\n"
  },
  {
    "path": "packages/fns/src/isNil.ts",
    "content": "/**\n * Checks if a value is null or undefined.\n *\n * @example\n * isNil(null)      // => true\n * isNil(undefined) // => true\n * isNil(0)         // => false\n *\n * @param value - The value to check\n * @returns True if the value is null or undefined, false otherwise\n */\nconst isNil = (value: unknown): value is null | undefined =>\n  value === null || value === undefined;\n\nexport default isNil;\n"
  },
  {
    "path": "packages/fns/src/last.ts",
    "content": "/**\n * Returns the last element of an array or last character of a string.\n *\n * @example\n * last([1, 2, 3]) // => 3\n * last('abc')     // => 'c'\n * last([])        // => undefined\n * last('')        // => ''\n *\n * @param value - The array or string\n * @returns The last element/character, or undefined for empty arrays\n */\nfunction last(value: string): string;\nfunction last<T>(value: T[]): T | undefined;\nfunction last(value: string | any[]): any {\n  return value === '' ? '' : value[value.length - 1];\n}\n\nexport default last;\n"
  },
  {
    "path": "packages/fns/src/mapValues.ts",
    "content": "type IteratorFn = (value: any, key: string, index: number) => any;\n\n/**\n * Maps over the values of an object and applies a function to each value.\n *\n * @example\n * mapValues({ a: 1, b: 2 }, (v) => v * 2) // => { a: 2, b: 4 }\n *\n * @param object - The object to map over\n * @param fn - The function to apply to each value\n * @returns A new object with the mapped values\n */\nconst mapValues = (\n  object: Record<string, any>,\n  fn: IteratorFn,\n): Record<string, any> => {\n  const result: Record<string, any> = {};\n  const entries = Object.entries(object);\n\n  for (let i = 0; i < entries.length; i += 1) {\n    const [key, value] = entries[i];\n    result[key] = fn(value, key, i);\n  }\n\n  return result;\n};\n\nexport default mapValues;\n"
  },
  {
    "path": "packages/fns/src/matchPercent.ts",
    "content": "interface PercentMatch {\n  percent: number;\n  value: number;\n}\n\nconst PERCENT_REGEX = /(-?\\d+\\.?\\d*)%/;\n\n/**\n * Parses a percentage string and returns both the numeric value and decimal percent.\n *\n * @example\n * matchPercent('50%')  // => { value: 50, percent: 0.5 }\n * matchPercent('-25%') // => { value: -25, percent: -0.25 }\n * matchPercent('abc')  // => null\n *\n * @param value - The value to parse\n * @returns Object with value and percent, or null if not a valid percentage\n */\nconst matchPercent = (value: string | number | null): PercentMatch | null => {\n  const match = PERCENT_REGEX.exec(`${value}`);\n\n  if (match) {\n    const numericValue = parseFloat(match[1]);\n    const percent = numericValue / 100;\n\n    return { percent, value: numericValue };\n  }\n\n  return null;\n};\n\nexport default matchPercent;\n"
  },
  {
    "path": "packages/fns/src/omit.ts",
    "content": "import castArray from './castArray';\n\n/**\n * Creates a new object by omitting specified keys from the original object.\n *\n * @example\n * omit('b', { a: 1, b: 2, c: 3 })      // => { a: 1, c: 3 }\n * omit(['a', 'c'], { a: 1, b: 2, c: 3 }) // => { b: 2 }\n *\n * @param keys - The key or keys to omit\n * @param object - The original object\n * @returns The new object without the omitted keys\n */\nconst omit = (\n  keys: string | string[],\n  object: Record<string, any>,\n): Record<string, any> => {\n  const _keys = castArray(keys);\n  const copy = { ...object };\n\n  for (let i = 0; i < _keys.length; i += 1) {\n    delete copy[_keys[i]];\n  }\n\n  return copy;\n};\n\nexport default omit;\n"
  },
  {
    "path": "packages/fns/src/parseFloat.ts",
    "content": "/**\n * Parse a string or number to a float. Non-string values pass through unchanged.\n *\n * @example\n * parseFloat('3.14')  // => 3.14\n * parseFloat(42)      // => 42\n * parseFloat('10px')  // => 10\n * parseFloat(null)    // => null\n *\n * @param value - The value to parse\n * @returns Parsed float for strings, original value otherwise\n */\nconst parseFloat = <T extends string | number | null | undefined>(\n  value: T,\n): T extends string ? number : T => {\n  return (typeof value === 'string' ? Number.parseFloat(value) : value) as any;\n};\n\nexport default parseFloat;\n"
  },
  {
    "path": "packages/fns/src/pick.ts",
    "content": "/**\n * Picks the specified keys from an object and returns a new object with only those keys.\n *\n * @example\n * pick(['a', 'c'], { a: 1, b: 2, c: 3 }) // => { a: 1, c: 3 }\n * pick(['x'], { a: 1, b: 2 })            // => {}\n *\n * @param keys - The keys to pick from the object\n * @param object - The object to pick the keys from\n * @returns A new object with only the picked keys\n */\nconst pick = (\n  keys: (string | number)[],\n  object: Record<string, any>,\n): Record<string, any> => {\n  const result: Record<string, any> = {};\n\n  for (let i = 0; i < keys.length; i += 1) {\n    const key = keys[i];\n\n    if (key in object) result[key] = object[key];\n  }\n\n  return result;\n};\n\nexport default pick;\n"
  },
  {
    "path": "packages/fns/src/repeat.ts",
    "content": "/**\n * Repeats an element a specified number of times.\n *\n * @example\n * repeat('a', 3) // => ['a', 'a', 'a']\n * repeat(0, 4)   // => [0, 0, 0, 0]\n * repeat('x')    // => []\n *\n * @param element - Element to be repeated\n * @param length - Number of times to repeat element (default: 0)\n * @returns Array with the element repeated\n */\nconst repeat = <T>(element: T, length: number = 0): T[] => {\n  const result = new Array<T>(length);\n\n  for (let i = 0; i < length; i += 1) {\n    result[i] = element;\n  }\n\n  return result;\n};\n\nexport default repeat;\n"
  },
  {
    "path": "packages/fns/src/reverse.ts",
    "content": "/**\n * Returns a new array with elements in reverse order. Does not mutate the original.\n *\n * @example\n * reverse([1, 2, 3]) // => [3, 2, 1]\n * reverse(['a', 'b']) // => ['b', 'a']\n *\n * @param array - Array to be reversed\n * @returns New array with elements reversed\n */\nconst reverse = <T>(array: T[]): T[] => array.slice().reverse();\n\nexport default reverse;\n"
  },
  {
    "path": "packages/fns/src/upperFirst.ts",
    "content": "/**\n * Converts the first character of a string to uppercase. Does not affect other characters.\n *\n * @example\n * upperFirst('hello')  // => 'Hello'\n * upperFirst('hELLO')  // => 'HELLO'\n * upperFirst('')       // => ''\n * upperFirst(null)     // => null\n *\n * @param value - The string to transform\n * @returns String with first character uppercased, or the original value if null/undefined/empty\n */\nconst upperFirst = <T extends string | null | undefined>(\n  value: T,\n): T extends string ? string : T => {\n  if (!value) return value as any;\n  return (value.charAt(0).toUpperCase() + value.slice(1)) as any;\n};\n\nexport default upperFirst;\n"
  },
  {
    "path": "packages/fns/src/without.ts",
    "content": "/**\n * Returns a new array excluding the specified values.\n *\n * @example\n * without([2, 4], [1, 2, 3, 4, 5]) // => [1, 3, 5]\n * without(['b'], ['a', 'b', 'c'])  // => ['a', 'c']\n *\n * @param exclude - Values to exclude from the array\n * @param array - Array to filter\n * @returns A new array without the excluded values\n */\nconst without = <T>(exclude: T[], array: T[]): T[] => {\n  const result: T[] = [];\n\n  for (let i = 0; i < array.length; i += 1) {\n    const value = array[i];\n\n    if (!exclude.includes(value)) result.push(value);\n  }\n\n  return result;\n};\n\nexport default without;\n"
  },
  {
    "path": "packages/fns/tests/adjust.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport adjust from '../src/adjust';\n\nconst add = (v: number) => v + 1;\n\ndescribe('adjust', () => {\n  test('applies the given function to the value at the given index of the supplied array', () => {\n    const expected = [0, 1, 3, 3];\n    const result = adjust(2, add, [0, 1, 2, 3]);\n\n    expect(result).toEqual(expected);\n  });\n\n  test('offsets negative indexes from the end of the array', () => {\n    const expected = [0, 2, 2, 3];\n    const result = adjust(-3, add, [0, 1, 2, 3]);\n\n    expect(result).toEqual(expected);\n  });\n\n  test('returns the original array if the supplied index is out of bounds', () => {\n    const expected = [0, 1, 2, 3];\n\n    expect(adjust(4, add, expected)).toBe(expected);\n    expect(adjust(-5, add, expected)).toBe(expected);\n  });\n\n  test('does not mutate the original array', () => {\n    const expected = [0, 1, 2, 3];\n    adjust(2, add, expected);\n    expect([0, 1, 2, 3]).toEqual(expected);\n  });\n\n  test('returns the original empty array when given empty array', () => {\n    const empty: number[] = [];\n    expect(adjust(0, add, empty)).toBe(empty);\n  });\n\n  test('adjusts single element array', () => {\n    expect(adjust(0, add, [5])).toEqual([6]);\n  });\n\n  test('adjusts first element with index 0', () => {\n    expect(adjust(0, add, [1, 2, 3])).toEqual([2, 2, 3]);\n  });\n\n  test('adjusts last element with positive index', () => {\n    expect(adjust(3, add, [1, 2, 3, 4])).toEqual([1, 2, 3, 5]);\n  });\n\n  test('adjusts last element with index -1', () => {\n    expect(adjust(-1, add, [1, 2, 3, 4])).toEqual([1, 2, 3, 5]);\n  });\n\n  test('adjusts first element with negative index equal to length', () => {\n    expect(adjust(-4, add, [1, 2, 3, 4])).toEqual([2, 2, 3, 4]);\n  });\n\n  test('works with string arrays', () => {\n    const toUpper = (s: string) => s.toUpperCase();\n    expect(adjust(1, toUpper, ['a', 'b', 'c'])).toEqual(['a', 'B', 'c']);\n  });\n\n  test('works with object arrays', () => {\n    const increment = (obj: { value: number }) => ({ value: obj.value + 1 });\n    const arr = [{ value: 1 }, { value: 2 }, { value: 3 }];\n    expect(adjust(1, increment, arr)).toEqual([\n      { value: 1 },\n      { value: 3 },\n      { value: 3 },\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/asyncCompose.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport asyncCompose from '../src/asyncCompose';\n\ndescribe('asyncCompose', () => {\n  test('should compose two async functions', async () => {\n    const double = async (x: number) => x * 2;\n    const increment = async (x: number) => x + 1;\n\n    // asyncCompose(double, increment)(5) = double(increment(5)) = double(6) = 12\n    const result = await asyncCompose(double, increment)(5);\n    expect(result).toBe(12);\n  });\n\n  test('should compose three async functions', async () => {\n    const double = async (x: number) => x * 2;\n    const increment = async (x: number) => x + 1;\n    const square = async (x: number) => x * x;\n\n    // asyncCompose(double, increment, square)(3) = double(increment(square(3))) = double(increment(9)) = double(10) = 20\n    const result = await asyncCompose(double, increment, square)(3);\n    expect(result).toBe(20);\n  });\n\n  test('should work with single async function', async () => {\n    const double = async (x: number) => x * 2;\n\n    const result = await asyncCompose(double)(5);\n    expect(result).toBe(10);\n  });\n\n  test('should work with sync functions', async () => {\n    const double = (x: number) => x * 2;\n    const increment = (x: number) => x + 1;\n\n    const result = await asyncCompose(double, increment)(5);\n    expect(result).toBe(12);\n  });\n\n  test('should work with mixed async and sync functions', async () => {\n    const double = async (x: number) => x * 2;\n    const increment = (x: number) => x + 1;\n    const square = async (x: number) => x * x;\n\n    const result = await asyncCompose(double, increment, square)(3);\n    expect(result).toBe(20);\n  });\n\n  test('should work with functions that change types', async () => {\n    const toString = async (x: number) => `Value: ${x}`;\n    const double = async (x: number) => x * 2;\n\n    const result = await asyncCompose(toString, double)(5);\n    expect(result).toBe('Value: 10');\n  });\n\n  test('should return a promise', () => {\n    const double = (x: number) => x * 2;\n\n    const result = asyncCompose(double)(5);\n    expect(result).toBeInstanceOf(Promise);\n  });\n\n  test('should execute functions in right-to-left order', async () => {\n    const order: string[] = [];\n\n    const first = async (x: number) => {\n      order.push('first');\n      return x;\n    };\n    const second = async (x: number) => {\n      order.push('second');\n      return x;\n    };\n    const third = async (x: number) => {\n      order.push('third');\n      return x;\n    };\n\n    await asyncCompose(first, second, third)(1);\n    expect(order).toEqual(['third', 'second', 'first']);\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/capitalize.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport capitalize from '../src/capitalize';\n\ndescribe('capitalize', () => {\n  test('should return undefined for undefined', () => {\n    expect(capitalize(undefined)).toBe(undefined);\n  });\n\n  test('should return null for null', () => {\n    expect(capitalize(null)).toBe(null);\n  });\n\n  test('should return empty string when empty string', () => {\n    expect(capitalize('')).toBe('');\n  });\n\n  test('should return single word string capitalized', () => {\n    expect(capitalize('reactpdf')).toBe('Reactpdf');\n  });\n\n  test('should return multiple word string capitalized', () => {\n    expect(capitalize('lorem ipsum')).toBe('Lorem Ipsum');\n  });\n\n  test('should handle multiple spaces between words', () => {\n    expect(capitalize('lorem   ipsum')).toBe('Lorem   Ipsum');\n  });\n\n  test('should handle leading whitespace', () => {\n    expect(capitalize(' hello world')).toBe(' Hello World');\n  });\n\n  test('should handle trailing whitespace', () => {\n    expect(capitalize('hello world ')).toBe('Hello World ');\n  });\n\n  test('should handle tabs as word separators', () => {\n    expect(capitalize('hello\\tworld')).toBe('Hello\\tWorld');\n  });\n\n  test('should handle already capitalized string', () => {\n    expect(capitalize('Hello World')).toBe('Hello World');\n  });\n\n  test('should capitalize single character', () => {\n    expect(capitalize('a')).toBe('A');\n  });\n\n  test('should handle newlines as word separators', () => {\n    expect(capitalize('hello\\nworld')).toBe('Hello\\nWorld');\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/castArray.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport castArray from '../src/castArray';\n\ndescribe('castArray', () => {\n  test('should return [undefined] for undefined', () => {\n    expect(castArray(undefined)).toEqual([undefined]);\n  });\n\n  test('should return [null] for null', () => {\n    expect(castArray(null)).toEqual([null]);\n  });\n\n  test('should cast passed value in an array', () => {\n    expect(castArray('test')).toEqual(['test']);\n  });\n\n  test('should return array if passed array', () => {\n    expect(castArray(['reactpdf'])).toEqual(['reactpdf']);\n  });\n\n  test('should return empty array if passed empty array', () => {\n    expect(castArray([])).toEqual([]);\n  });\n\n  test('should cast number in an array', () => {\n    expect(castArray(42)).toEqual([42]);\n  });\n\n  test('should cast object in an array', () => {\n    const obj = { key: 'value' };\n    expect(castArray(obj)).toEqual([obj]);\n  });\n\n  test('should return same array reference if passed array', () => {\n    const arr = [1, 2, 3];\n    expect(castArray(arr)).toBe(arr);\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/compose.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport compose from '../src/compose';\n\ndescribe('compose', () => {\n  test('performs right-to-left function composition', () => {\n    const map = (fn: any) => (collection: number[]) => collection.map(fn);\n    const multiply = (a: number) => (b: number) => a * b;\n    const f = compose(map, multiply, parseInt);\n\n    expect(f('10')([1, 2, 3])).toEqual([10, 20, 30]);\n    expect(f('10', 2)([1, 2, 3])).toEqual([2, 4, 6]);\n  });\n\n  test('should compose two functions', () => {\n    const double = (x: number) => x * 2;\n    const increment = (x: number) => x + 1;\n\n    // compose(double, increment)(5) = double(increment(5)) = double(6) = 12\n    expect(compose(double, increment)(5)).toBe(12);\n  });\n\n  test('should compose three functions', () => {\n    const double = (x: number) => x * 2;\n    const increment = (x: number) => x + 1;\n    const square = (x: number) => x * x;\n\n    // compose(double, increment, square)(3) = double(increment(square(3))) = double(increment(9)) = double(10) = 20\n    expect(compose(double, increment, square)(3)).toBe(20);\n  });\n\n  test('should work with single function', () => {\n    const double = (x: number) => x * 2;\n\n    expect(compose(double)(5)).toBe(10);\n  });\n\n  test('should work with functions that change types', () => {\n    const toString = (x: number) => `Value: ${x}`;\n    const double = (x: number) => x * 2;\n\n    expect(compose(toString, double)(5)).toBe('Value: 10');\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/dropLast.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport dropLast from '../src/dropLast';\n\ndescribe('dropLast', () => {\n  test('skips the last element from a list, returning the remainder', () => {\n    expect(dropLast(['a', 'b', 'c', 'd'])).toEqual(['a', 'b', 'c']);\n  });\n\n  test('returns an empty array if passed 1 element array', () => {\n    expect(dropLast(['a'])).toEqual([]);\n  });\n\n  test('returns an empty array if passed empty array', () => {\n    expect(dropLast([])).toEqual([]);\n  });\n\n  test('can operate on strings', () => {\n    expect(dropLast('react-pdf')).toEqual('react-pd');\n  });\n\n  test('returns empty string if passed single character string', () => {\n    expect(dropLast('a')).toEqual('');\n  });\n\n  test('returns empty string if passed empty string', () => {\n    expect(dropLast('')).toEqual('');\n  });\n\n  test('should not mutate the original array', () => {\n    const original = [1, 2, 3];\n    const result = dropLast(original);\n\n    expect(result).toEqual([1, 2]);\n    expect(original).toEqual([1, 2, 3]);\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/evolve.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport evolve from '../src/evolve';\n\nconst add = (a: number) => (b: number) => a + b;\n\ndescribe('evolve', () => {\n  test('creates a new object by evolving the `object` according to the `transformation` functions', () => {\n    const transf = { elapsed: add(1), remaining: add(-1) };\n    const object = { name: 'Tomato', elapsed: 100, remaining: 1400 };\n    const expected = { name: 'Tomato', elapsed: 101, remaining: 1399 };\n\n    expect(evolve(transf, object)).toEqual(expected);\n  });\n\n  test('does not invoke function if object does not contain the key', () => {\n    const transf = { n: add(1), m: add(1) };\n    const object = { m: 3 };\n    const expected = { m: 4 };\n\n    expect(evolve(transf, object)).toEqual(expected);\n  });\n\n  test('is not destructive', () => {\n    const transf = { elapsed: add(1), remaining: add(-1) };\n    const object = { name: 'Tomato', elapsed: 100, remaining: 1400 };\n    const expected = { name: 'Tomato', elapsed: 100, remaining: 1400 };\n\n    evolve(transf, object);\n\n    expect(object).toEqual(expected);\n  });\n\n  test('returns empty object when given empty object', () => {\n    expect(evolve({}, {})).toEqual({});\n  });\n\n  test('returns copy of object when given empty transformations', () => {\n    const object = { a: 1, b: 2 };\n\n    expect(evolve({}, object)).toEqual({ a: 1, b: 2 });\n  });\n\n  test('transforms all keys when all have transformations', () => {\n    const double = (x: number) => x * 2;\n    const transf = { a: double, b: double };\n    const object = { a: 1, b: 2 };\n\n    expect(evolve(transf, object)).toEqual({ a: 2, b: 4 });\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/get.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport get from '../src/get';\n\ndescribe('get', () => {\n  const deepObject = {\n    a: { b: { c: 'c' } },\n    falseVal: false,\n    nullVal: null,\n    undefinedVal: undefined,\n    arrayVal: ['arr'],\n  };\n\n  test('takes a path and an object and returns the value at the path or the default value', () => {\n    const obj = {\n      a: {\n        b: {\n          c: 100,\n          d: 200,\n        },\n        e: {\n          f: [100, 101, 102],\n          g: 'G',\n        },\n        h: 'H',\n      },\n      i: 'I',\n      j: ['J'],\n    };\n\n    expect(get(obj, ['a', 'b', 'c'], 'Unknown')).toBe(100);\n    expect(get(obj, [], 'Unknown')).toBe(obj);\n    expect(get(obj, ['a', 'e', 'f', 1], 'Unknown')).toBe(101);\n    expect(get(obj, ['j', 0], 'Unknown')).toBe('J');\n    expect(get(obj, ['j', 1], 'Unknown')).toBe('Unknown');\n    expect(get(null, ['a', 'b', 'c'], 'Unknown')).toBe('Unknown');\n  });\n\n  test(\"gets a deep property's value from objects\", () => {\n    expect(get(deepObject, ['a', 'b', 'c'], 'Unknown')).toBe('c');\n    expect(get(deepObject, ['a'], 'Unknown')).toBe(deepObject.a);\n  });\n\n  test('returns the default value for items not found', () => {\n    expect(get(deepObject, ['a', 'b', 'foo'], 'Unknown')).toBe('Unknown');\n    expect(get(deepObject, ['bar'], 'Unknown')).toBe('Unknown');\n  });\n\n  test('returns the default value for null/undefined', () => {\n    expect(get(null, ['toString'], 'Unknown')).toBe('Unknown');\n    expect(get(undefined, ['toString'], 'Unknown')).toBe('Unknown');\n  });\n\n  test('works with falsy items', () => {\n    expect(get(false, ['toString'], 'Unknown')).toBe(\n      Boolean.prototype.toString,\n    );\n  });\n\n  test('returns falsy values when they exist (not default)', () => {\n    expect(get(deepObject, ['falseVal'], 'Unknown')).toBe(false);\n    expect(get({ zero: 0 }, ['zero'], 'Unknown')).toBe(0);\n    expect(get({ empty: '' }, ['empty'], 'Unknown')).toBe('');\n  });\n\n  test('returns default for null/undefined values in object', () => {\n    expect(get(deepObject, ['nullVal'], 'Unknown')).toBe('Unknown');\n    expect(get(deepObject, ['undefinedVal'], 'Unknown')).toBe('Unknown');\n  });\n\n  test('accesses array values', () => {\n    expect(get(deepObject, ['arrayVal', 0], 'Unknown')).toBe('arr');\n    expect(get(deepObject, ['arrayVal', 1], 'Unknown')).toBe('Unknown');\n  });\n\n  test('returns default when path goes through null/undefined', () => {\n    expect(get(deepObject, ['nullVal', 'foo'], 'Unknown')).toBe('Unknown');\n    expect(get(deepObject, ['undefinedVal', 'foo'], 'Unknown')).toBe('Unknown');\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/isNil.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport isNil from '../src/isNil';\n\ndescribe('isNil', () => {\n  test('should return true for null', () => {\n    expect(isNil(null)).toBe(true);\n  });\n\n  test('should return true for undefined', () => {\n    expect(isNil(undefined)).toBe(true);\n  });\n\n  test('should return false for falsy non-nil values', () => {\n    expect(isNil(0)).toBe(false);\n    expect(isNil('')).toBe(false);\n    expect(isNil(false)).toBe(false);\n    expect(isNil(NaN)).toBe(false);\n  });\n\n  test('should return false for objects and arrays', () => {\n    expect(isNil([])).toBe(false);\n    expect(isNil({})).toBe(false);\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/last.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport last from '../src/last';\n\ndescribe('last', () => {\n  test('returns the last element of an array', () => {\n    expect(last([1, 2, 3])).toBe(3);\n    expect(last([1, 2])).toBe(2);\n    expect(last([1])).toBe(1);\n  });\n\n  test('returns undefined for empty array', () => {\n    expect(last([])).toBe(undefined);\n  });\n\n  test('returns the last character of a string', () => {\n    expect(last('abc')).toBe('c');\n    expect(last('ab')).toBe('b');\n    expect(last('a')).toBe('a');\n  });\n\n  test('returns empty string for empty string', () => {\n    expect(last('')).toBe('');\n  });\n\n  test('works with arrays of objects', () => {\n    const obj1 = { id: 1 };\n    const obj2 = { id: 2 };\n\n    expect(last([obj1, obj2])).toBe(obj2);\n  });\n\n  test('works with arrays containing falsy values', () => {\n    expect(last([1, 2, 0])).toBe(0);\n    expect(last([1, 2, false])).toBe(false);\n    expect(last([1, 2, null])).toBe(null);\n    expect(last([1, 2, ''])).toBe('');\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/mapValues.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport mapValues from '../src/mapValues';\n\ndescribe('mapValues', () => {\n  test('should apply function to each value', () => {\n    const double = (x: number) => x * 2;\n    const obj = { a: 1, b: 2, c: 3 };\n\n    expect(mapValues(obj, double)).toEqual({ a: 2, b: 4, c: 6 });\n  });\n\n  test('should pass value, key, and index to the function', () => {\n    const results: Array<{ value: number; key: string; index: number }> = [];\n    const obj = { a: 1, b: 2 };\n\n    mapValues(obj, (value, key, index) => {\n      results.push({ value, key, index });\n      return value;\n    });\n\n    expect(results).toEqual([\n      { value: 1, key: 'a', index: 0 },\n      { value: 2, key: 'b', index: 1 },\n    ]);\n  });\n\n  test('should return empty object for empty input', () => {\n    expect(mapValues({}, (x) => x)).toEqual({});\n  });\n\n  test('should not mutate the original object', () => {\n    const original = { a: 1, b: 2 };\n    const result = mapValues(original, (x) => x * 2);\n\n    expect(result).toEqual({ a: 2, b: 4 });\n    expect(original).toEqual({ a: 1, b: 2 });\n  });\n\n  test('should work with different value types', () => {\n    const obj = { name: 'test', count: 5 };\n    const toUpper = (x: any) => (typeof x === 'string' ? x.toUpperCase() : x);\n\n    expect(mapValues(obj, toUpper)).toEqual({ name: 'TEST', count: 5 });\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/matchPercent.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport matchPercent from '../src/matchPercent';\n\ndescribe('match percent', () => {\n  test('should return null for null input', () => {\n    expect(matchPercent(null)).toBeNull();\n  });\n\n  test('should return null for numeric inputs', () => {\n    expect(matchPercent(40)).toBeNull();\n  });\n\n  test('should return null for wrong string inputs', () => {\n    expect(matchPercent('hey%')).toBeNull();\n  });\n\n  test('should return value for positive integer percents', () => {\n    const match = matchPercent('35%');\n\n    expect(match?.value).toBe(35);\n    expect(match?.percent).toBe(0.35);\n  });\n\n  test('should return value for positive real percents', () => {\n    const match = matchPercent('35.5%');\n\n    expect(match?.value).toBe(35.5);\n    expect(match?.percent).toBe(0.355);\n  });\n\n  test('should return value for negative integer percents', () => {\n    const match = matchPercent('-35%');\n\n    expect(match?.value).toBe(-35);\n    expect(match?.percent).toBe(-0.35);\n  });\n\n  test('should return value for negative real percents', () => {\n    const match = matchPercent('-35.5%');\n\n    expect(match?.value).toBe(-35.5);\n    expect(match?.percent).toBe(-0.355);\n  });\n\n  test('should return value for zero percent', () => {\n    const match = matchPercent('0%');\n\n    expect(match?.value).toBe(0);\n    expect(match?.percent).toBe(0);\n  });\n\n  test('should return value for 100 percent', () => {\n    const match = matchPercent('100%');\n\n    expect(match?.value).toBe(100);\n    expect(match?.percent).toBe(1);\n  });\n\n  test('should return value for percentages over 100', () => {\n    const match = matchPercent('150%');\n\n    expect(match?.value).toBe(150);\n    expect(match?.percent).toBe(1.5);\n  });\n\n  test('should return null for empty string', () => {\n    expect(matchPercent('')).toBeNull();\n  });\n\n  test('should match percent in longer string', () => {\n    const match = matchPercent('width: 50%');\n\n    expect(match?.value).toBe(50);\n    expect(match?.percent).toBe(0.5);\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/omit.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport omit from '../src/omit';\n\ndescribe('omit', () => {\n  const obj = { a: 1, b: 2, c: 3 };\n\n  test('copies an object omitting the listed property', () => {\n    expect(omit('a', obj)).toEqual({ b: 2, c: 3 });\n  });\n\n  test('copies an object omitting the listed properties', () => {\n    expect(omit(['a', 'c'], obj)).toEqual({ b: 2 });\n  });\n\n  test('returns copy of object when keys array is empty', () => {\n    expect(omit([], obj)).toEqual({ a: 1, b: 2, c: 3 });\n  });\n\n  test('returns copy of object when key does not exist', () => {\n    expect(omit('nonexistent', obj)).toEqual({ a: 1, b: 2, c: 3 });\n    expect(omit(['x', 'y'], obj)).toEqual({ a: 1, b: 2, c: 3 });\n  });\n\n  test('returns empty object when all keys are omitted', () => {\n    expect(omit(['a', 'b', 'c'], obj)).toEqual({});\n  });\n\n  test('does not mutate the original object', () => {\n    const original = { a: 1, b: 2 };\n    const result = omit('a', original);\n\n    expect(result).toEqual({ b: 2 });\n    expect(original).toEqual({ a: 1, b: 2 });\n  });\n\n  test('returns empty object when given empty object', () => {\n    expect(omit('a', {})).toEqual({});\n    expect(omit(['a', 'b'], {})).toEqual({});\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/parseFloat.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport parseFloat from '../src/parseFloat';\n\ndescribe('parseFloat', () => {\n  test('should return undefined for undefined', () => {\n    expect(parseFloat(undefined!)).toBe(undefined);\n  });\n\n  test('should return null for null', () => {\n    expect(parseFloat(null!)).toBe(null);\n  });\n\n  test('should parse integer', () => {\n    expect(parseFloat(10)).toBe(10);\n  });\n\n  test('should parse float', () => {\n    expect(parseFloat(10.1)).toBe(10.1);\n  });\n\n  test('should parse string integer', () => {\n    expect(parseFloat('10')).toBe(10);\n  });\n\n  test('should parse string float', () => {\n    expect(parseFloat('10.1')).toBe(10.1);\n  });\n\n  test('should parse negative numbers', () => {\n    expect(parseFloat(-5)).toBe(-5);\n    expect(parseFloat('-5.5')).toBe(-5.5);\n  });\n\n  test('should parse zero', () => {\n    expect(parseFloat(0)).toBe(0);\n    expect(parseFloat('0')).toBe(0);\n  });\n\n  test('should return NaN for invalid strings', () => {\n    expect(parseFloat('abc')).toBeNaN();\n    expect(parseFloat('')).toBeNaN();\n  });\n\n  test('should parse numbers from strings with trailing characters', () => {\n    expect(parseFloat('10px')).toBe(10);\n    expect(parseFloat('3.14rem')).toBe(3.14);\n  });\n\n  test('should parse strings with leading whitespace', () => {\n    expect(parseFloat('  42')).toBe(42);\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/pick.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport pick from '../src/pick';\n\ndescribe('pick', () => {\n  const obj = { a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, 1: 7 };\n\n  test('copies the named properties of an object to the new object', () => {\n    expect(pick(['a', 'c', 'f'], obj)).toEqual({ a: 1, c: 3, f: 6 });\n  });\n\n  test('handles numbers as properties', () => {\n    expect(pick([1], obj)).toEqual({ 1: 7 });\n  });\n\n  test('ignores properties not included', () => {\n    expect(pick(['a', 'c', 'g'], obj)).toEqual({ a: 1, c: 3 });\n  });\n\n  test('returns empty object when keys array is empty', () => {\n    expect(pick([], obj)).toEqual({});\n  });\n\n  test('returns empty object when object is empty', () => {\n    expect(pick(['a', 'b'], {})).toEqual({});\n  });\n\n  test('picks single key', () => {\n    expect(pick(['a'], obj)).toEqual({ a: 1 });\n  });\n\n  test('does not mutate the original object', () => {\n    const original = { a: 1, b: 2 };\n    const result = pick(['a'], original);\n\n    expect(result).toEqual({ a: 1 });\n    expect(original).toEqual({ a: 1, b: 2 });\n  });\n\n  test('picks keys with falsy values', () => {\n    const objWithFalsy = { a: 0, b: false, c: '', d: null, e: undefined };\n\n    expect(pick(['a', 'b', 'c', 'd', 'e'], objWithFalsy)).toEqual({\n      a: 0,\n      b: false,\n      c: '',\n      d: null,\n      e: undefined,\n    });\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/repeat.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport repeat from '../src/repeat';\n\ndescribe('repeat', () => {\n  test('should repeat property  times', () => {\n    expect(repeat('a', 5)).toEqual(['a', 'a', 'a', 'a', 'a']);\n    expect(repeat('b', 0)).toEqual([]);\n    expect(repeat('Lorem', 1)).toEqual(['Lorem']);\n    expect(repeat('Ipsum', 2)).toEqual(['Ipsum', 'Ipsum']);\n    expect(repeat(undefined, 3)).toEqual([undefined, undefined, undefined]);\n  });\n\n  test('should not repeat property', () => {\n    expect(repeat('Lorem')).toEqual([]);\n  });\n\n  test('should repeat numbers', () => {\n    expect(repeat(42, 3)).toEqual([42, 42, 42]);\n    expect(repeat(0, 2)).toEqual([0, 0]);\n  });\n\n  test('should repeat objects with same reference', () => {\n    const obj = { id: 1 };\n    const result = repeat(obj, 3);\n\n    expect(result).toEqual([obj, obj, obj]);\n    expect(result[0]).toBe(obj);\n    expect(result[1]).toBe(obj);\n    expect(result[2]).toBe(obj);\n  });\n\n  test('should repeat null', () => {\n    expect(repeat(null, 2)).toEqual([null, null]);\n  });\n\n  test('should repeat false', () => {\n    expect(repeat(false, 3)).toEqual([false, false, false]);\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/reverse.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport reverse from '../src/reverse';\n\ndescribe('reverse', () => {\n  test('reverses arrays', () => {\n    expect(reverse([])).toEqual([]);\n    expect(reverse([1])).toEqual([1]);\n    expect(reverse([1, 2])).toEqual([2, 1]);\n    expect(reverse([1, 2, 3])).toEqual([3, 2, 1]);\n  });\n\n  test('does not mutate the original array', () => {\n    const original = [1, 2, 3];\n    const result = reverse(original);\n\n    expect(result).toEqual([3, 2, 1]);\n    expect(original).toEqual([1, 2, 3]);\n  });\n\n  test('reverses array of strings', () => {\n    expect(reverse(['a', 'b', 'c'])).toEqual(['c', 'b', 'a']);\n  });\n\n  test('reverses array of objects', () => {\n    const obj1 = { id: 1 };\n    const obj2 = { id: 2 };\n    const obj3 = { id: 3 };\n\n    expect(reverse([obj1, obj2, obj3])).toEqual([obj3, obj2, obj1]);\n  });\n\n  test('reverses array with falsy values', () => {\n    expect(reverse([0, false, null, ''])).toEqual(['', null, false, 0]);\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/upperFirst.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport upperFirst from '../src/upperFirst';\n\ndescribe('upperFirst', () => {\n  test('should return undefined for undefined', () => {\n    expect(upperFirst(undefined)).toBe(undefined);\n  });\n\n  test('should return null for null', () => {\n    expect(upperFirst(null)).toBe(null);\n  });\n\n  test('should return empty string when empty string', () => {\n    expect(upperFirst('')).toBe('');\n  });\n\n  test('should return string with first char upperFirstd', () => {\n    expect(upperFirst('reactpdf')).toBe('Reactpdf');\n  });\n\n  test('should keep already capitalized strings unchanged', () => {\n    expect(upperFirst('Reactpdf')).toBe('Reactpdf');\n  });\n\n  test('should only capitalize first character', () => {\n    expect(upperFirst('HELLO')).toBe('HELLO');\n    expect(upperFirst('hELLO')).toBe('HELLO');\n  });\n\n  test('should handle single character strings', () => {\n    expect(upperFirst('a')).toBe('A');\n    expect(upperFirst('A')).toBe('A');\n  });\n\n  test('should handle strings starting with numbers', () => {\n    expect(upperFirst('123abc')).toBe('123abc');\n  });\n\n  test('should handle strings with spaces', () => {\n    expect(upperFirst('hello world')).toBe('Hello world');\n  });\n});\n"
  },
  {
    "path": "packages/fns/tests/without.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport without from '../src/without';\n\ndescribe('without', () => {\n  const array = ['a', 'b', 'c', 'd', 'e', 'f', 1];\n\n  test('filters passed keys', () => {\n    expect(without(['a', 'c', 'f'], array)).toEqual(['b', 'd', 'e', 1]);\n  });\n\n  test('handles numbers as keys', () => {\n    expect(without([1], array)).toEqual(['a', 'b', 'c', 'd', 'e', 'f']);\n  });\n\n  test('ignores keys not included', () => {\n    expect(without(['g'], array)).toEqual(array);\n  });\n\n  test('returns copy of array when keys is empty', () => {\n    expect(without([], array)).toEqual(array);\n  });\n\n  test('returns empty array when array is empty', () => {\n    expect(without(['a', 'b'], [])).toEqual([]);\n  });\n\n  test('returns empty array when all values are removed', () => {\n    expect(without([1, 2, 3], [1, 2, 3])).toEqual([]);\n  });\n\n  test('does not mutate the original array', () => {\n    const original = [1, 2, 3, 4];\n    const result = without([2, 4], original);\n\n    expect(result).toEqual([1, 3]);\n    expect(original).toEqual([1, 2, 3, 4]);\n  });\n\n  test('removes all occurrences of duplicate values', () => {\n    expect(without([2], [1, 2, 3, 2, 4, 2])).toEqual([1, 3, 4]);\n  });\n\n  test('handles falsy values', () => {\n    expect(without([0, false], [0, 1, false, 2, null])).toEqual([1, 2, null]);\n  });\n});\n"
  },
  {
    "path": "packages/fns/tsconfig.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"compilerOptions\": {\n    \"outDir\": \"lib\",\n    \"declaration\": true,\n    \"declarationDir\": \"lib/types\",\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2022\", \"DOM\"],\n    \"moduleResolution\": \"Node\",\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"types\": [\"vitest/globals\"],\n  },\n  \"include\": [\"src\"],\n}\n"
  },
  {
    "path": "packages/font/.gitignore",
    "content": "lib\n"
  },
  {
    "path": "packages/font/CHANGELOG.md",
    "content": "# @react-pdf/font\n\n## 4.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`f034491b`](https://github.com/diegomura/react-pdf/commit/f034491b1f77ce6f18a5db88e70b10b9c502ca35)]:\n  - @react-pdf/pdfkit@4.1.0\n  - @react-pdf/types@2.9.2\n\n## 4.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`5cbe2fb0`](https://github.com/diegomura/react-pdf/commit/5cbe2fb0bde45c44eb68dde01f20feea245908c6)]:\n  - @react-pdf/pdfkit@4.0.4\n  - @react-pdf/types@2.9.1\n\n## 4.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a), [`106699e8`](https://github.com/diegomura/react-pdf/commit/106699e850dad2285e6999d59975111f217e8a81)]:\n  - @react-pdf/types@2.9.0\n  - @react-pdf/pdfkit@4.0.3\n\n## 4.0.1\n\n### Patch Changes\n\n- [`e257f7ee`](https://github.com/diegomura/react-pdf/commit/e257f7ee18ff09f4895cd16c0b21b824678384c8) Thanks [@diegomura](https://github.com/diegomura)! - fix: font store types\n\n- Updated dependencies []:\n  - @react-pdf/types@2.8.2\n\n## 4.0.0\n\n### Major Changes\n\n- [#3102](https://github.com/diegomura/react-pdf/pull/3102) [`24690f52`](https://github.com/diegomura/react-pdf/commit/24690f5238e4eacf28351cf9996856a7d196d29e) Thanks [@diegomura](https://github.com/diegomura)! - feat: handle standard fonts in fonts package\n\n### Patch Changes\n\n- [#3087](https://github.com/diegomura/react-pdf/pull/3087) [`7cd66e4f`](https://github.com/diegomura/react-pdf/commit/7cd66e4fc37cd1393adc6250a919fe2629812082) Thanks [@diegomura](https://github.com/diegomura)! - fix: font exported types\n\n- [#3093](https://github.com/diegomura/react-pdf/pull/3093) [`a2de2685`](https://github.com/diegomura/react-pdf/commit/a2de2685b25c797f266775c2e35a6535090393b7) Thanks [@diegomura](https://github.com/diegomura)! - refactor: font strict type checking\n\n- [#3092](https://github.com/diegomura/react-pdf/pull/3092) [`481b536f`](https://github.com/diegomura/react-pdf/commit/481b536f4ad145fb227829399b85a35838a506f8) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert layout package to TS\n\n- Updated dependencies [[`7cd66e4f`](https://github.com/diegomura/react-pdf/commit/7cd66e4fc37cd1393adc6250a919fe2629812082)]:\n  - @react-pdf/types@2.8.1\n\n## 3.1.0\n\n### Minor Changes\n\n- [#3079](https://github.com/diegomura/react-pdf/pull/3079) [`700535c5`](https://github.com/diegomura/react-pdf/commit/700535c57ff1b105d923be70f4fc4bfdf4479f91) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert font package to TS\n\n### Patch Changes\n\n- Updated dependencies [[`96c2464d`](https://github.com/diegomura/react-pdf/commit/96c2464dfaa7294e0d79b7ed64743bfd7b1a8c72), [`24fe4bf8`](https://github.com/diegomura/react-pdf/commit/24fe4bf894fff055121926488b30d0bf212a9c45), [`700535c5`](https://github.com/diegomura/react-pdf/commit/700535c57ff1b105d923be70f4fc4bfdf4479f91)]:\n  - @react-pdf/types@2.8.0\n\n## 3.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`01944231`](https://github.com/diegomura/react-pdf/commit/01944231a342d502b832aeecb4c313020b8360c8)]:\n  - @react-pdf/types@2.7.1\n\n## 3.0.1\n\n### Patch Changes\n\n- [#2947](https://github.com/diegomura/react-pdf/pull/2947) [`ed562b9b`](https://github.com/diegomura/react-pdf/commit/ed562b9b7f14bc76a1cd83aaaf1dab966bd7540b) Thanks [@diegomura](https://github.com/diegomura)! - feat: remove cross-fetch\n\n## 3.0.0\n\n### Major Changes\n\n- [#2871](https://github.com/diegomura/react-pdf/pull/2871) [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119) Thanks [@diegomura](https://github.com/diegomura)! - feat!: drop cjs support\n\n### Patch Changes\n\n- Updated dependencies [[`46c3047d`](https://github.com/diegomura/react-pdf/commit/46c3047de56ae82f062b72c4910a4e6096eee99f), [`55973278`](https://github.com/diegomura/react-pdf/commit/55973278ac8bc8f703b63844f57d6f155ae8d86f)]:\n  - @react-pdf/types@2.7.0\n\n## 2.5.2\n\n### Patch Changes\n\n- Updated dependencies [[`8e6a832`](https://github.com/diegomura/react-pdf/commit/8e6a8320f86354aff950c296a96bc41a33e9dab2), [`4bafab8`](https://github.com/diegomura/react-pdf/commit/4bafab8455c9003759f48bad20a720baf4ed189b)]:\n  - @react-pdf/types@2.6.0\n\n## 2.5.1\n\n### Patch Changes\n\n- Updated dependencies [[`22a34a9`](https://github.com/diegomura/react-pdf/commit/22a34a91b16a201cd8288e0dbea9368b12ca73f5)]:\n  - @react-pdf/types@2.5.0\n\n## 2.5.0\n\n### Minor Changes\n\n- [#2640](https://github.com/diegomura/react-pdf/pull/2640) [`67c265a`](https://github.com/diegomura/react-pdf/commit/67c265a7e39cc0baa319f49137219677904695e6) Thanks [@nikgraf](https://github.com/nikgraf)! - Add support for fontFamily fallbacks e.g. fontFamily: ['Roboto', 'NotoSansArabic']\n\n## 2.4.4\n\n### Patch Changes\n\n- [#2605](https://github.com/diegomura/react-pdf/pull/2605) [`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - fix: fix CJS compatibility\n\n## 2.4.3\n\n### Patch Changes\n\n- Updated dependencies [[`9af07fe`](https://github.com/diegomura/react-pdf/commit/9af07feb59c2fe9c1d8960ac95f6fa6e03d16235)]:\n  - @react-pdf/types@2.4.1\n\n## 2.4.2\n\n### Patch Changes\n\n- Updated dependencies [[`fb5273d`](https://github.com/diegomura/react-pdf/commit/fb5273d8d80d919f7b9c214e02d67b79ce23fa19)]:\n  - @react-pdf/types@2.4.0\n\n## 2.4.1\n\n### Patch Changes\n\n- Updated dependencies [[`9e5842b`](https://github.com/diegomura/react-pdf/commit/9e5842bbecca6e249af2c5fc50078bb7ddd5420f)]:\n  - @react-pdf/types@2.3.6\n\n## 2.4.0\n\n### Minor Changes\n\n- [#2409](https://github.com/diegomura/react-pdf/pull/2409) [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Add support for native ESM\n\n## 2.3.8\n\n### Patch Changes\n\n- [#2467](https://github.com/diegomura/react-pdf/pull/2467) [`1f987cc`](https://github.com/diegomura/react-pdf/commit/1f987cc27c3fd1ef1b6748ebe58a289a78b538d2) Thanks [@JaeSeoKim](https://github.com/JaeSeoKim)! - feat: add withVariationSelectors option to registerEmojiSource [#2466](https://github.com/diegomura/react-pdf/issues/2466)\n\n- Updated dependencies [[`e5c8fde`](https://github.com/diegomura/react-pdf/commit/e5c8fde9379a9a85ecac7e3d6273953e39d65f8d), [`1f987cc`](https://github.com/diegomura/react-pdf/commit/1f987cc27c3fd1ef1b6748ebe58a289a78b538d2), [`4c40b14`](https://github.com/diegomura/react-pdf/commit/4c40b149cfed42f2513e1dd330a92ccc3363c04f)]:\n  - @react-pdf/types@2.3.5\n\n## 2.3.7\n\n### Patch Changes\n\n- Updated dependencies [[`4a55c1b`](https://github.com/diegomura/react-pdf/commit/4a55c1b2ed19e460ccae6e749ed94c16729a23c4)]:\n  - @react-pdf/types@2.3.4\n\n## 2.3.6\n\n### Patch Changes\n\n- Updated dependencies [[`1e1fbdc`](https://github.com/diegomura/react-pdf/commit/1e1fbdc3c33ced46d8c7ebba7a196733cb789d59), [`8636812`](https://github.com/diegomura/react-pdf/commit/86368122ed87621d19ae3bc248080e17703d9fcb)]:\n  - @react-pdf/types@2.3.3\n\n## 2.3.5\n\n### Patch Changes\n\n- Updated dependencies [[`a25dbcb`](https://github.com/diegomura/react-pdf/commit/a25dbcb32b65c300f5b088e8b210bb0c1abca5c2)]:\n  - @react-pdf/types@2.3.2\n\n## 2.3.4\n\n### Patch Changes\n\n- [#2252](https://github.com/diegomura/react-pdf/pull/2252) [`47e91cb`](https://github.com/diegomura/react-pdf/commit/47e91cbd8016046bb4e8389ba0d1c7ede9edce59) Thanks [@jeetiss](https://github.com/jeetiss)! - implement function as emoji source to build more complex urls\n\n- Updated dependencies [[`47e91cb`](https://github.com/diegomura/react-pdf/commit/47e91cbd8016046bb4e8389ba0d1c7ede9edce59)]:\n  - @react-pdf/types@2.3.1\n\n## 2.3.3\n\n### Patch Changes\n\n- Updated dependencies [[`2db67a3`](https://github.com/diegomura/react-pdf/commit/2db67a38b9be98b7816a2b5aa4733446b95e3724)]:\n  - @react-pdf/types@2.3.0\n\n## 2.3.2\n\n### Patch Changes\n\n- [#2205](https://github.com/diegomura/react-pdf/pull/2205) [`9a5e0be`](https://github.com/diegomura/react-pdf/commit/9a5e0befb89756db07ce053192a136df9d4ba905) Thanks [@jeetiss](https://github.com/jeetiss)! - update babel\n\n## 2.3.1\n\n### Patch Changes\n\n- [#2023](https://github.com/diegomura/react-pdf/pull/2023) [`ce1c43c`](https://github.com/diegomura/react-pdf/commit/ce1c43c1b450b3737a23a356c5143626ac2a43ad) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - Fix warning about 'buffer' dependency in CRA 5 and webpack 5\n\n## 2.3.0\n\n### Minor Changes\n\n- [#1891](https://github.com/diegomura/react-pdf/pull/1891) [`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - feat: compatibility with modern web bundlers and browsers\n\n### Patch Changes\n\n- [#1908](https://github.com/diegomura/react-pdf/pull/1908) [`d1f3d5b`](https://github.com/diegomura/react-pdf/commit/d1f3d5b9b4103705e95e2160347ee253d842ed5d) Thanks [@diegomura](https://github.com/diegomura)! - chore: use fontkit mainline repo + drop node 12\n\n* [#1927](https://github.com/diegomura/react-pdf/pull/1927) [`27403f9`](https://github.com/diegomura/react-pdf/commit/27403f9a6ac1bbcfb144afc201c4a3e5aca25cbd) Thanks [@diegomura](https://github.com/diegomura)! - feat: remove Buffer dependency from font package\n\n- [#1934](https://github.com/diegomura/react-pdf/pull/1934) [`1a89506`](https://github.com/diegomura/react-pdf/commit/1a89506b4d325822d1a60a8f964434a6f6eb2d3f) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - fix: ability to load fonts by relative URL in browsers\n\n## 2.2.1\n\n### Patch Changes\n\n- [#1909](https://github.com/diegomura/react-pdf/pull/1909) [`3acf53b`](https://github.com/diegomura/react-pdf/commit/3acf53b45200fa1415315f7dc22cc4b84a6b54c6) Thanks [@diegomura](https://github.com/diegomura)! - fix: font store load method skip loading\n\n- Updated dependencies [[`0fcc594`](https://github.com/diegomura/react-pdf/commit/0fcc594310d5af30ca1e752b3efc7a047e813dcb)]:\n  - @react-pdf/fontkit@2.1.2\n\n## 2.2.0\n\n### Minor Changes\n\n- [#1841](https://github.com/diegomura/react-pdf/pull/1841) [`25a80eb`](https://github.com/diegomura/react-pdf/commit/25a80ebd5f96ade7101883624010bad51474967c) Thanks [@diegomura](https://github.com/diegomura)! - feat: support bold-italic standard fonts\n\n### Patch Changes\n\n- Updated dependencies [[`fe0f214`](https://github.com/diegomura/react-pdf/commit/fe0f214dbbf2f632b852ebfe65f886ecc4dd6953)]:\n  - @react-pdf/types@2.0.9\n\n## 2.1.1\n\n### Patch Changes\n\n- [#1685](https://github.com/diegomura/react-pdf/pull/1685) [`90ab2f8`](https://github.com/diegomura/react-pdf/commit/90ab2f8c040afc3d42961404bdf2ae09fac599eb) Thanks [@jeetiss](https://github.com/jeetiss)! - updated cross-fetch\n\n## 2.1.0\n\n### Minor Changes\n\n- [#1610](https://github.com/diegomura/react-pdf/pull/1610) [`4c5d527`](https://github.com/diegomura/react-pdf/commit/4c5d52721d29d843f1d09c3fd74370832429f70e) Thanks [@jeetiss](https://github.com/jeetiss)! - updated rollup rollup-plugins and babel\n\n* [#1654](https://github.com/diegomura/react-pdf/pull/1654) [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b) Thanks [@jeetiss](https://github.com/jeetiss)! - added `@babel/runtime` to dependencies\n\n### Patch Changes\n\n- [#1581](https://github.com/diegomura/react-pdf/pull/1581) [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca) Thanks [@jeetiss](https://github.com/jeetiss)! - added changelog with changesets\n\n- Updated dependencies [[`3217a89`](https://github.com/diegomura/react-pdf/commit/3217a892e92ff98e92b6c7ea6e3244d403f679b6), [`4c5d527`](https://github.com/diegomura/react-pdf/commit/4c5d52721d29d843f1d09c3fd74370832429f70e), [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca), [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b)]:\n  - @react-pdf/fontkit@2.1.0\n  - @react-pdf/types@2.0.8\n"
  },
  {
    "path": "packages/font/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n# @react-pdf/font\n\nFont registration, loading, and resolution library for react-pdf. Handles TTF, WOFF, and WOFF2 fonts from various sources including local files, remote URLs, and base64 data URIs. Includes built-in support for PDF standard fonts.\n\n## Installation\n\n```bash\nyarn add @react-pdf/font\n```\n\n## Usage\n\n```js\nimport FontStore from '@react-pdf/font';\n\nconst fontStore = new FontStore();\n\n// Register a custom font\nfontStore.register({\n  family: 'Roboto',\n  src: 'https://example.com/fonts/Roboto-Regular.ttf',\n});\n\n// Load the font\nawait fontStore.load({\n  fontFamily: 'Roboto',\n  fontStyle: 'normal',\n  fontWeight: 400,\n});\n```\n\n## Font Sources\n\nThe library supports multiple font source types:\n\n### Remote URL\n\n```js\nfontStore.register({\n  family: 'Open Sans',\n  src: 'https://example.com/fonts/OpenSans-Regular.ttf',\n});\n```\n\nWith custom request options:\n\n```js\nfontStore.register({\n  family: 'Open Sans',\n  src: 'https://example.com/fonts/OpenSans-Regular.ttf',\n  method: 'GET',\n  headers: {\n    Authorization: 'Bearer token',\n  },\n  body: null,\n});\n```\n\n### Local File (Node.js)\n\n```js\nfontStore.register({\n  family: 'Custom Font',\n  src: '/path/to/font.ttf',\n});\n```\n\n> **Note:** Local file resolution is only available in Node.js environments.\n\n### Base64 Data URI\n\n```js\nfontStore.register({\n  family: 'Embedded Font',\n  src: 'data:font/ttf;base64,AAEAAAALAIAAAwAwT1MvMg...',\n});\n```\n\n## Registering Font Families\n\n### Single Font\n\n```js\nfontStore.register({\n  family: 'Roboto',\n  src: 'https://example.com/fonts/Roboto-Regular.ttf',\n  fontWeight: 400,\n  fontStyle: 'normal',\n});\n```\n\n### Multiple Weights and Styles (Bulk Registration)\n\n```js\nfontStore.register({\n  family: 'Roboto',\n  fonts: [\n    { src: 'https://example.com/fonts/Roboto-Regular.ttf', fontWeight: 400 },\n    { src: 'https://example.com/fonts/Roboto-Bold.ttf', fontWeight: 700 },\n    {\n      src: 'https://example.com/fonts/Roboto-Italic.ttf',\n      fontWeight: 400,\n      fontStyle: 'italic',\n    },\n    {\n      src: 'https://example.com/fonts/Roboto-BoldItalic.ttf',\n      fontWeight: 700,\n      fontStyle: 'italic',\n    },\n  ],\n});\n```\n\n## Standard Fonts\n\nThe following PDF standard fonts are pre-registered and available without any additional setup:\n\n- **Helvetica** (with Bold, Oblique, and BoldOblique variants)\n- **Courier** (with Bold, Oblique, and BoldOblique variants)\n- **Times-Roman** (with Bold, Italic, and BoldItalic variants)\n\nHelvetica variants are pre-loaded by default, so no explicit `load()` call is needed for them.\n\n```js\n// Standard fonts are ready to use immediately\nconst font = fontStore.getFont({\n  fontFamily: 'Helvetica',\n  fontWeight: 700,\n  fontStyle: 'normal',\n});\n```\n\n## Font Weight Resolution\n\nThe library implements CSS font-weight resolution rules. You can specify font weights as numbers or keywords:\n\n| Keyword                    | Numeric Value |\n| -------------------------- | ------------- |\n| `thin`, `hairline`         | 100           |\n| `ultralight`, `extralight` | 200           |\n| `light`                    | 300           |\n| `normal`                   | 400           |\n| `medium`                   | 500           |\n| `semibold`, `demibold`     | 600           |\n| `bold`                     | 700           |\n| `ultrabold`, `extrabold`   | 800           |\n| `heavy`, `black`           | 900           |\n\nWhen an exact weight match isn't available, the library uses CSS fallback rules to find the closest available weight.\n\n## Emoji Support\n\nRegister an emoji source to enable emoji rendering:\n\n```js\n// Using a URL pattern (must end with trailing slash)\nfontStore.registerEmojiSource({\n  url: 'https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/',\n  format: 'png',\n});\n\n// Using a custom builder function\nfontStore.registerEmojiSource({\n  builder: (code) => `https://example.com/emojis/${code}.png`,\n});\n```\n\nThe `code` parameter passed to the builder is a hyphen-separated string of hex code points (e.g., `1f44d` for 👍 or `1f44d-1f3ff` for 👍🏿).\n\nSet `withVariationSelectors: true` if your emoji source requires variation selectors in the code points.\n\n## Hyphenation\n\nRegister a hyphenation callback for text wrapping:\n\n```js\nimport hyphenationCallback from 'hyphen/en';\n\nfontStore.registerHyphenationCallback(hyphenationCallback);\n```\n\n## API Reference\n\n### FontStore\n\n#### `register(data: SingleLoad | BulkLoad)`\n\nRegister a font or font family.\n\n#### `load(descriptor: FontDescriptor): Promise<void>`\n\nLoad a specific font variant.\n\n#### `getFont(descriptor: FontDescriptor): FontSource`\n\nGet a font source matching the descriptor.\n\n#### `registerEmojiSource(source: EmojiSource)`\n\nRegister an emoji image source.\n\n#### `registerHyphenationCallback(callback: HyphenationCallback)`\n\nRegister a hyphenation callback function.\n\n#### `reset()`\n\nReset all loaded font data (keeps registrations).\n\n#### `clear()`\n\nClear all font registrations, emoji source, and hyphenation callback.\n\n#### `getRegisteredFontFamilies(): string[]`\n\nGet list of registered font family names.\n\n#### `getRegisteredFonts(): Record<string, FontFamily>`\n\nGet all registered font families with their sources.\n\n#### `getEmojiSource(): EmojiSource | null`\n\nGet the registered emoji source, if any.\n\n#### `getHyphenationCallback(): HyphenationCallback | null`\n\nGet the registered hyphenation callback, if any.\n\n## Types\n\n### FontDescriptor\n\n```ts\ntype FontDescriptor = {\n  fontFamily: string;\n  fontStyle?: 'normal' | 'italic' | 'oblique';\n  fontWeight?: FontWeight;\n};\n```\n\n### FontWeight\n\n```ts\ntype FontWeight =\n  | number\n  | 'thin'\n  | 'hairline'\n  | 'ultralight'\n  | 'extralight'\n  | 'light'\n  | 'normal'\n  | 'medium'\n  | 'semibold'\n  | 'demibold'\n  | 'bold'\n  | 'ultrabold'\n  | 'extrabold'\n  | 'heavy'\n  | 'black';\n```\n\n### SingleLoad\n\n```ts\ntype SingleLoad = {\n  family: string;\n  src: string;\n  fontStyle?: 'normal' | 'italic' | 'oblique';\n  fontWeight?: FontWeight;\n  postscriptName?: string;\n  method?: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n  headers?: Record<string, string>;\n  body?: any;\n};\n```\n\n### BulkLoad\n\n```ts\ntype BulkLoad = {\n  family: string;\n  fonts: FontSource[];\n};\n```\n\n### EmojiSource\n\n```ts\ntype EmojiSource =\n  | { url: string; format?: string; withVariationSelectors?: boolean }\n  | { builder: (code: string) => string; withVariationSelectors?: boolean };\n```\n\n### HyphenationCallback\n\n```ts\ntype HyphenationCallback = (word: string) => string[];\n```\n\n## Supported Font Formats\n\n- **TTF** - TrueType Font\n- **WOFF** - Web Open Font Format\n- **WOFF2** - Web Open Font Format 2.0\n\n## License\n\nMIT\n"
  },
  {
    "path": "packages/font/declarations.d.ts",
    "content": "import type { Font, FontCollection } from 'fontkit';\n\ndeclare module 'fontkit' {\n  export function create(\n    buffer: Uint8Array | Buffer,\n    postscriptName?: string,\n  ): Font | FontCollection;\n}\n"
  },
  {
    "path": "packages/font/globals.d.ts",
    "content": "declare global {\n  const BROWSER: boolean;\n}\n\nexport {};\n"
  },
  {
    "path": "packages/font/package.json",
    "content": "{\n  \"name\": \"@react-pdf/font\",\n  \"version\": \"4.0.4\",\n  \"license\": \"MIT\",\n  \"description\": \"Register font and emoji source for react-pdf document\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/font\"\n  },\n  \"type\": \"module\",\n  \"main\": \"./lib/index.js\",\n  \"types\": \"./lib/index.d.ts\",\n  \"browser\": {\n    \"./lib/index.js\": \"./lib/index.browser.js\"\n  },\n  \"scripts\": {\n    \"test\": \"vitest\",\n    \"build\": \"rimraf ./lib && rollup -c\",\n    \"watch\": \"rimraf ./lib && rollup -c -w\",\n    \"typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@react-pdf/pdfkit\": \"^4.1.0\",\n    \"@react-pdf/types\": \"^2.9.2\",\n    \"fontkit\": \"^2.0.2\",\n    \"is-url\": \"^1.2.4\"\n  },\n  \"files\": [\n    \"lib\"\n  ],\n  \"devDependencies\": {\n    \"@types/fontkit\": \"^2.0.7\",\n    \"@types/is-url\": \"^1.2.32\"\n  }\n}\n"
  },
  {
    "path": "packages/font/rollup.config.js",
    "content": "import { dts } from 'rollup-plugin-dts';\nimport del from 'rollup-plugin-delete';\nimport typescript from '@rollup/plugin-typescript';\n\nimport replace from '@rollup/plugin-replace';\n\nimport pkg from './package.json' with { type: 'json' };\n\nconst input = './src/index.ts';\n\nconst external = Object.keys(pkg.dependencies);\n\nconst getPlugins = ({ browser }) => [\n  typescript(),\n  replace({\n    preventAssignment: true,\n    values: {\n      BROWSER: JSON.stringify(browser),\n    },\n  }),\n];\n\nconst serverConfig = {\n  input,\n  output: { format: 'es', file: 'lib/index.js' },\n  external,\n  plugins: getPlugins({ browser: false }),\n};\n\nconst browserConfig = {\n  input,\n  output: { format: 'es', file: 'lib/index.browser.js' },\n  external,\n  plugins: getPlugins({ browser: true }),\n};\n\nconst dtsConfig = {\n  input: './lib/types/index.d.ts',\n  output: [{ file: 'lib/index.d.ts', format: 'es' }],\n  plugins: [dts(), del({ targets: 'lib/types', hook: 'buildEnd' })],\n};\n\nexport default [serverConfig, browserConfig, dtsConfig];\n"
  },
  {
    "path": "packages/font/src/font-family.ts",
    "content": "import FontSource from './font-source';\nimport { FontDescriptor, FontWeight, SingleLoad } from './types';\n\nconst FONT_WEIGHTS = {\n  thin: 100,\n  hairline: 100,\n  ultralight: 200,\n  extralight: 200,\n  light: 300,\n  normal: 400,\n  medium: 500,\n  semibold: 600,\n  demibold: 600,\n  bold: 700,\n  ultrabold: 800,\n  extrabold: 800,\n  heavy: 900,\n  black: 900,\n};\n\nconst resolveFontWeight = (value: FontWeight) => {\n  return typeof value === 'string' ? FONT_WEIGHTS[value] : value;\n};\n\nconst sortByFontWeight = (a: FontSource, b: FontSource) =>\n  a.fontWeight - b.fontWeight;\n\nclass FontFamily {\n  family: string;\n  sources: FontSource[];\n\n  static create(family: string) {\n    return new FontFamily(family);\n  }\n\n  constructor(family: string) {\n    this.family = family;\n    this.sources = [];\n  }\n\n  register({\n    src,\n    fontWeight,\n    fontStyle,\n    ...options\n  }: Omit<SingleLoad, 'family'>) {\n    const numericFontWeight = fontWeight\n      ? resolveFontWeight(fontWeight)\n      : undefined;\n\n    this.sources.push(\n      new FontSource(src, this.family, fontStyle, numericFontWeight, options),\n    );\n  }\n\n  resolve(descriptor: FontDescriptor) {\n    const { fontWeight = 400, fontStyle = 'normal' } = descriptor;\n    const styleSources = this.sources.filter((s) => s.fontStyle === fontStyle);\n\n    const exactFit = styleSources.find((s) => s.fontWeight === fontWeight);\n\n    if (exactFit) return exactFit;\n\n    // Weight resolution. https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight#Fallback_weights\n\n    let font: FontSource | null = null;\n\n    const numericFontWeight = resolveFontWeight(fontWeight);\n\n    if (numericFontWeight >= 400 && numericFontWeight <= 500) {\n      const leftOffset = styleSources.filter(\n        (s) => s.fontWeight <= numericFontWeight,\n      );\n\n      const rightOffset = styleSources.filter((s) => s.fontWeight > 500);\n\n      const fit = styleSources.filter(\n        (s) => s.fontWeight >= numericFontWeight && s.fontWeight <= 500,\n      );\n\n      font = fit[0] || leftOffset[leftOffset.length - 1] || rightOffset[0];\n    }\n\n    const lt = styleSources\n      .filter((s) => s.fontWeight < numericFontWeight)\n      .sort(sortByFontWeight);\n\n    const gt = styleSources\n      .filter((s) => s.fontWeight > numericFontWeight)\n      .sort(sortByFontWeight);\n\n    if (numericFontWeight < 400) {\n      font = lt[lt.length - 1] || gt[0];\n    }\n\n    if (numericFontWeight > 500) {\n      font = gt[0] || lt[lt.length - 1];\n    }\n\n    if (!font) {\n      throw new Error(\n        `Could not resolve font for ${this.family}, fontWeight ${fontWeight}, fontStyle ${fontStyle}`,\n      );\n    }\n\n    return font;\n  }\n}\n\nexport default FontFamily;\n"
  },
  {
    "path": "packages/font/src/font-source.ts",
    "content": "import isUrl from 'is-url';\nimport * as fontkit from 'fontkit';\n\nimport { Font, FontSourceOptions, FontStyle, RemoteOptions } from './types';\nimport StandardFont, { STANDARD_FONTS } from './standard-font';\n\nconst fetchFont = async (src: string, options: RemoteOptions) => {\n  const response = await fetch(src, options);\n\n  if (!response.ok) {\n    throw new Error(\n      `Failed to fetch font from ${src}: ${response.status} ${response.statusText}`,\n    );\n  }\n\n  const data = await response.arrayBuffer();\n\n  return new Uint8Array(data);\n};\n\nconst isDataUrl = (dataUrl: string) => {\n  const commaIndex = dataUrl.indexOf(',');\n  if (commaIndex === -1) return false;\n\n  const header = dataUrl.substring(0, commaIndex);\n  const hasDataPrefix = header.startsWith('data:');\n  const hasBase64Prefix = header.includes(';base64');\n\n  return hasDataPrefix && hasBase64Prefix;\n};\n\nclass FontSource {\n  src: string;\n  fontFamily: string;\n  fontStyle: FontStyle;\n  fontWeight: number;\n  data: Font | null;\n  options: FontSourceOptions;\n  loadResultPromise: Promise<void> | null;\n\n  constructor(\n    src: string,\n    fontFamily: string,\n    fontStyle?: FontStyle,\n    fontWeight?: number,\n    options?: FontSourceOptions,\n  ) {\n    this.src = src;\n    this.fontFamily = fontFamily;\n    this.fontStyle = fontStyle || 'normal';\n    this.fontWeight = fontWeight || 400;\n\n    this.data = null;\n    this.options = options || {};\n    this.loadResultPromise = null;\n  }\n\n  async _load(): Promise<void> {\n    const { postscriptName } = this.options;\n\n    let data = null;\n\n    if (STANDARD_FONTS.includes(this.src)) {\n      data = new StandardFont(this.src);\n    } else if (isDataUrl(this.src)) {\n      const raw = this.src.split(',')[1];\n      const uint8Array = new Uint8Array(\n        atob(raw)\n          .split('')\n          .map((c) => c.charCodeAt(0)),\n      );\n      data = fontkit.create(uint8Array, postscriptName);\n    } else if (BROWSER || isUrl(this.src)) {\n      const { headers, body, method = 'GET' } = this.options;\n      const buffer = await fetchFont(this.src, { method, body, headers });\n      data = fontkit.create(buffer, postscriptName);\n    } else if (!BROWSER) {\n      data = await fontkit.open(this.src, postscriptName);\n    }\n\n    if (data && 'fonts' in data) {\n      throw new Error('Font collection is not supported');\n    }\n\n    this.data = data;\n  }\n\n  async load() {\n    if (this.loadResultPromise === null) {\n      this.loadResultPromise = this._load();\n    }\n    return this.loadResultPromise;\n  }\n}\n\nexport default FontSource;\n"
  },
  {
    "path": "packages/font/src/index.ts",
    "content": "import FontFamily from './font-family';\n\nimport {\n  BulkLoad,\n  EmojiSource,\n  FontDescriptor,\n  HyphenationCallback,\n  SingleLoad,\n} from './types';\n\nclass FontStore {\n  fontFamilies: Record<string, FontFamily> = {};\n\n  emojiSource: EmojiSource | null = null;\n\n  constructor() {\n    this.register({\n      family: 'Helvetica',\n      fonts: [\n        { src: 'Helvetica', fontStyle: 'normal', fontWeight: 400 },\n        { src: 'Helvetica-Bold', fontStyle: 'normal', fontWeight: 700 },\n        { src: 'Helvetica-Oblique', fontStyle: 'italic', fontWeight: 400 },\n        { src: 'Helvetica-BoldOblique', fontStyle: 'italic', fontWeight: 700 },\n      ],\n    });\n\n    this.register({\n      family: 'Courier',\n      fonts: [\n        { src: 'Courier', fontStyle: 'normal', fontWeight: 400 },\n        { src: 'Courier-Bold', fontStyle: 'normal', fontWeight: 700 },\n        { src: 'Courier-Oblique', fontStyle: 'italic', fontWeight: 400 },\n        { src: 'Courier-BoldOblique', fontStyle: 'italic', fontWeight: 700 },\n      ],\n    });\n\n    this.register({\n      family: 'Times-Roman',\n      fonts: [\n        { src: 'Times-Roman', fontStyle: 'normal', fontWeight: 400 },\n        { src: 'Times-Bold', fontStyle: 'normal', fontWeight: 700 },\n        { src: 'Times-Italic', fontStyle: 'italic', fontWeight: 400 },\n        { src: 'Times-BoldItalic', fontStyle: 'italic', fontWeight: 700 },\n      ],\n    });\n\n    // For backwards compatibility\n\n    this.register({\n      family: 'Helvetica-Bold',\n      src: 'Helvetica-Bold',\n    });\n\n    this.register({\n      family: 'Helvetica-Oblique',\n      src: 'Helvetica-Oblique',\n    });\n\n    this.register({\n      family: 'Helvetica-BoldOblique',\n      src: 'Helvetica-BoldOblique',\n    });\n\n    this.register({\n      family: 'Courier-Bold',\n      src: 'Courier-Bold',\n    });\n\n    this.register({\n      family: 'Courier-Oblique',\n      src: 'Courier-Oblique',\n    });\n\n    this.register({\n      family: 'Courier-BoldOblique',\n      src: 'Courier-BoldOblique',\n    });\n\n    this.register({\n      family: 'Times-Bold',\n      src: 'Times-Bold',\n    });\n\n    this.register({\n      family: 'Times-Italic',\n      src: 'Times-Italic',\n    });\n\n    this.register({\n      family: 'Times-BoldItalic',\n      src: 'Times-BoldItalic',\n    });\n\n    // Load default fonts\n\n    this.load({\n      fontFamily: 'Helvetica',\n      fontStyle: 'normal',\n      fontWeight: 400,\n    });\n\n    this.load({\n      fontFamily: 'Helvetica',\n      fontStyle: 'normal',\n      fontWeight: 700,\n    });\n\n    this.load({\n      fontFamily: 'Helvetica',\n      fontStyle: 'italic',\n      fontWeight: 400,\n    });\n\n    this.load({\n      fontFamily: 'Helvetica',\n      fontStyle: 'italic',\n      fontWeight: 700,\n    });\n  }\n\n  hyphenationCallback: HyphenationCallback | null = null;\n\n  register = (data: SingleLoad | BulkLoad) => {\n    const { family } = data;\n\n    if (!this.fontFamilies[family]) {\n      this.fontFamilies[family] = FontFamily.create(family);\n    }\n\n    // Bulk loading\n    if ('fonts' in data) {\n      for (let i = 0; i < data.fonts.length; i += 1) {\n        const { src, fontStyle, fontWeight, ...options } = data.fonts[i];\n        this.fontFamilies[family].register({\n          src,\n          fontStyle,\n          fontWeight,\n          ...options,\n        });\n      }\n    } else {\n      const { src, fontStyle, fontWeight, ...options } = data;\n      this.fontFamilies[family].register({\n        src,\n        fontStyle,\n        fontWeight,\n        ...options,\n      });\n    }\n  };\n\n  registerEmojiSource = (emojiSource: EmojiSource) => {\n    this.emojiSource = emojiSource;\n  };\n\n  registerHyphenationCallback = (callback: HyphenationCallback) => {\n    this.hyphenationCallback = callback;\n  };\n\n  getFont = (descriptor: FontDescriptor) => {\n    const { fontFamily } = descriptor;\n\n    if (!this.fontFamilies[fontFamily]) {\n      throw new Error(\n        `Font family not registered: ${fontFamily}. Please register it calling Font.register() method.`,\n      );\n    }\n\n    return this.fontFamilies[fontFamily].resolve(descriptor);\n  };\n\n  load = async (descriptor: FontDescriptor) => {\n    const font = this.getFont(descriptor);\n    if (font) await font.load();\n  };\n\n  reset = () => {\n    const keys = Object.keys(this.fontFamilies);\n\n    for (let i = 0; i < keys.length; i += 1) {\n      const key = keys[i];\n      for (let j = 0; j < this.fontFamilies[key].sources.length; j++) {\n        const fontSource = this.fontFamilies[key].sources[j];\n        fontSource.data = null;\n      }\n    }\n  };\n\n  clear = () => {\n    this.fontFamilies = {};\n    this.emojiSource = null;\n    this.hyphenationCallback = null;\n  };\n\n  getRegisteredFonts = () => this.fontFamilies;\n\n  getEmojiSource = (): EmojiSource | null => this.emojiSource;\n\n  getHyphenationCallback = (): HyphenationCallback | null =>\n    this.hyphenationCallback;\n\n  getRegisteredFontFamilies = (): string[] => Object.keys(this.fontFamilies);\n}\n\nexport type FontStoreType = FontStore;\n\nexport * from './types';\n\nexport default FontStore;\n"
  },
  {
    "path": "packages/font/src/standard-font.ts",
    "content": "// @ts-expect-error ts being silly\nimport { PDFFont } from '@react-pdf/pdfkit';\nimport * as fontkit from 'fontkit';\nimport { Font } from './types';\n\nexport const STANDARD_FONTS = [\n  'Courier',\n  'Courier-Bold',\n  'Courier-Oblique',\n  'Courier-BoldOblique',\n  'Helvetica',\n  'Helvetica-Bold',\n  'Helvetica-Oblique',\n  'Helvetica-BoldOblique',\n  'Times-Roman',\n  'Times-Bold',\n  'Times-Italic',\n  'Times-BoldItalic',\n];\n\nclass StandardFont implements Font {\n  name: string;\n  src: any;\n  fullName: string;\n  familyName: string;\n  subfamilyName: string;\n  postscriptName: string;\n  copyright: string;\n  version: number;\n  underlinePosition: number;\n  underlineThickness: number;\n  italicAngle: number;\n  bbox: fontkit.BBOX;\n  'OS/2': fontkit.Os2Table;\n  hhea: fontkit.HHEA;\n  numGlyphs: number;\n  characterSet: number[];\n  availableFeatures: string[];\n  type: any;\n\n  constructor(src: string) {\n    this.name = src;\n    this.fullName = src;\n    this.familyName = src;\n    this.subfamilyName = src;\n    this.type = 'STANDARD';\n    this.postscriptName = src;\n    this.availableFeatures = [];\n    this.copyright = '';\n    this.version = 1;\n    this.underlinePosition = -100;\n    this.underlineThickness = 50;\n    this.italicAngle = 0;\n    this.bbox = {} as any;\n    this['OS/2'] = {} as any;\n    this.hhea = {} as any;\n    this.numGlyphs = 0;\n    this.characterSet = [];\n\n    this.src = PDFFont.open(null, src);\n  }\n\n  encode(str: string) {\n    return this.src.encode(str);\n  }\n\n  layout(str: string) {\n    const [encoded, positions] = this.encode(str);\n\n    const glyphs = encoded.map((g: any, i: any) => {\n      const glyph = this.getGlyph(parseInt(g, 16));\n      glyph.advanceWidth = positions[i].advanceWidth;\n      return glyph;\n    });\n\n    const advanceWidth = positions.reduce(\n      (acc: any, p: any) => acc + p.advanceWidth,\n      0,\n    );\n\n    return {\n      positions,\n      stringIndices: positions.map((_: any, i: any) => i),\n      glyphs,\n      script: 'latin',\n      language: 'dflt',\n      direction: 'ltr',\n      features: {},\n      advanceWidth,\n      advanceHeight: 0,\n      bbox: undefined as any,\n    };\n  }\n\n  glyphForCodePoint(codePoint: number) {\n    const glyph = this.getGlyph(codePoint);\n    glyph.advanceWidth = 400;\n    return glyph;\n  }\n\n  getGlyph(id: number): fontkit.Glyph {\n    return {\n      id,\n      codePoints: [id],\n      isLigature: false,\n      name: this.src.font.characterToGlyph(id),\n      _font: this.src,\n      // @ts-expect-error assign proper value\n      advanceWidth: undefined,\n    };\n  }\n\n  hasGlyphForCodePoint(codePoint: number) {\n    return this.src.font.characterToGlyph(codePoint) !== '.notdef';\n  }\n\n  // Based on empirical observation\n  get ascent() {\n    return 900;\n  }\n\n  // Based on empirical observation\n  get capHeight() {\n    switch (this.name) {\n      case 'Times-Roman':\n      case 'Times-Bold':\n      case 'Times-Italic':\n      case 'Times-BoldItalic':\n        return 650;\n      case 'Courier':\n      case 'Courier-Bold':\n      case 'Courier-Oblique':\n      case 'Courier-BoldOblique':\n        return 550;\n      default:\n        return 690;\n    }\n  }\n\n  // Based on empirical observation\n  get xHeight() {\n    switch (this.name) {\n      case 'Times-Roman':\n      case 'Times-Bold':\n      case 'Times-Italic':\n      case 'Times-BoldItalic':\n        return 440;\n      case 'Courier':\n      case 'Courier-Bold':\n      case 'Courier-Oblique':\n      case 'Courier-BoldOblique':\n        return 390;\n      default:\n        return 490;\n    }\n  }\n\n  // Based on empirical observation\n  get descent() {\n    switch (this.name) {\n      case 'Times-Roman':\n      case 'Times-Bold':\n      case 'Times-Italic':\n      case 'Times-BoldItalic':\n        return -220;\n      case 'Courier':\n      case 'Courier-Bold':\n      case 'Courier-Oblique':\n      case 'Courier-BoldOblique':\n        return -230;\n      default:\n        return -200;\n    }\n  }\n\n  get lineGap() {\n    return 0;\n  }\n\n  get unitsPerEm() {\n    return 1000;\n  }\n\n  stringsForGlyph(): string[] {\n    throw new Error('Method not implemented.');\n  }\n\n  glyphsForString(): fontkit.Glyph[] {\n    throw new Error('Method not implemented.');\n  }\n\n  widthOfGlyph(): number {\n    throw new Error('Method not implemented.');\n  }\n\n  getAvailableFeatures(): string[] {\n    throw new Error('Method not implemented.');\n  }\n\n  createSubset(): fontkit.Subset {\n    throw new Error('Method not implemented.');\n  }\n\n  getVariation(): any {\n    throw new Error('Method not implemented.');\n  }\n\n  getFont(): any {\n    throw new Error('Method not implemented.');\n  }\n\n  getName(): string | null {\n    throw new Error('Method not implemented.');\n  }\n\n  setDefaultLanguage(): void {\n    throw new Error('Method not implemented.');\n  }\n}\n\nexport default StandardFont;\n"
  },
  {
    "path": "packages/font/src/types.ts",
    "content": "import * as fontkit from 'fontkit';\n\nexport type Font = Omit<fontkit.Font, 'type'> & {\n  type: 'TTF' | 'WOFF' | 'WOFF2' | 'STANDARD';\n  encode?: (string: string) => number[];\n};\n\nexport type FontStyle = 'normal' | 'italic' | 'oblique';\n\nexport type FontWeight =\n  | number\n  | 'thin'\n  | 'hairline'\n  | 'ultralight'\n  | 'extralight'\n  | 'light'\n  | 'normal'\n  | 'medium'\n  | 'semibold'\n  | 'demibold'\n  | 'bold'\n  | 'ultrabold'\n  | 'extrabold'\n  | 'heavy'\n  | 'black';\n\nexport type FontDescriptor = {\n  fontFamily: string;\n  fontStyle?: FontStyle;\n  fontWeight?: FontWeight;\n};\n\nexport type RemoteOptions = {\n  method?: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n  headers?: Record<string, string>;\n  body?: any;\n};\n\nexport type FontSourceOptions = {\n  postscriptName?: string;\n} & RemoteOptions;\n\nexport type FontSource = {\n  src: string;\n  fontStyle?: FontStyle;\n  fontWeight?: FontWeight;\n} & FontSourceOptions;\n\nexport type SingleLoad = {\n  family: string;\n} & FontSource;\n\nexport type BulkLoad = {\n  family: string;\n  fonts: FontSource[];\n};\n\ninterface EmojiSourceUrl {\n  url: string;\n  format?: string;\n  withVariationSelectors?: boolean;\n}\n\ninterface EmojiSourceBuilder {\n  builder: (code: string) => string;\n  withVariationSelectors?: boolean;\n}\n\nexport type EmojiSource = EmojiSourceUrl | EmojiSourceBuilder;\n\nexport type HyphenationCallback = (word: string) => string[];\n"
  },
  {
    "path": "packages/font/tests/fallback-weights.test.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport FontStore from '../src';\n\ndescribe('fallback weights', () => {\n  it('should return exact match when available', () => {\n    const fontStore = new FontStore();\n\n    fontStore.register({\n      family: 'Roboto',\n      fontStyle: 'normal',\n      fontWeight: 400,\n      src: 'https://example.com/Roboto-normal-400.ttf',\n    });\n\n    fontStore.register({\n      family: 'Roboto',\n      fontStyle: 'normal',\n      fontWeight: 700,\n      src: 'https://example.com/Roboto-normal-700.ttf',\n    });\n\n    const font = fontStore.getFont({\n      fontFamily: 'Roboto',\n      fontWeight: 400,\n    });\n\n    expect(font?.src).toBe('https://example.com/Roboto-normal-400.ttf');\n  });\n\n  it('should resolve string weight names', () => {\n    const fontStore = new FontStore();\n\n    fontStore.register({\n      family: 'Roboto',\n      fontStyle: 'normal',\n      fontWeight: 'bold',\n      src: 'https://example.com/Roboto-bold.ttf',\n    });\n\n    fontStore.register({\n      family: 'Roboto',\n      fontStyle: 'normal',\n      fontWeight: 'thin',\n      src: 'https://example.com/Roboto-thin.ttf',\n    });\n\n    const bold = fontStore.getFont({\n      fontFamily: 'Roboto',\n      fontWeight: 700,\n    });\n\n    const thin = fontStore.getFont({\n      fontFamily: 'Roboto',\n      fontWeight: 100,\n    });\n\n    expect(bold?.src).toBe('https://example.com/Roboto-bold.ttf');\n    expect(thin?.src).toBe('https://example.com/Roboto-thin.ttf');\n  });\n\n  it('should filter by font style', () => {\n    const fontStore = new FontStore();\n\n    fontStore.register({\n      family: 'Roboto',\n      fontStyle: 'normal',\n      fontWeight: 400,\n      src: 'https://example.com/Roboto-normal.ttf',\n    });\n\n    fontStore.register({\n      family: 'Roboto',\n      fontStyle: 'italic',\n      fontWeight: 400,\n      src: 'https://example.com/Roboto-italic.ttf',\n    });\n\n    const normal = fontStore.getFont({\n      fontFamily: 'Roboto',\n      fontStyle: 'normal',\n    });\n\n    const italic = fontStore.getFont({\n      fontFamily: 'Roboto',\n      fontStyle: 'italic',\n    });\n\n    expect(normal?.src).toBe('https://example.com/Roboto-normal.ttf');\n    expect(italic?.src).toBe('https://example.com/Roboto-italic.ttf');\n  });\n\n  it('should throw when no font can be resolved for style', () => {\n    const fontStore = new FontStore();\n\n    fontStore.register({\n      family: 'Roboto',\n      fontStyle: 'normal',\n      fontWeight: 400,\n      src: 'https://example.com/Roboto-normal.ttf',\n    });\n\n    expect(() =>\n      fontStore.getFont({\n        fontFamily: 'Roboto',\n        fontStyle: 'italic',\n      }),\n    ).toThrow();\n  });\n\n  describe('if the target weight given is between 400 and 500 inclusive', () => {\n    it('look for available weights between the target and 500 in ascending order', () => {\n      const fontStore = new FontStore();\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 200,\n        src: 'https://example.com/Roboto-normal-200.ttf',\n      });\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 420,\n        src: 'https://example.com/Roboto-normal-420.ttf',\n      });\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 470,\n        src: 'https://example.com/Roboto-normal-470.ttf',\n      });\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 600,\n        src: 'https://example.com/Roboto-normal-600.ttf',\n      });\n\n      const font = fontStore.getFont({\n        fontFamily: 'Roboto',\n        fontWeight: 450,\n      });\n\n      expect(font?.src).toBe('https://example.com/Roboto-normal-470.ttf');\n    });\n\n    it('if no match is found, look for available weights less than the target, in descending order', () => {\n      const fontStore = new FontStore();\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 100,\n        src: 'https://example.com/Roboto-normal-100.ttf',\n      });\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 200,\n        src: 'https://example.com/Roboto-normal-200.ttf',\n      });\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 600,\n        src: 'https://example.com/Roboto-normal-600.ttf',\n      });\n\n      const font = fontStore.getFont({\n        fontFamily: 'Roboto',\n        fontWeight: 450,\n      });\n\n      expect(font?.src).toBe('https://example.com/Roboto-normal-200.ttf');\n    });\n\n    it('if no match is found, look for available weights greater than 500, in ascending order.', () => {\n      const fontStore = new FontStore();\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 600,\n        src: 'https://example.com/Roboto-normal-600.ttf',\n      });\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 700,\n        src: 'https://example.com/Roboto-normal-700.ttf',\n      });\n\n      const font = fontStore.getFont({\n        fontFamily: 'Roboto',\n        fontWeight: 450,\n      });\n\n      expect(font?.src).toBe('https://example.com/Roboto-normal-600.ttf');\n    });\n  });\n\n  describe('if a weight less than 400 is given', () => {\n    it('look for available weights less than the target, in descending order.', () => {\n      const fontStore = new FontStore();\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 100,\n        src: 'https://example.com/Roboto-normal-100.ttf',\n      });\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 200,\n        src: 'https://example.com/Roboto-normal-200.ttf',\n      });\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 500,\n        src: 'https://example.com/Roboto-normal-500.ttf',\n      });\n\n      const font = fontStore.getFont({\n        fontFamily: 'Roboto',\n        fontWeight: 300,\n      });\n\n      expect(font?.src).toBe('https://example.com/Roboto-normal-200.ttf');\n    });\n\n    it('if no match is found, look for available weights greater than the target, in ascending order', () => {\n      const fontStore = new FontStore();\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 500,\n        src: 'https://example.com/Roboto-normal-500.ttf',\n      });\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 600,\n        src: 'https://example.com/Roboto-normal-600.ttf',\n      });\n\n      const font = fontStore.getFont({\n        fontFamily: 'Roboto',\n        fontWeight: 300,\n      });\n\n      expect(font?.src).toBe('https://example.com/Roboto-normal-500.ttf');\n    });\n  });\n\n  describe('if a weight greater than 500 is given', () => {\n    it('look for available weights greater than the target, in ascending order', () => {\n      const fontStore = new FontStore();\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 200,\n        src: 'https://example.com/Roboto-normal-200.ttf',\n      });\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 700,\n        src: 'https://example.com/Roboto-normal-700.ttf',\n      });\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 800,\n        src: 'https://example.com/Roboto-normal-800.ttf',\n      });\n\n      const font = fontStore.getFont({\n        fontFamily: 'Roboto',\n        fontWeight: 600,\n      });\n\n      expect(font?.src).toBe('https://example.com/Roboto-normal-700.ttf');\n    });\n\n    it('if no match is found, look for available weights less than the target, in descending order', () => {\n      const fontStore = new FontStore();\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 100,\n        src: 'https://example.com/Roboto-normal-100.ttf',\n      });\n\n      fontStore.register({\n        family: 'Roboto',\n        fontStyle: 'normal',\n        fontWeight: 200,\n        src: 'https://example.com/Roboto-normal-200.ttf',\n      });\n\n      const font = fontStore.getFont({\n        fontFamily: 'Roboto',\n        fontWeight: 600,\n      });\n\n      expect(font?.src).toBe('https://example.com/Roboto-normal-200.ttf');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/font/tests/font-store.test.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport FontStore from '../src/index';\n\ndescribe('font store', () => {\n  it('should create font store', () => {\n    const fontStore = new FontStore();\n    expect(fontStore).toBeTruthy();\n  });\n\n  it('should throw if font is not registered', () => {\n    const fontStore = new FontStore();\n    expect(() => fontStore.getFont({ fontFamily: 'Roboto' })).toThrow();\n  });\n\n  it('should register single font', () => {\n    const fontStore = new FontStore();\n\n    fontStore.register({\n      family: 'Roboto',\n      src: 'https://example.com/Roboto-Regular.ttf',\n    });\n\n    const font = fontStore.getFont({ fontFamily: 'Roboto' });\n\n    expect(font).toBeTruthy();\n  });\n\n  it('should use default weight and style if not passed', () => {\n    const fontStore = new FontStore();\n\n    fontStore.register({\n      family: 'Roboto',\n      src: 'https://example.com/Roboto-Regular.ttf',\n    });\n\n    const font = fontStore.getFont({ fontFamily: 'Roboto' });\n\n    expect(font?.fontWeight).toBe(400);\n    expect(font?.fontStyle).toBe('normal');\n  });\n\n  it('should register font with style and weight', () => {\n    const fontStore = new FontStore();\n\n    fontStore.register({\n      family: 'Roboto',\n      fontStyle: 'italic',\n      fontWeight: 700,\n      src: 'https://example.com/Roboto-BoldItalic.ttf',\n    });\n\n    const font = fontStore.getFont({\n      fontFamily: 'Roboto',\n      fontStyle: 'italic',\n      fontWeight: 700,\n    });\n\n    expect(font?.fontWeight).toBe(700);\n    expect(font?.fontStyle).toBe('italic');\n    expect(font?.src).toBe('https://example.com/Roboto-BoldItalic.ttf');\n  });\n\n  it('should register fonts in bulk', () => {\n    const fontStore = new FontStore();\n\n    fontStore.register({\n      family: 'Roboto',\n      fonts: [\n        {\n          src: 'https://example.com/Roboto-Regular.ttf',\n        },\n        {\n          src: 'https://example.com/Roboto-Bold.ttf',\n          fontWeight: 700,\n        },\n      ],\n    });\n\n    const regular = fontStore.getFont({ fontFamily: 'Roboto' });\n    const bold = fontStore.getFont({ fontFamily: 'Roboto', fontWeight: 700 });\n\n    expect(regular?.fontWeight).toBe(400);\n    expect(bold?.fontWeight).toBe(700);\n  });\n\n  it('should have standard fonts pre-registered', () => {\n    const fontStore = new FontStore();\n\n    expect(() => fontStore.getFont({ fontFamily: 'Helvetica' })).not.toThrow();\n    expect(() => fontStore.getFont({ fontFamily: 'Courier' })).not.toThrow();\n    expect(() =>\n      fontStore.getFont({ fontFamily: 'Times-Roman' }),\n    ).not.toThrow();\n  });\n\n  it('should register and get emoji source', () => {\n    const fontStore = new FontStore();\n    const emojiSource = { url: 'https://example.com/emoji' };\n\n    expect(fontStore.getEmojiSource()).toBeNull();\n\n    fontStore.registerEmojiSource(emojiSource);\n\n    expect(fontStore.getEmojiSource()).toBe(emojiSource);\n  });\n\n  it('should register and get hyphenation callback', () => {\n    const fontStore = new FontStore();\n    const callback = (word: string) => [word];\n\n    expect(fontStore.getHyphenationCallback()).toBeNull();\n\n    fontStore.registerHyphenationCallback(callback);\n\n    expect(fontStore.getHyphenationCallback()).toBe(callback);\n  });\n\n  it('should get registered fonts', () => {\n    const fontStore = new FontStore();\n\n    fontStore.register({\n      family: 'Roboto',\n      src: 'https://example.com/Roboto-Regular.ttf',\n    });\n\n    const fonts = fontStore.getRegisteredFonts();\n\n    expect(fonts.Roboto).toBeTruthy();\n  });\n\n  it('should get registered font families', () => {\n    const fontStore = new FontStore();\n\n    const families = fontStore.getRegisteredFontFamilies();\n\n    expect(families).toContain('Helvetica');\n    expect(families).toContain('Courier');\n    expect(families).toContain('Times-Roman');\n  });\n\n  it('should clear all registered fonts and callbacks', () => {\n    const fontStore = new FontStore();\n\n    fontStore.register({\n      family: 'Roboto',\n      src: 'https://example.com/Roboto-Regular.ttf',\n    });\n    fontStore.registerEmojiSource({ url: 'https://example.com/emoji' });\n    fontStore.registerHyphenationCallback((word) => [word]);\n\n    fontStore.clear();\n\n    expect(fontStore.getRegisteredFontFamilies()).toHaveLength(0);\n    expect(fontStore.getEmojiSource()).toBeNull();\n    expect(fontStore.getHyphenationCallback()).toBeNull();\n  });\n});\n"
  },
  {
    "path": "packages/font/tests/standard-fonts.test.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport FontStore from '../src/index';\n\ndescribe('standard fonts', () => {\n  it('should resolve courier', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Courier' });\n\n    expect(font.src).toBe('Courier');\n  });\n\n  it('should resolve bold courier', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Courier',\n      fontWeight: 700,\n    });\n\n    expect(font.src).toBe('Courier-Bold');\n  });\n\n  it('should resolve italic courier', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Courier',\n      fontStyle: 'italic',\n    });\n\n    expect(font.src).toBe('Courier-Oblique');\n  });\n\n  it('should resolve bold italic courier', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Courier',\n      fontWeight: 700,\n      fontStyle: 'italic',\n    });\n\n    expect(font.src).toBe('Courier-BoldOblique');\n  });\n\n  it('should resolve courier normal weight', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Courier',\n      fontWeight: 400,\n    });\n\n    expect(font.src).toBe('Courier');\n  });\n\n  it('should resolve courier missing font weight', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Courier',\n      fontWeight: 600,\n    });\n\n    expect(font.src).toBe('Courier-Bold');\n  });\n\n  it('should resolve times', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Times-Roman' });\n\n    expect(font.src).toBe('Times-Roman');\n  });\n\n  it('should resolve bold times', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Times-Roman',\n      fontWeight: 700,\n    });\n\n    expect(font.src).toBe('Times-Bold');\n  });\n\n  it('should resolve italic times', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Times-Roman',\n      fontStyle: 'italic',\n    });\n\n    expect(font.src).toBe('Times-Italic');\n  });\n\n  it('should resolve bold italic times', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Times-Roman',\n      fontWeight: 700,\n      fontStyle: 'italic',\n    });\n\n    expect(font.src).toBe('Times-BoldItalic');\n  });\n\n  it('should resolve times normal weight', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Times-Roman',\n      fontWeight: 400,\n    });\n\n    expect(font.src).toBe('Times-Roman');\n  });\n\n  it('should resolve times missing font weight', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Times-Roman',\n      fontWeight: 600,\n    });\n\n    expect(font.src).toBe('Times-Bold');\n  });\n\n  it('should resolve helvetica', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Helvetica' });\n\n    expect(font.src).toBe('Helvetica');\n  });\n\n  it('should resolve bold helvetica', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Helvetica',\n      fontWeight: 700,\n    });\n\n    expect(font.src).toBe('Helvetica-Bold');\n  });\n\n  it('should resolve italic helvetica', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Helvetica',\n      fontStyle: 'italic',\n    });\n\n    expect(font.src).toBe('Helvetica-Oblique');\n  });\n\n  it('should resolve bold italic helvetica', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Helvetica',\n      fontWeight: 700,\n      fontStyle: 'italic',\n    });\n\n    expect(font.src).toBe('Helvetica-BoldOblique');\n  });\n\n  it('should resolve helvetica normal weight', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Helvetica',\n      fontWeight: 400,\n    });\n\n    expect(font.src).toBe('Helvetica');\n  });\n\n  it('should resolve helvetica missing font weight', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({\n      fontFamily: 'Helvetica',\n      fontWeight: 600,\n    });\n\n    expect(font.src).toBe('Helvetica-Bold');\n  });\n\n  it('should resolve legacy courier bold', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Courier-Bold' });\n\n    expect(font.src).toBe('Courier-Bold');\n  });\n\n  it('should resolve legacy courier oblique', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Courier-Oblique' });\n\n    expect(font.src).toBe('Courier-Oblique');\n  });\n\n  it('should resolve legacy courier bold oblique', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Courier-BoldOblique' });\n\n    expect(font.src).toBe('Courier-BoldOblique');\n  });\n\n  it('should resolve legacy times bold', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Times-Bold' });\n\n    expect(font.src).toBe('Times-Bold');\n  });\n\n  it('should resolve legacy times italic', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Times-Italic' });\n\n    expect(font.src).toBe('Times-Italic');\n  });\n\n  it('should resolve legacy times bold italic', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Times-BoldItalic' });\n\n    expect(font.src).toBe('Times-BoldItalic');\n  });\n\n  it('should resolve legacy helvetica bold', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Helvetica-Bold' });\n\n    expect(font.src).toBe('Helvetica-Bold');\n  });\n\n  it('should resolve legacy helvetica oblique', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Helvetica-Oblique' });\n\n    expect(font.src).toBe('Helvetica-Oblique');\n  });\n\n  it('should resolve legacy helvetica bold oblique', () => {\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Helvetica-BoldOblique' });\n\n    expect(font.src).toBe('Helvetica-BoldOblique');\n  });\n\n  it('should resolve advanceWidth of soft hyphen to be zero', () => {\n    const SOFT_HYPHEN = '\\u00AD';\n    const fontStore = new FontStore();\n\n    const font = fontStore.getFont({ fontFamily: 'Helvetica' });\n\n    expect(font.data!.encode!(SOFT_HYPHEN)[1][0].advanceWidth).toBe(0);\n  });\n});\n"
  },
  {
    "path": "packages/font/tsconfig.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"compilerOptions\": {\n    \"outDir\": \"lib\",\n    \"declaration\": true,\n    \"declarationDir\": \"lib/types\",\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2022\", \"DOM\"],\n    \"moduleResolution\": \"Node\",\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"types\": [\"vitest/globals\"],\n  },\n  \"include\": [\"src\", \"**/*.d.ts\"],\n}\n"
  },
  {
    "path": "packages/image/.gitignore",
    "content": "lib\n"
  },
  {
    "path": "packages/image/CHANGELOG.md",
    "content": "# @react-pdf/image\n\n## 3.0.4\n\n### Patch Changes\n\n- [#3183](https://github.com/diegomura/react-pdf/pull/3183) [`a5979c15`](https://github.com/diegomura/react-pdf/commit/a5979c1568761107076172e4c1843e66f62a08ab) Thanks [@thgh](https://github.com/thgh)! - Fix resolving images with special characters like space in filename\n\n- [#3264](https://github.com/diegomura/react-pdf/pull/3264) [`04922fea`](https://github.com/diegomura/react-pdf/commit/04922fea2e60930ac550ec31beaeb7f20551cf63) Thanks [@diegomura](https://github.com/diegomura)! - feat(image): various improvements\n\n## 3.0.3\n\n### Patch Changes\n\n- [#3094](https://github.com/diegomura/react-pdf/pull/3094) [`3fb01a90`](https://github.com/diegomura/react-pdf/commit/3fb01a90e590a31c097b3422fc911af61d65420a) Thanks [@diegomura](https://github.com/diegomura)! - refactor: image strict type checking\n\n- [#3092](https://github.com/diegomura/react-pdf/pull/3092) [`481b536f`](https://github.com/diegomura/react-pdf/commit/481b536f4ad145fb227829399b85a35838a506f8) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert layout package to TS\n\n## 3.0.2\n\n### Patch Changes\n\n- [#3078](https://github.com/diegomura/react-pdf/pull/3078) [`8d39fc46`](https://github.com/diegomura/react-pdf/commit/8d39fc4602730755ee63824ad4ed6ecd1bcd059f) Thanks [@diegomura](https://github.com/diegomura)! - fix: add types to image package.json\n\n## 3.0.1\n\n### Patch Changes\n\n- [#2947](https://github.com/diegomura/react-pdf/pull/2947) [`ed562b9b`](https://github.com/diegomura/react-pdf/commit/ed562b9b7f14bc76a1cd83aaaf1dab966bd7540b) Thanks [@diegomura](https://github.com/diegomura)! - feat: remove cross-fetch\n\n## 3.0.0\n\n### Major Changes\n\n- [#2871](https://github.com/diegomura/react-pdf/pull/2871) [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119) Thanks [@diegomura](https://github.com/diegomura)! - feat!: drop cjs support\n\n### Patch Changes\n\n- [#2877](https://github.com/diegomura/react-pdf/pull/2877) [`fdcef566`](https://github.com/diegomura/react-pdf/commit/fdcef5666e4eeed542b625d394cdfe60d6346600) Thanks [@Friendseeker](https://github.com/Friendseeker)! - chore: bump jay-peg\n\n- Updated dependencies [[`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119)]:\n  - @react-pdf/png-js@3.0.0\n\n## 2.3.6\n\n### Patch Changes\n\n- [#2687](https://github.com/diegomura/react-pdf/pull/2687) [`68bfc57`](https://github.com/diegomura/react-pdf/commit/68bfc575adfb95302e320019715d1eec5398259f) Thanks [@diegomura](https://github.com/diegomura)! - chore: bump jay-peg\n\n## 2.3.5\n\n### Patch Changes\n\n- [#2635](https://github.com/diegomura/react-pdf/pull/2635) [`da10a9b`](https://github.com/diegomura/react-pdf/commit/da10a9bb43dc4c4765687850444a24cbc4eb402a) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - fix: bump jay-peg dependency to fix CJS module resolution error\n\n## 2.3.4\n\n### Patch Changes\n\n- [#2605](https://github.com/diegomura/react-pdf/pull/2605) [`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - fix: fix CJS compatibility\n\n- Updated dependencies [[`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71)]:\n  - @react-pdf/png-js@2.3.1\n\n## 2.3.3\n\n### Patch Changes\n\n- [#2573](https://github.com/diegomura/react-pdf/pull/2573) [`9af07fe`](https://github.com/diegomura/react-pdf/commit/9af07feb59c2fe9c1d8960ac95f6fa6e03d16235) Thanks [@davbrito](https://github.com/davbrito)! - feat: add support for resolving blob images\n\n- [#2600](https://github.com/diegomura/react-pdf/pull/2600) [`8350154`](https://github.com/diegomura/react-pdf/commit/83501541e3a050021e18e112bb472b2dabc142a7) Thanks [@diegomura](https://github.com/diegomura)! - feat: bidi support\n\n## 2.3.2\n\n### Patch Changes\n\n- [`0590324`](https://github.com/diegomura/react-pdf/commit/0590324d7a6d75c0a49520b3f99cfb6594239390) Thanks [@diegomura](https://github.com/diegomura)! - fix: replace jpeg-exif with jay-peg\n\n## 2.3.1\n\n### Patch Changes\n\n- [#2529](https://github.com/diegomura/react-pdf/pull/2529) [`a35b1ba`](https://github.com/diegomura/react-pdf/commit/a35b1ba18d293df51293600d8d56015094d222d8) Thanks [@diegomura](https://github.com/diegomura)! - fix: jpeg exif orientation rendering\n\n## 2.3.0\n\n### Minor Changes\n\n- [#2409](https://github.com/diegomura/react-pdf/pull/2409) [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Add support for native ESM\n\n### Patch Changes\n\n- Updated dependencies [[`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37)]:\n  - @react-pdf/png-js@2.3.0\n\n## 2.2.3\n\n### Patch Changes\n\n- [#2479](https://github.com/diegomura/react-pdf/pull/2479) [`45b2bd3`](https://github.com/diegomura/react-pdf/commit/45b2bd37037c605727ad5783f2f2a438dc19cac4) Thanks [@diegomura](https://github.com/diegomura)! - fix linting\n\n## 2.2.2\n\n### Patch Changes\n\n- [#2130](https://github.com/diegomura/react-pdf/pull/2130) [`4a55c1b`](https://github.com/diegomura/react-pdf/commit/4a55c1b2ed19e460ccae6e749ed94c16729a23c4) Thanks [@PoornakumarRasiraju](https://github.com/PoornakumarRasiraju)! - fix: allow credentials option in Image\n\n## 2.2.1\n\n### Patch Changes\n\n- [#2205](https://github.com/diegomura/react-pdf/pull/2205) [`9a5e0be`](https://github.com/diegomura/react-pdf/commit/9a5e0befb89756db07ce053192a136df9d4ba905) Thanks [@jeetiss](https://github.com/jeetiss)! - update babel\n\n## 2.2.0\n\n### Minor Changes\n\n- [#1891](https://github.com/diegomura/react-pdf/pull/1891) [`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - feat: compatibility with modern web bundlers and browsers\n\n### Patch Changes\n\n- Updated dependencies [[`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81), [`001a208`](https://github.com/diegomura/react-pdf/commit/001a20812fa039d09931b22eb97a8869e3b31cc5)]:\n  - @react-pdf/png-js@2.2.0\n\n## 2.1.1\n\n### Patch Changes\n\n- [#1685](https://github.com/diegomura/react-pdf/pull/1685) [`90ab2f8`](https://github.com/diegomura/react-pdf/commit/90ab2f8c040afc3d42961404bdf2ae09fac599eb) Thanks [@jeetiss](https://github.com/jeetiss)! - updated cross-fetch\n\n## 2.1.0\n\n### Minor Changes\n\n- [#1610](https://github.com/diegomura/react-pdf/pull/1610) [`4c5d527`](https://github.com/diegomura/react-pdf/commit/4c5d52721d29d843f1d09c3fd74370832429f70e) Thanks [@jeetiss](https://github.com/jeetiss)! - updated rollup rollup-plugins and babel\n\n* [#1654](https://github.com/diegomura/react-pdf/pull/1654) [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b) Thanks [@jeetiss](https://github.com/jeetiss)! - added `@babel/runtime` to dependencies\n\n### Patch Changes\n\n- [#1581](https://github.com/diegomura/react-pdf/pull/1581) [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca) Thanks [@jeetiss](https://github.com/jeetiss)! - added changelog with changesets\n\n- Updated dependencies [[`4c5d527`](https://github.com/diegomura/react-pdf/commit/4c5d52721d29d843f1d09c3fd74370832429f70e), [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca)]:\n  - @react-pdf/png-js@2.1.0\n"
  },
  {
    "path": "packages/image/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n# @react-pdf/image\n\nImage parsing and resolution library for react-pdf. Handles PNG and JPEG images from various sources including local files, remote URLs, base64 data URIs, buffers, and blobs.\n\n## Installation\n\n```bash\nyarn add @react-pdf/image\n```\n\n## Usage\n\n```js\nimport resolveImage from '@react-pdf/image';\n\nconst image = await resolveImage({ uri: './path/to/image.png' });\n\nconsole.log(image.width); // Image width in pixels\nconsole.log(image.height); // Image height in pixels\nconsole.log(image.format); // 'png' or 'jpeg'\nconsole.log(image.data); // Buffer containing image data\n```\n\n## Image Sources\n\nThe library supports multiple image source types:\n\n### Local File\n\n```js\nconst image = await resolveImage({ uri: './image.png' });\n// or\nconst image = await resolveImage({ uri: '/absolute/path/to/image.jpg' });\n```\n\n> **Note:** Local file resolution is only available in Node.js environments.\n\n### Remote URL\n\n```js\nconst image = await resolveImage({ uri: 'https://example.com/image.png' });\n```\n\nWith custom request options:\n\n```js\nconst image = await resolveImage({\n  uri: 'https://example.com/image.png',\n  method: 'GET',\n  headers: {\n    Authorization: 'Bearer token',\n  },\n  body: null,\n  credentials: 'include',\n});\n```\n\n### Base64 Data URI\n\n```js\nconst image = await resolveImage({\n  uri: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==',\n});\n```\n\n### Buffer\n\n```js\nimport fs from 'fs';\n\nconst buffer = fs.readFileSync('./image.png');\nconst image = await resolveImage(buffer);\n```\n\n### Blob (Browser)\n\n```js\nconst response = await fetch('https://example.com/image.png');\nconst blob = await response.blob();\nconst image = await resolveImage(blob);\n```\n\n### Data Object\n\n```js\nconst image = await resolveImage({\n  data: imageBuffer,\n  format: 'png', // 'png', 'jpg', or 'jpeg'\n});\n```\n\n## Caching\n\nImages are cached by default to avoid redundant processing. You can disable caching for individual requests:\n\n```js\nconst image = await resolveImage({ uri: './image.png' }, { cache: false });\n```\n\nThe cache has a default limit of 30 entries and uses LRU (Least Recently Used) eviction.\n\n## Types\n\n### Image\n\nThe resolved image object:\n\n```ts\ninterface Image {\n  width: number;\n  height: number;\n  data: Buffer;\n  format: 'jpeg' | 'png';\n  key?: string;\n}\n```\n\n### ImageSrc\n\nAll supported image source types:\n\n```ts\ntype ImageSrc =\n  | Blob\n  | Buffer\n  | DataImageSrc\n  | LocalImageSrc\n  | RemoteImageSrc\n  | Base64ImageSrc;\n\ntype DataImageSrc = {\n  data: Buffer;\n  format: 'jpg' | 'jpeg' | 'png';\n};\n\ntype LocalImageSrc = {\n  uri: string;\n  format?: 'jpg' | 'jpeg' | 'png';\n};\n\ntype RemoteImageSrc = {\n  uri: string;\n  method?: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n  headers?: Record<string, string>;\n  format?: 'jpg' | 'jpeg' | 'png';\n  body?: any;\n  credentials?: 'omit' | 'same-origin' | 'include';\n};\n\ntype Base64ImageSrc = {\n  uri: `data:image${string}`;\n};\n```\n\n## Supported Formats\n\n- **PNG** - Portable Network Graphics\n- **JPEG/JPG** - Joint Photographic Experts Group\n\nJPEG images with EXIF orientation data are automatically handled, with width and height adjusted accordingly.\n\n## License\n\nMIT\n"
  },
  {
    "path": "packages/image/declarations.d.ts",
    "content": "declare module 'jay-peg' {\n  export function decode(data: Buffer): any;\n  export default { decode };\n}\n\ndeclare module '@react-pdf/png-js' {\n  class PNG {\n    constructor(data: Buffer);\n    width: number;\n    height: number;\n  }\n\n  export default PNG;\n}\n"
  },
  {
    "path": "packages/image/globals.d.ts",
    "content": "declare global {\n  const BROWSER: boolean;\n}\n\nexport {};\n"
  },
  {
    "path": "packages/image/package.json",
    "content": "{\n  \"name\": \"@react-pdf/image\",\n  \"version\": \"3.0.4\",\n  \"license\": \"MIT\",\n  \"description\": \"Parses the images in png or jpeg format for react-pdf document\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"type\": \"module\",\n  \"main\": \"./lib/index.js\",\n  \"types\": \"./lib/index.d.ts\",\n  \"browser\": {\n    \"./lib/index.js\": \"./lib/index.browser.js\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/image\"\n  },\n  \"scripts\": {\n    \"test\": \"vitest\",\n    \"build\": \"rimraf ./lib && rollup -c\",\n    \"watch\": \"rimraf ./lib && rollup -c -w\",\n    \"typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@react-pdf/png-js\": \"^3.0.0\",\n    \"jay-peg\": \"^1.1.1\"\n  },\n  \"files\": [\n    \"lib\"\n  ]\n}\n"
  },
  {
    "path": "packages/image/rollup.config.js",
    "content": "import { dts } from 'rollup-plugin-dts';\nimport del from 'rollup-plugin-delete';\nimport typescript from '@rollup/plugin-typescript';\nimport replace from '@rollup/plugin-replace';\nimport ignore from 'rollup-plugin-ignore';\nimport nodePolyfills from 'rollup-plugin-polyfill-node';\n\nimport pkg from './package.json' with { type: 'json' };\n\nconst input = './src/index.ts';\n\nconst getExternal = ({ browser }) => [\n  ...Object.keys(pkg.dependencies),\n  ...(browser ? [] : ['fs', 'path', 'url']),\n];\n\nconst getPlugins = ({ browser }) => [\n  typescript(),\n  replace({\n    preventAssignment: true,\n    values: { BROWSER: JSON.stringify(browser) },\n  }),\n  ...(browser\n    ? [ignore(['fs', 'path', 'url']), nodePolyfills({ include: null })]\n    : []),\n];\n\nconst serverConfig = {\n  input,\n  output: { format: 'es', file: 'lib/index.js' },\n  external: getExternal({ browser: false }),\n  plugins: getPlugins({ browser: false }),\n};\n\nconst browserConfig = {\n  input,\n  output: { format: 'es', file: 'lib/index.browser.js' },\n  external: getExternal({ browser: true }),\n  plugins: getPlugins({ browser: true }),\n};\n\nconst dtsConfig = {\n  input: './lib/types/index.d.ts',\n  output: [{ file: 'lib/index.d.ts', format: 'es' }],\n  plugins: [dts(), del({ targets: 'lib/types', hook: 'buildEnd' })],\n};\n\nexport default [serverConfig, browserConfig, dtsConfig];\n"
  },
  {
    "path": "packages/image/src/cache.ts",
    "content": "const createCache = <T>({ limit = 100 } = {}) => {\n  let cache = new Map<string, T>();\n\n  return {\n    get: (key: string | null): T | undefined | null =>\n      key ? cache.get(key) ?? undefined : null,\n    set: (key: string, value: T) => {\n      cache.delete(key);\n\n      if (cache.size >= limit) {\n        const firstKey = cache.keys().next().value as string;\n        cache.delete(firstKey);\n      }\n\n      cache.set(key, value);\n    },\n    reset: () => {\n      cache = new Map();\n    },\n    length: () => cache.size,\n  };\n};\n\nexport default createCache;\n"
  },
  {
    "path": "packages/image/src/index.ts",
    "content": "import resolveImage from './resolve';\n\nexport type { Image, ImageSrc } from './types';\n\nexport default resolveImage;\n"
  },
  {
    "path": "packages/image/src/jpeg.ts",
    "content": "import _JPEG from 'jay-peg';\n\nimport { Image } from './types';\n\nclass JPEG implements Image {\n  data: Buffer;\n  width: number;\n  height: number;\n  format: 'jpeg';\n\n  constructor(data: Buffer) {\n    this.data = data;\n    this.format = 'jpeg';\n    this.width = 0;\n    this.height = 0;\n\n    if (data.readUInt16BE(0) !== 0xffd8) {\n      throw new Error('SOI not found in JPEG');\n    }\n\n    const markers = _JPEG.decode(this.data);\n\n    let orientation;\n\n    for (let i = 0; i < markers.length; i += 1) {\n      const marker = markers[i];\n\n      if (marker.name === 'EXIF' && marker.entries.orientation) {\n        orientation = marker.entries.orientation;\n      }\n\n      if (marker.name === 'SOF') {\n        this.width ||= marker.width;\n        this.height ||= marker.height;\n      }\n    }\n\n    if (orientation > 4) {\n      [this.width, this.height] = [this.height, this.width];\n    }\n  }\n\n  static isValid(data: Buffer) {\n    return data && Buffer.isBuffer(data) && data.readUInt16BE(0) === 0xffd8;\n  }\n}\n\nexport default JPEG;\n"
  },
  {
    "path": "packages/image/src/png.ts",
    "content": "import _PNG from '@react-pdf/png-js';\n\nimport { Image } from './types';\n\nclass PNG implements Image {\n  data: Buffer;\n  width: number;\n  height: number;\n  format: 'png';\n\n  constructor(data: Buffer) {\n    const png = new _PNG(data);\n\n    this.data = data;\n    this.width = png.width;\n    this.height = png.height;\n    this.format = 'png';\n  }\n\n  static isValid(data: Buffer): boolean {\n    return (\n      data &&\n      Buffer.isBuffer(data) &&\n      data[0] === 137 &&\n      data[1] === 80 &&\n      data[2] === 78 &&\n      data[3] === 71 &&\n      data[4] === 13 &&\n      data[5] === 10 &&\n      data[6] === 26 &&\n      data[7] === 10\n    );\n  }\n}\n\nexport default PNG;\n"
  },
  {
    "path": "packages/image/src/resolve.ts",
    "content": "import fs from 'fs';\nimport url from 'url';\nimport path from 'path';\n\nimport PNG from './png';\nimport JPEG from './jpeg';\nimport createCache from './cache.js';\nimport {\n  Base64ImageSrc,\n  DataImageSrc,\n  Image,\n  ImageFormat,\n  ImageSrc,\n  LocalImageSrc,\n  RemoteImageSrc,\n} from './types';\n\nexport const IMAGE_CACHE = createCache<Promise<Image | null>>({ limit: 30 });\n\nconst isBuffer = Buffer.isBuffer;\n\nconst isBlob = (src: ImageSrc): src is Blob => {\n  return typeof Blob !== 'undefined' && src instanceof Blob;\n};\n\nconst isDataImageSrc = (src: ImageSrc): src is DataImageSrc => {\n  return 'data' in src;\n};\n\nconst isDataUri = (imageSrc: ImageSrc): imageSrc is Base64ImageSrc =>\n  'uri' in imageSrc && imageSrc.uri.startsWith('data:');\n\nconst getAbsoluteLocalPath = (src: string) => {\n  if (BROWSER) {\n    throw new Error('Cannot check local paths in client-side environment');\n  }\n\n  const {\n    protocol,\n    auth,\n    host,\n    port,\n    hostname,\n    path: pathname,\n  } = url.parse(src);\n\n  const absolutePath = pathname ? path.resolve(src) : undefined;\n\n  if ((protocol && protocol !== 'file:') || auth || host || port || hostname) {\n    return undefined;\n  }\n\n  return absolutePath;\n};\n\nconst fetchLocalFile = (src: LocalImageSrc): Promise<Buffer> =>\n  new Promise((resolve, reject) => {\n    try {\n      if (BROWSER) {\n        reject(new Error('Cannot fetch local file in this environment'));\n        return;\n      }\n\n      const absolutePath = getAbsoluteLocalPath(src.uri);\n\n      if (!absolutePath) {\n        reject(new Error(`Cannot fetch non-local path: ${src.uri}`));\n        return;\n      }\n\n      fs.readFile(absolutePath, (err, data) =>\n        err ? reject(err) : resolve(data),\n      );\n    } catch (err) {\n      reject(err);\n    }\n  });\n\nconst fetchRemoteFile = async (src: RemoteImageSrc) => {\n  const { method = 'GET', headers, body, credentials } = src;\n\n  const response = await fetch(src.uri, {\n    method,\n    headers,\n    body,\n    credentials,\n  });\n\n  const buffer = await response.arrayBuffer();\n\n  return Buffer.from(buffer);\n};\n\nconst isValidFormat = (format: string): format is ImageFormat => {\n  const lower = format.toLowerCase();\n  return lower === 'jpg' || lower === 'jpeg' || lower === 'png';\n};\n\nconst getImageFormat = (buffer: Buffer) => {\n  let format;\n\n  if (JPEG.isValid(buffer)) {\n    format = 'jpg' as const;\n  } else if (PNG.isValid(buffer)) {\n    format = 'png' as const;\n  }\n\n  return format;\n};\n\nfunction getImage(body: Buffer, format: string): Image | null {\n  switch (format.toLowerCase()) {\n    case 'jpg':\n    case 'jpeg':\n      return new JPEG(body);\n    case 'png':\n      return new PNG(body);\n    default:\n      return null;\n  }\n}\n\nconst resolveBase64Image = async ({ uri }: Base64ImageSrc) => {\n  const match = /^data:image\\/([a-zA-Z]*);base64,([^\"]*)/g.exec(uri);\n\n  if (!match) throw new Error(`Invalid base64 image: ${uri}`);\n\n  const format = match[1];\n  const data = match[2];\n\n  if (!isValidFormat(format))\n    throw new Error(`Base64 image invalid format: ${format}`);\n\n  return getImage(Buffer.from(data, 'base64'), format);\n};\n\nconst resolveImageFromData = async (src: DataImageSrc) => {\n  if (src.data && src.format) {\n    return getImage(src.data, src.format);\n  }\n\n  throw new Error(`Invalid data given for local file: ${JSON.stringify(src)}`);\n};\n\nconst resolveBufferImage = async (buffer: Buffer) => {\n  const format = getImageFormat(buffer);\n\n  if (format) {\n    return getImage(buffer, format);\n  }\n\n  return null;\n};\n\nconst resolveBlobImage = async (blob: Blob) => {\n  const { type } = blob;\n  if (!type || type === 'application/octet-stream') {\n    const arrayBuffer = await blob.arrayBuffer();\n    const buffer = Buffer.from(arrayBuffer);\n    return resolveBufferImage(buffer);\n  }\n\n  if (!type.startsWith('image/')) {\n    throw new Error(`Invalid blob type: ${type}`);\n  }\n\n  const format = type.replace('image/', '');\n\n  if (!isValidFormat(format)) {\n    throw new Error(`Invalid blob type: ${type}`);\n  }\n\n  const buffer = await blob.arrayBuffer();\n\n  return getImage(Buffer.from(buffer), format);\n};\n\nconst resolveImageFromUrl = async (src: LocalImageSrc | RemoteImageSrc) => {\n  const data =\n    !BROWSER && getAbsoluteLocalPath(src.uri)\n      ? await fetchLocalFile(src)\n      : await fetchRemoteFile(src);\n\n  const format = getImageFormat(data);\n\n  if (!format) {\n    throw new Error('Not valid image extension');\n  }\n\n  return getImage(data, format);\n};\n\nconst getCacheKey = (src: ImageSrc): string | null => {\n  if (isBlob(src) || isBuffer(src)) return null;\n\n  if (isDataImageSrc(src)) return src.data?.toString('base64') ?? null;\n\n  return src.uri;\n};\n\nconst resolveImage = (src: ImageSrc, { cache = true } = {}) => {\n  let image: Promise<Image | null>;\n\n  const cacheKey = getCacheKey(src);\n\n  if (isBlob(src)) {\n    image = resolveBlobImage(src);\n  } else if (isBuffer(src)) {\n    image = resolveBufferImage(src);\n  } else if (cache && IMAGE_CACHE.get(cacheKey)) {\n    return IMAGE_CACHE.get(cacheKey);\n  } else if (isDataUri(src)) {\n    image = resolveBase64Image(src);\n  } else if (isDataImageSrc(src)) {\n    image = resolveImageFromData(src);\n  } else {\n    image = resolveImageFromUrl(src);\n  }\n\n  if (cache && cacheKey) {\n    IMAGE_CACHE.set(cacheKey, image);\n  }\n\n  return image;\n};\n\nexport default resolveImage;\n"
  },
  {
    "path": "packages/image/src/types.ts",
    "content": "export interface Image {\n  width: number;\n  height: number;\n  data: Buffer;\n  format: 'jpeg' | 'png';\n  key?: string;\n}\n\nexport type ImageFormat = 'jpg' | 'jpeg' | 'png';\n\nexport type DataImageSrc = {\n  data: Buffer;\n  format: ImageFormat;\n};\n\nexport type LocalImageSrc = {\n  uri: string;\n  format?: ImageFormat;\n};\n\nexport type RemoteImageSrc = {\n  uri: string;\n  method?: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n  headers?: Record<string, string>;\n  format?: ImageFormat;\n  body?: any;\n  credentials?: 'omit' | 'same-origin' | 'include';\n};\n\nexport type Base64ImageSrc = {\n  uri: `data:image${string}`;\n};\n\nexport type ImageSrc =\n  | Blob\n  | Buffer\n  | DataImageSrc\n  | LocalImageSrc\n  | RemoteImageSrc\n  | Base64ImageSrc;\n"
  },
  {
    "path": "packages/image/tests/cache.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport createCache from '../src/cache.js';\n\ndescribe('Background', () => {\n  test('should have length 0 by default', () => {\n    const cache = createCache();\n    expect(cache.length()).toBe(0);\n  });\n\n  test('should return undefined for invalid key', () => {\n    const cache = createCache();\n    expect(cache.get('somekey')).toBe(undefined);\n  });\n\n  test('should be able to set pair key-value', () => {\n    const cache = createCache();\n    expect(() => cache.set('somekey', 'somevalue')).not.toThrow();\n  });\n\n  test('should get key value', () => {\n    const cache = createCache();\n    cache.set('somekey', 'somevalue');\n    expect(cache.get('somekey')).toEqual('somevalue');\n  });\n\n  test('should reset cache', () => {\n    const cache = createCache();\n    cache.set('somekey', 'somevalue');\n\n    expect(cache.get('somekey')).toEqual('somevalue');\n\n    cache.reset();\n\n    expect(cache.length()).toBe(0);\n    expect(cache.get('somekey')).toBeFalsy();\n  });\n\n  test('remove elements FIFO if limit exceeded', () => {\n    const cache = createCache({ limit: 3 });\n\n    cache.set('1', '1');\n    cache.set('2', '2');\n    cache.set('3', '3');\n    cache.set('4', '4');\n    cache.set('5', '5');\n\n    expect(cache.length()).toBe(3);\n    expect(cache.get('1')).toBe(undefined);\n    expect(cache.get('2')).toBe(undefined);\n    expect(cache.get('3')).toBe('3');\n    expect(cache.get('4')).toBe('4');\n    expect(cache.get('5')).toBe('5');\n  });\n\n  test('should return null when getting with null key', () => {\n    const cache = createCache();\n    cache.set('somekey', 'somevalue');\n    expect(cache.get(null)).toBeNull();\n  });\n\n  test('should use default limit of 100', () => {\n    const cache = createCache();\n\n    for (let i = 0; i < 105; i++) {\n      cache.set(`key${i}`, `value${i}`);\n    }\n\n    expect(cache.length()).toBe(100);\n    expect(cache.get('key0')).toBe(undefined);\n    expect(cache.get('key4')).toBe(undefined);\n    expect(cache.get('key5')).toBe('value5');\n    expect(cache.get('key104')).toBe('value104');\n  });\n\n  test('should overwrite existing key without increasing length', () => {\n    const cache = createCache({ limit: 3 });\n\n    cache.set('key1', 'value1');\n    cache.set('key2', 'value2');\n    cache.set('key1', 'updatedValue1');\n\n    expect(cache.get('key1')).toBe('updatedValue1');\n    expect(cache.length()).toBe(2);\n  });\n\n  test('should handle limit of 1', () => {\n    const cache = createCache({ limit: 1 });\n\n    cache.set('key1', 'value1');\n    expect(cache.get('key1')).toBe('value1');\n    expect(cache.length()).toBe(1);\n\n    cache.set('key2', 'value2');\n    expect(cache.get('key1')).toBe(undefined);\n    expect(cache.get('key2')).toBe('value2');\n    expect(cache.length()).toBe(1);\n  });\n});\n"
  },
  {
    "path": "packages/image/tests/resolve.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\nimport fs from 'fs';\nimport path from 'path';\nimport url from 'url';\nimport './types';\n\nimport resolveImage, { IMAGE_CACHE } from '../src/resolve';\n\nconst __dirname = path.dirname(url.fileURLToPath(import.meta.url));\n\nconst jpgImageUrl = 'https://react-pdf.org/static/images/quijote1.jpg';\nconst pngImageUrl = 'https://react-pdf.org/static/images/quijote2.png';\nconst jpgLogalPath = path.join(__dirname, './assets/test.jpg');\nconst localJPGImage = fs.readFileSync(jpgLogalPath);\nconst pngLogalPath = path.join(__dirname, './assets/test.png');\nconst localPNGImage = fs.readFileSync(pngLogalPath);\n\ndescribe('image resolveImage', () => {\n  beforeEach(() => {\n    fetchMock.resetMocks();\n    IMAGE_CACHE.reset();\n  });\n\n  test('Should fetch remote image using GET method by default', async () => {\n    fetchMock.once(localJPGImage);\n\n    await resolveImage({ uri: jpgImageUrl });\n\n    expect(fetchMock.mock.calls[0]?.[1]?.method).toBe('GET');\n  });\n\n  test('Should fetch remote image using passed method', async () => {\n    fetchMock.once(localJPGImage);\n\n    await resolveImage({ uri: jpgImageUrl, method: 'POST' });\n\n    expect(fetchMock.mock.calls[0]?.[1]?.method).toBe('POST');\n  });\n\n  test('Should fetch remote image using passed headers', async () => {\n    fetchMock.once(localJPGImage);\n\n    const headers = { Authorization: 'Bearer qwerty' };\n    await resolveImage({ uri: jpgImageUrl, headers });\n\n    expect(fetchMock.mock.calls[0]?.[1]?.headers).toEqual(headers);\n  });\n\n  test('Should fetch remote image using passed body', async () => {\n    fetchMock.once(localJPGImage);\n\n    const body = 'qwerty';\n    await resolveImage({ uri: jpgImageUrl, body, method: 'POST' });\n\n    expect(fetchMock.mock.calls[0]?.[1]?.body).toEqual(body);\n  });\n\n  test('Should fetch remote image using passed credentials', async () => {\n    fetchMock.once(localJPGImage);\n\n    const credentials = 'include';\n    await resolveImage({ uri: jpgImageUrl, credentials });\n\n    expect(fetchMock.mock.calls[0]?.[1]?.credentials).toBe(credentials);\n  });\n\n  test('Should not include credentials if not exist', async () => {\n    fetchMock.once(localJPGImage);\n\n    await resolveImage({ uri: jpgImageUrl });\n\n    expect(fetchMock.mock.calls[0]?.[1]?.credentials).toBeUndefined();\n  });\n\n  test('Should render a jpeg image over http', async () => {\n    fetchMock.once(localJPGImage);\n\n    const image = await resolveImage({ uri: jpgImageUrl });\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should render a png image over http', async () => {\n    fetchMock.once(localPNGImage);\n\n    const image = await resolveImage({ uri: pngImageUrl });\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should render a local image from absolute path', async () => {\n    const absolutePath = path.join(__dirname, './assets/test.jpg');\n    const image = await resolveImage({ uri: absolutePath });\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should render a local image from relative path', async () => {\n    const image = await resolveImage({\n      uri: 'packages/layout/tests/assets/test.jpg',\n    });\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should render a local image from src object', async () => {\n    const image = await resolveImage({\n      uri: './packages/layout/tests/assets/test.jpg',\n    });\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should render a local image with spaces in filename', async () => {\n    const image = await resolveImage({\n      uri: './packages/image/tests/assets/test with spaces.jpg',\n    });\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should render a local image with special characters in filename', async () => {\n    const image = await resolveImage({\n      uri: './packages/image/tests/assets/special_ _%20_@&é\"\\'(§è!çà)-^$ù`,;:=?.+%£¨*<>.jpg',\n    });\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should render a local image from data', async () => {\n    const image = await resolveImage({ data: localJPGImage, format: 'jpg' });\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should render a base64 image', async () => {\n    const image = await resolveImage({\n      uri: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z/C/HgAGgwJ/lK3Q6wAAAABJRU5ErkJggg==',\n    });\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should render a buffer jpg image', async () => {\n    const image = await resolveImage(localJPGImage);\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should render a buffer png image', async () => {\n    const image = await resolveImage(localPNGImage);\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should not cache previously loaded remote images if flag false', async () => {\n    fetchMock.mockResponse(localJPGImage);\n\n    const image1 = await resolveImage({ uri: jpgImageUrl }, { cache: false });\n    const image2 = await resolveImage({ uri: jpgImageUrl }, { cache: false });\n\n    expect(image1).not.toBe(image2);\n  });\n\n  test('Should cache previously loaded local images by default', async () => {\n    fetchMock.mockResponse(localJPGImage);\n\n    const image1 = await resolveImage({ uri: jpgImageUrl });\n    const image2 = await resolveImage({ uri: jpgImageUrl });\n\n    expect(image1).toBe(image2);\n  });\n\n  test('Should not cache previously loaded local images if flag false', async () => {\n    fetchMock.mockResponse(localJPGImage);\n\n    const image1 = await resolveImage(localJPGImage, { cache: false });\n    const image2 = await resolveImage(localJPGImage, { cache: false });\n\n    expect(image1).not.toBe(image2);\n  });\n\n  test('Should render a blob image', async () => {\n    const blob = new Blob([localJPGImage], { type: 'image/jpeg' });\n    const image = await resolveImage(blob);\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should render a blob without type', async () => {\n    const blob = new Blob([localJPGImage]);\n    const image = await resolveImage(blob);\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should render a blob image with type application/octet-stream', async () => {\n    const blob = new Blob([localJPGImage], {\n      type: 'application/octet-stream',\n    });\n    const image = await resolveImage(blob);\n\n    expect(image?.data).toBeTruthy();\n    expect(image?.width).toBeGreaterThan(0);\n    expect(image?.height).toBeGreaterThan(0);\n  });\n\n  test('Should throw error for unsupported base64 format', async () => {\n    await expect(\n      resolveImage({\n        uri: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==',\n      }),\n    ).rejects.toThrow('Base64 image invalid format: gif');\n  });\n\n  test('Should throw error for invalid base64 URI', async () => {\n    await expect(\n      resolveImage({ uri: 'data:image/pngbase64,invalid' } as any),\n    ).rejects.toThrow('Invalid base64 image');\n  });\n\n  test('Should throw error for invalid blob type', async () => {\n    const blob = new Blob([localJPGImage], { type: 'text/plain' });\n    await expect(resolveImage(blob)).rejects.toThrow(\n      'Invalid blob type: text/plain',\n    );\n  });\n\n  test('Should throw error for unsupported blob image type', async () => {\n    const blob = new Blob([localJPGImage], { type: 'image/gif' });\n    await expect(resolveImage(blob)).rejects.toThrow(\n      'Invalid blob type: image/gif',\n    );\n  });\n\n  test('Should throw error for invalid data source', async () => {\n    await expect(\n      resolveImage({ data: undefined as any, format: 'jpg' }),\n    ).rejects.toThrow('Invalid data given for local file');\n  });\n\n  test('Should throw error for non-existent local file', async () => {\n    await expect(\n      resolveImage({ uri: '/nonexistent/path/image.jpg' }),\n    ).rejects.toThrow();\n  });\n\n  test('Should return null for invalid buffer', async () => {\n    const invalidBuffer = Buffer.from('not an image');\n    const image = await resolveImage(invalidBuffer);\n    expect(image).toBeNull();\n  });\n\n  test('Should throw on network fetch failure', async () => {\n    fetchMock.once(() => {\n      throw new Error('Network error');\n    });\n\n    await expect(resolveImage({ uri: jpgImageUrl })).rejects.toThrow(\n      'Network error',\n    );\n  });\n\n  test('Should throw for unsupported remote image format', async () => {\n    // GIF89a magic bytes - neither JPEG nor PNG\n    const gifBuffer = Buffer.from([0x47, 0x49, 0x46, 0x38, 0x39, 0x61]);\n    fetchMock.once(gifBuffer);\n\n    await expect(\n      resolveImage({ uri: 'https://example.com/image.gif' }),\n    ).rejects.toThrow('Not valid image extension');\n  });\n\n  test('Should cache DataImageSrc images using base64 key', async () => {\n    const image1 = await resolveImage({ data: localJPGImage, format: 'jpg' });\n    const image2 = await resolveImage({ data: localJPGImage, format: 'jpg' });\n\n    expect(image1).toBe(image2);\n  });\n\n  test('Should return null when getting cache with null key', () => {\n    expect(IMAGE_CACHE.get(null)).toBeNull();\n  });\n});\n"
  },
  {
    "path": "packages/image/tests/types.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-namespace */\n\nimport Global = NodeJS.Global;\n\nimport type { Mock } from 'vitest';\n\ndeclare global {\n  const fetchMock: FetchMock;\n  namespace NodeJS {\n    interface Global {\n      fetch: FetchMock;\n    }\n  }\n}\n\nexport interface GlobalWithFetchMock extends Global {\n  fetchMock: FetchMock;\n  fetch: FetchMock;\n}\n\nexport interface FetchMock\n  extends Mock<\n    [string | Request | undefined, RequestInit | undefined],\n    Promise<Response>\n  > {\n  (input: string | Request, init?: RequestInit): Promise<Response>;\n\n  /**\n   * Response mocking\n   */\n  mockResponse(value: Buffer): FetchMock;\n  mockResponse(fn: MockResponseInitFunction): FetchMock;\n  mockResponse(response: string, responseInit?: MockParams): FetchMock;\n\n  /**\n   * alias for mockResponseOnce\n   */\n  once(value: Buffer): FetchMock;\n  once(fn: MockResponseInitFunction): FetchMock;\n  once(url: string, responseInit?: MockParams): FetchMock;\n\n  /**\n   * Returns all the requests that have been made to the mocked fetch function.\n   * Does not include aborted requests.\n   */\n  requests(): Request[];\n\n  resetMocks(): void;\n  enableMocks(): void;\n  disableMocks(): void;\n}\n\nexport interface MockParams {\n  status?: number;\n  statusText?: string;\n  headers?: string[][] | { [key: string]: string }; // HeadersInit\n  url?: string;\n  /** Set >= 1 to have redirected return true. Only applicable to Node.js */\n  counter?: number;\n}\n\nexport interface MockResponseInit extends MockParams {\n  body?: string;\n  init?: MockParams;\n}\n\nexport type ErrorOrFunction = Error | ((...args: any[]) => Promise<any>);\nexport type UrlOrPredicate = string | RegExp | ((input: Request) => boolean);\n\nexport type MockResponseInitFunction = (\n  request: Request,\n) => MockResponseInit | string | Promise<MockResponseInit | string>;\n\ndeclare const fetchMock: FetchMock;\n"
  },
  {
    "path": "packages/image/tsconfig.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"compilerOptions\": {\n    \"outDir\": \"lib\",\n    \"declaration\": true,\n    \"declarationDir\": \"lib/types\",\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2022\", \"DOM\"],\n    \"moduleResolution\": \"Node\",\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"types\": [\"vitest/globals\"],\n  },\n  \"include\": [\"src\", \"**/*.d.ts\"],\n}\n"
  },
  {
    "path": "packages/image/vitest.config.js",
    "content": "import { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n  test: {\n    setupFiles: ['vitest.setup.js'],\n    include: ['tests/*.{test,spec}.?(c|m)[jt]s?(x)'],\n    watch: false,\n  },\n});\n"
  },
  {
    "path": "packages/image/vitest.setup.js",
    "content": "import { vi } from 'vitest';\nimport createFetchMock from 'vitest-fetch-mock';\n\nconst fetchMocker = createFetchMock(vi);\nfetchMocker.enableMocks();\n\nglobal.BROWSER = false;\n"
  },
  {
    "path": "packages/layout/.gitignore",
    "content": "lib\n"
  },
  {
    "path": "packages/layout/CHANGELOG.md",
    "content": "# @react-pdf/layout\n\n## 4.4.2\n\n### Patch Changes\n\n- [#3254](https://github.com/diegomura/react-pdf/pull/3254) [`cc1aff24`](https://github.com/diegomura/react-pdf/commit/cc1aff2454263f64d1f79c9df051d21d74f8d7cf) Thanks [@rafw87](https://github.com/rafw87)! - fix duplicated bookmarks when View is spanning multiple pages\n\n- Updated dependencies [[`a5979c15`](https://github.com/diegomura/react-pdf/commit/a5979c1568761107076172e4c1843e66f62a08ab), [`f034491b`](https://github.com/diegomura/react-pdf/commit/f034491b1f77ce6f18a5db88e70b10b9c502ca35), [`04922fea`](https://github.com/diegomura/react-pdf/commit/04922fea2e60930ac550ec31beaeb7f20551cf63)]:\n  - @react-pdf/image@3.0.4\n  - @react-pdf/textkit@6.1.0\n  - @react-pdf/types@2.9.2\n  - @react-pdf/stylesheet@6.1.2\n\n## 4.4.1\n\n### Patch Changes\n\n- [#3152](https://github.com/diegomura/react-pdf/pull/3152) [`beaffd3d`](https://github.com/diegomura/react-pdf/commit/beaffd3d2bb5ac81033ef53421413662d6d71158) Thanks [@Namchee](https://github.com/Namchee)! - chore: replace emoji-regex with emoji-regex-xs\n\n- [#3190](https://github.com/diegomura/react-pdf/pull/3190) [`a99d10fb`](https://github.com/diegomura/react-pdf/commit/a99d10fb2fbb6bfeb233ccb9bf0b703ed092e8d5) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - Fix yoga error Invalid array length at Array.push(<anonymous>)\n  Fix infinite loop while wrapping pages\n\n- [#3203](https://github.com/diegomura/react-pdf/pull/3203) [`ec063bec`](https://github.com/diegomura/react-pdf/commit/ec063bec8d6a56df42849a8e66521fad7719dc29) Thanks [@100Gyeon](https://github.com/100Gyeon)! - fix: prevent unhandled promise rejections when loading emoji images\n\n- Updated dependencies []:\n  - @react-pdf/types@2.9.1\n  - @react-pdf/stylesheet@6.1.1\n\n## 4.4.0\n\n### Minor Changes\n\n- [#3112](https://github.com/diegomura/react-pdf/pull/3112) [`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a) Thanks [@diegomura](https://github.com/diegomura)! - feat: add xLinkHref, gradientTransform and gradientUnits support\n\n### Patch Changes\n\n- Updated dependencies [[`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a)]:\n  - @react-pdf/stylesheet@6.1.0\n  - @react-pdf/types@2.9.0\n\n## 4.3.1\n\n### Patch Changes\n\n- [`e257f7ee`](https://github.com/diegomura/react-pdf/commit/e257f7ee18ff09f4895cd16c0b21b824678384c8) Thanks [@diegomura](https://github.com/diegomura)! - fix: font store types\n\n- Updated dependencies []:\n  - @react-pdf/types@2.8.2\n  - @react-pdf/stylesheet@6.0.2\n\n## 4.3.0\n\n### Minor Changes\n\n- [#3100](https://github.com/diegomura/react-pdf/pull/3100) [`a9ef6416`](https://github.com/diegomura/react-pdf/commit/a9ef6416473c86f6d8fe35c3d7231e642d6ae265) Thanks [@diegomura](https://github.com/diegomura)! - feat: support percentage gap\n\n- [#3102](https://github.com/diegomura/react-pdf/pull/3102) [`24690f52`](https://github.com/diegomura/react-pdf/commit/24690f5238e4eacf28351cf9996856a7d196d29e) Thanks [@diegomura](https://github.com/diegomura)! - feat: handle standard fonts in fonts package\n\n- [#3092](https://github.com/diegomura/react-pdf/pull/3092) [`481b536f`](https://github.com/diegomura/react-pdf/commit/481b536f4ad145fb227829399b85a35838a506f8) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert layout package to TS\n\n- [#3103](https://github.com/diegomura/react-pdf/pull/3103) [`b06d3a0f`](https://github.com/diegomura/react-pdf/commit/b06d3a0f64593ac18097efd061334f1e5bd70095) Thanks [@diegomura](https://github.com/diegomura)! - refactor: unify font substitution engines\n\n### Patch Changes\n\n- [#3104](https://github.com/diegomura/react-pdf/pull/3104) [`ddfa3675`](https://github.com/diegomura/react-pdf/commit/ddfa367587618b313b4b0b3b57a9a7631e8e7604) Thanks [@diegomura](https://github.com/diegomura)! - feat(textkit): expect font array\n\n- [#3098](https://github.com/diegomura/react-pdf/pull/3098) [`bfb51ec0`](https://github.com/diegomura/react-pdf/commit/bfb51ec09b851c52659ce16fed1286173e9516a9) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert render package to TS\n\n- [#3101](https://github.com/diegomura/react-pdf/pull/3101) [`fce45ea5`](https://github.com/diegomura/react-pdf/commit/fce45ea5860038e7f3b227cabf0dd6212f4404b8) Thanks [@diegomura](https://github.com/diegomura)! - fix: layout package types\n\n- Updated dependencies [[`2a4f1bfc`](https://github.com/diegomura/react-pdf/commit/2a4f1bfca6b84e6c6bbde683447ce8079a1febbe), [`7cd66e4f`](https://github.com/diegomura/react-pdf/commit/7cd66e4fc37cd1393adc6250a919fe2629812082), [`ddfa3675`](https://github.com/diegomura/react-pdf/commit/ddfa367587618b313b4b0b3b57a9a7631e8e7604), [`3fb01a90`](https://github.com/diegomura/react-pdf/commit/3fb01a90e590a31c097b3422fc911af61d65420a), [`c7b74963`](https://github.com/diegomura/react-pdf/commit/c7b749632f07db7808d58d99357dc830d4895da8), [`bfb51ec0`](https://github.com/diegomura/react-pdf/commit/bfb51ec09b851c52659ce16fed1286173e9516a9), [`24690f52`](https://github.com/diegomura/react-pdf/commit/24690f5238e4eacf28351cf9996856a7d196d29e), [`481b536f`](https://github.com/diegomura/react-pdf/commit/481b536f4ad145fb227829399b85a35838a506f8), [`b06d3a0f`](https://github.com/diegomura/react-pdf/commit/b06d3a0f64593ac18097efd061334f1e5bd70095)]:\n  - @react-pdf/stylesheet@6.0.1\n  - @react-pdf/types@2.8.1\n  - @react-pdf/textkit@6.0.0\n  - @react-pdf/image@3.0.3\n  - @react-pdf/fns@3.1.2\n\n## 4.2.3\n\n### Patch Changes\n\n- [#3082](https://github.com/diegomura/react-pdf/pull/3082) [`24fe4bf8`](https://github.com/diegomura/react-pdf/commit/24fe4bf894fff055121926488b30d0bf212a9c45) Thanks [@diegomura](https://github.com/diegomura)! - feat: rework and type stylesheet package\n\n- [#3077](https://github.com/diegomura/react-pdf/pull/3077) [`442ce355`](https://github.com/diegomura/react-pdf/commit/442ce35534f916b9146a35fd03870387ed488d92) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert textkit package to TS\n\n- Updated dependencies [[`226467e3`](https://github.com/diegomura/react-pdf/commit/226467e39443d3690b8f8c3298aa8278b43fbfa6), [`96c2464d`](https://github.com/diegomura/react-pdf/commit/96c2464dfaa7294e0d79b7ed64743bfd7b1a8c72), [`24fe4bf8`](https://github.com/diegomura/react-pdf/commit/24fe4bf894fff055121926488b30d0bf212a9c45), [`700535c5`](https://github.com/diegomura/react-pdf/commit/700535c57ff1b105d923be70f4fc4bfdf4479f91), [`442ce355`](https://github.com/diegomura/react-pdf/commit/442ce35534f916b9146a35fd03870387ed488d92), [`8d39fc46`](https://github.com/diegomura/react-pdf/commit/8d39fc4602730755ee63824ad4ed6ecd1bcd059f), [`3007d34a`](https://github.com/diegomura/react-pdf/commit/3007d34ad3e10bf32ada3631938f5bb08e1c549f)]:\n  - @react-pdf/pdfkit@4.0.2\n  - @react-pdf/primitives@4.1.1\n  - @react-pdf/types@2.8.0\n  - @react-pdf/stylesheet@6.0.0\n  - @react-pdf/fns@3.1.1\n  - @react-pdf/textkit@5.0.3\n  - @react-pdf/image@3.0.2\n\n## 4.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`d36ace66`](https://github.com/diegomura/react-pdf/commit/d36ace66c77d57d845894e89772be7ae0cdd25ee)]:\n  - @react-pdf/fns@3.1.0\n  - @react-pdf/stylesheet@5.2.2\n  - @react-pdf/textkit@5.0.2\n\n## 4.2.1\n\n### Patch Changes\n\n- [`fabecc56`](https://github.com/diegomura/react-pdf/commit/fabecc56727dfb6d590a3fa1e11f50250ecbbea1) Thanks [@diegomura](https://github.com/diegomura)! - chore: bump yoga-layout\n\n- Updated dependencies [[`7cd71714`](https://github.com/diegomura/react-pdf/commit/7cd7171472b0f300db56b7805c5f966bf4ced6e2), [`01944231`](https://github.com/diegomura/react-pdf/commit/01944231a342d502b832aeecb4c313020b8360c8), [`6d875056`](https://github.com/diegomura/react-pdf/commit/6d875056a07e8479ef695416c1fed575491b6ff1), [`49daae8f`](https://github.com/diegomura/react-pdf/commit/49daae8fdfba672a3e828847232ee9b70bb51711), [`5cc47319`](https://github.com/diegomura/react-pdf/commit/5cc47319bb428f6d4bcad21cd6dba9afca5cdc17), [`aa0f6725`](https://github.com/diegomura/react-pdf/commit/aa0f672589683a66abc79f838291996ae9aaffb8)]:\n  - @react-pdf/primitives@4.1.0\n  - @react-pdf/types@2.7.1\n  - @react-pdf/pdfkit@4.0.1\n  - @react-pdf/stylesheet@5.2.1\n\n## 4.2.0\n\n### Minor Changes\n\n- [#2773](https://github.com/diegomura/react-pdf/pull/2773) [`18834efa`](https://github.com/diegomura/react-pdf/commit/18834efac2787a636c378718fee40cbe74f01ab8) Thanks [@nikischin](https://github.com/nikischin)! - Changed unit behavior according to PDF spec. Please note that all unitless values are considered as user unit which is a 72dpi equality of the value. This is according to PDF spec and ensures a consistent layout independent of the dpi setting.\n\n### Patch Changes\n\n- Updated dependencies [[`18834efa`](https://github.com/diegomura/react-pdf/commit/18834efac2787a636c378718fee40cbe74f01ab8)]:\n  - @react-pdf/stylesheet@5.2.0\n\n## 4.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`00bfdc1e`](https://github.com/diegomura/react-pdf/commit/00bfdc1e5a6c673d2de7b3ab09d5020e932562fb)]:\n  - @react-pdf/textkit@5.0.1\n\n## 4.1.2\n\n### Patch Changes\n\n- [#2955](https://github.com/diegomura/react-pdf/pull/2955) [`425f1183`](https://github.com/diegomura/react-pdf/commit/425f1183bba9a83fd5712a1371abb6cea2ed8fca) Thanks [@diegomura](https://github.com/diegomura)! - feat: support rem units\n\n- [#2952](https://github.com/diegomura/react-pdf/pull/2952) [`2c3c887e`](https://github.com/diegomura/react-pdf/commit/2c3c887ea2d3aed2863f49bff375d08feaf975aa) Thanks [@diegomura](https://github.com/diegomura)! - feat: support multiple line-height units\n\n- Updated dependencies [[`425f1183`](https://github.com/diegomura/react-pdf/commit/425f1183bba9a83fd5712a1371abb6cea2ed8fca), [`2c3c887e`](https://github.com/diegomura/react-pdf/commit/2c3c887ea2d3aed2863f49bff375d08feaf975aa)]:\n  - @react-pdf/stylesheet@5.1.0\n\n## 4.1.1\n\n### Patch Changes\n\n- [#2947](https://github.com/diegomura/react-pdf/pull/2947) [`ed562b9b`](https://github.com/diegomura/react-pdf/commit/ed562b9b7f14bc76a1cd83aaaf1dab966bd7540b) Thanks [@diegomura](https://github.com/diegomura)! - feat: remove cross-fetch\n\n- Updated dependencies [[`ed562b9b`](https://github.com/diegomura/react-pdf/commit/ed562b9b7f14bc76a1cd83aaaf1dab966bd7540b), [`77e480cd`](https://github.com/diegomura/react-pdf/commit/77e480cdd161270ac07453525dfaf993e2d3f17f)]:\n  - @react-pdf/image@3.0.1\n  - @react-pdf/stylesheet@5.0.1\n\n## 4.1.0\n\n### Minor Changes\n\n- [#2736](https://github.com/diegomura/react-pdf/pull/2736) [`b242e59a`](https://github.com/diegomura/react-pdf/commit/b242e59a14a856e280c9fcbad81f707248819721) Thanks [@siketyan](https://github.com/siketyan)! - Use monochrome emojis contained in the font family if no emoji source available\n\n## 4.0.1\n\n### Patch Changes\n\n- [#2878](https://github.com/diegomura/react-pdf/pull/2878) [`58f9a047`](https://github.com/diegomura/react-pdf/commit/58f9a04740ed1331ef1dfa9999fb43c0ee10fa5b) Thanks [@jmezzacappa](https://github.com/jmezzacappa)! - Prevent Yoga init from running more than once\n\n## 4.0.0\n\n### Major Changes\n\n- [#2711](https://github.com/diegomura/react-pdf/pull/2711) [`42570321`](https://github.com/diegomura/react-pdf/commit/42570321af54bf331ca81f09a102664cd9f7c46a) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Update Yoga to 3.0\n\n- [#2871](https://github.com/diegomura/react-pdf/pull/2871) [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119) Thanks [@diegomura](https://github.com/diegomura)! - feat!: drop cjs support\n\n### Minor Changes\n\n- [#2876](https://github.com/diegomura/react-pdf/pull/2876) [`afe4bcfe`](https://github.com/diegomura/react-pdf/commit/afe4bcfe6f4b991cf22341242fc27d169b758d47) Thanks [@diegomura](https://github.com/diegomura)! - feat: add gap percentage support\n\n- [#2875](https://github.com/diegomura/react-pdf/pull/2875) [`46c3047d`](https://github.com/diegomura/react-pdf/commit/46c3047de56ae82f062b72c4910a4e6096eee99f) Thanks [@diegomura](https://github.com/diegomura)! - feat: add position: static support\n\n- [#2874](https://github.com/diegomura/react-pdf/pull/2874) [`55973278`](https://github.com/diegomura/react-pdf/commit/55973278ac8bc8f703b63844f57d6f155ae8d86f) Thanks [@diegomura](https://github.com/diegomura)! - feat: add align-content: space-evenly support\n\n### Patch Changes\n\n- Updated dependencies [[`fdcef566`](https://github.com/diegomura/react-pdf/commit/fdcef5666e4eeed542b625d394cdfe60d6346600), [`46c3047d`](https://github.com/diegomura/react-pdf/commit/46c3047de56ae82f062b72c4910a4e6096eee99f), [`55973278`](https://github.com/diegomura/react-pdf/commit/55973278ac8bc8f703b63844f57d6f155ae8d86f), [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119)]:\n  - @react-pdf/pdfkit@4.0.0\n  - @react-pdf/image@3.0.0\n  - @react-pdf/types@2.7.0\n  - @react-pdf/primitives@4.0.0\n  - @react-pdf/stylesheet@5.0.0\n  - @react-pdf/textkit@5.0.0\n  - @react-pdf/fns@3.0.0\n\n## 3.13.0\n\n### Minor Changes\n\n- [#2771](https://github.com/diegomura/react-pdf/pull/2771) [`8e6a832`](https://github.com/diegomura/react-pdf/commit/8e6a8320f86354aff950c296a96bc41a33e9dab2) Thanks [@nikischin](https://github.com/nikischin)! - fix: fix dpi\n\n### Patch Changes\n\n- [#2864](https://github.com/diegomura/react-pdf/pull/2864) [`e425ca4`](https://github.com/diegomura/react-pdf/commit/e425ca4add7eb353b6282a40fd1020aad0da36c4) Thanks [@nnaku](https://github.com/nnaku)! - Prevent loading yoga-layout wasm binaries more than once\n\n- [#2822](https://github.com/diegomura/react-pdf/pull/2822) [`e42a79a`](https://github.com/diegomura/react-pdf/commit/e42a79a3857932a4ebc89feb6e4d2c891280d633) Thanks [@mantljosh](https://github.com/mantljosh)! - fix: prevent infinite loop while splitting pages\n\n- [#2747](https://github.com/diegomura/react-pdf/pull/2747) [`5af35ec`](https://github.com/diegomura/react-pdf/commit/5af35ec9743cc0d7bf75f5ca789627517ff35816) Thanks [@andrew-spare](https://github.com/andrew-spare)! - fix: font selection regression\n\n- Updated dependencies [[`8e6a832`](https://github.com/diegomura/react-pdf/commit/8e6a8320f86354aff950c296a96bc41a33e9dab2), [`4bafab8`](https://github.com/diegomura/react-pdf/commit/4bafab8455c9003759f48bad20a720baf4ed189b)]:\n  - @react-pdf/pdfkit@3.2.0\n  - @react-pdf/stylesheet@4.3.0\n  - @react-pdf/types@2.6.0\n\n## 3.12.1\n\n### Patch Changes\n\n- Updated dependencies [[`22a34a9`](https://github.com/diegomura/react-pdf/commit/22a34a91b16a201cd8288e0dbea9368b12ca73f5)]:\n  - @react-pdf/types@2.5.0\n  - @react-pdf/stylesheet@4.2.5\n\n## 3.12.0\n\n### Minor Changes\n\n- [#2640](https://github.com/diegomura/react-pdf/pull/2640) [`67c265a`](https://github.com/diegomura/react-pdf/commit/67c265a7e39cc0baa319f49137219677904695e6) Thanks [@nikgraf](https://github.com/nikgraf)! - Add support for fontFamily fallbacks e.g. fontFamily: ['Roboto', 'NotoSansArabic']\n\n### Patch Changes\n\n- Updated dependencies [[`713690c`](https://github.com/diegomura/react-pdf/commit/713690cca266116bb7e80d13cf84bc843f9dfd52)]:\n  - @react-pdf/pdfkit@3.1.10\n\n## 3.11.5\n\n### Patch Changes\n\n- Updated dependencies [[`e2d21a4`](https://github.com/diegomura/react-pdf/commit/e2d21a433b881bb96ea4d0b3a01a7297dd1f4a94)]:\n  - @react-pdf/pdfkit@3.1.9\n\n## 3.11.4\n\n### Patch Changes\n\n- Updated dependencies [[`68bfc57`](https://github.com/diegomura/react-pdf/commit/68bfc575adfb95302e320019715d1eec5398259f)]:\n  - @react-pdf/pdfkit@3.1.8\n  - @react-pdf/image@2.3.6\n\n## 3.11.3\n\n### Patch Changes\n\n- [#2629](https://github.com/diegomura/react-pdf/pull/2629) [`087ee22`](https://github.com/diegomura/react-pdf/commit/087ee22f63a922a2d3ee01bae3b0351f99cb9021) Thanks [@diegomura](https://github.com/diegomura)! - fix: resolve styles on dynamic elements\n\n- Updated dependencies [[`da10a9b`](https://github.com/diegomura/react-pdf/commit/da10a9bb43dc4c4765687850444a24cbc4eb402a)]:\n  - @react-pdf/pdfkit@3.1.7\n  - @react-pdf/image@2.3.5\n\n## 3.11.2\n\n### Patch Changes\n\n- Updated dependencies [[`dc54c13`](https://github.com/diegomura/react-pdf/commit/dc54c13625510482e93f80ed5cc07cf3a6a6d34c)]:\n  - @react-pdf/pdfkit@3.1.6\n\n## 3.11.1\n\n### Patch Changes\n\n- [#2605](https://github.com/diegomura/react-pdf/pull/2605) [`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - fix: fix CJS compatibility\n\n- Updated dependencies [[`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71)]:\n  - @react-pdf/stylesheet@4.2.4\n  - @react-pdf/textkit@4.4.1\n  - @react-pdf/image@2.3.4\n  - @react-pdf/fns@2.2.1\n  - @react-pdf/pdfkit@3.1.5\n\n## 3.11.0\n\n### Minor Changes\n\n- [#2600](https://github.com/diegomura/react-pdf/pull/2600) [`8350154`](https://github.com/diegomura/react-pdf/commit/83501541e3a050021e18e112bb472b2dabc142a7) Thanks [@diegomura](https://github.com/diegomura)! - feat: bidi support\n\n### Patch Changes\n\n- [#2573](https://github.com/diegomura/react-pdf/pull/2573) [`9af07fe`](https://github.com/diegomura/react-pdf/commit/9af07feb59c2fe9c1d8960ac95f6fa6e03d16235) Thanks [@davbrito](https://github.com/davbrito)! - feat: add support for resolving blob images\n\n- Updated dependencies [[`9af07fe`](https://github.com/diegomura/react-pdf/commit/9af07feb59c2fe9c1d8960ac95f6fa6e03d16235), [`8350154`](https://github.com/diegomura/react-pdf/commit/83501541e3a050021e18e112bb472b2dabc142a7)]:\n  - @react-pdf/image@2.3.3\n  - @react-pdf/types@2.4.1\n  - @react-pdf/textkit@4.4.0\n  - @react-pdf/fns@2.2.0\n  - @react-pdf/pdfkit@3.1.4\n  - @react-pdf/stylesheet@4.2.3\n\n## 3.10.4\n\n### Patch Changes\n\n- Updated dependencies [[`0590324`](https://github.com/diegomura/react-pdf/commit/0590324d7a6d75c0a49520b3f99cfb6594239390)]:\n  - @react-pdf/image@2.3.2\n  - @react-pdf/pdfkit@3.1.3\n\n## 3.10.3\n\n### Patch Changes\n\n- Updated dependencies [[`44bd45b`](https://github.com/diegomura/react-pdf/commit/44bd45b1961ca8bae4a2f84cc77db945e5c43419)]:\n  - @react-pdf/pdfkit@3.1.2\n\n## 3.10.2\n\n### Patch Changes\n\n- Updated dependencies [[`fb5273d`](https://github.com/diegomura/react-pdf/commit/fb5273d8d80d919f7b9c214e02d67b79ce23fa19)]:\n  - @react-pdf/types@2.4.0\n  - @react-pdf/stylesheet@4.2.2\n\n## 3.10.1\n\n### Patch Changes\n\n- Updated dependencies [[`36c6ba3`](https://github.com/diegomura/react-pdf/commit/36c6ba30ae73a512f19fe5bc47ac8c304887c0da), [`a35b1ba`](https://github.com/diegomura/react-pdf/commit/a35b1ba18d293df51293600d8d56015094d222d8)]:\n  - @react-pdf/pdfkit@3.1.1\n  - @react-pdf/image@2.3.1\n\n## 3.10.0\n\n### Minor Changes\n\n- [#2505](https://github.com/diegomura/react-pdf/pull/2505) [`0f5c43f`](https://github.com/diegomura/react-pdf/commit/0f5c43fa6f3c0b53c067200cc1ac21e651504760) Thanks [@diegomura](https://github.com/diegomura)! - feat: wasm yoga\n\n### Patch Changes\n\n- Updated dependencies [[`9e5842b`](https://github.com/diegomura/react-pdf/commit/9e5842bbecca6e249af2c5fc50078bb7ddd5420f)]:\n  - @react-pdf/types@2.3.6\n  - @react-pdf/stylesheet@4.2.1\n\n## 3.9.1\n\n### Patch Changes\n\n- Updated dependencies [[`42bbbda`](https://github.com/diegomura/react-pdf/commit/42bbbda48058acd2d36d7a92c812d133608c459e)]:\n  - @react-pdf/primitives@3.1.1\n\n## 3.9.0\n\n### Minor Changes\n\n- [#2409](https://github.com/diegomura/react-pdf/pull/2409) [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Add support for native ESM\n\n### Patch Changes\n\n- [#2504](https://github.com/diegomura/react-pdf/pull/2504) [`e705d98`](https://github.com/diegomura/react-pdf/commit/e705d9862e3364fde00cbe6cdaf06d492bf58526) Thanks [@diegomura](https://github.com/diegomura)! - feat: nested text inherit background color\n\n* [#2496](https://github.com/diegomura/react-pdf/pull/2496) [`c8fe2c8`](https://github.com/diegomura/react-pdf/commit/c8fe2c86639cb8e44f26f78e62fc67379a8e3ceb) Thanks [@diegomura](https://github.com/diegomura)! - fix: copyright and registered symbol rendering\n\n- [#2502](https://github.com/diegomura/react-pdf/pull/2502) [`96ea576`](https://github.com/diegomura/react-pdf/commit/96ea5764cbe4e6e3869cd0fe6620e5216f94ffc0) Thanks [@DominikMeca](https://github.com/DominikMeca)! - feat: include text preceeding special case emojis, include ™ symbol in excluded emojis\n\n- Updated dependencies [[`6bfe7e8`](https://github.com/diegomura/react-pdf/commit/6bfe7e8a30d96c04a1552800159992705f3605b1), [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37)]:\n  - @react-pdf/stylesheet@4.2.0\n  - @react-pdf/primitives@3.1.0\n  - @react-pdf/textkit@4.3.0\n  - @react-pdf/pdfkit@3.1.0\n  - @react-pdf/image@2.3.0\n  - @react-pdf/fns@2.1.0\n\n## 3.8.0\n\n### Minor Changes\n\n- [#2400](https://github.com/diegomura/react-pdf/pull/2400) [`0538bd9`](https://github.com/diegomura/react-pdf/commit/0538bd900e5490a5ef81bcdbd1676fc9f9ae6acb) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - Rework minPresenceAhead detection and add tests\n\n## 3.7.0\n\n### Minor Changes\n\n- [#2473](https://github.com/diegomura/react-pdf/pull/2473) [`b227e0e`](https://github.com/diegomura/react-pdf/commit/b227e0e303da8bca754910f55f5d27dd18f3a874) Thanks [@mskec](https://github.com/mskec)! - Upgraded yoga to v2 and dropped bundled yoga v1 package\n\n### Patch Changes\n\n- [#2479](https://github.com/diegomura/react-pdf/pull/2479) [`45b2bd3`](https://github.com/diegomura/react-pdf/commit/45b2bd37037c605727ad5783f2f2a438dc19cac4) Thanks [@diegomura](https://github.com/diegomura)! - fix linting\n\n* [#2467](https://github.com/diegomura/react-pdf/pull/2467) [`1f987cc`](https://github.com/diegomura/react-pdf/commit/1f987cc27c3fd1ef1b6748ebe58a289a78b538d2) Thanks [@JaeSeoKim](https://github.com/JaeSeoKim)! - feat: add withVariationSelectors option to registerEmojiSource [#2466](https://github.com/diegomura/react-pdf/issues/2466)\n\n* Updated dependencies [[`e5c8fde`](https://github.com/diegomura/react-pdf/commit/e5c8fde9379a9a85ecac7e3d6273953e39d65f8d), [`45b2bd3`](https://github.com/diegomura/react-pdf/commit/45b2bd37037c605727ad5783f2f2a438dc19cac4), [`b457a0c`](https://github.com/diegomura/react-pdf/commit/b457a0cc1c1352325e6c633af3000a3c9241f7f7), [`1f987cc`](https://github.com/diegomura/react-pdf/commit/1f987cc27c3fd1ef1b6748ebe58a289a78b538d2), [`4c40b14`](https://github.com/diegomura/react-pdf/commit/4c40b149cfed42f2513e1dd330a92ccc3363c04f)]:\n  - @react-pdf/types@2.3.5\n  - @react-pdf/textkit@4.2.1\n  - @react-pdf/pdfkit@3.0.4\n  - @react-pdf/image@2.2.3\n  - @react-pdf/stylesheet@4.1.9\n\n## 3.6.4\n\n### Patch Changes\n\n- Updated dependencies [[`4cfb84d`](https://github.com/diegomura/react-pdf/commit/4cfb84d9f3d2301720b68b4c40a0257b9520c6e1)]:\n  - @react-pdf/pdfkit@3.0.3\n\n## 3.6.3\n\n### Patch Changes\n\n- Updated dependencies [[`4a55c1b`](https://github.com/diegomura/react-pdf/commit/4a55c1b2ed19e460ccae6e749ed94c16729a23c4)]:\n  - @react-pdf/image@2.2.2\n  - @react-pdf/types@2.3.4\n  - @react-pdf/stylesheet@4.1.8\n\n## 3.6.2\n\n### Patch Changes\n\n- Updated dependencies [[`1e1fbdc`](https://github.com/diegomura/react-pdf/commit/1e1fbdc3c33ced46d8c7ebba7a196733cb789d59), [`8636812`](https://github.com/diegomura/react-pdf/commit/86368122ed87621d19ae3bc248080e17703d9fcb)]:\n  - @react-pdf/types@2.3.3\n  - @react-pdf/stylesheet@4.1.7\n\n## 3.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`a25dbcb`](https://github.com/diegomura/react-pdf/commit/a25dbcb32b65c300f5b088e8b210bb0c1abca5c2)]:\n  - @react-pdf/types@2.3.2\n  - @react-pdf/stylesheet@4.1.6\n\n## 3.6.0\n\n### Minor Changes\n\n- [#2254](https://github.com/diegomura/react-pdf/pull/2254) [`d48039c`](https://github.com/diegomura/react-pdf/commit/d48039c9e224346fd22395f48eb03ceffa5e3dd6) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - Enable more modern emoji (Unicode 13+)\n\n## 3.5.1\n\n### Patch Changes\n\n- [#2252](https://github.com/diegomura/react-pdf/pull/2252) [`47e91cb`](https://github.com/diegomura/react-pdf/commit/47e91cbd8016046bb4e8389ba0d1c7ede9edce59) Thanks [@jeetiss](https://github.com/jeetiss)! - implement function as emoji source to build more complex urls\n\n- Updated dependencies [[`47e91cb`](https://github.com/diegomura/react-pdf/commit/47e91cbd8016046bb4e8389ba0d1c7ede9edce59)]:\n  - @react-pdf/types@2.3.1\n  - @react-pdf/stylesheet@4.1.5\n\n## 3.5.0\n\n### Minor Changes\n\n- [#2214](https://github.com/diegomura/react-pdf/pull/2214) [`2db67a3`](https://github.com/diegomura/react-pdf/commit/2db67a38b9be98b7816a2b5aa4733446b95e3724) Thanks [@KODIKAS-NL](https://github.com/KODIKAS-NL)! - added base support for verticalAlign \"super\" and \"sub\"\n\n### Patch Changes\n\n- Updated dependencies [[`2db67a3`](https://github.com/diegomura/react-pdf/commit/2db67a38b9be98b7816a2b5aa4733446b95e3724), [`eff1ff0`](https://github.com/diegomura/react-pdf/commit/eff1ff0fefcd710994e4654904ef55843af76a17), [`c5b21fc`](https://github.com/diegomura/react-pdf/commit/c5b21fc97b704b3616522b897847a9d3c9dc0052)]:\n  - @react-pdf/textkit@4.2.0\n  - @react-pdf/types@2.3.0\n  - @react-pdf/fns@2.0.1\n  - @react-pdf/yoga@4.1.2\n  - @react-pdf/stylesheet@4.1.4\n\n## 3.4.1\n\n### Patch Changes\n\n- [#2205](https://github.com/diegomura/react-pdf/pull/2205) [`9a5e0be`](https://github.com/diegomura/react-pdf/commit/9a5e0befb89756db07ce053192a136df9d4ba905) Thanks [@jeetiss](https://github.com/jeetiss)! - update babel\n\n- Updated dependencies [[`9a5e0be`](https://github.com/diegomura/react-pdf/commit/9a5e0befb89756db07ce053192a136df9d4ba905)]:\n  - @react-pdf/stylesheet@4.1.3\n  - @react-pdf/textkit@4.1.1\n  - @react-pdf/pdfkit@3.0.2\n  - @react-pdf/image@2.2.1\n  - @react-pdf/yoga@4.1.1\n\n## 3.4.0\n\n### Minor Changes\n\n- [#2198](https://github.com/diegomura/react-pdf/pull/2198) [`c981784`](https://github.com/diegomura/react-pdf/commit/c981784b172e9a7631edb7a1fe41ce77bc6ccdee) Thanks [@Solpatium](https://github.com/Solpatium)! - Break on containers whose children can not fit on a page\n\n## 3.3.1\n\n### Patch Changes\n\n- [#2186](https://github.com/diegomura/react-pdf/pull/2186) [`72435bd`](https://github.com/diegomura/react-pdf/commit/72435bd81afdada5b811a1d82af0c873cfb62fa0) Thanks [@jeetiss](https://github.com/jeetiss)! - update yoga-layout to support flexBasis auto\n\n- Updated dependencies [[`72435bd`](https://github.com/diegomura/react-pdf/commit/72435bd81afdada5b811a1d82af0c873cfb62fa0)]:\n  - @react-pdf/stylesheet@4.1.1\n  - @react-pdf/yoga@4.1.0\n\n## 3.3.0\n\n### Minor Changes\n\n- [#2160](https://github.com/diegomura/react-pdf/pull/2160) [`a743c90`](https://github.com/diegomura/react-pdf/commit/a743c905fb5d201d2382bc9175fa36b83cc47284) Thanks [@jeetiss](https://github.com/jeetiss)! - implement flex gap\n\n### Patch Changes\n\n- Updated dependencies [[`a743c90`](https://github.com/diegomura/react-pdf/commit/a743c905fb5d201d2382bc9175fa36b83cc47284), [`a14ca9e`](https://github.com/diegomura/react-pdf/commit/a14ca9e62c9edc37f239558f8dbae29212b0da4d)]:\n  - @react-pdf/stylesheet@4.1.0\n  - @react-pdf/types@2.2.0\n  - @react-pdf/yoga@4.0.0\n\n## 3.2.2\n\n### Patch Changes\n\n- [#2141](https://github.com/diegomura/react-pdf/pull/2141) [`0000d34`](https://github.com/diegomura/react-pdf/commit/0000d347d5b2fec33ee213da4ba637f06be78fae) Thanks [@jeetiss](https://github.com/jeetiss)! - fix rendering freeze when `<Text>` is empty\n\n## 3.2.1\n\n### Patch Changes\n\n- [#2056](https://github.com/diegomura/react-pdf/pull/2056) [`2ebba93`](https://github.com/diegomura/react-pdf/commit/2ebba93c43608a31655e99f226f1cf2d7006ac39) Thanks [@jasnross](https://github.com/jasnross)! - fix: TypeError when returning fragments or arrays from render prop\n\n* [#2034](https://github.com/diegomura/react-pdf/pull/2034) [`992b91b`](https://github.com/diegomura/react-pdf/commit/992b91b3866e8e24efa014eef4d3eeec6a40f9a5) Thanks [@imatwork](https://github.com/imatwork)! - fix: page wrap=false not preventing page from breaking\n\n## 3.2.0\n\n### Minor Changes\n\n- [#1891](https://github.com/diegomura/react-pdf/pull/1891) [`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - feat: compatibility with modern web bundlers and browsers\n\n### Patch Changes\n\n- [#1911](https://github.com/diegomura/react-pdf/pull/1911) [`5fe9754`](https://github.com/diegomura/react-pdf/commit/5fe9754f21f103e17d1b70498ee7961cde779b22) Thanks [@diegomura](https://github.com/diegomura)! - refactor: yoga node prop name\n\n- Updated dependencies [[`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81), [`4bb97c3`](https://github.com/diegomura/react-pdf/commit/4bb97c3b92e82d7d7be2698c770f42560c6fcab6), [`001a208`](https://github.com/diegomura/react-pdf/commit/001a20812fa039d09931b22eb97a8869e3b31cc5), [`d1f3d5b`](https://github.com/diegomura/react-pdf/commit/d1f3d5b9b4103705e95e2160347ee253d842ed5d), [`9996158`](https://github.com/diegomura/react-pdf/commit/9996158636edf2118c4a6dcce08a00408b982993)]:\n  - @react-pdf/fns@2.0.0\n  - @react-pdf/pdfkit@3.0.0\n  - @react-pdf/stylesheet@4.0.0\n  - @react-pdf/yoga@3.0.0\n  - @react-pdf/image@2.2.0\n  - @react-pdf/textkit@4.1.0\n\n## 3.1.2\n\n### Patch Changes\n\n- [#1910](https://github.com/diegomura/react-pdf/pull/1910) [`e94e50a`](https://github.com/diegomura/react-pdf/commit/e94e50a931df7347a8febc717ca76843502826c8) Thanks [@diegomura](https://github.com/diegomura)! - fix: media queries computing\n\n* [#1906](https://github.com/diegomura/react-pdf/pull/1906) [`884695b`](https://github.com/diegomura/react-pdf/commit/884695b44feb974f155c83e0714e8e939b4f641b) Thanks [@diegomura](https://github.com/diegomura)! - feat: build textkit with rollup & define public api\n\n* Updated dependencies [[`035d3f8`](https://github.com/diegomura/react-pdf/commit/035d3f8d24fa4f4af9f350950d81b51547858367), [`9527fe4`](https://github.com/diegomura/react-pdf/commit/9527fe4c9087818421eca4753172b06e3c0cb934), [`0fcc594`](https://github.com/diegomura/react-pdf/commit/0fcc594310d5af30ca1e752b3efc7a047e813dcb), [`37a9a74`](https://github.com/diegomura/react-pdf/commit/37a9a747f7677fa05e3ddf5669c0379aa65c1e39), [`884695b`](https://github.com/diegomura/react-pdf/commit/884695b44feb974f155c83e0714e8e939b4f641b)]:\n  - @react-pdf/pdfkit@2.4.0\n  - @react-pdf/stylesheet@3.2.0\n  - @react-pdf/textkit@4.0.0\n\n## 3.1.1\n\n### Patch Changes\n\n- [#1874](https://github.com/diegomura/react-pdf/pull/1874) [`84d94a8`](https://github.com/diegomura/react-pdf/commit/84d94a885e5140c38e31fc843340b8f09682c923) Thanks [@jeetiss](https://github.com/jeetiss)! - fixed path to es module bundle\n\n* [#1875](https://github.com/diegomura/react-pdf/pull/1875) [`03d80a7`](https://github.com/diegomura/react-pdf/commit/03d80a71b487007a49694e1f6cf3c1136b50a688) Thanks [@jeetiss](https://github.com/jeetiss)! - fixed overwriting for default link style\n\n## 3.1.0\n\n### Minor Changes\n\n- [#1862](https://github.com/diegomura/react-pdf/pull/1862) [`1411d16`](https://github.com/diegomura/react-pdf/commit/1411d162e04ca237bad93729695c363fdf4bdbeb) Thanks [@diegomura](https://github.com/diegomura)! - feat: bookmarks support\n\n* [#1871](https://github.com/diegomura/react-pdf/pull/1871) [`22fb0f0`](https://github.com/diegomura/react-pdf/commit/22fb0f008ac2a2e251657e9cbd97ccedb4ff67db) Thanks [@jeetiss](https://github.com/jeetiss)! - added esm bundle\n\n- [#1869](https://github.com/diegomura/react-pdf/pull/1869) [`5d2c308`](https://github.com/diegomura/react-pdf/commit/5d2c3088cf438a8abf1038b14a21117fecf59d57) Thanks [@diegomura](https://github.com/diegomura)! - feat: variable dpi\n\n### Patch Changes\n\n- [#1858](https://github.com/diegomura/react-pdf/pull/1858) [`70c3c9f`](https://github.com/diegomura/react-pdf/commit/70c3c9f52517dc2820765e657dd2bff6b47d1ef2) Thanks [@diegomura](https://github.com/diegomura)! - fix: line width computation\n\n* [#1857](https://github.com/diegomura/react-pdf/pull/1857) [`d958b0a`](https://github.com/diegomura/react-pdf/commit/d958b0ae06a61c157b2581488a9121a0464222f4) Thanks [@diegomura](https://github.com/diegomura)! - feat: embed same image once in final document\n\n* Updated dependencies [[`1411d16`](https://github.com/diegomura/react-pdf/commit/1411d162e04ca237bad93729695c363fdf4bdbeb), [`4fadb48`](https://github.com/diegomura/react-pdf/commit/4fadb48983d7269452f89f80c7e341ece859aaee), [`d958b0a`](https://github.com/diegomura/react-pdf/commit/d958b0ae06a61c157b2581488a9121a0464222f4), [`24f5c77`](https://github.com/diegomura/react-pdf/commit/24f5c77706e12dbab45053cb704a2fe7cf60eb53), [`ce8762f`](https://github.com/diegomura/react-pdf/commit/ce8762f6de5c796e69ec5a225c7f3ff9c619a960), [`5d2c308`](https://github.com/diegomura/react-pdf/commit/5d2c3088cf438a8abf1038b14a21117fecf59d57)]:\n  - @react-pdf/pdfkit@2.3.0\n  - @react-pdf/types@2.1.0\n  - @react-pdf/stylesheet@3.1.0\n\n## 3.0.0\n\n### Major Changes\n\n- [#1827](https://github.com/diegomura/react-pdf/pull/1827) [`7c1d373`](https://github.com/diegomura/react-pdf/commit/7c1d373a06b04369e762069be4b96d4e40371ecc) Thanks [@diegomura](https://github.com/diegomura)! - refactor: remove ramda from layout package\n\n### Minor Changes\n\n- [#1841](https://github.com/diegomura/react-pdf/pull/1841) [`25a80eb`](https://github.com/diegomura/react-pdf/commit/25a80ebd5f96ade7101883624010bad51474967c) Thanks [@diegomura](https://github.com/diegomura)! - feat: support bold-italic standard fonts\n\n### Patch Changes\n\n- [#1829](https://github.com/diegomura/react-pdf/pull/1829) [`5458a00`](https://github.com/diegomura/react-pdf/commit/5458a00979d883341c6df094243cae859344d2b9) Thanks [@diegomura](https://github.com/diegomura)! - refactor: remove ramda from stylesheet package\n\n* [#1838](https://github.com/diegomura/react-pdf/pull/1838) [`9bdb5c9`](https://github.com/diegomura/react-pdf/commit/9bdb5c934a822340754cd4c892d399f91f6218de) Thanks [@diegomura](https://github.com/diegomura)! - feat: create fns package\n\n- [#1830](https://github.com/diegomura/react-pdf/pull/1830) [`9a2b935`](https://github.com/diegomura/react-pdf/commit/9a2b935cfe173f80425ed87d9f474da271c050d2) Thanks [@diegomura](https://github.com/diegomura)! - refactor: remove ramda from textkit package\n\n- Updated dependencies [[`e938df0`](https://github.com/diegomura/react-pdf/commit/e938df0857642707b10b7f65f17ed22dc394ac1b), [`5458a00`](https://github.com/diegomura/react-pdf/commit/5458a00979d883341c6df094243cae859344d2b9), [`9bdb5c9`](https://github.com/diegomura/react-pdf/commit/9bdb5c934a822340754cd4c892d399f91f6218de), [`fe0f214`](https://github.com/diegomura/react-pdf/commit/fe0f214dbbf2f632b852ebfe65f886ecc4dd6953), [`9a2b935`](https://github.com/diegomura/react-pdf/commit/9a2b935cfe173f80425ed87d9f474da271c050d2), [`25a80eb`](https://github.com/diegomura/react-pdf/commit/25a80ebd5f96ade7101883624010bad51474967c)]:\n  - @react-pdf/primitives@3.0.0\n  - @react-pdf/stylesheet@3.0.0\n  - @react-pdf/fns@1.0.0\n  - @react-pdf/textkit@3.0.0\n  - @react-pdf/types@2.0.9\n  - @react-pdf/pdfkit@2.2.0\n\n## 2.1.1\n\n### Patch Changes\n\n- [#1685](https://github.com/diegomura/react-pdf/pull/1685) [`90ab2f8`](https://github.com/diegomura/react-pdf/commit/90ab2f8c040afc3d42961404bdf2ae09fac599eb) Thanks [@jeetiss](https://github.com/jeetiss)! - updated cross-fetch\n\n- Updated dependencies [[`90ab2f8`](https://github.com/diegomura/react-pdf/commit/90ab2f8c040afc3d42961404bdf2ae09fac599eb)]:\n  - @react-pdf/image@2.1.1\n\n## 2.1.0\n\n### Minor Changes\n\n- [#1654](https://github.com/diegomura/react-pdf/pull/1654) [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b) Thanks [@jeetiss](https://github.com/jeetiss)! - added `@babel/runtime` to dependencies\n\n### Patch Changes\n\n- [#1659](https://github.com/diegomura/react-pdf/pull/1659) [`6f0e8d2`](https://github.com/diegomura/react-pdf/commit/6f0e8d2a130d39350cc4f61ff5c743b4b262c98a) Thanks [@jeetiss](https://github.com/jeetiss)! - use styles for forcing nodes height after split\n\n* [#1581](https://github.com/diegomura/react-pdf/pull/1581) [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca) Thanks [@jeetiss](https://github.com/jeetiss)! - added changelog with changesets\n\n* Updated dependencies [[`1f0eb6e`](https://github.com/diegomura/react-pdf/commit/1f0eb6e0d4e75480de6745a204924d5075859db7), [`4c5d527`](https://github.com/diegomura/react-pdf/commit/4c5d52721d29d843f1d09c3fd74370832429f70e), [`d341ae6`](https://github.com/diegomura/react-pdf/commit/d341ae66e91774e95e82deb8d9162bf458688768), [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca), [`5d2d688`](https://github.com/diegomura/react-pdf/commit/5d2d688e18c830bb96c6e08446437d29f9f9c65f), [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b), [`a592e99`](https://github.com/diegomura/react-pdf/commit/a592e99f7df7481697582c2a12f31ce7f9559c66)]:\n  - @react-pdf/stylesheet@2.1.0\n  - @react-pdf/image@2.1.0\n  - @react-pdf/pdfkit@2.1.0\n  - @react-pdf/primitives@2.0.2\n  - @react-pdf/textkit@2.1.0\n  - @react-pdf/types@2.0.8\n  - @react-pdf/yoga@2.0.4\n"
  },
  {
    "path": "packages/layout/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n# @react-pdf/layout\n"
  },
  {
    "path": "packages/layout/globals.d.ts",
    "content": "declare module 'yoga-layout/load' {\n  export enum Align {\n    Auto = 0,\n    FlexStart = 1,\n    Center = 2,\n    FlexEnd = 3,\n    Stretch = 4,\n    Baseline = 5,\n    SpaceBetween = 6,\n    SpaceAround = 7,\n    SpaceEvenly = 8,\n  }\n\n  export enum BoxSizing {\n    BorderBox = 0,\n    ContentBox = 1,\n  }\n\n  export enum Dimension {\n    Width = 0,\n    Height = 1,\n  }\n\n  export enum Direction {\n    Inherit = 0,\n    LTR = 1,\n    RTL = 2,\n  }\n\n  export enum Display {\n    Flex = 0,\n    None = 1,\n    Contents = 2,\n  }\n\n  export enum Edge {\n    Left = 0,\n    Top = 1,\n    Right = 2,\n    Bottom = 3,\n    Start = 4,\n    End = 5,\n    Horizontal = 6,\n    Vertical = 7,\n    All = 8,\n  }\n\n  export enum Errata {\n    None = 0,\n    StretchFlexBasis = 1,\n    AbsolutePositionWithoutInsetsExcludesPadding = 2,\n    AbsolutePercentAgainstInnerSize = 4,\n    All = 2147483647,\n    Classic = 2147483646,\n  }\n\n  export enum ExperimentalFeature {\n    WebFlexBasis = 0,\n  }\n\n  export enum FlexDirection {\n    Column = 0,\n    ColumnReverse = 1,\n    Row = 2,\n    RowReverse = 3,\n  }\n\n  export enum Gutter {\n    Column = 0,\n    Row = 1,\n    All = 2,\n  }\n\n  export enum Justify {\n    FlexStart = 0,\n    Center = 1,\n    FlexEnd = 2,\n    SpaceBetween = 3,\n    SpaceAround = 4,\n    SpaceEvenly = 5,\n  }\n\n  export enum LogLevel {\n    Error = 0,\n    Warn = 1,\n    Info = 2,\n    Debug = 3,\n    Verbose = 4,\n    Fatal = 5,\n  }\n\n  export enum MeasureMode {\n    Undefined = 0,\n    Exactly = 1,\n    AtMost = 2,\n  }\n\n  export enum NodeType {\n    Default = 0,\n    Text = 1,\n  }\n\n  export enum Overflow {\n    Visible = 0,\n    Hidden = 1,\n    Scroll = 2,\n  }\n\n  export enum PositionType {\n    Static = 0,\n    Relative = 1,\n    Absolute = 2,\n  }\n\n  export enum Unit {\n    Undefined = 0,\n    Point = 1,\n    Percent = 2,\n    Auto = 3,\n  }\n\n  export enum Wrap {\n    NoWrap = 0,\n    Wrap = 1,\n    WrapReverse = 2,\n  }\n\n  export type MeasureFunction = (\n    width: number,\n    widthMeasureMode: MeasureMode,\n    height: number,\n    heightMeasureMode: MeasureMode,\n  ) => {\n    width?: number | undefined;\n    height?: number | undefined;\n  } | null;\n\n  export interface YogaNode {\n    calculateLayout(\n      width?: number,\n      height?: number,\n      direction?: Direction,\n    ): void;\n    copyStyle(node: YogaNode): void;\n    free(): void;\n    freeRecursive(): void;\n    getAlignContent(): Align;\n    getAlignItems(): Align;\n    getAlignSelf(): Align;\n    getAspectRatio(): number;\n    getBorder(edge: Edge): number;\n    getChild(index: number): YogaNode;\n    getChildCount(): number;\n    getComputedBorder(edge: Edge): number;\n    getComputedBottom(): number;\n    getComputedHeight(): number;\n    // getComputedLayout(): Layout;\n    getComputedLeft(): number;\n    getComputedMargin(edge: Edge): number;\n    getComputedPadding(edge: Edge): number;\n    getComputedRight(): number;\n    getComputedTop(): number;\n    getComputedWidth(): number;\n    getDisplay(): Display;\n    getFlexBasis(): number;\n    getFlexDirection(): FlexDirection;\n    getFlexGrow(): number;\n    getFlexShrink(): number;\n    getFlexWrap(): Wrap;\n    getHeight(): Value;\n    getJustifyContent(): Justify;\n    getOverflow(): Overflow;\n    getParent(): YogaNode | null;\n    getPositionType(): PositionType;\n    insertChild(child: YogaNode, index: number): void;\n    isDirty(): boolean;\n    markDirty(): void;\n    removeChild(child: YogaNode): void;\n    reset(): void;\n    setAlignContent(alignContent: Align): void;\n    setAlignItems(alignItems: Align): void;\n    setAlignSelf(alignSelf: Align): void;\n    setAspectRatio(aspectRatio: number): void;\n    setBorder(edge: Edge, borderWidth: number): void;\n    setDisplay(display: Display): void;\n    setFlex(flex: number): void;\n    setFlexBasis(flexBasis: number | string): void;\n    setFlexBasisPercent(flexBasis: number): void;\n    setFlexDirection(flexDirection: Direction): void;\n    setFlexGrow(flexGrow: number): void;\n    setFlexShrink(flexShrink: number): void;\n    setFlexWrap(flexWrap: Wrap): void;\n    setHeight(height: number | string): void;\n    setHeightAuto(): void;\n    setHeightPercent(height: number): void;\n    setJustifyContent(justifyContent: Justify): void;\n    setMargin(edge: Edge, margin: number | string): void;\n    setMarginAuto(edge: Edge): void;\n    setMarginPercent(edge: Edge, margin: number): void;\n    setMaxHeight(maxHeight: number | string): void;\n    setMaxHeightPercent(maxHeight: number): void;\n    setMaxWidth(maxWidth: number | string): void;\n    setMaxWidthPercent(maxWidth: number): void;\n    setGap(gap: Gutter, value: number): void;\n    setGapPercent(gap: Gutter, value: number): void;\n    setMeasureFunc(measureFunction: MeasureFunction): void;\n    setMinHeight(minHeight: number | string): void;\n    setMinHeightPercent(minHeight: number): void;\n    setMinWidth(minWidth: number | string): void;\n    setMinWidthPercent(minWidth: number): void;\n    setOverflow(overflow: Overflow): void;\n    setPadding(edge: Edge, padding: number | string): void;\n    setPaddingPercent(edge: Edge, padding: number): void;\n    setPosition(edge: Edge, position: number | string): void;\n    setPositionPercent(edge: Edge, position: number): void;\n    setPositionType(positionType: PositionType): void;\n    setWidth(width: number | string): void;\n    setWidthAuto(): void;\n    setWidthPercent(width: number): void;\n    unsetMeasureFunc(): void;\n  }\n\n  interface YogaConfig {\n    setPointScaleFactor(factor: number): void;\n  }\n\n  interface ConfigStatic {\n    create(): YogaConfig;\n    destroy(config: YogaConfig): any;\n  }\n\n  interface NodeStatic {\n    create(): YogaNode;\n    createDefault(): YogaNode;\n    createWithConfig(config: YogaConfig): YogaNode;\n    destroy(node: YogaNode): any;\n  }\n\n  export interface Yoga {\n    Node: NodeStatic;\n    Config: ConfigStatic;\n    getInstanceCount(): number;\n  }\n\n  export const loadYoga: () => Promise<Yoga>;\n}\n"
  },
  {
    "path": "packages/layout/jest.config.js",
    "content": "export default {\n  automock: false,\n  testRegex: 'tests/.*?(test)\\\\.js$',\n};\n"
  },
  {
    "path": "packages/layout/package.json",
    "content": "{\n  \"name\": \"@react-pdf/layout\",\n  \"version\": \"4.4.2\",\n  \"license\": \"MIT\",\n  \"description\": \"Resolve document component's layout\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"type\": \"module\",\n  \"main\": \"./lib/index.js\",\n  \"types\": \"./lib/index.d.ts\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/layout\"\n  },\n  \"scripts\": {\n    \"test\": \"vitest\",\n    \"build\": \"rimraf ./lib && rollup -c\",\n    \"watch\": \"rimraf ./lib && rollup -c -w\",\n    \"typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@react-pdf/fns\": \"3.1.2\",\n    \"@react-pdf/image\": \"^3.0.4\",\n    \"@react-pdf/primitives\": \"^4.1.1\",\n    \"@react-pdf/stylesheet\": \"^6.1.2\",\n    \"@react-pdf/textkit\": \"^6.1.0\",\n    \"@react-pdf/types\": \"^2.9.2\",\n    \"emoji-regex-xs\": \"^1.0.0\",\n    \"queue\": \"^6.0.1\",\n    \"yoga-layout\": \"^3.2.1\"\n  },\n  \"files\": [\n    \"lib\"\n  ]\n}\n"
  },
  {
    "path": "packages/layout/rollup.config.js",
    "content": "import typescript from '@rollup/plugin-typescript';\nimport { dts } from 'rollup-plugin-dts';\nimport del from 'rollup-plugin-delete';\n\nimport pkg from './package.json' with { type: 'json' };\n\nconst config = [\n  {\n    input: 'src/index.ts',\n    output: { format: 'es', dir: 'lib' },\n    external: Object.keys(pkg.dependencies).concat(/@react-pdf/),\n    plugins: [typescript(), del({ targets: 'lib' })],\n  },\n  {\n    input: './lib/types/index.d.ts',\n    output: [{ file: 'lib/index.d.ts', format: 'es' }],\n    plugins: [dts(), del({ targets: 'lib/types', hook: 'buildEnd' })],\n  },\n];\n\nexport default config;\n"
  },
  {
    "path": "packages/layout/setupTests.js",
    "content": "import { vi } from 'vitest';\nimport createFetchMock from 'vitest-fetch-mock';\n\nimport '../../polyfills';\n\nconst fetchMocker = createFetchMock(vi);\nfetchMocker.enableMocks();\n\nglobal.BROWSER = false;\n"
  },
  {
    "path": "packages/layout/src/canvas/measureCanvas.ts",
    "content": "import { MeasureFunction } from 'yoga-layout/load';\nimport getMargin from '../node/getMargin';\nimport getPadding from '../node/getPadding';\nimport isHeightAuto from '../page/isHeightAuto';\nimport { SafePageNode } from '../types';\nimport { SafeCanvasNode } from '../types/canvas';\n\nconst SAFETY_HEIGHT = 10;\n\ntype Point = [number, number];\n\nconst getMax = (values: number[]) => Math.max(-Infinity, ...values);\n\n/**\n * Helper object to predict canvas size\n * TODO: Implement remaining functions (as close as possible);\n */\nconst measureCtx = () => {\n  const ctx: any = {};\n  const points: Point[] = [];\n\n  const nil = () => ctx;\n  const addPoint = (x: number, y: number) => points.push([x, y]);\n\n  const moveTo = (x: number, y: number) => {\n    addPoint(x, y);\n    return ctx;\n  };\n\n  const rect = (x: number, y: number, w: number, h: number) => {\n    addPoint(x, y);\n    addPoint(x + w, y);\n    addPoint(x, y + h);\n    addPoint(x + w, y + h);\n    return ctx;\n  };\n\n  const ellipse = (x: number, y: number, rx: number, ry: number) => {\n    ry = ry || rx;\n\n    addPoint(x - rx, y - ry);\n    addPoint(x + rx, y - ry);\n    addPoint(x + rx, y + ry);\n    addPoint(x - rx, y + ry);\n\n    return ctx;\n  };\n\n  const polygon = (...pts: Point[]) => {\n    points.push(...pts);\n    return ctx;\n  };\n\n  // Change dimensions\n  ctx.rect = rect;\n  ctx.moveTo = moveTo;\n  ctx.lineTo = moveTo;\n  ctx.circle = ellipse;\n  ctx.polygon = polygon;\n  ctx.ellipse = ellipse;\n  ctx.roundedRect = rect;\n\n  // To be implemented\n  ctx.text = nil;\n  ctx.path = nil;\n  ctx.lineWidth = nil;\n  ctx.bezierCurveTo = nil;\n  ctx.quadraticCurveTo = nil;\n\n  ctx.scale = nil;\n  ctx.rotate = nil;\n  ctx.translate = nil;\n\n  // These don't change dimensions\n  ctx.dash = nil;\n  ctx.clip = nil;\n  ctx.save = nil;\n  ctx.fill = nil;\n  ctx.font = nil;\n  ctx.stroke = nil;\n  ctx.lineCap = nil;\n  ctx.opacity = nil;\n  ctx.restore = nil;\n  ctx.lineJoin = nil;\n  ctx.fontSize = nil;\n  ctx.fillColor = nil;\n  ctx.miterLimit = nil;\n  ctx.strokeColor = nil;\n  ctx.fillOpacity = nil;\n  ctx.strokeOpacity = nil;\n  ctx.linearGradient = nil;\n  ctx.radialGradient = nil;\n\n  ctx.getWidth = () => getMax(points.map((p) => p[0]));\n  ctx.getHeight = () => getMax(points.map((p) => p[1]));\n\n  return ctx;\n};\n\n/**\n * @typedef {Function} MeasureCanvas\n * @returns {{ width: number, height: number }} canvas width and height\n */\n\n/**\n * Yoga canvas measure function\n *\n * @param {Object} page\n * @param {Object} node\n * @returns {MeasureCanvas} measure canvas\n */\nconst measureCanvas =\n  (page: SafePageNode, node: SafeCanvasNode): MeasureFunction =>\n  () => {\n    const imageMargin = getMargin(node);\n    const pagePadding = getPadding(page);\n\n    // TODO: Check image percentage margins\n    const pageArea = isHeightAuto(page)\n      ? Infinity\n      : (page.box?.height || 0) -\n        (pagePadding.paddingTop as number) -\n        (pagePadding.paddingBottom as number) -\n        (imageMargin.marginTop as number) -\n        (imageMargin.marginBottom as number) -\n        SAFETY_HEIGHT;\n\n    const ctx = measureCtx();\n\n    node.props.paint(ctx);\n\n    const width = ctx.getWidth();\n    const height = Math.min(pageArea, ctx.getHeight());\n\n    return { width, height };\n  };\n\nexport default measureCanvas;\n"
  },
  {
    "path": "packages/layout/src/image/fetchImage.ts",
    "content": "import resolveImage from '@react-pdf/image';\n\nimport getSource from './getSource';\nimport resolveSource from './resolveSource';\nimport { SafeImageNode } from '../types';\n\n/**\n * Fetches image and append data to node\n * Ideally this fn should be immutable.\n *\n * @param node\n */\nconst fetchImage = async (node: SafeImageNode) => {\n  const src = getSource(node);\n  const { cache } = node.props;\n\n  if (!src) {\n    console.warn(false, 'Image should receive either a \"src\" or \"source\" prop');\n    return;\n  }\n\n  try {\n    const source = await resolveSource(src);\n\n    if (!source) {\n      throw new Error(`Image's \"src\" or \"source\" prop returned ${source}`);\n    }\n\n    node.image = await resolveImage(source, { cache });\n\n    if (Buffer.isBuffer(source) || source instanceof Blob) return;\n\n    node.image.key = 'data' in source ? source.data.toString() : source.uri;\n  } catch (e: any) {\n    console.warn(e.message);\n  }\n};\n\nexport default fetchImage;\n"
  },
  {
    "path": "packages/layout/src/image/getRatio.ts",
    "content": "import { SafeImageNode } from '../types';\n\n/**\n * Get image ratio\n *\n * @param node - Image node\n * @returns Image ratio\n */\nconst getRatio = (node: SafeImageNode) => {\n  return node.image?.data ? node.image.width / node.image.height : 1;\n};\n\nexport default getRatio;\n"
  },
  {
    "path": "packages/layout/src/image/getSource.ts",
    "content": "import { SafeImageNode } from '../types';\n\n/**\n * Get image source\n *\n * @param node - Image node\n * @returns Image src\n */\nconst getSource = (node: SafeImageNode) => {\n  if (node.props.src) return node.props.src;\n  if (node.props.source) return node.props.source;\n};\n\nexport default getSource;\n"
  },
  {
    "path": "packages/layout/src/image/measureImage.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\n\nimport getRatio from './getRatio';\nimport getMargin from '../node/getMargin';\nimport getPadding from '../node/getPadding';\nimport isHeightAuto from '../page/isHeightAuto';\nimport { SafeImageNode, SafePageNode } from '../types';\n\nconst SAFETY_HEIGHT = 10;\n\n/**\n * Yoga image measure function\n *\n * @param page - Page\n * @param node - Node\n * @returns Measure image\n */\nconst measureImage =\n  (page: SafePageNode, node: SafeImageNode): Yoga.MeasureFunction =>\n  (width, widthMode, height, heightMode) => {\n    const imageRatio = getRatio(node);\n    const imageMargin = getMargin(node);\n    const pagePadding = getPadding(page);\n\n    // TODO: Check image percentage margins\n    const pageArea = isHeightAuto(page)\n      ? Infinity\n      : (page.box?.height || 0) -\n        (pagePadding.paddingTop as number) -\n        (pagePadding.paddingBottom as number) -\n        (imageMargin.marginTop as number) -\n        (imageMargin.marginBottom as number) -\n        SAFETY_HEIGHT;\n\n    // Skip measure if image data not present yet\n    if (!node.image) return { width: 0, height: 0 };\n\n    if (\n      widthMode === Yoga.MeasureMode.Exactly &&\n      heightMode === Yoga.MeasureMode.Undefined\n    ) {\n      const scaledHeight = width / imageRatio;\n      return { height: Math.min(pageArea, scaledHeight) };\n    }\n\n    if (\n      heightMode === Yoga.MeasureMode.Exactly &&\n      (widthMode === Yoga.MeasureMode.AtMost ||\n        widthMode === Yoga.MeasureMode.Undefined)\n    ) {\n      return { width: Math.min(height * imageRatio, width) };\n    }\n\n    if (\n      widthMode === Yoga.MeasureMode.Exactly &&\n      heightMode === Yoga.MeasureMode.AtMost\n    ) {\n      const scaledHeight = width / imageRatio;\n      return { height: Math.min(height, pageArea, scaledHeight) };\n    }\n\n    if (\n      widthMode === Yoga.MeasureMode.AtMost &&\n      heightMode === Yoga.MeasureMode.AtMost\n    ) {\n      if (imageRatio > 1) {\n        return {\n          width,\n          height: Math.min(width / imageRatio, height),\n        };\n      }\n\n      return {\n        height,\n        width: Math.min(height * imageRatio, width),\n      };\n    }\n\n    return { height, width };\n  };\n\nexport default measureImage;\n"
  },
  {
    "path": "packages/layout/src/image/resolveSource.ts",
    "content": "import { SourceObject } from '../types';\n\n/**\n * Resolves `src` to `@react-pdf/image` interface.\n *\n * Also it handles factories and async sources.\n *\n * @param src\n * @returns Resolved src\n */\nconst resolveSource = async (src: SourceObject) => {\n  const source = typeof src === 'function' ? await src() : await src;\n  return typeof source === 'string' ? { uri: source } : source;\n};\n\nexport default resolveSource;\n"
  },
  {
    "path": "packages/layout/src/index.ts",
    "content": "import { asyncCompose } from '@react-pdf/fns';\n\nimport resolveSvg from './steps/resolveSvg';\nimport resolveYoga from './steps/resolveYoga';\nimport resolveZIndex from './steps/resolveZIndex';\nimport resolveAssets from './steps/resolveAssets';\nimport resolveStyles from './steps/resolveStyles';\nimport resolveOrigins from './steps/resolveOrigins';\nimport resolveBookmarks from './steps/resolveBookmarks';\nimport resolvePageSizes from './steps/resolvePageSizes';\nimport resolvePagination from './steps/resolvePagination';\nimport resolveDimensions from './steps/resolveDimensions';\nimport resolveTextLayout from './steps/resolveTextLayout';\nimport resolveInheritance from './steps/resolveInheritance';\nimport resolvePagePaddings from './steps/resolvePagePaddings';\nimport resolvePercentRadius from './steps/resolvePercentRadius';\nimport resolvePercentHeight from './steps/resolvePercentHeight';\nimport resolveLinkSubstitution from './steps/resolveLinkSubstitution';\n\nconst layout = asyncCompose(\n  resolveZIndex,\n  resolveOrigins,\n  resolveAssets,\n  resolvePagination,\n  resolveTextLayout,\n  resolvePercentRadius,\n  resolveDimensions,\n  resolveSvg,\n  resolveAssets,\n  resolveInheritance,\n  resolvePercentHeight,\n  resolvePagePaddings,\n  resolveStyles,\n  resolveLinkSubstitution,\n  resolveBookmarks,\n  resolvePageSizes,\n  resolveYoga,\n);\n\nexport * from './types';\n\nexport default layout;\n"
  },
  {
    "path": "packages/layout/src/node/createInstances.ts",
    "content": "import { castArray } from '@react-pdf/fns';\nimport * as P from '@react-pdf/primitives';\nimport React from 'react';\n\nimport { Node } from '../types';\n\nconst isString = (value: any): value is string => typeof value === 'string';\n\nconst isNumber = (value: any): value is number => typeof value === 'number';\n\nconst isBoolean = (value: any): value is boolean => typeof value === 'boolean';\n\nconst isFragment = (value: any): value is React.ReactFragment =>\n  value && value.type === Symbol.for('react.fragment');\n\n/**\n * Transforms a react element instance to internal element format.\n *\n * Can return multiple instances in the case of arrays or fragments.\n *\n * @param element - React element\n * @returns Parsed React elements\n */\nconst createInstances = (element: React.ReactNode): Node[] => {\n  if (!element) return [];\n\n  if (Array.isArray(element)) {\n    return element.reduce((acc, el) => acc.concat(createInstances(el)), []);\n  }\n\n  if (isBoolean(element)) {\n    return [];\n  }\n\n  if (isString(element) || isNumber(element)) {\n    return [{ type: P.TextInstance, value: `${element}` }];\n  }\n\n  if (isFragment(element)) {\n    // @ts-expect-error figure out why this is complains\n    return createInstances(element.props.children);\n  }\n\n  if (!isString(element.type)) {\n    // @ts-expect-error figure out why this is complains\n    return createInstances(element.type(element.props));\n  }\n\n  const {\n    type,\n    props: { style = {}, children, ...props },\n  } = element;\n\n  const nextChildren = castArray(children).reduce(\n    (acc, child) => acc.concat(createInstances(child)),\n    [],\n  );\n\n  return [\n    {\n      type,\n      style,\n      props,\n      children: nextChildren,\n    },\n  ] as Node[];\n};\n\nexport default createInstances;\n"
  },
  {
    "path": "packages/layout/src/node/getBorderWidth.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\n\nimport { SafeNode } from '../types';\n\nconst getComputedBorder = (\n  yogaNode: Yoga.YogaNode | undefined,\n  edge: Yoga.Edge,\n) => (yogaNode ? yogaNode.getComputedBorder(edge) : 0);\n\n/**\n * Get Yoga computed border width. Zero otherwise\n *\n * @param node\n * @returns Border widths\n */\nconst getBorderWidth = (node: SafeNode) => {\n  const { yogaNode } = node;\n\n  return {\n    borderTopWidth: getComputedBorder(yogaNode, Yoga.Edge.Top),\n    borderRightWidth: getComputedBorder(yogaNode, Yoga.Edge.Right),\n    borderBottomWidth: getComputedBorder(yogaNode, Yoga.Edge.Bottom),\n    borderLeftWidth: getComputedBorder(yogaNode, Yoga.Edge.Left),\n  };\n};\n\nexport default getBorderWidth;\n"
  },
  {
    "path": "packages/layout/src/node/getDimension.ts",
    "content": "import { SafeNode } from '../types';\n\nconst DEFAULT_DIMENSION = {\n  width: 0,\n  height: 0,\n};\n\n/**\n * Get Yoga computed dimensions. Zero otherwise\n *\n * @param node\n * @returns Dimensions\n */\nconst getDimension = (node: SafeNode) => {\n  const { yogaNode } = node;\n\n  if (!yogaNode) return DEFAULT_DIMENSION;\n\n  return {\n    width: yogaNode.getComputedWidth(),\n    height: yogaNode.getComputedHeight(),\n  };\n};\n\nexport default getDimension;\n"
  },
  {
    "path": "packages/layout/src/node/getMargin.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\n\nimport { SafeNode } from '../types';\n\nconst getComputedMargin = (node: SafeNode, edge: Yoga.Edge) => {\n  const { yogaNode } = node;\n  return yogaNode ? yogaNode.getComputedMargin(edge) : null;\n};\n\n/**\n * Get Yoga computed magins. Zero otherwise\n *\n * @param node\n * @returns Margins\n */\nconst getMargin = (node: SafeNode) => {\n  const { style, box } = node;\n\n  const marginTop =\n    getComputedMargin(node, Yoga.Edge.Top) ||\n    box?.marginTop ||\n    style?.marginTop ||\n    0;\n\n  const marginRight =\n    getComputedMargin(node, Yoga.Edge.Right) ||\n    box?.marginRight ||\n    style?.marginRight ||\n    0;\n\n  const marginBottom =\n    getComputedMargin(node, Yoga.Edge.Bottom) ||\n    box?.marginBottom ||\n    style?.marginBottom ||\n    0;\n\n  const marginLeft =\n    getComputedMargin(node, Yoga.Edge.Left) ||\n    box?.marginLeft ||\n    style?.marginLeft ||\n    0;\n\n  return { marginTop, marginRight, marginBottom, marginLeft };\n};\n\nexport default getMargin;\n"
  },
  {
    "path": "packages/layout/src/node/getOrigin.ts",
    "content": "import { isNil, matchPercent } from '@react-pdf/fns';\nimport { Origin, SafeNode } from '../types';\n\nconst getTransformStyle =\n  (s: 'transformOriginX' | 'transformOriginY') => (node: SafeNode) =>\n    isNil(node.style?.[s]) ? '50%' : node.style?.[s] ?? null;\n\n/**\n * Get node origin\n *\n * @param node\n * @returns {{ left?: number, top?: number }} node origin\n */\nconst getOrigin = (node: SafeNode): Origin | null => {\n  if (!node.box) return null;\n\n  const { left, top, width, height } = node.box;\n  const transformOriginX = getTransformStyle('transformOriginX')(node);\n  const transformOriginY = getTransformStyle('transformOriginY')(node);\n\n  const percentX = matchPercent(transformOriginX);\n  const percentY = matchPercent(transformOriginY);\n\n  const offsetX = percentX ? width * percentX.percent : transformOriginX;\n  const offsetY = percentY ? height * percentY.percent : transformOriginY;\n\n  if (isNil(offsetX) || typeof offsetX === 'string')\n    throw new Error(`Invalid origin offsetX: ${offsetX}`);\n\n  if (isNil(offsetY) || typeof offsetY === 'string')\n    throw new Error(`Invalid origin offsetY: ${offsetY}`);\n\n  return { left: left + offsetX, top: top + offsetY };\n};\n\nexport default getOrigin;\n"
  },
  {
    "path": "packages/layout/src/node/getPadding.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\n\nimport { SafeNode } from '../types';\n\nconst getComputedPadding = (node: SafeNode, edge: Yoga.Edge) => {\n  const { yogaNode } = node;\n  return yogaNode ? yogaNode.getComputedPadding(edge) : null;\n};\n\n/**\n * Get Yoga computed paddings. Zero otherwise\n *\n * @param  node\n * @returns paddings\n */\nconst getPadding = (node: SafeNode) => {\n  const { style, box } = node;\n\n  const paddingTop =\n    getComputedPadding(node, Yoga.Edge.Top) ||\n    box?.paddingTop ||\n    style?.paddingTop ||\n    0;\n\n  const paddingRight =\n    getComputedPadding(node, Yoga.Edge.Right) ||\n    box?.paddingRight ||\n    style?.paddingRight ||\n    0;\n\n  const paddingBottom =\n    getComputedPadding(node, Yoga.Edge.Bottom) ||\n    box?.paddingBottom ||\n    style?.paddingBottom ||\n    0;\n\n  const paddingLeft =\n    getComputedPadding(node, Yoga.Edge.Left) ||\n    box?.paddingLeft ||\n    style?.paddingLeft ||\n    0;\n\n  return { paddingTop, paddingRight, paddingBottom, paddingLeft };\n};\n\nexport default getPadding;\n"
  },
  {
    "path": "packages/layout/src/node/getPosition.ts",
    "content": "import { SafeNode } from '../types';\n\n/**\n * Get Yoga computed position. Zero otherwise\n *\n * @param node\n * @returns Position\n */\nconst getPosition = (node: SafeNode) => {\n  const { yogaNode } = node;\n\n  return {\n    top: yogaNode?.getComputedTop() || 0,\n    right: yogaNode?.getComputedRight() || 0,\n    bottom: yogaNode?.getComputedBottom() || 0,\n    left: yogaNode?.getComputedLeft() || 0,\n  };\n};\n\nexport default getPosition;\n"
  },
  {
    "path": "packages/layout/src/node/getWrap.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeNode } from '../types';\n\nconst NON_WRAP_TYPES = [P.Svg, P.Note, P.Image, P.Canvas];\n\nconst getWrap = (node: SafeNode) => {\n  if (NON_WRAP_TYPES.includes(node.type)) return false;\n\n  if (!node.props) return true;\n\n  return 'wrap' in node.props ? node.props.wrap : true;\n};\n\nexport default getWrap;\n"
  },
  {
    "path": "packages/layout/src/node/isFixed.ts",
    "content": "import { SafeNode } from '../types';\n\nconst isFixed = (node: SafeNode) => {\n  if (!node.props) return false;\n\n  return 'fixed' in node.props ? node.props.fixed === true : false;\n};\n\nexport default isFixed;\n"
  },
  {
    "path": "packages/layout/src/node/removePaddings.ts",
    "content": "import { omit } from '@react-pdf/fns';\n\nimport setPadding from './setPadding';\nimport { SafeNode } from '../types';\n\nconst PADDING_PROPS = [\n  'padding',\n  'paddingTop',\n  'paddingRight',\n  'paddingBottom',\n  'paddingLeft',\n  'paddingHorizontal',\n  'paddingVertical',\n];\n\n/**\n * Removes padding on node\n *\n * @param node\n * @returns Node without padding\n */\nconst removePaddings = (node: SafeNode) => {\n  const style = omit(PADDING_PROPS, node.style || {});\n  const newNode: SafeNode = Object.assign({}, node, { style });\n\n  setPadding(0)(newNode);\n\n  return newNode;\n};\n\nexport default removePaddings;\n"
  },
  {
    "path": "packages/layout/src/node/setAlign.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\nimport { upperFirst } from '@react-pdf/fns';\nimport { SafeNode } from '../types';\n\nconst ALIGN = {\n  'flex-start': Yoga.Align.FlexStart,\n  center: Yoga.Align.Center,\n  'flex-end': Yoga.Align.FlexEnd,\n  stretch: Yoga.Align.Stretch,\n  baseline: Yoga.Align.Baseline,\n  'space-between': Yoga.Align.SpaceBetween,\n  'space-around': Yoga.Align.SpaceAround,\n  'space-evenly': Yoga.Align.SpaceEvenly,\n};\n\n/**\n * Set generic align attribute to node's Yoga instance\n *\n * @param attr - Specific align property\n * @param value - Specific align value\n * @param node - Node\n * @returns Node\n */\nconst setAlign = (attr: string) => (value: any) => (node: SafeNode) => {\n  const { yogaNode } = node;\n  const defaultValue = attr === 'items' ? Yoga.Align.Stretch : Yoga.Align.Auto;\n\n  if (yogaNode) {\n    const align = ALIGN[value] || defaultValue;\n\n    yogaNode[`setAlign${upperFirst(attr)}`](align);\n  }\n\n  return node;\n};\n\nexport default setAlign;\n"
  },
  {
    "path": "packages/layout/src/node/setAlignContent.ts",
    "content": "import setAlign from './setAlign';\n\n/**\n * Set align content attribute to node's Yoga instance\n *\n * @param align - Value\n * @param node - Instance\n * @returns Node instance\n */\nconst setAlignContent = setAlign('content');\n\nexport default setAlignContent;\n"
  },
  {
    "path": "packages/layout/src/node/setAlignItems.ts",
    "content": "import setAlign from './setAlign';\n\n/**\n * Set align items attribute to node's Yoga instance\n *\n * @param align - Value\n * @param node - Node instance\n * @returns Node instance\n */\nconst setAlignItems = setAlign('items');\n\nexport default setAlignItems;\n"
  },
  {
    "path": "packages/layout/src/node/setAlignSelf.ts",
    "content": "import setAlign from './setAlign';\n\n/**\n * Set align self attribute to node's Yoga instance\n *\n * @param align - Value\n * @param node - Node instance\n * @returns Node instance\n */\nconst setAlignSelf = setAlign('self');\n\nexport default setAlignSelf;\n"
  },
  {
    "path": "packages/layout/src/node/setAspectRatio.ts",
    "content": "import { isNil } from '@react-pdf/fns';\nimport { SafeNode } from '../types';\n\n/**\n * Set aspect ratio attribute to node's Yoga instance\n *\n * @param value - Ratio\n * @returns Node instance\n */\nconst setAspectRatio = (value?: number | null) => (node: SafeNode) => {\n  const { yogaNode } = node;\n\n  if (!isNil(value) && yogaNode) {\n    yogaNode.setAspectRatio(value);\n  }\n\n  return node;\n};\n\nexport default setAspectRatio;\n"
  },
  {
    "path": "packages/layout/src/node/setBorderWidth.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\n\nimport setYogaValue from './setYogaValue';\nimport { SafeNode } from '../types';\n\n/**\n * Set border top attribute to node's Yoga instance\n *\n * @param border - Border top width\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setBorderTop = setYogaValue('border', Yoga.Edge.Top);\n\n/**\n * Set border right attribute to node's Yoga instance\n *\n * @param border - Border right width\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setBorderRight = setYogaValue('border', Yoga.Edge.Right);\n\n/**\n * Set border bottom attribute to node's Yoga instance\n *\n * @param border - Border bottom width\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setBorderBottom = setYogaValue('border', Yoga.Edge.Bottom);\n\n/**\n * Set border left attribute to node's Yoga instance\n *\n * @param border - Border left width\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setBorderLeft = setYogaValue('border', Yoga.Edge.Left);\n\n/**\n * Set all border widths at once\n *\n * @param width - Border width\n * @returns Node instance wrapper\n */\nexport const setBorder = (width?: number | null) => (node: SafeNode) => {\n  setBorderTop(width)(node);\n  setBorderRight(width)(node);\n  setBorderBottom(width)(node);\n  setBorderLeft(width)(node);\n\n  return node;\n};\n\nexport default setBorder;\n"
  },
  {
    "path": "packages/layout/src/node/setDimension.ts",
    "content": "import setYogaValue from './setYogaValue';\n\n/**\n * Set width to node's Yoga instance\n *\n * @param width - Width\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setWidth = setYogaValue('width');\n\n/**\n * Set min width to node's Yoga instance\n *\n * @param min - Width\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setMinWidth = setYogaValue('minWidth');\n\n/**\n * Set max width to node's Yoga instance\n *\n * @param max - Width\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setMaxWidth = setYogaValue('maxWidth');\n\n/**\n * Set height to node's Yoga instance\n *\n * @param height - Height\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setHeight = setYogaValue('height');\n\n/**\n * Set min height to node's Yoga instance\n *\n * @param min - Height\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setMinHeight = setYogaValue('minHeight');\n\n/**\n * Set max height to node's Yoga instance\n *\n * @param max - Height\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setMaxHeight = setYogaValue('maxHeight');\n"
  },
  {
    "path": "packages/layout/src/node/setDisplay.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\nimport { SafeNode } from '../types';\n\n/**\n * Set display attribute to node's Yoga instance\n *\n * @param value - Display\n * @returns Node instance wrapper\n */\nconst setDisplay = (value?: string | null) => (node: SafeNode) => {\n  const { yogaNode } = node;\n\n  if (yogaNode) {\n    yogaNode.setDisplay(\n      value === 'none' ? Yoga.Display.None : Yoga.Display.Flex,\n    );\n  }\n\n  return node;\n};\n\nexport default setDisplay;\n"
  },
  {
    "path": "packages/layout/src/node/setFlexBasis.ts",
    "content": "import setYogaValue from './setYogaValue';\n\n/**\n * Set flex basis attribute to node's Yoga instance\n *\n * @param flex - Basis value\n * @param node - Node instance\n * @returns Node instance\n */\nconst setFlexBasis = setYogaValue('flexBasis');\n\nexport default setFlexBasis;\n"
  },
  {
    "path": "packages/layout/src/node/setFlexDirection.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\n\nimport { SafeNode } from '../types';\n\nconst FLEX_DIRECTIONS = {\n  row: Yoga.FlexDirection.Row,\n  'row-reverse': Yoga.FlexDirection.RowReverse,\n  'column-reverse': Yoga.FlexDirection.ColumnReverse,\n};\n\n/**\n * Set flex direction attribute to node's Yoga instance\n *\n * @param value - Flex direction value\n * @returns Node instance wrapper\n */\nconst setFlexDirection = (value?: string | null) => (node: SafeNode) => {\n  const { yogaNode } = node;\n\n  if (yogaNode) {\n    const flexDirection = FLEX_DIRECTIONS[value] || Yoga.FlexDirection.Column;\n    yogaNode.setFlexDirection(flexDirection);\n  }\n\n  return node;\n};\n\nexport default setFlexDirection;\n"
  },
  {
    "path": "packages/layout/src/node/setFlexGrow.ts",
    "content": "import { SafeNode } from '../types';\nimport setYogaValue from './setYogaValue';\n\n/**\n * Set flex grow attribute to node's Yoga instance\n *\n * @param  value - Flex grow value\n * @returns Node instance wrapper\n */\nconst setFlexGrow = (value?: number | null) => (node: SafeNode) => {\n  return setYogaValue('flexGrow')(value || 0)(node);\n};\n\nexport default setFlexGrow;\n"
  },
  {
    "path": "packages/layout/src/node/setFlexShrink.ts",
    "content": "import { SafeNode } from '../types';\nimport setYogaValue from './setYogaValue';\n\n/**\n * Set flex shrink attribute to node's Yoga instance\n *\n * @param value - Flex shrink value\n * @returns Node instance wrapper\n */\nconst setFlexShrink = (value?: string | number | null) => (node: SafeNode) => {\n  return setYogaValue('flexShrink')(value || 1)(node);\n};\n\nexport default setFlexShrink;\n"
  },
  {
    "path": "packages/layout/src/node/setFlexWrap.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\nimport { SafeNode } from '../types';\n\nconst FLEX_WRAP = {\n  wrap: Yoga.Wrap.Wrap,\n  'wrap-reverse': Yoga.Wrap.WrapReverse,\n};\n\n/**\n * Set flex wrap attribute to node's Yoga instance\n *\n * @param value - Flex wrap value\n * @returns Node instance wrapper\n */\nconst setFlexWrap = (value?: string | null) => (node: SafeNode) => {\n  const { yogaNode } = node;\n\n  if (yogaNode) {\n    const flexWrap: Yoga.Wrap = FLEX_WRAP[value] || Yoga.Wrap.NoWrap;\n    yogaNode.setFlexWrap(flexWrap);\n  }\n\n  return node;\n};\n\nexport default setFlexWrap;\n"
  },
  {
    "path": "packages/layout/src/node/setGap.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\n\nimport setYogaValue from './setYogaValue';\n\n/**\n * Set rowGap value to node's Yoga instance\n *\n * @param value - Gap value\n * @returns Node instance wrapper\n */\nexport const setRowGap = setYogaValue('gap', Yoga.Gutter.Row);\n\n/**\n * Set columnGap value to node's Yoga instance\n *\n * @param value - Gap value\n * @returns Node instance wrapper\n */\nexport const setColumnGap = setYogaValue('gap', Yoga.Gutter.Column);\n"
  },
  {
    "path": "packages/layout/src/node/setJustifyContent.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\nimport { isNil } from '@react-pdf/fns';\nimport { SafeNode } from '../types';\n\nconst JUSTIFY_CONTENT = {\n  center: Yoga.Justify.Center,\n  'flex-end': Yoga.Justify.FlexEnd,\n  'space-between': Yoga.Justify.SpaceBetween,\n  'space-around': Yoga.Justify.SpaceAround,\n  'space-evenly': Yoga.Justify.SpaceEvenly,\n};\n\n/**\n * Set justify content attribute to node's Yoga instance\n *\n * @param value - Justify content value\n * @returns Node instance wrapper\n */\nconst setJustifyContent = (value?: string | null) => (node: SafeNode) => {\n  const { yogaNode } = node;\n\n  if (!isNil(value) && yogaNode) {\n    const justifyContent = JUSTIFY_CONTENT[value] || Yoga.Justify.FlexStart;\n    yogaNode.setJustifyContent(justifyContent);\n  }\n\n  return node;\n};\n\nexport default setJustifyContent;\n"
  },
  {
    "path": "packages/layout/src/node/setMargin.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\n\nimport setYogaValue from './setYogaValue';\nimport { SafeNode } from '../types';\n\n/**\n * Set margin top attribute to node's Yoga instance\n *\n * @param margin - Margin top\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setMarginTop = setYogaValue('margin', Yoga.Edge.Top);\n\n/**\n * Set margin right attribute to node's Yoga instance\n *\n * @param margin - Margin right\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setMarginRight = setYogaValue('margin', Yoga.Edge.Right);\n\n/**\n * Set margin bottom attribute to node's Yoga instance\n *\n * @param margin - Margin bottom\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setMarginBottom = setYogaValue('margin', Yoga.Edge.Bottom);\n\n/**\n * Set margin left attribute to node's Yoga instance\n *\n * @param margin - Margin left\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setMarginLeft = setYogaValue('margin', Yoga.Edge.Left);\n\n/**\n * Set all margins at once\n *\n * @param margin - Margin\n * @returns Node instance wrapper\n */\nexport const setMargin =\n  (margin?: number | string | null) => (node: SafeNode) => {\n    setMarginTop(margin)(node);\n    setMarginRight(margin)(node);\n    setMarginBottom(margin)(node);\n    setMarginLeft(margin)(node);\n\n    return node;\n  };\n\nexport default setMargin;\n"
  },
  {
    "path": "packages/layout/src/node/setOverflow.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\nimport { isNil } from '@react-pdf/fns';\nimport { SafeNode } from '../types';\n\nconst OVERFLOW = {\n  hidden: Yoga.Overflow.Hidden,\n  scroll: Yoga.Overflow.Scroll,\n};\n\n/**\n * Set overflow attribute to node's Yoga instance\n *\n * @param value - Overflow value\n * @returns Node instance wrapper\n */\nconst setOverflow = (value?: string | null) => (node: SafeNode) => {\n  const { yogaNode } = node;\n\n  if (!isNil(value) && yogaNode) {\n    const overflow = OVERFLOW[value] || Yoga.Overflow.Visible;\n    yogaNode.setOverflow(overflow);\n  }\n\n  return node;\n};\n\nexport default setOverflow;\n"
  },
  {
    "path": "packages/layout/src/node/setPadding.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\n\nimport setYogaValue from './setYogaValue';\nimport { SafeNode } from '../types';\n\n/**\n * Set padding top attribute to node's Yoga instance\n *\n * @param padding - Padding top\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setPaddingTop = setYogaValue('padding', Yoga.Edge.Top);\n\n/**\n * Set padding right attribute to node's Yoga instance\n *\n * @param padding - Padding right\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setPaddingRight = setYogaValue('padding', Yoga.Edge.Right);\n\n/**\n * Set padding bottom attribute to node's Yoga instance\n *\n * @param padding - Padding bottom\n * @param node Node instance\n * @returns Node instance\n */\nexport const setPaddingBottom = setYogaValue('padding', Yoga.Edge.Bottom);\n\n/**\n * Set padding left attribute to node's Yoga instance\n *\n * @param padding - Padding left\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setPaddingLeft = setYogaValue('padding', Yoga.Edge.Left);\n\n/**\n * Set all paddings at once\n *\n * @param padding padding\n * @returns Node instance\n */\nexport const setPadding =\n  (padding?: number | string | null) => (node: SafeNode) => {\n    setPaddingTop(padding)(node);\n    setPaddingRight(padding)(node);\n    setPaddingBottom(padding)(node);\n    setPaddingLeft(padding)(node);\n\n    return node;\n  };\n\nexport default setPadding;\n"
  },
  {
    "path": "packages/layout/src/node/setPosition.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\n\nimport setYogaValue from './setYogaValue';\nimport { SafeNode } from '../types';\n\n/**\n * Set position top attribute to node's Yoga instance\n *\n * @param position - Position top\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setPositionTop = setYogaValue('position', Yoga.Edge.Top);\n\n/**\n * Set position right attribute to node's Yoga instance\n *\n * @param position - Position right\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setPositionRight = setYogaValue('position', Yoga.Edge.Right);\n\n/**\n * Set position bottom attribute to node's Yoga instance\n *\n * @param position - Position bottom\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setPositionBottom = setYogaValue('position', Yoga.Edge.Bottom);\n\n/**\n * Set position left attribute to node's Yoga instance\n *\n * @param position - Position left\n * @param node - Node instance\n * @returns Node instance\n */\nexport const setPositionLeft = setYogaValue('position', Yoga.Edge.Left);\n\n/**\n * Set all positions at once\n *\n * @param position - Position\n * @returns Node instance wrapper\n */\nexport const setPosition =\n  (position?: number | string | null) => (node: SafeNode) => {\n    setPositionTop(position)(node);\n    setPositionRight(position)(node);\n    setPositionBottom(position)(node);\n    setPositionLeft(position)(node);\n\n    return node;\n  };\n\nexport default setPosition;\n"
  },
  {
    "path": "packages/layout/src/node/setPositionType.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\nimport { isNil } from '@react-pdf/fns';\nimport { SafeNode } from '../types';\n\nconst POSITION = {\n  absolute: Yoga.PositionType.Absolute,\n  relative: Yoga.PositionType.Relative,\n  static: Yoga.PositionType.Static,\n};\n\n/**\n * Set position type attribute to node's Yoga instance\n *\n * @param value - Position position type\n * @returns Node instance\n */\nconst setPositionType = (value?: string | null) => (node: SafeNode) => {\n  const { yogaNode } = node;\n\n  if (!isNil(value) && yogaNode) {\n    yogaNode.setPositionType(POSITION[value]);\n  }\n\n  return node;\n};\n\nexport default setPositionType;\n"
  },
  {
    "path": "packages/layout/src/node/setYogaValue.ts",
    "content": "import { isNil, upperFirst, matchPercent } from '@react-pdf/fns';\nimport * as Yoga from 'yoga-layout/load';\n\nimport { SafeNode } from '../types';\n\n/**\n * Set generic yoga attribute to node's Yoga instance, handing `auto`, edges and percentage cases\n *\n * @param attr - Property\n * @param edge - Edge\n * @returns Node instance wrapper\n */\nconst setYogaValue =\n  (attr: string, edge?: Yoga.Edge | Yoga.Gutter) =>\n  (value?: string | number | null) =>\n  (node: SafeNode) => {\n    const { yogaNode } = node;\n\n    if (!isNil(value) && yogaNode) {\n      const hasEdge = !isNil(edge);\n      const fixedMethod = `set${upperFirst(attr)}`;\n      const autoMethod = `${fixedMethod}Auto`;\n      const percentMethod = `${fixedMethod}Percent`;\n      const percent = matchPercent(value);\n\n      if (percent && !yogaNode[percentMethod]) {\n        throw new Error(`You can't pass percentage values to ${attr} property`);\n      }\n\n      if (percent) {\n        if (hasEdge) {\n          yogaNode[percentMethod]?.(edge, percent.value);\n        } else {\n          yogaNode[percentMethod]?.(percent.value);\n        }\n      } else if (value === 'auto') {\n        if (hasEdge) {\n          yogaNode[autoMethod]?.(edge);\n        } else {\n          yogaNode[autoMethod]?.();\n        }\n      } else if (hasEdge) {\n        yogaNode[fixedMethod]?.(edge, value);\n      } else {\n        yogaNode[fixedMethod]?.(value);\n      }\n    }\n\n    return node;\n  };\n\nexport default setYogaValue;\n"
  },
  {
    "path": "packages/layout/src/node/shouldBreak.ts",
    "content": "import { SafeNode } from '../types';\nimport getWrap from './getWrap';\nimport isFixed from './isFixed';\n\nconst getBreak = (node: SafeNode) =>\n  'break' in node.props ? node.props.break : false;\n\nconst getMinPresenceAhead = (node: SafeNode) =>\n  'minPresenceAhead' in node.props ? node.props.minPresenceAhead : 0;\n\nconst getFurthestEnd = (elements: SafeNode[]) =>\n  Math.max(...elements.map((node) => node.box.top + node.box.height));\n\nconst getEndOfMinPresenceAhead = (child: SafeNode) => {\n  return (\n    child.box.top +\n    child.box.height +\n    child.box.marginBottom +\n    getMinPresenceAhead(child)\n  );\n};\n\nconst getEndOfPresence = (child: SafeNode, futureElements: SafeNode[]) => {\n  const afterMinPresenceAhead = getEndOfMinPresenceAhead(child);\n  const endOfFurthestFutureElement = getFurthestEnd(\n    futureElements.filter((node) => !('fixed' in node.props)),\n  );\n  return Math.min(afterMinPresenceAhead, endOfFurthestFutureElement);\n};\n\nconst shouldBreak = (\n  child: SafeNode,\n  futureElements: SafeNode[],\n  height: number,\n  previousElements: SafeNode[],\n) => {\n  if ('fixed' in child.props) return false;\n\n  const shouldSplit = height < child.box.top + child.box.height;\n  const canWrap = getWrap(child);\n\n  // Calculate the y coordinate where the desired presence of the child ends\n  const endOfPresence = getEndOfPresence(child, futureElements);\n\n  // If the child is already at the top of the page, breaking won't improve its presence\n  // (as long as react-pdf does not support breaking into differently sized containers)\n  const breakingImprovesPresence =\n    previousElements.filter((node: SafeNode) => !isFixed(node)).length > 0;\n\n  return (\n    getBreak(child) ||\n    (shouldSplit && !canWrap) ||\n    (!shouldSplit && endOfPresence > height && breakingImprovesPresence)\n  );\n};\n\nexport default shouldBreak;\n"
  },
  {
    "path": "packages/layout/src/node/splitNode.ts",
    "content": "import { isNil } from '@react-pdf/fns';\n\nimport { SafeNode } from '../types';\n\nconst getTop = (node: SafeNode) => node.box?.top || 0;\n\nconst hasFixedHeight = (node: SafeNode) => !isNil(node.style?.height);\n\nconst splitNode = (node: SafeNode, height: number) => {\n  if (!node) return [null, null];\n\n  const nodeTop = getTop(node);\n\n  const current: SafeNode = Object.assign({}, node, {\n    box: {\n      ...node.box,\n      borderBottomWidth: 0,\n    },\n    style: {\n      ...node.style,\n      marginBottom: 0,\n      paddingBottom: 0,\n      borderBottomWidth: 0,\n      borderBottomLeftRadius: 0,\n      borderBottomRightRadius: 0,\n    },\n  });\n\n  current.style.height = height - nodeTop;\n\n  const nextHeight = hasFixedHeight(node)\n    ? node.box.height - (height - nodeTop)\n    : null;\n\n  const next: SafeNode = Object.assign({}, node, {\n    box: {\n      ...node.box,\n      top: 0,\n      borderTopWidth: 0,\n    },\n    style: {\n      ...node.style,\n      marginTop: 0,\n      paddingTop: 0,\n      borderTopWidth: 0,\n      borderTopLeftRadius: 0,\n      borderTopRightRadius: 0,\n    },\n    props: {\n      ...node.props,\n      bookmark: null,\n    },\n  });\n\n  if (nextHeight) {\n    next.style.height = nextHeight;\n  }\n\n  return [current, next];\n};\n\nexport default splitNode;\n"
  },
  {
    "path": "packages/layout/src/page/getContentArea.ts",
    "content": "import getPadding from '../node/getPadding';\nimport { SafePageNode } from '../types';\n\nconst getContentArea = (page: SafePageNode) => {\n  const height = page.style?.height as number;\n  const { paddingTop, paddingBottom } = getPadding(page as any);\n\n  return height - (paddingBottom as number) - (paddingTop as number);\n};\n\nexport default getContentArea;\n"
  },
  {
    "path": "packages/layout/src/page/getOrientation.ts",
    "content": "import { PageNode } from '../types';\n\nconst VALID_ORIENTATIONS = ['portrait', 'landscape'];\n\n/**\n * Get page orientation. Defaults to portrait\n *\n * @param page - Page object\n * @returns Page orientation\n */\nconst getOrientation = (page: PageNode) => {\n  const value = page.props?.orientation || 'portrait';\n  return VALID_ORIENTATIONS.includes(value) ? value : 'portrait';\n};\n\nexport default getOrientation;\n"
  },
  {
    "path": "packages/layout/src/page/getSize.ts",
    "content": "import isLandscape from './isLandscape';\nimport { PageNode } from '../types';\n\ntype UnitSize = { width: string | number; height?: string | number };\n\ntype Size = { width: number; height: number };\n\n// Page sizes for 72dpi. 72dpi is used internally by pdfkit.\nconst PAGE_SIZES = {\n  '4A0': [4767.87, 6740.79],\n  '2A0': [3370.39, 4767.87],\n  A0: [2383.94, 3370.39],\n  A1: [1683.78, 2383.94],\n  A2: [1190.55, 1683.78],\n  A3: [841.89, 1190.55],\n  A4: [595.28, 841.89],\n  A5: [419.53, 595.28],\n  A6: [297.64, 419.53],\n  A7: [209.76, 297.64],\n  A8: [147.4, 209.76],\n  A9: [104.88, 147.4],\n  A10: [73.7, 104.88],\n  B0: [2834.65, 4008.19],\n  B1: [2004.09, 2834.65],\n  B2: [1417.32, 2004.09],\n  B3: [1000.63, 1417.32],\n  B4: [708.66, 1000.63],\n  B5: [498.9, 708.66],\n  B6: [354.33, 498.9],\n  B7: [249.45, 354.33],\n  B8: [175.75, 249.45],\n  B9: [124.72, 175.75],\n  B10: [87.87, 124.72],\n  C0: [2599.37, 3676.54],\n  C1: [1836.85, 2599.37],\n  C2: [1298.27, 1836.85],\n  C3: [918.43, 1298.27],\n  C4: [649.13, 918.43],\n  C5: [459.21, 649.13],\n  C6: [323.15, 459.21],\n  C7: [229.61, 323.15],\n  C8: [161.57, 229.61],\n  C9: [113.39, 161.57],\n  C10: [79.37, 113.39],\n  RA0: [2437.8, 3458.27],\n  RA1: [1729.13, 2437.8],\n  RA2: [1218.9, 1729.13],\n  RA3: [864.57, 1218.9],\n  RA4: [609.45, 864.57],\n  SRA0: [2551.18, 3628.35],\n  SRA1: [1814.17, 2551.18],\n  SRA2: [1275.59, 1814.17],\n  SRA3: [907.09, 1275.59],\n  SRA4: [637.8, 907.09],\n  EXECUTIVE: [521.86, 756.0],\n  FOLIO: [612.0, 936.0],\n  LEGAL: [612.0, 1008.0],\n  LETTER: [612.0, 792.0],\n  TABLOID: [792.0, 1224.0],\n  ID1: [153, 243],\n};\n\n/**\n * Parses scalar value in value and unit pairs\n *\n * @param value - Scalar value\n * @returns Parsed value\n */\nconst parseValue = (value: string | number) => {\n  if (typeof value === 'number') return { value, unit: undefined };\n\n  const match = /^(-?\\d*\\.?\\d+)(in|mm|cm|pt|px)?$/g.exec(value);\n\n  return match\n    ? { value: parseFloat(match[1]), unit: match[2] || 'pt' }\n    : { value, unit: undefined };\n};\n\n/**\n * Transform given scalar value to 72dpi equivalent of size\n *\n * @param value - Styles value\n * @param inputDpi - User defined dpi\n * @returns Transformed value\n */\nconst transformUnit = (\n  value: string | number | undefined,\n  inputDpi: number,\n) => {\n  if (!value) return 0;\n\n  const scalar = parseValue(value);\n\n  const outputDpi = 72;\n  const mmFactor = (1 / 25.4) * outputDpi;\n  const cmFactor = (1 / 2.54) * outputDpi;\n\n  if (typeof scalar.value === 'string')\n    throw new Error(`Invalid page size: ${value}`);\n\n  switch (scalar.unit) {\n    case 'in':\n      return scalar.value * outputDpi;\n    case 'mm':\n      return scalar.value * mmFactor;\n    case 'cm':\n      return scalar.value * cmFactor;\n    case 'px':\n      return Math.round(scalar.value * (outputDpi / inputDpi));\n    default:\n      return scalar.value;\n  }\n};\n\nconst transformUnits = ({ width, height }: UnitSize, dpi: number): Size => ({\n  width: transformUnit(width, dpi),\n  height: transformUnit(height, dpi),\n});\n\n/**\n * Transforms array into size object\n *\n * @param v - Values array\n * @returns Size object with width and height\n */\nconst toSizeObject = (v: (number | string)[]) => ({\n  width: v[0],\n  height: v[1],\n});\n\n/**\n * Flip size object\n *\n * @param v - Size object\n * @returns Flipped size object\n */\nconst flipSizeObject = (v: Size): Size => ({\n  width: v.height,\n  height: v.width,\n});\n\n/**\n * Returns size object from a given string\n *\n * @param v - Page size string\n * @returns Size object with width and height\n */\nconst getStringSize = (v: string) => {\n  return toSizeObject(PAGE_SIZES[v.toUpperCase()]) as Size;\n};\n\n/**\n * Returns size object from a single number\n *\n * @param n - Page size number\n * @returns Size object with width and height\n */\nconst getNumberSize = (n: number) => toSizeObject([n, n]);\n\n/**\n * Return page size in an object { width, height }\n *\n * @param page - Page node\n * @returns Size object with width and height\n */\nconst getSize = (page: PageNode) => {\n  const value = page.props?.size || 'A4';\n  const dpi = page.props?.dpi || 72;\n\n  let size: Size;\n  if (typeof value === 'string') {\n    size = getStringSize(value);\n  } else if (Array.isArray(value)) {\n    size = transformUnits(toSizeObject(value), dpi);\n  } else if (typeof value === 'number') {\n    size = transformUnits(getNumberSize(value), dpi);\n  } else {\n    size = transformUnits(value, dpi);\n  }\n\n  return isLandscape(page) ? flipSizeObject(size) : size;\n};\n\nexport default getSize;\n"
  },
  {
    "path": "packages/layout/src/page/getWrapArea.ts",
    "content": "import getPadding from '../node/getPadding';\nimport { SafePageNode } from '../types';\n\nconst getWrapArea = (page: SafePageNode) => {\n  const height = page.style?.height as number;\n  const { paddingBottom } = getPadding(page);\n\n  return height - (paddingBottom as number);\n};\n\nexport default getWrapArea;\n"
  },
  {
    "path": "packages/layout/src/page/isHeightAuto.ts",
    "content": "import { isNil } from '@react-pdf/fns';\nimport { SafePageNode } from '../types';\n\n/**\n * Checks if page has auto height\n *\n * @param page\n * @returns Is page height auto\n */\nconst isHeightAuto = (page: SafePageNode) => isNil(page.box?.height);\n\nexport default isHeightAuto;\n"
  },
  {
    "path": "packages/layout/src/page/isLandscape.ts",
    "content": "import { PageNode } from '../types';\nimport getOrientation from './getOrientation';\n\n/**\n * Return true if page is landscape\n *\n * @param page - Page instance\n * @returns Is page landscape\n */\nconst isLandscape = (page: PageNode) => getOrientation(page) === 'landscape';\n\nexport default isLandscape;\n"
  },
  {
    "path": "packages/layout/src/page/isPortrait.ts",
    "content": "import getOrientation from './getOrientation';\nimport { PageNode } from '../types';\n\n/**\n * Return true if page is portrait\n *\n * @param page - Page node\n * @returns Is page portrait\n */\nconst isPortrait = (page: PageNode) => getOrientation(page) === 'portrait';\n\nexport default isPortrait;\n"
  },
  {
    "path": "packages/layout/src/steps/resolveAssets.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport FontStore from '@react-pdf/font';\nimport { castArray } from '@react-pdf/fns';\n\nimport fetchEmojis from '../text/emoji';\nimport fetchImage from '../image/fetchImage';\nimport { SafeImageNode, SafeNode } from '../types';\n\nconst isImage = (node: SafeNode): node is SafeImageNode =>\n  node.type === P.Image;\n\n/**\n * Get all asset promises that need to be resolved\n *\n * @param fontStore - Font store\n * @param node - Root node\n * @returns Asset promises\n */\nconst fetchAssets = (fontStore: FontStore, node: SafeNode) => {\n  const promises: Promise<void>[] = [];\n  const listToExplore = node.children?.slice(0) || [];\n  const emojiSource = fontStore ? fontStore.getEmojiSource() : null;\n\n  while (listToExplore.length > 0) {\n    const n = listToExplore.shift();\n\n    if (isImage(n)) {\n      promises.push(fetchImage(n));\n    }\n\n    if (fontStore && n.style?.fontFamily) {\n      const fontFamilies = castArray(n.style.fontFamily);\n\n      promises.push(\n        ...fontFamilies.map((fontFamily) =>\n          fontStore.load({\n            fontFamily,\n            fontStyle: n.style.fontStyle,\n            fontWeight: n.style.fontWeight,\n          }),\n        ),\n      );\n    }\n\n    if (typeof n === 'string') {\n      promises.push(...fetchEmojis(n, emojiSource));\n    }\n\n    if ('value' in n && typeof n.value === 'string') {\n      promises.push(...fetchEmojis(n.value, emojiSource));\n    }\n\n    if (n.children) {\n      n.children.forEach((childNode) => {\n        listToExplore.push(childNode);\n      });\n    }\n  }\n\n  return promises;\n};\n\n/**\n * Fetch image, font and emoji assets in parallel.\n * Layout process will not be resumed until promise resolves.\n *\n * @param node root node\n * @param fontStore font store\n * @returns Root node\n */\nconst resolveAssets = async (node: SafeNode, fontStore: FontStore) => {\n  const promises = fetchAssets(fontStore, node);\n  await Promise.all(promises);\n  return node;\n};\n\nexport default resolveAssets;\n"
  },
  {
    "path": "packages/layout/src/steps/resolveBookmarks.ts",
    "content": "import { Bookmark, DocumentNode, Node } from '../types';\n\nconst getBookmarkValue = (bookmark: Bookmark) => {\n  return typeof bookmark === 'string'\n    ? { title: bookmark, fit: false, expanded: false }\n    : bookmark;\n};\n\ntype Parent = Bookmark & { ref: number; parent: number | null };\n\ntype Item = {\n  value: Node;\n  parent: Parent | null;\n};\n\nconst resolveBookmarks = (node: DocumentNode) => {\n  let refs = 0;\n\n  const children = (node.children || []).slice(0);\n  const listToExplore: Item[] = children.map((value) => ({\n    value,\n    parent: null,\n  }));\n\n  while (listToExplore.length > 0) {\n    const element = listToExplore.shift();\n\n    if (!element) break;\n\n    const child = element.value;\n\n    let parent = element.parent;\n\n    if (child.props && 'bookmark' in child.props && child.props.bookmark) {\n      const bookmark = getBookmarkValue(child.props.bookmark);\n      const ref = refs++;\n      const newHierarchy = { ref, parent: parent?.ref, ...bookmark };\n\n      child.props.bookmark = newHierarchy;\n      parent = newHierarchy;\n    }\n\n    if (child.children) {\n      child.children.forEach((childNode) => {\n        listToExplore.push({ value: childNode, parent });\n      });\n    }\n  }\n\n  return node;\n};\n\nexport default resolveBookmarks;\n"
  },
  {
    "path": "packages/layout/src/steps/resolveDimensions.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { isNil, compose } from '@react-pdf/fns';\nimport FontStore from '@react-pdf/font';\n\nimport getMargin from '../node/getMargin';\nimport getPadding from '../node/getPadding';\nimport getPosition from '../node/getPosition';\nimport getDimension from '../node/getDimension';\nimport getBorderWidth from '../node/getBorderWidth';\nimport setDisplay from '../node/setDisplay';\nimport setOverflow from '../node/setOverflow';\nimport setFlexWrap from '../node/setFlexWrap';\nimport setFlexGrow from '../node/setFlexGrow';\nimport setFlexBasis from '../node/setFlexBasis';\nimport setAlignSelf from '../node/setAlignSelf';\nimport setAlignItems from '../node/setAlignItems';\nimport setFlexShrink from '../node/setFlexShrink';\nimport setAspectRatio from '../node/setAspectRatio';\nimport setAlignContent from '../node/setAlignContent';\nimport setPositionType from '../node/setPositionType';\nimport setFlexDirection from '../node/setFlexDirection';\nimport setJustifyContent from '../node/setJustifyContent';\nimport {\n  setMarginTop,\n  setMarginRight,\n  setMarginBottom,\n  setMarginLeft,\n} from '../node/setMargin';\nimport {\n  setPaddingTop,\n  setPaddingRight,\n  setPaddingBottom,\n  setPaddingLeft,\n} from '../node/setPadding';\nimport {\n  setBorderTop,\n  setBorderRight,\n  setBorderBottom,\n  setBorderLeft,\n} from '../node/setBorderWidth';\nimport {\n  setPositionTop,\n  setPositionRight,\n  setPositionBottom,\n  setPositionLeft,\n} from '../node/setPosition';\nimport {\n  setWidth,\n  setHeight,\n  setMinWidth,\n  setMaxWidth,\n  setMinHeight,\n  setMaxHeight,\n} from '../node/setDimension';\nimport { setRowGap, setColumnGap } from '../node/setGap';\nimport measureSvg from '../svg/measureSvg';\nimport measureText from '../text/measureText';\nimport measureImage from '../image/measureImage';\nimport measureCanvas from '../canvas/measureCanvas';\nimport {\n  Box,\n  SafeDocumentNode,\n  SafeNode,\n  SafePageNode,\n  YogaInstance,\n} from '../types';\n\nconst isType = (type) => (node) => node.type === type;\n\nconst isSvg = isType(P.Svg);\nconst isText = isType(P.Text);\nconst isNote = isType(P.Note);\nconst isPage = isType(P.Page);\nconst isImage = isType(P.Image);\nconst isCanvas = isType(P.Canvas);\nconst isTextInstance = isType(P.TextInstance);\n\nconst setNodeHeight = (node: SafeNode) => {\n  const value = isPage(node) ? node.box?.height : node.style?.height;\n  return setHeight(value);\n};\n\n/**\n * Set styles valeus into yoga node before layout calculation\n *\n * @param node\n */\nconst setYogaValues = (node: SafeNode) => {\n  compose(\n    setNodeHeight(node),\n    setWidth(node.style.width),\n    setMinWidth(node.style.minWidth),\n    setMaxWidth(node.style.maxWidth),\n    setMinHeight(node.style.minHeight),\n    setMaxHeight(node.style.maxHeight),\n    setMarginTop(node.style.marginTop),\n    setMarginRight(node.style.marginRight),\n    setMarginBottom(node.style.marginBottom),\n    setMarginLeft(node.style.marginLeft),\n    setPaddingTop(node.style.paddingTop),\n    setPaddingRight(node.style.paddingRight),\n    setPaddingBottom(node.style.paddingBottom),\n    setPaddingLeft(node.style.paddingLeft),\n    setPositionType(node.style.position),\n    setPositionTop(node.style.top),\n    setPositionRight(node.style.right),\n    setPositionBottom(node.style.bottom),\n    setPositionLeft(node.style.left),\n    setBorderTop(node.style.borderTopWidth),\n    setBorderRight(node.style.borderRightWidth),\n    setBorderBottom(node.style.borderBottomWidth),\n    setBorderLeft(node.style.borderLeftWidth),\n    setDisplay(node.style.display),\n    setFlexDirection(node.style.flexDirection),\n    setAlignSelf(node.style.alignSelf),\n    setAlignContent(node.style.alignContent),\n    setAlignItems(node.style.alignItems),\n    setJustifyContent(node.style.justifyContent),\n    setFlexWrap(node.style.flexWrap),\n    setOverflow(node.style.overflow),\n    setAspectRatio(node.style.aspectRatio),\n    setFlexBasis(node.style.flexBasis),\n    setFlexGrow(node.style.flexGrow),\n    setFlexShrink(node.style.flexShrink),\n    setRowGap(node.style.rowGap),\n    setColumnGap(node.style.columnGap),\n  )(node);\n};\n\n/**\n * Inserts child into parent' yoga node\n *\n * @param parent parent\n * @returns Insert yoga nodes\n */\nconst insertYogaNodes = (parent) => (child) => {\n  parent.insertChild(child.yogaNode, parent.getChildCount());\n  return child;\n};\n\nconst setMeasureFunc = (node, page, fontStore) => {\n  const { yogaNode } = node;\n\n  if (isText(node)) {\n    yogaNode.setMeasureFunc(measureText(page, node, fontStore));\n  }\n\n  if (isImage(node)) {\n    yogaNode.setMeasureFunc(measureImage(page, node));\n  }\n\n  if (isCanvas(node)) {\n    yogaNode.setMeasureFunc(measureCanvas(page, node));\n  }\n\n  if (isSvg(node)) {\n    yogaNode.setMeasureFunc(measureSvg(page, node));\n  }\n\n  return node;\n};\n\nconst isLayoutElement = (node) =>\n  !isText(node) && !isNote(node) && !isSvg(node);\n\n/**\n * @typedef {Function} CreateYogaNodes\n * @param {Object} node\n * @returns {Object} node with appended yoga node\n */\n\n/**\n * Creates and add yoga node to document tree\n * Handles measure function for text and image nodes\n *\n * @returns Create yoga nodes\n */\nconst createYogaNodes =\n  (page: SafePageNode, fontStore: FontStore, yoga: YogaInstance) =>\n  (node: SafeNode) => {\n    const yogaNode = yoga.node.create();\n\n    const result = Object.assign({}, node, { yogaNode });\n\n    setYogaValues(result);\n\n    if (isLayoutElement(node) && node.children) {\n      const resolveChild = compose(\n        insertYogaNodes(yogaNode),\n        createYogaNodes(page, fontStore, yoga),\n      );\n\n      result.children = node.children.map(resolveChild);\n    }\n\n    setMeasureFunc(result, page, fontStore);\n\n    return result;\n  };\n\n/**\n * Performs yoga calculation\n *\n * @param page - Page node\n * @returns Page node\n */\nconst calculateLayout = (page: SafePageNode) => {\n  page.yogaNode.calculateLayout();\n  return page;\n};\n\n/**\n * Saves Yoga layout result into 'box' attribute of node\n *\n * @param node\n * @returns Node with box data\n */\nconst persistDimensions = (node: SafeNode) => {\n  if (isTextInstance(node)) return node;\n\n  const box: Box = Object.assign(\n    getPadding(node),\n    getMargin(node),\n    getBorderWidth(node),\n    getPosition(node),\n    getDimension(node),\n  );\n\n  const newNode = Object.assign({}, node, { box });\n\n  if (!node.children) return newNode;\n\n  const children = node.children.map(persistDimensions);\n\n  return Object.assign({}, newNode, { children });\n};\n\n/**\n * Removes yoga node from document tree\n *\n * @param node\n * @returns Node without yoga node\n */\nconst destroyYogaNodes = (node: SafeNode): SafeNode => {\n  const newNode = Object.assign({}, node);\n\n  delete newNode.yogaNode;\n\n  if (!node.children) return newNode;\n\n  const children = node.children.map(destroyYogaNodes);\n\n  return Object.assign({}, newNode, { children });\n};\n\n/**\n * Free yoga node from document tree\n *\n * @param node\n * @returns Node without yoga node\n */\nconst freeYogaNodes = (node: SafeNode) => {\n  if (node.yogaNode) node.yogaNode.freeRecursive();\n  return node;\n};\n\n/**\n * Calculates page object layout using Yoga.\n * Takes node values from 'box' and 'style' attributes, and persist them back into 'box'\n * Destroy yoga values at the end.\n *\n * @param page - Object\n * @returns Page object with correct 'box' layout attributes\n */\nexport const resolvePageDimensions = (\n  page: SafePageNode,\n  fontStore: FontStore,\n  yoga: YogaInstance,\n) => {\n  if (isNil(page)) return null;\n\n  return compose(\n    destroyYogaNodes,\n    freeYogaNodes,\n    persistDimensions,\n    calculateLayout,\n    createYogaNodes(page, fontStore, yoga),\n  )(page);\n};\n\n/**\n * Calculates root object layout using Yoga.\n *\n * @param node - Root object\n * @param fontStore - Font store\n * @returns Root object with correct 'box' layout attributes\n */\nconst resolveDimensions = (node: SafeDocumentNode, fontStore: FontStore) => {\n  if (!node.children) return node;\n\n  const resolveChild = (child: SafePageNode) =>\n    resolvePageDimensions(child, fontStore, node.yoga);\n\n  const children = node.children.map(resolveChild);\n\n  return Object.assign({}, node, { children });\n};\n\nexport default resolveDimensions;\n"
  },
  {
    "path": "packages/layout/src/steps/resolveInheritance.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { pick, compose } from '@react-pdf/fns';\nimport { SafeStyle } from '@react-pdf/stylesheet';\n\nimport { SafeNode } from '../types';\n\ntype StyleKey = keyof SafeStyle;\n\nconst BASE_INHERITABLE_PROPERTIES = [\n  'color',\n  'fontFamily',\n  'fontSize',\n  'fontStyle',\n  'fontWeight',\n  'letterSpacing',\n  'opacity',\n  'textDecoration',\n  'textTransform',\n  'lineHeight',\n  'textAlign',\n  'visibility',\n  'wordSpacing',\n];\n\nconst TEXT_INHERITABLE_PROPERTIES = [\n  ...BASE_INHERITABLE_PROPERTIES,\n  'backgroundColor',\n];\n\nconst isType = (type: string) => (node: SafeNode) => node.type === type;\n\nconst isSvg = isType(P.Svg);\n\nconst isText = isType(P.Text);\n\n// Merge style values\nconst mergeValues = <K extends StyleKey>(\n  styleName: K,\n  value: SafeStyle[K],\n  inheritedValue: SafeStyle[K],\n) => {\n  switch (styleName) {\n    case 'textDecoration': {\n      // merge not none and not false textDecoration values to one rule\n      return [inheritedValue, value].filter((v) => v && v !== 'none').join(' ');\n    }\n    default:\n      return value;\n  }\n};\n\n// Merge inherited and node styles\nconst merge = (inheritedStyles: SafeStyle, style: SafeStyle): SafeStyle => {\n  const mergedStyles = { ...inheritedStyles };\n\n  Object.entries(style).forEach(([styleName, value]) => {\n    mergedStyles[styleName] = mergeValues(\n      styleName as StyleKey,\n      value,\n      inheritedStyles[styleName],\n    );\n  });\n\n  return mergedStyles;\n};\n\n/**\n * Merges styles with node\n *\n * @param inheritedStyles - Style object\n * @returns Merge styles function\n */\nconst mergeStyles =\n  (inheritedStyles: SafeStyle) =>\n  (node: SafeNode): SafeNode => {\n    const style = merge(inheritedStyles, node.style || {});\n\n    return Object.assign({}, node, { style });\n  };\n\n/**\n * Inherit style values from the root to the leafs\n *\n * @param node - Document root\n * @returns Document root with inheritance\n *\n */\nconst resolveInheritance = (node: SafeNode) => {\n  if (isSvg(node)) return node;\n\n  if (!('children' in node)) return node;\n\n  const inheritableProperties = isText(node)\n    ? TEXT_INHERITABLE_PROPERTIES\n    : BASE_INHERITABLE_PROPERTIES;\n\n  const inheritStyles = pick(inheritableProperties, node.style || {});\n\n  const resolveChild = compose(resolveInheritance, mergeStyles(inheritStyles));\n\n  const children = node.children.map(resolveChild);\n\n  return Object.assign({}, node, { children });\n};\n\nexport default resolveInheritance;\n"
  },
  {
    "path": "packages/layout/src/steps/resolveLinkSubstitution.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { compose } from '@react-pdf/fns';\n\nimport { Node } from '../types';\n\nconst isType = (type: string) => (node: Node) => node.type === type;\n\nconst isLink = isType(P.Link);\n\nconst isText = isType(P.Text);\n\nconst isTextInstance = isType(P.TextInstance);\n\n/**\n * Checks if node has render prop\n *\n * @param node\n * @returns Has render prop?\n */\nconst hasRenderProp = (node: Node) => 'render' in node.props;\n\n/**\n * Checks if node is text type (Text or TextInstance)\n *\n * @param node\n * @returns Are all children text instances?\n */\nconst isTextType = (node: Node) => isText(node) || isTextInstance(node);\n\n/**\n * Checks if is tet link that needs to be wrapped in Text\n *\n * @param node\n * @returns Are all children text instances?\n */\nconst isTextLink = (node: Node) => {\n  const children = node.children || [];\n\n  // Text string inside a Link\n  if (children.every(isTextInstance)) return true;\n\n  // Text node inside a Link\n  if (children.every(isText)) return false;\n\n  return children.every(isTextType);\n};\n\n/**\n * Wraps node children inside Text node\n *\n * @param node\n * @returns Node with intermediate Text child\n */\nconst wrapText = (node) => {\n  const textElement = {\n    type: P.Text,\n    props: {},\n    style: {},\n    box: {},\n    children: node.children,\n  };\n\n  return Object.assign({}, node, { children: [textElement] });\n};\n\nconst transformLink = (node: Node) => {\n  if (!isLink(node)) return node;\n\n  // If has render prop substitute the instance by a Text, that will\n  // ultimately render the inline Link via the textkit PDF renderer.\n  if (hasRenderProp(node)) return Object.assign({}, node, { type: P.Text });\n\n  // If is a text link (either contains Text or TextInstance), wrap it\n  // inside a Text element so styles are applied correctly\n\n  if (isTextLink(node)) return wrapText(node);\n\n  return node;\n};\n\n/**\n * Transforms Link layout to correctly render text and dynamic rendered links\n *\n * @param node\n * @returns Node with link substitution\n */\nconst resolveLinkSubstitution = (node: Node): Node => {\n  if (!node.children) return node;\n\n  const resolveChild = compose(transformLink, resolveLinkSubstitution);\n\n  const children = node.children.map(resolveChild);\n\n  return Object.assign({}, node, { children });\n};\n\nexport default resolveLinkSubstitution;\n"
  },
  {
    "path": "packages/layout/src/steps/resolveOrigins.ts",
    "content": "import getOrigin from '../node/getOrigin';\nimport { SafeDocumentNode, SafeNode } from '../types';\n\n/**\n * Resolve node origin\n *\n * @param node\n * @returns Node with origin attribute\n */\nconst resolveNodeOrigin = (node: SafeNode): SafeNode => {\n  const origin = getOrigin(node);\n\n  const newNode = Object.assign({}, node, { origin });\n\n  if (!node.children) return newNode;\n\n  const children = node.children.map(resolveNodeOrigin);\n\n  return Object.assign({}, newNode, { children });\n};\n\n/**\n * Resolve document origins\n *\n * @param root - Document root\n * @returns Document root\n */\n\nconst resolveOrigin = (root: SafeDocumentNode) => {\n  if (!root.children) return root;\n\n  const children = root.children.map(resolveNodeOrigin);\n\n  return Object.assign({}, root, { children });\n};\n\nexport default resolveOrigin;\n"
  },
  {
    "path": "packages/layout/src/steps/resolvePagePaddings.ts",
    "content": "import { evolve, matchPercent } from '@react-pdf/fns';\nimport { SafeStyle } from '@react-pdf/stylesheet';\n\nimport { SafeDocumentNode, SafePageNode } from '../types';\n\n/**\n * Translates page percentage horizontal paddings in fixed ones\n *\n * @param container - Page container\n * @returns Resolve page horizontal padding\n */\nconst resolvePageHorizontalPadding =\n  (container: SafeStyle) => (value: number) => {\n    const match = matchPercent(value);\n    const width = container.width as number;\n    return match ? match.percent * width : value;\n  };\n\n/**\n * Translates page percentage vertical paddings in fixed ones\n *\n * @param container - Page container\n * @returns Resolve page vertical padding\n */\nconst resolvePageVerticalPadding =\n  (container: SafeStyle) => (value: number) => {\n    const match = matchPercent(value);\n    const height = container.height as number;\n    return match ? match.percent * height : value;\n  };\n\n/**\n * Translates page percentage paddings in fixed ones\n *\n * @param page\n * @returns Page with fixed paddings\n */\nconst resolvePagePaddings = (page: SafePageNode): SafePageNode => {\n  const container = page.style;\n\n  const style = evolve(\n    {\n      paddingTop: resolvePageVerticalPadding(container),\n      paddingLeft: resolvePageHorizontalPadding(container),\n      paddingRight: resolvePageHorizontalPadding(container),\n      paddingBottom: resolvePageVerticalPadding(container),\n    },\n    page.style,\n  );\n\n  return Object.assign({}, page, { style });\n};\n\n/**\n * Translates all pages percentage paddings in fixed ones\n * This has to be computed from pages calculated size and not by Yoga\n * because at this point we didn't performed pagination yet.\n *\n * @param root - Document root\n * @returns Document root with translated page paddings\n */\nconst resolvePagesPaddings = (root: SafeDocumentNode) => {\n  if (!root.children) return root;\n\n  const children = root.children.map(resolvePagePaddings);\n\n  return Object.assign({}, root, { children });\n};\n\nexport default resolvePagesPaddings;\n"
  },
  {
    "path": "packages/layout/src/steps/resolvePageSizes.ts",
    "content": "import { flatten } from '@react-pdf/stylesheet';\n\nimport getPageSize from '../page/getSize';\nimport { DocumentNode, PageNode } from '../types';\n\n/**\n * Resolves page size\n *\n * @param page\n * @returns Page with resolved size in style attribute\n */\nexport const resolvePageSize = (page: PageNode): PageNode => {\n  const size = getPageSize(page);\n  const style = flatten(page.style || {});\n\n  return { ...page, style: { ...style, ...size } };\n};\n\n/**\n * Resolves page sizes\n *\n * @param root  -Document root\n * @returns Document root with resolved page sizes\n */\nconst resolvePageSizes = (root: DocumentNode) => {\n  if (!root.children) return root;\n\n  const children = root.children.map(resolvePageSize);\n\n  return Object.assign({}, root, { children });\n};\n\nexport default resolvePageSizes;\n"
  },
  {
    "path": "packages/layout/src/steps/resolvePagination.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { omit, compose } from '@react-pdf/fns';\nimport FontStore from '@react-pdf/font';\n\nimport isFixed from '../node/isFixed';\nimport splitText from '../text/splitText';\nimport splitNode from '../node/splitNode';\nimport canNodeWrap from '../node/getWrap';\nimport getWrapArea from '../page/getWrapArea';\nimport getContentArea from '../page/getContentArea';\nimport createInstances from '../node/createInstances';\nimport shouldNodeBreak from '../node/shouldBreak';\nimport resolveTextLayout from './resolveTextLayout';\nimport resolveInheritance from './resolveInheritance';\nimport { resolvePageDimensions } from './resolveDimensions';\nimport { resolvePageStyles } from './resolveStyles';\nimport {\n  DynamicPageProps,\n  SafeDocumentNode,\n  SafeLinkNode,\n  SafeNode,\n  SafePageNode,\n  SafeTextNode,\n  SafeViewNode,\n  YogaInstance,\n} from '../types';\n\nconst isText = (node: SafeNode): node is SafeTextNode => node.type === P.Text;\n\n// Prevent splitting elements by low decimal numbers\nconst SAFETY_THRESHOLD = 0.001;\n\nconst assingChildren = <T>(children: SafeNode[], node: T): T =>\n  Object.assign({}, node, { children });\n\nconst getTop = (node: SafeNode) => node.box?.top || 0;\n\nconst allFixed = (nodes: SafeNode[]) => nodes.every(isFixed);\n\nconst isDynamic = (\n  node: SafeNode,\n): node is SafeLinkNode | SafeTextNode | SafeViewNode =>\n  node.props && 'render' in node.props;\n\nconst relayoutPage = compose(\n  resolveTextLayout,\n  resolvePageDimensions,\n  resolveInheritance,\n  resolvePageStyles,\n);\n\nconst warnUnavailableSpace = (node: SafeNode) => {\n  console.warn(\n    `Node of type ${node.type} can't wrap between pages and it's bigger than available page height`,\n  );\n};\n\nconst splitNodes = (height: number, contentArea: number, nodes: SafeNode[]) => {\n  const currentChildren: SafeNode[] = [];\n  const nextChildren: SafeNode[] = [];\n\n  for (let i = 0; i < nodes.length; i += 1) {\n    const child = nodes[i];\n    const futureNodes = nodes.slice(i + 1);\n    const futureFixedNodes = futureNodes.filter(isFixed);\n\n    const nodeTop = getTop(child);\n    const nodeHeight = child.box.height;\n    const isOutside = height <= nodeTop;\n    const shouldBreak = shouldNodeBreak(\n      child,\n      futureNodes,\n      height,\n      currentChildren,\n    );\n    const shouldSplit = height + SAFETY_THRESHOLD < nodeTop + nodeHeight;\n    const canWrap = canNodeWrap(child);\n    const fitsInsidePage = nodeHeight <= contentArea;\n\n    if (isFixed(child)) {\n      nextChildren.push(child);\n      currentChildren.push(child);\n      continue;\n    }\n\n    if (isOutside) {\n      const box = Object.assign({}, child.box, { top: child.box.top - height });\n      const next = Object.assign({}, child, { box });\n      nextChildren.push(next);\n      continue;\n    }\n\n    if (!fitsInsidePage && !canWrap) {\n      currentChildren.push(child);\n      nextChildren.push(...futureNodes);\n      warnUnavailableSpace(child);\n      break;\n    }\n\n    if (shouldBreak) {\n      const box = Object.assign({}, child.box, { top: child.box.top - height });\n      const props = Object.assign({}, child.props, {\n        wrap: true,\n        break: false,\n      });\n      const next = Object.assign({}, child, { box, props });\n\n      currentChildren.push(...futureFixedNodes);\n      nextChildren.push(next, ...futureNodes);\n      break;\n    }\n\n    if (shouldSplit) {\n      const [currentChild, nextChild] = split(child, height, contentArea);\n\n      // All children are moved to the next page, it doesn't make sense to show the parent on the current page\n      if (child.children.length > 0 && currentChild.children.length === 0) {\n        // But if the current page is empty then we can just include the parent on the current page\n        if (currentChildren.length === 0) {\n          currentChildren.push(child, ...futureFixedNodes);\n          nextChildren.push(...futureNodes);\n        } else {\n          const box = Object.assign({}, child.box, {\n            top: child.box.top - height,\n          });\n          const next = Object.assign({}, child, { box });\n\n          currentChildren.push(...futureFixedNodes);\n          nextChildren.push(next, ...futureNodes);\n        }\n        break;\n      }\n\n      if (currentChild) currentChildren.push(currentChild);\n      if (nextChild) nextChildren.push(nextChild);\n\n      continue;\n    }\n\n    currentChildren.push(child);\n  }\n\n  return [currentChildren, nextChildren];\n};\n\nconst splitChildren = (height: number, contentArea: number, node: SafeNode) => {\n  const children = node.children || [];\n  const availableHeight = height - getTop(node);\n  return splitNodes(availableHeight, contentArea, children);\n};\n\nconst splitView = (node: SafeNode, height: number, contentArea: number) => {\n  const [currentNode, nextNode] = splitNode(node, height);\n  const [currentChilds, nextChildren] = splitChildren(\n    height,\n    contentArea,\n    node,\n  );\n\n  return [\n    assingChildren(currentChilds, currentNode),\n    assingChildren(nextChildren, nextNode),\n  ];\n};\n\nconst split = (node: SafeNode, height: number, contentArea: number) =>\n  isText(node) ? splitText(node, height) : splitView(node, height, contentArea);\n\nconst shouldResolveDynamicNodes = (node: SafeNode) => {\n  const children = node.children || [];\n  return isDynamic(node) || children.some(shouldResolveDynamicNodes);\n};\n\nconst resolveDynamicNodes = (props: DynamicPageProps, node: SafeNode) => {\n  const isNodeDynamic = isDynamic(node);\n\n  // Call render prop on dynamic nodes and append result to children\n  const resolveChildren = (children = []) => {\n    if (isNodeDynamic) {\n      const res = node.props.render(props);\n      return (\n        createInstances(res)\n          .filter(Boolean)\n          // @ts-expect-error rework dynamic nodes. conflicting types\n          .map((n) => resolveDynamicNodes(props, n))\n      );\n    }\n\n    return children.map((c) => resolveDynamicNodes(props, c));\n  };\n\n  // We reset dynamic text box so it can be computed again later on\n  const resetHeight = isNodeDynamic && isText(node);\n  const box = resetHeight ? { ...node.box, height: 0 } : node.box;\n\n  const children = resolveChildren(node.children);\n\n  // @ts-expect-error handle text here specifically\n  const lines = isNodeDynamic ? null : node.lines;\n\n  return Object.assign({}, node, { box, lines, children });\n};\n\nconst resolveDynamicPage = (\n  props: DynamicPageProps,\n  page: SafePageNode,\n  fontStore: FontStore,\n  yoga: YogaInstance,\n) => {\n  if (shouldResolveDynamicNodes(page)) {\n    const resolvedPage = resolveDynamicNodes(props, page);\n    return relayoutPage(resolvedPage, fontStore, yoga);\n  }\n\n  return page;\n};\n\nconst splitPage = (\n  page: SafePageNode,\n  pageNumber: number,\n  fontStore: FontStore,\n  yoga: YogaInstance,\n): SafePageNode[] => {\n  const wrapArea = getWrapArea(page);\n  const contentArea = getContentArea(page);\n  const dynamicPage = resolveDynamicPage({ pageNumber }, page, fontStore, yoga);\n  const height = page.style.height;\n\n  const [currentChilds, nextChilds] = splitNodes(\n    wrapArea,\n    contentArea,\n    dynamicPage.children,\n  );\n\n  const relayout = (node: SafePageNode): SafePageNode =>\n    // @ts-expect-error rework pagination\n    relayoutPage(node, fontStore, yoga) as SafePageNode;\n\n  const currentBox = { ...page.box, height };\n  const currentPage = relayout(\n    Object.assign({}, page, { box: currentBox, children: currentChilds }),\n  );\n\n  if (nextChilds.length === 0 || allFixed(nextChilds))\n    return [currentPage, null];\n\n  const nextBox = omit('height', page.box);\n  const nextProps = omit('bookmark', page.props);\n\n  const nextPage = relayout(\n    Object.assign({}, page, {\n      props: nextProps,\n      box: nextBox,\n      children: nextChilds,\n    }),\n  );\n\n  return [currentPage, nextPage];\n};\n\nconst resolvePageIndices = (fontStore, yoga, page, pageNumber, pages) => {\n  const totalPages = pages.length;\n\n  const props = {\n    totalPages,\n    pageNumber: pageNumber + 1,\n    subPageNumber: page.subPageNumber + 1,\n    subPageTotalPages: page.subPageTotalPages,\n  };\n\n  return resolveDynamicPage(props, page, fontStore, yoga);\n};\n\nconst assocSubPageData = (subpages) => {\n  return subpages.map((page, i) => ({\n    ...page,\n    subPageNumber: i,\n    subPageTotalPages: subpages.length,\n  }));\n};\n\nconst dissocSubPageData = (page) => {\n  return omit(['subPageNumber', 'subPageTotalPages'], page);\n};\n\nconst paginate = (\n  page: SafePageNode,\n  pageNumber: number,\n  fontStore: FontStore,\n  yoga: YogaInstance,\n) => {\n  if (!page) return [];\n\n  if (page.props?.wrap === false) return [page];\n\n  let splittedPage = splitPage(page, pageNumber, fontStore, yoga);\n\n  const pages = [splittedPage[0]];\n  let nextPage = splittedPage[1];\n\n  while (nextPage !== null) {\n    splittedPage = splitPage(\n      nextPage,\n      pageNumber + pages.length,\n      fontStore,\n      yoga,\n    );\n\n    pages.push(splittedPage[0]);\n    nextPage = splittedPage[1];\n  }\n\n  return pages;\n};\n\n/**\n * Performs pagination. This is the step responsible of breaking the whole document\n * into pages following pagiation rules, such as `fixed`, `break` and dynamic nodes.\n *\n * @param root - Document node\n * @param fontStore - Font store\n * @returns Layout node\n */\nconst resolvePagination = (\n  root: SafeDocumentNode,\n  fontStore: FontStore,\n): SafeDocumentNode => {\n  let pages = [];\n  let pageNumber = 1;\n\n  for (let i = 0; i < root.children.length; i += 1) {\n    const page = root.children[i];\n    let subpages = paginate(page, pageNumber, fontStore, root.yoga);\n\n    subpages = assocSubPageData(subpages);\n    pageNumber += subpages.length;\n    pages = pages.concat(subpages);\n  }\n\n  pages = pages.map((...args) =>\n    dissocSubPageData(resolvePageIndices(fontStore, root.yoga, ...args)),\n  );\n\n  return assingChildren(pages, root);\n};\n\nexport default resolvePagination;\n"
  },
  {
    "path": "packages/layout/src/steps/resolvePercentHeight.ts",
    "content": "import { isNil, matchPercent } from '@react-pdf/fns';\n\nimport { SafeDocumentNode, SafeNode, SafePageNode } from '../types';\n\n/**\n * Transform percent height into fixed\n *\n * @param height\n * @returns Height\n */\nconst transformHeight = (pageArea: number, height: number | string) => {\n  const match = matchPercent(height);\n  return match ? match.percent * pageArea : height;\n};\n\n/**\n * Get page area (height minus paddings)\n *\n * @param page\n * @returns Page area\n */\nconst getPageArea = (page: SafePageNode) => {\n  const pageHeight = page.style.height as number;\n  const pagePaddingTop = (page.style?.paddingTop || 0) as number;\n  const pagePaddingBottom = (page.style?.paddingBottom || 0) as number;\n\n  return pageHeight - pagePaddingTop - pagePaddingBottom;\n};\n\n/**\n * Transform node percent height to fixed\n *\n * @param page\n * @param node\n * @returns Transformed node\n */\nconst resolveNodePercentHeight = (\n  page: SafePageNode,\n  node: SafeNode,\n): SafeNode => {\n  if (isNil(page.style?.height)) return node;\n  if (isNil(node.style?.height)) return node;\n\n  const pageArea = getPageArea(page);\n  const height = transformHeight(pageArea, node.style.height);\n  const style = Object.assign({}, node.style, { height });\n\n  return Object.assign({}, node, { style });\n};\n\n/**\n * Transform page immediate children with percent height to fixed\n *\n * @param page\n * @returns Transformed page\n */\nconst resolvePagePercentHeight = (page: SafePageNode) => {\n  if (!page.children) return page;\n\n  const resolveChild = (child: SafeNode) =>\n    resolveNodePercentHeight(page, child);\n\n  const children = page.children.map(resolveChild);\n\n  return Object.assign({}, page, { children });\n};\n\n/**\n * Transform all page immediate children with percent height to fixed.\n * This is needed for computing correct dimensions on pre-pagination layout.\n *\n * @param root - Document root\n * @returns Transformed document root\n */\nconst resolvePercentHeight = (root: SafeDocumentNode) => {\n  if (!root.children) return root;\n\n  const children = root.children.map(resolvePagePercentHeight);\n\n  return Object.assign({}, root, { children });\n};\n\nexport default resolvePercentHeight;\n"
  },
  {
    "path": "packages/layout/src/steps/resolvePercentRadius.ts",
    "content": "import { evolve, matchPercent } from '@react-pdf/fns';\nimport { Box, SafeNode } from '../types';\n\nconst resolveRadius = (box: Box) => (value: number | `${string}%`) => {\n  if (!value) return undefined;\n\n  const match = matchPercent(value);\n\n  return match ? match.percent * Math.min(box.width, box.height) : value;\n};\n\n/**\n * Transforms percent border radius into fixed values\n *\n * @param node\n * @returns Node\n */\nconst resolvePercentRadius = (node: SafeNode): SafeNode => {\n  const style = evolve(\n    {\n      borderTopLeftRadius: resolveRadius(node.box),\n      borderTopRightRadius: resolveRadius(node.box),\n      borderBottomRightRadius: resolveRadius(node.box),\n      borderBottomLeftRadius: resolveRadius(node.box),\n    },\n    node.style || {},\n  );\n\n  const newNode = Object.assign({}, node, { style });\n\n  if (!node.children) return newNode;\n\n  const children = node.children.map(resolvePercentRadius);\n\n  return Object.assign({}, newNode, { children });\n};\n\nexport default resolvePercentRadius;\n"
  },
  {
    "path": "packages/layout/src/steps/resolveStyles.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport stylesheet, { Container, Style } from '@react-pdf/stylesheet';\n\nimport {\n  DocumentNode,\n  Node,\n  PageNode,\n  SafeDocumentNode,\n  SafeNode,\n} from '../types';\n\nconst isLink = (node: Node) => node.type === P.Link;\n\nconst DEFAULT_LINK_STYLES: Style = {\n  color: 'blue',\n  textDecoration: 'underline',\n};\n\n/**\n * Computes styles using stylesheet\n *\n * @param container\n * @param node - Document node\n * @returns Computed styles\n */\nconst computeStyle = (container: Container, node: Node) => {\n  let baseStyle: Style[] = [node.style as Style];\n\n  if (isLink(node)) {\n    baseStyle = Array.isArray(node.style)\n      ? [DEFAULT_LINK_STYLES, ...node.style]\n      : [DEFAULT_LINK_STYLES, node.style];\n  }\n\n  return stylesheet(container, baseStyle);\n};\n\n/**\n * Resolves node styles\n *\n * @param container\n * @returns Resolve node styles\n */\nconst resolveNodeStyles =\n  (container: Container) =>\n  (node: Node): SafeNode => {\n    const style = computeStyle(container, node);\n\n    if (!node.children) return Object.assign({}, node, { style }) as SafeNode;\n\n    const children = node.children.map(resolveNodeStyles(container));\n\n    return Object.assign({}, node, { style, children }) as SafeNode;\n  };\n\n/**\n * Resolves page styles\n *\n * @param page Document page\n * @returns Document page with resolved styles\n */\nexport const resolvePageStyles = (page: PageNode) => {\n  const dpi = page.props?.dpi || 72;\n  const style = page.style as Style;\n  const width = page.box?.width || style.width;\n  const height = page.box?.height || style.height;\n  const orientation = page.props?.orientation || 'portrait';\n  const remBase = style?.fontSize || 18;\n  const container = { width, height, orientation, dpi, remBase } as Container;\n\n  return resolveNodeStyles(container)(page);\n};\n\n/**\n * Resolves document styles\n *\n * @param root - Document root\n * @returns Document root with resolved styles\n */\nconst resolveStyles = (root: DocumentNode): SafeDocumentNode => {\n  if (!root.children) return root as SafeDocumentNode;\n\n  const children = root.children.map(resolvePageStyles);\n\n  return Object.assign({}, root, { children }) as SafeDocumentNode;\n};\n\nexport default resolveStyles;\n"
  },
  {
    "path": "packages/layout/src/steps/resolveSvg.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport FontStore from '@react-pdf/font';\nimport resolveStyle, { transformColor } from '@react-pdf/stylesheet';\nimport {\n  pick,\n  evolve,\n  compose,\n  mapValues,\n  matchPercent,\n  parseFloat,\n} from '@react-pdf/fns';\n\nimport layoutText from '../svg/layoutText';\nimport replaceDefs from '../svg/replaceDefs';\nimport getContainer from '../svg/getContainer';\nimport parseViewbox from '../svg/parseViewbox';\nimport inheritProps from '../svg/inheritProps';\nimport parseAspectRatio from '../svg/parseAspectRatio';\nimport {\n  SafeNode,\n  SafeSvgNode,\n  SafeTextInstanceNode,\n  SafeTextNode,\n  SafeTspanNode,\n} from '../types';\n\ntype Container = { width: number; height: number };\n\nconst STYLE_PROPS = [\n  'width',\n  'height',\n  'color',\n  'stroke',\n  'strokeWidth',\n  'opacity',\n  'fillOpacity',\n  'strokeOpacity',\n  'fill',\n  'fillRule',\n  'clipPath',\n  'offset',\n  'transform',\n  'strokeLinejoin',\n  'strokeLinecap',\n  'strokeDasharray',\n  'gradientUnits',\n  'gradientTransform',\n];\n\nconst VERTICAL_PROPS = ['y', 'y1', 'y2', 'height', 'cy', 'ry'];\nconst HORIZONTAL_PROPS = ['x', 'x1', 'x2', 'width', 'cx', 'rx'];\n\nconst isSvg = (node: SafeNode): node is SafeSvgNode => node.type === P.Svg;\n\nconst isText = (node: SafeNode): node is SafeTextNode => node.type === P.Text;\n\nconst isTextInstance = (node: SafeNode): node is SafeTextInstanceNode =>\n  node.type === P.TextInstance;\n\nconst transformPercent = (container: Container) => (props) =>\n  mapValues(props, (value, key) => {\n    const match = matchPercent(value);\n\n    if (match && VERTICAL_PROPS.includes(key)) {\n      return match.percent * container.height;\n    }\n\n    if (match && HORIZONTAL_PROPS.includes(key)) {\n      return match.percent * container.width;\n    }\n\n    return value;\n  });\n\nconst parsePercent = (value) => {\n  const match = matchPercent(value);\n  return match ? match.percent : parseFloat(value);\n};\n\nconst parseTransform = (container: Container) => (value) => {\n  return resolveStyle(container, { transform: value }).transform;\n};\n\nconst parseProps =\n  (container: Container) =>\n  (node: SafeNode): SafeNode => {\n    let props = transformPercent(container)(node.props);\n\n    props = evolve(\n      {\n        x: parseFloat,\n        x1: parseFloat,\n        x2: parseFloat,\n        y: parseFloat,\n        y1: parseFloat,\n        y2: parseFloat,\n        r: parseFloat,\n        rx: parseFloat,\n        ry: parseFloat,\n        cx: parseFloat,\n        cy: parseFloat,\n        width: parseFloat,\n        height: parseFloat,\n        offset: parsePercent,\n        fill: transformColor,\n        opacity: parsePercent,\n        stroke: transformColor,\n        stopOpacity: parsePercent,\n        stopColor: transformColor,\n        transform: parseTransform(container),\n        gradientTransform: parseTransform(container),\n      },\n      props,\n    );\n\n    return Object.assign({}, node, { props });\n  };\n\nconst mergeStyles = (node: SafeNode): SafeNode => {\n  const style = node.style || {};\n  const props = Object.assign({}, style, node.props);\n\n  return Object.assign({}, node, { props });\n};\n\nconst removeNoneValues = (node: SafeNode): SafeNode => {\n  const removeNone = (value) => (value === 'none' ? null : value);\n  const props = mapValues(node.props, removeNone);\n\n  return Object.assign({}, node, { props });\n};\n\nconst pickStyleProps = (node: SafeNode): SafeNode => {\n  const props = node.props || {};\n  const styleProps = pick(STYLE_PROPS, props);\n  const style = Object.assign({}, styleProps, node.style || {});\n\n  return Object.assign({}, node, { style });\n};\n\nconst parseSvgProps = (node: SafeSvgNode) => {\n  const props = evolve(\n    {\n      width: parseFloat,\n      height: parseFloat,\n      viewBox: parseViewbox,\n      preserveAspectRatio: parseAspectRatio,\n    },\n    node.props,\n  );\n\n  return Object.assign({}, node, { props });\n};\n\nconst wrapBetweenTspan = (node: SafeTextInstanceNode): SafeTspanNode => ({\n  type: P.Tspan,\n  props: {},\n  style: {},\n  children: [node],\n});\n\nconst addMissingTspan = (node: SafeNode): SafeNode => {\n  if (!isText(node)) return node;\n  if (!node.children) return node;\n\n  const resolveChild = (child) =>\n    isTextInstance(child) ? wrapBetweenTspan(child) : child;\n\n  const children = node.children.map(resolveChild);\n\n  return Object.assign({}, node, { children });\n};\n\nconst parseText =\n  (fontStore: FontStore) =>\n  (node: SafeNode): SafeNode => {\n    if (isText(node)) return layoutText(fontStore, node);\n\n    if (!node.children) return node;\n\n    const children = node.children.map(parseText(fontStore));\n\n    return Object.assign({}, node, { children });\n  };\n\nconst resolveSvgNode = (container: Container) =>\n  compose(\n    parseProps(container),\n    addMissingTspan,\n    removeNoneValues,\n    mergeStyles,\n  );\n\nconst resolveChildren =\n  (container: Container) =>\n  (node: SafeNode): SafeNode => {\n    if (!node.children) return node;\n\n    const resolveChild = compose(\n      resolveChildren(container),\n      resolveSvgNode(container),\n    );\n\n    const children = node.children.map(resolveChild);\n\n    return Object.assign({}, node, { children });\n  };\n\nconst buildXLinksIndex = (node: SafeSvgNode) => {\n  const idIndex: Record<string, SafeNode> = {};\n  const listToExplore: SafeNode[] = node.children?.slice(0) || [];\n\n  while (listToExplore.length > 0) {\n    const child = listToExplore.shift();\n\n    if (child.props && 'id' in child.props) {\n      idIndex[child.props.id] = child;\n    }\n\n    if (child.children) listToExplore.push(...child.children);\n  }\n\n  return idIndex;\n};\n\nconst replaceXLinks = (node: SafeNode, idIndex: Record<string, SafeNode>) => {\n  if (node.props && 'xlinkHref' in node.props) {\n    const linkedNode = idIndex[node.props.xlinkHref.replace(/^#/, '')];\n\n    // No node to extend from\n    if (!linkedNode) return node;\n\n    const newProps = Object.assign({}, linkedNode.props, node.props);\n\n    delete newProps.xlinkHref;\n\n    return Object.assign({}, linkedNode, { props: newProps });\n  }\n\n  const children = node.children?.map((child) => replaceXLinks(child, idIndex));\n\n  return Object.assign({}, node, { children });\n};\n\nexport const resolveXLinks = (node: SafeSvgNode): SafeSvgNode => {\n  const idIndex = buildXLinksIndex(node);\n\n  return replaceXLinks(node, idIndex);\n};\n\nconst resolveSvgRoot = (node: SafeSvgNode, fontStore: FontStore) => {\n  const container = getContainer(node);\n\n  return compose(\n    replaceDefs,\n    parseText(fontStore),\n    parseSvgProps,\n    pickStyleProps,\n    inheritProps,\n    resolveChildren(container),\n    resolveXLinks,\n  )(node);\n};\n\n/**\n * Pre-process SVG nodes so they can be rendered in the next steps\n *\n * @param node - Root node\n * @param fontStore - Font store\n * @returns Root node\n */\nconst resolveSvg = (node: SafeNode, fontStore: FontStore) => {\n  if (!('children' in node)) return node;\n\n  const resolveChild = (child) => resolveSvg(child, fontStore);\n  const root = isSvg(node) ? resolveSvgRoot(node, fontStore) : node;\n  const children = root.children?.map(resolveChild);\n\n  return Object.assign({}, root, { children });\n};\n\nexport default resolveSvg;\n"
  },
  {
    "path": "packages/layout/src/steps/resolveTextLayout.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport FontStore from '@react-pdf/font';\n\nimport layoutText from '../text/layoutText';\nimport { SafeNode, SafeSvgNode, SafeTextNode } from '../types';\n\nconst isSvg = (node: SafeNode): node is SafeSvgNode => node.type === P.Svg;\n\nconst isText = (node: SafeNode): node is SafeTextNode => node.type === P.Text;\n\nconst shouldIterate = (node: SafeNode) => !isSvg(node) && !isText(node);\n\nconst shouldLayoutText = (node: SafeNode): node is SafeTextNode =>\n  isText(node) && !node.lines;\n\n/**\n * Performs text layout on text node if wasn't calculated before.\n * Text layout is usually performed on Yoga's layout process (via setMeasureFunc),\n * but we need to layout those nodes with fixed width and height.\n *\n * @param node\n * @returns Layout node\n */\nconst resolveTextLayout = (node: SafeNode, fontStore: FontStore): SafeNode => {\n  if (shouldLayoutText(node)) {\n    const width =\n      node.box.width - (node.box.paddingRight + node.box.paddingLeft);\n    const height =\n      node.box.height - (node.box.paddingTop + node.box.paddingBottom);\n\n    node.lines = layoutText(node, width, height, fontStore);\n  }\n\n  if (shouldIterate(node)) {\n    if (!node.children) return node;\n\n    const mapChild = (child: SafeNode) => resolveTextLayout(child, fontStore);\n\n    const children = node.children.map(mapChild);\n\n    return Object.assign({}, node, { children });\n  }\n\n  return node;\n};\n\nexport default resolveTextLayout;\n"
  },
  {
    "path": "packages/layout/src/steps/resolveYoga.ts",
    "content": "import { loadYoga } from '../yoga/index';\nimport { DocumentNode } from '../types';\n\nconst resolveYoga = async (root: DocumentNode): Promise<DocumentNode> => {\n  const yoga = await loadYoga();\n\n  return Object.assign({}, root, { yoga });\n};\n\nexport default resolveYoga;\n"
  },
  {
    "path": "packages/layout/src/steps/resolveZIndex.ts",
    "content": "import * as P from '@react-pdf/primitives';\n\nimport { SafeDocumentNode, SafeNode } from '../types';\n\nconst getZIndex = (node: SafeNode) => node.style.zIndex;\n\nconst shouldSort = (node: SafeNode) =>\n  node.type !== P.Document && node.type !== P.Svg;\n\nconst sortZIndex = (a: SafeNode, b: SafeNode) => {\n  const za = getZIndex(a);\n  const zb = getZIndex(b);\n\n  if (!za && !zb) return 0;\n  if (!za) return 1;\n  if (!zb) return -1;\n\n  return zb - za;\n};\n\n/**\n * Sort children by zIndex value\n *\n * @param node\n * @returns Node\n */\nconst resolveNodeZIndex = <T extends SafeNode>(node: T): T => {\n  if (!node.children) return node;\n\n  const sortedChildren = shouldSort(node)\n    ? node.children.sort(sortZIndex)\n    : node.children;\n\n  const children = sortedChildren.map(resolveNodeZIndex);\n\n  return Object.assign({}, node, { children });\n};\n\n/**\n * Sort children by zIndex value\n *\n * @param node\n * @returns Node\n */\nconst resolveZIndex = (root: SafeDocumentNode) => resolveNodeZIndex(root);\n\nexport default resolveZIndex;\n"
  },
  {
    "path": "packages/layout/src/svg/getContainer.ts",
    "content": "import { parseFloat } from '@react-pdf/fns';\n\nimport parseViewBox from './parseViewbox';\nimport { SafeSvgNode } from '../types';\n\nconst getContainer = (node: SafeSvgNode) => {\n  const viewbox = parseViewBox(node.props.viewBox);\n\n  if (viewbox) {\n    return { width: viewbox.maxX, height: viewbox.maxY };\n  }\n\n  if (node.props.width && node.props.height) {\n    return {\n      width: parseFloat(node.props.width),\n      height: parseFloat(node.props.height),\n    };\n  }\n\n  return { width: 0, height: 0 };\n};\n\nexport default getContainer;\n"
  },
  {
    "path": "packages/layout/src/svg/getDefs.ts",
    "content": "import * as P from '@react-pdf/primitives';\n\nimport { SafeDefs, SafeDefsNode, SafeNode, SafeSvgNode } from '../types';\n\nconst isDefs = (node: SafeNode): node is SafeDefsNode => node.type === P.Defs;\n\nconst getDefs = (node: SafeSvgNode) => {\n  const children = node.children || [];\n  const defs = children.find(isDefs);\n  const values = defs?.children || [];\n\n  return values.reduce((acc: SafeDefs, value) => {\n    const id = value.props?.id;\n    if (id) acc[id] = value;\n    return acc;\n  }, {});\n};\n\nexport default getDefs;\n"
  },
  {
    "path": "packages/layout/src/svg/inheritProps.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { pick, without } from '@react-pdf/fns';\nimport { SafeNode } from '../types';\n\nconst BASE_SVG_INHERITED_PROPS = [\n  'x',\n  'y',\n  'clipPath',\n  'clipRule',\n  'opacity',\n  'fill',\n  'fillOpacity',\n  'fillRule',\n  'stroke',\n  'strokeLinecap',\n  'strokeLinejoin',\n  'strokeOpacity',\n  'strokeWidth',\n  'textAnchor',\n  'dominantBaseline',\n  'color',\n  'fontFamily',\n  'fontSize',\n  'fontStyle',\n  'fontWeight',\n  'letterSpacing',\n  'opacity',\n  'textDecoration',\n  'lineHeight',\n  'textAlign',\n  'visibility',\n  'wordSpacing',\n];\n\n// Do not inherit \"x\" for <tspan> elements from <text> parent\nconst TEXT_SVG_INHERITED_PROPS = without(['x'], BASE_SVG_INHERITED_PROPS);\n\nconst SVG_INHERITED_PROPS = {\n  [P.Text]: TEXT_SVG_INHERITED_PROPS,\n};\n\nconst getInheritProps = (node) => {\n  const props = node.props || {};\n\n  const svgInheritedProps =\n    SVG_INHERITED_PROPS[node.type] ?? BASE_SVG_INHERITED_PROPS;\n\n  return pick(svgInheritedProps, props);\n};\n\nconst inheritProps = (node: SafeNode) => {\n  if (!node.children) return node;\n\n  const inheritedProps = getInheritProps(node);\n\n  const children = node.children.map((child) => {\n    const props = Object.assign({}, inheritedProps, child.props || {});\n    const newChild = Object.assign({}, child, { props });\n    return inheritProps(newChild);\n  });\n\n  return Object.assign({}, node, { children });\n};\n\nexport default inheritProps;\n"
  },
  {
    "path": "packages/layout/src/svg/layoutText.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport FontStore from '@react-pdf/font';\nimport layoutEngine, {\n  bidi,\n  linebreaker,\n  justification,\n  scriptItemizer,\n  wordHyphenation,\n  fontSubstitution,\n  textDecoration,\n  fromFragments,\n  Fragment,\n} from '@react-pdf/textkit';\n\nimport transformText from '../text/transformText';\nimport {\n  SafeNode,\n  SafeTextNode,\n  SafeTspanNode,\n  SafeTextInstanceNode,\n} from '../types';\n\nconst isTspan = (node: SafeNode): node is SafeTspanNode =>\n  node.type === P.Tspan;\n\nconst isTextInstance = (node: SafeNode): node is SafeTextInstanceNode =>\n  node.type === P.TextInstance;\n\nconst engines = {\n  bidi,\n  linebreaker,\n  justification,\n  textDecoration,\n  scriptItemizer,\n  wordHyphenation,\n  fontSubstitution,\n};\n\nconst engine = layoutEngine(engines);\n\nconst getFragments = (fontStore: FontStore, instance) => {\n  if (!instance) return [{ string: '' }];\n\n  const fragments: Fragment[] = [];\n\n  const {\n    fill = 'black',\n    fontFamily = 'Helvetica',\n    fontWeight,\n    fontStyle,\n    fontSize = 18,\n    textDecorationColor,\n    textDecorationStyle,\n    textTransform,\n    opacity,\n  } = instance.props;\n\n  const _textDecoration = instance.props.textDecoration;\n\n  const fontFamilies =\n    typeof fontFamily === 'string' ? [fontFamily] : [...(fontFamily || [])];\n\n  // Fallback font\n  fontFamilies.push('Helvetica');\n\n  const font = fontFamilies.map((fontFamilyName) => {\n    const opts = { fontFamily: fontFamilyName, fontWeight, fontStyle };\n    const obj = fontStore.getFont(opts);\n    return obj?.data;\n  });\n\n  const attributes = {\n    font,\n    opacity,\n    fontSize,\n    color: fill,\n    underlineStyle: textDecorationStyle,\n    underline:\n      _textDecoration === 'underline' ||\n      _textDecoration === 'underline line-through' ||\n      _textDecoration === 'line-through underline',\n    underlineColor: textDecorationColor || fill,\n    strike:\n      _textDecoration === 'line-through' ||\n      _textDecoration === 'underline line-through' ||\n      _textDecoration === 'line-through underline',\n    strikeStyle: textDecorationStyle,\n    strikeColor: textDecorationColor || fill,\n  };\n\n  for (let i = 0; i < instance.children.length; i += 1) {\n    const child = instance.children[i];\n\n    if (isTextInstance(child)) {\n      fragments.push({\n        string: transformText(child.value, textTransform),\n        attributes,\n      });\n    } else if (child) {\n      fragments.push(...getFragments(fontStore, child));\n    }\n  }\n\n  return fragments;\n};\n\nconst getAttributedString = (fontStore: FontStore, instance) =>\n  fromFragments(getFragments(fontStore, instance));\n\nconst AlmostInfinity = 999999999999;\n\nconst shrinkWhitespaceFactor = { before: -0.5, after: -0.5 };\n\nconst layoutTspan = (fontStore: FontStore) => (node, xOffset) => {\n  const attributedString = getAttributedString(fontStore, node);\n\n  const x = node.props.x === undefined ? xOffset : node.props.x;\n  const y = node.props?.y || 0;\n\n  const container = { x, y, width: AlmostInfinity, height: AlmostInfinity };\n\n  const hyphenationCallback =\n    node.props.hyphenationCallback ||\n    fontStore?.getHyphenationCallback() ||\n    null;\n\n  const layoutOptions = { hyphenationCallback, shrinkWhitespaceFactor };\n  const lines = engine(attributedString, container, layoutOptions).flat();\n\n  return Object.assign({}, node, { lines });\n};\n\n// Consecutive TSpan elements should be joined with a space\nconst joinTSpanLines = (node: SafeTextNode) => {\n  const children = node.children.map((child, index) => {\n    if (!isTspan(child)) return child;\n\n    const textInstance = child.children[0];\n\n    if (\n      child.props.x === undefined &&\n      index < node.children.length - 1 &&\n      textInstance?.value\n    ) {\n      return Object.assign({}, child, {\n        children: [{ ...textInstance, value: `${textInstance.value} ` }],\n      });\n    }\n\n    return child;\n  }, []);\n\n  return Object.assign({}, node, { children });\n};\n\nconst layoutText = (fontStore: FontStore, node: SafeTextNode) => {\n  if (!node.children) return node;\n\n  let currentXOffset = node.props?.x || 0;\n\n  const layoutFn = layoutTspan(fontStore);\n\n  const joinedNode = joinTSpanLines(node);\n\n  const children = joinedNode.children.map((child) => {\n    const childWithLayout = layoutFn(child, currentXOffset);\n    currentXOffset += childWithLayout.lines[0].xAdvance;\n    return childWithLayout;\n  });\n\n  return Object.assign({}, node, { children });\n};\n\nexport default layoutText;\n"
  },
  {
    "path": "packages/layout/src/svg/measureSvg.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\n\nimport { SafePageNode, SafeSvgNode, Viewbox } from '../types';\n\nconst getAspectRatio = (viewbox: string | Viewbox) => {\n  if (!viewbox) return null;\n  if (typeof viewbox === 'string') return null;\n\n  return (viewbox.maxX - viewbox.minX) / (viewbox.maxY - viewbox.minY);\n};\n\n/**\n * Yoga svg measure function\n *\n * @param page\n * @param node\n * @returns Measure svg\n */\nconst measureCanvas =\n  (page: SafePageNode, node: SafeSvgNode): Yoga.MeasureFunction =>\n  (width, widthMode, height, heightMode) => {\n    const aspectRatio = getAspectRatio(node.props.viewBox) || 1;\n\n    if (\n      widthMode === Yoga.MeasureMode.Exactly ||\n      widthMode === Yoga.MeasureMode.AtMost\n    ) {\n      return { width, height: width / aspectRatio };\n    }\n\n    if (heightMode === Yoga.MeasureMode.Exactly) {\n      return { width: height * aspectRatio };\n    }\n\n    return {};\n  };\n\nexport default measureCanvas;\n"
  },
  {
    "path": "packages/layout/src/svg/parseAspectRatio.ts",
    "content": "import { PreserveAspectRatio } from '../types';\n\nconst parseAspectRatio = (value: string | PreserveAspectRatio) => {\n  if (typeof value !== 'string') return value;\n\n  const match = value\n    .replace(/[\\s\\r\\t\\n]+/gm, ' ')\n    .replace(/^defer\\s/, '')\n    .split(' ');\n\n  const align = (match[0] || 'xMidYMid') as PreserveAspectRatio['align'];\n\n  const meetOrSlice = (match[1] ||\n    'meet') as PreserveAspectRatio['meetOrSlice'];\n\n  return { align, meetOrSlice };\n};\n\nexport default parseAspectRatio;\n"
  },
  {
    "path": "packages/layout/src/svg/parseViewbox.ts",
    "content": "import { parseFloat } from '@react-pdf/fns';\nimport { Viewbox } from '../types';\n\nconst parseViewbox = (value?: string | Viewbox) => {\n  if (!value) return null;\n  if (typeof value !== 'string') return value;\n\n  const values = value.split(/[,\\s]+/).map(parseFloat);\n\n  if (values.length !== 4) return null;\n\n  return { minX: values[0], minY: values[1], maxX: values[2], maxY: values[3] };\n};\n\nexport default parseViewbox;\n"
  },
  {
    "path": "packages/layout/src/svg/replaceDefs.ts",
    "content": "import * as P from '@react-pdf/primitives';\n\nimport getDefs from './getDefs';\nimport { SafeDefs, SafeNode, SafeSvgNode } from '../types';\n\nconst isNotDefs = (node: SafeNode) => node.type !== P.Defs;\n\nconst detachDefs = (node: SafeSvgNode) => {\n  if (!node.children) return node;\n\n  const children = node.children.filter(isNotDefs);\n\n  return Object.assign({}, node, { children });\n};\n\nconst URL_REGEX = /url\\(['\"]?#([^'\"]+)['\"]?\\)/;\n\nconst replaceDef = (defs: SafeDefs, value: string) => {\n  if (!value) return undefined;\n\n  if (!URL_REGEX.test(value)) return value;\n\n  const match = value.match(URL_REGEX);\n\n  return defs[match[1]];\n};\n\nconst parseNodeDefs =\n  (defs: SafeDefs) =>\n  (node: SafeNode): SafeNode => {\n    const props = node.props;\n\n    const fill =\n      `fill` in props ? replaceDef(defs, props?.fill as any) : undefined;\n\n    const clipPath =\n      `clipPath` in props\n        ? replaceDef(defs, props?.clipPath as any)\n        : undefined;\n\n    const newProps = Object.assign({}, node.props, { fill, clipPath });\n\n    const children = node.children\n      ? node.children.map(parseNodeDefs(defs))\n      : undefined;\n\n    return Object.assign({}, node, { props: newProps, children });\n  };\n\nconst parseDefs = (root: SafeSvgNode) => {\n  if (!root.children) return root;\n\n  const defs = getDefs(root);\n  const children = root.children.map(parseNodeDefs(defs));\n\n  return Object.assign({}, root, { children });\n};\n\nconst replaceDefs = (node: SafeSvgNode) => {\n  return detachDefs(parseDefs(node));\n};\n\nexport default replaceDefs;\n"
  },
  {
    "path": "packages/layout/src/text/emoji.ts",
    "content": "/* eslint-disable no-console */\n\nimport emojiRegex from 'emoji-regex-xs';\nimport resolveImage from '@react-pdf/image';\nimport { Fragment } from '@react-pdf/textkit';\n\nimport { EmojiSource } from '../../../types';\n\n// Caches emoji images data\nconst emojis = {};\nconst regex = emojiRegex();\n\n/**\n * When an emoji as no variations, it might still have 2 parts,\n * the canonical emoji and an empty string.\n * ex.\n *   (no color) Array.from('❤️') => [\"❤\", \"️\"]\n *   (w/ color) Array.from('👍🏿') => [\"👍\", \"🏿\"]\n *\n * The empty string needs to be removed otherwise the generated\n * url will be incorect.\n */\nconst removeVariationSelectors = (x: string) => x !== '️';\n\nconst getCodePoints = (\n  string: string,\n  withVariationSelectors: boolean = false,\n) =>\n  Array.from(string)\n    .filter(withVariationSelectors ? () => true : removeVariationSelectors)\n    .map((char) => char.codePointAt(0).toString(16))\n    .join('-');\n\nconst buildEmojiUrl = (emoji: string, source: EmojiSource) => {\n  if ('builder' in source) {\n    return source.builder(getCodePoints(emoji, source.withVariationSelectors));\n  }\n\n  const { url, format = 'png', withVariationSelectors } = source;\n  return `${url}${getCodePoints(emoji, withVariationSelectors)}.${format}`;\n};\n\nexport const fetchEmojis = (string: string, source?: EmojiSource) => {\n  if (!source) return [];\n\n  const promises = [];\n\n  Array.from(string.matchAll(regex)).forEach((match) => {\n    const emoji = match[0];\n\n    if (!emojis[emoji] || emojis[emoji].loading) {\n      const emojiUrl = buildEmojiUrl(emoji, source);\n\n      emojis[emoji] = { loading: true };\n\n      promises.push(\n        resolveImage({ uri: emojiUrl })\n          .then((image) => {\n            emojis[emoji].loading = false;\n            emojis[emoji].data = image.data;\n          })\n          .catch((e) => {\n            console.warn(e, 'Failed to load emoji image');\n            emojis[emoji].loading = false;\n          }),\n      );\n    }\n  });\n\n  return promises;\n};\n\nexport const embedEmojis = (fragments: Fragment[]) => {\n  const result: Fragment[] = [];\n\n  for (let i = 0; i < fragments.length; i += 1) {\n    const fragment = fragments[i];\n\n    let lastIndex = 0;\n\n    Array.from(fragment.string.matchAll(regex)).forEach((match) => {\n      const { index } = match;\n      const emoji = match[0];\n      const emojiSize = fragment.attributes.fontSize;\n      const chunk = fragment.string.slice(lastIndex, index + match[0].length);\n\n      // If emoji image was found, we create a new fragment with the\n      // correct attachment and object substitution character;\n      if (emojis[emoji] && emojis[emoji].data) {\n        result.push({\n          string: chunk.replace(match[0], String.fromCharCode(0xfffc)),\n          attributes: {\n            ...fragment.attributes,\n            attachment: {\n              width: emojiSize,\n              height: emojiSize,\n              yOffset: Math.floor(emojiSize * 0.1),\n              image: emojis[emoji].data,\n            },\n          },\n        });\n      } else {\n        // If no emoji data, we try to use emojis in the font\n        result.push({\n          string: chunk,\n          attributes: fragment.attributes,\n        });\n      }\n\n      lastIndex = index + emoji.length;\n    });\n\n    if (lastIndex < fragment.string.length) {\n      result.push({\n        string: fragment.string.slice(lastIndex),\n        attributes: fragment.attributes,\n      });\n    }\n  }\n\n  return result;\n};\n\nexport default fetchEmojis;\n"
  },
  {
    "path": "packages/layout/src/text/getAttributedString.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { Fragment, fromFragments } from '@react-pdf/textkit';\nimport FontStore from '@react-pdf/font';\n\nimport { embedEmojis } from './emoji';\nimport ignoreChars from './ignoreChars';\nimport transformText from './transformText';\nimport {\n  SafeNode,\n  SafeTextNode,\n  SafeImageNode,\n  SafeTextInstanceNode,\n  SafeTspanNode,\n} from '../types';\n\nconst PREPROCESSORS = [ignoreChars, embedEmojis];\n\nconst isImage = (node: SafeNode): node is SafeImageNode =>\n  node.type === P.Image;\n\nconst isTextInstance = (node: SafeNode): node is SafeTextInstanceNode =>\n  node.type === P.TextInstance;\n\n/**\n * Get textkit fragments of given node object\n *\n * @param fontStore - Font store\n * @param instance - Node\n * @param parentLink - Parent link\n * @param level - Fragment level\n * @returns Text fragments\n */\nconst getFragments = (\n  fontStore: FontStore,\n  instance: SafeTextNode | SafeTspanNode,\n  parentLink = null,\n  level = 0,\n) => {\n  if (!instance) return [{ string: '' }];\n\n  let fragments: Fragment[] = [];\n\n  const {\n    color = 'black',\n    direction = 'ltr',\n    fontFamily = 'Helvetica',\n    fontWeight,\n    fontStyle,\n    fontSize = 18,\n    textAlign,\n    lineHeight,\n    textDecoration,\n    textDecorationColor,\n    textDecorationStyle,\n    textTransform,\n    letterSpacing,\n    textIndent,\n    opacity,\n    verticalAlign,\n  } = instance.style;\n\n  const fontFamilies =\n    typeof fontFamily === 'string' ? [fontFamily] : [...(fontFamily || [])];\n\n  // Fallback font\n  fontFamilies.push('Helvetica');\n\n  const font = fontFamilies.map((fontFamilyName) => {\n    const opts = { fontFamily: fontFamilyName, fontWeight, fontStyle };\n    const obj = fontStore.getFont(opts);\n    return obj?.data;\n  });\n\n  // Don't pass main background color to textkit. Will be rendered by the render package instead\n  const backgroundColor = level === 0 ? null : instance.style.backgroundColor;\n\n  const attributes = {\n    font,\n    color,\n    opacity,\n    fontSize,\n    lineHeight,\n    direction,\n    verticalAlign,\n    backgroundColor,\n    indent: textIndent,\n    characterSpacing: letterSpacing,\n    strikeStyle: textDecorationStyle,\n    underlineStyle: textDecorationStyle,\n    underline:\n      textDecoration === 'underline' ||\n      textDecoration === 'underline line-through' ||\n      textDecoration === 'line-through underline',\n    strike:\n      textDecoration === 'line-through' ||\n      textDecoration === 'underline line-through' ||\n      textDecoration === 'line-through underline',\n    strikeColor: textDecorationColor || color,\n    underlineColor: textDecorationColor || color,\n    // @ts-expect-error allow this props access\n    link: parentLink || instance.props?.src || instance.props?.href,\n    align: textAlign || (direction === 'rtl' ? 'right' : 'left'),\n  };\n\n  for (let i = 0; i < instance.children.length; i += 1) {\n    const child = instance.children[i];\n\n    if (isImage(child)) {\n      fragments.push({\n        string: String.fromCharCode(0xfffc),\n        attributes: {\n          ...attributes,\n          attachment: {\n            width: (child.style.width || fontSize) as number,\n            height: (child.style.height || fontSize) as number,\n            image: child.image.data,\n          },\n        },\n      });\n    } else if (isTextInstance(child)) {\n      fragments.push({\n        string: transformText(child.value, textTransform),\n        attributes,\n      });\n    } else if (child) {\n      fragments.push(\n        ...getFragments(fontStore, child, attributes.link, level + 1),\n      );\n    }\n  }\n\n  for (let i = 0; i < PREPROCESSORS.length; i += 1) {\n    const preprocessor = PREPROCESSORS[i];\n    fragments = preprocessor(fragments);\n  }\n\n  return fragments;\n};\n\n/**\n * Get textkit attributed string from text node\n *\n * @param fontStore - Font store\n * @param instance Node\n * @returns Attributed string\n */\nconst getAttributedString = (fontStore: FontStore, instance: SafeTextNode) => {\n  const fragments = getFragments(fontStore, instance);\n  return fromFragments(fragments);\n};\n\nexport default getAttributedString;\n"
  },
  {
    "path": "packages/layout/src/text/heightAtLineIndex.ts",
    "content": "import { SafeTextNode } from '../types';\n\n/**\n * Get height for given text line index\n *\n * @param node\n * @param index\n */\nconst heightAtLineIndex = (node: SafeTextNode, index: number) => {\n  let counter = 0;\n\n  if (!node.lines) return counter;\n\n  for (let i = 0; i < index; i += 1) {\n    const line = node.lines[i];\n\n    if (!line) break;\n\n    counter += line.box.height;\n  }\n\n  return counter;\n};\n\nexport default heightAtLineIndex;\n"
  },
  {
    "path": "packages/layout/src/text/ignoreChars.ts",
    "content": "import { Font, Fragment } from '@react-pdf/textkit';\n\nconst IGNORABLE_CODEPOINTS = [\n  8232, // LINE_SEPARATOR\n  8233, // PARAGRAPH_SEPARATOR\n];\n\nconst buildSubsetForFont = (font: Font) =>\n  IGNORABLE_CODEPOINTS.reduce((acc, codePoint) => {\n    if (\n      font &&\n      font.hasGlyphForCodePoint &&\n      font.hasGlyphForCodePoint(codePoint)\n    ) {\n      return acc;\n    }\n    return [...acc, String.fromCharCode(codePoint)];\n  }, []);\n\nconst ignoreChars = (fragments: Fragment[]): Fragment[] =>\n  fragments.map((fragment) => {\n    const charSubset = buildSubsetForFont(fragment.attributes.font[0]);\n    const subsetRegex = new RegExp(charSubset.join('|'));\n\n    return {\n      string: fragment.string.replace(subsetRegex, ''),\n      attributes: fragment.attributes,\n    };\n  });\n\nexport default ignoreChars;\n"
  },
  {
    "path": "packages/layout/src/text/layoutText.ts",
    "content": "import layoutEngine, {\n  bidi,\n  linebreaker,\n  justification,\n  scriptItemizer,\n  wordHyphenation,\n  textDecoration,\n  fontSubstitution,\n} from '@react-pdf/textkit';\nimport FontStore from '@react-pdf/font';\n\nimport getAttributedString from './getAttributedString';\nimport { SafeTextNode } from '../types';\n\nconst engines = {\n  bidi,\n  linebreaker,\n  justification,\n  textDecoration,\n  scriptItemizer,\n  wordHyphenation,\n  fontSubstitution,\n};\n\nconst engine = layoutEngine(engines);\n\nconst getMaxLines = (node) => node.style?.maxLines;\n\nconst getTextOverflow = (node) => node.style?.textOverflow;\n\n/**\n * Get layout container for specific text node\n *\n * @param {number} width\n * @param {number} height\n * @param {Object} node\n * @returns {Object} layout container\n */\nconst getContainer = (width, height, node) => {\n  const maxLines = getMaxLines(node);\n  const textOverflow = getTextOverflow(node);\n\n  return {\n    x: 0,\n    y: 0,\n    width,\n    maxLines,\n    height: height || Infinity,\n    truncateMode: textOverflow,\n  };\n};\n\n/**\n * Get text layout options for specific text node\n *\n * @param {Object} node instance\n * @returns {Object} layout options\n */\nconst getLayoutOptions = (fontStore, node) => ({\n  hyphenationPenalty: node.props.hyphenationPenalty,\n  shrinkWhitespaceFactor: { before: -0.5, after: -0.5 },\n  hyphenationCallback:\n    node.props.hyphenationCallback ||\n    fontStore?.getHyphenationCallback() ||\n    null,\n});\n\n/**\n * Get text lines for given node\n *\n * @param node - Node\n * @param width - Container width\n * @param height - Container height\n * @param fontStore - Font store\n * @returns Layout lines\n */\nconst layoutText = (\n  node: SafeTextNode,\n  width: number,\n  height: number,\n  fontStore: FontStore,\n) => {\n  const attributedString = getAttributedString(fontStore, node);\n  const container = getContainer(width, height, node);\n  const options = getLayoutOptions(fontStore, node);\n  const lines = engine(attributedString, container, options);\n\n  return lines.reduce((acc, line) => [...acc, ...line], []);\n};\n\nexport default layoutText;\n"
  },
  {
    "path": "packages/layout/src/text/lineIndexAtHeight.ts",
    "content": "import { SafeTextNode } from '../types';\n\n/**\n * Get line index at given height\n *\n * @param node\n * @param height\n */\nconst lineIndexAtHeight = (node: SafeTextNode, height: number) => {\n  let y = 0;\n\n  if (!node.lines) return 0;\n\n  for (let i = 0; i < node.lines.length; i += 1) {\n    const line = node.lines[i];\n    if (y + line.box.height > height) return i;\n    y += line.box.height;\n  }\n\n  return node.lines.length;\n};\n\nexport default lineIndexAtHeight;\n"
  },
  {
    "path": "packages/layout/src/text/linesHeight.ts",
    "content": "import { SafeTextNode } from '../types';\n\n/**\n * Get lines height (if any)\n *\n * @param node\n * @returns Lines height\n */\nconst linesHeight = (node: SafeTextNode) => {\n  if (!node.lines) return -1;\n  return node.lines.reduce((acc, line) => acc + line.box.height, 0);\n};\n\nexport default linesHeight;\n"
  },
  {
    "path": "packages/layout/src/text/linesWidth.ts",
    "content": "import { SafeTextNode } from '../types';\n\n/**\n * Get lines width (if any)\n *\n * @param node\n * @returns Lines width\n */\nconst linesWidth = (node: SafeTextNode) => {\n  if (!node.lines) return 0;\n\n  return Math.max(0, ...node.lines.map((line) => line.xAdvance));\n};\n\nexport default linesWidth;\n"
  },
  {
    "path": "packages/layout/src/text/measureText.ts",
    "content": "import * as Yoga from 'yoga-layout/load';\nimport FontStore from '@react-pdf/font';\n\nimport layoutText from './layoutText';\nimport linesWidth from './linesWidth';\nimport linesHeight from './linesHeight';\nimport { SafePageNode, SafeTextNode } from '../types';\n\nconst ALIGNMENT_FACTORS = { center: 0.5, right: 1 };\n\n/**\n * Yoga text measure function\n *\n * @param page\n * @param node\n * @param fontStore\n * @returns {MeasureText} measure text function\n */\nconst measureText =\n  (\n    page: SafePageNode,\n    node: SafeTextNode,\n    fontStore: FontStore,\n  ): Yoga.MeasureFunction =>\n  (width, widthMode, height) => {\n    if (widthMode === Yoga.MeasureMode.Exactly) {\n      if (!node.lines) node.lines = layoutText(node, width, height, fontStore);\n\n      return { height: linesHeight(node), width };\n    }\n\n    if (widthMode === Yoga.MeasureMode.AtMost) {\n      const alignFactor = ALIGNMENT_FACTORS[node.style?.textAlign] || 0;\n\n      if (!node.lines) {\n        node.lines = layoutText(node, width, height, fontStore);\n        node.alignOffset = (width - linesWidth(node)) * alignFactor; // Compensate align in variable width containers\n      }\n\n      return {\n        height: linesHeight(node),\n        width: Math.min(width, linesWidth(node)),\n      };\n    }\n\n    return {};\n  };\n\nexport default measureText;\n"
  },
  {
    "path": "packages/layout/src/text/splitText.ts",
    "content": "import lineIndexAtHeight from './lineIndexAtHeight';\nimport heightAtLineIndex from './heightAtLineIndex';\nimport { SafeTextNode } from '../types';\n\nconst getLineBreak = (node: SafeTextNode, height: number) => {\n  const top = node.box?.top || 0;\n  const widows = node.props.widows || 2;\n  const orphans = node.props.orphans || 2;\n  const linesQuantity = node.lines.length;\n  const slicedLine = lineIndexAtHeight(node, height - top);\n\n  if (slicedLine === 0) {\n    return 0;\n  }\n\n  if (linesQuantity < orphans) {\n    return linesQuantity;\n  }\n\n  if (slicedLine < orphans || linesQuantity < orphans + widows) {\n    return 0;\n  }\n\n  if (linesQuantity === orphans + widows) {\n    return orphans;\n  }\n\n  if (linesQuantity - slicedLine < widows) {\n    return linesQuantity - widows;\n  }\n\n  return slicedLine;\n};\n\n// Also receives contentArea in case it's needed\nconst splitText = (node: SafeTextNode, height: number) => {\n  const slicedLineIndex = getLineBreak(node, height);\n  const currentHeight = heightAtLineIndex(node, slicedLineIndex);\n  const nextHeight = node.box.height - currentHeight;\n\n  const current: SafeTextNode = Object.assign({}, node, {\n    box: {\n      ...node.box,\n      height: currentHeight,\n      borderBottomWidth: 0,\n    },\n    style: {\n      ...node.style,\n      marginBottom: 0,\n      paddingBottom: 0,\n      borderBottomWidth: 0,\n      borderBottomLeftRadius: 0,\n      borderBottomRightRadius: 0,\n    },\n    lines: node.lines.slice(0, slicedLineIndex),\n  });\n\n  const next: SafeTextNode = Object.assign({}, node, {\n    box: {\n      ...node.box,\n      top: 0,\n      height: nextHeight,\n      borderTopWidth: 0,\n    },\n    style: {\n      ...node.style,\n      marginTop: 0,\n      paddingTop: 0,\n      borderTopWidth: 0,\n      borderTopLeftRadius: 0,\n      borderTopRightRadius: 0,\n    },\n    lines: node.lines.slice(slicedLineIndex),\n  });\n\n  return [current, next];\n};\n\nexport default splitText;\n"
  },
  {
    "path": "packages/layout/src/text/transformText.ts",
    "content": "import { capitalize, upperFirst } from '@react-pdf/fns';\nimport { SafeStyle } from '@react-pdf/stylesheet';\n\n/**\n * Apply transformation to text string\n *\n * @param {string} text\n * @param {string} transformation type\n * @returns {string} transformed text\n */\nconst transformText = (\n  text: string,\n  transformation: SafeStyle['textTransform'],\n) => {\n  switch (transformation) {\n    case 'uppercase':\n      return text.toUpperCase();\n    case 'lowercase':\n      return text.toLowerCase();\n    case 'capitalize':\n      return capitalize(text);\n    case 'upperfirst':\n      return upperFirst(text);\n    default:\n      return text;\n  }\n};\n\nexport default transformText;\n"
  },
  {
    "path": "packages/layout/src/types/base.ts",
    "content": "import { Transform } from '@react-pdf/stylesheet';\nimport { YogaNode } from 'yoga-layout/load';\nimport * as React from 'react';\nimport { SafeClipPathNode } from './clip-path';\nimport { SafeLinearGradientNode } from './linear-gradient';\nimport { SafeRadialGradientNode } from './radial-gradient';\n\nexport type YogaInstance = {\n  node: { create: () => YogaNode };\n};\n\nexport type Box = {\n  width: number;\n  height: number;\n\n  top: number;\n  left: number;\n  right: number;\n  bottom: number;\n\n  // TODO: should be optional?\n  marginTop?: number;\n  marginRight?: number;\n  marginBottom?: number;\n  marginLeft?: number;\n  paddingTop?: number;\n  paddingRight?: number;\n  paddingBottom?: number;\n  paddingLeft?: number;\n  borderTopWidth?: number;\n  borderRightWidth?: number;\n  borderBottomWidth?: number;\n  borderLeftWidth?: number;\n};\n\nexport type Origin = {\n  left: number;\n  top: number;\n};\n\nexport interface Bookmark {\n  title: string;\n  top?: number;\n  left?: number;\n  zoom?: number;\n  fit?: true | false;\n  expanded?: true | false;\n  parent?: number;\n  ref?: number;\n}\n\nexport type DynamicPageProps = {\n  pageNumber: number;\n  totalPages?: number;\n  subPageNumber?: number;\n  subPageTotalPages?: number;\n};\n\nexport type RenderProp = (\n  props: DynamicPageProps,\n) => React.ReactNode | null | undefined;\n\nexport type NodeProps = {\n  id?: string;\n  /**\n   * Render component in all wrapped pages.\n   * @see https://react-pdf.org/advanced#fixed-components\n   */\n  fixed?: boolean;\n  /**\n   * Force the wrapping algorithm to start a new page when rendering the\n   * element.\n   * @see https://react-pdf.org/advanced#page-breaks\n   */\n  break?: boolean;\n  /**\n   * Hint that no page wrapping should occur between all sibling elements following the element within n points\n   * @see https://react-pdf.org/advanced#orphan-&-widow-protection\n   */\n  minPresenceAhead?: number;\n  /**\n   * Enables debug mode on page bounding box.\n   * @see https://react-pdf.org/advanced#debugging\n   */\n  debug?: boolean;\n  bookmark?: Bookmark;\n};\n\nexport type FillRule = 'nonzero' | 'evenodd';\n\nexport type TextAnchor = 'start' | 'middle' | 'end';\n\nexport type StrokeLinecap = 'butt' | 'round' | 'square';\n\nexport type StrokeLinejoin = 'butt' | 'round' | 'square' | 'miter' | 'bevel';\n\nexport type Visibility = 'visible' | 'hidden' | 'collapse';\n\nexport type DominantBaseline =\n  | 'auto'\n  | 'middle'\n  | 'central'\n  | 'hanging'\n  | 'mathematical'\n  | 'text-after-edge'\n  | 'text-before-edge';\n\nexport type SVGPresentationAttributes = {\n  fill?: string;\n  color?: string;\n  stroke?: string;\n  transform?: string;\n  strokeDasharray?: string;\n  opacity?: string | number;\n  strokeWidth?: string | number;\n  fillOpacity?: string | number;\n  fillRule?: FillRule;\n  strokeOpacity?: string | number;\n  textAnchor?: TextAnchor;\n  strokeLinecap?: StrokeLinecap;\n  strokeLinejoin?: StrokeLinejoin;\n  visibility?: Visibility;\n  clipPath?: string;\n  dominantBaseline?: DominantBaseline;\n};\n\nexport type SafeSVGPresentationAttributes = {\n  fill?: string | SafeLinearGradientNode | SafeRadialGradientNode;\n  color?: string;\n  stroke?: string;\n  transform?: Transform[];\n  strokeDasharray?: string;\n  opacity?: number;\n  strokeWidth?: number;\n  fillOpacity?: number;\n  fillRule?: FillRule;\n  strokeOpacity?: number;\n  textAnchor?: TextAnchor;\n  strokeLinecap?: StrokeLinecap;\n  strokeLinejoin?: StrokeLinejoin;\n  visibility?: Visibility;\n  clipPath?: SafeClipPathNode;\n  dominantBaseline?: DominantBaseline;\n};\n\nexport interface FormCommonProps extends NodeProps {\n  name?: string;\n  required?: boolean;\n  noExport?: boolean;\n  readOnly?: boolean;\n  value?: number | string;\n  defaultValue?: number | string;\n}\n"
  },
  {
    "path": "packages/layout/src/types/canvas.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport { YogaNode } from 'yoga-layout/load';\n\nimport { Box, NodeProps, Origin } from './base';\n\ninterface CanvasProps extends NodeProps {\n  paint: (\n    painter: any,\n    availableWidth?: number,\n    availableHeight?: number,\n  ) => null;\n}\n\nexport type CanvasNode = {\n  type: typeof P.Canvas;\n  props: CanvasProps;\n  style?: Style | Style[];\n  box?: Box;\n  origin?: Origin;\n  yogaNode?: YogaNode;\n  children?: never[];\n};\n\nexport type SafeCanvasNode = Omit<CanvasNode, 'style'> & {\n  style: SafeStyle;\n};\n"
  },
  {
    "path": "packages/layout/src/types/checkbox.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport { YogaNode } from 'yoga-layout/load';\n\nimport { Box, FormCommonProps, Origin } from './base';\n\ninterface CheckboxProps extends FormCommonProps {\n  backgroundColor?: string;\n  borderColor?: string;\n  checked?: boolean;\n  onState?: string;\n  offState?: string;\n  xMark?: boolean;\n}\n\nexport type CheckboxNode = {\n  type: typeof P.Checkbox;\n  props: CheckboxProps;\n  style?: Style | Style[];\n  box?: Box;\n  origin?: Origin;\n  yogaNode?: YogaNode;\n  children?: never[];\n};\n\nexport type SafeCheckboxNode = Omit<CheckboxNode, 'style'> & {\n  style: SafeStyle;\n};\n"
  },
  {
    "path": "packages/layout/src/types/circle.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\n\nimport {\n  Origin,\n  SVGPresentationAttributes,\n  SafeSVGPresentationAttributes,\n} from './base';\n\ninterface CircleProps extends SVGPresentationAttributes {\n  style?: SVGPresentationAttributes;\n  cx?: string | number;\n  cy?: string | number;\n  r: string | number;\n}\n\ninterface SafeCircleProps extends SafeSVGPresentationAttributes {\n  style?: SafeSVGPresentationAttributes;\n  cx?: number;\n  cy?: number;\n  r: number;\n}\n\nexport type CircleNode = {\n  type: typeof P.Circle;\n  props: CircleProps;\n  style?: Style | Style[];\n  box?: never;\n  origin?: Origin;\n  yogaNode?: never;\n  children?: never[];\n};\n\nexport type SafeCircleNode = Omit<CircleNode, 'style' | 'props'> & {\n  style: SafeStyle;\n  props: SafeCircleProps;\n};\n"
  },
  {
    "path": "packages/layout/src/types/clip-path.ts",
    "content": "import * as P from '@react-pdf/primitives';\n\nimport { LineNode, SafeLineNode } from './line';\nimport { PolylineNode, SafePolylineNode } from './polyline';\nimport { PolygonNode, SafePolygonNode } from './polygon';\nimport { PathNode, SafePathNode } from './path';\nimport { RectNode, SafeRectNode } from './rect';\nimport { CircleNode, SafeCircleNode } from './circle';\nimport { EllipseNode, SafeEllipseNode } from './ellipse';\n\ninterface ClipPathProps {\n  id?: string;\n}\n\nexport type ClipPathNode = {\n  type: typeof P.ClipPath;\n  props: ClipPathProps;\n  style: never;\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: (\n    | LineNode\n    | PolylineNode\n    | PolygonNode\n    | PathNode\n    | RectNode\n    | CircleNode\n    | EllipseNode\n  )[];\n};\n\nexport type SafeClipPathNode = Omit<ClipPathNode, 'children'> & {\n  children?: (\n    | SafeLineNode\n    | SafePolylineNode\n    | SafePolygonNode\n    | SafePathNode\n    | SafeRectNode\n    | SafeCircleNode\n    | SafeEllipseNode\n  )[];\n};\n"
  },
  {
    "path": "packages/layout/src/types/defs.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { ClipPathNode, SafeClipPathNode } from './clip-path';\nimport { LinearGradientNode, SafeLinearGradientNode } from './linear-gradient';\nimport { RadialGradientNode, SafeRadialGradientNode } from './radial-gradient';\n\nexport type DefsNode = {\n  type: typeof P.Defs;\n  props?: never;\n  style?: never;\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: (ClipPathNode | LinearGradientNode | RadialGradientNode)[];\n};\n\nexport type Defs = Record<string, DefsNode['children'][number]>;\n\nexport type SafeDefsNode = Omit<DefsNode, 'children'> & {\n  children?: (\n    | SafeClipPathNode\n    | SafeLinearGradientNode\n    | SafeRadialGradientNode\n  )[];\n};\n\nexport type SafeDefs = Record<string, SafeDefsNode['children'][number]>;\n"
  },
  {
    "path": "packages/layout/src/types/document.ts",
    "content": "import * as P from '@react-pdf/primitives';\n\nimport { PageNode, SafePageNode } from './page';\nimport { YogaInstance } from './base';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\n\nexport type PDFVersion = '1.3' | '1.4' | '1.5' | '1.6' | '1.7' | '1.7ext3';\n\nexport type PageLayout =\n  | 'singlePage'\n  | 'oneColumn'\n  | 'twoColumnLeft'\n  | 'twoColumnRight'\n  | 'twoPageLeft'\n  | 'twoPageRight';\n\nexport type PageMode =\n  | 'useNone'\n  | 'useOutlines'\n  | 'useThumbs'\n  | 'fullScreen'\n  | 'useOC'\n  | 'useAttachments';\n\nexport interface OnRenderProps {\n  blob?: Blob;\n}\n\nexport type DocumentProps = {\n  bookmark?: never;\n  title?: string;\n  author?: string;\n  subject?: string;\n  creator?: string;\n  keywords?: string;\n  producer?: string;\n  language?: string;\n  creationDate?: Date;\n  modificationDate?: Date;\n  pdfVersion?: PDFVersion;\n  pageMode?: PageMode;\n  pageLayout?: PageLayout;\n  onRender?: (props: OnRenderProps) => any;\n};\n\nexport type DocumentNode = {\n  type: typeof P.Document;\n  props: DocumentProps;\n  box?: never;\n  origin?: never;\n  style?: Style | Style[];\n  yoga?: YogaInstance;\n  yogaNode?: never;\n  children: PageNode[];\n};\n\nexport type SafeDocumentNode = Omit<DocumentNode, 'style' | 'children'> & {\n  style: SafeStyle;\n  children: SafePageNode[];\n};\n"
  },
  {
    "path": "packages/layout/src/types/ellipse.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\n\nimport {\n  SafeSVGPresentationAttributes,\n  SVGPresentationAttributes,\n} from './base';\n\ninterface EllipseProps extends SVGPresentationAttributes {\n  style?: SVGPresentationAttributes;\n  cx?: string | number;\n  cy?: string | number;\n  rx: string | number;\n  ry: string | number;\n}\n\ninterface SafeEllipseProps extends SafeSVGPresentationAttributes {\n  style?: SafeSVGPresentationAttributes;\n  cx?: number;\n  cy?: number;\n  rx: number;\n  ry: number;\n}\n\nexport type EllipseNode = {\n  type: typeof P.Ellipse;\n  props: EllipseProps;\n  style?: Style | Style[];\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: never[];\n};\n\nexport type SafeEllipseNode = Omit<EllipseNode, 'style' | 'props'> & {\n  style: SafeStyle;\n  props: SafeEllipseProps;\n};\n"
  },
  {
    "path": "packages/layout/src/types/field-set.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport { YogaNode } from 'yoga-layout/load';\n\nimport { Box, NodeProps, Origin } from './base';\nimport { SafeTextNode, TextNode } from './text';\nimport { SafeViewNode, ViewNode } from './view';\nimport { SafeTextInputNode, TextInputNode } from './text-input';\n\ninterface FieldSetProps extends NodeProps {\n  name: string;\n}\n\nexport type FieldSetNode = {\n  type: typeof P.FieldSet;\n  props: FieldSetProps;\n  style?: Style | Style[];\n  box?: Box;\n  origin?: Origin;\n  yogaNode?: YogaNode;\n  children?: (TextNode | ViewNode | TextInputNode)[];\n};\n\nexport type SafeFieldSetNode = Omit<FieldSetNode, 'style' | 'children'> & {\n  style: SafeStyle;\n  children?: (SafeTextNode | SafeViewNode | SafeTextInputNode)[];\n};\n"
  },
  {
    "path": "packages/layout/src/types/g.ts",
    "content": "import { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport * as P from '@react-pdf/primitives';\n\nimport { LineNode, SafeLineNode } from './line';\nimport { PolylineNode, SafePolylineNode } from './polyline';\nimport { PolygonNode, SafePolygonNode } from './polygon';\nimport { PathNode, SafePathNode } from './path';\nimport { RectNode, SafeRectNode } from './rect';\nimport { CircleNode, SafeCircleNode } from './circle';\nimport { EllipseNode, SafeEllipseNode } from './ellipse';\nimport { SafeTspanNode, TspanNode } from './tspan';\nimport { ImageNode, SafeImageNode } from './image';\nimport { SafeTextNode, TextNode } from './text';\nimport {\n  SVGPresentationAttributes,\n  SafeSVGPresentationAttributes,\n} from './base';\n\ninterface GProps extends SVGPresentationAttributes {\n  style?: Style | Style[];\n}\n\ninterface SafeGProps extends SafeSVGPresentationAttributes {\n  style?: Style;\n}\n\nexport type GNode = {\n  type: typeof P.G;\n  props: GProps;\n  style?: Style | Style[];\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: (\n    | LineNode\n    | PolylineNode\n    | PolygonNode\n    | PathNode\n    | RectNode\n    | CircleNode\n    | EllipseNode\n    | ImageNode\n    | TextNode\n    | TspanNode\n    | GNode\n  )[];\n};\n\nexport type SafeGNode = Omit<GNode, 'style' | 'props' | 'children'> & {\n  style: SafeStyle;\n  props: SafeGProps;\n  children?: (\n    | SafeLineNode\n    | SafePolylineNode\n    | SafePolygonNode\n    | SafePathNode\n    | SafeRectNode\n    | SafeCircleNode\n    | SafeEllipseNode\n    | SafeImageNode\n    | SafeTextNode\n    | SafeTspanNode\n    | SafeGNode\n  )[];\n};\n"
  },
  {
    "path": "packages/layout/src/types/image.ts",
    "content": "import { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport * as P from '@react-pdf/primitives';\nimport { YogaNode } from 'yoga-layout/load';\n\nimport { Box, NodeProps, Origin } from './base';\nimport { Image } from '@react-pdf/image';\n\ntype HTTPMethod = 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\ntype SourceURL = string;\n\ntype SourceBuffer = Buffer;\n\ntype SourceBlob = Blob;\n\ntype SourceDataBuffer = { data: Buffer; format: 'png' | 'jpg' };\n\ntype SourceURLObject = {\n  uri: string;\n  method?: HTTPMethod;\n  body?: any;\n  headers?: any;\n  credentials?: 'omit' | 'same-origin' | 'include';\n};\n\ntype Source =\n  | SourceURL\n  | SourceBuffer\n  | SourceBlob\n  | SourceDataBuffer\n  | SourceURLObject\n  | undefined;\n\ntype SourceFactory = () => Source;\n\ntype SourceAsync = Promise<Source>;\n\ntype SourceAsyncFactory = () => Promise<Source>;\n\nexport type SourceObject =\n  | Source\n  | SourceFactory\n  | SourceAsync\n  | SourceAsyncFactory;\n\ninterface BaseImageProps extends NodeProps {\n  cache?: boolean;\n  x?: number;\n  y?: number;\n}\n\ninterface ImageWithSrcProp extends BaseImageProps {\n  src: SourceObject;\n  source?: never;\n}\n\ninterface ImageWithSourceProp extends BaseImageProps {\n  source: SourceObject;\n  src?: never;\n}\n\nexport type ImageProps = ImageWithSrcProp | ImageWithSourceProp;\n\nexport type ImageNode = {\n  type: typeof P.Image;\n  props: ImageProps;\n  image?: Image;\n  style?: Style | Style[];\n  box?: Box;\n  origin?: Origin;\n  yogaNode?: YogaNode;\n  children?: never[];\n};\n\nexport type SafeImageNode = Omit<ImageNode, 'style'> & {\n  style: SafeStyle;\n};\n"
  },
  {
    "path": "packages/layout/src/types/index.ts",
    "content": "export * from './base';\nexport * from './canvas';\nexport * from './circle';\nexport * from './checkbox';\nexport * from './clip-path';\nexport * from './defs';\nexport * from './document';\nexport * from './ellipse';\nexport * from './field-set';\nexport * from './g';\nexport * from './image';\nexport * from './line';\nexport * from './linear-gradient';\nexport * from './link';\nexport * from './node';\nexport * from './note';\nexport * from './page';\nexport * from './path';\nexport * from './polygon';\nexport * from './polyline';\nexport * from './radial-gradient';\nexport * from './rect';\nexport * from './select';\nexport * from './stop';\nexport * from './svg';\nexport * from './text-instance';\nexport * from './text-input';\nexport * from './text';\nexport * from './tspan';\nexport * from './view';\n"
  },
  {
    "path": "packages/layout/src/types/line.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\n\nimport {\n  SVGPresentationAttributes,\n  SafeSVGPresentationAttributes,\n} from './base';\n\ninterface LineProps extends SVGPresentationAttributes {\n  style?: SVGPresentationAttributes;\n  x1: string | number;\n  x2: string | number;\n  y1: string | number;\n  y2: string | number;\n}\n\ninterface SafeLineProps extends SafeSVGPresentationAttributes {\n  style?: SafeSVGPresentationAttributes;\n  x1: number;\n  x2: number;\n  y1: number;\n  y2: number;\n}\n\nexport type LineNode = {\n  type: typeof P.Line;\n  props: LineProps;\n  style?: Style | Style[];\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: never[];\n};\n\nexport type SafeLineNode = Omit<LineNode, 'style' | 'props'> & {\n  style: SafeStyle;\n  props: SafeLineProps;\n};\n"
  },
  {
    "path": "packages/layout/src/types/linear-gradient.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { Transform } from '@react-pdf/stylesheet';\n\nimport { SafeStopNode, StopNode } from './stop';\ninterface LinearGradientProps {\n  id: string;\n  x1?: string | number;\n  x2?: string | number;\n  y1?: string | number;\n  y2?: string | number;\n  xlinkHref?: string;\n  gradientTransform?: string;\n  gradientUnits?: 'userSpaceOnUse' | 'objectBoundingBox';\n}\n\ninterface SafeLinearGradientProps {\n  id: string;\n  x1?: number;\n  x2?: number;\n  y1?: number;\n  y2?: number;\n  xlinkHref?: string;\n  gradientTransform?: Transform[];\n  gradientUnits?: 'userSpaceOnUse' | 'objectBoundingBox';\n}\n\nexport type LinearGradientNode = {\n  type: typeof P.LinearGradient;\n  props: LinearGradientProps;\n  style?: never;\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: StopNode[];\n};\n\nexport type SafeLinearGradientNode = Omit<\n  LinearGradientNode,\n  'props' | 'children'\n> & {\n  props: SafeLinearGradientProps;\n  children?: SafeStopNode[];\n};\n"
  },
  {
    "path": "packages/layout/src/types/link.ts",
    "content": "import { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport * as P from '@react-pdf/primitives';\nimport { YogaNode } from 'yoga-layout/load';\n\nimport { Box, NodeProps, Origin, RenderProp } from './base';\nimport { ImageNode, SafeImageNode } from './image';\nimport { SafeTextNode, TextNode } from './text';\nimport { SafeTextInstanceNode, TextInstanceNode } from './text-instance';\nimport { SafeViewNode, ViewNode } from './view';\n\ninterface LinkProps extends NodeProps {\n  /**\n   * Enable/disable page wrapping for element.\n   * @see https://react-pdf.org/components#page-wrapping\n   */\n  wrap?: boolean;\n  href?: string;\n  src?: string;\n  render?: RenderProp;\n}\n\nexport type LinkNode = {\n  type: typeof P.Link;\n  props: LinkProps;\n  style?: Style | Style[];\n  box?: Box;\n  origin?: Origin;\n  yogaNode?: YogaNode;\n  children?: (ViewNode | ImageNode | TextNode | TextInstanceNode)[];\n};\n\nexport type SafeLinkNode = Omit<LinkNode, 'style' | 'children'> & {\n  style: SafeStyle;\n  children?: (\n    | SafeViewNode\n    | SafeImageNode\n    | SafeTextNode\n    | SafeTextInstanceNode\n  )[];\n};\n"
  },
  {
    "path": "packages/layout/src/types/node.ts",
    "content": "import { CanvasNode, SafeCanvasNode } from './canvas';\nimport { CheckboxNode, SafeCheckboxNode } from './checkbox';\nimport { CircleNode, SafeCircleNode } from './circle';\nimport { ClipPathNode, SafeClipPathNode } from './clip-path';\nimport { DefsNode, SafeDefsNode } from './defs';\nimport { DocumentNode, SafeDocumentNode } from './document';\nimport { EllipseNode, SafeEllipseNode } from './ellipse';\nimport { FieldSetNode, SafeFieldSetNode } from './field-set';\nimport { GNode, SafeGNode } from './g';\nimport { ImageNode, SafeImageNode } from './image';\nimport { LineNode, SafeLineNode } from './line';\nimport { LinearGradientNode, SafeLinearGradientNode } from './linear-gradient';\nimport { LinkNode, SafeLinkNode } from './link';\nimport { NoteNode, SafeNoteNode } from './note';\nimport { PageNode, SafePageNode } from './page';\nimport { PathNode, SafePathNode } from './path';\nimport { PolygonNode, SafePolygonNode } from './polygon';\nimport { PolylineNode, SafePolylineNode } from './polyline';\nimport { RadialGradientNode, SafeRadialGradientNode } from './radial-gradient';\nimport { RectNode, SafeRectNode } from './rect';\nimport { ListNode, SafeListNode, SafeSelectNode, SelectNode } from './select';\nimport { SafeStopNode, StopNode } from './stop';\nimport { SafeSvgNode, SvgNode } from './svg';\nimport { SafeTextNode, TextNode } from './text';\nimport { SafeTextInputNode, TextInputNode } from './text-input';\nimport { SafeTextInstanceNode, TextInstanceNode } from './text-instance';\nimport { SafeTspanNode, TspanNode } from './tspan';\nimport { SafeViewNode, ViewNode } from './view';\n\nexport type Node =\n  | DocumentNode\n  | PageNode\n  | ImageNode\n  | SvgNode\n  | CircleNode\n  | ClipPathNode\n  | DefsNode\n  | EllipseNode\n  | GNode\n  | LineNode\n  | LinearGradientNode\n  | PathNode\n  | PolygonNode\n  | PolylineNode\n  | RadialGradientNode\n  | RectNode\n  | StopNode\n  | TspanNode\n  | ViewNode\n  | LinkNode\n  | TextNode\n  | TextInstanceNode\n  | NoteNode\n  | CanvasNode\n  | FieldSetNode\n  | TextInputNode\n  | SelectNode\n  | ListNode\n  | CheckboxNode;\n\nexport type SafeNode =\n  | SafeDocumentNode\n  | SafePageNode\n  | SafeImageNode\n  | SafeSvgNode\n  | SafeCircleNode\n  | SafeClipPathNode\n  | SafeDefsNode\n  | SafeEllipseNode\n  | SafeGNode\n  | SafeLineNode\n  | SafeLinearGradientNode\n  | SafePathNode\n  | SafePolygonNode\n  | SafePolylineNode\n  | SafeRadialGradientNode\n  | SafeRectNode\n  | SafeStopNode\n  | SafeTspanNode\n  | SafeViewNode\n  | SafeLinkNode\n  | SafeTextNode\n  | SafeTextInstanceNode\n  | SafeNoteNode\n  | SafeCanvasNode\n  | SafeFieldSetNode\n  | SafeTextInputNode\n  | SafeSelectNode\n  | SafeListNode\n  | SafeCheckboxNode;\n"
  },
  {
    "path": "packages/layout/src/types/note.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\n\nimport { NodeProps } from './base';\nimport { SafeTextInstanceNode, TextInstanceNode } from './text-instance';\n\nexport type NoteNode = {\n  type: typeof P.Note;\n  props: NodeProps;\n  style?: Style | Style[];\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: TextInstanceNode[];\n};\n\nexport type SafeNoteNode = Omit<NoteNode, 'style' | 'children'> & {\n  style: SafeStyle;\n  children?: SafeTextInstanceNode[];\n};\n"
  },
  {
    "path": "packages/layout/src/types/page.ts",
    "content": "import { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport * as P from '@react-pdf/primitives';\nimport { YogaNode } from 'yoga-layout/load';\n\nimport type { Box, NodeProps, Origin } from './base';\nimport { ImageNode, SafeImageNode } from './image';\nimport { SafeViewNode, ViewNode } from './view';\nimport { SafeTextNode, TextNode } from './text';\nimport { LinkNode, SafeLinkNode } from './link';\nimport { CanvasNode, SafeCanvasNode } from './canvas';\nimport { FieldSetNode, SafeFieldSetNode } from './field-set';\nimport { SafeTextInputNode, TextInputNode } from './text-input';\nimport { ListNode, SafeListNode, SafeSelectNode, SelectNode } from './select';\nimport { CheckboxNode, SafeCheckboxNode } from './checkbox';\nimport { NoteNode, SafeNoteNode } from './note';\n\nexport type Orientation = 'portrait' | 'landscape';\n\nexport type StandardPageSize =\n  | '4A0'\n  | '2A0'\n  | 'A0'\n  | 'A1'\n  | 'A2'\n  | 'A3'\n  | 'A4'\n  | 'A5'\n  | 'A6'\n  | 'A7'\n  | 'A8'\n  | 'A9'\n  | 'A10'\n  | 'B0'\n  | 'B1'\n  | 'B2'\n  | 'B3'\n  | 'B4'\n  | 'B5'\n  | 'B6'\n  | 'B7'\n  | 'B8'\n  | 'B9'\n  | 'B10'\n  | 'C0'\n  | 'C1'\n  | 'C2'\n  | 'C3'\n  | 'C4'\n  | 'C5'\n  | 'C6'\n  | 'C7'\n  | 'C8'\n  | 'C9'\n  | 'C10'\n  | 'RA0'\n  | 'RA1'\n  | 'RA2'\n  | 'RA3'\n  | 'RA4'\n  | 'SRA0'\n  | 'SRA1'\n  | 'SRA2'\n  | 'SRA3'\n  | 'SRA4'\n  | 'EXECUTIVE'\n  | 'FOLIO'\n  | 'LEGAL'\n  | 'LETTER'\n  | 'TABLOID'\n  | 'ID1';\n\ntype StaticSize = number | string;\n\nexport type PageSize =\n  | number\n  | StandardPageSize\n  | [StaticSize]\n  | [StaticSize, StaticSize]\n  | { width: StaticSize; height?: StaticSize };\n\ninterface PageProps extends NodeProps {\n  /**\n   * Enable page wrapping for this page.\n   * @see https://react-pdf.org/components#page-wrapping\n   */\n  wrap?: boolean;\n  size?: PageSize;\n  orientation?: Orientation;\n  dpi?: number;\n}\n\nexport type PageNode = {\n  type: typeof P.Page;\n  props: PageProps;\n  style?: Style | Style[];\n  box?: Box;\n  origin?: Origin;\n  yogaNode?: YogaNode;\n  children?: (\n    | ViewNode\n    | ImageNode\n    | TextNode\n    | LinkNode\n    | CanvasNode\n    | FieldSetNode\n    | TextInputNode\n    | SelectNode\n    | ListNode\n    | CheckboxNode\n    | NoteNode\n  )[];\n};\n\nexport type SafePageNode = Omit<PageNode, 'style' | 'children'> & {\n  style: SafeStyle;\n  children?: (\n    | SafeViewNode\n    | SafeImageNode\n    | SafeTextNode\n    | SafeLinkNode\n    | SafeCanvasNode\n    | SafeFieldSetNode\n    | SafeTextInputNode\n    | SafeSelectNode\n    | SafeListNode\n    | SafeCheckboxNode\n    | SafeNoteNode\n  )[];\n};\n"
  },
  {
    "path": "packages/layout/src/types/path.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\n\nimport {\n  SVGPresentationAttributes,\n  SafeSVGPresentationAttributes,\n} from './base';\n\ninterface PathProps extends SVGPresentationAttributes {\n  style?: SVGPresentationAttributes;\n  d: string;\n}\n\ninterface SafePathProps extends SafeSVGPresentationAttributes {\n  style?: SafeSVGPresentationAttributes;\n  d: string;\n}\n\nexport type PathNode = {\n  type: typeof P.Path;\n  props: PathProps;\n  style?: Style | Style[];\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: never[];\n};\n\nexport type SafePathNode = Omit<PathNode, 'style' | 'props'> & {\n  style: SafeStyle;\n  props: SafePathProps;\n};\n"
  },
  {
    "path": "packages/layout/src/types/polygon.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\n\nimport {\n  SafeSVGPresentationAttributes,\n  SVGPresentationAttributes,\n} from './base';\n\ninterface PolygonProps extends SVGPresentationAttributes {\n  style?: SVGPresentationAttributes;\n  points: string;\n}\n\ninterface SafePolygonProps extends SafeSVGPresentationAttributes {\n  style?: SafeSVGPresentationAttributes;\n  points: string;\n}\n\nexport type PolygonNode = {\n  type: typeof P.Polygon;\n  props: PolygonProps;\n  style?: Style | Style[];\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: never[];\n};\n\nexport type SafePolygonNode = Omit<PolygonNode, 'style' | 'props'> & {\n  style: SafeStyle;\n  props: SafePolygonProps;\n};\n"
  },
  {
    "path": "packages/layout/src/types/polyline.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\n\nimport {\n  SVGPresentationAttributes,\n  SafeSVGPresentationAttributes,\n} from './base';\n\ninterface PolylineProps extends SVGPresentationAttributes {\n  style?: SVGPresentationAttributes;\n  points: string;\n}\n\ninterface SafePolylineProps extends SafeSVGPresentationAttributes {\n  style?: SafeSVGPresentationAttributes;\n  points: string;\n}\n\nexport type PolylineNode = {\n  type: typeof P.Polyline;\n  props: PolylineProps;\n  style?: Style | Style[];\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: never[];\n};\n\nexport type SafePolylineNode = Omit<PolylineNode, 'style' | 'props'> & {\n  style: SafeStyle;\n  props: SafePolylineProps;\n};\n"
  },
  {
    "path": "packages/layout/src/types/radial-gradient.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { Transform } from '@react-pdf/stylesheet';\n\nimport { SafeStopNode, StopNode } from './stop';\n\ninterface RadialGradientProps {\n  id: string;\n  cx?: string | number;\n  cy?: string | number;\n  fr?: string | number;\n  fx?: string | number;\n  fy?: string | number;\n  r?: string | number;\n  xlinkHref?: string;\n  gradientTransform?: string;\n  gradientUnits?: 'userSpaceOnUse' | 'objectBoundingBox';\n}\n\ninterface SafeRadialGradientProps {\n  id: string;\n  cx?: number;\n  cy?: number;\n  fr?: number;\n  fx?: number;\n  fy?: number;\n  r?: number;\n  xlinkHref?: string;\n  gradientTransform?: Transform[];\n  gradientUnits?: 'userSpaceOnUse' | 'objectBoundingBox';\n}\n\nexport type RadialGradientNode = {\n  type: typeof P.RadialGradient;\n  props: RadialGradientProps;\n  style?: never;\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: StopNode[];\n};\n\nexport type SafeRadialGradientNode = Omit<\n  RadialGradientNode,\n  'props' | 'children'\n> & {\n  props: SafeRadialGradientProps;\n  children?: SafeStopNode[];\n};\n"
  },
  {
    "path": "packages/layout/src/types/rect.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\n\nimport {\n  SVGPresentationAttributes,\n  SafeSVGPresentationAttributes,\n} from './base';\n\ninterface RectProps extends SVGPresentationAttributes {\n  style?: SVGPresentationAttributes;\n  x?: string | number;\n  y?: string | number;\n  width: string | number;\n  height: string | number;\n  rx?: string | number;\n  ry?: string | number;\n}\n\ninterface SafeRectProps extends SafeSVGPresentationAttributes {\n  style?: SafeSVGPresentationAttributes;\n  x?: number;\n  y?: number;\n  width: number;\n  height: number;\n  rx?: number;\n  ry?: number;\n}\n\nexport type RectNode = {\n  type: typeof P.Rect;\n  props: RectProps;\n  style?: Style | Style[];\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: never[];\n};\n\nexport type SafeRectNode = Omit<RectNode, 'style' | 'props'> & {\n  style: SafeStyle;\n  props: SafeRectProps;\n};\n"
  },
  {
    "path": "packages/layout/src/types/select.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport { YogaNode } from 'yoga-layout/load';\n\nimport { Box, FormCommonProps, Origin } from './base';\n\ninterface SelectAndListProps extends FormCommonProps {\n  sort?: boolean;\n  edit?: boolean;\n  multiSelect?: boolean;\n  noSpell?: boolean;\n  select?: string[];\n}\n\nexport type SelectNode = {\n  type: typeof P.Select;\n  props: SelectAndListProps;\n  style?: Style | Style[];\n  box?: Box;\n  origin?: Origin;\n  yogaNode?: never;\n  children?: never[];\n};\n\nexport type SafeSelectNode = Omit<SelectNode, 'style'> & {\n  style: SafeStyle;\n};\n\nexport type ListNode = {\n  type: typeof P.List;\n  props: SelectAndListProps;\n  style?: Style | Style[];\n  box?: Box;\n  origin?: Origin;\n  yogaNode?: YogaNode;\n  children?: never[];\n};\n\nexport type SafeListNode = Omit<ListNode, 'style'> & {\n  style: SafeStyle;\n};\n"
  },
  {
    "path": "packages/layout/src/types/stop.ts",
    "content": "import * as P from '@react-pdf/primitives';\n\ninterface StopProps {\n  offset: string | number;\n  stopColor: string;\n  stopOpacity?: string | number;\n}\n\ninterface StopSafeProps {\n  offset: number;\n  stopColor: string;\n  stopOpacity?: number;\n}\n\nexport type StopNode = {\n  type: typeof P.Stop;\n  props: StopProps;\n  style?: never;\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  children?: never[];\n};\n\nexport type SafeStopNode = Omit<StopNode, 'props'> & {\n  props: StopSafeProps;\n};\n"
  },
  {
    "path": "packages/layout/src/types/svg.ts",
    "content": "import { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport * as P from '@react-pdf/primitives';\nimport { YogaNode } from 'yoga-layout/load';\n\nimport {\n  Box,\n  Origin,\n  NodeProps,\n  SVGPresentationAttributes,\n  SafeSVGPresentationAttributes,\n} from './base';\nimport { LineNode, SafeLineNode } from './line';\nimport { PolylineNode, SafePolylineNode } from './polyline';\nimport { PolygonNode, SafePolygonNode } from './polygon';\nimport { PathNode, SafePathNode } from './path';\nimport { RectNode, SafeRectNode } from './rect';\nimport { CircleNode, SafeCircleNode } from './circle';\nimport { EllipseNode, SafeEllipseNode } from './ellipse';\nimport { SafeTspanNode, TspanNode } from './tspan';\nimport { GNode, SafeGNode } from './g';\nimport { DefsNode, SafeDefsNode } from './defs';\nimport { SafeTextNode, TextNode } from './text';\nimport { ImageNode, SafeImageNode } from './image';\n\nexport type Viewbox = {\n  minX: number;\n  minY: number;\n  maxX: number;\n  maxY: number;\n};\n\nexport type PreserveAspectRatio = {\n  align:\n    | 'none'\n    | 'xMinYMin'\n    | 'xMidYMin'\n    | 'xMaxYMin'\n    | 'xMinYMid'\n    | 'xMidYMid'\n    | 'xMaxYMid'\n    | 'xMinYMax'\n    | 'xMidYMax'\n    | 'xMaxYMax';\n  meetOrSlice: 'meet' | 'slice';\n};\n\ninterface SvgProps extends NodeProps, SVGPresentationAttributes {\n  width?: string | number;\n  height?: string | number;\n  viewBox?: string | Viewbox;\n  preserveAspectRatio?: string;\n}\n\ninterface SvgSafeProps extends NodeProps, SafeSVGPresentationAttributes {\n  width?: string | number;\n  height?: string | number;\n  viewBox?: Viewbox;\n  preserveAspectRatio?: PreserveAspectRatio;\n}\n\nexport type SvgNode = {\n  type: typeof P.Svg;\n  props: SvgProps;\n  style?: Style | Style[];\n  box?: Box;\n  origin?: Origin;\n  yogaNode?: YogaNode;\n  children?: (\n    | LineNode\n    | PolylineNode\n    | PolygonNode\n    | PathNode\n    | RectNode\n    | CircleNode\n    | EllipseNode\n    | ImageNode\n    | TextNode\n    | TspanNode\n    | GNode\n    | DefsNode\n  )[];\n};\n\nexport type SafeSvgNode = Omit<SvgNode, 'style' | 'props' | 'children'> & {\n  style: SafeStyle;\n  props: SvgSafeProps;\n  children?: (\n    | SafeLineNode\n    | SafePolylineNode\n    | SafePolygonNode\n    | SafePathNode\n    | SafeRectNode\n    | SafeCircleNode\n    | SafeEllipseNode\n    | SafeImageNode\n    | SafeTextNode\n    | SafeTspanNode\n    | SafeGNode\n    | SafeDefsNode\n  )[];\n};\n"
  },
  {
    "path": "packages/layout/src/types/text-input.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport { YogaNode } from 'yoga-layout/load';\n\nimport { Box, FormCommonProps, Origin } from './base';\n\n// see http://pdfkit.org/docs/forms.html#text_field_formatting\ninterface TextInputFormatting {\n  type:\n    | 'date'\n    | 'time'\n    | 'percent'\n    | 'number'\n    | 'zip'\n    | 'zipPlus4'\n    | 'phone'\n    | 'ssn';\n  param?: string;\n  nDec?: number;\n  sepComma?: boolean;\n  negStyle?: 'MinusBlack' | 'Red' | 'ParensBlack' | 'ParensRed';\n  currency?: string;\n  currencyPrepend?: boolean;\n}\n\n// see http://pdfkit.org/docs/forms.html#text_field_formatting\ninterface TextInputProps extends FormCommonProps {\n  align?: 'left' | 'center' | 'right';\n  multiline?: boolean;\n  /**\n   * The text will be masked (e.g. with asterisks).\n   */\n  password?: boolean;\n  /**\n   * If set, text entered in the field is not spell-checked\n   */\n  noSpell?: boolean;\n  format?: TextInputFormatting;\n  /**\n   * Sets the fontSize (default or 0 means auto sizing)\n   */\n  fontSize?: number;\n  /**\n   * Sets the maximum length (characters) of the text in the field\n   */\n  maxLength?: number;\n}\n\nexport type TextInputNode = {\n  type: typeof P.TextInput;\n  props: TextInputProps;\n  style?: Style | Style[];\n  box?: Box;\n  origin?: Origin;\n  yogaNode?: YogaNode;\n  children?: never[];\n};\n\nexport type SafeTextInputNode = Omit<TextInputNode, 'style'> & {\n  style: SafeStyle;\n};\n"
  },
  {
    "path": "packages/layout/src/types/text-instance.ts",
    "content": "import * as P from '@react-pdf/primitives';\n\nexport type TextInstanceNode = {\n  type: typeof P.TextInstance;\n  props?: never;\n  style?: never;\n  box?: never;\n  origin?: never;\n  children?: never[];\n  yogaNode?: never;\n  value: string;\n};\n\nexport type SafeTextInstanceNode = TextInstanceNode;\n"
  },
  {
    "path": "packages/layout/src/types/text.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport { HyphenationCallback } from '@react-pdf/font';\nimport { YogaNode } from 'yoga-layout/load';\nimport { Paragraph } from '@react-pdf/textkit';\n\nimport { Box, NodeProps, Origin, RenderProp } from './base';\nimport { SafeTextInstanceNode, TextInstanceNode } from './text-instance';\nimport { ImageNode, SafeImageNode } from './image';\nimport { SafeTspanNode, TspanNode } from './tspan';\n\ninterface TextProps extends NodeProps {\n  /**\n   * Enable/disable page wrapping for element.\n   * @see https://react-pdf.org/components#page-wrapping\n   */\n  wrap?: boolean;\n  render?: RenderProp;\n  /**\n   * Override the default hyphenation-callback\n   * @see https://react-pdf.org/fonts#registerhyphenationcallback\n   */\n  hyphenationCallback?: HyphenationCallback;\n  /**\n   * Specifies the minimum number of lines in a text element that must be shown at the bottom of a page or its container.\n   * @see https://react-pdf.org/advanced#orphan-&-widow-protection\n   */\n  orphans?: number;\n  /**\n   * Specifies the minimum number of lines in a text element that must be shown at the top of a page or its container..\n   * @see https://react-pdf.org/advanced#orphan-&-widow-protection\n   */\n  widows?: number;\n  // Svg props\n  x?: number;\n  y?: number;\n}\n\nexport type TextNode = {\n  type: typeof P.Text;\n  props: TextProps;\n  style?: Style | Style[];\n  box?: Box;\n  origin?: Origin;\n  yogaNode?: YogaNode;\n  lines?: Paragraph;\n  alignOffset?: number; // TODO: Remove this\n  children?: (TextNode | TextInstanceNode | ImageNode | TspanNode)[];\n};\n\nexport type SafeTextNode = Omit<TextNode, 'style' | 'children'> & {\n  style: SafeStyle;\n  children?: (\n    | SafeTextNode\n    | SafeTextInstanceNode\n    | SafeImageNode\n    | SafeTspanNode\n  )[];\n};\n"
  },
  {
    "path": "packages/layout/src/types/tspan.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport { Paragraph } from '@react-pdf/textkit';\n\nimport {\n  SVGPresentationAttributes,\n  SafeSVGPresentationAttributes,\n} from './base';\nimport { SafeTextInstanceNode, TextInstanceNode } from './text-instance';\n\ninterface TspanProps extends SVGPresentationAttributes {\n  x?: string | number;\n  y?: string | number;\n}\n\ninterface SafeTspanProps extends SafeSVGPresentationAttributes {\n  x?: number;\n  y?: number;\n}\n\nexport type TspanNode = {\n  type: typeof P.Tspan;\n  props: TspanProps;\n  style?: Style | Style[];\n  box?: never;\n  origin?: never;\n  yogaNode?: never;\n  lines?: Paragraph;\n  children?: TextInstanceNode[];\n};\n\nexport type SafeTspanNode = Omit<TspanNode, 'style' | 'props' | 'children'> & {\n  style: SafeStyle;\n  props: SafeTspanProps;\n  children?: SafeTextInstanceNode[];\n};\n"
  },
  {
    "path": "packages/layout/src/types/view.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeStyle, Style } from '@react-pdf/stylesheet';\nimport { YogaNode } from 'yoga-layout/load';\n\nimport { Box, NodeProps, Origin, RenderProp } from './base';\nimport { ImageNode, SafeImageNode } from './image';\nimport { SafeTextNode, TextNode } from './text';\nimport { LinkNode, SafeLinkNode } from './link';\nimport { CanvasNode, SafeCanvasNode } from './canvas';\nimport { FieldSetNode, SafeFieldSetNode } from './field-set';\nimport { SafeTextInputNode, TextInputNode } from './text-input';\nimport { ListNode, SafeListNode, SafeSelectNode, SelectNode } from './select';\nimport { CheckboxNode } from './checkbox';\nimport { NoteNode, SafeNoteNode } from './note';\n\ninterface ViewProps extends NodeProps {\n  id?: string;\n  /**\n   * Enable/disable page wrapping for element.\n   * @see https://react-pdf.org/components#page-wrapping\n   */\n  wrap?: boolean;\n  render?: RenderProp;\n}\n\nexport type ViewNode = {\n  type: typeof P.View;\n  props: ViewProps;\n  style?: Style | Style[];\n  box?: Box;\n  origin?: Origin;\n  yogaNode?: YogaNode;\n  children?: (\n    | ViewNode\n    | ImageNode\n    | TextNode\n    | LinkNode\n    | CanvasNode\n    | FieldSetNode\n    | TextInputNode\n    | SelectNode\n    | ListNode\n    | CheckboxNode\n    | NoteNode\n  )[];\n};\n\nexport type SafeViewNode = Omit<ViewNode, 'style' | 'children'> & {\n  style: SafeStyle;\n  children?: (\n    | SafeViewNode\n    | SafeImageNode\n    | SafeTextNode\n    | SafeLinkNode\n    | SafeCanvasNode\n    | SafeFieldSetNode\n    | SafeTextInputNode\n    | SafeSelectNode\n    | SafeListNode\n    | SafeCanvasNode\n    | SafeNoteNode\n  )[];\n};\n"
  },
  {
    "path": "packages/layout/src/yoga/index.ts",
    "content": "import { type Yoga, loadYoga as yogaLoadYoga } from 'yoga-layout/load';\n\nlet instancePromise: Promise<Yoga>;\n\nexport const loadYoga = async () => {\n  // Yoga WASM binaries must be asynchronously compiled and loaded\n  // to prevent Event emitter memory leak warnings, Yoga must be loaded only once\n  const instance = await (instancePromise ??= yogaLoadYoga());\n\n  const config = instance.Config.create();\n\n  config.setPointScaleFactor(0);\n\n  const node = { create: () => instance.Node.createWithConfig(config) };\n\n  return { node };\n};\n"
  },
  {
    "path": "packages/layout/tests/image/getSource.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport getSource from '../../src/image/getSource';\n\nconst VALUE = 'gotcha';\n\ndescribe('image getSource', () => {\n  test('Should get src', () => {\n    expect(\n      getSource({ type: 'IMAGE', style: {}, props: { src: VALUE } }),\n    ).toEqual(VALUE);\n  });\n\n  test('Should get source', () => {\n    expect(\n      getSource({ type: 'IMAGE', style: {}, props: { source: VALUE } }),\n    ).toEqual(VALUE);\n  });\n\n  test('Should get undefined if either present', () => {\n    expect(getSource({ type: 'IMAGE', style: {}, props: {} as any })).toEqual(\n      undefined,\n    );\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/image/resolveSource.test.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport resolveSource from '../../src/image/resolveSource';\n\nconst SOURCE_URL = 'gotcha';\nconst SOURCE_URL_OBJECT = { uri: 'gotcha', method: 'GET' };\nconst SOURCE_BUFFER = Buffer.from('gotcha');\nconst SOURCE_DATA_BUFFER = { data: Buffer.from('gotcha'), format: 'png' };\nconst SOURCE_BLOB = new Blob([SOURCE_BUFFER], { type: 'image/png' });\n\ndescribe('image resolveSource', () => {\n  describe('source', () => {\n    it('resolves url', async () => {\n      await expect(resolveSource(SOURCE_URL)).resolves.toEqual({\n        uri: SOURCE_URL,\n      });\n    });\n\n    it('resolves url object', async () => {\n      await expect(resolveSource(SOURCE_URL_OBJECT)).resolves.toBe(\n        SOURCE_URL_OBJECT,\n      );\n    });\n\n    it('resolves buffer', async () => {\n      await expect(resolveSource(SOURCE_BUFFER)).resolves.toBe(SOURCE_BUFFER);\n    });\n\n    it('resolves data buffer', async () => {\n      await expect(resolveSource(SOURCE_DATA_BUFFER)).resolves.toBe(\n        SOURCE_DATA_BUFFER,\n      );\n    });\n\n    it('resolves blob', async () => {\n      await expect(resolveSource(SOURCE_BLOB)).resolves.toBe(SOURCE_BLOB);\n    });\n  });\n\n  describe('async', () => {\n    it('resolves url', async () => {\n      await expect(resolveSource(Promise.resolve(SOURCE_URL))).resolves.toEqual(\n        {\n          uri: SOURCE_URL,\n        },\n      );\n    });\n\n    it('resolves url object', async () => {\n      await expect(\n        resolveSource(Promise.resolve(SOURCE_URL_OBJECT)),\n      ).resolves.toBe(SOURCE_URL_OBJECT);\n    });\n\n    it('resolves buffer', async () => {\n      await expect(resolveSource(Promise.resolve(SOURCE_BUFFER))).resolves.toBe(\n        SOURCE_BUFFER,\n      );\n    });\n\n    it('resolves data buffer', async () => {\n      await expect(\n        resolveSource(Promise.resolve(SOURCE_DATA_BUFFER)),\n      ).resolves.toBe(SOURCE_DATA_BUFFER);\n    });\n\n    it('resolves blob', async () => {\n      await expect(resolveSource(Promise.resolve(SOURCE_BLOB))).resolves.toBe(\n        SOURCE_BLOB,\n      );\n    });\n  });\n\n  describe('factory', () => {\n    it('resolves url', async () => {\n      await expect(resolveSource(() => SOURCE_URL)).resolves.toEqual({\n        uri: SOURCE_URL,\n      });\n    });\n\n    it('resolves url object', async () => {\n      await expect(resolveSource(() => SOURCE_URL_OBJECT)).resolves.toBe(\n        SOURCE_URL_OBJECT,\n      );\n    });\n\n    it('resolves buffer', async () => {\n      await expect(resolveSource(() => SOURCE_BUFFER)).resolves.toBe(\n        SOURCE_BUFFER,\n      );\n    });\n\n    it('resolves data buffer', async () => {\n      await expect(resolveSource(() => SOURCE_DATA_BUFFER)).resolves.toBe(\n        SOURCE_DATA_BUFFER,\n      );\n    });\n\n    it('resolves undefined', async () => {\n      await expect(resolveSource(() => undefined)).resolves.toBe(undefined);\n    });\n\n    it('resolves blob', async () => {\n      await expect(resolveSource(() => SOURCE_BLOB)).resolves.toBe(SOURCE_BLOB);\n    });\n  });\n\n  describe('async factory', () => {\n    it('resolves url', async () => {\n      await expect(resolveSource(async () => SOURCE_URL)).resolves.toEqual({\n        uri: SOURCE_URL,\n      });\n    });\n\n    it('resolves url object', async () => {\n      await expect(resolveSource(async () => SOURCE_URL_OBJECT)).resolves.toBe(\n        SOURCE_URL_OBJECT,\n      );\n    });\n\n    it('resolves buffer', async () => {\n      await expect(resolveSource(async () => SOURCE_BUFFER)).resolves.toBe(\n        SOURCE_BUFFER,\n      );\n    });\n\n    it('resolves data buffer', async () => {\n      await expect(resolveSource(async () => SOURCE_DATA_BUFFER)).resolves.toBe(\n        SOURCE_DATA_BUFFER,\n      );\n    });\n\n    it('resolves undefined', async () => {\n      await expect(resolveSource(async () => undefined)).resolves.toBe(\n        undefined,\n      );\n    });\n\n    it('resolves blob', async () => {\n      await expect(resolveSource(async () => SOURCE_BLOB)).resolves.toBe(\n        SOURCE_BLOB,\n      );\n    });\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/getBorderWidth.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport getBorderWidth from '../../src/node/getBorderWidth';\n\nconst getComputedBorder = (value) => {\n  if (value === Yoga.Edge.Top) return 1;\n  if (value === Yoga.Edge.Right) return 2;\n  if (value === Yoga.Edge.Bottom) return 3;\n  return 4;\n};\n\ndescribe('node getBorderWidth', () => {\n  test('Should return 0 by default if no yoga node available', () => {\n    const result = getBorderWidth({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n    });\n\n    expect(result).toHaveProperty('borderTopWidth', 0);\n    expect(result).toHaveProperty('borderRightWidth', 0);\n    expect(result).toHaveProperty('borderBottomWidth', 0);\n    expect(result).toHaveProperty('borderLeftWidth', 0);\n  });\n\n  test('Should return yoga values if node available', () => {\n    const yogaNode = { getComputedBorder };\n    const result = getBorderWidth({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      yogaNode,\n    });\n\n    expect(result).toHaveProperty('borderTopWidth', 1);\n    expect(result).toHaveProperty('borderRightWidth', 2);\n    expect(result).toHaveProperty('borderBottomWidth', 3);\n    expect(result).toHaveProperty('borderLeftWidth', 4);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/getDimension.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport getDimension from '../../src/node/getDimension';\n\nconst getComputedWidth = () => 10;\nconst getComputedHeight = () => 20;\n\ndescribe('node getDimension', () => {\n  test('Should return 0 by default if no yoga node available', () => {\n    const result = getDimension({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n    });\n\n    expect(result).toHaveProperty('width', 0);\n    expect(result).toHaveProperty('height', 0);\n  });\n\n  test('Should return yoga values if node available', () => {\n    const yogaNode = { getComputedWidth, getComputedHeight };\n    const result = getDimension({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      yogaNode,\n    });\n\n    expect(result).toHaveProperty('width', 10);\n    expect(result).toHaveProperty('height', 20);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/getMargin.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport getMargin from '../../src/node/getMargin';\n\nconst getComputedMargin = (value) => {\n  if (value === Yoga.Edge.Top) return 1;\n  if (value === Yoga.Edge.Right) return 2;\n  if (value === Yoga.Edge.Bottom) return 3;\n  return 4;\n};\n\ndescribe('node getMargin', () => {\n  test('Should return 0 by default if no yoga node available', () => {\n    const result = getMargin({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n    });\n\n    expect(result).toHaveProperty('marginTop', 0);\n    expect(result).toHaveProperty('marginRight', 0);\n    expect(result).toHaveProperty('marginBottom', 0);\n    expect(result).toHaveProperty('marginLeft', 0);\n  });\n\n  test('Should return yoga values if node available', () => {\n    const yogaNode = { getComputedMargin };\n    const result = getMargin({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      yogaNode,\n    });\n\n    expect(result).toHaveProperty('marginTop', 1);\n    expect(result).toHaveProperty('marginRight', 2);\n    expect(result).toHaveProperty('marginBottom', 3);\n    expect(result).toHaveProperty('marginLeft', 4);\n  });\n\n  test('Should return box specific values if available', () => {\n    const result = getMargin({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      box: {\n        top: 0,\n        right: 0,\n        bottom: 0,\n        left: 0,\n        width: 100,\n        height: 200,\n        marginTop: 1,\n        marginRight: 2,\n        marginBottom: 3,\n        marginLeft: 4,\n      },\n      children: [],\n    });\n\n    expect(result).toHaveProperty('marginTop', 1);\n    expect(result).toHaveProperty('marginRight', 2);\n    expect(result).toHaveProperty('marginBottom', 3);\n    expect(result).toHaveProperty('marginLeft', 4);\n  });\n\n  test('Should return style specific values if available', () => {\n    const result = getMargin({\n      type: 'VIEW',\n      props: {},\n      style: {\n        marginTop: 1,\n        marginRight: 2,\n        marginBottom: 3,\n        marginLeft: 4,\n      },\n      children: [],\n    });\n\n    expect(result).toHaveProperty('marginTop', 1);\n    expect(result).toHaveProperty('marginRight', 2);\n    expect(result).toHaveProperty('marginBottom', 3);\n    expect(result).toHaveProperty('marginLeft', 4);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/getOrigin.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport getOrigin from '../../src/node/getOrigin';\n\ndescribe('node getOrigin', () => {\n  test('Should return null for node without box', () => {\n    const result = getOrigin({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n    });\n\n    expect(result).toEqual(null);\n  });\n\n  test('Should return centered origin by default', () => {\n    const result = getOrigin({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 50, left: 100, bottom: 0, right: 0, width: 300, height: 400 },\n    });\n\n    expect(result).toHaveProperty('left', 250);\n    expect(result).toHaveProperty('left', 250);\n  });\n\n  test('Should return origin adjusted by fixed values', () => {\n    const result = getOrigin({\n      type: 'VIEW',\n      props: {},\n      children: [],\n      style: { transformOriginX: 100, transformOriginY: 50 },\n      box: { top: 50, left: 100, bottom: 0, right: 0, width: 300, height: 400 },\n    });\n\n    expect(result).toHaveProperty('left', 200);\n    expect(result).toHaveProperty('top', 100);\n  });\n\n  test('Should return origin adjusted by percent values', () => {\n    const result = getOrigin({\n      type: 'VIEW',\n      props: {},\n      children: [],\n      style: { transformOriginX: '20%', transformOriginY: '70%' },\n      box: { top: 50, left: 100, bottom: 0, right: 0, width: 300, height: 400 },\n    });\n\n    expect(result).toHaveProperty('left', 160);\n    expect(result).toHaveProperty('top', 330);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/getPadding.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport getPadding from '../../src/node/getPadding';\n\nconst getComputedPadding = (value) => {\n  if (value === Yoga.Edge.Top) return 1;\n  if (value === Yoga.Edge.Right) return 2;\n  if (value === Yoga.Edge.Bottom) return 3;\n  return 4;\n};\n\ndescribe('node getPadding', () => {\n  test('Should return 0 by default if no yoga node available', () => {\n    const result = getPadding({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n    });\n\n    expect(result).toHaveProperty('paddingTop', 0);\n    expect(result).toHaveProperty('paddingRight', 0);\n    expect(result).toHaveProperty('paddingBottom', 0);\n    expect(result).toHaveProperty('paddingLeft', 0);\n  });\n\n  test('Should return yoga values if node available', () => {\n    const yogaNode = { getComputedPadding };\n    const result = getPadding({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      yogaNode,\n    });\n\n    expect(result).toHaveProperty('paddingTop', 1);\n    expect(result).toHaveProperty('paddingRight', 2);\n    expect(result).toHaveProperty('paddingBottom', 3);\n    expect(result).toHaveProperty('paddingLeft', 4);\n  });\n\n  test('Should return box specific values if available', () => {\n    const result = getPadding({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: {\n        top: 0,\n        right: 0,\n        bottom: 0,\n        left: 0,\n        width: 100,\n        height: 100,\n        paddingTop: 1,\n        paddingRight: 2,\n        paddingBottom: 3,\n        paddingLeft: 4,\n      },\n    });\n\n    expect(result).toHaveProperty('paddingTop', 1);\n    expect(result).toHaveProperty('paddingRight', 2);\n    expect(result).toHaveProperty('paddingBottom', 3);\n    expect(result).toHaveProperty('paddingLeft', 4);\n  });\n\n  test('Should return style specific values if available', () => {\n    const result = getPadding({\n      type: 'VIEW',\n      props: {},\n      children: [],\n      style: {\n        paddingTop: 1,\n        paddingRight: 2,\n        paddingBottom: 3,\n        paddingLeft: 4,\n      },\n    });\n\n    expect(result).toHaveProperty('paddingTop', 1);\n    expect(result).toHaveProperty('paddingRight', 2);\n    expect(result).toHaveProperty('paddingBottom', 3);\n    expect(result).toHaveProperty('paddingLeft', 4);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/getPosition.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport getPosition from '../../src/node/getPosition';\n\nconst getComputedTop = () => 10;\nconst getComputedRight = () => 20;\nconst getComputedBottom = () => 30;\nconst getComputedLeft = () => 40;\n\ndescribe('node getPosition', () => {\n  test('Should return 0 by default if no yoga node available', () => {\n    const result = getPosition({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n    });\n\n    expect(result).toHaveProperty('top', 0);\n    expect(result).toHaveProperty('right', 0);\n    expect(result).toHaveProperty('bottom', 0);\n    expect(result).toHaveProperty('left', 0);\n  });\n\n  test('Should return yoga values if node available', () => {\n    const yogaNode = {\n      getComputedTop,\n      getComputedRight,\n      getComputedBottom,\n      getComputedLeft,\n    };\n    const result = getPosition({\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      yogaNode,\n    });\n\n    expect(result).toHaveProperty('top', 10);\n    expect(result).toHaveProperty('right', 20);\n    expect(result).toHaveProperty('bottom', 30);\n    expect(result).toHaveProperty('left', 40);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/removePaddings.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport removePaddings from '../../src/node/removePaddings';\n\ndescribe('node removePaddings', () => {\n  test('Should keep other styles untouched', () => {\n    const result = removePaddings({\n      type: 'VIEW',\n      props: {},\n      children: [],\n      style: { color: 'red' },\n    });\n    expect(result.style).toHaveProperty('color', 'red');\n  });\n\n  test('Should remove paddingTop', () => {\n    const result = removePaddings({\n      type: 'VIEW',\n      props: {},\n      children: [],\n      style: { paddingTop: 10 },\n    });\n    expect(result.style).not.toHaveProperty('paddingTop');\n  });\n\n  test('Should remove paddingRight', () => {\n    const result = removePaddings({\n      type: 'VIEW',\n      props: {},\n      children: [],\n      style: { paddingRight: 10 },\n    });\n    expect(result.style).not.toHaveProperty('paddingRight');\n  });\n\n  test('Should remove paddingBottom', () => {\n    const result = removePaddings({\n      type: 'VIEW',\n      props: {},\n      children: [],\n      style: { paddingBottom: 10 },\n    });\n    expect(result.style).not.toHaveProperty('paddingBottom');\n  });\n\n  test('Should remove paddingLeft', () => {\n    const result = removePaddings({\n      type: 'VIEW',\n      props: {},\n      children: [],\n      style: { paddingLeft: 10 },\n    });\n    expect(result.style).not.toHaveProperty('paddingLeft');\n  });\n\n  test('Should remove padding shorthand', () => {\n    const result = removePaddings({\n      type: 'VIEW',\n      props: {},\n      children: [],\n      style: { padding: 10 } as any,\n    });\n    expect(result.style).not.toHaveProperty('padding');\n  });\n\n  test('Should remove paddingHorizontal shorthand', () => {\n    const result = removePaddings({\n      type: 'VIEW',\n      props: {},\n      children: [],\n      style: { paddingHorizontal: 10 } as any,\n    });\n    expect(result.style).not.toHaveProperty('paddingHorizontal');\n  });\n\n  test('Should remove paddingVertical shorthand', () => {\n    const result = removePaddings({\n      type: 'VIEW',\n      props: {},\n      children: [],\n      style: { paddingVertical: 10 } as any,\n    });\n    expect(result.style).not.toHaveProperty('paddingVertical');\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setAlignContent.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setAlignContent from '../../src/node/setAlignContent';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setAlignContent', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setAlignContent: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n    } as SafeNode;\n    const result = setAlignContent(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should set align auto by default', () => {\n    const result = setAlignContent(null)(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.Auto);\n    expect(result).toBe(node);\n  });\n\n  test('Should set flex-start', () => {\n    const result = setAlignContent('flex-start')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.FlexStart);\n    expect(result).toBe(node);\n  });\n\n  test('Should set center', () => {\n    const result = setAlignContent('center')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.Center);\n    expect(result).toBe(node);\n  });\n\n  test('Should set flex-end', () => {\n    const result = setAlignContent('flex-end')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.FlexEnd);\n    expect(result).toBe(node);\n  });\n\n  test('Should set stretch', () => {\n    const result = setAlignContent('stretch')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.Stretch);\n    expect(result).toBe(node);\n  });\n\n  test('Should set baseline', () => {\n    const result = setAlignContent('baseline')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.Baseline);\n    expect(result).toBe(node);\n  });\n\n  test('Should set space-between', () => {\n    const result = setAlignContent('space-between')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.SpaceBetween);\n    expect(result).toBe(node);\n  });\n\n  test('Should set space-around', () => {\n    const result = setAlignContent('space-around')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.SpaceAround);\n    expect(result).toBe(node);\n  });\n\n  test('Should set space-evenly', () => {\n    const result = setAlignContent('space-evenly')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.SpaceEvenly);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setAlignItems.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setAlignItems from '../../src/node/setAlignItems';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setAlignItems', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setAlignItems: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, left: 0, bottom: 0, width: 10, height: 20 },\n    } as SafeNode;\n    const result = setAlignItems(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should set align auto by stretch', () => {\n    const result = setAlignItems(null)(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.Stretch);\n    expect(result).toBe(node);\n  });\n\n  test('Should set flex-start', () => {\n    const result = setAlignItems('flex-start')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.FlexStart);\n    expect(result).toBe(node);\n  });\n\n  test('Should set center', () => {\n    const result = setAlignItems('center')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.Center);\n    expect(result).toBe(node);\n  });\n\n  test('Should set flex-end', () => {\n    const result = setAlignItems('flex-end')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.FlexEnd);\n    expect(result).toBe(node);\n  });\n\n  test('Should set stretch', () => {\n    const result = setAlignItems('stretch')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.Stretch);\n    expect(result).toBe(node);\n  });\n\n  test('Should set baseline', () => {\n    const result = setAlignItems('baseline')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.Baseline);\n    expect(result).toBe(node);\n  });\n\n  test('Should set space-between', () => {\n    const result = setAlignItems('space-between')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.SpaceBetween);\n    expect(result).toBe(node);\n  });\n\n  test('Should set space-around', () => {\n    const result = setAlignItems('space-around')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.SpaceAround);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setAlignSelf.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setAlignSelf from '../../src/node/setAlignSelf';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setAlignSelf', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setAlignSelf: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, left: 0, bottom: 0, width: 10, height: 20 },\n    } as SafeNode;\n    const result = setAlignSelf(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should set align auto by default', () => {\n    const result = setAlignSelf(null)(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.Auto);\n    expect(result).toBe(node);\n  });\n\n  test('Should set flex-start', () => {\n    const result = setAlignSelf('flex-start')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.FlexStart);\n    expect(result).toBe(node);\n  });\n\n  test('Should set center', () => {\n    const result = setAlignSelf('center')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.Center);\n    expect(result).toBe(node);\n  });\n\n  test('Should set flex-end', () => {\n    const result = setAlignSelf('flex-end')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.FlexEnd);\n    expect(result).toBe(node);\n  });\n\n  test('Should set stretch', () => {\n    const result = setAlignSelf('stretch')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.Stretch);\n    expect(result).toBe(node);\n  });\n\n  test('Should set baseline', () => {\n    const result = setAlignSelf('baseline')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.Baseline);\n    expect(result).toBe(node);\n  });\n\n  test('Should set space-between', () => {\n    const result = setAlignSelf('space-between')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.SpaceBetween);\n    expect(result).toBe(node);\n  });\n\n  test('Should set space-around', () => {\n    const result = setAlignSelf('space-around')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Align.SpaceAround);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setAspectRatio.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\nimport setAspectRatio from '../../src/node/setAspectRatio';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setAspectRatio', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setAspectRatio: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, left: 0, bottom: 0, width: 10, height: 20 },\n    } as SafeNode;\n    const result = setAspectRatio(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should call yoga node setter if provided', () => {\n    const result = setAspectRatio(3)(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(3);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setBorderWidth.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setBorder, {\n  setBorderTop,\n  setBorderRight,\n  setBorderBottom,\n  setBorderLeft,\n} from '../../src/node/setBorderWidth';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setBorderWidth', () => {\n  const mock = vi.fn();\n\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setBorder: mock },\n  } as SafeNode;\n\n  const emptyNode = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    box: { top: 0, right: 0, left: 0, bottom: 0, width: 10, height: 20 },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  describe('setBorderTop', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setBorderTop(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setBorderTop(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Top);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should throw error for percent values', () => {\n      expect(() => setBorderTop('50%')(node)).toThrow();\n    });\n  });\n\n  describe('setBorderRight', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setBorderRight(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setBorderRight(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Right);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should throw error for percent values', () => {\n      expect(() => setBorderRight('50%')(node)).toThrow();\n    });\n  });\n\n  describe('setBorderBottom', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setBorderBottom(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setBorderBottom(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Bottom);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should throw error for percent values', () => {\n      expect(() => setBorderBottom('50%')(node)).toThrow();\n    });\n  });\n\n  describe('setBorderLeft', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setBorderLeft(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setBorderLeft(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Left);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should throw error for percent values', () => {\n      expect(() => setBorderLeft('50%')(node)).toThrow();\n    });\n  });\n\n  describe('setBorder', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setBorder(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setBorder(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(4);\n      expect(mock.mock.calls[0]).toEqual([Yoga.Edge.Top, 50]);\n      expect(mock.mock.calls[1]).toEqual([Yoga.Edge.Right, 50]);\n      expect(mock.mock.calls[2]).toEqual([Yoga.Edge.Bottom, 50]);\n      expect(mock.mock.calls[3]).toEqual([Yoga.Edge.Left, 50]);\n      expect(result).toBe(node);\n    });\n\n    test('Should throw error for percent values', () => {\n      expect(() => setBorder('50%' as any)(node)).toThrow();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setDimension.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\nimport {\n  setWidth,\n  setMinWidth,\n  setMaxWidth,\n  setHeight,\n  setMinHeight,\n  setMaxHeight,\n} from '../../src/node/setDimension';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setDimension', () => {\n  const mockSetWidth = vi.fn();\n  const mockSetWidthPercent = vi.fn();\n  const mockSetMinWidth = vi.fn();\n  const mockSetMaxWidth = vi.fn();\n  const mockSetHeight = vi.fn();\n  const mockSetHeightPercent = vi.fn();\n  const mockSetMinHeight = vi.fn();\n  const mockSetMaxHeight = vi.fn();\n\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: {\n      setWidth: mockSetWidth,\n      setWidthPercent: mockSetWidthPercent,\n      setMinWidth: mockSetMinWidth,\n      setMaxWidth: mockSetMaxWidth,\n      setHeight: mockSetHeight,\n      setHeightPercent: mockSetHeightPercent,\n      setMinHeight: mockSetMinHeight,\n      setMaxHeight: mockSetMaxHeight,\n    },\n  } as SafeNode;\n\n  const emptyNode = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mockSetWidth.mockReset();\n    mockSetWidthPercent.mockReset();\n    mockSetMinWidth.mockReset();\n    mockSetMaxWidth.mockReset();\n    mockSetHeight.mockReset();\n    mockSetHeightPercent.mockReset();\n    mockSetMinHeight.mockReset();\n    mockSetMaxHeight.mockReset();\n  });\n\n  describe('setWidth', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setWidth(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setWidth(50)(node);\n\n      expect(mockSetWidth.mock.calls).toHaveLength(1);\n      expect(mockSetWidthPercent.mock.calls).toHaveLength(0);\n      expect(mockSetWidth.mock.calls[0][0]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setWidth('50%')(node);\n\n      expect(mockSetWidth.mock.calls).toHaveLength(0);\n      expect(mockSetWidthPercent.mock.calls).toHaveLength(1);\n      expect(mockSetWidthPercent.mock.calls[0][0]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setMinWidth', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setMinWidth(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setMinWidth(50)(node);\n\n      expect(mockSetMaxWidth.mock.calls).toHaveLength(0);\n      expect(mockSetMinWidth.mock.calls).toHaveLength(1);\n      expect(mockSetMinWidth.mock.calls[0][0]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should throw error for percent values', () => {\n      expect(() => setMinWidth('50%')(node)).toThrow();\n    });\n  });\n\n  describe('setMaxWidth', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setMaxWidth(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setMaxWidth(50)(node);\n\n      expect(mockSetMinWidth.mock.calls).toHaveLength(0);\n      expect(mockSetMaxWidth.mock.calls).toHaveLength(1);\n      expect(mockSetMaxWidth.mock.calls[0][0]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should throw error for percent values', () => {\n      expect(() => setMaxWidth('50%')(node)).toThrow();\n    });\n  });\n\n  describe('setHeight', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setHeight(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setHeight(50)(node);\n\n      expect(mockSetHeight.mock.calls).toHaveLength(1);\n      expect(mockSetHeightPercent.mock.calls).toHaveLength(0);\n      expect(mockSetHeight.mock.calls[0][0]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setHeight('50%')(node);\n\n      expect(mockSetHeight.mock.calls).toHaveLength(0);\n      expect(mockSetHeightPercent.mock.calls).toHaveLength(1);\n      expect(mockSetHeightPercent.mock.calls[0][0]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setMinHeight', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setMinWidth(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setMinHeight(50)(node);\n\n      expect(mockSetMaxHeight.mock.calls).toHaveLength(0);\n      expect(mockSetMinHeight.mock.calls).toHaveLength(1);\n      expect(mockSetMinHeight.mock.calls[0][0]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should throw error for percent values', () => {\n      expect(() => setMinHeight('50%')(node)).toThrow();\n    });\n  });\n\n  describe('setMaxHeight', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setMaxHeight(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setMaxHeight(50)(node);\n\n      expect(mockSetMinHeight.mock.calls).toHaveLength(0);\n      expect(mockSetMaxHeight.mock.calls).toHaveLength(1);\n      expect(mockSetMaxHeight.mock.calls[0][0]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should throw error for percent values', () => {\n      expect(() => setMaxHeight('50%')(node)).toThrow();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setDisplay.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setDisplay from '../../src/node/setDisplay';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setDisplay', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setDisplay: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n    } as SafeNode;\n\n    const result = setDisplay(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should set flex by default', () => {\n    const result = setDisplay(null)(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Display.Flex);\n    expect(result).toBe(node);\n  });\n\n  test('Should set flex', () => {\n    const result = setDisplay('flex')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Display.Flex);\n    expect(result).toBe(node);\n  });\n\n  test('Should set none', () => {\n    const result = setDisplay('none')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Display.None);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setFlexBasis.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\nimport setFlexBasis from '../../src/node/setFlexBasis';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setFlexBasis', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setFlexBasis: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n    } as SafeNode;\n\n    const result = setFlexBasis(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should set provided value', () => {\n    const result = setFlexBasis(2)(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(2);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setFlexDirection.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setFlexDirection from '../../src/node/setFlexDirection';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setFlexDirection', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setFlexDirection: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n    } as SafeNode;\n\n    const result = setFlexDirection(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should set column by default', () => {\n    const result = setFlexDirection(null)(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.FlexDirection.Column);\n    expect(result).toBe(node);\n  });\n\n  test('Should set column', () => {\n    const result = setFlexDirection('column')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.FlexDirection.Column);\n    expect(result).toBe(node);\n  });\n\n  test('Should set row', () => {\n    const result = setFlexDirection('row')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.FlexDirection.Row);\n    expect(result).toBe(node);\n  });\n\n  test('Should set row-reverse', () => {\n    const result = setFlexDirection('row-reverse')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.FlexDirection.RowReverse);\n    expect(result).toBe(node);\n  });\n\n  test('Should set column-reverse', () => {\n    const result = setFlexDirection('column-reverse')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.FlexDirection.ColumnReverse);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setFlexGrow.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\nimport setFlexGrow from '../../src/node/setFlexGrow';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setFlexGrow', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setFlexGrow: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n    } as SafeNode;\n\n    const result = setFlexGrow(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should set zero by default', () => {\n    const result = setFlexGrow(null)(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(0);\n    expect(result).toBe(node);\n  });\n\n  test('Should set provided value', () => {\n    const result = setFlexGrow(2)(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(2);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setFlexShrink.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\nimport setFlexShrink from '../../src/node/setFlexShrink';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setFlexShrink', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setFlexShrink: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n    } as SafeNode;\n\n    const result = setFlexShrink(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should set one by default', () => {\n    const result = setFlexShrink(null)(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(1);\n    expect(result).toBe(node);\n  });\n\n  test('Should set provided value', () => {\n    const result = setFlexShrink(2)(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(2);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setFlexWrap.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setFlexWrap from '../../src/node/setFlexWrap';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setFlexWrap', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setFlexWrap: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n    } as SafeNode;\n\n    const result = setFlexWrap(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should set no-wrap by default', () => {\n    const result = setFlexWrap(null)(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Wrap.NoWrap);\n    expect(result).toBe(node);\n  });\n\n  test('Should set no-wrap', () => {\n    const result = setFlexWrap('no-wrap')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Wrap.NoWrap);\n    expect(result).toBe(node);\n  });\n\n  test('Should set wrap', () => {\n    const result = setFlexWrap('wrap')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Wrap.Wrap);\n    expect(result).toBe(node);\n  });\n\n  test('Should set wrap-reverse', () => {\n    const result = setFlexWrap('wrap-reverse')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Wrap.WrapReverse);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setGap.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport { setRowGap, setColumnGap } from '../../src/node/setGap';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setGap', () => {\n  const mock = vi.fn();\n  const mockPercent = vi.fn();\n\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: {\n      setGap: mock,\n      setGapPercent: mockPercent,\n    },\n  } as SafeNode;\n\n  const emptyNode = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n    mockPercent.mockReset();\n  });\n\n  describe('setRowGap', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setRowGap(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('should call appropiate yoga node method for numeric values', () => {\n      const result = setRowGap(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Gutter.Row);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('should call appropiate yoga node method for percent values', () => {\n      const result = setRowGap('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Gutter.Row);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setColumnGap', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setColumnGap(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('should call appropiate yoga node method for numeric values', () => {\n      const result = setColumnGap(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Gutter.Column);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('should call appropiate yoga node method for percent values', () => {\n      const result = setColumnGap('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Gutter.Column);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setJustifyContent.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setJustifyContent from '../../src/node/setJustifyContent';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setJustifyContent', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setJustifyContent: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n    } as SafeNode;\n\n    const result = setJustifyContent(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should set center', () => {\n    const result = setJustifyContent('center')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Justify.Center);\n    expect(result).toBe(node);\n  });\n\n  test('Should set flex-end', () => {\n    const result = setJustifyContent('flex-end')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Justify.FlexEnd);\n    expect(result).toBe(node);\n  });\n\n  test('Should set flex-start', () => {\n    const result = setJustifyContent('flex-start')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Justify.FlexStart);\n    expect(result).toBe(node);\n  });\n\n  test('Should set space-between', () => {\n    const result = setJustifyContent('space-between')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Justify.SpaceBetween);\n    expect(result).toBe(node);\n  });\n\n  test('Should set space-around', () => {\n    const result = setJustifyContent('space-around')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Justify.SpaceAround);\n    expect(result).toBe(node);\n  });\n\n  test('Should set space-evenly', () => {\n    const result = setJustifyContent('space-evenly')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Justify.SpaceEvenly);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setMargin.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setMargin, {\n  setMarginTop,\n  setMarginRight,\n  setMarginBottom,\n  setMarginLeft,\n} from '../../src/node/setMargin';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setMargin', () => {\n  const mock = vi.fn();\n  const mockAuto = vi.fn();\n  const mockPercent = vi.fn();\n\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: {\n      setMargin: mock,\n      setMarginAuto: mockAuto,\n      setMarginPercent: mockPercent,\n    },\n  } as SafeNode;\n\n  const emptyNode = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n    mockAuto.mockReset();\n    mockPercent.mockReset();\n  });\n\n  describe('setMarginTop', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setMarginTop(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for auto value', () => {\n      const result = setMarginTop('auto')(node);\n\n      expect(mockAuto.mock.calls).toHaveLength(1);\n      expect(mockAuto.mock.calls[0][0]).toBe(Yoga.Edge.Top);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setMarginTop(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Top);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setMarginTop('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Edge.Top);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setMarginRight', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setMarginRight(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for auto value', () => {\n      const result = setMarginRight('auto')(node);\n\n      expect(mockAuto.mock.calls).toHaveLength(1);\n      expect(mockAuto.mock.calls[0][0]).toBe(Yoga.Edge.Right);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setMarginRight(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Right);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setMarginRight('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Edge.Right);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setMarginBottom', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setMarginBottom(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for auto value', () => {\n      const result = setMarginBottom('auto')(node);\n\n      expect(mockAuto.mock.calls).toHaveLength(1);\n      expect(mockAuto.mock.calls[0][0]).toBe(Yoga.Edge.Bottom);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setMarginBottom(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Bottom);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setMarginBottom('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Edge.Bottom);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setMarginLeft', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setMarginLeft(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for auto value', () => {\n      const result = setMarginLeft('auto')(node);\n\n      expect(mockAuto.mock.calls).toHaveLength(1);\n      expect(mockAuto.mock.calls[0][0]).toBe(Yoga.Edge.Left);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setMarginLeft(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Left);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setMarginLeft('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Edge.Left);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setMargin', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setMargin(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for auto value', () => {\n      const result = setMargin('auto')(node);\n\n      expect(mockAuto.mock.calls).toHaveLength(4);\n      expect(mockAuto.mock.calls[0][0]).toBe(Yoga.Edge.Top);\n      expect(mockAuto.mock.calls[1][0]).toBe(Yoga.Edge.Right);\n      expect(mockAuto.mock.calls[2][0]).toBe(Yoga.Edge.Bottom);\n      expect(mockAuto.mock.calls[3][0]).toBe(Yoga.Edge.Left);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setMargin(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(4);\n      expect(mock.mock.calls[0]).toEqual([Yoga.Edge.Top, 50]);\n      expect(mock.mock.calls[1]).toEqual([Yoga.Edge.Right, 50]);\n      expect(mock.mock.calls[2]).toEqual([Yoga.Edge.Bottom, 50]);\n      expect(mock.mock.calls[3]).toEqual([Yoga.Edge.Left, 50]);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setMargin('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(4);\n      expect(mockPercent.mock.calls[0]).toEqual([Yoga.Edge.Top, 50]);\n      expect(mockPercent.mock.calls[1]).toEqual([Yoga.Edge.Right, 50]);\n      expect(mockPercent.mock.calls[2]).toEqual([Yoga.Edge.Bottom, 50]);\n      expect(mockPercent.mock.calls[3]).toEqual([Yoga.Edge.Left, 50]);\n      expect(result).toBe(node);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setOverflow.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setOverflow from '../../src/node/setOverflow';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setOverflow', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setOverflow: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n    } as SafeNode;\n\n    const result = setOverflow(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should set visible', () => {\n    const result = setOverflow('visible')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Overflow.Visible);\n    expect(result).toBe(node);\n  });\n\n  test('Should set scroll', () => {\n    const result = setOverflow('scroll')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Overflow.Scroll);\n    expect(result).toBe(node);\n  });\n\n  test('Should set hidden', () => {\n    const result = setOverflow('hidden')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.Overflow.Hidden);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setPadding.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setPadding, {\n  setPaddingTop,\n  setPaddingRight,\n  setPaddingBottom,\n  setPaddingLeft,\n} from '../../src/node/setPadding';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setPadding', () => {\n  const mock = vi.fn();\n  const mockPercent = vi.fn();\n\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setPadding: mock, setPaddingPercent: mockPercent },\n  } as SafeNode;\n\n  const emptyNode = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n    mockPercent.mockReset();\n  });\n\n  describe('setPaddingTop', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setPaddingTop(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setPaddingTop(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Top);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setPaddingTop('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Edge.Top);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setPaddingRight', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setPaddingRight(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setPaddingRight(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Right);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setPaddingRight('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Edge.Right);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setPaddingBottom', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setPaddingBottom(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setPaddingBottom(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Bottom);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setPaddingBottom('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Edge.Bottom);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setPaddingLeft', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setPaddingLeft(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setPaddingLeft(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Left);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setPaddingLeft('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Edge.Left);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setPadding', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setPadding(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setPadding(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(4);\n      expect(mock.mock.calls[0]).toEqual([Yoga.Edge.Top, 50]);\n      expect(mock.mock.calls[1]).toEqual([Yoga.Edge.Right, 50]);\n      expect(mock.mock.calls[2]).toEqual([Yoga.Edge.Bottom, 50]);\n      expect(mock.mock.calls[3]).toEqual([Yoga.Edge.Left, 50]);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setPadding('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(4);\n      expect(mockPercent.mock.calls[0]).toEqual([Yoga.Edge.Top, 50]);\n      expect(mockPercent.mock.calls[1]).toEqual([Yoga.Edge.Right, 50]);\n      expect(mockPercent.mock.calls[2]).toEqual([Yoga.Edge.Bottom, 50]);\n      expect(mockPercent.mock.calls[3]).toEqual([Yoga.Edge.Left, 50]);\n      expect(result).toBe(node);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setPosition.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setPosition, {\n  setPositionTop,\n  setPositionRight,\n  setPositionBottom,\n  setPositionLeft,\n} from '../../src/node/setPosition';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setPosition', () => {\n  const mock = vi.fn();\n  const mockPercent = vi.fn();\n\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setPosition: mock, setPositionPercent: mockPercent },\n  } as SafeNode;\n\n  const emptyNode = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n    mockPercent.mockReset();\n  });\n\n  describe('setPositionTop', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setPositionTop(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setPositionTop(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Top);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setPositionTop('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Edge.Top);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setPositionRight', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setPositionRight(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setPositionRight(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Right);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setPositionRight('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Edge.Right);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setPositionBottom', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setPositionBottom(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setPositionBottom(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Bottom);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setPositionBottom('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Edge.Bottom);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setPositionLeft', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setPositionLeft(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setPositionLeft(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(1);\n      expect(mock.mock.calls[0][0]).toBe(Yoga.Edge.Left);\n      expect(mock.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setPositionLeft('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(1);\n      expect(mockPercent.mock.calls[0][0]).toBe(Yoga.Edge.Left);\n      expect(mockPercent.mock.calls[0][1]).toBe(50);\n      expect(result).toBe(node);\n    });\n  });\n\n  describe('setPosition', () => {\n    test('should return node if no yoga node available', () => {\n      const result = setPosition(null)(emptyNode);\n\n      expect(result).toBe(emptyNode);\n    });\n\n    test('Should call appropiate yoga node method for numeric values', () => {\n      const result = setPosition(50)(node);\n\n      expect(mock.mock.calls).toHaveLength(4);\n      expect(mock.mock.calls[0]).toEqual([Yoga.Edge.Top, 50]);\n      expect(mock.mock.calls[1]).toEqual([Yoga.Edge.Right, 50]);\n      expect(mock.mock.calls[2]).toEqual([Yoga.Edge.Bottom, 50]);\n      expect(mock.mock.calls[3]).toEqual([Yoga.Edge.Left, 50]);\n      expect(result).toBe(node);\n    });\n\n    test('Should call appropiate yoga node method for percent values', () => {\n      const result = setPosition('50%')(node);\n\n      expect(mockPercent.mock.calls).toHaveLength(4);\n      expect(mockPercent.mock.calls[0]).toEqual([Yoga.Edge.Top, 50]);\n      expect(mockPercent.mock.calls[1]).toEqual([Yoga.Edge.Right, 50]);\n      expect(mockPercent.mock.calls[2]).toEqual([Yoga.Edge.Bottom, 50]);\n      expect(mockPercent.mock.calls[3]).toEqual([Yoga.Edge.Left, 50]);\n      expect(result).toBe(node);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/setPositionType.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nimport * as Yoga from 'yoga-layout/load';\n\nimport setPositionType from '../../src/node/setPositionType';\nimport { SafeNode } from '../../src/types';\n\ndescribe('node setPositionType', () => {\n  const mock = vi.fn();\n  const node = {\n    type: 'VIEW',\n    props: {},\n    style: {},\n    children: [],\n    yogaNode: { setPositionType: mock },\n  } as SafeNode;\n\n  beforeEach(() => {\n    mock.mockReset();\n  });\n\n  test('should return node if no yoga node available', () => {\n    const emptyNode = {\n      type: 'VIEW',\n      props: {},\n      style: {},\n      children: [],\n      box: { top: 0, right: 0, bottom: 0, left: 0, width: 10, height: 20 },\n    } as SafeNode;\n\n    const result = setPositionType(null)(emptyNode);\n\n    expect(result).toBe(emptyNode);\n  });\n\n  test('Should set relative', () => {\n    const result = setPositionType('relative')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.PositionType.Relative);\n    expect(result).toBe(node);\n  });\n\n  test('Should set absolute', () => {\n    const result = setPositionType('absolute')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.PositionType.Absolute);\n    expect(result).toBe(node);\n  });\n\n  test('Should set static', () => {\n    const result = setPositionType('static')(node);\n\n    expect(mock.mock.calls).toHaveLength(1);\n    expect(mock.mock.calls[0][0]).toBe(Yoga.PositionType.Static);\n    expect(result).toBe(node);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/node/shouldBreak.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport * as P from '@react-pdf/primitives';\nimport shouldBreak from '../../src/node/shouldBreak';\n\ndescribe('node shouldBreak', () => {\n  test('should not break when the child has enough space on the page', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: {},\n        style: {},\n        children: [],\n        box: { top: 50, right: 0, bottom: 0, left: 0, height: 400, width: 200 },\n      },\n      [],\n      1000,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test('should break when the child has enough space on the page', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { break: true },\n        style: {},\n        children: [],\n        box: { top: 50, right: 0, bottom: 0, left: 0, height: 400, width: 200 },\n      },\n      [],\n      1000,\n      [],\n    );\n\n    expect(result).toEqual(true);\n  });\n\n  test('should not break when the child can be wrapped', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { wrap: true },\n        style: {},\n        children: [],\n        box: {\n          top: 50,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 1400,\n          width: 200,\n        },\n      },\n      [],\n      1000,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test('should break when the child is an unwrappable node', () => {\n    const result = shouldBreak(\n      {\n        type: P.Image,\n        props: { wrap: true } as any,\n        style: {},\n        children: [],\n        box: {\n          top: 50,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 1400,\n          width: 200,\n        },\n      },\n      [],\n      1000,\n      [],\n    );\n\n    expect(result).toEqual(true);\n  });\n\n  test('should break when the child has wrapping disabled', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { wrap: false },\n        style: {},\n        children: [],\n        box: {\n          top: 50,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 1400,\n          width: 200,\n        },\n      },\n      [],\n      1000,\n      [],\n    );\n\n    expect(result).toEqual(true);\n  });\n\n  test('should break when minPresenceAhead is large enough and there are overflowing siblings after the child', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { minPresenceAhead: 400 },\n        style: {},\n        children: [],\n        box: {\n          top: 500,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 400,\n          width: 200,\n          marginTop: 0,\n          marginBottom: 0,\n        },\n      },\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 900,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 200,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 0,\n          },\n        },\n      ],\n      1000,\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 900,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 200,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 0,\n          },\n        },\n      ],\n    );\n\n    expect(result).toEqual(true);\n  });\n\n  test('should break when minPresenceAhead is large enough and there are overflowing siblings due to margins after the child', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { minPresenceAhead: 400 },\n        style: {},\n        children: [],\n        box: {\n          top: 500,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 400,\n          width: 200,\n          marginTop: 0,\n          marginBottom: 0,\n        },\n      },\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 1100,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 0,\n            width: 200,\n            marginTop: 200,\n            marginBottom: 0,\n          },\n        },\n      ],\n      1000,\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 900,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 200,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 0,\n          },\n        },\n      ],\n    );\n\n    expect(result).toEqual(true);\n  });\n\n  test('should not break when minPresenceAhead is not past the page end', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { minPresenceAhead: 100 },\n        style: {},\n        children: [],\n        box: {\n          top: 500,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 400,\n          width: 200,\n          marginTop: 0,\n          marginBottom: 0,\n        },\n      },\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 900,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 200,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 0,\n          },\n        },\n      ],\n      1000,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test('should not break when the siblings after the child do not overflow past the page end', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { minPresenceAhead: 400 },\n        style: {},\n        children: [],\n        box: {\n          top: 500,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 400,\n          width: 200,\n          marginTop: 0,\n          marginBottom: 0,\n        },\n      },\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 900,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 100,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 0,\n          },\n        },\n      ],\n      1000,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test('should not break when the siblings after the child do not overflow past the page end, with margins', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { minPresenceAhead: 400 },\n        style: {},\n        children: [],\n        box: {\n          top: 500,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 400,\n          width: 200,\n          marginTop: 0,\n          marginBottom: 0,\n        },\n      },\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 1000,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 0,\n            width: 200,\n            marginTop: 100,\n            marginBottom: 0,\n          },\n        },\n      ],\n      1000,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test(\"should not break when only the last sibling's bottom margin overflows past the page end\", () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { minPresenceAhead: 400 },\n        style: {},\n        children: [],\n        box: {\n          top: 500,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 400,\n          width: 200,\n          marginTop: 0,\n          marginBottom: 0,\n        },\n      },\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 900,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 100,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 100,\n          },\n        },\n      ],\n      1000,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test('should not break due to minPresenceAhead when breaking does not improve presence because the node is already the first non-fixed node on the page, to avoid infinite loops', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { minPresenceAhead: 400 },\n        style: {},\n        children: [],\n        box: {\n          top: 500,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 400,\n          width: 200,\n          marginTop: 500,\n          marginBottom: 0,\n        },\n      },\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 900,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 200,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 0,\n          },\n        },\n      ],\n      1000,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test('should not break due to minPresenceAhead even when there are some previous fixed nodes on the page, to avoid infinite loops', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { minPresenceAhead: 400 },\n        style: {},\n        children: [],\n        box: {\n          top: 500,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 400,\n          width: 200,\n          marginTop: 500,\n          marginBottom: 0,\n        },\n      },\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 900,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 200,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 0,\n          },\n        },\n      ],\n      1000,\n      [\n        {\n          type: 'VIEW',\n          props: {\n            fixed: true,\n          },\n          style: {},\n          children: [],\n          box: {\n            top: 900,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 200,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 0,\n          },\n        },\n      ],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test('should never break fixed child', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { minPresenceAhead: 400, fixed: true },\n        style: {},\n        children: [],\n        box: {\n          top: 500,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 400,\n          width: 200,\n          marginTop: 0,\n          marginBottom: 0,\n        },\n      },\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 900,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 200,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 0,\n          },\n        },\n      ],\n      1000,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test('should ignore fixed elements after child', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { minPresenceAhead: 400, fixed: true },\n        style: {},\n        children: [],\n        box: {\n          top: 500,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 400,\n          width: 200,\n          marginTop: 0,\n          marginBottom: 0,\n        },\n      },\n      [\n        {\n          type: 'VIEW',\n          props: { fixed: true },\n          style: {},\n          children: [],\n          box: {\n            top: 900,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 200,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 0,\n          },\n        },\n      ],\n      1000,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test('should work with trivial minimal reproduction example', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { minPresenceAhead: 100 },\n        style: {},\n        children: [],\n        box: {\n          top: 30,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 0,\n          width: 200,\n          marginTop: 0,\n          marginBottom: 0,\n        },\n      },\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 30,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 70,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 0,\n          },\n        },\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 130,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 0,\n            width: 200,\n            marginTop: 30,\n            marginBottom: 0,\n          },\n        },\n      ],\n      811.89,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test('should work with minimal infinite loop reproduction example', () => {\n    const result = shouldBreak(\n      {\n        type: 'VIEW',\n        props: { minPresenceAhead: 100 },\n        style: {},\n        children: [],\n        box: {\n          top: 30,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 0,\n          width: 200,\n          marginTop: 0,\n          marginBottom: 0,\n        },\n      },\n      [\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 30,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 71,\n            width: 200,\n            marginTop: 0,\n            marginBottom: 0,\n          },\n        },\n        {\n          type: 'VIEW',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 131,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 0,\n            width: 200,\n            marginTop: 30,\n            marginBottom: 0,\n          },\n        },\n      ],\n      811.89,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test('should work with reproduction from #2303', () => {\n    const result = shouldBreak(\n      {\n        type: 'TEXT',\n        box: {\n          paddingTop: 0,\n          paddingRight: 0,\n          paddingBottom: 0,\n          paddingLeft: 0,\n          marginTop: 12,\n          marginRight: 12,\n          marginBottom: 12,\n          marginLeft: 12,\n          borderTopWidth: 0,\n          borderRightWidth: 0,\n          borderBottomWidth: 0,\n          borderLeftWidth: 0,\n          top: 541.7999877929688,\n          right: 12,\n          bottom: 12,\n          left: 72,\n          width: 451.280029296875,\n          height: 250.8800048828125,\n        },\n        style: {\n          marginTop: 12,\n          marginRight: 12,\n          marginBottom: 12,\n          marginLeft: 12,\n          fontSize: 14,\n          textAlign: 'justify',\n          fontFamily: 'Times-Roman',\n        },\n        props: {\n          minPresenceAhead: 4,\n        },\n        children: [\n          {\n            type: 'TEXT_INSTANCE',\n            value:\n              'En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón las más noches, duelos y quebrantos los sábados, lentejas los viernes, algún palomino de añadidura los domingos, consumían las tres partes de su hacienda. El resto della concluían sayo de velarte, calzas de velludo para las fiestas con sus pantuflos de lo mismo, los días de entre semana se honraba con su vellori de lo más fino. Tenía en su casa una ama que pasaba de los cuarenta, y una sobrina que no llegaba a los veinte, y un mozo de campo y plaza, que así ensillaba el rocín como tomaba la podadera. Frisaba la edad de nuestro hidalgo con los cincuenta años, era de complexión recia, seco de carnes, enjuto de rostro; gran madrugador y amigo de la caza. Quieren decir que tenía el sobrenombre de Quijada o Quesada (que en esto hay alguna diferencia en los autores que deste caso escriben), aunque por conjeturas verosímiles se deja entender que se llama Quijana; pero esto importa poco a nuestro cuento; basta que en la narración dél no se salga un punto de la verdad',\n          },\n        ],\n      },\n      [\n        {\n          type: 'TEXT',\n          box: {\n            paddingTop: 0,\n            paddingRight: 0,\n            paddingBottom: 0,\n            paddingLeft: 0,\n            marginTop: 550,\n            marginRight: 0,\n            marginBottom: 0,\n            marginLeft: 0,\n            borderTopWidth: 0,\n            borderRightWidth: 0,\n            borderBottomWidth: 0,\n            borderLeftWidth: 0,\n            top: 1354.679931640625,\n            right: 0,\n            bottom: 0,\n            left: 60,\n            width: 475.280029296875,\n            height: 19.799999237060547,\n          },\n          style: {\n            marginTop: 550,\n          },\n          props: {},\n          children: [\n            {\n              type: 'TEXT_INSTANCE',\n              value: 'Orphans example. Try changing prop value',\n            },\n          ],\n        },\n        {\n          type: 'TEXT',\n          box: {\n            paddingTop: 0,\n            paddingRight: 0,\n            paddingBottom: 0,\n            paddingLeft: 0,\n            marginTop: 12,\n            marginRight: 12,\n            marginBottom: 12,\n            marginLeft: 12,\n            borderTopWidth: 0,\n            borderRightWidth: 0,\n            borderBottomWidth: 0,\n            borderLeftWidth: 0,\n            top: 1386.47998046875,\n            right: 12,\n            bottom: 12,\n            left: 72,\n            width: 451.280029296875,\n            height: 250.8800048828125,\n          },\n          style: {\n            marginTop: 12,\n            marginRight: 12,\n            marginBottom: 12,\n            marginLeft: 12,\n            fontSize: 14,\n            textAlign: 'justify',\n            fontFamily: 'Times-Roman',\n          },\n          props: {\n            orphans: 4,\n          },\n          children: [\n            {\n              type: 'TEXT_INSTANCE',\n              value:\n                'En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón las más noches, duelos y quebrantos los sábados, lentejas los viernes, algún palomino de añadidura los domingos, consumían las tres partes de su hacienda. El resto della concluían sayo de velarte, calzas de velludo para las fiestas con sus pantuflos de lo mismo, los días de entre semana se honraba con su vellori de lo más fino. Tenía en su casa una ama que pasaba de los cuarenta, y una sobrina que no llegaba a los veinte, y un mozo de campo y plaza, que así ensillaba el rocín como tomaba la podadera. Frisaba la edad de nuestro hidalgo con los cincuenta años, era de complexión recia, seco de carnes, enjuto de rostro; gran madrugador y amigo de la caza. Quieren decir que tenía el sobrenombre de Quijada o Quesada (que en esto hay alguna diferencia en los autores que deste caso escriben), aunque por conjeturas verosímiles se deja entender que se llama Quijana; pero esto importa poco a nuestro cuento; basta que en la narración dél no se salga un punto de la verdad',\n            },\n          ],\n        },\n      ],\n      781.89,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n\n  test('should not break when the child can wrap', () => {\n    const result = shouldBreak(\n      {\n        type: 'TEXT',\n        props: {},\n        style: {},\n        children: [],\n        box: {\n          top: 425.23779296875,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          height: 419.439453125,\n          width: 200,\n          marginTop: 12,\n          marginBottom: 12,\n        },\n      },\n      [\n        {\n          type: 'TEXT',\n          props: {},\n          style: {},\n          children: [],\n          box: {\n            top: 868.67724609375,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            height: 247.8505859375,\n            width: 200,\n            marginTop: 12,\n            marginBottom: 12,\n          },\n        },\n      ],\n      776.89,\n      [],\n    );\n\n    expect(result).toEqual(false);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/page/getOrientation.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport getOrientation from '../../src/page/getOrientation';\n\ndescribe('page getOrientation', () => {\n  test('Should return portrait if no orientation provided', () => {\n    const orientation = getOrientation({ type: 'PAGE', props: {} });\n\n    expect(orientation).toBe('portrait');\n  });\n\n  test('Should return landscape if landscape', () => {\n    const orientation = getOrientation({\n      type: 'PAGE',\n      props: { orientation: 'landscape' },\n    });\n\n    expect(orientation).toBe('landscape');\n  });\n\n  test('Should return portrait if portait', () => {\n    const orientation = getOrientation({\n      type: 'PAGE',\n      props: { orientation: 'portrait' },\n    });\n\n    expect(orientation).toBe('portrait');\n  });\n\n  test('Should return portrait if anything else', () => {\n    const orientation = getOrientation({\n      type: 'PAGE',\n      props: { orientation: 'boo' as any },\n    });\n\n    expect(orientation).toBe('portrait');\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/page/getSize.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport getSize from '../../src/page/getSize';\n\ndescribe('page getSize', () => {\n  test('should default to A4', () => {\n    const size = getSize({ type: 'PAGE', props: {} });\n\n    expect(size).toHaveProperty('width', 595.28);\n    expect(size).toHaveProperty('height', 841.89);\n  });\n\n  test('should default to portrait A4', () => {\n    const size = getSize({\n      type: 'PAGE',\n      props: { orientation: 'portrait' },\n    });\n\n    expect(size).toHaveProperty('width', 595.28);\n    expect(size).toHaveProperty('height', 841.89);\n  });\n\n  test('should accept size string', () => {\n    const size = getSize({ type: 'PAGE', props: { size: 'A2' } });\n\n    expect(size).toHaveProperty('width', 1190.55);\n    expect(size).toHaveProperty('height', 1683.78);\n  });\n\n  test('should accept size string in landscape mode', () => {\n    const size = getSize({\n      type: 'PAGE',\n      props: { size: 'A2', orientation: 'landscape' },\n    });\n\n    expect(size).toHaveProperty('width', 1683.78);\n    expect(size).toHaveProperty('height', 1190.55);\n  });\n\n  test('should accept size number array', () => {\n    const size = getSize({ type: 'PAGE', props: { size: [100, 200] } });\n\n    expect(size).toHaveProperty('width', 100);\n    expect(size).toHaveProperty('height', 200);\n  });\n\n  test('should accept size string array', () => {\n    const size = getSize({ type: 'PAGE', props: { size: ['50px', '1in'] } });\n\n    expect(size).toHaveProperty('width', 50);\n    expect(size).toHaveProperty('height', 72);\n  });\n\n  test('should accept size number array in landscape mode', () => {\n    const size = getSize({\n      type: 'PAGE',\n      props: { size: [100, 200], orientation: 'landscape' },\n    });\n\n    expect(size).toHaveProperty('width', 200);\n    expect(size).toHaveProperty('height', 100);\n  });\n\n  test('should accept size string array in landscape mode', () => {\n    const size = getSize({\n      type: 'PAGE',\n      props: { size: ['50px', '1in'], orientation: 'landscape' },\n    });\n\n    expect(size).toHaveProperty('width', 72);\n    expect(size).toHaveProperty('height', 50);\n  });\n\n  test('should accept number size object', () => {\n    const size = getSize({\n      type: 'PAGE',\n      props: { size: { width: 100, height: 200 } },\n    });\n\n    expect(size).toHaveProperty('width', 100);\n    expect(size).toHaveProperty('height', 200);\n  });\n\n  test('should accept string size object', () => {\n    const size = getSize({\n      type: 'PAGE',\n      props: { size: { width: '50px', height: '1in' } },\n    });\n\n    expect(size).toHaveProperty('width', 50);\n    expect(size).toHaveProperty('height', 72);\n  });\n\n  test('should accept size object in landscape mode', () => {\n    const size = getSize({\n      type: 'PAGE',\n      props: { size: { width: 100, height: 200 }, orientation: 'landscape' },\n    });\n\n    expect(size).toHaveProperty('width', 200);\n    expect(size).toHaveProperty('height', 100);\n  });\n\n  test('should accept string size object in landscape mode', () => {\n    const size = getSize({\n      type: 'PAGE',\n      props: {\n        size: { width: '50px', height: '1in' },\n        orientation: 'landscape',\n      },\n    });\n\n    expect(size).toHaveProperty('width', 72);\n    expect(size).toHaveProperty('height', 50);\n  });\n\n  test('should accept size number', () => {\n    const size = getSize({ type: 'PAGE', props: { size: 100 } });\n\n    expect(size).toHaveProperty('width', 100);\n    expect(size).toHaveProperty('height', 100);\n  });\n\n  test('should accept size number in landscape mode', () => {\n    const size = getSize({\n      type: 'PAGE',\n      props: { size: 100, orientation: 'landscape' },\n    });\n\n    expect(size).toHaveProperty('width', 100);\n    expect(size).toHaveProperty('height', 100);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/page/isHeightAuto.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport isHeightAuto from '../../src/page/isHeightAuto';\n\ndescribe('page isHeightAuto', () => {\n  test('Should return false if height present', () => {\n    const result = isHeightAuto({\n      type: 'PAGE',\n      props: {},\n      box: { width: 100, height: 10 },\n    });\n\n    expect(result).toBeFalsy();\n  });\n\n  test('Should return false if height is zero', () => {\n    const result = isHeightAuto({\n      type: 'PAGE',\n      props: {},\n      box: { width: 100, height: 0 },\n    });\n\n    expect(result).toBeFalsy();\n  });\n\n  test('Should return false if height not present', () => {\n    const result = isHeightAuto({\n      type: 'PAGE',\n      props: {},\n      box: { width: 100 },\n    });\n\n    expect(result).toBeTruthy();\n  });\n\n  test('Should return false if height is null', () => {\n    const result = isHeightAuto({\n      type: 'PAGE',\n      props: {},\n      box: { width: 100, height: null as any },\n    });\n\n    expect(result).toBeTruthy();\n  });\n\n  test('Should return false if height is undefined', () => {\n    const result = isHeightAuto({\n      type: 'PAGE',\n      props: {},\n      box: { width: 100, height: undefined },\n    });\n\n    expect(result).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/page/isLandscape.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport isLandscape from '../../src/page/isLandscape';\n\ndescribe('page isLandscape', () => {\n  test('Should return false if no orientation provided', () => {\n    const result = isLandscape({ type: 'PAGE', props: {} });\n\n    expect(result).toBeFalsy();\n  });\n\n  test('Should return true if landscape', () => {\n    const result = isLandscape({\n      type: 'PAGE',\n      props: { orientation: 'landscape' },\n    });\n\n    expect(result).toBeTruthy();\n  });\n\n  test('Should return false if portait', () => {\n    const result = isLandscape({\n      type: 'PAGE',\n      props: { orientation: 'portrait' },\n    });\n\n    expect(result).toBeFalsy();\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/page/isPortrait.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport isPortrait from '../../src/page/isPortrait';\n\ndescribe('page isPortrait', () => {\n  test('Should return true if no orientation provided', () => {\n    const result = isPortrait({ type: 'PAGE', props: {} });\n\n    expect(result).toBeTruthy();\n  });\n\n  test('Should return false if landscape', () => {\n    const result = isPortrait({\n      type: 'PAGE',\n      props: { orientation: 'landscape' },\n    });\n\n    expect(result).toBeFalsy();\n  });\n\n  test('Should return true if portait', () => {\n    const result = isPortrait({\n      type: 'PAGE',\n      props: { orientation: 'portrait' },\n    });\n\n    expect(result).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/steps/__snapshots__/resolveLinkSubstitution.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`layout resolve link substitution > Should leave link with text children as it is 1`] = `\n{\n  \"children\": [\n    {\n      \"children\": [\n        {\n          \"children\": [\n            {\n              \"props\": {},\n              \"type\": \"TEXT\",\n            },\n          ],\n          \"props\": {\n            \"src\": \"url\",\n          },\n          \"type\": \"LINK\",\n        },\n      ],\n      \"props\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolve link substitution > Should replace link with only many text instances as children 1`] = `\n{\n  \"children\": [\n    {\n      \"children\": [\n        {\n          \"children\": [\n            {\n              \"box\": {},\n              \"children\": [\n                {\n                  \"type\": \"TEXT_INSTANCE\",\n                  \"value\": \"1\",\n                },\n                {\n                  \"type\": \"TEXT_INSTANCE\",\n                  \"value\": \"2\",\n                },\n                {\n                  \"type\": \"TEXT_INSTANCE\",\n                  \"value\": \"3\",\n                },\n                {\n                  \"type\": \"TEXT_INSTANCE\",\n                  \"value\": \"4\",\n                },\n              ],\n              \"props\": {},\n              \"style\": {},\n              \"type\": \"TEXT\",\n            },\n          ],\n          \"props\": {\n            \"src\": \"url\",\n          },\n          \"type\": \"LINK\",\n        },\n      ],\n      \"props\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolve link substitution > Should replace link with only one text instance as children 1`] = `\n{\n  \"children\": [\n    {\n      \"children\": [\n        {\n          \"children\": [\n            {\n              \"box\": {},\n              \"children\": [\n                {\n                  \"type\": \"TEXT_INSTANCE\",\n                  \"value\": \"1\",\n                },\n              ],\n              \"props\": {},\n              \"style\": {},\n              \"type\": \"TEXT\",\n            },\n          ],\n          \"props\": {\n            \"src\": \"url\",\n          },\n          \"type\": \"LINK\",\n        },\n      ],\n      \"props\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolve link substitution > Should replace link with render prop 1`] = `\n{\n  \"children\": [\n    {\n      \"children\": [\n        {\n          \"props\": {\n            \"render\": [Function],\n          },\n          \"type\": \"TEXT\",\n        },\n      ],\n      \"props\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n"
  },
  {
    "path": "packages/layout/tests/steps/__snapshots__/resolveOrigins.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`layout resolveOrigins > should not resolve for node without box 1`] = `\n{\n  \"children\": [\n    {\n      \"children\": [\n        {\n          \"origin\": null,\n          \"props\": {},\n          \"style\": {},\n          \"type\": \"VIEW\",\n        },\n      ],\n      \"origin\": null,\n      \"props\": {},\n      \"style\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveOrigins > should resolve centered origin by default 1`] = `\n{\n  \"children\": [\n    {\n      \"box\": {\n        \"bottom\": 0,\n        \"height\": 400,\n        \"left\": 100,\n        \"right\": 0,\n        \"top\": 50,\n        \"width\": 300,\n      },\n      \"origin\": {\n        \"left\": 250,\n        \"top\": 250,\n      },\n      \"props\": {},\n      \"style\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveOrigins > should resolve origin adjusted by fixed values 1`] = `\n{\n  \"children\": [\n    {\n      \"box\": {\n        \"bottom\": 0,\n        \"height\": 400,\n        \"left\": 100,\n        \"right\": 0,\n        \"top\": 50,\n        \"width\": 300,\n      },\n      \"origin\": {\n        \"left\": 200,\n        \"top\": 100,\n      },\n      \"props\": {},\n      \"style\": {\n        \"transformOriginX\": 100,\n        \"transformOriginY\": 50,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveOrigins > should resolve origin adjusted by percent values 1`] = `\n{\n  \"children\": [\n    {\n      \"box\": {\n        \"bottom\": 0,\n        \"height\": 400,\n        \"left\": 100,\n        \"right\": 0,\n        \"top\": 50,\n        \"width\": 300,\n      },\n      \"origin\": {\n        \"left\": 160,\n        \"top\": 330,\n      },\n      \"props\": {},\n      \"style\": {\n        \"transformOriginX\": \"20%\",\n        \"transformOriginY\": \"70%\",\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveOrigins > should resolve origins for nested elements 1`] = `\n{\n  \"children\": [\n    {\n      \"box\": {\n        \"bottom\": 0,\n        \"height\": 400,\n        \"left\": 100,\n        \"right\": 0,\n        \"top\": 50,\n        \"width\": 300,\n      },\n      \"children\": [\n        {\n          \"box\": {\n            \"bottom\": 0,\n            \"height\": 80,\n            \"left\": 10,\n            \"right\": 0,\n            \"top\": 0,\n            \"width\": 50,\n          },\n          \"origin\": {\n            \"left\": 35,\n            \"top\": 40,\n          },\n          \"props\": {},\n          \"style\": {},\n          \"type\": \"VIEW\",\n        },\n      ],\n      \"origin\": {\n        \"left\": 250,\n        \"top\": 250,\n      },\n      \"props\": {},\n      \"style\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n"
  },
  {
    "path": "packages/layout/tests/steps/__snapshots__/resolvePagePaddings.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`layout resolvePagePaddings > Should keep other styles untouched 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"color\": \"red\",\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolvePagePaddings > Should leave numeric paddingBottom as it is 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"paddingBottom\": 50,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolvePagePaddings > Should leave numeric paddingLeft as it is 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"paddingLeft\": 50,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolvePagePaddings > Should leave numeric paddingRight as it is 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"paddingRight\": 50,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolvePagePaddings > Should leave numeric paddingTop as it is 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"paddingTop\": 50,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolvePagePaddings > Should resolve percent paddingBottom 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"height\": 200,\n        \"paddingBottom\": 20,\n        \"width\": 100,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolvePagePaddings > Should resolve percent paddingLeft 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"height\": 200,\n        \"paddingLeft\": 10,\n        \"width\": 100,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolvePagePaddings > Should resolve percent paddingRight 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"height\": 200,\n        \"paddingRight\": 10,\n        \"width\": 100,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolvePagePaddings > Should resolve percent paddingTop 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"height\": 200,\n        \"paddingTop\": 20,\n        \"width\": 100,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolvePagePaddings > Should resolve several pages 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"height\": 200,\n        \"paddingTop\": 10,\n        \"width\": 100,\n      },\n      \"type\": \"PAGE\",\n    },\n    {\n      \"props\": {},\n      \"style\": {\n        \"height\": 200,\n        \"paddingBottom\": 20,\n        \"width\": 100,\n      },\n      \"type\": \"PAGE\",\n    },\n    {\n      \"props\": {},\n      \"style\": {\n        \"height\": 200,\n        \"paddingLeft\": 10,\n        \"paddingRight\": 10,\n        \"width\": 100,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n"
  },
  {
    "path": "packages/layout/tests/steps/__snapshots__/resolvePercentHeight.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`layout resolvePercentHeight > Should keep empty document untouched 1`] = `\n{\n  \"children\": [],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolvePercentHeight > Should keep empty page untouched 1`] = `\n{\n  \"children\": [\n    {\n      \"children\": [],\n      \"props\": {},\n      \"style\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolvePercentHeight > Should not resolve children if page dont have height 1`] = `\n{\n  \"children\": [\n    {\n      \"children\": [\n        {\n          \"props\": {},\n          \"style\": {\n            \"height\": \"80%\",\n            \"width\": \"60%\",\n          },\n          \"type\": \"VIEW\",\n        },\n      ],\n      \"props\": {},\n      \"style\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolvePercentHeight > Should resolve children percent dimensions if page have height 1`] = `\n{\n  \"children\": [\n    {\n      \"children\": [\n        {\n          \"props\": {},\n          \"style\": {\n            \"height\": 800,\n          },\n          \"type\": \"VIEW\",\n        },\n      ],\n      \"props\": {},\n      \"style\": {\n        \"height\": 1000,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n"
  },
  {
    "path": "packages/layout/tests/steps/__snapshots__/resolveStyles.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`layout resolveStyles > Should overide default link styles 1`] = `\n{\n  \"children\": [\n    {\n      \"box\": {\n        \"bottom\": 0,\n        \"height\": 200,\n        \"left\": 0,\n        \"right\": 0,\n        \"top\": 0,\n        \"width\": 100,\n      },\n      \"children\": [\n        {\n          \"props\": {},\n          \"style\": {\n            \"color\": \"wheat\",\n            \"textDecoration\": \"none\",\n          },\n          \"type\": \"LINK\",\n        },\n      ],\n      \"props\": {},\n      \"style\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveStyles > Should overide default link styles with array 1`] = `\n{\n  \"children\": [\n    {\n      \"box\": {\n        \"bottom\": 0,\n        \"height\": 200,\n        \"left\": 0,\n        \"right\": 0,\n        \"top\": 0,\n        \"width\": 100,\n      },\n      \"children\": [\n        {\n          \"props\": {},\n          \"style\": {\n            \"color\": \"wheat\",\n            \"textDecoration\": \"none\",\n          },\n          \"type\": \"LINK\",\n        },\n      ],\n      \"props\": {},\n      \"style\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveStyles > Should resolve default link styles 1`] = `\n{\n  \"children\": [\n    {\n      \"box\": {\n        \"bottom\": 0,\n        \"height\": 200,\n        \"left\": 0,\n        \"right\": 0,\n        \"top\": 0,\n        \"width\": 100,\n      },\n      \"children\": [\n        {\n          \"props\": {},\n          \"style\": {\n            \"color\": \"blue\",\n            \"textDecoration\": \"underline\",\n          },\n          \"type\": \"LINK\",\n        },\n      ],\n      \"props\": {},\n      \"style\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveStyles > Should resolve nested node styles 1`] = `\n{\n  \"children\": [\n    {\n      \"box\": {\n        \"bottom\": 0,\n        \"height\": 200,\n        \"left\": 0,\n        \"right\": 0,\n        \"top\": 0,\n        \"width\": 100,\n      },\n      \"children\": [\n        {\n          \"props\": {},\n          \"style\": {\n            \"backgroundColor\": \"red\",\n            \"borderBottomColor\": \"green\",\n            \"borderBottomStyle\": \"dotted\",\n            \"borderBottomWidth\": 28.346456692913385,\n            \"borderLeftColor\": \"green\",\n            \"borderLeftStyle\": \"dotted\",\n            \"borderLeftWidth\": 28.346456692913385,\n            \"borderRightColor\": \"green\",\n            \"borderRightStyle\": \"dotted\",\n            \"borderRightWidth\": 28.346456692913385,\n            \"borderTopColor\": \"green\",\n            \"borderTopStyle\": \"dotted\",\n            \"borderTopWidth\": 28.346456692913385,\n            \"paddingBottom\": 28.34645669291339,\n            \"paddingLeft\": 720,\n            \"paddingRight\": 720,\n            \"paddingTop\": 28.34645669291339,\n          },\n          \"type\": \"VIEW\",\n        },\n      ],\n      \"props\": {},\n      \"style\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveStyles > Should resolve nested node styles array 1`] = `\n{\n  \"children\": [\n    {\n      \"box\": {\n        \"bottom\": 0,\n        \"height\": 200,\n        \"left\": 0,\n        \"right\": 0,\n        \"top\": 0,\n        \"width\": 100,\n      },\n      \"children\": [\n        {\n          \"props\": {},\n          \"style\": {\n            \"backgroundColor\": \"red\",\n            \"borderBottomColor\": \"green\",\n            \"borderBottomStyle\": \"dotted\",\n            \"borderBottomWidth\": 28.346456692913385,\n            \"borderLeftColor\": \"green\",\n            \"borderLeftStyle\": \"dotted\",\n            \"borderLeftWidth\": 28.346456692913385,\n            \"borderRightColor\": \"green\",\n            \"borderRightStyle\": \"dotted\",\n            \"borderRightWidth\": 28.346456692913385,\n            \"borderTopColor\": \"green\",\n            \"borderTopStyle\": \"dotted\",\n            \"borderTopWidth\": 28.346456692913385,\n            \"paddingBottom\": 28.34645669291339,\n            \"paddingLeft\": 720,\n            \"paddingRight\": 720,\n            \"paddingTop\": 28.34645669291339,\n          },\n          \"type\": \"VIEW\",\n        },\n      ],\n      \"props\": {},\n      \"style\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveStyles > Should resolve nested node styles media queries 1`] = `\n{\n  \"children\": [\n    {\n      \"box\": {\n        \"bottom\": 0,\n        \"height\": 200,\n        \"left\": 0,\n        \"right\": 0,\n        \"top\": 0,\n        \"width\": 100,\n      },\n      \"children\": [\n        {\n          \"props\": {},\n          \"style\": {\n            \"backgroundColor\": \"green\",\n          },\n          \"type\": \"VIEW\",\n        },\n        {\n          \"props\": {},\n          \"style\": {\n            \"backgroundColor\": \"red\",\n          },\n          \"type\": \"VIEW\",\n        },\n      ],\n      \"props\": {},\n      \"style\": {},\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveStyles > Should resolve nested node styles media queries with page style 1`] = `\n{\n  \"children\": [\n    {\n      \"children\": [\n        {\n          \"props\": {},\n          \"style\": {\n            \"backgroundColor\": \"green\",\n          },\n          \"type\": \"VIEW\",\n        },\n        {\n          \"props\": {},\n          \"style\": {\n            \"backgroundColor\": \"red\",\n          },\n          \"type\": \"VIEW\",\n        },\n      ],\n      \"props\": {},\n      \"style\": {\n        \"height\": 200,\n        \"width\": 100,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveStyles > Should resolve page styles 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"backgroundColor\": \"red\",\n        \"borderBottomColor\": \"green\",\n        \"borderBottomStyle\": \"dotted\",\n        \"borderBottomWidth\": 28.346456692913385,\n        \"borderLeftColor\": \"green\",\n        \"borderLeftStyle\": \"dotted\",\n        \"borderLeftWidth\": 28.346456692913385,\n        \"borderRightColor\": \"green\",\n        \"borderRightStyle\": \"dotted\",\n        \"borderRightWidth\": 28.346456692913385,\n        \"borderTopColor\": \"green\",\n        \"borderTopStyle\": \"dotted\",\n        \"borderTopWidth\": 28.346456692913385,\n        \"paddingBottom\": 28.34645669291339,\n        \"paddingLeft\": 720,\n        \"paddingRight\": 720,\n        \"paddingTop\": 28.34645669291339,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveStyles > Should resolve page styles array 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"backgroundColor\": \"red\",\n        \"borderBottomColor\": \"green\",\n        \"borderBottomStyle\": \"dotted\",\n        \"borderBottomWidth\": 28.346456692913385,\n        \"borderLeftColor\": \"green\",\n        \"borderLeftStyle\": \"dotted\",\n        \"borderLeftWidth\": 28.346456692913385,\n        \"borderRightColor\": \"green\",\n        \"borderRightStyle\": \"dotted\",\n        \"borderRightWidth\": 28.346456692913385,\n        \"borderTopColor\": \"green\",\n        \"borderTopStyle\": \"dotted\",\n        \"borderTopWidth\": 28.346456692913385,\n        \"paddingBottom\": 28.34645669291339,\n        \"paddingLeft\": 720,\n        \"paddingRight\": 720,\n        \"paddingTop\": 28.34645669291339,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n\nexports[`layout resolveStyles > Should resolve several pages styles 1`] = `\n{\n  \"children\": [\n    {\n      \"props\": {},\n      \"style\": {\n        \"borderTopColor\": \"#FF00000\",\n        \"borderTopStyle\": \"solid\",\n        \"borderTopWidth\": 4,\n        \"paddingBottom\": 28.34645669291339,\n        \"paddingLeft\": 720,\n        \"paddingRight\": 720,\n        \"paddingTop\": 28.34645669291339,\n      },\n      \"type\": \"PAGE\",\n    },\n    {\n      \"props\": {},\n      \"style\": {\n        \"backgroundColor\": \"red\",\n        \"borderBottomColor\": \"green\",\n        \"borderBottomStyle\": \"dotted\",\n        \"borderBottomWidth\": 28.346456692913385,\n        \"borderLeftColor\": \"green\",\n        \"borderLeftStyle\": \"dotted\",\n        \"borderLeftWidth\": 28.346456692913385,\n        \"borderRightColor\": \"green\",\n        \"borderRightStyle\": \"dotted\",\n        \"borderRightWidth\": 28.346456692913385,\n        \"borderTopColor\": \"green\",\n        \"borderTopStyle\": \"dotted\",\n        \"borderTopWidth\": 28.346456692913385,\n        \"fontWeight\": 700,\n      },\n      \"type\": \"PAGE\",\n    },\n  ],\n  \"props\": {},\n  \"type\": \"DOCUMENT\",\n}\n`;\n"
  },
  {
    "path": "packages/layout/tests/steps/resolveBookmarks.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolveBookmarks from '../../src/steps/resolveBookmarks';\nimport { DocumentNode } from '../../src/types';\n\ndescribe('layout resolveBookmarks', () => {\n  test('should keep nodes the same if no bookmark passed', () => {\n    const root = {\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          children: [{ type: 'VIEW', props: {} }],\n        },\n      ],\n    } as DocumentNode;\n\n    const result = resolveBookmarks(root);\n\n    expect(result).toEqual({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          children: [{ type: 'VIEW', props: {} }],\n        },\n      ],\n    });\n  });\n\n  test('should keep nodes the same if an undefined bookmark passed', () => {\n    const root = {\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: { bookmark: undefined },\n          children: [{ type: 'VIEW', props: {} }],\n        },\n      ],\n    } as DocumentNode;\n\n    const result = resolveBookmarks(root);\n\n    expect(result).toEqual({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: { bookmark: undefined },\n          children: [{ type: 'VIEW', props: {} }],\n        },\n      ],\n    });\n  });\n\n  test('should keep nodes the same if a null bookmark passed', () => {\n    const root = {\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: { bookmark: null },\n          children: [{ type: 'VIEW', props: {} }],\n        },\n      ],\n    } as DocumentNode;\n\n    const result = resolveBookmarks(root);\n\n    expect(result).toEqual({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: { bookmark: null },\n          children: [{ type: 'VIEW', props: {} }],\n        },\n      ],\n    });\n  });\n\n  test('should resolve bookmark in page node', () => {\n    const result = resolveBookmarks({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: { bookmark: 'page' },\n          children: [{ type: 'VIEW', props: {} }],\n        },\n      ],\n    });\n\n    expect(result.children?.[0]?.props?.bookmark).toEqual({\n      ref: 0,\n      title: 'page',\n      fit: false,\n      expanded: false,\n    });\n  });\n\n  test('should resolve bookmark hierarchy', () => {\n    const result = resolveBookmarks({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: { bookmark: 'page' },\n          children: [\n            {\n              type: 'VIEW',\n              children: [\n                {\n                  type: 'VIEW',\n                  children: [\n                    {\n                      type: 'VIEW',\n                      props: {\n                        bookmark: 'sub chapter',\n                      },\n                    },\n                  ],\n                  props: {\n                    bookmark: 'chapter 1',\n                  },\n                },\n              ],\n              props: {},\n            },\n            {\n              type: 'VIEW',\n              props: {\n                bookmark: 'chapter 2',\n              },\n            },\n          ],\n        },\n      ],\n    });\n\n    const page = result.children[0];\n    const view = page.children![1];\n    const nestedView = page.children![0].children![0];\n    const subNestedView = nestedView!.children![0];\n\n    expect(page.props.bookmark).toEqual({\n      ref: 0,\n      title: 'page',\n      fit: false,\n      expanded: false,\n    });\n\n    expect(view.props.bookmark).toEqual({\n      ref: 1,\n      parent: 0,\n      title: 'chapter 2',\n      fit: false,\n      expanded: false,\n    });\n\n    expect(nestedView.props!.bookmark).toEqual({\n      ref: 2,\n      parent: 0,\n      title: 'chapter 1',\n      fit: false,\n      expanded: false,\n    });\n\n    expect(subNestedView!.props!.bookmark).toEqual({\n      ref: 3,\n      parent: 2,\n      title: 'sub chapter',\n      fit: false,\n      expanded: false,\n    });\n  });\n\n  test('should resolve bookmark object prop', () => {\n    const result = resolveBookmarks({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {\n            bookmark: {\n              title: 'page',\n              top: 20,\n              left: 10,\n              zoom: 5,\n              expanded: true,\n            },\n          },\n          children: [{ type: 'VIEW', props: {} }],\n        },\n      ],\n    });\n\n    expect(result.children[0].props.bookmark).toEqual({\n      ref: 0,\n      title: 'page',\n      expanded: true,\n      top: 20,\n      left: 10,\n      zoom: 5,\n    });\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/steps/resolveInhritance.test.ts",
    "content": "/* eslint-disable vitest/expect-expect */\n\nimport { describe, expect, test } from 'vitest';\n\nimport resolveInheritance from '../../src/steps/resolveInheritance';\n\ndescribe('layout resolveInheritance', () => {\n  const shouldInherit = (prop) => () => {\n    const result = resolveInheritance({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: { [prop]: 'value' },\n          children: [{ type: 'VIEW', props: {}, style: {} }],\n        },\n      ],\n    });\n    const view = result.children[0].children[0];\n\n    expect(view.style).toHaveProperty(prop, 'value');\n  };\n\n  test('Should not inherit invalid property', () => {\n    const result = resolveInheritance({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: { backgroundColor: 'value' },\n          children: [{ type: 'VIEW', props: {}, style: {} }],\n        },\n      ],\n    });\n    const view = result.children[0].children[0];\n\n    expect(view.style).not.toHaveProperty('backgroundColor');\n  });\n\n  test('Should not override descendents styles', () => {\n    const result = resolveInheritance({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: { color: 'red' },\n          children: [{ type: 'VIEW', props: {}, style: { color: 'green' } }],\n        },\n      ],\n    });\n    const view = result.children[0].children[0];\n\n    expect(view.style).toHaveProperty('color', 'green');\n  });\n\n  test('Should only inherit node descendents', () => {\n    const result = resolveInheritance({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          style: {},\n          props: {},\n          children: [\n            { type: 'VIEW', props: {}, style: {} },\n            {\n              type: 'VIEW',\n              props: {},\n              style: { color: 'green' },\n              children: [{ type: 'VIEW', props: {}, style: {} }],\n            },\n          ],\n        },\n      ],\n    });\n\n    const view1 = result.children[0].children[0];\n    const view2 = result.children[0].children[1];\n    const subview = view2.children[0];\n\n    expect(view1.style).not.toHaveProperty('color');\n    expect(view2.style).toHaveProperty('color', 'green');\n    expect(subview.style).toHaveProperty('color', 'green');\n  });\n\n  test('Should inherit multiple textDecoration properly', () => {\n    const result = resolveInheritance({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: {},\n          children: [\n            {\n              type: 'TEXT',\n              props: {},\n              style: { textDecoration: 'line-through' },\n              children: [\n                {\n                  type: 'TEXT',\n                  props: {},\n                  style: { textDecoration: 'underline' },\n                },\n              ],\n            },\n          ],\n        },\n      ],\n    });\n\n    const text1 = result.children[0].children[0];\n    const text2 = text1.children[0];\n\n    expect(text1.style).toHaveProperty('textDecoration', 'line-through');\n    expect(text2.style).toHaveProperty(\n      'textDecoration',\n      'line-through underline',\n    );\n  });\n\n  test('Should inherit background color for text childs', () => {\n    const result = resolveInheritance({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: {},\n          children: [\n            {\n              type: 'TEXT',\n              props: {},\n              style: { backgroundColor: 'red' },\n              children: [\n                {\n                  type: 'TEXT',\n                  props: {},\n                  style: {},\n                  children: [{ type: 'TEXT_INSTANCE', value: 'Hello' }],\n                },\n              ],\n            },\n          ],\n        },\n      ],\n    });\n\n    const text1 = result.children[0].children[0];\n    const text2 = text1.children[0];\n\n    expect(text1.style).toHaveProperty('backgroundColor', 'red');\n    expect(text2.style).toHaveProperty('backgroundColor', 'red');\n  });\n\n  test('Should inherit color value', shouldInherit('color'));\n  test('Should inherit fontFamily value', shouldInherit('fontFamily'));\n  test('Should inherit fontSize value', shouldInherit('fontSize'));\n  test('Should inherit fontStyle value', shouldInherit('fontStyle'));\n  test('Should inherit fontWeight value', shouldInherit('fontWeight'));\n  test('Should inherit letterSpacing value', shouldInherit('letterSpacing'));\n  test('Should inherit opacity value', shouldInherit('opacity'));\n  test('Should inherit textDecoration value', shouldInherit('textDecoration'));\n  test('Should inherit textTransform value', shouldInherit('textTransform'));\n  test('Should inherit lineHeight value', shouldInherit('lineHeight'));\n  test('Should inherit textAlign value', shouldInherit('textAlign'));\n  test('Should inherit visibility value', shouldInherit('visibility'));\n  test('Should inherit wordSpacing value', shouldInherit('wordSpacing'));\n});\n"
  },
  {
    "path": "packages/layout/tests/steps/resolveLinkSubstitution.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolveLinkSubstitution from '../../src/steps/resolveLinkSubstitution';\n\ndescribe('layout resolve link substitution', () => {\n  test('Should leave link with text children as it is', () => {\n    const result = resolveLinkSubstitution({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          children: [\n            {\n              type: 'LINK',\n              props: { src: 'url' },\n              children: [\n                {\n                  type: 'TEXT',\n                  props: {},\n                },\n              ],\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should replace link with only one text instance as children', () => {\n    const result = resolveLinkSubstitution({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          children: [\n            {\n              type: 'LINK',\n              props: { src: 'url' },\n              children: [{ type: 'TEXT_INSTANCE', value: '1' }],\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should replace link with only many text instances as children', () => {\n    const result = resolveLinkSubstitution({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          children: [\n            {\n              type: 'LINK',\n              props: { src: 'url' },\n              children: [\n                { type: 'TEXT_INSTANCE', value: '1' },\n                { type: 'TEXT_INSTANCE', value: '2' },\n                { type: 'TEXT_INSTANCE', value: '3' },\n                { type: 'TEXT_INSTANCE', value: '4' },\n              ],\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should replace link with render prop', () => {\n    const result = resolveLinkSubstitution({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          children: [\n            {\n              type: 'LINK',\n              props: {\n                render: () => null,\n              },\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/steps/resolveOrigins.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolveOrigins from '../../src/steps/resolveOrigins';\n\ndescribe('layout resolveOrigins', () => {\n  test('should not resolve for node without box', () => {\n    const result = resolveOrigins({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          style: {},\n          props: {},\n          children: [{ type: 'VIEW', props: {}, style: {} }],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('should resolve centered origin by default', () => {\n    const result = resolveOrigins({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          style: {},\n          props: {},\n          box: {\n            top: 50,\n            left: 100,\n            bottom: 0,\n            right: 0,\n            width: 300,\n            height: 400,\n          },\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('should resolve origin adjusted by fixed values', () => {\n    const result = resolveOrigins({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          box: {\n            top: 50,\n            left: 100,\n            bottom: 0,\n            right: 0,\n            width: 300,\n            height: 400,\n          },\n          style: { transformOriginX: 100, transformOriginY: 50 },\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('should resolve origin adjusted by percent values', () => {\n    const result = resolveOrigins({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          box: {\n            top: 50,\n            left: 100,\n            bottom: 0,\n            right: 0,\n            width: 300,\n            height: 400,\n          },\n          style: { transformOriginX: '20%', transformOriginY: '70%' },\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('should resolve origins for nested elements', () => {\n    const result = resolveOrigins({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          style: {},\n          props: {},\n          box: {\n            top: 50,\n            left: 100,\n            bottom: 0,\n            right: 0,\n            width: 300,\n            height: 400,\n          },\n          children: [\n            {\n              type: 'VIEW',\n              style: {},\n              props: {},\n              box: {\n                top: 0,\n                left: 10,\n                bottom: 0,\n                right: 0,\n                width: 50,\n                height: 80,\n              },\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/steps/resolvePagePaddings.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolvePagePaddings from '../../src/steps/resolvePagePaddings';\n\ndescribe('layout resolvePagePaddings', () => {\n  test('Should keep other styles untouched', () => {\n    const result = resolvePagePaddings({\n      type: 'DOCUMENT',\n      props: {},\n      children: [{ type: 'PAGE', props: {}, style: { color: 'red' } }],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should leave numeric paddingTop as it is', () => {\n    const result = resolvePagePaddings({\n      type: 'DOCUMENT',\n      props: {},\n      children: [{ type: 'PAGE', props: {}, style: { paddingTop: 50 } }],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should leave numeric paddingRight as it is', () => {\n    const result = resolvePagePaddings({\n      type: 'DOCUMENT',\n      props: {},\n      children: [{ type: 'PAGE', props: {}, style: { paddingRight: 50 } }],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should leave numeric paddingBottom as it is', () => {\n    const result = resolvePagePaddings({\n      type: 'DOCUMENT',\n      props: {},\n      children: [{ type: 'PAGE', props: {}, style: { paddingBottom: 50 } }],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should leave numeric paddingLeft as it is', () => {\n    const result = resolvePagePaddings({\n      type: 'DOCUMENT',\n      props: {},\n      children: [{ type: 'PAGE', props: {}, style: { paddingLeft: 50 } }],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve percent paddingTop', () => {\n    const result = resolvePagePaddings({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: { paddingTop: '10%' as any, width: 100, height: 200 },\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve percent paddingRight', () => {\n    const result = resolvePagePaddings({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: { paddingRight: '10%' as any, width: 100, height: 200 },\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve percent paddingBottom', () => {\n    const result = resolvePagePaddings({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: { paddingBottom: '10%' as any, width: 100, height: 200 },\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve percent paddingLeft', () => {\n    const result = resolvePagePaddings({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: { paddingLeft: '10%' as any, width: 100, height: 200 },\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve several pages', () => {\n    const result = resolvePagePaddings({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: { paddingTop: 10, width: 100, height: 200 },\n        },\n        {\n          type: 'PAGE',\n          props: {},\n          style: { paddingBottom: '10%' as any, width: 100, height: 200 },\n        },\n        {\n          type: 'PAGE',\n          props: {},\n          style: {\n            paddingRight: 10,\n            paddingLeft: '10%' as any,\n            width: 100,\n            height: 200,\n          },\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/steps/resolvePageSizes.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolvePageSizes from '../../src/steps/resolvePageSizes';\n\ndescribe('layout resolvePageSizes', () => {\n  test('Should default to A4', () => {\n    const result = resolvePageSizes({\n      type: 'DOCUMENT',\n      props: {},\n      children: [{ type: 'PAGE', props: {} }],\n    });\n\n    expect(result.children[0].style).toHaveProperty('width', 595.28);\n    expect(result.children[0].style).toHaveProperty('height', 841.89);\n  });\n\n  test('Should default to portrait A4', () => {\n    const result = resolvePageSizes({\n      type: 'DOCUMENT',\n      props: {},\n      children: [{ type: 'PAGE', props: { orientation: 'portrait' } }],\n    });\n\n    expect(result.children[0].style).toHaveProperty('width', 595.28);\n    expect(result.children[0].style).toHaveProperty('height', 841.89);\n  });\n\n  test('Should accept size string', () => {\n    const result = resolvePageSizes({\n      type: 'DOCUMENT',\n      props: {},\n      children: [{ type: 'PAGE', props: { size: 'A2' } }],\n    });\n\n    expect(result.children[0].style).toHaveProperty('width', 1190.55);\n    expect(result.children[0].style).toHaveProperty('height', 1683.78);\n  });\n\n  test('Should accept size string in landscape mode', () => {\n    const result = resolvePageSizes({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        { type: 'PAGE', props: { size: 'A2', orientation: 'landscape' } },\n      ],\n    });\n\n    expect(result.children[0].style).toHaveProperty('width', 1683.78);\n    expect(result.children[0].style).toHaveProperty('height', 1190.55);\n  });\n\n  test('Should accept size array', () => {\n    const result = resolvePageSizes({\n      type: 'DOCUMENT',\n      props: {},\n      children: [{ type: 'PAGE', props: { size: [100, 200] } }],\n    });\n\n    expect(result.children[0].style).toHaveProperty('width', 100);\n    expect(result.children[0].style).toHaveProperty('height', 200);\n  });\n\n  test('Should accept size array in landscape mode', () => {\n    const result = resolvePageSizes({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: { size: [100, 200], orientation: 'landscape' },\n        },\n      ],\n    });\n\n    expect(result.children[0].style).toHaveProperty('width', 200);\n    expect(result.children[0].style).toHaveProperty('height', 100);\n  });\n\n  test('Should accept size object', () => {\n    const result = resolvePageSizes({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        { type: 'PAGE', props: { size: { width: 100, height: 200 } } },\n      ],\n    });\n\n    expect(result.children[0].style).toHaveProperty('width', 100);\n    expect(result.children[0].style).toHaveProperty('height', 200);\n  });\n\n  test('Should accept size object in landscape mode', () => {\n    const result = resolvePageSizes({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {\n            size: { width: 100, height: 200 },\n            orientation: 'landscape',\n          },\n        },\n      ],\n    });\n\n    expect(result.children[0].style).toHaveProperty('width', 200);\n    expect(result.children[0].style).toHaveProperty('height', 100);\n  });\n\n  test('Should accept size number', () => {\n    const result = resolvePageSizes({\n      type: 'DOCUMENT',\n      props: {},\n      children: [{ type: 'PAGE', props: { size: 100 } }],\n    });\n\n    expect(result.children[0].style).toHaveProperty('width', 100);\n    expect(result.children[0].style).toHaveProperty('height', 100);\n  });\n\n  test('Should accept size number in landscape mode', () => {\n    const result = resolvePageSizes({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        { type: 'PAGE', props: { size: 100, orientation: 'landscape' } },\n      ],\n    });\n\n    expect(result.children[0].style).toHaveProperty('width', 100);\n    expect(result.children[0].style).toHaveProperty('height', 100);\n  });\n\n  test('Should resolve several pages', () => {\n    const result = resolvePageSizes({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        { type: 'PAGE', props: {} },\n        { type: 'PAGE', props: { size: 'A5' } },\n        { type: 'PAGE', props: { size: { width: 100, height: 200 } } },\n      ],\n    });\n\n    expect(result.children[0].style).toHaveProperty('width', 595.28);\n    expect(result.children[0].style).toHaveProperty('height', 841.89);\n    expect(result.children[1].style).toHaveProperty('width', 419.53);\n    expect(result.children[1].style).toHaveProperty('height', 595.28);\n    expect(result.children[2].style).toHaveProperty('width', 100);\n    expect(result.children[2].style).toHaveProperty('height', 200);\n  });\n\n  test('Should flatten page styles', () => {\n    const result = resolvePageSizes({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: { size: 'A4' },\n          style: [{ backgroundColor: 'red' }],\n        },\n      ],\n    });\n\n    expect(result.children[0].style).toHaveProperty('width', 595.28);\n    expect(result.children[0].style).toHaveProperty('height', 841.89);\n    expect(result.children[0].style).toHaveProperty('backgroundColor', 'red');\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/steps/resolvePagination.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport FontStore from '@react-pdf/font';\n\nimport { loadYoga } from '../../src/yoga';\nimport resolvePagination from '../../src/steps/resolvePagination';\nimport resolveDimensions from '../../src/steps/resolveDimensions';\nimport { SafeDocumentNode } from '../../src/types';\n\nconst fontStore = new FontStore();\n\n// dimensions is required by pagination step and them are calculated here\nconst calcLayout = (node: SafeDocumentNode) =>\n  resolvePagination(resolveDimensions(node, fontStore), fontStore);\n\ndescribe('pagination step', () => {\n  test('should stretch absolute block to full page size', async () => {\n    const yoga = await loadYoga();\n\n    const layout = calcLayout({\n      type: 'DOCUMENT',\n      yoga,\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: {\n            width: 100,\n            height: 100,\n          },\n          children: [\n            {\n              type: 'VIEW',\n              style: {\n                position: 'absolute',\n                width: '50%',\n                top: 0,\n                bottom: 0,\n              },\n              props: {},\n              children: [],\n            },\n            {\n              type: 'TEXT',\n              style: {},\n              props: {},\n              children: [\n                {\n                  type: 'TEXT_INSTANCE',\n                  value: 'hello world',\n                },\n              ],\n            },\n          ],\n        },\n      ],\n    });\n\n    const page = layout.children[0];\n    const view = layout.children[0]!.children![0];\n\n    expect(page.box!.height).toBe(100);\n    expect(view.box!.height).toBe(100);\n  });\n\n  test('should force new height for split nodes', async () => {\n    const yoga = await loadYoga();\n\n    const layout = calcLayout({\n      type: 'DOCUMENT',\n      yoga,\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: {\n            width: 15,\n            height: 60,\n          },\n\n          children: [\n            {\n              type: 'VIEW',\n              style: {},\n              props: {},\n              children: [\n                {\n                  type: 'TEXT',\n                  style: {},\n                  props: {},\n                  children: [\n                    {\n                      type: 'TEXT_INSTANCE',\n                      value: 'a a a a',\n                    },\n                  ],\n                },\n              ],\n            },\n          ],\n        },\n      ],\n    });\n\n    const view1 = layout.children[0].children![0];\n    const view2 = layout.children[1].children![0];\n\n    expect(view1.box!.height).toBe(60);\n    expect(view2.box!.height).not.toBe(60);\n  });\n\n  test('should force new height for split nodes with fixed height', async () => {\n    const yoga = await loadYoga();\n\n    const layout = calcLayout({\n      type: 'DOCUMENT',\n      yoga,\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: {\n            width: 5,\n            height: 60,\n          },\n\n          children: [\n            {\n              type: 'VIEW',\n              style: { height: 130 },\n              props: {},\n              children: [],\n            },\n          ],\n        },\n      ],\n    });\n\n    const view1 = layout.children[0].children![0];\n    const view2 = layout.children[1].children![0];\n    const view3 = layout.children[2].children![0];\n\n    expect(view1.box!.height).toBe(60);\n    expect(view2.box!.height).toBe(60);\n    expect(view3.box!.height).toBe(10);\n  });\n\n  test('should not wrap page with false wrap prop', async () => {\n    const yoga = await loadYoga();\n\n    const layout = calcLayout({\n      type: 'DOCUMENT',\n      yoga,\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          style: {\n            width: 5,\n            height: 60,\n          },\n          props: {\n            wrap: false,\n          },\n          children: [\n            {\n              type: 'VIEW',\n              style: { height: 130 },\n              props: {},\n              children: [],\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(layout.children.length).toBe(1);\n  });\n\n  test('should break on a container whose children can not fit on a page', async () => {\n    const yoga = await loadYoga();\n\n    const layout = calcLayout({\n      type: 'DOCUMENT',\n      yoga,\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: {\n            width: 5,\n            height: 60,\n          },\n\n          children: [\n            {\n              type: 'VIEW',\n              style: {\n                width: 5,\n                height: 40,\n              },\n              props: {},\n              children: [],\n            },\n            {\n              type: 'VIEW',\n              style: {\n                width: 5,\n              },\n              props: {},\n              children: [\n                {\n                  type: 'VIEW',\n                  style: {\n                    height: 40,\n                  },\n                  props: {\n                    wrap: false,\n                  },\n                  children: [],\n                },\n              ],\n            },\n          ],\n        },\n      ],\n    });\n\n    const page1 = layout.children[0];\n    const page2 = layout.children[1];\n\n    // Only the first view is displayed on the first page\n    expect(page1.children!.length).toBe(1);\n    // The second page displays the second wrapper, with its full height\n    expect(page2.children!.length).toBe(1);\n    expect(page2.children![0].box!.height).toBe(40);\n  });\n\n  test('should not infinitely loop when splitting pages', async () => {\n    const yoga = await loadYoga();\n\n    calcLayout({\n      type: 'DOCUMENT',\n      yoga,\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: {\n            height: 400,\n          },\n          children: [\n            {\n              type: 'VIEW',\n              style: { height: 401 },\n              props: {},\n              children: [\n                {\n                  type: 'VIEW',\n                  style: {\n                    height: 400,\n                  },\n                  props: { wrap: false, break: true },\n                },\n              ],\n            },\n          ],\n        },\n      ],\n    });\n\n    // If calcLayout returns then we did not hit an infinite loop\n    expect(true).toBe(true);\n  });\n\n  test('should take padding into account when splitting pages', async () => {\n    const yoga = await loadYoga();\n\n    const root = {\n      type: 'DOCUMENT' as const,\n      yoga,\n      props: {},\n      style: {},\n      children: [\n        {\n          type: 'PAGE' as const,\n          box: {\n            width: 612,\n            height: 792,\n            top: 0,\n            left: 0,\n            right: 612,\n            bottom: 792,\n          },\n          style: {\n            paddingTop: 30,\n            width: 612,\n            height: 792,\n          },\n          props: { wrap: true },\n          children: [\n            {\n              type: 'VIEW' as const,\n              box: {\n                width: 612,\n                height: 761,\n                top: 0,\n                left: 0,\n                right: 612,\n                bottom: 761,\n              },\n              style: { height: 761, marginBottom: 24 },\n              props: { wrap: true, break: false },\n            },\n            {\n              type: 'VIEW' as const,\n              box: {\n                width: 612,\n                height: 80,\n                top: 761,\n                left: 0,\n                right: 612,\n                bottom: 841,\n              },\n              style: { height: 80 },\n              props: { wrap: true, break: false },\n            },\n          ],\n        },\n      ],\n    };\n\n    calcLayout(root);\n\n    // If calcLayout returns then we did not hit an infinite loop\n    expect(true).toBe(true);\n  });\n\n  test('should not duplicate bookmarks', async () => {\n    const yoga = await loadYoga();\n\n    const bookmarkChapter1 = {\n      ref: 0,\n      title: 'chapter 1',\n      fit: false,\n      expanded: false,\n    };\n    const bookmarkChapter2 = {\n      ref: 1,\n      title: 'chapter 2',\n      fit: false,\n      expanded: false,\n    };\n    const bookmarkSubChapter1 = {\n      ref: 2,\n      parent: 1,\n      title: 'sub chapter 2',\n      fit: false,\n      expanded: false,\n    };\n    const bookmarkSubChapter2 = {\n      ref: 3,\n      parent: 1,\n      title: 'sub chapter 2',\n      fit: false,\n      expanded: false,\n    };\n    const bookmarkSubChapter3 = {\n      ref: 4,\n      parent: 1,\n      title: 'sub chapter 2',\n      fit: false,\n      expanded: false,\n    };\n\n    const result = calcLayout({\n      type: 'DOCUMENT',\n      yoga,\n      props: {},\n      style: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: { width: 5, height: 60 },\n          children: [\n            {\n              type: 'VIEW',\n              props: { bookmark: bookmarkChapter1 },\n              style: {\n                height: 30,\n              },\n            },\n            {\n              type: 'VIEW',\n              props: { bookmark: bookmarkChapter2 },\n              style: {},\n              children: [\n                {\n                  type: 'VIEW',\n                  props: {\n                    bookmark: bookmarkSubChapter1,\n                  },\n                  style: {\n                    height: 20,\n                  },\n                  children: [],\n                },\n                {\n                  type: 'VIEW',\n                  props: {\n                    bookmark: bookmarkSubChapter2,\n                  },\n                  style: {\n                    height: 20,\n                  },\n                  children: [],\n                },\n                {\n                  type: 'VIEW',\n                  props: {\n                    bookmark: bookmarkSubChapter3,\n                  },\n                  style: {\n                    height: 20,\n                  },\n                  children: [],\n                },\n              ],\n            },\n          ],\n        },\n      ],\n    });\n\n    const page1 = result.children[0];\n    const page2 = result.children[1];\n    const chapter1 = page1.children![0];\n    const chapter2page1 = page1.children![1];\n    const chapter2page2 = page2.children![0];\n    const subChapter1 = chapter2page1.children![0];\n    const subChapter2page1 = chapter2page1.children![1];\n    const subChapter2page2 = chapter2page2.children![0];\n    const subChapter3 = chapter2page2.children![1];\n\n    expect(chapter1.props.bookmark).toEqual(bookmarkChapter1);\n\n    expect(chapter2page1.props.bookmark).toEqual(bookmarkChapter2);\n    expect(chapter2page2.props.bookmark).toEqual(null);\n\n    expect(subChapter1.props!.bookmark).toEqual(bookmarkSubChapter1);\n\n    expect(subChapter2page1.props!.bookmark).toEqual(bookmarkSubChapter2);\n    expect(subChapter2page2.props!.bookmark).toEqual(null);\n\n    expect(subChapter3.props!.bookmark).toEqual(bookmarkSubChapter3);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/steps/resolvePercentHeight.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolvePercentHeight from '../../src/steps/resolvePercentHeight';\n\ndescribe('layout resolvePercentHeight', () => {\n  test('Should keep empty document untouched', () => {\n    const result = resolvePercentHeight({\n      type: 'DOCUMENT',\n      props: {},\n      children: [],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should keep empty page untouched', () => {\n    const result = resolvePercentHeight({\n      type: 'DOCUMENT',\n      props: {},\n      children: [{ type: 'PAGE', props: {}, style: {}, children: [] }],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should not resolve children if page dont have height', () => {\n    const result = resolvePercentHeight({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: {},\n          children: [\n            { type: 'VIEW', props: {}, style: { width: '60%', height: '80%' } },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve children percent dimensions if page have height', () => {\n    const result = resolvePercentHeight({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: { height: 1000 },\n          children: [{ type: 'VIEW', props: {}, style: { height: '80%' } }],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/steps/resolveStyles.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolveStyles from '../../src/steps/resolveStyles';\n\ndescribe('layout resolveStyles', () => {\n  test('Should resolve page styles', () => {\n    const result = resolveStyles({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: {\n            paddingHorizontal: '10in',\n            paddingVertical: '10mm',\n            backgroundColor: 'red',\n            border: '1cm dotted green',\n          },\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve several pages styles', () => {\n    const result = resolveStyles({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: {\n            paddingHorizontal: '10in',\n            paddingVertical: '10mm',\n            borderTop: '4 solid #FF00000',\n          },\n        },\n        {\n          type: 'PAGE',\n          props: {},\n          style: {\n            backgroundColor: 'red',\n            border: '1cm dotted green',\n            fontWeight: 'bold',\n          },\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve page styles array', () => {\n    const result = resolveStyles({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: [\n            {\n              paddingHorizontal: '10in',\n              paddingVertical: '10mm',\n            },\n            {\n              backgroundColor: 'red',\n              border: '1cm dotted green',\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve nested node styles', () => {\n    const result = resolveStyles({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          box: {\n            top: 0,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            width: 100,\n            height: 200,\n          },\n          children: [\n            {\n              type: 'VIEW',\n              props: {},\n              style: {\n                paddingHorizontal: '10in',\n                paddingVertical: '10mm',\n                backgroundColor: 'red',\n                border: '1cm dotted green',\n              },\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve nested node styles media queries', () => {\n    const result = resolveStyles({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          box: {\n            top: 0,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            width: 100,\n            height: 200,\n          },\n          children: [\n            {\n              type: 'VIEW',\n              props: {},\n              style: {\n                backgroundColor: 'red',\n                '@media max-width: 500': {\n                  backgroundColor: 'green',\n                },\n              },\n            },\n            {\n              type: 'VIEW',\n              props: {},\n              style: {\n                backgroundColor: 'red',\n                '@media min-width: 500': {\n                  backgroundColor: 'green',\n                },\n              },\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve nested node styles media queries with page style', () => {\n    const result = resolveStyles({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          style: { width: 100, height: 200 },\n          children: [\n            {\n              type: 'VIEW',\n              props: {},\n              style: {\n                backgroundColor: 'red',\n                '@media max-width: 500': {\n                  backgroundColor: 'green',\n                },\n              },\n            },\n            {\n              type: 'VIEW',\n              props: {},\n              style: {\n                backgroundColor: 'red',\n                '@media min-width: 500': {\n                  backgroundColor: 'green',\n                },\n              },\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve nested node styles array', () => {\n    const result = resolveStyles({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          box: {\n            top: 0,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            width: 100,\n            height: 200,\n          },\n          children: [\n            {\n              type: 'VIEW',\n              props: {},\n              style: [\n                {\n                  paddingHorizontal: '10in',\n                  paddingVertical: '10mm',\n                },\n                {\n                  backgroundColor: 'red',\n                  border: '1cm dotted green',\n                },\n              ],\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should resolve default link styles', () => {\n    const result = resolveStyles({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          box: {\n            top: 0,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            width: 100,\n            height: 200,\n          },\n          children: [\n            {\n              type: 'LINK',\n              props: {},\n              style: {},\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should overide default link styles', () => {\n    const result = resolveStyles({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          box: {\n            top: 0,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            width: 100,\n            height: 200,\n          },\n          children: [\n            {\n              type: 'LINK',\n              props: {},\n              style: { color: 'wheat', textDecoration: 'none' },\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  test('Should overide default link styles with array', () => {\n    const result = resolveStyles({\n      type: 'DOCUMENT',\n      props: {},\n      children: [\n        {\n          type: 'PAGE',\n          props: {},\n          box: {\n            top: 0,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            width: 100,\n            height: 200,\n          },\n          children: [\n            {\n              type: 'LINK',\n              props: {},\n              style: [{ color: 'wheat', textDecoration: 'none' }],\n            },\n          ],\n        },\n      ],\n    });\n\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/steps/resolveSvg.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { resolveXLinks } from '../../src/steps/resolveSvg';\nimport { SafeSvgNode } from '../../src/types';\n\ndescribe('layout resolveSvg', () => {\n  describe('resolve xlinks', () => {\n    test('should replace xlinkHref with the correct node', () => {\n      const node: SafeSvgNode = {\n        type: 'SVG',\n        props: {},\n        style: {},\n        children: [\n          {\n            type: 'DEFS',\n            children: [\n              {\n                type: 'LINEAR_GRADIENT',\n                props: { id: 'lg1' },\n                children: [\n                  {\n                    type: 'STOP',\n                    props: { offset: 0, stopColor: 'red' },\n                  },\n                  {\n                    type: 'STOP',\n                    props: { offset: 100, stopColor: 'blue' },\n                  },\n                ],\n              },\n              {\n                type: 'LINEAR_GRADIENT',\n                props: { id: 'lg2', x1: 10, xlinkHref: '#lg1' },\n              },\n            ],\n          },\n        ],\n      };\n\n      const result = resolveXLinks(node);\n\n      expect(result.children![0].type).toBe('DEFS');\n      expect(result.children![0].children).toHaveLength(2);\n      expect(result.children![0].children![1].props).toEqual({\n        id: 'lg2',\n        x1: 10,\n      });\n      expect(result.children![0].children![1].children).toHaveLength(2);\n    });\n\n    test('should not replace xlinkHref if node does not exist', () => {\n      const node: SafeSvgNode = {\n        type: 'SVG',\n        props: {},\n        style: {},\n        children: [\n          {\n            type: 'DEFS',\n            children: [\n              {\n                type: 'LINEAR_GRADIENT',\n                props: { id: 'lg2', x1: 10, xlinkHref: '#lg1' },\n              },\n            ],\n          },\n        ],\n      };\n\n      const result = resolveXLinks(node);\n\n      expect(result.children![0].type).toBe('DEFS');\n      expect(result.children![0].children).toHaveLength(1);\n      expect(result.children![0].children![0].children).toBeFalsy();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/steps/resolveTextLayout.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport FontStore from '@react-pdf/font';\n\nimport { loadYoga } from '../../src/yoga';\n\nimport resolveTextLayout from '../../src/steps/resolveTextLayout';\nimport resolveDimensions from '../../src/steps/resolveDimensions';\nimport { SafeDocumentNode } from '../../src/types';\n\nconst fontStore = new FontStore();\n\nconst getRoot = async (\n  text = 'hello world',\n  styles = {},\n): Promise<SafeDocumentNode> => ({\n  type: 'DOCUMENT',\n  props: {},\n  yoga: await loadYoga(),\n  children: [\n    {\n      type: 'PAGE',\n      props: {},\n      style: {\n        width: 100,\n        height: 100,\n      },\n      children: [\n        {\n          type: 'TEXT',\n          style: styles,\n          props: {},\n          children: [\n            {\n              type: 'TEXT_INSTANCE',\n              value: text,\n            },\n          ],\n        },\n      ],\n    },\n  ],\n});\n\ndescribe('text layout step', () => {\n  const getText = (root) => root.children[0].children[0];\n\n  test('should calculate lines for text while resolve dimensions', async () => {\n    const root = await getRoot('text text text');\n    const dimensions = resolveDimensions(root, fontStore);\n\n    expect(getText(dimensions).lines).toBeDefined();\n  });\n\n  test('should calculate lines for text width defined height', async () => {\n    const root = await getRoot('text text text', { height: 50 });\n    const dimensions = resolveDimensions(root, fontStore);\n\n    expect(getText(dimensions).lines).not.toBeDefined();\n\n    const textLayout = resolveTextLayout(dimensions, fontStore);\n\n    expect(getText(textLayout).lines).toBeDefined();\n  });\n\n  test('should calculate lines for empty text', async () => {\n    const root = await getRoot('');\n    const dimensions = resolveDimensions(root, fontStore);\n\n    expect(getText(dimensions).lines).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/text/heightAtLineIndex.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport heightAtLineIndex from '../../src/text/heightAtLineIndex';\nimport { SafeTextNode } from '../../src/types';\n\nconst TEST_LINE = { box: { height: 25 } };\nconst TEST_LINES = Array(10).fill(TEST_LINE);\n\ndescribe('text heightAtLineIndex', () => {\n  test('Should return 0 if no lines present', () => {\n    const node: SafeTextNode = { type: 'TEXT', props: {}, style: {} };\n    const result = heightAtLineIndex(node, 5);\n\n    expect(result).toBe(0);\n  });\n\n  test('Should return correct height for first line', () => {\n    const node: SafeTextNode = {\n      type: 'TEXT',\n      props: {},\n      style: {},\n      lines: TEST_LINES,\n    };\n\n    const result = heightAtLineIndex(node, 1);\n\n    expect(result).toBe(25);\n  });\n\n  test('Should return correct height for intermediate line', () => {\n    const node: SafeTextNode = {\n      type: 'TEXT',\n      props: {},\n      style: {},\n      lines: TEST_LINES,\n    };\n\n    const result = heightAtLineIndex(node, 5);\n\n    expect(result).toBe(125);\n  });\n\n  test('Should return correct height for last line', () => {\n    const node: SafeTextNode = {\n      type: 'TEXT',\n      props: {},\n      style: {},\n      lines: TEST_LINES,\n    };\n\n    const result = heightAtLineIndex(node, 10);\n\n    expect(result).toBe(250);\n  });\n\n  test('Should return correct height for overflow line', () => {\n    const node: SafeTextNode = {\n      type: 'TEXT',\n      props: {},\n      style: {},\n      lines: TEST_LINES,\n    };\n\n    const result = heightAtLineIndex(node, 12);\n\n    expect(result).toBe(250);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/text/layoutText.test.ts",
    "content": "import { describe, expect, test, vi } from 'vitest';\n\nimport * as P from '@react-pdf/primitives';\nimport FontStore from '@react-pdf/font';\n\nimport layoutText from '../../src/text/layoutText';\nimport { SafeTextNode } from '../../src/types';\n\nconst TEXT =\n  'Life can be much broader once you discover one simple fact: Everything around you that you call life was made up by people that were no smarter than you';\n\nconst fontStore = new FontStore();\n\nconst createTextNode = (\n  value: string,\n  style = {},\n  props = {},\n): SafeTextNode => ({\n  style,\n  props,\n  type: P.Text,\n  children: [{ type: P.TextInstance, value }],\n});\n\ndescribe('text layoutText', () => {\n  test('Should render empty text', async () => {\n    const node = createTextNode('');\n    const lines = layoutText(node, 1500, 200, fontStore);\n\n    expect(lines).toHaveLength(0);\n  });\n\n  test('Should render aligned left text by default', async () => {\n    const node = createTextNode(TEXT);\n    const lines = layoutText(node, 1500, 30, fontStore);\n\n    expect(lines[0].box!.x).toBe(0);\n  });\n\n  test('Should render aligned left text', async () => {\n    const node = createTextNode(TEXT, { textAlign: 'left' });\n    const lines = layoutText(node, 1500, 30, fontStore);\n\n    expect(lines[0].box!.x).toBe(0);\n  });\n\n  test('Should render aligned right text', async () => {\n    const node = createTextNode(TEXT, { textAlign: 'right' });\n    const lines = layoutText(node, 1500, 30, fontStore);\n    const textWidth = lines[0].runs[0].xAdvance!;\n\n    expect(lines[0].box!.x).toBe(1500 - textWidth);\n  });\n\n  test('Should render aligned center text', async () => {\n    const node = createTextNode(TEXT, { textAlign: 'center' });\n    const lines = layoutText(node, 1500, 30, fontStore);\n    const textWidth = lines[0].runs[0].xAdvance!;\n\n    expect(lines[0].box!.x).toBe((1500 - textWidth) / 2);\n  });\n\n  test('Should render single line justified text aligned to the left', async () => {\n    const node = createTextNode(TEXT, { textAlign: 'justify' });\n    const lines = layoutText(node, 1500, 30, fontStore);\n\n    expect(lines[0].box!.x).toBe(0);\n  });\n\n  test('Should render multiline justified text correctly aligned', async () => {\n    const containerWidth = 800;\n    const node = createTextNode(TEXT, { textAlign: 'justify' });\n    const lines = layoutText(node, containerWidth, 100, fontStore);\n\n    const { positions } = lines[0].runs[0];\n    const spaceWidth = positions![positions!.length - 1].xAdvance;\n\n    // First line justified. Last line aligned to the left\n    expect(lines[0].box!.width).toBe(containerWidth + spaceWidth);\n    expect(lines[1].box!.width).not.toBe(containerWidth + spaceWidth);\n  });\n\n  test('Should render maxLines', async () => {\n    const node = createTextNode(TEXT, { maxLines: 2 });\n    const lines = layoutText(node, 300, 100, fontStore);\n\n    expect(lines.length).toEqual(2);\n  });\n\n  test('should allow hyphenation callback to be overriden', async () => {\n    const text = 'reallylongtext';\n    const hyphens = ['really­', 'long', 'text'];\n    const hyphenationCallback = vi.fn().mockReturnValue(hyphens);\n\n    const node = createTextNode(text, {}, { hyphenationCallback });\n    const lines = layoutText(node, 50, 100, fontStore);\n\n    expect(lines[0].string).toEqual('really-');\n    expect(lines[1].string).toEqual('long-');\n    expect(lines[2].string).toEqual('text');\n    expect(hyphenationCallback).toHaveBeenCalledWith(\n      'reallylongtext',\n      expect.any(Function),\n    );\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/text/lineIndexAtHeight.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport lineIndexAtHeight from '../../src/text/lineIndexAtHeight';\nimport { SafeTextNode } from '../../src/types';\n\nconst TEST_LINE = { box: { height: 25 } };\nconst TEST_LINES = Array(10).fill(TEST_LINE);\n\ndescribe('text lineIndexAtHeight', () => {\n  test('Should return 0 if no lines present', () => {\n    const node: SafeTextNode = { type: 'TEXT', props: {}, style: {} };\n    const result = lineIndexAtHeight(node, 5);\n\n    expect(result).toBe(0);\n  });\n\n  test('Should return 0 for height lower than first line', () => {\n    const node: SafeTextNode = {\n      type: 'TEXT',\n      props: {},\n      style: {},\n      lines: TEST_LINES,\n    };\n\n    const result = lineIndexAtHeight(node, 10);\n\n    expect(result).toBe(0);\n  });\n\n  test('Should return 1 for height higher than first line', () => {\n    const node: SafeTextNode = {\n      type: 'TEXT',\n      props: {},\n      style: {},\n      lines: TEST_LINES,\n    };\n\n    const result = lineIndexAtHeight(node, 30);\n\n    expect(result).toBe(1);\n  });\n\n  test('Should return correct line index for intermediate line', () => {\n    const node: SafeTextNode = {\n      type: 'TEXT',\n      props: {},\n      style: {},\n      lines: TEST_LINES,\n    };\n\n    const result = lineIndexAtHeight(node, 85);\n\n    expect(result).toBe(3);\n  });\n\n  test('Should return penultimate line index for height lower than last line', () => {\n    const node: SafeTextNode = {\n      type: 'TEXT',\n      props: {},\n      style: {},\n      lines: TEST_LINES,\n    };\n\n    const result = lineIndexAtHeight(node, 230);\n\n    expect(result).toBe(9);\n  });\n\n  test('Should return correct line index for last line', () => {\n    const node: SafeTextNode = {\n      type: 'TEXT',\n      props: {},\n      style: {},\n      lines: TEST_LINES,\n    };\n\n    const result = lineIndexAtHeight(node, 250);\n\n    expect(result).toBe(10);\n  });\n\n  test('Should return correct line index for height higher than last line', () => {\n    const node: SafeTextNode = {\n      type: 'TEXT',\n      props: {},\n      style: {},\n      lines: TEST_LINES,\n    };\n\n    const result = lineIndexAtHeight(node, 300);\n\n    expect(result).toBe(10);\n  });\n});\n"
  },
  {
    "path": "packages/layout/tests/text/measureText.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport * as P from '@react-pdf/primitives';\nimport FontStore from '@react-pdf/font';\nimport { SafeTextNode } from '../../src';\nimport measureText from '../../src/text/measureText';\n\nconst TEXT =\n  'Life can be much broader once you discover one simple fact: Everything around you that you call life was made up by people that were no smarter than you';\n\nconst fontStore = new FontStore();\n\nconst createTextNode = (\n  value: string,\n  style = {},\n  props = {},\n): SafeTextNode => ({\n  style,\n  props,\n  type: P.Text,\n  children: [{ type: P.TextInstance, value }],\n});\n\ndescribe('measureText', () => {\n  describe('widthMode Exactly', () => {\n    test('should return width and height', async () => {\n      const page = {\n        type: 'PAGE' as const,\n        props: {},\n        style: {},\n      };\n      const node = createTextNode(TEXT);\n      const measureFunc = measureText(page, node, fontStore);\n\n      const dimensions = measureFunc(100, 1 /*Yoga.MeasureMode.Exactly*/, 50);\n\n      expect(dimensions.width).toStrictEqual(100);\n      expect(dimensions.height).toBe(39.599999999999994);\n    });\n  });\n\n  describe('widthMode AtMost', () => {\n    test('should return width and height', async () => {\n      const page = {\n        type: 'PAGE' as const,\n        props: {},\n        style: {},\n      };\n      const node = createTextNode(TEXT);\n      const measureFunc = measureText(page, node, fontStore);\n\n      const dimensions = measureFunc(100, 2 /*Yoga.MeasureMode.AtMost*/, 50);\n\n      expect(dimensions.width).toStrictEqual(100);\n      expect(dimensions.height).toBe(39.599999999999994);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/layout/tsconfig.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"compilerOptions\": {\n    \"outDir\": \"lib\",\n    \"declaration\": true,\n    \"declarationDir\": \"lib/types\",\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2022\", \"DOM\"],\n    \"moduleResolution\": \"Node\",\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": false,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"types\": [\"vitest/globals\"],\n  },\n  \"include\": [\"src\", \"globals.d.ts\"],\n}\n"
  },
  {
    "path": "packages/pdfkit/.gitignore",
    "content": "src/font/data/*.json\nlib\nnode_modules\n"
  },
  {
    "path": "packages/pdfkit/.prettierrc",
    "content": "{\n  \"singleQuote\": true,\n  \"trailingComma\": \"none\"\n}\n"
  },
  {
    "path": "packages/pdfkit/CHANGELOG.md",
    "content": "# @react-pdf/pdfkit\n\n## 4.1.0\n\n### Minor Changes\n\n- [#3188](https://github.com/diegomura/react-pdf/pull/3188) [`f034491b`](https://github.com/diegomura/react-pdf/commit/f034491b1f77ce6f18a5db88e70b10b9c502ca35) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - Fix and rework the hyphenation algorithm, and allow custom word hyphenation algorithms to specify whether a hyphen should be inserted in case the word is wrapped.\n\n  **Caution**: If you have been using a custom hyphenation callback - which hasn't been working properly since at least version 2.0.21 - then you will need to change your implementation to leave a soft hyphen character (`'\\u00AD'`) at the end of syllables where you want react-pdf to insert a hyphen when wrapping lines. Syllables without a final soft hyphen character will still be able to break, but will not produce a hyphen character at the end of the line.\n\n  This allows you to break correctly on normal hyphens or other special characters in your text. For example, to use the default english-language syllable breaking built into react-pdf, but also break after hyphens naturally occurring in your text (such as is often present in hyperlinks), you could use the following hyphenation callback:\n\n  ```js\n  import { Font } from \"@react-pdf/renderer\";\n\n  Font.registerHyphenationCallback((word, originalHyphenationCallback) => {\n    return originalHyphenationCallback(word).flatMap((w) => w.split(/(?<=-)/));\n  });\n  ```\n\n  (`flatMap` requires at least ES2019)\n\n## 4.0.4\n\n### Patch Changes\n\n- [#2715](https://github.com/diegomura/react-pdf/pull/2715) [`5cbe2fb0`](https://github.com/diegomura/react-pdf/commit/5cbe2fb0bde45c44eb68dde01f20feea245908c6) Thanks [@mgmolisani](https://github.com/mgmolisani)! - Add back functionality for bookmark props\n\n## 4.0.3\n\n### Patch Changes\n\n- [#3118](https://github.com/diegomura/react-pdf/pull/3118) [`106699e8`](https://github.com/diegomura/react-pdf/commit/106699e850dad2285e6999d59975111f217e8a81) Thanks [@diegomura](https://github.com/diegomura)! - feat: compile nullish coalescing operator\n\n## 4.0.2\n\n### Patch Changes\n\n- [#3065](https://github.com/diegomura/react-pdf/pull/3065) [`226467e3`](https://github.com/diegomura/react-pdf/commit/226467e39443d3690b8f8c3298aa8278b43fbfa6) Thanks [@diegomura](https://github.com/diegomura)! - refactor: partially unify pdfkit\n\n## 4.0.1\n\n### Patch Changes\n\n- [#3061](https://github.com/diegomura/react-pdf/pull/3061) [`6d875056`](https://github.com/diegomura/react-pdf/commit/6d875056a07e8479ef695416c1fed575491b6ff1) Thanks [@diegomura](https://github.com/diegomura)! - feat: pdfkit upstream changes\n\n- [#3060](https://github.com/diegomura/react-pdf/pull/3060) [`49daae8f`](https://github.com/diegomura/react-pdf/commit/49daae8fdfba672a3e828847232ee9b70bb51711) Thanks [@diegomura](https://github.com/diegomura)! - feat: enable pdfkit markings mixin\n\n- [#3062](https://github.com/diegomura/react-pdf/pull/3062) [`5cc47319`](https://github.com/diegomura/react-pdf/commit/5cc47319bb428f6d4bcad21cd6dba9afca5cdc17) Thanks [@diegomura](https://github.com/diegomura)! - refactor: unify pdfkit image mixin\n\n- [#3059](https://github.com/diegomura/react-pdf/pull/3059) [`aa0f6725`](https://github.com/diegomura/react-pdf/commit/aa0f672589683a66abc79f838291996ae9aaffb8) Thanks [@diegomura](https://github.com/diegomura)! - feat: add pdfkit subsets mixin\n\n## 4.0.0\n\n### Major Changes\n\n- [#2871](https://github.com/diegomura/react-pdf/pull/2871) [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119) Thanks [@diegomura](https://github.com/diegomura)! - feat!: drop cjs support\n\n### Patch Changes\n\n- [#2877](https://github.com/diegomura/react-pdf/pull/2877) [`fdcef566`](https://github.com/diegomura/react-pdf/commit/fdcef5666e4eeed542b625d394cdfe60d6346600) Thanks [@Friendseeker](https://github.com/Friendseeker)! - chore: bump jay-peg\n\n- Updated dependencies [[`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119)]:\n  - @react-pdf/png-js@3.0.0\n\n## 3.2.0\n\n### Minor Changes\n\n- [#2771](https://github.com/diegomura/react-pdf/pull/2771) [`8e6a832`](https://github.com/diegomura/react-pdf/commit/8e6a8320f86354aff950c296a96bc41a33e9dab2) Thanks [@nikischin](https://github.com/nikischin)! - fix: fix dpi\n\n## 3.1.10\n\n### Patch Changes\n\n- [#2721](https://github.com/diegomura/react-pdf/pull/2721) [`713690c`](https://github.com/diegomura/react-pdf/commit/713690cca266116bb7e80d13cf84bc843f9dfd52) Thanks [@cfhull](https://github.com/cfhull)! - fix: support values of `0` in stroke-dasharray\n\n## 3.1.9\n\n### Patch Changes\n\n- [#2689](https://github.com/diegomura/react-pdf/pull/2689) [`e2d21a4`](https://github.com/diegomura/react-pdf/commit/e2d21a433b881bb96ea4d0b3a01a7297dd1f4a94) Thanks [@joelybahh](https://github.com/joelybahh)! - fix: jpeg precision metadata\n\n## 3.1.8\n\n### Patch Changes\n\n- [#2687](https://github.com/diegomura/react-pdf/pull/2687) [`68bfc57`](https://github.com/diegomura/react-pdf/commit/68bfc575adfb95302e320019715d1eec5398259f) Thanks [@diegomura](https://github.com/diegomura)! - chore: bump jay-peg\n\n## 3.1.7\n\n### Patch Changes\n\n- [#2635](https://github.com/diegomura/react-pdf/pull/2635) [`da10a9b`](https://github.com/diegomura/react-pdf/commit/da10a9bb43dc4c4765687850444a24cbc4eb402a) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - fix: bump jay-peg dependency to fix CJS module resolution error\n\n## 3.1.6\n\n### Patch Changes\n\n- [#2610](https://github.com/diegomura/react-pdf/pull/2610) [`dc54c13`](https://github.com/diegomura/react-pdf/commit/dc54c13625510482e93f80ed5cc07cf3a6a6d34c) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - fix: fix CJS compatibility\n\n## 3.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71)]:\n  - @react-pdf/png-js@2.3.1\n\n## 3.1.4\n\n### Patch Changes\n\n- [#2600](https://github.com/diegomura/react-pdf/pull/2600) [`8350154`](https://github.com/diegomura/react-pdf/commit/83501541e3a050021e18e112bb472b2dabc142a7) Thanks [@diegomura](https://github.com/diegomura)! - feat: bidi support\n\n## 3.1.3\n\n### Patch Changes\n\n- [`0590324`](https://github.com/diegomura/react-pdf/commit/0590324d7a6d75c0a49520b3f99cfb6594239390) Thanks [@diegomura](https://github.com/diegomura)! - fix: replace jpeg-exif with jay-peg\n\n## 3.1.2\n\n### Patch Changes\n\n- [#2549](https://github.com/diegomura/react-pdf/pull/2549) [`44bd45b`](https://github.com/diegomura/react-pdf/commit/44bd45b1961ca8bae4a2f84cc77db945e5c43419) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - Fix named destinations (id attribute with string value)\n\n## 3.1.1\n\n### Patch Changes\n\n- [#2532](https://github.com/diegomura/react-pdf/pull/2532) [`36c6ba3`](https://github.com/diegomura/react-pdf/commit/36c6ba30ae73a512f19fe5bc47ac8c304887c0da) Thanks [@diegomura](https://github.com/diegomura)! - refactor: converge pdfkit\n\n* [#2529](https://github.com/diegomura/react-pdf/pull/2529) [`a35b1ba`](https://github.com/diegomura/react-pdf/commit/a35b1ba18d293df51293600d8d56015094d222d8) Thanks [@diegomura](https://github.com/diegomura)! - fix: jpeg exif orientation rendering\n\n## 3.1.0\n\n### Minor Changes\n\n- [#2409](https://github.com/diegomura/react-pdf/pull/2409) [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Add support for native ESM\n\n### Patch Changes\n\n- Updated dependencies [[`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37)]:\n  - @react-pdf/png-js@2.3.0\n\n## 3.0.4\n\n### Patch Changes\n\n- [#2479](https://github.com/diegomura/react-pdf/pull/2479) [`45b2bd3`](https://github.com/diegomura/react-pdf/commit/45b2bd37037c605727ad5783f2f2a438dc19cac4) Thanks [@diegomura](https://github.com/diegomura)! - fix linting\n\n* [#2488](https://github.com/diegomura/react-pdf/pull/2488) [`b457a0c`](https://github.com/diegomura/react-pdf/commit/b457a0cc1c1352325e6c633af3000a3c9241f7f7) Thanks [@diegomura](https://github.com/diegomura)! - fix: copy-paste for registered font\n\n## 3.0.3\n\n### Patch Changes\n\n- [#2450](https://github.com/diegomura/react-pdf/pull/2450) [`4cfb84d`](https://github.com/diegomura/react-pdf/commit/4cfb84d9f3d2301720b68b4c40a0257b9520c6e1) Thanks [@strazto](https://github.com/strazto)! - build: update crypto-js from 4.0.0 -> 4.2.0 (CVE-2023-46233)\n\n## 3.0.2\n\n### Patch Changes\n\n- [#2205](https://github.com/diegomura/react-pdf/pull/2205) [`9a5e0be`](https://github.com/diegomura/react-pdf/commit/9a5e0befb89756db07ce053192a136df9d4ba905) Thanks [@jeetiss](https://github.com/jeetiss)! - update babel\n\n## 3.0.1\n\n### Patch Changes\n\n- [#2121](https://github.com/diegomura/react-pdf/pull/2121) [`8536f10`](https://github.com/diegomura/react-pdf/commit/8536f103830a9ed00211fc4c821b221377885a07) Thanks [@jeetiss](https://github.com/jeetiss)! - fix `attachments` mixin\n\n## 3.0.0\n\n### Major Changes\n\n- [#1891](https://github.com/diegomura/react-pdf/pull/1891) [`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - feat: compatibility with modern web bundlers and browsers\n\n### Patch Changes\n\n- [#1941](https://github.com/diegomura/react-pdf/pull/1941) [`001a208`](https://github.com/diegomura/react-pdf/commit/001a20812fa039d09931b22eb97a8869e3b31cc5) Thanks [@PhilippMeissner](https://github.com/PhilippMeissner)! - chore: adds missing licenses to package.json\n\n* [#1908](https://github.com/diegomura/react-pdf/pull/1908) [`d1f3d5b`](https://github.com/diegomura/react-pdf/commit/d1f3d5b9b4103705e95e2160347ee253d842ed5d) Thanks [@diegomura](https://github.com/diegomura)! - chore: use fontkit mainline repo + drop node 12\n\n- [#1929](https://github.com/diegomura/react-pdf/pull/1929) [`9996158`](https://github.com/diegomura/react-pdf/commit/9996158636edf2118c4a6dcce08a00408b982993) Thanks [@diegomura](https://github.com/diegomura)! - feat: remove blob stream dependency\n\n- Updated dependencies [[`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81), [`001a208`](https://github.com/diegomura/react-pdf/commit/001a20812fa039d09931b22eb97a8869e3b31cc5)]:\n  - @react-pdf/png-js@2.2.0\n\n## 2.4.0\n\n### Minor Changes\n\n- [#1892](https://github.com/diegomura/react-pdf/pull/1892) [`035d3f8`](https://github.com/diegomura/react-pdf/commit/035d3f8d24fa4f4af9f350950d81b51547858367) Thanks [@diegomura](https://github.com/diegomura)! - feat: add skew transformation support\n\n### Patch Changes\n\n- [#1894](https://github.com/diegomura/react-pdf/pull/1894) [`9527fe4`](https://github.com/diegomura/react-pdf/commit/9527fe4c9087818421eca4753172b06e3c0cb934) Thanks [@diegomura](https://github.com/diegomura)! - feat: generate document ID\n\n- Updated dependencies [[`0fcc594`](https://github.com/diegomura/react-pdf/commit/0fcc594310d5af30ca1e752b3efc7a047e813dcb)]:\n  - @react-pdf/fontkit@2.1.2\n\n## 2.3.0\n\n### Minor Changes\n\n- [#1862](https://github.com/diegomura/react-pdf/pull/1862) [`1411d16`](https://github.com/diegomura/react-pdf/commit/1411d162e04ca237bad93729695c363fdf4bdbeb) Thanks [@diegomura](https://github.com/diegomura)! - feat: bookmarks support\n\n* [#1867](https://github.com/diegomura/react-pdf/pull/1867) [`4fadb48`](https://github.com/diegomura/react-pdf/commit/4fadb48983d7269452f89f80c7e341ece859aaee) Thanks [@diegomura](https://github.com/diegomura)! - feat: add page layout support\n\n- [#1857](https://github.com/diegomura/react-pdf/pull/1857) [`d958b0a`](https://github.com/diegomura/react-pdf/commit/d958b0ae06a61c157b2581488a9121a0464222f4) Thanks [@diegomura](https://github.com/diegomura)! - feat: embed same image once in final document\n\n* [#1868](https://github.com/diegomura/react-pdf/pull/1868) [`ce8762f`](https://github.com/diegomura/react-pdf/commit/ce8762f6de5c796e69ec5a225c7f3ff9c619a960) Thanks [@diegomura](https://github.com/diegomura)! - feat: add page mode support\n\n- [#1869](https://github.com/diegomura/react-pdf/pull/1869) [`5d2c308`](https://github.com/diegomura/react-pdf/commit/5d2c3088cf438a8abf1038b14a21117fecf59d57) Thanks [@diegomura](https://github.com/diegomura)! - feat: variable dpi\n\n### Patch Changes\n\n- [#1865](https://github.com/diegomura/react-pdf/pull/1865) [`24f5c77`](https://github.com/diegomura/react-pdf/commit/24f5c77706e12dbab45053cb704a2fe7cf60eb53) Thanks [@diegomura](https://github.com/diegomura)! - feat: add background color and border with Note support\n\n- Updated dependencies [[`89b8059`](https://github.com/diegomura/react-pdf/commit/89b8059185f917531a56b3424223e8656ffed8f7)]:\n  - @react-pdf/fontkit@2.1.1\n\n## 2.2.0\n\n### Minor Changes\n\n- [#1841](https://github.com/diegomura/react-pdf/pull/1841) [`25a80eb`](https://github.com/diegomura/react-pdf/commit/25a80ebd5f96ade7101883624010bad51474967c) Thanks [@diegomura](https://github.com/diegomura)! - feat: support bold-italic standard fonts\n\n## 2.1.0\n\n### Minor Changes\n\n- [#1610](https://github.com/diegomura/react-pdf/pull/1610) [`4c5d527`](https://github.com/diegomura/react-pdf/commit/4c5d52721d29d843f1d09c3fd74370832429f70e) Thanks [@jeetiss](https://github.com/jeetiss)! - updated rollup rollup-plugins and babel\n\n* [#1654](https://github.com/diegomura/react-pdf/pull/1654) [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b) Thanks [@jeetiss](https://github.com/jeetiss)! - added `@babel/runtime` to dependencies\n\n### Patch Changes\n\n- [#1673](https://github.com/diegomura/react-pdf/pull/1673) [`d341ae6`](https://github.com/diegomura/react-pdf/commit/d341ae66e91774e95e82deb8d9162bf458688768) Thanks [@jeetiss](https://github.com/jeetiss)! - ingore fs package in browser bundle\n\n* [#1581](https://github.com/diegomura/react-pdf/pull/1581) [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca) Thanks [@jeetiss](https://github.com/jeetiss)! - added changelog with changesets\n\n- [#1607](https://github.com/diegomura/react-pdf/pull/1607) [`a592e99`](https://github.com/diegomura/react-pdf/commit/a592e99f7df7481697582c2a12f31ce7f9559c66) Thanks [@jeetiss](https://github.com/jeetiss)! - replaced `crypto-js` with `crypto-js/md5` to reduce bundle size\n\n- Updated dependencies [[`3217a89`](https://github.com/diegomura/react-pdf/commit/3217a892e92ff98e92b6c7ea6e3244d403f679b6), [`4c5d527`](https://github.com/diegomura/react-pdf/commit/4c5d52721d29d843f1d09c3fd74370832429f70e), [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca), [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b)]:\n  - @react-pdf/fontkit@2.1.0\n  - @react-pdf/png-js@2.1.0\n"
  },
  {
    "path": "packages/pdfkit/LICENSE",
    "content": "MIT LICENSE\nCopyright (c) 2014 Devon Govett\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "packages/pdfkit/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n# @react-pdf/pdfkit\n\nA JavaScript PDF generation library for Node and the browser.\n\n## Acknowledges\n\nThis project is a fork of [pdfkit](https://github.com/foliojs/pdfkit) by @devongovett and continued under the scope of this project since it has react-pdf specific features. Any recongnition should go to him and the original project mantainers.\n\n## Description\n\nPDFKit is a PDF document generation library for Node and the browser that makes creating complex, multi-page, printable documents easy.\nIt's written in CoffeeScript, but you can choose to use the API in plain 'ol JavaScript if you like. The API embraces\nchainability, and includes both low level functions as well as abstractions for higher level functionality. The PDFKit API\nis designed to be simple, so generating complex documents is often as simple as a few function calls.\n\nCheck out some of the [documentation and examples](http://pdfkit.org/docs/getting_started.html) to see for yourself!\nYou can also read the guide as a [self-generated PDF](http://pdfkit.org/docs/guide.pdf) with example output displayed inline.\nIf you'd like to see how it was generated, check out the README in the [docs](https://github.com/devongovett/pdfkit/tree/master/docs)\nfolder.\n\nYou can also try out an interactive in-browser demo of PDFKit [here](http://pdfkit.org/demo/browser.html).\n\n## Installation\n\nInstallation uses the [npm](http://npmjs.org/) package manager. Just type the following command after installing npm.\n\n    npm install @react-pdf/pdfkit\n\n## Features\n\n- Vector graphics\n  - HTML5 canvas-like API\n  - Path operations\n  - SVG path parser for easy path creation\n  - Transformations\n  - Linear and radial gradients\n- Text\n  - Line wrapping\n  - Text alignments\n  - Bulleted lists\n- Font embedding\n  - Supports TrueType (.ttf), OpenType (.otf), WOFF, WOFF2, TrueType Collections (.ttc), and Datafork TrueType (.dfont) fonts\n  - Font subsetting\n  - See [fontkit](http://github.com/devongovett/fontkit) for more details on advanced glyph layout support.\n- Image embedding\n  - Supports JPEG and PNG files (including indexed PNGs, and PNGs with transparency)\n- Annotations\n  - Links\n  - Notes\n  - Highlights\n  - Underlines\n  - etc.\n\n## Coming soon!\n\n- Patterns fills\n- Outlines\n- PDF Security\n- Higher level APIs for creating tables and laying out content\n- More performance optimizations\n- Even more awesomeness, perhaps written by you! Please fork this repository and send me pull requests.\n\n## Documentation\n\nFor complete API documentation and more examples, see the [PDFKit website](http://pdfkit.org/).\n\n## License\n\nPDFKit is available under the MIT license.\n"
  },
  {
    "path": "packages/pdfkit/babel.config.js",
    "content": "export default { extends: '../../babel.config.js', plugins: ['@babel/plugin-transform-nullish-coalescing-operator'] };\n"
  },
  {
    "path": "packages/pdfkit/package.json",
    "content": "{\n  \"name\": \"@react-pdf/pdfkit\",\n  \"version\": \"4.1.0\",\n  \"license\": \"MIT\",\n  \"description\": \"A PDF generation library for Node.js\",\n  \"type\": \"module\",\n  \"main\": \"./lib/pdfkit.js\",\n  \"browser\": {\n    \"./lib/pdfkit.js\": \"./lib/pdfkit.browser.js\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/pdfkit\"\n  },\n  \"author\": {\n    \"name\": \"Devon Govett\",\n    \"email\": \"devongovett@gmail.com\",\n    \"url\": \"http://badassjs.com/\"\n  },\n  \"scripts\": {\n    \"test\": \"vitest\",\n    \"clear\": \"rimraf ./lib ./src/font/data/*.json\",\n    \"parse:afm\": \"node ./src/font/data/compressData.js\",\n    \"build\": \"npm run clear && npm run parse:afm && rollup -c \",\n    \"watch\": \"npm run clear && npm run parse:afm && rollup -c -w\"\n  },\n  \"files\": [\n    \"lib\"\n  ],\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.20.13\",\n    \"@react-pdf/png-js\": \"^3.0.0\",\n    \"browserify-zlib\": \"^0.2.0\",\n    \"crypto-js\": \"^4.2.0\",\n    \"fontkit\": \"^2.0.2\",\n    \"jay-peg\": \"^1.1.1\",\n    \"linebreak\": \"^1.1.0\",\n    \"vite-compatible-readable-stream\": \"^3.6.1\"\n  },\n  \"devDependencies\": {\n    \"iconv-lite\": \"^0.4.13\"\n  }\n}\n"
  },
  {
    "path": "packages/pdfkit/rollup.config.js",
    "content": "import babel from '@rollup/plugin-babel';\nimport json from '@rollup/plugin-json';\nimport replace from '@rollup/plugin-replace';\nimport nodeResolve from '@rollup/plugin-node-resolve';\nimport ignore from 'rollup-plugin-ignore';\nimport alias from '@rollup/plugin-alias';\nimport nodePolyfills from 'rollup-plugin-polyfill-node';\nimport commonjs from '@rollup/plugin-commonjs';\n\nimport pkg from './package.json' with { type: 'json' };\n\nconst input = 'src/index.js';\n\nconst babelConfig = () => ({\n  babelrc: true,\n  exclude: 'node_modules/**',\n  babelHelpers: 'runtime'\n});\n\nconst getExternal = ({ browser }) => [\n  ...Object.keys(pkg.dependencies).filter(\n    (dep) =>\n      !browser ||\n      !['vite-compatible-readable-stream', 'browserify-zlib'].includes(dep)\n  ),\n  /\\/node_modules\\/pako\\//,\n  /crypto-js/,\n  /@babel\\/runtime/,\n  ...(browser ? [] : ['fs'])\n];\n\nconst getPlugins = ({ browser }) => [\n  json(),\n  ...(browser\n    ? [\n        ignore(['fs']),\n        alias({\n          entries: [\n            // See https://github.com/browserify/browserify-zlib/pull/45\n            {\n              find: 'pako/lib/zlib/zstream',\n              replacement: 'pako/lib/zlib/zstream.js'\n            },\n            {\n              find: 'pako/lib/zlib/constants',\n              replacement: 'pako/lib/zlib/constants.js'\n            },\n            { find: 'stream', replacement: 'vite-compatible-readable-stream' },\n            { find: 'zlib', replacement: 'browserify-zlib' }\n          ]\n        }),\n        commonjs(),\n        nodeResolve({ browser, preferBuiltins: !browser }),\n        nodePolyfills({\n          include: [/node_modules\\/.+\\.js/, /pdfkit\\/src\\/.*\\.js/]\n        })\n      ]\n    : [nodeResolve({ browser, preferBuiltins: !browser })]),\n  replace({\n    preventAssignment: true,\n    values: {\n      BROWSER: JSON.stringify(browser)\n    }\n  }),\n  babel(babelConfig()),\n];\n\nconst serverConfig = {\n  input,\n  output: { format: 'es', file: 'lib/pdfkit.js' },\n  external: getExternal({ browser: false }),\n  plugins: getPlugins({ browser: false })\n};\n\nconst browserConfig = {\n  input,\n  output: { format: 'es', file: 'lib/pdfkit.browser.js' },\n  external: getExternal({ browser: true }),\n  plugins: getPlugins({ browser: true })\n};\n\nexport default [\n  serverConfig,\n  browserConfig,\n];\n"
  },
  {
    "path": "packages/pdfkit/src/abstract_reference.js",
    "content": "/*\nPDFAbstractReference - abstract class for PDF reference\n*/\n\nclass PDFAbstractReference {\n  toString() {\n    throw new Error('Must be implemented by subclasses');\n  }\n}\n\nexport default PDFAbstractReference;\n"
  },
  {
    "path": "packages/pdfkit/src/data.js",
    "content": "class Data {\n  constructor(data = []) {\n    this.data = data;\n    this.pos = 0;\n    this.length = this.data.length;\n  }\n\n  readByte() {\n    return this.data[this.pos++];\n  }\n\n  writeByte(byte) {\n    return (this.data[this.pos++] = byte);\n  }\n\n  byteAt(index) {\n    return this.data[index];\n  }\n\n  readBool() {\n    return !!this.readByte();\n  }\n\n  writeBool(val) {\n    return this.writeByte(val ? 1 : 0);\n  }\n\n  readUInt32() {\n    const b1 = this.readByte() * 0x1000000;\n    const b2 = this.readByte() << 16;\n    const b3 = this.readByte() << 8;\n    const b4 = this.readByte();\n    return b1 + b2 + b3 + b4;\n  }\n\n  writeUInt32(val) {\n    this.writeByte((val >>> 24) & 0xff);\n    this.writeByte((val >> 16) & 0xff);\n    this.writeByte((val >> 8) & 0xff);\n    return this.writeByte(val & 0xff);\n  }\n\n  readInt32() {\n    const int = this.readUInt32();\n    if (int >= 0x80000000) {\n      return int - 0x100000000;\n    } else {\n      return int;\n    }\n  }\n\n  writeInt32(val) {\n    if (val < 0) {\n      val += 0x100000000;\n    }\n    return this.writeUInt32(val);\n  }\n\n  readUInt16() {\n    const b1 = this.readByte() << 8;\n    const b2 = this.readByte();\n    return b1 | b2;\n  }\n\n  writeUInt16(val) {\n    this.writeByte((val >> 8) & 0xff);\n    return this.writeByte(val & 0xff);\n  }\n\n  readInt16() {\n    const int = this.readUInt16();\n    if (int >= 0x8000) {\n      return int - 0x10000;\n    } else {\n      return int;\n    }\n  }\n\n  writeInt16(val) {\n    if (val < 0) {\n      val += 0x10000;\n    }\n    return this.writeUInt16(val);\n  }\n\n  readString(length) {\n    const ret = [];\n    for (let i = 0; i < length; i++) {\n      ret[i] = String.fromCharCode(this.readByte());\n    }\n\n    return ret.join('');\n  }\n\n  writeString(val) {\n    // todo: remove returning data. Seems not used\n    const result = [];\n    for (let i = 0; i <= val.length; i++) {\n      result.push(this.writeByte(val.charCodeAt(i)));\n    }\n    return result;\n  }\n\n  stringAt(pos, length) {\n    this.pos = pos;\n    return this.readString(length);\n  }\n\n  readShort() {\n    return this.readInt16();\n  }\n\n  writeShort(val) {\n    return this.writeInt16(val);\n  }\n\n  readLongLong() {\n    const b1 = this.readByte();\n    const b2 = this.readByte();\n    const b3 = this.readByte();\n    const b4 = this.readByte();\n    const b5 = this.readByte();\n    const b6 = this.readByte();\n    const b7 = this.readByte();\n    const b8 = this.readByte();\n\n    if (b1 & 0x80) {\n      // sign -> avoid overflow\n      return (\n        ((b1 ^ 0xff) * 0x100000000000000 +\n          (b2 ^ 0xff) * 0x1000000000000 +\n          (b3 ^ 0xff) * 0x10000000000 +\n          (b4 ^ 0xff) * 0x100000000 +\n          (b5 ^ 0xff) * 0x1000000 +\n          (b6 ^ 0xff) * 0x10000 +\n          (b7 ^ 0xff) * 0x100 +\n          (b8 ^ 0xff) +\n          1) *\n        -1\n      );\n    }\n\n    return (\n      b1 * 0x100000000000000 +\n      b2 * 0x1000000000000 +\n      b3 * 0x10000000000 +\n      b4 * 0x100000000 +\n      b5 * 0x1000000 +\n      b6 * 0x10000 +\n      b7 * 0x100 +\n      b8\n    );\n  }\n\n  writeLongLong(val) {\n    const high = Math.floor(val / 0x100000000);\n    const low = val & 0xffffffff;\n    this.writeByte((high >> 24) & 0xff);\n    this.writeByte((high >> 16) & 0xff);\n    this.writeByte((high >> 8) & 0xff);\n    this.writeByte(high & 0xff);\n    this.writeByte((low >> 24) & 0xff);\n    this.writeByte((low >> 16) & 0xff);\n    this.writeByte((low >> 8) & 0xff);\n    return this.writeByte(low & 0xff);\n  }\n\n  readInt() {\n    return this.readInt32();\n  }\n\n  writeInt(val) {\n    return this.writeInt32(val);\n  }\n\n  slice(start, end) {\n    return this.data.slice(start, end);\n  }\n\n  read(bytes) {\n    const buf = [];\n    for (let i = 0; i < bytes; i++) {\n      buf.push(this.readByte());\n    }\n\n    return buf;\n  }\n\n  write(bytes) {\n    return bytes.map((byte) => this.writeByte(byte));\n  }\n}\n\nexport default Data;\n"
  },
  {
    "path": "packages/pdfkit/src/document.js",
    "content": "/*\nPDFDocument - represents an entire PDF document\nBy Devon Govett\n*/\n\nimport stream from 'stream';\nimport PDFObject from './object';\nimport PDFReference from './reference';\nimport PDFPage from './page';\nimport PDFNameTree from './name_tree';\nimport PDFSecurity from './security';\nimport ColorMixin from './mixins/color';\nimport VectorMixin from './mixins/vector';\nimport FontsMixin from './mixins/fonts';\nimport TextMixin from './mixins/text';\nimport ImagesMixin from './mixins/images';\nimport AnnotationsMixin from './mixins/annotations';\nimport OutlineMixin from './mixins/outline';\nimport MarkingsMixin from './mixins/markings';\nimport AcroFormMixin from './mixins/acroform';\nimport AttachmentsMixin from './mixins/attachments';\nimport LineWrapper from './line_wrapper';\nimport SubsetMixin from './mixins/subsets';\nimport MetadataMixin from './mixins/metadata';\n\nclass PDFDocument extends stream.Readable {\n  constructor(options = {}) {\n    super(options);\n    this.options = options;\n\n    // PDF version\n    switch (options.pdfVersion) {\n      case '1.4':\n        this.version = 1.4;\n        break;\n      case '1.5':\n        this.version = 1.5;\n        break;\n      case '1.6':\n        this.version = 1.6;\n        break;\n      case '1.7':\n      case '1.7ext3':\n        this.version = 1.7;\n        break;\n      default:\n        this.version = 1.3;\n        break;\n    }\n\n    // Whether streams should be compressed\n    this.compress =\n      this.options.compress != null ? this.options.compress : true;\n\n    this._pageBuffer = [];\n    this._pageBufferStart = 0;\n\n    // The PDF object store\n    this._offsets = [];\n    this._waiting = 0;\n    this._ended = false;\n    this._offset = 0;\n    const Pages = this.ref({\n      Type: 'Pages',\n      Count: 0,\n      Kids: []\n    });\n\n    const Names = this.ref({\n      Dests: new PDFNameTree()\n    });\n\n    this._root = this.ref({\n      Type: 'Catalog',\n      Pages,\n      Names\n    });\n\n    if (this.options.lang) {\n      this._root.data.Lang = new String(this.options.lang);\n    }\n\n    // The current page\n    this.page = null;\n\n    // Initialize mixins\n    this.initMetadata();\n    this.initColor();\n    this.initVector();\n    this.initFonts(options.font);\n    this.initText();\n    this.initImages();\n    this.initOutline();\n    this.initMarkings(options);\n    this.initSubset(options);\n\n    // Initialize the metadata\n    this.info = {\n      Producer: 'PDFKit',\n      Creator: 'PDFKit',\n      CreationDate: new Date()\n    };\n\n    if (this.options.info) {\n      for (let key in this.options.info) {\n        const val = this.options.info[key];\n        this.info[key] = val;\n      }\n    }\n\n    if (this.options.displayTitle) {\n      this._root.data.ViewerPreferences = this.ref({\n        DisplayDocTitle: true\n      });\n    }\n\n    // Generate file ID\n    this._id = PDFSecurity.generateFileID(this.info);\n\n    // Initialize security settings\n    // this._security = PDFSecurity.create(this, options);\n\n    // Write the header\n    // PDF version\n    this._write(`%PDF-${this.version}`);\n\n    // 4 binary chars, as recommended by the spec\n    this._write('%\\xFF\\xFF\\xFF\\xFF');\n\n    // Add the first page\n    if (this.options.autoFirstPage !== false) {\n      this.addPage();\n    }\n  }\n\n  addPage(options) {\n    if (options == null) {\n      ({ options } = this);\n    }\n\n    // end the current page if needed\n    if (!this.options.bufferPages) {\n      this.flushPages();\n    }\n\n    // create a page object\n    this.page = new PDFPage(this, options);\n    this._pageBuffer.push(this.page);\n\n    // add the page to the object store\n    const pages = this._root.data.Pages.data;\n    pages.Kids.push(this.page.dictionary);\n    pages.Count++;\n\n    // reset x and y coordinates\n    this.x = this.page.margins.left;\n    this.y = this.page.margins.top;\n\n    // flip PDF coordinate system so that the origin is in\n    // the top left rather than the bottom left\n    this._ctm = [1, 0, 0, 1, 0, 0];\n    this.transform(1, 0, 0, -1, 0, this.page.height);\n\n    this.emit('pageAdded');\n\n    return this;\n  }\n\n  continueOnNewPage(options) {\n    const pageMarkings = this.endPageMarkings(this.page);\n\n    this.addPage(options ?? this.page._options);\n\n    this.initPageMarkings(pageMarkings);\n\n    return this;\n  }\n\n  bufferedPageRange() {\n    return { start: this._pageBufferStart, count: this._pageBuffer.length };\n  }\n\n  switchToPage(n) {\n    let page;\n    if (!(page = this._pageBuffer[n - this._pageBufferStart])) {\n      throw new Error(\n        `switchToPage(${n}) out of bounds, current buffer covers pages ${\n          this._pageBufferStart\n        } to ${this._pageBufferStart + this._pageBuffer.length - 1}`\n      );\n    }\n\n    return (this.page = page);\n  }\n\n  flushPages() {\n    // this local variable exists so we're future-proof against\n    // reentrant calls to flushPages.\n    const pages = this._pageBuffer;\n    this._pageBuffer = [];\n    this._pageBufferStart += pages.length;\n    for (let page of pages) {\n      this.endPageMarkings(page);\n      page.end();\n    }\n  }\n\n  addNamedDestination(name, ...args) {\n    if (args.length === 0) {\n      args = ['XYZ', null, null, null];\n    }\n    if (args[0] === 'XYZ' && args[2] !== null) {\n      args[2] = this.page.height - args[2];\n    }\n    args.unshift(this.page.dictionary);\n    this._root.data.Names.data.Dests.add(name, args);\n  }\n\n  addNamedEmbeddedFile(name, ref) {\n    if (!this._root.data.Names.data.EmbeddedFiles) {\n      // disabling /Limits for this tree fixes attachments not showing in Adobe Reader\n      this._root.data.Names.data.EmbeddedFiles = new PDFNameTree({\n        limits: false\n      });\n    }\n\n    // add filespec to EmbeddedFiles\n    this._root.data.Names.data.EmbeddedFiles.add(name, ref);\n  }\n\n  addNamedJavaScript(name, js) {\n    if (!this._root.data.Names.data.JavaScript) {\n      this._root.data.Names.data.JavaScript = new PDFNameTree();\n    }\n    let data = {\n      JS: new String(js),\n      S: 'JavaScript'\n    };\n    this._root.data.Names.data.JavaScript.add(name, data);\n  }\n\n  ref(data) {\n    const ref = new PDFReference(this, this._offsets.length + 1, data);\n    this._offsets.push(null); // placeholder for this object's offset once it is finalized\n    this._waiting++;\n    return ref;\n  }\n\n  _read() {}\n  // do nothing, but this method is required by node\n\n  _write(data) {\n    if (!Buffer.isBuffer(data)) {\n      data = Buffer.from(data + '\\n', 'binary');\n    }\n\n    this.push(data);\n    return (this._offset += data.length);\n  }\n\n  addContent(data) {\n    this.page.write(data);\n    return this;\n  }\n\n  _refEnd(ref) {\n    this._offsets[ref.id - 1] = ref.offset;\n    if (--this._waiting === 0 && this._ended) {\n      this._finalize();\n      return (this._ended = false);\n    }\n  }\n\n  end() {\n    this.flushPages();\n\n    this._info = this.ref();\n    for (let key in this.info) {\n      let val = this.info[key];\n      if (typeof val === 'string') {\n        val = new String(val);\n      }\n\n      let entry = this.ref(val);\n      entry.end();\n\n      this._info.data[key] = entry;\n    }\n\n    this._info.end();\n\n    for (let name in this._fontFamilies) {\n      const font = this._fontFamilies[name];\n      font.finalize();\n    }\n\n    this.endOutline();\n    this.endMarkings();\n\n    if (this.subset) {\n      this.endSubset();\n    }\n\n    this.endMetadata();\n\n    this._root.end();\n    this._root.data.Pages.end();\n    this._root.data.Names.end();\n    this.endAcroForm();\n\n    if (this._root.data.ViewerPreferences) {\n      this._root.data.ViewerPreferences.end();\n    }\n\n    if (this._security) {\n      this._security.end();\n    }\n\n    if (this._waiting === 0) {\n      return this._finalize();\n    } else {\n      return (this._ended = true);\n    }\n  }\n\n  _finalize() {\n    // generate xref\n    const xRefOffset = this._offset;\n    this._write('xref');\n    this._write(`0 ${this._offsets.length + 1}`);\n    this._write('0000000000 65535 f ');\n\n    for (let offset of this._offsets) {\n      offset = `0000000000${offset}`.slice(-10);\n      this._write(offset + ' 00000 n ');\n    }\n\n    // trailer\n    const trailer = {\n      Size: this._offsets.length + 1,\n      Root: this._root,\n      Info: this._info,\n      ID: [this._id, this._id]\n    };\n    if (this._security) {\n      trailer.Encrypt = this._security.dictionary;\n    }\n\n    this._write('trailer');\n    this._write(PDFObject.convert(trailer));\n\n    this._write('startxref');\n    this._write(`${xRefOffset}`);\n    this._write('%%EOF');\n\n    // end the stream\n    return this.push(null);\n  }\n\n  toString() {\n    return '[object PDFDocument]';\n  }\n}\n\nconst mixin = (methods) => {\n  Object.assign(PDFDocument.prototype, methods);\n};\n\nmixin(MetadataMixin);\nmixin(ColorMixin);\nmixin(VectorMixin);\nmixin(FontsMixin);\nmixin(TextMixin);\nmixin(ImagesMixin);\nmixin(AnnotationsMixin);\nmixin(OutlineMixin);\nmixin(MarkingsMixin);\nmixin(AcroFormMixin);\nmixin(AttachmentsMixin);\nmixin(SubsetMixin);\n\nPDFDocument.LineWrapper = LineWrapper;\n\nexport default PDFDocument;\n"
  },
  {
    "path": "packages/pdfkit/src/font/afm.js",
    "content": "import fs from 'fs';\nimport range from '../utils/range.js';\n\nconst WIN_ANSI_MAP = {\n  402: 131,\n  8211: 150,\n  8212: 151,\n  8216: 145,\n  8217: 146,\n  8218: 130,\n  8220: 147,\n  8221: 148,\n  8222: 132,\n  8224: 134,\n  8225: 135,\n  8226: 149,\n  8230: 133,\n  8364: 128,\n  8240: 137,\n  8249: 139,\n  8250: 155,\n  710: 136,\n  8482: 153,\n  338: 140,\n  339: 156,\n  732: 152,\n  352: 138,\n  353: 154,\n  376: 159,\n  381: 142,\n  382: 158\n};\n\nconst characters = `\\\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n\nspace         exclam         quotedbl       numbersign\ndollar        percent        ampersand      quotesingle\nparenleft     parenright     asterisk       plus\ncomma         hyphen         period         slash\nzero          one            two            three\nfour          five           six            seven\neight         nine           colon          semicolon\nless          equal          greater        question\n\nat            A              B              C\nD             E              F              G\nH             I              J              K\nL             M              N              O\nP             Q              R              S\nT             U              V              W\nX             Y              Z              bracketleft\nbackslash     bracketright   asciicircum    underscore\n\ngrave         a              b              c\nd             e              f              g\nh             i              j              k\nl             m              n              o\np             q              r              s\nt             u              v              w\nx             y              z              braceleft\nbar           braceright     asciitilde     .notdef\n\nEuro          .notdef        quotesinglbase florin\nquotedblbase  ellipsis       dagger         daggerdbl\ncircumflex    perthousand    Scaron         guilsinglleft\nOE            .notdef        Zcaron         .notdef\n.notdef       quoteleft      quoteright     quotedblleft\nquotedblright bullet         endash         emdash\ntilde         trademark      scaron         guilsinglright\noe            .notdef        zcaron         ydieresis\n\nspace         exclamdown     cent           sterling\ncurrency      yen            brokenbar      section\ndieresis      copyright      ordfeminine    guillemotleft\nlogicalnot    softhyphen     registered     macron\ndegree        plusminus      twosuperior    threesuperior\nacute         mu             paragraph      periodcentered\ncedilla       onesuperior    ordmasculine   guillemotright\nonequarter    onehalf        threequarters  questiondown\n\nAgrave        Aacute         Acircumflex    Atilde\nAdieresis     Aring          AE             Ccedilla\nEgrave        Eacute         Ecircumflex    Edieresis\nIgrave        Iacute         Icircumflex    Idieresis\nEth           Ntilde         Ograve         Oacute\nOcircumflex   Otilde         Odieresis      multiply\nOslash        Ugrave         Uacute         Ucircumflex\nUdieresis     Yacute         Thorn          germandbls\n\nagrave        aacute         acircumflex    atilde\nadieresis     aring          ae             ccedilla\negrave        eacute         ecircumflex    edieresis\nigrave        iacute         icircumflex    idieresis\neth           ntilde         ograve         oacute\nocircumflex   otilde         odieresis      divide\noslash        ugrave         uacute         ucircumflex\nudieresis     yacute         thorn          ydieresis\\\n`.split(/\\s+/);\n\nfunction parse(contents) {\n  const obj = {\n    attributes: {},\n    glyphWidths: {},\n    kernPairs: {}\n  };\n\n  let section = '';\n  for (let line of contents.split('\\n')) {\n    var match;\n    var a;\n    if ((match = line.match(/^Start(\\w+)/))) {\n      section = match[1];\n      continue;\n    } else if ((match = line.match(/^End(\\w+)/))) {\n      section = '';\n      continue;\n    }\n\n    switch (section) {\n      case 'FontMetrics':\n        match = line.match(/(^\\w+)\\s+(.*)/);\n        var key = match[1];\n        var value = match[2];\n\n        if ((a = obj.attributes[key])) {\n          if (!Array.isArray(a)) {\n            a = obj.attributes[key] = [a];\n          }\n          a.push(value);\n        } else {\n          obj.attributes[key] = value;\n        }\n        break;\n\n      case 'CharMetrics':\n        if (!/^CH?\\s/.test(line)) {\n          continue;\n        }\n        var name = line.match(/\\bN\\s+(\\.?\\w+)\\s*;/)[1];\n        obj.glyphWidths[name] = +line.match(/\\bWX\\s+(\\d+)\\s*;/)[1];\n        break;\n\n      case 'KernPairs':\n        match = line.match(/^KPX\\s+(\\.?\\w+)\\s+(\\.?\\w+)\\s+(-?\\d+)/);\n        if (match) {\n          obj.kernPairs[match[1] + match[2]] = parseInt(match[3]);\n        }\n        break;\n    }\n  }\n\n  return obj;\n}\n\nclass AFMFont {\n  static open(filename) {\n    if (BROWSER) {\n      throw new Error('AFMFont.open not available on browser build');\n    }\n    return new AFMFont(fs.readFileSync(filename, 'utf8'));\n  }\n\n  static fromJson(json) {\n    return new AFMFont(json);\n  }\n\n  constructor(contents) {\n    if (typeof contents === 'string') {\n      this.contents = contents;\n      this.parse();\n    } else {\n      this.attributes = contents.attributes;\n      this.glyphWidths = contents.glyphWidths;\n      this.kernPairs = contents.kernPairs;\n    }\n\n    this.charWidths = range(0, 255, true).map(\n      (i) => this.glyphWidths[characters[i]]\n    );\n    this.bbox = Array.from(this.attributes.FontBBox.split(/\\s+/)).map(\n      (e) => +e\n    );\n    this.ascender = +(this.attributes.Ascender || 0);\n    this.descender = +(this.attributes.Descender || 0);\n    this.xHeight = +(this.attributes.XHeight || 0);\n    this.capHeight = +(this.attributes.CapHeight || 0);\n    this.lineGap =\n      this.bbox[3] - this.bbox[1] - (this.ascender - this.descender);\n  }\n\n  parse() {\n    const parsed = parse(this.contents);\n\n    this.attributes = parsed.attributes;\n    this.glyphWidths = parsed.glyphWidths;\n    this.kernPairs = parsed.kernPairs;\n  }\n\n  encodeText(text) {\n    const res = [];\n    for (\n      let i = 0, end = text.length, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      let char = text.charCodeAt(i);\n      char = WIN_ANSI_MAP[char] || char;\n      res.push(char.toString(16));\n    }\n\n    return res;\n  }\n\n  glyphsForString(string) {\n    const glyphs = [];\n\n    for (\n      let i = 0, end = string.length, asc = 0 <= end;\n      asc ? i < end : i > end;\n      asc ? i++ : i--\n    ) {\n      const charCode = string.charCodeAt(i);\n      glyphs.push(this.characterToGlyph(charCode));\n    }\n\n    return glyphs;\n  }\n\n  characterToGlyph(character) {\n    return characters[WIN_ANSI_MAP[character] || character] || '.notdef';\n  }\n\n  widthOfGlyph(glyph) {\n    return this.glyphWidths[glyph] || 0;\n  }\n\n  getKernPair(left, right) {\n    return this.kernPairs[left + right] || 0;\n  }\n\n  advancesForGlyphs(glyphs) {\n    const advances = [];\n\n    for (let index = 0; index < glyphs.length; index++) {\n      const left = glyphs[index];\n      const right = glyphs[index + 1];\n      advances.push(this.widthOfGlyph(left) + this.getKernPair(left, right));\n    }\n\n    return advances;\n  }\n}\n\nexport { parse };\nexport default AFMFont;\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/Courier-Bold.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Mon Jun 23 16:28:00 1997\nComment UniqueID 43048\nComment VMusage 41139 52164\nFontName Courier-Bold\nFullName Courier Bold\nFamilyName Courier\nWeight Bold\nItalicAngle 0\nIsFixedPitch true\nCharacterSet ExtendedRoman\nFontBBox -113 -250 749 801 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 003.000\nNotice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 562\nXHeight 439\nAscender 629\nDescender -157\nStdHW 84\nStdVW 106\nStartCharMetrics 315\nC 32 ; WX 600 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ;\nC 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ;\nC 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ;\nC 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ;\nC 37 ; WX 600 ; N percent ; B 5 -15 595 616 ;\nC 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ;\nC 39 ; WX 600 ; N quoteright ; B 171 277 423 562 ;\nC 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ;\nC 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ;\nC 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ;\nC 43 ; WX 600 ; N plus ; B 71 39 529 478 ;\nC 44 ; WX 600 ; N comma ; B 123 -111 393 174 ;\nC 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ;\nC 46 ; WX 600 ; N period ; B 192 -15 408 171 ;\nC 47 ; WX 600 ; N slash ; B 98 -77 502 626 ;\nC 48 ; WX 600 ; N zero ; B 87 -15 513 616 ;\nC 49 ; WX 600 ; N one ; B 81 0 539 616 ;\nC 50 ; WX 600 ; N two ; B 61 0 499 616 ;\nC 51 ; WX 600 ; N three ; B 63 -15 501 616 ;\nC 52 ; WX 600 ; N four ; B 53 0 507 616 ;\nC 53 ; WX 600 ; N five ; B 70 -15 521 601 ;\nC 54 ; WX 600 ; N six ; B 90 -15 521 616 ;\nC 55 ; WX 600 ; N seven ; B 55 0 494 601 ;\nC 56 ; WX 600 ; N eight ; B 83 -15 517 616 ;\nC 57 ; WX 600 ; N nine ; B 79 -15 510 616 ;\nC 58 ; WX 600 ; N colon ; B 191 -15 407 425 ;\nC 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ;\nC 60 ; WX 600 ; N less ; B 66 15 523 501 ;\nC 61 ; WX 600 ; N equal ; B 71 118 529 398 ;\nC 62 ; WX 600 ; N greater ; B 77 15 534 501 ;\nC 63 ; WX 600 ; N question ; B 98 -14 501 580 ;\nC 64 ; WX 600 ; N at ; B 16 -15 584 616 ;\nC 65 ; WX 600 ; N A ; B -9 0 609 562 ;\nC 66 ; WX 600 ; N B ; B 30 0 573 562 ;\nC 67 ; WX 600 ; N C ; B 22 -18 560 580 ;\nC 68 ; WX 600 ; N D ; B 30 0 594 562 ;\nC 69 ; WX 600 ; N E ; B 25 0 560 562 ;\nC 70 ; WX 600 ; N F ; B 39 0 570 562 ;\nC 71 ; WX 600 ; N G ; B 22 -18 594 580 ;\nC 72 ; WX 600 ; N H ; B 20 0 580 562 ;\nC 73 ; WX 600 ; N I ; B 77 0 523 562 ;\nC 74 ; WX 600 ; N J ; B 37 -18 601 562 ;\nC 75 ; WX 600 ; N K ; B 21 0 599 562 ;\nC 76 ; WX 600 ; N L ; B 39 0 578 562 ;\nC 77 ; WX 600 ; N M ; B -2 0 602 562 ;\nC 78 ; WX 600 ; N N ; B 8 -12 610 562 ;\nC 79 ; WX 600 ; N O ; B 22 -18 578 580 ;\nC 80 ; WX 600 ; N P ; B 48 0 559 562 ;\nC 81 ; WX 600 ; N Q ; B 32 -138 578 580 ;\nC 82 ; WX 600 ; N R ; B 24 0 599 562 ;\nC 83 ; WX 600 ; N S ; B 47 -22 553 582 ;\nC 84 ; WX 600 ; N T ; B 21 0 579 562 ;\nC 85 ; WX 600 ; N U ; B 4 -18 596 562 ;\nC 86 ; WX 600 ; N V ; B -13 0 613 562 ;\nC 87 ; WX 600 ; N W ; B -18 0 618 562 ;\nC 88 ; WX 600 ; N X ; B 12 0 588 562 ;\nC 89 ; WX 600 ; N Y ; B 12 0 589 562 ;\nC 90 ; WX 600 ; N Z ; B 62 0 539 562 ;\nC 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ;\nC 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ;\nC 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ;\nC 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ;\nC 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 178 277 428 562 ;\nC 97 ; WX 600 ; N a ; B 35 -15 570 454 ;\nC 98 ; WX 600 ; N b ; B 0 -15 584 626 ;\nC 99 ; WX 600 ; N c ; B 40 -15 545 459 ;\nC 100 ; WX 600 ; N d ; B 20 -15 591 626 ;\nC 101 ; WX 600 ; N e ; B 40 -15 563 454 ;\nC 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ;\nC 103 ; WX 600 ; N g ; B 30 -146 580 454 ;\nC 104 ; WX 600 ; N h ; B 5 0 592 626 ;\nC 105 ; WX 600 ; N i ; B 77 0 523 658 ;\nC 106 ; WX 600 ; N j ; B 63 -146 440 658 ;\nC 107 ; WX 600 ; N k ; B 20 0 585 626 ;\nC 108 ; WX 600 ; N l ; B 77 0 523 626 ;\nC 109 ; WX 600 ; N m ; B -22 0 626 454 ;\nC 110 ; WX 600 ; N n ; B 18 0 592 454 ;\nC 111 ; WX 600 ; N o ; B 30 -15 570 454 ;\nC 112 ; WX 600 ; N p ; B -1 -142 570 454 ;\nC 113 ; WX 600 ; N q ; B 20 -142 591 454 ;\nC 114 ; WX 600 ; N r ; B 47 0 580 454 ;\nC 115 ; WX 600 ; N s ; B 68 -17 535 459 ;\nC 116 ; WX 600 ; N t ; B 47 -15 532 562 ;\nC 117 ; WX 600 ; N u ; B -1 -15 569 439 ;\nC 118 ; WX 600 ; N v ; B -1 0 601 439 ;\nC 119 ; WX 600 ; N w ; B -18 0 618 439 ;\nC 120 ; WX 600 ; N x ; B 6 0 594 439 ;\nC 121 ; WX 600 ; N y ; B -4 -142 601 439 ;\nC 122 ; WX 600 ; N z ; B 81 0 520 439 ;\nC 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ;\nC 124 ; WX 600 ; N bar ; B 255 -250 345 750 ;\nC 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ;\nC 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ;\nC 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ;\nC 162 ; WX 600 ; N cent ; B 66 -49 518 614 ;\nC 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ;\nC 164 ; WX 600 ; N fraction ; B 25 -60 576 661 ;\nC 165 ; WX 600 ; N yen ; B 10 0 590 562 ;\nC 166 ; WX 600 ; N florin ; B -30 -131 572 616 ;\nC 167 ; WX 600 ; N section ; B 83 -70 517 580 ;\nC 168 ; WX 600 ; N currency ; B 54 49 546 517 ;\nC 169 ; WX 600 ; N quotesingle ; B 227 277 373 562 ;\nC 170 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ;\nC 171 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ;\nC 173 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ;\nC 174 ; WX 600 ; N fi ; B 12 0 593 626 ;\nC 175 ; WX 600 ; N fl ; B 12 0 593 626 ;\nC 177 ; WX 600 ; N endash ; B 65 203 535 313 ;\nC 178 ; WX 600 ; N dagger ; B 106 -70 494 580 ;\nC 179 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ;\nC 180 ; WX 600 ; N periodcentered ; B 196 165 404 351 ;\nC 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ;\nC 183 ; WX 600 ; N bullet ; B 140 132 460 430 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ;\nC 185 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ;\nC 186 ; WX 600 ; N quotedblright ; B 61 277 525 562 ;\nC 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ;\nC 188 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ;\nC 189 ; WX 600 ; N perthousand ; B -113 -15 713 616 ;\nC 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ;\nC 193 ; WX 600 ; N grave ; B 132 508 395 661 ;\nC 194 ; WX 600 ; N acute ; B 205 508 468 661 ;\nC 195 ; WX 600 ; N circumflex ; B 103 483 497 657 ;\nC 196 ; WX 600 ; N tilde ; B 89 493 512 636 ;\nC 197 ; WX 600 ; N macron ; B 88 505 512 585 ;\nC 198 ; WX 600 ; N breve ; B 83 468 517 631 ;\nC 199 ; WX 600 ; N dotaccent ; B 230 498 370 638 ;\nC 200 ; WX 600 ; N dieresis ; B 128 498 472 638 ;\nC 202 ; WX 600 ; N ring ; B 198 481 402 678 ;\nC 203 ; WX 600 ; N cedilla ; B 205 -206 387 0 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ;\nC 206 ; WX 600 ; N ogonek ; B 169 -199 400 0 ;\nC 207 ; WX 600 ; N caron ; B 103 493 497 667 ;\nC 208 ; WX 600 ; N emdash ; B -10 203 610 313 ;\nC 225 ; WX 600 ; N AE ; B -29 0 602 562 ;\nC 227 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ;\nC 232 ; WX 600 ; N Lslash ; B 39 0 578 562 ;\nC 233 ; WX 600 ; N Oslash ; B 22 -22 578 584 ;\nC 234 ; WX 600 ; N OE ; B -25 0 595 562 ;\nC 235 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ;\nC 241 ; WX 600 ; N ae ; B -4 -15 601 454 ;\nC 245 ; WX 600 ; N dotlessi ; B 77 0 523 439 ;\nC 248 ; WX 600 ; N lslash ; B 77 0 523 626 ;\nC 249 ; WX 600 ; N oslash ; B 30 -24 570 463 ;\nC 250 ; WX 600 ; N oe ; B -18 -15 611 454 ;\nC 251 ; WX 600 ; N germandbls ; B 22 -15 596 626 ;\nC -1 ; WX 600 ; N Idieresis ; B 77 0 523 761 ;\nC -1 ; WX 600 ; N eacute ; B 40 -15 563 661 ;\nC -1 ; WX 600 ; N abreve ; B 35 -15 570 661 ;\nC -1 ; WX 600 ; N uhungarumlaut ; B -1 -15 628 661 ;\nC -1 ; WX 600 ; N ecaron ; B 40 -15 563 667 ;\nC -1 ; WX 600 ; N Ydieresis ; B 12 0 589 761 ;\nC -1 ; WX 600 ; N divide ; B 71 16 529 500 ;\nC -1 ; WX 600 ; N Yacute ; B 12 0 589 784 ;\nC -1 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ;\nC -1 ; WX 600 ; N aacute ; B 35 -15 570 661 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ;\nC -1 ; WX 600 ; N yacute ; B -4 -142 601 661 ;\nC -1 ; WX 600 ; N scommaaccent ; B 68 -250 535 459 ;\nC -1 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ;\nC -1 ; WX 600 ; N Uring ; B 4 -18 596 801 ;\nC -1 ; WX 600 ; N Udieresis ; B 4 -18 596 761 ;\nC -1 ; WX 600 ; N aogonek ; B 35 -199 586 454 ;\nC -1 ; WX 600 ; N Uacute ; B 4 -18 596 784 ;\nC -1 ; WX 600 ; N uogonek ; B -1 -199 585 439 ;\nC -1 ; WX 600 ; N Edieresis ; B 25 0 560 761 ;\nC -1 ; WX 600 ; N Dcroat ; B 30 0 594 562 ;\nC -1 ; WX 600 ; N commaaccent ; B 205 -250 397 -57 ;\nC -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ;\nC -1 ; WX 600 ; N Emacron ; B 25 0 560 708 ;\nC -1 ; WX 600 ; N ccaron ; B 40 -15 545 667 ;\nC -1 ; WX 600 ; N aring ; B 35 -15 570 678 ;\nC -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 610 562 ;\nC -1 ; WX 600 ; N lacute ; B 77 0 523 801 ;\nC -1 ; WX 600 ; N agrave ; B 35 -15 570 661 ;\nC -1 ; WX 600 ; N Tcommaaccent ; B 21 -250 579 562 ;\nC -1 ; WX 600 ; N Cacute ; B 22 -18 560 784 ;\nC -1 ; WX 600 ; N atilde ; B 35 -15 570 636 ;\nC -1 ; WX 600 ; N Edotaccent ; B 25 0 560 761 ;\nC -1 ; WX 600 ; N scaron ; B 68 -17 535 667 ;\nC -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ;\nC -1 ; WX 600 ; N iacute ; B 77 0 523 661 ;\nC -1 ; WX 600 ; N lozenge ; B 66 0 534 740 ;\nC -1 ; WX 600 ; N Rcaron ; B 24 0 599 790 ;\nC -1 ; WX 600 ; N Gcommaaccent ; B 22 -250 594 580 ;\nC -1 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ;\nC -1 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ;\nC -1 ; WX 600 ; N Amacron ; B -9 0 609 708 ;\nC -1 ; WX 600 ; N rcaron ; B 47 0 580 667 ;\nC -1 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 62 0 539 761 ;\nC -1 ; WX 600 ; N Thorn ; B 48 0 557 562 ;\nC -1 ; WX 600 ; N Omacron ; B 22 -18 578 708 ;\nC -1 ; WX 600 ; N Racute ; B 24 0 599 784 ;\nC -1 ; WX 600 ; N Sacute ; B 47 -22 553 784 ;\nC -1 ; WX 600 ; N dcaron ; B 20 -15 727 626 ;\nC -1 ; WX 600 ; N Umacron ; B 4 -18 596 708 ;\nC -1 ; WX 600 ; N uring ; B -1 -15 569 678 ;\nC -1 ; WX 600 ; N threesuperior ; B 138 222 433 616 ;\nC -1 ; WX 600 ; N Ograve ; B 22 -18 578 784 ;\nC -1 ; WX 600 ; N Agrave ; B -9 0 609 784 ;\nC -1 ; WX 600 ; N Abreve ; B -9 0 609 784 ;\nC -1 ; WX 600 ; N multiply ; B 81 39 520 478 ;\nC -1 ; WX 600 ; N uacute ; B -1 -15 569 661 ;\nC -1 ; WX 600 ; N Tcaron ; B 21 0 579 790 ;\nC -1 ; WX 600 ; N partialdiff ; B 63 -38 537 728 ;\nC -1 ; WX 600 ; N ydieresis ; B -4 -142 601 638 ;\nC -1 ; WX 600 ; N Nacute ; B 8 -12 610 784 ;\nC -1 ; WX 600 ; N icircumflex ; B 73 0 523 657 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ;\nC -1 ; WX 600 ; N adieresis ; B 35 -15 570 638 ;\nC -1 ; WX 600 ; N edieresis ; B 40 -15 563 638 ;\nC -1 ; WX 600 ; N cacute ; B 40 -15 545 661 ;\nC -1 ; WX 600 ; N nacute ; B 18 0 592 661 ;\nC -1 ; WX 600 ; N umacron ; B -1 -15 569 585 ;\nC -1 ; WX 600 ; N Ncaron ; B 8 -12 610 790 ;\nC -1 ; WX 600 ; N Iacute ; B 77 0 523 784 ;\nC -1 ; WX 600 ; N plusminus ; B 71 24 529 515 ;\nC -1 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ;\nC -1 ; WX 600 ; N registered ; B 0 -18 600 580 ;\nC -1 ; WX 600 ; N Gbreve ; B 22 -18 594 784 ;\nC -1 ; WX 600 ; N Idotaccent ; B 77 0 523 761 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;\nC -1 ; WX 600 ; N Egrave ; B 25 0 560 784 ;\nC -1 ; WX 600 ; N racute ; B 47 0 580 661 ;\nC -1 ; WX 600 ; N omacron ; B 30 -15 570 585 ;\nC -1 ; WX 600 ; N Zacute ; B 62 0 539 784 ;\nC -1 ; WX 600 ; N Zcaron ; B 62 0 539 790 ;\nC -1 ; WX 600 ; N greaterequal ; B 26 0 523 696 ;\nC -1 ; WX 600 ; N Eth ; B 30 0 594 562 ;\nC -1 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ;\nC -1 ; WX 600 ; N lcommaaccent ; B 77 -250 523 626 ;\nC -1 ; WX 600 ; N tcaron ; B 47 -15 532 703 ;\nC -1 ; WX 600 ; N eogonek ; B 40 -199 563 454 ;\nC -1 ; WX 600 ; N Uogonek ; B 4 -199 596 562 ;\nC -1 ; WX 600 ; N Aacute ; B -9 0 609 784 ;\nC -1 ; WX 600 ; N Adieresis ; B -9 0 609 761 ;\nC -1 ; WX 600 ; N egrave ; B 40 -15 563 661 ;\nC -1 ; WX 600 ; N zacute ; B 81 0 520 661 ;\nC -1 ; WX 600 ; N iogonek ; B 77 -199 523 658 ;\nC -1 ; WX 600 ; N Oacute ; B 22 -18 578 784 ;\nC -1 ; WX 600 ; N oacute ; B 30 -15 570 661 ;\nC -1 ; WX 600 ; N amacron ; B 35 -15 570 585 ;\nC -1 ; WX 600 ; N sacute ; B 68 -17 535 661 ;\nC -1 ; WX 600 ; N idieresis ; B 77 0 523 618 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ;\nC -1 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ;\nC -1 ; WX 600 ; N Delta ; B 6 0 594 688 ;\nC -1 ; WX 600 ; N thorn ; B -14 -142 570 626 ;\nC -1 ; WX 600 ; N twosuperior ; B 143 230 436 616 ;\nC -1 ; WX 600 ; N Odieresis ; B 22 -18 578 761 ;\nC -1 ; WX 600 ; N mu ; B -1 -142 569 439 ;\nC -1 ; WX 600 ; N igrave ; B 77 0 523 661 ;\nC -1 ; WX 600 ; N ohungarumlaut ; B 30 -15 668 661 ;\nC -1 ; WX 600 ; N Eogonek ; B 25 -199 576 562 ;\nC -1 ; WX 600 ; N dcroat ; B 20 -15 591 626 ;\nC -1 ; WX 600 ; N threequarters ; B -47 -60 648 661 ;\nC -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ;\nC -1 ; WX 600 ; N lcaron ; B 77 0 597 626 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 599 562 ;\nC -1 ; WX 600 ; N Lacute ; B 39 0 578 784 ;\nC -1 ; WX 600 ; N trademark ; B -9 230 749 562 ;\nC -1 ; WX 600 ; N edotaccent ; B 40 -15 563 638 ;\nC -1 ; WX 600 ; N Igrave ; B 77 0 523 784 ;\nC -1 ; WX 600 ; N Imacron ; B 77 0 523 708 ;\nC -1 ; WX 600 ; N Lcaron ; B 39 0 637 562 ;\nC -1 ; WX 600 ; N onehalf ; B -47 -60 648 661 ;\nC -1 ; WX 600 ; N lessequal ; B 26 0 523 696 ;\nC -1 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ;\nC -1 ; WX 600 ; N ntilde ; B 18 0 592 636 ;\nC -1 ; WX 600 ; N Uhungarumlaut ; B 4 -18 638 784 ;\nC -1 ; WX 600 ; N Eacute ; B 25 0 560 784 ;\nC -1 ; WX 600 ; N emacron ; B 40 -15 563 585 ;\nC -1 ; WX 600 ; N gbreve ; B 30 -146 580 661 ;\nC -1 ; WX 600 ; N onequarter ; B -56 -60 656 661 ;\nC -1 ; WX 600 ; N Scaron ; B 47 -22 553 790 ;\nC -1 ; WX 600 ; N Scommaaccent ; B 47 -250 553 582 ;\nC -1 ; WX 600 ; N Ohungarumlaut ; B 22 -18 628 784 ;\nC -1 ; WX 600 ; N degree ; B 86 243 474 616 ;\nC -1 ; WX 600 ; N ograve ; B 30 -15 570 661 ;\nC -1 ; WX 600 ; N Ccaron ; B 22 -18 560 790 ;\nC -1 ; WX 600 ; N ugrave ; B -1 -15 569 661 ;\nC -1 ; WX 600 ; N radical ; B -19 -104 473 778 ;\nC -1 ; WX 600 ; N Dcaron ; B 30 0 594 790 ;\nC -1 ; WX 600 ; N rcommaaccent ; B 47 -250 580 454 ;\nC -1 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ;\nC -1 ; WX 600 ; N otilde ; B 30 -15 570 636 ;\nC -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 599 562 ;\nC -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 578 562 ;\nC -1 ; WX 600 ; N Atilde ; B -9 0 609 759 ;\nC -1 ; WX 600 ; N Aogonek ; B -9 -199 625 562 ;\nC -1 ; WX 600 ; N Aring ; B -9 0 609 801 ;\nC -1 ; WX 600 ; N Otilde ; B 22 -18 578 759 ;\nC -1 ; WX 600 ; N zdotaccent ; B 81 0 520 638 ;\nC -1 ; WX 600 ; N Ecaron ; B 25 0 560 790 ;\nC -1 ; WX 600 ; N Iogonek ; B 77 -199 523 562 ;\nC -1 ; WX 600 ; N kcommaaccent ; B 20 -250 585 626 ;\nC -1 ; WX 600 ; N minus ; B 71 203 529 313 ;\nC -1 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ;\nC -1 ; WX 600 ; N ncaron ; B 18 0 592 667 ;\nC -1 ; WX 600 ; N tcommaaccent ; B 47 -250 532 562 ;\nC -1 ; WX 600 ; N logicalnot ; B 71 103 529 413 ;\nC -1 ; WX 600 ; N odieresis ; B 30 -15 570 638 ;\nC -1 ; WX 600 ; N udieresis ; B -1 -15 569 638 ;\nC -1 ; WX 600 ; N notequal ; B 12 -47 537 563 ;\nC -1 ; WX 600 ; N gcommaaccent ; B 30 -146 580 714 ;\nC -1 ; WX 600 ; N eth ; B 58 -27 543 626 ;\nC -1 ; WX 600 ; N zcaron ; B 81 0 520 667 ;\nC -1 ; WX 600 ; N ncommaaccent ; B 18 -250 592 454 ;\nC -1 ; WX 600 ; N onesuperior ; B 153 230 447 616 ;\nC -1 ; WX 600 ; N imacron ; B 77 0 523 585 ;\nC -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/Courier-BoldOblique.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Mon Jun 23 16:28:46 1997\nComment UniqueID 43049\nComment VMusage 17529 79244\nFontName Courier-BoldOblique\nFullName Courier Bold Oblique\nFamilyName Courier\nWeight Bold\nItalicAngle -12\nIsFixedPitch true\nCharacterSet ExtendedRoman\nFontBBox -57 -250 869 801\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 003.000\nNotice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 562\nXHeight 439\nAscender 629\nDescender -157\nStdHW 84\nStdVW 106\nStartCharMetrics 315\nC 32 ; WX 600 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 600 ; N exclam ; B 215 -15 495 572 ;\nC 34 ; WX 600 ; N quotedbl ; B 211 277 585 562 ;\nC 35 ; WX 600 ; N numbersign ; B 88 -45 641 651 ;\nC 36 ; WX 600 ; N dollar ; B 87 -126 630 666 ;\nC 37 ; WX 600 ; N percent ; B 101 -15 625 616 ;\nC 38 ; WX 600 ; N ampersand ; B 61 -15 595 543 ;\nC 39 ; WX 600 ; N quoteright ; B 229 277 543 562 ;\nC 40 ; WX 600 ; N parenleft ; B 265 -102 592 616 ;\nC 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ;\nC 42 ; WX 600 ; N asterisk ; B 179 219 598 601 ;\nC 43 ; WX 600 ; N plus ; B 114 39 596 478 ;\nC 44 ; WX 600 ; N comma ; B 99 -111 430 174 ;\nC 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ;\nC 46 ; WX 600 ; N period ; B 206 -15 427 171 ;\nC 47 ; WX 600 ; N slash ; B 90 -77 626 626 ;\nC 48 ; WX 600 ; N zero ; B 135 -15 593 616 ;\nC 49 ; WX 600 ; N one ; B 93 0 562 616 ;\nC 50 ; WX 600 ; N two ; B 61 0 594 616 ;\nC 51 ; WX 600 ; N three ; B 71 -15 571 616 ;\nC 52 ; WX 600 ; N four ; B 81 0 559 616 ;\nC 53 ; WX 600 ; N five ; B 77 -15 621 601 ;\nC 54 ; WX 600 ; N six ; B 135 -15 652 616 ;\nC 55 ; WX 600 ; N seven ; B 147 0 622 601 ;\nC 56 ; WX 600 ; N eight ; B 115 -15 604 616 ;\nC 57 ; WX 600 ; N nine ; B 75 -15 592 616 ;\nC 58 ; WX 600 ; N colon ; B 205 -15 480 425 ;\nC 59 ; WX 600 ; N semicolon ; B 99 -111 481 425 ;\nC 60 ; WX 600 ; N less ; B 120 15 613 501 ;\nC 61 ; WX 600 ; N equal ; B 96 118 614 398 ;\nC 62 ; WX 600 ; N greater ; B 97 15 589 501 ;\nC 63 ; WX 600 ; N question ; B 183 -14 592 580 ;\nC 64 ; WX 600 ; N at ; B 65 -15 642 616 ;\nC 65 ; WX 600 ; N A ; B -9 0 632 562 ;\nC 66 ; WX 600 ; N B ; B 30 0 630 562 ;\nC 67 ; WX 600 ; N C ; B 74 -18 675 580 ;\nC 68 ; WX 600 ; N D ; B 30 0 664 562 ;\nC 69 ; WX 600 ; N E ; B 25 0 670 562 ;\nC 70 ; WX 600 ; N F ; B 39 0 684 562 ;\nC 71 ; WX 600 ; N G ; B 74 -18 675 580 ;\nC 72 ; WX 600 ; N H ; B 20 0 700 562 ;\nC 73 ; WX 600 ; N I ; B 77 0 643 562 ;\nC 74 ; WX 600 ; N J ; B 58 -18 721 562 ;\nC 75 ; WX 600 ; N K ; B 21 0 692 562 ;\nC 76 ; WX 600 ; N L ; B 39 0 636 562 ;\nC 77 ; WX 600 ; N M ; B -2 0 722 562 ;\nC 78 ; WX 600 ; N N ; B 8 -12 730 562 ;\nC 79 ; WX 600 ; N O ; B 74 -18 645 580 ;\nC 80 ; WX 600 ; N P ; B 48 0 643 562 ;\nC 81 ; WX 600 ; N Q ; B 83 -138 636 580 ;\nC 82 ; WX 600 ; N R ; B 24 0 617 562 ;\nC 83 ; WX 600 ; N S ; B 54 -22 673 582 ;\nC 84 ; WX 600 ; N T ; B 86 0 679 562 ;\nC 85 ; WX 600 ; N U ; B 101 -18 716 562 ;\nC 86 ; WX 600 ; N V ; B 84 0 733 562 ;\nC 87 ; WX 600 ; N W ; B 79 0 738 562 ;\nC 88 ; WX 600 ; N X ; B 12 0 690 562 ;\nC 89 ; WX 600 ; N Y ; B 109 0 709 562 ;\nC 90 ; WX 600 ; N Z ; B 62 0 637 562 ;\nC 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ;\nC 92 ; WX 600 ; N backslash ; B 222 -77 496 626 ;\nC 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ;\nC 94 ; WX 600 ; N asciicircum ; B 171 250 556 616 ;\nC 95 ; WX 600 ; N underscore ; B -27 -125 585 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 297 277 487 562 ;\nC 97 ; WX 600 ; N a ; B 61 -15 593 454 ;\nC 98 ; WX 600 ; N b ; B 13 -15 636 626 ;\nC 99 ; WX 600 ; N c ; B 81 -15 631 459 ;\nC 100 ; WX 600 ; N d ; B 60 -15 645 626 ;\nC 101 ; WX 600 ; N e ; B 81 -15 605 454 ;\nC 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ;\nC 103 ; WX 600 ; N g ; B 40 -146 674 454 ;\nC 104 ; WX 600 ; N h ; B 18 0 615 626 ;\nC 105 ; WX 600 ; N i ; B 77 0 546 658 ;\nC 106 ; WX 600 ; N j ; B 36 -146 580 658 ;\nC 107 ; WX 600 ; N k ; B 33 0 643 626 ;\nC 108 ; WX 600 ; N l ; B 77 0 546 626 ;\nC 109 ; WX 600 ; N m ; B -22 0 649 454 ;\nC 110 ; WX 600 ; N n ; B 18 0 615 454 ;\nC 111 ; WX 600 ; N o ; B 71 -15 622 454 ;\nC 112 ; WX 600 ; N p ; B -32 -142 622 454 ;\nC 113 ; WX 600 ; N q ; B 60 -142 685 454 ;\nC 114 ; WX 600 ; N r ; B 47 0 655 454 ;\nC 115 ; WX 600 ; N s ; B 66 -17 608 459 ;\nC 116 ; WX 600 ; N t ; B 118 -15 567 562 ;\nC 117 ; WX 600 ; N u ; B 70 -15 592 439 ;\nC 118 ; WX 600 ; N v ; B 70 0 695 439 ;\nC 119 ; WX 600 ; N w ; B 53 0 712 439 ;\nC 120 ; WX 600 ; N x ; B 6 0 671 439 ;\nC 121 ; WX 600 ; N y ; B -21 -142 695 439 ;\nC 122 ; WX 600 ; N z ; B 81 0 614 439 ;\nC 123 ; WX 600 ; N braceleft ; B 203 -102 595 616 ;\nC 124 ; WX 600 ; N bar ; B 201 -250 505 750 ;\nC 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ;\nC 126 ; WX 600 ; N asciitilde ; B 120 153 590 356 ;\nC 161 ; WX 600 ; N exclamdown ; B 196 -146 477 449 ;\nC 162 ; WX 600 ; N cent ; B 121 -49 605 614 ;\nC 163 ; WX 600 ; N sterling ; B 106 -28 650 611 ;\nC 164 ; WX 600 ; N fraction ; B 22 -60 708 661 ;\nC 165 ; WX 600 ; N yen ; B 98 0 710 562 ;\nC 166 ; WX 600 ; N florin ; B -57 -131 702 616 ;\nC 167 ; WX 600 ; N section ; B 74 -70 620 580 ;\nC 168 ; WX 600 ; N currency ; B 77 49 644 517 ;\nC 169 ; WX 600 ; N quotesingle ; B 303 277 493 562 ;\nC 170 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ;\nC 171 ; WX 600 ; N guillemotleft ; B 62 70 639 446 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 195 70 545 446 ;\nC 173 ; WX 600 ; N guilsinglright ; B 165 70 514 446 ;\nC 174 ; WX 600 ; N fi ; B 12 0 644 626 ;\nC 175 ; WX 600 ; N fl ; B 12 0 644 626 ;\nC 177 ; WX 600 ; N endash ; B 108 203 602 313 ;\nC 178 ; WX 600 ; N dagger ; B 175 -70 586 580 ;\nC 179 ; WX 600 ; N daggerdbl ; B 121 -70 587 580 ;\nC 180 ; WX 600 ; N periodcentered ; B 248 165 461 351 ;\nC 182 ; WX 600 ; N paragraph ; B 61 -70 700 580 ;\nC 183 ; WX 600 ; N bullet ; B 196 132 523 430 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 144 -142 458 143 ;\nC 185 ; WX 600 ; N quotedblbase ; B 34 -142 560 143 ;\nC 186 ; WX 600 ; N quotedblright ; B 119 277 645 562 ;\nC 187 ; WX 600 ; N guillemotright ; B 71 70 647 446 ;\nC 188 ; WX 600 ; N ellipsis ; B 35 -15 587 116 ;\nC 189 ; WX 600 ; N perthousand ; B -45 -15 743 616 ;\nC 191 ; WX 600 ; N questiondown ; B 100 -146 509 449 ;\nC 193 ; WX 600 ; N grave ; B 272 508 503 661 ;\nC 194 ; WX 600 ; N acute ; B 312 508 609 661 ;\nC 195 ; WX 600 ; N circumflex ; B 212 483 607 657 ;\nC 196 ; WX 600 ; N tilde ; B 199 493 643 636 ;\nC 197 ; WX 600 ; N macron ; B 195 505 637 585 ;\nC 198 ; WX 600 ; N breve ; B 217 468 652 631 ;\nC 199 ; WX 600 ; N dotaccent ; B 348 498 493 638 ;\nC 200 ; WX 600 ; N dieresis ; B 246 498 595 638 ;\nC 202 ; WX 600 ; N ring ; B 319 481 528 678 ;\nC 203 ; WX 600 ; N cedilla ; B 168 -206 368 0 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 171 488 729 661 ;\nC 206 ; WX 600 ; N ogonek ; B 143 -199 367 0 ;\nC 207 ; WX 600 ; N caron ; B 238 493 633 667 ;\nC 208 ; WX 600 ; N emdash ; B 33 203 677 313 ;\nC 225 ; WX 600 ; N AE ; B -29 0 708 562 ;\nC 227 ; WX 600 ; N ordfeminine ; B 188 196 526 580 ;\nC 232 ; WX 600 ; N Lslash ; B 39 0 636 562 ;\nC 233 ; WX 600 ; N Oslash ; B 48 -22 673 584 ;\nC 234 ; WX 600 ; N OE ; B 26 0 701 562 ;\nC 235 ; WX 600 ; N ordmasculine ; B 188 196 543 580 ;\nC 241 ; WX 600 ; N ae ; B 21 -15 652 454 ;\nC 245 ; WX 600 ; N dotlessi ; B 77 0 546 439 ;\nC 248 ; WX 600 ; N lslash ; B 77 0 587 626 ;\nC 249 ; WX 600 ; N oslash ; B 54 -24 638 463 ;\nC 250 ; WX 600 ; N oe ; B 18 -15 662 454 ;\nC 251 ; WX 600 ; N germandbls ; B 22 -15 629 626 ;\nC -1 ; WX 600 ; N Idieresis ; B 77 0 643 761 ;\nC -1 ; WX 600 ; N eacute ; B 81 -15 609 661 ;\nC -1 ; WX 600 ; N abreve ; B 61 -15 658 661 ;\nC -1 ; WX 600 ; N uhungarumlaut ; B 70 -15 769 661 ;\nC -1 ; WX 600 ; N ecaron ; B 81 -15 633 667 ;\nC -1 ; WX 600 ; N Ydieresis ; B 109 0 709 761 ;\nC -1 ; WX 600 ; N divide ; B 114 16 596 500 ;\nC -1 ; WX 600 ; N Yacute ; B 109 0 709 784 ;\nC -1 ; WX 600 ; N Acircumflex ; B -9 0 632 780 ;\nC -1 ; WX 600 ; N aacute ; B 61 -15 609 661 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 101 -18 716 780 ;\nC -1 ; WX 600 ; N yacute ; B -21 -142 695 661 ;\nC -1 ; WX 600 ; N scommaaccent ; B 66 -250 608 459 ;\nC -1 ; WX 600 ; N ecircumflex ; B 81 -15 607 657 ;\nC -1 ; WX 600 ; N Uring ; B 101 -18 716 801 ;\nC -1 ; WX 600 ; N Udieresis ; B 101 -18 716 761 ;\nC -1 ; WX 600 ; N aogonek ; B 61 -199 593 454 ;\nC -1 ; WX 600 ; N Uacute ; B 101 -18 716 784 ;\nC -1 ; WX 600 ; N uogonek ; B 70 -199 592 439 ;\nC -1 ; WX 600 ; N Edieresis ; B 25 0 670 761 ;\nC -1 ; WX 600 ; N Dcroat ; B 30 0 664 562 ;\nC -1 ; WX 600 ; N commaaccent ; B 151 -250 385 -57 ;\nC -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ;\nC -1 ; WX 600 ; N Emacron ; B 25 0 670 708 ;\nC -1 ; WX 600 ; N ccaron ; B 81 -15 633 667 ;\nC -1 ; WX 600 ; N aring ; B 61 -15 593 678 ;\nC -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 730 562 ;\nC -1 ; WX 600 ; N lacute ; B 77 0 639 801 ;\nC -1 ; WX 600 ; N agrave ; B 61 -15 593 661 ;\nC -1 ; WX 600 ; N Tcommaaccent ; B 86 -250 679 562 ;\nC -1 ; WX 600 ; N Cacute ; B 74 -18 675 784 ;\nC -1 ; WX 600 ; N atilde ; B 61 -15 643 636 ;\nC -1 ; WX 600 ; N Edotaccent ; B 25 0 670 761 ;\nC -1 ; WX 600 ; N scaron ; B 66 -17 633 667 ;\nC -1 ; WX 600 ; N scedilla ; B 66 -206 608 459 ;\nC -1 ; WX 600 ; N iacute ; B 77 0 609 661 ;\nC -1 ; WX 600 ; N lozenge ; B 145 0 614 740 ;\nC -1 ; WX 600 ; N Rcaron ; B 24 0 659 790 ;\nC -1 ; WX 600 ; N Gcommaaccent ; B 74 -250 675 580 ;\nC -1 ; WX 600 ; N ucircumflex ; B 70 -15 597 657 ;\nC -1 ; WX 600 ; N acircumflex ; B 61 -15 607 657 ;\nC -1 ; WX 600 ; N Amacron ; B -9 0 633 708 ;\nC -1 ; WX 600 ; N rcaron ; B 47 0 655 667 ;\nC -1 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 62 0 637 761 ;\nC -1 ; WX 600 ; N Thorn ; B 48 0 620 562 ;\nC -1 ; WX 600 ; N Omacron ; B 74 -18 663 708 ;\nC -1 ; WX 600 ; N Racute ; B 24 0 665 784 ;\nC -1 ; WX 600 ; N Sacute ; B 54 -22 673 784 ;\nC -1 ; WX 600 ; N dcaron ; B 60 -15 861 626 ;\nC -1 ; WX 600 ; N Umacron ; B 101 -18 716 708 ;\nC -1 ; WX 600 ; N uring ; B 70 -15 592 678 ;\nC -1 ; WX 600 ; N threesuperior ; B 193 222 526 616 ;\nC -1 ; WX 600 ; N Ograve ; B 74 -18 645 784 ;\nC -1 ; WX 600 ; N Agrave ; B -9 0 632 784 ;\nC -1 ; WX 600 ; N Abreve ; B -9 0 684 784 ;\nC -1 ; WX 600 ; N multiply ; B 104 39 606 478 ;\nC -1 ; WX 600 ; N uacute ; B 70 -15 599 661 ;\nC -1 ; WX 600 ; N Tcaron ; B 86 0 679 790 ;\nC -1 ; WX 600 ; N partialdiff ; B 91 -38 627 728 ;\nC -1 ; WX 600 ; N ydieresis ; B -21 -142 695 638 ;\nC -1 ; WX 600 ; N Nacute ; B 8 -12 730 784 ;\nC -1 ; WX 600 ; N icircumflex ; B 77 0 577 657 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 25 0 670 780 ;\nC -1 ; WX 600 ; N adieresis ; B 61 -15 595 638 ;\nC -1 ; WX 600 ; N edieresis ; B 81 -15 605 638 ;\nC -1 ; WX 600 ; N cacute ; B 81 -15 649 661 ;\nC -1 ; WX 600 ; N nacute ; B 18 0 639 661 ;\nC -1 ; WX 600 ; N umacron ; B 70 -15 637 585 ;\nC -1 ; WX 600 ; N Ncaron ; B 8 -12 730 790 ;\nC -1 ; WX 600 ; N Iacute ; B 77 0 643 784 ;\nC -1 ; WX 600 ; N plusminus ; B 76 24 614 515 ;\nC -1 ; WX 600 ; N brokenbar ; B 217 -175 489 675 ;\nC -1 ; WX 600 ; N registered ; B 53 -18 667 580 ;\nC -1 ; WX 600 ; N Gbreve ; B 74 -18 684 784 ;\nC -1 ; WX 600 ; N Idotaccent ; B 77 0 643 761 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 672 706 ;\nC -1 ; WX 600 ; N Egrave ; B 25 0 670 784 ;\nC -1 ; WX 600 ; N racute ; B 47 0 655 661 ;\nC -1 ; WX 600 ; N omacron ; B 71 -15 637 585 ;\nC -1 ; WX 600 ; N Zacute ; B 62 0 665 784 ;\nC -1 ; WX 600 ; N Zcaron ; B 62 0 659 790 ;\nC -1 ; WX 600 ; N greaterequal ; B 26 0 627 696 ;\nC -1 ; WX 600 ; N Eth ; B 30 0 664 562 ;\nC -1 ; WX 600 ; N Ccedilla ; B 74 -206 675 580 ;\nC -1 ; WX 600 ; N lcommaaccent ; B 77 -250 546 626 ;\nC -1 ; WX 600 ; N tcaron ; B 118 -15 627 703 ;\nC -1 ; WX 600 ; N eogonek ; B 81 -199 605 454 ;\nC -1 ; WX 600 ; N Uogonek ; B 101 -199 716 562 ;\nC -1 ; WX 600 ; N Aacute ; B -9 0 655 784 ;\nC -1 ; WX 600 ; N Adieresis ; B -9 0 632 761 ;\nC -1 ; WX 600 ; N egrave ; B 81 -15 605 661 ;\nC -1 ; WX 600 ; N zacute ; B 81 0 614 661 ;\nC -1 ; WX 600 ; N iogonek ; B 77 -199 546 658 ;\nC -1 ; WX 600 ; N Oacute ; B 74 -18 645 784 ;\nC -1 ; WX 600 ; N oacute ; B 71 -15 649 661 ;\nC -1 ; WX 600 ; N amacron ; B 61 -15 637 585 ;\nC -1 ; WX 600 ; N sacute ; B 66 -17 609 661 ;\nC -1 ; WX 600 ; N idieresis ; B 77 0 561 618 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ;\nC -1 ; WX 600 ; N Ugrave ; B 101 -18 716 784 ;\nC -1 ; WX 600 ; N Delta ; B 6 0 594 688 ;\nC -1 ; WX 600 ; N thorn ; B -32 -142 622 626 ;\nC -1 ; WX 600 ; N twosuperior ; B 191 230 542 616 ;\nC -1 ; WX 600 ; N Odieresis ; B 74 -18 645 761 ;\nC -1 ; WX 600 ; N mu ; B 49 -142 592 439 ;\nC -1 ; WX 600 ; N igrave ; B 77 0 546 661 ;\nC -1 ; WX 600 ; N ohungarumlaut ; B 71 -15 809 661 ;\nC -1 ; WX 600 ; N Eogonek ; B 25 -199 670 562 ;\nC -1 ; WX 600 ; N dcroat ; B 60 -15 712 626 ;\nC -1 ; WX 600 ; N threequarters ; B 8 -60 699 661 ;\nC -1 ; WX 600 ; N Scedilla ; B 54 -206 673 582 ;\nC -1 ; WX 600 ; N lcaron ; B 77 0 731 626 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 692 562 ;\nC -1 ; WX 600 ; N Lacute ; B 39 0 636 784 ;\nC -1 ; WX 600 ; N trademark ; B 86 230 869 562 ;\nC -1 ; WX 600 ; N edotaccent ; B 81 -15 605 638 ;\nC -1 ; WX 600 ; N Igrave ; B 77 0 643 784 ;\nC -1 ; WX 600 ; N Imacron ; B 77 0 663 708 ;\nC -1 ; WX 600 ; N Lcaron ; B 39 0 757 562 ;\nC -1 ; WX 600 ; N onehalf ; B 22 -60 716 661 ;\nC -1 ; WX 600 ; N lessequal ; B 26 0 671 696 ;\nC -1 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ;\nC -1 ; WX 600 ; N ntilde ; B 18 0 643 636 ;\nC -1 ; WX 600 ; N Uhungarumlaut ; B 101 -18 805 784 ;\nC -1 ; WX 600 ; N Eacute ; B 25 0 670 784 ;\nC -1 ; WX 600 ; N emacron ; B 81 -15 637 585 ;\nC -1 ; WX 600 ; N gbreve ; B 40 -146 674 661 ;\nC -1 ; WX 600 ; N onequarter ; B 13 -60 707 661 ;\nC -1 ; WX 600 ; N Scaron ; B 54 -22 689 790 ;\nC -1 ; WX 600 ; N Scommaaccent ; B 54 -250 673 582 ;\nC -1 ; WX 600 ; N Ohungarumlaut ; B 74 -18 795 784 ;\nC -1 ; WX 600 ; N degree ; B 173 243 570 616 ;\nC -1 ; WX 600 ; N ograve ; B 71 -15 622 661 ;\nC -1 ; WX 600 ; N Ccaron ; B 74 -18 689 790 ;\nC -1 ; WX 600 ; N ugrave ; B 70 -15 592 661 ;\nC -1 ; WX 600 ; N radical ; B 67 -104 635 778 ;\nC -1 ; WX 600 ; N Dcaron ; B 30 0 664 790 ;\nC -1 ; WX 600 ; N rcommaaccent ; B 47 -250 655 454 ;\nC -1 ; WX 600 ; N Ntilde ; B 8 -12 730 759 ;\nC -1 ; WX 600 ; N otilde ; B 71 -15 643 636 ;\nC -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 617 562 ;\nC -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 636 562 ;\nC -1 ; WX 600 ; N Atilde ; B -9 0 669 759 ;\nC -1 ; WX 600 ; N Aogonek ; B -9 -199 632 562 ;\nC -1 ; WX 600 ; N Aring ; B -9 0 632 801 ;\nC -1 ; WX 600 ; N Otilde ; B 74 -18 669 759 ;\nC -1 ; WX 600 ; N zdotaccent ; B 81 0 614 638 ;\nC -1 ; WX 600 ; N Ecaron ; B 25 0 670 790 ;\nC -1 ; WX 600 ; N Iogonek ; B 77 -199 643 562 ;\nC -1 ; WX 600 ; N kcommaaccent ; B 33 -250 643 626 ;\nC -1 ; WX 600 ; N minus ; B 114 203 596 313 ;\nC -1 ; WX 600 ; N Icircumflex ; B 77 0 643 780 ;\nC -1 ; WX 600 ; N ncaron ; B 18 0 633 667 ;\nC -1 ; WX 600 ; N tcommaaccent ; B 118 -250 567 562 ;\nC -1 ; WX 600 ; N logicalnot ; B 135 103 617 413 ;\nC -1 ; WX 600 ; N odieresis ; B 71 -15 622 638 ;\nC -1 ; WX 600 ; N udieresis ; B 70 -15 595 638 ;\nC -1 ; WX 600 ; N notequal ; B 30 -47 626 563 ;\nC -1 ; WX 600 ; N gcommaaccent ; B 40 -146 674 714 ;\nC -1 ; WX 600 ; N eth ; B 93 -27 661 626 ;\nC -1 ; WX 600 ; N zcaron ; B 81 0 643 667 ;\nC -1 ; WX 600 ; N ncommaaccent ; B 18 -250 615 454 ;\nC -1 ; WX 600 ; N onesuperior ; B 212 230 514 616 ;\nC -1 ; WX 600 ; N imacron ; B 77 0 575 585 ;\nC -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/Courier-Oblique.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 17:37:52 1997\nComment UniqueID 43051\nComment VMusage 16248 75829\nFontName Courier-Oblique\nFullName Courier Oblique\nFamilyName Courier\nWeight Medium\nItalicAngle -12\nIsFixedPitch true\nCharacterSet ExtendedRoman\nFontBBox -27 -250 849 805 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 003.000\nNotice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 562\nXHeight 426\nAscender 629\nDescender -157\nStdHW 51\nStdVW 51\nStartCharMetrics 315\nC 32 ; WX 600 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 600 ; N exclam ; B 243 -15 464 572 ;\nC 34 ; WX 600 ; N quotedbl ; B 273 328 532 562 ;\nC 35 ; WX 600 ; N numbersign ; B 133 -32 596 639 ;\nC 36 ; WX 600 ; N dollar ; B 108 -126 596 662 ;\nC 37 ; WX 600 ; N percent ; B 134 -15 599 622 ;\nC 38 ; WX 600 ; N ampersand ; B 87 -15 580 543 ;\nC 39 ; WX 600 ; N quoteright ; B 283 328 495 562 ;\nC 40 ; WX 600 ; N parenleft ; B 313 -108 572 622 ;\nC 41 ; WX 600 ; N parenright ; B 137 -108 396 622 ;\nC 42 ; WX 600 ; N asterisk ; B 212 257 580 607 ;\nC 43 ; WX 600 ; N plus ; B 129 44 580 470 ;\nC 44 ; WX 600 ; N comma ; B 157 -112 370 122 ;\nC 45 ; WX 600 ; N hyphen ; B 152 231 558 285 ;\nC 46 ; WX 600 ; N period ; B 238 -15 382 109 ;\nC 47 ; WX 600 ; N slash ; B 112 -80 604 629 ;\nC 48 ; WX 600 ; N zero ; B 154 -15 575 622 ;\nC 49 ; WX 600 ; N one ; B 98 0 515 622 ;\nC 50 ; WX 600 ; N two ; B 70 0 568 622 ;\nC 51 ; WX 600 ; N three ; B 82 -15 538 622 ;\nC 52 ; WX 600 ; N four ; B 108 0 541 622 ;\nC 53 ; WX 600 ; N five ; B 99 -15 589 607 ;\nC 54 ; WX 600 ; N six ; B 155 -15 629 622 ;\nC 55 ; WX 600 ; N seven ; B 182 0 612 607 ;\nC 56 ; WX 600 ; N eight ; B 132 -15 588 622 ;\nC 57 ; WX 600 ; N nine ; B 93 -15 574 622 ;\nC 58 ; WX 600 ; N colon ; B 238 -15 441 385 ;\nC 59 ; WX 600 ; N semicolon ; B 157 -112 441 385 ;\nC 60 ; WX 600 ; N less ; B 96 42 610 472 ;\nC 61 ; WX 600 ; N equal ; B 109 138 600 376 ;\nC 62 ; WX 600 ; N greater ; B 85 42 599 472 ;\nC 63 ; WX 600 ; N question ; B 222 -15 583 572 ;\nC 64 ; WX 600 ; N at ; B 127 -15 582 622 ;\nC 65 ; WX 600 ; N A ; B 3 0 607 562 ;\nC 66 ; WX 600 ; N B ; B 43 0 616 562 ;\nC 67 ; WX 600 ; N C ; B 93 -18 655 580 ;\nC 68 ; WX 600 ; N D ; B 43 0 645 562 ;\nC 69 ; WX 600 ; N E ; B 53 0 660 562 ;\nC 70 ; WX 600 ; N F ; B 53 0 660 562 ;\nC 71 ; WX 600 ; N G ; B 83 -18 645 580 ;\nC 72 ; WX 600 ; N H ; B 32 0 687 562 ;\nC 73 ; WX 600 ; N I ; B 96 0 623 562 ;\nC 74 ; WX 600 ; N J ; B 52 -18 685 562 ;\nC 75 ; WX 600 ; N K ; B 38 0 671 562 ;\nC 76 ; WX 600 ; N L ; B 47 0 607 562 ;\nC 77 ; WX 600 ; N M ; B 4 0 715 562 ;\nC 78 ; WX 600 ; N N ; B 7 -13 712 562 ;\nC 79 ; WX 600 ; N O ; B 94 -18 625 580 ;\nC 80 ; WX 600 ; N P ; B 79 0 644 562 ;\nC 81 ; WX 600 ; N Q ; B 95 -138 625 580 ;\nC 82 ; WX 600 ; N R ; B 38 0 598 562 ;\nC 83 ; WX 600 ; N S ; B 76 -20 650 580 ;\nC 84 ; WX 600 ; N T ; B 108 0 665 562 ;\nC 85 ; WX 600 ; N U ; B 125 -18 702 562 ;\nC 86 ; WX 600 ; N V ; B 105 -13 723 562 ;\nC 87 ; WX 600 ; N W ; B 106 -13 722 562 ;\nC 88 ; WX 600 ; N X ; B 23 0 675 562 ;\nC 89 ; WX 600 ; N Y ; B 133 0 695 562 ;\nC 90 ; WX 600 ; N Z ; B 86 0 610 562 ;\nC 91 ; WX 600 ; N bracketleft ; B 246 -108 574 622 ;\nC 92 ; WX 600 ; N backslash ; B 249 -80 468 629 ;\nC 93 ; WX 600 ; N bracketright ; B 135 -108 463 622 ;\nC 94 ; WX 600 ; N asciicircum ; B 175 354 587 622 ;\nC 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 343 328 457 562 ;\nC 97 ; WX 600 ; N a ; B 76 -15 569 441 ;\nC 98 ; WX 600 ; N b ; B 29 -15 625 629 ;\nC 99 ; WX 600 ; N c ; B 106 -15 608 441 ;\nC 100 ; WX 600 ; N d ; B 85 -15 640 629 ;\nC 101 ; WX 600 ; N e ; B 106 -15 598 441 ;\nC 102 ; WX 600 ; N f ; B 114 0 662 629 ; L i fi ; L l fl ;\nC 103 ; WX 600 ; N g ; B 61 -157 657 441 ;\nC 104 ; WX 600 ; N h ; B 33 0 592 629 ;\nC 105 ; WX 600 ; N i ; B 95 0 515 657 ;\nC 106 ; WX 600 ; N j ; B 52 -157 550 657 ;\nC 107 ; WX 600 ; N k ; B 58 0 633 629 ;\nC 108 ; WX 600 ; N l ; B 95 0 515 629 ;\nC 109 ; WX 600 ; N m ; B -5 0 615 441 ;\nC 110 ; WX 600 ; N n ; B 26 0 585 441 ;\nC 111 ; WX 600 ; N o ; B 102 -15 588 441 ;\nC 112 ; WX 600 ; N p ; B -24 -157 605 441 ;\nC 113 ; WX 600 ; N q ; B 85 -157 682 441 ;\nC 114 ; WX 600 ; N r ; B 60 0 636 441 ;\nC 115 ; WX 600 ; N s ; B 78 -15 584 441 ;\nC 116 ; WX 600 ; N t ; B 167 -15 561 561 ;\nC 117 ; WX 600 ; N u ; B 101 -15 572 426 ;\nC 118 ; WX 600 ; N v ; B 90 -10 681 426 ;\nC 119 ; WX 600 ; N w ; B 76 -10 695 426 ;\nC 120 ; WX 600 ; N x ; B 20 0 655 426 ;\nC 121 ; WX 600 ; N y ; B -4 -157 683 426 ;\nC 122 ; WX 600 ; N z ; B 99 0 593 426 ;\nC 123 ; WX 600 ; N braceleft ; B 233 -108 569 622 ;\nC 124 ; WX 600 ; N bar ; B 222 -250 485 750 ;\nC 125 ; WX 600 ; N braceright ; B 140 -108 477 622 ;\nC 126 ; WX 600 ; N asciitilde ; B 116 197 600 320 ;\nC 161 ; WX 600 ; N exclamdown ; B 225 -157 445 430 ;\nC 162 ; WX 600 ; N cent ; B 151 -49 588 614 ;\nC 163 ; WX 600 ; N sterling ; B 124 -21 621 611 ;\nC 164 ; WX 600 ; N fraction ; B 84 -57 646 665 ;\nC 165 ; WX 600 ; N yen ; B 120 0 693 562 ;\nC 166 ; WX 600 ; N florin ; B -26 -143 671 622 ;\nC 167 ; WX 600 ; N section ; B 104 -78 590 580 ;\nC 168 ; WX 600 ; N currency ; B 94 58 628 506 ;\nC 169 ; WX 600 ; N quotesingle ; B 345 328 460 562 ;\nC 170 ; WX 600 ; N quotedblleft ; B 262 328 541 562 ;\nC 171 ; WX 600 ; N guillemotleft ; B 92 70 652 446 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 204 70 540 446 ;\nC 173 ; WX 600 ; N guilsinglright ; B 170 70 506 446 ;\nC 174 ; WX 600 ; N fi ; B 3 0 619 629 ;\nC 175 ; WX 600 ; N fl ; B 3 0 619 629 ;\nC 177 ; WX 600 ; N endash ; B 124 231 586 285 ;\nC 178 ; WX 600 ; N dagger ; B 217 -78 546 580 ;\nC 179 ; WX 600 ; N daggerdbl ; B 163 -78 546 580 ;\nC 180 ; WX 600 ; N periodcentered ; B 275 189 434 327 ;\nC 182 ; WX 600 ; N paragraph ; B 100 -78 630 562 ;\nC 183 ; WX 600 ; N bullet ; B 224 130 485 383 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 185 -134 397 100 ;\nC 185 ; WX 600 ; N quotedblbase ; B 115 -134 478 100 ;\nC 186 ; WX 600 ; N quotedblright ; B 213 328 576 562 ;\nC 187 ; WX 600 ; N guillemotright ; B 58 70 618 446 ;\nC 188 ; WX 600 ; N ellipsis ; B 46 -15 575 111 ;\nC 189 ; WX 600 ; N perthousand ; B 59 -15 627 622 ;\nC 191 ; WX 600 ; N questiondown ; B 105 -157 466 430 ;\nC 193 ; WX 600 ; N grave ; B 294 497 484 672 ;\nC 194 ; WX 600 ; N acute ; B 348 497 612 672 ;\nC 195 ; WX 600 ; N circumflex ; B 229 477 581 654 ;\nC 196 ; WX 600 ; N tilde ; B 212 489 629 606 ;\nC 197 ; WX 600 ; N macron ; B 232 525 600 565 ;\nC 198 ; WX 600 ; N breve ; B 279 501 576 609 ;\nC 199 ; WX 600 ; N dotaccent ; B 373 537 478 640 ;\nC 200 ; WX 600 ; N dieresis ; B 272 537 579 640 ;\nC 202 ; WX 600 ; N ring ; B 332 463 500 627 ;\nC 203 ; WX 600 ; N cedilla ; B 197 -151 344 10 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 239 497 683 672 ;\nC 206 ; WX 600 ; N ogonek ; B 189 -172 377 4 ;\nC 207 ; WX 600 ; N caron ; B 262 492 614 669 ;\nC 208 ; WX 600 ; N emdash ; B 49 231 661 285 ;\nC 225 ; WX 600 ; N AE ; B 3 0 655 562 ;\nC 227 ; WX 600 ; N ordfeminine ; B 209 249 512 580 ;\nC 232 ; WX 600 ; N Lslash ; B 47 0 607 562 ;\nC 233 ; WX 600 ; N Oslash ; B 94 -80 625 629 ;\nC 234 ; WX 600 ; N OE ; B 59 0 672 562 ;\nC 235 ; WX 600 ; N ordmasculine ; B 210 249 535 580 ;\nC 241 ; WX 600 ; N ae ; B 41 -15 626 441 ;\nC 245 ; WX 600 ; N dotlessi ; B 95 0 515 426 ;\nC 248 ; WX 600 ; N lslash ; B 95 0 587 629 ;\nC 249 ; WX 600 ; N oslash ; B 102 -80 588 506 ;\nC 250 ; WX 600 ; N oe ; B 54 -15 615 441 ;\nC 251 ; WX 600 ; N germandbls ; B 48 -15 617 629 ;\nC -1 ; WX 600 ; N Idieresis ; B 96 0 623 753 ;\nC -1 ; WX 600 ; N eacute ; B 106 -15 612 672 ;\nC -1 ; WX 600 ; N abreve ; B 76 -15 576 609 ;\nC -1 ; WX 600 ; N uhungarumlaut ; B 101 -15 723 672 ;\nC -1 ; WX 600 ; N ecaron ; B 106 -15 614 669 ;\nC -1 ; WX 600 ; N Ydieresis ; B 133 0 695 753 ;\nC -1 ; WX 600 ; N divide ; B 136 48 573 467 ;\nC -1 ; WX 600 ; N Yacute ; B 133 0 695 805 ;\nC -1 ; WX 600 ; N Acircumflex ; B 3 0 607 787 ;\nC -1 ; WX 600 ; N aacute ; B 76 -15 612 672 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 125 -18 702 787 ;\nC -1 ; WX 600 ; N yacute ; B -4 -157 683 672 ;\nC -1 ; WX 600 ; N scommaaccent ; B 78 -250 584 441 ;\nC -1 ; WX 600 ; N ecircumflex ; B 106 -15 598 654 ;\nC -1 ; WX 600 ; N Uring ; B 125 -18 702 760 ;\nC -1 ; WX 600 ; N Udieresis ; B 125 -18 702 753 ;\nC -1 ; WX 600 ; N aogonek ; B 76 -172 569 441 ;\nC -1 ; WX 600 ; N Uacute ; B 125 -18 702 805 ;\nC -1 ; WX 600 ; N uogonek ; B 101 -172 572 426 ;\nC -1 ; WX 600 ; N Edieresis ; B 53 0 660 753 ;\nC -1 ; WX 600 ; N Dcroat ; B 43 0 645 562 ;\nC -1 ; WX 600 ; N commaaccent ; B 145 -250 323 -58 ;\nC -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ;\nC -1 ; WX 600 ; N Emacron ; B 53 0 660 698 ;\nC -1 ; WX 600 ; N ccaron ; B 106 -15 614 669 ;\nC -1 ; WX 600 ; N aring ; B 76 -15 569 627 ;\nC -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 712 562 ;\nC -1 ; WX 600 ; N lacute ; B 95 0 640 805 ;\nC -1 ; WX 600 ; N agrave ; B 76 -15 569 672 ;\nC -1 ; WX 600 ; N Tcommaaccent ; B 108 -250 665 562 ;\nC -1 ; WX 600 ; N Cacute ; B 93 -18 655 805 ;\nC -1 ; WX 600 ; N atilde ; B 76 -15 629 606 ;\nC -1 ; WX 600 ; N Edotaccent ; B 53 0 660 753 ;\nC -1 ; WX 600 ; N scaron ; B 78 -15 614 669 ;\nC -1 ; WX 600 ; N scedilla ; B 78 -151 584 441 ;\nC -1 ; WX 600 ; N iacute ; B 95 0 612 672 ;\nC -1 ; WX 600 ; N lozenge ; B 94 0 519 706 ;\nC -1 ; WX 600 ; N Rcaron ; B 38 0 642 802 ;\nC -1 ; WX 600 ; N Gcommaaccent ; B 83 -250 645 580 ;\nC -1 ; WX 600 ; N ucircumflex ; B 101 -15 572 654 ;\nC -1 ; WX 600 ; N acircumflex ; B 76 -15 581 654 ;\nC -1 ; WX 600 ; N Amacron ; B 3 0 607 698 ;\nC -1 ; WX 600 ; N rcaron ; B 60 0 636 669 ;\nC -1 ; WX 600 ; N ccedilla ; B 106 -151 614 441 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 86 0 610 753 ;\nC -1 ; WX 600 ; N Thorn ; B 79 0 606 562 ;\nC -1 ; WX 600 ; N Omacron ; B 94 -18 628 698 ;\nC -1 ; WX 600 ; N Racute ; B 38 0 670 805 ;\nC -1 ; WX 600 ; N Sacute ; B 76 -20 650 805 ;\nC -1 ; WX 600 ; N dcaron ; B 85 -15 849 629 ;\nC -1 ; WX 600 ; N Umacron ; B 125 -18 702 698 ;\nC -1 ; WX 600 ; N uring ; B 101 -15 572 627 ;\nC -1 ; WX 600 ; N threesuperior ; B 213 240 501 622 ;\nC -1 ; WX 600 ; N Ograve ; B 94 -18 625 805 ;\nC -1 ; WX 600 ; N Agrave ; B 3 0 607 805 ;\nC -1 ; WX 600 ; N Abreve ; B 3 0 607 732 ;\nC -1 ; WX 600 ; N multiply ; B 103 43 607 470 ;\nC -1 ; WX 600 ; N uacute ; B 101 -15 602 672 ;\nC -1 ; WX 600 ; N Tcaron ; B 108 0 665 802 ;\nC -1 ; WX 600 ; N partialdiff ; B 45 -38 546 710 ;\nC -1 ; WX 600 ; N ydieresis ; B -4 -157 683 620 ;\nC -1 ; WX 600 ; N Nacute ; B 7 -13 712 805 ;\nC -1 ; WX 600 ; N icircumflex ; B 95 0 551 654 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 53 0 660 787 ;\nC -1 ; WX 600 ; N adieresis ; B 76 -15 575 620 ;\nC -1 ; WX 600 ; N edieresis ; B 106 -15 598 620 ;\nC -1 ; WX 600 ; N cacute ; B 106 -15 612 672 ;\nC -1 ; WX 600 ; N nacute ; B 26 0 602 672 ;\nC -1 ; WX 600 ; N umacron ; B 101 -15 600 565 ;\nC -1 ; WX 600 ; N Ncaron ; B 7 -13 712 802 ;\nC -1 ; WX 600 ; N Iacute ; B 96 0 640 805 ;\nC -1 ; WX 600 ; N plusminus ; B 96 44 594 558 ;\nC -1 ; WX 600 ; N brokenbar ; B 238 -175 469 675 ;\nC -1 ; WX 600 ; N registered ; B 53 -18 667 580 ;\nC -1 ; WX 600 ; N Gbreve ; B 83 -18 645 732 ;\nC -1 ; WX 600 ; N Idotaccent ; B 96 0 623 753 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 670 706 ;\nC -1 ; WX 600 ; N Egrave ; B 53 0 660 805 ;\nC -1 ; WX 600 ; N racute ; B 60 0 636 672 ;\nC -1 ; WX 600 ; N omacron ; B 102 -15 600 565 ;\nC -1 ; WX 600 ; N Zacute ; B 86 0 670 805 ;\nC -1 ; WX 600 ; N Zcaron ; B 86 0 642 802 ;\nC -1 ; WX 600 ; N greaterequal ; B 98 0 594 710 ;\nC -1 ; WX 600 ; N Eth ; B 43 0 645 562 ;\nC -1 ; WX 600 ; N Ccedilla ; B 93 -151 658 580 ;\nC -1 ; WX 600 ; N lcommaaccent ; B 95 -250 515 629 ;\nC -1 ; WX 600 ; N tcaron ; B 167 -15 587 717 ;\nC -1 ; WX 600 ; N eogonek ; B 106 -172 598 441 ;\nC -1 ; WX 600 ; N Uogonek ; B 124 -172 702 562 ;\nC -1 ; WX 600 ; N Aacute ; B 3 0 660 805 ;\nC -1 ; WX 600 ; N Adieresis ; B 3 0 607 753 ;\nC -1 ; WX 600 ; N egrave ; B 106 -15 598 672 ;\nC -1 ; WX 600 ; N zacute ; B 99 0 612 672 ;\nC -1 ; WX 600 ; N iogonek ; B 95 -172 515 657 ;\nC -1 ; WX 600 ; N Oacute ; B 94 -18 640 805 ;\nC -1 ; WX 600 ; N oacute ; B 102 -15 612 672 ;\nC -1 ; WX 600 ; N amacron ; B 76 -15 600 565 ;\nC -1 ; WX 600 ; N sacute ; B 78 -15 612 672 ;\nC -1 ; WX 600 ; N idieresis ; B 95 0 545 620 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 94 -18 625 787 ;\nC -1 ; WX 600 ; N Ugrave ; B 125 -18 702 805 ;\nC -1 ; WX 600 ; N Delta ; B 6 0 598 688 ;\nC -1 ; WX 600 ; N thorn ; B -24 -157 605 629 ;\nC -1 ; WX 600 ; N twosuperior ; B 230 249 535 622 ;\nC -1 ; WX 600 ; N Odieresis ; B 94 -18 625 753 ;\nC -1 ; WX 600 ; N mu ; B 72 -157 572 426 ;\nC -1 ; WX 600 ; N igrave ; B 95 0 515 672 ;\nC -1 ; WX 600 ; N ohungarumlaut ; B 102 -15 723 672 ;\nC -1 ; WX 600 ; N Eogonek ; B 53 -172 660 562 ;\nC -1 ; WX 600 ; N dcroat ; B 85 -15 704 629 ;\nC -1 ; WX 600 ; N threequarters ; B 73 -56 659 666 ;\nC -1 ; WX 600 ; N Scedilla ; B 76 -151 650 580 ;\nC -1 ; WX 600 ; N lcaron ; B 95 0 667 629 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 671 562 ;\nC -1 ; WX 600 ; N Lacute ; B 47 0 607 805 ;\nC -1 ; WX 600 ; N trademark ; B 75 263 742 562 ;\nC -1 ; WX 600 ; N edotaccent ; B 106 -15 598 620 ;\nC -1 ; WX 600 ; N Igrave ; B 96 0 623 805 ;\nC -1 ; WX 600 ; N Imacron ; B 96 0 628 698 ;\nC -1 ; WX 600 ; N Lcaron ; B 47 0 632 562 ;\nC -1 ; WX 600 ; N onehalf ; B 65 -57 669 665 ;\nC -1 ; WX 600 ; N lessequal ; B 98 0 645 710 ;\nC -1 ; WX 600 ; N ocircumflex ; B 102 -15 588 654 ;\nC -1 ; WX 600 ; N ntilde ; B 26 0 629 606 ;\nC -1 ; WX 600 ; N Uhungarumlaut ; B 125 -18 761 805 ;\nC -1 ; WX 600 ; N Eacute ; B 53 0 670 805 ;\nC -1 ; WX 600 ; N emacron ; B 106 -15 600 565 ;\nC -1 ; WX 600 ; N gbreve ; B 61 -157 657 609 ;\nC -1 ; WX 600 ; N onequarter ; B 65 -57 674 665 ;\nC -1 ; WX 600 ; N Scaron ; B 76 -20 672 802 ;\nC -1 ; WX 600 ; N Scommaaccent ; B 76 -250 650 580 ;\nC -1 ; WX 600 ; N Ohungarumlaut ; B 94 -18 751 805 ;\nC -1 ; WX 600 ; N degree ; B 214 269 576 622 ;\nC -1 ; WX 600 ; N ograve ; B 102 -15 588 672 ;\nC -1 ; WX 600 ; N Ccaron ; B 93 -18 672 802 ;\nC -1 ; WX 600 ; N ugrave ; B 101 -15 572 672 ;\nC -1 ; WX 600 ; N radical ; B 85 -15 765 792 ;\nC -1 ; WX 600 ; N Dcaron ; B 43 0 645 802 ;\nC -1 ; WX 600 ; N rcommaaccent ; B 60 -250 636 441 ;\nC -1 ; WX 600 ; N Ntilde ; B 7 -13 712 729 ;\nC -1 ; WX 600 ; N otilde ; B 102 -15 629 606 ;\nC -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 598 562 ;\nC -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 607 562 ;\nC -1 ; WX 600 ; N Atilde ; B 3 0 655 729 ;\nC -1 ; WX 600 ; N Aogonek ; B 3 -172 607 562 ;\nC -1 ; WX 600 ; N Aring ; B 3 0 607 750 ;\nC -1 ; WX 600 ; N Otilde ; B 94 -18 655 729 ;\nC -1 ; WX 600 ; N zdotaccent ; B 99 0 593 620 ;\nC -1 ; WX 600 ; N Ecaron ; B 53 0 660 802 ;\nC -1 ; WX 600 ; N Iogonek ; B 96 -172 623 562 ;\nC -1 ; WX 600 ; N kcommaaccent ; B 58 -250 633 629 ;\nC -1 ; WX 600 ; N minus ; B 129 232 580 283 ;\nC -1 ; WX 600 ; N Icircumflex ; B 96 0 623 787 ;\nC -1 ; WX 600 ; N ncaron ; B 26 0 614 669 ;\nC -1 ; WX 600 ; N tcommaaccent ; B 165 -250 561 561 ;\nC -1 ; WX 600 ; N logicalnot ; B 155 108 591 369 ;\nC -1 ; WX 600 ; N odieresis ; B 102 -15 588 620 ;\nC -1 ; WX 600 ; N udieresis ; B 101 -15 575 620 ;\nC -1 ; WX 600 ; N notequal ; B 43 -16 621 529 ;\nC -1 ; WX 600 ; N gcommaaccent ; B 61 -157 657 708 ;\nC -1 ; WX 600 ; N eth ; B 102 -15 639 629 ;\nC -1 ; WX 600 ; N zcaron ; B 99 0 624 669 ;\nC -1 ; WX 600 ; N ncommaaccent ; B 26 -250 585 441 ;\nC -1 ; WX 600 ; N onesuperior ; B 231 249 491 622 ;\nC -1 ; WX 600 ; N imacron ; B 95 0 543 565 ;\nC -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/Courier.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 17:27:09 1997\nComment UniqueID 43050\nComment VMusage 39754 50779\nFontName Courier\nFullName Courier\nFamilyName Courier\nWeight Medium\nItalicAngle 0\nIsFixedPitch true\nCharacterSet ExtendedRoman\nFontBBox -23 -250 715 805 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 003.000\nNotice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nEncodingScheme AdobeStandardEncoding\nCapHeight 562\nXHeight 426\nAscender 629\nDescender -157\nStdHW 51\nStdVW 51\nStartCharMetrics 315\nC 32 ; WX 600 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 600 ; N exclam ; B 236 -15 364 572 ;\nC 34 ; WX 600 ; N quotedbl ; B 187 328 413 562 ;\nC 35 ; WX 600 ; N numbersign ; B 93 -32 507 639 ;\nC 36 ; WX 600 ; N dollar ; B 105 -126 496 662 ;\nC 37 ; WX 600 ; N percent ; B 81 -15 518 622 ;\nC 38 ; WX 600 ; N ampersand ; B 63 -15 538 543 ;\nC 39 ; WX 600 ; N quoteright ; B 213 328 376 562 ;\nC 40 ; WX 600 ; N parenleft ; B 269 -108 440 622 ;\nC 41 ; WX 600 ; N parenright ; B 160 -108 331 622 ;\nC 42 ; WX 600 ; N asterisk ; B 116 257 484 607 ;\nC 43 ; WX 600 ; N plus ; B 80 44 520 470 ;\nC 44 ; WX 600 ; N comma ; B 181 -112 344 122 ;\nC 45 ; WX 600 ; N hyphen ; B 103 231 497 285 ;\nC 46 ; WX 600 ; N period ; B 229 -15 371 109 ;\nC 47 ; WX 600 ; N slash ; B 125 -80 475 629 ;\nC 48 ; WX 600 ; N zero ; B 106 -15 494 622 ;\nC 49 ; WX 600 ; N one ; B 96 0 505 622 ;\nC 50 ; WX 600 ; N two ; B 70 0 471 622 ;\nC 51 ; WX 600 ; N three ; B 75 -15 466 622 ;\nC 52 ; WX 600 ; N four ; B 78 0 500 622 ;\nC 53 ; WX 600 ; N five ; B 92 -15 497 607 ;\nC 54 ; WX 600 ; N six ; B 111 -15 497 622 ;\nC 55 ; WX 600 ; N seven ; B 82 0 483 607 ;\nC 56 ; WX 600 ; N eight ; B 102 -15 498 622 ;\nC 57 ; WX 600 ; N nine ; B 96 -15 489 622 ;\nC 58 ; WX 600 ; N colon ; B 229 -15 371 385 ;\nC 59 ; WX 600 ; N semicolon ; B 181 -112 371 385 ;\nC 60 ; WX 600 ; N less ; B 41 42 519 472 ;\nC 61 ; WX 600 ; N equal ; B 80 138 520 376 ;\nC 62 ; WX 600 ; N greater ; B 66 42 544 472 ;\nC 63 ; WX 600 ; N question ; B 129 -15 492 572 ;\nC 64 ; WX 600 ; N at ; B 77 -15 533 622 ;\nC 65 ; WX 600 ; N A ; B 3 0 597 562 ;\nC 66 ; WX 600 ; N B ; B 43 0 559 562 ;\nC 67 ; WX 600 ; N C ; B 41 -18 540 580 ;\nC 68 ; WX 600 ; N D ; B 43 0 574 562 ;\nC 69 ; WX 600 ; N E ; B 53 0 550 562 ;\nC 70 ; WX 600 ; N F ; B 53 0 545 562 ;\nC 71 ; WX 600 ; N G ; B 31 -18 575 580 ;\nC 72 ; WX 600 ; N H ; B 32 0 568 562 ;\nC 73 ; WX 600 ; N I ; B 96 0 504 562 ;\nC 74 ; WX 600 ; N J ; B 34 -18 566 562 ;\nC 75 ; WX 600 ; N K ; B 38 0 582 562 ;\nC 76 ; WX 600 ; N L ; B 47 0 554 562 ;\nC 77 ; WX 600 ; N M ; B 4 0 596 562 ;\nC 78 ; WX 600 ; N N ; B 7 -13 593 562 ;\nC 79 ; WX 600 ; N O ; B 43 -18 557 580 ;\nC 80 ; WX 600 ; N P ; B 79 0 558 562 ;\nC 81 ; WX 600 ; N Q ; B 43 -138 557 580 ;\nC 82 ; WX 600 ; N R ; B 38 0 588 562 ;\nC 83 ; WX 600 ; N S ; B 72 -20 529 580 ;\nC 84 ; WX 600 ; N T ; B 38 0 563 562 ;\nC 85 ; WX 600 ; N U ; B 17 -18 583 562 ;\nC 86 ; WX 600 ; N V ; B -4 -13 604 562 ;\nC 87 ; WX 600 ; N W ; B -3 -13 603 562 ;\nC 88 ; WX 600 ; N X ; B 23 0 577 562 ;\nC 89 ; WX 600 ; N Y ; B 24 0 576 562 ;\nC 90 ; WX 600 ; N Z ; B 86 0 514 562 ;\nC 91 ; WX 600 ; N bracketleft ; B 269 -108 442 622 ;\nC 92 ; WX 600 ; N backslash ; B 118 -80 482 629 ;\nC 93 ; WX 600 ; N bracketright ; B 158 -108 331 622 ;\nC 94 ; WX 600 ; N asciicircum ; B 94 354 506 622 ;\nC 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 224 328 387 562 ;\nC 97 ; WX 600 ; N a ; B 53 -15 559 441 ;\nC 98 ; WX 600 ; N b ; B 14 -15 575 629 ;\nC 99 ; WX 600 ; N c ; B 66 -15 529 441 ;\nC 100 ; WX 600 ; N d ; B 45 -15 591 629 ;\nC 101 ; WX 600 ; N e ; B 66 -15 548 441 ;\nC 102 ; WX 600 ; N f ; B 114 0 531 629 ; L i fi ; L l fl ;\nC 103 ; WX 600 ; N g ; B 45 -157 566 441 ;\nC 104 ; WX 600 ; N h ; B 18 0 582 629 ;\nC 105 ; WX 600 ; N i ; B 95 0 505 657 ;\nC 106 ; WX 600 ; N j ; B 82 -157 410 657 ;\nC 107 ; WX 600 ; N k ; B 43 0 580 629 ;\nC 108 ; WX 600 ; N l ; B 95 0 505 629 ;\nC 109 ; WX 600 ; N m ; B -5 0 605 441 ;\nC 110 ; WX 600 ; N n ; B 26 0 575 441 ;\nC 111 ; WX 600 ; N o ; B 62 -15 538 441 ;\nC 112 ; WX 600 ; N p ; B 9 -157 555 441 ;\nC 113 ; WX 600 ; N q ; B 45 -157 591 441 ;\nC 114 ; WX 600 ; N r ; B 60 0 559 441 ;\nC 115 ; WX 600 ; N s ; B 80 -15 513 441 ;\nC 116 ; WX 600 ; N t ; B 87 -15 530 561 ;\nC 117 ; WX 600 ; N u ; B 21 -15 562 426 ;\nC 118 ; WX 600 ; N v ; B 10 -10 590 426 ;\nC 119 ; WX 600 ; N w ; B -4 -10 604 426 ;\nC 120 ; WX 600 ; N x ; B 20 0 580 426 ;\nC 121 ; WX 600 ; N y ; B 7 -157 592 426 ;\nC 122 ; WX 600 ; N z ; B 99 0 502 426 ;\nC 123 ; WX 600 ; N braceleft ; B 182 -108 437 622 ;\nC 124 ; WX 600 ; N bar ; B 275 -250 326 750 ;\nC 125 ; WX 600 ; N braceright ; B 163 -108 418 622 ;\nC 126 ; WX 600 ; N asciitilde ; B 63 197 540 320 ;\nC 161 ; WX 600 ; N exclamdown ; B 236 -157 364 430 ;\nC 162 ; WX 600 ; N cent ; B 96 -49 500 614 ;\nC 163 ; WX 600 ; N sterling ; B 84 -21 521 611 ;\nC 164 ; WX 600 ; N fraction ; B 92 -57 509 665 ;\nC 165 ; WX 600 ; N yen ; B 26 0 574 562 ;\nC 166 ; WX 600 ; N florin ; B 4 -143 539 622 ;\nC 167 ; WX 600 ; N section ; B 113 -78 488 580 ;\nC 168 ; WX 600 ; N currency ; B 73 58 527 506 ;\nC 169 ; WX 600 ; N quotesingle ; B 259 328 341 562 ;\nC 170 ; WX 600 ; N quotedblleft ; B 143 328 471 562 ;\nC 171 ; WX 600 ; N guillemotleft ; B 37 70 563 446 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 149 70 451 446 ;\nC 173 ; WX 600 ; N guilsinglright ; B 149 70 451 446 ;\nC 174 ; WX 600 ; N fi ; B 3 0 597 629 ;\nC 175 ; WX 600 ; N fl ; B 3 0 597 629 ;\nC 177 ; WX 600 ; N endash ; B 75 231 525 285 ;\nC 178 ; WX 600 ; N dagger ; B 141 -78 459 580 ;\nC 179 ; WX 600 ; N daggerdbl ; B 141 -78 459 580 ;\nC 180 ; WX 600 ; N periodcentered ; B 222 189 378 327 ;\nC 182 ; WX 600 ; N paragraph ; B 50 -78 511 562 ;\nC 183 ; WX 600 ; N bullet ; B 172 130 428 383 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 213 -134 376 100 ;\nC 185 ; WX 600 ; N quotedblbase ; B 143 -134 457 100 ;\nC 186 ; WX 600 ; N quotedblright ; B 143 328 457 562 ;\nC 187 ; WX 600 ; N guillemotright ; B 37 70 563 446 ;\nC 188 ; WX 600 ; N ellipsis ; B 37 -15 563 111 ;\nC 189 ; WX 600 ; N perthousand ; B 3 -15 600 622 ;\nC 191 ; WX 600 ; N questiondown ; B 108 -157 471 430 ;\nC 193 ; WX 600 ; N grave ; B 151 497 378 672 ;\nC 194 ; WX 600 ; N acute ; B 242 497 469 672 ;\nC 195 ; WX 600 ; N circumflex ; B 124 477 476 654 ;\nC 196 ; WX 600 ; N tilde ; B 105 489 503 606 ;\nC 197 ; WX 600 ; N macron ; B 120 525 480 565 ;\nC 198 ; WX 600 ; N breve ; B 153 501 447 609 ;\nC 199 ; WX 600 ; N dotaccent ; B 249 537 352 640 ;\nC 200 ; WX 600 ; N dieresis ; B 148 537 453 640 ;\nC 202 ; WX 600 ; N ring ; B 218 463 382 627 ;\nC 203 ; WX 600 ; N cedilla ; B 224 -151 362 10 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 133 497 540 672 ;\nC 206 ; WX 600 ; N ogonek ; B 211 -172 407 4 ;\nC 207 ; WX 600 ; N caron ; B 124 492 476 669 ;\nC 208 ; WX 600 ; N emdash ; B 0 231 600 285 ;\nC 225 ; WX 600 ; N AE ; B 3 0 550 562 ;\nC 227 ; WX 600 ; N ordfeminine ; B 156 249 442 580 ;\nC 232 ; WX 600 ; N Lslash ; B 47 0 554 562 ;\nC 233 ; WX 600 ; N Oslash ; B 43 -80 557 629 ;\nC 234 ; WX 600 ; N OE ; B 7 0 567 562 ;\nC 235 ; WX 600 ; N ordmasculine ; B 157 249 443 580 ;\nC 241 ; WX 600 ; N ae ; B 19 -15 570 441 ;\nC 245 ; WX 600 ; N dotlessi ; B 95 0 505 426 ;\nC 248 ; WX 600 ; N lslash ; B 95 0 505 629 ;\nC 249 ; WX 600 ; N oslash ; B 62 -80 538 506 ;\nC 250 ; WX 600 ; N oe ; B 19 -15 559 441 ;\nC 251 ; WX 600 ; N germandbls ; B 48 -15 588 629 ;\nC -1 ; WX 600 ; N Idieresis ; B 96 0 504 753 ;\nC -1 ; WX 600 ; N eacute ; B 66 -15 548 672 ;\nC -1 ; WX 600 ; N abreve ; B 53 -15 559 609 ;\nC -1 ; WX 600 ; N uhungarumlaut ; B 21 -15 580 672 ;\nC -1 ; WX 600 ; N ecaron ; B 66 -15 548 669 ;\nC -1 ; WX 600 ; N Ydieresis ; B 24 0 576 753 ;\nC -1 ; WX 600 ; N divide ; B 87 48 513 467 ;\nC -1 ; WX 600 ; N Yacute ; B 24 0 576 805 ;\nC -1 ; WX 600 ; N Acircumflex ; B 3 0 597 787 ;\nC -1 ; WX 600 ; N aacute ; B 53 -15 559 672 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 17 -18 583 787 ;\nC -1 ; WX 600 ; N yacute ; B 7 -157 592 672 ;\nC -1 ; WX 600 ; N scommaaccent ; B 80 -250 513 441 ;\nC -1 ; WX 600 ; N ecircumflex ; B 66 -15 548 654 ;\nC -1 ; WX 600 ; N Uring ; B 17 -18 583 760 ;\nC -1 ; WX 600 ; N Udieresis ; B 17 -18 583 753 ;\nC -1 ; WX 600 ; N aogonek ; B 53 -172 587 441 ;\nC -1 ; WX 600 ; N Uacute ; B 17 -18 583 805 ;\nC -1 ; WX 600 ; N uogonek ; B 21 -172 590 426 ;\nC -1 ; WX 600 ; N Edieresis ; B 53 0 550 753 ;\nC -1 ; WX 600 ; N Dcroat ; B 30 0 574 562 ;\nC -1 ; WX 600 ; N commaaccent ; B 198 -250 335 -58 ;\nC -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ;\nC -1 ; WX 600 ; N Emacron ; B 53 0 550 698 ;\nC -1 ; WX 600 ; N ccaron ; B 66 -15 529 669 ;\nC -1 ; WX 600 ; N aring ; B 53 -15 559 627 ;\nC -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 593 562 ;\nC -1 ; WX 600 ; N lacute ; B 95 0 505 805 ;\nC -1 ; WX 600 ; N agrave ; B 53 -15 559 672 ;\nC -1 ; WX 600 ; N Tcommaaccent ; B 38 -250 563 562 ;\nC -1 ; WX 600 ; N Cacute ; B 41 -18 540 805 ;\nC -1 ; WX 600 ; N atilde ; B 53 -15 559 606 ;\nC -1 ; WX 600 ; N Edotaccent ; B 53 0 550 753 ;\nC -1 ; WX 600 ; N scaron ; B 80 -15 513 669 ;\nC -1 ; WX 600 ; N scedilla ; B 80 -151 513 441 ;\nC -1 ; WX 600 ; N iacute ; B 95 0 505 672 ;\nC -1 ; WX 600 ; N lozenge ; B 18 0 443 706 ;\nC -1 ; WX 600 ; N Rcaron ; B 38 0 588 802 ;\nC -1 ; WX 600 ; N Gcommaaccent ; B 31 -250 575 580 ;\nC -1 ; WX 600 ; N ucircumflex ; B 21 -15 562 654 ;\nC -1 ; WX 600 ; N acircumflex ; B 53 -15 559 654 ;\nC -1 ; WX 600 ; N Amacron ; B 3 0 597 698 ;\nC -1 ; WX 600 ; N rcaron ; B 60 0 559 669 ;\nC -1 ; WX 600 ; N ccedilla ; B 66 -151 529 441 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 86 0 514 753 ;\nC -1 ; WX 600 ; N Thorn ; B 79 0 538 562 ;\nC -1 ; WX 600 ; N Omacron ; B 43 -18 557 698 ;\nC -1 ; WX 600 ; N Racute ; B 38 0 588 805 ;\nC -1 ; WX 600 ; N Sacute ; B 72 -20 529 805 ;\nC -1 ; WX 600 ; N dcaron ; B 45 -15 715 629 ;\nC -1 ; WX 600 ; N Umacron ; B 17 -18 583 698 ;\nC -1 ; WX 600 ; N uring ; B 21 -15 562 627 ;\nC -1 ; WX 600 ; N threesuperior ; B 155 240 406 622 ;\nC -1 ; WX 600 ; N Ograve ; B 43 -18 557 805 ;\nC -1 ; WX 600 ; N Agrave ; B 3 0 597 805 ;\nC -1 ; WX 600 ; N Abreve ; B 3 0 597 732 ;\nC -1 ; WX 600 ; N multiply ; B 87 43 515 470 ;\nC -1 ; WX 600 ; N uacute ; B 21 -15 562 672 ;\nC -1 ; WX 600 ; N Tcaron ; B 38 0 563 802 ;\nC -1 ; WX 600 ; N partialdiff ; B 17 -38 459 710 ;\nC -1 ; WX 600 ; N ydieresis ; B 7 -157 592 620 ;\nC -1 ; WX 600 ; N Nacute ; B 7 -13 593 805 ;\nC -1 ; WX 600 ; N icircumflex ; B 94 0 505 654 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 53 0 550 787 ;\nC -1 ; WX 600 ; N adieresis ; B 53 -15 559 620 ;\nC -1 ; WX 600 ; N edieresis ; B 66 -15 548 620 ;\nC -1 ; WX 600 ; N cacute ; B 66 -15 529 672 ;\nC -1 ; WX 600 ; N nacute ; B 26 0 575 672 ;\nC -1 ; WX 600 ; N umacron ; B 21 -15 562 565 ;\nC -1 ; WX 600 ; N Ncaron ; B 7 -13 593 802 ;\nC -1 ; WX 600 ; N Iacute ; B 96 0 504 805 ;\nC -1 ; WX 600 ; N plusminus ; B 87 44 513 558 ;\nC -1 ; WX 600 ; N brokenbar ; B 275 -175 326 675 ;\nC -1 ; WX 600 ; N registered ; B 0 -18 600 580 ;\nC -1 ; WX 600 ; N Gbreve ; B 31 -18 575 732 ;\nC -1 ; WX 600 ; N Idotaccent ; B 96 0 504 753 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;\nC -1 ; WX 600 ; N Egrave ; B 53 0 550 805 ;\nC -1 ; WX 600 ; N racute ; B 60 0 559 672 ;\nC -1 ; WX 600 ; N omacron ; B 62 -15 538 565 ;\nC -1 ; WX 600 ; N Zacute ; B 86 0 514 805 ;\nC -1 ; WX 600 ; N Zcaron ; B 86 0 514 802 ;\nC -1 ; WX 600 ; N greaterequal ; B 98 0 502 710 ;\nC -1 ; WX 600 ; N Eth ; B 30 0 574 562 ;\nC -1 ; WX 600 ; N Ccedilla ; B 41 -151 540 580 ;\nC -1 ; WX 600 ; N lcommaaccent ; B 95 -250 505 629 ;\nC -1 ; WX 600 ; N tcaron ; B 87 -15 530 717 ;\nC -1 ; WX 600 ; N eogonek ; B 66 -172 548 441 ;\nC -1 ; WX 600 ; N Uogonek ; B 17 -172 583 562 ;\nC -1 ; WX 600 ; N Aacute ; B 3 0 597 805 ;\nC -1 ; WX 600 ; N Adieresis ; B 3 0 597 753 ;\nC -1 ; WX 600 ; N egrave ; B 66 -15 548 672 ;\nC -1 ; WX 600 ; N zacute ; B 99 0 502 672 ;\nC -1 ; WX 600 ; N iogonek ; B 95 -172 505 657 ;\nC -1 ; WX 600 ; N Oacute ; B 43 -18 557 805 ;\nC -1 ; WX 600 ; N oacute ; B 62 -15 538 672 ;\nC -1 ; WX 600 ; N amacron ; B 53 -15 559 565 ;\nC -1 ; WX 600 ; N sacute ; B 80 -15 513 672 ;\nC -1 ; WX 600 ; N idieresis ; B 95 0 505 620 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 43 -18 557 787 ;\nC -1 ; WX 600 ; N Ugrave ; B 17 -18 583 805 ;\nC -1 ; WX 600 ; N Delta ; B 6 0 598 688 ;\nC -1 ; WX 600 ; N thorn ; B -6 -157 555 629 ;\nC -1 ; WX 600 ; N twosuperior ; B 177 249 424 622 ;\nC -1 ; WX 600 ; N Odieresis ; B 43 -18 557 753 ;\nC -1 ; WX 600 ; N mu ; B 21 -157 562 426 ;\nC -1 ; WX 600 ; N igrave ; B 95 0 505 672 ;\nC -1 ; WX 600 ; N ohungarumlaut ; B 62 -15 580 672 ;\nC -1 ; WX 600 ; N Eogonek ; B 53 -172 561 562 ;\nC -1 ; WX 600 ; N dcroat ; B 45 -15 591 629 ;\nC -1 ; WX 600 ; N threequarters ; B 8 -56 593 666 ;\nC -1 ; WX 600 ; N Scedilla ; B 72 -151 529 580 ;\nC -1 ; WX 600 ; N lcaron ; B 95 0 533 629 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 582 562 ;\nC -1 ; WX 600 ; N Lacute ; B 47 0 554 805 ;\nC -1 ; WX 600 ; N trademark ; B -23 263 623 562 ;\nC -1 ; WX 600 ; N edotaccent ; B 66 -15 548 620 ;\nC -1 ; WX 600 ; N Igrave ; B 96 0 504 805 ;\nC -1 ; WX 600 ; N Imacron ; B 96 0 504 698 ;\nC -1 ; WX 600 ; N Lcaron ; B 47 0 554 562 ;\nC -1 ; WX 600 ; N onehalf ; B 0 -57 611 665 ;\nC -1 ; WX 600 ; N lessequal ; B 98 0 502 710 ;\nC -1 ; WX 600 ; N ocircumflex ; B 62 -15 538 654 ;\nC -1 ; WX 600 ; N ntilde ; B 26 0 575 606 ;\nC -1 ; WX 600 ; N Uhungarumlaut ; B 17 -18 590 805 ;\nC -1 ; WX 600 ; N Eacute ; B 53 0 550 805 ;\nC -1 ; WX 600 ; N emacron ; B 66 -15 548 565 ;\nC -1 ; WX 600 ; N gbreve ; B 45 -157 566 609 ;\nC -1 ; WX 600 ; N onequarter ; B 0 -57 600 665 ;\nC -1 ; WX 600 ; N Scaron ; B 72 -20 529 802 ;\nC -1 ; WX 600 ; N Scommaaccent ; B 72 -250 529 580 ;\nC -1 ; WX 600 ; N Ohungarumlaut ; B 43 -18 580 805 ;\nC -1 ; WX 600 ; N degree ; B 123 269 477 622 ;\nC -1 ; WX 600 ; N ograve ; B 62 -15 538 672 ;\nC -1 ; WX 600 ; N Ccaron ; B 41 -18 540 802 ;\nC -1 ; WX 600 ; N ugrave ; B 21 -15 562 672 ;\nC -1 ; WX 600 ; N radical ; B 3 -15 597 792 ;\nC -1 ; WX 600 ; N Dcaron ; B 43 0 574 802 ;\nC -1 ; WX 600 ; N rcommaaccent ; B 60 -250 559 441 ;\nC -1 ; WX 600 ; N Ntilde ; B 7 -13 593 729 ;\nC -1 ; WX 600 ; N otilde ; B 62 -15 538 606 ;\nC -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 588 562 ;\nC -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 554 562 ;\nC -1 ; WX 600 ; N Atilde ; B 3 0 597 729 ;\nC -1 ; WX 600 ; N Aogonek ; B 3 -172 608 562 ;\nC -1 ; WX 600 ; N Aring ; B 3 0 597 750 ;\nC -1 ; WX 600 ; N Otilde ; B 43 -18 557 729 ;\nC -1 ; WX 600 ; N zdotaccent ; B 99 0 502 620 ;\nC -1 ; WX 600 ; N Ecaron ; B 53 0 550 802 ;\nC -1 ; WX 600 ; N Iogonek ; B 96 -172 504 562 ;\nC -1 ; WX 600 ; N kcommaaccent ; B 43 -250 580 629 ;\nC -1 ; WX 600 ; N minus ; B 80 232 520 283 ;\nC -1 ; WX 600 ; N Icircumflex ; B 96 0 504 787 ;\nC -1 ; WX 600 ; N ncaron ; B 26 0 575 669 ;\nC -1 ; WX 600 ; N tcommaaccent ; B 87 -250 530 561 ;\nC -1 ; WX 600 ; N logicalnot ; B 87 108 513 369 ;\nC -1 ; WX 600 ; N odieresis ; B 62 -15 538 620 ;\nC -1 ; WX 600 ; N udieresis ; B 21 -15 562 620 ;\nC -1 ; WX 600 ; N notequal ; B 15 -16 540 529 ;\nC -1 ; WX 600 ; N gcommaaccent ; B 45 -157 566 708 ;\nC -1 ; WX 600 ; N eth ; B 62 -15 538 629 ;\nC -1 ; WX 600 ; N zcaron ; B 99 0 502 669 ;\nC -1 ; WX 600 ; N ncommaaccent ; B 26 -250 575 441 ;\nC -1 ; WX 600 ; N onesuperior ; B 172 249 428 622 ;\nC -1 ; WX 600 ; N imacron ; B 95 0 505 565 ;\nC -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/Helvetica-Bold.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:43:52 1997\nComment UniqueID 43052\nComment VMusage 37169 48194\nFontName Helvetica-Bold\nFullName Helvetica Bold\nFamilyName Helvetica\nWeight Bold\nItalicAngle 0\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -170 -228 1003 962 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 532\nAscender 718\nDescender -207\nStdHW 118\nStdVW 140\nStartCharMetrics 315\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 90 0 244 718 ;\nC 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ;\nC 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ;\nC 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ;\nC 37 ; WX 889 ; N percent ; B 28 -19 861 710 ;\nC 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ;\nC 39 ; WX 278 ; N quoteright ; B 69 445 209 718 ;\nC 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ;\nC 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ;\nC 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ;\nC 43 ; WX 584 ; N plus ; B 40 0 544 506 ;\nC 44 ; WX 278 ; N comma ; B 64 -168 214 146 ;\nC 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ;\nC 46 ; WX 278 ; N period ; B 64 0 214 146 ;\nC 47 ; WX 278 ; N slash ; B -33 -19 311 737 ;\nC 48 ; WX 556 ; N zero ; B 32 -19 524 710 ;\nC 49 ; WX 556 ; N one ; B 69 0 378 710 ;\nC 50 ; WX 556 ; N two ; B 26 0 511 710 ;\nC 51 ; WX 556 ; N three ; B 27 -19 516 710 ;\nC 52 ; WX 556 ; N four ; B 27 0 526 710 ;\nC 53 ; WX 556 ; N five ; B 27 -19 516 698 ;\nC 54 ; WX 556 ; N six ; B 31 -19 520 710 ;\nC 55 ; WX 556 ; N seven ; B 25 0 528 698 ;\nC 56 ; WX 556 ; N eight ; B 32 -19 524 710 ;\nC 57 ; WX 556 ; N nine ; B 30 -19 522 710 ;\nC 58 ; WX 333 ; N colon ; B 92 0 242 512 ;\nC 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ;\nC 60 ; WX 584 ; N less ; B 38 -8 546 514 ;\nC 61 ; WX 584 ; N equal ; B 40 87 544 419 ;\nC 62 ; WX 584 ; N greater ; B 38 -8 546 514 ;\nC 63 ; WX 611 ; N question ; B 60 0 556 727 ;\nC 64 ; WX 975 ; N at ; B 118 -19 856 737 ;\nC 65 ; WX 722 ; N A ; B 20 0 702 718 ;\nC 66 ; WX 722 ; N B ; B 76 0 669 718 ;\nC 67 ; WX 722 ; N C ; B 44 -19 684 737 ;\nC 68 ; WX 722 ; N D ; B 76 0 685 718 ;\nC 69 ; WX 667 ; N E ; B 76 0 621 718 ;\nC 70 ; WX 611 ; N F ; B 76 0 587 718 ;\nC 71 ; WX 778 ; N G ; B 44 -19 713 737 ;\nC 72 ; WX 722 ; N H ; B 71 0 651 718 ;\nC 73 ; WX 278 ; N I ; B 64 0 214 718 ;\nC 74 ; WX 556 ; N J ; B 22 -18 484 718 ;\nC 75 ; WX 722 ; N K ; B 87 0 722 718 ;\nC 76 ; WX 611 ; N L ; B 76 0 583 718 ;\nC 77 ; WX 833 ; N M ; B 69 0 765 718 ;\nC 78 ; WX 722 ; N N ; B 69 0 654 718 ;\nC 79 ; WX 778 ; N O ; B 44 -19 734 737 ;\nC 80 ; WX 667 ; N P ; B 76 0 627 718 ;\nC 81 ; WX 778 ; N Q ; B 44 -52 737 737 ;\nC 82 ; WX 722 ; N R ; B 76 0 677 718 ;\nC 83 ; WX 667 ; N S ; B 39 -19 629 737 ;\nC 84 ; WX 611 ; N T ; B 14 0 598 718 ;\nC 85 ; WX 722 ; N U ; B 72 -19 651 718 ;\nC 86 ; WX 667 ; N V ; B 19 0 648 718 ;\nC 87 ; WX 944 ; N W ; B 16 0 929 718 ;\nC 88 ; WX 667 ; N X ; B 14 0 653 718 ;\nC 89 ; WX 667 ; N Y ; B 15 0 653 718 ;\nC 90 ; WX 611 ; N Z ; B 25 0 586 718 ;\nC 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ;\nC 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ;\nC 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ;\nC 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ;\nC 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;\nC 96 ; WX 278 ; N quoteleft ; B 69 454 209 727 ;\nC 97 ; WX 556 ; N a ; B 29 -14 527 546 ;\nC 98 ; WX 611 ; N b ; B 61 -14 578 718 ;\nC 99 ; WX 556 ; N c ; B 34 -14 524 546 ;\nC 100 ; WX 611 ; N d ; B 34 -14 551 718 ;\nC 101 ; WX 556 ; N e ; B 23 -14 528 546 ;\nC 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ;\nC 103 ; WX 611 ; N g ; B 40 -217 553 546 ;\nC 104 ; WX 611 ; N h ; B 65 0 546 718 ;\nC 105 ; WX 278 ; N i ; B 69 0 209 725 ;\nC 106 ; WX 278 ; N j ; B 3 -214 209 725 ;\nC 107 ; WX 556 ; N k ; B 69 0 562 718 ;\nC 108 ; WX 278 ; N l ; B 69 0 209 718 ;\nC 109 ; WX 889 ; N m ; B 64 0 826 546 ;\nC 110 ; WX 611 ; N n ; B 65 0 546 546 ;\nC 111 ; WX 611 ; N o ; B 34 -14 578 546 ;\nC 112 ; WX 611 ; N p ; B 62 -207 578 546 ;\nC 113 ; WX 611 ; N q ; B 34 -207 552 546 ;\nC 114 ; WX 389 ; N r ; B 64 0 373 546 ;\nC 115 ; WX 556 ; N s ; B 30 -14 519 546 ;\nC 116 ; WX 333 ; N t ; B 10 -6 309 676 ;\nC 117 ; WX 611 ; N u ; B 66 -14 545 532 ;\nC 118 ; WX 556 ; N v ; B 13 0 543 532 ;\nC 119 ; WX 778 ; N w ; B 10 0 769 532 ;\nC 120 ; WX 556 ; N x ; B 15 0 541 532 ;\nC 121 ; WX 556 ; N y ; B 10 -214 539 532 ;\nC 122 ; WX 500 ; N z ; B 20 0 480 532 ;\nC 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ;\nC 124 ; WX 280 ; N bar ; B 84 -225 196 775 ;\nC 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ;\nC 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ;\nC 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ;\nC 162 ; WX 556 ; N cent ; B 34 -118 524 628 ;\nC 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ;\nC 164 ; WX 167 ; N fraction ; B -170 -19 336 710 ;\nC 165 ; WX 556 ; N yen ; B -9 0 565 698 ;\nC 166 ; WX 556 ; N florin ; B -10 -210 516 737 ;\nC 167 ; WX 556 ; N section ; B 34 -184 522 727 ;\nC 168 ; WX 556 ; N currency ; B -3 76 559 636 ;\nC 169 ; WX 238 ; N quotesingle ; B 70 447 168 718 ;\nC 170 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ;\nC 171 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ;\nC 173 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ;\nC 174 ; WX 611 ; N fi ; B 10 0 542 727 ;\nC 175 ; WX 611 ; N fl ; B 10 0 542 727 ;\nC 177 ; WX 556 ; N endash ; B 0 227 556 333 ;\nC 178 ; WX 556 ; N dagger ; B 36 -171 520 718 ;\nC 179 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ;\nC 180 ; WX 278 ; N periodcentered ; B 58 172 220 334 ;\nC 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ;\nC 183 ; WX 350 ; N bullet ; B 10 194 340 524 ;\nC 184 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ;\nC 185 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ;\nC 186 ; WX 500 ; N quotedblright ; B 64 445 436 718 ;\nC 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ;\nC 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ;\nC 189 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ;\nC 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ;\nC 193 ; WX 333 ; N grave ; B -23 604 225 750 ;\nC 194 ; WX 333 ; N acute ; B 108 604 356 750 ;\nC 195 ; WX 333 ; N circumflex ; B -10 604 343 750 ;\nC 196 ; WX 333 ; N tilde ; B -17 610 350 737 ;\nC 197 ; WX 333 ; N macron ; B -6 604 339 678 ;\nC 198 ; WX 333 ; N breve ; B -2 604 335 750 ;\nC 199 ; WX 333 ; N dotaccent ; B 104 614 230 729 ;\nC 200 ; WX 333 ; N dieresis ; B 6 614 327 729 ;\nC 202 ; WX 333 ; N ring ; B 59 568 275 776 ;\nC 203 ; WX 333 ; N cedilla ; B 6 -228 245 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ;\nC 206 ; WX 333 ; N ogonek ; B 71 -228 304 0 ;\nC 207 ; WX 333 ; N caron ; B -10 604 343 750 ;\nC 208 ; WX 1000 ; N emdash ; B 0 227 1000 333 ;\nC 225 ; WX 1000 ; N AE ; B 5 0 954 718 ;\nC 227 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ;\nC 232 ; WX 611 ; N Lslash ; B -20 0 583 718 ;\nC 233 ; WX 778 ; N Oslash ; B 33 -27 744 745 ;\nC 234 ; WX 1000 ; N OE ; B 37 -19 961 737 ;\nC 235 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ;\nC 241 ; WX 889 ; N ae ; B 29 -14 858 546 ;\nC 245 ; WX 278 ; N dotlessi ; B 69 0 209 532 ;\nC 248 ; WX 278 ; N lslash ; B -18 0 296 718 ;\nC 249 ; WX 611 ; N oslash ; B 22 -29 589 560 ;\nC 250 ; WX 944 ; N oe ; B 34 -14 912 546 ;\nC 251 ; WX 611 ; N germandbls ; B 69 -14 579 731 ;\nC -1 ; WX 278 ; N Idieresis ; B -21 0 300 915 ;\nC -1 ; WX 556 ; N eacute ; B 23 -14 528 750 ;\nC -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ;\nC -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ;\nC -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ;\nC -1 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ;\nC -1 ; WX 584 ; N divide ; B 40 -42 544 548 ;\nC -1 ; WX 667 ; N Yacute ; B 15 0 653 936 ;\nC -1 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ;\nC -1 ; WX 556 ; N aacute ; B 29 -14 527 750 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ;\nC -1 ; WX 556 ; N yacute ; B 10 -214 539 750 ;\nC -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ;\nC -1 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ;\nC -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ;\nC -1 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ;\nC -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ;\nC -1 ; WX 722 ; N Uacute ; B 72 -19 651 936 ;\nC -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ;\nC -1 ; WX 667 ; N Edieresis ; B 76 0 621 915 ;\nC -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ;\nC -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ;\nC -1 ; WX 737 ; N copyright ; B -11 -19 749 737 ;\nC -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ;\nC -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ;\nC -1 ; WX 556 ; N aring ; B 29 -14 527 776 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ;\nC -1 ; WX 278 ; N lacute ; B 69 0 329 936 ;\nC -1 ; WX 556 ; N agrave ; B 29 -14 527 750 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ;\nC -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ;\nC -1 ; WX 556 ; N atilde ; B 29 -14 527 737 ;\nC -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ;\nC -1 ; WX 556 ; N scaron ; B 30 -14 519 750 ;\nC -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ;\nC -1 ; WX 278 ; N iacute ; B 69 0 329 750 ;\nC -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;\nC -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ;\nC -1 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ;\nC -1 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ;\nC -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ;\nC -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ;\nC -1 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ;\nC -1 ; WX 667 ; N Thorn ; B 76 0 627 718 ;\nC -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ;\nC -1 ; WX 722 ; N Racute ; B 76 0 677 936 ;\nC -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ;\nC -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ;\nC -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ;\nC -1 ; WX 611 ; N uring ; B 66 -14 545 776 ;\nC -1 ; WX 333 ; N threesuperior ; B 8 271 326 710 ;\nC -1 ; WX 778 ; N Ograve ; B 44 -19 734 936 ;\nC -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ;\nC -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ;\nC -1 ; WX 584 ; N multiply ; B 40 1 545 505 ;\nC -1 ; WX 611 ; N uacute ; B 66 -14 545 750 ;\nC -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ;\nC -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;\nC -1 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ;\nC -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ;\nC -1 ; WX 278 ; N icircumflex ; B -37 0 316 750 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ;\nC -1 ; WX 556 ; N adieresis ; B 29 -14 527 729 ;\nC -1 ; WX 556 ; N edieresis ; B 23 -14 528 729 ;\nC -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ;\nC -1 ; WX 611 ; N nacute ; B 65 0 546 750 ;\nC -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ;\nC -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ;\nC -1 ; WX 278 ; N Iacute ; B 64 0 329 936 ;\nC -1 ; WX 584 ; N plusminus ; B 40 0 544 506 ;\nC -1 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ;\nC -1 ; WX 737 ; N registered ; B -11 -19 748 737 ;\nC -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ;\nC -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ;\nC -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;\nC -1 ; WX 667 ; N Egrave ; B 76 0 621 936 ;\nC -1 ; WX 389 ; N racute ; B 64 0 384 750 ;\nC -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ;\nC -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ;\nC -1 ; WX 611 ; N Zcaron ; B 25 0 586 936 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;\nC -1 ; WX 722 ; N Eth ; B -5 0 685 718 ;\nC -1 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ;\nC -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ;\nC -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ;\nC -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ;\nC -1 ; WX 722 ; N Aacute ; B 20 0 702 936 ;\nC -1 ; WX 722 ; N Adieresis ; B 20 0 702 915 ;\nC -1 ; WX 556 ; N egrave ; B 23 -14 528 750 ;\nC -1 ; WX 500 ; N zacute ; B 20 0 480 750 ;\nC -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ;\nC -1 ; WX 778 ; N Oacute ; B 44 -19 734 936 ;\nC -1 ; WX 611 ; N oacute ; B 34 -14 578 750 ;\nC -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ;\nC -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ;\nC -1 ; WX 278 ; N idieresis ; B -21 0 300 729 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ;\nC -1 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 611 ; N thorn ; B 62 -208 578 718 ;\nC -1 ; WX 333 ; N twosuperior ; B 9 283 324 710 ;\nC -1 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ;\nC -1 ; WX 611 ; N mu ; B 66 -207 545 532 ;\nC -1 ; WX 278 ; N igrave ; B -50 0 209 750 ;\nC -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ;\nC -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ;\nC -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ;\nC -1 ; WX 834 ; N threequarters ; B 16 -19 799 710 ;\nC -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ;\nC -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ;\nC -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ;\nC -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ;\nC -1 ; WX 1000 ; N trademark ; B 44 306 956 718 ;\nC -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ;\nC -1 ; WX 278 ; N Igrave ; B -50 0 214 936 ;\nC -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ;\nC -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ;\nC -1 ; WX 834 ; N onehalf ; B 26 -19 794 710 ;\nC -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;\nC -1 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ;\nC -1 ; WX 611 ; N ntilde ; B 65 0 546 737 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ;\nC -1 ; WX 667 ; N Eacute ; B 76 0 621 936 ;\nC -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ;\nC -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ;\nC -1 ; WX 834 ; N onequarter ; B 26 -19 766 710 ;\nC -1 ; WX 667 ; N Scaron ; B 39 -19 629 936 ;\nC -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ;\nC -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ;\nC -1 ; WX 400 ; N degree ; B 57 426 343 712 ;\nC -1 ; WX 611 ; N ograve ; B 34 -14 578 750 ;\nC -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ;\nC -1 ; WX 611 ; N ugrave ; B 66 -14 545 750 ;\nC -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;\nC -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ;\nC -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ;\nC -1 ; WX 722 ; N Ntilde ; B 69 0 654 923 ;\nC -1 ; WX 611 ; N otilde ; B 34 -14 578 737 ;\nC -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ;\nC -1 ; WX 722 ; N Atilde ; B 20 0 702 923 ;\nC -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ;\nC -1 ; WX 722 ; N Aring ; B 20 0 702 962 ;\nC -1 ; WX 778 ; N Otilde ; B 44 -19 734 923 ;\nC -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ;\nC -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ;\nC -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ;\nC -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ;\nC -1 ; WX 584 ; N minus ; B 40 197 544 309 ;\nC -1 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ;\nC -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ;\nC -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ;\nC -1 ; WX 584 ; N logicalnot ; B 40 108 544 419 ;\nC -1 ; WX 611 ; N odieresis ; B 34 -14 578 729 ;\nC -1 ; WX 611 ; N udieresis ; B 66 -14 545 729 ;\nC -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;\nC -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ;\nC -1 ; WX 611 ; N eth ; B 34 -14 578 737 ;\nC -1 ; WX 500 ; N zcaron ; B 20 0 480 750 ;\nC -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ;\nC -1 ; WX 333 ; N onesuperior ; B 26 283 237 710 ;\nC -1 ; WX 278 ; N imacron ; B -8 0 285 678 ;\nC -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2481\nKPX A C -40\nKPX A Cacute -40\nKPX A Ccaron -40\nKPX A Ccedilla -40\nKPX A G -50\nKPX A Gbreve -50\nKPX A Gcommaaccent -50\nKPX A O -40\nKPX A Oacute -40\nKPX A Ocircumflex -40\nKPX A Odieresis -40\nKPX A Ograve -40\nKPX A Ohungarumlaut -40\nKPX A Omacron -40\nKPX A Oslash -40\nKPX A Otilde -40\nKPX A Q -40\nKPX A T -90\nKPX A Tcaron -90\nKPX A Tcommaaccent -90\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -80\nKPX A W -60\nKPX A Y -110\nKPX A Yacute -110\nKPX A Ydieresis -110\nKPX A u -30\nKPX A uacute -30\nKPX A ucircumflex -30\nKPX A udieresis -30\nKPX A ugrave -30\nKPX A uhungarumlaut -30\nKPX A umacron -30\nKPX A uogonek -30\nKPX A uring -30\nKPX A v -40\nKPX A w -30\nKPX A y -30\nKPX A yacute -30\nKPX A ydieresis -30\nKPX Aacute C -40\nKPX Aacute Cacute -40\nKPX Aacute Ccaron -40\nKPX Aacute Ccedilla -40\nKPX Aacute G -50\nKPX Aacute Gbreve -50\nKPX Aacute Gcommaaccent -50\nKPX Aacute O -40\nKPX Aacute Oacute -40\nKPX Aacute Ocircumflex -40\nKPX Aacute Odieresis -40\nKPX Aacute Ograve -40\nKPX Aacute Ohungarumlaut -40\nKPX Aacute Omacron -40\nKPX Aacute Oslash -40\nKPX Aacute Otilde -40\nKPX Aacute Q -40\nKPX Aacute T -90\nKPX Aacute Tcaron -90\nKPX Aacute Tcommaaccent -90\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -80\nKPX Aacute W -60\nKPX Aacute Y -110\nKPX Aacute Yacute -110\nKPX Aacute Ydieresis -110\nKPX Aacute u -30\nKPX Aacute uacute -30\nKPX Aacute ucircumflex -30\nKPX Aacute udieresis -30\nKPX Aacute ugrave -30\nKPX Aacute uhungarumlaut -30\nKPX Aacute umacron -30\nKPX Aacute uogonek -30\nKPX Aacute uring -30\nKPX Aacute v -40\nKPX Aacute w -30\nKPX Aacute y -30\nKPX Aacute yacute -30\nKPX Aacute ydieresis -30\nKPX Abreve C -40\nKPX Abreve Cacute -40\nKPX Abreve Ccaron -40\nKPX Abreve Ccedilla -40\nKPX Abreve G -50\nKPX Abreve Gbreve -50\nKPX Abreve Gcommaaccent -50\nKPX Abreve O -40\nKPX Abreve Oacute -40\nKPX Abreve Ocircumflex -40\nKPX Abreve Odieresis -40\nKPX Abreve Ograve -40\nKPX Abreve Ohungarumlaut -40\nKPX Abreve Omacron -40\nKPX Abreve Oslash -40\nKPX Abreve Otilde -40\nKPX Abreve Q -40\nKPX Abreve T -90\nKPX Abreve Tcaron -90\nKPX Abreve Tcommaaccent -90\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -80\nKPX Abreve W -60\nKPX Abreve Y -110\nKPX Abreve Yacute -110\nKPX Abreve Ydieresis -110\nKPX Abreve u -30\nKPX Abreve uacute -30\nKPX Abreve ucircumflex -30\nKPX Abreve udieresis -30\nKPX Abreve ugrave -30\nKPX Abreve uhungarumlaut -30\nKPX Abreve umacron -30\nKPX Abreve uogonek -30\nKPX Abreve uring -30\nKPX Abreve v -40\nKPX Abreve w -30\nKPX Abreve y -30\nKPX Abreve yacute -30\nKPX Abreve ydieresis -30\nKPX Acircumflex C -40\nKPX Acircumflex Cacute -40\nKPX Acircumflex Ccaron -40\nKPX Acircumflex Ccedilla -40\nKPX Acircumflex G -50\nKPX Acircumflex Gbreve -50\nKPX Acircumflex Gcommaaccent -50\nKPX Acircumflex O -40\nKPX Acircumflex Oacute -40\nKPX Acircumflex Ocircumflex -40\nKPX Acircumflex Odieresis -40\nKPX Acircumflex Ograve -40\nKPX Acircumflex Ohungarumlaut -40\nKPX Acircumflex Omacron -40\nKPX Acircumflex Oslash -40\nKPX Acircumflex Otilde -40\nKPX Acircumflex Q -40\nKPX Acircumflex T -90\nKPX Acircumflex Tcaron -90\nKPX Acircumflex Tcommaaccent -90\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -80\nKPX Acircumflex W -60\nKPX Acircumflex Y -110\nKPX Acircumflex Yacute -110\nKPX Acircumflex Ydieresis -110\nKPX Acircumflex u -30\nKPX Acircumflex uacute -30\nKPX Acircumflex ucircumflex -30\nKPX Acircumflex udieresis -30\nKPX Acircumflex ugrave -30\nKPX Acircumflex uhungarumlaut -30\nKPX Acircumflex umacron -30\nKPX Acircumflex uogonek -30\nKPX Acircumflex uring -30\nKPX Acircumflex v -40\nKPX Acircumflex w -30\nKPX Acircumflex y -30\nKPX Acircumflex yacute -30\nKPX Acircumflex ydieresis -30\nKPX Adieresis C -40\nKPX Adieresis Cacute -40\nKPX Adieresis Ccaron -40\nKPX Adieresis Ccedilla -40\nKPX Adieresis G -50\nKPX Adieresis Gbreve -50\nKPX Adieresis Gcommaaccent -50\nKPX Adieresis O -40\nKPX Adieresis Oacute -40\nKPX Adieresis Ocircumflex -40\nKPX Adieresis Odieresis -40\nKPX Adieresis Ograve -40\nKPX Adieresis Ohungarumlaut -40\nKPX Adieresis Omacron -40\nKPX Adieresis Oslash -40\nKPX Adieresis Otilde -40\nKPX Adieresis Q -40\nKPX Adieresis T -90\nKPX Adieresis Tcaron -90\nKPX Adieresis Tcommaaccent -90\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -80\nKPX Adieresis W -60\nKPX Adieresis Y -110\nKPX Adieresis Yacute -110\nKPX Adieresis Ydieresis -110\nKPX Adieresis u -30\nKPX Adieresis uacute -30\nKPX Adieresis ucircumflex -30\nKPX Adieresis udieresis -30\nKPX Adieresis ugrave -30\nKPX Adieresis uhungarumlaut -30\nKPX Adieresis umacron -30\nKPX Adieresis uogonek -30\nKPX Adieresis uring -30\nKPX Adieresis v -40\nKPX Adieresis w -30\nKPX Adieresis y -30\nKPX Adieresis yacute -30\nKPX Adieresis ydieresis -30\nKPX Agrave C -40\nKPX Agrave Cacute -40\nKPX Agrave Ccaron -40\nKPX Agrave Ccedilla -40\nKPX Agrave G -50\nKPX Agrave Gbreve -50\nKPX Agrave Gcommaaccent -50\nKPX Agrave O -40\nKPX Agrave Oacute -40\nKPX Agrave Ocircumflex -40\nKPX Agrave Odieresis -40\nKPX Agrave Ograve -40\nKPX Agrave Ohungarumlaut -40\nKPX Agrave Omacron -40\nKPX Agrave Oslash -40\nKPX Agrave Otilde -40\nKPX Agrave Q -40\nKPX Agrave T -90\nKPX Agrave Tcaron -90\nKPX Agrave Tcommaaccent -90\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -80\nKPX Agrave W -60\nKPX Agrave Y -110\nKPX Agrave Yacute -110\nKPX Agrave Ydieresis -110\nKPX Agrave u -30\nKPX Agrave uacute -30\nKPX Agrave ucircumflex -30\nKPX Agrave udieresis -30\nKPX Agrave ugrave -30\nKPX Agrave uhungarumlaut -30\nKPX Agrave umacron -30\nKPX Agrave uogonek -30\nKPX Agrave uring -30\nKPX Agrave v -40\nKPX Agrave w -30\nKPX Agrave y -30\nKPX Agrave yacute -30\nKPX Agrave ydieresis -30\nKPX Amacron C -40\nKPX Amacron Cacute -40\nKPX Amacron Ccaron -40\nKPX Amacron Ccedilla -40\nKPX Amacron G -50\nKPX Amacron Gbreve -50\nKPX Amacron Gcommaaccent -50\nKPX Amacron O -40\nKPX Amacron Oacute -40\nKPX Amacron Ocircumflex -40\nKPX Amacron Odieresis -40\nKPX Amacron Ograve -40\nKPX Amacron Ohungarumlaut -40\nKPX Amacron Omacron -40\nKPX Amacron Oslash -40\nKPX Amacron Otilde -40\nKPX Amacron Q -40\nKPX Amacron T -90\nKPX Amacron Tcaron -90\nKPX Amacron Tcommaaccent -90\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -80\nKPX Amacron W -60\nKPX Amacron Y -110\nKPX Amacron Yacute -110\nKPX Amacron Ydieresis -110\nKPX Amacron u -30\nKPX Amacron uacute -30\nKPX Amacron ucircumflex -30\nKPX Amacron udieresis -30\nKPX Amacron ugrave -30\nKPX Amacron uhungarumlaut -30\nKPX Amacron umacron -30\nKPX Amacron uogonek -30\nKPX Amacron uring -30\nKPX Amacron v -40\nKPX Amacron w -30\nKPX Amacron y -30\nKPX Amacron yacute -30\nKPX Amacron ydieresis -30\nKPX Aogonek C -40\nKPX Aogonek Cacute -40\nKPX Aogonek Ccaron -40\nKPX Aogonek Ccedilla -40\nKPX Aogonek G -50\nKPX Aogonek Gbreve -50\nKPX Aogonek Gcommaaccent -50\nKPX Aogonek O -40\nKPX Aogonek Oacute -40\nKPX Aogonek Ocircumflex -40\nKPX Aogonek Odieresis -40\nKPX Aogonek Ograve -40\nKPX Aogonek Ohungarumlaut -40\nKPX Aogonek Omacron -40\nKPX Aogonek Oslash -40\nKPX Aogonek Otilde -40\nKPX Aogonek Q -40\nKPX Aogonek T -90\nKPX Aogonek Tcaron -90\nKPX Aogonek Tcommaaccent -90\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -80\nKPX Aogonek W -60\nKPX Aogonek Y -110\nKPX Aogonek Yacute -110\nKPX Aogonek Ydieresis -110\nKPX Aogonek u -30\nKPX Aogonek uacute -30\nKPX Aogonek ucircumflex -30\nKPX Aogonek udieresis -30\nKPX Aogonek ugrave -30\nKPX Aogonek uhungarumlaut -30\nKPX Aogonek umacron -30\nKPX Aogonek uogonek -30\nKPX Aogonek uring -30\nKPX Aogonek v -40\nKPX Aogonek w -30\nKPX Aogonek y -30\nKPX Aogonek yacute -30\nKPX Aogonek ydieresis -30\nKPX Aring C -40\nKPX Aring Cacute -40\nKPX Aring Ccaron -40\nKPX Aring Ccedilla -40\nKPX Aring G -50\nKPX Aring Gbreve -50\nKPX Aring Gcommaaccent -50\nKPX Aring O -40\nKPX Aring Oacute -40\nKPX Aring Ocircumflex -40\nKPX Aring Odieresis -40\nKPX Aring Ograve -40\nKPX Aring Ohungarumlaut -40\nKPX Aring Omacron -40\nKPX Aring Oslash -40\nKPX Aring Otilde -40\nKPX Aring Q -40\nKPX Aring T -90\nKPX Aring Tcaron -90\nKPX Aring Tcommaaccent -90\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -80\nKPX Aring W -60\nKPX Aring Y -110\nKPX Aring Yacute -110\nKPX Aring Ydieresis -110\nKPX Aring u -30\nKPX Aring uacute -30\nKPX Aring ucircumflex -30\nKPX Aring udieresis -30\nKPX Aring ugrave -30\nKPX Aring uhungarumlaut -30\nKPX Aring umacron -30\nKPX Aring uogonek -30\nKPX Aring uring -30\nKPX Aring v -40\nKPX Aring w -30\nKPX Aring y -30\nKPX Aring yacute -30\nKPX Aring ydieresis -30\nKPX Atilde C -40\nKPX Atilde Cacute -40\nKPX Atilde Ccaron -40\nKPX Atilde Ccedilla -40\nKPX Atilde G -50\nKPX Atilde Gbreve -50\nKPX Atilde Gcommaaccent -50\nKPX Atilde O -40\nKPX Atilde Oacute -40\nKPX Atilde Ocircumflex -40\nKPX Atilde Odieresis -40\nKPX Atilde Ograve -40\nKPX Atilde Ohungarumlaut -40\nKPX Atilde Omacron -40\nKPX Atilde Oslash -40\nKPX Atilde Otilde -40\nKPX Atilde Q -40\nKPX Atilde T -90\nKPX Atilde Tcaron -90\nKPX Atilde Tcommaaccent -90\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -80\nKPX Atilde W -60\nKPX Atilde Y -110\nKPX Atilde Yacute -110\nKPX Atilde Ydieresis -110\nKPX Atilde u -30\nKPX Atilde uacute -30\nKPX Atilde ucircumflex -30\nKPX Atilde udieresis -30\nKPX Atilde ugrave -30\nKPX Atilde uhungarumlaut -30\nKPX Atilde umacron -30\nKPX Atilde uogonek -30\nKPX Atilde uring -30\nKPX Atilde v -40\nKPX Atilde w -30\nKPX Atilde y -30\nKPX Atilde yacute -30\nKPX Atilde ydieresis -30\nKPX B A -30\nKPX B Aacute -30\nKPX B Abreve -30\nKPX B Acircumflex -30\nKPX B Adieresis -30\nKPX B Agrave -30\nKPX B Amacron -30\nKPX B Aogonek -30\nKPX B Aring -30\nKPX B Atilde -30\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX D A -40\nKPX D Aacute -40\nKPX D Abreve -40\nKPX D Acircumflex -40\nKPX D Adieresis -40\nKPX D Agrave -40\nKPX D Amacron -40\nKPX D Aogonek -40\nKPX D Aring -40\nKPX D Atilde -40\nKPX D V -40\nKPX D W -40\nKPX D Y -70\nKPX D Yacute -70\nKPX D Ydieresis -70\nKPX D comma -30\nKPX D period -30\nKPX Dcaron A -40\nKPX Dcaron Aacute -40\nKPX Dcaron Abreve -40\nKPX Dcaron Acircumflex -40\nKPX Dcaron Adieresis -40\nKPX Dcaron Agrave -40\nKPX Dcaron Amacron -40\nKPX Dcaron Aogonek -40\nKPX Dcaron Aring -40\nKPX Dcaron Atilde -40\nKPX Dcaron V -40\nKPX Dcaron W -40\nKPX Dcaron Y -70\nKPX Dcaron Yacute -70\nKPX Dcaron Ydieresis -70\nKPX Dcaron comma -30\nKPX Dcaron period -30\nKPX Dcroat A -40\nKPX Dcroat Aacute -40\nKPX Dcroat Abreve -40\nKPX Dcroat Acircumflex -40\nKPX Dcroat Adieresis -40\nKPX Dcroat Agrave -40\nKPX Dcroat Amacron -40\nKPX Dcroat Aogonek -40\nKPX Dcroat Aring -40\nKPX Dcroat Atilde -40\nKPX Dcroat V -40\nKPX Dcroat W -40\nKPX Dcroat Y -70\nKPX Dcroat Yacute -70\nKPX Dcroat Ydieresis -70\nKPX Dcroat comma -30\nKPX Dcroat period -30\nKPX F A -80\nKPX F Aacute -80\nKPX F Abreve -80\nKPX F Acircumflex -80\nKPX F Adieresis -80\nKPX F Agrave -80\nKPX F Amacron -80\nKPX F Aogonek -80\nKPX F Aring -80\nKPX F Atilde -80\nKPX F a -20\nKPX F aacute -20\nKPX F abreve -20\nKPX F acircumflex -20\nKPX F adieresis -20\nKPX F agrave -20\nKPX F amacron -20\nKPX F aogonek -20\nKPX F aring -20\nKPX F atilde -20\nKPX F comma -100\nKPX F period -100\nKPX J A -20\nKPX J Aacute -20\nKPX J Abreve -20\nKPX J Acircumflex -20\nKPX J Adieresis -20\nKPX J Agrave -20\nKPX J Amacron -20\nKPX J Aogonek -20\nKPX J Aring -20\nKPX J Atilde -20\nKPX J comma -20\nKPX J period -20\nKPX J u -20\nKPX J uacute -20\nKPX J ucircumflex -20\nKPX J udieresis -20\nKPX J ugrave -20\nKPX J uhungarumlaut -20\nKPX J umacron -20\nKPX J uogonek -20\nKPX J uring -20\nKPX K O -30\nKPX K Oacute -30\nKPX K Ocircumflex -30\nKPX K Odieresis -30\nKPX K Ograve -30\nKPX K Ohungarumlaut -30\nKPX K Omacron -30\nKPX K Oslash -30\nKPX K Otilde -30\nKPX K e -15\nKPX K eacute -15\nKPX K ecaron -15\nKPX K ecircumflex -15\nKPX K edieresis -15\nKPX K edotaccent -15\nKPX K egrave -15\nKPX K emacron -15\nKPX K eogonek -15\nKPX K o -35\nKPX K oacute -35\nKPX K ocircumflex -35\nKPX K odieresis -35\nKPX K ograve -35\nKPX K ohungarumlaut -35\nKPX K omacron -35\nKPX K oslash -35\nKPX K otilde -35\nKPX K u -30\nKPX K uacute -30\nKPX K ucircumflex -30\nKPX K udieresis -30\nKPX K ugrave -30\nKPX K uhungarumlaut -30\nKPX K umacron -30\nKPX K uogonek -30\nKPX K uring -30\nKPX K y -40\nKPX K yacute -40\nKPX K ydieresis -40\nKPX Kcommaaccent O -30\nKPX Kcommaaccent Oacute -30\nKPX Kcommaaccent Ocircumflex -30\nKPX Kcommaaccent Odieresis -30\nKPX Kcommaaccent Ograve -30\nKPX Kcommaaccent Ohungarumlaut -30\nKPX Kcommaaccent Omacron -30\nKPX Kcommaaccent Oslash -30\nKPX Kcommaaccent Otilde -30\nKPX Kcommaaccent e -15\nKPX Kcommaaccent eacute -15\nKPX Kcommaaccent ecaron -15\nKPX Kcommaaccent ecircumflex -15\nKPX Kcommaaccent edieresis -15\nKPX Kcommaaccent edotaccent -15\nKPX Kcommaaccent egrave -15\nKPX Kcommaaccent emacron -15\nKPX Kcommaaccent eogonek -15\nKPX Kcommaaccent o -35\nKPX Kcommaaccent oacute -35\nKPX Kcommaaccent ocircumflex -35\nKPX Kcommaaccent odieresis -35\nKPX Kcommaaccent ograve -35\nKPX Kcommaaccent ohungarumlaut -35\nKPX Kcommaaccent omacron -35\nKPX Kcommaaccent oslash -35\nKPX Kcommaaccent otilde -35\nKPX Kcommaaccent u -30\nKPX Kcommaaccent uacute -30\nKPX Kcommaaccent ucircumflex -30\nKPX Kcommaaccent udieresis -30\nKPX Kcommaaccent ugrave -30\nKPX Kcommaaccent uhungarumlaut -30\nKPX Kcommaaccent umacron -30\nKPX Kcommaaccent uogonek -30\nKPX Kcommaaccent uring -30\nKPX Kcommaaccent y -40\nKPX Kcommaaccent yacute -40\nKPX Kcommaaccent ydieresis -40\nKPX L T -90\nKPX L Tcaron -90\nKPX L Tcommaaccent -90\nKPX L V -110\nKPX L W -80\nKPX L Y -120\nKPX L Yacute -120\nKPX L Ydieresis -120\nKPX L quotedblright -140\nKPX L quoteright -140\nKPX L y -30\nKPX L yacute -30\nKPX L ydieresis -30\nKPX Lacute T -90\nKPX Lacute Tcaron -90\nKPX Lacute Tcommaaccent -90\nKPX Lacute V -110\nKPX Lacute W -80\nKPX Lacute Y -120\nKPX Lacute Yacute -120\nKPX Lacute Ydieresis -120\nKPX Lacute quotedblright -140\nKPX Lacute quoteright -140\nKPX Lacute y -30\nKPX Lacute yacute -30\nKPX Lacute ydieresis -30\nKPX Lcommaaccent T -90\nKPX Lcommaaccent Tcaron -90\nKPX Lcommaaccent Tcommaaccent -90\nKPX Lcommaaccent V -110\nKPX Lcommaaccent W -80\nKPX Lcommaaccent Y -120\nKPX Lcommaaccent Yacute -120\nKPX Lcommaaccent Ydieresis -120\nKPX Lcommaaccent quotedblright -140\nKPX Lcommaaccent quoteright -140\nKPX Lcommaaccent y -30\nKPX Lcommaaccent yacute -30\nKPX Lcommaaccent ydieresis -30\nKPX Lslash T -90\nKPX Lslash Tcaron -90\nKPX Lslash Tcommaaccent -90\nKPX Lslash V -110\nKPX Lslash W -80\nKPX Lslash Y -120\nKPX Lslash Yacute -120\nKPX Lslash Ydieresis -120\nKPX Lslash quotedblright -140\nKPX Lslash quoteright -140\nKPX Lslash y -30\nKPX Lslash yacute -30\nKPX Lslash ydieresis -30\nKPX O A -50\nKPX O Aacute -50\nKPX O Abreve -50\nKPX O Acircumflex -50\nKPX O Adieresis -50\nKPX O Agrave -50\nKPX O Amacron -50\nKPX O Aogonek -50\nKPX O Aring -50\nKPX O Atilde -50\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -50\nKPX O X -50\nKPX O Y -70\nKPX O Yacute -70\nKPX O Ydieresis -70\nKPX O comma -40\nKPX O period -40\nKPX Oacute A -50\nKPX Oacute Aacute -50\nKPX Oacute Abreve -50\nKPX Oacute Acircumflex -50\nKPX Oacute Adieresis -50\nKPX Oacute Agrave -50\nKPX Oacute Amacron -50\nKPX Oacute Aogonek -50\nKPX Oacute Aring -50\nKPX Oacute Atilde -50\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -50\nKPX Oacute X -50\nKPX Oacute Y -70\nKPX Oacute Yacute -70\nKPX Oacute Ydieresis -70\nKPX Oacute comma -40\nKPX Oacute period -40\nKPX Ocircumflex A -50\nKPX Ocircumflex Aacute -50\nKPX Ocircumflex Abreve -50\nKPX Ocircumflex Acircumflex -50\nKPX Ocircumflex Adieresis -50\nKPX Ocircumflex Agrave -50\nKPX Ocircumflex Amacron -50\nKPX Ocircumflex Aogonek -50\nKPX Ocircumflex Aring -50\nKPX Ocircumflex Atilde -50\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -50\nKPX Ocircumflex X -50\nKPX Ocircumflex Y -70\nKPX Ocircumflex Yacute -70\nKPX Ocircumflex Ydieresis -70\nKPX Ocircumflex comma -40\nKPX Ocircumflex period -40\nKPX Odieresis A -50\nKPX Odieresis Aacute -50\nKPX Odieresis Abreve -50\nKPX Odieresis Acircumflex -50\nKPX Odieresis Adieresis -50\nKPX Odieresis Agrave -50\nKPX Odieresis Amacron -50\nKPX Odieresis Aogonek -50\nKPX Odieresis Aring -50\nKPX Odieresis Atilde -50\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -50\nKPX Odieresis X -50\nKPX Odieresis Y -70\nKPX Odieresis Yacute -70\nKPX Odieresis Ydieresis -70\nKPX Odieresis comma -40\nKPX Odieresis period -40\nKPX Ograve A -50\nKPX Ograve Aacute -50\nKPX Ograve Abreve -50\nKPX Ograve Acircumflex -50\nKPX Ograve Adieresis -50\nKPX Ograve Agrave -50\nKPX Ograve Amacron -50\nKPX Ograve Aogonek -50\nKPX Ograve Aring -50\nKPX Ograve Atilde -50\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -50\nKPX Ograve X -50\nKPX Ograve Y -70\nKPX Ograve Yacute -70\nKPX Ograve Ydieresis -70\nKPX Ograve comma -40\nKPX Ograve period -40\nKPX Ohungarumlaut A -50\nKPX Ohungarumlaut Aacute -50\nKPX Ohungarumlaut Abreve -50\nKPX Ohungarumlaut Acircumflex -50\nKPX Ohungarumlaut Adieresis -50\nKPX Ohungarumlaut Agrave -50\nKPX Ohungarumlaut Amacron -50\nKPX Ohungarumlaut Aogonek -50\nKPX Ohungarumlaut Aring -50\nKPX Ohungarumlaut Atilde -50\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -50\nKPX Ohungarumlaut X -50\nKPX Ohungarumlaut Y -70\nKPX Ohungarumlaut Yacute -70\nKPX Ohungarumlaut Ydieresis -70\nKPX Ohungarumlaut comma -40\nKPX Ohungarumlaut period -40\nKPX Omacron A -50\nKPX Omacron Aacute -50\nKPX Omacron Abreve -50\nKPX Omacron Acircumflex -50\nKPX Omacron Adieresis -50\nKPX Omacron Agrave -50\nKPX Omacron Amacron -50\nKPX Omacron Aogonek -50\nKPX Omacron Aring -50\nKPX Omacron Atilde -50\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -50\nKPX Omacron X -50\nKPX Omacron Y -70\nKPX Omacron Yacute -70\nKPX Omacron Ydieresis -70\nKPX Omacron comma -40\nKPX Omacron period -40\nKPX Oslash A -50\nKPX Oslash Aacute -50\nKPX Oslash Abreve -50\nKPX Oslash Acircumflex -50\nKPX Oslash Adieresis -50\nKPX Oslash Agrave -50\nKPX Oslash Amacron -50\nKPX Oslash Aogonek -50\nKPX Oslash Aring -50\nKPX Oslash Atilde -50\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -50\nKPX Oslash X -50\nKPX Oslash Y -70\nKPX Oslash Yacute -70\nKPX Oslash Ydieresis -70\nKPX Oslash comma -40\nKPX Oslash period -40\nKPX Otilde A -50\nKPX Otilde Aacute -50\nKPX Otilde Abreve -50\nKPX Otilde Acircumflex -50\nKPX Otilde Adieresis -50\nKPX Otilde Agrave -50\nKPX Otilde Amacron -50\nKPX Otilde Aogonek -50\nKPX Otilde Aring -50\nKPX Otilde Atilde -50\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -50\nKPX Otilde X -50\nKPX Otilde Y -70\nKPX Otilde Yacute -70\nKPX Otilde Ydieresis -70\nKPX Otilde comma -40\nKPX Otilde period -40\nKPX P A -100\nKPX P Aacute -100\nKPX P Abreve -100\nKPX P Acircumflex -100\nKPX P Adieresis -100\nKPX P Agrave -100\nKPX P Amacron -100\nKPX P Aogonek -100\nKPX P Aring -100\nKPX P Atilde -100\nKPX P a -30\nKPX P aacute -30\nKPX P abreve -30\nKPX P acircumflex -30\nKPX P adieresis -30\nKPX P agrave -30\nKPX P amacron -30\nKPX P aogonek -30\nKPX P aring -30\nKPX P atilde -30\nKPX P comma -120\nKPX P e -30\nKPX P eacute -30\nKPX P ecaron -30\nKPX P ecircumflex -30\nKPX P edieresis -30\nKPX P edotaccent -30\nKPX P egrave -30\nKPX P emacron -30\nKPX P eogonek -30\nKPX P o -40\nKPX P oacute -40\nKPX P ocircumflex -40\nKPX P odieresis -40\nKPX P ograve -40\nKPX P ohungarumlaut -40\nKPX P omacron -40\nKPX P oslash -40\nKPX P otilde -40\nKPX P period -120\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX Q comma 20\nKPX Q period 20\nKPX R O -20\nKPX R Oacute -20\nKPX R Ocircumflex -20\nKPX R Odieresis -20\nKPX R Ograve -20\nKPX R Ohungarumlaut -20\nKPX R Omacron -20\nKPX R Oslash -20\nKPX R Otilde -20\nKPX R T -20\nKPX R Tcaron -20\nKPX R Tcommaaccent -20\nKPX R U -20\nKPX R Uacute -20\nKPX R Ucircumflex -20\nKPX R Udieresis -20\nKPX R Ugrave -20\nKPX R Uhungarumlaut -20\nKPX R Umacron -20\nKPX R Uogonek -20\nKPX R Uring -20\nKPX R V -50\nKPX R W -40\nKPX R Y -50\nKPX R Yacute -50\nKPX R Ydieresis -50\nKPX Racute O -20\nKPX Racute Oacute -20\nKPX Racute Ocircumflex -20\nKPX Racute Odieresis -20\nKPX Racute Ograve -20\nKPX Racute Ohungarumlaut -20\nKPX Racute Omacron -20\nKPX Racute Oslash -20\nKPX Racute Otilde -20\nKPX Racute T -20\nKPX Racute Tcaron -20\nKPX Racute Tcommaaccent -20\nKPX Racute U -20\nKPX Racute Uacute -20\nKPX Racute Ucircumflex -20\nKPX Racute Udieresis -20\nKPX Racute Ugrave -20\nKPX Racute Uhungarumlaut -20\nKPX Racute Umacron -20\nKPX Racute Uogonek -20\nKPX Racute Uring -20\nKPX Racute V -50\nKPX Racute W -40\nKPX Racute Y -50\nKPX Racute Yacute -50\nKPX Racute Ydieresis -50\nKPX Rcaron O -20\nKPX Rcaron Oacute -20\nKPX Rcaron Ocircumflex -20\nKPX Rcaron Odieresis -20\nKPX Rcaron Ograve -20\nKPX Rcaron Ohungarumlaut -20\nKPX Rcaron Omacron -20\nKPX Rcaron Oslash -20\nKPX Rcaron Otilde -20\nKPX Rcaron T -20\nKPX Rcaron Tcaron -20\nKPX Rcaron Tcommaaccent -20\nKPX Rcaron U -20\nKPX Rcaron Uacute -20\nKPX Rcaron Ucircumflex -20\nKPX Rcaron Udieresis -20\nKPX Rcaron Ugrave -20\nKPX Rcaron Uhungarumlaut -20\nKPX Rcaron Umacron -20\nKPX Rcaron Uogonek -20\nKPX Rcaron Uring -20\nKPX Rcaron V -50\nKPX Rcaron W -40\nKPX Rcaron Y -50\nKPX Rcaron Yacute -50\nKPX Rcaron Ydieresis -50\nKPX Rcommaaccent O -20\nKPX Rcommaaccent Oacute -20\nKPX Rcommaaccent Ocircumflex -20\nKPX Rcommaaccent Odieresis -20\nKPX Rcommaaccent Ograve -20\nKPX Rcommaaccent Ohungarumlaut -20\nKPX Rcommaaccent Omacron -20\nKPX Rcommaaccent Oslash -20\nKPX Rcommaaccent Otilde -20\nKPX Rcommaaccent T -20\nKPX Rcommaaccent Tcaron -20\nKPX Rcommaaccent Tcommaaccent -20\nKPX Rcommaaccent U -20\nKPX Rcommaaccent Uacute -20\nKPX Rcommaaccent Ucircumflex -20\nKPX Rcommaaccent Udieresis -20\nKPX Rcommaaccent Ugrave -20\nKPX Rcommaaccent Uhungarumlaut -20\nKPX Rcommaaccent Umacron -20\nKPX Rcommaaccent Uogonek -20\nKPX Rcommaaccent Uring -20\nKPX Rcommaaccent V -50\nKPX Rcommaaccent W -40\nKPX Rcommaaccent Y -50\nKPX Rcommaaccent Yacute -50\nKPX Rcommaaccent Ydieresis -50\nKPX T A -90\nKPX T Aacute -90\nKPX T Abreve -90\nKPX T Acircumflex -90\nKPX T Adieresis -90\nKPX T Agrave -90\nKPX T Amacron -90\nKPX T Aogonek -90\nKPX T Aring -90\nKPX T Atilde -90\nKPX T O -40\nKPX T Oacute -40\nKPX T Ocircumflex -40\nKPX T Odieresis -40\nKPX T Ograve -40\nKPX T Ohungarumlaut -40\nKPX T Omacron -40\nKPX T Oslash -40\nKPX T Otilde -40\nKPX T a -80\nKPX T aacute -80\nKPX T abreve -80\nKPX T acircumflex -80\nKPX T adieresis -80\nKPX T agrave -80\nKPX T amacron -80\nKPX T aogonek -80\nKPX T aring -80\nKPX T atilde -80\nKPX T colon -40\nKPX T comma -80\nKPX T e -60\nKPX T eacute -60\nKPX T ecaron -60\nKPX T ecircumflex -60\nKPX T edieresis -60\nKPX T edotaccent -60\nKPX T egrave -60\nKPX T emacron -60\nKPX T eogonek -60\nKPX T hyphen -120\nKPX T o -80\nKPX T oacute -80\nKPX T ocircumflex -80\nKPX T odieresis -80\nKPX T ograve -80\nKPX T ohungarumlaut -80\nKPX T omacron -80\nKPX T oslash -80\nKPX T otilde -80\nKPX T period -80\nKPX T r -80\nKPX T racute -80\nKPX T rcommaaccent -80\nKPX T semicolon -40\nKPX T u -90\nKPX T uacute -90\nKPX T ucircumflex -90\nKPX T udieresis -90\nKPX T ugrave -90\nKPX T uhungarumlaut -90\nKPX T umacron -90\nKPX T uogonek -90\nKPX T uring -90\nKPX T w -60\nKPX T y -60\nKPX T yacute -60\nKPX T ydieresis -60\nKPX Tcaron A -90\nKPX Tcaron Aacute -90\nKPX Tcaron Abreve -90\nKPX Tcaron Acircumflex -90\nKPX Tcaron Adieresis -90\nKPX Tcaron Agrave -90\nKPX Tcaron Amacron -90\nKPX Tcaron Aogonek -90\nKPX Tcaron Aring -90\nKPX Tcaron Atilde -90\nKPX Tcaron O -40\nKPX Tcaron Oacute -40\nKPX Tcaron Ocircumflex -40\nKPX Tcaron Odieresis -40\nKPX Tcaron Ograve -40\nKPX Tcaron Ohungarumlaut -40\nKPX Tcaron Omacron -40\nKPX Tcaron Oslash -40\nKPX Tcaron Otilde -40\nKPX Tcaron a -80\nKPX Tcaron aacute -80\nKPX Tcaron abreve -80\nKPX Tcaron acircumflex -80\nKPX Tcaron adieresis -80\nKPX Tcaron agrave -80\nKPX Tcaron amacron -80\nKPX Tcaron aogonek -80\nKPX Tcaron aring -80\nKPX Tcaron atilde -80\nKPX Tcaron colon -40\nKPX Tcaron comma -80\nKPX Tcaron e -60\nKPX Tcaron eacute -60\nKPX Tcaron ecaron -60\nKPX Tcaron ecircumflex -60\nKPX Tcaron edieresis -60\nKPX Tcaron edotaccent -60\nKPX Tcaron egrave -60\nKPX Tcaron emacron -60\nKPX Tcaron eogonek -60\nKPX Tcaron hyphen -120\nKPX Tcaron o -80\nKPX Tcaron oacute -80\nKPX Tcaron ocircumflex -80\nKPX Tcaron odieresis -80\nKPX Tcaron ograve -80\nKPX Tcaron ohungarumlaut -80\nKPX Tcaron omacron -80\nKPX Tcaron oslash -80\nKPX Tcaron otilde -80\nKPX Tcaron period -80\nKPX Tcaron r -80\nKPX Tcaron racute -80\nKPX Tcaron rcommaaccent -80\nKPX Tcaron semicolon -40\nKPX Tcaron u -90\nKPX Tcaron uacute -90\nKPX Tcaron ucircumflex -90\nKPX Tcaron udieresis -90\nKPX Tcaron ugrave -90\nKPX Tcaron uhungarumlaut -90\nKPX Tcaron umacron -90\nKPX Tcaron uogonek -90\nKPX Tcaron uring -90\nKPX Tcaron w -60\nKPX Tcaron y -60\nKPX Tcaron yacute -60\nKPX Tcaron ydieresis -60\nKPX Tcommaaccent A -90\nKPX Tcommaaccent Aacute -90\nKPX Tcommaaccent Abreve -90\nKPX Tcommaaccent Acircumflex -90\nKPX Tcommaaccent Adieresis -90\nKPX Tcommaaccent Agrave -90\nKPX Tcommaaccent Amacron -90\nKPX Tcommaaccent Aogonek -90\nKPX Tcommaaccent Aring -90\nKPX Tcommaaccent Atilde -90\nKPX Tcommaaccent O -40\nKPX Tcommaaccent Oacute -40\nKPX Tcommaaccent Ocircumflex -40\nKPX Tcommaaccent Odieresis -40\nKPX Tcommaaccent Ograve -40\nKPX Tcommaaccent Ohungarumlaut -40\nKPX Tcommaaccent Omacron -40\nKPX Tcommaaccent Oslash -40\nKPX Tcommaaccent Otilde -40\nKPX Tcommaaccent a -80\nKPX Tcommaaccent aacute -80\nKPX Tcommaaccent abreve -80\nKPX Tcommaaccent acircumflex -80\nKPX Tcommaaccent adieresis -80\nKPX Tcommaaccent agrave -80\nKPX Tcommaaccent amacron -80\nKPX Tcommaaccent aogonek -80\nKPX Tcommaaccent aring -80\nKPX Tcommaaccent atilde -80\nKPX Tcommaaccent colon -40\nKPX Tcommaaccent comma -80\nKPX Tcommaaccent e -60\nKPX Tcommaaccent eacute -60\nKPX Tcommaaccent ecaron -60\nKPX Tcommaaccent ecircumflex -60\nKPX Tcommaaccent edieresis -60\nKPX Tcommaaccent edotaccent -60\nKPX Tcommaaccent egrave -60\nKPX Tcommaaccent emacron -60\nKPX Tcommaaccent eogonek -60\nKPX Tcommaaccent hyphen -120\nKPX Tcommaaccent o -80\nKPX Tcommaaccent oacute -80\nKPX Tcommaaccent ocircumflex -80\nKPX Tcommaaccent odieresis -80\nKPX Tcommaaccent ograve -80\nKPX Tcommaaccent ohungarumlaut -80\nKPX Tcommaaccent omacron -80\nKPX Tcommaaccent oslash -80\nKPX Tcommaaccent otilde -80\nKPX Tcommaaccent period -80\nKPX Tcommaaccent r -80\nKPX Tcommaaccent racute -80\nKPX Tcommaaccent rcommaaccent -80\nKPX Tcommaaccent semicolon -40\nKPX Tcommaaccent u -90\nKPX Tcommaaccent uacute -90\nKPX Tcommaaccent ucircumflex -90\nKPX Tcommaaccent udieresis -90\nKPX Tcommaaccent ugrave -90\nKPX Tcommaaccent uhungarumlaut -90\nKPX Tcommaaccent umacron -90\nKPX Tcommaaccent uogonek -90\nKPX Tcommaaccent uring -90\nKPX Tcommaaccent w -60\nKPX Tcommaaccent y -60\nKPX Tcommaaccent yacute -60\nKPX Tcommaaccent ydieresis -60\nKPX U A -50\nKPX U Aacute -50\nKPX U Abreve -50\nKPX U Acircumflex -50\nKPX U Adieresis -50\nKPX U Agrave -50\nKPX U Amacron -50\nKPX U Aogonek -50\nKPX U Aring -50\nKPX U Atilde -50\nKPX U comma -30\nKPX U period -30\nKPX Uacute A -50\nKPX Uacute Aacute -50\nKPX Uacute Abreve -50\nKPX Uacute Acircumflex -50\nKPX Uacute Adieresis -50\nKPX Uacute Agrave -50\nKPX Uacute Amacron -50\nKPX Uacute Aogonek -50\nKPX Uacute Aring -50\nKPX Uacute Atilde -50\nKPX Uacute comma -30\nKPX Uacute period -30\nKPX Ucircumflex A -50\nKPX Ucircumflex Aacute -50\nKPX Ucircumflex Abreve -50\nKPX Ucircumflex Acircumflex -50\nKPX Ucircumflex Adieresis -50\nKPX Ucircumflex Agrave -50\nKPX Ucircumflex Amacron -50\nKPX Ucircumflex Aogonek -50\nKPX Ucircumflex Aring -50\nKPX Ucircumflex Atilde -50\nKPX Ucircumflex comma -30\nKPX Ucircumflex period -30\nKPX Udieresis A -50\nKPX Udieresis Aacute -50\nKPX Udieresis Abreve -50\nKPX Udieresis Acircumflex -50\nKPX Udieresis Adieresis -50\nKPX Udieresis Agrave -50\nKPX Udieresis Amacron -50\nKPX Udieresis Aogonek -50\nKPX Udieresis Aring -50\nKPX Udieresis Atilde -50\nKPX Udieresis comma -30\nKPX Udieresis period -30\nKPX Ugrave A -50\nKPX Ugrave Aacute -50\nKPX Ugrave Abreve -50\nKPX Ugrave Acircumflex -50\nKPX Ugrave Adieresis -50\nKPX Ugrave Agrave -50\nKPX Ugrave Amacron -50\nKPX Ugrave Aogonek -50\nKPX Ugrave Aring -50\nKPX Ugrave Atilde -50\nKPX Ugrave comma -30\nKPX Ugrave period -30\nKPX Uhungarumlaut A -50\nKPX Uhungarumlaut Aacute -50\nKPX Uhungarumlaut Abreve -50\nKPX Uhungarumlaut Acircumflex -50\nKPX Uhungarumlaut Adieresis -50\nKPX Uhungarumlaut Agrave -50\nKPX Uhungarumlaut Amacron -50\nKPX Uhungarumlaut Aogonek -50\nKPX Uhungarumlaut Aring -50\nKPX Uhungarumlaut Atilde -50\nKPX Uhungarumlaut comma -30\nKPX Uhungarumlaut period -30\nKPX Umacron A -50\nKPX Umacron Aacute -50\nKPX Umacron Abreve -50\nKPX Umacron Acircumflex -50\nKPX Umacron Adieresis -50\nKPX Umacron Agrave -50\nKPX Umacron Amacron -50\nKPX Umacron Aogonek -50\nKPX Umacron Aring -50\nKPX Umacron Atilde -50\nKPX Umacron comma -30\nKPX Umacron period -30\nKPX Uogonek A -50\nKPX Uogonek Aacute -50\nKPX Uogonek Abreve -50\nKPX Uogonek Acircumflex -50\nKPX Uogonek Adieresis -50\nKPX Uogonek Agrave -50\nKPX Uogonek Amacron -50\nKPX Uogonek Aogonek -50\nKPX Uogonek Aring -50\nKPX Uogonek Atilde -50\nKPX Uogonek comma -30\nKPX Uogonek period -30\nKPX Uring A -50\nKPX Uring Aacute -50\nKPX Uring Abreve -50\nKPX Uring Acircumflex -50\nKPX Uring Adieresis -50\nKPX Uring Agrave -50\nKPX Uring Amacron -50\nKPX Uring Aogonek -50\nKPX Uring Aring -50\nKPX Uring Atilde -50\nKPX Uring comma -30\nKPX Uring period -30\nKPX V A -80\nKPX V Aacute -80\nKPX V Abreve -80\nKPX V Acircumflex -80\nKPX V Adieresis -80\nKPX V Agrave -80\nKPX V Amacron -80\nKPX V Aogonek -80\nKPX V Aring -80\nKPX V Atilde -80\nKPX V G -50\nKPX V Gbreve -50\nKPX V Gcommaaccent -50\nKPX V O -50\nKPX V Oacute -50\nKPX V Ocircumflex -50\nKPX V Odieresis -50\nKPX V Ograve -50\nKPX V Ohungarumlaut -50\nKPX V Omacron -50\nKPX V Oslash -50\nKPX V Otilde -50\nKPX V a -60\nKPX V aacute -60\nKPX V abreve -60\nKPX V acircumflex -60\nKPX V adieresis -60\nKPX V agrave -60\nKPX V amacron -60\nKPX V aogonek -60\nKPX V aring -60\nKPX V atilde -60\nKPX V colon -40\nKPX V comma -120\nKPX V e -50\nKPX V eacute -50\nKPX V ecaron -50\nKPX V ecircumflex -50\nKPX V edieresis -50\nKPX V edotaccent -50\nKPX V egrave -50\nKPX V emacron -50\nKPX V eogonek -50\nKPX V hyphen -80\nKPX V o -90\nKPX V oacute -90\nKPX V ocircumflex -90\nKPX V odieresis -90\nKPX V ograve -90\nKPX V ohungarumlaut -90\nKPX V omacron -90\nKPX V oslash -90\nKPX V otilde -90\nKPX V period -120\nKPX V semicolon -40\nKPX V u -60\nKPX V uacute -60\nKPX V ucircumflex -60\nKPX V udieresis -60\nKPX V ugrave -60\nKPX V uhungarumlaut -60\nKPX V umacron -60\nKPX V uogonek -60\nKPX V uring -60\nKPX W A -60\nKPX W Aacute -60\nKPX W Abreve -60\nKPX W Acircumflex -60\nKPX W Adieresis -60\nKPX W Agrave -60\nKPX W Amacron -60\nKPX W Aogonek -60\nKPX W Aring -60\nKPX W Atilde -60\nKPX W O -20\nKPX W Oacute -20\nKPX W Ocircumflex -20\nKPX W Odieresis -20\nKPX W Ograve -20\nKPX W Ohungarumlaut -20\nKPX W Omacron -20\nKPX W Oslash -20\nKPX W Otilde -20\nKPX W a -40\nKPX W aacute -40\nKPX W abreve -40\nKPX W acircumflex -40\nKPX W adieresis -40\nKPX W agrave -40\nKPX W amacron -40\nKPX W aogonek -40\nKPX W aring -40\nKPX W atilde -40\nKPX W colon -10\nKPX W comma -80\nKPX W e -35\nKPX W eacute -35\nKPX W ecaron -35\nKPX W ecircumflex -35\nKPX W edieresis -35\nKPX W edotaccent -35\nKPX W egrave -35\nKPX W emacron -35\nKPX W eogonek -35\nKPX W hyphen -40\nKPX W o -60\nKPX W oacute -60\nKPX W ocircumflex -60\nKPX W odieresis -60\nKPX W ograve -60\nKPX W ohungarumlaut -60\nKPX W omacron -60\nKPX W oslash -60\nKPX W otilde -60\nKPX W period -80\nKPX W semicolon -10\nKPX W u -45\nKPX W uacute -45\nKPX W ucircumflex -45\nKPX W udieresis -45\nKPX W ugrave -45\nKPX W uhungarumlaut -45\nKPX W umacron -45\nKPX W uogonek -45\nKPX W uring -45\nKPX W y -20\nKPX W yacute -20\nKPX W ydieresis -20\nKPX Y A -110\nKPX Y Aacute -110\nKPX Y Abreve -110\nKPX Y Acircumflex -110\nKPX Y Adieresis -110\nKPX Y Agrave -110\nKPX Y Amacron -110\nKPX Y Aogonek -110\nKPX Y Aring -110\nKPX Y Atilde -110\nKPX Y O -70\nKPX Y Oacute -70\nKPX Y Ocircumflex -70\nKPX Y Odieresis -70\nKPX Y Ograve -70\nKPX Y Ohungarumlaut -70\nKPX Y Omacron -70\nKPX Y Oslash -70\nKPX Y Otilde -70\nKPX Y a -90\nKPX Y aacute -90\nKPX Y abreve -90\nKPX Y acircumflex -90\nKPX Y adieresis -90\nKPX Y agrave -90\nKPX Y amacron -90\nKPX Y aogonek -90\nKPX Y aring -90\nKPX Y atilde -90\nKPX Y colon -50\nKPX Y comma -100\nKPX Y e -80\nKPX Y eacute -80\nKPX Y ecaron -80\nKPX Y ecircumflex -80\nKPX Y edieresis -80\nKPX Y edotaccent -80\nKPX Y egrave -80\nKPX Y emacron -80\nKPX Y eogonek -80\nKPX Y o -100\nKPX Y oacute -100\nKPX Y ocircumflex -100\nKPX Y odieresis -100\nKPX Y ograve -100\nKPX Y ohungarumlaut -100\nKPX Y omacron -100\nKPX Y oslash -100\nKPX Y otilde -100\nKPX Y period -100\nKPX Y semicolon -50\nKPX Y u -100\nKPX Y uacute -100\nKPX Y ucircumflex -100\nKPX Y udieresis -100\nKPX Y ugrave -100\nKPX Y uhungarumlaut -100\nKPX Y umacron -100\nKPX Y uogonek -100\nKPX Y uring -100\nKPX Yacute A -110\nKPX Yacute Aacute -110\nKPX Yacute Abreve -110\nKPX Yacute Acircumflex -110\nKPX Yacute Adieresis -110\nKPX Yacute Agrave -110\nKPX Yacute Amacron -110\nKPX Yacute Aogonek -110\nKPX Yacute Aring -110\nKPX Yacute Atilde -110\nKPX Yacute O -70\nKPX Yacute Oacute -70\nKPX Yacute Ocircumflex -70\nKPX Yacute Odieresis -70\nKPX Yacute Ograve -70\nKPX Yacute Ohungarumlaut -70\nKPX Yacute Omacron -70\nKPX Yacute Oslash -70\nKPX Yacute Otilde -70\nKPX Yacute a -90\nKPX Yacute aacute -90\nKPX Yacute abreve -90\nKPX Yacute acircumflex -90\nKPX Yacute adieresis -90\nKPX Yacute agrave -90\nKPX Yacute amacron -90\nKPX Yacute aogonek -90\nKPX Yacute aring -90\nKPX Yacute atilde -90\nKPX Yacute colon -50\nKPX Yacute comma -100\nKPX Yacute e -80\nKPX Yacute eacute -80\nKPX Yacute ecaron -80\nKPX Yacute ecircumflex -80\nKPX Yacute edieresis -80\nKPX Yacute edotaccent -80\nKPX Yacute egrave -80\nKPX Yacute emacron -80\nKPX Yacute eogonek -80\nKPX Yacute o -100\nKPX Yacute oacute -100\nKPX Yacute ocircumflex -100\nKPX Yacute odieresis -100\nKPX Yacute ograve -100\nKPX Yacute ohungarumlaut -100\nKPX Yacute omacron -100\nKPX Yacute oslash -100\nKPX Yacute otilde -100\nKPX Yacute period -100\nKPX Yacute semicolon -50\nKPX Yacute u -100\nKPX Yacute uacute -100\nKPX Yacute ucircumflex -100\nKPX Yacute udieresis -100\nKPX Yacute ugrave -100\nKPX Yacute uhungarumlaut -100\nKPX Yacute umacron -100\nKPX Yacute uogonek -100\nKPX Yacute uring -100\nKPX Ydieresis A -110\nKPX Ydieresis Aacute -110\nKPX Ydieresis Abreve -110\nKPX Ydieresis Acircumflex -110\nKPX Ydieresis Adieresis -110\nKPX Ydieresis Agrave -110\nKPX Ydieresis Amacron -110\nKPX Ydieresis Aogonek -110\nKPX Ydieresis Aring -110\nKPX Ydieresis Atilde -110\nKPX Ydieresis O -70\nKPX Ydieresis Oacute -70\nKPX Ydieresis Ocircumflex -70\nKPX Ydieresis Odieresis -70\nKPX Ydieresis Ograve -70\nKPX Ydieresis Ohungarumlaut -70\nKPX Ydieresis Omacron -70\nKPX Ydieresis Oslash -70\nKPX Ydieresis Otilde -70\nKPX Ydieresis a -90\nKPX Ydieresis aacute -90\nKPX Ydieresis abreve -90\nKPX Ydieresis acircumflex -90\nKPX Ydieresis adieresis -90\nKPX Ydieresis agrave -90\nKPX Ydieresis amacron -90\nKPX Ydieresis aogonek -90\nKPX Ydieresis aring -90\nKPX Ydieresis atilde -90\nKPX Ydieresis colon -50\nKPX Ydieresis comma -100\nKPX Ydieresis e -80\nKPX Ydieresis eacute -80\nKPX Ydieresis ecaron -80\nKPX Ydieresis ecircumflex -80\nKPX Ydieresis edieresis -80\nKPX Ydieresis edotaccent -80\nKPX Ydieresis egrave -80\nKPX Ydieresis emacron -80\nKPX Ydieresis eogonek -80\nKPX Ydieresis o -100\nKPX Ydieresis oacute -100\nKPX Ydieresis ocircumflex -100\nKPX Ydieresis odieresis -100\nKPX Ydieresis ograve -100\nKPX Ydieresis ohungarumlaut -100\nKPX Ydieresis omacron -100\nKPX Ydieresis oslash -100\nKPX Ydieresis otilde -100\nKPX Ydieresis period -100\nKPX Ydieresis semicolon -50\nKPX Ydieresis u -100\nKPX Ydieresis uacute -100\nKPX Ydieresis ucircumflex -100\nKPX Ydieresis udieresis -100\nKPX Ydieresis ugrave -100\nKPX Ydieresis uhungarumlaut -100\nKPX Ydieresis umacron -100\nKPX Ydieresis uogonek -100\nKPX Ydieresis uring -100\nKPX a g -10\nKPX a gbreve -10\nKPX a gcommaaccent -10\nKPX a v -15\nKPX a w -15\nKPX a y -20\nKPX a yacute -20\nKPX a ydieresis -20\nKPX aacute g -10\nKPX aacute gbreve -10\nKPX aacute gcommaaccent -10\nKPX aacute v -15\nKPX aacute w -15\nKPX aacute y -20\nKPX aacute yacute -20\nKPX aacute ydieresis -20\nKPX abreve g -10\nKPX abreve gbreve -10\nKPX abreve gcommaaccent -10\nKPX abreve v -15\nKPX abreve w -15\nKPX abreve y -20\nKPX abreve yacute -20\nKPX abreve ydieresis -20\nKPX acircumflex g -10\nKPX acircumflex gbreve -10\nKPX acircumflex gcommaaccent -10\nKPX acircumflex v -15\nKPX acircumflex w -15\nKPX acircumflex y -20\nKPX acircumflex yacute -20\nKPX acircumflex ydieresis -20\nKPX adieresis g -10\nKPX adieresis gbreve -10\nKPX adieresis gcommaaccent -10\nKPX adieresis v -15\nKPX adieresis w -15\nKPX adieresis y -20\nKPX adieresis yacute -20\nKPX adieresis ydieresis -20\nKPX agrave g -10\nKPX agrave gbreve -10\nKPX agrave gcommaaccent -10\nKPX agrave v -15\nKPX agrave w -15\nKPX agrave y -20\nKPX agrave yacute -20\nKPX agrave ydieresis -20\nKPX amacron g -10\nKPX amacron gbreve -10\nKPX amacron gcommaaccent -10\nKPX amacron v -15\nKPX amacron w -15\nKPX amacron y -20\nKPX amacron yacute -20\nKPX amacron ydieresis -20\nKPX aogonek g -10\nKPX aogonek gbreve -10\nKPX aogonek gcommaaccent -10\nKPX aogonek v -15\nKPX aogonek w -15\nKPX aogonek y -20\nKPX aogonek yacute -20\nKPX aogonek ydieresis -20\nKPX aring g -10\nKPX aring gbreve -10\nKPX aring gcommaaccent -10\nKPX aring v -15\nKPX aring w -15\nKPX aring y -20\nKPX aring yacute -20\nKPX aring ydieresis -20\nKPX atilde g -10\nKPX atilde gbreve -10\nKPX atilde gcommaaccent -10\nKPX atilde v -15\nKPX atilde w -15\nKPX atilde y -20\nKPX atilde yacute -20\nKPX atilde ydieresis -20\nKPX b l -10\nKPX b lacute -10\nKPX b lcommaaccent -10\nKPX b lslash -10\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX b v -20\nKPX b y -20\nKPX b yacute -20\nKPX b ydieresis -20\nKPX c h -10\nKPX c k -20\nKPX c kcommaaccent -20\nKPX c l -20\nKPX c lacute -20\nKPX c lcommaaccent -20\nKPX c lslash -20\nKPX c y -10\nKPX c yacute -10\nKPX c ydieresis -10\nKPX cacute h -10\nKPX cacute k -20\nKPX cacute kcommaaccent -20\nKPX cacute l -20\nKPX cacute lacute -20\nKPX cacute lcommaaccent -20\nKPX cacute lslash -20\nKPX cacute y -10\nKPX cacute yacute -10\nKPX cacute ydieresis -10\nKPX ccaron h -10\nKPX ccaron k -20\nKPX ccaron kcommaaccent -20\nKPX ccaron l -20\nKPX ccaron lacute -20\nKPX ccaron lcommaaccent -20\nKPX ccaron lslash -20\nKPX ccaron y -10\nKPX ccaron yacute -10\nKPX ccaron ydieresis -10\nKPX ccedilla h -10\nKPX ccedilla k -20\nKPX ccedilla kcommaaccent -20\nKPX ccedilla l -20\nKPX ccedilla lacute -20\nKPX ccedilla lcommaaccent -20\nKPX ccedilla lslash -20\nKPX ccedilla y -10\nKPX ccedilla yacute -10\nKPX ccedilla ydieresis -10\nKPX colon space -40\nKPX comma quotedblright -120\nKPX comma quoteright -120\nKPX comma space -40\nKPX d d -10\nKPX d dcroat -10\nKPX d v -15\nKPX d w -15\nKPX d y -15\nKPX d yacute -15\nKPX d ydieresis -15\nKPX dcroat d -10\nKPX dcroat dcroat -10\nKPX dcroat v -15\nKPX dcroat w -15\nKPX dcroat y -15\nKPX dcroat yacute -15\nKPX dcroat ydieresis -15\nKPX e comma 10\nKPX e period 20\nKPX e v -15\nKPX e w -15\nKPX e x -15\nKPX e y -15\nKPX e yacute -15\nKPX e ydieresis -15\nKPX eacute comma 10\nKPX eacute period 20\nKPX eacute v -15\nKPX eacute w -15\nKPX eacute x -15\nKPX eacute y -15\nKPX eacute yacute -15\nKPX eacute ydieresis -15\nKPX ecaron comma 10\nKPX ecaron period 20\nKPX ecaron v -15\nKPX ecaron w -15\nKPX ecaron x -15\nKPX ecaron y -15\nKPX ecaron yacute -15\nKPX ecaron ydieresis -15\nKPX ecircumflex comma 10\nKPX ecircumflex period 20\nKPX ecircumflex v -15\nKPX ecircumflex w -15\nKPX ecircumflex x -15\nKPX ecircumflex y -15\nKPX ecircumflex yacute -15\nKPX ecircumflex ydieresis -15\nKPX edieresis comma 10\nKPX edieresis period 20\nKPX edieresis v -15\nKPX edieresis w -15\nKPX edieresis x -15\nKPX edieresis y -15\nKPX edieresis yacute -15\nKPX edieresis ydieresis -15\nKPX edotaccent comma 10\nKPX edotaccent period 20\nKPX edotaccent v -15\nKPX edotaccent w -15\nKPX edotaccent x -15\nKPX edotaccent y -15\nKPX edotaccent yacute -15\nKPX edotaccent ydieresis -15\nKPX egrave comma 10\nKPX egrave period 20\nKPX egrave v -15\nKPX egrave w -15\nKPX egrave x -15\nKPX egrave y -15\nKPX egrave yacute -15\nKPX egrave ydieresis -15\nKPX emacron comma 10\nKPX emacron period 20\nKPX emacron v -15\nKPX emacron w -15\nKPX emacron x -15\nKPX emacron y -15\nKPX emacron yacute -15\nKPX emacron ydieresis -15\nKPX eogonek comma 10\nKPX eogonek period 20\nKPX eogonek v -15\nKPX eogonek w -15\nKPX eogonek x -15\nKPX eogonek y -15\nKPX eogonek yacute -15\nKPX eogonek ydieresis -15\nKPX f comma -10\nKPX f e -10\nKPX f eacute -10\nKPX f ecaron -10\nKPX f ecircumflex -10\nKPX f edieresis -10\nKPX f edotaccent -10\nKPX f egrave -10\nKPX f emacron -10\nKPX f eogonek -10\nKPX f o -20\nKPX f oacute -20\nKPX f ocircumflex -20\nKPX f odieresis -20\nKPX f ograve -20\nKPX f ohungarumlaut -20\nKPX f omacron -20\nKPX f oslash -20\nKPX f otilde -20\nKPX f period -10\nKPX f quotedblright 30\nKPX f quoteright 30\nKPX g e 10\nKPX g eacute 10\nKPX g ecaron 10\nKPX g ecircumflex 10\nKPX g edieresis 10\nKPX g edotaccent 10\nKPX g egrave 10\nKPX g emacron 10\nKPX g eogonek 10\nKPX g g -10\nKPX g gbreve -10\nKPX g gcommaaccent -10\nKPX gbreve e 10\nKPX gbreve eacute 10\nKPX gbreve ecaron 10\nKPX gbreve ecircumflex 10\nKPX gbreve edieresis 10\nKPX gbreve edotaccent 10\nKPX gbreve egrave 10\nKPX gbreve emacron 10\nKPX gbreve eogonek 10\nKPX gbreve g -10\nKPX gbreve gbreve -10\nKPX gbreve gcommaaccent -10\nKPX gcommaaccent e 10\nKPX gcommaaccent eacute 10\nKPX gcommaaccent ecaron 10\nKPX gcommaaccent ecircumflex 10\nKPX gcommaaccent edieresis 10\nKPX gcommaaccent edotaccent 10\nKPX gcommaaccent egrave 10\nKPX gcommaaccent emacron 10\nKPX gcommaaccent eogonek 10\nKPX gcommaaccent g -10\nKPX gcommaaccent gbreve -10\nKPX gcommaaccent gcommaaccent -10\nKPX h y -20\nKPX h yacute -20\nKPX h ydieresis -20\nKPX k o -15\nKPX k oacute -15\nKPX k ocircumflex -15\nKPX k odieresis -15\nKPX k ograve -15\nKPX k ohungarumlaut -15\nKPX k omacron -15\nKPX k oslash -15\nKPX k otilde -15\nKPX kcommaaccent o -15\nKPX kcommaaccent oacute -15\nKPX kcommaaccent ocircumflex -15\nKPX kcommaaccent odieresis -15\nKPX kcommaaccent ograve -15\nKPX kcommaaccent ohungarumlaut -15\nKPX kcommaaccent omacron -15\nKPX kcommaaccent oslash -15\nKPX kcommaaccent otilde -15\nKPX l w -15\nKPX l y -15\nKPX l yacute -15\nKPX l ydieresis -15\nKPX lacute w -15\nKPX lacute y -15\nKPX lacute yacute -15\nKPX lacute ydieresis -15\nKPX lcommaaccent w -15\nKPX lcommaaccent y -15\nKPX lcommaaccent yacute -15\nKPX lcommaaccent ydieresis -15\nKPX lslash w -15\nKPX lslash y -15\nKPX lslash yacute -15\nKPX lslash ydieresis -15\nKPX m u -20\nKPX m uacute -20\nKPX m ucircumflex -20\nKPX m udieresis -20\nKPX m ugrave -20\nKPX m uhungarumlaut -20\nKPX m umacron -20\nKPX m uogonek -20\nKPX m uring -20\nKPX m y -30\nKPX m yacute -30\nKPX m ydieresis -30\nKPX n u -10\nKPX n uacute -10\nKPX n ucircumflex -10\nKPX n udieresis -10\nKPX n ugrave -10\nKPX n uhungarumlaut -10\nKPX n umacron -10\nKPX n uogonek -10\nKPX n uring -10\nKPX n v -40\nKPX n y -20\nKPX n yacute -20\nKPX n ydieresis -20\nKPX nacute u -10\nKPX nacute uacute -10\nKPX nacute ucircumflex -10\nKPX nacute udieresis -10\nKPX nacute ugrave -10\nKPX nacute uhungarumlaut -10\nKPX nacute umacron -10\nKPX nacute uogonek -10\nKPX nacute uring -10\nKPX nacute v -40\nKPX nacute y -20\nKPX nacute yacute -20\nKPX nacute ydieresis -20\nKPX ncaron u -10\nKPX ncaron uacute -10\nKPX ncaron ucircumflex -10\nKPX ncaron udieresis -10\nKPX ncaron ugrave -10\nKPX ncaron uhungarumlaut -10\nKPX ncaron umacron -10\nKPX ncaron uogonek -10\nKPX ncaron uring -10\nKPX ncaron v -40\nKPX ncaron y -20\nKPX ncaron yacute -20\nKPX ncaron ydieresis -20\nKPX ncommaaccent u -10\nKPX ncommaaccent uacute -10\nKPX ncommaaccent ucircumflex -10\nKPX ncommaaccent udieresis -10\nKPX ncommaaccent ugrave -10\nKPX ncommaaccent uhungarumlaut -10\nKPX ncommaaccent umacron -10\nKPX ncommaaccent uogonek -10\nKPX ncommaaccent uring -10\nKPX ncommaaccent v -40\nKPX ncommaaccent y -20\nKPX ncommaaccent yacute -20\nKPX ncommaaccent ydieresis -20\nKPX ntilde u -10\nKPX ntilde uacute -10\nKPX ntilde ucircumflex -10\nKPX ntilde udieresis -10\nKPX ntilde ugrave -10\nKPX ntilde uhungarumlaut -10\nKPX ntilde umacron -10\nKPX ntilde uogonek -10\nKPX ntilde uring -10\nKPX ntilde v -40\nKPX ntilde y -20\nKPX ntilde yacute -20\nKPX ntilde ydieresis -20\nKPX o v -20\nKPX o w -15\nKPX o x -30\nKPX o y -20\nKPX o yacute -20\nKPX o ydieresis -20\nKPX oacute v -20\nKPX oacute w -15\nKPX oacute x -30\nKPX oacute y -20\nKPX oacute yacute -20\nKPX oacute ydieresis -20\nKPX ocircumflex v -20\nKPX ocircumflex w -15\nKPX ocircumflex x -30\nKPX ocircumflex y -20\nKPX ocircumflex yacute -20\nKPX ocircumflex ydieresis -20\nKPX odieresis v -20\nKPX odieresis w -15\nKPX odieresis x -30\nKPX odieresis y -20\nKPX odieresis yacute -20\nKPX odieresis ydieresis -20\nKPX ograve v -20\nKPX ograve w -15\nKPX ograve x -30\nKPX ograve y -20\nKPX ograve yacute -20\nKPX ograve ydieresis -20\nKPX ohungarumlaut v -20\nKPX ohungarumlaut w -15\nKPX ohungarumlaut x -30\nKPX ohungarumlaut y -20\nKPX ohungarumlaut yacute -20\nKPX ohungarumlaut ydieresis -20\nKPX omacron v -20\nKPX omacron w -15\nKPX omacron x -30\nKPX omacron y -20\nKPX omacron yacute -20\nKPX omacron ydieresis -20\nKPX oslash v -20\nKPX oslash w -15\nKPX oslash x -30\nKPX oslash y -20\nKPX oslash yacute -20\nKPX oslash ydieresis -20\nKPX otilde v -20\nKPX otilde w -15\nKPX otilde x -30\nKPX otilde y -20\nKPX otilde yacute -20\nKPX otilde ydieresis -20\nKPX p y -15\nKPX p yacute -15\nKPX p ydieresis -15\nKPX period quotedblright -120\nKPX period quoteright -120\nKPX period space -40\nKPX quotedblright space -80\nKPX quoteleft quoteleft -46\nKPX quoteright d -80\nKPX quoteright dcroat -80\nKPX quoteright l -20\nKPX quoteright lacute -20\nKPX quoteright lcommaaccent -20\nKPX quoteright lslash -20\nKPX quoteright quoteright -46\nKPX quoteright r -40\nKPX quoteright racute -40\nKPX quoteright rcaron -40\nKPX quoteright rcommaaccent -40\nKPX quoteright s -60\nKPX quoteright sacute -60\nKPX quoteright scaron -60\nKPX quoteright scedilla -60\nKPX quoteright scommaaccent -60\nKPX quoteright space -80\nKPX quoteright v -20\nKPX r c -20\nKPX r cacute -20\nKPX r ccaron -20\nKPX r ccedilla -20\nKPX r comma -60\nKPX r d -20\nKPX r dcroat -20\nKPX r g -15\nKPX r gbreve -15\nKPX r gcommaaccent -15\nKPX r hyphen -20\nKPX r o -20\nKPX r oacute -20\nKPX r ocircumflex -20\nKPX r odieresis -20\nKPX r ograve -20\nKPX r ohungarumlaut -20\nKPX r omacron -20\nKPX r oslash -20\nKPX r otilde -20\nKPX r period -60\nKPX r q -20\nKPX r s -15\nKPX r sacute -15\nKPX r scaron -15\nKPX r scedilla -15\nKPX r scommaaccent -15\nKPX r t 20\nKPX r tcommaaccent 20\nKPX r v 10\nKPX r y 10\nKPX r yacute 10\nKPX r ydieresis 10\nKPX racute c -20\nKPX racute cacute -20\nKPX racute ccaron -20\nKPX racute ccedilla -20\nKPX racute comma -60\nKPX racute d -20\nKPX racute dcroat -20\nKPX racute g -15\nKPX racute gbreve -15\nKPX racute gcommaaccent -15\nKPX racute hyphen -20\nKPX racute o -20\nKPX racute oacute -20\nKPX racute ocircumflex -20\nKPX racute odieresis -20\nKPX racute ograve -20\nKPX racute ohungarumlaut -20\nKPX racute omacron -20\nKPX racute oslash -20\nKPX racute otilde -20\nKPX racute period -60\nKPX racute q -20\nKPX racute s -15\nKPX racute sacute -15\nKPX racute scaron -15\nKPX racute scedilla -15\nKPX racute scommaaccent -15\nKPX racute t 20\nKPX racute tcommaaccent 20\nKPX racute v 10\nKPX racute y 10\nKPX racute yacute 10\nKPX racute ydieresis 10\nKPX rcaron c -20\nKPX rcaron cacute -20\nKPX rcaron ccaron -20\nKPX rcaron ccedilla -20\nKPX rcaron comma -60\nKPX rcaron d -20\nKPX rcaron dcroat -20\nKPX rcaron g -15\nKPX rcaron gbreve -15\nKPX rcaron gcommaaccent -15\nKPX rcaron hyphen -20\nKPX rcaron o -20\nKPX rcaron oacute -20\nKPX rcaron ocircumflex -20\nKPX rcaron odieresis -20\nKPX rcaron ograve -20\nKPX rcaron ohungarumlaut -20\nKPX rcaron omacron -20\nKPX rcaron oslash -20\nKPX rcaron otilde -20\nKPX rcaron period -60\nKPX rcaron q -20\nKPX rcaron s -15\nKPX rcaron sacute -15\nKPX rcaron scaron -15\nKPX rcaron scedilla -15\nKPX rcaron scommaaccent -15\nKPX rcaron t 20\nKPX rcaron tcommaaccent 20\nKPX rcaron v 10\nKPX rcaron y 10\nKPX rcaron yacute 10\nKPX rcaron ydieresis 10\nKPX rcommaaccent c -20\nKPX rcommaaccent cacute -20\nKPX rcommaaccent ccaron -20\nKPX rcommaaccent ccedilla -20\nKPX rcommaaccent comma -60\nKPX rcommaaccent d -20\nKPX rcommaaccent dcroat -20\nKPX rcommaaccent g -15\nKPX rcommaaccent gbreve -15\nKPX rcommaaccent gcommaaccent -15\nKPX rcommaaccent hyphen -20\nKPX rcommaaccent o -20\nKPX rcommaaccent oacute -20\nKPX rcommaaccent ocircumflex -20\nKPX rcommaaccent odieresis -20\nKPX rcommaaccent ograve -20\nKPX rcommaaccent ohungarumlaut -20\nKPX rcommaaccent omacron -20\nKPX rcommaaccent oslash -20\nKPX rcommaaccent otilde -20\nKPX rcommaaccent period -60\nKPX rcommaaccent q -20\nKPX rcommaaccent s -15\nKPX rcommaaccent sacute -15\nKPX rcommaaccent scaron -15\nKPX rcommaaccent scedilla -15\nKPX rcommaaccent scommaaccent -15\nKPX rcommaaccent t 20\nKPX rcommaaccent tcommaaccent 20\nKPX rcommaaccent v 10\nKPX rcommaaccent y 10\nKPX rcommaaccent yacute 10\nKPX rcommaaccent ydieresis 10\nKPX s w -15\nKPX sacute w -15\nKPX scaron w -15\nKPX scedilla w -15\nKPX scommaaccent w -15\nKPX semicolon space -40\nKPX space T -100\nKPX space Tcaron -100\nKPX space Tcommaaccent -100\nKPX space V -80\nKPX space W -80\nKPX space Y -120\nKPX space Yacute -120\nKPX space Ydieresis -120\nKPX space quotedblleft -80\nKPX space quoteleft -60\nKPX v a -20\nKPX v aacute -20\nKPX v abreve -20\nKPX v acircumflex -20\nKPX v adieresis -20\nKPX v agrave -20\nKPX v amacron -20\nKPX v aogonek -20\nKPX v aring -20\nKPX v atilde -20\nKPX v comma -80\nKPX v o -30\nKPX v oacute -30\nKPX v ocircumflex -30\nKPX v odieresis -30\nKPX v ograve -30\nKPX v ohungarumlaut -30\nKPX v omacron -30\nKPX v oslash -30\nKPX v otilde -30\nKPX v period -80\nKPX w comma -40\nKPX w o -20\nKPX w oacute -20\nKPX w ocircumflex -20\nKPX w odieresis -20\nKPX w ograve -20\nKPX w ohungarumlaut -20\nKPX w omacron -20\nKPX w oslash -20\nKPX w otilde -20\nKPX w period -40\nKPX x e -10\nKPX x eacute -10\nKPX x ecaron -10\nKPX x ecircumflex -10\nKPX x edieresis -10\nKPX x edotaccent -10\nKPX x egrave -10\nKPX x emacron -10\nKPX x eogonek -10\nKPX y a -30\nKPX y aacute -30\nKPX y abreve -30\nKPX y acircumflex -30\nKPX y adieresis -30\nKPX y agrave -30\nKPX y amacron -30\nKPX y aogonek -30\nKPX y aring -30\nKPX y atilde -30\nKPX y comma -80\nKPX y e -10\nKPX y eacute -10\nKPX y ecaron -10\nKPX y ecircumflex -10\nKPX y edieresis -10\nKPX y edotaccent -10\nKPX y egrave -10\nKPX y emacron -10\nKPX y eogonek -10\nKPX y o -25\nKPX y oacute -25\nKPX y ocircumflex -25\nKPX y odieresis -25\nKPX y ograve -25\nKPX y ohungarumlaut -25\nKPX y omacron -25\nKPX y oslash -25\nKPX y otilde -25\nKPX y period -80\nKPX yacute a -30\nKPX yacute aacute -30\nKPX yacute abreve -30\nKPX yacute acircumflex -30\nKPX yacute adieresis -30\nKPX yacute agrave -30\nKPX yacute amacron -30\nKPX yacute aogonek -30\nKPX yacute aring -30\nKPX yacute atilde -30\nKPX yacute comma -80\nKPX yacute e -10\nKPX yacute eacute -10\nKPX yacute ecaron -10\nKPX yacute ecircumflex -10\nKPX yacute edieresis -10\nKPX yacute edotaccent -10\nKPX yacute egrave -10\nKPX yacute emacron -10\nKPX yacute eogonek -10\nKPX yacute o -25\nKPX yacute oacute -25\nKPX yacute ocircumflex -25\nKPX yacute odieresis -25\nKPX yacute ograve -25\nKPX yacute ohungarumlaut -25\nKPX yacute omacron -25\nKPX yacute oslash -25\nKPX yacute otilde -25\nKPX yacute period -80\nKPX ydieresis a -30\nKPX ydieresis aacute -30\nKPX ydieresis abreve -30\nKPX ydieresis acircumflex -30\nKPX ydieresis adieresis -30\nKPX ydieresis agrave -30\nKPX ydieresis amacron -30\nKPX ydieresis aogonek -30\nKPX ydieresis aring -30\nKPX ydieresis atilde -30\nKPX ydieresis comma -80\nKPX ydieresis e -10\nKPX ydieresis eacute -10\nKPX ydieresis ecaron -10\nKPX ydieresis ecircumflex -10\nKPX ydieresis edieresis -10\nKPX ydieresis edotaccent -10\nKPX ydieresis egrave -10\nKPX ydieresis emacron -10\nKPX ydieresis eogonek -10\nKPX ydieresis o -25\nKPX ydieresis oacute -25\nKPX ydieresis ocircumflex -25\nKPX ydieresis odieresis -25\nKPX ydieresis ograve -25\nKPX ydieresis ohungarumlaut -25\nKPX ydieresis omacron -25\nKPX ydieresis oslash -25\nKPX ydieresis otilde -25\nKPX ydieresis period -80\nKPX z e 10\nKPX z eacute 10\nKPX z ecaron 10\nKPX z ecircumflex 10\nKPX z edieresis 10\nKPX z edotaccent 10\nKPX z egrave 10\nKPX z emacron 10\nKPX z eogonek 10\nKPX zacute e 10\nKPX zacute eacute 10\nKPX zacute ecaron 10\nKPX zacute ecircumflex 10\nKPX zacute edieresis 10\nKPX zacute edotaccent 10\nKPX zacute egrave 10\nKPX zacute emacron 10\nKPX zacute eogonek 10\nKPX zcaron e 10\nKPX zcaron eacute 10\nKPX zcaron ecaron 10\nKPX zcaron ecircumflex 10\nKPX zcaron edieresis 10\nKPX zcaron edotaccent 10\nKPX zcaron egrave 10\nKPX zcaron emacron 10\nKPX zcaron eogonek 10\nKPX zdotaccent e 10\nKPX zdotaccent eacute 10\nKPX zdotaccent ecaron 10\nKPX zdotaccent ecircumflex 10\nKPX zdotaccent edieresis 10\nKPX zdotaccent edotaccent 10\nKPX zdotaccent egrave 10\nKPX zdotaccent emacron 10\nKPX zdotaccent eogonek 10\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/Helvetica-BoldOblique.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:45:12 1997\nComment UniqueID 43053\nComment VMusage 14482 68586\nFontName Helvetica-BoldOblique\nFullName Helvetica Bold Oblique\nFamilyName Helvetica\nWeight Bold\nItalicAngle -12\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -174 -228 1114 962\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 532\nAscender 718\nDescender -207\nStdHW 118\nStdVW 140\nStartCharMetrics 315\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 94 0 397 718 ;\nC 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ;\nC 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ;\nC 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ;\nC 37 ; WX 889 ; N percent ; B 136 -19 901 710 ;\nC 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ;\nC 39 ; WX 278 ; N quoteright ; B 167 445 362 718 ;\nC 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ;\nC 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ;\nC 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ;\nC 43 ; WX 584 ; N plus ; B 82 0 610 506 ;\nC 44 ; WX 278 ; N comma ; B 28 -168 245 146 ;\nC 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ;\nC 46 ; WX 278 ; N period ; B 64 0 245 146 ;\nC 47 ; WX 278 ; N slash ; B -37 -19 468 737 ;\nC 48 ; WX 556 ; N zero ; B 86 -19 617 710 ;\nC 49 ; WX 556 ; N one ; B 173 0 529 710 ;\nC 50 ; WX 556 ; N two ; B 26 0 619 710 ;\nC 51 ; WX 556 ; N three ; B 65 -19 608 710 ;\nC 52 ; WX 556 ; N four ; B 60 0 598 710 ;\nC 53 ; WX 556 ; N five ; B 64 -19 636 698 ;\nC 54 ; WX 556 ; N six ; B 85 -19 619 710 ;\nC 55 ; WX 556 ; N seven ; B 125 0 676 698 ;\nC 56 ; WX 556 ; N eight ; B 69 -19 616 710 ;\nC 57 ; WX 556 ; N nine ; B 78 -19 615 710 ;\nC 58 ; WX 333 ; N colon ; B 92 0 351 512 ;\nC 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ;\nC 60 ; WX 584 ; N less ; B 82 -8 655 514 ;\nC 61 ; WX 584 ; N equal ; B 58 87 633 419 ;\nC 62 ; WX 584 ; N greater ; B 36 -8 609 514 ;\nC 63 ; WX 611 ; N question ; B 165 0 671 727 ;\nC 64 ; WX 975 ; N at ; B 186 -19 954 737 ;\nC 65 ; WX 722 ; N A ; B 20 0 702 718 ;\nC 66 ; WX 722 ; N B ; B 76 0 764 718 ;\nC 67 ; WX 722 ; N C ; B 107 -19 789 737 ;\nC 68 ; WX 722 ; N D ; B 76 0 777 718 ;\nC 69 ; WX 667 ; N E ; B 76 0 757 718 ;\nC 70 ; WX 611 ; N F ; B 76 0 740 718 ;\nC 71 ; WX 778 ; N G ; B 108 -19 817 737 ;\nC 72 ; WX 722 ; N H ; B 71 0 804 718 ;\nC 73 ; WX 278 ; N I ; B 64 0 367 718 ;\nC 74 ; WX 556 ; N J ; B 60 -18 637 718 ;\nC 75 ; WX 722 ; N K ; B 87 0 858 718 ;\nC 76 ; WX 611 ; N L ; B 76 0 611 718 ;\nC 77 ; WX 833 ; N M ; B 69 0 918 718 ;\nC 78 ; WX 722 ; N N ; B 69 0 807 718 ;\nC 79 ; WX 778 ; N O ; B 107 -19 823 737 ;\nC 80 ; WX 667 ; N P ; B 76 0 738 718 ;\nC 81 ; WX 778 ; N Q ; B 107 -52 823 737 ;\nC 82 ; WX 722 ; N R ; B 76 0 778 718 ;\nC 83 ; WX 667 ; N S ; B 81 -19 718 737 ;\nC 84 ; WX 611 ; N T ; B 140 0 751 718 ;\nC 85 ; WX 722 ; N U ; B 116 -19 804 718 ;\nC 86 ; WX 667 ; N V ; B 172 0 801 718 ;\nC 87 ; WX 944 ; N W ; B 169 0 1082 718 ;\nC 88 ; WX 667 ; N X ; B 14 0 791 718 ;\nC 89 ; WX 667 ; N Y ; B 168 0 806 718 ;\nC 90 ; WX 611 ; N Z ; B 25 0 737 718 ;\nC 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ;\nC 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ;\nC 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ;\nC 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ;\nC 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ;\nC 96 ; WX 278 ; N quoteleft ; B 165 454 361 727 ;\nC 97 ; WX 556 ; N a ; B 55 -14 583 546 ;\nC 98 ; WX 611 ; N b ; B 61 -14 645 718 ;\nC 99 ; WX 556 ; N c ; B 79 -14 599 546 ;\nC 100 ; WX 611 ; N d ; B 82 -14 704 718 ;\nC 101 ; WX 556 ; N e ; B 70 -14 593 546 ;\nC 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ;\nC 103 ; WX 611 ; N g ; B 38 -217 666 546 ;\nC 104 ; WX 611 ; N h ; B 65 0 629 718 ;\nC 105 ; WX 278 ; N i ; B 69 0 363 725 ;\nC 106 ; WX 278 ; N j ; B -42 -214 363 725 ;\nC 107 ; WX 556 ; N k ; B 69 0 670 718 ;\nC 108 ; WX 278 ; N l ; B 69 0 362 718 ;\nC 109 ; WX 889 ; N m ; B 64 0 909 546 ;\nC 110 ; WX 611 ; N n ; B 65 0 629 546 ;\nC 111 ; WX 611 ; N o ; B 82 -14 643 546 ;\nC 112 ; WX 611 ; N p ; B 18 -207 645 546 ;\nC 113 ; WX 611 ; N q ; B 80 -207 665 546 ;\nC 114 ; WX 389 ; N r ; B 64 0 489 546 ;\nC 115 ; WX 556 ; N s ; B 63 -14 584 546 ;\nC 116 ; WX 333 ; N t ; B 100 -6 422 676 ;\nC 117 ; WX 611 ; N u ; B 98 -14 658 532 ;\nC 118 ; WX 556 ; N v ; B 126 0 656 532 ;\nC 119 ; WX 778 ; N w ; B 123 0 882 532 ;\nC 120 ; WX 556 ; N x ; B 15 0 648 532 ;\nC 121 ; WX 556 ; N y ; B 42 -214 652 532 ;\nC 122 ; WX 500 ; N z ; B 20 0 583 532 ;\nC 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ;\nC 124 ; WX 280 ; N bar ; B 36 -225 361 775 ;\nC 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ;\nC 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ;\nC 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ;\nC 162 ; WX 556 ; N cent ; B 79 -118 599 628 ;\nC 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ;\nC 164 ; WX 167 ; N fraction ; B -174 -19 487 710 ;\nC 165 ; WX 556 ; N yen ; B 60 0 713 698 ;\nC 166 ; WX 556 ; N florin ; B -50 -210 669 737 ;\nC 167 ; WX 556 ; N section ; B 61 -184 598 727 ;\nC 168 ; WX 556 ; N currency ; B 27 76 680 636 ;\nC 169 ; WX 238 ; N quotesingle ; B 165 447 321 718 ;\nC 170 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ;\nC 171 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ;\nC 173 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ;\nC 174 ; WX 611 ; N fi ; B 87 0 696 727 ;\nC 175 ; WX 611 ; N fl ; B 87 0 695 727 ;\nC 177 ; WX 556 ; N endash ; B 48 227 627 333 ;\nC 178 ; WX 556 ; N dagger ; B 118 -171 626 718 ;\nC 179 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ;\nC 180 ; WX 278 ; N periodcentered ; B 110 172 276 334 ;\nC 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ;\nC 183 ; WX 350 ; N bullet ; B 83 194 420 524 ;\nC 184 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ;\nC 185 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ;\nC 186 ; WX 500 ; N quotedblright ; B 162 445 589 718 ;\nC 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ;\nC 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ;\nC 189 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ;\nC 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ;\nC 193 ; WX 333 ; N grave ; B 136 604 353 750 ;\nC 194 ; WX 333 ; N acute ; B 236 604 515 750 ;\nC 195 ; WX 333 ; N circumflex ; B 118 604 471 750 ;\nC 196 ; WX 333 ; N tilde ; B 113 610 507 737 ;\nC 197 ; WX 333 ; N macron ; B 122 604 483 678 ;\nC 198 ; WX 333 ; N breve ; B 156 604 494 750 ;\nC 199 ; WX 333 ; N dotaccent ; B 235 614 385 729 ;\nC 200 ; WX 333 ; N dieresis ; B 137 614 482 729 ;\nC 202 ; WX 333 ; N ring ; B 200 568 420 776 ;\nC 203 ; WX 333 ; N cedilla ; B -37 -228 220 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ;\nC 206 ; WX 333 ; N ogonek ; B 41 -228 264 0 ;\nC 207 ; WX 333 ; N caron ; B 149 604 502 750 ;\nC 208 ; WX 1000 ; N emdash ; B 48 227 1071 333 ;\nC 225 ; WX 1000 ; N AE ; B 5 0 1100 718 ;\nC 227 ; WX 370 ; N ordfeminine ; B 125 401 465 737 ;\nC 232 ; WX 611 ; N Lslash ; B 34 0 611 718 ;\nC 233 ; WX 778 ; N Oslash ; B 35 -27 894 745 ;\nC 234 ; WX 1000 ; N OE ; B 99 -19 1114 737 ;\nC 235 ; WX 365 ; N ordmasculine ; B 123 401 485 737 ;\nC 241 ; WX 889 ; N ae ; B 56 -14 923 546 ;\nC 245 ; WX 278 ; N dotlessi ; B 69 0 322 532 ;\nC 248 ; WX 278 ; N lslash ; B 40 0 407 718 ;\nC 249 ; WX 611 ; N oslash ; B 22 -29 701 560 ;\nC 250 ; WX 944 ; N oe ; B 82 -14 977 546 ;\nC 251 ; WX 611 ; N germandbls ; B 69 -14 657 731 ;\nC -1 ; WX 278 ; N Idieresis ; B 64 0 494 915 ;\nC -1 ; WX 556 ; N eacute ; B 70 -14 627 750 ;\nC -1 ; WX 556 ; N abreve ; B 55 -14 606 750 ;\nC -1 ; WX 611 ; N uhungarumlaut ; B 98 -14 784 750 ;\nC -1 ; WX 556 ; N ecaron ; B 70 -14 614 750 ;\nC -1 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ;\nC -1 ; WX 584 ; N divide ; B 82 -42 610 548 ;\nC -1 ; WX 667 ; N Yacute ; B 168 0 806 936 ;\nC -1 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ;\nC -1 ; WX 556 ; N aacute ; B 55 -14 627 750 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ;\nC -1 ; WX 556 ; N yacute ; B 42 -214 652 750 ;\nC -1 ; WX 556 ; N scommaaccent ; B 63 -228 584 546 ;\nC -1 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ;\nC -1 ; WX 722 ; N Uring ; B 116 -19 804 962 ;\nC -1 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ;\nC -1 ; WX 556 ; N aogonek ; B 55 -224 583 546 ;\nC -1 ; WX 722 ; N Uacute ; B 116 -19 804 936 ;\nC -1 ; WX 611 ; N uogonek ; B 98 -228 658 532 ;\nC -1 ; WX 667 ; N Edieresis ; B 76 0 757 915 ;\nC -1 ; WX 722 ; N Dcroat ; B 62 0 777 718 ;\nC -1 ; WX 250 ; N commaaccent ; B 16 -228 188 -50 ;\nC -1 ; WX 737 ; N copyright ; B 56 -19 835 737 ;\nC -1 ; WX 667 ; N Emacron ; B 76 0 757 864 ;\nC -1 ; WX 556 ; N ccaron ; B 79 -14 614 750 ;\nC -1 ; WX 556 ; N aring ; B 55 -14 583 776 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 807 718 ;\nC -1 ; WX 278 ; N lacute ; B 69 0 528 936 ;\nC -1 ; WX 556 ; N agrave ; B 55 -14 583 750 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 140 -228 751 718 ;\nC -1 ; WX 722 ; N Cacute ; B 107 -19 789 936 ;\nC -1 ; WX 556 ; N atilde ; B 55 -14 619 737 ;\nC -1 ; WX 667 ; N Edotaccent ; B 76 0 757 915 ;\nC -1 ; WX 556 ; N scaron ; B 63 -14 614 750 ;\nC -1 ; WX 556 ; N scedilla ; B 63 -228 584 546 ;\nC -1 ; WX 278 ; N iacute ; B 69 0 488 750 ;\nC -1 ; WX 494 ; N lozenge ; B 90 0 564 745 ;\nC -1 ; WX 722 ; N Rcaron ; B 76 0 778 936 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 108 -228 817 737 ;\nC -1 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ;\nC -1 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ;\nC -1 ; WX 722 ; N Amacron ; B 20 0 718 864 ;\nC -1 ; WX 389 ; N rcaron ; B 64 0 530 750 ;\nC -1 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 25 0 737 915 ;\nC -1 ; WX 667 ; N Thorn ; B 76 0 716 718 ;\nC -1 ; WX 778 ; N Omacron ; B 107 -19 823 864 ;\nC -1 ; WX 722 ; N Racute ; B 76 0 778 936 ;\nC -1 ; WX 667 ; N Sacute ; B 81 -19 722 936 ;\nC -1 ; WX 743 ; N dcaron ; B 82 -14 903 718 ;\nC -1 ; WX 722 ; N Umacron ; B 116 -19 804 864 ;\nC -1 ; WX 611 ; N uring ; B 98 -14 658 776 ;\nC -1 ; WX 333 ; N threesuperior ; B 91 271 441 710 ;\nC -1 ; WX 778 ; N Ograve ; B 107 -19 823 936 ;\nC -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ;\nC -1 ; WX 722 ; N Abreve ; B 20 0 729 936 ;\nC -1 ; WX 584 ; N multiply ; B 57 1 635 505 ;\nC -1 ; WX 611 ; N uacute ; B 98 -14 658 750 ;\nC -1 ; WX 611 ; N Tcaron ; B 140 0 751 936 ;\nC -1 ; WX 494 ; N partialdiff ; B 43 -21 585 750 ;\nC -1 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ;\nC -1 ; WX 722 ; N Nacute ; B 69 0 807 936 ;\nC -1 ; WX 278 ; N icircumflex ; B 69 0 444 750 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ;\nC -1 ; WX 556 ; N adieresis ; B 55 -14 594 729 ;\nC -1 ; WX 556 ; N edieresis ; B 70 -14 594 729 ;\nC -1 ; WX 556 ; N cacute ; B 79 -14 627 750 ;\nC -1 ; WX 611 ; N nacute ; B 65 0 654 750 ;\nC -1 ; WX 611 ; N umacron ; B 98 -14 658 678 ;\nC -1 ; WX 722 ; N Ncaron ; B 69 0 807 936 ;\nC -1 ; WX 278 ; N Iacute ; B 64 0 528 936 ;\nC -1 ; WX 584 ; N plusminus ; B 40 0 625 506 ;\nC -1 ; WX 280 ; N brokenbar ; B 52 -150 345 700 ;\nC -1 ; WX 737 ; N registered ; B 55 -19 834 737 ;\nC -1 ; WX 778 ; N Gbreve ; B 108 -19 817 936 ;\nC -1 ; WX 278 ; N Idotaccent ; B 64 0 397 915 ;\nC -1 ; WX 600 ; N summation ; B 14 -10 670 706 ;\nC -1 ; WX 667 ; N Egrave ; B 76 0 757 936 ;\nC -1 ; WX 389 ; N racute ; B 64 0 543 750 ;\nC -1 ; WX 611 ; N omacron ; B 82 -14 643 678 ;\nC -1 ; WX 611 ; N Zacute ; B 25 0 737 936 ;\nC -1 ; WX 611 ; N Zcaron ; B 25 0 737 936 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 629 704 ;\nC -1 ; WX 722 ; N Eth ; B 62 0 777 718 ;\nC -1 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 30 -228 362 718 ;\nC -1 ; WX 389 ; N tcaron ; B 100 -6 608 878 ;\nC -1 ; WX 556 ; N eogonek ; B 70 -228 593 546 ;\nC -1 ; WX 722 ; N Uogonek ; B 116 -228 804 718 ;\nC -1 ; WX 722 ; N Aacute ; B 20 0 750 936 ;\nC -1 ; WX 722 ; N Adieresis ; B 20 0 716 915 ;\nC -1 ; WX 556 ; N egrave ; B 70 -14 593 750 ;\nC -1 ; WX 500 ; N zacute ; B 20 0 599 750 ;\nC -1 ; WX 278 ; N iogonek ; B -14 -224 363 725 ;\nC -1 ; WX 778 ; N Oacute ; B 107 -19 823 936 ;\nC -1 ; WX 611 ; N oacute ; B 82 -14 654 750 ;\nC -1 ; WX 556 ; N amacron ; B 55 -14 595 678 ;\nC -1 ; WX 556 ; N sacute ; B 63 -14 627 750 ;\nC -1 ; WX 278 ; N idieresis ; B 69 0 455 729 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ;\nC -1 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 611 ; N thorn ; B 18 -208 645 718 ;\nC -1 ; WX 333 ; N twosuperior ; B 69 283 449 710 ;\nC -1 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ;\nC -1 ; WX 611 ; N mu ; B 22 -207 658 532 ;\nC -1 ; WX 278 ; N igrave ; B 69 0 326 750 ;\nC -1 ; WX 611 ; N ohungarumlaut ; B 82 -14 784 750 ;\nC -1 ; WX 667 ; N Eogonek ; B 76 -224 757 718 ;\nC -1 ; WX 611 ; N dcroat ; B 82 -14 789 718 ;\nC -1 ; WX 834 ; N threequarters ; B 99 -19 839 710 ;\nC -1 ; WX 667 ; N Scedilla ; B 81 -228 718 737 ;\nC -1 ; WX 400 ; N lcaron ; B 69 0 561 718 ;\nC -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 858 718 ;\nC -1 ; WX 611 ; N Lacute ; B 76 0 611 936 ;\nC -1 ; WX 1000 ; N trademark ; B 179 306 1109 718 ;\nC -1 ; WX 556 ; N edotaccent ; B 70 -14 593 729 ;\nC -1 ; WX 278 ; N Igrave ; B 64 0 367 936 ;\nC -1 ; WX 278 ; N Imacron ; B 64 0 496 864 ;\nC -1 ; WX 611 ; N Lcaron ; B 76 0 643 718 ;\nC -1 ; WX 834 ; N onehalf ; B 132 -19 858 710 ;\nC -1 ; WX 549 ; N lessequal ; B 29 0 676 704 ;\nC -1 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ;\nC -1 ; WX 611 ; N ntilde ; B 65 0 646 737 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 116 -19 880 936 ;\nC -1 ; WX 667 ; N Eacute ; B 76 0 757 936 ;\nC -1 ; WX 556 ; N emacron ; B 70 -14 595 678 ;\nC -1 ; WX 611 ; N gbreve ; B 38 -217 666 750 ;\nC -1 ; WX 834 ; N onequarter ; B 132 -19 806 710 ;\nC -1 ; WX 667 ; N Scaron ; B 81 -19 718 936 ;\nC -1 ; WX 667 ; N Scommaaccent ; B 81 -228 718 737 ;\nC -1 ; WX 778 ; N Ohungarumlaut ; B 107 -19 908 936 ;\nC -1 ; WX 400 ; N degree ; B 175 426 467 712 ;\nC -1 ; WX 611 ; N ograve ; B 82 -14 643 750 ;\nC -1 ; WX 722 ; N Ccaron ; B 107 -19 789 936 ;\nC -1 ; WX 611 ; N ugrave ; B 98 -14 658 750 ;\nC -1 ; WX 549 ; N radical ; B 112 -46 689 850 ;\nC -1 ; WX 722 ; N Dcaron ; B 76 0 777 936 ;\nC -1 ; WX 389 ; N rcommaaccent ; B 26 -228 489 546 ;\nC -1 ; WX 722 ; N Ntilde ; B 69 0 807 923 ;\nC -1 ; WX 611 ; N otilde ; B 82 -14 646 737 ;\nC -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 778 718 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 611 718 ;\nC -1 ; WX 722 ; N Atilde ; B 20 0 741 923 ;\nC -1 ; WX 722 ; N Aogonek ; B 20 -224 702 718 ;\nC -1 ; WX 722 ; N Aring ; B 20 0 702 962 ;\nC -1 ; WX 778 ; N Otilde ; B 107 -19 823 923 ;\nC -1 ; WX 500 ; N zdotaccent ; B 20 0 583 729 ;\nC -1 ; WX 667 ; N Ecaron ; B 76 0 757 936 ;\nC -1 ; WX 278 ; N Iogonek ; B -41 -228 367 718 ;\nC -1 ; WX 556 ; N kcommaaccent ; B 69 -228 670 718 ;\nC -1 ; WX 584 ; N minus ; B 82 197 610 309 ;\nC -1 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ;\nC -1 ; WX 611 ; N ncaron ; B 65 0 641 750 ;\nC -1 ; WX 333 ; N tcommaaccent ; B 58 -228 422 676 ;\nC -1 ; WX 584 ; N logicalnot ; B 105 108 633 419 ;\nC -1 ; WX 611 ; N odieresis ; B 82 -14 643 729 ;\nC -1 ; WX 611 ; N udieresis ; B 98 -14 658 729 ;\nC -1 ; WX 549 ; N notequal ; B 32 -49 630 570 ;\nC -1 ; WX 611 ; N gcommaaccent ; B 38 -217 666 850 ;\nC -1 ; WX 611 ; N eth ; B 82 -14 670 737 ;\nC -1 ; WX 500 ; N zcaron ; B 20 0 586 750 ;\nC -1 ; WX 611 ; N ncommaaccent ; B 65 -228 629 546 ;\nC -1 ; WX 333 ; N onesuperior ; B 148 283 388 710 ;\nC -1 ; WX 278 ; N imacron ; B 69 0 429 678 ;\nC -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2481\nKPX A C -40\nKPX A Cacute -40\nKPX A Ccaron -40\nKPX A Ccedilla -40\nKPX A G -50\nKPX A Gbreve -50\nKPX A Gcommaaccent -50\nKPX A O -40\nKPX A Oacute -40\nKPX A Ocircumflex -40\nKPX A Odieresis -40\nKPX A Ograve -40\nKPX A Ohungarumlaut -40\nKPX A Omacron -40\nKPX A Oslash -40\nKPX A Otilde -40\nKPX A Q -40\nKPX A T -90\nKPX A Tcaron -90\nKPX A Tcommaaccent -90\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -80\nKPX A W -60\nKPX A Y -110\nKPX A Yacute -110\nKPX A Ydieresis -110\nKPX A u -30\nKPX A uacute -30\nKPX A ucircumflex -30\nKPX A udieresis -30\nKPX A ugrave -30\nKPX A uhungarumlaut -30\nKPX A umacron -30\nKPX A uogonek -30\nKPX A uring -30\nKPX A v -40\nKPX A w -30\nKPX A y -30\nKPX A yacute -30\nKPX A ydieresis -30\nKPX Aacute C -40\nKPX Aacute Cacute -40\nKPX Aacute Ccaron -40\nKPX Aacute Ccedilla -40\nKPX Aacute G -50\nKPX Aacute Gbreve -50\nKPX Aacute Gcommaaccent -50\nKPX Aacute O -40\nKPX Aacute Oacute -40\nKPX Aacute Ocircumflex -40\nKPX Aacute Odieresis -40\nKPX Aacute Ograve -40\nKPX Aacute Ohungarumlaut -40\nKPX Aacute Omacron -40\nKPX Aacute Oslash -40\nKPX Aacute Otilde -40\nKPX Aacute Q -40\nKPX Aacute T -90\nKPX Aacute Tcaron -90\nKPX Aacute Tcommaaccent -90\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -80\nKPX Aacute W -60\nKPX Aacute Y -110\nKPX Aacute Yacute -110\nKPX Aacute Ydieresis -110\nKPX Aacute u -30\nKPX Aacute uacute -30\nKPX Aacute ucircumflex -30\nKPX Aacute udieresis -30\nKPX Aacute ugrave -30\nKPX Aacute uhungarumlaut -30\nKPX Aacute umacron -30\nKPX Aacute uogonek -30\nKPX Aacute uring -30\nKPX Aacute v -40\nKPX Aacute w -30\nKPX Aacute y -30\nKPX Aacute yacute -30\nKPX Aacute ydieresis -30\nKPX Abreve C -40\nKPX Abreve Cacute -40\nKPX Abreve Ccaron -40\nKPX Abreve Ccedilla -40\nKPX Abreve G -50\nKPX Abreve Gbreve -50\nKPX Abreve Gcommaaccent -50\nKPX Abreve O -40\nKPX Abreve Oacute -40\nKPX Abreve Ocircumflex -40\nKPX Abreve Odieresis -40\nKPX Abreve Ograve -40\nKPX Abreve Ohungarumlaut -40\nKPX Abreve Omacron -40\nKPX Abreve Oslash -40\nKPX Abreve Otilde -40\nKPX Abreve Q -40\nKPX Abreve T -90\nKPX Abreve Tcaron -90\nKPX Abreve Tcommaaccent -90\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -80\nKPX Abreve W -60\nKPX Abreve Y -110\nKPX Abreve Yacute -110\nKPX Abreve Ydieresis -110\nKPX Abreve u -30\nKPX Abreve uacute -30\nKPX Abreve ucircumflex -30\nKPX Abreve udieresis -30\nKPX Abreve ugrave -30\nKPX Abreve uhungarumlaut -30\nKPX Abreve umacron -30\nKPX Abreve uogonek -30\nKPX Abreve uring -30\nKPX Abreve v -40\nKPX Abreve w -30\nKPX Abreve y -30\nKPX Abreve yacute -30\nKPX Abreve ydieresis -30\nKPX Acircumflex C -40\nKPX Acircumflex Cacute -40\nKPX Acircumflex Ccaron -40\nKPX Acircumflex Ccedilla -40\nKPX Acircumflex G -50\nKPX Acircumflex Gbreve -50\nKPX Acircumflex Gcommaaccent -50\nKPX Acircumflex O -40\nKPX Acircumflex Oacute -40\nKPX Acircumflex Ocircumflex -40\nKPX Acircumflex Odieresis -40\nKPX Acircumflex Ograve -40\nKPX Acircumflex Ohungarumlaut -40\nKPX Acircumflex Omacron -40\nKPX Acircumflex Oslash -40\nKPX Acircumflex Otilde -40\nKPX Acircumflex Q -40\nKPX Acircumflex T -90\nKPX Acircumflex Tcaron -90\nKPX Acircumflex Tcommaaccent -90\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -80\nKPX Acircumflex W -60\nKPX Acircumflex Y -110\nKPX Acircumflex Yacute -110\nKPX Acircumflex Ydieresis -110\nKPX Acircumflex u -30\nKPX Acircumflex uacute -30\nKPX Acircumflex ucircumflex -30\nKPX Acircumflex udieresis -30\nKPX Acircumflex ugrave -30\nKPX Acircumflex uhungarumlaut -30\nKPX Acircumflex umacron -30\nKPX Acircumflex uogonek -30\nKPX Acircumflex uring -30\nKPX Acircumflex v -40\nKPX Acircumflex w -30\nKPX Acircumflex y -30\nKPX Acircumflex yacute -30\nKPX Acircumflex ydieresis -30\nKPX Adieresis C -40\nKPX Adieresis Cacute -40\nKPX Adieresis Ccaron -40\nKPX Adieresis Ccedilla -40\nKPX Adieresis G -50\nKPX Adieresis Gbreve -50\nKPX Adieresis Gcommaaccent -50\nKPX Adieresis O -40\nKPX Adieresis Oacute -40\nKPX Adieresis Ocircumflex -40\nKPX Adieresis Odieresis -40\nKPX Adieresis Ograve -40\nKPX Adieresis Ohungarumlaut -40\nKPX Adieresis Omacron -40\nKPX Adieresis Oslash -40\nKPX Adieresis Otilde -40\nKPX Adieresis Q -40\nKPX Adieresis T -90\nKPX Adieresis Tcaron -90\nKPX Adieresis Tcommaaccent -90\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -80\nKPX Adieresis W -60\nKPX Adieresis Y -110\nKPX Adieresis Yacute -110\nKPX Adieresis Ydieresis -110\nKPX Adieresis u -30\nKPX Adieresis uacute -30\nKPX Adieresis ucircumflex -30\nKPX Adieresis udieresis -30\nKPX Adieresis ugrave -30\nKPX Adieresis uhungarumlaut -30\nKPX Adieresis umacron -30\nKPX Adieresis uogonek -30\nKPX Adieresis uring -30\nKPX Adieresis v -40\nKPX Adieresis w -30\nKPX Adieresis y -30\nKPX Adieresis yacute -30\nKPX Adieresis ydieresis -30\nKPX Agrave C -40\nKPX Agrave Cacute -40\nKPX Agrave Ccaron -40\nKPX Agrave Ccedilla -40\nKPX Agrave G -50\nKPX Agrave Gbreve -50\nKPX Agrave Gcommaaccent -50\nKPX Agrave O -40\nKPX Agrave Oacute -40\nKPX Agrave Ocircumflex -40\nKPX Agrave Odieresis -40\nKPX Agrave Ograve -40\nKPX Agrave Ohungarumlaut -40\nKPX Agrave Omacron -40\nKPX Agrave Oslash -40\nKPX Agrave Otilde -40\nKPX Agrave Q -40\nKPX Agrave T -90\nKPX Agrave Tcaron -90\nKPX Agrave Tcommaaccent -90\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -80\nKPX Agrave W -60\nKPX Agrave Y -110\nKPX Agrave Yacute -110\nKPX Agrave Ydieresis -110\nKPX Agrave u -30\nKPX Agrave uacute -30\nKPX Agrave ucircumflex -30\nKPX Agrave udieresis -30\nKPX Agrave ugrave -30\nKPX Agrave uhungarumlaut -30\nKPX Agrave umacron -30\nKPX Agrave uogonek -30\nKPX Agrave uring -30\nKPX Agrave v -40\nKPX Agrave w -30\nKPX Agrave y -30\nKPX Agrave yacute -30\nKPX Agrave ydieresis -30\nKPX Amacron C -40\nKPX Amacron Cacute -40\nKPX Amacron Ccaron -40\nKPX Amacron Ccedilla -40\nKPX Amacron G -50\nKPX Amacron Gbreve -50\nKPX Amacron Gcommaaccent -50\nKPX Amacron O -40\nKPX Amacron Oacute -40\nKPX Amacron Ocircumflex -40\nKPX Amacron Odieresis -40\nKPX Amacron Ograve -40\nKPX Amacron Ohungarumlaut -40\nKPX Amacron Omacron -40\nKPX Amacron Oslash -40\nKPX Amacron Otilde -40\nKPX Amacron Q -40\nKPX Amacron T -90\nKPX Amacron Tcaron -90\nKPX Amacron Tcommaaccent -90\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -80\nKPX Amacron W -60\nKPX Amacron Y -110\nKPX Amacron Yacute -110\nKPX Amacron Ydieresis -110\nKPX Amacron u -30\nKPX Amacron uacute -30\nKPX Amacron ucircumflex -30\nKPX Amacron udieresis -30\nKPX Amacron ugrave -30\nKPX Amacron uhungarumlaut -30\nKPX Amacron umacron -30\nKPX Amacron uogonek -30\nKPX Amacron uring -30\nKPX Amacron v -40\nKPX Amacron w -30\nKPX Amacron y -30\nKPX Amacron yacute -30\nKPX Amacron ydieresis -30\nKPX Aogonek C -40\nKPX Aogonek Cacute -40\nKPX Aogonek Ccaron -40\nKPX Aogonek Ccedilla -40\nKPX Aogonek G -50\nKPX Aogonek Gbreve -50\nKPX Aogonek Gcommaaccent -50\nKPX Aogonek O -40\nKPX Aogonek Oacute -40\nKPX Aogonek Ocircumflex -40\nKPX Aogonek Odieresis -40\nKPX Aogonek Ograve -40\nKPX Aogonek Ohungarumlaut -40\nKPX Aogonek Omacron -40\nKPX Aogonek Oslash -40\nKPX Aogonek Otilde -40\nKPX Aogonek Q -40\nKPX Aogonek T -90\nKPX Aogonek Tcaron -90\nKPX Aogonek Tcommaaccent -90\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -80\nKPX Aogonek W -60\nKPX Aogonek Y -110\nKPX Aogonek Yacute -110\nKPX Aogonek Ydieresis -110\nKPX Aogonek u -30\nKPX Aogonek uacute -30\nKPX Aogonek ucircumflex -30\nKPX Aogonek udieresis -30\nKPX Aogonek ugrave -30\nKPX Aogonek uhungarumlaut -30\nKPX Aogonek umacron -30\nKPX Aogonek uogonek -30\nKPX Aogonek uring -30\nKPX Aogonek v -40\nKPX Aogonek w -30\nKPX Aogonek y -30\nKPX Aogonek yacute -30\nKPX Aogonek ydieresis -30\nKPX Aring C -40\nKPX Aring Cacute -40\nKPX Aring Ccaron -40\nKPX Aring Ccedilla -40\nKPX Aring G -50\nKPX Aring Gbreve -50\nKPX Aring Gcommaaccent -50\nKPX Aring O -40\nKPX Aring Oacute -40\nKPX Aring Ocircumflex -40\nKPX Aring Odieresis -40\nKPX Aring Ograve -40\nKPX Aring Ohungarumlaut -40\nKPX Aring Omacron -40\nKPX Aring Oslash -40\nKPX Aring Otilde -40\nKPX Aring Q -40\nKPX Aring T -90\nKPX Aring Tcaron -90\nKPX Aring Tcommaaccent -90\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -80\nKPX Aring W -60\nKPX Aring Y -110\nKPX Aring Yacute -110\nKPX Aring Ydieresis -110\nKPX Aring u -30\nKPX Aring uacute -30\nKPX Aring ucircumflex -30\nKPX Aring udieresis -30\nKPX Aring ugrave -30\nKPX Aring uhungarumlaut -30\nKPX Aring umacron -30\nKPX Aring uogonek -30\nKPX Aring uring -30\nKPX Aring v -40\nKPX Aring w -30\nKPX Aring y -30\nKPX Aring yacute -30\nKPX Aring ydieresis -30\nKPX Atilde C -40\nKPX Atilde Cacute -40\nKPX Atilde Ccaron -40\nKPX Atilde Ccedilla -40\nKPX Atilde G -50\nKPX Atilde Gbreve -50\nKPX Atilde Gcommaaccent -50\nKPX Atilde O -40\nKPX Atilde Oacute -40\nKPX Atilde Ocircumflex -40\nKPX Atilde Odieresis -40\nKPX Atilde Ograve -40\nKPX Atilde Ohungarumlaut -40\nKPX Atilde Omacron -40\nKPX Atilde Oslash -40\nKPX Atilde Otilde -40\nKPX Atilde Q -40\nKPX Atilde T -90\nKPX Atilde Tcaron -90\nKPX Atilde Tcommaaccent -90\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -80\nKPX Atilde W -60\nKPX Atilde Y -110\nKPX Atilde Yacute -110\nKPX Atilde Ydieresis -110\nKPX Atilde u -30\nKPX Atilde uacute -30\nKPX Atilde ucircumflex -30\nKPX Atilde udieresis -30\nKPX Atilde ugrave -30\nKPX Atilde uhungarumlaut -30\nKPX Atilde umacron -30\nKPX Atilde uogonek -30\nKPX Atilde uring -30\nKPX Atilde v -40\nKPX Atilde w -30\nKPX Atilde y -30\nKPX Atilde yacute -30\nKPX Atilde ydieresis -30\nKPX B A -30\nKPX B Aacute -30\nKPX B Abreve -30\nKPX B Acircumflex -30\nKPX B Adieresis -30\nKPX B Agrave -30\nKPX B Amacron -30\nKPX B Aogonek -30\nKPX B Aring -30\nKPX B Atilde -30\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX D A -40\nKPX D Aacute -40\nKPX D Abreve -40\nKPX D Acircumflex -40\nKPX D Adieresis -40\nKPX D Agrave -40\nKPX D Amacron -40\nKPX D Aogonek -40\nKPX D Aring -40\nKPX D Atilde -40\nKPX D V -40\nKPX D W -40\nKPX D Y -70\nKPX D Yacute -70\nKPX D Ydieresis -70\nKPX D comma -30\nKPX D period -30\nKPX Dcaron A -40\nKPX Dcaron Aacute -40\nKPX Dcaron Abreve -40\nKPX Dcaron Acircumflex -40\nKPX Dcaron Adieresis -40\nKPX Dcaron Agrave -40\nKPX Dcaron Amacron -40\nKPX Dcaron Aogonek -40\nKPX Dcaron Aring -40\nKPX Dcaron Atilde -40\nKPX Dcaron V -40\nKPX Dcaron W -40\nKPX Dcaron Y -70\nKPX Dcaron Yacute -70\nKPX Dcaron Ydieresis -70\nKPX Dcaron comma -30\nKPX Dcaron period -30\nKPX Dcroat A -40\nKPX Dcroat Aacute -40\nKPX Dcroat Abreve -40\nKPX Dcroat Acircumflex -40\nKPX Dcroat Adieresis -40\nKPX Dcroat Agrave -40\nKPX Dcroat Amacron -40\nKPX Dcroat Aogonek -40\nKPX Dcroat Aring -40\nKPX Dcroat Atilde -40\nKPX Dcroat V -40\nKPX Dcroat W -40\nKPX Dcroat Y -70\nKPX Dcroat Yacute -70\nKPX Dcroat Ydieresis -70\nKPX Dcroat comma -30\nKPX Dcroat period -30\nKPX F A -80\nKPX F Aacute -80\nKPX F Abreve -80\nKPX F Acircumflex -80\nKPX F Adieresis -80\nKPX F Agrave -80\nKPX F Amacron -80\nKPX F Aogonek -80\nKPX F Aring -80\nKPX F Atilde -80\nKPX F a -20\nKPX F aacute -20\nKPX F abreve -20\nKPX F acircumflex -20\nKPX F adieresis -20\nKPX F agrave -20\nKPX F amacron -20\nKPX F aogonek -20\nKPX F aring -20\nKPX F atilde -20\nKPX F comma -100\nKPX F period -100\nKPX J A -20\nKPX J Aacute -20\nKPX J Abreve -20\nKPX J Acircumflex -20\nKPX J Adieresis -20\nKPX J Agrave -20\nKPX J Amacron -20\nKPX J Aogonek -20\nKPX J Aring -20\nKPX J Atilde -20\nKPX J comma -20\nKPX J period -20\nKPX J u -20\nKPX J uacute -20\nKPX J ucircumflex -20\nKPX J udieresis -20\nKPX J ugrave -20\nKPX J uhungarumlaut -20\nKPX J umacron -20\nKPX J uogonek -20\nKPX J uring -20\nKPX K O -30\nKPX K Oacute -30\nKPX K Ocircumflex -30\nKPX K Odieresis -30\nKPX K Ograve -30\nKPX K Ohungarumlaut -30\nKPX K Omacron -30\nKPX K Oslash -30\nKPX K Otilde -30\nKPX K e -15\nKPX K eacute -15\nKPX K ecaron -15\nKPX K ecircumflex -15\nKPX K edieresis -15\nKPX K edotaccent -15\nKPX K egrave -15\nKPX K emacron -15\nKPX K eogonek -15\nKPX K o -35\nKPX K oacute -35\nKPX K ocircumflex -35\nKPX K odieresis -35\nKPX K ograve -35\nKPX K ohungarumlaut -35\nKPX K omacron -35\nKPX K oslash -35\nKPX K otilde -35\nKPX K u -30\nKPX K uacute -30\nKPX K ucircumflex -30\nKPX K udieresis -30\nKPX K ugrave -30\nKPX K uhungarumlaut -30\nKPX K umacron -30\nKPX K uogonek -30\nKPX K uring -30\nKPX K y -40\nKPX K yacute -40\nKPX K ydieresis -40\nKPX Kcommaaccent O -30\nKPX Kcommaaccent Oacute -30\nKPX Kcommaaccent Ocircumflex -30\nKPX Kcommaaccent Odieresis -30\nKPX Kcommaaccent Ograve -30\nKPX Kcommaaccent Ohungarumlaut -30\nKPX Kcommaaccent Omacron -30\nKPX Kcommaaccent Oslash -30\nKPX Kcommaaccent Otilde -30\nKPX Kcommaaccent e -15\nKPX Kcommaaccent eacute -15\nKPX Kcommaaccent ecaron -15\nKPX Kcommaaccent ecircumflex -15\nKPX Kcommaaccent edieresis -15\nKPX Kcommaaccent edotaccent -15\nKPX Kcommaaccent egrave -15\nKPX Kcommaaccent emacron -15\nKPX Kcommaaccent eogonek -15\nKPX Kcommaaccent o -35\nKPX Kcommaaccent oacute -35\nKPX Kcommaaccent ocircumflex -35\nKPX Kcommaaccent odieresis -35\nKPX Kcommaaccent ograve -35\nKPX Kcommaaccent ohungarumlaut -35\nKPX Kcommaaccent omacron -35\nKPX Kcommaaccent oslash -35\nKPX Kcommaaccent otilde -35\nKPX Kcommaaccent u -30\nKPX Kcommaaccent uacute -30\nKPX Kcommaaccent ucircumflex -30\nKPX Kcommaaccent udieresis -30\nKPX Kcommaaccent ugrave -30\nKPX Kcommaaccent uhungarumlaut -30\nKPX Kcommaaccent umacron -30\nKPX Kcommaaccent uogonek -30\nKPX Kcommaaccent uring -30\nKPX Kcommaaccent y -40\nKPX Kcommaaccent yacute -40\nKPX Kcommaaccent ydieresis -40\nKPX L T -90\nKPX L Tcaron -90\nKPX L Tcommaaccent -90\nKPX L V -110\nKPX L W -80\nKPX L Y -120\nKPX L Yacute -120\nKPX L Ydieresis -120\nKPX L quotedblright -140\nKPX L quoteright -140\nKPX L y -30\nKPX L yacute -30\nKPX L ydieresis -30\nKPX Lacute T -90\nKPX Lacute Tcaron -90\nKPX Lacute Tcommaaccent -90\nKPX Lacute V -110\nKPX Lacute W -80\nKPX Lacute Y -120\nKPX Lacute Yacute -120\nKPX Lacute Ydieresis -120\nKPX Lacute quotedblright -140\nKPX Lacute quoteright -140\nKPX Lacute y -30\nKPX Lacute yacute -30\nKPX Lacute ydieresis -30\nKPX Lcommaaccent T -90\nKPX Lcommaaccent Tcaron -90\nKPX Lcommaaccent Tcommaaccent -90\nKPX Lcommaaccent V -110\nKPX Lcommaaccent W -80\nKPX Lcommaaccent Y -120\nKPX Lcommaaccent Yacute -120\nKPX Lcommaaccent Ydieresis -120\nKPX Lcommaaccent quotedblright -140\nKPX Lcommaaccent quoteright -140\nKPX Lcommaaccent y -30\nKPX Lcommaaccent yacute -30\nKPX Lcommaaccent ydieresis -30\nKPX Lslash T -90\nKPX Lslash Tcaron -90\nKPX Lslash Tcommaaccent -90\nKPX Lslash V -110\nKPX Lslash W -80\nKPX Lslash Y -120\nKPX Lslash Yacute -120\nKPX Lslash Ydieresis -120\nKPX Lslash quotedblright -140\nKPX Lslash quoteright -140\nKPX Lslash y -30\nKPX Lslash yacute -30\nKPX Lslash ydieresis -30\nKPX O A -50\nKPX O Aacute -50\nKPX O Abreve -50\nKPX O Acircumflex -50\nKPX O Adieresis -50\nKPX O Agrave -50\nKPX O Amacron -50\nKPX O Aogonek -50\nKPX O Aring -50\nKPX O Atilde -50\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -50\nKPX O X -50\nKPX O Y -70\nKPX O Yacute -70\nKPX O Ydieresis -70\nKPX O comma -40\nKPX O period -40\nKPX Oacute A -50\nKPX Oacute Aacute -50\nKPX Oacute Abreve -50\nKPX Oacute Acircumflex -50\nKPX Oacute Adieresis -50\nKPX Oacute Agrave -50\nKPX Oacute Amacron -50\nKPX Oacute Aogonek -50\nKPX Oacute Aring -50\nKPX Oacute Atilde -50\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -50\nKPX Oacute X -50\nKPX Oacute Y -70\nKPX Oacute Yacute -70\nKPX Oacute Ydieresis -70\nKPX Oacute comma -40\nKPX Oacute period -40\nKPX Ocircumflex A -50\nKPX Ocircumflex Aacute -50\nKPX Ocircumflex Abreve -50\nKPX Ocircumflex Acircumflex -50\nKPX Ocircumflex Adieresis -50\nKPX Ocircumflex Agrave -50\nKPX Ocircumflex Amacron -50\nKPX Ocircumflex Aogonek -50\nKPX Ocircumflex Aring -50\nKPX Ocircumflex Atilde -50\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -50\nKPX Ocircumflex X -50\nKPX Ocircumflex Y -70\nKPX Ocircumflex Yacute -70\nKPX Ocircumflex Ydieresis -70\nKPX Ocircumflex comma -40\nKPX Ocircumflex period -40\nKPX Odieresis A -50\nKPX Odieresis Aacute -50\nKPX Odieresis Abreve -50\nKPX Odieresis Acircumflex -50\nKPX Odieresis Adieresis -50\nKPX Odieresis Agrave -50\nKPX Odieresis Amacron -50\nKPX Odieresis Aogonek -50\nKPX Odieresis Aring -50\nKPX Odieresis Atilde -50\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -50\nKPX Odieresis X -50\nKPX Odieresis Y -70\nKPX Odieresis Yacute -70\nKPX Odieresis Ydieresis -70\nKPX Odieresis comma -40\nKPX Odieresis period -40\nKPX Ograve A -50\nKPX Ograve Aacute -50\nKPX Ograve Abreve -50\nKPX Ograve Acircumflex -50\nKPX Ograve Adieresis -50\nKPX Ograve Agrave -50\nKPX Ograve Amacron -50\nKPX Ograve Aogonek -50\nKPX Ograve Aring -50\nKPX Ograve Atilde -50\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -50\nKPX Ograve X -50\nKPX Ograve Y -70\nKPX Ograve Yacute -70\nKPX Ograve Ydieresis -70\nKPX Ograve comma -40\nKPX Ograve period -40\nKPX Ohungarumlaut A -50\nKPX Ohungarumlaut Aacute -50\nKPX Ohungarumlaut Abreve -50\nKPX Ohungarumlaut Acircumflex -50\nKPX Ohungarumlaut Adieresis -50\nKPX Ohungarumlaut Agrave -50\nKPX Ohungarumlaut Amacron -50\nKPX Ohungarumlaut Aogonek -50\nKPX Ohungarumlaut Aring -50\nKPX Ohungarumlaut Atilde -50\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -50\nKPX Ohungarumlaut X -50\nKPX Ohungarumlaut Y -70\nKPX Ohungarumlaut Yacute -70\nKPX Ohungarumlaut Ydieresis -70\nKPX Ohungarumlaut comma -40\nKPX Ohungarumlaut period -40\nKPX Omacron A -50\nKPX Omacron Aacute -50\nKPX Omacron Abreve -50\nKPX Omacron Acircumflex -50\nKPX Omacron Adieresis -50\nKPX Omacron Agrave -50\nKPX Omacron Amacron -50\nKPX Omacron Aogonek -50\nKPX Omacron Aring -50\nKPX Omacron Atilde -50\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -50\nKPX Omacron X -50\nKPX Omacron Y -70\nKPX Omacron Yacute -70\nKPX Omacron Ydieresis -70\nKPX Omacron comma -40\nKPX Omacron period -40\nKPX Oslash A -50\nKPX Oslash Aacute -50\nKPX Oslash Abreve -50\nKPX Oslash Acircumflex -50\nKPX Oslash Adieresis -50\nKPX Oslash Agrave -50\nKPX Oslash Amacron -50\nKPX Oslash Aogonek -50\nKPX Oslash Aring -50\nKPX Oslash Atilde -50\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -50\nKPX Oslash X -50\nKPX Oslash Y -70\nKPX Oslash Yacute -70\nKPX Oslash Ydieresis -70\nKPX Oslash comma -40\nKPX Oslash period -40\nKPX Otilde A -50\nKPX Otilde Aacute -50\nKPX Otilde Abreve -50\nKPX Otilde Acircumflex -50\nKPX Otilde Adieresis -50\nKPX Otilde Agrave -50\nKPX Otilde Amacron -50\nKPX Otilde Aogonek -50\nKPX Otilde Aring -50\nKPX Otilde Atilde -50\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -50\nKPX Otilde X -50\nKPX Otilde Y -70\nKPX Otilde Yacute -70\nKPX Otilde Ydieresis -70\nKPX Otilde comma -40\nKPX Otilde period -40\nKPX P A -100\nKPX P Aacute -100\nKPX P Abreve -100\nKPX P Acircumflex -100\nKPX P Adieresis -100\nKPX P Agrave -100\nKPX P Amacron -100\nKPX P Aogonek -100\nKPX P Aring -100\nKPX P Atilde -100\nKPX P a -30\nKPX P aacute -30\nKPX P abreve -30\nKPX P acircumflex -30\nKPX P adieresis -30\nKPX P agrave -30\nKPX P amacron -30\nKPX P aogonek -30\nKPX P aring -30\nKPX P atilde -30\nKPX P comma -120\nKPX P e -30\nKPX P eacute -30\nKPX P ecaron -30\nKPX P ecircumflex -30\nKPX P edieresis -30\nKPX P edotaccent -30\nKPX P egrave -30\nKPX P emacron -30\nKPX P eogonek -30\nKPX P o -40\nKPX P oacute -40\nKPX P ocircumflex -40\nKPX P odieresis -40\nKPX P ograve -40\nKPX P ohungarumlaut -40\nKPX P omacron -40\nKPX P oslash -40\nKPX P otilde -40\nKPX P period -120\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX Q comma 20\nKPX Q period 20\nKPX R O -20\nKPX R Oacute -20\nKPX R Ocircumflex -20\nKPX R Odieresis -20\nKPX R Ograve -20\nKPX R Ohungarumlaut -20\nKPX R Omacron -20\nKPX R Oslash -20\nKPX R Otilde -20\nKPX R T -20\nKPX R Tcaron -20\nKPX R Tcommaaccent -20\nKPX R U -20\nKPX R Uacute -20\nKPX R Ucircumflex -20\nKPX R Udieresis -20\nKPX R Ugrave -20\nKPX R Uhungarumlaut -20\nKPX R Umacron -20\nKPX R Uogonek -20\nKPX R Uring -20\nKPX R V -50\nKPX R W -40\nKPX R Y -50\nKPX R Yacute -50\nKPX R Ydieresis -50\nKPX Racute O -20\nKPX Racute Oacute -20\nKPX Racute Ocircumflex -20\nKPX Racute Odieresis -20\nKPX Racute Ograve -20\nKPX Racute Ohungarumlaut -20\nKPX Racute Omacron -20\nKPX Racute Oslash -20\nKPX Racute Otilde -20\nKPX Racute T -20\nKPX Racute Tcaron -20\nKPX Racute Tcommaaccent -20\nKPX Racute U -20\nKPX Racute Uacute -20\nKPX Racute Ucircumflex -20\nKPX Racute Udieresis -20\nKPX Racute Ugrave -20\nKPX Racute Uhungarumlaut -20\nKPX Racute Umacron -20\nKPX Racute Uogonek -20\nKPX Racute Uring -20\nKPX Racute V -50\nKPX Racute W -40\nKPX Racute Y -50\nKPX Racute Yacute -50\nKPX Racute Ydieresis -50\nKPX Rcaron O -20\nKPX Rcaron Oacute -20\nKPX Rcaron Ocircumflex -20\nKPX Rcaron Odieresis -20\nKPX Rcaron Ograve -20\nKPX Rcaron Ohungarumlaut -20\nKPX Rcaron Omacron -20\nKPX Rcaron Oslash -20\nKPX Rcaron Otilde -20\nKPX Rcaron T -20\nKPX Rcaron Tcaron -20\nKPX Rcaron Tcommaaccent -20\nKPX Rcaron U -20\nKPX Rcaron Uacute -20\nKPX Rcaron Ucircumflex -20\nKPX Rcaron Udieresis -20\nKPX Rcaron Ugrave -20\nKPX Rcaron Uhungarumlaut -20\nKPX Rcaron Umacron -20\nKPX Rcaron Uogonek -20\nKPX Rcaron Uring -20\nKPX Rcaron V -50\nKPX Rcaron W -40\nKPX Rcaron Y -50\nKPX Rcaron Yacute -50\nKPX Rcaron Ydieresis -50\nKPX Rcommaaccent O -20\nKPX Rcommaaccent Oacute -20\nKPX Rcommaaccent Ocircumflex -20\nKPX Rcommaaccent Odieresis -20\nKPX Rcommaaccent Ograve -20\nKPX Rcommaaccent Ohungarumlaut -20\nKPX Rcommaaccent Omacron -20\nKPX Rcommaaccent Oslash -20\nKPX Rcommaaccent Otilde -20\nKPX Rcommaaccent T -20\nKPX Rcommaaccent Tcaron -20\nKPX Rcommaaccent Tcommaaccent -20\nKPX Rcommaaccent U -20\nKPX Rcommaaccent Uacute -20\nKPX Rcommaaccent Ucircumflex -20\nKPX Rcommaaccent Udieresis -20\nKPX Rcommaaccent Ugrave -20\nKPX Rcommaaccent Uhungarumlaut -20\nKPX Rcommaaccent Umacron -20\nKPX Rcommaaccent Uogonek -20\nKPX Rcommaaccent Uring -20\nKPX Rcommaaccent V -50\nKPX Rcommaaccent W -40\nKPX Rcommaaccent Y -50\nKPX Rcommaaccent Yacute -50\nKPX Rcommaaccent Ydieresis -50\nKPX T A -90\nKPX T Aacute -90\nKPX T Abreve -90\nKPX T Acircumflex -90\nKPX T Adieresis -90\nKPX T Agrave -90\nKPX T Amacron -90\nKPX T Aogonek -90\nKPX T Aring -90\nKPX T Atilde -90\nKPX T O -40\nKPX T Oacute -40\nKPX T Ocircumflex -40\nKPX T Odieresis -40\nKPX T Ograve -40\nKPX T Ohungarumlaut -40\nKPX T Omacron -40\nKPX T Oslash -40\nKPX T Otilde -40\nKPX T a -80\nKPX T aacute -80\nKPX T abreve -80\nKPX T acircumflex -80\nKPX T adieresis -80\nKPX T agrave -80\nKPX T amacron -80\nKPX T aogonek -80\nKPX T aring -80\nKPX T atilde -80\nKPX T colon -40\nKPX T comma -80\nKPX T e -60\nKPX T eacute -60\nKPX T ecaron -60\nKPX T ecircumflex -60\nKPX T edieresis -60\nKPX T edotaccent -60\nKPX T egrave -60\nKPX T emacron -60\nKPX T eogonek -60\nKPX T hyphen -120\nKPX T o -80\nKPX T oacute -80\nKPX T ocircumflex -80\nKPX T odieresis -80\nKPX T ograve -80\nKPX T ohungarumlaut -80\nKPX T omacron -80\nKPX T oslash -80\nKPX T otilde -80\nKPX T period -80\nKPX T r -80\nKPX T racute -80\nKPX T rcommaaccent -80\nKPX T semicolon -40\nKPX T u -90\nKPX T uacute -90\nKPX T ucircumflex -90\nKPX T udieresis -90\nKPX T ugrave -90\nKPX T uhungarumlaut -90\nKPX T umacron -90\nKPX T uogonek -90\nKPX T uring -90\nKPX T w -60\nKPX T y -60\nKPX T yacute -60\nKPX T ydieresis -60\nKPX Tcaron A -90\nKPX Tcaron Aacute -90\nKPX Tcaron Abreve -90\nKPX Tcaron Acircumflex -90\nKPX Tcaron Adieresis -90\nKPX Tcaron Agrave -90\nKPX Tcaron Amacron -90\nKPX Tcaron Aogonek -90\nKPX Tcaron Aring -90\nKPX Tcaron Atilde -90\nKPX Tcaron O -40\nKPX Tcaron Oacute -40\nKPX Tcaron Ocircumflex -40\nKPX Tcaron Odieresis -40\nKPX Tcaron Ograve -40\nKPX Tcaron Ohungarumlaut -40\nKPX Tcaron Omacron -40\nKPX Tcaron Oslash -40\nKPX Tcaron Otilde -40\nKPX Tcaron a -80\nKPX Tcaron aacute -80\nKPX Tcaron abreve -80\nKPX Tcaron acircumflex -80\nKPX Tcaron adieresis -80\nKPX Tcaron agrave -80\nKPX Tcaron amacron -80\nKPX Tcaron aogonek -80\nKPX Tcaron aring -80\nKPX Tcaron atilde -80\nKPX Tcaron colon -40\nKPX Tcaron comma -80\nKPX Tcaron e -60\nKPX Tcaron eacute -60\nKPX Tcaron ecaron -60\nKPX Tcaron ecircumflex -60\nKPX Tcaron edieresis -60\nKPX Tcaron edotaccent -60\nKPX Tcaron egrave -60\nKPX Tcaron emacron -60\nKPX Tcaron eogonek -60\nKPX Tcaron hyphen -120\nKPX Tcaron o -80\nKPX Tcaron oacute -80\nKPX Tcaron ocircumflex -80\nKPX Tcaron odieresis -80\nKPX Tcaron ograve -80\nKPX Tcaron ohungarumlaut -80\nKPX Tcaron omacron -80\nKPX Tcaron oslash -80\nKPX Tcaron otilde -80\nKPX Tcaron period -80\nKPX Tcaron r -80\nKPX Tcaron racute -80\nKPX Tcaron rcommaaccent -80\nKPX Tcaron semicolon -40\nKPX Tcaron u -90\nKPX Tcaron uacute -90\nKPX Tcaron ucircumflex -90\nKPX Tcaron udieresis -90\nKPX Tcaron ugrave -90\nKPX Tcaron uhungarumlaut -90\nKPX Tcaron umacron -90\nKPX Tcaron uogonek -90\nKPX Tcaron uring -90\nKPX Tcaron w -60\nKPX Tcaron y -60\nKPX Tcaron yacute -60\nKPX Tcaron ydieresis -60\nKPX Tcommaaccent A -90\nKPX Tcommaaccent Aacute -90\nKPX Tcommaaccent Abreve -90\nKPX Tcommaaccent Acircumflex -90\nKPX Tcommaaccent Adieresis -90\nKPX Tcommaaccent Agrave -90\nKPX Tcommaaccent Amacron -90\nKPX Tcommaaccent Aogonek -90\nKPX Tcommaaccent Aring -90\nKPX Tcommaaccent Atilde -90\nKPX Tcommaaccent O -40\nKPX Tcommaaccent Oacute -40\nKPX Tcommaaccent Ocircumflex -40\nKPX Tcommaaccent Odieresis -40\nKPX Tcommaaccent Ograve -40\nKPX Tcommaaccent Ohungarumlaut -40\nKPX Tcommaaccent Omacron -40\nKPX Tcommaaccent Oslash -40\nKPX Tcommaaccent Otilde -40\nKPX Tcommaaccent a -80\nKPX Tcommaaccent aacute -80\nKPX Tcommaaccent abreve -80\nKPX Tcommaaccent acircumflex -80\nKPX Tcommaaccent adieresis -80\nKPX Tcommaaccent agrave -80\nKPX Tcommaaccent amacron -80\nKPX Tcommaaccent aogonek -80\nKPX Tcommaaccent aring -80\nKPX Tcommaaccent atilde -80\nKPX Tcommaaccent colon -40\nKPX Tcommaaccent comma -80\nKPX Tcommaaccent e -60\nKPX Tcommaaccent eacute -60\nKPX Tcommaaccent ecaron -60\nKPX Tcommaaccent ecircumflex -60\nKPX Tcommaaccent edieresis -60\nKPX Tcommaaccent edotaccent -60\nKPX Tcommaaccent egrave -60\nKPX Tcommaaccent emacron -60\nKPX Tcommaaccent eogonek -60\nKPX Tcommaaccent hyphen -120\nKPX Tcommaaccent o -80\nKPX Tcommaaccent oacute -80\nKPX Tcommaaccent ocircumflex -80\nKPX Tcommaaccent odieresis -80\nKPX Tcommaaccent ograve -80\nKPX Tcommaaccent ohungarumlaut -80\nKPX Tcommaaccent omacron -80\nKPX Tcommaaccent oslash -80\nKPX Tcommaaccent otilde -80\nKPX Tcommaaccent period -80\nKPX Tcommaaccent r -80\nKPX Tcommaaccent racute -80\nKPX Tcommaaccent rcommaaccent -80\nKPX Tcommaaccent semicolon -40\nKPX Tcommaaccent u -90\nKPX Tcommaaccent uacute -90\nKPX Tcommaaccent ucircumflex -90\nKPX Tcommaaccent udieresis -90\nKPX Tcommaaccent ugrave -90\nKPX Tcommaaccent uhungarumlaut -90\nKPX Tcommaaccent umacron -90\nKPX Tcommaaccent uogonek -90\nKPX Tcommaaccent uring -90\nKPX Tcommaaccent w -60\nKPX Tcommaaccent y -60\nKPX Tcommaaccent yacute -60\nKPX Tcommaaccent ydieresis -60\nKPX U A -50\nKPX U Aacute -50\nKPX U Abreve -50\nKPX U Acircumflex -50\nKPX U Adieresis -50\nKPX U Agrave -50\nKPX U Amacron -50\nKPX U Aogonek -50\nKPX U Aring -50\nKPX U Atilde -50\nKPX U comma -30\nKPX U period -30\nKPX Uacute A -50\nKPX Uacute Aacute -50\nKPX Uacute Abreve -50\nKPX Uacute Acircumflex -50\nKPX Uacute Adieresis -50\nKPX Uacute Agrave -50\nKPX Uacute Amacron -50\nKPX Uacute Aogonek -50\nKPX Uacute Aring -50\nKPX Uacute Atilde -50\nKPX Uacute comma -30\nKPX Uacute period -30\nKPX Ucircumflex A -50\nKPX Ucircumflex Aacute -50\nKPX Ucircumflex Abreve -50\nKPX Ucircumflex Acircumflex -50\nKPX Ucircumflex Adieresis -50\nKPX Ucircumflex Agrave -50\nKPX Ucircumflex Amacron -50\nKPX Ucircumflex Aogonek -50\nKPX Ucircumflex Aring -50\nKPX Ucircumflex Atilde -50\nKPX Ucircumflex comma -30\nKPX Ucircumflex period -30\nKPX Udieresis A -50\nKPX Udieresis Aacute -50\nKPX Udieresis Abreve -50\nKPX Udieresis Acircumflex -50\nKPX Udieresis Adieresis -50\nKPX Udieresis Agrave -50\nKPX Udieresis Amacron -50\nKPX Udieresis Aogonek -50\nKPX Udieresis Aring -50\nKPX Udieresis Atilde -50\nKPX Udieresis comma -30\nKPX Udieresis period -30\nKPX Ugrave A -50\nKPX Ugrave Aacute -50\nKPX Ugrave Abreve -50\nKPX Ugrave Acircumflex -50\nKPX Ugrave Adieresis -50\nKPX Ugrave Agrave -50\nKPX Ugrave Amacron -50\nKPX Ugrave Aogonek -50\nKPX Ugrave Aring -50\nKPX Ugrave Atilde -50\nKPX Ugrave comma -30\nKPX Ugrave period -30\nKPX Uhungarumlaut A -50\nKPX Uhungarumlaut Aacute -50\nKPX Uhungarumlaut Abreve -50\nKPX Uhungarumlaut Acircumflex -50\nKPX Uhungarumlaut Adieresis -50\nKPX Uhungarumlaut Agrave -50\nKPX Uhungarumlaut Amacron -50\nKPX Uhungarumlaut Aogonek -50\nKPX Uhungarumlaut Aring -50\nKPX Uhungarumlaut Atilde -50\nKPX Uhungarumlaut comma -30\nKPX Uhungarumlaut period -30\nKPX Umacron A -50\nKPX Umacron Aacute -50\nKPX Umacron Abreve -50\nKPX Umacron Acircumflex -50\nKPX Umacron Adieresis -50\nKPX Umacron Agrave -50\nKPX Umacron Amacron -50\nKPX Umacron Aogonek -50\nKPX Umacron Aring -50\nKPX Umacron Atilde -50\nKPX Umacron comma -30\nKPX Umacron period -30\nKPX Uogonek A -50\nKPX Uogonek Aacute -50\nKPX Uogonek Abreve -50\nKPX Uogonek Acircumflex -50\nKPX Uogonek Adieresis -50\nKPX Uogonek Agrave -50\nKPX Uogonek Amacron -50\nKPX Uogonek Aogonek -50\nKPX Uogonek Aring -50\nKPX Uogonek Atilde -50\nKPX Uogonek comma -30\nKPX Uogonek period -30\nKPX Uring A -50\nKPX Uring Aacute -50\nKPX Uring Abreve -50\nKPX Uring Acircumflex -50\nKPX Uring Adieresis -50\nKPX Uring Agrave -50\nKPX Uring Amacron -50\nKPX Uring Aogonek -50\nKPX Uring Aring -50\nKPX Uring Atilde -50\nKPX Uring comma -30\nKPX Uring period -30\nKPX V A -80\nKPX V Aacute -80\nKPX V Abreve -80\nKPX V Acircumflex -80\nKPX V Adieresis -80\nKPX V Agrave -80\nKPX V Amacron -80\nKPX V Aogonek -80\nKPX V Aring -80\nKPX V Atilde -80\nKPX V G -50\nKPX V Gbreve -50\nKPX V Gcommaaccent -50\nKPX V O -50\nKPX V Oacute -50\nKPX V Ocircumflex -50\nKPX V Odieresis -50\nKPX V Ograve -50\nKPX V Ohungarumlaut -50\nKPX V Omacron -50\nKPX V Oslash -50\nKPX V Otilde -50\nKPX V a -60\nKPX V aacute -60\nKPX V abreve -60\nKPX V acircumflex -60\nKPX V adieresis -60\nKPX V agrave -60\nKPX V amacron -60\nKPX V aogonek -60\nKPX V aring -60\nKPX V atilde -60\nKPX V colon -40\nKPX V comma -120\nKPX V e -50\nKPX V eacute -50\nKPX V ecaron -50\nKPX V ecircumflex -50\nKPX V edieresis -50\nKPX V edotaccent -50\nKPX V egrave -50\nKPX V emacron -50\nKPX V eogonek -50\nKPX V hyphen -80\nKPX V o -90\nKPX V oacute -90\nKPX V ocircumflex -90\nKPX V odieresis -90\nKPX V ograve -90\nKPX V ohungarumlaut -90\nKPX V omacron -90\nKPX V oslash -90\nKPX V otilde -90\nKPX V period -120\nKPX V semicolon -40\nKPX V u -60\nKPX V uacute -60\nKPX V ucircumflex -60\nKPX V udieresis -60\nKPX V ugrave -60\nKPX V uhungarumlaut -60\nKPX V umacron -60\nKPX V uogonek -60\nKPX V uring -60\nKPX W A -60\nKPX W Aacute -60\nKPX W Abreve -60\nKPX W Acircumflex -60\nKPX W Adieresis -60\nKPX W Agrave -60\nKPX W Amacron -60\nKPX W Aogonek -60\nKPX W Aring -60\nKPX W Atilde -60\nKPX W O -20\nKPX W Oacute -20\nKPX W Ocircumflex -20\nKPX W Odieresis -20\nKPX W Ograve -20\nKPX W Ohungarumlaut -20\nKPX W Omacron -20\nKPX W Oslash -20\nKPX W Otilde -20\nKPX W a -40\nKPX W aacute -40\nKPX W abreve -40\nKPX W acircumflex -40\nKPX W adieresis -40\nKPX W agrave -40\nKPX W amacron -40\nKPX W aogonek -40\nKPX W aring -40\nKPX W atilde -40\nKPX W colon -10\nKPX W comma -80\nKPX W e -35\nKPX W eacute -35\nKPX W ecaron -35\nKPX W ecircumflex -35\nKPX W edieresis -35\nKPX W edotaccent -35\nKPX W egrave -35\nKPX W emacron -35\nKPX W eogonek -35\nKPX W hyphen -40\nKPX W o -60\nKPX W oacute -60\nKPX W ocircumflex -60\nKPX W odieresis -60\nKPX W ograve -60\nKPX W ohungarumlaut -60\nKPX W omacron -60\nKPX W oslash -60\nKPX W otilde -60\nKPX W period -80\nKPX W semicolon -10\nKPX W u -45\nKPX W uacute -45\nKPX W ucircumflex -45\nKPX W udieresis -45\nKPX W ugrave -45\nKPX W uhungarumlaut -45\nKPX W umacron -45\nKPX W uogonek -45\nKPX W uring -45\nKPX W y -20\nKPX W yacute -20\nKPX W ydieresis -20\nKPX Y A -110\nKPX Y Aacute -110\nKPX Y Abreve -110\nKPX Y Acircumflex -110\nKPX Y Adieresis -110\nKPX Y Agrave -110\nKPX Y Amacron -110\nKPX Y Aogonek -110\nKPX Y Aring -110\nKPX Y Atilde -110\nKPX Y O -70\nKPX Y Oacute -70\nKPX Y Ocircumflex -70\nKPX Y Odieresis -70\nKPX Y Ograve -70\nKPX Y Ohungarumlaut -70\nKPX Y Omacron -70\nKPX Y Oslash -70\nKPX Y Otilde -70\nKPX Y a -90\nKPX Y aacute -90\nKPX Y abreve -90\nKPX Y acircumflex -90\nKPX Y adieresis -90\nKPX Y agrave -90\nKPX Y amacron -90\nKPX Y aogonek -90\nKPX Y aring -90\nKPX Y atilde -90\nKPX Y colon -50\nKPX Y comma -100\nKPX Y e -80\nKPX Y eacute -80\nKPX Y ecaron -80\nKPX Y ecircumflex -80\nKPX Y edieresis -80\nKPX Y edotaccent -80\nKPX Y egrave -80\nKPX Y emacron -80\nKPX Y eogonek -80\nKPX Y o -100\nKPX Y oacute -100\nKPX Y ocircumflex -100\nKPX Y odieresis -100\nKPX Y ograve -100\nKPX Y ohungarumlaut -100\nKPX Y omacron -100\nKPX Y oslash -100\nKPX Y otilde -100\nKPX Y period -100\nKPX Y semicolon -50\nKPX Y u -100\nKPX Y uacute -100\nKPX Y ucircumflex -100\nKPX Y udieresis -100\nKPX Y ugrave -100\nKPX Y uhungarumlaut -100\nKPX Y umacron -100\nKPX Y uogonek -100\nKPX Y uring -100\nKPX Yacute A -110\nKPX Yacute Aacute -110\nKPX Yacute Abreve -110\nKPX Yacute Acircumflex -110\nKPX Yacute Adieresis -110\nKPX Yacute Agrave -110\nKPX Yacute Amacron -110\nKPX Yacute Aogonek -110\nKPX Yacute Aring -110\nKPX Yacute Atilde -110\nKPX Yacute O -70\nKPX Yacute Oacute -70\nKPX Yacute Ocircumflex -70\nKPX Yacute Odieresis -70\nKPX Yacute Ograve -70\nKPX Yacute Ohungarumlaut -70\nKPX Yacute Omacron -70\nKPX Yacute Oslash -70\nKPX Yacute Otilde -70\nKPX Yacute a -90\nKPX Yacute aacute -90\nKPX Yacute abreve -90\nKPX Yacute acircumflex -90\nKPX Yacute adieresis -90\nKPX Yacute agrave -90\nKPX Yacute amacron -90\nKPX Yacute aogonek -90\nKPX Yacute aring -90\nKPX Yacute atilde -90\nKPX Yacute colon -50\nKPX Yacute comma -100\nKPX Yacute e -80\nKPX Yacute eacute -80\nKPX Yacute ecaron -80\nKPX Yacute ecircumflex -80\nKPX Yacute edieresis -80\nKPX Yacute edotaccent -80\nKPX Yacute egrave -80\nKPX Yacute emacron -80\nKPX Yacute eogonek -80\nKPX Yacute o -100\nKPX Yacute oacute -100\nKPX Yacute ocircumflex -100\nKPX Yacute odieresis -100\nKPX Yacute ograve -100\nKPX Yacute ohungarumlaut -100\nKPX Yacute omacron -100\nKPX Yacute oslash -100\nKPX Yacute otilde -100\nKPX Yacute period -100\nKPX Yacute semicolon -50\nKPX Yacute u -100\nKPX Yacute uacute -100\nKPX Yacute ucircumflex -100\nKPX Yacute udieresis -100\nKPX Yacute ugrave -100\nKPX Yacute uhungarumlaut -100\nKPX Yacute umacron -100\nKPX Yacute uogonek -100\nKPX Yacute uring -100\nKPX Ydieresis A -110\nKPX Ydieresis Aacute -110\nKPX Ydieresis Abreve -110\nKPX Ydieresis Acircumflex -110\nKPX Ydieresis Adieresis -110\nKPX Ydieresis Agrave -110\nKPX Ydieresis Amacron -110\nKPX Ydieresis Aogonek -110\nKPX Ydieresis Aring -110\nKPX Ydieresis Atilde -110\nKPX Ydieresis O -70\nKPX Ydieresis Oacute -70\nKPX Ydieresis Ocircumflex -70\nKPX Ydieresis Odieresis -70\nKPX Ydieresis Ograve -70\nKPX Ydieresis Ohungarumlaut -70\nKPX Ydieresis Omacron -70\nKPX Ydieresis Oslash -70\nKPX Ydieresis Otilde -70\nKPX Ydieresis a -90\nKPX Ydieresis aacute -90\nKPX Ydieresis abreve -90\nKPX Ydieresis acircumflex -90\nKPX Ydieresis adieresis -90\nKPX Ydieresis agrave -90\nKPX Ydieresis amacron -90\nKPX Ydieresis aogonek -90\nKPX Ydieresis aring -90\nKPX Ydieresis atilde -90\nKPX Ydieresis colon -50\nKPX Ydieresis comma -100\nKPX Ydieresis e -80\nKPX Ydieresis eacute -80\nKPX Ydieresis ecaron -80\nKPX Ydieresis ecircumflex -80\nKPX Ydieresis edieresis -80\nKPX Ydieresis edotaccent -80\nKPX Ydieresis egrave -80\nKPX Ydieresis emacron -80\nKPX Ydieresis eogonek -80\nKPX Ydieresis o -100\nKPX Ydieresis oacute -100\nKPX Ydieresis ocircumflex -100\nKPX Ydieresis odieresis -100\nKPX Ydieresis ograve -100\nKPX Ydieresis ohungarumlaut -100\nKPX Ydieresis omacron -100\nKPX Ydieresis oslash -100\nKPX Ydieresis otilde -100\nKPX Ydieresis period -100\nKPX Ydieresis semicolon -50\nKPX Ydieresis u -100\nKPX Ydieresis uacute -100\nKPX Ydieresis ucircumflex -100\nKPX Ydieresis udieresis -100\nKPX Ydieresis ugrave -100\nKPX Ydieresis uhungarumlaut -100\nKPX Ydieresis umacron -100\nKPX Ydieresis uogonek -100\nKPX Ydieresis uring -100\nKPX a g -10\nKPX a gbreve -10\nKPX a gcommaaccent -10\nKPX a v -15\nKPX a w -15\nKPX a y -20\nKPX a yacute -20\nKPX a ydieresis -20\nKPX aacute g -10\nKPX aacute gbreve -10\nKPX aacute gcommaaccent -10\nKPX aacute v -15\nKPX aacute w -15\nKPX aacute y -20\nKPX aacute yacute -20\nKPX aacute ydieresis -20\nKPX abreve g -10\nKPX abreve gbreve -10\nKPX abreve gcommaaccent -10\nKPX abreve v -15\nKPX abreve w -15\nKPX abreve y -20\nKPX abreve yacute -20\nKPX abreve ydieresis -20\nKPX acircumflex g -10\nKPX acircumflex gbreve -10\nKPX acircumflex gcommaaccent -10\nKPX acircumflex v -15\nKPX acircumflex w -15\nKPX acircumflex y -20\nKPX acircumflex yacute -20\nKPX acircumflex ydieresis -20\nKPX adieresis g -10\nKPX adieresis gbreve -10\nKPX adieresis gcommaaccent -10\nKPX adieresis v -15\nKPX adieresis w -15\nKPX adieresis y -20\nKPX adieresis yacute -20\nKPX adieresis ydieresis -20\nKPX agrave g -10\nKPX agrave gbreve -10\nKPX agrave gcommaaccent -10\nKPX agrave v -15\nKPX agrave w -15\nKPX agrave y -20\nKPX agrave yacute -20\nKPX agrave ydieresis -20\nKPX amacron g -10\nKPX amacron gbreve -10\nKPX amacron gcommaaccent -10\nKPX amacron v -15\nKPX amacron w -15\nKPX amacron y -20\nKPX amacron yacute -20\nKPX amacron ydieresis -20\nKPX aogonek g -10\nKPX aogonek gbreve -10\nKPX aogonek gcommaaccent -10\nKPX aogonek v -15\nKPX aogonek w -15\nKPX aogonek y -20\nKPX aogonek yacute -20\nKPX aogonek ydieresis -20\nKPX aring g -10\nKPX aring gbreve -10\nKPX aring gcommaaccent -10\nKPX aring v -15\nKPX aring w -15\nKPX aring y -20\nKPX aring yacute -20\nKPX aring ydieresis -20\nKPX atilde g -10\nKPX atilde gbreve -10\nKPX atilde gcommaaccent -10\nKPX atilde v -15\nKPX atilde w -15\nKPX atilde y -20\nKPX atilde yacute -20\nKPX atilde ydieresis -20\nKPX b l -10\nKPX b lacute -10\nKPX b lcommaaccent -10\nKPX b lslash -10\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX b v -20\nKPX b y -20\nKPX b yacute -20\nKPX b ydieresis -20\nKPX c h -10\nKPX c k -20\nKPX c kcommaaccent -20\nKPX c l -20\nKPX c lacute -20\nKPX c lcommaaccent -20\nKPX c lslash -20\nKPX c y -10\nKPX c yacute -10\nKPX c ydieresis -10\nKPX cacute h -10\nKPX cacute k -20\nKPX cacute kcommaaccent -20\nKPX cacute l -20\nKPX cacute lacute -20\nKPX cacute lcommaaccent -20\nKPX cacute lslash -20\nKPX cacute y -10\nKPX cacute yacute -10\nKPX cacute ydieresis -10\nKPX ccaron h -10\nKPX ccaron k -20\nKPX ccaron kcommaaccent -20\nKPX ccaron l -20\nKPX ccaron lacute -20\nKPX ccaron lcommaaccent -20\nKPX ccaron lslash -20\nKPX ccaron y -10\nKPX ccaron yacute -10\nKPX ccaron ydieresis -10\nKPX ccedilla h -10\nKPX ccedilla k -20\nKPX ccedilla kcommaaccent -20\nKPX ccedilla l -20\nKPX ccedilla lacute -20\nKPX ccedilla lcommaaccent -20\nKPX ccedilla lslash -20\nKPX ccedilla y -10\nKPX ccedilla yacute -10\nKPX ccedilla ydieresis -10\nKPX colon space -40\nKPX comma quotedblright -120\nKPX comma quoteright -120\nKPX comma space -40\nKPX d d -10\nKPX d dcroat -10\nKPX d v -15\nKPX d w -15\nKPX d y -15\nKPX d yacute -15\nKPX d ydieresis -15\nKPX dcroat d -10\nKPX dcroat dcroat -10\nKPX dcroat v -15\nKPX dcroat w -15\nKPX dcroat y -15\nKPX dcroat yacute -15\nKPX dcroat ydieresis -15\nKPX e comma 10\nKPX e period 20\nKPX e v -15\nKPX e w -15\nKPX e x -15\nKPX e y -15\nKPX e yacute -15\nKPX e ydieresis -15\nKPX eacute comma 10\nKPX eacute period 20\nKPX eacute v -15\nKPX eacute w -15\nKPX eacute x -15\nKPX eacute y -15\nKPX eacute yacute -15\nKPX eacute ydieresis -15\nKPX ecaron comma 10\nKPX ecaron period 20\nKPX ecaron v -15\nKPX ecaron w -15\nKPX ecaron x -15\nKPX ecaron y -15\nKPX ecaron yacute -15\nKPX ecaron ydieresis -15\nKPX ecircumflex comma 10\nKPX ecircumflex period 20\nKPX ecircumflex v -15\nKPX ecircumflex w -15\nKPX ecircumflex x -15\nKPX ecircumflex y -15\nKPX ecircumflex yacute -15\nKPX ecircumflex ydieresis -15\nKPX edieresis comma 10\nKPX edieresis period 20\nKPX edieresis v -15\nKPX edieresis w -15\nKPX edieresis x -15\nKPX edieresis y -15\nKPX edieresis yacute -15\nKPX edieresis ydieresis -15\nKPX edotaccent comma 10\nKPX edotaccent period 20\nKPX edotaccent v -15\nKPX edotaccent w -15\nKPX edotaccent x -15\nKPX edotaccent y -15\nKPX edotaccent yacute -15\nKPX edotaccent ydieresis -15\nKPX egrave comma 10\nKPX egrave period 20\nKPX egrave v -15\nKPX egrave w -15\nKPX egrave x -15\nKPX egrave y -15\nKPX egrave yacute -15\nKPX egrave ydieresis -15\nKPX emacron comma 10\nKPX emacron period 20\nKPX emacron v -15\nKPX emacron w -15\nKPX emacron x -15\nKPX emacron y -15\nKPX emacron yacute -15\nKPX emacron ydieresis -15\nKPX eogonek comma 10\nKPX eogonek period 20\nKPX eogonek v -15\nKPX eogonek w -15\nKPX eogonek x -15\nKPX eogonek y -15\nKPX eogonek yacute -15\nKPX eogonek ydieresis -15\nKPX f comma -10\nKPX f e -10\nKPX f eacute -10\nKPX f ecaron -10\nKPX f ecircumflex -10\nKPX f edieresis -10\nKPX f edotaccent -10\nKPX f egrave -10\nKPX f emacron -10\nKPX f eogonek -10\nKPX f o -20\nKPX f oacute -20\nKPX f ocircumflex -20\nKPX f odieresis -20\nKPX f ograve -20\nKPX f ohungarumlaut -20\nKPX f omacron -20\nKPX f oslash -20\nKPX f otilde -20\nKPX f period -10\nKPX f quotedblright 30\nKPX f quoteright 30\nKPX g e 10\nKPX g eacute 10\nKPX g ecaron 10\nKPX g ecircumflex 10\nKPX g edieresis 10\nKPX g edotaccent 10\nKPX g egrave 10\nKPX g emacron 10\nKPX g eogonek 10\nKPX g g -10\nKPX g gbreve -10\nKPX g gcommaaccent -10\nKPX gbreve e 10\nKPX gbreve eacute 10\nKPX gbreve ecaron 10\nKPX gbreve ecircumflex 10\nKPX gbreve edieresis 10\nKPX gbreve edotaccent 10\nKPX gbreve egrave 10\nKPX gbreve emacron 10\nKPX gbreve eogonek 10\nKPX gbreve g -10\nKPX gbreve gbreve -10\nKPX gbreve gcommaaccent -10\nKPX gcommaaccent e 10\nKPX gcommaaccent eacute 10\nKPX gcommaaccent ecaron 10\nKPX gcommaaccent ecircumflex 10\nKPX gcommaaccent edieresis 10\nKPX gcommaaccent edotaccent 10\nKPX gcommaaccent egrave 10\nKPX gcommaaccent emacron 10\nKPX gcommaaccent eogonek 10\nKPX gcommaaccent g -10\nKPX gcommaaccent gbreve -10\nKPX gcommaaccent gcommaaccent -10\nKPX h y -20\nKPX h yacute -20\nKPX h ydieresis -20\nKPX k o -15\nKPX k oacute -15\nKPX k ocircumflex -15\nKPX k odieresis -15\nKPX k ograve -15\nKPX k ohungarumlaut -15\nKPX k omacron -15\nKPX k oslash -15\nKPX k otilde -15\nKPX kcommaaccent o -15\nKPX kcommaaccent oacute -15\nKPX kcommaaccent ocircumflex -15\nKPX kcommaaccent odieresis -15\nKPX kcommaaccent ograve -15\nKPX kcommaaccent ohungarumlaut -15\nKPX kcommaaccent omacron -15\nKPX kcommaaccent oslash -15\nKPX kcommaaccent otilde -15\nKPX l w -15\nKPX l y -15\nKPX l yacute -15\nKPX l ydieresis -15\nKPX lacute w -15\nKPX lacute y -15\nKPX lacute yacute -15\nKPX lacute ydieresis -15\nKPX lcommaaccent w -15\nKPX lcommaaccent y -15\nKPX lcommaaccent yacute -15\nKPX lcommaaccent ydieresis -15\nKPX lslash w -15\nKPX lslash y -15\nKPX lslash yacute -15\nKPX lslash ydieresis -15\nKPX m u -20\nKPX m uacute -20\nKPX m ucircumflex -20\nKPX m udieresis -20\nKPX m ugrave -20\nKPX m uhungarumlaut -20\nKPX m umacron -20\nKPX m uogonek -20\nKPX m uring -20\nKPX m y -30\nKPX m yacute -30\nKPX m ydieresis -30\nKPX n u -10\nKPX n uacute -10\nKPX n ucircumflex -10\nKPX n udieresis -10\nKPX n ugrave -10\nKPX n uhungarumlaut -10\nKPX n umacron -10\nKPX n uogonek -10\nKPX n uring -10\nKPX n v -40\nKPX n y -20\nKPX n yacute -20\nKPX n ydieresis -20\nKPX nacute u -10\nKPX nacute uacute -10\nKPX nacute ucircumflex -10\nKPX nacute udieresis -10\nKPX nacute ugrave -10\nKPX nacute uhungarumlaut -10\nKPX nacute umacron -10\nKPX nacute uogonek -10\nKPX nacute uring -10\nKPX nacute v -40\nKPX nacute y -20\nKPX nacute yacute -20\nKPX nacute ydieresis -20\nKPX ncaron u -10\nKPX ncaron uacute -10\nKPX ncaron ucircumflex -10\nKPX ncaron udieresis -10\nKPX ncaron ugrave -10\nKPX ncaron uhungarumlaut -10\nKPX ncaron umacron -10\nKPX ncaron uogonek -10\nKPX ncaron uring -10\nKPX ncaron v -40\nKPX ncaron y -20\nKPX ncaron yacute -20\nKPX ncaron ydieresis -20\nKPX ncommaaccent u -10\nKPX ncommaaccent uacute -10\nKPX ncommaaccent ucircumflex -10\nKPX ncommaaccent udieresis -10\nKPX ncommaaccent ugrave -10\nKPX ncommaaccent uhungarumlaut -10\nKPX ncommaaccent umacron -10\nKPX ncommaaccent uogonek -10\nKPX ncommaaccent uring -10\nKPX ncommaaccent v -40\nKPX ncommaaccent y -20\nKPX ncommaaccent yacute -20\nKPX ncommaaccent ydieresis -20\nKPX ntilde u -10\nKPX ntilde uacute -10\nKPX ntilde ucircumflex -10\nKPX ntilde udieresis -10\nKPX ntilde ugrave -10\nKPX ntilde uhungarumlaut -10\nKPX ntilde umacron -10\nKPX ntilde uogonek -10\nKPX ntilde uring -10\nKPX ntilde v -40\nKPX ntilde y -20\nKPX ntilde yacute -20\nKPX ntilde ydieresis -20\nKPX o v -20\nKPX o w -15\nKPX o x -30\nKPX o y -20\nKPX o yacute -20\nKPX o ydieresis -20\nKPX oacute v -20\nKPX oacute w -15\nKPX oacute x -30\nKPX oacute y -20\nKPX oacute yacute -20\nKPX oacute ydieresis -20\nKPX ocircumflex v -20\nKPX ocircumflex w -15\nKPX ocircumflex x -30\nKPX ocircumflex y -20\nKPX ocircumflex yacute -20\nKPX ocircumflex ydieresis -20\nKPX odieresis v -20\nKPX odieresis w -15\nKPX odieresis x -30\nKPX odieresis y -20\nKPX odieresis yacute -20\nKPX odieresis ydieresis -20\nKPX ograve v -20\nKPX ograve w -15\nKPX ograve x -30\nKPX ograve y -20\nKPX ograve yacute -20\nKPX ograve ydieresis -20\nKPX ohungarumlaut v -20\nKPX ohungarumlaut w -15\nKPX ohungarumlaut x -30\nKPX ohungarumlaut y -20\nKPX ohungarumlaut yacute -20\nKPX ohungarumlaut ydieresis -20\nKPX omacron v -20\nKPX omacron w -15\nKPX omacron x -30\nKPX omacron y -20\nKPX omacron yacute -20\nKPX omacron ydieresis -20\nKPX oslash v -20\nKPX oslash w -15\nKPX oslash x -30\nKPX oslash y -20\nKPX oslash yacute -20\nKPX oslash ydieresis -20\nKPX otilde v -20\nKPX otilde w -15\nKPX otilde x -30\nKPX otilde y -20\nKPX otilde yacute -20\nKPX otilde ydieresis -20\nKPX p y -15\nKPX p yacute -15\nKPX p ydieresis -15\nKPX period quotedblright -120\nKPX period quoteright -120\nKPX period space -40\nKPX quotedblright space -80\nKPX quoteleft quoteleft -46\nKPX quoteright d -80\nKPX quoteright dcroat -80\nKPX quoteright l -20\nKPX quoteright lacute -20\nKPX quoteright lcommaaccent -20\nKPX quoteright lslash -20\nKPX quoteright quoteright -46\nKPX quoteright r -40\nKPX quoteright racute -40\nKPX quoteright rcaron -40\nKPX quoteright rcommaaccent -40\nKPX quoteright s -60\nKPX quoteright sacute -60\nKPX quoteright scaron -60\nKPX quoteright scedilla -60\nKPX quoteright scommaaccent -60\nKPX quoteright space -80\nKPX quoteright v -20\nKPX r c -20\nKPX r cacute -20\nKPX r ccaron -20\nKPX r ccedilla -20\nKPX r comma -60\nKPX r d -20\nKPX r dcroat -20\nKPX r g -15\nKPX r gbreve -15\nKPX r gcommaaccent -15\nKPX r hyphen -20\nKPX r o -20\nKPX r oacute -20\nKPX r ocircumflex -20\nKPX r odieresis -20\nKPX r ograve -20\nKPX r ohungarumlaut -20\nKPX r omacron -20\nKPX r oslash -20\nKPX r otilde -20\nKPX r period -60\nKPX r q -20\nKPX r s -15\nKPX r sacute -15\nKPX r scaron -15\nKPX r scedilla -15\nKPX r scommaaccent -15\nKPX r t 20\nKPX r tcommaaccent 20\nKPX r v 10\nKPX r y 10\nKPX r yacute 10\nKPX r ydieresis 10\nKPX racute c -20\nKPX racute cacute -20\nKPX racute ccaron -20\nKPX racute ccedilla -20\nKPX racute comma -60\nKPX racute d -20\nKPX racute dcroat -20\nKPX racute g -15\nKPX racute gbreve -15\nKPX racute gcommaaccent -15\nKPX racute hyphen -20\nKPX racute o -20\nKPX racute oacute -20\nKPX racute ocircumflex -20\nKPX racute odieresis -20\nKPX racute ograve -20\nKPX racute ohungarumlaut -20\nKPX racute omacron -20\nKPX racute oslash -20\nKPX racute otilde -20\nKPX racute period -60\nKPX racute q -20\nKPX racute s -15\nKPX racute sacute -15\nKPX racute scaron -15\nKPX racute scedilla -15\nKPX racute scommaaccent -15\nKPX racute t 20\nKPX racute tcommaaccent 20\nKPX racute v 10\nKPX racute y 10\nKPX racute yacute 10\nKPX racute ydieresis 10\nKPX rcaron c -20\nKPX rcaron cacute -20\nKPX rcaron ccaron -20\nKPX rcaron ccedilla -20\nKPX rcaron comma -60\nKPX rcaron d -20\nKPX rcaron dcroat -20\nKPX rcaron g -15\nKPX rcaron gbreve -15\nKPX rcaron gcommaaccent -15\nKPX rcaron hyphen -20\nKPX rcaron o -20\nKPX rcaron oacute -20\nKPX rcaron ocircumflex -20\nKPX rcaron odieresis -20\nKPX rcaron ograve -20\nKPX rcaron ohungarumlaut -20\nKPX rcaron omacron -20\nKPX rcaron oslash -20\nKPX rcaron otilde -20\nKPX rcaron period -60\nKPX rcaron q -20\nKPX rcaron s -15\nKPX rcaron sacute -15\nKPX rcaron scaron -15\nKPX rcaron scedilla -15\nKPX rcaron scommaaccent -15\nKPX rcaron t 20\nKPX rcaron tcommaaccent 20\nKPX rcaron v 10\nKPX rcaron y 10\nKPX rcaron yacute 10\nKPX rcaron ydieresis 10\nKPX rcommaaccent c -20\nKPX rcommaaccent cacute -20\nKPX rcommaaccent ccaron -20\nKPX rcommaaccent ccedilla -20\nKPX rcommaaccent comma -60\nKPX rcommaaccent d -20\nKPX rcommaaccent dcroat -20\nKPX rcommaaccent g -15\nKPX rcommaaccent gbreve -15\nKPX rcommaaccent gcommaaccent -15\nKPX rcommaaccent hyphen -20\nKPX rcommaaccent o -20\nKPX rcommaaccent oacute -20\nKPX rcommaaccent ocircumflex -20\nKPX rcommaaccent odieresis -20\nKPX rcommaaccent ograve -20\nKPX rcommaaccent ohungarumlaut -20\nKPX rcommaaccent omacron -20\nKPX rcommaaccent oslash -20\nKPX rcommaaccent otilde -20\nKPX rcommaaccent period -60\nKPX rcommaaccent q -20\nKPX rcommaaccent s -15\nKPX rcommaaccent sacute -15\nKPX rcommaaccent scaron -15\nKPX rcommaaccent scedilla -15\nKPX rcommaaccent scommaaccent -15\nKPX rcommaaccent t 20\nKPX rcommaaccent tcommaaccent 20\nKPX rcommaaccent v 10\nKPX rcommaaccent y 10\nKPX rcommaaccent yacute 10\nKPX rcommaaccent ydieresis 10\nKPX s w -15\nKPX sacute w -15\nKPX scaron w -15\nKPX scedilla w -15\nKPX scommaaccent w -15\nKPX semicolon space -40\nKPX space T -100\nKPX space Tcaron -100\nKPX space Tcommaaccent -100\nKPX space V -80\nKPX space W -80\nKPX space Y -120\nKPX space Yacute -120\nKPX space Ydieresis -120\nKPX space quotedblleft -80\nKPX space quoteleft -60\nKPX v a -20\nKPX v aacute -20\nKPX v abreve -20\nKPX v acircumflex -20\nKPX v adieresis -20\nKPX v agrave -20\nKPX v amacron -20\nKPX v aogonek -20\nKPX v aring -20\nKPX v atilde -20\nKPX v comma -80\nKPX v o -30\nKPX v oacute -30\nKPX v ocircumflex -30\nKPX v odieresis -30\nKPX v ograve -30\nKPX v ohungarumlaut -30\nKPX v omacron -30\nKPX v oslash -30\nKPX v otilde -30\nKPX v period -80\nKPX w comma -40\nKPX w o -20\nKPX w oacute -20\nKPX w ocircumflex -20\nKPX w odieresis -20\nKPX w ograve -20\nKPX w ohungarumlaut -20\nKPX w omacron -20\nKPX w oslash -20\nKPX w otilde -20\nKPX w period -40\nKPX x e -10\nKPX x eacute -10\nKPX x ecaron -10\nKPX x ecircumflex -10\nKPX x edieresis -10\nKPX x edotaccent -10\nKPX x egrave -10\nKPX x emacron -10\nKPX x eogonek -10\nKPX y a -30\nKPX y aacute -30\nKPX y abreve -30\nKPX y acircumflex -30\nKPX y adieresis -30\nKPX y agrave -30\nKPX y amacron -30\nKPX y aogonek -30\nKPX y aring -30\nKPX y atilde -30\nKPX y comma -80\nKPX y e -10\nKPX y eacute -10\nKPX y ecaron -10\nKPX y ecircumflex -10\nKPX y edieresis -10\nKPX y edotaccent -10\nKPX y egrave -10\nKPX y emacron -10\nKPX y eogonek -10\nKPX y o -25\nKPX y oacute -25\nKPX y ocircumflex -25\nKPX y odieresis -25\nKPX y ograve -25\nKPX y ohungarumlaut -25\nKPX y omacron -25\nKPX y oslash -25\nKPX y otilde -25\nKPX y period -80\nKPX yacute a -30\nKPX yacute aacute -30\nKPX yacute abreve -30\nKPX yacute acircumflex -30\nKPX yacute adieresis -30\nKPX yacute agrave -30\nKPX yacute amacron -30\nKPX yacute aogonek -30\nKPX yacute aring -30\nKPX yacute atilde -30\nKPX yacute comma -80\nKPX yacute e -10\nKPX yacute eacute -10\nKPX yacute ecaron -10\nKPX yacute ecircumflex -10\nKPX yacute edieresis -10\nKPX yacute edotaccent -10\nKPX yacute egrave -10\nKPX yacute emacron -10\nKPX yacute eogonek -10\nKPX yacute o -25\nKPX yacute oacute -25\nKPX yacute ocircumflex -25\nKPX yacute odieresis -25\nKPX yacute ograve -25\nKPX yacute ohungarumlaut -25\nKPX yacute omacron -25\nKPX yacute oslash -25\nKPX yacute otilde -25\nKPX yacute period -80\nKPX ydieresis a -30\nKPX ydieresis aacute -30\nKPX ydieresis abreve -30\nKPX ydieresis acircumflex -30\nKPX ydieresis adieresis -30\nKPX ydieresis agrave -30\nKPX ydieresis amacron -30\nKPX ydieresis aogonek -30\nKPX ydieresis aring -30\nKPX ydieresis atilde -30\nKPX ydieresis comma -80\nKPX ydieresis e -10\nKPX ydieresis eacute -10\nKPX ydieresis ecaron -10\nKPX ydieresis ecircumflex -10\nKPX ydieresis edieresis -10\nKPX ydieresis edotaccent -10\nKPX ydieresis egrave -10\nKPX ydieresis emacron -10\nKPX ydieresis eogonek -10\nKPX ydieresis o -25\nKPX ydieresis oacute -25\nKPX ydieresis ocircumflex -25\nKPX ydieresis odieresis -25\nKPX ydieresis ograve -25\nKPX ydieresis ohungarumlaut -25\nKPX ydieresis omacron -25\nKPX ydieresis oslash -25\nKPX ydieresis otilde -25\nKPX ydieresis period -80\nKPX z e 10\nKPX z eacute 10\nKPX z ecaron 10\nKPX z ecircumflex 10\nKPX z edieresis 10\nKPX z edotaccent 10\nKPX z egrave 10\nKPX z emacron 10\nKPX z eogonek 10\nKPX zacute e 10\nKPX zacute eacute 10\nKPX zacute ecaron 10\nKPX zacute ecircumflex 10\nKPX zacute edieresis 10\nKPX zacute edotaccent 10\nKPX zacute egrave 10\nKPX zacute emacron 10\nKPX zacute eogonek 10\nKPX zcaron e 10\nKPX zcaron eacute 10\nKPX zcaron ecaron 10\nKPX zcaron ecircumflex 10\nKPX zcaron edieresis 10\nKPX zcaron edotaccent 10\nKPX zcaron egrave 10\nKPX zcaron emacron 10\nKPX zcaron eogonek 10\nKPX zdotaccent e 10\nKPX zdotaccent eacute 10\nKPX zdotaccent ecaron 10\nKPX zdotaccent ecircumflex 10\nKPX zdotaccent edieresis 10\nKPX zdotaccent edotaccent 10\nKPX zdotaccent egrave 10\nKPX zdotaccent emacron 10\nKPX zdotaccent eogonek 10\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/Helvetica-Oblique.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:44:31 1997\nComment UniqueID 43055\nComment VMusage 14960 69346\nFontName Helvetica-Oblique\nFullName Helvetica Oblique\nFamilyName Helvetica\nWeight Medium\nItalicAngle -12\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -170 -225 1116 931 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 523\nAscender 718\nDescender -207\nStdHW 76\nStdVW 88\nStartCharMetrics 315\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 278 ; N exclam ; B 90 0 340 718 ;\nC 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ;\nC 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ;\nC 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ;\nC 37 ; WX 889 ; N percent ; B 147 -19 889 703 ;\nC 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ;\nC 39 ; WX 222 ; N quoteright ; B 151 463 310 718 ;\nC 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ;\nC 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ;\nC 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ;\nC 43 ; WX 584 ; N plus ; B 85 0 606 505 ;\nC 44 ; WX 278 ; N comma ; B 56 -147 214 106 ;\nC 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ;\nC 46 ; WX 278 ; N period ; B 87 0 214 106 ;\nC 47 ; WX 278 ; N slash ; B -21 -19 452 737 ;\nC 48 ; WX 556 ; N zero ; B 93 -19 608 703 ;\nC 49 ; WX 556 ; N one ; B 207 0 508 703 ;\nC 50 ; WX 556 ; N two ; B 26 0 617 703 ;\nC 51 ; WX 556 ; N three ; B 75 -19 610 703 ;\nC 52 ; WX 556 ; N four ; B 61 0 576 703 ;\nC 53 ; WX 556 ; N five ; B 68 -19 621 688 ;\nC 54 ; WX 556 ; N six ; B 91 -19 615 703 ;\nC 55 ; WX 556 ; N seven ; B 137 0 669 688 ;\nC 56 ; WX 556 ; N eight ; B 74 -19 607 703 ;\nC 57 ; WX 556 ; N nine ; B 82 -19 609 703 ;\nC 58 ; WX 278 ; N colon ; B 87 0 301 516 ;\nC 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ;\nC 60 ; WX 584 ; N less ; B 94 11 641 495 ;\nC 61 ; WX 584 ; N equal ; B 63 115 628 390 ;\nC 62 ; WX 584 ; N greater ; B 50 11 597 495 ;\nC 63 ; WX 556 ; N question ; B 161 0 610 727 ;\nC 64 ; WX 1015 ; N at ; B 215 -19 965 737 ;\nC 65 ; WX 667 ; N A ; B 14 0 654 718 ;\nC 66 ; WX 667 ; N B ; B 74 0 712 718 ;\nC 67 ; WX 722 ; N C ; B 108 -19 782 737 ;\nC 68 ; WX 722 ; N D ; B 81 0 764 718 ;\nC 69 ; WX 667 ; N E ; B 86 0 762 718 ;\nC 70 ; WX 611 ; N F ; B 86 0 736 718 ;\nC 71 ; WX 778 ; N G ; B 111 -19 799 737 ;\nC 72 ; WX 722 ; N H ; B 77 0 799 718 ;\nC 73 ; WX 278 ; N I ; B 91 0 341 718 ;\nC 74 ; WX 500 ; N J ; B 47 -19 581 718 ;\nC 75 ; WX 667 ; N K ; B 76 0 808 718 ;\nC 76 ; WX 556 ; N L ; B 76 0 555 718 ;\nC 77 ; WX 833 ; N M ; B 73 0 914 718 ;\nC 78 ; WX 722 ; N N ; B 76 0 799 718 ;\nC 79 ; WX 778 ; N O ; B 105 -19 826 737 ;\nC 80 ; WX 667 ; N P ; B 86 0 737 718 ;\nC 81 ; WX 778 ; N Q ; B 105 -56 826 737 ;\nC 82 ; WX 722 ; N R ; B 88 0 773 718 ;\nC 83 ; WX 667 ; N S ; B 90 -19 713 737 ;\nC 84 ; WX 611 ; N T ; B 148 0 750 718 ;\nC 85 ; WX 722 ; N U ; B 123 -19 797 718 ;\nC 86 ; WX 667 ; N V ; B 173 0 800 718 ;\nC 87 ; WX 944 ; N W ; B 169 0 1081 718 ;\nC 88 ; WX 667 ; N X ; B 19 0 790 718 ;\nC 89 ; WX 667 ; N Y ; B 167 0 806 718 ;\nC 90 ; WX 611 ; N Z ; B 23 0 741 718 ;\nC 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ;\nC 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ;\nC 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ;\nC 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ;\nC 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ;\nC 96 ; WX 222 ; N quoteleft ; B 165 470 323 725 ;\nC 97 ; WX 556 ; N a ; B 61 -15 559 538 ;\nC 98 ; WX 556 ; N b ; B 58 -15 584 718 ;\nC 99 ; WX 500 ; N c ; B 74 -15 553 538 ;\nC 100 ; WX 556 ; N d ; B 84 -15 652 718 ;\nC 101 ; WX 556 ; N e ; B 84 -15 578 538 ;\nC 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ;\nC 103 ; WX 556 ; N g ; B 42 -220 610 538 ;\nC 104 ; WX 556 ; N h ; B 65 0 573 718 ;\nC 105 ; WX 222 ; N i ; B 67 0 308 718 ;\nC 106 ; WX 222 ; N j ; B -60 -210 308 718 ;\nC 107 ; WX 500 ; N k ; B 67 0 600 718 ;\nC 108 ; WX 222 ; N l ; B 67 0 308 718 ;\nC 109 ; WX 833 ; N m ; B 65 0 852 538 ;\nC 110 ; WX 556 ; N n ; B 65 0 573 538 ;\nC 111 ; WX 556 ; N o ; B 83 -14 585 538 ;\nC 112 ; WX 556 ; N p ; B 14 -207 584 538 ;\nC 113 ; WX 556 ; N q ; B 84 -207 605 538 ;\nC 114 ; WX 333 ; N r ; B 77 0 446 538 ;\nC 115 ; WX 500 ; N s ; B 63 -15 529 538 ;\nC 116 ; WX 278 ; N t ; B 102 -7 368 669 ;\nC 117 ; WX 556 ; N u ; B 94 -15 600 523 ;\nC 118 ; WX 500 ; N v ; B 119 0 603 523 ;\nC 119 ; WX 722 ; N w ; B 125 0 820 523 ;\nC 120 ; WX 500 ; N x ; B 11 0 594 523 ;\nC 121 ; WX 500 ; N y ; B 15 -214 600 523 ;\nC 122 ; WX 500 ; N z ; B 31 0 571 523 ;\nC 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ;\nC 124 ; WX 260 ; N bar ; B 46 -225 332 775 ;\nC 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ;\nC 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ;\nC 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ;\nC 162 ; WX 556 ; N cent ; B 95 -115 584 623 ;\nC 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ;\nC 164 ; WX 167 ; N fraction ; B -170 -19 482 703 ;\nC 165 ; WX 556 ; N yen ; B 81 0 699 688 ;\nC 166 ; WX 556 ; N florin ; B -52 -207 654 737 ;\nC 167 ; WX 556 ; N section ; B 76 -191 584 737 ;\nC 168 ; WX 556 ; N currency ; B 60 99 646 603 ;\nC 169 ; WX 191 ; N quotesingle ; B 157 463 285 718 ;\nC 170 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ;\nC 171 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ;\nC 173 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ;\nC 174 ; WX 500 ; N fi ; B 86 0 587 728 ;\nC 175 ; WX 500 ; N fl ; B 86 0 585 728 ;\nC 177 ; WX 556 ; N endash ; B 51 240 623 313 ;\nC 178 ; WX 556 ; N dagger ; B 135 -159 622 718 ;\nC 179 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ;\nC 180 ; WX 278 ; N periodcentered ; B 129 190 257 315 ;\nC 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ;\nC 183 ; WX 350 ; N bullet ; B 91 202 413 517 ;\nC 184 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ;\nC 185 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ;\nC 186 ; WX 333 ; N quotedblright ; B 124 463 448 718 ;\nC 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ;\nC 188 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ;\nC 189 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ;\nC 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ;\nC 193 ; WX 333 ; N grave ; B 170 593 337 734 ;\nC 194 ; WX 333 ; N acute ; B 248 593 475 734 ;\nC 195 ; WX 333 ; N circumflex ; B 147 593 438 734 ;\nC 196 ; WX 333 ; N tilde ; B 125 606 490 722 ;\nC 197 ; WX 333 ; N macron ; B 143 627 468 684 ;\nC 198 ; WX 333 ; N breve ; B 167 595 476 731 ;\nC 199 ; WX 333 ; N dotaccent ; B 249 604 362 706 ;\nC 200 ; WX 333 ; N dieresis ; B 168 604 443 706 ;\nC 202 ; WX 333 ; N ring ; B 214 572 402 756 ;\nC 203 ; WX 333 ; N cedilla ; B 2 -225 232 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ;\nC 206 ; WX 333 ; N ogonek ; B 43 -225 249 0 ;\nC 207 ; WX 333 ; N caron ; B 177 593 468 734 ;\nC 208 ; WX 1000 ; N emdash ; B 51 240 1067 313 ;\nC 225 ; WX 1000 ; N AE ; B 8 0 1097 718 ;\nC 227 ; WX 370 ; N ordfeminine ; B 127 405 449 737 ;\nC 232 ; WX 556 ; N Lslash ; B 41 0 555 718 ;\nC 233 ; WX 778 ; N Oslash ; B 43 -19 890 737 ;\nC 234 ; WX 1000 ; N OE ; B 98 -19 1116 737 ;\nC 235 ; WX 365 ; N ordmasculine ; B 141 405 468 737 ;\nC 241 ; WX 889 ; N ae ; B 61 -15 909 538 ;\nC 245 ; WX 278 ; N dotlessi ; B 95 0 294 523 ;\nC 248 ; WX 222 ; N lslash ; B 41 0 347 718 ;\nC 249 ; WX 611 ; N oslash ; B 29 -22 647 545 ;\nC 250 ; WX 944 ; N oe ; B 83 -15 964 538 ;\nC 251 ; WX 611 ; N germandbls ; B 67 -15 658 728 ;\nC -1 ; WX 278 ; N Idieresis ; B 91 0 458 901 ;\nC -1 ; WX 556 ; N eacute ; B 84 -15 587 734 ;\nC -1 ; WX 556 ; N abreve ; B 61 -15 578 731 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 94 -15 677 734 ;\nC -1 ; WX 556 ; N ecaron ; B 84 -15 580 734 ;\nC -1 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ;\nC -1 ; WX 584 ; N divide ; B 85 -19 606 524 ;\nC -1 ; WX 667 ; N Yacute ; B 167 0 806 929 ;\nC -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ;\nC -1 ; WX 556 ; N aacute ; B 61 -15 587 734 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ;\nC -1 ; WX 500 ; N yacute ; B 15 -214 600 734 ;\nC -1 ; WX 500 ; N scommaaccent ; B 63 -225 529 538 ;\nC -1 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ;\nC -1 ; WX 722 ; N Uring ; B 123 -19 797 931 ;\nC -1 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ;\nC -1 ; WX 556 ; N aogonek ; B 61 -220 559 538 ;\nC -1 ; WX 722 ; N Uacute ; B 123 -19 797 929 ;\nC -1 ; WX 556 ; N uogonek ; B 94 -225 600 523 ;\nC -1 ; WX 667 ; N Edieresis ; B 86 0 762 901 ;\nC -1 ; WX 722 ; N Dcroat ; B 69 0 764 718 ;\nC -1 ; WX 250 ; N commaaccent ; B 39 -225 172 -40 ;\nC -1 ; WX 737 ; N copyright ; B 54 -19 837 737 ;\nC -1 ; WX 667 ; N Emacron ; B 86 0 762 879 ;\nC -1 ; WX 500 ; N ccaron ; B 74 -15 553 734 ;\nC -1 ; WX 556 ; N aring ; B 61 -15 559 756 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 799 718 ;\nC -1 ; WX 222 ; N lacute ; B 67 0 461 929 ;\nC -1 ; WX 556 ; N agrave ; B 61 -15 559 734 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 148 -225 750 718 ;\nC -1 ; WX 722 ; N Cacute ; B 108 -19 782 929 ;\nC -1 ; WX 556 ; N atilde ; B 61 -15 592 722 ;\nC -1 ; WX 667 ; N Edotaccent ; B 86 0 762 901 ;\nC -1 ; WX 500 ; N scaron ; B 63 -15 552 734 ;\nC -1 ; WX 500 ; N scedilla ; B 63 -225 529 538 ;\nC -1 ; WX 278 ; N iacute ; B 95 0 448 734 ;\nC -1 ; WX 471 ; N lozenge ; B 88 0 540 728 ;\nC -1 ; WX 722 ; N Rcaron ; B 88 0 773 929 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 111 -225 799 737 ;\nC -1 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ;\nC -1 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ;\nC -1 ; WX 667 ; N Amacron ; B 14 0 677 879 ;\nC -1 ; WX 333 ; N rcaron ; B 77 0 508 734 ;\nC -1 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 23 0 741 901 ;\nC -1 ; WX 667 ; N Thorn ; B 86 0 712 718 ;\nC -1 ; WX 778 ; N Omacron ; B 105 -19 826 879 ;\nC -1 ; WX 722 ; N Racute ; B 88 0 773 929 ;\nC -1 ; WX 667 ; N Sacute ; B 90 -19 713 929 ;\nC -1 ; WX 643 ; N dcaron ; B 84 -15 808 718 ;\nC -1 ; WX 722 ; N Umacron ; B 123 -19 797 879 ;\nC -1 ; WX 556 ; N uring ; B 94 -15 600 756 ;\nC -1 ; WX 333 ; N threesuperior ; B 90 270 436 703 ;\nC -1 ; WX 778 ; N Ograve ; B 105 -19 826 929 ;\nC -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ;\nC -1 ; WX 667 ; N Abreve ; B 14 0 685 926 ;\nC -1 ; WX 584 ; N multiply ; B 50 0 642 506 ;\nC -1 ; WX 556 ; N uacute ; B 94 -15 600 734 ;\nC -1 ; WX 611 ; N Tcaron ; B 148 0 750 929 ;\nC -1 ; WX 476 ; N partialdiff ; B 41 -38 550 714 ;\nC -1 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ;\nC -1 ; WX 722 ; N Nacute ; B 76 0 799 929 ;\nC -1 ; WX 278 ; N icircumflex ; B 95 0 411 734 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ;\nC -1 ; WX 556 ; N adieresis ; B 61 -15 559 706 ;\nC -1 ; WX 556 ; N edieresis ; B 84 -15 578 706 ;\nC -1 ; WX 500 ; N cacute ; B 74 -15 559 734 ;\nC -1 ; WX 556 ; N nacute ; B 65 0 587 734 ;\nC -1 ; WX 556 ; N umacron ; B 94 -15 600 684 ;\nC -1 ; WX 722 ; N Ncaron ; B 76 0 799 929 ;\nC -1 ; WX 278 ; N Iacute ; B 91 0 489 929 ;\nC -1 ; WX 584 ; N plusminus ; B 39 0 618 506 ;\nC -1 ; WX 260 ; N brokenbar ; B 62 -150 316 700 ;\nC -1 ; WX 737 ; N registered ; B 54 -19 837 737 ;\nC -1 ; WX 778 ; N Gbreve ; B 111 -19 799 926 ;\nC -1 ; WX 278 ; N Idotaccent ; B 91 0 377 901 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 671 706 ;\nC -1 ; WX 667 ; N Egrave ; B 86 0 762 929 ;\nC -1 ; WX 333 ; N racute ; B 77 0 475 734 ;\nC -1 ; WX 556 ; N omacron ; B 83 -14 585 684 ;\nC -1 ; WX 611 ; N Zacute ; B 23 0 741 929 ;\nC -1 ; WX 611 ; N Zcaron ; B 23 0 741 929 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 620 674 ;\nC -1 ; WX 722 ; N Eth ; B 69 0 764 718 ;\nC -1 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ;\nC -1 ; WX 222 ; N lcommaaccent ; B 25 -225 308 718 ;\nC -1 ; WX 317 ; N tcaron ; B 102 -7 501 808 ;\nC -1 ; WX 556 ; N eogonek ; B 84 -225 578 538 ;\nC -1 ; WX 722 ; N Uogonek ; B 123 -225 797 718 ;\nC -1 ; WX 667 ; N Aacute ; B 14 0 683 929 ;\nC -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ;\nC -1 ; WX 556 ; N egrave ; B 84 -15 578 734 ;\nC -1 ; WX 500 ; N zacute ; B 31 0 571 734 ;\nC -1 ; WX 222 ; N iogonek ; B -61 -225 308 718 ;\nC -1 ; WX 778 ; N Oacute ; B 105 -19 826 929 ;\nC -1 ; WX 556 ; N oacute ; B 83 -14 587 734 ;\nC -1 ; WX 556 ; N amacron ; B 61 -15 580 684 ;\nC -1 ; WX 500 ; N sacute ; B 63 -15 559 734 ;\nC -1 ; WX 278 ; N idieresis ; B 95 0 416 706 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ;\nC -1 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 556 ; N thorn ; B 14 -207 584 718 ;\nC -1 ; WX 333 ; N twosuperior ; B 64 281 449 703 ;\nC -1 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ;\nC -1 ; WX 556 ; N mu ; B 24 -207 600 523 ;\nC -1 ; WX 278 ; N igrave ; B 95 0 310 734 ;\nC -1 ; WX 556 ; N ohungarumlaut ; B 83 -14 677 734 ;\nC -1 ; WX 667 ; N Eogonek ; B 86 -220 762 718 ;\nC -1 ; WX 556 ; N dcroat ; B 84 -15 689 718 ;\nC -1 ; WX 834 ; N threequarters ; B 130 -19 861 703 ;\nC -1 ; WX 667 ; N Scedilla ; B 90 -225 713 737 ;\nC -1 ; WX 299 ; N lcaron ; B 67 0 464 718 ;\nC -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 808 718 ;\nC -1 ; WX 556 ; N Lacute ; B 76 0 555 929 ;\nC -1 ; WX 1000 ; N trademark ; B 186 306 1056 718 ;\nC -1 ; WX 556 ; N edotaccent ; B 84 -15 578 706 ;\nC -1 ; WX 278 ; N Igrave ; B 91 0 351 929 ;\nC -1 ; WX 278 ; N Imacron ; B 91 0 483 879 ;\nC -1 ; WX 556 ; N Lcaron ; B 76 0 570 718 ;\nC -1 ; WX 834 ; N onehalf ; B 114 -19 839 703 ;\nC -1 ; WX 549 ; N lessequal ; B 26 0 666 674 ;\nC -1 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ;\nC -1 ; WX 556 ; N ntilde ; B 65 0 592 722 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 123 -19 801 929 ;\nC -1 ; WX 667 ; N Eacute ; B 86 0 762 929 ;\nC -1 ; WX 556 ; N emacron ; B 84 -15 580 684 ;\nC -1 ; WX 556 ; N gbreve ; B 42 -220 610 731 ;\nC -1 ; WX 834 ; N onequarter ; B 150 -19 802 703 ;\nC -1 ; WX 667 ; N Scaron ; B 90 -19 713 929 ;\nC -1 ; WX 667 ; N Scommaaccent ; B 90 -225 713 737 ;\nC -1 ; WX 778 ; N Ohungarumlaut ; B 105 -19 829 929 ;\nC -1 ; WX 400 ; N degree ; B 169 411 468 703 ;\nC -1 ; WX 556 ; N ograve ; B 83 -14 585 734 ;\nC -1 ; WX 722 ; N Ccaron ; B 108 -19 782 929 ;\nC -1 ; WX 556 ; N ugrave ; B 94 -15 600 734 ;\nC -1 ; WX 453 ; N radical ; B 79 -80 617 762 ;\nC -1 ; WX 722 ; N Dcaron ; B 81 0 764 929 ;\nC -1 ; WX 333 ; N rcommaaccent ; B 30 -225 446 538 ;\nC -1 ; WX 722 ; N Ntilde ; B 76 0 799 917 ;\nC -1 ; WX 556 ; N otilde ; B 83 -14 602 722 ;\nC -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 773 718 ;\nC -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 555 718 ;\nC -1 ; WX 667 ; N Atilde ; B 14 0 699 917 ;\nC -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ;\nC -1 ; WX 667 ; N Aring ; B 14 0 654 931 ;\nC -1 ; WX 778 ; N Otilde ; B 105 -19 826 917 ;\nC -1 ; WX 500 ; N zdotaccent ; B 31 0 571 706 ;\nC -1 ; WX 667 ; N Ecaron ; B 86 0 762 929 ;\nC -1 ; WX 278 ; N Iogonek ; B -33 -225 341 718 ;\nC -1 ; WX 500 ; N kcommaaccent ; B 67 -225 600 718 ;\nC -1 ; WX 584 ; N minus ; B 85 216 606 289 ;\nC -1 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ;\nC -1 ; WX 556 ; N ncaron ; B 65 0 580 734 ;\nC -1 ; WX 278 ; N tcommaaccent ; B 63 -225 368 669 ;\nC -1 ; WX 584 ; N logicalnot ; B 106 108 628 390 ;\nC -1 ; WX 556 ; N odieresis ; B 83 -14 585 706 ;\nC -1 ; WX 556 ; N udieresis ; B 94 -15 600 706 ;\nC -1 ; WX 549 ; N notequal ; B 34 -35 623 551 ;\nC -1 ; WX 556 ; N gcommaaccent ; B 42 -220 610 822 ;\nC -1 ; WX 556 ; N eth ; B 81 -15 617 737 ;\nC -1 ; WX 500 ; N zcaron ; B 31 0 571 734 ;\nC -1 ; WX 556 ; N ncommaaccent ; B 65 -225 573 538 ;\nC -1 ; WX 333 ; N onesuperior ; B 166 281 371 703 ;\nC -1 ; WX 278 ; N imacron ; B 95 0 417 684 ;\nC -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2705\nKPX A C -30\nKPX A Cacute -30\nKPX A Ccaron -30\nKPX A Ccedilla -30\nKPX A G -30\nKPX A Gbreve -30\nKPX A Gcommaaccent -30\nKPX A O -30\nKPX A Oacute -30\nKPX A Ocircumflex -30\nKPX A Odieresis -30\nKPX A Ograve -30\nKPX A Ohungarumlaut -30\nKPX A Omacron -30\nKPX A Oslash -30\nKPX A Otilde -30\nKPX A Q -30\nKPX A T -120\nKPX A Tcaron -120\nKPX A Tcommaaccent -120\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -70\nKPX A W -50\nKPX A Y -100\nKPX A Yacute -100\nKPX A Ydieresis -100\nKPX A u -30\nKPX A uacute -30\nKPX A ucircumflex -30\nKPX A udieresis -30\nKPX A ugrave -30\nKPX A uhungarumlaut -30\nKPX A umacron -30\nKPX A uogonek -30\nKPX A uring -30\nKPX A v -40\nKPX A w -40\nKPX A y -40\nKPX A yacute -40\nKPX A ydieresis -40\nKPX Aacute C -30\nKPX Aacute Cacute -30\nKPX Aacute Ccaron -30\nKPX Aacute Ccedilla -30\nKPX Aacute G -30\nKPX Aacute Gbreve -30\nKPX Aacute Gcommaaccent -30\nKPX Aacute O -30\nKPX Aacute Oacute -30\nKPX Aacute Ocircumflex -30\nKPX Aacute Odieresis -30\nKPX Aacute Ograve -30\nKPX Aacute Ohungarumlaut -30\nKPX Aacute Omacron -30\nKPX Aacute Oslash -30\nKPX Aacute Otilde -30\nKPX Aacute Q -30\nKPX Aacute T -120\nKPX Aacute Tcaron -120\nKPX Aacute Tcommaaccent -120\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -70\nKPX Aacute W -50\nKPX Aacute Y -100\nKPX Aacute Yacute -100\nKPX Aacute Ydieresis -100\nKPX Aacute u -30\nKPX Aacute uacute -30\nKPX Aacute ucircumflex -30\nKPX Aacute udieresis -30\nKPX Aacute ugrave -30\nKPX Aacute uhungarumlaut -30\nKPX Aacute umacron -30\nKPX Aacute uogonek -30\nKPX Aacute uring -30\nKPX Aacute v -40\nKPX Aacute w -40\nKPX Aacute y -40\nKPX Aacute yacute -40\nKPX Aacute ydieresis -40\nKPX Abreve C -30\nKPX Abreve Cacute -30\nKPX Abreve Ccaron -30\nKPX Abreve Ccedilla -30\nKPX Abreve G -30\nKPX Abreve Gbreve -30\nKPX Abreve Gcommaaccent -30\nKPX Abreve O -30\nKPX Abreve Oacute -30\nKPX Abreve Ocircumflex -30\nKPX Abreve Odieresis -30\nKPX Abreve Ograve -30\nKPX Abreve Ohungarumlaut -30\nKPX Abreve Omacron -30\nKPX Abreve Oslash -30\nKPX Abreve Otilde -30\nKPX Abreve Q -30\nKPX Abreve T -120\nKPX Abreve Tcaron -120\nKPX Abreve Tcommaaccent -120\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -70\nKPX Abreve W -50\nKPX Abreve Y -100\nKPX Abreve Yacute -100\nKPX Abreve Ydieresis -100\nKPX Abreve u -30\nKPX Abreve uacute -30\nKPX Abreve ucircumflex -30\nKPX Abreve udieresis -30\nKPX Abreve ugrave -30\nKPX Abreve uhungarumlaut -30\nKPX Abreve umacron -30\nKPX Abreve uogonek -30\nKPX Abreve uring -30\nKPX Abreve v -40\nKPX Abreve w -40\nKPX Abreve y -40\nKPX Abreve yacute -40\nKPX Abreve ydieresis -40\nKPX Acircumflex C -30\nKPX Acircumflex Cacute -30\nKPX Acircumflex Ccaron -30\nKPX Acircumflex Ccedilla -30\nKPX Acircumflex G -30\nKPX Acircumflex Gbreve -30\nKPX Acircumflex Gcommaaccent -30\nKPX Acircumflex O -30\nKPX Acircumflex Oacute -30\nKPX Acircumflex Ocircumflex -30\nKPX Acircumflex Odieresis -30\nKPX Acircumflex Ograve -30\nKPX Acircumflex Ohungarumlaut -30\nKPX Acircumflex Omacron -30\nKPX Acircumflex Oslash -30\nKPX Acircumflex Otilde -30\nKPX Acircumflex Q -30\nKPX Acircumflex T -120\nKPX Acircumflex Tcaron -120\nKPX Acircumflex Tcommaaccent -120\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -70\nKPX Acircumflex W -50\nKPX Acircumflex Y -100\nKPX Acircumflex Yacute -100\nKPX Acircumflex Ydieresis -100\nKPX Acircumflex u -30\nKPX Acircumflex uacute -30\nKPX Acircumflex ucircumflex -30\nKPX Acircumflex udieresis -30\nKPX Acircumflex ugrave -30\nKPX Acircumflex uhungarumlaut -30\nKPX Acircumflex umacron -30\nKPX Acircumflex uogonek -30\nKPX Acircumflex uring -30\nKPX Acircumflex v -40\nKPX Acircumflex w -40\nKPX Acircumflex y -40\nKPX Acircumflex yacute -40\nKPX Acircumflex ydieresis -40\nKPX Adieresis C -30\nKPX Adieresis Cacute -30\nKPX Adieresis Ccaron -30\nKPX Adieresis Ccedilla -30\nKPX Adieresis G -30\nKPX Adieresis Gbreve -30\nKPX Adieresis Gcommaaccent -30\nKPX Adieresis O -30\nKPX Adieresis Oacute -30\nKPX Adieresis Ocircumflex -30\nKPX Adieresis Odieresis -30\nKPX Adieresis Ograve -30\nKPX Adieresis Ohungarumlaut -30\nKPX Adieresis Omacron -30\nKPX Adieresis Oslash -30\nKPX Adieresis Otilde -30\nKPX Adieresis Q -30\nKPX Adieresis T -120\nKPX Adieresis Tcaron -120\nKPX Adieresis Tcommaaccent -120\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -70\nKPX Adieresis W -50\nKPX Adieresis Y -100\nKPX Adieresis Yacute -100\nKPX Adieresis Ydieresis -100\nKPX Adieresis u -30\nKPX Adieresis uacute -30\nKPX Adieresis ucircumflex -30\nKPX Adieresis udieresis -30\nKPX Adieresis ugrave -30\nKPX Adieresis uhungarumlaut -30\nKPX Adieresis umacron -30\nKPX Adieresis uogonek -30\nKPX Adieresis uring -30\nKPX Adieresis v -40\nKPX Adieresis w -40\nKPX Adieresis y -40\nKPX Adieresis yacute -40\nKPX Adieresis ydieresis -40\nKPX Agrave C -30\nKPX Agrave Cacute -30\nKPX Agrave Ccaron -30\nKPX Agrave Ccedilla -30\nKPX Agrave G -30\nKPX Agrave Gbreve -30\nKPX Agrave Gcommaaccent -30\nKPX Agrave O -30\nKPX Agrave Oacute -30\nKPX Agrave Ocircumflex -30\nKPX Agrave Odieresis -30\nKPX Agrave Ograve -30\nKPX Agrave Ohungarumlaut -30\nKPX Agrave Omacron -30\nKPX Agrave Oslash -30\nKPX Agrave Otilde -30\nKPX Agrave Q -30\nKPX Agrave T -120\nKPX Agrave Tcaron -120\nKPX Agrave Tcommaaccent -120\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -70\nKPX Agrave W -50\nKPX Agrave Y -100\nKPX Agrave Yacute -100\nKPX Agrave Ydieresis -100\nKPX Agrave u -30\nKPX Agrave uacute -30\nKPX Agrave ucircumflex -30\nKPX Agrave udieresis -30\nKPX Agrave ugrave -30\nKPX Agrave uhungarumlaut -30\nKPX Agrave umacron -30\nKPX Agrave uogonek -30\nKPX Agrave uring -30\nKPX Agrave v -40\nKPX Agrave w -40\nKPX Agrave y -40\nKPX Agrave yacute -40\nKPX Agrave ydieresis -40\nKPX Amacron C -30\nKPX Amacron Cacute -30\nKPX Amacron Ccaron -30\nKPX Amacron Ccedilla -30\nKPX Amacron G -30\nKPX Amacron Gbreve -30\nKPX Amacron Gcommaaccent -30\nKPX Amacron O -30\nKPX Amacron Oacute -30\nKPX Amacron Ocircumflex -30\nKPX Amacron Odieresis -30\nKPX Amacron Ograve -30\nKPX Amacron Ohungarumlaut -30\nKPX Amacron Omacron -30\nKPX Amacron Oslash -30\nKPX Amacron Otilde -30\nKPX Amacron Q -30\nKPX Amacron T -120\nKPX Amacron Tcaron -120\nKPX Amacron Tcommaaccent -120\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -70\nKPX Amacron W -50\nKPX Amacron Y -100\nKPX Amacron Yacute -100\nKPX Amacron Ydieresis -100\nKPX Amacron u -30\nKPX Amacron uacute -30\nKPX Amacron ucircumflex -30\nKPX Amacron udieresis -30\nKPX Amacron ugrave -30\nKPX Amacron uhungarumlaut -30\nKPX Amacron umacron -30\nKPX Amacron uogonek -30\nKPX Amacron uring -30\nKPX Amacron v -40\nKPX Amacron w -40\nKPX Amacron y -40\nKPX Amacron yacute -40\nKPX Amacron ydieresis -40\nKPX Aogonek C -30\nKPX Aogonek Cacute -30\nKPX Aogonek Ccaron -30\nKPX Aogonek Ccedilla -30\nKPX Aogonek G -30\nKPX Aogonek Gbreve -30\nKPX Aogonek Gcommaaccent -30\nKPX Aogonek O -30\nKPX Aogonek Oacute -30\nKPX Aogonek Ocircumflex -30\nKPX Aogonek Odieresis -30\nKPX Aogonek Ograve -30\nKPX Aogonek Ohungarumlaut -30\nKPX Aogonek Omacron -30\nKPX Aogonek Oslash -30\nKPX Aogonek Otilde -30\nKPX Aogonek Q -30\nKPX Aogonek T -120\nKPX Aogonek Tcaron -120\nKPX Aogonek Tcommaaccent -120\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -70\nKPX Aogonek W -50\nKPX Aogonek Y -100\nKPX Aogonek Yacute -100\nKPX Aogonek Ydieresis -100\nKPX Aogonek u -30\nKPX Aogonek uacute -30\nKPX Aogonek ucircumflex -30\nKPX Aogonek udieresis -30\nKPX Aogonek ugrave -30\nKPX Aogonek uhungarumlaut -30\nKPX Aogonek umacron -30\nKPX Aogonek uogonek -30\nKPX Aogonek uring -30\nKPX Aogonek v -40\nKPX Aogonek w -40\nKPX Aogonek y -40\nKPX Aogonek yacute -40\nKPX Aogonek ydieresis -40\nKPX Aring C -30\nKPX Aring Cacute -30\nKPX Aring Ccaron -30\nKPX Aring Ccedilla -30\nKPX Aring G -30\nKPX Aring Gbreve -30\nKPX Aring Gcommaaccent -30\nKPX Aring O -30\nKPX Aring Oacute -30\nKPX Aring Ocircumflex -30\nKPX Aring Odieresis -30\nKPX Aring Ograve -30\nKPX Aring Ohungarumlaut -30\nKPX Aring Omacron -30\nKPX Aring Oslash -30\nKPX Aring Otilde -30\nKPX Aring Q -30\nKPX Aring T -120\nKPX Aring Tcaron -120\nKPX Aring Tcommaaccent -120\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -70\nKPX Aring W -50\nKPX Aring Y -100\nKPX Aring Yacute -100\nKPX Aring Ydieresis -100\nKPX Aring u -30\nKPX Aring uacute -30\nKPX Aring ucircumflex -30\nKPX Aring udieresis -30\nKPX Aring ugrave -30\nKPX Aring uhungarumlaut -30\nKPX Aring umacron -30\nKPX Aring uogonek -30\nKPX Aring uring -30\nKPX Aring v -40\nKPX Aring w -40\nKPX Aring y -40\nKPX Aring yacute -40\nKPX Aring ydieresis -40\nKPX Atilde C -30\nKPX Atilde Cacute -30\nKPX Atilde Ccaron -30\nKPX Atilde Ccedilla -30\nKPX Atilde G -30\nKPX Atilde Gbreve -30\nKPX Atilde Gcommaaccent -30\nKPX Atilde O -30\nKPX Atilde Oacute -30\nKPX Atilde Ocircumflex -30\nKPX Atilde Odieresis -30\nKPX Atilde Ograve -30\nKPX Atilde Ohungarumlaut -30\nKPX Atilde Omacron -30\nKPX Atilde Oslash -30\nKPX Atilde Otilde -30\nKPX Atilde Q -30\nKPX Atilde T -120\nKPX Atilde Tcaron -120\nKPX Atilde Tcommaaccent -120\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -70\nKPX Atilde W -50\nKPX Atilde Y -100\nKPX Atilde Yacute -100\nKPX Atilde Ydieresis -100\nKPX Atilde u -30\nKPX Atilde uacute -30\nKPX Atilde ucircumflex -30\nKPX Atilde udieresis -30\nKPX Atilde ugrave -30\nKPX Atilde uhungarumlaut -30\nKPX Atilde umacron -30\nKPX Atilde uogonek -30\nKPX Atilde uring -30\nKPX Atilde v -40\nKPX Atilde w -40\nKPX Atilde y -40\nKPX Atilde yacute -40\nKPX Atilde ydieresis -40\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX B comma -20\nKPX B period -20\nKPX C comma -30\nKPX C period -30\nKPX Cacute comma -30\nKPX Cacute period -30\nKPX Ccaron comma -30\nKPX Ccaron period -30\nKPX Ccedilla comma -30\nKPX Ccedilla period -30\nKPX D A -40\nKPX D Aacute -40\nKPX D Abreve -40\nKPX D Acircumflex -40\nKPX D Adieresis -40\nKPX D Agrave -40\nKPX D Amacron -40\nKPX D Aogonek -40\nKPX D Aring -40\nKPX D Atilde -40\nKPX D V -70\nKPX D W -40\nKPX D Y -90\nKPX D Yacute -90\nKPX D Ydieresis -90\nKPX D comma -70\nKPX D period -70\nKPX Dcaron A -40\nKPX Dcaron Aacute -40\nKPX Dcaron Abreve -40\nKPX Dcaron Acircumflex -40\nKPX Dcaron Adieresis -40\nKPX Dcaron Agrave -40\nKPX Dcaron Amacron -40\nKPX Dcaron Aogonek -40\nKPX Dcaron Aring -40\nKPX Dcaron Atilde -40\nKPX Dcaron V -70\nKPX Dcaron W -40\nKPX Dcaron Y -90\nKPX Dcaron Yacute -90\nKPX Dcaron Ydieresis -90\nKPX Dcaron comma -70\nKPX Dcaron period -70\nKPX Dcroat A -40\nKPX Dcroat Aacute -40\nKPX Dcroat Abreve -40\nKPX Dcroat Acircumflex -40\nKPX Dcroat Adieresis -40\nKPX Dcroat Agrave -40\nKPX Dcroat Amacron -40\nKPX Dcroat Aogonek -40\nKPX Dcroat Aring -40\nKPX Dcroat Atilde -40\nKPX Dcroat V -70\nKPX Dcroat W -40\nKPX Dcroat Y -90\nKPX Dcroat Yacute -90\nKPX Dcroat Ydieresis -90\nKPX Dcroat comma -70\nKPX Dcroat period -70\nKPX F A -80\nKPX F Aacute -80\nKPX F Abreve -80\nKPX F Acircumflex -80\nKPX F Adieresis -80\nKPX F Agrave -80\nKPX F Amacron -80\nKPX F Aogonek -80\nKPX F Aring -80\nKPX F Atilde -80\nKPX F a -50\nKPX F aacute -50\nKPX F abreve -50\nKPX F acircumflex -50\nKPX F adieresis -50\nKPX F agrave -50\nKPX F amacron -50\nKPX F aogonek -50\nKPX F aring -50\nKPX F atilde -50\nKPX F comma -150\nKPX F e -30\nKPX F eacute -30\nKPX F ecaron -30\nKPX F ecircumflex -30\nKPX F edieresis -30\nKPX F edotaccent -30\nKPX F egrave -30\nKPX F emacron -30\nKPX F eogonek -30\nKPX F o -30\nKPX F oacute -30\nKPX F ocircumflex -30\nKPX F odieresis -30\nKPX F ograve -30\nKPX F ohungarumlaut -30\nKPX F omacron -30\nKPX F oslash -30\nKPX F otilde -30\nKPX F period -150\nKPX F r -45\nKPX F racute -45\nKPX F rcaron -45\nKPX F rcommaaccent -45\nKPX J A -20\nKPX J Aacute -20\nKPX J Abreve -20\nKPX J Acircumflex -20\nKPX J Adieresis -20\nKPX J Agrave -20\nKPX J Amacron -20\nKPX J Aogonek -20\nKPX J Aring -20\nKPX J Atilde -20\nKPX J a -20\nKPX J aacute -20\nKPX J abreve -20\nKPX J acircumflex -20\nKPX J adieresis -20\nKPX J agrave -20\nKPX J amacron -20\nKPX J aogonek -20\nKPX J aring -20\nKPX J atilde -20\nKPX J comma -30\nKPX J period -30\nKPX J u -20\nKPX J uacute -20\nKPX J ucircumflex -20\nKPX J udieresis -20\nKPX J ugrave -20\nKPX J uhungarumlaut -20\nKPX J umacron -20\nKPX J uogonek -20\nKPX J uring -20\nKPX K O -50\nKPX K Oacute -50\nKPX K Ocircumflex -50\nKPX K Odieresis -50\nKPX K Ograve -50\nKPX K Ohungarumlaut -50\nKPX K Omacron -50\nKPX K Oslash -50\nKPX K Otilde -50\nKPX K e -40\nKPX K eacute -40\nKPX K ecaron -40\nKPX K ecircumflex -40\nKPX K edieresis -40\nKPX K edotaccent -40\nKPX K egrave -40\nKPX K emacron -40\nKPX K eogonek -40\nKPX K o -40\nKPX K oacute -40\nKPX K ocircumflex -40\nKPX K odieresis -40\nKPX K ograve -40\nKPX K ohungarumlaut -40\nKPX K omacron -40\nKPX K oslash -40\nKPX K otilde -40\nKPX K u -30\nKPX K uacute -30\nKPX K ucircumflex -30\nKPX K udieresis -30\nKPX K ugrave -30\nKPX K uhungarumlaut -30\nKPX K umacron -30\nKPX K uogonek -30\nKPX K uring -30\nKPX K y -50\nKPX K yacute -50\nKPX K ydieresis -50\nKPX Kcommaaccent O -50\nKPX Kcommaaccent Oacute -50\nKPX Kcommaaccent Ocircumflex -50\nKPX Kcommaaccent Odieresis -50\nKPX Kcommaaccent Ograve -50\nKPX Kcommaaccent Ohungarumlaut -50\nKPX Kcommaaccent Omacron -50\nKPX Kcommaaccent Oslash -50\nKPX Kcommaaccent Otilde -50\nKPX Kcommaaccent e -40\nKPX Kcommaaccent eacute -40\nKPX Kcommaaccent ecaron -40\nKPX Kcommaaccent ecircumflex -40\nKPX Kcommaaccent edieresis -40\nKPX Kcommaaccent edotaccent -40\nKPX Kcommaaccent egrave -40\nKPX Kcommaaccent emacron -40\nKPX Kcommaaccent eogonek -40\nKPX Kcommaaccent o -40\nKPX Kcommaaccent oacute -40\nKPX Kcommaaccent ocircumflex -40\nKPX Kcommaaccent odieresis -40\nKPX Kcommaaccent ograve -40\nKPX Kcommaaccent ohungarumlaut -40\nKPX Kcommaaccent omacron -40\nKPX Kcommaaccent oslash -40\nKPX Kcommaaccent otilde -40\nKPX Kcommaaccent u -30\nKPX Kcommaaccent uacute -30\nKPX Kcommaaccent ucircumflex -30\nKPX Kcommaaccent udieresis -30\nKPX Kcommaaccent ugrave -30\nKPX Kcommaaccent uhungarumlaut -30\nKPX Kcommaaccent umacron -30\nKPX Kcommaaccent uogonek -30\nKPX Kcommaaccent uring -30\nKPX Kcommaaccent y -50\nKPX Kcommaaccent yacute -50\nKPX Kcommaaccent ydieresis -50\nKPX L T -110\nKPX L Tcaron -110\nKPX L Tcommaaccent -110\nKPX L V -110\nKPX L W -70\nKPX L Y -140\nKPX L Yacute -140\nKPX L Ydieresis -140\nKPX L quotedblright -140\nKPX L quoteright -160\nKPX L y -30\nKPX L yacute -30\nKPX L ydieresis -30\nKPX Lacute T -110\nKPX Lacute Tcaron -110\nKPX Lacute Tcommaaccent -110\nKPX Lacute V -110\nKPX Lacute W -70\nKPX Lacute Y -140\nKPX Lacute Yacute -140\nKPX Lacute Ydieresis -140\nKPX Lacute quotedblright -140\nKPX Lacute quoteright -160\nKPX Lacute y -30\nKPX Lacute yacute -30\nKPX Lacute ydieresis -30\nKPX Lcaron T -110\nKPX Lcaron Tcaron -110\nKPX Lcaron Tcommaaccent -110\nKPX Lcaron V -110\nKPX Lcaron W -70\nKPX Lcaron Y -140\nKPX Lcaron Yacute -140\nKPX Lcaron Ydieresis -140\nKPX Lcaron quotedblright -140\nKPX Lcaron quoteright -160\nKPX Lcaron y -30\nKPX Lcaron yacute -30\nKPX Lcaron ydieresis -30\nKPX Lcommaaccent T -110\nKPX Lcommaaccent Tcaron -110\nKPX Lcommaaccent Tcommaaccent -110\nKPX Lcommaaccent V -110\nKPX Lcommaaccent W -70\nKPX Lcommaaccent Y -140\nKPX Lcommaaccent Yacute -140\nKPX Lcommaaccent Ydieresis -140\nKPX Lcommaaccent quotedblright -140\nKPX Lcommaaccent quoteright -160\nKPX Lcommaaccent y -30\nKPX Lcommaaccent yacute -30\nKPX Lcommaaccent ydieresis -30\nKPX Lslash T -110\nKPX Lslash Tcaron -110\nKPX Lslash Tcommaaccent -110\nKPX Lslash V -110\nKPX Lslash W -70\nKPX Lslash Y -140\nKPX Lslash Yacute -140\nKPX Lslash Ydieresis -140\nKPX Lslash quotedblright -140\nKPX Lslash quoteright -160\nKPX Lslash y -30\nKPX Lslash yacute -30\nKPX Lslash ydieresis -30\nKPX O A -20\nKPX O Aacute -20\nKPX O Abreve -20\nKPX O Acircumflex -20\nKPX O Adieresis -20\nKPX O Agrave -20\nKPX O Amacron -20\nKPX O Aogonek -20\nKPX O Aring -20\nKPX O Atilde -20\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -30\nKPX O X -60\nKPX O Y -70\nKPX O Yacute -70\nKPX O Ydieresis -70\nKPX O comma -40\nKPX O period -40\nKPX Oacute A -20\nKPX Oacute Aacute -20\nKPX Oacute Abreve -20\nKPX Oacute Acircumflex -20\nKPX Oacute Adieresis -20\nKPX Oacute Agrave -20\nKPX Oacute Amacron -20\nKPX Oacute Aogonek -20\nKPX Oacute Aring -20\nKPX Oacute Atilde -20\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -30\nKPX Oacute X -60\nKPX Oacute Y -70\nKPX Oacute Yacute -70\nKPX Oacute Ydieresis -70\nKPX Oacute comma -40\nKPX Oacute period -40\nKPX Ocircumflex A -20\nKPX Ocircumflex Aacute -20\nKPX Ocircumflex Abreve -20\nKPX Ocircumflex Acircumflex -20\nKPX Ocircumflex Adieresis -20\nKPX Ocircumflex Agrave -20\nKPX Ocircumflex Amacron -20\nKPX Ocircumflex Aogonek -20\nKPX Ocircumflex Aring -20\nKPX Ocircumflex Atilde -20\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -30\nKPX Ocircumflex X -60\nKPX Ocircumflex Y -70\nKPX Ocircumflex Yacute -70\nKPX Ocircumflex Ydieresis -70\nKPX Ocircumflex comma -40\nKPX Ocircumflex period -40\nKPX Odieresis A -20\nKPX Odieresis Aacute -20\nKPX Odieresis Abreve -20\nKPX Odieresis Acircumflex -20\nKPX Odieresis Adieresis -20\nKPX Odieresis Agrave -20\nKPX Odieresis Amacron -20\nKPX Odieresis Aogonek -20\nKPX Odieresis Aring -20\nKPX Odieresis Atilde -20\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -30\nKPX Odieresis X -60\nKPX Odieresis Y -70\nKPX Odieresis Yacute -70\nKPX Odieresis Ydieresis -70\nKPX Odieresis comma -40\nKPX Odieresis period -40\nKPX Ograve A -20\nKPX Ograve Aacute -20\nKPX Ograve Abreve -20\nKPX Ograve Acircumflex -20\nKPX Ograve Adieresis -20\nKPX Ograve Agrave -20\nKPX Ograve Amacron -20\nKPX Ograve Aogonek -20\nKPX Ograve Aring -20\nKPX Ograve Atilde -20\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -30\nKPX Ograve X -60\nKPX Ograve Y -70\nKPX Ograve Yacute -70\nKPX Ograve Ydieresis -70\nKPX Ograve comma -40\nKPX Ograve period -40\nKPX Ohungarumlaut A -20\nKPX Ohungarumlaut Aacute -20\nKPX Ohungarumlaut Abreve -20\nKPX Ohungarumlaut Acircumflex -20\nKPX Ohungarumlaut Adieresis -20\nKPX Ohungarumlaut Agrave -20\nKPX Ohungarumlaut Amacron -20\nKPX Ohungarumlaut Aogonek -20\nKPX Ohungarumlaut Aring -20\nKPX Ohungarumlaut Atilde -20\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -30\nKPX Ohungarumlaut X -60\nKPX Ohungarumlaut Y -70\nKPX Ohungarumlaut Yacute -70\nKPX Ohungarumlaut Ydieresis -70\nKPX Ohungarumlaut comma -40\nKPX Ohungarumlaut period -40\nKPX Omacron A -20\nKPX Omacron Aacute -20\nKPX Omacron Abreve -20\nKPX Omacron Acircumflex -20\nKPX Omacron Adieresis -20\nKPX Omacron Agrave -20\nKPX Omacron Amacron -20\nKPX Omacron Aogonek -20\nKPX Omacron Aring -20\nKPX Omacron Atilde -20\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -30\nKPX Omacron X -60\nKPX Omacron Y -70\nKPX Omacron Yacute -70\nKPX Omacron Ydieresis -70\nKPX Omacron comma -40\nKPX Omacron period -40\nKPX Oslash A -20\nKPX Oslash Aacute -20\nKPX Oslash Abreve -20\nKPX Oslash Acircumflex -20\nKPX Oslash Adieresis -20\nKPX Oslash Agrave -20\nKPX Oslash Amacron -20\nKPX Oslash Aogonek -20\nKPX Oslash Aring -20\nKPX Oslash Atilde -20\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -30\nKPX Oslash X -60\nKPX Oslash Y -70\nKPX Oslash Yacute -70\nKPX Oslash Ydieresis -70\nKPX Oslash comma -40\nKPX Oslash period -40\nKPX Otilde A -20\nKPX Otilde Aacute -20\nKPX Otilde Abreve -20\nKPX Otilde Acircumflex -20\nKPX Otilde Adieresis -20\nKPX Otilde Agrave -20\nKPX Otilde Amacron -20\nKPX Otilde Aogonek -20\nKPX Otilde Aring -20\nKPX Otilde Atilde -20\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -30\nKPX Otilde X -60\nKPX Otilde Y -70\nKPX Otilde Yacute -70\nKPX Otilde Ydieresis -70\nKPX Otilde comma -40\nKPX Otilde period -40\nKPX P A -120\nKPX P Aacute -120\nKPX P Abreve -120\nKPX P Acircumflex -120\nKPX P Adieresis -120\nKPX P Agrave -120\nKPX P Amacron -120\nKPX P Aogonek -120\nKPX P Aring -120\nKPX P Atilde -120\nKPX P a -40\nKPX P aacute -40\nKPX P abreve -40\nKPX P acircumflex -40\nKPX P adieresis -40\nKPX P agrave -40\nKPX P amacron -40\nKPX P aogonek -40\nKPX P aring -40\nKPX P atilde -40\nKPX P comma -180\nKPX P e -50\nKPX P eacute -50\nKPX P ecaron -50\nKPX P ecircumflex -50\nKPX P edieresis -50\nKPX P edotaccent -50\nKPX P egrave -50\nKPX P emacron -50\nKPX P eogonek -50\nKPX P o -50\nKPX P oacute -50\nKPX P ocircumflex -50\nKPX P odieresis -50\nKPX P ograve -50\nKPX P ohungarumlaut -50\nKPX P omacron -50\nKPX P oslash -50\nKPX P otilde -50\nKPX P period -180\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX R O -20\nKPX R Oacute -20\nKPX R Ocircumflex -20\nKPX R Odieresis -20\nKPX R Ograve -20\nKPX R Ohungarumlaut -20\nKPX R Omacron -20\nKPX R Oslash -20\nKPX R Otilde -20\nKPX R T -30\nKPX R Tcaron -30\nKPX R Tcommaaccent -30\nKPX R U -40\nKPX R Uacute -40\nKPX R Ucircumflex -40\nKPX R Udieresis -40\nKPX R Ugrave -40\nKPX R Uhungarumlaut -40\nKPX R Umacron -40\nKPX R Uogonek -40\nKPX R Uring -40\nKPX R V -50\nKPX R W -30\nKPX R Y -50\nKPX R Yacute -50\nKPX R Ydieresis -50\nKPX Racute O -20\nKPX Racute Oacute -20\nKPX Racute Ocircumflex -20\nKPX Racute Odieresis -20\nKPX Racute Ograve -20\nKPX Racute Ohungarumlaut -20\nKPX Racute Omacron -20\nKPX Racute Oslash -20\nKPX Racute Otilde -20\nKPX Racute T -30\nKPX Racute Tcaron -30\nKPX Racute Tcommaaccent -30\nKPX Racute U -40\nKPX Racute Uacute -40\nKPX Racute Ucircumflex -40\nKPX Racute Udieresis -40\nKPX Racute Ugrave -40\nKPX Racute Uhungarumlaut -40\nKPX Racute Umacron -40\nKPX Racute Uogonek -40\nKPX Racute Uring -40\nKPX Racute V -50\nKPX Racute W -30\nKPX Racute Y -50\nKPX Racute Yacute -50\nKPX Racute Ydieresis -50\nKPX Rcaron O -20\nKPX Rcaron Oacute -20\nKPX Rcaron Ocircumflex -20\nKPX Rcaron Odieresis -20\nKPX Rcaron Ograve -20\nKPX Rcaron Ohungarumlaut -20\nKPX Rcaron Omacron -20\nKPX Rcaron Oslash -20\nKPX Rcaron Otilde -20\nKPX Rcaron T -30\nKPX Rcaron Tcaron -30\nKPX Rcaron Tcommaaccent -30\nKPX Rcaron U -40\nKPX Rcaron Uacute -40\nKPX Rcaron Ucircumflex -40\nKPX Rcaron Udieresis -40\nKPX Rcaron Ugrave -40\nKPX Rcaron Uhungarumlaut -40\nKPX Rcaron Umacron -40\nKPX Rcaron Uogonek -40\nKPX Rcaron Uring -40\nKPX Rcaron V -50\nKPX Rcaron W -30\nKPX Rcaron Y -50\nKPX Rcaron Yacute -50\nKPX Rcaron Ydieresis -50\nKPX Rcommaaccent O -20\nKPX Rcommaaccent Oacute -20\nKPX Rcommaaccent Ocircumflex -20\nKPX Rcommaaccent Odieresis -20\nKPX Rcommaaccent Ograve -20\nKPX Rcommaaccent Ohungarumlaut -20\nKPX Rcommaaccent Omacron -20\nKPX Rcommaaccent Oslash -20\nKPX Rcommaaccent Otilde -20\nKPX Rcommaaccent T -30\nKPX Rcommaaccent Tcaron -30\nKPX Rcommaaccent Tcommaaccent -30\nKPX Rcommaaccent U -40\nKPX Rcommaaccent Uacute -40\nKPX Rcommaaccent Ucircumflex -40\nKPX Rcommaaccent Udieresis -40\nKPX Rcommaaccent Ugrave -40\nKPX Rcommaaccent Uhungarumlaut -40\nKPX Rcommaaccent Umacron -40\nKPX Rcommaaccent Uogonek -40\nKPX Rcommaaccent Uring -40\nKPX Rcommaaccent V -50\nKPX Rcommaaccent W -30\nKPX Rcommaaccent Y -50\nKPX Rcommaaccent Yacute -50\nKPX Rcommaaccent Ydieresis -50\nKPX S comma -20\nKPX S period -20\nKPX Sacute comma -20\nKPX Sacute period -20\nKPX Scaron comma -20\nKPX Scaron period -20\nKPX Scedilla comma -20\nKPX Scedilla period -20\nKPX Scommaaccent comma -20\nKPX Scommaaccent period -20\nKPX T A -120\nKPX T Aacute -120\nKPX T Abreve -120\nKPX T Acircumflex -120\nKPX T Adieresis -120\nKPX T Agrave -120\nKPX T Amacron -120\nKPX T Aogonek -120\nKPX T Aring -120\nKPX T Atilde -120\nKPX T O -40\nKPX T Oacute -40\nKPX T Ocircumflex -40\nKPX T Odieresis -40\nKPX T Ograve -40\nKPX T Ohungarumlaut -40\nKPX T Omacron -40\nKPX T Oslash -40\nKPX T Otilde -40\nKPX T a -120\nKPX T aacute -120\nKPX T abreve -60\nKPX T acircumflex -120\nKPX T adieresis -120\nKPX T agrave -120\nKPX T amacron -60\nKPX T aogonek -120\nKPX T aring -120\nKPX T atilde -60\nKPX T colon -20\nKPX T comma -120\nKPX T e -120\nKPX T eacute -120\nKPX T ecaron -120\nKPX T ecircumflex -120\nKPX T edieresis -120\nKPX T edotaccent -120\nKPX T egrave -60\nKPX T emacron -60\nKPX T eogonek -120\nKPX T hyphen -140\nKPX T o -120\nKPX T oacute -120\nKPX T ocircumflex -120\nKPX T odieresis -120\nKPX T ograve -120\nKPX T ohungarumlaut -120\nKPX T omacron -60\nKPX T oslash -120\nKPX T otilde -60\nKPX T period -120\nKPX T r -120\nKPX T racute -120\nKPX T rcaron -120\nKPX T rcommaaccent -120\nKPX T semicolon -20\nKPX T u -120\nKPX T uacute -120\nKPX T ucircumflex -120\nKPX T udieresis -120\nKPX T ugrave -120\nKPX T uhungarumlaut -120\nKPX T umacron -60\nKPX T uogonek -120\nKPX T uring -120\nKPX T w -120\nKPX T y -120\nKPX T yacute -120\nKPX T ydieresis -60\nKPX Tcaron A -120\nKPX Tcaron Aacute -120\nKPX Tcaron Abreve -120\nKPX Tcaron Acircumflex -120\nKPX Tcaron Adieresis -120\nKPX Tcaron Agrave -120\nKPX Tcaron Amacron -120\nKPX Tcaron Aogonek -120\nKPX Tcaron Aring -120\nKPX Tcaron Atilde -120\nKPX Tcaron O -40\nKPX Tcaron Oacute -40\nKPX Tcaron Ocircumflex -40\nKPX Tcaron Odieresis -40\nKPX Tcaron Ograve -40\nKPX Tcaron Ohungarumlaut -40\nKPX Tcaron Omacron -40\nKPX Tcaron Oslash -40\nKPX Tcaron Otilde -40\nKPX Tcaron a -120\nKPX Tcaron aacute -120\nKPX Tcaron abreve -60\nKPX Tcaron acircumflex -120\nKPX Tcaron adieresis -120\nKPX Tcaron agrave -120\nKPX Tcaron amacron -60\nKPX Tcaron aogonek -120\nKPX Tcaron aring -120\nKPX Tcaron atilde -60\nKPX Tcaron colon -20\nKPX Tcaron comma -120\nKPX Tcaron e -120\nKPX Tcaron eacute -120\nKPX Tcaron ecaron -120\nKPX Tcaron ecircumflex -120\nKPX Tcaron edieresis -120\nKPX Tcaron edotaccent -120\nKPX Tcaron egrave -60\nKPX Tcaron emacron -60\nKPX Tcaron eogonek -120\nKPX Tcaron hyphen -140\nKPX Tcaron o -120\nKPX Tcaron oacute -120\nKPX Tcaron ocircumflex -120\nKPX Tcaron odieresis -120\nKPX Tcaron ograve -120\nKPX Tcaron ohungarumlaut -120\nKPX Tcaron omacron -60\nKPX Tcaron oslash -120\nKPX Tcaron otilde -60\nKPX Tcaron period -120\nKPX Tcaron r -120\nKPX Tcaron racute -120\nKPX Tcaron rcaron -120\nKPX Tcaron rcommaaccent -120\nKPX Tcaron semicolon -20\nKPX Tcaron u -120\nKPX Tcaron uacute -120\nKPX Tcaron ucircumflex -120\nKPX Tcaron udieresis -120\nKPX Tcaron ugrave -120\nKPX Tcaron uhungarumlaut -120\nKPX Tcaron umacron -60\nKPX Tcaron uogonek -120\nKPX Tcaron uring -120\nKPX Tcaron w -120\nKPX Tcaron y -120\nKPX Tcaron yacute -120\nKPX Tcaron ydieresis -60\nKPX Tcommaaccent A -120\nKPX Tcommaaccent Aacute -120\nKPX Tcommaaccent Abreve -120\nKPX Tcommaaccent Acircumflex -120\nKPX Tcommaaccent Adieresis -120\nKPX Tcommaaccent Agrave -120\nKPX Tcommaaccent Amacron -120\nKPX Tcommaaccent Aogonek -120\nKPX Tcommaaccent Aring -120\nKPX Tcommaaccent Atilde -120\nKPX Tcommaaccent O -40\nKPX Tcommaaccent Oacute -40\nKPX Tcommaaccent Ocircumflex -40\nKPX Tcommaaccent Odieresis -40\nKPX Tcommaaccent Ograve -40\nKPX Tcommaaccent Ohungarumlaut -40\nKPX Tcommaaccent Omacron -40\nKPX Tcommaaccent Oslash -40\nKPX Tcommaaccent Otilde -40\nKPX Tcommaaccent a -120\nKPX Tcommaaccent aacute -120\nKPX Tcommaaccent abreve -60\nKPX Tcommaaccent acircumflex -120\nKPX Tcommaaccent adieresis -120\nKPX Tcommaaccent agrave -120\nKPX Tcommaaccent amacron -60\nKPX Tcommaaccent aogonek -120\nKPX Tcommaaccent aring -120\nKPX Tcommaaccent atilde -60\nKPX Tcommaaccent colon -20\nKPX Tcommaaccent comma -120\nKPX Tcommaaccent e -120\nKPX Tcommaaccent eacute -120\nKPX Tcommaaccent ecaron -120\nKPX Tcommaaccent ecircumflex -120\nKPX Tcommaaccent edieresis -120\nKPX Tcommaaccent edotaccent -120\nKPX Tcommaaccent egrave -60\nKPX Tcommaaccent emacron -60\nKPX Tcommaaccent eogonek -120\nKPX Tcommaaccent hyphen -140\nKPX Tcommaaccent o -120\nKPX Tcommaaccent oacute -120\nKPX Tcommaaccent ocircumflex -120\nKPX Tcommaaccent odieresis -120\nKPX Tcommaaccent ograve -120\nKPX Tcommaaccent ohungarumlaut -120\nKPX Tcommaaccent omacron -60\nKPX Tcommaaccent oslash -120\nKPX Tcommaaccent otilde -60\nKPX Tcommaaccent period -120\nKPX Tcommaaccent r -120\nKPX Tcommaaccent racute -120\nKPX Tcommaaccent rcaron -120\nKPX Tcommaaccent rcommaaccent -120\nKPX Tcommaaccent semicolon -20\nKPX Tcommaaccent u -120\nKPX Tcommaaccent uacute -120\nKPX Tcommaaccent ucircumflex -120\nKPX Tcommaaccent udieresis -120\nKPX Tcommaaccent ugrave -120\nKPX Tcommaaccent uhungarumlaut -120\nKPX Tcommaaccent umacron -60\nKPX Tcommaaccent uogonek -120\nKPX Tcommaaccent uring -120\nKPX Tcommaaccent w -120\nKPX Tcommaaccent y -120\nKPX Tcommaaccent yacute -120\nKPX Tcommaaccent ydieresis -60\nKPX U A -40\nKPX U Aacute -40\nKPX U Abreve -40\nKPX U Acircumflex -40\nKPX U Adieresis -40\nKPX U Agrave -40\nKPX U Amacron -40\nKPX U Aogonek -40\nKPX U Aring -40\nKPX U Atilde -40\nKPX U comma -40\nKPX U period -40\nKPX Uacute A -40\nKPX Uacute Aacute -40\nKPX Uacute Abreve -40\nKPX Uacute Acircumflex -40\nKPX Uacute Adieresis -40\nKPX Uacute Agrave -40\nKPX Uacute Amacron -40\nKPX Uacute Aogonek -40\nKPX Uacute Aring -40\nKPX Uacute Atilde -40\nKPX Uacute comma -40\nKPX Uacute period -40\nKPX Ucircumflex A -40\nKPX Ucircumflex Aacute -40\nKPX Ucircumflex Abreve -40\nKPX Ucircumflex Acircumflex -40\nKPX Ucircumflex Adieresis -40\nKPX Ucircumflex Agrave -40\nKPX Ucircumflex Amacron -40\nKPX Ucircumflex Aogonek -40\nKPX Ucircumflex Aring -40\nKPX Ucircumflex Atilde -40\nKPX Ucircumflex comma -40\nKPX Ucircumflex period -40\nKPX Udieresis A -40\nKPX Udieresis Aacute -40\nKPX Udieresis Abreve -40\nKPX Udieresis Acircumflex -40\nKPX Udieresis Adieresis -40\nKPX Udieresis Agrave -40\nKPX Udieresis Amacron -40\nKPX Udieresis Aogonek -40\nKPX Udieresis Aring -40\nKPX Udieresis Atilde -40\nKPX Udieresis comma -40\nKPX Udieresis period -40\nKPX Ugrave A -40\nKPX Ugrave Aacute -40\nKPX Ugrave Abreve -40\nKPX Ugrave Acircumflex -40\nKPX Ugrave Adieresis -40\nKPX Ugrave Agrave -40\nKPX Ugrave Amacron -40\nKPX Ugrave Aogonek -40\nKPX Ugrave Aring -40\nKPX Ugrave Atilde -40\nKPX Ugrave comma -40\nKPX Ugrave period -40\nKPX Uhungarumlaut A -40\nKPX Uhungarumlaut Aacute -40\nKPX Uhungarumlaut Abreve -40\nKPX Uhungarumlaut Acircumflex -40\nKPX Uhungarumlaut Adieresis -40\nKPX Uhungarumlaut Agrave -40\nKPX Uhungarumlaut Amacron -40\nKPX Uhungarumlaut Aogonek -40\nKPX Uhungarumlaut Aring -40\nKPX Uhungarumlaut Atilde -40\nKPX Uhungarumlaut comma -40\nKPX Uhungarumlaut period -40\nKPX Umacron A -40\nKPX Umacron Aacute -40\nKPX Umacron Abreve -40\nKPX Umacron Acircumflex -40\nKPX Umacron Adieresis -40\nKPX Umacron Agrave -40\nKPX Umacron Amacron -40\nKPX Umacron Aogonek -40\nKPX Umacron Aring -40\nKPX Umacron Atilde -40\nKPX Umacron comma -40\nKPX Umacron period -40\nKPX Uogonek A -40\nKPX Uogonek Aacute -40\nKPX Uogonek Abreve -40\nKPX Uogonek Acircumflex -40\nKPX Uogonek Adieresis -40\nKPX Uogonek Agrave -40\nKPX Uogonek Amacron -40\nKPX Uogonek Aogonek -40\nKPX Uogonek Aring -40\nKPX Uogonek Atilde -40\nKPX Uogonek comma -40\nKPX Uogonek period -40\nKPX Uring A -40\nKPX Uring Aacute -40\nKPX Uring Abreve -40\nKPX Uring Acircumflex -40\nKPX Uring Adieresis -40\nKPX Uring Agrave -40\nKPX Uring Amacron -40\nKPX Uring Aogonek -40\nKPX Uring Aring -40\nKPX Uring Atilde -40\nKPX Uring comma -40\nKPX Uring period -40\nKPX V A -80\nKPX V Aacute -80\nKPX V Abreve -80\nKPX V Acircumflex -80\nKPX V Adieresis -80\nKPX V Agrave -80\nKPX V Amacron -80\nKPX V Aogonek -80\nKPX V Aring -80\nKPX V Atilde -80\nKPX V G -40\nKPX V Gbreve -40\nKPX V Gcommaaccent -40\nKPX V O -40\nKPX V Oacute -40\nKPX V Ocircumflex -40\nKPX V Odieresis -40\nKPX V Ograve -40\nKPX V Ohungarumlaut -40\nKPX V Omacron -40\nKPX V Oslash -40\nKPX V Otilde -40\nKPX V a -70\nKPX V aacute -70\nKPX V abreve -70\nKPX V acircumflex -70\nKPX V adieresis -70\nKPX V agrave -70\nKPX V amacron -70\nKPX V aogonek -70\nKPX V aring -70\nKPX V atilde -70\nKPX V colon -40\nKPX V comma -125\nKPX V e -80\nKPX V eacute -80\nKPX V ecaron -80\nKPX V ecircumflex -80\nKPX V edieresis -80\nKPX V edotaccent -80\nKPX V egrave -80\nKPX V emacron -80\nKPX V eogonek -80\nKPX V hyphen -80\nKPX V o -80\nKPX V oacute -80\nKPX V ocircumflex -80\nKPX V odieresis -80\nKPX V ograve -80\nKPX V ohungarumlaut -80\nKPX V omacron -80\nKPX V oslash -80\nKPX V otilde -80\nKPX V period -125\nKPX V semicolon -40\nKPX V u -70\nKPX V uacute -70\nKPX V ucircumflex -70\nKPX V udieresis -70\nKPX V ugrave -70\nKPX V uhungarumlaut -70\nKPX V umacron -70\nKPX V uogonek -70\nKPX V uring -70\nKPX W A -50\nKPX W Aacute -50\nKPX W Abreve -50\nKPX W Acircumflex -50\nKPX W Adieresis -50\nKPX W Agrave -50\nKPX W Amacron -50\nKPX W Aogonek -50\nKPX W Aring -50\nKPX W Atilde -50\nKPX W O -20\nKPX W Oacute -20\nKPX W Ocircumflex -20\nKPX W Odieresis -20\nKPX W Ograve -20\nKPX W Ohungarumlaut -20\nKPX W Omacron -20\nKPX W Oslash -20\nKPX W Otilde -20\nKPX W a -40\nKPX W aacute -40\nKPX W abreve -40\nKPX W acircumflex -40\nKPX W adieresis -40\nKPX W agrave -40\nKPX W amacron -40\nKPX W aogonek -40\nKPX W aring -40\nKPX W atilde -40\nKPX W comma -80\nKPX W e -30\nKPX W eacute -30\nKPX W ecaron -30\nKPX W ecircumflex -30\nKPX W edieresis -30\nKPX W edotaccent -30\nKPX W egrave -30\nKPX W emacron -30\nKPX W eogonek -30\nKPX W hyphen -40\nKPX W o -30\nKPX W oacute -30\nKPX W ocircumflex -30\nKPX W odieresis -30\nKPX W ograve -30\nKPX W ohungarumlaut -30\nKPX W omacron -30\nKPX W oslash -30\nKPX W otilde -30\nKPX W period -80\nKPX W u -30\nKPX W uacute -30\nKPX W ucircumflex -30\nKPX W udieresis -30\nKPX W ugrave -30\nKPX W uhungarumlaut -30\nKPX W umacron -30\nKPX W uogonek -30\nKPX W uring -30\nKPX W y -20\nKPX W yacute -20\nKPX W ydieresis -20\nKPX Y A -110\nKPX Y Aacute -110\nKPX Y Abreve -110\nKPX Y Acircumflex -110\nKPX Y Adieresis -110\nKPX Y Agrave -110\nKPX Y Amacron -110\nKPX Y Aogonek -110\nKPX Y Aring -110\nKPX Y Atilde -110\nKPX Y O -85\nKPX Y Oacute -85\nKPX Y Ocircumflex -85\nKPX Y Odieresis -85\nKPX Y Ograve -85\nKPX Y Ohungarumlaut -85\nKPX Y Omacron -85\nKPX Y Oslash -85\nKPX Y Otilde -85\nKPX Y a -140\nKPX Y aacute -140\nKPX Y abreve -70\nKPX Y acircumflex -140\nKPX Y adieresis -140\nKPX Y agrave -140\nKPX Y amacron -70\nKPX Y aogonek -140\nKPX Y aring -140\nKPX Y atilde -140\nKPX Y colon -60\nKPX Y comma -140\nKPX Y e -140\nKPX Y eacute -140\nKPX Y ecaron -140\nKPX Y ecircumflex -140\nKPX Y edieresis -140\nKPX Y edotaccent -140\nKPX Y egrave -140\nKPX Y emacron -70\nKPX Y eogonek -140\nKPX Y hyphen -140\nKPX Y i -20\nKPX Y iacute -20\nKPX Y iogonek -20\nKPX Y o -140\nKPX Y oacute -140\nKPX Y ocircumflex -140\nKPX Y odieresis -140\nKPX Y ograve -140\nKPX Y ohungarumlaut -140\nKPX Y omacron -140\nKPX Y oslash -140\nKPX Y otilde -140\nKPX Y period -140\nKPX Y semicolon -60\nKPX Y u -110\nKPX Y uacute -110\nKPX Y ucircumflex -110\nKPX Y udieresis -110\nKPX Y ugrave -110\nKPX Y uhungarumlaut -110\nKPX Y umacron -110\nKPX Y uogonek -110\nKPX Y uring -110\nKPX Yacute A -110\nKPX Yacute Aacute -110\nKPX Yacute Abreve -110\nKPX Yacute Acircumflex -110\nKPX Yacute Adieresis -110\nKPX Yacute Agrave -110\nKPX Yacute Amacron -110\nKPX Yacute Aogonek -110\nKPX Yacute Aring -110\nKPX Yacute Atilde -110\nKPX Yacute O -85\nKPX Yacute Oacute -85\nKPX Yacute Ocircumflex -85\nKPX Yacute Odieresis -85\nKPX Yacute Ograve -85\nKPX Yacute Ohungarumlaut -85\nKPX Yacute Omacron -85\nKPX Yacute Oslash -85\nKPX Yacute Otilde -85\nKPX Yacute a -140\nKPX Yacute aacute -140\nKPX Yacute abreve -70\nKPX Yacute acircumflex -140\nKPX Yacute adieresis -140\nKPX Yacute agrave -140\nKPX Yacute amacron -70\nKPX Yacute aogonek -140\nKPX Yacute aring -140\nKPX Yacute atilde -70\nKPX Yacute colon -60\nKPX Yacute comma -140\nKPX Yacute e -140\nKPX Yacute eacute -140\nKPX Yacute ecaron -140\nKPX Yacute ecircumflex -140\nKPX Yacute edieresis -140\nKPX Yacute edotaccent -140\nKPX Yacute egrave -140\nKPX Yacute emacron -70\nKPX Yacute eogonek -140\nKPX Yacute hyphen -140\nKPX Yacute i -20\nKPX Yacute iacute -20\nKPX Yacute iogonek -20\nKPX Yacute o -140\nKPX Yacute oacute -140\nKPX Yacute ocircumflex -140\nKPX Yacute odieresis -140\nKPX Yacute ograve -140\nKPX Yacute ohungarumlaut -140\nKPX Yacute omacron -70\nKPX Yacute oslash -140\nKPX Yacute otilde -140\nKPX Yacute period -140\nKPX Yacute semicolon -60\nKPX Yacute u -110\nKPX Yacute uacute -110\nKPX Yacute ucircumflex -110\nKPX Yacute udieresis -110\nKPX Yacute ugrave -110\nKPX Yacute uhungarumlaut -110\nKPX Yacute umacron -110\nKPX Yacute uogonek -110\nKPX Yacute uring -110\nKPX Ydieresis A -110\nKPX Ydieresis Aacute -110\nKPX Ydieresis Abreve -110\nKPX Ydieresis Acircumflex -110\nKPX Ydieresis Adieresis -110\nKPX Ydieresis Agrave -110\nKPX Ydieresis Amacron -110\nKPX Ydieresis Aogonek -110\nKPX Ydieresis Aring -110\nKPX Ydieresis Atilde -110\nKPX Ydieresis O -85\nKPX Ydieresis Oacute -85\nKPX Ydieresis Ocircumflex -85\nKPX Ydieresis Odieresis -85\nKPX Ydieresis Ograve -85\nKPX Ydieresis Ohungarumlaut -85\nKPX Ydieresis Omacron -85\nKPX Ydieresis Oslash -85\nKPX Ydieresis Otilde -85\nKPX Ydieresis a -140\nKPX Ydieresis aacute -140\nKPX Ydieresis abreve -70\nKPX Ydieresis acircumflex -140\nKPX Ydieresis adieresis -140\nKPX Ydieresis agrave -140\nKPX Ydieresis amacron -70\nKPX Ydieresis aogonek -140\nKPX Ydieresis aring -140\nKPX Ydieresis atilde -70\nKPX Ydieresis colon -60\nKPX Ydieresis comma -140\nKPX Ydieresis e -140\nKPX Ydieresis eacute -140\nKPX Ydieresis ecaron -140\nKPX Ydieresis ecircumflex -140\nKPX Ydieresis edieresis -140\nKPX Ydieresis edotaccent -140\nKPX Ydieresis egrave -140\nKPX Ydieresis emacron -70\nKPX Ydieresis eogonek -140\nKPX Ydieresis hyphen -140\nKPX Ydieresis i -20\nKPX Ydieresis iacute -20\nKPX Ydieresis iogonek -20\nKPX Ydieresis o -140\nKPX Ydieresis oacute -140\nKPX Ydieresis ocircumflex -140\nKPX Ydieresis odieresis -140\nKPX Ydieresis ograve -140\nKPX Ydieresis ohungarumlaut -140\nKPX Ydieresis omacron -140\nKPX Ydieresis oslash -140\nKPX Ydieresis otilde -140\nKPX Ydieresis period -140\nKPX Ydieresis semicolon -60\nKPX Ydieresis u -110\nKPX Ydieresis uacute -110\nKPX Ydieresis ucircumflex -110\nKPX Ydieresis udieresis -110\nKPX Ydieresis ugrave -110\nKPX Ydieresis uhungarumlaut -110\nKPX Ydieresis umacron -110\nKPX Ydieresis uogonek -110\nKPX Ydieresis uring -110\nKPX a v -20\nKPX a w -20\nKPX a y -30\nKPX a yacute -30\nKPX a ydieresis -30\nKPX aacute v -20\nKPX aacute w -20\nKPX aacute y -30\nKPX aacute yacute -30\nKPX aacute ydieresis -30\nKPX abreve v -20\nKPX abreve w -20\nKPX abreve y -30\nKPX abreve yacute -30\nKPX abreve ydieresis -30\nKPX acircumflex v -20\nKPX acircumflex w -20\nKPX acircumflex y -30\nKPX acircumflex yacute -30\nKPX acircumflex ydieresis -30\nKPX adieresis v -20\nKPX adieresis w -20\nKPX adieresis y -30\nKPX adieresis yacute -30\nKPX adieresis ydieresis -30\nKPX agrave v -20\nKPX agrave w -20\nKPX agrave y -30\nKPX agrave yacute -30\nKPX agrave ydieresis -30\nKPX amacron v -20\nKPX amacron w -20\nKPX amacron y -30\nKPX amacron yacute -30\nKPX amacron ydieresis -30\nKPX aogonek v -20\nKPX aogonek w -20\nKPX aogonek y -30\nKPX aogonek yacute -30\nKPX aogonek ydieresis -30\nKPX aring v -20\nKPX aring w -20\nKPX aring y -30\nKPX aring yacute -30\nKPX aring ydieresis -30\nKPX atilde v -20\nKPX atilde w -20\nKPX atilde y -30\nKPX atilde yacute -30\nKPX atilde ydieresis -30\nKPX b b -10\nKPX b comma -40\nKPX b l -20\nKPX b lacute -20\nKPX b lcommaaccent -20\nKPX b lslash -20\nKPX b period -40\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX b v -20\nKPX b y -20\nKPX b yacute -20\nKPX b ydieresis -20\nKPX c comma -15\nKPX c k -20\nKPX c kcommaaccent -20\nKPX cacute comma -15\nKPX cacute k -20\nKPX cacute kcommaaccent -20\nKPX ccaron comma -15\nKPX ccaron k -20\nKPX ccaron kcommaaccent -20\nKPX ccedilla comma -15\nKPX ccedilla k -20\nKPX ccedilla kcommaaccent -20\nKPX colon space -50\nKPX comma quotedblright -100\nKPX comma quoteright -100\nKPX e comma -15\nKPX e period -15\nKPX e v -30\nKPX e w -20\nKPX e x -30\nKPX e y -20\nKPX e yacute -20\nKPX e ydieresis -20\nKPX eacute comma -15\nKPX eacute period -15\nKPX eacute v -30\nKPX eacute w -20\nKPX eacute x -30\nKPX eacute y -20\nKPX eacute yacute -20\nKPX eacute ydieresis -20\nKPX ecaron comma -15\nKPX ecaron period -15\nKPX ecaron v -30\nKPX ecaron w -20\nKPX ecaron x -30\nKPX ecaron y -20\nKPX ecaron yacute -20\nKPX ecaron ydieresis -20\nKPX ecircumflex comma -15\nKPX ecircumflex period -15\nKPX ecircumflex v -30\nKPX ecircumflex w -20\nKPX ecircumflex x -30\nKPX ecircumflex y -20\nKPX ecircumflex yacute -20\nKPX ecircumflex ydieresis -20\nKPX edieresis comma -15\nKPX edieresis period -15\nKPX edieresis v -30\nKPX edieresis w -20\nKPX edieresis x -30\nKPX edieresis y -20\nKPX edieresis yacute -20\nKPX edieresis ydieresis -20\nKPX edotaccent comma -15\nKPX edotaccent period -15\nKPX edotaccent v -30\nKPX edotaccent w -20\nKPX edotaccent x -30\nKPX edotaccent y -20\nKPX edotaccent yacute -20\nKPX edotaccent ydieresis -20\nKPX egrave comma -15\nKPX egrave period -15\nKPX egrave v -30\nKPX egrave w -20\nKPX egrave x -30\nKPX egrave y -20\nKPX egrave yacute -20\nKPX egrave ydieresis -20\nKPX emacron comma -15\nKPX emacron period -15\nKPX emacron v -30\nKPX emacron w -20\nKPX emacron x -30\nKPX emacron y -20\nKPX emacron yacute -20\nKPX emacron ydieresis -20\nKPX eogonek comma -15\nKPX eogonek period -15\nKPX eogonek v -30\nKPX eogonek w -20\nKPX eogonek x -30\nKPX eogonek y -20\nKPX eogonek yacute -20\nKPX eogonek ydieresis -20\nKPX f a -30\nKPX f aacute -30\nKPX f abreve -30\nKPX f acircumflex -30\nKPX f adieresis -30\nKPX f agrave -30\nKPX f amacron -30\nKPX f aogonek -30\nKPX f aring -30\nKPX f atilde -30\nKPX f comma -30\nKPX f dotlessi -28\nKPX f e -30\nKPX f eacute -30\nKPX f ecaron -30\nKPX f ecircumflex -30\nKPX f edieresis -30\nKPX f edotaccent -30\nKPX f egrave -30\nKPX f emacron -30\nKPX f eogonek -30\nKPX f o -30\nKPX f oacute -30\nKPX f ocircumflex -30\nKPX f odieresis -30\nKPX f ograve -30\nKPX f ohungarumlaut -30\nKPX f omacron -30\nKPX f oslash -30\nKPX f otilde -30\nKPX f period -30\nKPX f quotedblright 60\nKPX f quoteright 50\nKPX g r -10\nKPX g racute -10\nKPX g rcaron -10\nKPX g rcommaaccent -10\nKPX gbreve r -10\nKPX gbreve racute -10\nKPX gbreve rcaron -10\nKPX gbreve rcommaaccent -10\nKPX gcommaaccent r -10\nKPX gcommaaccent racute -10\nKPX gcommaaccent rcaron -10\nKPX gcommaaccent rcommaaccent -10\nKPX h y -30\nKPX h yacute -30\nKPX h ydieresis -30\nKPX k e -20\nKPX k eacute -20\nKPX k ecaron -20\nKPX k ecircumflex -20\nKPX k edieresis -20\nKPX k edotaccent -20\nKPX k egrave -20\nKPX k emacron -20\nKPX k eogonek -20\nKPX k o -20\nKPX k oacute -20\nKPX k ocircumflex -20\nKPX k odieresis -20\nKPX k ograve -20\nKPX k ohungarumlaut -20\nKPX k omacron -20\nKPX k oslash -20\nKPX k otilde -20\nKPX kcommaaccent e -20\nKPX kcommaaccent eacute -20\nKPX kcommaaccent ecaron -20\nKPX kcommaaccent ecircumflex -20\nKPX kcommaaccent edieresis -20\nKPX kcommaaccent edotaccent -20\nKPX kcommaaccent egrave -20\nKPX kcommaaccent emacron -20\nKPX kcommaaccent eogonek -20\nKPX kcommaaccent o -20\nKPX kcommaaccent oacute -20\nKPX kcommaaccent ocircumflex -20\nKPX kcommaaccent odieresis -20\nKPX kcommaaccent ograve -20\nKPX kcommaaccent ohungarumlaut -20\nKPX kcommaaccent omacron -20\nKPX kcommaaccent oslash -20\nKPX kcommaaccent otilde -20\nKPX m u -10\nKPX m uacute -10\nKPX m ucircumflex -10\nKPX m udieresis -10\nKPX m ugrave -10\nKPX m uhungarumlaut -10\nKPX m umacron -10\nKPX m uogonek -10\nKPX m uring -10\nKPX m y -15\nKPX m yacute -15\nKPX m ydieresis -15\nKPX n u -10\nKPX n uacute -10\nKPX n ucircumflex -10\nKPX n udieresis -10\nKPX n ugrave -10\nKPX n uhungarumlaut -10\nKPX n umacron -10\nKPX n uogonek -10\nKPX n uring -10\nKPX n v -20\nKPX n y -15\nKPX n yacute -15\nKPX n ydieresis -15\nKPX nacute u -10\nKPX nacute uacute -10\nKPX nacute ucircumflex -10\nKPX nacute udieresis -10\nKPX nacute ugrave -10\nKPX nacute uhungarumlaut -10\nKPX nacute umacron -10\nKPX nacute uogonek -10\nKPX nacute uring -10\nKPX nacute v -20\nKPX nacute y -15\nKPX nacute yacute -15\nKPX nacute ydieresis -15\nKPX ncaron u -10\nKPX ncaron uacute -10\nKPX ncaron ucircumflex -10\nKPX ncaron udieresis -10\nKPX ncaron ugrave -10\nKPX ncaron uhungarumlaut -10\nKPX ncaron umacron -10\nKPX ncaron uogonek -10\nKPX ncaron uring -10\nKPX ncaron v -20\nKPX ncaron y -15\nKPX ncaron yacute -15\nKPX ncaron ydieresis -15\nKPX ncommaaccent u -10\nKPX ncommaaccent uacute -10\nKPX ncommaaccent ucircumflex -10\nKPX ncommaaccent udieresis -10\nKPX ncommaaccent ugrave -10\nKPX ncommaaccent uhungarumlaut -10\nKPX ncommaaccent umacron -10\nKPX ncommaaccent uogonek -10\nKPX ncommaaccent uring -10\nKPX ncommaaccent v -20\nKPX ncommaaccent y -15\nKPX ncommaaccent yacute -15\nKPX ncommaaccent ydieresis -15\nKPX ntilde u -10\nKPX ntilde uacute -10\nKPX ntilde ucircumflex -10\nKPX ntilde udieresis -10\nKPX ntilde ugrave -10\nKPX ntilde uhungarumlaut -10\nKPX ntilde umacron -10\nKPX ntilde uogonek -10\nKPX ntilde uring -10\nKPX ntilde v -20\nKPX ntilde y -15\nKPX ntilde yacute -15\nKPX ntilde ydieresis -15\nKPX o comma -40\nKPX o period -40\nKPX o v -15\nKPX o w -15\nKPX o x -30\nKPX o y -30\nKPX o yacute -30\nKPX o ydieresis -30\nKPX oacute comma -40\nKPX oacute period -40\nKPX oacute v -15\nKPX oacute w -15\nKPX oacute x -30\nKPX oacute y -30\nKPX oacute yacute -30\nKPX oacute ydieresis -30\nKPX ocircumflex comma -40\nKPX ocircumflex period -40\nKPX ocircumflex v -15\nKPX ocircumflex w -15\nKPX ocircumflex x -30\nKPX ocircumflex y -30\nKPX ocircumflex yacute -30\nKPX ocircumflex ydieresis -30\nKPX odieresis comma -40\nKPX odieresis period -40\nKPX odieresis v -15\nKPX odieresis w -15\nKPX odieresis x -30\nKPX odieresis y -30\nKPX odieresis yacute -30\nKPX odieresis ydieresis -30\nKPX ograve comma -40\nKPX ograve period -40\nKPX ograve v -15\nKPX ograve w -15\nKPX ograve x -30\nKPX ograve y -30\nKPX ograve yacute -30\nKPX ograve ydieresis -30\nKPX ohungarumlaut comma -40\nKPX ohungarumlaut period -40\nKPX ohungarumlaut v -15\nKPX ohungarumlaut w -15\nKPX ohungarumlaut x -30\nKPX ohungarumlaut y -30\nKPX ohungarumlaut yacute -30\nKPX ohungarumlaut ydieresis -30\nKPX omacron comma -40\nKPX omacron period -40\nKPX omacron v -15\nKPX omacron w -15\nKPX omacron x -30\nKPX omacron y -30\nKPX omacron yacute -30\nKPX omacron ydieresis -30\nKPX oslash a -55\nKPX oslash aacute -55\nKPX oslash abreve -55\nKPX oslash acircumflex -55\nKPX oslash adieresis -55\nKPX oslash agrave -55\nKPX oslash amacron -55\nKPX oslash aogonek -55\nKPX oslash aring -55\nKPX oslash atilde -55\nKPX oslash b -55\nKPX oslash c -55\nKPX oslash cacute -55\nKPX oslash ccaron -55\nKPX oslash ccedilla -55\nKPX oslash comma -95\nKPX oslash d -55\nKPX oslash dcroat -55\nKPX oslash e -55\nKPX oslash eacute -55\nKPX oslash ecaron -55\nKPX oslash ecircumflex -55\nKPX oslash edieresis -55\nKPX oslash edotaccent -55\nKPX oslash egrave -55\nKPX oslash emacron -55\nKPX oslash eogonek -55\nKPX oslash f -55\nKPX oslash g -55\nKPX oslash gbreve -55\nKPX oslash gcommaaccent -55\nKPX oslash h -55\nKPX oslash i -55\nKPX oslash iacute -55\nKPX oslash icircumflex -55\nKPX oslash idieresis -55\nKPX oslash igrave -55\nKPX oslash imacron -55\nKPX oslash iogonek -55\nKPX oslash j -55\nKPX oslash k -55\nKPX oslash kcommaaccent -55\nKPX oslash l -55\nKPX oslash lacute -55\nKPX oslash lcommaaccent -55\nKPX oslash lslash -55\nKPX oslash m -55\nKPX oslash n -55\nKPX oslash nacute -55\nKPX oslash ncaron -55\nKPX oslash ncommaaccent -55\nKPX oslash ntilde -55\nKPX oslash o -55\nKPX oslash oacute -55\nKPX oslash ocircumflex -55\nKPX oslash odieresis -55\nKPX oslash ograve -55\nKPX oslash ohungarumlaut -55\nKPX oslash omacron -55\nKPX oslash oslash -55\nKPX oslash otilde -55\nKPX oslash p -55\nKPX oslash period -95\nKPX oslash q -55\nKPX oslash r -55\nKPX oslash racute -55\nKPX oslash rcaron -55\nKPX oslash rcommaaccent -55\nKPX oslash s -55\nKPX oslash sacute -55\nKPX oslash scaron -55\nKPX oslash scedilla -55\nKPX oslash scommaaccent -55\nKPX oslash t -55\nKPX oslash tcommaaccent -55\nKPX oslash u -55\nKPX oslash uacute -55\nKPX oslash ucircumflex -55\nKPX oslash udieresis -55\nKPX oslash ugrave -55\nKPX oslash uhungarumlaut -55\nKPX oslash umacron -55\nKPX oslash uogonek -55\nKPX oslash uring -55\nKPX oslash v -70\nKPX oslash w -70\nKPX oslash x -85\nKPX oslash y -70\nKPX oslash yacute -70\nKPX oslash ydieresis -70\nKPX oslash z -55\nKPX oslash zacute -55\nKPX oslash zcaron -55\nKPX oslash zdotaccent -55\nKPX otilde comma -40\nKPX otilde period -40\nKPX otilde v -15\nKPX otilde w -15\nKPX otilde x -30\nKPX otilde y -30\nKPX otilde yacute -30\nKPX otilde ydieresis -30\nKPX p comma -35\nKPX p period -35\nKPX p y -30\nKPX p yacute -30\nKPX p ydieresis -30\nKPX period quotedblright -100\nKPX period quoteright -100\nKPX period space -60\nKPX quotedblright space -40\nKPX quoteleft quoteleft -57\nKPX quoteright d -50\nKPX quoteright dcroat -50\nKPX quoteright quoteright -57\nKPX quoteright r -50\nKPX quoteright racute -50\nKPX quoteright rcaron -50\nKPX quoteright rcommaaccent -50\nKPX quoteright s -50\nKPX quoteright sacute -50\nKPX quoteright scaron -50\nKPX quoteright scedilla -50\nKPX quoteright scommaaccent -50\nKPX quoteright space -70\nKPX r a -10\nKPX r aacute -10\nKPX r abreve -10\nKPX r acircumflex -10\nKPX r adieresis -10\nKPX r agrave -10\nKPX r amacron -10\nKPX r aogonek -10\nKPX r aring -10\nKPX r atilde -10\nKPX r colon 30\nKPX r comma -50\nKPX r i 15\nKPX r iacute 15\nKPX r icircumflex 15\nKPX r idieresis 15\nKPX r igrave 15\nKPX r imacron 15\nKPX r iogonek 15\nKPX r k 15\nKPX r kcommaaccent 15\nKPX r l 15\nKPX r lacute 15\nKPX r lcommaaccent 15\nKPX r lslash 15\nKPX r m 25\nKPX r n 25\nKPX r nacute 25\nKPX r ncaron 25\nKPX r ncommaaccent 25\nKPX r ntilde 25\nKPX r p 30\nKPX r period -50\nKPX r semicolon 30\nKPX r t 40\nKPX r tcommaaccent 40\nKPX r u 15\nKPX r uacute 15\nKPX r ucircumflex 15\nKPX r udieresis 15\nKPX r ugrave 15\nKPX r uhungarumlaut 15\nKPX r umacron 15\nKPX r uogonek 15\nKPX r uring 15\nKPX r v 30\nKPX r y 30\nKPX r yacute 30\nKPX r ydieresis 30\nKPX racute a -10\nKPX racute aacute -10\nKPX racute abreve -10\nKPX racute acircumflex -10\nKPX racute adieresis -10\nKPX racute agrave -10\nKPX racute amacron -10\nKPX racute aogonek -10\nKPX racute aring -10\nKPX racute atilde -10\nKPX racute colon 30\nKPX racute comma -50\nKPX racute i 15\nKPX racute iacute 15\nKPX racute icircumflex 15\nKPX racute idieresis 15\nKPX racute igrave 15\nKPX racute imacron 15\nKPX racute iogonek 15\nKPX racute k 15\nKPX racute kcommaaccent 15\nKPX racute l 15\nKPX racute lacute 15\nKPX racute lcommaaccent 15\nKPX racute lslash 15\nKPX racute m 25\nKPX racute n 25\nKPX racute nacute 25\nKPX racute ncaron 25\nKPX racute ncommaaccent 25\nKPX racute ntilde 25\nKPX racute p 30\nKPX racute period -50\nKPX racute semicolon 30\nKPX racute t 40\nKPX racute tcommaaccent 40\nKPX racute u 15\nKPX racute uacute 15\nKPX racute ucircumflex 15\nKPX racute udieresis 15\nKPX racute ugrave 15\nKPX racute uhungarumlaut 15\nKPX racute umacron 15\nKPX racute uogonek 15\nKPX racute uring 15\nKPX racute v 30\nKPX racute y 30\nKPX racute yacute 30\nKPX racute ydieresis 30\nKPX rcaron a -10\nKPX rcaron aacute -10\nKPX rcaron abreve -10\nKPX rcaron acircumflex -10\nKPX rcaron adieresis -10\nKPX rcaron agrave -10\nKPX rcaron amacron -10\nKPX rcaron aogonek -10\nKPX rcaron aring -10\nKPX rcaron atilde -10\nKPX rcaron colon 30\nKPX rcaron comma -50\nKPX rcaron i 15\nKPX rcaron iacute 15\nKPX rcaron icircumflex 15\nKPX rcaron idieresis 15\nKPX rcaron igrave 15\nKPX rcaron imacron 15\nKPX rcaron iogonek 15\nKPX rcaron k 15\nKPX rcaron kcommaaccent 15\nKPX rcaron l 15\nKPX rcaron lacute 15\nKPX rcaron lcommaaccent 15\nKPX rcaron lslash 15\nKPX rcaron m 25\nKPX rcaron n 25\nKPX rcaron nacute 25\nKPX rcaron ncaron 25\nKPX rcaron ncommaaccent 25\nKPX rcaron ntilde 25\nKPX rcaron p 30\nKPX rcaron period -50\nKPX rcaron semicolon 30\nKPX rcaron t 40\nKPX rcaron tcommaaccent 40\nKPX rcaron u 15\nKPX rcaron uacute 15\nKPX rcaron ucircumflex 15\nKPX rcaron udieresis 15\nKPX rcaron ugrave 15\nKPX rcaron uhungarumlaut 15\nKPX rcaron umacron 15\nKPX rcaron uogonek 15\nKPX rcaron uring 15\nKPX rcaron v 30\nKPX rcaron y 30\nKPX rcaron yacute 30\nKPX rcaron ydieresis 30\nKPX rcommaaccent a -10\nKPX rcommaaccent aacute -10\nKPX rcommaaccent abreve -10\nKPX rcommaaccent acircumflex -10\nKPX rcommaaccent adieresis -10\nKPX rcommaaccent agrave -10\nKPX rcommaaccent amacron -10\nKPX rcommaaccent aogonek -10\nKPX rcommaaccent aring -10\nKPX rcommaaccent atilde -10\nKPX rcommaaccent colon 30\nKPX rcommaaccent comma -50\nKPX rcommaaccent i 15\nKPX rcommaaccent iacute 15\nKPX rcommaaccent icircumflex 15\nKPX rcommaaccent idieresis 15\nKPX rcommaaccent igrave 15\nKPX rcommaaccent imacron 15\nKPX rcommaaccent iogonek 15\nKPX rcommaaccent k 15\nKPX rcommaaccent kcommaaccent 15\nKPX rcommaaccent l 15\nKPX rcommaaccent lacute 15\nKPX rcommaaccent lcommaaccent 15\nKPX rcommaaccent lslash 15\nKPX rcommaaccent m 25\nKPX rcommaaccent n 25\nKPX rcommaaccent nacute 25\nKPX rcommaaccent ncaron 25\nKPX rcommaaccent ncommaaccent 25\nKPX rcommaaccent ntilde 25\nKPX rcommaaccent p 30\nKPX rcommaaccent period -50\nKPX rcommaaccent semicolon 30\nKPX rcommaaccent t 40\nKPX rcommaaccent tcommaaccent 40\nKPX rcommaaccent u 15\nKPX rcommaaccent uacute 15\nKPX rcommaaccent ucircumflex 15\nKPX rcommaaccent udieresis 15\nKPX rcommaaccent ugrave 15\nKPX rcommaaccent uhungarumlaut 15\nKPX rcommaaccent umacron 15\nKPX rcommaaccent uogonek 15\nKPX rcommaaccent uring 15\nKPX rcommaaccent v 30\nKPX rcommaaccent y 30\nKPX rcommaaccent yacute 30\nKPX rcommaaccent ydieresis 30\nKPX s comma -15\nKPX s period -15\nKPX s w -30\nKPX sacute comma -15\nKPX sacute period -15\nKPX sacute w -30\nKPX scaron comma -15\nKPX scaron period -15\nKPX scaron w -30\nKPX scedilla comma -15\nKPX scedilla period -15\nKPX scedilla w -30\nKPX scommaaccent comma -15\nKPX scommaaccent period -15\nKPX scommaaccent w -30\nKPX semicolon space -50\nKPX space T -50\nKPX space Tcaron -50\nKPX space Tcommaaccent -50\nKPX space V -50\nKPX space W -40\nKPX space Y -90\nKPX space Yacute -90\nKPX space Ydieresis -90\nKPX space quotedblleft -30\nKPX space quoteleft -60\nKPX v a -25\nKPX v aacute -25\nKPX v abreve -25\nKPX v acircumflex -25\nKPX v adieresis -25\nKPX v agrave -25\nKPX v amacron -25\nKPX v aogonek -25\nKPX v aring -25\nKPX v atilde -25\nKPX v comma -80\nKPX v e -25\nKPX v eacute -25\nKPX v ecaron -25\nKPX v ecircumflex -25\nKPX v edieresis -25\nKPX v edotaccent -25\nKPX v egrave -25\nKPX v emacron -25\nKPX v eogonek -25\nKPX v o -25\nKPX v oacute -25\nKPX v ocircumflex -25\nKPX v odieresis -25\nKPX v ograve -25\nKPX v ohungarumlaut -25\nKPX v omacron -25\nKPX v oslash -25\nKPX v otilde -25\nKPX v period -80\nKPX w a -15\nKPX w aacute -15\nKPX w abreve -15\nKPX w acircumflex -15\nKPX w adieresis -15\nKPX w agrave -15\nKPX w amacron -15\nKPX w aogonek -15\nKPX w aring -15\nKPX w atilde -15\nKPX w comma -60\nKPX w e -10\nKPX w eacute -10\nKPX w ecaron -10\nKPX w ecircumflex -10\nKPX w edieresis -10\nKPX w edotaccent -10\nKPX w egrave -10\nKPX w emacron -10\nKPX w eogonek -10\nKPX w o -10\nKPX w oacute -10\nKPX w ocircumflex -10\nKPX w odieresis -10\nKPX w ograve -10\nKPX w ohungarumlaut -10\nKPX w omacron -10\nKPX w oslash -10\nKPX w otilde -10\nKPX w period -60\nKPX x e -30\nKPX x eacute -30\nKPX x ecaron -30\nKPX x ecircumflex -30\nKPX x edieresis -30\nKPX x edotaccent -30\nKPX x egrave -30\nKPX x emacron -30\nKPX x eogonek -30\nKPX y a -20\nKPX y aacute -20\nKPX y abreve -20\nKPX y acircumflex -20\nKPX y adieresis -20\nKPX y agrave -20\nKPX y amacron -20\nKPX y aogonek -20\nKPX y aring -20\nKPX y atilde -20\nKPX y comma -100\nKPX y e -20\nKPX y eacute -20\nKPX y ecaron -20\nKPX y ecircumflex -20\nKPX y edieresis -20\nKPX y edotaccent -20\nKPX y egrave -20\nKPX y emacron -20\nKPX y eogonek -20\nKPX y o -20\nKPX y oacute -20\nKPX y ocircumflex -20\nKPX y odieresis -20\nKPX y ograve -20\nKPX y ohungarumlaut -20\nKPX y omacron -20\nKPX y oslash -20\nKPX y otilde -20\nKPX y period -100\nKPX yacute a -20\nKPX yacute aacute -20\nKPX yacute abreve -20\nKPX yacute acircumflex -20\nKPX yacute adieresis -20\nKPX yacute agrave -20\nKPX yacute amacron -20\nKPX yacute aogonek -20\nKPX yacute aring -20\nKPX yacute atilde -20\nKPX yacute comma -100\nKPX yacute e -20\nKPX yacute eacute -20\nKPX yacute ecaron -20\nKPX yacute ecircumflex -20\nKPX yacute edieresis -20\nKPX yacute edotaccent -20\nKPX yacute egrave -20\nKPX yacute emacron -20\nKPX yacute eogonek -20\nKPX yacute o -20\nKPX yacute oacute -20\nKPX yacute ocircumflex -20\nKPX yacute odieresis -20\nKPX yacute ograve -20\nKPX yacute ohungarumlaut -20\nKPX yacute omacron -20\nKPX yacute oslash -20\nKPX yacute otilde -20\nKPX yacute period -100\nKPX ydieresis a -20\nKPX ydieresis aacute -20\nKPX ydieresis abreve -20\nKPX ydieresis acircumflex -20\nKPX ydieresis adieresis -20\nKPX ydieresis agrave -20\nKPX ydieresis amacron -20\nKPX ydieresis aogonek -20\nKPX ydieresis aring -20\nKPX ydieresis atilde -20\nKPX ydieresis comma -100\nKPX ydieresis e -20\nKPX ydieresis eacute -20\nKPX ydieresis ecaron -20\nKPX ydieresis ecircumflex -20\nKPX ydieresis edieresis -20\nKPX ydieresis edotaccent -20\nKPX ydieresis egrave -20\nKPX ydieresis emacron -20\nKPX ydieresis eogonek -20\nKPX ydieresis o -20\nKPX ydieresis oacute -20\nKPX ydieresis ocircumflex -20\nKPX ydieresis odieresis -20\nKPX ydieresis ograve -20\nKPX ydieresis ohungarumlaut -20\nKPX ydieresis omacron -20\nKPX ydieresis oslash -20\nKPX ydieresis otilde -20\nKPX ydieresis period -100\nKPX z e -15\nKPX z eacute -15\nKPX z ecaron -15\nKPX z ecircumflex -15\nKPX z edieresis -15\nKPX z edotaccent -15\nKPX z egrave -15\nKPX z emacron -15\nKPX z eogonek -15\nKPX z o -15\nKPX z oacute -15\nKPX z ocircumflex -15\nKPX z odieresis -15\nKPX z ograve -15\nKPX z ohungarumlaut -15\nKPX z omacron -15\nKPX z oslash -15\nKPX z otilde -15\nKPX zacute e -15\nKPX zacute eacute -15\nKPX zacute ecaron -15\nKPX zacute ecircumflex -15\nKPX zacute edieresis -15\nKPX zacute edotaccent -15\nKPX zacute egrave -15\nKPX zacute emacron -15\nKPX zacute eogonek -15\nKPX zacute o -15\nKPX zacute oacute -15\nKPX zacute ocircumflex -15\nKPX zacute odieresis -15\nKPX zacute ograve -15\nKPX zacute ohungarumlaut -15\nKPX zacute omacron -15\nKPX zacute oslash -15\nKPX zacute otilde -15\nKPX zcaron e -15\nKPX zcaron eacute -15\nKPX zcaron ecaron -15\nKPX zcaron ecircumflex -15\nKPX zcaron edieresis -15\nKPX zcaron edotaccent -15\nKPX zcaron egrave -15\nKPX zcaron emacron -15\nKPX zcaron eogonek -15\nKPX zcaron o -15\nKPX zcaron oacute -15\nKPX zcaron ocircumflex -15\nKPX zcaron odieresis -15\nKPX zcaron ograve -15\nKPX zcaron ohungarumlaut -15\nKPX zcaron omacron -15\nKPX zcaron oslash -15\nKPX zcaron otilde -15\nKPX zdotaccent e -15\nKPX zdotaccent eacute -15\nKPX zdotaccent ecaron -15\nKPX zdotaccent ecircumflex -15\nKPX zdotaccent edieresis -15\nKPX zdotaccent edotaccent -15\nKPX zdotaccent egrave -15\nKPX zdotaccent emacron -15\nKPX zdotaccent eogonek -15\nKPX zdotaccent o -15\nKPX zdotaccent oacute -15\nKPX zdotaccent ocircumflex -15\nKPX zdotaccent odieresis -15\nKPX zdotaccent ograve -15\nKPX zdotaccent ohungarumlaut -15\nKPX zdotaccent omacron -15\nKPX zdotaccent oslash -15\nKPX zdotaccent otilde -15\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/Helvetica.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:38:23 1997\nComment UniqueID 43054\nComment VMusage 37069 48094\nFontName Helvetica\nFullName Helvetica\nFamilyName Helvetica\nWeight Medium\nItalicAngle 0\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -166 -225 1000 931 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated.  All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 718\nXHeight 523\nAscender 718\nDescender -207\nStdHW 76\nStdVW 88\nStartCharMetrics 315\nC 32 ; WX 278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 278 ; N exclam ; B 90 0 187 718 ;\nC 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ;\nC 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ;\nC 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ;\nC 37 ; WX 889 ; N percent ; B 39 -19 850 703 ;\nC 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ;\nC 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ;\nC 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ;\nC 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ;\nC 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ;\nC 43 ; WX 584 ; N plus ; B 39 0 545 505 ;\nC 44 ; WX 278 ; N comma ; B 87 -147 191 106 ;\nC 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ;\nC 46 ; WX 278 ; N period ; B 87 0 191 106 ;\nC 47 ; WX 278 ; N slash ; B -17 -19 295 737 ;\nC 48 ; WX 556 ; N zero ; B 37 -19 519 703 ;\nC 49 ; WX 556 ; N one ; B 101 0 359 703 ;\nC 50 ; WX 556 ; N two ; B 26 0 507 703 ;\nC 51 ; WX 556 ; N three ; B 34 -19 522 703 ;\nC 52 ; WX 556 ; N four ; B 25 0 523 703 ;\nC 53 ; WX 556 ; N five ; B 32 -19 514 688 ;\nC 54 ; WX 556 ; N six ; B 38 -19 518 703 ;\nC 55 ; WX 556 ; N seven ; B 37 0 523 688 ;\nC 56 ; WX 556 ; N eight ; B 38 -19 517 703 ;\nC 57 ; WX 556 ; N nine ; B 42 -19 514 703 ;\nC 58 ; WX 278 ; N colon ; B 87 0 191 516 ;\nC 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ;\nC 60 ; WX 584 ; N less ; B 48 11 536 495 ;\nC 61 ; WX 584 ; N equal ; B 39 115 545 390 ;\nC 62 ; WX 584 ; N greater ; B 48 11 536 495 ;\nC 63 ; WX 556 ; N question ; B 56 0 492 727 ;\nC 64 ; WX 1015 ; N at ; B 147 -19 868 737 ;\nC 65 ; WX 667 ; N A ; B 14 0 654 718 ;\nC 66 ; WX 667 ; N B ; B 74 0 627 718 ;\nC 67 ; WX 722 ; N C ; B 44 -19 681 737 ;\nC 68 ; WX 722 ; N D ; B 81 0 674 718 ;\nC 69 ; WX 667 ; N E ; B 86 0 616 718 ;\nC 70 ; WX 611 ; N F ; B 86 0 583 718 ;\nC 71 ; WX 778 ; N G ; B 48 -19 704 737 ;\nC 72 ; WX 722 ; N H ; B 77 0 646 718 ;\nC 73 ; WX 278 ; N I ; B 91 0 188 718 ;\nC 74 ; WX 500 ; N J ; B 17 -19 428 718 ;\nC 75 ; WX 667 ; N K ; B 76 0 663 718 ;\nC 76 ; WX 556 ; N L ; B 76 0 537 718 ;\nC 77 ; WX 833 ; N M ; B 73 0 761 718 ;\nC 78 ; WX 722 ; N N ; B 76 0 646 718 ;\nC 79 ; WX 778 ; N O ; B 39 -19 739 737 ;\nC 80 ; WX 667 ; N P ; B 86 0 622 718 ;\nC 81 ; WX 778 ; N Q ; B 39 -56 739 737 ;\nC 82 ; WX 722 ; N R ; B 88 0 684 718 ;\nC 83 ; WX 667 ; N S ; B 49 -19 620 737 ;\nC 84 ; WX 611 ; N T ; B 14 0 597 718 ;\nC 85 ; WX 722 ; N U ; B 79 -19 644 718 ;\nC 86 ; WX 667 ; N V ; B 20 0 647 718 ;\nC 87 ; WX 944 ; N W ; B 16 0 928 718 ;\nC 88 ; WX 667 ; N X ; B 19 0 648 718 ;\nC 89 ; WX 667 ; N Y ; B 14 0 653 718 ;\nC 90 ; WX 611 ; N Z ; B 23 0 588 718 ;\nC 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ;\nC 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ;\nC 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ;\nC 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ;\nC 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;\nC 96 ; WX 222 ; N quoteleft ; B 65 470 169 725 ;\nC 97 ; WX 556 ; N a ; B 36 -15 530 538 ;\nC 98 ; WX 556 ; N b ; B 58 -15 517 718 ;\nC 99 ; WX 500 ; N c ; B 30 -15 477 538 ;\nC 100 ; WX 556 ; N d ; B 35 -15 499 718 ;\nC 101 ; WX 556 ; N e ; B 40 -15 516 538 ;\nC 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ;\nC 103 ; WX 556 ; N g ; B 40 -220 499 538 ;\nC 104 ; WX 556 ; N h ; B 65 0 491 718 ;\nC 105 ; WX 222 ; N i ; B 67 0 155 718 ;\nC 106 ; WX 222 ; N j ; B -16 -210 155 718 ;\nC 107 ; WX 500 ; N k ; B 67 0 501 718 ;\nC 108 ; WX 222 ; N l ; B 67 0 155 718 ;\nC 109 ; WX 833 ; N m ; B 65 0 769 538 ;\nC 110 ; WX 556 ; N n ; B 65 0 491 538 ;\nC 111 ; WX 556 ; N o ; B 35 -14 521 538 ;\nC 112 ; WX 556 ; N p ; B 58 -207 517 538 ;\nC 113 ; WX 556 ; N q ; B 35 -207 494 538 ;\nC 114 ; WX 333 ; N r ; B 77 0 332 538 ;\nC 115 ; WX 500 ; N s ; B 32 -15 464 538 ;\nC 116 ; WX 278 ; N t ; B 14 -7 257 669 ;\nC 117 ; WX 556 ; N u ; B 68 -15 489 523 ;\nC 118 ; WX 500 ; N v ; B 8 0 492 523 ;\nC 119 ; WX 722 ; N w ; B 14 0 709 523 ;\nC 120 ; WX 500 ; N x ; B 11 0 490 523 ;\nC 121 ; WX 500 ; N y ; B 11 -214 489 523 ;\nC 122 ; WX 500 ; N z ; B 31 0 469 523 ;\nC 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ;\nC 124 ; WX 260 ; N bar ; B 94 -225 167 775 ;\nC 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ;\nC 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ;\nC 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ;\nC 162 ; WX 556 ; N cent ; B 51 -115 513 623 ;\nC 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ;\nC 164 ; WX 167 ; N fraction ; B -166 -19 333 703 ;\nC 165 ; WX 556 ; N yen ; B 3 0 553 688 ;\nC 166 ; WX 556 ; N florin ; B -11 -207 501 737 ;\nC 167 ; WX 556 ; N section ; B 43 -191 512 737 ;\nC 168 ; WX 556 ; N currency ; B 28 99 528 603 ;\nC 169 ; WX 191 ; N quotesingle ; B 59 463 132 718 ;\nC 170 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ;\nC 171 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ;\nC 173 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ;\nC 174 ; WX 500 ; N fi ; B 14 0 434 728 ;\nC 175 ; WX 500 ; N fl ; B 14 0 432 728 ;\nC 177 ; WX 556 ; N endash ; B 0 240 556 313 ;\nC 178 ; WX 556 ; N dagger ; B 43 -159 514 718 ;\nC 179 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ;\nC 180 ; WX 278 ; N periodcentered ; B 77 190 202 315 ;\nC 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ;\nC 183 ; WX 350 ; N bullet ; B 18 202 333 517 ;\nC 184 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ;\nC 185 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ;\nC 186 ; WX 333 ; N quotedblright ; B 26 463 295 718 ;\nC 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ;\nC 188 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ;\nC 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ;\nC 193 ; WX 333 ; N grave ; B 14 593 211 734 ;\nC 194 ; WX 333 ; N acute ; B 122 593 319 734 ;\nC 195 ; WX 333 ; N circumflex ; B 21 593 312 734 ;\nC 196 ; WX 333 ; N tilde ; B -4 606 337 722 ;\nC 197 ; WX 333 ; N macron ; B 10 627 323 684 ;\nC 198 ; WX 333 ; N breve ; B 13 595 321 731 ;\nC 199 ; WX 333 ; N dotaccent ; B 121 604 212 706 ;\nC 200 ; WX 333 ; N dieresis ; B 40 604 293 706 ;\nC 202 ; WX 333 ; N ring ; B 75 572 259 756 ;\nC 203 ; WX 333 ; N cedilla ; B 45 -225 259 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ;\nC 206 ; WX 333 ; N ogonek ; B 73 -225 287 0 ;\nC 207 ; WX 333 ; N caron ; B 21 593 312 734 ;\nC 208 ; WX 1000 ; N emdash ; B 0 240 1000 313 ;\nC 225 ; WX 1000 ; N AE ; B 8 0 951 718 ;\nC 227 ; WX 370 ; N ordfeminine ; B 24 405 346 737 ;\nC 232 ; WX 556 ; N Lslash ; B -20 0 537 718 ;\nC 233 ; WX 778 ; N Oslash ; B 39 -19 740 737 ;\nC 234 ; WX 1000 ; N OE ; B 36 -19 965 737 ;\nC 235 ; WX 365 ; N ordmasculine ; B 25 405 341 737 ;\nC 241 ; WX 889 ; N ae ; B 36 -15 847 538 ;\nC 245 ; WX 278 ; N dotlessi ; B 95 0 183 523 ;\nC 248 ; WX 222 ; N lslash ; B -20 0 242 718 ;\nC 249 ; WX 611 ; N oslash ; B 28 -22 537 545 ;\nC 250 ; WX 944 ; N oe ; B 35 -15 902 538 ;\nC 251 ; WX 611 ; N germandbls ; B 67 -15 571 728 ;\nC -1 ; WX 278 ; N Idieresis ; B 13 0 266 901 ;\nC -1 ; WX 556 ; N eacute ; B 40 -15 516 734 ;\nC -1 ; WX 556 ; N abreve ; B 36 -15 530 731 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 68 -15 521 734 ;\nC -1 ; WX 556 ; N ecaron ; B 40 -15 516 734 ;\nC -1 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ;\nC -1 ; WX 584 ; N divide ; B 39 -19 545 524 ;\nC -1 ; WX 667 ; N Yacute ; B 14 0 653 929 ;\nC -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ;\nC -1 ; WX 556 ; N aacute ; B 36 -15 530 734 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ;\nC -1 ; WX 500 ; N yacute ; B 11 -214 489 734 ;\nC -1 ; WX 500 ; N scommaaccent ; B 32 -225 464 538 ;\nC -1 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ;\nC -1 ; WX 722 ; N Uring ; B 79 -19 644 931 ;\nC -1 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ;\nC -1 ; WX 556 ; N aogonek ; B 36 -220 547 538 ;\nC -1 ; WX 722 ; N Uacute ; B 79 -19 644 929 ;\nC -1 ; WX 556 ; N uogonek ; B 68 -225 519 523 ;\nC -1 ; WX 667 ; N Edieresis ; B 86 0 616 901 ;\nC -1 ; WX 722 ; N Dcroat ; B 0 0 674 718 ;\nC -1 ; WX 250 ; N commaaccent ; B 87 -225 181 -40 ;\nC -1 ; WX 737 ; N copyright ; B -14 -19 752 737 ;\nC -1 ; WX 667 ; N Emacron ; B 86 0 616 879 ;\nC -1 ; WX 500 ; N ccaron ; B 30 -15 477 734 ;\nC -1 ; WX 556 ; N aring ; B 36 -15 530 756 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 646 718 ;\nC -1 ; WX 222 ; N lacute ; B 67 0 264 929 ;\nC -1 ; WX 556 ; N agrave ; B 36 -15 530 734 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 14 -225 597 718 ;\nC -1 ; WX 722 ; N Cacute ; B 44 -19 681 929 ;\nC -1 ; WX 556 ; N atilde ; B 36 -15 530 722 ;\nC -1 ; WX 667 ; N Edotaccent ; B 86 0 616 901 ;\nC -1 ; WX 500 ; N scaron ; B 32 -15 464 734 ;\nC -1 ; WX 500 ; N scedilla ; B 32 -225 464 538 ;\nC -1 ; WX 278 ; N iacute ; B 95 0 292 734 ;\nC -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ;\nC -1 ; WX 722 ; N Rcaron ; B 88 0 684 929 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 48 -225 704 737 ;\nC -1 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ;\nC -1 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ;\nC -1 ; WX 667 ; N Amacron ; B 14 0 654 879 ;\nC -1 ; WX 333 ; N rcaron ; B 61 0 352 734 ;\nC -1 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 23 0 588 901 ;\nC -1 ; WX 667 ; N Thorn ; B 86 0 622 718 ;\nC -1 ; WX 778 ; N Omacron ; B 39 -19 739 879 ;\nC -1 ; WX 722 ; N Racute ; B 88 0 684 929 ;\nC -1 ; WX 667 ; N Sacute ; B 49 -19 620 929 ;\nC -1 ; WX 643 ; N dcaron ; B 35 -15 655 718 ;\nC -1 ; WX 722 ; N Umacron ; B 79 -19 644 879 ;\nC -1 ; WX 556 ; N uring ; B 68 -15 489 756 ;\nC -1 ; WX 333 ; N threesuperior ; B 5 270 325 703 ;\nC -1 ; WX 778 ; N Ograve ; B 39 -19 739 929 ;\nC -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ;\nC -1 ; WX 667 ; N Abreve ; B 14 0 654 926 ;\nC -1 ; WX 584 ; N multiply ; B 39 0 545 506 ;\nC -1 ; WX 556 ; N uacute ; B 68 -15 489 734 ;\nC -1 ; WX 611 ; N Tcaron ; B 14 0 597 929 ;\nC -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ;\nC -1 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ;\nC -1 ; WX 722 ; N Nacute ; B 76 0 646 929 ;\nC -1 ; WX 278 ; N icircumflex ; B -6 0 285 734 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ;\nC -1 ; WX 556 ; N adieresis ; B 36 -15 530 706 ;\nC -1 ; WX 556 ; N edieresis ; B 40 -15 516 706 ;\nC -1 ; WX 500 ; N cacute ; B 30 -15 477 734 ;\nC -1 ; WX 556 ; N nacute ; B 65 0 491 734 ;\nC -1 ; WX 556 ; N umacron ; B 68 -15 489 684 ;\nC -1 ; WX 722 ; N Ncaron ; B 76 0 646 929 ;\nC -1 ; WX 278 ; N Iacute ; B 91 0 292 929 ;\nC -1 ; WX 584 ; N plusminus ; B 39 0 545 506 ;\nC -1 ; WX 260 ; N brokenbar ; B 94 -150 167 700 ;\nC -1 ; WX 737 ; N registered ; B -14 -19 752 737 ;\nC -1 ; WX 778 ; N Gbreve ; B 48 -19 704 926 ;\nC -1 ; WX 278 ; N Idotaccent ; B 91 0 188 901 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;\nC -1 ; WX 667 ; N Egrave ; B 86 0 616 929 ;\nC -1 ; WX 333 ; N racute ; B 77 0 332 734 ;\nC -1 ; WX 556 ; N omacron ; B 35 -14 521 684 ;\nC -1 ; WX 611 ; N Zacute ; B 23 0 588 929 ;\nC -1 ; WX 611 ; N Zcaron ; B 23 0 588 929 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ;\nC -1 ; WX 722 ; N Eth ; B 0 0 674 718 ;\nC -1 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ;\nC -1 ; WX 222 ; N lcommaaccent ; B 67 -225 167 718 ;\nC -1 ; WX 317 ; N tcaron ; B 14 -7 329 808 ;\nC -1 ; WX 556 ; N eogonek ; B 40 -225 516 538 ;\nC -1 ; WX 722 ; N Uogonek ; B 79 -225 644 718 ;\nC -1 ; WX 667 ; N Aacute ; B 14 0 654 929 ;\nC -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ;\nC -1 ; WX 556 ; N egrave ; B 40 -15 516 734 ;\nC -1 ; WX 500 ; N zacute ; B 31 0 469 734 ;\nC -1 ; WX 222 ; N iogonek ; B -31 -225 183 718 ;\nC -1 ; WX 778 ; N Oacute ; B 39 -19 739 929 ;\nC -1 ; WX 556 ; N oacute ; B 35 -14 521 734 ;\nC -1 ; WX 556 ; N amacron ; B 36 -15 530 684 ;\nC -1 ; WX 500 ; N sacute ; B 32 -15 464 734 ;\nC -1 ; WX 278 ; N idieresis ; B 13 0 266 706 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ;\nC -1 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 556 ; N thorn ; B 58 -207 517 718 ;\nC -1 ; WX 333 ; N twosuperior ; B 4 281 323 703 ;\nC -1 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ;\nC -1 ; WX 556 ; N mu ; B 68 -207 489 523 ;\nC -1 ; WX 278 ; N igrave ; B -13 0 184 734 ;\nC -1 ; WX 556 ; N ohungarumlaut ; B 35 -14 521 734 ;\nC -1 ; WX 667 ; N Eogonek ; B 86 -220 633 718 ;\nC -1 ; WX 556 ; N dcroat ; B 35 -15 550 718 ;\nC -1 ; WX 834 ; N threequarters ; B 45 -19 810 703 ;\nC -1 ; WX 667 ; N Scedilla ; B 49 -225 620 737 ;\nC -1 ; WX 299 ; N lcaron ; B 67 0 311 718 ;\nC -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 663 718 ;\nC -1 ; WX 556 ; N Lacute ; B 76 0 537 929 ;\nC -1 ; WX 1000 ; N trademark ; B 46 306 903 718 ;\nC -1 ; WX 556 ; N edotaccent ; B 40 -15 516 706 ;\nC -1 ; WX 278 ; N Igrave ; B -13 0 188 929 ;\nC -1 ; WX 278 ; N Imacron ; B -17 0 296 879 ;\nC -1 ; WX 556 ; N Lcaron ; B 76 0 537 718 ;\nC -1 ; WX 834 ; N onehalf ; B 43 -19 773 703 ;\nC -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ;\nC -1 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ;\nC -1 ; WX 556 ; N ntilde ; B 65 0 491 722 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 79 -19 644 929 ;\nC -1 ; WX 667 ; N Eacute ; B 86 0 616 929 ;\nC -1 ; WX 556 ; N emacron ; B 40 -15 516 684 ;\nC -1 ; WX 556 ; N gbreve ; B 40 -220 499 731 ;\nC -1 ; WX 834 ; N onequarter ; B 73 -19 756 703 ;\nC -1 ; WX 667 ; N Scaron ; B 49 -19 620 929 ;\nC -1 ; WX 667 ; N Scommaaccent ; B 49 -225 620 737 ;\nC -1 ; WX 778 ; N Ohungarumlaut ; B 39 -19 739 929 ;\nC -1 ; WX 400 ; N degree ; B 54 411 346 703 ;\nC -1 ; WX 556 ; N ograve ; B 35 -14 521 734 ;\nC -1 ; WX 722 ; N Ccaron ; B 44 -19 681 929 ;\nC -1 ; WX 556 ; N ugrave ; B 68 -15 489 734 ;\nC -1 ; WX 453 ; N radical ; B -4 -80 458 762 ;\nC -1 ; WX 722 ; N Dcaron ; B 81 0 674 929 ;\nC -1 ; WX 333 ; N rcommaaccent ; B 77 -225 332 538 ;\nC -1 ; WX 722 ; N Ntilde ; B 76 0 646 917 ;\nC -1 ; WX 556 ; N otilde ; B 35 -14 521 722 ;\nC -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 684 718 ;\nC -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 537 718 ;\nC -1 ; WX 667 ; N Atilde ; B 14 0 654 917 ;\nC -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ;\nC -1 ; WX 667 ; N Aring ; B 14 0 654 931 ;\nC -1 ; WX 778 ; N Otilde ; B 39 -19 739 917 ;\nC -1 ; WX 500 ; N zdotaccent ; B 31 0 469 706 ;\nC -1 ; WX 667 ; N Ecaron ; B 86 0 616 929 ;\nC -1 ; WX 278 ; N Iogonek ; B -3 -225 211 718 ;\nC -1 ; WX 500 ; N kcommaaccent ; B 67 -225 501 718 ;\nC -1 ; WX 584 ; N minus ; B 39 216 545 289 ;\nC -1 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ;\nC -1 ; WX 556 ; N ncaron ; B 65 0 491 734 ;\nC -1 ; WX 278 ; N tcommaaccent ; B 14 -225 257 669 ;\nC -1 ; WX 584 ; N logicalnot ; B 39 108 545 390 ;\nC -1 ; WX 556 ; N odieresis ; B 35 -14 521 706 ;\nC -1 ; WX 556 ; N udieresis ; B 68 -15 489 706 ;\nC -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ;\nC -1 ; WX 556 ; N gcommaaccent ; B 40 -220 499 822 ;\nC -1 ; WX 556 ; N eth ; B 35 -15 522 737 ;\nC -1 ; WX 500 ; N zcaron ; B 31 0 469 734 ;\nC -1 ; WX 556 ; N ncommaaccent ; B 65 -225 491 538 ;\nC -1 ; WX 333 ; N onesuperior ; B 43 281 222 703 ;\nC -1 ; WX 278 ; N imacron ; B 5 0 272 684 ;\nC -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2705\nKPX A C -30\nKPX A Cacute -30\nKPX A Ccaron -30\nKPX A Ccedilla -30\nKPX A G -30\nKPX A Gbreve -30\nKPX A Gcommaaccent -30\nKPX A O -30\nKPX A Oacute -30\nKPX A Ocircumflex -30\nKPX A Odieresis -30\nKPX A Ograve -30\nKPX A Ohungarumlaut -30\nKPX A Omacron -30\nKPX A Oslash -30\nKPX A Otilde -30\nKPX A Q -30\nKPX A T -120\nKPX A Tcaron -120\nKPX A Tcommaaccent -120\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -70\nKPX A W -50\nKPX A Y -100\nKPX A Yacute -100\nKPX A Ydieresis -100\nKPX A u -30\nKPX A uacute -30\nKPX A ucircumflex -30\nKPX A udieresis -30\nKPX A ugrave -30\nKPX A uhungarumlaut -30\nKPX A umacron -30\nKPX A uogonek -30\nKPX A uring -30\nKPX A v -40\nKPX A w -40\nKPX A y -40\nKPX A yacute -40\nKPX A ydieresis -40\nKPX Aacute C -30\nKPX Aacute Cacute -30\nKPX Aacute Ccaron -30\nKPX Aacute Ccedilla -30\nKPX Aacute G -30\nKPX Aacute Gbreve -30\nKPX Aacute Gcommaaccent -30\nKPX Aacute O -30\nKPX Aacute Oacute -30\nKPX Aacute Ocircumflex -30\nKPX Aacute Odieresis -30\nKPX Aacute Ograve -30\nKPX Aacute Ohungarumlaut -30\nKPX Aacute Omacron -30\nKPX Aacute Oslash -30\nKPX Aacute Otilde -30\nKPX Aacute Q -30\nKPX Aacute T -120\nKPX Aacute Tcaron -120\nKPX Aacute Tcommaaccent -120\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -70\nKPX Aacute W -50\nKPX Aacute Y -100\nKPX Aacute Yacute -100\nKPX Aacute Ydieresis -100\nKPX Aacute u -30\nKPX Aacute uacute -30\nKPX Aacute ucircumflex -30\nKPX Aacute udieresis -30\nKPX Aacute ugrave -30\nKPX Aacute uhungarumlaut -30\nKPX Aacute umacron -30\nKPX Aacute uogonek -30\nKPX Aacute uring -30\nKPX Aacute v -40\nKPX Aacute w -40\nKPX Aacute y -40\nKPX Aacute yacute -40\nKPX Aacute ydieresis -40\nKPX Abreve C -30\nKPX Abreve Cacute -30\nKPX Abreve Ccaron -30\nKPX Abreve Ccedilla -30\nKPX Abreve G -30\nKPX Abreve Gbreve -30\nKPX Abreve Gcommaaccent -30\nKPX Abreve O -30\nKPX Abreve Oacute -30\nKPX Abreve Ocircumflex -30\nKPX Abreve Odieresis -30\nKPX Abreve Ograve -30\nKPX Abreve Ohungarumlaut -30\nKPX Abreve Omacron -30\nKPX Abreve Oslash -30\nKPX Abreve Otilde -30\nKPX Abreve Q -30\nKPX Abreve T -120\nKPX Abreve Tcaron -120\nKPX Abreve Tcommaaccent -120\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -70\nKPX Abreve W -50\nKPX Abreve Y -100\nKPX Abreve Yacute -100\nKPX Abreve Ydieresis -100\nKPX Abreve u -30\nKPX Abreve uacute -30\nKPX Abreve ucircumflex -30\nKPX Abreve udieresis -30\nKPX Abreve ugrave -30\nKPX Abreve uhungarumlaut -30\nKPX Abreve umacron -30\nKPX Abreve uogonek -30\nKPX Abreve uring -30\nKPX Abreve v -40\nKPX Abreve w -40\nKPX Abreve y -40\nKPX Abreve yacute -40\nKPX Abreve ydieresis -40\nKPX Acircumflex C -30\nKPX Acircumflex Cacute -30\nKPX Acircumflex Ccaron -30\nKPX Acircumflex Ccedilla -30\nKPX Acircumflex G -30\nKPX Acircumflex Gbreve -30\nKPX Acircumflex Gcommaaccent -30\nKPX Acircumflex O -30\nKPX Acircumflex Oacute -30\nKPX Acircumflex Ocircumflex -30\nKPX Acircumflex Odieresis -30\nKPX Acircumflex Ograve -30\nKPX Acircumflex Ohungarumlaut -30\nKPX Acircumflex Omacron -30\nKPX Acircumflex Oslash -30\nKPX Acircumflex Otilde -30\nKPX Acircumflex Q -30\nKPX Acircumflex T -120\nKPX Acircumflex Tcaron -120\nKPX Acircumflex Tcommaaccent -120\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -70\nKPX Acircumflex W -50\nKPX Acircumflex Y -100\nKPX Acircumflex Yacute -100\nKPX Acircumflex Ydieresis -100\nKPX Acircumflex u -30\nKPX Acircumflex uacute -30\nKPX Acircumflex ucircumflex -30\nKPX Acircumflex udieresis -30\nKPX Acircumflex ugrave -30\nKPX Acircumflex uhungarumlaut -30\nKPX Acircumflex umacron -30\nKPX Acircumflex uogonek -30\nKPX Acircumflex uring -30\nKPX Acircumflex v -40\nKPX Acircumflex w -40\nKPX Acircumflex y -40\nKPX Acircumflex yacute -40\nKPX Acircumflex ydieresis -40\nKPX Adieresis C -30\nKPX Adieresis Cacute -30\nKPX Adieresis Ccaron -30\nKPX Adieresis Ccedilla -30\nKPX Adieresis G -30\nKPX Adieresis Gbreve -30\nKPX Adieresis Gcommaaccent -30\nKPX Adieresis O -30\nKPX Adieresis Oacute -30\nKPX Adieresis Ocircumflex -30\nKPX Adieresis Odieresis -30\nKPX Adieresis Ograve -30\nKPX Adieresis Ohungarumlaut -30\nKPX Adieresis Omacron -30\nKPX Adieresis Oslash -30\nKPX Adieresis Otilde -30\nKPX Adieresis Q -30\nKPX Adieresis T -120\nKPX Adieresis Tcaron -120\nKPX Adieresis Tcommaaccent -120\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -70\nKPX Adieresis W -50\nKPX Adieresis Y -100\nKPX Adieresis Yacute -100\nKPX Adieresis Ydieresis -100\nKPX Adieresis u -30\nKPX Adieresis uacute -30\nKPX Adieresis ucircumflex -30\nKPX Adieresis udieresis -30\nKPX Adieresis ugrave -30\nKPX Adieresis uhungarumlaut -30\nKPX Adieresis umacron -30\nKPX Adieresis uogonek -30\nKPX Adieresis uring -30\nKPX Adieresis v -40\nKPX Adieresis w -40\nKPX Adieresis y -40\nKPX Adieresis yacute -40\nKPX Adieresis ydieresis -40\nKPX Agrave C -30\nKPX Agrave Cacute -30\nKPX Agrave Ccaron -30\nKPX Agrave Ccedilla -30\nKPX Agrave G -30\nKPX Agrave Gbreve -30\nKPX Agrave Gcommaaccent -30\nKPX Agrave O -30\nKPX Agrave Oacute -30\nKPX Agrave Ocircumflex -30\nKPX Agrave Odieresis -30\nKPX Agrave Ograve -30\nKPX Agrave Ohungarumlaut -30\nKPX Agrave Omacron -30\nKPX Agrave Oslash -30\nKPX Agrave Otilde -30\nKPX Agrave Q -30\nKPX Agrave T -120\nKPX Agrave Tcaron -120\nKPX Agrave Tcommaaccent -120\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -70\nKPX Agrave W -50\nKPX Agrave Y -100\nKPX Agrave Yacute -100\nKPX Agrave Ydieresis -100\nKPX Agrave u -30\nKPX Agrave uacute -30\nKPX Agrave ucircumflex -30\nKPX Agrave udieresis -30\nKPX Agrave ugrave -30\nKPX Agrave uhungarumlaut -30\nKPX Agrave umacron -30\nKPX Agrave uogonek -30\nKPX Agrave uring -30\nKPX Agrave v -40\nKPX Agrave w -40\nKPX Agrave y -40\nKPX Agrave yacute -40\nKPX Agrave ydieresis -40\nKPX Amacron C -30\nKPX Amacron Cacute -30\nKPX Amacron Ccaron -30\nKPX Amacron Ccedilla -30\nKPX Amacron G -30\nKPX Amacron Gbreve -30\nKPX Amacron Gcommaaccent -30\nKPX Amacron O -30\nKPX Amacron Oacute -30\nKPX Amacron Ocircumflex -30\nKPX Amacron Odieresis -30\nKPX Amacron Ograve -30\nKPX Amacron Ohungarumlaut -30\nKPX Amacron Omacron -30\nKPX Amacron Oslash -30\nKPX Amacron Otilde -30\nKPX Amacron Q -30\nKPX Amacron T -120\nKPX Amacron Tcaron -120\nKPX Amacron Tcommaaccent -120\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -70\nKPX Amacron W -50\nKPX Amacron Y -100\nKPX Amacron Yacute -100\nKPX Amacron Ydieresis -100\nKPX Amacron u -30\nKPX Amacron uacute -30\nKPX Amacron ucircumflex -30\nKPX Amacron udieresis -30\nKPX Amacron ugrave -30\nKPX Amacron uhungarumlaut -30\nKPX Amacron umacron -30\nKPX Amacron uogonek -30\nKPX Amacron uring -30\nKPX Amacron v -40\nKPX Amacron w -40\nKPX Amacron y -40\nKPX Amacron yacute -40\nKPX Amacron ydieresis -40\nKPX Aogonek C -30\nKPX Aogonek Cacute -30\nKPX Aogonek Ccaron -30\nKPX Aogonek Ccedilla -30\nKPX Aogonek G -30\nKPX Aogonek Gbreve -30\nKPX Aogonek Gcommaaccent -30\nKPX Aogonek O -30\nKPX Aogonek Oacute -30\nKPX Aogonek Ocircumflex -30\nKPX Aogonek Odieresis -30\nKPX Aogonek Ograve -30\nKPX Aogonek Ohungarumlaut -30\nKPX Aogonek Omacron -30\nKPX Aogonek Oslash -30\nKPX Aogonek Otilde -30\nKPX Aogonek Q -30\nKPX Aogonek T -120\nKPX Aogonek Tcaron -120\nKPX Aogonek Tcommaaccent -120\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -70\nKPX Aogonek W -50\nKPX Aogonek Y -100\nKPX Aogonek Yacute -100\nKPX Aogonek Ydieresis -100\nKPX Aogonek u -30\nKPX Aogonek uacute -30\nKPX Aogonek ucircumflex -30\nKPX Aogonek udieresis -30\nKPX Aogonek ugrave -30\nKPX Aogonek uhungarumlaut -30\nKPX Aogonek umacron -30\nKPX Aogonek uogonek -30\nKPX Aogonek uring -30\nKPX Aogonek v -40\nKPX Aogonek w -40\nKPX Aogonek y -40\nKPX Aogonek yacute -40\nKPX Aogonek ydieresis -40\nKPX Aring C -30\nKPX Aring Cacute -30\nKPX Aring Ccaron -30\nKPX Aring Ccedilla -30\nKPX Aring G -30\nKPX Aring Gbreve -30\nKPX Aring Gcommaaccent -30\nKPX Aring O -30\nKPX Aring Oacute -30\nKPX Aring Ocircumflex -30\nKPX Aring Odieresis -30\nKPX Aring Ograve -30\nKPX Aring Ohungarumlaut -30\nKPX Aring Omacron -30\nKPX Aring Oslash -30\nKPX Aring Otilde -30\nKPX Aring Q -30\nKPX Aring T -120\nKPX Aring Tcaron -120\nKPX Aring Tcommaaccent -120\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -70\nKPX Aring W -50\nKPX Aring Y -100\nKPX Aring Yacute -100\nKPX Aring Ydieresis -100\nKPX Aring u -30\nKPX Aring uacute -30\nKPX Aring ucircumflex -30\nKPX Aring udieresis -30\nKPX Aring ugrave -30\nKPX Aring uhungarumlaut -30\nKPX Aring umacron -30\nKPX Aring uogonek -30\nKPX Aring uring -30\nKPX Aring v -40\nKPX Aring w -40\nKPX Aring y -40\nKPX Aring yacute -40\nKPX Aring ydieresis -40\nKPX Atilde C -30\nKPX Atilde Cacute -30\nKPX Atilde Ccaron -30\nKPX Atilde Ccedilla -30\nKPX Atilde G -30\nKPX Atilde Gbreve -30\nKPX Atilde Gcommaaccent -30\nKPX Atilde O -30\nKPX Atilde Oacute -30\nKPX Atilde Ocircumflex -30\nKPX Atilde Odieresis -30\nKPX Atilde Ograve -30\nKPX Atilde Ohungarumlaut -30\nKPX Atilde Omacron -30\nKPX Atilde Oslash -30\nKPX Atilde Otilde -30\nKPX Atilde Q -30\nKPX Atilde T -120\nKPX Atilde Tcaron -120\nKPX Atilde Tcommaaccent -120\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -70\nKPX Atilde W -50\nKPX Atilde Y -100\nKPX Atilde Yacute -100\nKPX Atilde Ydieresis -100\nKPX Atilde u -30\nKPX Atilde uacute -30\nKPX Atilde ucircumflex -30\nKPX Atilde udieresis -30\nKPX Atilde ugrave -30\nKPX Atilde uhungarumlaut -30\nKPX Atilde umacron -30\nKPX Atilde uogonek -30\nKPX Atilde uring -30\nKPX Atilde v -40\nKPX Atilde w -40\nKPX Atilde y -40\nKPX Atilde yacute -40\nKPX Atilde ydieresis -40\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX B comma -20\nKPX B period -20\nKPX C comma -30\nKPX C period -30\nKPX Cacute comma -30\nKPX Cacute period -30\nKPX Ccaron comma -30\nKPX Ccaron period -30\nKPX Ccedilla comma -30\nKPX Ccedilla period -30\nKPX D A -40\nKPX D Aacute -40\nKPX D Abreve -40\nKPX D Acircumflex -40\nKPX D Adieresis -40\nKPX D Agrave -40\nKPX D Amacron -40\nKPX D Aogonek -40\nKPX D Aring -40\nKPX D Atilde -40\nKPX D V -70\nKPX D W -40\nKPX D Y -90\nKPX D Yacute -90\nKPX D Ydieresis -90\nKPX D comma -70\nKPX D period -70\nKPX Dcaron A -40\nKPX Dcaron Aacute -40\nKPX Dcaron Abreve -40\nKPX Dcaron Acircumflex -40\nKPX Dcaron Adieresis -40\nKPX Dcaron Agrave -40\nKPX Dcaron Amacron -40\nKPX Dcaron Aogonek -40\nKPX Dcaron Aring -40\nKPX Dcaron Atilde -40\nKPX Dcaron V -70\nKPX Dcaron W -40\nKPX Dcaron Y -90\nKPX Dcaron Yacute -90\nKPX Dcaron Ydieresis -90\nKPX Dcaron comma -70\nKPX Dcaron period -70\nKPX Dcroat A -40\nKPX Dcroat Aacute -40\nKPX Dcroat Abreve -40\nKPX Dcroat Acircumflex -40\nKPX Dcroat Adieresis -40\nKPX Dcroat Agrave -40\nKPX Dcroat Amacron -40\nKPX Dcroat Aogonek -40\nKPX Dcroat Aring -40\nKPX Dcroat Atilde -40\nKPX Dcroat V -70\nKPX Dcroat W -40\nKPX Dcroat Y -90\nKPX Dcroat Yacute -90\nKPX Dcroat Ydieresis -90\nKPX Dcroat comma -70\nKPX Dcroat period -70\nKPX F A -80\nKPX F Aacute -80\nKPX F Abreve -80\nKPX F Acircumflex -80\nKPX F Adieresis -80\nKPX F Agrave -80\nKPX F Amacron -80\nKPX F Aogonek -80\nKPX F Aring -80\nKPX F Atilde -80\nKPX F a -50\nKPX F aacute -50\nKPX F abreve -50\nKPX F acircumflex -50\nKPX F adieresis -50\nKPX F agrave -50\nKPX F amacron -50\nKPX F aogonek -50\nKPX F aring -50\nKPX F atilde -50\nKPX F comma -150\nKPX F e -30\nKPX F eacute -30\nKPX F ecaron -30\nKPX F ecircumflex -30\nKPX F edieresis -30\nKPX F edotaccent -30\nKPX F egrave -30\nKPX F emacron -30\nKPX F eogonek -30\nKPX F o -30\nKPX F oacute -30\nKPX F ocircumflex -30\nKPX F odieresis -30\nKPX F ograve -30\nKPX F ohungarumlaut -30\nKPX F omacron -30\nKPX F oslash -30\nKPX F otilde -30\nKPX F period -150\nKPX F r -45\nKPX F racute -45\nKPX F rcaron -45\nKPX F rcommaaccent -45\nKPX J A -20\nKPX J Aacute -20\nKPX J Abreve -20\nKPX J Acircumflex -20\nKPX J Adieresis -20\nKPX J Agrave -20\nKPX J Amacron -20\nKPX J Aogonek -20\nKPX J Aring -20\nKPX J Atilde -20\nKPX J a -20\nKPX J aacute -20\nKPX J abreve -20\nKPX J acircumflex -20\nKPX J adieresis -20\nKPX J agrave -20\nKPX J amacron -20\nKPX J aogonek -20\nKPX J aring -20\nKPX J atilde -20\nKPX J comma -30\nKPX J period -30\nKPX J u -20\nKPX J uacute -20\nKPX J ucircumflex -20\nKPX J udieresis -20\nKPX J ugrave -20\nKPX J uhungarumlaut -20\nKPX J umacron -20\nKPX J uogonek -20\nKPX J uring -20\nKPX K O -50\nKPX K Oacute -50\nKPX K Ocircumflex -50\nKPX K Odieresis -50\nKPX K Ograve -50\nKPX K Ohungarumlaut -50\nKPX K Omacron -50\nKPX K Oslash -50\nKPX K Otilde -50\nKPX K e -40\nKPX K eacute -40\nKPX K ecaron -40\nKPX K ecircumflex -40\nKPX K edieresis -40\nKPX K edotaccent -40\nKPX K egrave -40\nKPX K emacron -40\nKPX K eogonek -40\nKPX K o -40\nKPX K oacute -40\nKPX K ocircumflex -40\nKPX K odieresis -40\nKPX K ograve -40\nKPX K ohungarumlaut -40\nKPX K omacron -40\nKPX K oslash -40\nKPX K otilde -40\nKPX K u -30\nKPX K uacute -30\nKPX K ucircumflex -30\nKPX K udieresis -30\nKPX K ugrave -30\nKPX K uhungarumlaut -30\nKPX K umacron -30\nKPX K uogonek -30\nKPX K uring -30\nKPX K y -50\nKPX K yacute -50\nKPX K ydieresis -50\nKPX Kcommaaccent O -50\nKPX Kcommaaccent Oacute -50\nKPX Kcommaaccent Ocircumflex -50\nKPX Kcommaaccent Odieresis -50\nKPX Kcommaaccent Ograve -50\nKPX Kcommaaccent Ohungarumlaut -50\nKPX Kcommaaccent Omacron -50\nKPX Kcommaaccent Oslash -50\nKPX Kcommaaccent Otilde -50\nKPX Kcommaaccent e -40\nKPX Kcommaaccent eacute -40\nKPX Kcommaaccent ecaron -40\nKPX Kcommaaccent ecircumflex -40\nKPX Kcommaaccent edieresis -40\nKPX Kcommaaccent edotaccent -40\nKPX Kcommaaccent egrave -40\nKPX Kcommaaccent emacron -40\nKPX Kcommaaccent eogonek -40\nKPX Kcommaaccent o -40\nKPX Kcommaaccent oacute -40\nKPX Kcommaaccent ocircumflex -40\nKPX Kcommaaccent odieresis -40\nKPX Kcommaaccent ograve -40\nKPX Kcommaaccent ohungarumlaut -40\nKPX Kcommaaccent omacron -40\nKPX Kcommaaccent oslash -40\nKPX Kcommaaccent otilde -40\nKPX Kcommaaccent u -30\nKPX Kcommaaccent uacute -30\nKPX Kcommaaccent ucircumflex -30\nKPX Kcommaaccent udieresis -30\nKPX Kcommaaccent ugrave -30\nKPX Kcommaaccent uhungarumlaut -30\nKPX Kcommaaccent umacron -30\nKPX Kcommaaccent uogonek -30\nKPX Kcommaaccent uring -30\nKPX Kcommaaccent y -50\nKPX Kcommaaccent yacute -50\nKPX Kcommaaccent ydieresis -50\nKPX L T -110\nKPX L Tcaron -110\nKPX L Tcommaaccent -110\nKPX L V -110\nKPX L W -70\nKPX L Y -140\nKPX L Yacute -140\nKPX L Ydieresis -140\nKPX L quotedblright -140\nKPX L quoteright -160\nKPX L y -30\nKPX L yacute -30\nKPX L ydieresis -30\nKPX Lacute T -110\nKPX Lacute Tcaron -110\nKPX Lacute Tcommaaccent -110\nKPX Lacute V -110\nKPX Lacute W -70\nKPX Lacute Y -140\nKPX Lacute Yacute -140\nKPX Lacute Ydieresis -140\nKPX Lacute quotedblright -140\nKPX Lacute quoteright -160\nKPX Lacute y -30\nKPX Lacute yacute -30\nKPX Lacute ydieresis -30\nKPX Lcaron T -110\nKPX Lcaron Tcaron -110\nKPX Lcaron Tcommaaccent -110\nKPX Lcaron V -110\nKPX Lcaron W -70\nKPX Lcaron Y -140\nKPX Lcaron Yacute -140\nKPX Lcaron Ydieresis -140\nKPX Lcaron quotedblright -140\nKPX Lcaron quoteright -160\nKPX Lcaron y -30\nKPX Lcaron yacute -30\nKPX Lcaron ydieresis -30\nKPX Lcommaaccent T -110\nKPX Lcommaaccent Tcaron -110\nKPX Lcommaaccent Tcommaaccent -110\nKPX Lcommaaccent V -110\nKPX Lcommaaccent W -70\nKPX Lcommaaccent Y -140\nKPX Lcommaaccent Yacute -140\nKPX Lcommaaccent Ydieresis -140\nKPX Lcommaaccent quotedblright -140\nKPX Lcommaaccent quoteright -160\nKPX Lcommaaccent y -30\nKPX Lcommaaccent yacute -30\nKPX Lcommaaccent ydieresis -30\nKPX Lslash T -110\nKPX Lslash Tcaron -110\nKPX Lslash Tcommaaccent -110\nKPX Lslash V -110\nKPX Lslash W -70\nKPX Lslash Y -140\nKPX Lslash Yacute -140\nKPX Lslash Ydieresis -140\nKPX Lslash quotedblright -140\nKPX Lslash quoteright -160\nKPX Lslash y -30\nKPX Lslash yacute -30\nKPX Lslash ydieresis -30\nKPX O A -20\nKPX O Aacute -20\nKPX O Abreve -20\nKPX O Acircumflex -20\nKPX O Adieresis -20\nKPX O Agrave -20\nKPX O Amacron -20\nKPX O Aogonek -20\nKPX O Aring -20\nKPX O Atilde -20\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -30\nKPX O X -60\nKPX O Y -70\nKPX O Yacute -70\nKPX O Ydieresis -70\nKPX O comma -40\nKPX O period -40\nKPX Oacute A -20\nKPX Oacute Aacute -20\nKPX Oacute Abreve -20\nKPX Oacute Acircumflex -20\nKPX Oacute Adieresis -20\nKPX Oacute Agrave -20\nKPX Oacute Amacron -20\nKPX Oacute Aogonek -20\nKPX Oacute Aring -20\nKPX Oacute Atilde -20\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -30\nKPX Oacute X -60\nKPX Oacute Y -70\nKPX Oacute Yacute -70\nKPX Oacute Ydieresis -70\nKPX Oacute comma -40\nKPX Oacute period -40\nKPX Ocircumflex A -20\nKPX Ocircumflex Aacute -20\nKPX Ocircumflex Abreve -20\nKPX Ocircumflex Acircumflex -20\nKPX Ocircumflex Adieresis -20\nKPX Ocircumflex Agrave -20\nKPX Ocircumflex Amacron -20\nKPX Ocircumflex Aogonek -20\nKPX Ocircumflex Aring -20\nKPX Ocircumflex Atilde -20\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -30\nKPX Ocircumflex X -60\nKPX Ocircumflex Y -70\nKPX Ocircumflex Yacute -70\nKPX Ocircumflex Ydieresis -70\nKPX Ocircumflex comma -40\nKPX Ocircumflex period -40\nKPX Odieresis A -20\nKPX Odieresis Aacute -20\nKPX Odieresis Abreve -20\nKPX Odieresis Acircumflex -20\nKPX Odieresis Adieresis -20\nKPX Odieresis Agrave -20\nKPX Odieresis Amacron -20\nKPX Odieresis Aogonek -20\nKPX Odieresis Aring -20\nKPX Odieresis Atilde -20\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -30\nKPX Odieresis X -60\nKPX Odieresis Y -70\nKPX Odieresis Yacute -70\nKPX Odieresis Ydieresis -70\nKPX Odieresis comma -40\nKPX Odieresis period -40\nKPX Ograve A -20\nKPX Ograve Aacute -20\nKPX Ograve Abreve -20\nKPX Ograve Acircumflex -20\nKPX Ograve Adieresis -20\nKPX Ograve Agrave -20\nKPX Ograve Amacron -20\nKPX Ograve Aogonek -20\nKPX Ograve Aring -20\nKPX Ograve Atilde -20\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -30\nKPX Ograve X -60\nKPX Ograve Y -70\nKPX Ograve Yacute -70\nKPX Ograve Ydieresis -70\nKPX Ograve comma -40\nKPX Ograve period -40\nKPX Ohungarumlaut A -20\nKPX Ohungarumlaut Aacute -20\nKPX Ohungarumlaut Abreve -20\nKPX Ohungarumlaut Acircumflex -20\nKPX Ohungarumlaut Adieresis -20\nKPX Ohungarumlaut Agrave -20\nKPX Ohungarumlaut Amacron -20\nKPX Ohungarumlaut Aogonek -20\nKPX Ohungarumlaut Aring -20\nKPX Ohungarumlaut Atilde -20\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -30\nKPX Ohungarumlaut X -60\nKPX Ohungarumlaut Y -70\nKPX Ohungarumlaut Yacute -70\nKPX Ohungarumlaut Ydieresis -70\nKPX Ohungarumlaut comma -40\nKPX Ohungarumlaut period -40\nKPX Omacron A -20\nKPX Omacron Aacute -20\nKPX Omacron Abreve -20\nKPX Omacron Acircumflex -20\nKPX Omacron Adieresis -20\nKPX Omacron Agrave -20\nKPX Omacron Amacron -20\nKPX Omacron Aogonek -20\nKPX Omacron Aring -20\nKPX Omacron Atilde -20\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -30\nKPX Omacron X -60\nKPX Omacron Y -70\nKPX Omacron Yacute -70\nKPX Omacron Ydieresis -70\nKPX Omacron comma -40\nKPX Omacron period -40\nKPX Oslash A -20\nKPX Oslash Aacute -20\nKPX Oslash Abreve -20\nKPX Oslash Acircumflex -20\nKPX Oslash Adieresis -20\nKPX Oslash Agrave -20\nKPX Oslash Amacron -20\nKPX Oslash Aogonek -20\nKPX Oslash Aring -20\nKPX Oslash Atilde -20\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -30\nKPX Oslash X -60\nKPX Oslash Y -70\nKPX Oslash Yacute -70\nKPX Oslash Ydieresis -70\nKPX Oslash comma -40\nKPX Oslash period -40\nKPX Otilde A -20\nKPX Otilde Aacute -20\nKPX Otilde Abreve -20\nKPX Otilde Acircumflex -20\nKPX Otilde Adieresis -20\nKPX Otilde Agrave -20\nKPX Otilde Amacron -20\nKPX Otilde Aogonek -20\nKPX Otilde Aring -20\nKPX Otilde Atilde -20\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -30\nKPX Otilde X -60\nKPX Otilde Y -70\nKPX Otilde Yacute -70\nKPX Otilde Ydieresis -70\nKPX Otilde comma -40\nKPX Otilde period -40\nKPX P A -120\nKPX P Aacute -120\nKPX P Abreve -120\nKPX P Acircumflex -120\nKPX P Adieresis -120\nKPX P Agrave -120\nKPX P Amacron -120\nKPX P Aogonek -120\nKPX P Aring -120\nKPX P Atilde -120\nKPX P a -40\nKPX P aacute -40\nKPX P abreve -40\nKPX P acircumflex -40\nKPX P adieresis -40\nKPX P agrave -40\nKPX P amacron -40\nKPX P aogonek -40\nKPX P aring -40\nKPX P atilde -40\nKPX P comma -180\nKPX P e -50\nKPX P eacute -50\nKPX P ecaron -50\nKPX P ecircumflex -50\nKPX P edieresis -50\nKPX P edotaccent -50\nKPX P egrave -50\nKPX P emacron -50\nKPX P eogonek -50\nKPX P o -50\nKPX P oacute -50\nKPX P ocircumflex -50\nKPX P odieresis -50\nKPX P ograve -50\nKPX P ohungarumlaut -50\nKPX P omacron -50\nKPX P oslash -50\nKPX P otilde -50\nKPX P period -180\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX R O -20\nKPX R Oacute -20\nKPX R Ocircumflex -20\nKPX R Odieresis -20\nKPX R Ograve -20\nKPX R Ohungarumlaut -20\nKPX R Omacron -20\nKPX R Oslash -20\nKPX R Otilde -20\nKPX R T -30\nKPX R Tcaron -30\nKPX R Tcommaaccent -30\nKPX R U -40\nKPX R Uacute -40\nKPX R Ucircumflex -40\nKPX R Udieresis -40\nKPX R Ugrave -40\nKPX R Uhungarumlaut -40\nKPX R Umacron -40\nKPX R Uogonek -40\nKPX R Uring -40\nKPX R V -50\nKPX R W -30\nKPX R Y -50\nKPX R Yacute -50\nKPX R Ydieresis -50\nKPX Racute O -20\nKPX Racute Oacute -20\nKPX Racute Ocircumflex -20\nKPX Racute Odieresis -20\nKPX Racute Ograve -20\nKPX Racute Ohungarumlaut -20\nKPX Racute Omacron -20\nKPX Racute Oslash -20\nKPX Racute Otilde -20\nKPX Racute T -30\nKPX Racute Tcaron -30\nKPX Racute Tcommaaccent -30\nKPX Racute U -40\nKPX Racute Uacute -40\nKPX Racute Ucircumflex -40\nKPX Racute Udieresis -40\nKPX Racute Ugrave -40\nKPX Racute Uhungarumlaut -40\nKPX Racute Umacron -40\nKPX Racute Uogonek -40\nKPX Racute Uring -40\nKPX Racute V -50\nKPX Racute W -30\nKPX Racute Y -50\nKPX Racute Yacute -50\nKPX Racute Ydieresis -50\nKPX Rcaron O -20\nKPX Rcaron Oacute -20\nKPX Rcaron Ocircumflex -20\nKPX Rcaron Odieresis -20\nKPX Rcaron Ograve -20\nKPX Rcaron Ohungarumlaut -20\nKPX Rcaron Omacron -20\nKPX Rcaron Oslash -20\nKPX Rcaron Otilde -20\nKPX Rcaron T -30\nKPX Rcaron Tcaron -30\nKPX Rcaron Tcommaaccent -30\nKPX Rcaron U -40\nKPX Rcaron Uacute -40\nKPX Rcaron Ucircumflex -40\nKPX Rcaron Udieresis -40\nKPX Rcaron Ugrave -40\nKPX Rcaron Uhungarumlaut -40\nKPX Rcaron Umacron -40\nKPX Rcaron Uogonek -40\nKPX Rcaron Uring -40\nKPX Rcaron V -50\nKPX Rcaron W -30\nKPX Rcaron Y -50\nKPX Rcaron Yacute -50\nKPX Rcaron Ydieresis -50\nKPX Rcommaaccent O -20\nKPX Rcommaaccent Oacute -20\nKPX Rcommaaccent Ocircumflex -20\nKPX Rcommaaccent Odieresis -20\nKPX Rcommaaccent Ograve -20\nKPX Rcommaaccent Ohungarumlaut -20\nKPX Rcommaaccent Omacron -20\nKPX Rcommaaccent Oslash -20\nKPX Rcommaaccent Otilde -20\nKPX Rcommaaccent T -30\nKPX Rcommaaccent Tcaron -30\nKPX Rcommaaccent Tcommaaccent -30\nKPX Rcommaaccent U -40\nKPX Rcommaaccent Uacute -40\nKPX Rcommaaccent Ucircumflex -40\nKPX Rcommaaccent Udieresis -40\nKPX Rcommaaccent Ugrave -40\nKPX Rcommaaccent Uhungarumlaut -40\nKPX Rcommaaccent Umacron -40\nKPX Rcommaaccent Uogonek -40\nKPX Rcommaaccent Uring -40\nKPX Rcommaaccent V -50\nKPX Rcommaaccent W -30\nKPX Rcommaaccent Y -50\nKPX Rcommaaccent Yacute -50\nKPX Rcommaaccent Ydieresis -50\nKPX S comma -20\nKPX S period -20\nKPX Sacute comma -20\nKPX Sacute period -20\nKPX Scaron comma -20\nKPX Scaron period -20\nKPX Scedilla comma -20\nKPX Scedilla period -20\nKPX Scommaaccent comma -20\nKPX Scommaaccent period -20\nKPX T A -120\nKPX T Aacute -120\nKPX T Abreve -120\nKPX T Acircumflex -120\nKPX T Adieresis -120\nKPX T Agrave -120\nKPX T Amacron -120\nKPX T Aogonek -120\nKPX T Aring -120\nKPX T Atilde -120\nKPX T O -40\nKPX T Oacute -40\nKPX T Ocircumflex -40\nKPX T Odieresis -40\nKPX T Ograve -40\nKPX T Ohungarumlaut -40\nKPX T Omacron -40\nKPX T Oslash -40\nKPX T Otilde -40\nKPX T a -120\nKPX T aacute -120\nKPX T abreve -60\nKPX T acircumflex -120\nKPX T adieresis -120\nKPX T agrave -120\nKPX T amacron -60\nKPX T aogonek -120\nKPX T aring -120\nKPX T atilde -60\nKPX T colon -20\nKPX T comma -120\nKPX T e -120\nKPX T eacute -120\nKPX T ecaron -120\nKPX T ecircumflex -120\nKPX T edieresis -120\nKPX T edotaccent -120\nKPX T egrave -60\nKPX T emacron -60\nKPX T eogonek -120\nKPX T hyphen -140\nKPX T o -120\nKPX T oacute -120\nKPX T ocircumflex -120\nKPX T odieresis -120\nKPX T ograve -120\nKPX T ohungarumlaut -120\nKPX T omacron -60\nKPX T oslash -120\nKPX T otilde -60\nKPX T period -120\nKPX T r -120\nKPX T racute -120\nKPX T rcaron -120\nKPX T rcommaaccent -120\nKPX T semicolon -20\nKPX T u -120\nKPX T uacute -120\nKPX T ucircumflex -120\nKPX T udieresis -120\nKPX T ugrave -120\nKPX T uhungarumlaut -120\nKPX T umacron -60\nKPX T uogonek -120\nKPX T uring -120\nKPX T w -120\nKPX T y -120\nKPX T yacute -120\nKPX T ydieresis -60\nKPX Tcaron A -120\nKPX Tcaron Aacute -120\nKPX Tcaron Abreve -120\nKPX Tcaron Acircumflex -120\nKPX Tcaron Adieresis -120\nKPX Tcaron Agrave -120\nKPX Tcaron Amacron -120\nKPX Tcaron Aogonek -120\nKPX Tcaron Aring -120\nKPX Tcaron Atilde -120\nKPX Tcaron O -40\nKPX Tcaron Oacute -40\nKPX Tcaron Ocircumflex -40\nKPX Tcaron Odieresis -40\nKPX Tcaron Ograve -40\nKPX Tcaron Ohungarumlaut -40\nKPX Tcaron Omacron -40\nKPX Tcaron Oslash -40\nKPX Tcaron Otilde -40\nKPX Tcaron a -120\nKPX Tcaron aacute -120\nKPX Tcaron abreve -60\nKPX Tcaron acircumflex -120\nKPX Tcaron adieresis -120\nKPX Tcaron agrave -120\nKPX Tcaron amacron -60\nKPX Tcaron aogonek -120\nKPX Tcaron aring -120\nKPX Tcaron atilde -60\nKPX Tcaron colon -20\nKPX Tcaron comma -120\nKPX Tcaron e -120\nKPX Tcaron eacute -120\nKPX Tcaron ecaron -120\nKPX Tcaron ecircumflex -120\nKPX Tcaron edieresis -120\nKPX Tcaron edotaccent -120\nKPX Tcaron egrave -60\nKPX Tcaron emacron -60\nKPX Tcaron eogonek -120\nKPX Tcaron hyphen -140\nKPX Tcaron o -120\nKPX Tcaron oacute -120\nKPX Tcaron ocircumflex -120\nKPX Tcaron odieresis -120\nKPX Tcaron ograve -120\nKPX Tcaron ohungarumlaut -120\nKPX Tcaron omacron -60\nKPX Tcaron oslash -120\nKPX Tcaron otilde -60\nKPX Tcaron period -120\nKPX Tcaron r -120\nKPX Tcaron racute -120\nKPX Tcaron rcaron -120\nKPX Tcaron rcommaaccent -120\nKPX Tcaron semicolon -20\nKPX Tcaron u -120\nKPX Tcaron uacute -120\nKPX Tcaron ucircumflex -120\nKPX Tcaron udieresis -120\nKPX Tcaron ugrave -120\nKPX Tcaron uhungarumlaut -120\nKPX Tcaron umacron -60\nKPX Tcaron uogonek -120\nKPX Tcaron uring -120\nKPX Tcaron w -120\nKPX Tcaron y -120\nKPX Tcaron yacute -120\nKPX Tcaron ydieresis -60\nKPX Tcommaaccent A -120\nKPX Tcommaaccent Aacute -120\nKPX Tcommaaccent Abreve -120\nKPX Tcommaaccent Acircumflex -120\nKPX Tcommaaccent Adieresis -120\nKPX Tcommaaccent Agrave -120\nKPX Tcommaaccent Amacron -120\nKPX Tcommaaccent Aogonek -120\nKPX Tcommaaccent Aring -120\nKPX Tcommaaccent Atilde -120\nKPX Tcommaaccent O -40\nKPX Tcommaaccent Oacute -40\nKPX Tcommaaccent Ocircumflex -40\nKPX Tcommaaccent Odieresis -40\nKPX Tcommaaccent Ograve -40\nKPX Tcommaaccent Ohungarumlaut -40\nKPX Tcommaaccent Omacron -40\nKPX Tcommaaccent Oslash -40\nKPX Tcommaaccent Otilde -40\nKPX Tcommaaccent a -120\nKPX Tcommaaccent aacute -120\nKPX Tcommaaccent abreve -60\nKPX Tcommaaccent acircumflex -120\nKPX Tcommaaccent adieresis -120\nKPX Tcommaaccent agrave -120\nKPX Tcommaaccent amacron -60\nKPX Tcommaaccent aogonek -120\nKPX Tcommaaccent aring -120\nKPX Tcommaaccent atilde -60\nKPX Tcommaaccent colon -20\nKPX Tcommaaccent comma -120\nKPX Tcommaaccent e -120\nKPX Tcommaaccent eacute -120\nKPX Tcommaaccent ecaron -120\nKPX Tcommaaccent ecircumflex -120\nKPX Tcommaaccent edieresis -120\nKPX Tcommaaccent edotaccent -120\nKPX Tcommaaccent egrave -60\nKPX Tcommaaccent emacron -60\nKPX Tcommaaccent eogonek -120\nKPX Tcommaaccent hyphen -140\nKPX Tcommaaccent o -120\nKPX Tcommaaccent oacute -120\nKPX Tcommaaccent ocircumflex -120\nKPX Tcommaaccent odieresis -120\nKPX Tcommaaccent ograve -120\nKPX Tcommaaccent ohungarumlaut -120\nKPX Tcommaaccent omacron -60\nKPX Tcommaaccent oslash -120\nKPX Tcommaaccent otilde -60\nKPX Tcommaaccent period -120\nKPX Tcommaaccent r -120\nKPX Tcommaaccent racute -120\nKPX Tcommaaccent rcaron -120\nKPX Tcommaaccent rcommaaccent -120\nKPX Tcommaaccent semicolon -20\nKPX Tcommaaccent u -120\nKPX Tcommaaccent uacute -120\nKPX Tcommaaccent ucircumflex -120\nKPX Tcommaaccent udieresis -120\nKPX Tcommaaccent ugrave -120\nKPX Tcommaaccent uhungarumlaut -120\nKPX Tcommaaccent umacron -60\nKPX Tcommaaccent uogonek -120\nKPX Tcommaaccent uring -120\nKPX Tcommaaccent w -120\nKPX Tcommaaccent y -120\nKPX Tcommaaccent yacute -120\nKPX Tcommaaccent ydieresis -60\nKPX U A -40\nKPX U Aacute -40\nKPX U Abreve -40\nKPX U Acircumflex -40\nKPX U Adieresis -40\nKPX U Agrave -40\nKPX U Amacron -40\nKPX U Aogonek -40\nKPX U Aring -40\nKPX U Atilde -40\nKPX U comma -40\nKPX U period -40\nKPX Uacute A -40\nKPX Uacute Aacute -40\nKPX Uacute Abreve -40\nKPX Uacute Acircumflex -40\nKPX Uacute Adieresis -40\nKPX Uacute Agrave -40\nKPX Uacute Amacron -40\nKPX Uacute Aogonek -40\nKPX Uacute Aring -40\nKPX Uacute Atilde -40\nKPX Uacute comma -40\nKPX Uacute period -40\nKPX Ucircumflex A -40\nKPX Ucircumflex Aacute -40\nKPX Ucircumflex Abreve -40\nKPX Ucircumflex Acircumflex -40\nKPX Ucircumflex Adieresis -40\nKPX Ucircumflex Agrave -40\nKPX Ucircumflex Amacron -40\nKPX Ucircumflex Aogonek -40\nKPX Ucircumflex Aring -40\nKPX Ucircumflex Atilde -40\nKPX Ucircumflex comma -40\nKPX Ucircumflex period -40\nKPX Udieresis A -40\nKPX Udieresis Aacute -40\nKPX Udieresis Abreve -40\nKPX Udieresis Acircumflex -40\nKPX Udieresis Adieresis -40\nKPX Udieresis Agrave -40\nKPX Udieresis Amacron -40\nKPX Udieresis Aogonek -40\nKPX Udieresis Aring -40\nKPX Udieresis Atilde -40\nKPX Udieresis comma -40\nKPX Udieresis period -40\nKPX Ugrave A -40\nKPX Ugrave Aacute -40\nKPX Ugrave Abreve -40\nKPX Ugrave Acircumflex -40\nKPX Ugrave Adieresis -40\nKPX Ugrave Agrave -40\nKPX Ugrave Amacron -40\nKPX Ugrave Aogonek -40\nKPX Ugrave Aring -40\nKPX Ugrave Atilde -40\nKPX Ugrave comma -40\nKPX Ugrave period -40\nKPX Uhungarumlaut A -40\nKPX Uhungarumlaut Aacute -40\nKPX Uhungarumlaut Abreve -40\nKPX Uhungarumlaut Acircumflex -40\nKPX Uhungarumlaut Adieresis -40\nKPX Uhungarumlaut Agrave -40\nKPX Uhungarumlaut Amacron -40\nKPX Uhungarumlaut Aogonek -40\nKPX Uhungarumlaut Aring -40\nKPX Uhungarumlaut Atilde -40\nKPX Uhungarumlaut comma -40\nKPX Uhungarumlaut period -40\nKPX Umacron A -40\nKPX Umacron Aacute -40\nKPX Umacron Abreve -40\nKPX Umacron Acircumflex -40\nKPX Umacron Adieresis -40\nKPX Umacron Agrave -40\nKPX Umacron Amacron -40\nKPX Umacron Aogonek -40\nKPX Umacron Aring -40\nKPX Umacron Atilde -40\nKPX Umacron comma -40\nKPX Umacron period -40\nKPX Uogonek A -40\nKPX Uogonek Aacute -40\nKPX Uogonek Abreve -40\nKPX Uogonek Acircumflex -40\nKPX Uogonek Adieresis -40\nKPX Uogonek Agrave -40\nKPX Uogonek Amacron -40\nKPX Uogonek Aogonek -40\nKPX Uogonek Aring -40\nKPX Uogonek Atilde -40\nKPX Uogonek comma -40\nKPX Uogonek period -40\nKPX Uring A -40\nKPX Uring Aacute -40\nKPX Uring Abreve -40\nKPX Uring Acircumflex -40\nKPX Uring Adieresis -40\nKPX Uring Agrave -40\nKPX Uring Amacron -40\nKPX Uring Aogonek -40\nKPX Uring Aring -40\nKPX Uring Atilde -40\nKPX Uring comma -40\nKPX Uring period -40\nKPX V A -80\nKPX V Aacute -80\nKPX V Abreve -80\nKPX V Acircumflex -80\nKPX V Adieresis -80\nKPX V Agrave -80\nKPX V Amacron -80\nKPX V Aogonek -80\nKPX V Aring -80\nKPX V Atilde -80\nKPX V G -40\nKPX V Gbreve -40\nKPX V Gcommaaccent -40\nKPX V O -40\nKPX V Oacute -40\nKPX V Ocircumflex -40\nKPX V Odieresis -40\nKPX V Ograve -40\nKPX V Ohungarumlaut -40\nKPX V Omacron -40\nKPX V Oslash -40\nKPX V Otilde -40\nKPX V a -70\nKPX V aacute -70\nKPX V abreve -70\nKPX V acircumflex -70\nKPX V adieresis -70\nKPX V agrave -70\nKPX V amacron -70\nKPX V aogonek -70\nKPX V aring -70\nKPX V atilde -70\nKPX V colon -40\nKPX V comma -125\nKPX V e -80\nKPX V eacute -80\nKPX V ecaron -80\nKPX V ecircumflex -80\nKPX V edieresis -80\nKPX V edotaccent -80\nKPX V egrave -80\nKPX V emacron -80\nKPX V eogonek -80\nKPX V hyphen -80\nKPX V o -80\nKPX V oacute -80\nKPX V ocircumflex -80\nKPX V odieresis -80\nKPX V ograve -80\nKPX V ohungarumlaut -80\nKPX V omacron -80\nKPX V oslash -80\nKPX V otilde -80\nKPX V period -125\nKPX V semicolon -40\nKPX V u -70\nKPX V uacute -70\nKPX V ucircumflex -70\nKPX V udieresis -70\nKPX V ugrave -70\nKPX V uhungarumlaut -70\nKPX V umacron -70\nKPX V uogonek -70\nKPX V uring -70\nKPX W A -50\nKPX W Aacute -50\nKPX W Abreve -50\nKPX W Acircumflex -50\nKPX W Adieresis -50\nKPX W Agrave -50\nKPX W Amacron -50\nKPX W Aogonek -50\nKPX W Aring -50\nKPX W Atilde -50\nKPX W O -20\nKPX W Oacute -20\nKPX W Ocircumflex -20\nKPX W Odieresis -20\nKPX W Ograve -20\nKPX W Ohungarumlaut -20\nKPX W Omacron -20\nKPX W Oslash -20\nKPX W Otilde -20\nKPX W a -40\nKPX W aacute -40\nKPX W abreve -40\nKPX W acircumflex -40\nKPX W adieresis -40\nKPX W agrave -40\nKPX W amacron -40\nKPX W aogonek -40\nKPX W aring -40\nKPX W atilde -40\nKPX W comma -80\nKPX W e -30\nKPX W eacute -30\nKPX W ecaron -30\nKPX W ecircumflex -30\nKPX W edieresis -30\nKPX W edotaccent -30\nKPX W egrave -30\nKPX W emacron -30\nKPX W eogonek -30\nKPX W hyphen -40\nKPX W o -30\nKPX W oacute -30\nKPX W ocircumflex -30\nKPX W odieresis -30\nKPX W ograve -30\nKPX W ohungarumlaut -30\nKPX W omacron -30\nKPX W oslash -30\nKPX W otilde -30\nKPX W period -80\nKPX W u -30\nKPX W uacute -30\nKPX W ucircumflex -30\nKPX W udieresis -30\nKPX W ugrave -30\nKPX W uhungarumlaut -30\nKPX W umacron -30\nKPX W uogonek -30\nKPX W uring -30\nKPX W y -20\nKPX W yacute -20\nKPX W ydieresis -20\nKPX Y A -110\nKPX Y Aacute -110\nKPX Y Abreve -110\nKPX Y Acircumflex -110\nKPX Y Adieresis -110\nKPX Y Agrave -110\nKPX Y Amacron -110\nKPX Y Aogonek -110\nKPX Y Aring -110\nKPX Y Atilde -110\nKPX Y O -85\nKPX Y Oacute -85\nKPX Y Ocircumflex -85\nKPX Y Odieresis -85\nKPX Y Ograve -85\nKPX Y Ohungarumlaut -85\nKPX Y Omacron -85\nKPX Y Oslash -85\nKPX Y Otilde -85\nKPX Y a -140\nKPX Y aacute -140\nKPX Y abreve -70\nKPX Y acircumflex -140\nKPX Y adieresis -140\nKPX Y agrave -140\nKPX Y amacron -70\nKPX Y aogonek -140\nKPX Y aring -140\nKPX Y atilde -140\nKPX Y colon -60\nKPX Y comma -140\nKPX Y e -140\nKPX Y eacute -140\nKPX Y ecaron -140\nKPX Y ecircumflex -140\nKPX Y edieresis -140\nKPX Y edotaccent -140\nKPX Y egrave -140\nKPX Y emacron -70\nKPX Y eogonek -140\nKPX Y hyphen -140\nKPX Y i -20\nKPX Y iacute -20\nKPX Y iogonek -20\nKPX Y o -140\nKPX Y oacute -140\nKPX Y ocircumflex -140\nKPX Y odieresis -140\nKPX Y ograve -140\nKPX Y ohungarumlaut -140\nKPX Y omacron -140\nKPX Y oslash -140\nKPX Y otilde -140\nKPX Y period -140\nKPX Y semicolon -60\nKPX Y u -110\nKPX Y uacute -110\nKPX Y ucircumflex -110\nKPX Y udieresis -110\nKPX Y ugrave -110\nKPX Y uhungarumlaut -110\nKPX Y umacron -110\nKPX Y uogonek -110\nKPX Y uring -110\nKPX Yacute A -110\nKPX Yacute Aacute -110\nKPX Yacute Abreve -110\nKPX Yacute Acircumflex -110\nKPX Yacute Adieresis -110\nKPX Yacute Agrave -110\nKPX Yacute Amacron -110\nKPX Yacute Aogonek -110\nKPX Yacute Aring -110\nKPX Yacute Atilde -110\nKPX Yacute O -85\nKPX Yacute Oacute -85\nKPX Yacute Ocircumflex -85\nKPX Yacute Odieresis -85\nKPX Yacute Ograve -85\nKPX Yacute Ohungarumlaut -85\nKPX Yacute Omacron -85\nKPX Yacute Oslash -85\nKPX Yacute Otilde -85\nKPX Yacute a -140\nKPX Yacute aacute -140\nKPX Yacute abreve -70\nKPX Yacute acircumflex -140\nKPX Yacute adieresis -140\nKPX Yacute agrave -140\nKPX Yacute amacron -70\nKPX Yacute aogonek -140\nKPX Yacute aring -140\nKPX Yacute atilde -70\nKPX Yacute colon -60\nKPX Yacute comma -140\nKPX Yacute e -140\nKPX Yacute eacute -140\nKPX Yacute ecaron -140\nKPX Yacute ecircumflex -140\nKPX Yacute edieresis -140\nKPX Yacute edotaccent -140\nKPX Yacute egrave -140\nKPX Yacute emacron -70\nKPX Yacute eogonek -140\nKPX Yacute hyphen -140\nKPX Yacute i -20\nKPX Yacute iacute -20\nKPX Yacute iogonek -20\nKPX Yacute o -140\nKPX Yacute oacute -140\nKPX Yacute ocircumflex -140\nKPX Yacute odieresis -140\nKPX Yacute ograve -140\nKPX Yacute ohungarumlaut -140\nKPX Yacute omacron -70\nKPX Yacute oslash -140\nKPX Yacute otilde -140\nKPX Yacute period -140\nKPX Yacute semicolon -60\nKPX Yacute u -110\nKPX Yacute uacute -110\nKPX Yacute ucircumflex -110\nKPX Yacute udieresis -110\nKPX Yacute ugrave -110\nKPX Yacute uhungarumlaut -110\nKPX Yacute umacron -110\nKPX Yacute uogonek -110\nKPX Yacute uring -110\nKPX Ydieresis A -110\nKPX Ydieresis Aacute -110\nKPX Ydieresis Abreve -110\nKPX Ydieresis Acircumflex -110\nKPX Ydieresis Adieresis -110\nKPX Ydieresis Agrave -110\nKPX Ydieresis Amacron -110\nKPX Ydieresis Aogonek -110\nKPX Ydieresis Aring -110\nKPX Ydieresis Atilde -110\nKPX Ydieresis O -85\nKPX Ydieresis Oacute -85\nKPX Ydieresis Ocircumflex -85\nKPX Ydieresis Odieresis -85\nKPX Ydieresis Ograve -85\nKPX Ydieresis Ohungarumlaut -85\nKPX Ydieresis Omacron -85\nKPX Ydieresis Oslash -85\nKPX Ydieresis Otilde -85\nKPX Ydieresis a -140\nKPX Ydieresis aacute -140\nKPX Ydieresis abreve -70\nKPX Ydieresis acircumflex -140\nKPX Ydieresis adieresis -140\nKPX Ydieresis agrave -140\nKPX Ydieresis amacron -70\nKPX Ydieresis aogonek -140\nKPX Ydieresis aring -140\nKPX Ydieresis atilde -70\nKPX Ydieresis colon -60\nKPX Ydieresis comma -140\nKPX Ydieresis e -140\nKPX Ydieresis eacute -140\nKPX Ydieresis ecaron -140\nKPX Ydieresis ecircumflex -140\nKPX Ydieresis edieresis -140\nKPX Ydieresis edotaccent -140\nKPX Ydieresis egrave -140\nKPX Ydieresis emacron -70\nKPX Ydieresis eogonek -140\nKPX Ydieresis hyphen -140\nKPX Ydieresis i -20\nKPX Ydieresis iacute -20\nKPX Ydieresis iogonek -20\nKPX Ydieresis o -140\nKPX Ydieresis oacute -140\nKPX Ydieresis ocircumflex -140\nKPX Ydieresis odieresis -140\nKPX Ydieresis ograve -140\nKPX Ydieresis ohungarumlaut -140\nKPX Ydieresis omacron -140\nKPX Ydieresis oslash -140\nKPX Ydieresis otilde -140\nKPX Ydieresis period -140\nKPX Ydieresis semicolon -60\nKPX Ydieresis u -110\nKPX Ydieresis uacute -110\nKPX Ydieresis ucircumflex -110\nKPX Ydieresis udieresis -110\nKPX Ydieresis ugrave -110\nKPX Ydieresis uhungarumlaut -110\nKPX Ydieresis umacron -110\nKPX Ydieresis uogonek -110\nKPX Ydieresis uring -110\nKPX a v -20\nKPX a w -20\nKPX a y -30\nKPX a yacute -30\nKPX a ydieresis -30\nKPX aacute v -20\nKPX aacute w -20\nKPX aacute y -30\nKPX aacute yacute -30\nKPX aacute ydieresis -30\nKPX abreve v -20\nKPX abreve w -20\nKPX abreve y -30\nKPX abreve yacute -30\nKPX abreve ydieresis -30\nKPX acircumflex v -20\nKPX acircumflex w -20\nKPX acircumflex y -30\nKPX acircumflex yacute -30\nKPX acircumflex ydieresis -30\nKPX adieresis v -20\nKPX adieresis w -20\nKPX adieresis y -30\nKPX adieresis yacute -30\nKPX adieresis ydieresis -30\nKPX agrave v -20\nKPX agrave w -20\nKPX agrave y -30\nKPX agrave yacute -30\nKPX agrave ydieresis -30\nKPX amacron v -20\nKPX amacron w -20\nKPX amacron y -30\nKPX amacron yacute -30\nKPX amacron ydieresis -30\nKPX aogonek v -20\nKPX aogonek w -20\nKPX aogonek y -30\nKPX aogonek yacute -30\nKPX aogonek ydieresis -30\nKPX aring v -20\nKPX aring w -20\nKPX aring y -30\nKPX aring yacute -30\nKPX aring ydieresis -30\nKPX atilde v -20\nKPX atilde w -20\nKPX atilde y -30\nKPX atilde yacute -30\nKPX atilde ydieresis -30\nKPX b b -10\nKPX b comma -40\nKPX b l -20\nKPX b lacute -20\nKPX b lcommaaccent -20\nKPX b lslash -20\nKPX b period -40\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX b v -20\nKPX b y -20\nKPX b yacute -20\nKPX b ydieresis -20\nKPX c comma -15\nKPX c k -20\nKPX c kcommaaccent -20\nKPX cacute comma -15\nKPX cacute k -20\nKPX cacute kcommaaccent -20\nKPX ccaron comma -15\nKPX ccaron k -20\nKPX ccaron kcommaaccent -20\nKPX ccedilla comma -15\nKPX ccedilla k -20\nKPX ccedilla kcommaaccent -20\nKPX colon space -50\nKPX comma quotedblright -100\nKPX comma quoteright -100\nKPX e comma -15\nKPX e period -15\nKPX e v -30\nKPX e w -20\nKPX e x -30\nKPX e y -20\nKPX e yacute -20\nKPX e ydieresis -20\nKPX eacute comma -15\nKPX eacute period -15\nKPX eacute v -30\nKPX eacute w -20\nKPX eacute x -30\nKPX eacute y -20\nKPX eacute yacute -20\nKPX eacute ydieresis -20\nKPX ecaron comma -15\nKPX ecaron period -15\nKPX ecaron v -30\nKPX ecaron w -20\nKPX ecaron x -30\nKPX ecaron y -20\nKPX ecaron yacute -20\nKPX ecaron ydieresis -20\nKPX ecircumflex comma -15\nKPX ecircumflex period -15\nKPX ecircumflex v -30\nKPX ecircumflex w -20\nKPX ecircumflex x -30\nKPX ecircumflex y -20\nKPX ecircumflex yacute -20\nKPX ecircumflex ydieresis -20\nKPX edieresis comma -15\nKPX edieresis period -15\nKPX edieresis v -30\nKPX edieresis w -20\nKPX edieresis x -30\nKPX edieresis y -20\nKPX edieresis yacute -20\nKPX edieresis ydieresis -20\nKPX edotaccent comma -15\nKPX edotaccent period -15\nKPX edotaccent v -30\nKPX edotaccent w -20\nKPX edotaccent x -30\nKPX edotaccent y -20\nKPX edotaccent yacute -20\nKPX edotaccent ydieresis -20\nKPX egrave comma -15\nKPX egrave period -15\nKPX egrave v -30\nKPX egrave w -20\nKPX egrave x -30\nKPX egrave y -20\nKPX egrave yacute -20\nKPX egrave ydieresis -20\nKPX emacron comma -15\nKPX emacron period -15\nKPX emacron v -30\nKPX emacron w -20\nKPX emacron x -30\nKPX emacron y -20\nKPX emacron yacute -20\nKPX emacron ydieresis -20\nKPX eogonek comma -15\nKPX eogonek period -15\nKPX eogonek v -30\nKPX eogonek w -20\nKPX eogonek x -30\nKPX eogonek y -20\nKPX eogonek yacute -20\nKPX eogonek ydieresis -20\nKPX f a -30\nKPX f aacute -30\nKPX f abreve -30\nKPX f acircumflex -30\nKPX f adieresis -30\nKPX f agrave -30\nKPX f amacron -30\nKPX f aogonek -30\nKPX f aring -30\nKPX f atilde -30\nKPX f comma -30\nKPX f dotlessi -28\nKPX f e -30\nKPX f eacute -30\nKPX f ecaron -30\nKPX f ecircumflex -30\nKPX f edieresis -30\nKPX f edotaccent -30\nKPX f egrave -30\nKPX f emacron -30\nKPX f eogonek -30\nKPX f o -30\nKPX f oacute -30\nKPX f ocircumflex -30\nKPX f odieresis -30\nKPX f ograve -30\nKPX f ohungarumlaut -30\nKPX f omacron -30\nKPX f oslash -30\nKPX f otilde -30\nKPX f period -30\nKPX f quotedblright 60\nKPX f quoteright 50\nKPX g r -10\nKPX g racute -10\nKPX g rcaron -10\nKPX g rcommaaccent -10\nKPX gbreve r -10\nKPX gbreve racute -10\nKPX gbreve rcaron -10\nKPX gbreve rcommaaccent -10\nKPX gcommaaccent r -10\nKPX gcommaaccent racute -10\nKPX gcommaaccent rcaron -10\nKPX gcommaaccent rcommaaccent -10\nKPX h y -30\nKPX h yacute -30\nKPX h ydieresis -30\nKPX k e -20\nKPX k eacute -20\nKPX k ecaron -20\nKPX k ecircumflex -20\nKPX k edieresis -20\nKPX k edotaccent -20\nKPX k egrave -20\nKPX k emacron -20\nKPX k eogonek -20\nKPX k o -20\nKPX k oacute -20\nKPX k ocircumflex -20\nKPX k odieresis -20\nKPX k ograve -20\nKPX k ohungarumlaut -20\nKPX k omacron -20\nKPX k oslash -20\nKPX k otilde -20\nKPX kcommaaccent e -20\nKPX kcommaaccent eacute -20\nKPX kcommaaccent ecaron -20\nKPX kcommaaccent ecircumflex -20\nKPX kcommaaccent edieresis -20\nKPX kcommaaccent edotaccent -20\nKPX kcommaaccent egrave -20\nKPX kcommaaccent emacron -20\nKPX kcommaaccent eogonek -20\nKPX kcommaaccent o -20\nKPX kcommaaccent oacute -20\nKPX kcommaaccent ocircumflex -20\nKPX kcommaaccent odieresis -20\nKPX kcommaaccent ograve -20\nKPX kcommaaccent ohungarumlaut -20\nKPX kcommaaccent omacron -20\nKPX kcommaaccent oslash -20\nKPX kcommaaccent otilde -20\nKPX m u -10\nKPX m uacute -10\nKPX m ucircumflex -10\nKPX m udieresis -10\nKPX m ugrave -10\nKPX m uhungarumlaut -10\nKPX m umacron -10\nKPX m uogonek -10\nKPX m uring -10\nKPX m y -15\nKPX m yacute -15\nKPX m ydieresis -15\nKPX n u -10\nKPX n uacute -10\nKPX n ucircumflex -10\nKPX n udieresis -10\nKPX n ugrave -10\nKPX n uhungarumlaut -10\nKPX n umacron -10\nKPX n uogonek -10\nKPX n uring -10\nKPX n v -20\nKPX n y -15\nKPX n yacute -15\nKPX n ydieresis -15\nKPX nacute u -10\nKPX nacute uacute -10\nKPX nacute ucircumflex -10\nKPX nacute udieresis -10\nKPX nacute ugrave -10\nKPX nacute uhungarumlaut -10\nKPX nacute umacron -10\nKPX nacute uogonek -10\nKPX nacute uring -10\nKPX nacute v -20\nKPX nacute y -15\nKPX nacute yacute -15\nKPX nacute ydieresis -15\nKPX ncaron u -10\nKPX ncaron uacute -10\nKPX ncaron ucircumflex -10\nKPX ncaron udieresis -10\nKPX ncaron ugrave -10\nKPX ncaron uhungarumlaut -10\nKPX ncaron umacron -10\nKPX ncaron uogonek -10\nKPX ncaron uring -10\nKPX ncaron v -20\nKPX ncaron y -15\nKPX ncaron yacute -15\nKPX ncaron ydieresis -15\nKPX ncommaaccent u -10\nKPX ncommaaccent uacute -10\nKPX ncommaaccent ucircumflex -10\nKPX ncommaaccent udieresis -10\nKPX ncommaaccent ugrave -10\nKPX ncommaaccent uhungarumlaut -10\nKPX ncommaaccent umacron -10\nKPX ncommaaccent uogonek -10\nKPX ncommaaccent uring -10\nKPX ncommaaccent v -20\nKPX ncommaaccent y -15\nKPX ncommaaccent yacute -15\nKPX ncommaaccent ydieresis -15\nKPX ntilde u -10\nKPX ntilde uacute -10\nKPX ntilde ucircumflex -10\nKPX ntilde udieresis -10\nKPX ntilde ugrave -10\nKPX ntilde uhungarumlaut -10\nKPX ntilde umacron -10\nKPX ntilde uogonek -10\nKPX ntilde uring -10\nKPX ntilde v -20\nKPX ntilde y -15\nKPX ntilde yacute -15\nKPX ntilde ydieresis -15\nKPX o comma -40\nKPX o period -40\nKPX o v -15\nKPX o w -15\nKPX o x -30\nKPX o y -30\nKPX o yacute -30\nKPX o ydieresis -30\nKPX oacute comma -40\nKPX oacute period -40\nKPX oacute v -15\nKPX oacute w -15\nKPX oacute x -30\nKPX oacute y -30\nKPX oacute yacute -30\nKPX oacute ydieresis -30\nKPX ocircumflex comma -40\nKPX ocircumflex period -40\nKPX ocircumflex v -15\nKPX ocircumflex w -15\nKPX ocircumflex x -30\nKPX ocircumflex y -30\nKPX ocircumflex yacute -30\nKPX ocircumflex ydieresis -30\nKPX odieresis comma -40\nKPX odieresis period -40\nKPX odieresis v -15\nKPX odieresis w -15\nKPX odieresis x -30\nKPX odieresis y -30\nKPX odieresis yacute -30\nKPX odieresis ydieresis -30\nKPX ograve comma -40\nKPX ograve period -40\nKPX ograve v -15\nKPX ograve w -15\nKPX ograve x -30\nKPX ograve y -30\nKPX ograve yacute -30\nKPX ograve ydieresis -30\nKPX ohungarumlaut comma -40\nKPX ohungarumlaut period -40\nKPX ohungarumlaut v -15\nKPX ohungarumlaut w -15\nKPX ohungarumlaut x -30\nKPX ohungarumlaut y -30\nKPX ohungarumlaut yacute -30\nKPX ohungarumlaut ydieresis -30\nKPX omacron comma -40\nKPX omacron period -40\nKPX omacron v -15\nKPX omacron w -15\nKPX omacron x -30\nKPX omacron y -30\nKPX omacron yacute -30\nKPX omacron ydieresis -30\nKPX oslash a -55\nKPX oslash aacute -55\nKPX oslash abreve -55\nKPX oslash acircumflex -55\nKPX oslash adieresis -55\nKPX oslash agrave -55\nKPX oslash amacron -55\nKPX oslash aogonek -55\nKPX oslash aring -55\nKPX oslash atilde -55\nKPX oslash b -55\nKPX oslash c -55\nKPX oslash cacute -55\nKPX oslash ccaron -55\nKPX oslash ccedilla -55\nKPX oslash comma -95\nKPX oslash d -55\nKPX oslash dcroat -55\nKPX oslash e -55\nKPX oslash eacute -55\nKPX oslash ecaron -55\nKPX oslash ecircumflex -55\nKPX oslash edieresis -55\nKPX oslash edotaccent -55\nKPX oslash egrave -55\nKPX oslash emacron -55\nKPX oslash eogonek -55\nKPX oslash f -55\nKPX oslash g -55\nKPX oslash gbreve -55\nKPX oslash gcommaaccent -55\nKPX oslash h -55\nKPX oslash i -55\nKPX oslash iacute -55\nKPX oslash icircumflex -55\nKPX oslash idieresis -55\nKPX oslash igrave -55\nKPX oslash imacron -55\nKPX oslash iogonek -55\nKPX oslash j -55\nKPX oslash k -55\nKPX oslash kcommaaccent -55\nKPX oslash l -55\nKPX oslash lacute -55\nKPX oslash lcommaaccent -55\nKPX oslash lslash -55\nKPX oslash m -55\nKPX oslash n -55\nKPX oslash nacute -55\nKPX oslash ncaron -55\nKPX oslash ncommaaccent -55\nKPX oslash ntilde -55\nKPX oslash o -55\nKPX oslash oacute -55\nKPX oslash ocircumflex -55\nKPX oslash odieresis -55\nKPX oslash ograve -55\nKPX oslash ohungarumlaut -55\nKPX oslash omacron -55\nKPX oslash oslash -55\nKPX oslash otilde -55\nKPX oslash p -55\nKPX oslash period -95\nKPX oslash q -55\nKPX oslash r -55\nKPX oslash racute -55\nKPX oslash rcaron -55\nKPX oslash rcommaaccent -55\nKPX oslash s -55\nKPX oslash sacute -55\nKPX oslash scaron -55\nKPX oslash scedilla -55\nKPX oslash scommaaccent -55\nKPX oslash t -55\nKPX oslash tcommaaccent -55\nKPX oslash u -55\nKPX oslash uacute -55\nKPX oslash ucircumflex -55\nKPX oslash udieresis -55\nKPX oslash ugrave -55\nKPX oslash uhungarumlaut -55\nKPX oslash umacron -55\nKPX oslash uogonek -55\nKPX oslash uring -55\nKPX oslash v -70\nKPX oslash w -70\nKPX oslash x -85\nKPX oslash y -70\nKPX oslash yacute -70\nKPX oslash ydieresis -70\nKPX oslash z -55\nKPX oslash zacute -55\nKPX oslash zcaron -55\nKPX oslash zdotaccent -55\nKPX otilde comma -40\nKPX otilde period -40\nKPX otilde v -15\nKPX otilde w -15\nKPX otilde x -30\nKPX otilde y -30\nKPX otilde yacute -30\nKPX otilde ydieresis -30\nKPX p comma -35\nKPX p period -35\nKPX p y -30\nKPX p yacute -30\nKPX p ydieresis -30\nKPX period quotedblright -100\nKPX period quoteright -100\nKPX period space -60\nKPX quotedblright space -40\nKPX quoteleft quoteleft -57\nKPX quoteright d -50\nKPX quoteright dcroat -50\nKPX quoteright quoteright -57\nKPX quoteright r -50\nKPX quoteright racute -50\nKPX quoteright rcaron -50\nKPX quoteright rcommaaccent -50\nKPX quoteright s -50\nKPX quoteright sacute -50\nKPX quoteright scaron -50\nKPX quoteright scedilla -50\nKPX quoteright scommaaccent -50\nKPX quoteright space -70\nKPX r a -10\nKPX r aacute -10\nKPX r abreve -10\nKPX r acircumflex -10\nKPX r adieresis -10\nKPX r agrave -10\nKPX r amacron -10\nKPX r aogonek -10\nKPX r aring -10\nKPX r atilde -10\nKPX r colon 30\nKPX r comma -50\nKPX r i 15\nKPX r iacute 15\nKPX r icircumflex 15\nKPX r idieresis 15\nKPX r igrave 15\nKPX r imacron 15\nKPX r iogonek 15\nKPX r k 15\nKPX r kcommaaccent 15\nKPX r l 15\nKPX r lacute 15\nKPX r lcommaaccent 15\nKPX r lslash 15\nKPX r m 25\nKPX r n 25\nKPX r nacute 25\nKPX r ncaron 25\nKPX r ncommaaccent 25\nKPX r ntilde 25\nKPX r p 30\nKPX r period -50\nKPX r semicolon 30\nKPX r t 40\nKPX r tcommaaccent 40\nKPX r u 15\nKPX r uacute 15\nKPX r ucircumflex 15\nKPX r udieresis 15\nKPX r ugrave 15\nKPX r uhungarumlaut 15\nKPX r umacron 15\nKPX r uogonek 15\nKPX r uring 15\nKPX r v 30\nKPX r y 30\nKPX r yacute 30\nKPX r ydieresis 30\nKPX racute a -10\nKPX racute aacute -10\nKPX racute abreve -10\nKPX racute acircumflex -10\nKPX racute adieresis -10\nKPX racute agrave -10\nKPX racute amacron -10\nKPX racute aogonek -10\nKPX racute aring -10\nKPX racute atilde -10\nKPX racute colon 30\nKPX racute comma -50\nKPX racute i 15\nKPX racute iacute 15\nKPX racute icircumflex 15\nKPX racute idieresis 15\nKPX racute igrave 15\nKPX racute imacron 15\nKPX racute iogonek 15\nKPX racute k 15\nKPX racute kcommaaccent 15\nKPX racute l 15\nKPX racute lacute 15\nKPX racute lcommaaccent 15\nKPX racute lslash 15\nKPX racute m 25\nKPX racute n 25\nKPX racute nacute 25\nKPX racute ncaron 25\nKPX racute ncommaaccent 25\nKPX racute ntilde 25\nKPX racute p 30\nKPX racute period -50\nKPX racute semicolon 30\nKPX racute t 40\nKPX racute tcommaaccent 40\nKPX racute u 15\nKPX racute uacute 15\nKPX racute ucircumflex 15\nKPX racute udieresis 15\nKPX racute ugrave 15\nKPX racute uhungarumlaut 15\nKPX racute umacron 15\nKPX racute uogonek 15\nKPX racute uring 15\nKPX racute v 30\nKPX racute y 30\nKPX racute yacute 30\nKPX racute ydieresis 30\nKPX rcaron a -10\nKPX rcaron aacute -10\nKPX rcaron abreve -10\nKPX rcaron acircumflex -10\nKPX rcaron adieresis -10\nKPX rcaron agrave -10\nKPX rcaron amacron -10\nKPX rcaron aogonek -10\nKPX rcaron aring -10\nKPX rcaron atilde -10\nKPX rcaron colon 30\nKPX rcaron comma -50\nKPX rcaron i 15\nKPX rcaron iacute 15\nKPX rcaron icircumflex 15\nKPX rcaron idieresis 15\nKPX rcaron igrave 15\nKPX rcaron imacron 15\nKPX rcaron iogonek 15\nKPX rcaron k 15\nKPX rcaron kcommaaccent 15\nKPX rcaron l 15\nKPX rcaron lacute 15\nKPX rcaron lcommaaccent 15\nKPX rcaron lslash 15\nKPX rcaron m 25\nKPX rcaron n 25\nKPX rcaron nacute 25\nKPX rcaron ncaron 25\nKPX rcaron ncommaaccent 25\nKPX rcaron ntilde 25\nKPX rcaron p 30\nKPX rcaron period -50\nKPX rcaron semicolon 30\nKPX rcaron t 40\nKPX rcaron tcommaaccent 40\nKPX rcaron u 15\nKPX rcaron uacute 15\nKPX rcaron ucircumflex 15\nKPX rcaron udieresis 15\nKPX rcaron ugrave 15\nKPX rcaron uhungarumlaut 15\nKPX rcaron umacron 15\nKPX rcaron uogonek 15\nKPX rcaron uring 15\nKPX rcaron v 30\nKPX rcaron y 30\nKPX rcaron yacute 30\nKPX rcaron ydieresis 30\nKPX rcommaaccent a -10\nKPX rcommaaccent aacute -10\nKPX rcommaaccent abreve -10\nKPX rcommaaccent acircumflex -10\nKPX rcommaaccent adieresis -10\nKPX rcommaaccent agrave -10\nKPX rcommaaccent amacron -10\nKPX rcommaaccent aogonek -10\nKPX rcommaaccent aring -10\nKPX rcommaaccent atilde -10\nKPX rcommaaccent colon 30\nKPX rcommaaccent comma -50\nKPX rcommaaccent i 15\nKPX rcommaaccent iacute 15\nKPX rcommaaccent icircumflex 15\nKPX rcommaaccent idieresis 15\nKPX rcommaaccent igrave 15\nKPX rcommaaccent imacron 15\nKPX rcommaaccent iogonek 15\nKPX rcommaaccent k 15\nKPX rcommaaccent kcommaaccent 15\nKPX rcommaaccent l 15\nKPX rcommaaccent lacute 15\nKPX rcommaaccent lcommaaccent 15\nKPX rcommaaccent lslash 15\nKPX rcommaaccent m 25\nKPX rcommaaccent n 25\nKPX rcommaaccent nacute 25\nKPX rcommaaccent ncaron 25\nKPX rcommaaccent ncommaaccent 25\nKPX rcommaaccent ntilde 25\nKPX rcommaaccent p 30\nKPX rcommaaccent period -50\nKPX rcommaaccent semicolon 30\nKPX rcommaaccent t 40\nKPX rcommaaccent tcommaaccent 40\nKPX rcommaaccent u 15\nKPX rcommaaccent uacute 15\nKPX rcommaaccent ucircumflex 15\nKPX rcommaaccent udieresis 15\nKPX rcommaaccent ugrave 15\nKPX rcommaaccent uhungarumlaut 15\nKPX rcommaaccent umacron 15\nKPX rcommaaccent uogonek 15\nKPX rcommaaccent uring 15\nKPX rcommaaccent v 30\nKPX rcommaaccent y 30\nKPX rcommaaccent yacute 30\nKPX rcommaaccent ydieresis 30\nKPX s comma -15\nKPX s period -15\nKPX s w -30\nKPX sacute comma -15\nKPX sacute period -15\nKPX sacute w -30\nKPX scaron comma -15\nKPX scaron period -15\nKPX scaron w -30\nKPX scedilla comma -15\nKPX scedilla period -15\nKPX scedilla w -30\nKPX scommaaccent comma -15\nKPX scommaaccent period -15\nKPX scommaaccent w -30\nKPX semicolon space -50\nKPX space T -50\nKPX space Tcaron -50\nKPX space Tcommaaccent -50\nKPX space V -50\nKPX space W -40\nKPX space Y -90\nKPX space Yacute -90\nKPX space Ydieresis -90\nKPX space quotedblleft -30\nKPX space quoteleft -60\nKPX v a -25\nKPX v aacute -25\nKPX v abreve -25\nKPX v acircumflex -25\nKPX v adieresis -25\nKPX v agrave -25\nKPX v amacron -25\nKPX v aogonek -25\nKPX v aring -25\nKPX v atilde -25\nKPX v comma -80\nKPX v e -25\nKPX v eacute -25\nKPX v ecaron -25\nKPX v ecircumflex -25\nKPX v edieresis -25\nKPX v edotaccent -25\nKPX v egrave -25\nKPX v emacron -25\nKPX v eogonek -25\nKPX v o -25\nKPX v oacute -25\nKPX v ocircumflex -25\nKPX v odieresis -25\nKPX v ograve -25\nKPX v ohungarumlaut -25\nKPX v omacron -25\nKPX v oslash -25\nKPX v otilde -25\nKPX v period -80\nKPX w a -15\nKPX w aacute -15\nKPX w abreve -15\nKPX w acircumflex -15\nKPX w adieresis -15\nKPX w agrave -15\nKPX w amacron -15\nKPX w aogonek -15\nKPX w aring -15\nKPX w atilde -15\nKPX w comma -60\nKPX w e -10\nKPX w eacute -10\nKPX w ecaron -10\nKPX w ecircumflex -10\nKPX w edieresis -10\nKPX w edotaccent -10\nKPX w egrave -10\nKPX w emacron -10\nKPX w eogonek -10\nKPX w o -10\nKPX w oacute -10\nKPX w ocircumflex -10\nKPX w odieresis -10\nKPX w ograve -10\nKPX w ohungarumlaut -10\nKPX w omacron -10\nKPX w oslash -10\nKPX w otilde -10\nKPX w period -60\nKPX x e -30\nKPX x eacute -30\nKPX x ecaron -30\nKPX x ecircumflex -30\nKPX x edieresis -30\nKPX x edotaccent -30\nKPX x egrave -30\nKPX x emacron -30\nKPX x eogonek -30\nKPX y a -20\nKPX y aacute -20\nKPX y abreve -20\nKPX y acircumflex -20\nKPX y adieresis -20\nKPX y agrave -20\nKPX y amacron -20\nKPX y aogonek -20\nKPX y aring -20\nKPX y atilde -20\nKPX y comma -100\nKPX y e -20\nKPX y eacute -20\nKPX y ecaron -20\nKPX y ecircumflex -20\nKPX y edieresis -20\nKPX y edotaccent -20\nKPX y egrave -20\nKPX y emacron -20\nKPX y eogonek -20\nKPX y o -20\nKPX y oacute -20\nKPX y ocircumflex -20\nKPX y odieresis -20\nKPX y ograve -20\nKPX y ohungarumlaut -20\nKPX y omacron -20\nKPX y oslash -20\nKPX y otilde -20\nKPX y period -100\nKPX yacute a -20\nKPX yacute aacute -20\nKPX yacute abreve -20\nKPX yacute acircumflex -20\nKPX yacute adieresis -20\nKPX yacute agrave -20\nKPX yacute amacron -20\nKPX yacute aogonek -20\nKPX yacute aring -20\nKPX yacute atilde -20\nKPX yacute comma -100\nKPX yacute e -20\nKPX yacute eacute -20\nKPX yacute ecaron -20\nKPX yacute ecircumflex -20\nKPX yacute edieresis -20\nKPX yacute edotaccent -20\nKPX yacute egrave -20\nKPX yacute emacron -20\nKPX yacute eogonek -20\nKPX yacute o -20\nKPX yacute oacute -20\nKPX yacute ocircumflex -20\nKPX yacute odieresis -20\nKPX yacute ograve -20\nKPX yacute ohungarumlaut -20\nKPX yacute omacron -20\nKPX yacute oslash -20\nKPX yacute otilde -20\nKPX yacute period -100\nKPX ydieresis a -20\nKPX ydieresis aacute -20\nKPX ydieresis abreve -20\nKPX ydieresis acircumflex -20\nKPX ydieresis adieresis -20\nKPX ydieresis agrave -20\nKPX ydieresis amacron -20\nKPX ydieresis aogonek -20\nKPX ydieresis aring -20\nKPX ydieresis atilde -20\nKPX ydieresis comma -100\nKPX ydieresis e -20\nKPX ydieresis eacute -20\nKPX ydieresis ecaron -20\nKPX ydieresis ecircumflex -20\nKPX ydieresis edieresis -20\nKPX ydieresis edotaccent -20\nKPX ydieresis egrave -20\nKPX ydieresis emacron -20\nKPX ydieresis eogonek -20\nKPX ydieresis o -20\nKPX ydieresis oacute -20\nKPX ydieresis ocircumflex -20\nKPX ydieresis odieresis -20\nKPX ydieresis ograve -20\nKPX ydieresis ohungarumlaut -20\nKPX ydieresis omacron -20\nKPX ydieresis oslash -20\nKPX ydieresis otilde -20\nKPX ydieresis period -100\nKPX z e -15\nKPX z eacute -15\nKPX z ecaron -15\nKPX z ecircumflex -15\nKPX z edieresis -15\nKPX z edotaccent -15\nKPX z egrave -15\nKPX z emacron -15\nKPX z eogonek -15\nKPX z o -15\nKPX z oacute -15\nKPX z ocircumflex -15\nKPX z odieresis -15\nKPX z ograve -15\nKPX z ohungarumlaut -15\nKPX z omacron -15\nKPX z oslash -15\nKPX z otilde -15\nKPX zacute e -15\nKPX zacute eacute -15\nKPX zacute ecaron -15\nKPX zacute ecircumflex -15\nKPX zacute edieresis -15\nKPX zacute edotaccent -15\nKPX zacute egrave -15\nKPX zacute emacron -15\nKPX zacute eogonek -15\nKPX zacute o -15\nKPX zacute oacute -15\nKPX zacute ocircumflex -15\nKPX zacute odieresis -15\nKPX zacute ograve -15\nKPX zacute ohungarumlaut -15\nKPX zacute omacron -15\nKPX zacute oslash -15\nKPX zacute otilde -15\nKPX zcaron e -15\nKPX zcaron eacute -15\nKPX zcaron ecaron -15\nKPX zcaron ecircumflex -15\nKPX zcaron edieresis -15\nKPX zcaron edotaccent -15\nKPX zcaron egrave -15\nKPX zcaron emacron -15\nKPX zcaron eogonek -15\nKPX zcaron o -15\nKPX zcaron oacute -15\nKPX zcaron ocircumflex -15\nKPX zcaron odieresis -15\nKPX zcaron ograve -15\nKPX zcaron ohungarumlaut -15\nKPX zcaron omacron -15\nKPX zcaron oslash -15\nKPX zcaron otilde -15\nKPX zdotaccent e -15\nKPX zdotaccent eacute -15\nKPX zdotaccent ecaron -15\nKPX zdotaccent ecircumflex -15\nKPX zdotaccent edieresis -15\nKPX zdotaccent edotaccent -15\nKPX zdotaccent egrave -15\nKPX zdotaccent emacron -15\nKPX zdotaccent eogonek -15\nKPX zdotaccent o -15\nKPX zdotaccent oacute -15\nKPX zdotaccent ocircumflex -15\nKPX zdotaccent odieresis -15\nKPX zdotaccent ograve -15\nKPX zdotaccent ohungarumlaut -15\nKPX zdotaccent omacron -15\nKPX zdotaccent oslash -15\nKPX zdotaccent otilde -15\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/Times-Bold.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:52:56 1997\nComment UniqueID 43065\nComment VMusage 41636 52661\nFontName Times-Bold\nFullName Times Bold\nFamilyName Times\nWeight Bold\nItalicAngle 0\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -168 -218 1000 935 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 676\nXHeight 461\nAscender 683\nDescender -217\nStdHW 44\nStdVW 139\nStartCharMetrics 315\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ;\nC 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ;\nC 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ;\nC 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ;\nC 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ;\nC 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ;\nC 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ;\nC 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ;\nC 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ;\nC 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ;\nC 43 ; WX 570 ; N plus ; B 33 0 537 506 ;\nC 44 ; WX 250 ; N comma ; B 39 -180 223 155 ;\nC 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ;\nC 46 ; WX 250 ; N period ; B 41 -13 210 156 ;\nC 47 ; WX 278 ; N slash ; B -24 -19 302 691 ;\nC 48 ; WX 500 ; N zero ; B 24 -13 476 688 ;\nC 49 ; WX 500 ; N one ; B 65 0 442 688 ;\nC 50 ; WX 500 ; N two ; B 17 0 478 688 ;\nC 51 ; WX 500 ; N three ; B 16 -14 468 688 ;\nC 52 ; WX 500 ; N four ; B 19 0 475 688 ;\nC 53 ; WX 500 ; N five ; B 22 -8 470 676 ;\nC 54 ; WX 500 ; N six ; B 28 -13 475 688 ;\nC 55 ; WX 500 ; N seven ; B 17 0 477 676 ;\nC 56 ; WX 500 ; N eight ; B 28 -13 472 688 ;\nC 57 ; WX 500 ; N nine ; B 26 -13 473 688 ;\nC 58 ; WX 333 ; N colon ; B 82 -13 251 472 ;\nC 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ;\nC 60 ; WX 570 ; N less ; B 31 -8 539 514 ;\nC 61 ; WX 570 ; N equal ; B 33 107 537 399 ;\nC 62 ; WX 570 ; N greater ; B 31 -8 539 514 ;\nC 63 ; WX 500 ; N question ; B 57 -13 445 689 ;\nC 64 ; WX 930 ; N at ; B 108 -19 822 691 ;\nC 65 ; WX 722 ; N A ; B 9 0 689 690 ;\nC 66 ; WX 667 ; N B ; B 16 0 619 676 ;\nC 67 ; WX 722 ; N C ; B 49 -19 687 691 ;\nC 68 ; WX 722 ; N D ; B 14 0 690 676 ;\nC 69 ; WX 667 ; N E ; B 16 0 641 676 ;\nC 70 ; WX 611 ; N F ; B 16 0 583 676 ;\nC 71 ; WX 778 ; N G ; B 37 -19 755 691 ;\nC 72 ; WX 778 ; N H ; B 21 0 759 676 ;\nC 73 ; WX 389 ; N I ; B 20 0 370 676 ;\nC 74 ; WX 500 ; N J ; B 3 -96 479 676 ;\nC 75 ; WX 778 ; N K ; B 30 0 769 676 ;\nC 76 ; WX 667 ; N L ; B 19 0 638 676 ;\nC 77 ; WX 944 ; N M ; B 14 0 921 676 ;\nC 78 ; WX 722 ; N N ; B 16 -18 701 676 ;\nC 79 ; WX 778 ; N O ; B 35 -19 743 691 ;\nC 80 ; WX 611 ; N P ; B 16 0 600 676 ;\nC 81 ; WX 778 ; N Q ; B 35 -176 743 691 ;\nC 82 ; WX 722 ; N R ; B 26 0 715 676 ;\nC 83 ; WX 556 ; N S ; B 35 -19 513 692 ;\nC 84 ; WX 667 ; N T ; B 31 0 636 676 ;\nC 85 ; WX 722 ; N U ; B 16 -19 701 676 ;\nC 86 ; WX 722 ; N V ; B 16 -18 701 676 ;\nC 87 ; WX 1000 ; N W ; B 19 -15 981 676 ;\nC 88 ; WX 722 ; N X ; B 16 0 699 676 ;\nC 89 ; WX 722 ; N Y ; B 15 0 699 676 ;\nC 90 ; WX 667 ; N Z ; B 28 0 634 676 ;\nC 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ;\nC 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ;\nC 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ;\nC 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B 70 356 254 691 ;\nC 97 ; WX 500 ; N a ; B 25 -14 488 473 ;\nC 98 ; WX 556 ; N b ; B 17 -14 521 676 ;\nC 99 ; WX 444 ; N c ; B 25 -14 430 473 ;\nC 100 ; WX 556 ; N d ; B 25 -14 534 676 ;\nC 101 ; WX 444 ; N e ; B 25 -14 426 473 ;\nC 102 ; WX 333 ; N f ; B 14 0 389 691 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B 28 -206 483 473 ;\nC 104 ; WX 556 ; N h ; B 16 0 534 676 ;\nC 105 ; WX 278 ; N i ; B 16 0 255 691 ;\nC 106 ; WX 333 ; N j ; B -57 -203 263 691 ;\nC 107 ; WX 556 ; N k ; B 22 0 543 676 ;\nC 108 ; WX 278 ; N l ; B 16 0 255 676 ;\nC 109 ; WX 833 ; N m ; B 16 0 814 473 ;\nC 110 ; WX 556 ; N n ; B 21 0 539 473 ;\nC 111 ; WX 500 ; N o ; B 25 -14 476 473 ;\nC 112 ; WX 556 ; N p ; B 19 -205 524 473 ;\nC 113 ; WX 556 ; N q ; B 34 -205 536 473 ;\nC 114 ; WX 444 ; N r ; B 29 0 434 473 ;\nC 115 ; WX 389 ; N s ; B 25 -14 361 473 ;\nC 116 ; WX 333 ; N t ; B 20 -12 332 630 ;\nC 117 ; WX 556 ; N u ; B 16 -14 537 461 ;\nC 118 ; WX 500 ; N v ; B 21 -14 485 461 ;\nC 119 ; WX 722 ; N w ; B 23 -14 707 461 ;\nC 120 ; WX 500 ; N x ; B 12 0 484 461 ;\nC 121 ; WX 500 ; N y ; B 16 -205 480 461 ;\nC 122 ; WX 444 ; N z ; B 21 0 420 461 ;\nC 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ;\nC 124 ; WX 220 ; N bar ; B 66 -218 154 782 ;\nC 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ;\nC 126 ; WX 520 ; N asciitilde ; B 29 173 491 333 ;\nC 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ;\nC 162 ; WX 500 ; N cent ; B 53 -140 458 588 ;\nC 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ;\nC 164 ; WX 167 ; N fraction ; B -168 -12 329 688 ;\nC 165 ; WX 500 ; N yen ; B -64 0 547 676 ;\nC 166 ; WX 500 ; N florin ; B 0 -155 498 706 ;\nC 167 ; WX 500 ; N section ; B 57 -132 443 691 ;\nC 168 ; WX 500 ; N currency ; B -26 61 526 613 ;\nC 169 ; WX 278 ; N quotesingle ; B 75 404 204 691 ;\nC 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ;\nC 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ;\nC 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ;\nC 174 ; WX 556 ; N fi ; B 14 0 536 691 ;\nC 175 ; WX 556 ; N fl ; B 14 0 536 691 ;\nC 177 ; WX 500 ; N endash ; B 0 181 500 271 ;\nC 178 ; WX 500 ; N dagger ; B 47 -134 453 691 ;\nC 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ;\nC 180 ; WX 250 ; N periodcentered ; B 41 248 210 417 ;\nC 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ;\nC 183 ; WX 350 ; N bullet ; B 35 198 315 478 ;\nC 184 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ;\nC 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ;\nC 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ;\nC 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ;\nC 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ;\nC 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ;\nC 193 ; WX 333 ; N grave ; B 8 528 246 713 ;\nC 194 ; WX 333 ; N acute ; B 86 528 324 713 ;\nC 195 ; WX 333 ; N circumflex ; B -2 528 335 704 ;\nC 196 ; WX 333 ; N tilde ; B -16 547 349 674 ;\nC 197 ; WX 333 ; N macron ; B 1 565 331 637 ;\nC 198 ; WX 333 ; N breve ; B 15 528 318 691 ;\nC 199 ; WX 333 ; N dotaccent ; B 103 536 258 691 ;\nC 200 ; WX 333 ; N dieresis ; B -2 537 335 667 ;\nC 202 ; WX 333 ; N ring ; B 60 527 273 740 ;\nC 203 ; WX 333 ; N cedilla ; B 68 -218 294 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ;\nC 206 ; WX 333 ; N ogonek ; B 90 -193 319 24 ;\nC 207 ; WX 333 ; N caron ; B -2 528 335 704 ;\nC 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ;\nC 225 ; WX 1000 ; N AE ; B 4 0 951 676 ;\nC 227 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ;\nC 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ;\nC 233 ; WX 778 ; N Oslash ; B 35 -74 743 737 ;\nC 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ;\nC 235 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ;\nC 241 ; WX 722 ; N ae ; B 33 -14 693 473 ;\nC 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ;\nC 248 ; WX 278 ; N lslash ; B -22 0 303 676 ;\nC 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ;\nC 250 ; WX 722 ; N oe ; B 22 -14 696 473 ;\nC 251 ; WX 556 ; N germandbls ; B 19 -12 517 691 ;\nC -1 ; WX 389 ; N Idieresis ; B 20 0 370 877 ;\nC -1 ; WX 444 ; N eacute ; B 25 -14 426 713 ;\nC -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 557 713 ;\nC -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ;\nC -1 ; WX 722 ; N Ydieresis ; B 15 0 699 877 ;\nC -1 ; WX 570 ; N divide ; B 33 -31 537 537 ;\nC -1 ; WX 722 ; N Yacute ; B 15 0 699 923 ;\nC -1 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ;\nC -1 ; WX 500 ; N aacute ; B 25 -14 488 713 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ;\nC -1 ; WX 500 ; N yacute ; B 16 -205 480 713 ;\nC -1 ; WX 389 ; N scommaaccent ; B 25 -218 361 473 ;\nC -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ;\nC -1 ; WX 722 ; N Uring ; B 16 -19 701 935 ;\nC -1 ; WX 722 ; N Udieresis ; B 16 -19 701 877 ;\nC -1 ; WX 500 ; N aogonek ; B 25 -193 504 473 ;\nC -1 ; WX 722 ; N Uacute ; B 16 -19 701 923 ;\nC -1 ; WX 556 ; N uogonek ; B 16 -193 539 461 ;\nC -1 ; WX 667 ; N Edieresis ; B 16 0 641 877 ;\nC -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ;\nC -1 ; WX 250 ; N commaaccent ; B 47 -218 203 -50 ;\nC -1 ; WX 747 ; N copyright ; B 26 -19 721 691 ;\nC -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ;\nC -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ;\nC -1 ; WX 500 ; N aring ; B 25 -14 488 740 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 16 -188 701 676 ;\nC -1 ; WX 278 ; N lacute ; B 16 0 297 923 ;\nC -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ;\nC -1 ; WX 667 ; N Tcommaaccent ; B 31 -218 636 676 ;\nC -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ;\nC -1 ; WX 500 ; N atilde ; B 25 -14 488 674 ;\nC -1 ; WX 667 ; N Edotaccent ; B 16 0 641 901 ;\nC -1 ; WX 389 ; N scaron ; B 25 -14 363 704 ;\nC -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ;\nC -1 ; WX 278 ; N iacute ; B 16 0 289 713 ;\nC -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;\nC -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 37 -218 755 691 ;\nC -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ;\nC -1 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ;\nC -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ;\nC -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ;\nC -1 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ;\nC -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 901 ;\nC -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ;\nC -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ;\nC -1 ; WX 722 ; N Racute ; B 26 0 715 923 ;\nC -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ;\nC -1 ; WX 672 ; N dcaron ; B 25 -14 681 682 ;\nC -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ;\nC -1 ; WX 556 ; N uring ; B 16 -14 537 740 ;\nC -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ;\nC -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ;\nC -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ;\nC -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ;\nC -1 ; WX 570 ; N multiply ; B 48 16 522 490 ;\nC -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ;\nC -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ;\nC -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;\nC -1 ; WX 500 ; N ydieresis ; B 16 -205 480 667 ;\nC -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ;\nC -1 ; WX 278 ; N icircumflex ; B -37 0 300 704 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ;\nC -1 ; WX 500 ; N adieresis ; B 25 -14 488 667 ;\nC -1 ; WX 444 ; N edieresis ; B 25 -14 426 667 ;\nC -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ;\nC -1 ; WX 556 ; N nacute ; B 21 0 539 713 ;\nC -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ;\nC -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ;\nC -1 ; WX 389 ; N Iacute ; B 20 0 370 923 ;\nC -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ;\nC -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ;\nC -1 ; WX 747 ; N registered ; B 26 -19 721 691 ;\nC -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ;\nC -1 ; WX 389 ; N Idotaccent ; B 20 0 370 901 ;\nC -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;\nC -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ;\nC -1 ; WX 444 ; N racute ; B 29 0 434 713 ;\nC -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ;\nC -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ;\nC -1 ; WX 667 ; N Zcaron ; B 28 0 634 914 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;\nC -1 ; WX 722 ; N Eth ; B 6 0 690 676 ;\nC -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 16 -218 255 676 ;\nC -1 ; WX 416 ; N tcaron ; B 20 -12 425 815 ;\nC -1 ; WX 444 ; N eogonek ; B 25 -193 426 473 ;\nC -1 ; WX 722 ; N Uogonek ; B 16 -193 701 676 ;\nC -1 ; WX 722 ; N Aacute ; B 9 0 689 923 ;\nC -1 ; WX 722 ; N Adieresis ; B 9 0 689 877 ;\nC -1 ; WX 444 ; N egrave ; B 25 -14 426 713 ;\nC -1 ; WX 444 ; N zacute ; B 21 0 420 713 ;\nC -1 ; WX 278 ; N iogonek ; B 16 -193 274 691 ;\nC -1 ; WX 778 ; N Oacute ; B 35 -19 743 923 ;\nC -1 ; WX 500 ; N oacute ; B 25 -14 476 713 ;\nC -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ;\nC -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ;\nC -1 ; WX 278 ; N idieresis ; B -37 0 300 667 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ;\nC -1 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 556 ; N thorn ; B 19 -205 524 676 ;\nC -1 ; WX 300 ; N twosuperior ; B 0 275 300 688 ;\nC -1 ; WX 778 ; N Odieresis ; B 35 -19 743 877 ;\nC -1 ; WX 556 ; N mu ; B 33 -206 536 461 ;\nC -1 ; WX 278 ; N igrave ; B -27 0 255 713 ;\nC -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 529 713 ;\nC -1 ; WX 667 ; N Eogonek ; B 16 -193 644 676 ;\nC -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ;\nC -1 ; WX 750 ; N threequarters ; B 23 -12 733 688 ;\nC -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ;\nC -1 ; WX 394 ; N lcaron ; B 16 0 412 682 ;\nC -1 ; WX 778 ; N Kcommaaccent ; B 30 -218 769 676 ;\nC -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ;\nC -1 ; WX 1000 ; N trademark ; B 24 271 977 676 ;\nC -1 ; WX 444 ; N edotaccent ; B 25 -14 426 691 ;\nC -1 ; WX 389 ; N Igrave ; B 20 0 370 923 ;\nC -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ;\nC -1 ; WX 667 ; N Lcaron ; B 19 0 652 682 ;\nC -1 ; WX 750 ; N onehalf ; B -7 -12 775 688 ;\nC -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;\nC -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ;\nC -1 ; WX 556 ; N ntilde ; B 21 0 539 674 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ;\nC -1 ; WX 667 ; N Eacute ; B 16 0 641 923 ;\nC -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ;\nC -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ;\nC -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ;\nC -1 ; WX 556 ; N Scaron ; B 35 -19 513 914 ;\nC -1 ; WX 556 ; N Scommaaccent ; B 35 -218 513 692 ;\nC -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ;\nC -1 ; WX 400 ; N degree ; B 57 402 343 688 ;\nC -1 ; WX 500 ; N ograve ; B 25 -14 476 713 ;\nC -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ;\nC -1 ; WX 556 ; N ugrave ; B 16 -14 537 713 ;\nC -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;\nC -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ;\nC -1 ; WX 444 ; N rcommaaccent ; B 29 -218 434 473 ;\nC -1 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ;\nC -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ;\nC -1 ; WX 722 ; N Rcommaaccent ; B 26 -218 715 676 ;\nC -1 ; WX 667 ; N Lcommaaccent ; B 19 -218 638 676 ;\nC -1 ; WX 722 ; N Atilde ; B 9 0 689 884 ;\nC -1 ; WX 722 ; N Aogonek ; B 9 -193 699 690 ;\nC -1 ; WX 722 ; N Aring ; B 9 0 689 935 ;\nC -1 ; WX 778 ; N Otilde ; B 35 -19 743 884 ;\nC -1 ; WX 444 ; N zdotaccent ; B 21 0 420 691 ;\nC -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ;\nC -1 ; WX 389 ; N Iogonek ; B 20 -193 370 676 ;\nC -1 ; WX 556 ; N kcommaaccent ; B 22 -218 543 676 ;\nC -1 ; WX 570 ; N minus ; B 33 209 537 297 ;\nC -1 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ;\nC -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ;\nC -1 ; WX 333 ; N tcommaaccent ; B 20 -218 332 630 ;\nC -1 ; WX 570 ; N logicalnot ; B 33 108 537 399 ;\nC -1 ; WX 500 ; N odieresis ; B 25 -14 476 667 ;\nC -1 ; WX 556 ; N udieresis ; B 16 -14 537 667 ;\nC -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;\nC -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 829 ;\nC -1 ; WX 500 ; N eth ; B 25 -14 476 691 ;\nC -1 ; WX 444 ; N zcaron ; B 21 0 420 704 ;\nC -1 ; WX 556 ; N ncommaaccent ; B 21 -218 539 473 ;\nC -1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ;\nC -1 ; WX 278 ; N imacron ; B -8 0 272 637 ;\nC -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2242\nKPX A C -55\nKPX A Cacute -55\nKPX A Ccaron -55\nKPX A Ccedilla -55\nKPX A G -55\nKPX A Gbreve -55\nKPX A Gcommaaccent -55\nKPX A O -45\nKPX A Oacute -45\nKPX A Ocircumflex -45\nKPX A Odieresis -45\nKPX A Ograve -45\nKPX A Ohungarumlaut -45\nKPX A Omacron -45\nKPX A Oslash -45\nKPX A Otilde -45\nKPX A Q -45\nKPX A T -95\nKPX A Tcaron -95\nKPX A Tcommaaccent -95\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -145\nKPX A W -130\nKPX A Y -100\nKPX A Yacute -100\nKPX A Ydieresis -100\nKPX A p -25\nKPX A quoteright -74\nKPX A u -50\nKPX A uacute -50\nKPX A ucircumflex -50\nKPX A udieresis -50\nKPX A ugrave -50\nKPX A uhungarumlaut -50\nKPX A umacron -50\nKPX A uogonek -50\nKPX A uring -50\nKPX A v -100\nKPX A w -90\nKPX A y -74\nKPX A yacute -74\nKPX A ydieresis -74\nKPX Aacute C -55\nKPX Aacute Cacute -55\nKPX Aacute Ccaron -55\nKPX Aacute Ccedilla -55\nKPX Aacute G -55\nKPX Aacute Gbreve -55\nKPX Aacute Gcommaaccent -55\nKPX Aacute O -45\nKPX Aacute Oacute -45\nKPX Aacute Ocircumflex -45\nKPX Aacute Odieresis -45\nKPX Aacute Ograve -45\nKPX Aacute Ohungarumlaut -45\nKPX Aacute Omacron -45\nKPX Aacute Oslash -45\nKPX Aacute Otilde -45\nKPX Aacute Q -45\nKPX Aacute T -95\nKPX Aacute Tcaron -95\nKPX Aacute Tcommaaccent -95\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -145\nKPX Aacute W -130\nKPX Aacute Y -100\nKPX Aacute Yacute -100\nKPX Aacute Ydieresis -100\nKPX Aacute p -25\nKPX Aacute quoteright -74\nKPX Aacute u -50\nKPX Aacute uacute -50\nKPX Aacute ucircumflex -50\nKPX Aacute udieresis -50\nKPX Aacute ugrave -50\nKPX Aacute uhungarumlaut -50\nKPX Aacute umacron -50\nKPX Aacute uogonek -50\nKPX Aacute uring -50\nKPX Aacute v -100\nKPX Aacute w -90\nKPX Aacute y -74\nKPX Aacute yacute -74\nKPX Aacute ydieresis -74\nKPX Abreve C -55\nKPX Abreve Cacute -55\nKPX Abreve Ccaron -55\nKPX Abreve Ccedilla -55\nKPX Abreve G -55\nKPX Abreve Gbreve -55\nKPX Abreve Gcommaaccent -55\nKPX Abreve O -45\nKPX Abreve Oacute -45\nKPX Abreve Ocircumflex -45\nKPX Abreve Odieresis -45\nKPX Abreve Ograve -45\nKPX Abreve Ohungarumlaut -45\nKPX Abreve Omacron -45\nKPX Abreve Oslash -45\nKPX Abreve Otilde -45\nKPX Abreve Q -45\nKPX Abreve T -95\nKPX Abreve Tcaron -95\nKPX Abreve Tcommaaccent -95\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -145\nKPX Abreve W -130\nKPX Abreve Y -100\nKPX Abreve Yacute -100\nKPX Abreve Ydieresis -100\nKPX Abreve p -25\nKPX Abreve quoteright -74\nKPX Abreve u -50\nKPX Abreve uacute -50\nKPX Abreve ucircumflex -50\nKPX Abreve udieresis -50\nKPX Abreve ugrave -50\nKPX Abreve uhungarumlaut -50\nKPX Abreve umacron -50\nKPX Abreve uogonek -50\nKPX Abreve uring -50\nKPX Abreve v -100\nKPX Abreve w -90\nKPX Abreve y -74\nKPX Abreve yacute -74\nKPX Abreve ydieresis -74\nKPX Acircumflex C -55\nKPX Acircumflex Cacute -55\nKPX Acircumflex Ccaron -55\nKPX Acircumflex Ccedilla -55\nKPX Acircumflex G -55\nKPX Acircumflex Gbreve -55\nKPX Acircumflex Gcommaaccent -55\nKPX Acircumflex O -45\nKPX Acircumflex Oacute -45\nKPX Acircumflex Ocircumflex -45\nKPX Acircumflex Odieresis -45\nKPX Acircumflex Ograve -45\nKPX Acircumflex Ohungarumlaut -45\nKPX Acircumflex Omacron -45\nKPX Acircumflex Oslash -45\nKPX Acircumflex Otilde -45\nKPX Acircumflex Q -45\nKPX Acircumflex T -95\nKPX Acircumflex Tcaron -95\nKPX Acircumflex Tcommaaccent -95\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -145\nKPX Acircumflex W -130\nKPX Acircumflex Y -100\nKPX Acircumflex Yacute -100\nKPX Acircumflex Ydieresis -100\nKPX Acircumflex p -25\nKPX Acircumflex quoteright -74\nKPX Acircumflex u -50\nKPX Acircumflex uacute -50\nKPX Acircumflex ucircumflex -50\nKPX Acircumflex udieresis -50\nKPX Acircumflex ugrave -50\nKPX Acircumflex uhungarumlaut -50\nKPX Acircumflex umacron -50\nKPX Acircumflex uogonek -50\nKPX Acircumflex uring -50\nKPX Acircumflex v -100\nKPX Acircumflex w -90\nKPX Acircumflex y -74\nKPX Acircumflex yacute -74\nKPX Acircumflex ydieresis -74\nKPX Adieresis C -55\nKPX Adieresis Cacute -55\nKPX Adieresis Ccaron -55\nKPX Adieresis Ccedilla -55\nKPX Adieresis G -55\nKPX Adieresis Gbreve -55\nKPX Adieresis Gcommaaccent -55\nKPX Adieresis O -45\nKPX Adieresis Oacute -45\nKPX Adieresis Ocircumflex -45\nKPX Adieresis Odieresis -45\nKPX Adieresis Ograve -45\nKPX Adieresis Ohungarumlaut -45\nKPX Adieresis Omacron -45\nKPX Adieresis Oslash -45\nKPX Adieresis Otilde -45\nKPX Adieresis Q -45\nKPX Adieresis T -95\nKPX Adieresis Tcaron -95\nKPX Adieresis Tcommaaccent -95\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -145\nKPX Adieresis W -130\nKPX Adieresis Y -100\nKPX Adieresis Yacute -100\nKPX Adieresis Ydieresis -100\nKPX Adieresis p -25\nKPX Adieresis quoteright -74\nKPX Adieresis u -50\nKPX Adieresis uacute -50\nKPX Adieresis ucircumflex -50\nKPX Adieresis udieresis -50\nKPX Adieresis ugrave -50\nKPX Adieresis uhungarumlaut -50\nKPX Adieresis umacron -50\nKPX Adieresis uogonek -50\nKPX Adieresis uring -50\nKPX Adieresis v -100\nKPX Adieresis w -90\nKPX Adieresis y -74\nKPX Adieresis yacute -74\nKPX Adieresis ydieresis -74\nKPX Agrave C -55\nKPX Agrave Cacute -55\nKPX Agrave Ccaron -55\nKPX Agrave Ccedilla -55\nKPX Agrave G -55\nKPX Agrave Gbreve -55\nKPX Agrave Gcommaaccent -55\nKPX Agrave O -45\nKPX Agrave Oacute -45\nKPX Agrave Ocircumflex -45\nKPX Agrave Odieresis -45\nKPX Agrave Ograve -45\nKPX Agrave Ohungarumlaut -45\nKPX Agrave Omacron -45\nKPX Agrave Oslash -45\nKPX Agrave Otilde -45\nKPX Agrave Q -45\nKPX Agrave T -95\nKPX Agrave Tcaron -95\nKPX Agrave Tcommaaccent -95\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -145\nKPX Agrave W -130\nKPX Agrave Y -100\nKPX Agrave Yacute -100\nKPX Agrave Ydieresis -100\nKPX Agrave p -25\nKPX Agrave quoteright -74\nKPX Agrave u -50\nKPX Agrave uacute -50\nKPX Agrave ucircumflex -50\nKPX Agrave udieresis -50\nKPX Agrave ugrave -50\nKPX Agrave uhungarumlaut -50\nKPX Agrave umacron -50\nKPX Agrave uogonek -50\nKPX Agrave uring -50\nKPX Agrave v -100\nKPX Agrave w -90\nKPX Agrave y -74\nKPX Agrave yacute -74\nKPX Agrave ydieresis -74\nKPX Amacron C -55\nKPX Amacron Cacute -55\nKPX Amacron Ccaron -55\nKPX Amacron Ccedilla -55\nKPX Amacron G -55\nKPX Amacron Gbreve -55\nKPX Amacron Gcommaaccent -55\nKPX Amacron O -45\nKPX Amacron Oacute -45\nKPX Amacron Ocircumflex -45\nKPX Amacron Odieresis -45\nKPX Amacron Ograve -45\nKPX Amacron Ohungarumlaut -45\nKPX Amacron Omacron -45\nKPX Amacron Oslash -45\nKPX Amacron Otilde -45\nKPX Amacron Q -45\nKPX Amacron T -95\nKPX Amacron Tcaron -95\nKPX Amacron Tcommaaccent -95\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -145\nKPX Amacron W -130\nKPX Amacron Y -100\nKPX Amacron Yacute -100\nKPX Amacron Ydieresis -100\nKPX Amacron p -25\nKPX Amacron quoteright -74\nKPX Amacron u -50\nKPX Amacron uacute -50\nKPX Amacron ucircumflex -50\nKPX Amacron udieresis -50\nKPX Amacron ugrave -50\nKPX Amacron uhungarumlaut -50\nKPX Amacron umacron -50\nKPX Amacron uogonek -50\nKPX Amacron uring -50\nKPX Amacron v -100\nKPX Amacron w -90\nKPX Amacron y -74\nKPX Amacron yacute -74\nKPX Amacron ydieresis -74\nKPX Aogonek C -55\nKPX Aogonek Cacute -55\nKPX Aogonek Ccaron -55\nKPX Aogonek Ccedilla -55\nKPX Aogonek G -55\nKPX Aogonek Gbreve -55\nKPX Aogonek Gcommaaccent -55\nKPX Aogonek O -45\nKPX Aogonek Oacute -45\nKPX Aogonek Ocircumflex -45\nKPX Aogonek Odieresis -45\nKPX Aogonek Ograve -45\nKPX Aogonek Ohungarumlaut -45\nKPX Aogonek Omacron -45\nKPX Aogonek Oslash -45\nKPX Aogonek Otilde -45\nKPX Aogonek Q -45\nKPX Aogonek T -95\nKPX Aogonek Tcaron -95\nKPX Aogonek Tcommaaccent -95\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -145\nKPX Aogonek W -130\nKPX Aogonek Y -100\nKPX Aogonek Yacute -100\nKPX Aogonek Ydieresis -100\nKPX Aogonek p -25\nKPX Aogonek quoteright -74\nKPX Aogonek u -50\nKPX Aogonek uacute -50\nKPX Aogonek ucircumflex -50\nKPX Aogonek udieresis -50\nKPX Aogonek ugrave -50\nKPX Aogonek uhungarumlaut -50\nKPX Aogonek umacron -50\nKPX Aogonek uogonek -50\nKPX Aogonek uring -50\nKPX Aogonek v -100\nKPX Aogonek w -90\nKPX Aogonek y -34\nKPX Aogonek yacute -34\nKPX Aogonek ydieresis -34\nKPX Aring C -55\nKPX Aring Cacute -55\nKPX Aring Ccaron -55\nKPX Aring Ccedilla -55\nKPX Aring G -55\nKPX Aring Gbreve -55\nKPX Aring Gcommaaccent -55\nKPX Aring O -45\nKPX Aring Oacute -45\nKPX Aring Ocircumflex -45\nKPX Aring Odieresis -45\nKPX Aring Ograve -45\nKPX Aring Ohungarumlaut -45\nKPX Aring Omacron -45\nKPX Aring Oslash -45\nKPX Aring Otilde -45\nKPX Aring Q -45\nKPX Aring T -95\nKPX Aring Tcaron -95\nKPX Aring Tcommaaccent -95\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -145\nKPX Aring W -130\nKPX Aring Y -100\nKPX Aring Yacute -100\nKPX Aring Ydieresis -100\nKPX Aring p -25\nKPX Aring quoteright -74\nKPX Aring u -50\nKPX Aring uacute -50\nKPX Aring ucircumflex -50\nKPX Aring udieresis -50\nKPX Aring ugrave -50\nKPX Aring uhungarumlaut -50\nKPX Aring umacron -50\nKPX Aring uogonek -50\nKPX Aring uring -50\nKPX Aring v -100\nKPX Aring w -90\nKPX Aring y -74\nKPX Aring yacute -74\nKPX Aring ydieresis -74\nKPX Atilde C -55\nKPX Atilde Cacute -55\nKPX Atilde Ccaron -55\nKPX Atilde Ccedilla -55\nKPX Atilde G -55\nKPX Atilde Gbreve -55\nKPX Atilde Gcommaaccent -55\nKPX Atilde O -45\nKPX Atilde Oacute -45\nKPX Atilde Ocircumflex -45\nKPX Atilde Odieresis -45\nKPX Atilde Ograve -45\nKPX Atilde Ohungarumlaut -45\nKPX Atilde Omacron -45\nKPX Atilde Oslash -45\nKPX Atilde Otilde -45\nKPX Atilde Q -45\nKPX Atilde T -95\nKPX Atilde Tcaron -95\nKPX Atilde Tcommaaccent -95\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -145\nKPX Atilde W -130\nKPX Atilde Y -100\nKPX Atilde Yacute -100\nKPX Atilde Ydieresis -100\nKPX Atilde p -25\nKPX Atilde quoteright -74\nKPX Atilde u -50\nKPX Atilde uacute -50\nKPX Atilde ucircumflex -50\nKPX Atilde udieresis -50\nKPX Atilde ugrave -50\nKPX Atilde uhungarumlaut -50\nKPX Atilde umacron -50\nKPX Atilde uogonek -50\nKPX Atilde uring -50\nKPX Atilde v -100\nKPX Atilde w -90\nKPX Atilde y -74\nKPX Atilde yacute -74\nKPX Atilde ydieresis -74\nKPX B A -30\nKPX B Aacute -30\nKPX B Abreve -30\nKPX B Acircumflex -30\nKPX B Adieresis -30\nKPX B Agrave -30\nKPX B Amacron -30\nKPX B Aogonek -30\nKPX B Aring -30\nKPX B Atilde -30\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX D A -35\nKPX D Aacute -35\nKPX D Abreve -35\nKPX D Acircumflex -35\nKPX D Adieresis -35\nKPX D Agrave -35\nKPX D Amacron -35\nKPX D Aogonek -35\nKPX D Aring -35\nKPX D Atilde -35\nKPX D V -40\nKPX D W -40\nKPX D Y -40\nKPX D Yacute -40\nKPX D Ydieresis -40\nKPX D period -20\nKPX Dcaron A -35\nKPX Dcaron Aacute -35\nKPX Dcaron Abreve -35\nKPX Dcaron Acircumflex -35\nKPX Dcaron Adieresis -35\nKPX Dcaron Agrave -35\nKPX Dcaron Amacron -35\nKPX Dcaron Aogonek -35\nKPX Dcaron Aring -35\nKPX Dcaron Atilde -35\nKPX Dcaron V -40\nKPX Dcaron W -40\nKPX Dcaron Y -40\nKPX Dcaron Yacute -40\nKPX Dcaron Ydieresis -40\nKPX Dcaron period -20\nKPX Dcroat A -35\nKPX Dcroat Aacute -35\nKPX Dcroat Abreve -35\nKPX Dcroat Acircumflex -35\nKPX Dcroat Adieresis -35\nKPX Dcroat Agrave -35\nKPX Dcroat Amacron -35\nKPX Dcroat Aogonek -35\nKPX Dcroat Aring -35\nKPX Dcroat Atilde -35\nKPX Dcroat V -40\nKPX Dcroat W -40\nKPX Dcroat Y -40\nKPX Dcroat Yacute -40\nKPX Dcroat Ydieresis -40\nKPX Dcroat period -20\nKPX F A -90\nKPX F Aacute -90\nKPX F Abreve -90\nKPX F Acircumflex -90\nKPX F Adieresis -90\nKPX F Agrave -90\nKPX F Amacron -90\nKPX F Aogonek -90\nKPX F Aring -90\nKPX F Atilde -90\nKPX F a -25\nKPX F aacute -25\nKPX F abreve -25\nKPX F acircumflex -25\nKPX F adieresis -25\nKPX F agrave -25\nKPX F amacron -25\nKPX F aogonek -25\nKPX F aring -25\nKPX F atilde -25\nKPX F comma -92\nKPX F e -25\nKPX F eacute -25\nKPX F ecaron -25\nKPX F ecircumflex -25\nKPX F edieresis -25\nKPX F edotaccent -25\nKPX F egrave -25\nKPX F emacron -25\nKPX F eogonek -25\nKPX F o -25\nKPX F oacute -25\nKPX F ocircumflex -25\nKPX F odieresis -25\nKPX F ograve -25\nKPX F ohungarumlaut -25\nKPX F omacron -25\nKPX F oslash -25\nKPX F otilde -25\nKPX F period -110\nKPX J A -30\nKPX J Aacute -30\nKPX J Abreve -30\nKPX J Acircumflex -30\nKPX J Adieresis -30\nKPX J Agrave -30\nKPX J Amacron -30\nKPX J Aogonek -30\nKPX J Aring -30\nKPX J Atilde -30\nKPX J a -15\nKPX J aacute -15\nKPX J abreve -15\nKPX J acircumflex -15\nKPX J adieresis -15\nKPX J agrave -15\nKPX J amacron -15\nKPX J aogonek -15\nKPX J aring -15\nKPX J atilde -15\nKPX J e -15\nKPX J eacute -15\nKPX J ecaron -15\nKPX J ecircumflex -15\nKPX J edieresis -15\nKPX J edotaccent -15\nKPX J egrave -15\nKPX J emacron -15\nKPX J eogonek -15\nKPX J o -15\nKPX J oacute -15\nKPX J ocircumflex -15\nKPX J odieresis -15\nKPX J ograve -15\nKPX J ohungarumlaut -15\nKPX J omacron -15\nKPX J oslash -15\nKPX J otilde -15\nKPX J period -20\nKPX J u -15\nKPX J uacute -15\nKPX J ucircumflex -15\nKPX J udieresis -15\nKPX J ugrave -15\nKPX J uhungarumlaut -15\nKPX J umacron -15\nKPX J uogonek -15\nKPX J uring -15\nKPX K O -30\nKPX K Oacute -30\nKPX K Ocircumflex -30\nKPX K Odieresis -30\nKPX K Ograve -30\nKPX K Ohungarumlaut -30\nKPX K Omacron -30\nKPX K Oslash -30\nKPX K Otilde -30\nKPX K e -25\nKPX K eacute -25\nKPX K ecaron -25\nKPX K ecircumflex -25\nKPX K edieresis -25\nKPX K edotaccent -25\nKPX K egrave -25\nKPX K emacron -25\nKPX K eogonek -25\nKPX K o -25\nKPX K oacute -25\nKPX K ocircumflex -25\nKPX K odieresis -25\nKPX K ograve -25\nKPX K ohungarumlaut -25\nKPX K omacron -25\nKPX K oslash -25\nKPX K otilde -25\nKPX K u -15\nKPX K uacute -15\nKPX K ucircumflex -15\nKPX K udieresis -15\nKPX K ugrave -15\nKPX K uhungarumlaut -15\nKPX K umacron -15\nKPX K uogonek -15\nKPX K uring -15\nKPX K y -45\nKPX K yacute -45\nKPX K ydieresis -45\nKPX Kcommaaccent O -30\nKPX Kcommaaccent Oacute -30\nKPX Kcommaaccent Ocircumflex -30\nKPX Kcommaaccent Odieresis -30\nKPX Kcommaaccent Ograve -30\nKPX Kcommaaccent Ohungarumlaut -30\nKPX Kcommaaccent Omacron -30\nKPX Kcommaaccent Oslash -30\nKPX Kcommaaccent Otilde -30\nKPX Kcommaaccent e -25\nKPX Kcommaaccent eacute -25\nKPX Kcommaaccent ecaron -25\nKPX Kcommaaccent ecircumflex -25\nKPX Kcommaaccent edieresis -25\nKPX Kcommaaccent edotaccent -25\nKPX Kcommaaccent egrave -25\nKPX Kcommaaccent emacron -25\nKPX Kcommaaccent eogonek -25\nKPX Kcommaaccent o -25\nKPX Kcommaaccent oacute -25\nKPX Kcommaaccent ocircumflex -25\nKPX Kcommaaccent odieresis -25\nKPX Kcommaaccent ograve -25\nKPX Kcommaaccent ohungarumlaut -25\nKPX Kcommaaccent omacron -25\nKPX Kcommaaccent oslash -25\nKPX Kcommaaccent otilde -25\nKPX Kcommaaccent u -15\nKPX Kcommaaccent uacute -15\nKPX Kcommaaccent ucircumflex -15\nKPX Kcommaaccent udieresis -15\nKPX Kcommaaccent ugrave -15\nKPX Kcommaaccent uhungarumlaut -15\nKPX Kcommaaccent umacron -15\nKPX Kcommaaccent uogonek -15\nKPX Kcommaaccent uring -15\nKPX Kcommaaccent y -45\nKPX Kcommaaccent yacute -45\nKPX Kcommaaccent ydieresis -45\nKPX L T -92\nKPX L Tcaron -92\nKPX L Tcommaaccent -92\nKPX L V -92\nKPX L W -92\nKPX L Y -92\nKPX L Yacute -92\nKPX L Ydieresis -92\nKPX L quotedblright -20\nKPX L quoteright -110\nKPX L y -55\nKPX L yacute -55\nKPX L ydieresis -55\nKPX Lacute T -92\nKPX Lacute Tcaron -92\nKPX Lacute Tcommaaccent -92\nKPX Lacute V -92\nKPX Lacute W -92\nKPX Lacute Y -92\nKPX Lacute Yacute -92\nKPX Lacute Ydieresis -92\nKPX Lacute quotedblright -20\nKPX Lacute quoteright -110\nKPX Lacute y -55\nKPX Lacute yacute -55\nKPX Lacute ydieresis -55\nKPX Lcommaaccent T -92\nKPX Lcommaaccent Tcaron -92\nKPX Lcommaaccent Tcommaaccent -92\nKPX Lcommaaccent V -92\nKPX Lcommaaccent W -92\nKPX Lcommaaccent Y -92\nKPX Lcommaaccent Yacute -92\nKPX Lcommaaccent Ydieresis -92\nKPX Lcommaaccent quotedblright -20\nKPX Lcommaaccent quoteright -110\nKPX Lcommaaccent y -55\nKPX Lcommaaccent yacute -55\nKPX Lcommaaccent ydieresis -55\nKPX Lslash T -92\nKPX Lslash Tcaron -92\nKPX Lslash Tcommaaccent -92\nKPX Lslash V -92\nKPX Lslash W -92\nKPX Lslash Y -92\nKPX Lslash Yacute -92\nKPX Lslash Ydieresis -92\nKPX Lslash quotedblright -20\nKPX Lslash quoteright -110\nKPX Lslash y -55\nKPX Lslash yacute -55\nKPX Lslash ydieresis -55\nKPX N A -20\nKPX N Aacute -20\nKPX N Abreve -20\nKPX N Acircumflex -20\nKPX N Adieresis -20\nKPX N Agrave -20\nKPX N Amacron -20\nKPX N Aogonek -20\nKPX N Aring -20\nKPX N Atilde -20\nKPX Nacute A -20\nKPX Nacute Aacute -20\nKPX Nacute Abreve -20\nKPX Nacute Acircumflex -20\nKPX Nacute Adieresis -20\nKPX Nacute Agrave -20\nKPX Nacute Amacron -20\nKPX Nacute Aogonek -20\nKPX Nacute Aring -20\nKPX Nacute Atilde -20\nKPX Ncaron A -20\nKPX Ncaron Aacute -20\nKPX Ncaron Abreve -20\nKPX Ncaron Acircumflex -20\nKPX Ncaron Adieresis -20\nKPX Ncaron Agrave -20\nKPX Ncaron Amacron -20\nKPX Ncaron Aogonek -20\nKPX Ncaron Aring -20\nKPX Ncaron Atilde -20\nKPX Ncommaaccent A -20\nKPX Ncommaaccent Aacute -20\nKPX Ncommaaccent Abreve -20\nKPX Ncommaaccent Acircumflex -20\nKPX Ncommaaccent Adieresis -20\nKPX Ncommaaccent Agrave -20\nKPX Ncommaaccent Amacron -20\nKPX Ncommaaccent Aogonek -20\nKPX Ncommaaccent Aring -20\nKPX Ncommaaccent Atilde -20\nKPX Ntilde A -20\nKPX Ntilde Aacute -20\nKPX Ntilde Abreve -20\nKPX Ntilde Acircumflex -20\nKPX Ntilde Adieresis -20\nKPX Ntilde Agrave -20\nKPX Ntilde Amacron -20\nKPX Ntilde Aogonek -20\nKPX Ntilde Aring -20\nKPX Ntilde Atilde -20\nKPX O A -40\nKPX O Aacute -40\nKPX O Abreve -40\nKPX O Acircumflex -40\nKPX O Adieresis -40\nKPX O Agrave -40\nKPX O Amacron -40\nKPX O Aogonek -40\nKPX O Aring -40\nKPX O Atilde -40\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -50\nKPX O X -40\nKPX O Y -50\nKPX O Yacute -50\nKPX O Ydieresis -50\nKPX Oacute A -40\nKPX Oacute Aacute -40\nKPX Oacute Abreve -40\nKPX Oacute Acircumflex -40\nKPX Oacute Adieresis -40\nKPX Oacute Agrave -40\nKPX Oacute Amacron -40\nKPX Oacute Aogonek -40\nKPX Oacute Aring -40\nKPX Oacute Atilde -40\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -50\nKPX Oacute X -40\nKPX Oacute Y -50\nKPX Oacute Yacute -50\nKPX Oacute Ydieresis -50\nKPX Ocircumflex A -40\nKPX Ocircumflex Aacute -40\nKPX Ocircumflex Abreve -40\nKPX Ocircumflex Acircumflex -40\nKPX Ocircumflex Adieresis -40\nKPX Ocircumflex Agrave -40\nKPX Ocircumflex Amacron -40\nKPX Ocircumflex Aogonek -40\nKPX Ocircumflex Aring -40\nKPX Ocircumflex Atilde -40\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -50\nKPX Ocircumflex X -40\nKPX Ocircumflex Y -50\nKPX Ocircumflex Yacute -50\nKPX Ocircumflex Ydieresis -50\nKPX Odieresis A -40\nKPX Odieresis Aacute -40\nKPX Odieresis Abreve -40\nKPX Odieresis Acircumflex -40\nKPX Odieresis Adieresis -40\nKPX Odieresis Agrave -40\nKPX Odieresis Amacron -40\nKPX Odieresis Aogonek -40\nKPX Odieresis Aring -40\nKPX Odieresis Atilde -40\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -50\nKPX Odieresis X -40\nKPX Odieresis Y -50\nKPX Odieresis Yacute -50\nKPX Odieresis Ydieresis -50\nKPX Ograve A -40\nKPX Ograve Aacute -40\nKPX Ograve Abreve -40\nKPX Ograve Acircumflex -40\nKPX Ograve Adieresis -40\nKPX Ograve Agrave -40\nKPX Ograve Amacron -40\nKPX Ograve Aogonek -40\nKPX Ograve Aring -40\nKPX Ograve Atilde -40\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -50\nKPX Ograve X -40\nKPX Ograve Y -50\nKPX Ograve Yacute -50\nKPX Ograve Ydieresis -50\nKPX Ohungarumlaut A -40\nKPX Ohungarumlaut Aacute -40\nKPX Ohungarumlaut Abreve -40\nKPX Ohungarumlaut Acircumflex -40\nKPX Ohungarumlaut Adieresis -40\nKPX Ohungarumlaut Agrave -40\nKPX Ohungarumlaut Amacron -40\nKPX Ohungarumlaut Aogonek -40\nKPX Ohungarumlaut Aring -40\nKPX Ohungarumlaut Atilde -40\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -50\nKPX Ohungarumlaut X -40\nKPX Ohungarumlaut Y -50\nKPX Ohungarumlaut Yacute -50\nKPX Ohungarumlaut Ydieresis -50\nKPX Omacron A -40\nKPX Omacron Aacute -40\nKPX Omacron Abreve -40\nKPX Omacron Acircumflex -40\nKPX Omacron Adieresis -40\nKPX Omacron Agrave -40\nKPX Omacron Amacron -40\nKPX Omacron Aogonek -40\nKPX Omacron Aring -40\nKPX Omacron Atilde -40\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -50\nKPX Omacron X -40\nKPX Omacron Y -50\nKPX Omacron Yacute -50\nKPX Omacron Ydieresis -50\nKPX Oslash A -40\nKPX Oslash Aacute -40\nKPX Oslash Abreve -40\nKPX Oslash Acircumflex -40\nKPX Oslash Adieresis -40\nKPX Oslash Agrave -40\nKPX Oslash Amacron -40\nKPX Oslash Aogonek -40\nKPX Oslash Aring -40\nKPX Oslash Atilde -40\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -50\nKPX Oslash X -40\nKPX Oslash Y -50\nKPX Oslash Yacute -50\nKPX Oslash Ydieresis -50\nKPX Otilde A -40\nKPX Otilde Aacute -40\nKPX Otilde Abreve -40\nKPX Otilde Acircumflex -40\nKPX Otilde Adieresis -40\nKPX Otilde Agrave -40\nKPX Otilde Amacron -40\nKPX Otilde Aogonek -40\nKPX Otilde Aring -40\nKPX Otilde Atilde -40\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -50\nKPX Otilde X -40\nKPX Otilde Y -50\nKPX Otilde Yacute -50\nKPX Otilde Ydieresis -50\nKPX P A -74\nKPX P Aacute -74\nKPX P Abreve -74\nKPX P Acircumflex -74\nKPX P Adieresis -74\nKPX P Agrave -74\nKPX P Amacron -74\nKPX P Aogonek -74\nKPX P Aring -74\nKPX P Atilde -74\nKPX P a -10\nKPX P aacute -10\nKPX P abreve -10\nKPX P acircumflex -10\nKPX P adieresis -10\nKPX P agrave -10\nKPX P amacron -10\nKPX P aogonek -10\nKPX P aring -10\nKPX P atilde -10\nKPX P comma -92\nKPX P e -20\nKPX P eacute -20\nKPX P ecaron -20\nKPX P ecircumflex -20\nKPX P edieresis -20\nKPX P edotaccent -20\nKPX P egrave -20\nKPX P emacron -20\nKPX P eogonek -20\nKPX P o -20\nKPX P oacute -20\nKPX P ocircumflex -20\nKPX P odieresis -20\nKPX P ograve -20\nKPX P ohungarumlaut -20\nKPX P omacron -20\nKPX P oslash -20\nKPX P otilde -20\nKPX P period -110\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX Q period -20\nKPX R O -30\nKPX R Oacute -30\nKPX R Ocircumflex -30\nKPX R Odieresis -30\nKPX R Ograve -30\nKPX R Ohungarumlaut -30\nKPX R Omacron -30\nKPX R Oslash -30\nKPX R Otilde -30\nKPX R T -40\nKPX R Tcaron -40\nKPX R Tcommaaccent -40\nKPX R U -30\nKPX R Uacute -30\nKPX R Ucircumflex -30\nKPX R Udieresis -30\nKPX R Ugrave -30\nKPX R Uhungarumlaut -30\nKPX R Umacron -30\nKPX R Uogonek -30\nKPX R Uring -30\nKPX R V -55\nKPX R W -35\nKPX R Y -35\nKPX R Yacute -35\nKPX R Ydieresis -35\nKPX Racute O -30\nKPX Racute Oacute -30\nKPX Racute Ocircumflex -30\nKPX Racute Odieresis -30\nKPX Racute Ograve -30\nKPX Racute Ohungarumlaut -30\nKPX Racute Omacron -30\nKPX Racute Oslash -30\nKPX Racute Otilde -30\nKPX Racute T -40\nKPX Racute Tcaron -40\nKPX Racute Tcommaaccent -40\nKPX Racute U -30\nKPX Racute Uacute -30\nKPX Racute Ucircumflex -30\nKPX Racute Udieresis -30\nKPX Racute Ugrave -30\nKPX Racute Uhungarumlaut -30\nKPX Racute Umacron -30\nKPX Racute Uogonek -30\nKPX Racute Uring -30\nKPX Racute V -55\nKPX Racute W -35\nKPX Racute Y -35\nKPX Racute Yacute -35\nKPX Racute Ydieresis -35\nKPX Rcaron O -30\nKPX Rcaron Oacute -30\nKPX Rcaron Ocircumflex -30\nKPX Rcaron Odieresis -30\nKPX Rcaron Ograve -30\nKPX Rcaron Ohungarumlaut -30\nKPX Rcaron Omacron -30\nKPX Rcaron Oslash -30\nKPX Rcaron Otilde -30\nKPX Rcaron T -40\nKPX Rcaron Tcaron -40\nKPX Rcaron Tcommaaccent -40\nKPX Rcaron U -30\nKPX Rcaron Uacute -30\nKPX Rcaron Ucircumflex -30\nKPX Rcaron Udieresis -30\nKPX Rcaron Ugrave -30\nKPX Rcaron Uhungarumlaut -30\nKPX Rcaron Umacron -30\nKPX Rcaron Uogonek -30\nKPX Rcaron Uring -30\nKPX Rcaron V -55\nKPX Rcaron W -35\nKPX Rcaron Y -35\nKPX Rcaron Yacute -35\nKPX Rcaron Ydieresis -35\nKPX Rcommaaccent O -30\nKPX Rcommaaccent Oacute -30\nKPX Rcommaaccent Ocircumflex -30\nKPX Rcommaaccent Odieresis -30\nKPX Rcommaaccent Ograve -30\nKPX Rcommaaccent Ohungarumlaut -30\nKPX Rcommaaccent Omacron -30\nKPX Rcommaaccent Oslash -30\nKPX Rcommaaccent Otilde -30\nKPX Rcommaaccent T -40\nKPX Rcommaaccent Tcaron -40\nKPX Rcommaaccent Tcommaaccent -40\nKPX Rcommaaccent U -30\nKPX Rcommaaccent Uacute -30\nKPX Rcommaaccent Ucircumflex -30\nKPX Rcommaaccent Udieresis -30\nKPX Rcommaaccent Ugrave -30\nKPX Rcommaaccent Uhungarumlaut -30\nKPX Rcommaaccent Umacron -30\nKPX Rcommaaccent Uogonek -30\nKPX Rcommaaccent Uring -30\nKPX Rcommaaccent V -55\nKPX Rcommaaccent W -35\nKPX Rcommaaccent Y -35\nKPX Rcommaaccent Yacute -35\nKPX Rcommaaccent Ydieresis -35\nKPX T A -90\nKPX T Aacute -90\nKPX T Abreve -90\nKPX T Acircumflex -90\nKPX T Adieresis -90\nKPX T Agrave -90\nKPX T Amacron -90\nKPX T Aogonek -90\nKPX T Aring -90\nKPX T Atilde -90\nKPX T O -18\nKPX T Oacute -18\nKPX T Ocircumflex -18\nKPX T Odieresis -18\nKPX T Ograve -18\nKPX T Ohungarumlaut -18\nKPX T Omacron -18\nKPX T Oslash -18\nKPX T Otilde -18\nKPX T a -92\nKPX T aacute -92\nKPX T abreve -52\nKPX T acircumflex -52\nKPX T adieresis -52\nKPX T agrave -52\nKPX T amacron -52\nKPX T aogonek -92\nKPX T aring -92\nKPX T atilde -52\nKPX T colon -74\nKPX T comma -74\nKPX T e -92\nKPX T eacute -92\nKPX T ecaron -92\nKPX T ecircumflex -92\nKPX T edieresis -52\nKPX T edotaccent -92\nKPX T egrave -52\nKPX T emacron -52\nKPX T eogonek -92\nKPX T hyphen -92\nKPX T i -18\nKPX T iacute -18\nKPX T iogonek -18\nKPX T o -92\nKPX T oacute -92\nKPX T ocircumflex -92\nKPX T odieresis -92\nKPX T ograve -92\nKPX T ohungarumlaut -92\nKPX T omacron -92\nKPX T oslash -92\nKPX T otilde -92\nKPX T period -90\nKPX T r -74\nKPX T racute -74\nKPX T rcaron -74\nKPX T rcommaaccent -74\nKPX T semicolon -74\nKPX T u -92\nKPX T uacute -92\nKPX T ucircumflex -92\nKPX T udieresis -92\nKPX T ugrave -92\nKPX T uhungarumlaut -92\nKPX T umacron -92\nKPX T uogonek -92\nKPX T uring -92\nKPX T w -74\nKPX T y -34\nKPX T yacute -34\nKPX T ydieresis -34\nKPX Tcaron A -90\nKPX Tcaron Aacute -90\nKPX Tcaron Abreve -90\nKPX Tcaron Acircumflex -90\nKPX Tcaron Adieresis -90\nKPX Tcaron Agrave -90\nKPX Tcaron Amacron -90\nKPX Tcaron Aogonek -90\nKPX Tcaron Aring -90\nKPX Tcaron Atilde -90\nKPX Tcaron O -18\nKPX Tcaron Oacute -18\nKPX Tcaron Ocircumflex -18\nKPX Tcaron Odieresis -18\nKPX Tcaron Ograve -18\nKPX Tcaron Ohungarumlaut -18\nKPX Tcaron Omacron -18\nKPX Tcaron Oslash -18\nKPX Tcaron Otilde -18\nKPX Tcaron a -92\nKPX Tcaron aacute -92\nKPX Tcaron abreve -52\nKPX Tcaron acircumflex -52\nKPX Tcaron adieresis -52\nKPX Tcaron agrave -52\nKPX Tcaron amacron -52\nKPX Tcaron aogonek -92\nKPX Tcaron aring -92\nKPX Tcaron atilde -52\nKPX Tcaron colon -74\nKPX Tcaron comma -74\nKPX Tcaron e -92\nKPX Tcaron eacute -92\nKPX Tcaron ecaron -92\nKPX Tcaron ecircumflex -92\nKPX Tcaron edieresis -52\nKPX Tcaron edotaccent -92\nKPX Tcaron egrave -52\nKPX Tcaron emacron -52\nKPX Tcaron eogonek -92\nKPX Tcaron hyphen -92\nKPX Tcaron i -18\nKPX Tcaron iacute -18\nKPX Tcaron iogonek -18\nKPX Tcaron o -92\nKPX Tcaron oacute -92\nKPX Tcaron ocircumflex -92\nKPX Tcaron odieresis -92\nKPX Tcaron ograve -92\nKPX Tcaron ohungarumlaut -92\nKPX Tcaron omacron -92\nKPX Tcaron oslash -92\nKPX Tcaron otilde -92\nKPX Tcaron period -90\nKPX Tcaron r -74\nKPX Tcaron racute -74\nKPX Tcaron rcaron -74\nKPX Tcaron rcommaaccent -74\nKPX Tcaron semicolon -74\nKPX Tcaron u -92\nKPX Tcaron uacute -92\nKPX Tcaron ucircumflex -92\nKPX Tcaron udieresis -92\nKPX Tcaron ugrave -92\nKPX Tcaron uhungarumlaut -92\nKPX Tcaron umacron -92\nKPX Tcaron uogonek -92\nKPX Tcaron uring -92\nKPX Tcaron w -74\nKPX Tcaron y -34\nKPX Tcaron yacute -34\nKPX Tcaron ydieresis -34\nKPX Tcommaaccent A -90\nKPX Tcommaaccent Aacute -90\nKPX Tcommaaccent Abreve -90\nKPX Tcommaaccent Acircumflex -90\nKPX Tcommaaccent Adieresis -90\nKPX Tcommaaccent Agrave -90\nKPX Tcommaaccent Amacron -90\nKPX Tcommaaccent Aogonek -90\nKPX Tcommaaccent Aring -90\nKPX Tcommaaccent Atilde -90\nKPX Tcommaaccent O -18\nKPX Tcommaaccent Oacute -18\nKPX Tcommaaccent Ocircumflex -18\nKPX Tcommaaccent Odieresis -18\nKPX Tcommaaccent Ograve -18\nKPX Tcommaaccent Ohungarumlaut -18\nKPX Tcommaaccent Omacron -18\nKPX Tcommaaccent Oslash -18\nKPX Tcommaaccent Otilde -18\nKPX Tcommaaccent a -92\nKPX Tcommaaccent aacute -92\nKPX Tcommaaccent abreve -52\nKPX Tcommaaccent acircumflex -52\nKPX Tcommaaccent adieresis -52\nKPX Tcommaaccent agrave -52\nKPX Tcommaaccent amacron -52\nKPX Tcommaaccent aogonek -92\nKPX Tcommaaccent aring -92\nKPX Tcommaaccent atilde -52\nKPX Tcommaaccent colon -74\nKPX Tcommaaccent comma -74\nKPX Tcommaaccent e -92\nKPX Tcommaaccent eacute -92\nKPX Tcommaaccent ecaron -92\nKPX Tcommaaccent ecircumflex -92\nKPX Tcommaaccent edieresis -52\nKPX Tcommaaccent edotaccent -92\nKPX Tcommaaccent egrave -52\nKPX Tcommaaccent emacron -52\nKPX Tcommaaccent eogonek -92\nKPX Tcommaaccent hyphen -92\nKPX Tcommaaccent i -18\nKPX Tcommaaccent iacute -18\nKPX Tcommaaccent iogonek -18\nKPX Tcommaaccent o -92\nKPX Tcommaaccent oacute -92\nKPX Tcommaaccent ocircumflex -92\nKPX Tcommaaccent odieresis -92\nKPX Tcommaaccent ograve -92\nKPX Tcommaaccent ohungarumlaut -92\nKPX Tcommaaccent omacron -92\nKPX Tcommaaccent oslash -92\nKPX Tcommaaccent otilde -92\nKPX Tcommaaccent period -90\nKPX Tcommaaccent r -74\nKPX Tcommaaccent racute -74\nKPX Tcommaaccent rcaron -74\nKPX Tcommaaccent rcommaaccent -74\nKPX Tcommaaccent semicolon -74\nKPX Tcommaaccent u -92\nKPX Tcommaaccent uacute -92\nKPX Tcommaaccent ucircumflex -92\nKPX Tcommaaccent udieresis -92\nKPX Tcommaaccent ugrave -92\nKPX Tcommaaccent uhungarumlaut -92\nKPX Tcommaaccent umacron -92\nKPX Tcommaaccent uogonek -92\nKPX Tcommaaccent uring -92\nKPX Tcommaaccent w -74\nKPX Tcommaaccent y -34\nKPX Tcommaaccent yacute -34\nKPX Tcommaaccent ydieresis -34\nKPX U A -60\nKPX U Aacute -60\nKPX U Abreve -60\nKPX U Acircumflex -60\nKPX U Adieresis -60\nKPX U Agrave -60\nKPX U Amacron -60\nKPX U Aogonek -60\nKPX U Aring -60\nKPX U Atilde -60\nKPX U comma -50\nKPX U period -50\nKPX Uacute A -60\nKPX Uacute Aacute -60\nKPX Uacute Abreve -60\nKPX Uacute Acircumflex -60\nKPX Uacute Adieresis -60\nKPX Uacute Agrave -60\nKPX Uacute Amacron -60\nKPX Uacute Aogonek -60\nKPX Uacute Aring -60\nKPX Uacute Atilde -60\nKPX Uacute comma -50\nKPX Uacute period -50\nKPX Ucircumflex A -60\nKPX Ucircumflex Aacute -60\nKPX Ucircumflex Abreve -60\nKPX Ucircumflex Acircumflex -60\nKPX Ucircumflex Adieresis -60\nKPX Ucircumflex Agrave -60\nKPX Ucircumflex Amacron -60\nKPX Ucircumflex Aogonek -60\nKPX Ucircumflex Aring -60\nKPX Ucircumflex Atilde -60\nKPX Ucircumflex comma -50\nKPX Ucircumflex period -50\nKPX Udieresis A -60\nKPX Udieresis Aacute -60\nKPX Udieresis Abreve -60\nKPX Udieresis Acircumflex -60\nKPX Udieresis Adieresis -60\nKPX Udieresis Agrave -60\nKPX Udieresis Amacron -60\nKPX Udieresis Aogonek -60\nKPX Udieresis Aring -60\nKPX Udieresis Atilde -60\nKPX Udieresis comma -50\nKPX Udieresis period -50\nKPX Ugrave A -60\nKPX Ugrave Aacute -60\nKPX Ugrave Abreve -60\nKPX Ugrave Acircumflex -60\nKPX Ugrave Adieresis -60\nKPX Ugrave Agrave -60\nKPX Ugrave Amacron -60\nKPX Ugrave Aogonek -60\nKPX Ugrave Aring -60\nKPX Ugrave Atilde -60\nKPX Ugrave comma -50\nKPX Ugrave period -50\nKPX Uhungarumlaut A -60\nKPX Uhungarumlaut Aacute -60\nKPX Uhungarumlaut Abreve -60\nKPX Uhungarumlaut Acircumflex -60\nKPX Uhungarumlaut Adieresis -60\nKPX Uhungarumlaut Agrave -60\nKPX Uhungarumlaut Amacron -60\nKPX Uhungarumlaut Aogonek -60\nKPX Uhungarumlaut Aring -60\nKPX Uhungarumlaut Atilde -60\nKPX Uhungarumlaut comma -50\nKPX Uhungarumlaut period -50\nKPX Umacron A -60\nKPX Umacron Aacute -60\nKPX Umacron Abreve -60\nKPX Umacron Acircumflex -60\nKPX Umacron Adieresis -60\nKPX Umacron Agrave -60\nKPX Umacron Amacron -60\nKPX Umacron Aogonek -60\nKPX Umacron Aring -60\nKPX Umacron Atilde -60\nKPX Umacron comma -50\nKPX Umacron period -50\nKPX Uogonek A -60\nKPX Uogonek Aacute -60\nKPX Uogonek Abreve -60\nKPX Uogonek Acircumflex -60\nKPX Uogonek Adieresis -60\nKPX Uogonek Agrave -60\nKPX Uogonek Amacron -60\nKPX Uogonek Aogonek -60\nKPX Uogonek Aring -60\nKPX Uogonek Atilde -60\nKPX Uogonek comma -50\nKPX Uogonek period -50\nKPX Uring A -60\nKPX Uring Aacute -60\nKPX Uring Abreve -60\nKPX Uring Acircumflex -60\nKPX Uring Adieresis -60\nKPX Uring Agrave -60\nKPX Uring Amacron -60\nKPX Uring Aogonek -60\nKPX Uring Aring -60\nKPX Uring Atilde -60\nKPX Uring comma -50\nKPX Uring period -50\nKPX V A -135\nKPX V Aacute -135\nKPX V Abreve -135\nKPX V Acircumflex -135\nKPX V Adieresis -135\nKPX V Agrave -135\nKPX V Amacron -135\nKPX V Aogonek -135\nKPX V Aring -135\nKPX V Atilde -135\nKPX V G -30\nKPX V Gbreve -30\nKPX V Gcommaaccent -30\nKPX V O -45\nKPX V Oacute -45\nKPX V Ocircumflex -45\nKPX V Odieresis -45\nKPX V Ograve -45\nKPX V Ohungarumlaut -45\nKPX V Omacron -45\nKPX V Oslash -45\nKPX V Otilde -45\nKPX V a -92\nKPX V aacute -92\nKPX V abreve -92\nKPX V acircumflex -92\nKPX V adieresis -92\nKPX V agrave -92\nKPX V amacron -92\nKPX V aogonek -92\nKPX V aring -92\nKPX V atilde -92\nKPX V colon -92\nKPX V comma -129\nKPX V e -100\nKPX V eacute -100\nKPX V ecaron -100\nKPX V ecircumflex -100\nKPX V edieresis -100\nKPX V edotaccent -100\nKPX V egrave -100\nKPX V emacron -100\nKPX V eogonek -100\nKPX V hyphen -74\nKPX V i -37\nKPX V iacute -37\nKPX V icircumflex -37\nKPX V idieresis -37\nKPX V igrave -37\nKPX V imacron -37\nKPX V iogonek -37\nKPX V o -100\nKPX V oacute -100\nKPX V ocircumflex -100\nKPX V odieresis -100\nKPX V ograve -100\nKPX V ohungarumlaut -100\nKPX V omacron -100\nKPX V oslash -100\nKPX V otilde -100\nKPX V period -145\nKPX V semicolon -92\nKPX V u -92\nKPX V uacute -92\nKPX V ucircumflex -92\nKPX V udieresis -92\nKPX V ugrave -92\nKPX V uhungarumlaut -92\nKPX V umacron -92\nKPX V uogonek -92\nKPX V uring -92\nKPX W A -120\nKPX W Aacute -120\nKPX W Abreve -120\nKPX W Acircumflex -120\nKPX W Adieresis -120\nKPX W Agrave -120\nKPX W Amacron -120\nKPX W Aogonek -120\nKPX W Aring -120\nKPX W Atilde -120\nKPX W O -10\nKPX W Oacute -10\nKPX W Ocircumflex -10\nKPX W Odieresis -10\nKPX W Ograve -10\nKPX W Ohungarumlaut -10\nKPX W Omacron -10\nKPX W Oslash -10\nKPX W Otilde -10\nKPX W a -65\nKPX W aacute -65\nKPX W abreve -65\nKPX W acircumflex -65\nKPX W adieresis -65\nKPX W agrave -65\nKPX W amacron -65\nKPX W aogonek -65\nKPX W aring -65\nKPX W atilde -65\nKPX W colon -55\nKPX W comma -92\nKPX W e -65\nKPX W eacute -65\nKPX W ecaron -65\nKPX W ecircumflex -65\nKPX W edieresis -65\nKPX W edotaccent -65\nKPX W egrave -65\nKPX W emacron -65\nKPX W eogonek -65\nKPX W hyphen -37\nKPX W i -18\nKPX W iacute -18\nKPX W iogonek -18\nKPX W o -75\nKPX W oacute -75\nKPX W ocircumflex -75\nKPX W odieresis -75\nKPX W ograve -75\nKPX W ohungarumlaut -75\nKPX W omacron -75\nKPX W oslash -75\nKPX W otilde -75\nKPX W period -92\nKPX W semicolon -55\nKPX W u -50\nKPX W uacute -50\nKPX W ucircumflex -50\nKPX W udieresis -50\nKPX W ugrave -50\nKPX W uhungarumlaut -50\nKPX W umacron -50\nKPX W uogonek -50\nKPX W uring -50\nKPX W y -60\nKPX W yacute -60\nKPX W ydieresis -60\nKPX Y A -110\nKPX Y Aacute -110\nKPX Y Abreve -110\nKPX Y Acircumflex -110\nKPX Y Adieresis -110\nKPX Y Agrave -110\nKPX Y Amacron -110\nKPX Y Aogonek -110\nKPX Y Aring -110\nKPX Y Atilde -110\nKPX Y O -35\nKPX Y Oacute -35\nKPX Y Ocircumflex -35\nKPX Y Odieresis -35\nKPX Y Ograve -35\nKPX Y Ohungarumlaut -35\nKPX Y Omacron -35\nKPX Y Oslash -35\nKPX Y Otilde -35\nKPX Y a -85\nKPX Y aacute -85\nKPX Y abreve -85\nKPX Y acircumflex -85\nKPX Y adieresis -85\nKPX Y agrave -85\nKPX Y amacron -85\nKPX Y aogonek -85\nKPX Y aring -85\nKPX Y atilde -85\nKPX Y colon -92\nKPX Y comma -92\nKPX Y e -111\nKPX Y eacute -111\nKPX Y ecaron -111\nKPX Y ecircumflex -111\nKPX Y edieresis -71\nKPX Y edotaccent -111\nKPX Y egrave -71\nKPX Y emacron -71\nKPX Y eogonek -111\nKPX Y hyphen -92\nKPX Y i -37\nKPX Y iacute -37\nKPX Y iogonek -37\nKPX Y o -111\nKPX Y oacute -111\nKPX Y ocircumflex -111\nKPX Y odieresis -111\nKPX Y ograve -111\nKPX Y ohungarumlaut -111\nKPX Y omacron -111\nKPX Y oslash -111\nKPX Y otilde -111\nKPX Y period -92\nKPX Y semicolon -92\nKPX Y u -92\nKPX Y uacute -92\nKPX Y ucircumflex -92\nKPX Y udieresis -92\nKPX Y ugrave -92\nKPX Y uhungarumlaut -92\nKPX Y umacron -92\nKPX Y uogonek -92\nKPX Y uring -92\nKPX Yacute A -110\nKPX Yacute Aacute -110\nKPX Yacute Abreve -110\nKPX Yacute Acircumflex -110\nKPX Yacute Adieresis -110\nKPX Yacute Agrave -110\nKPX Yacute Amacron -110\nKPX Yacute Aogonek -110\nKPX Yacute Aring -110\nKPX Yacute Atilde -110\nKPX Yacute O -35\nKPX Yacute Oacute -35\nKPX Yacute Ocircumflex -35\nKPX Yacute Odieresis -35\nKPX Yacute Ograve -35\nKPX Yacute Ohungarumlaut -35\nKPX Yacute Omacron -35\nKPX Yacute Oslash -35\nKPX Yacute Otilde -35\nKPX Yacute a -85\nKPX Yacute aacute -85\nKPX Yacute abreve -85\nKPX Yacute acircumflex -85\nKPX Yacute adieresis -85\nKPX Yacute agrave -85\nKPX Yacute amacron -85\nKPX Yacute aogonek -85\nKPX Yacute aring -85\nKPX Yacute atilde -85\nKPX Yacute colon -92\nKPX Yacute comma -92\nKPX Yacute e -111\nKPX Yacute eacute -111\nKPX Yacute ecaron -111\nKPX Yacute ecircumflex -111\nKPX Yacute edieresis -71\nKPX Yacute edotaccent -111\nKPX Yacute egrave -71\nKPX Yacute emacron -71\nKPX Yacute eogonek -111\nKPX Yacute hyphen -92\nKPX Yacute i -37\nKPX Yacute iacute -37\nKPX Yacute iogonek -37\nKPX Yacute o -111\nKPX Yacute oacute -111\nKPX Yacute ocircumflex -111\nKPX Yacute odieresis -111\nKPX Yacute ograve -111\nKPX Yacute ohungarumlaut -111\nKPX Yacute omacron -111\nKPX Yacute oslash -111\nKPX Yacute otilde -111\nKPX Yacute period -92\nKPX Yacute semicolon -92\nKPX Yacute u -92\nKPX Yacute uacute -92\nKPX Yacute ucircumflex -92\nKPX Yacute udieresis -92\nKPX Yacute ugrave -92\nKPX Yacute uhungarumlaut -92\nKPX Yacute umacron -92\nKPX Yacute uogonek -92\nKPX Yacute uring -92\nKPX Ydieresis A -110\nKPX Ydieresis Aacute -110\nKPX Ydieresis Abreve -110\nKPX Ydieresis Acircumflex -110\nKPX Ydieresis Adieresis -110\nKPX Ydieresis Agrave -110\nKPX Ydieresis Amacron -110\nKPX Ydieresis Aogonek -110\nKPX Ydieresis Aring -110\nKPX Ydieresis Atilde -110\nKPX Ydieresis O -35\nKPX Ydieresis Oacute -35\nKPX Ydieresis Ocircumflex -35\nKPX Ydieresis Odieresis -35\nKPX Ydieresis Ograve -35\nKPX Ydieresis Ohungarumlaut -35\nKPX Ydieresis Omacron -35\nKPX Ydieresis Oslash -35\nKPX Ydieresis Otilde -35\nKPX Ydieresis a -85\nKPX Ydieresis aacute -85\nKPX Ydieresis abreve -85\nKPX Ydieresis acircumflex -85\nKPX Ydieresis adieresis -85\nKPX Ydieresis agrave -85\nKPX Ydieresis amacron -85\nKPX Ydieresis aogonek -85\nKPX Ydieresis aring -85\nKPX Ydieresis atilde -85\nKPX Ydieresis colon -92\nKPX Ydieresis comma -92\nKPX Ydieresis e -111\nKPX Ydieresis eacute -111\nKPX Ydieresis ecaron -111\nKPX Ydieresis ecircumflex -111\nKPX Ydieresis edieresis -71\nKPX Ydieresis edotaccent -111\nKPX Ydieresis egrave -71\nKPX Ydieresis emacron -71\nKPX Ydieresis eogonek -111\nKPX Ydieresis hyphen -92\nKPX Ydieresis i -37\nKPX Ydieresis iacute -37\nKPX Ydieresis iogonek -37\nKPX Ydieresis o -111\nKPX Ydieresis oacute -111\nKPX Ydieresis ocircumflex -111\nKPX Ydieresis odieresis -111\nKPX Ydieresis ograve -111\nKPX Ydieresis ohungarumlaut -111\nKPX Ydieresis omacron -111\nKPX Ydieresis oslash -111\nKPX Ydieresis otilde -111\nKPX Ydieresis period -92\nKPX Ydieresis semicolon -92\nKPX Ydieresis u -92\nKPX Ydieresis uacute -92\nKPX Ydieresis ucircumflex -92\nKPX Ydieresis udieresis -92\nKPX Ydieresis ugrave -92\nKPX Ydieresis uhungarumlaut -92\nKPX Ydieresis umacron -92\nKPX Ydieresis uogonek -92\nKPX Ydieresis uring -92\nKPX a v -25\nKPX aacute v -25\nKPX abreve v -25\nKPX acircumflex v -25\nKPX adieresis v -25\nKPX agrave v -25\nKPX amacron v -25\nKPX aogonek v -25\nKPX aring v -25\nKPX atilde v -25\nKPX b b -10\nKPX b period -40\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX b v -15\nKPX comma quotedblright -45\nKPX comma quoteright -55\nKPX d w -15\nKPX dcroat w -15\nKPX e v -15\nKPX eacute v -15\nKPX ecaron v -15\nKPX ecircumflex v -15\nKPX edieresis v -15\nKPX edotaccent v -15\nKPX egrave v -15\nKPX emacron v -15\nKPX eogonek v -15\nKPX f comma -15\nKPX f dotlessi -35\nKPX f i -25\nKPX f o -25\nKPX f oacute -25\nKPX f ocircumflex -25\nKPX f odieresis -25\nKPX f ograve -25\nKPX f ohungarumlaut -25\nKPX f omacron -25\nKPX f oslash -25\nKPX f otilde -25\nKPX f period -15\nKPX f quotedblright 50\nKPX f quoteright 55\nKPX g period -15\nKPX gbreve period -15\nKPX gcommaaccent period -15\nKPX h y -15\nKPX h yacute -15\nKPX h ydieresis -15\nKPX i v -10\nKPX iacute v -10\nKPX icircumflex v -10\nKPX idieresis v -10\nKPX igrave v -10\nKPX imacron v -10\nKPX iogonek v -10\nKPX k e -10\nKPX k eacute -10\nKPX k ecaron -10\nKPX k ecircumflex -10\nKPX k edieresis -10\nKPX k edotaccent -10\nKPX k egrave -10\nKPX k emacron -10\nKPX k eogonek -10\nKPX k o -15\nKPX k oacute -15\nKPX k ocircumflex -15\nKPX k odieresis -15\nKPX k ograve -15\nKPX k ohungarumlaut -15\nKPX k omacron -15\nKPX k oslash -15\nKPX k otilde -15\nKPX k y -15\nKPX k yacute -15\nKPX k ydieresis -15\nKPX kcommaaccent e -10\nKPX kcommaaccent eacute -10\nKPX kcommaaccent ecaron -10\nKPX kcommaaccent ecircumflex -10\nKPX kcommaaccent edieresis -10\nKPX kcommaaccent edotaccent -10\nKPX kcommaaccent egrave -10\nKPX kcommaaccent emacron -10\nKPX kcommaaccent eogonek -10\nKPX kcommaaccent o -15\nKPX kcommaaccent oacute -15\nKPX kcommaaccent ocircumflex -15\nKPX kcommaaccent odieresis -15\nKPX kcommaaccent ograve -15\nKPX kcommaaccent ohungarumlaut -15\nKPX kcommaaccent omacron -15\nKPX kcommaaccent oslash -15\nKPX kcommaaccent otilde -15\nKPX kcommaaccent y -15\nKPX kcommaaccent yacute -15\nKPX kcommaaccent ydieresis -15\nKPX n v -40\nKPX nacute v -40\nKPX ncaron v -40\nKPX ncommaaccent v -40\nKPX ntilde v -40\nKPX o v -10\nKPX o w -10\nKPX oacute v -10\nKPX oacute w -10\nKPX ocircumflex v -10\nKPX ocircumflex w -10\nKPX odieresis v -10\nKPX odieresis w -10\nKPX ograve v -10\nKPX ograve w -10\nKPX ohungarumlaut v -10\nKPX ohungarumlaut w -10\nKPX omacron v -10\nKPX omacron w -10\nKPX oslash v -10\nKPX oslash w -10\nKPX otilde v -10\nKPX otilde w -10\nKPX period quotedblright -55\nKPX period quoteright -55\nKPX quotedblleft A -10\nKPX quotedblleft Aacute -10\nKPX quotedblleft Abreve -10\nKPX quotedblleft Acircumflex -10\nKPX quotedblleft Adieresis -10\nKPX quotedblleft Agrave -10\nKPX quotedblleft Amacron -10\nKPX quotedblleft Aogonek -10\nKPX quotedblleft Aring -10\nKPX quotedblleft Atilde -10\nKPX quoteleft A -10\nKPX quoteleft Aacute -10\nKPX quoteleft Abreve -10\nKPX quoteleft Acircumflex -10\nKPX quoteleft Adieresis -10\nKPX quoteleft Agrave -10\nKPX quoteleft Amacron -10\nKPX quoteleft Aogonek -10\nKPX quoteleft Aring -10\nKPX quoteleft Atilde -10\nKPX quoteleft quoteleft -63\nKPX quoteright d -20\nKPX quoteright dcroat -20\nKPX quoteright quoteright -63\nKPX quoteright r -20\nKPX quoteright racute -20\nKPX quoteright rcaron -20\nKPX quoteright rcommaaccent -20\nKPX quoteright s -37\nKPX quoteright sacute -37\nKPX quoteright scaron -37\nKPX quoteright scedilla -37\nKPX quoteright scommaaccent -37\nKPX quoteright space -74\nKPX quoteright v -20\nKPX r c -18\nKPX r cacute -18\nKPX r ccaron -18\nKPX r ccedilla -18\nKPX r comma -92\nKPX r e -18\nKPX r eacute -18\nKPX r ecaron -18\nKPX r ecircumflex -18\nKPX r edieresis -18\nKPX r edotaccent -18\nKPX r egrave -18\nKPX r emacron -18\nKPX r eogonek -18\nKPX r g -10\nKPX r gbreve -10\nKPX r gcommaaccent -10\nKPX r hyphen -37\nKPX r n -15\nKPX r nacute -15\nKPX r ncaron -15\nKPX r ncommaaccent -15\nKPX r ntilde -15\nKPX r o -18\nKPX r oacute -18\nKPX r ocircumflex -18\nKPX r odieresis -18\nKPX r ograve -18\nKPX r ohungarumlaut -18\nKPX r omacron -18\nKPX r oslash -18\nKPX r otilde -18\nKPX r p -10\nKPX r period -100\nKPX r q -18\nKPX r v -10\nKPX racute c -18\nKPX racute cacute -18\nKPX racute ccaron -18\nKPX racute ccedilla -18\nKPX racute comma -92\nKPX racute e -18\nKPX racute eacute -18\nKPX racute ecaron -18\nKPX racute ecircumflex -18\nKPX racute edieresis -18\nKPX racute edotaccent -18\nKPX racute egrave -18\nKPX racute emacron -18\nKPX racute eogonek -18\nKPX racute g -10\nKPX racute gbreve -10\nKPX racute gcommaaccent -10\nKPX racute hyphen -37\nKPX racute n -15\nKPX racute nacute -15\nKPX racute ncaron -15\nKPX racute ncommaaccent -15\nKPX racute ntilde -15\nKPX racute o -18\nKPX racute oacute -18\nKPX racute ocircumflex -18\nKPX racute odieresis -18\nKPX racute ograve -18\nKPX racute ohungarumlaut -18\nKPX racute omacron -18\nKPX racute oslash -18\nKPX racute otilde -18\nKPX racute p -10\nKPX racute period -100\nKPX racute q -18\nKPX racute v -10\nKPX rcaron c -18\nKPX rcaron cacute -18\nKPX rcaron ccaron -18\nKPX rcaron ccedilla -18\nKPX rcaron comma -92\nKPX rcaron e -18\nKPX rcaron eacute -18\nKPX rcaron ecaron -18\nKPX rcaron ecircumflex -18\nKPX rcaron edieresis -18\nKPX rcaron edotaccent -18\nKPX rcaron egrave -18\nKPX rcaron emacron -18\nKPX rcaron eogonek -18\nKPX rcaron g -10\nKPX rcaron gbreve -10\nKPX rcaron gcommaaccent -10\nKPX rcaron hyphen -37\nKPX rcaron n -15\nKPX rcaron nacute -15\nKPX rcaron ncaron -15\nKPX rcaron ncommaaccent -15\nKPX rcaron ntilde -15\nKPX rcaron o -18\nKPX rcaron oacute -18\nKPX rcaron ocircumflex -18\nKPX rcaron odieresis -18\nKPX rcaron ograve -18\nKPX rcaron ohungarumlaut -18\nKPX rcaron omacron -18\nKPX rcaron oslash -18\nKPX rcaron otilde -18\nKPX rcaron p -10\nKPX rcaron period -100\nKPX rcaron q -18\nKPX rcaron v -10\nKPX rcommaaccent c -18\nKPX rcommaaccent cacute -18\nKPX rcommaaccent ccaron -18\nKPX rcommaaccent ccedilla -18\nKPX rcommaaccent comma -92\nKPX rcommaaccent e -18\nKPX rcommaaccent eacute -18\nKPX rcommaaccent ecaron -18\nKPX rcommaaccent ecircumflex -18\nKPX rcommaaccent edieresis -18\nKPX rcommaaccent edotaccent -18\nKPX rcommaaccent egrave -18\nKPX rcommaaccent emacron -18\nKPX rcommaaccent eogonek -18\nKPX rcommaaccent g -10\nKPX rcommaaccent gbreve -10\nKPX rcommaaccent gcommaaccent -10\nKPX rcommaaccent hyphen -37\nKPX rcommaaccent n -15\nKPX rcommaaccent nacute -15\nKPX rcommaaccent ncaron -15\nKPX rcommaaccent ncommaaccent -15\nKPX rcommaaccent ntilde -15\nKPX rcommaaccent o -18\nKPX rcommaaccent oacute -18\nKPX rcommaaccent ocircumflex -18\nKPX rcommaaccent odieresis -18\nKPX rcommaaccent ograve -18\nKPX rcommaaccent ohungarumlaut -18\nKPX rcommaaccent omacron -18\nKPX rcommaaccent oslash -18\nKPX rcommaaccent otilde -18\nKPX rcommaaccent p -10\nKPX rcommaaccent period -100\nKPX rcommaaccent q -18\nKPX rcommaaccent v -10\nKPX space A -55\nKPX space Aacute -55\nKPX space Abreve -55\nKPX space Acircumflex -55\nKPX space Adieresis -55\nKPX space Agrave -55\nKPX space Amacron -55\nKPX space Aogonek -55\nKPX space Aring -55\nKPX space Atilde -55\nKPX space T -30\nKPX space Tcaron -30\nKPX space Tcommaaccent -30\nKPX space V -45\nKPX space W -30\nKPX space Y -55\nKPX space Yacute -55\nKPX space Ydieresis -55\nKPX v a -10\nKPX v aacute -10\nKPX v abreve -10\nKPX v acircumflex -10\nKPX v adieresis -10\nKPX v agrave -10\nKPX v amacron -10\nKPX v aogonek -10\nKPX v aring -10\nKPX v atilde -10\nKPX v comma -55\nKPX v e -10\nKPX v eacute -10\nKPX v ecaron -10\nKPX v ecircumflex -10\nKPX v edieresis -10\nKPX v edotaccent -10\nKPX v egrave -10\nKPX v emacron -10\nKPX v eogonek -10\nKPX v o -10\nKPX v oacute -10\nKPX v ocircumflex -10\nKPX v odieresis -10\nKPX v ograve -10\nKPX v ohungarumlaut -10\nKPX v omacron -10\nKPX v oslash -10\nKPX v otilde -10\nKPX v period -70\nKPX w comma -55\nKPX w o -10\nKPX w oacute -10\nKPX w ocircumflex -10\nKPX w odieresis -10\nKPX w ograve -10\nKPX w ohungarumlaut -10\nKPX w omacron -10\nKPX w oslash -10\nKPX w otilde -10\nKPX w period -70\nKPX y comma -55\nKPX y e -10\nKPX y eacute -10\nKPX y ecaron -10\nKPX y ecircumflex -10\nKPX y edieresis -10\nKPX y edotaccent -10\nKPX y egrave -10\nKPX y emacron -10\nKPX y eogonek -10\nKPX y o -25\nKPX y oacute -25\nKPX y ocircumflex -25\nKPX y odieresis -25\nKPX y ograve -25\nKPX y ohungarumlaut -25\nKPX y omacron -25\nKPX y oslash -25\nKPX y otilde -25\nKPX y period -70\nKPX yacute comma -55\nKPX yacute e -10\nKPX yacute eacute -10\nKPX yacute ecaron -10\nKPX yacute ecircumflex -10\nKPX yacute edieresis -10\nKPX yacute edotaccent -10\nKPX yacute egrave -10\nKPX yacute emacron -10\nKPX yacute eogonek -10\nKPX yacute o -25\nKPX yacute oacute -25\nKPX yacute ocircumflex -25\nKPX yacute odieresis -25\nKPX yacute ograve -25\nKPX yacute ohungarumlaut -25\nKPX yacute omacron -25\nKPX yacute oslash -25\nKPX yacute otilde -25\nKPX yacute period -70\nKPX ydieresis comma -55\nKPX ydieresis e -10\nKPX ydieresis eacute -10\nKPX ydieresis ecaron -10\nKPX ydieresis ecircumflex -10\nKPX ydieresis edieresis -10\nKPX ydieresis edotaccent -10\nKPX ydieresis egrave -10\nKPX ydieresis emacron -10\nKPX ydieresis eogonek -10\nKPX ydieresis o -25\nKPX ydieresis oacute -25\nKPX ydieresis ocircumflex -25\nKPX ydieresis odieresis -25\nKPX ydieresis ograve -25\nKPX ydieresis ohungarumlaut -25\nKPX ydieresis omacron -25\nKPX ydieresis oslash -25\nKPX ydieresis otilde -25\nKPX ydieresis period -70\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/Times-BoldItalic.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 13:04:06 1997\nComment UniqueID 43066\nComment VMusage 45874 56899\nFontName Times-BoldItalic\nFullName Times Bold Italic\nFamilyName Times\nWeight Bold\nItalicAngle -15\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -200 -218 996 921\nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 669\nXHeight 462\nAscender 683\nDescender -217\nStdHW 42\nStdVW 121\nStartCharMetrics 315\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ;\nC 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ;\nC 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ;\nC 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ;\nC 37 ; WX 833 ; N percent ; B 39 -10 793 692 ;\nC 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ;\nC 39 ; WX 333 ; N quoteright ; B 98 369 302 685 ;\nC 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ;\nC 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ;\nC 42 ; WX 500 ; N asterisk ; B 65 249 456 685 ;\nC 43 ; WX 570 ; N plus ; B 33 0 537 506 ;\nC 44 ; WX 250 ; N comma ; B -60 -182 144 134 ;\nC 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ;\nC 46 ; WX 250 ; N period ; B -9 -13 139 135 ;\nC 47 ; WX 278 ; N slash ; B -64 -18 342 685 ;\nC 48 ; WX 500 ; N zero ; B 17 -14 477 683 ;\nC 49 ; WX 500 ; N one ; B 5 0 419 683 ;\nC 50 ; WX 500 ; N two ; B -27 0 446 683 ;\nC 51 ; WX 500 ; N three ; B -15 -13 450 683 ;\nC 52 ; WX 500 ; N four ; B -15 0 503 683 ;\nC 53 ; WX 500 ; N five ; B -11 -13 487 669 ;\nC 54 ; WX 500 ; N six ; B 23 -15 509 679 ;\nC 55 ; WX 500 ; N seven ; B 52 0 525 669 ;\nC 56 ; WX 500 ; N eight ; B 3 -13 476 683 ;\nC 57 ; WX 500 ; N nine ; B -12 -10 475 683 ;\nC 58 ; WX 333 ; N colon ; B 23 -13 264 459 ;\nC 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ;\nC 60 ; WX 570 ; N less ; B 31 -8 539 514 ;\nC 61 ; WX 570 ; N equal ; B 33 107 537 399 ;\nC 62 ; WX 570 ; N greater ; B 31 -8 539 514 ;\nC 63 ; WX 500 ; N question ; B 79 -13 470 684 ;\nC 64 ; WX 832 ; N at ; B 63 -18 770 685 ;\nC 65 ; WX 667 ; N A ; B -67 0 593 683 ;\nC 66 ; WX 667 ; N B ; B -24 0 624 669 ;\nC 67 ; WX 667 ; N C ; B 32 -18 677 685 ;\nC 68 ; WX 722 ; N D ; B -46 0 685 669 ;\nC 69 ; WX 667 ; N E ; B -27 0 653 669 ;\nC 70 ; WX 667 ; N F ; B -13 0 660 669 ;\nC 71 ; WX 722 ; N G ; B 21 -18 706 685 ;\nC 72 ; WX 778 ; N H ; B -24 0 799 669 ;\nC 73 ; WX 389 ; N I ; B -32 0 406 669 ;\nC 74 ; WX 500 ; N J ; B -46 -99 524 669 ;\nC 75 ; WX 667 ; N K ; B -21 0 702 669 ;\nC 76 ; WX 611 ; N L ; B -22 0 590 669 ;\nC 77 ; WX 889 ; N M ; B -29 -12 917 669 ;\nC 78 ; WX 722 ; N N ; B -27 -15 748 669 ;\nC 79 ; WX 722 ; N O ; B 27 -18 691 685 ;\nC 80 ; WX 611 ; N P ; B -27 0 613 669 ;\nC 81 ; WX 722 ; N Q ; B 27 -208 691 685 ;\nC 82 ; WX 667 ; N R ; B -29 0 623 669 ;\nC 83 ; WX 556 ; N S ; B 2 -18 526 685 ;\nC 84 ; WX 611 ; N T ; B 50 0 650 669 ;\nC 85 ; WX 722 ; N U ; B 67 -18 744 669 ;\nC 86 ; WX 667 ; N V ; B 65 -18 715 669 ;\nC 87 ; WX 889 ; N W ; B 65 -18 940 669 ;\nC 88 ; WX 667 ; N X ; B -24 0 694 669 ;\nC 89 ; WX 611 ; N Y ; B 73 0 659 669 ;\nC 90 ; WX 611 ; N Z ; B -11 0 590 669 ;\nC 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ;\nC 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ;\nC 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ;\nC 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B 128 369 332 685 ;\nC 97 ; WX 500 ; N a ; B -21 -14 455 462 ;\nC 98 ; WX 500 ; N b ; B -14 -13 444 699 ;\nC 99 ; WX 444 ; N c ; B -5 -13 392 462 ;\nC 100 ; WX 500 ; N d ; B -21 -13 517 699 ;\nC 101 ; WX 444 ; N e ; B 5 -13 398 462 ;\nC 102 ; WX 333 ; N f ; B -169 -205 446 698 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B -52 -203 478 462 ;\nC 104 ; WX 556 ; N h ; B -13 -9 498 699 ;\nC 105 ; WX 278 ; N i ; B 2 -9 263 684 ;\nC 106 ; WX 278 ; N j ; B -189 -207 279 684 ;\nC 107 ; WX 500 ; N k ; B -23 -8 483 699 ;\nC 108 ; WX 278 ; N l ; B 2 -9 290 699 ;\nC 109 ; WX 778 ; N m ; B -14 -9 722 462 ;\nC 110 ; WX 556 ; N n ; B -6 -9 493 462 ;\nC 111 ; WX 500 ; N o ; B -3 -13 441 462 ;\nC 112 ; WX 500 ; N p ; B -120 -205 446 462 ;\nC 113 ; WX 500 ; N q ; B 1 -205 471 462 ;\nC 114 ; WX 389 ; N r ; B -21 0 389 462 ;\nC 115 ; WX 389 ; N s ; B -19 -13 333 462 ;\nC 116 ; WX 278 ; N t ; B -11 -9 281 594 ;\nC 117 ; WX 556 ; N u ; B 15 -9 492 462 ;\nC 118 ; WX 444 ; N v ; B 16 -13 401 462 ;\nC 119 ; WX 667 ; N w ; B 16 -13 614 462 ;\nC 120 ; WX 500 ; N x ; B -46 -13 469 462 ;\nC 121 ; WX 444 ; N y ; B -94 -205 392 462 ;\nC 122 ; WX 389 ; N z ; B -43 -78 368 449 ;\nC 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ;\nC 124 ; WX 220 ; N bar ; B 66 -218 154 782 ;\nC 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ;\nC 126 ; WX 570 ; N asciitilde ; B 54 173 516 333 ;\nC 161 ; WX 389 ; N exclamdown ; B 19 -205 322 492 ;\nC 162 ; WX 500 ; N cent ; B 42 -143 439 576 ;\nC 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ;\nC 164 ; WX 167 ; N fraction ; B -169 -14 324 683 ;\nC 165 ; WX 500 ; N yen ; B 33 0 628 669 ;\nC 166 ; WX 500 ; N florin ; B -87 -156 537 707 ;\nC 167 ; WX 500 ; N section ; B 36 -143 459 685 ;\nC 168 ; WX 500 ; N currency ; B -26 34 526 586 ;\nC 169 ; WX 278 ; N quotesingle ; B 128 398 268 685 ;\nC 170 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ;\nC 171 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ;\nC 173 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ;\nC 174 ; WX 556 ; N fi ; B -188 -205 514 703 ;\nC 175 ; WX 556 ; N fl ; B -186 -205 553 704 ;\nC 177 ; WX 500 ; N endash ; B -40 178 477 269 ;\nC 178 ; WX 500 ; N dagger ; B 91 -145 494 685 ;\nC 179 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ;\nC 180 ; WX 250 ; N periodcentered ; B 51 257 199 405 ;\nC 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ;\nC 183 ; WX 350 ; N bullet ; B 0 175 350 525 ;\nC 184 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ;\nC 185 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ;\nC 186 ; WX 500 ; N quotedblright ; B 53 369 513 685 ;\nC 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ;\nC 188 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ;\nC 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ;\nC 193 ; WX 333 ; N grave ; B 85 516 297 697 ;\nC 194 ; WX 333 ; N acute ; B 139 516 379 697 ;\nC 195 ; WX 333 ; N circumflex ; B 40 516 367 690 ;\nC 196 ; WX 333 ; N tilde ; B 48 536 407 655 ;\nC 197 ; WX 333 ; N macron ; B 51 553 393 623 ;\nC 198 ; WX 333 ; N breve ; B 71 516 387 678 ;\nC 199 ; WX 333 ; N dotaccent ; B 163 550 298 684 ;\nC 200 ; WX 333 ; N dieresis ; B 55 550 402 684 ;\nC 202 ; WX 333 ; N ring ; B 127 516 340 729 ;\nC 203 ; WX 333 ; N cedilla ; B -80 -218 156 5 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ;\nC 206 ; WX 333 ; N ogonek ; B 15 -183 244 34 ;\nC 207 ; WX 333 ; N caron ; B 79 516 411 690 ;\nC 208 ; WX 1000 ; N emdash ; B -40 178 977 269 ;\nC 225 ; WX 944 ; N AE ; B -64 0 918 669 ;\nC 227 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ;\nC 232 ; WX 611 ; N Lslash ; B -22 0 590 669 ;\nC 233 ; WX 722 ; N Oslash ; B 27 -125 691 764 ;\nC 234 ; WX 944 ; N OE ; B 23 -8 946 677 ;\nC 235 ; WX 300 ; N ordmasculine ; B 56 400 347 685 ;\nC 241 ; WX 722 ; N ae ; B -5 -13 673 462 ;\nC 245 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ;\nC 248 ; WX 278 ; N lslash ; B -7 -9 307 699 ;\nC 249 ; WX 500 ; N oslash ; B -3 -119 441 560 ;\nC 250 ; WX 722 ; N oe ; B 6 -13 674 462 ;\nC 251 ; WX 500 ; N germandbls ; B -200 -200 473 705 ;\nC -1 ; WX 389 ; N Idieresis ; B -32 0 450 862 ;\nC -1 ; WX 444 ; N eacute ; B 5 -13 435 697 ;\nC -1 ; WX 500 ; N abreve ; B -21 -14 471 678 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ;\nC -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ;\nC -1 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ;\nC -1 ; WX 570 ; N divide ; B 33 -29 537 535 ;\nC -1 ; WX 611 ; N Yacute ; B 73 0 659 904 ;\nC -1 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ;\nC -1 ; WX 500 ; N aacute ; B -21 -14 463 697 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ;\nC -1 ; WX 444 ; N yacute ; B -94 -205 435 697 ;\nC -1 ; WX 389 ; N scommaaccent ; B -19 -218 333 462 ;\nC -1 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ;\nC -1 ; WX 722 ; N Uring ; B 67 -18 744 921 ;\nC -1 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ;\nC -1 ; WX 500 ; N aogonek ; B -21 -183 455 462 ;\nC -1 ; WX 722 ; N Uacute ; B 67 -18 744 904 ;\nC -1 ; WX 556 ; N uogonek ; B 15 -183 492 462 ;\nC -1 ; WX 667 ; N Edieresis ; B -27 0 653 862 ;\nC -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ;\nC -1 ; WX 250 ; N commaaccent ; B -36 -218 131 -50 ;\nC -1 ; WX 747 ; N copyright ; B 30 -18 718 685 ;\nC -1 ; WX 667 ; N Emacron ; B -27 0 653 830 ;\nC -1 ; WX 444 ; N ccaron ; B -5 -13 467 690 ;\nC -1 ; WX 500 ; N aring ; B -21 -14 455 729 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B -27 -218 748 669 ;\nC -1 ; WX 278 ; N lacute ; B 2 -9 392 904 ;\nC -1 ; WX 500 ; N agrave ; B -21 -14 455 697 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 50 -218 650 669 ;\nC -1 ; WX 667 ; N Cacute ; B 32 -18 677 904 ;\nC -1 ; WX 500 ; N atilde ; B -21 -14 491 655 ;\nC -1 ; WX 667 ; N Edotaccent ; B -27 0 653 862 ;\nC -1 ; WX 389 ; N scaron ; B -19 -13 424 690 ;\nC -1 ; WX 389 ; N scedilla ; B -19 -218 333 462 ;\nC -1 ; WX 278 ; N iacute ; B 2 -9 352 697 ;\nC -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;\nC -1 ; WX 667 ; N Rcaron ; B -29 0 623 897 ;\nC -1 ; WX 722 ; N Gcommaaccent ; B 21 -218 706 685 ;\nC -1 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ;\nC -1 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ;\nC -1 ; WX 667 ; N Amacron ; B -67 0 593 830 ;\nC -1 ; WX 389 ; N rcaron ; B -21 0 424 690 ;\nC -1 ; WX 444 ; N ccedilla ; B -5 -218 392 462 ;\nC -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 862 ;\nC -1 ; WX 611 ; N Thorn ; B -27 0 573 669 ;\nC -1 ; WX 722 ; N Omacron ; B 27 -18 691 830 ;\nC -1 ; WX 667 ; N Racute ; B -29 0 623 904 ;\nC -1 ; WX 556 ; N Sacute ; B 2 -18 531 904 ;\nC -1 ; WX 608 ; N dcaron ; B -21 -13 675 708 ;\nC -1 ; WX 722 ; N Umacron ; B 67 -18 744 830 ;\nC -1 ; WX 556 ; N uring ; B 15 -9 492 729 ;\nC -1 ; WX 300 ; N threesuperior ; B 17 265 321 683 ;\nC -1 ; WX 722 ; N Ograve ; B 27 -18 691 904 ;\nC -1 ; WX 667 ; N Agrave ; B -67 0 593 904 ;\nC -1 ; WX 667 ; N Abreve ; B -67 0 593 885 ;\nC -1 ; WX 570 ; N multiply ; B 48 16 522 490 ;\nC -1 ; WX 556 ; N uacute ; B 15 -9 492 697 ;\nC -1 ; WX 611 ; N Tcaron ; B 50 0 650 897 ;\nC -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;\nC -1 ; WX 444 ; N ydieresis ; B -94 -205 443 655 ;\nC -1 ; WX 722 ; N Nacute ; B -27 -15 748 904 ;\nC -1 ; WX 278 ; N icircumflex ; B -3 -9 324 690 ;\nC -1 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ;\nC -1 ; WX 500 ; N adieresis ; B -21 -14 476 655 ;\nC -1 ; WX 444 ; N edieresis ; B 5 -13 448 655 ;\nC -1 ; WX 444 ; N cacute ; B -5 -13 435 697 ;\nC -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ;\nC -1 ; WX 556 ; N umacron ; B 15 -9 492 623 ;\nC -1 ; WX 722 ; N Ncaron ; B -27 -15 748 897 ;\nC -1 ; WX 389 ; N Iacute ; B -32 0 432 904 ;\nC -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ;\nC -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ;\nC -1 ; WX 747 ; N registered ; B 30 -18 718 685 ;\nC -1 ; WX 722 ; N Gbreve ; B 21 -18 706 885 ;\nC -1 ; WX 389 ; N Idotaccent ; B -32 0 406 862 ;\nC -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;\nC -1 ; WX 667 ; N Egrave ; B -27 0 653 904 ;\nC -1 ; WX 389 ; N racute ; B -21 0 407 697 ;\nC -1 ; WX 500 ; N omacron ; B -3 -13 462 623 ;\nC -1 ; WX 611 ; N Zacute ; B -11 0 590 904 ;\nC -1 ; WX 611 ; N Zcaron ; B -11 0 590 897 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;\nC -1 ; WX 722 ; N Eth ; B -31 0 700 669 ;\nC -1 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ;\nC -1 ; WX 278 ; N lcommaaccent ; B -42 -218 290 699 ;\nC -1 ; WX 366 ; N tcaron ; B -11 -9 434 754 ;\nC -1 ; WX 444 ; N eogonek ; B 5 -183 398 462 ;\nC -1 ; WX 722 ; N Uogonek ; B 67 -183 744 669 ;\nC -1 ; WX 667 ; N Aacute ; B -67 0 593 904 ;\nC -1 ; WX 667 ; N Adieresis ; B -67 0 593 862 ;\nC -1 ; WX 444 ; N egrave ; B 5 -13 398 697 ;\nC -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ;\nC -1 ; WX 278 ; N iogonek ; B -20 -183 263 684 ;\nC -1 ; WX 722 ; N Oacute ; B 27 -18 691 904 ;\nC -1 ; WX 500 ; N oacute ; B -3 -13 463 697 ;\nC -1 ; WX 500 ; N amacron ; B -21 -14 467 623 ;\nC -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ;\nC -1 ; WX 278 ; N idieresis ; B 2 -9 364 655 ;\nC -1 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ;\nC -1 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 500 ; N thorn ; B -120 -205 446 699 ;\nC -1 ; WX 300 ; N twosuperior ; B 2 274 313 683 ;\nC -1 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ;\nC -1 ; WX 576 ; N mu ; B -60 -207 516 449 ;\nC -1 ; WX 278 ; N igrave ; B 2 -9 259 697 ;\nC -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ;\nC -1 ; WX 667 ; N Eogonek ; B -27 -183 653 669 ;\nC -1 ; WX 500 ; N dcroat ; B -21 -13 552 699 ;\nC -1 ; WX 750 ; N threequarters ; B 7 -14 726 683 ;\nC -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ;\nC -1 ; WX 382 ; N lcaron ; B 2 -9 448 708 ;\nC -1 ; WX 667 ; N Kcommaaccent ; B -21 -218 702 669 ;\nC -1 ; WX 611 ; N Lacute ; B -22 0 590 904 ;\nC -1 ; WX 1000 ; N trademark ; B 32 263 968 669 ;\nC -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ;\nC -1 ; WX 389 ; N Igrave ; B -32 0 406 904 ;\nC -1 ; WX 389 ; N Imacron ; B -32 0 461 830 ;\nC -1 ; WX 611 ; N Lcaron ; B -22 0 671 718 ;\nC -1 ; WX 750 ; N onehalf ; B -9 -14 723 683 ;\nC -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;\nC -1 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ;\nC -1 ; WX 556 ; N ntilde ; B -6 -9 504 655 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 904 ;\nC -1 ; WX 667 ; N Eacute ; B -27 0 653 904 ;\nC -1 ; WX 444 ; N emacron ; B 5 -13 439 623 ;\nC -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ;\nC -1 ; WX 750 ; N onequarter ; B 7 -14 721 683 ;\nC -1 ; WX 556 ; N Scaron ; B 2 -18 553 897 ;\nC -1 ; WX 556 ; N Scommaaccent ; B 2 -218 526 685 ;\nC -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 723 904 ;\nC -1 ; WX 400 ; N degree ; B 83 397 369 683 ;\nC -1 ; WX 500 ; N ograve ; B -3 -13 441 697 ;\nC -1 ; WX 667 ; N Ccaron ; B 32 -18 677 897 ;\nC -1 ; WX 556 ; N ugrave ; B 15 -9 492 697 ;\nC -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;\nC -1 ; WX 722 ; N Dcaron ; B -46 0 685 897 ;\nC -1 ; WX 389 ; N rcommaaccent ; B -67 -218 389 462 ;\nC -1 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ;\nC -1 ; WX 500 ; N otilde ; B -3 -13 491 655 ;\nC -1 ; WX 667 ; N Rcommaaccent ; B -29 -218 623 669 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B -22 -218 590 669 ;\nC -1 ; WX 667 ; N Atilde ; B -67 0 593 862 ;\nC -1 ; WX 667 ; N Aogonek ; B -67 -183 604 683 ;\nC -1 ; WX 667 ; N Aring ; B -67 0 593 921 ;\nC -1 ; WX 722 ; N Otilde ; B 27 -18 691 862 ;\nC -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ;\nC -1 ; WX 667 ; N Ecaron ; B -27 0 653 897 ;\nC -1 ; WX 389 ; N Iogonek ; B -32 -183 406 669 ;\nC -1 ; WX 500 ; N kcommaaccent ; B -23 -218 483 699 ;\nC -1 ; WX 606 ; N minus ; B 51 209 555 297 ;\nC -1 ; WX 389 ; N Icircumflex ; B -32 0 450 897 ;\nC -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ;\nC -1 ; WX 278 ; N tcommaaccent ; B -62 -218 281 594 ;\nC -1 ; WX 606 ; N logicalnot ; B 51 108 555 399 ;\nC -1 ; WX 500 ; N odieresis ; B -3 -13 471 655 ;\nC -1 ; WX 556 ; N udieresis ; B 15 -9 499 655 ;\nC -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;\nC -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 767 ;\nC -1 ; WX 500 ; N eth ; B -3 -13 454 699 ;\nC -1 ; WX 389 ; N zcaron ; B -43 -78 424 690 ;\nC -1 ; WX 556 ; N ncommaaccent ; B -6 -218 493 462 ;\nC -1 ; WX 300 ; N onesuperior ; B 30 274 301 683 ;\nC -1 ; WX 278 ; N imacron ; B 2 -9 294 623 ;\nC -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2038\nKPX A C -65\nKPX A Cacute -65\nKPX A Ccaron -65\nKPX A Ccedilla -65\nKPX A G -60\nKPX A Gbreve -60\nKPX A Gcommaaccent -60\nKPX A O -50\nKPX A Oacute -50\nKPX A Ocircumflex -50\nKPX A Odieresis -50\nKPX A Ograve -50\nKPX A Ohungarumlaut -50\nKPX A Omacron -50\nKPX A Oslash -50\nKPX A Otilde -50\nKPX A Q -55\nKPX A T -55\nKPX A Tcaron -55\nKPX A Tcommaaccent -55\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -95\nKPX A W -100\nKPX A Y -70\nKPX A Yacute -70\nKPX A Ydieresis -70\nKPX A quoteright -74\nKPX A u -30\nKPX A uacute -30\nKPX A ucircumflex -30\nKPX A udieresis -30\nKPX A ugrave -30\nKPX A uhungarumlaut -30\nKPX A umacron -30\nKPX A uogonek -30\nKPX A uring -30\nKPX A v -74\nKPX A w -74\nKPX A y -74\nKPX A yacute -74\nKPX A ydieresis -74\nKPX Aacute C -65\nKPX Aacute Cacute -65\nKPX Aacute Ccaron -65\nKPX Aacute Ccedilla -65\nKPX Aacute G -60\nKPX Aacute Gbreve -60\nKPX Aacute Gcommaaccent -60\nKPX Aacute O -50\nKPX Aacute Oacute -50\nKPX Aacute Ocircumflex -50\nKPX Aacute Odieresis -50\nKPX Aacute Ograve -50\nKPX Aacute Ohungarumlaut -50\nKPX Aacute Omacron -50\nKPX Aacute Oslash -50\nKPX Aacute Otilde -50\nKPX Aacute Q -55\nKPX Aacute T -55\nKPX Aacute Tcaron -55\nKPX Aacute Tcommaaccent -55\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -95\nKPX Aacute W -100\nKPX Aacute Y -70\nKPX Aacute Yacute -70\nKPX Aacute Ydieresis -70\nKPX Aacute quoteright -74\nKPX Aacute u -30\nKPX Aacute uacute -30\nKPX Aacute ucircumflex -30\nKPX Aacute udieresis -30\nKPX Aacute ugrave -30\nKPX Aacute uhungarumlaut -30\nKPX Aacute umacron -30\nKPX Aacute uogonek -30\nKPX Aacute uring -30\nKPX Aacute v -74\nKPX Aacute w -74\nKPX Aacute y -74\nKPX Aacute yacute -74\nKPX Aacute ydieresis -74\nKPX Abreve C -65\nKPX Abreve Cacute -65\nKPX Abreve Ccaron -65\nKPX Abreve Ccedilla -65\nKPX Abreve G -60\nKPX Abreve Gbreve -60\nKPX Abreve Gcommaaccent -60\nKPX Abreve O -50\nKPX Abreve Oacute -50\nKPX Abreve Ocircumflex -50\nKPX Abreve Odieresis -50\nKPX Abreve Ograve -50\nKPX Abreve Ohungarumlaut -50\nKPX Abreve Omacron -50\nKPX Abreve Oslash -50\nKPX Abreve Otilde -50\nKPX Abreve Q -55\nKPX Abreve T -55\nKPX Abreve Tcaron -55\nKPX Abreve Tcommaaccent -55\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -95\nKPX Abreve W -100\nKPX Abreve Y -70\nKPX Abreve Yacute -70\nKPX Abreve Ydieresis -70\nKPX Abreve quoteright -74\nKPX Abreve u -30\nKPX Abreve uacute -30\nKPX Abreve ucircumflex -30\nKPX Abreve udieresis -30\nKPX Abreve ugrave -30\nKPX Abreve uhungarumlaut -30\nKPX Abreve umacron -30\nKPX Abreve uogonek -30\nKPX Abreve uring -30\nKPX Abreve v -74\nKPX Abreve w -74\nKPX Abreve y -74\nKPX Abreve yacute -74\nKPX Abreve ydieresis -74\nKPX Acircumflex C -65\nKPX Acircumflex Cacute -65\nKPX Acircumflex Ccaron -65\nKPX Acircumflex Ccedilla -65\nKPX Acircumflex G -60\nKPX Acircumflex Gbreve -60\nKPX Acircumflex Gcommaaccent -60\nKPX Acircumflex O -50\nKPX Acircumflex Oacute -50\nKPX Acircumflex Ocircumflex -50\nKPX Acircumflex Odieresis -50\nKPX Acircumflex Ograve -50\nKPX Acircumflex Ohungarumlaut -50\nKPX Acircumflex Omacron -50\nKPX Acircumflex Oslash -50\nKPX Acircumflex Otilde -50\nKPX Acircumflex Q -55\nKPX Acircumflex T -55\nKPX Acircumflex Tcaron -55\nKPX Acircumflex Tcommaaccent -55\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -95\nKPX Acircumflex W -100\nKPX Acircumflex Y -70\nKPX Acircumflex Yacute -70\nKPX Acircumflex Ydieresis -70\nKPX Acircumflex quoteright -74\nKPX Acircumflex u -30\nKPX Acircumflex uacute -30\nKPX Acircumflex ucircumflex -30\nKPX Acircumflex udieresis -30\nKPX Acircumflex ugrave -30\nKPX Acircumflex uhungarumlaut -30\nKPX Acircumflex umacron -30\nKPX Acircumflex uogonek -30\nKPX Acircumflex uring -30\nKPX Acircumflex v -74\nKPX Acircumflex w -74\nKPX Acircumflex y -74\nKPX Acircumflex yacute -74\nKPX Acircumflex ydieresis -74\nKPX Adieresis C -65\nKPX Adieresis Cacute -65\nKPX Adieresis Ccaron -65\nKPX Adieresis Ccedilla -65\nKPX Adieresis G -60\nKPX Adieresis Gbreve -60\nKPX Adieresis Gcommaaccent -60\nKPX Adieresis O -50\nKPX Adieresis Oacute -50\nKPX Adieresis Ocircumflex -50\nKPX Adieresis Odieresis -50\nKPX Adieresis Ograve -50\nKPX Adieresis Ohungarumlaut -50\nKPX Adieresis Omacron -50\nKPX Adieresis Oslash -50\nKPX Adieresis Otilde -50\nKPX Adieresis Q -55\nKPX Adieresis T -55\nKPX Adieresis Tcaron -55\nKPX Adieresis Tcommaaccent -55\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -95\nKPX Adieresis W -100\nKPX Adieresis Y -70\nKPX Adieresis Yacute -70\nKPX Adieresis Ydieresis -70\nKPX Adieresis quoteright -74\nKPX Adieresis u -30\nKPX Adieresis uacute -30\nKPX Adieresis ucircumflex -30\nKPX Adieresis udieresis -30\nKPX Adieresis ugrave -30\nKPX Adieresis uhungarumlaut -30\nKPX Adieresis umacron -30\nKPX Adieresis uogonek -30\nKPX Adieresis uring -30\nKPX Adieresis v -74\nKPX Adieresis w -74\nKPX Adieresis y -74\nKPX Adieresis yacute -74\nKPX Adieresis ydieresis -74\nKPX Agrave C -65\nKPX Agrave Cacute -65\nKPX Agrave Ccaron -65\nKPX Agrave Ccedilla -65\nKPX Agrave G -60\nKPX Agrave Gbreve -60\nKPX Agrave Gcommaaccent -60\nKPX Agrave O -50\nKPX Agrave Oacute -50\nKPX Agrave Ocircumflex -50\nKPX Agrave Odieresis -50\nKPX Agrave Ograve -50\nKPX Agrave Ohungarumlaut -50\nKPX Agrave Omacron -50\nKPX Agrave Oslash -50\nKPX Agrave Otilde -50\nKPX Agrave Q -55\nKPX Agrave T -55\nKPX Agrave Tcaron -55\nKPX Agrave Tcommaaccent -55\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -95\nKPX Agrave W -100\nKPX Agrave Y -70\nKPX Agrave Yacute -70\nKPX Agrave Ydieresis -70\nKPX Agrave quoteright -74\nKPX Agrave u -30\nKPX Agrave uacute -30\nKPX Agrave ucircumflex -30\nKPX Agrave udieresis -30\nKPX Agrave ugrave -30\nKPX Agrave uhungarumlaut -30\nKPX Agrave umacron -30\nKPX Agrave uogonek -30\nKPX Agrave uring -30\nKPX Agrave v -74\nKPX Agrave w -74\nKPX Agrave y -74\nKPX Agrave yacute -74\nKPX Agrave ydieresis -74\nKPX Amacron C -65\nKPX Amacron Cacute -65\nKPX Amacron Ccaron -65\nKPX Amacron Ccedilla -65\nKPX Amacron G -60\nKPX Amacron Gbreve -60\nKPX Amacron Gcommaaccent -60\nKPX Amacron O -50\nKPX Amacron Oacute -50\nKPX Amacron Ocircumflex -50\nKPX Amacron Odieresis -50\nKPX Amacron Ograve -50\nKPX Amacron Ohungarumlaut -50\nKPX Amacron Omacron -50\nKPX Amacron Oslash -50\nKPX Amacron Otilde -50\nKPX Amacron Q -55\nKPX Amacron T -55\nKPX Amacron Tcaron -55\nKPX Amacron Tcommaaccent -55\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -95\nKPX Amacron W -100\nKPX Amacron Y -70\nKPX Amacron Yacute -70\nKPX Amacron Ydieresis -70\nKPX Amacron quoteright -74\nKPX Amacron u -30\nKPX Amacron uacute -30\nKPX Amacron ucircumflex -30\nKPX Amacron udieresis -30\nKPX Amacron ugrave -30\nKPX Amacron uhungarumlaut -30\nKPX Amacron umacron -30\nKPX Amacron uogonek -30\nKPX Amacron uring -30\nKPX Amacron v -74\nKPX Amacron w -74\nKPX Amacron y -74\nKPX Amacron yacute -74\nKPX Amacron ydieresis -74\nKPX Aogonek C -65\nKPX Aogonek Cacute -65\nKPX Aogonek Ccaron -65\nKPX Aogonek Ccedilla -65\nKPX Aogonek G -60\nKPX Aogonek Gbreve -60\nKPX Aogonek Gcommaaccent -60\nKPX Aogonek O -50\nKPX Aogonek Oacute -50\nKPX Aogonek Ocircumflex -50\nKPX Aogonek Odieresis -50\nKPX Aogonek Ograve -50\nKPX Aogonek Ohungarumlaut -50\nKPX Aogonek Omacron -50\nKPX Aogonek Oslash -50\nKPX Aogonek Otilde -50\nKPX Aogonek Q -55\nKPX Aogonek T -55\nKPX Aogonek Tcaron -55\nKPX Aogonek Tcommaaccent -55\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -95\nKPX Aogonek W -100\nKPX Aogonek Y -70\nKPX Aogonek Yacute -70\nKPX Aogonek Ydieresis -70\nKPX Aogonek quoteright -74\nKPX Aogonek u -30\nKPX Aogonek uacute -30\nKPX Aogonek ucircumflex -30\nKPX Aogonek udieresis -30\nKPX Aogonek ugrave -30\nKPX Aogonek uhungarumlaut -30\nKPX Aogonek umacron -30\nKPX Aogonek uogonek -30\nKPX Aogonek uring -30\nKPX Aogonek v -74\nKPX Aogonek w -74\nKPX Aogonek y -34\nKPX Aogonek yacute -34\nKPX Aogonek ydieresis -34\nKPX Aring C -65\nKPX Aring Cacute -65\nKPX Aring Ccaron -65\nKPX Aring Ccedilla -65\nKPX Aring G -60\nKPX Aring Gbreve -60\nKPX Aring Gcommaaccent -60\nKPX Aring O -50\nKPX Aring Oacute -50\nKPX Aring Ocircumflex -50\nKPX Aring Odieresis -50\nKPX Aring Ograve -50\nKPX Aring Ohungarumlaut -50\nKPX Aring Omacron -50\nKPX Aring Oslash -50\nKPX Aring Otilde -50\nKPX Aring Q -55\nKPX Aring T -55\nKPX Aring Tcaron -55\nKPX Aring Tcommaaccent -55\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -95\nKPX Aring W -100\nKPX Aring Y -70\nKPX Aring Yacute -70\nKPX Aring Ydieresis -70\nKPX Aring quoteright -74\nKPX Aring u -30\nKPX Aring uacute -30\nKPX Aring ucircumflex -30\nKPX Aring udieresis -30\nKPX Aring ugrave -30\nKPX Aring uhungarumlaut -30\nKPX Aring umacron -30\nKPX Aring uogonek -30\nKPX Aring uring -30\nKPX Aring v -74\nKPX Aring w -74\nKPX Aring y -74\nKPX Aring yacute -74\nKPX Aring ydieresis -74\nKPX Atilde C -65\nKPX Atilde Cacute -65\nKPX Atilde Ccaron -65\nKPX Atilde Ccedilla -65\nKPX Atilde G -60\nKPX Atilde Gbreve -60\nKPX Atilde Gcommaaccent -60\nKPX Atilde O -50\nKPX Atilde Oacute -50\nKPX Atilde Ocircumflex -50\nKPX Atilde Odieresis -50\nKPX Atilde Ograve -50\nKPX Atilde Ohungarumlaut -50\nKPX Atilde Omacron -50\nKPX Atilde Oslash -50\nKPX Atilde Otilde -50\nKPX Atilde Q -55\nKPX Atilde T -55\nKPX Atilde Tcaron -55\nKPX Atilde Tcommaaccent -55\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -95\nKPX Atilde W -100\nKPX Atilde Y -70\nKPX Atilde Yacute -70\nKPX Atilde Ydieresis -70\nKPX Atilde quoteright -74\nKPX Atilde u -30\nKPX Atilde uacute -30\nKPX Atilde ucircumflex -30\nKPX Atilde udieresis -30\nKPX Atilde ugrave -30\nKPX Atilde uhungarumlaut -30\nKPX Atilde umacron -30\nKPX Atilde uogonek -30\nKPX Atilde uring -30\nKPX Atilde v -74\nKPX Atilde w -74\nKPX Atilde y -74\nKPX Atilde yacute -74\nKPX Atilde ydieresis -74\nKPX B A -25\nKPX B Aacute -25\nKPX B Abreve -25\nKPX B Acircumflex -25\nKPX B Adieresis -25\nKPX B Agrave -25\nKPX B Amacron -25\nKPX B Aogonek -25\nKPX B Aring -25\nKPX B Atilde -25\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX D A -25\nKPX D Aacute -25\nKPX D Abreve -25\nKPX D Acircumflex -25\nKPX D Adieresis -25\nKPX D Agrave -25\nKPX D Amacron -25\nKPX D Aogonek -25\nKPX D Aring -25\nKPX D Atilde -25\nKPX D V -50\nKPX D W -40\nKPX D Y -50\nKPX D Yacute -50\nKPX D Ydieresis -50\nKPX Dcaron A -25\nKPX Dcaron Aacute -25\nKPX Dcaron Abreve -25\nKPX Dcaron Acircumflex -25\nKPX Dcaron Adieresis -25\nKPX Dcaron Agrave -25\nKPX Dcaron Amacron -25\nKPX Dcaron Aogonek -25\nKPX Dcaron Aring -25\nKPX Dcaron Atilde -25\nKPX Dcaron V -50\nKPX Dcaron W -40\nKPX Dcaron Y -50\nKPX Dcaron Yacute -50\nKPX Dcaron Ydieresis -50\nKPX Dcroat A -25\nKPX Dcroat Aacute -25\nKPX Dcroat Abreve -25\nKPX Dcroat Acircumflex -25\nKPX Dcroat Adieresis -25\nKPX Dcroat Agrave -25\nKPX Dcroat Amacron -25\nKPX Dcroat Aogonek -25\nKPX Dcroat Aring -25\nKPX Dcroat Atilde -25\nKPX Dcroat V -50\nKPX Dcroat W -40\nKPX Dcroat Y -50\nKPX Dcroat Yacute -50\nKPX Dcroat Ydieresis -50\nKPX F A -100\nKPX F Aacute -100\nKPX F Abreve -100\nKPX F Acircumflex -100\nKPX F Adieresis -100\nKPX F Agrave -100\nKPX F Amacron -100\nKPX F Aogonek -100\nKPX F Aring -100\nKPX F Atilde -100\nKPX F a -95\nKPX F aacute -95\nKPX F abreve -95\nKPX F acircumflex -95\nKPX F adieresis -95\nKPX F agrave -95\nKPX F amacron -95\nKPX F aogonek -95\nKPX F aring -95\nKPX F atilde -95\nKPX F comma -129\nKPX F e -100\nKPX F eacute -100\nKPX F ecaron -100\nKPX F ecircumflex -100\nKPX F edieresis -100\nKPX F edotaccent -100\nKPX F egrave -100\nKPX F emacron -100\nKPX F eogonek -100\nKPX F i -40\nKPX F iacute -40\nKPX F icircumflex -40\nKPX F idieresis -40\nKPX F igrave -40\nKPX F imacron -40\nKPX F iogonek -40\nKPX F o -70\nKPX F oacute -70\nKPX F ocircumflex -70\nKPX F odieresis -70\nKPX F ograve -70\nKPX F ohungarumlaut -70\nKPX F omacron -70\nKPX F oslash -70\nKPX F otilde -70\nKPX F period -129\nKPX F r -50\nKPX F racute -50\nKPX F rcaron -50\nKPX F rcommaaccent -50\nKPX J A -25\nKPX J Aacute -25\nKPX J Abreve -25\nKPX J Acircumflex -25\nKPX J Adieresis -25\nKPX J Agrave -25\nKPX J Amacron -25\nKPX J Aogonek -25\nKPX J Aring -25\nKPX J Atilde -25\nKPX J a -40\nKPX J aacute -40\nKPX J abreve -40\nKPX J acircumflex -40\nKPX J adieresis -40\nKPX J agrave -40\nKPX J amacron -40\nKPX J aogonek -40\nKPX J aring -40\nKPX J atilde -40\nKPX J comma -10\nKPX J e -40\nKPX J eacute -40\nKPX J ecaron -40\nKPX J ecircumflex -40\nKPX J edieresis -40\nKPX J edotaccent -40\nKPX J egrave -40\nKPX J emacron -40\nKPX J eogonek -40\nKPX J o -40\nKPX J oacute -40\nKPX J ocircumflex -40\nKPX J odieresis -40\nKPX J ograve -40\nKPX J ohungarumlaut -40\nKPX J omacron -40\nKPX J oslash -40\nKPX J otilde -40\nKPX J period -10\nKPX J u -40\nKPX J uacute -40\nKPX J ucircumflex -40\nKPX J udieresis -40\nKPX J ugrave -40\nKPX J uhungarumlaut -40\nKPX J umacron -40\nKPX J uogonek -40\nKPX J uring -40\nKPX K O -30\nKPX K Oacute -30\nKPX K Ocircumflex -30\nKPX K Odieresis -30\nKPX K Ograve -30\nKPX K Ohungarumlaut -30\nKPX K Omacron -30\nKPX K Oslash -30\nKPX K Otilde -30\nKPX K e -25\nKPX K eacute -25\nKPX K ecaron -25\nKPX K ecircumflex -25\nKPX K edieresis -25\nKPX K edotaccent -25\nKPX K egrave -25\nKPX K emacron -25\nKPX K eogonek -25\nKPX K o -25\nKPX K oacute -25\nKPX K ocircumflex -25\nKPX K odieresis -25\nKPX K ograve -25\nKPX K ohungarumlaut -25\nKPX K omacron -25\nKPX K oslash -25\nKPX K otilde -25\nKPX K u -20\nKPX K uacute -20\nKPX K ucircumflex -20\nKPX K udieresis -20\nKPX K ugrave -20\nKPX K uhungarumlaut -20\nKPX K umacron -20\nKPX K uogonek -20\nKPX K uring -20\nKPX K y -20\nKPX K yacute -20\nKPX K ydieresis -20\nKPX Kcommaaccent O -30\nKPX Kcommaaccent Oacute -30\nKPX Kcommaaccent Ocircumflex -30\nKPX Kcommaaccent Odieresis -30\nKPX Kcommaaccent Ograve -30\nKPX Kcommaaccent Ohungarumlaut -30\nKPX Kcommaaccent Omacron -30\nKPX Kcommaaccent Oslash -30\nKPX Kcommaaccent Otilde -30\nKPX Kcommaaccent e -25\nKPX Kcommaaccent eacute -25\nKPX Kcommaaccent ecaron -25\nKPX Kcommaaccent ecircumflex -25\nKPX Kcommaaccent edieresis -25\nKPX Kcommaaccent edotaccent -25\nKPX Kcommaaccent egrave -25\nKPX Kcommaaccent emacron -25\nKPX Kcommaaccent eogonek -25\nKPX Kcommaaccent o -25\nKPX Kcommaaccent oacute -25\nKPX Kcommaaccent ocircumflex -25\nKPX Kcommaaccent odieresis -25\nKPX Kcommaaccent ograve -25\nKPX Kcommaaccent ohungarumlaut -25\nKPX Kcommaaccent omacron -25\nKPX Kcommaaccent oslash -25\nKPX Kcommaaccent otilde -25\nKPX Kcommaaccent u -20\nKPX Kcommaaccent uacute -20\nKPX Kcommaaccent ucircumflex -20\nKPX Kcommaaccent udieresis -20\nKPX Kcommaaccent ugrave -20\nKPX Kcommaaccent uhungarumlaut -20\nKPX Kcommaaccent umacron -20\nKPX Kcommaaccent uogonek -20\nKPX Kcommaaccent uring -20\nKPX Kcommaaccent y -20\nKPX Kcommaaccent yacute -20\nKPX Kcommaaccent ydieresis -20\nKPX L T -18\nKPX L Tcaron -18\nKPX L Tcommaaccent -18\nKPX L V -37\nKPX L W -37\nKPX L Y -37\nKPX L Yacute -37\nKPX L Ydieresis -37\nKPX L quoteright -55\nKPX L y -37\nKPX L yacute -37\nKPX L ydieresis -37\nKPX Lacute T -18\nKPX Lacute Tcaron -18\nKPX Lacute Tcommaaccent -18\nKPX Lacute V -37\nKPX Lacute W -37\nKPX Lacute Y -37\nKPX Lacute Yacute -37\nKPX Lacute Ydieresis -37\nKPX Lacute quoteright -55\nKPX Lacute y -37\nKPX Lacute yacute -37\nKPX Lacute ydieresis -37\nKPX Lcommaaccent T -18\nKPX Lcommaaccent Tcaron -18\nKPX Lcommaaccent Tcommaaccent -18\nKPX Lcommaaccent V -37\nKPX Lcommaaccent W -37\nKPX Lcommaaccent Y -37\nKPX Lcommaaccent Yacute -37\nKPX Lcommaaccent Ydieresis -37\nKPX Lcommaaccent quoteright -55\nKPX Lcommaaccent y -37\nKPX Lcommaaccent yacute -37\nKPX Lcommaaccent ydieresis -37\nKPX Lslash T -18\nKPX Lslash Tcaron -18\nKPX Lslash Tcommaaccent -18\nKPX Lslash V -37\nKPX Lslash W -37\nKPX Lslash Y -37\nKPX Lslash Yacute -37\nKPX Lslash Ydieresis -37\nKPX Lslash quoteright -55\nKPX Lslash y -37\nKPX Lslash yacute -37\nKPX Lslash ydieresis -37\nKPX N A -30\nKPX N Aacute -30\nKPX N Abreve -30\nKPX N Acircumflex -30\nKPX N Adieresis -30\nKPX N Agrave -30\nKPX N Amacron -30\nKPX N Aogonek -30\nKPX N Aring -30\nKPX N Atilde -30\nKPX Nacute A -30\nKPX Nacute Aacute -30\nKPX Nacute Abreve -30\nKPX Nacute Acircumflex -30\nKPX Nacute Adieresis -30\nKPX Nacute Agrave -30\nKPX Nacute Amacron -30\nKPX Nacute Aogonek -30\nKPX Nacute Aring -30\nKPX Nacute Atilde -30\nKPX Ncaron A -30\nKPX Ncaron Aacute -30\nKPX Ncaron Abreve -30\nKPX Ncaron Acircumflex -30\nKPX Ncaron Adieresis -30\nKPX Ncaron Agrave -30\nKPX Ncaron Amacron -30\nKPX Ncaron Aogonek -30\nKPX Ncaron Aring -30\nKPX Ncaron Atilde -30\nKPX Ncommaaccent A -30\nKPX Ncommaaccent Aacute -30\nKPX Ncommaaccent Abreve -30\nKPX Ncommaaccent Acircumflex -30\nKPX Ncommaaccent Adieresis -30\nKPX Ncommaaccent Agrave -30\nKPX Ncommaaccent Amacron -30\nKPX Ncommaaccent Aogonek -30\nKPX Ncommaaccent Aring -30\nKPX Ncommaaccent Atilde -30\nKPX Ntilde A -30\nKPX Ntilde Aacute -30\nKPX Ntilde Abreve -30\nKPX Ntilde Acircumflex -30\nKPX Ntilde Adieresis -30\nKPX Ntilde Agrave -30\nKPX Ntilde Amacron -30\nKPX Ntilde Aogonek -30\nKPX Ntilde Aring -30\nKPX Ntilde Atilde -30\nKPX O A -40\nKPX O Aacute -40\nKPX O Abreve -40\nKPX O Acircumflex -40\nKPX O Adieresis -40\nKPX O Agrave -40\nKPX O Amacron -40\nKPX O Aogonek -40\nKPX O Aring -40\nKPX O Atilde -40\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -50\nKPX O X -40\nKPX O Y -50\nKPX O Yacute -50\nKPX O Ydieresis -50\nKPX Oacute A -40\nKPX Oacute Aacute -40\nKPX Oacute Abreve -40\nKPX Oacute Acircumflex -40\nKPX Oacute Adieresis -40\nKPX Oacute Agrave -40\nKPX Oacute Amacron -40\nKPX Oacute Aogonek -40\nKPX Oacute Aring -40\nKPX Oacute Atilde -40\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -50\nKPX Oacute X -40\nKPX Oacute Y -50\nKPX Oacute Yacute -50\nKPX Oacute Ydieresis -50\nKPX Ocircumflex A -40\nKPX Ocircumflex Aacute -40\nKPX Ocircumflex Abreve -40\nKPX Ocircumflex Acircumflex -40\nKPX Ocircumflex Adieresis -40\nKPX Ocircumflex Agrave -40\nKPX Ocircumflex Amacron -40\nKPX Ocircumflex Aogonek -40\nKPX Ocircumflex Aring -40\nKPX Ocircumflex Atilde -40\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -50\nKPX Ocircumflex X -40\nKPX Ocircumflex Y -50\nKPX Ocircumflex Yacute -50\nKPX Ocircumflex Ydieresis -50\nKPX Odieresis A -40\nKPX Odieresis Aacute -40\nKPX Odieresis Abreve -40\nKPX Odieresis Acircumflex -40\nKPX Odieresis Adieresis -40\nKPX Odieresis Agrave -40\nKPX Odieresis Amacron -40\nKPX Odieresis Aogonek -40\nKPX Odieresis Aring -40\nKPX Odieresis Atilde -40\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -50\nKPX Odieresis X -40\nKPX Odieresis Y -50\nKPX Odieresis Yacute -50\nKPX Odieresis Ydieresis -50\nKPX Ograve A -40\nKPX Ograve Aacute -40\nKPX Ograve Abreve -40\nKPX Ograve Acircumflex -40\nKPX Ograve Adieresis -40\nKPX Ograve Agrave -40\nKPX Ograve Amacron -40\nKPX Ograve Aogonek -40\nKPX Ograve Aring -40\nKPX Ograve Atilde -40\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -50\nKPX Ograve X -40\nKPX Ograve Y -50\nKPX Ograve Yacute -50\nKPX Ograve Ydieresis -50\nKPX Ohungarumlaut A -40\nKPX Ohungarumlaut Aacute -40\nKPX Ohungarumlaut Abreve -40\nKPX Ohungarumlaut Acircumflex -40\nKPX Ohungarumlaut Adieresis -40\nKPX Ohungarumlaut Agrave -40\nKPX Ohungarumlaut Amacron -40\nKPX Ohungarumlaut Aogonek -40\nKPX Ohungarumlaut Aring -40\nKPX Ohungarumlaut Atilde -40\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -50\nKPX Ohungarumlaut X -40\nKPX Ohungarumlaut Y -50\nKPX Ohungarumlaut Yacute -50\nKPX Ohungarumlaut Ydieresis -50\nKPX Omacron A -40\nKPX Omacron Aacute -40\nKPX Omacron Abreve -40\nKPX Omacron Acircumflex -40\nKPX Omacron Adieresis -40\nKPX Omacron Agrave -40\nKPX Omacron Amacron -40\nKPX Omacron Aogonek -40\nKPX Omacron Aring -40\nKPX Omacron Atilde -40\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -50\nKPX Omacron X -40\nKPX Omacron Y -50\nKPX Omacron Yacute -50\nKPX Omacron Ydieresis -50\nKPX Oslash A -40\nKPX Oslash Aacute -40\nKPX Oslash Abreve -40\nKPX Oslash Acircumflex -40\nKPX Oslash Adieresis -40\nKPX Oslash Agrave -40\nKPX Oslash Amacron -40\nKPX Oslash Aogonek -40\nKPX Oslash Aring -40\nKPX Oslash Atilde -40\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -50\nKPX Oslash X -40\nKPX Oslash Y -50\nKPX Oslash Yacute -50\nKPX Oslash Ydieresis -50\nKPX Otilde A -40\nKPX Otilde Aacute -40\nKPX Otilde Abreve -40\nKPX Otilde Acircumflex -40\nKPX Otilde Adieresis -40\nKPX Otilde Agrave -40\nKPX Otilde Amacron -40\nKPX Otilde Aogonek -40\nKPX Otilde Aring -40\nKPX Otilde Atilde -40\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -50\nKPX Otilde X -40\nKPX Otilde Y -50\nKPX Otilde Yacute -50\nKPX Otilde Ydieresis -50\nKPX P A -85\nKPX P Aacute -85\nKPX P Abreve -85\nKPX P Acircumflex -85\nKPX P Adieresis -85\nKPX P Agrave -85\nKPX P Amacron -85\nKPX P Aogonek -85\nKPX P Aring -85\nKPX P Atilde -85\nKPX P a -40\nKPX P aacute -40\nKPX P abreve -40\nKPX P acircumflex -40\nKPX P adieresis -40\nKPX P agrave -40\nKPX P amacron -40\nKPX P aogonek -40\nKPX P aring -40\nKPX P atilde -40\nKPX P comma -129\nKPX P e -50\nKPX P eacute -50\nKPX P ecaron -50\nKPX P ecircumflex -50\nKPX P edieresis -50\nKPX P edotaccent -50\nKPX P egrave -50\nKPX P emacron -50\nKPX P eogonek -50\nKPX P o -55\nKPX P oacute -55\nKPX P ocircumflex -55\nKPX P odieresis -55\nKPX P ograve -55\nKPX P ohungarumlaut -55\nKPX P omacron -55\nKPX P oslash -55\nKPX P otilde -55\nKPX P period -129\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX R O -40\nKPX R Oacute -40\nKPX R Ocircumflex -40\nKPX R Odieresis -40\nKPX R Ograve -40\nKPX R Ohungarumlaut -40\nKPX R Omacron -40\nKPX R Oslash -40\nKPX R Otilde -40\nKPX R T -30\nKPX R Tcaron -30\nKPX R Tcommaaccent -30\nKPX R U -40\nKPX R Uacute -40\nKPX R Ucircumflex -40\nKPX R Udieresis -40\nKPX R Ugrave -40\nKPX R Uhungarumlaut -40\nKPX R Umacron -40\nKPX R Uogonek -40\nKPX R Uring -40\nKPX R V -18\nKPX R W -18\nKPX R Y -18\nKPX R Yacute -18\nKPX R Ydieresis -18\nKPX Racute O -40\nKPX Racute Oacute -40\nKPX Racute Ocircumflex -40\nKPX Racute Odieresis -40\nKPX Racute Ograve -40\nKPX Racute Ohungarumlaut -40\nKPX Racute Omacron -40\nKPX Racute Oslash -40\nKPX Racute Otilde -40\nKPX Racute T -30\nKPX Racute Tcaron -30\nKPX Racute Tcommaaccent -30\nKPX Racute U -40\nKPX Racute Uacute -40\nKPX Racute Ucircumflex -40\nKPX Racute Udieresis -40\nKPX Racute Ugrave -40\nKPX Racute Uhungarumlaut -40\nKPX Racute Umacron -40\nKPX Racute Uogonek -40\nKPX Racute Uring -40\nKPX Racute V -18\nKPX Racute W -18\nKPX Racute Y -18\nKPX Racute Yacute -18\nKPX Racute Ydieresis -18\nKPX Rcaron O -40\nKPX Rcaron Oacute -40\nKPX Rcaron Ocircumflex -40\nKPX Rcaron Odieresis -40\nKPX Rcaron Ograve -40\nKPX Rcaron Ohungarumlaut -40\nKPX Rcaron Omacron -40\nKPX Rcaron Oslash -40\nKPX Rcaron Otilde -40\nKPX Rcaron T -30\nKPX Rcaron Tcaron -30\nKPX Rcaron Tcommaaccent -30\nKPX Rcaron U -40\nKPX Rcaron Uacute -40\nKPX Rcaron Ucircumflex -40\nKPX Rcaron Udieresis -40\nKPX Rcaron Ugrave -40\nKPX Rcaron Uhungarumlaut -40\nKPX Rcaron Umacron -40\nKPX Rcaron Uogonek -40\nKPX Rcaron Uring -40\nKPX Rcaron V -18\nKPX Rcaron W -18\nKPX Rcaron Y -18\nKPX Rcaron Yacute -18\nKPX Rcaron Ydieresis -18\nKPX Rcommaaccent O -40\nKPX Rcommaaccent Oacute -40\nKPX Rcommaaccent Ocircumflex -40\nKPX Rcommaaccent Odieresis -40\nKPX Rcommaaccent Ograve -40\nKPX Rcommaaccent Ohungarumlaut -40\nKPX Rcommaaccent Omacron -40\nKPX Rcommaaccent Oslash -40\nKPX Rcommaaccent Otilde -40\nKPX Rcommaaccent T -30\nKPX Rcommaaccent Tcaron -30\nKPX Rcommaaccent Tcommaaccent -30\nKPX Rcommaaccent U -40\nKPX Rcommaaccent Uacute -40\nKPX Rcommaaccent Ucircumflex -40\nKPX Rcommaaccent Udieresis -40\nKPX Rcommaaccent Ugrave -40\nKPX Rcommaaccent Uhungarumlaut -40\nKPX Rcommaaccent Umacron -40\nKPX Rcommaaccent Uogonek -40\nKPX Rcommaaccent Uring -40\nKPX Rcommaaccent V -18\nKPX Rcommaaccent W -18\nKPX Rcommaaccent Y -18\nKPX Rcommaaccent Yacute -18\nKPX Rcommaaccent Ydieresis -18\nKPX T A -55\nKPX T Aacute -55\nKPX T Abreve -55\nKPX T Acircumflex -55\nKPX T Adieresis -55\nKPX T Agrave -55\nKPX T Amacron -55\nKPX T Aogonek -55\nKPX T Aring -55\nKPX T Atilde -55\nKPX T O -18\nKPX T Oacute -18\nKPX T Ocircumflex -18\nKPX T Odieresis -18\nKPX T Ograve -18\nKPX T Ohungarumlaut -18\nKPX T Omacron -18\nKPX T Oslash -18\nKPX T Otilde -18\nKPX T a -92\nKPX T aacute -92\nKPX T abreve -92\nKPX T acircumflex -92\nKPX T adieresis -92\nKPX T agrave -92\nKPX T amacron -92\nKPX T aogonek -92\nKPX T aring -92\nKPX T atilde -92\nKPX T colon -74\nKPX T comma -92\nKPX T e -92\nKPX T eacute -92\nKPX T ecaron -92\nKPX T ecircumflex -92\nKPX T edieresis -52\nKPX T edotaccent -92\nKPX T egrave -52\nKPX T emacron -52\nKPX T eogonek -92\nKPX T hyphen -92\nKPX T i -37\nKPX T iacute -37\nKPX T iogonek -37\nKPX T o -95\nKPX T oacute -95\nKPX T ocircumflex -95\nKPX T odieresis -95\nKPX T ograve -95\nKPX T ohungarumlaut -95\nKPX T omacron -95\nKPX T oslash -95\nKPX T otilde -95\nKPX T period -92\nKPX T r -37\nKPX T racute -37\nKPX T rcaron -37\nKPX T rcommaaccent -37\nKPX T semicolon -74\nKPX T u -37\nKPX T uacute -37\nKPX T ucircumflex -37\nKPX T udieresis -37\nKPX T ugrave -37\nKPX T uhungarumlaut -37\nKPX T umacron -37\nKPX T uogonek -37\nKPX T uring -37\nKPX T w -37\nKPX T y -37\nKPX T yacute -37\nKPX T ydieresis -37\nKPX Tcaron A -55\nKPX Tcaron Aacute -55\nKPX Tcaron Abreve -55\nKPX Tcaron Acircumflex -55\nKPX Tcaron Adieresis -55\nKPX Tcaron Agrave -55\nKPX Tcaron Amacron -55\nKPX Tcaron Aogonek -55\nKPX Tcaron Aring -55\nKPX Tcaron Atilde -55\nKPX Tcaron O -18\nKPX Tcaron Oacute -18\nKPX Tcaron Ocircumflex -18\nKPX Tcaron Odieresis -18\nKPX Tcaron Ograve -18\nKPX Tcaron Ohungarumlaut -18\nKPX Tcaron Omacron -18\nKPX Tcaron Oslash -18\nKPX Tcaron Otilde -18\nKPX Tcaron a -92\nKPX Tcaron aacute -92\nKPX Tcaron abreve -92\nKPX Tcaron acircumflex -92\nKPX Tcaron adieresis -92\nKPX Tcaron agrave -92\nKPX Tcaron amacron -92\nKPX Tcaron aogonek -92\nKPX Tcaron aring -92\nKPX Tcaron atilde -92\nKPX Tcaron colon -74\nKPX Tcaron comma -92\nKPX Tcaron e -92\nKPX Tcaron eacute -92\nKPX Tcaron ecaron -92\nKPX Tcaron ecircumflex -92\nKPX Tcaron edieresis -52\nKPX Tcaron edotaccent -92\nKPX Tcaron egrave -52\nKPX Tcaron emacron -52\nKPX Tcaron eogonek -92\nKPX Tcaron hyphen -92\nKPX Tcaron i -37\nKPX Tcaron iacute -37\nKPX Tcaron iogonek -37\nKPX Tcaron o -95\nKPX Tcaron oacute -95\nKPX Tcaron ocircumflex -95\nKPX Tcaron odieresis -95\nKPX Tcaron ograve -95\nKPX Tcaron ohungarumlaut -95\nKPX Tcaron omacron -95\nKPX Tcaron oslash -95\nKPX Tcaron otilde -95\nKPX Tcaron period -92\nKPX Tcaron r -37\nKPX Tcaron racute -37\nKPX Tcaron rcaron -37\nKPX Tcaron rcommaaccent -37\nKPX Tcaron semicolon -74\nKPX Tcaron u -37\nKPX Tcaron uacute -37\nKPX Tcaron ucircumflex -37\nKPX Tcaron udieresis -37\nKPX Tcaron ugrave -37\nKPX Tcaron uhungarumlaut -37\nKPX Tcaron umacron -37\nKPX Tcaron uogonek -37\nKPX Tcaron uring -37\nKPX Tcaron w -37\nKPX Tcaron y -37\nKPX Tcaron yacute -37\nKPX Tcaron ydieresis -37\nKPX Tcommaaccent A -55\nKPX Tcommaaccent Aacute -55\nKPX Tcommaaccent Abreve -55\nKPX Tcommaaccent Acircumflex -55\nKPX Tcommaaccent Adieresis -55\nKPX Tcommaaccent Agrave -55\nKPX Tcommaaccent Amacron -55\nKPX Tcommaaccent Aogonek -55\nKPX Tcommaaccent Aring -55\nKPX Tcommaaccent Atilde -55\nKPX Tcommaaccent O -18\nKPX Tcommaaccent Oacute -18\nKPX Tcommaaccent Ocircumflex -18\nKPX Tcommaaccent Odieresis -18\nKPX Tcommaaccent Ograve -18\nKPX Tcommaaccent Ohungarumlaut -18\nKPX Tcommaaccent Omacron -18\nKPX Tcommaaccent Oslash -18\nKPX Tcommaaccent Otilde -18\nKPX Tcommaaccent a -92\nKPX Tcommaaccent aacute -92\nKPX Tcommaaccent abreve -92\nKPX Tcommaaccent acircumflex -92\nKPX Tcommaaccent adieresis -92\nKPX Tcommaaccent agrave -92\nKPX Tcommaaccent amacron -92\nKPX Tcommaaccent aogonek -92\nKPX Tcommaaccent aring -92\nKPX Tcommaaccent atilde -92\nKPX Tcommaaccent colon -74\nKPX Tcommaaccent comma -92\nKPX Tcommaaccent e -92\nKPX Tcommaaccent eacute -92\nKPX Tcommaaccent ecaron -92\nKPX Tcommaaccent ecircumflex -92\nKPX Tcommaaccent edieresis -52\nKPX Tcommaaccent edotaccent -92\nKPX Tcommaaccent egrave -52\nKPX Tcommaaccent emacron -52\nKPX Tcommaaccent eogonek -92\nKPX Tcommaaccent hyphen -92\nKPX Tcommaaccent i -37\nKPX Tcommaaccent iacute -37\nKPX Tcommaaccent iogonek -37\nKPX Tcommaaccent o -95\nKPX Tcommaaccent oacute -95\nKPX Tcommaaccent ocircumflex -95\nKPX Tcommaaccent odieresis -95\nKPX Tcommaaccent ograve -95\nKPX Tcommaaccent ohungarumlaut -95\nKPX Tcommaaccent omacron -95\nKPX Tcommaaccent oslash -95\nKPX Tcommaaccent otilde -95\nKPX Tcommaaccent period -92\nKPX Tcommaaccent r -37\nKPX Tcommaaccent racute -37\nKPX Tcommaaccent rcaron -37\nKPX Tcommaaccent rcommaaccent -37\nKPX Tcommaaccent semicolon -74\nKPX Tcommaaccent u -37\nKPX Tcommaaccent uacute -37\nKPX Tcommaaccent ucircumflex -37\nKPX Tcommaaccent udieresis -37\nKPX Tcommaaccent ugrave -37\nKPX Tcommaaccent uhungarumlaut -37\nKPX Tcommaaccent umacron -37\nKPX Tcommaaccent uogonek -37\nKPX Tcommaaccent uring -37\nKPX Tcommaaccent w -37\nKPX Tcommaaccent y -37\nKPX Tcommaaccent yacute -37\nKPX Tcommaaccent ydieresis -37\nKPX U A -45\nKPX U Aacute -45\nKPX U Abreve -45\nKPX U Acircumflex -45\nKPX U Adieresis -45\nKPX U Agrave -45\nKPX U Amacron -45\nKPX U Aogonek -45\nKPX U Aring -45\nKPX U Atilde -45\nKPX Uacute A -45\nKPX Uacute Aacute -45\nKPX Uacute Abreve -45\nKPX Uacute Acircumflex -45\nKPX Uacute Adieresis -45\nKPX Uacute Agrave -45\nKPX Uacute Amacron -45\nKPX Uacute Aogonek -45\nKPX Uacute Aring -45\nKPX Uacute Atilde -45\nKPX Ucircumflex A -45\nKPX Ucircumflex Aacute -45\nKPX Ucircumflex Abreve -45\nKPX Ucircumflex Acircumflex -45\nKPX Ucircumflex Adieresis -45\nKPX Ucircumflex Agrave -45\nKPX Ucircumflex Amacron -45\nKPX Ucircumflex Aogonek -45\nKPX Ucircumflex Aring -45\nKPX Ucircumflex Atilde -45\nKPX Udieresis A -45\nKPX Udieresis Aacute -45\nKPX Udieresis Abreve -45\nKPX Udieresis Acircumflex -45\nKPX Udieresis Adieresis -45\nKPX Udieresis Agrave -45\nKPX Udieresis Amacron -45\nKPX Udieresis Aogonek -45\nKPX Udieresis Aring -45\nKPX Udieresis Atilde -45\nKPX Ugrave A -45\nKPX Ugrave Aacute -45\nKPX Ugrave Abreve -45\nKPX Ugrave Acircumflex -45\nKPX Ugrave Adieresis -45\nKPX Ugrave Agrave -45\nKPX Ugrave Amacron -45\nKPX Ugrave Aogonek -45\nKPX Ugrave Aring -45\nKPX Ugrave Atilde -45\nKPX Uhungarumlaut A -45\nKPX Uhungarumlaut Aacute -45\nKPX Uhungarumlaut Abreve -45\nKPX Uhungarumlaut Acircumflex -45\nKPX Uhungarumlaut Adieresis -45\nKPX Uhungarumlaut Agrave -45\nKPX Uhungarumlaut Amacron -45\nKPX Uhungarumlaut Aogonek -45\nKPX Uhungarumlaut Aring -45\nKPX Uhungarumlaut Atilde -45\nKPX Umacron A -45\nKPX Umacron Aacute -45\nKPX Umacron Abreve -45\nKPX Umacron Acircumflex -45\nKPX Umacron Adieresis -45\nKPX Umacron Agrave -45\nKPX Umacron Amacron -45\nKPX Umacron Aogonek -45\nKPX Umacron Aring -45\nKPX Umacron Atilde -45\nKPX Uogonek A -45\nKPX Uogonek Aacute -45\nKPX Uogonek Abreve -45\nKPX Uogonek Acircumflex -45\nKPX Uogonek Adieresis -45\nKPX Uogonek Agrave -45\nKPX Uogonek Amacron -45\nKPX Uogonek Aogonek -45\nKPX Uogonek Aring -45\nKPX Uogonek Atilde -45\nKPX Uring A -45\nKPX Uring Aacute -45\nKPX Uring Abreve -45\nKPX Uring Acircumflex -45\nKPX Uring Adieresis -45\nKPX Uring Agrave -45\nKPX Uring Amacron -45\nKPX Uring Aogonek -45\nKPX Uring Aring -45\nKPX Uring Atilde -45\nKPX V A -85\nKPX V Aacute -85\nKPX V Abreve -85\nKPX V Acircumflex -85\nKPX V Adieresis -85\nKPX V Agrave -85\nKPX V Amacron -85\nKPX V Aogonek -85\nKPX V Aring -85\nKPX V Atilde -85\nKPX V G -10\nKPX V Gbreve -10\nKPX V Gcommaaccent -10\nKPX V O -30\nKPX V Oacute -30\nKPX V Ocircumflex -30\nKPX V Odieresis -30\nKPX V Ograve -30\nKPX V Ohungarumlaut -30\nKPX V Omacron -30\nKPX V Oslash -30\nKPX V Otilde -30\nKPX V a -111\nKPX V aacute -111\nKPX V abreve -111\nKPX V acircumflex -111\nKPX V adieresis -111\nKPX V agrave -111\nKPX V amacron -111\nKPX V aogonek -111\nKPX V aring -111\nKPX V atilde -111\nKPX V colon -74\nKPX V comma -129\nKPX V e -111\nKPX V eacute -111\nKPX V ecaron -111\nKPX V ecircumflex -111\nKPX V edieresis -71\nKPX V edotaccent -111\nKPX V egrave -71\nKPX V emacron -71\nKPX V eogonek -111\nKPX V hyphen -70\nKPX V i -55\nKPX V iacute -55\nKPX V iogonek -55\nKPX V o -111\nKPX V oacute -111\nKPX V ocircumflex -111\nKPX V odieresis -111\nKPX V ograve -111\nKPX V ohungarumlaut -111\nKPX V omacron -111\nKPX V oslash -111\nKPX V otilde -111\nKPX V period -129\nKPX V semicolon -74\nKPX V u -55\nKPX V uacute -55\nKPX V ucircumflex -55\nKPX V udieresis -55\nKPX V ugrave -55\nKPX V uhungarumlaut -55\nKPX V umacron -55\nKPX V uogonek -55\nKPX V uring -55\nKPX W A -74\nKPX W Aacute -74\nKPX W Abreve -74\nKPX W Acircumflex -74\nKPX W Adieresis -74\nKPX W Agrave -74\nKPX W Amacron -74\nKPX W Aogonek -74\nKPX W Aring -74\nKPX W Atilde -74\nKPX W O -15\nKPX W Oacute -15\nKPX W Ocircumflex -15\nKPX W Odieresis -15\nKPX W Ograve -15\nKPX W Ohungarumlaut -15\nKPX W Omacron -15\nKPX W Oslash -15\nKPX W Otilde -15\nKPX W a -85\nKPX W aacute -85\nKPX W abreve -85\nKPX W acircumflex -85\nKPX W adieresis -85\nKPX W agrave -85\nKPX W amacron -85\nKPX W aogonek -85\nKPX W aring -85\nKPX W atilde -85\nKPX W colon -55\nKPX W comma -74\nKPX W e -90\nKPX W eacute -90\nKPX W ecaron -90\nKPX W ecircumflex -90\nKPX W edieresis -50\nKPX W edotaccent -90\nKPX W egrave -50\nKPX W emacron -50\nKPX W eogonek -90\nKPX W hyphen -50\nKPX W i -37\nKPX W iacute -37\nKPX W iogonek -37\nKPX W o -80\nKPX W oacute -80\nKPX W ocircumflex -80\nKPX W odieresis -80\nKPX W ograve -80\nKPX W ohungarumlaut -80\nKPX W omacron -80\nKPX W oslash -80\nKPX W otilde -80\nKPX W period -74\nKPX W semicolon -55\nKPX W u -55\nKPX W uacute -55\nKPX W ucircumflex -55\nKPX W udieresis -55\nKPX W ugrave -55\nKPX W uhungarumlaut -55\nKPX W umacron -55\nKPX W uogonek -55\nKPX W uring -55\nKPX W y -55\nKPX W yacute -55\nKPX W ydieresis -55\nKPX Y A -74\nKPX Y Aacute -74\nKPX Y Abreve -74\nKPX Y Acircumflex -74\nKPX Y Adieresis -74\nKPX Y Agrave -74\nKPX Y Amacron -74\nKPX Y Aogonek -74\nKPX Y Aring -74\nKPX Y Atilde -74\nKPX Y O -25\nKPX Y Oacute -25\nKPX Y Ocircumflex -25\nKPX Y Odieresis -25\nKPX Y Ograve -25\nKPX Y Ohungarumlaut -25\nKPX Y Omacron -25\nKPX Y Oslash -25\nKPX Y Otilde -25\nKPX Y a -92\nKPX Y aacute -92\nKPX Y abreve -92\nKPX Y acircumflex -92\nKPX Y adieresis -92\nKPX Y agrave -92\nKPX Y amacron -92\nKPX Y aogonek -92\nKPX Y aring -92\nKPX Y atilde -92\nKPX Y colon -92\nKPX Y comma -92\nKPX Y e -111\nKPX Y eacute -111\nKPX Y ecaron -111\nKPX Y ecircumflex -71\nKPX Y edieresis -71\nKPX Y edotaccent -111\nKPX Y egrave -71\nKPX Y emacron -71\nKPX Y eogonek -111\nKPX Y hyphen -92\nKPX Y i -55\nKPX Y iacute -55\nKPX Y iogonek -55\nKPX Y o -111\nKPX Y oacute -111\nKPX Y ocircumflex -111\nKPX Y odieresis -111\nKPX Y ograve -111\nKPX Y ohungarumlaut -111\nKPX Y omacron -111\nKPX Y oslash -111\nKPX Y otilde -111\nKPX Y period -74\nKPX Y semicolon -92\nKPX Y u -92\nKPX Y uacute -92\nKPX Y ucircumflex -92\nKPX Y udieresis -92\nKPX Y ugrave -92\nKPX Y uhungarumlaut -92\nKPX Y umacron -92\nKPX Y uogonek -92\nKPX Y uring -92\nKPX Yacute A -74\nKPX Yacute Aacute -74\nKPX Yacute Abreve -74\nKPX Yacute Acircumflex -74\nKPX Yacute Adieresis -74\nKPX Yacute Agrave -74\nKPX Yacute Amacron -74\nKPX Yacute Aogonek -74\nKPX Yacute Aring -74\nKPX Yacute Atilde -74\nKPX Yacute O -25\nKPX Yacute Oacute -25\nKPX Yacute Ocircumflex -25\nKPX Yacute Odieresis -25\nKPX Yacute Ograve -25\nKPX Yacute Ohungarumlaut -25\nKPX Yacute Omacron -25\nKPX Yacute Oslash -25\nKPX Yacute Otilde -25\nKPX Yacute a -92\nKPX Yacute aacute -92\nKPX Yacute abreve -92\nKPX Yacute acircumflex -92\nKPX Yacute adieresis -92\nKPX Yacute agrave -92\nKPX Yacute amacron -92\nKPX Yacute aogonek -92\nKPX Yacute aring -92\nKPX Yacute atilde -92\nKPX Yacute colon -92\nKPX Yacute comma -92\nKPX Yacute e -111\nKPX Yacute eacute -111\nKPX Yacute ecaron -111\nKPX Yacute ecircumflex -71\nKPX Yacute edieresis -71\nKPX Yacute edotaccent -111\nKPX Yacute egrave -71\nKPX Yacute emacron -71\nKPX Yacute eogonek -111\nKPX Yacute hyphen -92\nKPX Yacute i -55\nKPX Yacute iacute -55\nKPX Yacute iogonek -55\nKPX Yacute o -111\nKPX Yacute oacute -111\nKPX Yacute ocircumflex -111\nKPX Yacute odieresis -111\nKPX Yacute ograve -111\nKPX Yacute ohungarumlaut -111\nKPX Yacute omacron -111\nKPX Yacute oslash -111\nKPX Yacute otilde -111\nKPX Yacute period -74\nKPX Yacute semicolon -92\nKPX Yacute u -92\nKPX Yacute uacute -92\nKPX Yacute ucircumflex -92\nKPX Yacute udieresis -92\nKPX Yacute ugrave -92\nKPX Yacute uhungarumlaut -92\nKPX Yacute umacron -92\nKPX Yacute uogonek -92\nKPX Yacute uring -92\nKPX Ydieresis A -74\nKPX Ydieresis Aacute -74\nKPX Ydieresis Abreve -74\nKPX Ydieresis Acircumflex -74\nKPX Ydieresis Adieresis -74\nKPX Ydieresis Agrave -74\nKPX Ydieresis Amacron -74\nKPX Ydieresis Aogonek -74\nKPX Ydieresis Aring -74\nKPX Ydieresis Atilde -74\nKPX Ydieresis O -25\nKPX Ydieresis Oacute -25\nKPX Ydieresis Ocircumflex -25\nKPX Ydieresis Odieresis -25\nKPX Ydieresis Ograve -25\nKPX Ydieresis Ohungarumlaut -25\nKPX Ydieresis Omacron -25\nKPX Ydieresis Oslash -25\nKPX Ydieresis Otilde -25\nKPX Ydieresis a -92\nKPX Ydieresis aacute -92\nKPX Ydieresis abreve -92\nKPX Ydieresis acircumflex -92\nKPX Ydieresis adieresis -92\nKPX Ydieresis agrave -92\nKPX Ydieresis amacron -92\nKPX Ydieresis aogonek -92\nKPX Ydieresis aring -92\nKPX Ydieresis atilde -92\nKPX Ydieresis colon -92\nKPX Ydieresis comma -92\nKPX Ydieresis e -111\nKPX Ydieresis eacute -111\nKPX Ydieresis ecaron -111\nKPX Ydieresis ecircumflex -71\nKPX Ydieresis edieresis -71\nKPX Ydieresis edotaccent -111\nKPX Ydieresis egrave -71\nKPX Ydieresis emacron -71\nKPX Ydieresis eogonek -111\nKPX Ydieresis hyphen -92\nKPX Ydieresis i -55\nKPX Ydieresis iacute -55\nKPX Ydieresis iogonek -55\nKPX Ydieresis o -111\nKPX Ydieresis oacute -111\nKPX Ydieresis ocircumflex -111\nKPX Ydieresis odieresis -111\nKPX Ydieresis ograve -111\nKPX Ydieresis ohungarumlaut -111\nKPX Ydieresis omacron -111\nKPX Ydieresis oslash -111\nKPX Ydieresis otilde -111\nKPX Ydieresis period -74\nKPX Ydieresis semicolon -92\nKPX Ydieresis u -92\nKPX Ydieresis uacute -92\nKPX Ydieresis ucircumflex -92\nKPX Ydieresis udieresis -92\nKPX Ydieresis ugrave -92\nKPX Ydieresis uhungarumlaut -92\nKPX Ydieresis umacron -92\nKPX Ydieresis uogonek -92\nKPX Ydieresis uring -92\nKPX b b -10\nKPX b period -40\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX c h -10\nKPX c k -10\nKPX c kcommaaccent -10\nKPX cacute h -10\nKPX cacute k -10\nKPX cacute kcommaaccent -10\nKPX ccaron h -10\nKPX ccaron k -10\nKPX ccaron kcommaaccent -10\nKPX ccedilla h -10\nKPX ccedilla k -10\nKPX ccedilla kcommaaccent -10\nKPX comma quotedblright -95\nKPX comma quoteright -95\nKPX e b -10\nKPX eacute b -10\nKPX ecaron b -10\nKPX ecircumflex b -10\nKPX edieresis b -10\nKPX edotaccent b -10\nKPX egrave b -10\nKPX emacron b -10\nKPX eogonek b -10\nKPX f comma -10\nKPX f dotlessi -30\nKPX f e -10\nKPX f eacute -10\nKPX f edotaccent -10\nKPX f eogonek -10\nKPX f f -18\nKPX f o -10\nKPX f oacute -10\nKPX f ocircumflex -10\nKPX f ograve -10\nKPX f ohungarumlaut -10\nKPX f oslash -10\nKPX f otilde -10\nKPX f period -10\nKPX f quoteright 55\nKPX k e -30\nKPX k eacute -30\nKPX k ecaron -30\nKPX k ecircumflex -30\nKPX k edieresis -30\nKPX k edotaccent -30\nKPX k egrave -30\nKPX k emacron -30\nKPX k eogonek -30\nKPX k o -10\nKPX k oacute -10\nKPX k ocircumflex -10\nKPX k odieresis -10\nKPX k ograve -10\nKPX k ohungarumlaut -10\nKPX k omacron -10\nKPX k oslash -10\nKPX k otilde -10\nKPX kcommaaccent e -30\nKPX kcommaaccent eacute -30\nKPX kcommaaccent ecaron -30\nKPX kcommaaccent ecircumflex -30\nKPX kcommaaccent edieresis -30\nKPX kcommaaccent edotaccent -30\nKPX kcommaaccent egrave -30\nKPX kcommaaccent emacron -30\nKPX kcommaaccent eogonek -30\nKPX kcommaaccent o -10\nKPX kcommaaccent oacute -10\nKPX kcommaaccent ocircumflex -10\nKPX kcommaaccent odieresis -10\nKPX kcommaaccent ograve -10\nKPX kcommaaccent ohungarumlaut -10\nKPX kcommaaccent omacron -10\nKPX kcommaaccent oslash -10\nKPX kcommaaccent otilde -10\nKPX n v -40\nKPX nacute v -40\nKPX ncaron v -40\nKPX ncommaaccent v -40\nKPX ntilde v -40\nKPX o v -15\nKPX o w -25\nKPX o x -10\nKPX o y -10\nKPX o yacute -10\nKPX o ydieresis -10\nKPX oacute v -15\nKPX oacute w -25\nKPX oacute x -10\nKPX oacute y -10\nKPX oacute yacute -10\nKPX oacute ydieresis -10\nKPX ocircumflex v -15\nKPX ocircumflex w -25\nKPX ocircumflex x -10\nKPX ocircumflex y -10\nKPX ocircumflex yacute -10\nKPX ocircumflex ydieresis -10\nKPX odieresis v -15\nKPX odieresis w -25\nKPX odieresis x -10\nKPX odieresis y -10\nKPX odieresis yacute -10\nKPX odieresis ydieresis -10\nKPX ograve v -15\nKPX ograve w -25\nKPX ograve x -10\nKPX ograve y -10\nKPX ograve yacute -10\nKPX ograve ydieresis -10\nKPX ohungarumlaut v -15\nKPX ohungarumlaut w -25\nKPX ohungarumlaut x -10\nKPX ohungarumlaut y -10\nKPX ohungarumlaut yacute -10\nKPX ohungarumlaut ydieresis -10\nKPX omacron v -15\nKPX omacron w -25\nKPX omacron x -10\nKPX omacron y -10\nKPX omacron yacute -10\nKPX omacron ydieresis -10\nKPX oslash v -15\nKPX oslash w -25\nKPX oslash x -10\nKPX oslash y -10\nKPX oslash yacute -10\nKPX oslash ydieresis -10\nKPX otilde v -15\nKPX otilde w -25\nKPX otilde x -10\nKPX otilde y -10\nKPX otilde yacute -10\nKPX otilde ydieresis -10\nKPX period quotedblright -95\nKPX period quoteright -95\nKPX quoteleft quoteleft -74\nKPX quoteright d -15\nKPX quoteright dcroat -15\nKPX quoteright quoteright -74\nKPX quoteright r -15\nKPX quoteright racute -15\nKPX quoteright rcaron -15\nKPX quoteright rcommaaccent -15\nKPX quoteright s -74\nKPX quoteright sacute -74\nKPX quoteright scaron -74\nKPX quoteright scedilla -74\nKPX quoteright scommaaccent -74\nKPX quoteright space -74\nKPX quoteright t -37\nKPX quoteright tcommaaccent -37\nKPX quoteright v -15\nKPX r comma -65\nKPX r period -65\nKPX racute comma -65\nKPX racute period -65\nKPX rcaron comma -65\nKPX rcaron period -65\nKPX rcommaaccent comma -65\nKPX rcommaaccent period -65\nKPX space A -37\nKPX space Aacute -37\nKPX space Abreve -37\nKPX space Acircumflex -37\nKPX space Adieresis -37\nKPX space Agrave -37\nKPX space Amacron -37\nKPX space Aogonek -37\nKPX space Aring -37\nKPX space Atilde -37\nKPX space V -70\nKPX space W -70\nKPX space Y -70\nKPX space Yacute -70\nKPX space Ydieresis -70\nKPX v comma -37\nKPX v e -15\nKPX v eacute -15\nKPX v ecaron -15\nKPX v ecircumflex -15\nKPX v edieresis -15\nKPX v edotaccent -15\nKPX v egrave -15\nKPX v emacron -15\nKPX v eogonek -15\nKPX v o -15\nKPX v oacute -15\nKPX v ocircumflex -15\nKPX v odieresis -15\nKPX v ograve -15\nKPX v ohungarumlaut -15\nKPX v omacron -15\nKPX v oslash -15\nKPX v otilde -15\nKPX v period -37\nKPX w a -10\nKPX w aacute -10\nKPX w abreve -10\nKPX w acircumflex -10\nKPX w adieresis -10\nKPX w agrave -10\nKPX w amacron -10\nKPX w aogonek -10\nKPX w aring -10\nKPX w atilde -10\nKPX w comma -37\nKPX w e -10\nKPX w eacute -10\nKPX w ecaron -10\nKPX w ecircumflex -10\nKPX w edieresis -10\nKPX w edotaccent -10\nKPX w egrave -10\nKPX w emacron -10\nKPX w eogonek -10\nKPX w o -15\nKPX w oacute -15\nKPX w ocircumflex -15\nKPX w odieresis -15\nKPX w ograve -15\nKPX w ohungarumlaut -15\nKPX w omacron -15\nKPX w oslash -15\nKPX w otilde -15\nKPX w period -37\nKPX x e -10\nKPX x eacute -10\nKPX x ecaron -10\nKPX x ecircumflex -10\nKPX x edieresis -10\nKPX x edotaccent -10\nKPX x egrave -10\nKPX x emacron -10\nKPX x eogonek -10\nKPX y comma -37\nKPX y period -37\nKPX yacute comma -37\nKPX yacute period -37\nKPX ydieresis comma -37\nKPX ydieresis period -37\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/Times-Italic.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:56:55 1997\nComment UniqueID 43067\nComment VMusage 47727 58752\nFontName Times-Italic\nFullName Times Italic\nFamilyName Times\nWeight Medium\nItalicAngle -15.5\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -169 -217 1010 883 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 653\nXHeight 441\nAscender 683\nDescender -217\nStdHW 32\nStdVW 76\nStartCharMetrics 315\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ;\nC 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ;\nC 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ;\nC 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ;\nC 37 ; WX 833 ; N percent ; B 79 -13 790 676 ;\nC 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ;\nC 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ;\nC 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ;\nC 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ;\nC 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ;\nC 43 ; WX 675 ; N plus ; B 86 0 590 506 ;\nC 44 ; WX 250 ; N comma ; B -4 -129 135 101 ;\nC 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ;\nC 46 ; WX 250 ; N period ; B 27 -11 138 100 ;\nC 47 ; WX 278 ; N slash ; B -65 -18 386 666 ;\nC 48 ; WX 500 ; N zero ; B 32 -7 497 676 ;\nC 49 ; WX 500 ; N one ; B 49 0 409 676 ;\nC 50 ; WX 500 ; N two ; B 12 0 452 676 ;\nC 51 ; WX 500 ; N three ; B 15 -7 465 676 ;\nC 52 ; WX 500 ; N four ; B 1 0 479 676 ;\nC 53 ; WX 500 ; N five ; B 15 -7 491 666 ;\nC 54 ; WX 500 ; N six ; B 30 -7 521 686 ;\nC 55 ; WX 500 ; N seven ; B 75 -8 537 666 ;\nC 56 ; WX 500 ; N eight ; B 30 -7 493 676 ;\nC 57 ; WX 500 ; N nine ; B 23 -17 492 676 ;\nC 58 ; WX 333 ; N colon ; B 50 -11 261 441 ;\nC 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ;\nC 60 ; WX 675 ; N less ; B 84 -8 592 514 ;\nC 61 ; WX 675 ; N equal ; B 86 120 590 386 ;\nC 62 ; WX 675 ; N greater ; B 84 -8 592 514 ;\nC 63 ; WX 500 ; N question ; B 132 -12 472 664 ;\nC 64 ; WX 920 ; N at ; B 118 -18 806 666 ;\nC 65 ; WX 611 ; N A ; B -51 0 564 668 ;\nC 66 ; WX 611 ; N B ; B -8 0 588 653 ;\nC 67 ; WX 667 ; N C ; B 66 -18 689 666 ;\nC 68 ; WX 722 ; N D ; B -8 0 700 653 ;\nC 69 ; WX 611 ; N E ; B -1 0 634 653 ;\nC 70 ; WX 611 ; N F ; B 8 0 645 653 ;\nC 71 ; WX 722 ; N G ; B 52 -18 722 666 ;\nC 72 ; WX 722 ; N H ; B -8 0 767 653 ;\nC 73 ; WX 333 ; N I ; B -8 0 384 653 ;\nC 74 ; WX 444 ; N J ; B -6 -18 491 653 ;\nC 75 ; WX 667 ; N K ; B 7 0 722 653 ;\nC 76 ; WX 556 ; N L ; B -8 0 559 653 ;\nC 77 ; WX 833 ; N M ; B -18 0 873 653 ;\nC 78 ; WX 667 ; N N ; B -20 -15 727 653 ;\nC 79 ; WX 722 ; N O ; B 60 -18 699 666 ;\nC 80 ; WX 611 ; N P ; B 0 0 605 653 ;\nC 81 ; WX 722 ; N Q ; B 59 -182 699 666 ;\nC 82 ; WX 611 ; N R ; B -13 0 588 653 ;\nC 83 ; WX 500 ; N S ; B 17 -18 508 667 ;\nC 84 ; WX 556 ; N T ; B 59 0 633 653 ;\nC 85 ; WX 722 ; N U ; B 102 -18 765 653 ;\nC 86 ; WX 611 ; N V ; B 76 -18 688 653 ;\nC 87 ; WX 833 ; N W ; B 71 -18 906 653 ;\nC 88 ; WX 611 ; N X ; B -29 0 655 653 ;\nC 89 ; WX 556 ; N Y ; B 78 0 633 653 ;\nC 90 ; WX 556 ; N Z ; B -6 0 606 653 ;\nC 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ;\nC 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ;\nC 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ;\nC 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B 171 436 310 666 ;\nC 97 ; WX 500 ; N a ; B 17 -11 476 441 ;\nC 98 ; WX 500 ; N b ; B 23 -11 473 683 ;\nC 99 ; WX 444 ; N c ; B 30 -11 425 441 ;\nC 100 ; WX 500 ; N d ; B 15 -13 527 683 ;\nC 101 ; WX 444 ; N e ; B 31 -11 412 441 ;\nC 102 ; WX 278 ; N f ; B -147 -207 424 678 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B 8 -206 472 441 ;\nC 104 ; WX 500 ; N h ; B 19 -9 478 683 ;\nC 105 ; WX 278 ; N i ; B 49 -11 264 654 ;\nC 106 ; WX 278 ; N j ; B -124 -207 276 654 ;\nC 107 ; WX 444 ; N k ; B 14 -11 461 683 ;\nC 108 ; WX 278 ; N l ; B 41 -11 279 683 ;\nC 109 ; WX 722 ; N m ; B 12 -9 704 441 ;\nC 110 ; WX 500 ; N n ; B 14 -9 474 441 ;\nC 111 ; WX 500 ; N o ; B 27 -11 468 441 ;\nC 112 ; WX 500 ; N p ; B -75 -205 469 441 ;\nC 113 ; WX 500 ; N q ; B 25 -209 483 441 ;\nC 114 ; WX 389 ; N r ; B 45 0 412 441 ;\nC 115 ; WX 389 ; N s ; B 16 -13 366 442 ;\nC 116 ; WX 278 ; N t ; B 37 -11 296 546 ;\nC 117 ; WX 500 ; N u ; B 42 -11 475 441 ;\nC 118 ; WX 444 ; N v ; B 21 -18 426 441 ;\nC 119 ; WX 667 ; N w ; B 16 -18 648 441 ;\nC 120 ; WX 444 ; N x ; B -27 -11 447 441 ;\nC 121 ; WX 444 ; N y ; B -24 -206 426 441 ;\nC 122 ; WX 389 ; N z ; B -2 -81 380 428 ;\nC 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ;\nC 124 ; WX 275 ; N bar ; B 105 -217 171 783 ;\nC 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ;\nC 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;\nC 161 ; WX 389 ; N exclamdown ; B 59 -205 322 473 ;\nC 162 ; WX 500 ; N cent ; B 77 -143 472 560 ;\nC 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ;\nC 164 ; WX 167 ; N fraction ; B -169 -10 337 676 ;\nC 165 ; WX 500 ; N yen ; B 27 0 603 653 ;\nC 166 ; WX 500 ; N florin ; B 25 -182 507 682 ;\nC 167 ; WX 500 ; N section ; B 53 -162 461 666 ;\nC 168 ; WX 500 ; N currency ; B -22 53 522 597 ;\nC 169 ; WX 214 ; N quotesingle ; B 132 421 241 666 ;\nC 170 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ;\nC 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ;\nC 173 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ;\nC 174 ; WX 500 ; N fi ; B -141 -207 481 681 ;\nC 175 ; WX 500 ; N fl ; B -141 -204 518 682 ;\nC 177 ; WX 500 ; N endash ; B -6 197 505 243 ;\nC 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ;\nC 179 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ;\nC 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;\nC 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ;\nC 183 ; WX 350 ; N bullet ; B 40 191 310 461 ;\nC 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ;\nC 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ;\nC 186 ; WX 556 ; N quotedblright ; B 151 436 499 666 ;\nC 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ;\nC 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ;\nC 189 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ;\nC 191 ; WX 500 ; N questiondown ; B 28 -205 368 471 ;\nC 193 ; WX 333 ; N grave ; B 121 492 311 664 ;\nC 194 ; WX 333 ; N acute ; B 180 494 403 664 ;\nC 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ;\nC 196 ; WX 333 ; N tilde ; B 100 517 427 624 ;\nC 197 ; WX 333 ; N macron ; B 99 532 411 583 ;\nC 198 ; WX 333 ; N breve ; B 117 492 418 650 ;\nC 199 ; WX 333 ; N dotaccent ; B 207 548 305 646 ;\nC 200 ; WX 333 ; N dieresis ; B 107 548 405 646 ;\nC 202 ; WX 333 ; N ring ; B 155 492 355 691 ;\nC 203 ; WX 333 ; N cedilla ; B -30 -217 182 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ;\nC 206 ; WX 333 ; N ogonek ; B 20 -169 203 40 ;\nC 207 ; WX 333 ; N caron ; B 121 492 426 661 ;\nC 208 ; WX 889 ; N emdash ; B -6 197 894 243 ;\nC 225 ; WX 889 ; N AE ; B -27 0 911 653 ;\nC 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ;\nC 232 ; WX 556 ; N Lslash ; B -8 0 559 653 ;\nC 233 ; WX 722 ; N Oslash ; B 60 -105 699 722 ;\nC 234 ; WX 944 ; N OE ; B 49 -8 964 666 ;\nC 235 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ;\nC 241 ; WX 667 ; N ae ; B 23 -11 640 441 ;\nC 245 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ;\nC 248 ; WX 278 ; N lslash ; B 41 -11 312 683 ;\nC 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ;\nC 250 ; WX 667 ; N oe ; B 20 -12 646 441 ;\nC 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ;\nC -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ;\nC -1 ; WX 444 ; N eacute ; B 31 -11 459 664 ;\nC -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ;\nC -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 580 664 ;\nC -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ;\nC -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ;\nC -1 ; WX 675 ; N divide ; B 86 -11 590 517 ;\nC -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ;\nC -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ;\nC -1 ; WX 500 ; N aacute ; B 17 -11 487 664 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ;\nC -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ;\nC -1 ; WX 389 ; N scommaaccent ; B 16 -217 366 442 ;\nC -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ;\nC -1 ; WX 722 ; N Uring ; B 102 -18 765 883 ;\nC -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ;\nC -1 ; WX 500 ; N aogonek ; B 17 -169 476 441 ;\nC -1 ; WX 722 ; N Uacute ; B 102 -18 765 876 ;\nC -1 ; WX 500 ; N uogonek ; B 42 -169 477 441 ;\nC -1 ; WX 611 ; N Edieresis ; B -1 0 634 818 ;\nC -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ;\nC -1 ; WX 250 ; N commaaccent ; B 8 -217 133 -50 ;\nC -1 ; WX 760 ; N copyright ; B 41 -18 719 666 ;\nC -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ;\nC -1 ; WX 444 ; N ccaron ; B 30 -11 482 661 ;\nC -1 ; WX 500 ; N aring ; B 17 -11 476 691 ;\nC -1 ; WX 667 ; N Ncommaaccent ; B -20 -187 727 653 ;\nC -1 ; WX 278 ; N lacute ; B 41 -11 395 876 ;\nC -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ;\nC -1 ; WX 556 ; N Tcommaaccent ; B 59 -217 633 653 ;\nC -1 ; WX 667 ; N Cacute ; B 66 -18 690 876 ;\nC -1 ; WX 500 ; N atilde ; B 17 -11 511 624 ;\nC -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ;\nC -1 ; WX 389 ; N scaron ; B 16 -13 454 661 ;\nC -1 ; WX 389 ; N scedilla ; B 16 -217 366 442 ;\nC -1 ; WX 278 ; N iacute ; B 49 -11 355 664 ;\nC -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ;\nC -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ;\nC -1 ; WX 722 ; N Gcommaaccent ; B 52 -217 722 666 ;\nC -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ;\nC -1 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ;\nC -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ;\nC -1 ; WX 389 ; N rcaron ; B 45 0 434 661 ;\nC -1 ; WX 444 ; N ccedilla ; B 30 -217 425 441 ;\nC -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ;\nC -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ;\nC -1 ; WX 722 ; N Omacron ; B 60 -18 699 795 ;\nC -1 ; WX 611 ; N Racute ; B -13 0 588 876 ;\nC -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ;\nC -1 ; WX 544 ; N dcaron ; B 15 -13 658 683 ;\nC -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ;\nC -1 ; WX 500 ; N uring ; B 42 -11 475 691 ;\nC -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 ;\nC -1 ; WX 722 ; N Ograve ; B 60 -18 699 876 ;\nC -1 ; WX 611 ; N Agrave ; B -51 0 564 876 ;\nC -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ;\nC -1 ; WX 675 ; N multiply ; B 93 8 582 497 ;\nC -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ;\nC -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ;\nC -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;\nC -1 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ;\nC -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ;\nC -1 ; WX 278 ; N icircumflex ; B 33 -11 327 661 ;\nC -1 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ;\nC -1 ; WX 500 ; N adieresis ; B 17 -11 489 606 ;\nC -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ;\nC -1 ; WX 444 ; N cacute ; B 30 -11 459 664 ;\nC -1 ; WX 500 ; N nacute ; B 14 -9 477 664 ;\nC -1 ; WX 500 ; N umacron ; B 42 -11 485 583 ;\nC -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ;\nC -1 ; WX 333 ; N Iacute ; B -8 0 433 876 ;\nC -1 ; WX 675 ; N plusminus ; B 86 0 590 506 ;\nC -1 ; WX 275 ; N brokenbar ; B 105 -142 171 708 ;\nC -1 ; WX 760 ; N registered ; B 41 -18 719 666 ;\nC -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ;\nC -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;\nC -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ;\nC -1 ; WX 389 ; N racute ; B 45 0 431 664 ;\nC -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ;\nC -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ;\nC -1 ; WX 556 ; N Zcaron ; B -6 0 606 873 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ;\nC -1 ; WX 722 ; N Eth ; B -8 0 700 653 ;\nC -1 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 22 -217 279 683 ;\nC -1 ; WX 300 ; N tcaron ; B 37 -11 407 681 ;\nC -1 ; WX 444 ; N eogonek ; B 31 -169 412 441 ;\nC -1 ; WX 722 ; N Uogonek ; B 102 -184 765 653 ;\nC -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ;\nC -1 ; WX 611 ; N Adieresis ; B -51 0 564 818 ;\nC -1 ; WX 444 ; N egrave ; B 31 -11 412 664 ;\nC -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ;\nC -1 ; WX 278 ; N iogonek ; B 49 -169 264 654 ;\nC -1 ; WX 722 ; N Oacute ; B 60 -18 699 876 ;\nC -1 ; WX 500 ; N oacute ; B 27 -11 487 664 ;\nC -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ;\nC -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ;\nC -1 ; WX 278 ; N idieresis ; B 49 -11 352 606 ;\nC -1 ; WX 722 ; N Ocircumflex ; B 60 -18 699 873 ;\nC -1 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 500 ; N thorn ; B -75 -205 469 683 ;\nC -1 ; WX 300 ; N twosuperior ; B 33 271 324 676 ;\nC -1 ; WX 722 ; N Odieresis ; B 60 -18 699 818 ;\nC -1 ; WX 500 ; N mu ; B -30 -209 497 428 ;\nC -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ;\nC -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 590 664 ;\nC -1 ; WX 611 ; N Eogonek ; B -1 -169 634 653 ;\nC -1 ; WX 500 ; N dcroat ; B 15 -13 572 683 ;\nC -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ;\nC -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ;\nC -1 ; WX 300 ; N lcaron ; B 41 -11 407 683 ;\nC -1 ; WX 667 ; N Kcommaaccent ; B 7 -217 722 653 ;\nC -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ;\nC -1 ; WX 980 ; N trademark ; B 30 247 957 653 ;\nC -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ;\nC -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ;\nC -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ;\nC -1 ; WX 611 ; N Lcaron ; B -8 0 586 653 ;\nC -1 ; WX 750 ; N onehalf ; B 34 -10 749 676 ;\nC -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ;\nC -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ;\nC -1 ; WX 500 ; N ntilde ; B 14 -9 476 624 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ;\nC -1 ; WX 611 ; N Eacute ; B -1 0 634 876 ;\nC -1 ; WX 444 ; N emacron ; B 31 -11 457 583 ;\nC -1 ; WX 500 ; N gbreve ; B 8 -206 487 650 ;\nC -1 ; WX 750 ; N onequarter ; B 33 -10 736 676 ;\nC -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ;\nC -1 ; WX 500 ; N Scommaaccent ; B 17 -217 508 667 ;\nC -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 699 876 ;\nC -1 ; WX 400 ; N degree ; B 101 390 387 676 ;\nC -1 ; WX 500 ; N ograve ; B 27 -11 468 664 ;\nC -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ;\nC -1 ; WX 500 ; N ugrave ; B 42 -11 475 664 ;\nC -1 ; WX 453 ; N radical ; B 2 -60 452 768 ;\nC -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ;\nC -1 ; WX 389 ; N rcommaaccent ; B -3 -217 412 441 ;\nC -1 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ;\nC -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ;\nC -1 ; WX 611 ; N Rcommaaccent ; B -13 -187 588 653 ;\nC -1 ; WX 556 ; N Lcommaaccent ; B -8 -217 559 653 ;\nC -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ;\nC -1 ; WX 611 ; N Aogonek ; B -51 -169 566 668 ;\nC -1 ; WX 611 ; N Aring ; B -51 0 564 883 ;\nC -1 ; WX 722 ; N Otilde ; B 60 -18 699 836 ;\nC -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ;\nC -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ;\nC -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ;\nC -1 ; WX 444 ; N kcommaaccent ; B 14 -187 461 683 ;\nC -1 ; WX 675 ; N minus ; B 86 220 590 286 ;\nC -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ;\nC -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ;\nC -1 ; WX 278 ; N tcommaaccent ; B 2 -217 296 546 ;\nC -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ;\nC -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ;\nC -1 ; WX 500 ; N udieresis ; B 42 -11 479 606 ;\nC -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ;\nC -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ;\nC -1 ; WX 500 ; N eth ; B 27 -11 482 683 ;\nC -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ;\nC -1 ; WX 500 ; N ncommaaccent ; B 14 -187 474 441 ;\nC -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ;\nC -1 ; WX 278 ; N imacron ; B 46 -11 311 583 ;\nC -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2321\nKPX A C -30\nKPX A Cacute -30\nKPX A Ccaron -30\nKPX A Ccedilla -30\nKPX A G -35\nKPX A Gbreve -35\nKPX A Gcommaaccent -35\nKPX A O -40\nKPX A Oacute -40\nKPX A Ocircumflex -40\nKPX A Odieresis -40\nKPX A Ograve -40\nKPX A Ohungarumlaut -40\nKPX A Omacron -40\nKPX A Oslash -40\nKPX A Otilde -40\nKPX A Q -40\nKPX A T -37\nKPX A Tcaron -37\nKPX A Tcommaaccent -37\nKPX A U -50\nKPX A Uacute -50\nKPX A Ucircumflex -50\nKPX A Udieresis -50\nKPX A Ugrave -50\nKPX A Uhungarumlaut -50\nKPX A Umacron -50\nKPX A Uogonek -50\nKPX A Uring -50\nKPX A V -105\nKPX A W -95\nKPX A Y -55\nKPX A Yacute -55\nKPX A Ydieresis -55\nKPX A quoteright -37\nKPX A u -20\nKPX A uacute -20\nKPX A ucircumflex -20\nKPX A udieresis -20\nKPX A ugrave -20\nKPX A uhungarumlaut -20\nKPX A umacron -20\nKPX A uogonek -20\nKPX A uring -20\nKPX A v -55\nKPX A w -55\nKPX A y -55\nKPX A yacute -55\nKPX A ydieresis -55\nKPX Aacute C -30\nKPX Aacute Cacute -30\nKPX Aacute Ccaron -30\nKPX Aacute Ccedilla -30\nKPX Aacute G -35\nKPX Aacute Gbreve -35\nKPX Aacute Gcommaaccent -35\nKPX Aacute O -40\nKPX Aacute Oacute -40\nKPX Aacute Ocircumflex -40\nKPX Aacute Odieresis -40\nKPX Aacute Ograve -40\nKPX Aacute Ohungarumlaut -40\nKPX Aacute Omacron -40\nKPX Aacute Oslash -40\nKPX Aacute Otilde -40\nKPX Aacute Q -40\nKPX Aacute T -37\nKPX Aacute Tcaron -37\nKPX Aacute Tcommaaccent -37\nKPX Aacute U -50\nKPX Aacute Uacute -50\nKPX Aacute Ucircumflex -50\nKPX Aacute Udieresis -50\nKPX Aacute Ugrave -50\nKPX Aacute Uhungarumlaut -50\nKPX Aacute Umacron -50\nKPX Aacute Uogonek -50\nKPX Aacute Uring -50\nKPX Aacute V -105\nKPX Aacute W -95\nKPX Aacute Y -55\nKPX Aacute Yacute -55\nKPX Aacute Ydieresis -55\nKPX Aacute quoteright -37\nKPX Aacute u -20\nKPX Aacute uacute -20\nKPX Aacute ucircumflex -20\nKPX Aacute udieresis -20\nKPX Aacute ugrave -20\nKPX Aacute uhungarumlaut -20\nKPX Aacute umacron -20\nKPX Aacute uogonek -20\nKPX Aacute uring -20\nKPX Aacute v -55\nKPX Aacute w -55\nKPX Aacute y -55\nKPX Aacute yacute -55\nKPX Aacute ydieresis -55\nKPX Abreve C -30\nKPX Abreve Cacute -30\nKPX Abreve Ccaron -30\nKPX Abreve Ccedilla -30\nKPX Abreve G -35\nKPX Abreve Gbreve -35\nKPX Abreve Gcommaaccent -35\nKPX Abreve O -40\nKPX Abreve Oacute -40\nKPX Abreve Ocircumflex -40\nKPX Abreve Odieresis -40\nKPX Abreve Ograve -40\nKPX Abreve Ohungarumlaut -40\nKPX Abreve Omacron -40\nKPX Abreve Oslash -40\nKPX Abreve Otilde -40\nKPX Abreve Q -40\nKPX Abreve T -37\nKPX Abreve Tcaron -37\nKPX Abreve Tcommaaccent -37\nKPX Abreve U -50\nKPX Abreve Uacute -50\nKPX Abreve Ucircumflex -50\nKPX Abreve Udieresis -50\nKPX Abreve Ugrave -50\nKPX Abreve Uhungarumlaut -50\nKPX Abreve Umacron -50\nKPX Abreve Uogonek -50\nKPX Abreve Uring -50\nKPX Abreve V -105\nKPX Abreve W -95\nKPX Abreve Y -55\nKPX Abreve Yacute -55\nKPX Abreve Ydieresis -55\nKPX Abreve quoteright -37\nKPX Abreve u -20\nKPX Abreve uacute -20\nKPX Abreve ucircumflex -20\nKPX Abreve udieresis -20\nKPX Abreve ugrave -20\nKPX Abreve uhungarumlaut -20\nKPX Abreve umacron -20\nKPX Abreve uogonek -20\nKPX Abreve uring -20\nKPX Abreve v -55\nKPX Abreve w -55\nKPX Abreve y -55\nKPX Abreve yacute -55\nKPX Abreve ydieresis -55\nKPX Acircumflex C -30\nKPX Acircumflex Cacute -30\nKPX Acircumflex Ccaron -30\nKPX Acircumflex Ccedilla -30\nKPX Acircumflex G -35\nKPX Acircumflex Gbreve -35\nKPX Acircumflex Gcommaaccent -35\nKPX Acircumflex O -40\nKPX Acircumflex Oacute -40\nKPX Acircumflex Ocircumflex -40\nKPX Acircumflex Odieresis -40\nKPX Acircumflex Ograve -40\nKPX Acircumflex Ohungarumlaut -40\nKPX Acircumflex Omacron -40\nKPX Acircumflex Oslash -40\nKPX Acircumflex Otilde -40\nKPX Acircumflex Q -40\nKPX Acircumflex T -37\nKPX Acircumflex Tcaron -37\nKPX Acircumflex Tcommaaccent -37\nKPX Acircumflex U -50\nKPX Acircumflex Uacute -50\nKPX Acircumflex Ucircumflex -50\nKPX Acircumflex Udieresis -50\nKPX Acircumflex Ugrave -50\nKPX Acircumflex Uhungarumlaut -50\nKPX Acircumflex Umacron -50\nKPX Acircumflex Uogonek -50\nKPX Acircumflex Uring -50\nKPX Acircumflex V -105\nKPX Acircumflex W -95\nKPX Acircumflex Y -55\nKPX Acircumflex Yacute -55\nKPX Acircumflex Ydieresis -55\nKPX Acircumflex quoteright -37\nKPX Acircumflex u -20\nKPX Acircumflex uacute -20\nKPX Acircumflex ucircumflex -20\nKPX Acircumflex udieresis -20\nKPX Acircumflex ugrave -20\nKPX Acircumflex uhungarumlaut -20\nKPX Acircumflex umacron -20\nKPX Acircumflex uogonek -20\nKPX Acircumflex uring -20\nKPX Acircumflex v -55\nKPX Acircumflex w -55\nKPX Acircumflex y -55\nKPX Acircumflex yacute -55\nKPX Acircumflex ydieresis -55\nKPX Adieresis C -30\nKPX Adieresis Cacute -30\nKPX Adieresis Ccaron -30\nKPX Adieresis Ccedilla -30\nKPX Adieresis G -35\nKPX Adieresis Gbreve -35\nKPX Adieresis Gcommaaccent -35\nKPX Adieresis O -40\nKPX Adieresis Oacute -40\nKPX Adieresis Ocircumflex -40\nKPX Adieresis Odieresis -40\nKPX Adieresis Ograve -40\nKPX Adieresis Ohungarumlaut -40\nKPX Adieresis Omacron -40\nKPX Adieresis Oslash -40\nKPX Adieresis Otilde -40\nKPX Adieresis Q -40\nKPX Adieresis T -37\nKPX Adieresis Tcaron -37\nKPX Adieresis Tcommaaccent -37\nKPX Adieresis U -50\nKPX Adieresis Uacute -50\nKPX Adieresis Ucircumflex -50\nKPX Adieresis Udieresis -50\nKPX Adieresis Ugrave -50\nKPX Adieresis Uhungarumlaut -50\nKPX Adieresis Umacron -50\nKPX Adieresis Uogonek -50\nKPX Adieresis Uring -50\nKPX Adieresis V -105\nKPX Adieresis W -95\nKPX Adieresis Y -55\nKPX Adieresis Yacute -55\nKPX Adieresis Ydieresis -55\nKPX Adieresis quoteright -37\nKPX Adieresis u -20\nKPX Adieresis uacute -20\nKPX Adieresis ucircumflex -20\nKPX Adieresis udieresis -20\nKPX Adieresis ugrave -20\nKPX Adieresis uhungarumlaut -20\nKPX Adieresis umacron -20\nKPX Adieresis uogonek -20\nKPX Adieresis uring -20\nKPX Adieresis v -55\nKPX Adieresis w -55\nKPX Adieresis y -55\nKPX Adieresis yacute -55\nKPX Adieresis ydieresis -55\nKPX Agrave C -30\nKPX Agrave Cacute -30\nKPX Agrave Ccaron -30\nKPX Agrave Ccedilla -30\nKPX Agrave G -35\nKPX Agrave Gbreve -35\nKPX Agrave Gcommaaccent -35\nKPX Agrave O -40\nKPX Agrave Oacute -40\nKPX Agrave Ocircumflex -40\nKPX Agrave Odieresis -40\nKPX Agrave Ograve -40\nKPX Agrave Ohungarumlaut -40\nKPX Agrave Omacron -40\nKPX Agrave Oslash -40\nKPX Agrave Otilde -40\nKPX Agrave Q -40\nKPX Agrave T -37\nKPX Agrave Tcaron -37\nKPX Agrave Tcommaaccent -37\nKPX Agrave U -50\nKPX Agrave Uacute -50\nKPX Agrave Ucircumflex -50\nKPX Agrave Udieresis -50\nKPX Agrave Ugrave -50\nKPX Agrave Uhungarumlaut -50\nKPX Agrave Umacron -50\nKPX Agrave Uogonek -50\nKPX Agrave Uring -50\nKPX Agrave V -105\nKPX Agrave W -95\nKPX Agrave Y -55\nKPX Agrave Yacute -55\nKPX Agrave Ydieresis -55\nKPX Agrave quoteright -37\nKPX Agrave u -20\nKPX Agrave uacute -20\nKPX Agrave ucircumflex -20\nKPX Agrave udieresis -20\nKPX Agrave ugrave -20\nKPX Agrave uhungarumlaut -20\nKPX Agrave umacron -20\nKPX Agrave uogonek -20\nKPX Agrave uring -20\nKPX Agrave v -55\nKPX Agrave w -55\nKPX Agrave y -55\nKPX Agrave yacute -55\nKPX Agrave ydieresis -55\nKPX Amacron C -30\nKPX Amacron Cacute -30\nKPX Amacron Ccaron -30\nKPX Amacron Ccedilla -30\nKPX Amacron G -35\nKPX Amacron Gbreve -35\nKPX Amacron Gcommaaccent -35\nKPX Amacron O -40\nKPX Amacron Oacute -40\nKPX Amacron Ocircumflex -40\nKPX Amacron Odieresis -40\nKPX Amacron Ograve -40\nKPX Amacron Ohungarumlaut -40\nKPX Amacron Omacron -40\nKPX Amacron Oslash -40\nKPX Amacron Otilde -40\nKPX Amacron Q -40\nKPX Amacron T -37\nKPX Amacron Tcaron -37\nKPX Amacron Tcommaaccent -37\nKPX Amacron U -50\nKPX Amacron Uacute -50\nKPX Amacron Ucircumflex -50\nKPX Amacron Udieresis -50\nKPX Amacron Ugrave -50\nKPX Amacron Uhungarumlaut -50\nKPX Amacron Umacron -50\nKPX Amacron Uogonek -50\nKPX Amacron Uring -50\nKPX Amacron V -105\nKPX Amacron W -95\nKPX Amacron Y -55\nKPX Amacron Yacute -55\nKPX Amacron Ydieresis -55\nKPX Amacron quoteright -37\nKPX Amacron u -20\nKPX Amacron uacute -20\nKPX Amacron ucircumflex -20\nKPX Amacron udieresis -20\nKPX Amacron ugrave -20\nKPX Amacron uhungarumlaut -20\nKPX Amacron umacron -20\nKPX Amacron uogonek -20\nKPX Amacron uring -20\nKPX Amacron v -55\nKPX Amacron w -55\nKPX Amacron y -55\nKPX Amacron yacute -55\nKPX Amacron ydieresis -55\nKPX Aogonek C -30\nKPX Aogonek Cacute -30\nKPX Aogonek Ccaron -30\nKPX Aogonek Ccedilla -30\nKPX Aogonek G -35\nKPX Aogonek Gbreve -35\nKPX Aogonek Gcommaaccent -35\nKPX Aogonek O -40\nKPX Aogonek Oacute -40\nKPX Aogonek Ocircumflex -40\nKPX Aogonek Odieresis -40\nKPX Aogonek Ograve -40\nKPX Aogonek Ohungarumlaut -40\nKPX Aogonek Omacron -40\nKPX Aogonek Oslash -40\nKPX Aogonek Otilde -40\nKPX Aogonek Q -40\nKPX Aogonek T -37\nKPX Aogonek Tcaron -37\nKPX Aogonek Tcommaaccent -37\nKPX Aogonek U -50\nKPX Aogonek Uacute -50\nKPX Aogonek Ucircumflex -50\nKPX Aogonek Udieresis -50\nKPX Aogonek Ugrave -50\nKPX Aogonek Uhungarumlaut -50\nKPX Aogonek Umacron -50\nKPX Aogonek Uogonek -50\nKPX Aogonek Uring -50\nKPX Aogonek V -105\nKPX Aogonek W -95\nKPX Aogonek Y -55\nKPX Aogonek Yacute -55\nKPX Aogonek Ydieresis -55\nKPX Aogonek quoteright -37\nKPX Aogonek u -20\nKPX Aogonek uacute -20\nKPX Aogonek ucircumflex -20\nKPX Aogonek udieresis -20\nKPX Aogonek ugrave -20\nKPX Aogonek uhungarumlaut -20\nKPX Aogonek umacron -20\nKPX Aogonek uogonek -20\nKPX Aogonek uring -20\nKPX Aogonek v -55\nKPX Aogonek w -55\nKPX Aogonek y -55\nKPX Aogonek yacute -55\nKPX Aogonek ydieresis -55\nKPX Aring C -30\nKPX Aring Cacute -30\nKPX Aring Ccaron -30\nKPX Aring Ccedilla -30\nKPX Aring G -35\nKPX Aring Gbreve -35\nKPX Aring Gcommaaccent -35\nKPX Aring O -40\nKPX Aring Oacute -40\nKPX Aring Ocircumflex -40\nKPX Aring Odieresis -40\nKPX Aring Ograve -40\nKPX Aring Ohungarumlaut -40\nKPX Aring Omacron -40\nKPX Aring Oslash -40\nKPX Aring Otilde -40\nKPX Aring Q -40\nKPX Aring T -37\nKPX Aring Tcaron -37\nKPX Aring Tcommaaccent -37\nKPX Aring U -50\nKPX Aring Uacute -50\nKPX Aring Ucircumflex -50\nKPX Aring Udieresis -50\nKPX Aring Ugrave -50\nKPX Aring Uhungarumlaut -50\nKPX Aring Umacron -50\nKPX Aring Uogonek -50\nKPX Aring Uring -50\nKPX Aring V -105\nKPX Aring W -95\nKPX Aring Y -55\nKPX Aring Yacute -55\nKPX Aring Ydieresis -55\nKPX Aring quoteright -37\nKPX Aring u -20\nKPX Aring uacute -20\nKPX Aring ucircumflex -20\nKPX Aring udieresis -20\nKPX Aring ugrave -20\nKPX Aring uhungarumlaut -20\nKPX Aring umacron -20\nKPX Aring uogonek -20\nKPX Aring uring -20\nKPX Aring v -55\nKPX Aring w -55\nKPX Aring y -55\nKPX Aring yacute -55\nKPX Aring ydieresis -55\nKPX Atilde C -30\nKPX Atilde Cacute -30\nKPX Atilde Ccaron -30\nKPX Atilde Ccedilla -30\nKPX Atilde G -35\nKPX Atilde Gbreve -35\nKPX Atilde Gcommaaccent -35\nKPX Atilde O -40\nKPX Atilde Oacute -40\nKPX Atilde Ocircumflex -40\nKPX Atilde Odieresis -40\nKPX Atilde Ograve -40\nKPX Atilde Ohungarumlaut -40\nKPX Atilde Omacron -40\nKPX Atilde Oslash -40\nKPX Atilde Otilde -40\nKPX Atilde Q -40\nKPX Atilde T -37\nKPX Atilde Tcaron -37\nKPX Atilde Tcommaaccent -37\nKPX Atilde U -50\nKPX Atilde Uacute -50\nKPX Atilde Ucircumflex -50\nKPX Atilde Udieresis -50\nKPX Atilde Ugrave -50\nKPX Atilde Uhungarumlaut -50\nKPX Atilde Umacron -50\nKPX Atilde Uogonek -50\nKPX Atilde Uring -50\nKPX Atilde V -105\nKPX Atilde W -95\nKPX Atilde Y -55\nKPX Atilde Yacute -55\nKPX Atilde Ydieresis -55\nKPX Atilde quoteright -37\nKPX Atilde u -20\nKPX Atilde uacute -20\nKPX Atilde ucircumflex -20\nKPX Atilde udieresis -20\nKPX Atilde ugrave -20\nKPX Atilde uhungarumlaut -20\nKPX Atilde umacron -20\nKPX Atilde uogonek -20\nKPX Atilde uring -20\nKPX Atilde v -55\nKPX Atilde w -55\nKPX Atilde y -55\nKPX Atilde yacute -55\nKPX Atilde ydieresis -55\nKPX B A -25\nKPX B Aacute -25\nKPX B Abreve -25\nKPX B Acircumflex -25\nKPX B Adieresis -25\nKPX B Agrave -25\nKPX B Amacron -25\nKPX B Aogonek -25\nKPX B Aring -25\nKPX B Atilde -25\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX D A -35\nKPX D Aacute -35\nKPX D Abreve -35\nKPX D Acircumflex -35\nKPX D Adieresis -35\nKPX D Agrave -35\nKPX D Amacron -35\nKPX D Aogonek -35\nKPX D Aring -35\nKPX D Atilde -35\nKPX D V -40\nKPX D W -40\nKPX D Y -40\nKPX D Yacute -40\nKPX D Ydieresis -40\nKPX Dcaron A -35\nKPX Dcaron Aacute -35\nKPX Dcaron Abreve -35\nKPX Dcaron Acircumflex -35\nKPX Dcaron Adieresis -35\nKPX Dcaron Agrave -35\nKPX Dcaron Amacron -35\nKPX Dcaron Aogonek -35\nKPX Dcaron Aring -35\nKPX Dcaron Atilde -35\nKPX Dcaron V -40\nKPX Dcaron W -40\nKPX Dcaron Y -40\nKPX Dcaron Yacute -40\nKPX Dcaron Ydieresis -40\nKPX Dcroat A -35\nKPX Dcroat Aacute -35\nKPX Dcroat Abreve -35\nKPX Dcroat Acircumflex -35\nKPX Dcroat Adieresis -35\nKPX Dcroat Agrave -35\nKPX Dcroat Amacron -35\nKPX Dcroat Aogonek -35\nKPX Dcroat Aring -35\nKPX Dcroat Atilde -35\nKPX Dcroat V -40\nKPX Dcroat W -40\nKPX Dcroat Y -40\nKPX Dcroat Yacute -40\nKPX Dcroat Ydieresis -40\nKPX F A -115\nKPX F Aacute -115\nKPX F Abreve -115\nKPX F Acircumflex -115\nKPX F Adieresis -115\nKPX F Agrave -115\nKPX F Amacron -115\nKPX F Aogonek -115\nKPX F Aring -115\nKPX F Atilde -115\nKPX F a -75\nKPX F aacute -75\nKPX F abreve -75\nKPX F acircumflex -75\nKPX F adieresis -75\nKPX F agrave -75\nKPX F amacron -75\nKPX F aogonek -75\nKPX F aring -75\nKPX F atilde -75\nKPX F comma -135\nKPX F e -75\nKPX F eacute -75\nKPX F ecaron -75\nKPX F ecircumflex -75\nKPX F edieresis -75\nKPX F edotaccent -75\nKPX F egrave -75\nKPX F emacron -75\nKPX F eogonek -75\nKPX F i -45\nKPX F iacute -45\nKPX F icircumflex -45\nKPX F idieresis -45\nKPX F igrave -45\nKPX F imacron -45\nKPX F iogonek -45\nKPX F o -105\nKPX F oacute -105\nKPX F ocircumflex -105\nKPX F odieresis -105\nKPX F ograve -105\nKPX F ohungarumlaut -105\nKPX F omacron -105\nKPX F oslash -105\nKPX F otilde -105\nKPX F period -135\nKPX F r -55\nKPX F racute -55\nKPX F rcaron -55\nKPX F rcommaaccent -55\nKPX J A -40\nKPX J Aacute -40\nKPX J Abreve -40\nKPX J Acircumflex -40\nKPX J Adieresis -40\nKPX J Agrave -40\nKPX J Amacron -40\nKPX J Aogonek -40\nKPX J Aring -40\nKPX J Atilde -40\nKPX J a -35\nKPX J aacute -35\nKPX J abreve -35\nKPX J acircumflex -35\nKPX J adieresis -35\nKPX J agrave -35\nKPX J amacron -35\nKPX J aogonek -35\nKPX J aring -35\nKPX J atilde -35\nKPX J comma -25\nKPX J e -25\nKPX J eacute -25\nKPX J ecaron -25\nKPX J ecircumflex -25\nKPX J edieresis -25\nKPX J edotaccent -25\nKPX J egrave -25\nKPX J emacron -25\nKPX J eogonek -25\nKPX J o -25\nKPX J oacute -25\nKPX J ocircumflex -25\nKPX J odieresis -25\nKPX J ograve -25\nKPX J ohungarumlaut -25\nKPX J omacron -25\nKPX J oslash -25\nKPX J otilde -25\nKPX J period -25\nKPX J u -35\nKPX J uacute -35\nKPX J ucircumflex -35\nKPX J udieresis -35\nKPX J ugrave -35\nKPX J uhungarumlaut -35\nKPX J umacron -35\nKPX J uogonek -35\nKPX J uring -35\nKPX K O -50\nKPX K Oacute -50\nKPX K Ocircumflex -50\nKPX K Odieresis -50\nKPX K Ograve -50\nKPX K Ohungarumlaut -50\nKPX K Omacron -50\nKPX K Oslash -50\nKPX K Otilde -50\nKPX K e -35\nKPX K eacute -35\nKPX K ecaron -35\nKPX K ecircumflex -35\nKPX K edieresis -35\nKPX K edotaccent -35\nKPX K egrave -35\nKPX K emacron -35\nKPX K eogonek -35\nKPX K o -40\nKPX K oacute -40\nKPX K ocircumflex -40\nKPX K odieresis -40\nKPX K ograve -40\nKPX K ohungarumlaut -40\nKPX K omacron -40\nKPX K oslash -40\nKPX K otilde -40\nKPX K u -40\nKPX K uacute -40\nKPX K ucircumflex -40\nKPX K udieresis -40\nKPX K ugrave -40\nKPX K uhungarumlaut -40\nKPX K umacron -40\nKPX K uogonek -40\nKPX K uring -40\nKPX K y -40\nKPX K yacute -40\nKPX K ydieresis -40\nKPX Kcommaaccent O -50\nKPX Kcommaaccent Oacute -50\nKPX Kcommaaccent Ocircumflex -50\nKPX Kcommaaccent Odieresis -50\nKPX Kcommaaccent Ograve -50\nKPX Kcommaaccent Ohungarumlaut -50\nKPX Kcommaaccent Omacron -50\nKPX Kcommaaccent Oslash -50\nKPX Kcommaaccent Otilde -50\nKPX Kcommaaccent e -35\nKPX Kcommaaccent eacute -35\nKPX Kcommaaccent ecaron -35\nKPX Kcommaaccent ecircumflex -35\nKPX Kcommaaccent edieresis -35\nKPX Kcommaaccent edotaccent -35\nKPX Kcommaaccent egrave -35\nKPX Kcommaaccent emacron -35\nKPX Kcommaaccent eogonek -35\nKPX Kcommaaccent o -40\nKPX Kcommaaccent oacute -40\nKPX Kcommaaccent ocircumflex -40\nKPX Kcommaaccent odieresis -40\nKPX Kcommaaccent ograve -40\nKPX Kcommaaccent ohungarumlaut -40\nKPX Kcommaaccent omacron -40\nKPX Kcommaaccent oslash -40\nKPX Kcommaaccent otilde -40\nKPX Kcommaaccent u -40\nKPX Kcommaaccent uacute -40\nKPX Kcommaaccent ucircumflex -40\nKPX Kcommaaccent udieresis -40\nKPX Kcommaaccent ugrave -40\nKPX Kcommaaccent uhungarumlaut -40\nKPX Kcommaaccent umacron -40\nKPX Kcommaaccent uogonek -40\nKPX Kcommaaccent uring -40\nKPX Kcommaaccent y -40\nKPX Kcommaaccent yacute -40\nKPX Kcommaaccent ydieresis -40\nKPX L T -20\nKPX L Tcaron -20\nKPX L Tcommaaccent -20\nKPX L V -55\nKPX L W -55\nKPX L Y -20\nKPX L Yacute -20\nKPX L Ydieresis -20\nKPX L quoteright -37\nKPX L y -30\nKPX L yacute -30\nKPX L ydieresis -30\nKPX Lacute T -20\nKPX Lacute Tcaron -20\nKPX Lacute Tcommaaccent -20\nKPX Lacute V -55\nKPX Lacute W -55\nKPX Lacute Y -20\nKPX Lacute Yacute -20\nKPX Lacute Ydieresis -20\nKPX Lacute quoteright -37\nKPX Lacute y -30\nKPX Lacute yacute -30\nKPX Lacute ydieresis -30\nKPX Lcommaaccent T -20\nKPX Lcommaaccent Tcaron -20\nKPX Lcommaaccent Tcommaaccent -20\nKPX Lcommaaccent V -55\nKPX Lcommaaccent W -55\nKPX Lcommaaccent Y -20\nKPX Lcommaaccent Yacute -20\nKPX Lcommaaccent Ydieresis -20\nKPX Lcommaaccent quoteright -37\nKPX Lcommaaccent y -30\nKPX Lcommaaccent yacute -30\nKPX Lcommaaccent ydieresis -30\nKPX Lslash T -20\nKPX Lslash Tcaron -20\nKPX Lslash Tcommaaccent -20\nKPX Lslash V -55\nKPX Lslash W -55\nKPX Lslash Y -20\nKPX Lslash Yacute -20\nKPX Lslash Ydieresis -20\nKPX Lslash quoteright -37\nKPX Lslash y -30\nKPX Lslash yacute -30\nKPX Lslash ydieresis -30\nKPX N A -27\nKPX N Aacute -27\nKPX N Abreve -27\nKPX N Acircumflex -27\nKPX N Adieresis -27\nKPX N Agrave -27\nKPX N Amacron -27\nKPX N Aogonek -27\nKPX N Aring -27\nKPX N Atilde -27\nKPX Nacute A -27\nKPX Nacute Aacute -27\nKPX Nacute Abreve -27\nKPX Nacute Acircumflex -27\nKPX Nacute Adieresis -27\nKPX Nacute Agrave -27\nKPX Nacute Amacron -27\nKPX Nacute Aogonek -27\nKPX Nacute Aring -27\nKPX Nacute Atilde -27\nKPX Ncaron A -27\nKPX Ncaron Aacute -27\nKPX Ncaron Abreve -27\nKPX Ncaron Acircumflex -27\nKPX Ncaron Adieresis -27\nKPX Ncaron Agrave -27\nKPX Ncaron Amacron -27\nKPX Ncaron Aogonek -27\nKPX Ncaron Aring -27\nKPX Ncaron Atilde -27\nKPX Ncommaaccent A -27\nKPX Ncommaaccent Aacute -27\nKPX Ncommaaccent Abreve -27\nKPX Ncommaaccent Acircumflex -27\nKPX Ncommaaccent Adieresis -27\nKPX Ncommaaccent Agrave -27\nKPX Ncommaaccent Amacron -27\nKPX Ncommaaccent Aogonek -27\nKPX Ncommaaccent Aring -27\nKPX Ncommaaccent Atilde -27\nKPX Ntilde A -27\nKPX Ntilde Aacute -27\nKPX Ntilde Abreve -27\nKPX Ntilde Acircumflex -27\nKPX Ntilde Adieresis -27\nKPX Ntilde Agrave -27\nKPX Ntilde Amacron -27\nKPX Ntilde Aogonek -27\nKPX Ntilde Aring -27\nKPX Ntilde Atilde -27\nKPX O A -55\nKPX O Aacute -55\nKPX O Abreve -55\nKPX O Acircumflex -55\nKPX O Adieresis -55\nKPX O Agrave -55\nKPX O Amacron -55\nKPX O Aogonek -55\nKPX O Aring -55\nKPX O Atilde -55\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -50\nKPX O X -40\nKPX O Y -50\nKPX O Yacute -50\nKPX O Ydieresis -50\nKPX Oacute A -55\nKPX Oacute Aacute -55\nKPX Oacute Abreve -55\nKPX Oacute Acircumflex -55\nKPX Oacute Adieresis -55\nKPX Oacute Agrave -55\nKPX Oacute Amacron -55\nKPX Oacute Aogonek -55\nKPX Oacute Aring -55\nKPX Oacute Atilde -55\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -50\nKPX Oacute X -40\nKPX Oacute Y -50\nKPX Oacute Yacute -50\nKPX Oacute Ydieresis -50\nKPX Ocircumflex A -55\nKPX Ocircumflex Aacute -55\nKPX Ocircumflex Abreve -55\nKPX Ocircumflex Acircumflex -55\nKPX Ocircumflex Adieresis -55\nKPX Ocircumflex Agrave -55\nKPX Ocircumflex Amacron -55\nKPX Ocircumflex Aogonek -55\nKPX Ocircumflex Aring -55\nKPX Ocircumflex Atilde -55\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -50\nKPX Ocircumflex X -40\nKPX Ocircumflex Y -50\nKPX Ocircumflex Yacute -50\nKPX Ocircumflex Ydieresis -50\nKPX Odieresis A -55\nKPX Odieresis Aacute -55\nKPX Odieresis Abreve -55\nKPX Odieresis Acircumflex -55\nKPX Odieresis Adieresis -55\nKPX Odieresis Agrave -55\nKPX Odieresis Amacron -55\nKPX Odieresis Aogonek -55\nKPX Odieresis Aring -55\nKPX Odieresis Atilde -55\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -50\nKPX Odieresis X -40\nKPX Odieresis Y -50\nKPX Odieresis Yacute -50\nKPX Odieresis Ydieresis -50\nKPX Ograve A -55\nKPX Ograve Aacute -55\nKPX Ograve Abreve -55\nKPX Ograve Acircumflex -55\nKPX Ograve Adieresis -55\nKPX Ograve Agrave -55\nKPX Ograve Amacron -55\nKPX Ograve Aogonek -55\nKPX Ograve Aring -55\nKPX Ograve Atilde -55\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -50\nKPX Ograve X -40\nKPX Ograve Y -50\nKPX Ograve Yacute -50\nKPX Ograve Ydieresis -50\nKPX Ohungarumlaut A -55\nKPX Ohungarumlaut Aacute -55\nKPX Ohungarumlaut Abreve -55\nKPX Ohungarumlaut Acircumflex -55\nKPX Ohungarumlaut Adieresis -55\nKPX Ohungarumlaut Agrave -55\nKPX Ohungarumlaut Amacron -55\nKPX Ohungarumlaut Aogonek -55\nKPX Ohungarumlaut Aring -55\nKPX Ohungarumlaut Atilde -55\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -50\nKPX Ohungarumlaut X -40\nKPX Ohungarumlaut Y -50\nKPX Ohungarumlaut Yacute -50\nKPX Ohungarumlaut Ydieresis -50\nKPX Omacron A -55\nKPX Omacron Aacute -55\nKPX Omacron Abreve -55\nKPX Omacron Acircumflex -55\nKPX Omacron Adieresis -55\nKPX Omacron Agrave -55\nKPX Omacron Amacron -55\nKPX Omacron Aogonek -55\nKPX Omacron Aring -55\nKPX Omacron Atilde -55\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -50\nKPX Omacron X -40\nKPX Omacron Y -50\nKPX Omacron Yacute -50\nKPX Omacron Ydieresis -50\nKPX Oslash A -55\nKPX Oslash Aacute -55\nKPX Oslash Abreve -55\nKPX Oslash Acircumflex -55\nKPX Oslash Adieresis -55\nKPX Oslash Agrave -55\nKPX Oslash Amacron -55\nKPX Oslash Aogonek -55\nKPX Oslash Aring -55\nKPX Oslash Atilde -55\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -50\nKPX Oslash X -40\nKPX Oslash Y -50\nKPX Oslash Yacute -50\nKPX Oslash Ydieresis -50\nKPX Otilde A -55\nKPX Otilde Aacute -55\nKPX Otilde Abreve -55\nKPX Otilde Acircumflex -55\nKPX Otilde Adieresis -55\nKPX Otilde Agrave -55\nKPX Otilde Amacron -55\nKPX Otilde Aogonek -55\nKPX Otilde Aring -55\nKPX Otilde Atilde -55\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -50\nKPX Otilde X -40\nKPX Otilde Y -50\nKPX Otilde Yacute -50\nKPX Otilde Ydieresis -50\nKPX P A -90\nKPX P Aacute -90\nKPX P Abreve -90\nKPX P Acircumflex -90\nKPX P Adieresis -90\nKPX P Agrave -90\nKPX P Amacron -90\nKPX P Aogonek -90\nKPX P Aring -90\nKPX P Atilde -90\nKPX P a -80\nKPX P aacute -80\nKPX P abreve -80\nKPX P acircumflex -80\nKPX P adieresis -80\nKPX P agrave -80\nKPX P amacron -80\nKPX P aogonek -80\nKPX P aring -80\nKPX P atilde -80\nKPX P comma -135\nKPX P e -80\nKPX P eacute -80\nKPX P ecaron -80\nKPX P ecircumflex -80\nKPX P edieresis -80\nKPX P edotaccent -80\nKPX P egrave -80\nKPX P emacron -80\nKPX P eogonek -80\nKPX P o -80\nKPX P oacute -80\nKPX P ocircumflex -80\nKPX P odieresis -80\nKPX P ograve -80\nKPX P ohungarumlaut -80\nKPX P omacron -80\nKPX P oslash -80\nKPX P otilde -80\nKPX P period -135\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX R O -40\nKPX R Oacute -40\nKPX R Ocircumflex -40\nKPX R Odieresis -40\nKPX R Ograve -40\nKPX R Ohungarumlaut -40\nKPX R Omacron -40\nKPX R Oslash -40\nKPX R Otilde -40\nKPX R U -40\nKPX R Uacute -40\nKPX R Ucircumflex -40\nKPX R Udieresis -40\nKPX R Ugrave -40\nKPX R Uhungarumlaut -40\nKPX R Umacron -40\nKPX R Uogonek -40\nKPX R Uring -40\nKPX R V -18\nKPX R W -18\nKPX R Y -18\nKPX R Yacute -18\nKPX R Ydieresis -18\nKPX Racute O -40\nKPX Racute Oacute -40\nKPX Racute Ocircumflex -40\nKPX Racute Odieresis -40\nKPX Racute Ograve -40\nKPX Racute Ohungarumlaut -40\nKPX Racute Omacron -40\nKPX Racute Oslash -40\nKPX Racute Otilde -40\nKPX Racute U -40\nKPX Racute Uacute -40\nKPX Racute Ucircumflex -40\nKPX Racute Udieresis -40\nKPX Racute Ugrave -40\nKPX Racute Uhungarumlaut -40\nKPX Racute Umacron -40\nKPX Racute Uogonek -40\nKPX Racute Uring -40\nKPX Racute V -18\nKPX Racute W -18\nKPX Racute Y -18\nKPX Racute Yacute -18\nKPX Racute Ydieresis -18\nKPX Rcaron O -40\nKPX Rcaron Oacute -40\nKPX Rcaron Ocircumflex -40\nKPX Rcaron Odieresis -40\nKPX Rcaron Ograve -40\nKPX Rcaron Ohungarumlaut -40\nKPX Rcaron Omacron -40\nKPX Rcaron Oslash -40\nKPX Rcaron Otilde -40\nKPX Rcaron U -40\nKPX Rcaron Uacute -40\nKPX Rcaron Ucircumflex -40\nKPX Rcaron Udieresis -40\nKPX Rcaron Ugrave -40\nKPX Rcaron Uhungarumlaut -40\nKPX Rcaron Umacron -40\nKPX Rcaron Uogonek -40\nKPX Rcaron Uring -40\nKPX Rcaron V -18\nKPX Rcaron W -18\nKPX Rcaron Y -18\nKPX Rcaron Yacute -18\nKPX Rcaron Ydieresis -18\nKPX Rcommaaccent O -40\nKPX Rcommaaccent Oacute -40\nKPX Rcommaaccent Ocircumflex -40\nKPX Rcommaaccent Odieresis -40\nKPX Rcommaaccent Ograve -40\nKPX Rcommaaccent Ohungarumlaut -40\nKPX Rcommaaccent Omacron -40\nKPX Rcommaaccent Oslash -40\nKPX Rcommaaccent Otilde -40\nKPX Rcommaaccent U -40\nKPX Rcommaaccent Uacute -40\nKPX Rcommaaccent Ucircumflex -40\nKPX Rcommaaccent Udieresis -40\nKPX Rcommaaccent Ugrave -40\nKPX Rcommaaccent Uhungarumlaut -40\nKPX Rcommaaccent Umacron -40\nKPX Rcommaaccent Uogonek -40\nKPX Rcommaaccent Uring -40\nKPX Rcommaaccent V -18\nKPX Rcommaaccent W -18\nKPX Rcommaaccent Y -18\nKPX Rcommaaccent Yacute -18\nKPX Rcommaaccent Ydieresis -18\nKPX T A -50\nKPX T Aacute -50\nKPX T Abreve -50\nKPX T Acircumflex -50\nKPX T Adieresis -50\nKPX T Agrave -50\nKPX T Amacron -50\nKPX T Aogonek -50\nKPX T Aring -50\nKPX T Atilde -50\nKPX T O -18\nKPX T Oacute -18\nKPX T Ocircumflex -18\nKPX T Odieresis -18\nKPX T Ograve -18\nKPX T Ohungarumlaut -18\nKPX T Omacron -18\nKPX T Oslash -18\nKPX T Otilde -18\nKPX T a -92\nKPX T aacute -92\nKPX T abreve -92\nKPX T acircumflex -92\nKPX T adieresis -92\nKPX T agrave -92\nKPX T amacron -92\nKPX T aogonek -92\nKPX T aring -92\nKPX T atilde -92\nKPX T colon -55\nKPX T comma -74\nKPX T e -92\nKPX T eacute -92\nKPX T ecaron -92\nKPX T ecircumflex -52\nKPX T edieresis -52\nKPX T edotaccent -92\nKPX T egrave -52\nKPX T emacron -52\nKPX T eogonek -92\nKPX T hyphen -74\nKPX T i -55\nKPX T iacute -55\nKPX T iogonek -55\nKPX T o -92\nKPX T oacute -92\nKPX T ocircumflex -92\nKPX T odieresis -92\nKPX T ograve -92\nKPX T ohungarumlaut -92\nKPX T omacron -92\nKPX T oslash -92\nKPX T otilde -92\nKPX T period -74\nKPX T r -55\nKPX T racute -55\nKPX T rcaron -55\nKPX T rcommaaccent -55\nKPX T semicolon -65\nKPX T u -55\nKPX T uacute -55\nKPX T ucircumflex -55\nKPX T udieresis -55\nKPX T ugrave -55\nKPX T uhungarumlaut -55\nKPX T umacron -55\nKPX T uogonek -55\nKPX T uring -55\nKPX T w -74\nKPX T y -74\nKPX T yacute -74\nKPX T ydieresis -34\nKPX Tcaron A -50\nKPX Tcaron Aacute -50\nKPX Tcaron Abreve -50\nKPX Tcaron Acircumflex -50\nKPX Tcaron Adieresis -50\nKPX Tcaron Agrave -50\nKPX Tcaron Amacron -50\nKPX Tcaron Aogonek -50\nKPX Tcaron Aring -50\nKPX Tcaron Atilde -50\nKPX Tcaron O -18\nKPX Tcaron Oacute -18\nKPX Tcaron Ocircumflex -18\nKPX Tcaron Odieresis -18\nKPX Tcaron Ograve -18\nKPX Tcaron Ohungarumlaut -18\nKPX Tcaron Omacron -18\nKPX Tcaron Oslash -18\nKPX Tcaron Otilde -18\nKPX Tcaron a -92\nKPX Tcaron aacute -92\nKPX Tcaron abreve -92\nKPX Tcaron acircumflex -92\nKPX Tcaron adieresis -92\nKPX Tcaron agrave -92\nKPX Tcaron amacron -92\nKPX Tcaron aogonek -92\nKPX Tcaron aring -92\nKPX Tcaron atilde -92\nKPX Tcaron colon -55\nKPX Tcaron comma -74\nKPX Tcaron e -92\nKPX Tcaron eacute -92\nKPX Tcaron ecaron -92\nKPX Tcaron ecircumflex -52\nKPX Tcaron edieresis -52\nKPX Tcaron edotaccent -92\nKPX Tcaron egrave -52\nKPX Tcaron emacron -52\nKPX Tcaron eogonek -92\nKPX Tcaron hyphen -74\nKPX Tcaron i -55\nKPX Tcaron iacute -55\nKPX Tcaron iogonek -55\nKPX Tcaron o -92\nKPX Tcaron oacute -92\nKPX Tcaron ocircumflex -92\nKPX Tcaron odieresis -92\nKPX Tcaron ograve -92\nKPX Tcaron ohungarumlaut -92\nKPX Tcaron omacron -92\nKPX Tcaron oslash -92\nKPX Tcaron otilde -92\nKPX Tcaron period -74\nKPX Tcaron r -55\nKPX Tcaron racute -55\nKPX Tcaron rcaron -55\nKPX Tcaron rcommaaccent -55\nKPX Tcaron semicolon -65\nKPX Tcaron u -55\nKPX Tcaron uacute -55\nKPX Tcaron ucircumflex -55\nKPX Tcaron udieresis -55\nKPX Tcaron ugrave -55\nKPX Tcaron uhungarumlaut -55\nKPX Tcaron umacron -55\nKPX Tcaron uogonek -55\nKPX Tcaron uring -55\nKPX Tcaron w -74\nKPX Tcaron y -74\nKPX Tcaron yacute -74\nKPX Tcaron ydieresis -34\nKPX Tcommaaccent A -50\nKPX Tcommaaccent Aacute -50\nKPX Tcommaaccent Abreve -50\nKPX Tcommaaccent Acircumflex -50\nKPX Tcommaaccent Adieresis -50\nKPX Tcommaaccent Agrave -50\nKPX Tcommaaccent Amacron -50\nKPX Tcommaaccent Aogonek -50\nKPX Tcommaaccent Aring -50\nKPX Tcommaaccent Atilde -50\nKPX Tcommaaccent O -18\nKPX Tcommaaccent Oacute -18\nKPX Tcommaaccent Ocircumflex -18\nKPX Tcommaaccent Odieresis -18\nKPX Tcommaaccent Ograve -18\nKPX Tcommaaccent Ohungarumlaut -18\nKPX Tcommaaccent Omacron -18\nKPX Tcommaaccent Oslash -18\nKPX Tcommaaccent Otilde -18\nKPX Tcommaaccent a -92\nKPX Tcommaaccent aacute -92\nKPX Tcommaaccent abreve -92\nKPX Tcommaaccent acircumflex -92\nKPX Tcommaaccent adieresis -92\nKPX Tcommaaccent agrave -92\nKPX Tcommaaccent amacron -92\nKPX Tcommaaccent aogonek -92\nKPX Tcommaaccent aring -92\nKPX Tcommaaccent atilde -92\nKPX Tcommaaccent colon -55\nKPX Tcommaaccent comma -74\nKPX Tcommaaccent e -92\nKPX Tcommaaccent eacute -92\nKPX Tcommaaccent ecaron -92\nKPX Tcommaaccent ecircumflex -52\nKPX Tcommaaccent edieresis -52\nKPX Tcommaaccent edotaccent -92\nKPX Tcommaaccent egrave -52\nKPX Tcommaaccent emacron -52\nKPX Tcommaaccent eogonek -92\nKPX Tcommaaccent hyphen -74\nKPX Tcommaaccent i -55\nKPX Tcommaaccent iacute -55\nKPX Tcommaaccent iogonek -55\nKPX Tcommaaccent o -92\nKPX Tcommaaccent oacute -92\nKPX Tcommaaccent ocircumflex -92\nKPX Tcommaaccent odieresis -92\nKPX Tcommaaccent ograve -92\nKPX Tcommaaccent ohungarumlaut -92\nKPX Tcommaaccent omacron -92\nKPX Tcommaaccent oslash -92\nKPX Tcommaaccent otilde -92\nKPX Tcommaaccent period -74\nKPX Tcommaaccent r -55\nKPX Tcommaaccent racute -55\nKPX Tcommaaccent rcaron -55\nKPX Tcommaaccent rcommaaccent -55\nKPX Tcommaaccent semicolon -65\nKPX Tcommaaccent u -55\nKPX Tcommaaccent uacute -55\nKPX Tcommaaccent ucircumflex -55\nKPX Tcommaaccent udieresis -55\nKPX Tcommaaccent ugrave -55\nKPX Tcommaaccent uhungarumlaut -55\nKPX Tcommaaccent umacron -55\nKPX Tcommaaccent uogonek -55\nKPX Tcommaaccent uring -55\nKPX Tcommaaccent w -74\nKPX Tcommaaccent y -74\nKPX Tcommaaccent yacute -74\nKPX Tcommaaccent ydieresis -34\nKPX U A -40\nKPX U Aacute -40\nKPX U Abreve -40\nKPX U Acircumflex -40\nKPX U Adieresis -40\nKPX U Agrave -40\nKPX U Amacron -40\nKPX U Aogonek -40\nKPX U Aring -40\nKPX U Atilde -40\nKPX U comma -25\nKPX U period -25\nKPX Uacute A -40\nKPX Uacute Aacute -40\nKPX Uacute Abreve -40\nKPX Uacute Acircumflex -40\nKPX Uacute Adieresis -40\nKPX Uacute Agrave -40\nKPX Uacute Amacron -40\nKPX Uacute Aogonek -40\nKPX Uacute Aring -40\nKPX Uacute Atilde -40\nKPX Uacute comma -25\nKPX Uacute period -25\nKPX Ucircumflex A -40\nKPX Ucircumflex Aacute -40\nKPX Ucircumflex Abreve -40\nKPX Ucircumflex Acircumflex -40\nKPX Ucircumflex Adieresis -40\nKPX Ucircumflex Agrave -40\nKPX Ucircumflex Amacron -40\nKPX Ucircumflex Aogonek -40\nKPX Ucircumflex Aring -40\nKPX Ucircumflex Atilde -40\nKPX Ucircumflex comma -25\nKPX Ucircumflex period -25\nKPX Udieresis A -40\nKPX Udieresis Aacute -40\nKPX Udieresis Abreve -40\nKPX Udieresis Acircumflex -40\nKPX Udieresis Adieresis -40\nKPX Udieresis Agrave -40\nKPX Udieresis Amacron -40\nKPX Udieresis Aogonek -40\nKPX Udieresis Aring -40\nKPX Udieresis Atilde -40\nKPX Udieresis comma -25\nKPX Udieresis period -25\nKPX Ugrave A -40\nKPX Ugrave Aacute -40\nKPX Ugrave Abreve -40\nKPX Ugrave Acircumflex -40\nKPX Ugrave Adieresis -40\nKPX Ugrave Agrave -40\nKPX Ugrave Amacron -40\nKPX Ugrave Aogonek -40\nKPX Ugrave Aring -40\nKPX Ugrave Atilde -40\nKPX Ugrave comma -25\nKPX Ugrave period -25\nKPX Uhungarumlaut A -40\nKPX Uhungarumlaut Aacute -40\nKPX Uhungarumlaut Abreve -40\nKPX Uhungarumlaut Acircumflex -40\nKPX Uhungarumlaut Adieresis -40\nKPX Uhungarumlaut Agrave -40\nKPX Uhungarumlaut Amacron -40\nKPX Uhungarumlaut Aogonek -40\nKPX Uhungarumlaut Aring -40\nKPX Uhungarumlaut Atilde -40\nKPX Uhungarumlaut comma -25\nKPX Uhungarumlaut period -25\nKPX Umacron A -40\nKPX Umacron Aacute -40\nKPX Umacron Abreve -40\nKPX Umacron Acircumflex -40\nKPX Umacron Adieresis -40\nKPX Umacron Agrave -40\nKPX Umacron Amacron -40\nKPX Umacron Aogonek -40\nKPX Umacron Aring -40\nKPX Umacron Atilde -40\nKPX Umacron comma -25\nKPX Umacron period -25\nKPX Uogonek A -40\nKPX Uogonek Aacute -40\nKPX Uogonek Abreve -40\nKPX Uogonek Acircumflex -40\nKPX Uogonek Adieresis -40\nKPX Uogonek Agrave -40\nKPX Uogonek Amacron -40\nKPX Uogonek Aogonek -40\nKPX Uogonek Aring -40\nKPX Uogonek Atilde -40\nKPX Uogonek comma -25\nKPX Uogonek period -25\nKPX Uring A -40\nKPX Uring Aacute -40\nKPX Uring Abreve -40\nKPX Uring Acircumflex -40\nKPX Uring Adieresis -40\nKPX Uring Agrave -40\nKPX Uring Amacron -40\nKPX Uring Aogonek -40\nKPX Uring Aring -40\nKPX Uring Atilde -40\nKPX Uring comma -25\nKPX Uring period -25\nKPX V A -60\nKPX V Aacute -60\nKPX V Abreve -60\nKPX V Acircumflex -60\nKPX V Adieresis -60\nKPX V Agrave -60\nKPX V Amacron -60\nKPX V Aogonek -60\nKPX V Aring -60\nKPX V Atilde -60\nKPX V O -30\nKPX V Oacute -30\nKPX V Ocircumflex -30\nKPX V Odieresis -30\nKPX V Ograve -30\nKPX V Ohungarumlaut -30\nKPX V Omacron -30\nKPX V Oslash -30\nKPX V Otilde -30\nKPX V a -111\nKPX V aacute -111\nKPX V abreve -111\nKPX V acircumflex -111\nKPX V adieresis -111\nKPX V agrave -111\nKPX V amacron -111\nKPX V aogonek -111\nKPX V aring -111\nKPX V atilde -111\nKPX V colon -65\nKPX V comma -129\nKPX V e -111\nKPX V eacute -111\nKPX V ecaron -111\nKPX V ecircumflex -111\nKPX V edieresis -71\nKPX V edotaccent -111\nKPX V egrave -71\nKPX V emacron -71\nKPX V eogonek -111\nKPX V hyphen -55\nKPX V i -74\nKPX V iacute -74\nKPX V icircumflex -34\nKPX V idieresis -34\nKPX V igrave -34\nKPX V imacron -34\nKPX V iogonek -74\nKPX V o -111\nKPX V oacute -111\nKPX V ocircumflex -111\nKPX V odieresis -111\nKPX V ograve -111\nKPX V ohungarumlaut -111\nKPX V omacron -111\nKPX V oslash -111\nKPX V otilde -111\nKPX V period -129\nKPX V semicolon -74\nKPX V u -74\nKPX V uacute -74\nKPX V ucircumflex -74\nKPX V udieresis -74\nKPX V ugrave -74\nKPX V uhungarumlaut -74\nKPX V umacron -74\nKPX V uogonek -74\nKPX V uring -74\nKPX W A -60\nKPX W Aacute -60\nKPX W Abreve -60\nKPX W Acircumflex -60\nKPX W Adieresis -60\nKPX W Agrave -60\nKPX W Amacron -60\nKPX W Aogonek -60\nKPX W Aring -60\nKPX W Atilde -60\nKPX W O -25\nKPX W Oacute -25\nKPX W Ocircumflex -25\nKPX W Odieresis -25\nKPX W Ograve -25\nKPX W Ohungarumlaut -25\nKPX W Omacron -25\nKPX W Oslash -25\nKPX W Otilde -25\nKPX W a -92\nKPX W aacute -92\nKPX W abreve -92\nKPX W acircumflex -92\nKPX W adieresis -92\nKPX W agrave -92\nKPX W amacron -92\nKPX W aogonek -92\nKPX W aring -92\nKPX W atilde -92\nKPX W colon -65\nKPX W comma -92\nKPX W e -92\nKPX W eacute -92\nKPX W ecaron -92\nKPX W ecircumflex -92\nKPX W edieresis -52\nKPX W edotaccent -92\nKPX W egrave -52\nKPX W emacron -52\nKPX W eogonek -92\nKPX W hyphen -37\nKPX W i -55\nKPX W iacute -55\nKPX W iogonek -55\nKPX W o -92\nKPX W oacute -92\nKPX W ocircumflex -92\nKPX W odieresis -92\nKPX W ograve -92\nKPX W ohungarumlaut -92\nKPX W omacron -92\nKPX W oslash -92\nKPX W otilde -92\nKPX W period -92\nKPX W semicolon -65\nKPX W u -55\nKPX W uacute -55\nKPX W ucircumflex -55\nKPX W udieresis -55\nKPX W ugrave -55\nKPX W uhungarumlaut -55\nKPX W umacron -55\nKPX W uogonek -55\nKPX W uring -55\nKPX W y -70\nKPX W yacute -70\nKPX W ydieresis -70\nKPX Y A -50\nKPX Y Aacute -50\nKPX Y Abreve -50\nKPX Y Acircumflex -50\nKPX Y Adieresis -50\nKPX Y Agrave -50\nKPX Y Amacron -50\nKPX Y Aogonek -50\nKPX Y Aring -50\nKPX Y Atilde -50\nKPX Y O -15\nKPX Y Oacute -15\nKPX Y Ocircumflex -15\nKPX Y Odieresis -15\nKPX Y Ograve -15\nKPX Y Ohungarumlaut -15\nKPX Y Omacron -15\nKPX Y Oslash -15\nKPX Y Otilde -15\nKPX Y a -92\nKPX Y aacute -92\nKPX Y abreve -92\nKPX Y acircumflex -92\nKPX Y adieresis -92\nKPX Y agrave -92\nKPX Y amacron -92\nKPX Y aogonek -92\nKPX Y aring -92\nKPX Y atilde -92\nKPX Y colon -65\nKPX Y comma -92\nKPX Y e -92\nKPX Y eacute -92\nKPX Y ecaron -92\nKPX Y ecircumflex -92\nKPX Y edieresis -52\nKPX Y edotaccent -92\nKPX Y egrave -52\nKPX Y emacron -52\nKPX Y eogonek -92\nKPX Y hyphen -74\nKPX Y i -74\nKPX Y iacute -74\nKPX Y icircumflex -34\nKPX Y idieresis -34\nKPX Y igrave -34\nKPX Y imacron -34\nKPX Y iogonek -74\nKPX Y o -92\nKPX Y oacute -92\nKPX Y ocircumflex -92\nKPX Y odieresis -92\nKPX Y ograve -92\nKPX Y ohungarumlaut -92\nKPX Y omacron -92\nKPX Y oslash -92\nKPX Y otilde -92\nKPX Y period -92\nKPX Y semicolon -65\nKPX Y u -92\nKPX Y uacute -92\nKPX Y ucircumflex -92\nKPX Y udieresis -92\nKPX Y ugrave -92\nKPX Y uhungarumlaut -92\nKPX Y umacron -92\nKPX Y uogonek -92\nKPX Y uring -92\nKPX Yacute A -50\nKPX Yacute Aacute -50\nKPX Yacute Abreve -50\nKPX Yacute Acircumflex -50\nKPX Yacute Adieresis -50\nKPX Yacute Agrave -50\nKPX Yacute Amacron -50\nKPX Yacute Aogonek -50\nKPX Yacute Aring -50\nKPX Yacute Atilde -50\nKPX Yacute O -15\nKPX Yacute Oacute -15\nKPX Yacute Ocircumflex -15\nKPX Yacute Odieresis -15\nKPX Yacute Ograve -15\nKPX Yacute Ohungarumlaut -15\nKPX Yacute Omacron -15\nKPX Yacute Oslash -15\nKPX Yacute Otilde -15\nKPX Yacute a -92\nKPX Yacute aacute -92\nKPX Yacute abreve -92\nKPX Yacute acircumflex -92\nKPX Yacute adieresis -92\nKPX Yacute agrave -92\nKPX Yacute amacron -92\nKPX Yacute aogonek -92\nKPX Yacute aring -92\nKPX Yacute atilde -92\nKPX Yacute colon -65\nKPX Yacute comma -92\nKPX Yacute e -92\nKPX Yacute eacute -92\nKPX Yacute ecaron -92\nKPX Yacute ecircumflex -92\nKPX Yacute edieresis -52\nKPX Yacute edotaccent -92\nKPX Yacute egrave -52\nKPX Yacute emacron -52\nKPX Yacute eogonek -92\nKPX Yacute hyphen -74\nKPX Yacute i -74\nKPX Yacute iacute -74\nKPX Yacute icircumflex -34\nKPX Yacute idieresis -34\nKPX Yacute igrave -34\nKPX Yacute imacron -34\nKPX Yacute iogonek -74\nKPX Yacute o -92\nKPX Yacute oacute -92\nKPX Yacute ocircumflex -92\nKPX Yacute odieresis -92\nKPX Yacute ograve -92\nKPX Yacute ohungarumlaut -92\nKPX Yacute omacron -92\nKPX Yacute oslash -92\nKPX Yacute otilde -92\nKPX Yacute period -92\nKPX Yacute semicolon -65\nKPX Yacute u -92\nKPX Yacute uacute -92\nKPX Yacute ucircumflex -92\nKPX Yacute udieresis -92\nKPX Yacute ugrave -92\nKPX Yacute uhungarumlaut -92\nKPX Yacute umacron -92\nKPX Yacute uogonek -92\nKPX Yacute uring -92\nKPX Ydieresis A -50\nKPX Ydieresis Aacute -50\nKPX Ydieresis Abreve -50\nKPX Ydieresis Acircumflex -50\nKPX Ydieresis Adieresis -50\nKPX Ydieresis Agrave -50\nKPX Ydieresis Amacron -50\nKPX Ydieresis Aogonek -50\nKPX Ydieresis Aring -50\nKPX Ydieresis Atilde -50\nKPX Ydieresis O -15\nKPX Ydieresis Oacute -15\nKPX Ydieresis Ocircumflex -15\nKPX Ydieresis Odieresis -15\nKPX Ydieresis Ograve -15\nKPX Ydieresis Ohungarumlaut -15\nKPX Ydieresis Omacron -15\nKPX Ydieresis Oslash -15\nKPX Ydieresis Otilde -15\nKPX Ydieresis a -92\nKPX Ydieresis aacute -92\nKPX Ydieresis abreve -92\nKPX Ydieresis acircumflex -92\nKPX Ydieresis adieresis -92\nKPX Ydieresis agrave -92\nKPX Ydieresis amacron -92\nKPX Ydieresis aogonek -92\nKPX Ydieresis aring -92\nKPX Ydieresis atilde -92\nKPX Ydieresis colon -65\nKPX Ydieresis comma -92\nKPX Ydieresis e -92\nKPX Ydieresis eacute -92\nKPX Ydieresis ecaron -92\nKPX Ydieresis ecircumflex -92\nKPX Ydieresis edieresis -52\nKPX Ydieresis edotaccent -92\nKPX Ydieresis egrave -52\nKPX Ydieresis emacron -52\nKPX Ydieresis eogonek -92\nKPX Ydieresis hyphen -74\nKPX Ydieresis i -74\nKPX Ydieresis iacute -74\nKPX Ydieresis icircumflex -34\nKPX Ydieresis idieresis -34\nKPX Ydieresis igrave -34\nKPX Ydieresis imacron -34\nKPX Ydieresis iogonek -74\nKPX Ydieresis o -92\nKPX Ydieresis oacute -92\nKPX Ydieresis ocircumflex -92\nKPX Ydieresis odieresis -92\nKPX Ydieresis ograve -92\nKPX Ydieresis ohungarumlaut -92\nKPX Ydieresis omacron -92\nKPX Ydieresis oslash -92\nKPX Ydieresis otilde -92\nKPX Ydieresis period -92\nKPX Ydieresis semicolon -65\nKPX Ydieresis u -92\nKPX Ydieresis uacute -92\nKPX Ydieresis ucircumflex -92\nKPX Ydieresis udieresis -92\nKPX Ydieresis ugrave -92\nKPX Ydieresis uhungarumlaut -92\nKPX Ydieresis umacron -92\nKPX Ydieresis uogonek -92\nKPX Ydieresis uring -92\nKPX a g -10\nKPX a gbreve -10\nKPX a gcommaaccent -10\nKPX aacute g -10\nKPX aacute gbreve -10\nKPX aacute gcommaaccent -10\nKPX abreve g -10\nKPX abreve gbreve -10\nKPX abreve gcommaaccent -10\nKPX acircumflex g -10\nKPX acircumflex gbreve -10\nKPX acircumflex gcommaaccent -10\nKPX adieresis g -10\nKPX adieresis gbreve -10\nKPX adieresis gcommaaccent -10\nKPX agrave g -10\nKPX agrave gbreve -10\nKPX agrave gcommaaccent -10\nKPX amacron g -10\nKPX amacron gbreve -10\nKPX amacron gcommaaccent -10\nKPX aogonek g -10\nKPX aogonek gbreve -10\nKPX aogonek gcommaaccent -10\nKPX aring g -10\nKPX aring gbreve -10\nKPX aring gcommaaccent -10\nKPX atilde g -10\nKPX atilde gbreve -10\nKPX atilde gcommaaccent -10\nKPX b period -40\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX c h -15\nKPX c k -20\nKPX c kcommaaccent -20\nKPX cacute h -15\nKPX cacute k -20\nKPX cacute kcommaaccent -20\nKPX ccaron h -15\nKPX ccaron k -20\nKPX ccaron kcommaaccent -20\nKPX ccedilla h -15\nKPX ccedilla k -20\nKPX ccedilla kcommaaccent -20\nKPX comma quotedblright -140\nKPX comma quoteright -140\nKPX e comma -10\nKPX e g -40\nKPX e gbreve -40\nKPX e gcommaaccent -40\nKPX e period -15\nKPX e v -15\nKPX e w -15\nKPX e x -20\nKPX e y -30\nKPX e yacute -30\nKPX e ydieresis -30\nKPX eacute comma -10\nKPX eacute g -40\nKPX eacute gbreve -40\nKPX eacute gcommaaccent -40\nKPX eacute period -15\nKPX eacute v -15\nKPX eacute w -15\nKPX eacute x -20\nKPX eacute y -30\nKPX eacute yacute -30\nKPX eacute ydieresis -30\nKPX ecaron comma -10\nKPX ecaron g -40\nKPX ecaron gbreve -40\nKPX ecaron gcommaaccent -40\nKPX ecaron period -15\nKPX ecaron v -15\nKPX ecaron w -15\nKPX ecaron x -20\nKPX ecaron y -30\nKPX ecaron yacute -30\nKPX ecaron ydieresis -30\nKPX ecircumflex comma -10\nKPX ecircumflex g -40\nKPX ecircumflex gbreve -40\nKPX ecircumflex gcommaaccent -40\nKPX ecircumflex period -15\nKPX ecircumflex v -15\nKPX ecircumflex w -15\nKPX ecircumflex x -20\nKPX ecircumflex y -30\nKPX ecircumflex yacute -30\nKPX ecircumflex ydieresis -30\nKPX edieresis comma -10\nKPX edieresis g -40\nKPX edieresis gbreve -40\nKPX edieresis gcommaaccent -40\nKPX edieresis period -15\nKPX edieresis v -15\nKPX edieresis w -15\nKPX edieresis x -20\nKPX edieresis y -30\nKPX edieresis yacute -30\nKPX edieresis ydieresis -30\nKPX edotaccent comma -10\nKPX edotaccent g -40\nKPX edotaccent gbreve -40\nKPX edotaccent gcommaaccent -40\nKPX edotaccent period -15\nKPX edotaccent v -15\nKPX edotaccent w -15\nKPX edotaccent x -20\nKPX edotaccent y -30\nKPX edotaccent yacute -30\nKPX edotaccent ydieresis -30\nKPX egrave comma -10\nKPX egrave g -40\nKPX egrave gbreve -40\nKPX egrave gcommaaccent -40\nKPX egrave period -15\nKPX egrave v -15\nKPX egrave w -15\nKPX egrave x -20\nKPX egrave y -30\nKPX egrave yacute -30\nKPX egrave ydieresis -30\nKPX emacron comma -10\nKPX emacron g -40\nKPX emacron gbreve -40\nKPX emacron gcommaaccent -40\nKPX emacron period -15\nKPX emacron v -15\nKPX emacron w -15\nKPX emacron x -20\nKPX emacron y -30\nKPX emacron yacute -30\nKPX emacron ydieresis -30\nKPX eogonek comma -10\nKPX eogonek g -40\nKPX eogonek gbreve -40\nKPX eogonek gcommaaccent -40\nKPX eogonek period -15\nKPX eogonek v -15\nKPX eogonek w -15\nKPX eogonek x -20\nKPX eogonek y -30\nKPX eogonek yacute -30\nKPX eogonek ydieresis -30\nKPX f comma -10\nKPX f dotlessi -60\nKPX f f -18\nKPX f i -20\nKPX f iogonek -20\nKPX f period -15\nKPX f quoteright 92\nKPX g comma -10\nKPX g e -10\nKPX g eacute -10\nKPX g ecaron -10\nKPX g ecircumflex -10\nKPX g edieresis -10\nKPX g edotaccent -10\nKPX g egrave -10\nKPX g emacron -10\nKPX g eogonek -10\nKPX g g -10\nKPX g gbreve -10\nKPX g gcommaaccent -10\nKPX g period -15\nKPX gbreve comma -10\nKPX gbreve e -10\nKPX gbreve eacute -10\nKPX gbreve ecaron -10\nKPX gbreve ecircumflex -10\nKPX gbreve edieresis -10\nKPX gbreve edotaccent -10\nKPX gbreve egrave -10\nKPX gbreve emacron -10\nKPX gbreve eogonek -10\nKPX gbreve g -10\nKPX gbreve gbreve -10\nKPX gbreve gcommaaccent -10\nKPX gbreve period -15\nKPX gcommaaccent comma -10\nKPX gcommaaccent e -10\nKPX gcommaaccent eacute -10\nKPX gcommaaccent ecaron -10\nKPX gcommaaccent ecircumflex -10\nKPX gcommaaccent edieresis -10\nKPX gcommaaccent edotaccent -10\nKPX gcommaaccent egrave -10\nKPX gcommaaccent emacron -10\nKPX gcommaaccent eogonek -10\nKPX gcommaaccent g -10\nKPX gcommaaccent gbreve -10\nKPX gcommaaccent gcommaaccent -10\nKPX gcommaaccent period -15\nKPX k e -10\nKPX k eacute -10\nKPX k ecaron -10\nKPX k ecircumflex -10\nKPX k edieresis -10\nKPX k edotaccent -10\nKPX k egrave -10\nKPX k emacron -10\nKPX k eogonek -10\nKPX k o -10\nKPX k oacute -10\nKPX k ocircumflex -10\nKPX k odieresis -10\nKPX k ograve -10\nKPX k ohungarumlaut -10\nKPX k omacron -10\nKPX k oslash -10\nKPX k otilde -10\nKPX k y -10\nKPX k yacute -10\nKPX k ydieresis -10\nKPX kcommaaccent e -10\nKPX kcommaaccent eacute -10\nKPX kcommaaccent ecaron -10\nKPX kcommaaccent ecircumflex -10\nKPX kcommaaccent edieresis -10\nKPX kcommaaccent edotaccent -10\nKPX kcommaaccent egrave -10\nKPX kcommaaccent emacron -10\nKPX kcommaaccent eogonek -10\nKPX kcommaaccent o -10\nKPX kcommaaccent oacute -10\nKPX kcommaaccent ocircumflex -10\nKPX kcommaaccent odieresis -10\nKPX kcommaaccent ograve -10\nKPX kcommaaccent ohungarumlaut -10\nKPX kcommaaccent omacron -10\nKPX kcommaaccent oslash -10\nKPX kcommaaccent otilde -10\nKPX kcommaaccent y -10\nKPX kcommaaccent yacute -10\nKPX kcommaaccent ydieresis -10\nKPX n v -40\nKPX nacute v -40\nKPX ncaron v -40\nKPX ncommaaccent v -40\nKPX ntilde v -40\nKPX o g -10\nKPX o gbreve -10\nKPX o gcommaaccent -10\nKPX o v -10\nKPX oacute g -10\nKPX oacute gbreve -10\nKPX oacute gcommaaccent -10\nKPX oacute v -10\nKPX ocircumflex g -10\nKPX ocircumflex gbreve -10\nKPX ocircumflex gcommaaccent -10\nKPX ocircumflex v -10\nKPX odieresis g -10\nKPX odieresis gbreve -10\nKPX odieresis gcommaaccent -10\nKPX odieresis v -10\nKPX ograve g -10\nKPX ograve gbreve -10\nKPX ograve gcommaaccent -10\nKPX ograve v -10\nKPX ohungarumlaut g -10\nKPX ohungarumlaut gbreve -10\nKPX ohungarumlaut gcommaaccent -10\nKPX ohungarumlaut v -10\nKPX omacron g -10\nKPX omacron gbreve -10\nKPX omacron gcommaaccent -10\nKPX omacron v -10\nKPX oslash g -10\nKPX oslash gbreve -10\nKPX oslash gcommaaccent -10\nKPX oslash v -10\nKPX otilde g -10\nKPX otilde gbreve -10\nKPX otilde gcommaaccent -10\nKPX otilde v -10\nKPX period quotedblright -140\nKPX period quoteright -140\nKPX quoteleft quoteleft -111\nKPX quoteright d -25\nKPX quoteright dcroat -25\nKPX quoteright quoteright -111\nKPX quoteright r -25\nKPX quoteright racute -25\nKPX quoteright rcaron -25\nKPX quoteright rcommaaccent -25\nKPX quoteright s -40\nKPX quoteright sacute -40\nKPX quoteright scaron -40\nKPX quoteright scedilla -40\nKPX quoteright scommaaccent -40\nKPX quoteright space -111\nKPX quoteright t -30\nKPX quoteright tcommaaccent -30\nKPX quoteright v -10\nKPX r a -15\nKPX r aacute -15\nKPX r abreve -15\nKPX r acircumflex -15\nKPX r adieresis -15\nKPX r agrave -15\nKPX r amacron -15\nKPX r aogonek -15\nKPX r aring -15\nKPX r atilde -15\nKPX r c -37\nKPX r cacute -37\nKPX r ccaron -37\nKPX r ccedilla -37\nKPX r comma -111\nKPX r d -37\nKPX r dcroat -37\nKPX r e -37\nKPX r eacute -37\nKPX r ecaron -37\nKPX r ecircumflex -37\nKPX r edieresis -37\nKPX r edotaccent -37\nKPX r egrave -37\nKPX r emacron -37\nKPX r eogonek -37\nKPX r g -37\nKPX r gbreve -37\nKPX r gcommaaccent -37\nKPX r hyphen -20\nKPX r o -45\nKPX r oacute -45\nKPX r ocircumflex -45\nKPX r odieresis -45\nKPX r ograve -45\nKPX r ohungarumlaut -45\nKPX r omacron -45\nKPX r oslash -45\nKPX r otilde -45\nKPX r period -111\nKPX r q -37\nKPX r s -10\nKPX r sacute -10\nKPX r scaron -10\nKPX r scedilla -10\nKPX r scommaaccent -10\nKPX racute a -15\nKPX racute aacute -15\nKPX racute abreve -15\nKPX racute acircumflex -15\nKPX racute adieresis -15\nKPX racute agrave -15\nKPX racute amacron -15\nKPX racute aogonek -15\nKPX racute aring -15\nKPX racute atilde -15\nKPX racute c -37\nKPX racute cacute -37\nKPX racute ccaron -37\nKPX racute ccedilla -37\nKPX racute comma -111\nKPX racute d -37\nKPX racute dcroat -37\nKPX racute e -37\nKPX racute eacute -37\nKPX racute ecaron -37\nKPX racute ecircumflex -37\nKPX racute edieresis -37\nKPX racute edotaccent -37\nKPX racute egrave -37\nKPX racute emacron -37\nKPX racute eogonek -37\nKPX racute g -37\nKPX racute gbreve -37\nKPX racute gcommaaccent -37\nKPX racute hyphen -20\nKPX racute o -45\nKPX racute oacute -45\nKPX racute ocircumflex -45\nKPX racute odieresis -45\nKPX racute ograve -45\nKPX racute ohungarumlaut -45\nKPX racute omacron -45\nKPX racute oslash -45\nKPX racute otilde -45\nKPX racute period -111\nKPX racute q -37\nKPX racute s -10\nKPX racute sacute -10\nKPX racute scaron -10\nKPX racute scedilla -10\nKPX racute scommaaccent -10\nKPX rcaron a -15\nKPX rcaron aacute -15\nKPX rcaron abreve -15\nKPX rcaron acircumflex -15\nKPX rcaron adieresis -15\nKPX rcaron agrave -15\nKPX rcaron amacron -15\nKPX rcaron aogonek -15\nKPX rcaron aring -15\nKPX rcaron atilde -15\nKPX rcaron c -37\nKPX rcaron cacute -37\nKPX rcaron ccaron -37\nKPX rcaron ccedilla -37\nKPX rcaron comma -111\nKPX rcaron d -37\nKPX rcaron dcroat -37\nKPX rcaron e -37\nKPX rcaron eacute -37\nKPX rcaron ecaron -37\nKPX rcaron ecircumflex -37\nKPX rcaron edieresis -37\nKPX rcaron edotaccent -37\nKPX rcaron egrave -37\nKPX rcaron emacron -37\nKPX rcaron eogonek -37\nKPX rcaron g -37\nKPX rcaron gbreve -37\nKPX rcaron gcommaaccent -37\nKPX rcaron hyphen -20\nKPX rcaron o -45\nKPX rcaron oacute -45\nKPX rcaron ocircumflex -45\nKPX rcaron odieresis -45\nKPX rcaron ograve -45\nKPX rcaron ohungarumlaut -45\nKPX rcaron omacron -45\nKPX rcaron oslash -45\nKPX rcaron otilde -45\nKPX rcaron period -111\nKPX rcaron q -37\nKPX rcaron s -10\nKPX rcaron sacute -10\nKPX rcaron scaron -10\nKPX rcaron scedilla -10\nKPX rcaron scommaaccent -10\nKPX rcommaaccent a -15\nKPX rcommaaccent aacute -15\nKPX rcommaaccent abreve -15\nKPX rcommaaccent acircumflex -15\nKPX rcommaaccent adieresis -15\nKPX rcommaaccent agrave -15\nKPX rcommaaccent amacron -15\nKPX rcommaaccent aogonek -15\nKPX rcommaaccent aring -15\nKPX rcommaaccent atilde -15\nKPX rcommaaccent c -37\nKPX rcommaaccent cacute -37\nKPX rcommaaccent ccaron -37\nKPX rcommaaccent ccedilla -37\nKPX rcommaaccent comma -111\nKPX rcommaaccent d -37\nKPX rcommaaccent dcroat -37\nKPX rcommaaccent e -37\nKPX rcommaaccent eacute -37\nKPX rcommaaccent ecaron -37\nKPX rcommaaccent ecircumflex -37\nKPX rcommaaccent edieresis -37\nKPX rcommaaccent edotaccent -37\nKPX rcommaaccent egrave -37\nKPX rcommaaccent emacron -37\nKPX rcommaaccent eogonek -37\nKPX rcommaaccent g -37\nKPX rcommaaccent gbreve -37\nKPX rcommaaccent gcommaaccent -37\nKPX rcommaaccent hyphen -20\nKPX rcommaaccent o -45\nKPX rcommaaccent oacute -45\nKPX rcommaaccent ocircumflex -45\nKPX rcommaaccent odieresis -45\nKPX rcommaaccent ograve -45\nKPX rcommaaccent ohungarumlaut -45\nKPX rcommaaccent omacron -45\nKPX rcommaaccent oslash -45\nKPX rcommaaccent otilde -45\nKPX rcommaaccent period -111\nKPX rcommaaccent q -37\nKPX rcommaaccent s -10\nKPX rcommaaccent sacute -10\nKPX rcommaaccent scaron -10\nKPX rcommaaccent scedilla -10\nKPX rcommaaccent scommaaccent -10\nKPX space A -18\nKPX space Aacute -18\nKPX space Abreve -18\nKPX space Acircumflex -18\nKPX space Adieresis -18\nKPX space Agrave -18\nKPX space Amacron -18\nKPX space Aogonek -18\nKPX space Aring -18\nKPX space Atilde -18\nKPX space T -18\nKPX space Tcaron -18\nKPX space Tcommaaccent -18\nKPX space V -35\nKPX space W -40\nKPX space Y -75\nKPX space Yacute -75\nKPX space Ydieresis -75\nKPX v comma -74\nKPX v period -74\nKPX w comma -74\nKPX w period -74\nKPX y comma -55\nKPX y period -55\nKPX yacute comma -55\nKPX yacute period -55\nKPX ydieresis comma -55\nKPX ydieresis period -55\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/Times-Roman.afm",
    "content": "StartFontMetrics 4.1\nComment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.\nComment Creation Date: Thu May  1 12:49:17 1997\nComment UniqueID 43068\nComment VMusage 43909 54934\nFontName Times-Roman\nFullName Times Roman\nFamilyName Times\nWeight Roman\nItalicAngle 0\nIsFixedPitch false\nCharacterSet ExtendedRoman\nFontBBox -168 -218 1000 898 \nUnderlinePosition -100\nUnderlineThickness 50\nVersion 002.000\nNotice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated.  All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.\nEncodingScheme AdobeStandardEncoding\nCapHeight 662\nXHeight 450\nAscender 683\nDescender -217\nStdHW 28\nStdVW 84\nStartCharMetrics 315\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ;\nC 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ;\nC 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ;\nC 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ;\nC 37 ; WX 833 ; N percent ; B 61 -13 772 676 ;\nC 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ;\nC 39 ; WX 333 ; N quoteright ; B 79 433 218 676 ;\nC 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ;\nC 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ;\nC 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ;\nC 43 ; WX 564 ; N plus ; B 30 0 534 506 ;\nC 44 ; WX 250 ; N comma ; B 56 -141 195 102 ;\nC 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ;\nC 46 ; WX 250 ; N period ; B 70 -11 181 100 ;\nC 47 ; WX 278 ; N slash ; B -9 -14 287 676 ;\nC 48 ; WX 500 ; N zero ; B 24 -14 476 676 ;\nC 49 ; WX 500 ; N one ; B 111 0 394 676 ;\nC 50 ; WX 500 ; N two ; B 30 0 475 676 ;\nC 51 ; WX 500 ; N three ; B 43 -14 431 676 ;\nC 52 ; WX 500 ; N four ; B 12 0 472 676 ;\nC 53 ; WX 500 ; N five ; B 32 -14 438 688 ;\nC 54 ; WX 500 ; N six ; B 34 -14 468 684 ;\nC 55 ; WX 500 ; N seven ; B 20 -8 449 662 ;\nC 56 ; WX 500 ; N eight ; B 56 -14 445 676 ;\nC 57 ; WX 500 ; N nine ; B 30 -22 459 676 ;\nC 58 ; WX 278 ; N colon ; B 81 -11 192 459 ;\nC 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ;\nC 60 ; WX 564 ; N less ; B 28 -8 536 514 ;\nC 61 ; WX 564 ; N equal ; B 30 120 534 386 ;\nC 62 ; WX 564 ; N greater ; B 28 -8 536 514 ;\nC 63 ; WX 444 ; N question ; B 68 -8 414 676 ;\nC 64 ; WX 921 ; N at ; B 116 -14 809 676 ;\nC 65 ; WX 722 ; N A ; B 15 0 706 674 ;\nC 66 ; WX 667 ; N B ; B 17 0 593 662 ;\nC 67 ; WX 667 ; N C ; B 28 -14 633 676 ;\nC 68 ; WX 722 ; N D ; B 16 0 685 662 ;\nC 69 ; WX 611 ; N E ; B 12 0 597 662 ;\nC 70 ; WX 556 ; N F ; B 12 0 546 662 ;\nC 71 ; WX 722 ; N G ; B 32 -14 709 676 ;\nC 72 ; WX 722 ; N H ; B 19 0 702 662 ;\nC 73 ; WX 333 ; N I ; B 18 0 315 662 ;\nC 74 ; WX 389 ; N J ; B 10 -14 370 662 ;\nC 75 ; WX 722 ; N K ; B 34 0 723 662 ;\nC 76 ; WX 611 ; N L ; B 12 0 598 662 ;\nC 77 ; WX 889 ; N M ; B 12 0 863 662 ;\nC 78 ; WX 722 ; N N ; B 12 -11 707 662 ;\nC 79 ; WX 722 ; N O ; B 34 -14 688 676 ;\nC 80 ; WX 556 ; N P ; B 16 0 542 662 ;\nC 81 ; WX 722 ; N Q ; B 34 -178 701 676 ;\nC 82 ; WX 667 ; N R ; B 17 0 659 662 ;\nC 83 ; WX 556 ; N S ; B 42 -14 491 676 ;\nC 84 ; WX 611 ; N T ; B 17 0 593 662 ;\nC 85 ; WX 722 ; N U ; B 14 -14 705 662 ;\nC 86 ; WX 722 ; N V ; B 16 -11 697 662 ;\nC 87 ; WX 944 ; N W ; B 5 -11 932 662 ;\nC 88 ; WX 722 ; N X ; B 10 0 704 662 ;\nC 89 ; WX 722 ; N Y ; B 22 0 703 662 ;\nC 90 ; WX 611 ; N Z ; B 9 0 597 662 ;\nC 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ;\nC 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ;\nC 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ;\nC 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B 115 433 254 676 ;\nC 97 ; WX 444 ; N a ; B 37 -10 442 460 ;\nC 98 ; WX 500 ; N b ; B 3 -10 468 683 ;\nC 99 ; WX 444 ; N c ; B 25 -10 412 460 ;\nC 100 ; WX 500 ; N d ; B 27 -10 491 683 ;\nC 101 ; WX 444 ; N e ; B 25 -10 424 460 ;\nC 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ;\nC 103 ; WX 500 ; N g ; B 28 -218 470 460 ;\nC 104 ; WX 500 ; N h ; B 9 0 487 683 ;\nC 105 ; WX 278 ; N i ; B 16 0 253 683 ;\nC 106 ; WX 278 ; N j ; B -70 -218 194 683 ;\nC 107 ; WX 500 ; N k ; B 7 0 505 683 ;\nC 108 ; WX 278 ; N l ; B 19 0 257 683 ;\nC 109 ; WX 778 ; N m ; B 16 0 775 460 ;\nC 110 ; WX 500 ; N n ; B 16 0 485 460 ;\nC 111 ; WX 500 ; N o ; B 29 -10 470 460 ;\nC 112 ; WX 500 ; N p ; B 5 -217 470 460 ;\nC 113 ; WX 500 ; N q ; B 24 -217 488 460 ;\nC 114 ; WX 333 ; N r ; B 5 0 335 460 ;\nC 115 ; WX 389 ; N s ; B 51 -10 348 460 ;\nC 116 ; WX 278 ; N t ; B 13 -10 279 579 ;\nC 117 ; WX 500 ; N u ; B 9 -10 479 450 ;\nC 118 ; WX 500 ; N v ; B 19 -14 477 450 ;\nC 119 ; WX 722 ; N w ; B 21 -14 694 450 ;\nC 120 ; WX 500 ; N x ; B 17 0 479 450 ;\nC 121 ; WX 500 ; N y ; B 14 -218 475 450 ;\nC 122 ; WX 444 ; N z ; B 27 0 418 450 ;\nC 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ;\nC 124 ; WX 200 ; N bar ; B 67 -218 133 782 ;\nC 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ;\nC 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;\nC 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ;\nC 162 ; WX 500 ; N cent ; B 53 -138 448 579 ;\nC 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ;\nC 164 ; WX 167 ; N fraction ; B -168 -14 331 676 ;\nC 165 ; WX 500 ; N yen ; B -53 0 512 662 ;\nC 166 ; WX 500 ; N florin ; B 7 -189 490 676 ;\nC 167 ; WX 500 ; N section ; B 70 -148 426 676 ;\nC 168 ; WX 500 ; N currency ; B -22 58 522 602 ;\nC 169 ; WX 180 ; N quotesingle ; B 48 431 133 676 ;\nC 170 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ;\nC 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ;\nC 173 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ;\nC 174 ; WX 556 ; N fi ; B 31 0 521 683 ;\nC 175 ; WX 556 ; N fl ; B 32 0 521 683 ;\nC 177 ; WX 500 ; N endash ; B 0 201 500 250 ;\nC 178 ; WX 500 ; N dagger ; B 59 -149 442 676 ;\nC 179 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ;\nC 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;\nC 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ;\nC 183 ; WX 350 ; N bullet ; B 40 196 310 466 ;\nC 184 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ;\nC 185 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ;\nC 186 ; WX 444 ; N quotedblright ; B 30 433 401 676 ;\nC 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ;\nC 188 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ;\nC 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ;\nC 193 ; WX 333 ; N grave ; B 19 507 242 678 ;\nC 194 ; WX 333 ; N acute ; B 93 507 317 678 ;\nC 195 ; WX 333 ; N circumflex ; B 11 507 322 674 ;\nC 196 ; WX 333 ; N tilde ; B 1 532 331 638 ;\nC 197 ; WX 333 ; N macron ; B 11 547 322 601 ;\nC 198 ; WX 333 ; N breve ; B 26 507 307 664 ;\nC 199 ; WX 333 ; N dotaccent ; B 118 581 216 681 ;\nC 200 ; WX 333 ; N dieresis ; B 18 581 315 681 ;\nC 202 ; WX 333 ; N ring ; B 67 512 266 711 ;\nC 203 ; WX 333 ; N cedilla ; B 52 -215 261 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ;\nC 206 ; WX 333 ; N ogonek ; B 62 -165 243 0 ;\nC 207 ; WX 333 ; N caron ; B 11 507 322 674 ;\nC 208 ; WX 1000 ; N emdash ; B 0 201 1000 250 ;\nC 225 ; WX 889 ; N AE ; B 0 0 863 662 ;\nC 227 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ;\nC 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ;\nC 233 ; WX 722 ; N Oslash ; B 34 -80 688 734 ;\nC 234 ; WX 889 ; N OE ; B 30 -6 885 668 ;\nC 235 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ;\nC 241 ; WX 667 ; N ae ; B 38 -10 632 460 ;\nC 245 ; WX 278 ; N dotlessi ; B 16 0 253 460 ;\nC 248 ; WX 278 ; N lslash ; B 19 0 259 683 ;\nC 249 ; WX 500 ; N oslash ; B 29 -112 470 551 ;\nC 250 ; WX 722 ; N oe ; B 30 -10 690 460 ;\nC 251 ; WX 500 ; N germandbls ; B 12 -9 468 683 ;\nC -1 ; WX 333 ; N Idieresis ; B 18 0 315 835 ;\nC -1 ; WX 444 ; N eacute ; B 25 -10 424 678 ;\nC -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ;\nC -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 501 678 ;\nC -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ;\nC -1 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ;\nC -1 ; WX 564 ; N divide ; B 30 -10 534 516 ;\nC -1 ; WX 722 ; N Yacute ; B 22 0 703 890 ;\nC -1 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ;\nC -1 ; WX 444 ; N aacute ; B 37 -10 442 678 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ;\nC -1 ; WX 500 ; N yacute ; B 14 -218 475 678 ;\nC -1 ; WX 389 ; N scommaaccent ; B 51 -218 348 460 ;\nC -1 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ;\nC -1 ; WX 722 ; N Uring ; B 14 -14 705 898 ;\nC -1 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ;\nC -1 ; WX 444 ; N aogonek ; B 37 -165 469 460 ;\nC -1 ; WX 722 ; N Uacute ; B 14 -14 705 890 ;\nC -1 ; WX 500 ; N uogonek ; B 9 -155 487 450 ;\nC -1 ; WX 611 ; N Edieresis ; B 12 0 597 835 ;\nC -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ;\nC -1 ; WX 250 ; N commaaccent ; B 59 -218 184 -50 ;\nC -1 ; WX 760 ; N copyright ; B 38 -14 722 676 ;\nC -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ;\nC -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ;\nC -1 ; WX 444 ; N aring ; B 37 -10 442 711 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 12 -198 707 662 ;\nC -1 ; WX 278 ; N lacute ; B 19 0 290 890 ;\nC -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 17 -218 593 662 ;\nC -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ;\nC -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ;\nC -1 ; WX 611 ; N Edotaccent ; B 12 0 597 835 ;\nC -1 ; WX 389 ; N scaron ; B 39 -10 350 674 ;\nC -1 ; WX 389 ; N scedilla ; B 51 -215 348 460 ;\nC -1 ; WX 278 ; N iacute ; B 16 0 290 678 ;\nC -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ;\nC -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ;\nC -1 ; WX 722 ; N Gcommaaccent ; B 32 -218 709 676 ;\nC -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ;\nC -1 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ;\nC -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ;\nC -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ;\nC -1 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 835 ;\nC -1 ; WX 556 ; N Thorn ; B 16 0 542 662 ;\nC -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ;\nC -1 ; WX 667 ; N Racute ; B 17 0 659 890 ;\nC -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ;\nC -1 ; WX 588 ; N dcaron ; B 27 -10 589 695 ;\nC -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ;\nC -1 ; WX 500 ; N uring ; B 9 -10 479 711 ;\nC -1 ; WX 300 ; N threesuperior ; B 15 262 291 676 ;\nC -1 ; WX 722 ; N Ograve ; B 34 -14 688 890 ;\nC -1 ; WX 722 ; N Agrave ; B 15 0 706 890 ;\nC -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ;\nC -1 ; WX 564 ; N multiply ; B 38 8 527 497 ;\nC -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ;\nC -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ;\nC -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;\nC -1 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ;\nC -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ;\nC -1 ; WX 278 ; N icircumflex ; B -16 0 295 674 ;\nC -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ;\nC -1 ; WX 444 ; N adieresis ; B 37 -10 442 623 ;\nC -1 ; WX 444 ; N edieresis ; B 25 -10 424 623 ;\nC -1 ; WX 444 ; N cacute ; B 25 -10 413 678 ;\nC -1 ; WX 500 ; N nacute ; B 16 0 485 678 ;\nC -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ;\nC -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ;\nC -1 ; WX 333 ; N Iacute ; B 18 0 317 890 ;\nC -1 ; WX 564 ; N plusminus ; B 30 0 534 506 ;\nC -1 ; WX 200 ; N brokenbar ; B 67 -143 133 707 ;\nC -1 ; WX 760 ; N registered ; B 38 -14 722 676 ;\nC -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ;\nC -1 ; WX 333 ; N Idotaccent ; B 18 0 315 835 ;\nC -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;\nC -1 ; WX 611 ; N Egrave ; B 12 0 597 890 ;\nC -1 ; WX 333 ; N racute ; B 5 0 335 678 ;\nC -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ;\nC -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ;\nC -1 ; WX 611 ; N Zcaron ; B 9 0 597 886 ;\nC -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ;\nC -1 ; WX 722 ; N Eth ; B 16 0 685 662 ;\nC -1 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 19 -218 257 683 ;\nC -1 ; WX 326 ; N tcaron ; B 13 -10 318 722 ;\nC -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ;\nC -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ;\nC -1 ; WX 722 ; N Aacute ; B 15 0 706 890 ;\nC -1 ; WX 722 ; N Adieresis ; B 15 0 706 835 ;\nC -1 ; WX 444 ; N egrave ; B 25 -10 424 678 ;\nC -1 ; WX 444 ; N zacute ; B 27 0 418 678 ;\nC -1 ; WX 278 ; N iogonek ; B 16 -165 265 683 ;\nC -1 ; WX 722 ; N Oacute ; B 34 -14 688 890 ;\nC -1 ; WX 500 ; N oacute ; B 29 -10 470 678 ;\nC -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ;\nC -1 ; WX 389 ; N sacute ; B 51 -10 348 678 ;\nC -1 ; WX 278 ; N idieresis ; B -9 0 288 623 ;\nC -1 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ;\nC -1 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 500 ; N thorn ; B 5 -217 470 683 ;\nC -1 ; WX 300 ; N twosuperior ; B 1 270 296 676 ;\nC -1 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ;\nC -1 ; WX 500 ; N mu ; B 36 -218 512 450 ;\nC -1 ; WX 278 ; N igrave ; B -8 0 253 678 ;\nC -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 491 678 ;\nC -1 ; WX 611 ; N Eogonek ; B 12 -165 597 662 ;\nC -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ;\nC -1 ; WX 750 ; N threequarters ; B 15 -14 718 676 ;\nC -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ;\nC -1 ; WX 344 ; N lcaron ; B 19 0 347 695 ;\nC -1 ; WX 722 ; N Kcommaaccent ; B 34 -198 723 662 ;\nC -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ;\nC -1 ; WX 980 ; N trademark ; B 30 256 957 662 ;\nC -1 ; WX 444 ; N edotaccent ; B 25 -10 424 623 ;\nC -1 ; WX 333 ; N Igrave ; B 18 0 315 890 ;\nC -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ;\nC -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ;\nC -1 ; WX 750 ; N onehalf ; B 31 -14 746 676 ;\nC -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ;\nC -1 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ;\nC -1 ; WX 500 ; N ntilde ; B 16 0 485 638 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ;\nC -1 ; WX 611 ; N Eacute ; B 12 0 597 890 ;\nC -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ;\nC -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ;\nC -1 ; WX 750 ; N onequarter ; B 37 -14 718 676 ;\nC -1 ; WX 556 ; N Scaron ; B 42 -14 491 886 ;\nC -1 ; WX 556 ; N Scommaaccent ; B 42 -218 491 676 ;\nC -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ;\nC -1 ; WX 400 ; N degree ; B 57 390 343 676 ;\nC -1 ; WX 500 ; N ograve ; B 29 -10 470 678 ;\nC -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ;\nC -1 ; WX 500 ; N ugrave ; B 9 -10 479 678 ;\nC -1 ; WX 453 ; N radical ; B 2 -60 452 768 ;\nC -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ;\nC -1 ; WX 333 ; N rcommaaccent ; B 5 -218 335 460 ;\nC -1 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ;\nC -1 ; WX 500 ; N otilde ; B 29 -10 470 638 ;\nC -1 ; WX 667 ; N Rcommaaccent ; B 17 -198 659 662 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B 12 -218 598 662 ;\nC -1 ; WX 722 ; N Atilde ; B 15 0 706 850 ;\nC -1 ; WX 722 ; N Aogonek ; B 15 -165 738 674 ;\nC -1 ; WX 722 ; N Aring ; B 15 0 706 898 ;\nC -1 ; WX 722 ; N Otilde ; B 34 -14 688 850 ;\nC -1 ; WX 444 ; N zdotaccent ; B 27 0 418 623 ;\nC -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ;\nC -1 ; WX 333 ; N Iogonek ; B 18 -165 315 662 ;\nC -1 ; WX 500 ; N kcommaaccent ; B 7 -218 505 683 ;\nC -1 ; WX 564 ; N minus ; B 30 220 534 286 ;\nC -1 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ;\nC -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ;\nC -1 ; WX 278 ; N tcommaaccent ; B 13 -218 279 579 ;\nC -1 ; WX 564 ; N logicalnot ; B 30 108 534 386 ;\nC -1 ; WX 500 ; N odieresis ; B 29 -10 470 623 ;\nC -1 ; WX 500 ; N udieresis ; B 9 -10 479 623 ;\nC -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ;\nC -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 749 ;\nC -1 ; WX 500 ; N eth ; B 29 -10 471 686 ;\nC -1 ; WX 444 ; N zcaron ; B 27 0 418 674 ;\nC -1 ; WX 500 ; N ncommaaccent ; B 16 -218 485 460 ;\nC -1 ; WX 300 ; N onesuperior ; B 57 270 248 676 ;\nC -1 ; WX 278 ; N imacron ; B 6 0 271 601 ;\nC -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 2073\nKPX A C -40\nKPX A Cacute -40\nKPX A Ccaron -40\nKPX A Ccedilla -40\nKPX A G -40\nKPX A Gbreve -40\nKPX A Gcommaaccent -40\nKPX A O -55\nKPX A Oacute -55\nKPX A Ocircumflex -55\nKPX A Odieresis -55\nKPX A Ograve -55\nKPX A Ohungarumlaut -55\nKPX A Omacron -55\nKPX A Oslash -55\nKPX A Otilde -55\nKPX A Q -55\nKPX A T -111\nKPX A Tcaron -111\nKPX A Tcommaaccent -111\nKPX A U -55\nKPX A Uacute -55\nKPX A Ucircumflex -55\nKPX A Udieresis -55\nKPX A Ugrave -55\nKPX A Uhungarumlaut -55\nKPX A Umacron -55\nKPX A Uogonek -55\nKPX A Uring -55\nKPX A V -135\nKPX A W -90\nKPX A Y -105\nKPX A Yacute -105\nKPX A Ydieresis -105\nKPX A quoteright -111\nKPX A v -74\nKPX A w -92\nKPX A y -92\nKPX A yacute -92\nKPX A ydieresis -92\nKPX Aacute C -40\nKPX Aacute Cacute -40\nKPX Aacute Ccaron -40\nKPX Aacute Ccedilla -40\nKPX Aacute G -40\nKPX Aacute Gbreve -40\nKPX Aacute Gcommaaccent -40\nKPX Aacute O -55\nKPX Aacute Oacute -55\nKPX Aacute Ocircumflex -55\nKPX Aacute Odieresis -55\nKPX Aacute Ograve -55\nKPX Aacute Ohungarumlaut -55\nKPX Aacute Omacron -55\nKPX Aacute Oslash -55\nKPX Aacute Otilde -55\nKPX Aacute Q -55\nKPX Aacute T -111\nKPX Aacute Tcaron -111\nKPX Aacute Tcommaaccent -111\nKPX Aacute U -55\nKPX Aacute Uacute -55\nKPX Aacute Ucircumflex -55\nKPX Aacute Udieresis -55\nKPX Aacute Ugrave -55\nKPX Aacute Uhungarumlaut -55\nKPX Aacute Umacron -55\nKPX Aacute Uogonek -55\nKPX Aacute Uring -55\nKPX Aacute V -135\nKPX Aacute W -90\nKPX Aacute Y -105\nKPX Aacute Yacute -105\nKPX Aacute Ydieresis -105\nKPX Aacute quoteright -111\nKPX Aacute v -74\nKPX Aacute w -92\nKPX Aacute y -92\nKPX Aacute yacute -92\nKPX Aacute ydieresis -92\nKPX Abreve C -40\nKPX Abreve Cacute -40\nKPX Abreve Ccaron -40\nKPX Abreve Ccedilla -40\nKPX Abreve G -40\nKPX Abreve Gbreve -40\nKPX Abreve Gcommaaccent -40\nKPX Abreve O -55\nKPX Abreve Oacute -55\nKPX Abreve Ocircumflex -55\nKPX Abreve Odieresis -55\nKPX Abreve Ograve -55\nKPX Abreve Ohungarumlaut -55\nKPX Abreve Omacron -55\nKPX Abreve Oslash -55\nKPX Abreve Otilde -55\nKPX Abreve Q -55\nKPX Abreve T -111\nKPX Abreve Tcaron -111\nKPX Abreve Tcommaaccent -111\nKPX Abreve U -55\nKPX Abreve Uacute -55\nKPX Abreve Ucircumflex -55\nKPX Abreve Udieresis -55\nKPX Abreve Ugrave -55\nKPX Abreve Uhungarumlaut -55\nKPX Abreve Umacron -55\nKPX Abreve Uogonek -55\nKPX Abreve Uring -55\nKPX Abreve V -135\nKPX Abreve W -90\nKPX Abreve Y -105\nKPX Abreve Yacute -105\nKPX Abreve Ydieresis -105\nKPX Abreve quoteright -111\nKPX Abreve v -74\nKPX Abreve w -92\nKPX Abreve y -92\nKPX Abreve yacute -92\nKPX Abreve ydieresis -92\nKPX Acircumflex C -40\nKPX Acircumflex Cacute -40\nKPX Acircumflex Ccaron -40\nKPX Acircumflex Ccedilla -40\nKPX Acircumflex G -40\nKPX Acircumflex Gbreve -40\nKPX Acircumflex Gcommaaccent -40\nKPX Acircumflex O -55\nKPX Acircumflex Oacute -55\nKPX Acircumflex Ocircumflex -55\nKPX Acircumflex Odieresis -55\nKPX Acircumflex Ograve -55\nKPX Acircumflex Ohungarumlaut -55\nKPX Acircumflex Omacron -55\nKPX Acircumflex Oslash -55\nKPX Acircumflex Otilde -55\nKPX Acircumflex Q -55\nKPX Acircumflex T -111\nKPX Acircumflex Tcaron -111\nKPX Acircumflex Tcommaaccent -111\nKPX Acircumflex U -55\nKPX Acircumflex Uacute -55\nKPX Acircumflex Ucircumflex -55\nKPX Acircumflex Udieresis -55\nKPX Acircumflex Ugrave -55\nKPX Acircumflex Uhungarumlaut -55\nKPX Acircumflex Umacron -55\nKPX Acircumflex Uogonek -55\nKPX Acircumflex Uring -55\nKPX Acircumflex V -135\nKPX Acircumflex W -90\nKPX Acircumflex Y -105\nKPX Acircumflex Yacute -105\nKPX Acircumflex Ydieresis -105\nKPX Acircumflex quoteright -111\nKPX Acircumflex v -74\nKPX Acircumflex w -92\nKPX Acircumflex y -92\nKPX Acircumflex yacute -92\nKPX Acircumflex ydieresis -92\nKPX Adieresis C -40\nKPX Adieresis Cacute -40\nKPX Adieresis Ccaron -40\nKPX Adieresis Ccedilla -40\nKPX Adieresis G -40\nKPX Adieresis Gbreve -40\nKPX Adieresis Gcommaaccent -40\nKPX Adieresis O -55\nKPX Adieresis Oacute -55\nKPX Adieresis Ocircumflex -55\nKPX Adieresis Odieresis -55\nKPX Adieresis Ograve -55\nKPX Adieresis Ohungarumlaut -55\nKPX Adieresis Omacron -55\nKPX Adieresis Oslash -55\nKPX Adieresis Otilde -55\nKPX Adieresis Q -55\nKPX Adieresis T -111\nKPX Adieresis Tcaron -111\nKPX Adieresis Tcommaaccent -111\nKPX Adieresis U -55\nKPX Adieresis Uacute -55\nKPX Adieresis Ucircumflex -55\nKPX Adieresis Udieresis -55\nKPX Adieresis Ugrave -55\nKPX Adieresis Uhungarumlaut -55\nKPX Adieresis Umacron -55\nKPX Adieresis Uogonek -55\nKPX Adieresis Uring -55\nKPX Adieresis V -135\nKPX Adieresis W -90\nKPX Adieresis Y -105\nKPX Adieresis Yacute -105\nKPX Adieresis Ydieresis -105\nKPX Adieresis quoteright -111\nKPX Adieresis v -74\nKPX Adieresis w -92\nKPX Adieresis y -92\nKPX Adieresis yacute -92\nKPX Adieresis ydieresis -92\nKPX Agrave C -40\nKPX Agrave Cacute -40\nKPX Agrave Ccaron -40\nKPX Agrave Ccedilla -40\nKPX Agrave G -40\nKPX Agrave Gbreve -40\nKPX Agrave Gcommaaccent -40\nKPX Agrave O -55\nKPX Agrave Oacute -55\nKPX Agrave Ocircumflex -55\nKPX Agrave Odieresis -55\nKPX Agrave Ograve -55\nKPX Agrave Ohungarumlaut -55\nKPX Agrave Omacron -55\nKPX Agrave Oslash -55\nKPX Agrave Otilde -55\nKPX Agrave Q -55\nKPX Agrave T -111\nKPX Agrave Tcaron -111\nKPX Agrave Tcommaaccent -111\nKPX Agrave U -55\nKPX Agrave Uacute -55\nKPX Agrave Ucircumflex -55\nKPX Agrave Udieresis -55\nKPX Agrave Ugrave -55\nKPX Agrave Uhungarumlaut -55\nKPX Agrave Umacron -55\nKPX Agrave Uogonek -55\nKPX Agrave Uring -55\nKPX Agrave V -135\nKPX Agrave W -90\nKPX Agrave Y -105\nKPX Agrave Yacute -105\nKPX Agrave Ydieresis -105\nKPX Agrave quoteright -111\nKPX Agrave v -74\nKPX Agrave w -92\nKPX Agrave y -92\nKPX Agrave yacute -92\nKPX Agrave ydieresis -92\nKPX Amacron C -40\nKPX Amacron Cacute -40\nKPX Amacron Ccaron -40\nKPX Amacron Ccedilla -40\nKPX Amacron G -40\nKPX Amacron Gbreve -40\nKPX Amacron Gcommaaccent -40\nKPX Amacron O -55\nKPX Amacron Oacute -55\nKPX Amacron Ocircumflex -55\nKPX Amacron Odieresis -55\nKPX Amacron Ograve -55\nKPX Amacron Ohungarumlaut -55\nKPX Amacron Omacron -55\nKPX Amacron Oslash -55\nKPX Amacron Otilde -55\nKPX Amacron Q -55\nKPX Amacron T -111\nKPX Amacron Tcaron -111\nKPX Amacron Tcommaaccent -111\nKPX Amacron U -55\nKPX Amacron Uacute -55\nKPX Amacron Ucircumflex -55\nKPX Amacron Udieresis -55\nKPX Amacron Ugrave -55\nKPX Amacron Uhungarumlaut -55\nKPX Amacron Umacron -55\nKPX Amacron Uogonek -55\nKPX Amacron Uring -55\nKPX Amacron V -135\nKPX Amacron W -90\nKPX Amacron Y -105\nKPX Amacron Yacute -105\nKPX Amacron Ydieresis -105\nKPX Amacron quoteright -111\nKPX Amacron v -74\nKPX Amacron w -92\nKPX Amacron y -92\nKPX Amacron yacute -92\nKPX Amacron ydieresis -92\nKPX Aogonek C -40\nKPX Aogonek Cacute -40\nKPX Aogonek Ccaron -40\nKPX Aogonek Ccedilla -40\nKPX Aogonek G -40\nKPX Aogonek Gbreve -40\nKPX Aogonek Gcommaaccent -40\nKPX Aogonek O -55\nKPX Aogonek Oacute -55\nKPX Aogonek Ocircumflex -55\nKPX Aogonek Odieresis -55\nKPX Aogonek Ograve -55\nKPX Aogonek Ohungarumlaut -55\nKPX Aogonek Omacron -55\nKPX Aogonek Oslash -55\nKPX Aogonek Otilde -55\nKPX Aogonek Q -55\nKPX Aogonek T -111\nKPX Aogonek Tcaron -111\nKPX Aogonek Tcommaaccent -111\nKPX Aogonek U -55\nKPX Aogonek Uacute -55\nKPX Aogonek Ucircumflex -55\nKPX Aogonek Udieresis -55\nKPX Aogonek Ugrave -55\nKPX Aogonek Uhungarumlaut -55\nKPX Aogonek Umacron -55\nKPX Aogonek Uogonek -55\nKPX Aogonek Uring -55\nKPX Aogonek V -135\nKPX Aogonek W -90\nKPX Aogonek Y -105\nKPX Aogonek Yacute -105\nKPX Aogonek Ydieresis -105\nKPX Aogonek quoteright -111\nKPX Aogonek v -74\nKPX Aogonek w -52\nKPX Aogonek y -52\nKPX Aogonek yacute -52\nKPX Aogonek ydieresis -52\nKPX Aring C -40\nKPX Aring Cacute -40\nKPX Aring Ccaron -40\nKPX Aring Ccedilla -40\nKPX Aring G -40\nKPX Aring Gbreve -40\nKPX Aring Gcommaaccent -40\nKPX Aring O -55\nKPX Aring Oacute -55\nKPX Aring Ocircumflex -55\nKPX Aring Odieresis -55\nKPX Aring Ograve -55\nKPX Aring Ohungarumlaut -55\nKPX Aring Omacron -55\nKPX Aring Oslash -55\nKPX Aring Otilde -55\nKPX Aring Q -55\nKPX Aring T -111\nKPX Aring Tcaron -111\nKPX Aring Tcommaaccent -111\nKPX Aring U -55\nKPX Aring Uacute -55\nKPX Aring Ucircumflex -55\nKPX Aring Udieresis -55\nKPX Aring Ugrave -55\nKPX Aring Uhungarumlaut -55\nKPX Aring Umacron -55\nKPX Aring Uogonek -55\nKPX Aring Uring -55\nKPX Aring V -135\nKPX Aring W -90\nKPX Aring Y -105\nKPX Aring Yacute -105\nKPX Aring Ydieresis -105\nKPX Aring quoteright -111\nKPX Aring v -74\nKPX Aring w -92\nKPX Aring y -92\nKPX Aring yacute -92\nKPX Aring ydieresis -92\nKPX Atilde C -40\nKPX Atilde Cacute -40\nKPX Atilde Ccaron -40\nKPX Atilde Ccedilla -40\nKPX Atilde G -40\nKPX Atilde Gbreve -40\nKPX Atilde Gcommaaccent -40\nKPX Atilde O -55\nKPX Atilde Oacute -55\nKPX Atilde Ocircumflex -55\nKPX Atilde Odieresis -55\nKPX Atilde Ograve -55\nKPX Atilde Ohungarumlaut -55\nKPX Atilde Omacron -55\nKPX Atilde Oslash -55\nKPX Atilde Otilde -55\nKPX Atilde Q -55\nKPX Atilde T -111\nKPX Atilde Tcaron -111\nKPX Atilde Tcommaaccent -111\nKPX Atilde U -55\nKPX Atilde Uacute -55\nKPX Atilde Ucircumflex -55\nKPX Atilde Udieresis -55\nKPX Atilde Ugrave -55\nKPX Atilde Uhungarumlaut -55\nKPX Atilde Umacron -55\nKPX Atilde Uogonek -55\nKPX Atilde Uring -55\nKPX Atilde V -135\nKPX Atilde W -90\nKPX Atilde Y -105\nKPX Atilde Yacute -105\nKPX Atilde Ydieresis -105\nKPX Atilde quoteright -111\nKPX Atilde v -74\nKPX Atilde w -92\nKPX Atilde y -92\nKPX Atilde yacute -92\nKPX Atilde ydieresis -92\nKPX B A -35\nKPX B Aacute -35\nKPX B Abreve -35\nKPX B Acircumflex -35\nKPX B Adieresis -35\nKPX B Agrave -35\nKPX B Amacron -35\nKPX B Aogonek -35\nKPX B Aring -35\nKPX B Atilde -35\nKPX B U -10\nKPX B Uacute -10\nKPX B Ucircumflex -10\nKPX B Udieresis -10\nKPX B Ugrave -10\nKPX B Uhungarumlaut -10\nKPX B Umacron -10\nKPX B Uogonek -10\nKPX B Uring -10\nKPX D A -40\nKPX D Aacute -40\nKPX D Abreve -40\nKPX D Acircumflex -40\nKPX D Adieresis -40\nKPX D Agrave -40\nKPX D Amacron -40\nKPX D Aogonek -40\nKPX D Aring -40\nKPX D Atilde -40\nKPX D V -40\nKPX D W -30\nKPX D Y -55\nKPX D Yacute -55\nKPX D Ydieresis -55\nKPX Dcaron A -40\nKPX Dcaron Aacute -40\nKPX Dcaron Abreve -40\nKPX Dcaron Acircumflex -40\nKPX Dcaron Adieresis -40\nKPX Dcaron Agrave -40\nKPX Dcaron Amacron -40\nKPX Dcaron Aogonek -40\nKPX Dcaron Aring -40\nKPX Dcaron Atilde -40\nKPX Dcaron V -40\nKPX Dcaron W -30\nKPX Dcaron Y -55\nKPX Dcaron Yacute -55\nKPX Dcaron Ydieresis -55\nKPX Dcroat A -40\nKPX Dcroat Aacute -40\nKPX Dcroat Abreve -40\nKPX Dcroat Acircumflex -40\nKPX Dcroat Adieresis -40\nKPX Dcroat Agrave -40\nKPX Dcroat Amacron -40\nKPX Dcroat Aogonek -40\nKPX Dcroat Aring -40\nKPX Dcroat Atilde -40\nKPX Dcroat V -40\nKPX Dcroat W -30\nKPX Dcroat Y -55\nKPX Dcroat Yacute -55\nKPX Dcroat Ydieresis -55\nKPX F A -74\nKPX F Aacute -74\nKPX F Abreve -74\nKPX F Acircumflex -74\nKPX F Adieresis -74\nKPX F Agrave -74\nKPX F Amacron -74\nKPX F Aogonek -74\nKPX F Aring -74\nKPX F Atilde -74\nKPX F a -15\nKPX F aacute -15\nKPX F abreve -15\nKPX F acircumflex -15\nKPX F adieresis -15\nKPX F agrave -15\nKPX F amacron -15\nKPX F aogonek -15\nKPX F aring -15\nKPX F atilde -15\nKPX F comma -80\nKPX F o -15\nKPX F oacute -15\nKPX F ocircumflex -15\nKPX F odieresis -15\nKPX F ograve -15\nKPX F ohungarumlaut -15\nKPX F omacron -15\nKPX F oslash -15\nKPX F otilde -15\nKPX F period -80\nKPX J A -60\nKPX J Aacute -60\nKPX J Abreve -60\nKPX J Acircumflex -60\nKPX J Adieresis -60\nKPX J Agrave -60\nKPX J Amacron -60\nKPX J Aogonek -60\nKPX J Aring -60\nKPX J Atilde -60\nKPX K O -30\nKPX K Oacute -30\nKPX K Ocircumflex -30\nKPX K Odieresis -30\nKPX K Ograve -30\nKPX K Ohungarumlaut -30\nKPX K Omacron -30\nKPX K Oslash -30\nKPX K Otilde -30\nKPX K e -25\nKPX K eacute -25\nKPX K ecaron -25\nKPX K ecircumflex -25\nKPX K edieresis -25\nKPX K edotaccent -25\nKPX K egrave -25\nKPX K emacron -25\nKPX K eogonek -25\nKPX K o -35\nKPX K oacute -35\nKPX K ocircumflex -35\nKPX K odieresis -35\nKPX K ograve -35\nKPX K ohungarumlaut -35\nKPX K omacron -35\nKPX K oslash -35\nKPX K otilde -35\nKPX K u -15\nKPX K uacute -15\nKPX K ucircumflex -15\nKPX K udieresis -15\nKPX K ugrave -15\nKPX K uhungarumlaut -15\nKPX K umacron -15\nKPX K uogonek -15\nKPX K uring -15\nKPX K y -25\nKPX K yacute -25\nKPX K ydieresis -25\nKPX Kcommaaccent O -30\nKPX Kcommaaccent Oacute -30\nKPX Kcommaaccent Ocircumflex -30\nKPX Kcommaaccent Odieresis -30\nKPX Kcommaaccent Ograve -30\nKPX Kcommaaccent Ohungarumlaut -30\nKPX Kcommaaccent Omacron -30\nKPX Kcommaaccent Oslash -30\nKPX Kcommaaccent Otilde -30\nKPX Kcommaaccent e -25\nKPX Kcommaaccent eacute -25\nKPX Kcommaaccent ecaron -25\nKPX Kcommaaccent ecircumflex -25\nKPX Kcommaaccent edieresis -25\nKPX Kcommaaccent edotaccent -25\nKPX Kcommaaccent egrave -25\nKPX Kcommaaccent emacron -25\nKPX Kcommaaccent eogonek -25\nKPX Kcommaaccent o -35\nKPX Kcommaaccent oacute -35\nKPX Kcommaaccent ocircumflex -35\nKPX Kcommaaccent odieresis -35\nKPX Kcommaaccent ograve -35\nKPX Kcommaaccent ohungarumlaut -35\nKPX Kcommaaccent omacron -35\nKPX Kcommaaccent oslash -35\nKPX Kcommaaccent otilde -35\nKPX Kcommaaccent u -15\nKPX Kcommaaccent uacute -15\nKPX Kcommaaccent ucircumflex -15\nKPX Kcommaaccent udieresis -15\nKPX Kcommaaccent ugrave -15\nKPX Kcommaaccent uhungarumlaut -15\nKPX Kcommaaccent umacron -15\nKPX Kcommaaccent uogonek -15\nKPX Kcommaaccent uring -15\nKPX Kcommaaccent y -25\nKPX Kcommaaccent yacute -25\nKPX Kcommaaccent ydieresis -25\nKPX L T -92\nKPX L Tcaron -92\nKPX L Tcommaaccent -92\nKPX L V -100\nKPX L W -74\nKPX L Y -100\nKPX L Yacute -100\nKPX L Ydieresis -100\nKPX L quoteright -92\nKPX L y -55\nKPX L yacute -55\nKPX L ydieresis -55\nKPX Lacute T -92\nKPX Lacute Tcaron -92\nKPX Lacute Tcommaaccent -92\nKPX Lacute V -100\nKPX Lacute W -74\nKPX Lacute Y -100\nKPX Lacute Yacute -100\nKPX Lacute Ydieresis -100\nKPX Lacute quoteright -92\nKPX Lacute y -55\nKPX Lacute yacute -55\nKPX Lacute ydieresis -55\nKPX Lcaron quoteright -92\nKPX Lcaron y -55\nKPX Lcaron yacute -55\nKPX Lcaron ydieresis -55\nKPX Lcommaaccent T -92\nKPX Lcommaaccent Tcaron -92\nKPX Lcommaaccent Tcommaaccent -92\nKPX Lcommaaccent V -100\nKPX Lcommaaccent W -74\nKPX Lcommaaccent Y -100\nKPX Lcommaaccent Yacute -100\nKPX Lcommaaccent Ydieresis -100\nKPX Lcommaaccent quoteright -92\nKPX Lcommaaccent y -55\nKPX Lcommaaccent yacute -55\nKPX Lcommaaccent ydieresis -55\nKPX Lslash T -92\nKPX Lslash Tcaron -92\nKPX Lslash Tcommaaccent -92\nKPX Lslash V -100\nKPX Lslash W -74\nKPX Lslash Y -100\nKPX Lslash Yacute -100\nKPX Lslash Ydieresis -100\nKPX Lslash quoteright -92\nKPX Lslash y -55\nKPX Lslash yacute -55\nKPX Lslash ydieresis -55\nKPX N A -35\nKPX N Aacute -35\nKPX N Abreve -35\nKPX N Acircumflex -35\nKPX N Adieresis -35\nKPX N Agrave -35\nKPX N Amacron -35\nKPX N Aogonek -35\nKPX N Aring -35\nKPX N Atilde -35\nKPX Nacute A -35\nKPX Nacute Aacute -35\nKPX Nacute Abreve -35\nKPX Nacute Acircumflex -35\nKPX Nacute Adieresis -35\nKPX Nacute Agrave -35\nKPX Nacute Amacron -35\nKPX Nacute Aogonek -35\nKPX Nacute Aring -35\nKPX Nacute Atilde -35\nKPX Ncaron A -35\nKPX Ncaron Aacute -35\nKPX Ncaron Abreve -35\nKPX Ncaron Acircumflex -35\nKPX Ncaron Adieresis -35\nKPX Ncaron Agrave -35\nKPX Ncaron Amacron -35\nKPX Ncaron Aogonek -35\nKPX Ncaron Aring -35\nKPX Ncaron Atilde -35\nKPX Ncommaaccent A -35\nKPX Ncommaaccent Aacute -35\nKPX Ncommaaccent Abreve -35\nKPX Ncommaaccent Acircumflex -35\nKPX Ncommaaccent Adieresis -35\nKPX Ncommaaccent Agrave -35\nKPX Ncommaaccent Amacron -35\nKPX Ncommaaccent Aogonek -35\nKPX Ncommaaccent Aring -35\nKPX Ncommaaccent Atilde -35\nKPX Ntilde A -35\nKPX Ntilde Aacute -35\nKPX Ntilde Abreve -35\nKPX Ntilde Acircumflex -35\nKPX Ntilde Adieresis -35\nKPX Ntilde Agrave -35\nKPX Ntilde Amacron -35\nKPX Ntilde Aogonek -35\nKPX Ntilde Aring -35\nKPX Ntilde Atilde -35\nKPX O A -35\nKPX O Aacute -35\nKPX O Abreve -35\nKPX O Acircumflex -35\nKPX O Adieresis -35\nKPX O Agrave -35\nKPX O Amacron -35\nKPX O Aogonek -35\nKPX O Aring -35\nKPX O Atilde -35\nKPX O T -40\nKPX O Tcaron -40\nKPX O Tcommaaccent -40\nKPX O V -50\nKPX O W -35\nKPX O X -40\nKPX O Y -50\nKPX O Yacute -50\nKPX O Ydieresis -50\nKPX Oacute A -35\nKPX Oacute Aacute -35\nKPX Oacute Abreve -35\nKPX Oacute Acircumflex -35\nKPX Oacute Adieresis -35\nKPX Oacute Agrave -35\nKPX Oacute Amacron -35\nKPX Oacute Aogonek -35\nKPX Oacute Aring -35\nKPX Oacute Atilde -35\nKPX Oacute T -40\nKPX Oacute Tcaron -40\nKPX Oacute Tcommaaccent -40\nKPX Oacute V -50\nKPX Oacute W -35\nKPX Oacute X -40\nKPX Oacute Y -50\nKPX Oacute Yacute -50\nKPX Oacute Ydieresis -50\nKPX Ocircumflex A -35\nKPX Ocircumflex Aacute -35\nKPX Ocircumflex Abreve -35\nKPX Ocircumflex Acircumflex -35\nKPX Ocircumflex Adieresis -35\nKPX Ocircumflex Agrave -35\nKPX Ocircumflex Amacron -35\nKPX Ocircumflex Aogonek -35\nKPX Ocircumflex Aring -35\nKPX Ocircumflex Atilde -35\nKPX Ocircumflex T -40\nKPX Ocircumflex Tcaron -40\nKPX Ocircumflex Tcommaaccent -40\nKPX Ocircumflex V -50\nKPX Ocircumflex W -35\nKPX Ocircumflex X -40\nKPX Ocircumflex Y -50\nKPX Ocircumflex Yacute -50\nKPX Ocircumflex Ydieresis -50\nKPX Odieresis A -35\nKPX Odieresis Aacute -35\nKPX Odieresis Abreve -35\nKPX Odieresis Acircumflex -35\nKPX Odieresis Adieresis -35\nKPX Odieresis Agrave -35\nKPX Odieresis Amacron -35\nKPX Odieresis Aogonek -35\nKPX Odieresis Aring -35\nKPX Odieresis Atilde -35\nKPX Odieresis T -40\nKPX Odieresis Tcaron -40\nKPX Odieresis Tcommaaccent -40\nKPX Odieresis V -50\nKPX Odieresis W -35\nKPX Odieresis X -40\nKPX Odieresis Y -50\nKPX Odieresis Yacute -50\nKPX Odieresis Ydieresis -50\nKPX Ograve A -35\nKPX Ograve Aacute -35\nKPX Ograve Abreve -35\nKPX Ograve Acircumflex -35\nKPX Ograve Adieresis -35\nKPX Ograve Agrave -35\nKPX Ograve Amacron -35\nKPX Ograve Aogonek -35\nKPX Ograve Aring -35\nKPX Ograve Atilde -35\nKPX Ograve T -40\nKPX Ograve Tcaron -40\nKPX Ograve Tcommaaccent -40\nKPX Ograve V -50\nKPX Ograve W -35\nKPX Ograve X -40\nKPX Ograve Y -50\nKPX Ograve Yacute -50\nKPX Ograve Ydieresis -50\nKPX Ohungarumlaut A -35\nKPX Ohungarumlaut Aacute -35\nKPX Ohungarumlaut Abreve -35\nKPX Ohungarumlaut Acircumflex -35\nKPX Ohungarumlaut Adieresis -35\nKPX Ohungarumlaut Agrave -35\nKPX Ohungarumlaut Amacron -35\nKPX Ohungarumlaut Aogonek -35\nKPX Ohungarumlaut Aring -35\nKPX Ohungarumlaut Atilde -35\nKPX Ohungarumlaut T -40\nKPX Ohungarumlaut Tcaron -40\nKPX Ohungarumlaut Tcommaaccent -40\nKPX Ohungarumlaut V -50\nKPX Ohungarumlaut W -35\nKPX Ohungarumlaut X -40\nKPX Ohungarumlaut Y -50\nKPX Ohungarumlaut Yacute -50\nKPX Ohungarumlaut Ydieresis -50\nKPX Omacron A -35\nKPX Omacron Aacute -35\nKPX Omacron Abreve -35\nKPX Omacron Acircumflex -35\nKPX Omacron Adieresis -35\nKPX Omacron Agrave -35\nKPX Omacron Amacron -35\nKPX Omacron Aogonek -35\nKPX Omacron Aring -35\nKPX Omacron Atilde -35\nKPX Omacron T -40\nKPX Omacron Tcaron -40\nKPX Omacron Tcommaaccent -40\nKPX Omacron V -50\nKPX Omacron W -35\nKPX Omacron X -40\nKPX Omacron Y -50\nKPX Omacron Yacute -50\nKPX Omacron Ydieresis -50\nKPX Oslash A -35\nKPX Oslash Aacute -35\nKPX Oslash Abreve -35\nKPX Oslash Acircumflex -35\nKPX Oslash Adieresis -35\nKPX Oslash Agrave -35\nKPX Oslash Amacron -35\nKPX Oslash Aogonek -35\nKPX Oslash Aring -35\nKPX Oslash Atilde -35\nKPX Oslash T -40\nKPX Oslash Tcaron -40\nKPX Oslash Tcommaaccent -40\nKPX Oslash V -50\nKPX Oslash W -35\nKPX Oslash X -40\nKPX Oslash Y -50\nKPX Oslash Yacute -50\nKPX Oslash Ydieresis -50\nKPX Otilde A -35\nKPX Otilde Aacute -35\nKPX Otilde Abreve -35\nKPX Otilde Acircumflex -35\nKPX Otilde Adieresis -35\nKPX Otilde Agrave -35\nKPX Otilde Amacron -35\nKPX Otilde Aogonek -35\nKPX Otilde Aring -35\nKPX Otilde Atilde -35\nKPX Otilde T -40\nKPX Otilde Tcaron -40\nKPX Otilde Tcommaaccent -40\nKPX Otilde V -50\nKPX Otilde W -35\nKPX Otilde X -40\nKPX Otilde Y -50\nKPX Otilde Yacute -50\nKPX Otilde Ydieresis -50\nKPX P A -92\nKPX P Aacute -92\nKPX P Abreve -92\nKPX P Acircumflex -92\nKPX P Adieresis -92\nKPX P Agrave -92\nKPX P Amacron -92\nKPX P Aogonek -92\nKPX P Aring -92\nKPX P Atilde -92\nKPX P a -15\nKPX P aacute -15\nKPX P abreve -15\nKPX P acircumflex -15\nKPX P adieresis -15\nKPX P agrave -15\nKPX P amacron -15\nKPX P aogonek -15\nKPX P aring -15\nKPX P atilde -15\nKPX P comma -111\nKPX P period -111\nKPX Q U -10\nKPX Q Uacute -10\nKPX Q Ucircumflex -10\nKPX Q Udieresis -10\nKPX Q Ugrave -10\nKPX Q Uhungarumlaut -10\nKPX Q Umacron -10\nKPX Q Uogonek -10\nKPX Q Uring -10\nKPX R O -40\nKPX R Oacute -40\nKPX R Ocircumflex -40\nKPX R Odieresis -40\nKPX R Ograve -40\nKPX R Ohungarumlaut -40\nKPX R Omacron -40\nKPX R Oslash -40\nKPX R Otilde -40\nKPX R T -60\nKPX R Tcaron -60\nKPX R Tcommaaccent -60\nKPX R U -40\nKPX R Uacute -40\nKPX R Ucircumflex -40\nKPX R Udieresis -40\nKPX R Ugrave -40\nKPX R Uhungarumlaut -40\nKPX R Umacron -40\nKPX R Uogonek -40\nKPX R Uring -40\nKPX R V -80\nKPX R W -55\nKPX R Y -65\nKPX R Yacute -65\nKPX R Ydieresis -65\nKPX Racute O -40\nKPX Racute Oacute -40\nKPX Racute Ocircumflex -40\nKPX Racute Odieresis -40\nKPX Racute Ograve -40\nKPX Racute Ohungarumlaut -40\nKPX Racute Omacron -40\nKPX Racute Oslash -40\nKPX Racute Otilde -40\nKPX Racute T -60\nKPX Racute Tcaron -60\nKPX Racute Tcommaaccent -60\nKPX Racute U -40\nKPX Racute Uacute -40\nKPX Racute Ucircumflex -40\nKPX Racute Udieresis -40\nKPX Racute Ugrave -40\nKPX Racute Uhungarumlaut -40\nKPX Racute Umacron -40\nKPX Racute Uogonek -40\nKPX Racute Uring -40\nKPX Racute V -80\nKPX Racute W -55\nKPX Racute Y -65\nKPX Racute Yacute -65\nKPX Racute Ydieresis -65\nKPX Rcaron O -40\nKPX Rcaron Oacute -40\nKPX Rcaron Ocircumflex -40\nKPX Rcaron Odieresis -40\nKPX Rcaron Ograve -40\nKPX Rcaron Ohungarumlaut -40\nKPX Rcaron Omacron -40\nKPX Rcaron Oslash -40\nKPX Rcaron Otilde -40\nKPX Rcaron T -60\nKPX Rcaron Tcaron -60\nKPX Rcaron Tcommaaccent -60\nKPX Rcaron U -40\nKPX Rcaron Uacute -40\nKPX Rcaron Ucircumflex -40\nKPX Rcaron Udieresis -40\nKPX Rcaron Ugrave -40\nKPX Rcaron Uhungarumlaut -40\nKPX Rcaron Umacron -40\nKPX Rcaron Uogonek -40\nKPX Rcaron Uring -40\nKPX Rcaron V -80\nKPX Rcaron W -55\nKPX Rcaron Y -65\nKPX Rcaron Yacute -65\nKPX Rcaron Ydieresis -65\nKPX Rcommaaccent O -40\nKPX Rcommaaccent Oacute -40\nKPX Rcommaaccent Ocircumflex -40\nKPX Rcommaaccent Odieresis -40\nKPX Rcommaaccent Ograve -40\nKPX Rcommaaccent Ohungarumlaut -40\nKPX Rcommaaccent Omacron -40\nKPX Rcommaaccent Oslash -40\nKPX Rcommaaccent Otilde -40\nKPX Rcommaaccent T -60\nKPX Rcommaaccent Tcaron -60\nKPX Rcommaaccent Tcommaaccent -60\nKPX Rcommaaccent U -40\nKPX Rcommaaccent Uacute -40\nKPX Rcommaaccent Ucircumflex -40\nKPX Rcommaaccent Udieresis -40\nKPX Rcommaaccent Ugrave -40\nKPX Rcommaaccent Uhungarumlaut -40\nKPX Rcommaaccent Umacron -40\nKPX Rcommaaccent Uogonek -40\nKPX Rcommaaccent Uring -40\nKPX Rcommaaccent V -80\nKPX Rcommaaccent W -55\nKPX Rcommaaccent Y -65\nKPX Rcommaaccent Yacute -65\nKPX Rcommaaccent Ydieresis -65\nKPX T A -93\nKPX T Aacute -93\nKPX T Abreve -93\nKPX T Acircumflex -93\nKPX T Adieresis -93\nKPX T Agrave -93\nKPX T Amacron -93\nKPX T Aogonek -93\nKPX T Aring -93\nKPX T Atilde -93\nKPX T O -18\nKPX T Oacute -18\nKPX T Ocircumflex -18\nKPX T Odieresis -18\nKPX T Ograve -18\nKPX T Ohungarumlaut -18\nKPX T Omacron -18\nKPX T Oslash -18\nKPX T Otilde -18\nKPX T a -80\nKPX T aacute -80\nKPX T abreve -80\nKPX T acircumflex -80\nKPX T adieresis -40\nKPX T agrave -40\nKPX T amacron -40\nKPX T aogonek -80\nKPX T aring -80\nKPX T atilde -40\nKPX T colon -50\nKPX T comma -74\nKPX T e -70\nKPX T eacute -70\nKPX T ecaron -70\nKPX T ecircumflex -70\nKPX T edieresis -30\nKPX T edotaccent -70\nKPX T egrave -70\nKPX T emacron -30\nKPX T eogonek -70\nKPX T hyphen -92\nKPX T i -35\nKPX T iacute -35\nKPX T iogonek -35\nKPX T o -80\nKPX T oacute -80\nKPX T ocircumflex -80\nKPX T odieresis -80\nKPX T ograve -80\nKPX T ohungarumlaut -80\nKPX T omacron -80\nKPX T oslash -80\nKPX T otilde -80\nKPX T period -74\nKPX T r -35\nKPX T racute -35\nKPX T rcaron -35\nKPX T rcommaaccent -35\nKPX T semicolon -55\nKPX T u -45\nKPX T uacute -45\nKPX T ucircumflex -45\nKPX T udieresis -45\nKPX T ugrave -45\nKPX T uhungarumlaut -45\nKPX T umacron -45\nKPX T uogonek -45\nKPX T uring -45\nKPX T w -80\nKPX T y -80\nKPX T yacute -80\nKPX T ydieresis -80\nKPX Tcaron A -93\nKPX Tcaron Aacute -93\nKPX Tcaron Abreve -93\nKPX Tcaron Acircumflex -93\nKPX Tcaron Adieresis -93\nKPX Tcaron Agrave -93\nKPX Tcaron Amacron -93\nKPX Tcaron Aogonek -93\nKPX Tcaron Aring -93\nKPX Tcaron Atilde -93\nKPX Tcaron O -18\nKPX Tcaron Oacute -18\nKPX Tcaron Ocircumflex -18\nKPX Tcaron Odieresis -18\nKPX Tcaron Ograve -18\nKPX Tcaron Ohungarumlaut -18\nKPX Tcaron Omacron -18\nKPX Tcaron Oslash -18\nKPX Tcaron Otilde -18\nKPX Tcaron a -80\nKPX Tcaron aacute -80\nKPX Tcaron abreve -80\nKPX Tcaron acircumflex -80\nKPX Tcaron adieresis -40\nKPX Tcaron agrave -40\nKPX Tcaron amacron -40\nKPX Tcaron aogonek -80\nKPX Tcaron aring -80\nKPX Tcaron atilde -40\nKPX Tcaron colon -50\nKPX Tcaron comma -74\nKPX Tcaron e -70\nKPX Tcaron eacute -70\nKPX Tcaron ecaron -70\nKPX Tcaron ecircumflex -30\nKPX Tcaron edieresis -30\nKPX Tcaron edotaccent -70\nKPX Tcaron egrave -70\nKPX Tcaron emacron -30\nKPX Tcaron eogonek -70\nKPX Tcaron hyphen -92\nKPX Tcaron i -35\nKPX Tcaron iacute -35\nKPX Tcaron iogonek -35\nKPX Tcaron o -80\nKPX Tcaron oacute -80\nKPX Tcaron ocircumflex -80\nKPX Tcaron odieresis -80\nKPX Tcaron ograve -80\nKPX Tcaron ohungarumlaut -80\nKPX Tcaron omacron -80\nKPX Tcaron oslash -80\nKPX Tcaron otilde -80\nKPX Tcaron period -74\nKPX Tcaron r -35\nKPX Tcaron racute -35\nKPX Tcaron rcaron -35\nKPX Tcaron rcommaaccent -35\nKPX Tcaron semicolon -55\nKPX Tcaron u -45\nKPX Tcaron uacute -45\nKPX Tcaron ucircumflex -45\nKPX Tcaron udieresis -45\nKPX Tcaron ugrave -45\nKPX Tcaron uhungarumlaut -45\nKPX Tcaron umacron -45\nKPX Tcaron uogonek -45\nKPX Tcaron uring -45\nKPX Tcaron w -80\nKPX Tcaron y -80\nKPX Tcaron yacute -80\nKPX Tcaron ydieresis -80\nKPX Tcommaaccent A -93\nKPX Tcommaaccent Aacute -93\nKPX Tcommaaccent Abreve -93\nKPX Tcommaaccent Acircumflex -93\nKPX Tcommaaccent Adieresis -93\nKPX Tcommaaccent Agrave -93\nKPX Tcommaaccent Amacron -93\nKPX Tcommaaccent Aogonek -93\nKPX Tcommaaccent Aring -93\nKPX Tcommaaccent Atilde -93\nKPX Tcommaaccent O -18\nKPX Tcommaaccent Oacute -18\nKPX Tcommaaccent Ocircumflex -18\nKPX Tcommaaccent Odieresis -18\nKPX Tcommaaccent Ograve -18\nKPX Tcommaaccent Ohungarumlaut -18\nKPX Tcommaaccent Omacron -18\nKPX Tcommaaccent Oslash -18\nKPX Tcommaaccent Otilde -18\nKPX Tcommaaccent a -80\nKPX Tcommaaccent aacute -80\nKPX Tcommaaccent abreve -80\nKPX Tcommaaccent acircumflex -80\nKPX Tcommaaccent adieresis -40\nKPX Tcommaaccent agrave -40\nKPX Tcommaaccent amacron -40\nKPX Tcommaaccent aogonek -80\nKPX Tcommaaccent aring -80\nKPX Tcommaaccent atilde -40\nKPX Tcommaaccent colon -50\nKPX Tcommaaccent comma -74\nKPX Tcommaaccent e -70\nKPX Tcommaaccent eacute -70\nKPX Tcommaaccent ecaron -70\nKPX Tcommaaccent ecircumflex -30\nKPX Tcommaaccent edieresis -30\nKPX Tcommaaccent edotaccent -70\nKPX Tcommaaccent egrave -30\nKPX Tcommaaccent emacron -70\nKPX Tcommaaccent eogonek -70\nKPX Tcommaaccent hyphen -92\nKPX Tcommaaccent i -35\nKPX Tcommaaccent iacute -35\nKPX Tcommaaccent iogonek -35\nKPX Tcommaaccent o -80\nKPX Tcommaaccent oacute -80\nKPX Tcommaaccent ocircumflex -80\nKPX Tcommaaccent odieresis -80\nKPX Tcommaaccent ograve -80\nKPX Tcommaaccent ohungarumlaut -80\nKPX Tcommaaccent omacron -80\nKPX Tcommaaccent oslash -80\nKPX Tcommaaccent otilde -80\nKPX Tcommaaccent period -74\nKPX Tcommaaccent r -35\nKPX Tcommaaccent racute -35\nKPX Tcommaaccent rcaron -35\nKPX Tcommaaccent rcommaaccent -35\nKPX Tcommaaccent semicolon -55\nKPX Tcommaaccent u -45\nKPX Tcommaaccent uacute -45\nKPX Tcommaaccent ucircumflex -45\nKPX Tcommaaccent udieresis -45\nKPX Tcommaaccent ugrave -45\nKPX Tcommaaccent uhungarumlaut -45\nKPX Tcommaaccent umacron -45\nKPX Tcommaaccent uogonek -45\nKPX Tcommaaccent uring -45\nKPX Tcommaaccent w -80\nKPX Tcommaaccent y -80\nKPX Tcommaaccent yacute -80\nKPX Tcommaaccent ydieresis -80\nKPX U A -40\nKPX U Aacute -40\nKPX U Abreve -40\nKPX U Acircumflex -40\nKPX U Adieresis -40\nKPX U Agrave -40\nKPX U Amacron -40\nKPX U Aogonek -40\nKPX U Aring -40\nKPX U Atilde -40\nKPX Uacute A -40\nKPX Uacute Aacute -40\nKPX Uacute Abreve -40\nKPX Uacute Acircumflex -40\nKPX Uacute Adieresis -40\nKPX Uacute Agrave -40\nKPX Uacute Amacron -40\nKPX Uacute Aogonek -40\nKPX Uacute Aring -40\nKPX Uacute Atilde -40\nKPX Ucircumflex A -40\nKPX Ucircumflex Aacute -40\nKPX Ucircumflex Abreve -40\nKPX Ucircumflex Acircumflex -40\nKPX Ucircumflex Adieresis -40\nKPX Ucircumflex Agrave -40\nKPX Ucircumflex Amacron -40\nKPX Ucircumflex Aogonek -40\nKPX Ucircumflex Aring -40\nKPX Ucircumflex Atilde -40\nKPX Udieresis A -40\nKPX Udieresis Aacute -40\nKPX Udieresis Abreve -40\nKPX Udieresis Acircumflex -40\nKPX Udieresis Adieresis -40\nKPX Udieresis Agrave -40\nKPX Udieresis Amacron -40\nKPX Udieresis Aogonek -40\nKPX Udieresis Aring -40\nKPX Udieresis Atilde -40\nKPX Ugrave A -40\nKPX Ugrave Aacute -40\nKPX Ugrave Abreve -40\nKPX Ugrave Acircumflex -40\nKPX Ugrave Adieresis -40\nKPX Ugrave Agrave -40\nKPX Ugrave Amacron -40\nKPX Ugrave Aogonek -40\nKPX Ugrave Aring -40\nKPX Ugrave Atilde -40\nKPX Uhungarumlaut A -40\nKPX Uhungarumlaut Aacute -40\nKPX Uhungarumlaut Abreve -40\nKPX Uhungarumlaut Acircumflex -40\nKPX Uhungarumlaut Adieresis -40\nKPX Uhungarumlaut Agrave -40\nKPX Uhungarumlaut Amacron -40\nKPX Uhungarumlaut Aogonek -40\nKPX Uhungarumlaut Aring -40\nKPX Uhungarumlaut Atilde -40\nKPX Umacron A -40\nKPX Umacron Aacute -40\nKPX Umacron Abreve -40\nKPX Umacron Acircumflex -40\nKPX Umacron Adieresis -40\nKPX Umacron Agrave -40\nKPX Umacron Amacron -40\nKPX Umacron Aogonek -40\nKPX Umacron Aring -40\nKPX Umacron Atilde -40\nKPX Uogonek A -40\nKPX Uogonek Aacute -40\nKPX Uogonek Abreve -40\nKPX Uogonek Acircumflex -40\nKPX Uogonek Adieresis -40\nKPX Uogonek Agrave -40\nKPX Uogonek Amacron -40\nKPX Uogonek Aogonek -40\nKPX Uogonek Aring -40\nKPX Uogonek Atilde -40\nKPX Uring A -40\nKPX Uring Aacute -40\nKPX Uring Abreve -40\nKPX Uring Acircumflex -40\nKPX Uring Adieresis -40\nKPX Uring Agrave -40\nKPX Uring Amacron -40\nKPX Uring Aogonek -40\nKPX Uring Aring -40\nKPX Uring Atilde -40\nKPX V A -135\nKPX V Aacute -135\nKPX V Abreve -135\nKPX V Acircumflex -135\nKPX V Adieresis -135\nKPX V Agrave -135\nKPX V Amacron -135\nKPX V Aogonek -135\nKPX V Aring -135\nKPX V Atilde -135\nKPX V G -15\nKPX V Gbreve -15\nKPX V Gcommaaccent -15\nKPX V O -40\nKPX V Oacute -40\nKPX V Ocircumflex -40\nKPX V Odieresis -40\nKPX V Ograve -40\nKPX V Ohungarumlaut -40\nKPX V Omacron -40\nKPX V Oslash -40\nKPX V Otilde -40\nKPX V a -111\nKPX V aacute -111\nKPX V abreve -111\nKPX V acircumflex -71\nKPX V adieresis -71\nKPX V agrave -71\nKPX V amacron -71\nKPX V aogonek -111\nKPX V aring -111\nKPX V atilde -71\nKPX V colon -74\nKPX V comma -129\nKPX V e -111\nKPX V eacute -111\nKPX V ecaron -71\nKPX V ecircumflex -71\nKPX V edieresis -71\nKPX V edotaccent -111\nKPX V egrave -71\nKPX V emacron -71\nKPX V eogonek -111\nKPX V hyphen -100\nKPX V i -60\nKPX V iacute -60\nKPX V icircumflex -20\nKPX V idieresis -20\nKPX V igrave -20\nKPX V imacron -20\nKPX V iogonek -60\nKPX V o -129\nKPX V oacute -129\nKPX V ocircumflex -129\nKPX V odieresis -89\nKPX V ograve -89\nKPX V ohungarumlaut -129\nKPX V omacron -89\nKPX V oslash -129\nKPX V otilde -89\nKPX V period -129\nKPX V semicolon -74\nKPX V u -75\nKPX V uacute -75\nKPX V ucircumflex -75\nKPX V udieresis -75\nKPX V ugrave -75\nKPX V uhungarumlaut -75\nKPX V umacron -75\nKPX V uogonek -75\nKPX V uring -75\nKPX W A -120\nKPX W Aacute -120\nKPX W Abreve -120\nKPX W Acircumflex -120\nKPX W Adieresis -120\nKPX W Agrave -120\nKPX W Amacron -120\nKPX W Aogonek -120\nKPX W Aring -120\nKPX W Atilde -120\nKPX W O -10\nKPX W Oacute -10\nKPX W Ocircumflex -10\nKPX W Odieresis -10\nKPX W Ograve -10\nKPX W Ohungarumlaut -10\nKPX W Omacron -10\nKPX W Oslash -10\nKPX W Otilde -10\nKPX W a -80\nKPX W aacute -80\nKPX W abreve -80\nKPX W acircumflex -80\nKPX W adieresis -80\nKPX W agrave -80\nKPX W amacron -80\nKPX W aogonek -80\nKPX W aring -80\nKPX W atilde -80\nKPX W colon -37\nKPX W comma -92\nKPX W e -80\nKPX W eacute -80\nKPX W ecaron -80\nKPX W ecircumflex -80\nKPX W edieresis -40\nKPX W edotaccent -80\nKPX W egrave -40\nKPX W emacron -40\nKPX W eogonek -80\nKPX W hyphen -65\nKPX W i -40\nKPX W iacute -40\nKPX W iogonek -40\nKPX W o -80\nKPX W oacute -80\nKPX W ocircumflex -80\nKPX W odieresis -80\nKPX W ograve -80\nKPX W ohungarumlaut -80\nKPX W omacron -80\nKPX W oslash -80\nKPX W otilde -80\nKPX W period -92\nKPX W semicolon -37\nKPX W u -50\nKPX W uacute -50\nKPX W ucircumflex -50\nKPX W udieresis -50\nKPX W ugrave -50\nKPX W uhungarumlaut -50\nKPX W umacron -50\nKPX W uogonek -50\nKPX W uring -50\nKPX W y -73\nKPX W yacute -73\nKPX W ydieresis -73\nKPX Y A -120\nKPX Y Aacute -120\nKPX Y Abreve -120\nKPX Y Acircumflex -120\nKPX Y Adieresis -120\nKPX Y Agrave -120\nKPX Y Amacron -120\nKPX Y Aogonek -120\nKPX Y Aring -120\nKPX Y Atilde -120\nKPX Y O -30\nKPX Y Oacute -30\nKPX Y Ocircumflex -30\nKPX Y Odieresis -30\nKPX Y Ograve -30\nKPX Y Ohungarumlaut -30\nKPX Y Omacron -30\nKPX Y Oslash -30\nKPX Y Otilde -30\nKPX Y a -100\nKPX Y aacute -100\nKPX Y abreve -100\nKPX Y acircumflex -100\nKPX Y adieresis -60\nKPX Y agrave -60\nKPX Y amacron -60\nKPX Y aogonek -100\nKPX Y aring -100\nKPX Y atilde -60\nKPX Y colon -92\nKPX Y comma -129\nKPX Y e -100\nKPX Y eacute -100\nKPX Y ecaron -100\nKPX Y ecircumflex -100\nKPX Y edieresis -60\nKPX Y edotaccent -100\nKPX Y egrave -60\nKPX Y emacron -60\nKPX Y eogonek -100\nKPX Y hyphen -111\nKPX Y i -55\nKPX Y iacute -55\nKPX Y iogonek -55\nKPX Y o -110\nKPX Y oacute -110\nKPX Y ocircumflex -110\nKPX Y odieresis -70\nKPX Y ograve -70\nKPX Y ohungarumlaut -110\nKPX Y omacron -70\nKPX Y oslash -110\nKPX Y otilde -70\nKPX Y period -129\nKPX Y semicolon -92\nKPX Y u -111\nKPX Y uacute -111\nKPX Y ucircumflex -111\nKPX Y udieresis -71\nKPX Y ugrave -71\nKPX Y uhungarumlaut -111\nKPX Y umacron -71\nKPX Y uogonek -111\nKPX Y uring -111\nKPX Yacute A -120\nKPX Yacute Aacute -120\nKPX Yacute Abreve -120\nKPX Yacute Acircumflex -120\nKPX Yacute Adieresis -120\nKPX Yacute Agrave -120\nKPX Yacute Amacron -120\nKPX Yacute Aogonek -120\nKPX Yacute Aring -120\nKPX Yacute Atilde -120\nKPX Yacute O -30\nKPX Yacute Oacute -30\nKPX Yacute Ocircumflex -30\nKPX Yacute Odieresis -30\nKPX Yacute Ograve -30\nKPX Yacute Ohungarumlaut -30\nKPX Yacute Omacron -30\nKPX Yacute Oslash -30\nKPX Yacute Otilde -30\nKPX Yacute a -100\nKPX Yacute aacute -100\nKPX Yacute abreve -100\nKPX Yacute acircumflex -100\nKPX Yacute adieresis -60\nKPX Yacute agrave -60\nKPX Yacute amacron -60\nKPX Yacute aogonek -100\nKPX Yacute aring -100\nKPX Yacute atilde -60\nKPX Yacute colon -92\nKPX Yacute comma -129\nKPX Yacute e -100\nKPX Yacute eacute -100\nKPX Yacute ecaron -100\nKPX Yacute ecircumflex -100\nKPX Yacute edieresis -60\nKPX Yacute edotaccent -100\nKPX Yacute egrave -60\nKPX Yacute emacron -60\nKPX Yacute eogonek -100\nKPX Yacute hyphen -111\nKPX Yacute i -55\nKPX Yacute iacute -55\nKPX Yacute iogonek -55\nKPX Yacute o -110\nKPX Yacute oacute -110\nKPX Yacute ocircumflex -110\nKPX Yacute odieresis -70\nKPX Yacute ograve -70\nKPX Yacute ohungarumlaut -110\nKPX Yacute omacron -70\nKPX Yacute oslash -110\nKPX Yacute otilde -70\nKPX Yacute period -129\nKPX Yacute semicolon -92\nKPX Yacute u -111\nKPX Yacute uacute -111\nKPX Yacute ucircumflex -111\nKPX Yacute udieresis -71\nKPX Yacute ugrave -71\nKPX Yacute uhungarumlaut -111\nKPX Yacute umacron -71\nKPX Yacute uogonek -111\nKPX Yacute uring -111\nKPX Ydieresis A -120\nKPX Ydieresis Aacute -120\nKPX Ydieresis Abreve -120\nKPX Ydieresis Acircumflex -120\nKPX Ydieresis Adieresis -120\nKPX Ydieresis Agrave -120\nKPX Ydieresis Amacron -120\nKPX Ydieresis Aogonek -120\nKPX Ydieresis Aring -120\nKPX Ydieresis Atilde -120\nKPX Ydieresis O -30\nKPX Ydieresis Oacute -30\nKPX Ydieresis Ocircumflex -30\nKPX Ydieresis Odieresis -30\nKPX Ydieresis Ograve -30\nKPX Ydieresis Ohungarumlaut -30\nKPX Ydieresis Omacron -30\nKPX Ydieresis Oslash -30\nKPX Ydieresis Otilde -30\nKPX Ydieresis a -100\nKPX Ydieresis aacute -100\nKPX Ydieresis abreve -100\nKPX Ydieresis acircumflex -100\nKPX Ydieresis adieresis -60\nKPX Ydieresis agrave -60\nKPX Ydieresis amacron -60\nKPX Ydieresis aogonek -100\nKPX Ydieresis aring -100\nKPX Ydieresis atilde -100\nKPX Ydieresis colon -92\nKPX Ydieresis comma -129\nKPX Ydieresis e -100\nKPX Ydieresis eacute -100\nKPX Ydieresis ecaron -100\nKPX Ydieresis ecircumflex -100\nKPX Ydieresis edieresis -60\nKPX Ydieresis edotaccent -100\nKPX Ydieresis egrave -60\nKPX Ydieresis emacron -60\nKPX Ydieresis eogonek -100\nKPX Ydieresis hyphen -111\nKPX Ydieresis i -55\nKPX Ydieresis iacute -55\nKPX Ydieresis iogonek -55\nKPX Ydieresis o -110\nKPX Ydieresis oacute -110\nKPX Ydieresis ocircumflex -110\nKPX Ydieresis odieresis -70\nKPX Ydieresis ograve -70\nKPX Ydieresis ohungarumlaut -110\nKPX Ydieresis omacron -70\nKPX Ydieresis oslash -110\nKPX Ydieresis otilde -70\nKPX Ydieresis period -129\nKPX Ydieresis semicolon -92\nKPX Ydieresis u -111\nKPX Ydieresis uacute -111\nKPX Ydieresis ucircumflex -111\nKPX Ydieresis udieresis -71\nKPX Ydieresis ugrave -71\nKPX Ydieresis uhungarumlaut -111\nKPX Ydieresis umacron -71\nKPX Ydieresis uogonek -111\nKPX Ydieresis uring -111\nKPX a v -20\nKPX a w -15\nKPX aacute v -20\nKPX aacute w -15\nKPX abreve v -20\nKPX abreve w -15\nKPX acircumflex v -20\nKPX acircumflex w -15\nKPX adieresis v -20\nKPX adieresis w -15\nKPX agrave v -20\nKPX agrave w -15\nKPX amacron v -20\nKPX amacron w -15\nKPX aogonek v -20\nKPX aogonek w -15\nKPX aring v -20\nKPX aring w -15\nKPX atilde v -20\nKPX atilde w -15\nKPX b period -40\nKPX b u -20\nKPX b uacute -20\nKPX b ucircumflex -20\nKPX b udieresis -20\nKPX b ugrave -20\nKPX b uhungarumlaut -20\nKPX b umacron -20\nKPX b uogonek -20\nKPX b uring -20\nKPX b v -15\nKPX c y -15\nKPX c yacute -15\nKPX c ydieresis -15\nKPX cacute y -15\nKPX cacute yacute -15\nKPX cacute ydieresis -15\nKPX ccaron y -15\nKPX ccaron yacute -15\nKPX ccaron ydieresis -15\nKPX ccedilla y -15\nKPX ccedilla yacute -15\nKPX ccedilla ydieresis -15\nKPX comma quotedblright -70\nKPX comma quoteright -70\nKPX e g -15\nKPX e gbreve -15\nKPX e gcommaaccent -15\nKPX e v -25\nKPX e w -25\nKPX e x -15\nKPX e y -15\nKPX e yacute -15\nKPX e ydieresis -15\nKPX eacute g -15\nKPX eacute gbreve -15\nKPX eacute gcommaaccent -15\nKPX eacute v -25\nKPX eacute w -25\nKPX eacute x -15\nKPX eacute y -15\nKPX eacute yacute -15\nKPX eacute ydieresis -15\nKPX ecaron g -15\nKPX ecaron gbreve -15\nKPX ecaron gcommaaccent -15\nKPX ecaron v -25\nKPX ecaron w -25\nKPX ecaron x -15\nKPX ecaron y -15\nKPX ecaron yacute -15\nKPX ecaron ydieresis -15\nKPX ecircumflex g -15\nKPX ecircumflex gbreve -15\nKPX ecircumflex gcommaaccent -15\nKPX ecircumflex v -25\nKPX ecircumflex w -25\nKPX ecircumflex x -15\nKPX ecircumflex y -15\nKPX ecircumflex yacute -15\nKPX ecircumflex ydieresis -15\nKPX edieresis g -15\nKPX edieresis gbreve -15\nKPX edieresis gcommaaccent -15\nKPX edieresis v -25\nKPX edieresis w -25\nKPX edieresis x -15\nKPX edieresis y -15\nKPX edieresis yacute -15\nKPX edieresis ydieresis -15\nKPX edotaccent g -15\nKPX edotaccent gbreve -15\nKPX edotaccent gcommaaccent -15\nKPX edotaccent v -25\nKPX edotaccent w -25\nKPX edotaccent x -15\nKPX edotaccent y -15\nKPX edotaccent yacute -15\nKPX edotaccent ydieresis -15\nKPX egrave g -15\nKPX egrave gbreve -15\nKPX egrave gcommaaccent -15\nKPX egrave v -25\nKPX egrave w -25\nKPX egrave x -15\nKPX egrave y -15\nKPX egrave yacute -15\nKPX egrave ydieresis -15\nKPX emacron g -15\nKPX emacron gbreve -15\nKPX emacron gcommaaccent -15\nKPX emacron v -25\nKPX emacron w -25\nKPX emacron x -15\nKPX emacron y -15\nKPX emacron yacute -15\nKPX emacron ydieresis -15\nKPX eogonek g -15\nKPX eogonek gbreve -15\nKPX eogonek gcommaaccent -15\nKPX eogonek v -25\nKPX eogonek w -25\nKPX eogonek x -15\nKPX eogonek y -15\nKPX eogonek yacute -15\nKPX eogonek ydieresis -15\nKPX f a -10\nKPX f aacute -10\nKPX f abreve -10\nKPX f acircumflex -10\nKPX f adieresis -10\nKPX f agrave -10\nKPX f amacron -10\nKPX f aogonek -10\nKPX f aring -10\nKPX f atilde -10\nKPX f dotlessi -50\nKPX f f -25\nKPX f i -20\nKPX f iacute -20\nKPX f quoteright 55\nKPX g a -5\nKPX g aacute -5\nKPX g abreve -5\nKPX g acircumflex -5\nKPX g adieresis -5\nKPX g agrave -5\nKPX g amacron -5\nKPX g aogonek -5\nKPX g aring -5\nKPX g atilde -5\nKPX gbreve a -5\nKPX gbreve aacute -5\nKPX gbreve abreve -5\nKPX gbreve acircumflex -5\nKPX gbreve adieresis -5\nKPX gbreve agrave -5\nKPX gbreve amacron -5\nKPX gbreve aogonek -5\nKPX gbreve aring -5\nKPX gbreve atilde -5\nKPX gcommaaccent a -5\nKPX gcommaaccent aacute -5\nKPX gcommaaccent abreve -5\nKPX gcommaaccent acircumflex -5\nKPX gcommaaccent adieresis -5\nKPX gcommaaccent agrave -5\nKPX gcommaaccent amacron -5\nKPX gcommaaccent aogonek -5\nKPX gcommaaccent aring -5\nKPX gcommaaccent atilde -5\nKPX h y -5\nKPX h yacute -5\nKPX h ydieresis -5\nKPX i v -25\nKPX iacute v -25\nKPX icircumflex v -25\nKPX idieresis v -25\nKPX igrave v -25\nKPX imacron v -25\nKPX iogonek v -25\nKPX k e -10\nKPX k eacute -10\nKPX k ecaron -10\nKPX k ecircumflex -10\nKPX k edieresis -10\nKPX k edotaccent -10\nKPX k egrave -10\nKPX k emacron -10\nKPX k eogonek -10\nKPX k o -10\nKPX k oacute -10\nKPX k ocircumflex -10\nKPX k odieresis -10\nKPX k ograve -10\nKPX k ohungarumlaut -10\nKPX k omacron -10\nKPX k oslash -10\nKPX k otilde -10\nKPX k y -15\nKPX k yacute -15\nKPX k ydieresis -15\nKPX kcommaaccent e -10\nKPX kcommaaccent eacute -10\nKPX kcommaaccent ecaron -10\nKPX kcommaaccent ecircumflex -10\nKPX kcommaaccent edieresis -10\nKPX kcommaaccent edotaccent -10\nKPX kcommaaccent egrave -10\nKPX kcommaaccent emacron -10\nKPX kcommaaccent eogonek -10\nKPX kcommaaccent o -10\nKPX kcommaaccent oacute -10\nKPX kcommaaccent ocircumflex -10\nKPX kcommaaccent odieresis -10\nKPX kcommaaccent ograve -10\nKPX kcommaaccent ohungarumlaut -10\nKPX kcommaaccent omacron -10\nKPX kcommaaccent oslash -10\nKPX kcommaaccent otilde -10\nKPX kcommaaccent y -15\nKPX kcommaaccent yacute -15\nKPX kcommaaccent ydieresis -15\nKPX l w -10\nKPX lacute w -10\nKPX lcommaaccent w -10\nKPX lslash w -10\nKPX n v -40\nKPX n y -15\nKPX n yacute -15\nKPX n ydieresis -15\nKPX nacute v -40\nKPX nacute y -15\nKPX nacute yacute -15\nKPX nacute ydieresis -15\nKPX ncaron v -40\nKPX ncaron y -15\nKPX ncaron yacute -15\nKPX ncaron ydieresis -15\nKPX ncommaaccent v -40\nKPX ncommaaccent y -15\nKPX ncommaaccent yacute -15\nKPX ncommaaccent ydieresis -15\nKPX ntilde v -40\nKPX ntilde y -15\nKPX ntilde yacute -15\nKPX ntilde ydieresis -15\nKPX o v -15\nKPX o w -25\nKPX o y -10\nKPX o yacute -10\nKPX o ydieresis -10\nKPX oacute v -15\nKPX oacute w -25\nKPX oacute y -10\nKPX oacute yacute -10\nKPX oacute ydieresis -10\nKPX ocircumflex v -15\nKPX ocircumflex w -25\nKPX ocircumflex y -10\nKPX ocircumflex yacute -10\nKPX ocircumflex ydieresis -10\nKPX odieresis v -15\nKPX odieresis w -25\nKPX odieresis y -10\nKPX odieresis yacute -10\nKPX odieresis ydieresis -10\nKPX ograve v -15\nKPX ograve w -25\nKPX ograve y -10\nKPX ograve yacute -10\nKPX ograve ydieresis -10\nKPX ohungarumlaut v -15\nKPX ohungarumlaut w -25\nKPX ohungarumlaut y -10\nKPX ohungarumlaut yacute -10\nKPX ohungarumlaut ydieresis -10\nKPX omacron v -15\nKPX omacron w -25\nKPX omacron y -10\nKPX omacron yacute -10\nKPX omacron ydieresis -10\nKPX oslash v -15\nKPX oslash w -25\nKPX oslash y -10\nKPX oslash yacute -10\nKPX oslash ydieresis -10\nKPX otilde v -15\nKPX otilde w -25\nKPX otilde y -10\nKPX otilde yacute -10\nKPX otilde ydieresis -10\nKPX p y -10\nKPX p yacute -10\nKPX p ydieresis -10\nKPX period quotedblright -70\nKPX period quoteright -70\nKPX quotedblleft A -80\nKPX quotedblleft Aacute -80\nKPX quotedblleft Abreve -80\nKPX quotedblleft Acircumflex -80\nKPX quotedblleft Adieresis -80\nKPX quotedblleft Agrave -80\nKPX quotedblleft Amacron -80\nKPX quotedblleft Aogonek -80\nKPX quotedblleft Aring -80\nKPX quotedblleft Atilde -80\nKPX quoteleft A -80\nKPX quoteleft Aacute -80\nKPX quoteleft Abreve -80\nKPX quoteleft Acircumflex -80\nKPX quoteleft Adieresis -80\nKPX quoteleft Agrave -80\nKPX quoteleft Amacron -80\nKPX quoteleft Aogonek -80\nKPX quoteleft Aring -80\nKPX quoteleft Atilde -80\nKPX quoteleft quoteleft -74\nKPX quoteright d -50\nKPX quoteright dcroat -50\nKPX quoteright l -10\nKPX quoteright lacute -10\nKPX quoteright lcommaaccent -10\nKPX quoteright lslash -10\nKPX quoteright quoteright -74\nKPX quoteright r -50\nKPX quoteright racute -50\nKPX quoteright rcaron -50\nKPX quoteright rcommaaccent -50\nKPX quoteright s -55\nKPX quoteright sacute -55\nKPX quoteright scaron -55\nKPX quoteright scedilla -55\nKPX quoteright scommaaccent -55\nKPX quoteright space -74\nKPX quoteright t -18\nKPX quoteright tcommaaccent -18\nKPX quoteright v -50\nKPX r comma -40\nKPX r g -18\nKPX r gbreve -18\nKPX r gcommaaccent -18\nKPX r hyphen -20\nKPX r period -55\nKPX racute comma -40\nKPX racute g -18\nKPX racute gbreve -18\nKPX racute gcommaaccent -18\nKPX racute hyphen -20\nKPX racute period -55\nKPX rcaron comma -40\nKPX rcaron g -18\nKPX rcaron gbreve -18\nKPX rcaron gcommaaccent -18\nKPX rcaron hyphen -20\nKPX rcaron period -55\nKPX rcommaaccent comma -40\nKPX rcommaaccent g -18\nKPX rcommaaccent gbreve -18\nKPX rcommaaccent gcommaaccent -18\nKPX rcommaaccent hyphen -20\nKPX rcommaaccent period -55\nKPX space A -55\nKPX space Aacute -55\nKPX space Abreve -55\nKPX space Acircumflex -55\nKPX space Adieresis -55\nKPX space Agrave -55\nKPX space Amacron -55\nKPX space Aogonek -55\nKPX space Aring -55\nKPX space Atilde -55\nKPX space T -18\nKPX space Tcaron -18\nKPX space Tcommaaccent -18\nKPX space V -50\nKPX space W -30\nKPX space Y -90\nKPX space Yacute -90\nKPX space Ydieresis -90\nKPX v a -25\nKPX v aacute -25\nKPX v abreve -25\nKPX v acircumflex -25\nKPX v adieresis -25\nKPX v agrave -25\nKPX v amacron -25\nKPX v aogonek -25\nKPX v aring -25\nKPX v atilde -25\nKPX v comma -65\nKPX v e -15\nKPX v eacute -15\nKPX v ecaron -15\nKPX v ecircumflex -15\nKPX v edieresis -15\nKPX v edotaccent -15\nKPX v egrave -15\nKPX v emacron -15\nKPX v eogonek -15\nKPX v o -20\nKPX v oacute -20\nKPX v ocircumflex -20\nKPX v odieresis -20\nKPX v ograve -20\nKPX v ohungarumlaut -20\nKPX v omacron -20\nKPX v oslash -20\nKPX v otilde -20\nKPX v period -65\nKPX w a -10\nKPX w aacute -10\nKPX w abreve -10\nKPX w acircumflex -10\nKPX w adieresis -10\nKPX w agrave -10\nKPX w amacron -10\nKPX w aogonek -10\nKPX w aring -10\nKPX w atilde -10\nKPX w comma -65\nKPX w o -10\nKPX w oacute -10\nKPX w ocircumflex -10\nKPX w odieresis -10\nKPX w ograve -10\nKPX w ohungarumlaut -10\nKPX w omacron -10\nKPX w oslash -10\nKPX w otilde -10\nKPX w period -65\nKPX x e -15\nKPX x eacute -15\nKPX x ecaron -15\nKPX x ecircumflex -15\nKPX x edieresis -15\nKPX x edotaccent -15\nKPX x egrave -15\nKPX x emacron -15\nKPX x eogonek -15\nKPX y comma -65\nKPX y period -65\nKPX yacute comma -65\nKPX yacute period -65\nKPX ydieresis comma -65\nKPX ydieresis period -65\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/compressData.js",
    "content": "import fs from 'fs';\nimport url from 'url';\nimport { basename, extname } from 'path';\nimport { parse } from '../afm.js';\n\nconst __dirname = url.fileURLToPath(new URL('.', import.meta.url));\n\nconst generateJsonFiles = () => {\n  const files = fs.readdirSync(__dirname);\n  const afmFiles = files.filter((file) => file.match(/.afm$/));\n\n  afmFiles.forEach((file) => {\n    const fontName = basename(file).replace(extname(file), '');\n    const data = fs.readFileSync(__dirname + '/' + file, 'utf8');\n    const parsed = parse(data);\n\n    fs.writeFileSync(\n      __dirname + '/' + fontName + '.json',\n      JSON.stringify(parsed)\n    );\n  });\n};\n\n// Order is designed to produce the smaller size possible\nconst COMPRESS_ORDER = ['Helvetica', 'Times', 'Courier'];\n\nconst readJson = (file) => {\n  const data = fs.readFileSync(__dirname + '/' + file, 'utf8');\n  return JSON.parse(data);\n};\n\nconst sortFiles = (a, b) => {\n  const indexA = COMPRESS_ORDER.indexOf(a.attributes.FamilyName);\n  const indexB = COMPRESS_ORDER.indexOf(b.attributes.FamilyName);\n\n  return indexA - indexB;\n};\n\nconst fillWithZeros = (array) => {\n  const res = [];\n\n  for (let i = 0; i < array.length; i++) {\n    res[i] = array[i] || 0;\n  }\n\n  return res;\n};\n\nconst compressJsonFiles = () => {\n  const attributes = [];\n  const glyphWidths = {};\n  const kernPairs = {};\n\n  const files = fs.readdirSync(__dirname);\n  const jsonFiles = files.filter((file) => file.match(/.json$/));\n  const filesContent = jsonFiles.map(readJson);\n  const sortedFiles = filesContent.sort(sortFiles);\n\n  sortedFiles.forEach((content, index) => {\n    attributes.push(content.attributes);\n\n    Object.keys(content.glyphWidths).forEach((key) => {\n      if (!glyphWidths[key]) glyphWidths[key] = [];\n      glyphWidths[key][index] = content.glyphWidths[key];\n    });\n\n    Object.keys(content.kernPairs).forEach((key) => {\n      if (!kernPairs[key]) kernPairs[key] = [];\n      kernPairs[key][index] = content.kernPairs[key];\n    });\n  });\n\n  // Cheaper to store nulls as 0s\n  Object.keys(glyphWidths).forEach((key) => {\n    glyphWidths[key] = fillWithZeros(glyphWidths[key]);\n  });\n\n  Object.keys(kernPairs).forEach((key) => {\n    kernPairs[key] = fillWithZeros(kernPairs[key]);\n  });\n\n  const parsed = { attributes, glyphWidths, kernPairs };\n\n  fs.writeFileSync(__dirname + '/index.json', JSON.stringify(parsed));\n};\n\ngenerateJsonFiles();\ncompressJsonFiles();\n"
  },
  {
    "path": "packages/pdfkit/src/font/data/expandData.js",
    "content": "const initFont = (font) => {\n  return [font.FontName, { attributes: font, glyphWidths: {}, kernPairs: {} }];\n};\n\nconst expandData = (data) => {\n  const { attributes, glyphWidths, kernPairs } = data;\n  const fonts = attributes.map(initFont);\n\n  Object.keys(glyphWidths).forEach((key) => {\n    glyphWidths[key].forEach((value, index) => {\n      if (value) fonts[index][1].glyphWidths[key] = value;\n    });\n  });\n\n  Object.keys(kernPairs).forEach((key) => {\n    kernPairs[key].forEach((value, index) => {\n      if (value) fonts[index][1].kernPairs[key] = value;\n    });\n  });\n\n  return Object.fromEntries(fonts);\n};\n\nexport default expandData;\n"
  },
  {
    "path": "packages/pdfkit/src/font/embedded.js",
    "content": "const toHex = function (...codePoints) {\n  const codes = Array.from(codePoints).map((code) =>\n    `0000${code.toString(16)}`.slice(-4)\n  );\n\n  return codes.join('');\n};\n\nconst createEmbeddedFont = (PDFFont) =>\n  class EmbeddedFont extends PDFFont {\n    constructor(document, font, id) {\n      super();\n\n      this.document = document;\n      this.font = font;\n      this.id = id;\n      this.subset = this.font.createSubset();\n      this.unicode = [[0]];\n      this.widths = [this.font.getGlyph(0).advanceWidth];\n\n      this.name = this.font.postscriptName;\n      this.scale = 1000 / this.font.unitsPerEm;\n      this.ascender = this.font.ascent * this.scale;\n      this.descender = this.font.descent * this.scale;\n      this.xHeight = this.font.xHeight * this.scale;\n      this.capHeight = this.font.capHeight * this.scale;\n      this.lineGap = this.font.lineGap * this.scale;\n      this.bbox = this.font.bbox;\n\n      this.layoutCache = Object.create(null);\n    }\n\n    layoutRun(text, features) {\n      // passing LTR To force fontkit to not reverse the string\n      const run = this.font.layout(text, features, undefined, undefined, 'ltr');\n\n      // Normalize position values\n      for (let i = 0; i < run.positions.length; i++) {\n        const position = run.positions[i];\n        for (let key in position) {\n          position[key] *= this.scale;\n        }\n\n        position.advanceWidth = run.glyphs[i].advanceWidth * this.scale;\n      }\n\n      return run;\n    }\n\n    layoutCached(text) {\n      let cached;\n      if ((cached = this.layoutCache[text])) {\n        return cached;\n      }\n\n      const run = this.layoutRun(text);\n      this.layoutCache[text] = run;\n      return run;\n    }\n\n    layout(text, features, onlyWidth) {\n      // Skip the cache if any user defined features are applied\n      if (onlyWidth == null) {\n        onlyWidth = false;\n      }\n      if (features) {\n        return this.layoutRun(text, features);\n      }\n\n      const glyphs = onlyWidth ? null : [];\n      const positions = onlyWidth ? null : [];\n      let advanceWidth = 0;\n\n      // Split the string by words to increase cache efficiency.\n      // For this purpose, spaces and tabs are a good enough delimeter.\n      let last = 0;\n      let index = 0;\n      while (index <= text.length) {\n        let needle;\n        if (\n          (index === text.length && last < index) ||\n          ((needle = text.charAt(index)), [' ', '\\t'].includes(needle))\n        ) {\n          const run = this.layoutCached(text.slice(last, ++index));\n          if (!onlyWidth) {\n            glyphs.push(...Array.from(run.glyphs || []));\n            positions.push(...Array.from(run.positions || []));\n          }\n\n          advanceWidth += run.advanceWidth;\n          last = index;\n        } else {\n          index++;\n        }\n      }\n\n      return { glyphs, positions, advanceWidth };\n    }\n\n    encode(text, features) {\n      const { glyphs, positions } = this.layout(text, features);\n\n      const res = [];\n      for (let i = 0; i < glyphs.length; i++) {\n        const glyph = glyphs[i];\n        const gid = this.subset.includeGlyph(glyph.id);\n        res.push(`0000${gid.toString(16)}`.slice(-4));\n\n        if (this.widths[gid] == null) {\n          this.widths[gid] = glyph.advanceWidth * this.scale;\n        }\n        if (this.unicode[gid] == null) {\n          this.unicode[gid] = glyph.codePoints;\n        }\n      }\n\n      return [res, positions];\n    }\n\n    encodeGlyphs(glyphs) {\n      const res = [];\n      for (let i = 0; i < glyphs.length; i++) {\n        const glyph = glyphs[i];\n        const gid = this.subset.includeGlyph(glyph.id);\n        res.push(`0000${gid.toString(16)}`.slice(-4));\n\n        if (this.widths[gid] == null) {\n          this.widths[gid] = glyph.advanceWidth * this.scale;\n        }\n        if (this.unicode[gid] == null) {\n          this.unicode[gid] = glyph.codePoints;\n        }\n      }\n\n      return res;\n    }\n\n    widthOfString(string, size, features) {\n      const width = this.layout(string, features, true).advanceWidth;\n      const scale = size / 1000;\n      return width * scale;\n    }\n\n    embed() {\n      const isCFF = this.subset.cff != null;\n      const fontFile = this.document.ref();\n\n      if (isCFF) {\n        fontFile.data.Subtype = 'CIDFontType0C';\n      }\n\n      fontFile.end(this.subset.encode());\n\n      const familyClass =\n        ((this.font['OS/2'] != null\n          ? this.font['OS/2'].sFamilyClass\n          : undefined) || 0) >> 8;\n      let flags = 0;\n      if (this.font.post.isFixedPitch) {\n        flags |= 1 << 0;\n      }\n      if (1 <= familyClass && familyClass <= 7) {\n        flags |= 1 << 1;\n      }\n      flags |= 1 << 2; // assume the font uses non-latin characters\n      if (familyClass === 10) {\n        flags |= 1 << 3;\n      }\n      if (this.font.head.macStyle.italic) {\n        flags |= 1 << 6;\n      }\n\n      // generate a random tag (6 uppercase letters. 65 is the char code for 'A')\n      const tag = [0, 1, 2, 3, 4, 5]\n        .map(() => String.fromCharCode(Math.random() * 26 + 65))\n        .join('');\n      const name = tag + '+' + this.font.postscriptName;\n\n      const { bbox } = this.font;\n      const descriptor = this.document.ref({\n        Type: 'FontDescriptor',\n        FontName: name,\n        Flags: flags,\n        FontBBox: [\n          bbox.minX * this.scale,\n          bbox.minY * this.scale,\n          bbox.maxX * this.scale,\n          bbox.maxY * this.scale\n        ],\n        ItalicAngle: this.font.italicAngle,\n        Ascent: this.ascender,\n        Descent: this.descender,\n        CapHeight: (this.font.capHeight || this.font.ascent) * this.scale,\n        XHeight: (this.font.xHeight || 0) * this.scale,\n        StemV: 0\n      }); // not sure how to calculate this\n\n      if (isCFF) {\n        descriptor.data.FontFile3 = fontFile;\n      } else {\n        descriptor.data.FontFile2 = fontFile;\n      }\n\n      descriptor.end();\n\n      const descendantFontData = {\n        Type: 'Font',\n        Subtype: 'CIDFontType0',\n        BaseFont: name,\n        CIDSystemInfo: {\n          Registry: new String('Adobe'),\n          Ordering: new String('Identity'),\n          Supplement: 0\n        },\n        FontDescriptor: descriptor,\n        W: [0, this.widths]\n      };\n\n      if (!isCFF) {\n        descendantFontData.Subtype = 'CIDFontType2';\n        descendantFontData.CIDToGIDMap = 'Identity';\n      }\n\n      const descendantFont = this.document.ref(descendantFontData);\n\n      descendantFont.end();\n\n      this.dictionary.data = {\n        Type: 'Font',\n        Subtype: 'Type0',\n        BaseFont: name,\n        Encoding: 'Identity-H',\n        DescendantFonts: [descendantFont],\n        ToUnicode: this.toUnicodeCmap()\n      };\n\n      return this.dictionary.end();\n    }\n\n    // Maps the glyph ids encoded in the PDF back to unicode strings\n    // Because of ligature substitutions and the like, there may be one or more\n    // unicode characters represented by each glyph.\n    toUnicodeCmap() {\n      const cmap = this.document.ref();\n      let entries = [];\n      let unicodeMap =\n        '/CIDInit /ProcSet findresource begin\\n12 dict begin\\nbegincmap\\n/CIDSystemInfo <<\\n  /Registry (Adobe)\\n  /Ordering (UCS)\\n  /Supplement 0\\n>> def\\n/CMapName /Adobe-Identity-UCS def\\n/CMapType 2 def\\n1 begincodespacerange\\n<0000><ffff>\\nendcodespacerange';\n\n      for (let [index, codePoints] of this.unicode.entries()) {\n        const encoded = [];\n        if (entries.length >= 100) {\n          unicodeMap +=\n            '\\n' +\n            entries.length +\n            ' beginbfchar\\n' +\n            entries.join('\\n') +\n            '\\nendbfchar';\n          entries = [];\n        }\n        // encode codePoints to utf16\n        for (let value of codePoints) {\n          if (value > 0xffff) {\n            value -= 0x10000;\n            encoded.push(toHex(((value >>> 10) & 0x3ff) | 0xd800));\n            value = 0xdc00 | (value & 0x3ff);\n          }\n          encoded.push(toHex(value));\n        }\n\n        entries.push('<' + toHex(index) + '>' + '<' + encoded.join(' ') + '>');\n      }\n      if (entries.length) {\n        unicodeMap +=\n          '\\n' +\n          entries.length +\n          ' beginbfchar\\n' +\n          entries.join('\\n') +\n          '\\nendbfchar\\n';\n      }\n      unicodeMap +=\n        'endcmap\\nCMapName currentdict /CMap defineresource pop\\nend\\nend';\n      cmap.end(unicodeMap);\n\n      return cmap;\n    }\n  };\n\nexport default createEmbeddedFont;\n"
  },
  {
    "path": "packages/pdfkit/src/font/standard.js",
    "content": "import AFMFont from './afm';\nimport data from './data/index.json';\nimport expandData from './data/expandData';\n\nconst STANDARD_FONTS = expandData(data);\n\nconst createStandardFont = (PDFFont) =>\n  class StandardFont extends PDFFont {\n    constructor(document, name, id) {\n      super();\n\n      this.document = document;\n      this.name = name;\n      this.id = id;\n      this.font = AFMFont.fromJson(STANDARD_FONTS[this.name]);\n      this.ascender = this.font.ascender;\n      this.descender = this.font.descender;\n      this.bbox = this.font.bbox;\n      this.lineGap = this.font.lineGap;\n    }\n\n    embed() {\n      this.dictionary.data = {\n        Type: 'Font',\n        BaseFont: this.name,\n        Subtype: 'Type1',\n        Encoding: 'WinAnsiEncoding'\n      };\n\n      return this.dictionary.end();\n    }\n\n    encode(text) {\n      const encoded = this.font.encodeText(text);\n      const glyphs = this.font.glyphsForString(`${text}`);\n      const advances = this.font.advancesForGlyphs(glyphs);\n      const positions = [];\n\n      for (let i = 0; i < glyphs.length; i++) {\n        const glyph = glyphs[i];\n        positions.push({\n          xAdvance: advances[i],\n          yAdvance: 0,\n          xOffset: 0,\n          yOffset: 0,\n          advanceWidth: this.font.widthOfGlyph(glyph)\n        });\n      }\n\n      return [encoded, positions];\n    }\n\n    encodeGlyphs(glyphs) {\n      const res = [];\n\n      for (let glyph of Array.from(glyphs)) {\n        res.push(`00${glyph.id.toString(16)}`.slice(-2));\n      }\n\n      return res;\n    }\n\n    widthOfString(string, size) {\n      const glyphs = this.font.glyphsForString(`${string}`);\n      const advances = this.font.advancesForGlyphs(glyphs);\n\n      let width = 0;\n      for (let advance of Array.from(advances)) {\n        width += advance;\n      }\n\n      const scale = size / 1000;\n      return width * scale;\n    }\n\n    static isStandardFont(name) {\n      return name in STANDARD_FONTS;\n    }\n  };\n\nexport default createStandardFont;\n"
  },
  {
    "path": "packages/pdfkit/src/font.js",
    "content": "import * as fontkit from 'fontkit';\nimport createStandardFont from './font/standard';\nimport createEmbeddedFont from './font/embedded';\n\nexport class PDFFont {\n  static open(document, src, family, id) {\n    let font;\n\n    if (typeof src === 'string') {\n      if (StandardFont.isStandardFont(src)) {\n        return new StandardFont(document, src, id);\n      }\n\n      if (!BROWSER) {\n        font = fontkit.openSync(src, family);\n      } else {\n        throw new Error(`Can't open ${src} in browser build`);\n      }\n    } else if (src instanceof Uint8Array) {\n      font = fontkit.create(src, family);\n    } else if (src instanceof ArrayBuffer) {\n      font = fontkit.create(new Uint8Array(src), family);\n    } else if (typeof src === 'object') {\n      font = src;\n    }\n\n    if (font == null) {\n      throw new Error('Not a supported font format or standard PDF font.');\n    }\n\n    return new EmbeddedFont(document, font, id);\n  }\n\n  encode() {\n    throw new Error('Must be implemented by subclasses');\n  }\n\n  widthOfString() {\n    throw new Error('Must be implemented by subclasses');\n  }\n\n  ref() {\n    return this.dictionary != null\n      ? this.dictionary\n      : (this.dictionary = this.document.ref());\n  }\n\n  finalize() {\n    if (this.embedded || this.dictionary == null) {\n      return;\n    }\n\n    this.embed();\n    return (this.embedded = true);\n  }\n\n  embed() {\n    throw new Error('Must be implemented by subclasses');\n  }\n\n  lineHeight(size, includeGap) {\n    if (includeGap == null) {\n      includeGap = false;\n    }\n    const gap = includeGap ? this.lineGap : 0;\n    return ((this.ascender + gap - this.descender) / 1000) * size;\n  }\n}\n\nexport const StandardFont = createStandardFont(PDFFont);\nexport const EmbeddedFont = createEmbeddedFont(PDFFont);\n\nexport default PDFFont;\n"
  },
  {
    "path": "packages/pdfkit/src/font_factory.js",
    "content": "import fs from 'fs';\nimport * as fontkit from 'fontkit';\nimport StandardFont from './font/standard';\nimport EmbeddedFont from './font/embedded';\n\nclass PDFFontFactory {\n  static open(document, src, family, id) {\n    let font;\n    if (typeof src === 'string') {\n      if (StandardFont.isStandardFont(src)) {\n        return new StandardFont(document, src, id);\n      }\n\n      src = fs.readFileSync(src);\n    }\n    if (src instanceof Uint8Array) {\n      font = fontkit.create(src, family);\n    } else if (src instanceof ArrayBuffer) {\n      font = fontkit.create(new Uint8Array(src), family);\n    }\n\n    if (font == null) {\n      throw new Error('Not a supported font format or standard PDF font.');\n    }\n\n    return new EmbeddedFont(document, font, id);\n  }\n}\n\nexport default PDFFontFactory;\n"
  },
  {
    "path": "packages/pdfkit/src/gradient.js",
    "content": "import PDFObject from './object';\n\nconst { number } = PDFObject;\n\nclass PDFGradient {\n  constructor(doc) {\n    this.doc = doc;\n    this.stops = [];\n    this.embedded = false;\n    this.transform = [1, 0, 0, 1, 0, 0];\n  }\n\n  stop(pos, color, opacity) {\n    if (opacity == null) {\n      opacity = 1;\n    }\n    color = this.doc._normalizeColor(color);\n\n    if (this.stops.length === 0) {\n      if (color.length === 3) {\n        this._colorSpace = 'DeviceRGB';\n      } else if (color.length === 4) {\n        this._colorSpace = 'DeviceCMYK';\n      } else if (color.length === 1) {\n        this._colorSpace = 'DeviceGray';\n      } else {\n        throw new Error('Unknown color space');\n      }\n    } else if (\n      (this._colorSpace === 'DeviceRGB' && color.length !== 3) ||\n      (this._colorSpace === 'DeviceCMYK' && color.length !== 4) ||\n      (this._colorSpace === 'DeviceGray' && color.length !== 1)\n    ) {\n      throw new Error('All gradient stops must use the same color space');\n    }\n\n    opacity = Math.max(0, Math.min(1, opacity));\n    this.stops.push([pos, color, opacity]);\n    return this;\n  }\n\n  setTransform(m11, m12, m21, m22, dx, dy) {\n    this.transform = [m11, m12, m21, m22, dx, dy];\n    return this;\n  }\n\n  embed(m) {\n    let fn;\n    const stopsLength = this.stops.length;\n    if (stopsLength === 0) {\n      return;\n    }\n    this.embedded = true;\n    this.matrix = m;\n\n    // if the last stop comes before 100%, add a copy at 100%\n    const last = this.stops[stopsLength - 1];\n    if (last[0] < 1) {\n      this.stops.push([1, last[1], last[2]]);\n    }\n\n    const bounds = [];\n    const encode = [];\n    const stops = [];\n\n    for (let i = 0; i < stopsLength - 1; i++) {\n      encode.push(0, 1);\n      if (i + 2 !== stopsLength) {\n        bounds.push(this.stops[i + 1][0]);\n      }\n\n      fn = this.doc.ref({\n        FunctionType: 2,\n        Domain: [0, 1],\n        C0: this.stops[i + 0][1],\n        C1: this.stops[i + 1][1],\n        N: 1\n      });\n\n      stops.push(fn);\n      fn.end();\n    }\n\n    // if there are only two stops, we don't need a stitching function\n    if (stopsLength === 1) {\n      fn = stops[0];\n    } else {\n      fn = this.doc.ref({\n        FunctionType: 3, // stitching function\n        Domain: [0, 1],\n        Functions: stops,\n        Bounds: bounds,\n        Encode: encode\n      });\n\n      fn.end();\n    }\n\n    this.id = `Sh${++this.doc._gradCount}`;\n\n    const shader = this.shader(fn);\n    shader.end();\n\n    const pattern = this.doc.ref({\n      Type: 'Pattern',\n      PatternType: 2,\n      Shading: shader,\n      Matrix: this.matrix.map(number)\n    });\n\n    pattern.end();\n\n    if (this.stops.some((stop) => stop[2] < 1)) {\n      let grad = this.opacityGradient();\n      grad._colorSpace = 'DeviceGray';\n\n      for (let stop of this.stops) {\n        grad.stop(stop[0], [stop[2]]);\n      }\n\n      grad = grad.embed(this.matrix);\n\n      const pageBBox = [0, 0, this.doc.page.width, this.doc.page.height];\n\n      const form = this.doc.ref({\n        Type: 'XObject',\n        Subtype: 'Form',\n        FormType: 1,\n        BBox: pageBBox,\n        Group: {\n          Type: 'Group',\n          S: 'Transparency',\n          CS: 'DeviceGray'\n        },\n        Resources: {\n          ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'],\n          Pattern: {\n            Sh1: grad\n          }\n        }\n      });\n\n      form.write('/Pattern cs /Sh1 scn');\n      form.end(`${pageBBox.join(' ')} re f`);\n\n      const gstate = this.doc.ref({\n        Type: 'ExtGState',\n        SMask: {\n          Type: 'Mask',\n          S: 'Luminosity',\n          G: form\n        }\n      });\n\n      gstate.end();\n\n      const opacityPattern = this.doc.ref({\n        Type: 'Pattern',\n        PatternType: 1,\n        PaintType: 1,\n        TilingType: 2,\n        BBox: pageBBox,\n        XStep: pageBBox[2],\n        YStep: pageBBox[3],\n        Resources: {\n          ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'],\n          Pattern: {\n            Sh1: pattern\n          },\n          ExtGState: {\n            Gs1: gstate\n          }\n        }\n      });\n\n      opacityPattern.write('/Gs1 gs /Pattern cs /Sh1 scn');\n      opacityPattern.end(`${pageBBox.join(' ')} re f`);\n\n      this.doc.page.patterns[this.id] = opacityPattern;\n    } else {\n      this.doc.page.patterns[this.id] = pattern;\n    }\n\n    return pattern;\n  }\n\n  apply(stroke) {\n    // apply gradient transform to existing document ctm\n    const [m0, m1, m2, m3, m4, m5] = this.doc._ctm;\n    const [m11, m12, m21, m22, dx, dy] = this.transform;\n    const m = [\n      m0 * m11 + m2 * m12,\n      m1 * m11 + m3 * m12,\n      m0 * m21 + m2 * m22,\n      m1 * m21 + m3 * m22,\n      m0 * dx + m2 * dy + m4,\n      m1 * dx + m3 * dy + m5\n    ];\n\n    if (!this.embedded || m.join(' ') !== this.matrix.join(' ')) {\n      this.embed(m);\n    }\n    this.doc._setColorSpace('Pattern', stroke);\n    const op = stroke ? 'SCN' : 'scn';\n    return this.doc.addContent(`/${this.id} ${op}`);\n  }\n}\n\nclass PDFLinearGradient extends PDFGradient {\n  constructor(doc, x1, y1, x2, y2) {\n    super(doc);\n    this.x1 = x1;\n    this.y1 = y1;\n    this.x2 = x2;\n    this.y2 = y2;\n  }\n\n  shader(fn) {\n    return this.doc.ref({\n      ShadingType: 2,\n      ColorSpace: this._colorSpace,\n      Coords: [this.x1, this.y1, this.x2, this.y2],\n      Function: fn,\n      Extend: [true, true]\n    });\n  }\n\n  opacityGradient() {\n    return new PDFLinearGradient(this.doc, this.x1, this.y1, this.x2, this.y2);\n  }\n}\n\nclass PDFRadialGradient extends PDFGradient {\n  constructor(doc, x1, y1, r1, x2, y2, r2) {\n    super(doc);\n    this.doc = doc;\n    this.x1 = x1;\n    this.y1 = y1;\n    this.r1 = r1;\n    this.x2 = x2;\n    this.y2 = y2;\n    this.r2 = r2;\n  }\n\n  shader(fn) {\n    return this.doc.ref({\n      ShadingType: 3,\n      ColorSpace: this._colorSpace,\n      Coords: [this.x1, this.y1, this.r1, this.x2, this.y2, this.r2],\n      Function: fn,\n      Extend: [true, true]\n    });\n  }\n\n  opacityGradient() {\n    return new PDFRadialGradient(\n      this.doc,\n      this.x1,\n      this.y1,\n      this.r1,\n      this.x2,\n      this.y2,\n      this.r2\n    );\n  }\n}\n\nexport default { PDFGradient, PDFLinearGradient, PDFRadialGradient };\n"
  },
  {
    "path": "packages/pdfkit/src/image/jpeg.js",
    "content": "import _JPEG from 'jay-peg';\n\nconst COLOR_SPACE_MAP = {\n  1: 'DeviceGray',\n  3: 'DeviceRGB',\n  4: 'DeviceCMYK'\n};\n\nclass JPEG {\n  constructor(data, label) {\n    this.data = data;\n    this.label = label;\n    this.orientation = 1;\n\n    if (this.data.readUInt16BE(0) !== 0xffd8) {\n      throw 'SOI not found in JPEG';\n    }\n\n    const markers = _JPEG.decode(this.data);\n\n    for (let i = 0; i < markers.length; i += 1) {\n      const marker = markers[i];\n\n      if (marker.name === 'EXIF' && marker.entries.orientation) {\n        this.orientation = marker.entries.orientation;\n      }\n\n      if (marker.name === 'SOF') {\n        this.bits ||= marker.precision;\n        this.width ||= marker.width;\n        this.height ||= marker.height;\n        this.colorSpace ||= COLOR_SPACE_MAP[marker.numberOfComponents];\n      }\n    }\n\n    this.obj = null;\n  }\n\n  embed(document) {\n    if (this.obj) {\n      return;\n    }\n\n    this.obj = document.ref({\n      Type: 'XObject',\n      Subtype: 'Image',\n      BitsPerComponent: this.bits,\n      Width: this.width,\n      Height: this.height,\n      ColorSpace: this.colorSpace,\n      Filter: 'DCTDecode'\n    });\n\n    // add extra decode params for CMYK images. By swapping the\n    // min and max values from the default, we invert the colors. See\n    // section 4.8.4 of the spec.\n    if (this.colorSpace === 'DeviceCMYK') {\n      this.obj.data['Decode'] = [1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0];\n    }\n\n    this.obj.end(this.data);\n\n    // free memory\n    return (this.data = null);\n  }\n}\n\nexport default JPEG;\n"
  },
  {
    "path": "packages/pdfkit/src/image/png.js",
    "content": "import zlib from 'zlib';\nimport PNG from '@react-pdf/png-js';\n\nclass PNGImage {\n  constructor(data, label) {\n    this.label = label;\n    this.image = new PNG(data);\n    this.width = this.image.width;\n    this.height = this.image.height;\n    this.imgData = this.image.imgData;\n    this.obj = null;\n  }\n\n  embed(document) {\n    let dataDecoded = false;\n\n    this.document = document;\n    if (this.obj) {\n      return;\n    }\n\n    const hasAlphaChannel = this.image.hasAlphaChannel;\n    const isInterlaced = this.image.interlaceMethod === 1;\n\n    this.obj = this.document.ref({\n      Type: 'XObject',\n      Subtype: 'Image',\n      BitsPerComponent: hasAlphaChannel ? 8 : this.image.bits,\n      Width: this.width,\n      Height: this.height,\n      Filter: 'FlateDecode'\n    });\n\n    if (!hasAlphaChannel) {\n      const params = this.document.ref({\n        Predictor: isInterlaced ? 1 : 15,\n        Colors: this.image.colors,\n        BitsPerComponent: this.image.bits,\n        Columns: this.width\n      });\n\n      this.obj.data.DecodeParms = params;\n      params.end();\n    }\n\n    if (this.image.palette.length === 0) {\n      this.obj.data.ColorSpace = this.image.colorSpace;\n    } else {\n      // embed the color palette in the PDF as an object stream\n      const palette = this.document.ref();\n      palette.end(Buffer.from(this.image.palette));\n\n      // build the color space array for the image\n      this.obj.data.ColorSpace = [\n        'Indexed',\n        'DeviceRGB',\n        this.image.palette.length / 3 - 1,\n        palette\n      ];\n    }\n\n    // For PNG color types 0, 2 and 3, the transparency data is stored in\n    // a dedicated PNG chunk.\n    if (this.image.transparency.grayscale != null) {\n      // Use Color Key Masking (spec section 4.8.5)\n      // An array with N elements, where N is two times the number of color components.\n      const val = this.image.transparency.grayscale;\n      this.obj.data.Mask = [val, val];\n    } else if (this.image.transparency.rgb) {\n      // Use Color Key Masking (spec section 4.8.5)\n      // An array with N elements, where N is two times the number of color components.\n      const { rgb } = this.image.transparency;\n      const mask = [];\n      for (let x of rgb) {\n        mask.push(x, x);\n      }\n\n      this.obj.data.Mask = mask;\n    } else if (this.image.transparency.indexed) {\n      // Create a transparency SMask for the image based on the data\n      // in the PLTE and tRNS sections. See below for details on SMasks.\n      dataDecoded = true;\n      return this.loadIndexedAlphaChannel();\n    } else if (hasAlphaChannel) {\n      // For PNG color types 4 and 6, the transparency data is stored as a alpha\n      // channel mixed in with the main image data. Separate this data out into an\n      // SMask object and store it separately in the PDF.\n      dataDecoded = true;\n      return this.splitAlphaChannel();\n    }\n\n    if (isInterlaced && !dataDecoded) {\n      return this.decodeData();\n    }\n\n    this.finalize();\n  }\n\n  finalize() {\n    if (this.alphaChannel) {\n      const sMask = this.document.ref({\n        Type: 'XObject',\n        Subtype: 'Image',\n        Height: this.height,\n        Width: this.width,\n        BitsPerComponent: 8,\n        Filter: 'FlateDecode',\n        ColorSpace: 'DeviceGray',\n        Decode: [0, 1]\n      });\n\n      sMask.end(this.alphaChannel);\n      this.obj.data.SMask = sMask;\n    }\n\n    // add the actual image data\n    this.obj.end(this.imgData);\n\n    // free memory\n    this.image = null;\n    return (this.imgData = null);\n  }\n\n  splitAlphaChannel() {\n    return this.image.decodePixels((pixels) => {\n      let a;\n      let p;\n      const colorCount = this.image.colors;\n      const pixelCount = this.width * this.height;\n      const imgData = Buffer.alloc(pixelCount * colorCount);\n      const alphaChannel = Buffer.alloc(pixelCount);\n\n      let i = (p = a = 0);\n      const len = pixels.length;\n      // For 16bit images copy only most significant byte (MSB) - PNG data is always stored in network byte order (MSB first)\n      const skipByteCount = this.image.bits === 16 ? 1 : 0;\n      while (i < len) {\n        for (let colorIndex = 0; colorIndex < colorCount; colorIndex++) {\n          imgData[p++] = pixels[i++];\n          i += skipByteCount;\n        }\n        alphaChannel[a++] = pixels[i++];\n        i += skipByteCount;\n      }\n\n      this.imgData = zlib.deflateSync(imgData);\n      this.alphaChannel = zlib.deflateSync(alphaChannel);\n      return this.finalize();\n    });\n  }\n\n  loadIndexedAlphaChannel() {\n    const transparency = this.image.transparency.indexed;\n    return this.image.decodePixels((pixels) => {\n      const alphaChannel = Buffer.alloc(this.width * this.height);\n\n      let i = 0;\n      for (let j = 0, end = pixels.length; j < end; j++) {\n        alphaChannel[i++] = transparency[pixels[j]];\n      }\n\n      this.alphaChannel = zlib.deflateSync(alphaChannel);\n      return this.finalize();\n    });\n  }\n\n  decodeData() {\n    this.image.decodePixels((pixels) => {\n      this.imgData = zlib.deflateSync(pixels);\n      this.finalize();\n    });\n  }\n}\n\nexport default PNGImage;\n"
  },
  {
    "path": "packages/pdfkit/src/image.js",
    "content": "/*\nPDFImage - embeds images in PDF documents\nBy Devon Govett\n*/\n\nimport fs from 'fs';\nimport JPEG from './image/jpeg';\nimport PNG from './image/png';\n\nclass PDFImage {\n  static open(src, label) {\n    let data;\n    if (Buffer.isBuffer(src)) {\n      data = src;\n    } else if (src instanceof ArrayBuffer) {\n      data = Buffer.from(new Uint8Array(src));\n    } else {\n      let match;\n      if ((match = /^data:.+?;base64,(.*)$/.exec(src))) {\n        data = Buffer.from(match[1], 'base64');\n      } else {\n        data = fs.readFileSync(src);\n        if (!data) {\n          return;\n        }\n      }\n    }\n\n    if (data[0] === 0xff && data[1] === 0xd8) {\n      return new JPEG(data, label);\n    } else if (data[0] === 0x89 && data.toString('ascii', 1, 4) === 'PNG') {\n      return new PNG(data, label);\n    } else {\n      throw new Error('Unknown image format.');\n    }\n  }\n}\n\nexport default PDFImage;\n"
  },
  {
    "path": "packages/pdfkit/src/index.js",
    "content": "import PDFDocument from './document';\n\nexport * from './font';\nexport default PDFDocument;\n"
  },
  {
    "path": "packages/pdfkit/src/line_wrapper.js",
    "content": "import { EventEmitter } from 'events';\nimport LineBreaker from 'linebreak';\nimport { PDFNumber } from './utils';\n\nconst SOFT_HYPHEN = '\\u00AD';\nconst HYPHEN = '-';\n\nclass LineWrapper extends EventEmitter {\n  constructor(document, options) {\n    super();\n    this.document = document;\n    this.horizontalScaling = options.horizontalScaling || 100;\n    this.indent = ((options.indent || 0) * this.horizontalScaling) / 100;\n    this.characterSpacing =\n      ((options.characterSpacing || 0) * this.horizontalScaling) / 100;\n    this.wordSpacing =\n      ((options.wordSpacing === 0) * this.horizontalScaling) / 100;\n    this.columns = options.columns || 1;\n    this.columnGap =\n      ((options.columnGap != null ? options.columnGap : 18) *\n        this.horizontalScaling) /\n      100; // 1/4 inch\n    this.lineWidth =\n      ((options.width * this.horizontalScaling) / 100 -\n        this.columnGap * (this.columns - 1)) /\n      this.columns;\n    this.spaceLeft = this.lineWidth;\n    this.startX = this.document.x;\n    this.startY = this.document.y;\n    this.column = 1;\n    this.ellipsis = options.ellipsis;\n    this.continuedX = 0;\n    this.features = options.features;\n\n    // calculate the maximum Y position the text can appear at\n    if (options.height != null) {\n      this.height = options.height;\n      this.maxY = PDFNumber(this.startY + options.height);\n    } else {\n      this.maxY = PDFNumber(this.document.page.maxY());\n    }\n\n    // handle paragraph indents\n    this.on('firstLine', (options) => {\n      // if this is the first line of the text segment, and\n      // we're continuing where we left off, indent that much\n      // otherwise use the user specified indent option\n      const indent = this.continuedX || this.indent;\n      this.document.x += indent;\n      this.lineWidth -= indent;\n\n      // if indentAllLines is set to true\n      // we're not resetting the indentation for this paragraph after the first line\n      if (options.indentAllLines) {\n        return;\n      }\n\n      // otherwise we start the next line without indent\n      return this.once('line', () => {\n        this.document.x -= indent;\n        this.lineWidth += indent;\n        if (options.continued && !this.continuedX) {\n          this.continuedX = this.indent;\n        }\n        if (!options.continued) {\n          return (this.continuedX = 0);\n        }\n      });\n    });\n\n    // handle left aligning last lines of paragraphs\n    this.on('lastLine', (options) => {\n      const { align } = options;\n      if (align === 'justify') {\n        options.align = 'left';\n      }\n      this.lastLine = true;\n\n      return this.once('line', () => {\n        this.document.y += options.paragraphGap || 0;\n        options.align = align;\n        return (this.lastLine = false);\n      });\n    });\n  }\n\n  wordWidth(word) {\n    return (\n      this.document.widthOfString(word, this) +\n      this.characterSpacing +\n      this.wordSpacing\n    );\n  }\n\n  canFit(word, w) {\n    if (word[word.length - 1] != SOFT_HYPHEN) {\n      return w <= this.spaceLeft;\n    }\n    return w + this.wordWidth(HYPHEN) <= this.spaceLeft;\n  }\n\n  eachWord(text, fn) {\n    // setup a unicode line breaker\n    let bk;\n    const breaker = new LineBreaker(text);\n    let last = null;\n    const wordWidths = Object.create(null);\n\n    while ((bk = breaker.nextBreak())) {\n      var shouldContinue;\n      let word = text.slice(\n        (last != null ? last.position : undefined) || 0,\n        bk.position\n      );\n      let w =\n        wordWidths[word] != null\n          ? wordWidths[word]\n          : (wordWidths[word] = this.wordWidth(word));\n\n      // if the word is longer than the whole line, chop it up\n      // TODO: break by grapheme clusters, not JS string characters\n      if (w > this.lineWidth + this.continuedX) {\n        // make some fake break objects\n        let lbk = last;\n        const fbk = {};\n\n        while (word.length) {\n          // fit as much of the word as possible into the space we have\n          var l, mightGrow;\n          if (w > this.spaceLeft) {\n            // start our check at the end of our available space - this method is faster than a loop of each character and it resolves\n            // an issue with long loops when processing massive words, such as a huge number of spaces\n            l = Math.ceil(this.spaceLeft / (w / word.length));\n            w = this.wordWidth(word.slice(0, l));\n            mightGrow = w <= this.spaceLeft && l < word.length;\n          } else {\n            l = word.length;\n          }\n          let mustShrink = w > this.spaceLeft && l > 0;\n          // shrink or grow word as necessary after our near-guess above\n          while (mustShrink || mightGrow) {\n            if (mustShrink) {\n              w = this.wordWidth(word.slice(0, --l));\n              mustShrink = w > this.spaceLeft && l > 0;\n            } else {\n              w = this.wordWidth(word.slice(0, ++l));\n              mustShrink = w > this.spaceLeft && l > 0;\n              mightGrow = w <= this.spaceLeft && l < word.length;\n            }\n          }\n\n          // check for the edge case where a single character cannot fit into a line.\n          if (l === 0 && this.spaceLeft === this.lineWidth) {\n            l = 1;\n          }\n\n          // send a required break unless this is the last piece and a linebreak is not specified\n          fbk.required = bk.required || l < word.length;\n          shouldContinue = fn(word.slice(0, l), w, fbk, lbk);\n          lbk = { required: false };\n\n          // get the remaining piece of the word\n          word = word.slice(l);\n          w = this.wordWidth(word);\n\n          if (shouldContinue === false) {\n            break;\n          }\n        }\n      } else {\n        // otherwise just emit the break as it was given to us\n        shouldContinue = fn(word, w, bk, last);\n      }\n\n      if (shouldContinue === false) {\n        break;\n      }\n      last = bk;\n    }\n  }\n\n  wrap(text, options) {\n    // override options from previous continued fragments\n    this.horizontalScaling = options.horizontalScaling || 100;\n    if (options.indent != null) {\n      this.indent = (options.indent * this.horizontalScaling) / 100;\n    }\n    if (options.characterSpacing != null) {\n      this.characterSpacing =\n        (options.characterSpacing * this.horizontalScaling) / 100;\n    }\n    if (options.wordSpacing != null) {\n      this.wordSpacing = (options.wordSpacing * this.horizontalScaling) / 100;\n    }\n    if (options.ellipsis != null) {\n      this.ellipsis = options.ellipsis;\n    }\n\n    // make sure we're actually on the page\n    // and that the first line of is never by\n    // itself at the bottom of a page (orphans)\n    const nextY = this.document.y + this.document.currentLineHeight(true);\n    if (this.document.y > this.maxY || nextY > this.maxY) {\n      this.nextSection();\n    }\n\n    let buffer = '';\n    let textWidth = 0;\n    let wc = 0;\n    let lc = 0;\n\n    let { y } = this.document; // used to reset Y pos if options.continued (below)\n    const emitLine = () => {\n      options.textWidth = textWidth + this.wordSpacing * (wc - 1);\n      options.wordCount = wc;\n      options.lineWidth = this.lineWidth;\n      ({ y } = this.document);\n      this.emit('line', buffer, options, this);\n      return lc++;\n    };\n\n    this.emit('sectionStart', options, this);\n\n    this.eachWord(text, (word, w, bk, last) => {\n      if (last == null || last.required) {\n        this.emit('firstLine', options, this);\n        this.spaceLeft = this.lineWidth;\n      }\n\n      if (this.canFit(word, w)) {\n        buffer += word;\n        textWidth += w;\n        wc++;\n      }\n\n      if (bk.required || !this.canFit(word, w)) {\n        // if the user specified a max height and an ellipsis, and is about to pass the\n        // max height and max columns after the next line, append the ellipsis\n        const lh = this.document.currentLineHeight(true);\n        if (\n          this.height != null &&\n          this.ellipsis &&\n          PDFNumber(this.document.y + lh * 2) > this.maxY &&\n          this.column >= this.columns\n        ) {\n          if (this.ellipsis === true) {\n            this.ellipsis = '…';\n          } // map default ellipsis character\n          buffer = buffer.replace(/\\s+$/, '');\n          textWidth = this.wordWidth(buffer + this.ellipsis);\n\n          // remove characters from the buffer until the ellipsis fits\n          // to avoid infinite loop need to stop while-loop if buffer is empty string\n          while (buffer && textWidth > this.lineWidth) {\n            buffer = buffer.slice(0, -1).replace(/\\s+$/, '');\n            textWidth = this.wordWidth(buffer + this.ellipsis);\n          }\n          // need to add ellipsis only if there is enough space for it\n          if (textWidth <= this.lineWidth) {\n            buffer = buffer + this.ellipsis;\n          }\n\n          textWidth = this.wordWidth(buffer);\n        }\n\n        if (bk.required) {\n          if (w > this.spaceLeft) {\n            emitLine();\n            buffer = word;\n            textWidth = w;\n            wc = 1;\n          }\n\n          this.emit('lastLine', options, this);\n        }\n\n        // Previous entry is a soft hyphen - add visible hyphen.\n        if (buffer[buffer.length - 1] == SOFT_HYPHEN) {\n          buffer = buffer.slice(0, -1) + HYPHEN;\n          this.spaceLeft -= this.wordWidth(HYPHEN);\n        }\n\n        emitLine();\n\n        // if we've reached the edge of the page,\n        // continue on a new page or column\n        if (PDFNumber(this.document.y + lh) > this.maxY) {\n          const shouldContinue = this.nextSection();\n\n          // stop if we reached the maximum height\n          if (!shouldContinue) {\n            wc = 0;\n            buffer = '';\n            return false;\n          }\n        }\n\n        // reset the space left and buffer\n        if (bk.required) {\n          this.spaceLeft = this.lineWidth;\n          buffer = '';\n          textWidth = 0;\n          return (wc = 0);\n        } else {\n          // reset the space left and buffer\n          this.spaceLeft = this.lineWidth - w;\n          buffer = word;\n          textWidth = w;\n          return (wc = 1);\n        }\n      } else {\n        return (this.spaceLeft -= w);\n      }\n    });\n\n    if (wc > 0) {\n      this.emit('lastLine', options, this);\n      emitLine();\n    }\n\n    this.emit('sectionEnd', options, this);\n\n    // if the wrap is set to be continued, save the X position\n    // to start the first line of the next segment at, and reset\n    // the y position\n    if (options.continued === true) {\n      if (lc > 1) {\n        this.continuedX = 0;\n      }\n      this.continuedX += options.textWidth || 0;\n      return (this.document.y = y);\n    } else {\n      return (this.document.x = this.startX);\n    }\n  }\n\n  nextSection(options) {\n    this.emit('sectionEnd', options, this);\n\n    if (++this.column > this.columns) {\n      // if a max height was specified by the user, we're done.\n      // otherwise, the default is to make a new page at the bottom.\n      if (this.height != null) {\n        return false;\n      }\n\n      this.document.continueOnNewPage();\n      this.column = 1;\n      this.startY = this.document.page.margins.top;\n      this.maxY = this.document.page.maxY();\n      this.document.x = this.startX;\n      if (this.document._fillColor) {\n        this.document.fillColor(...this.document._fillColor);\n      }\n      this.emit('pageBreak', options, this);\n    } else {\n      this.document.x += this.lineWidth + this.columnGap;\n      this.document.y = this.startY;\n      this.emit('columnBreak', options, this);\n    }\n\n    this.emit('sectionStart', options, this);\n    return true;\n  }\n}\n\nexport default LineWrapper;\n"
  },
  {
    "path": "packages/pdfkit/src/metadata.js",
    "content": "class PDFMetadata {\n  constructor() {\n    this._metadata = `\n        <?xpacket begin=\"\\ufeff\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>\n            <x:xmpmeta xmlns:x=\"adobe:ns:meta/\">\n                <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n        `;\n  }\n\n  _closeTags() {\n    this._metadata = this._metadata.concat(`\n                </rdf:RDF>\n            </x:xmpmeta>\n        <?xpacket end=\"w\"?>\n        `);\n  }\n\n  append(xml, newline = true) {\n    this._metadata = this._metadata.concat(xml);\n    if (newline) this._metadata = this._metadata.concat('\\n');\n  }\n\n  getXML() {\n    return this._metadata;\n  }\n\n  getLength() {\n    return this._metadata.length;\n  }\n\n  end() {\n    this._closeTags();\n    this._metadata = this._metadata.trim();\n  }\n}\n\nexport default PDFMetadata;\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/acroform.js",
    "content": "const FIELD_FLAGS = {\n  readOnly: 1,\n  required: 2,\n  noExport: 4,\n  multiline: 0x1000,\n  password: 0x2000,\n  toggleToOffButton: 0x4000,\n  radioButton: 0x8000,\n  pushButton: 0x10000,\n  combo: 0x20000,\n  edit: 0x40000,\n  sort: 0x80000,\n  multiSelect: 0x200000,\n  noSpell: 0x400000\n};\nconst FIELD_JUSTIFY = {\n  left: 0,\n  center: 1,\n  right: 2\n};\nconst VALUE_MAP = { value: 'V', defaultValue: 'DV' };\nconst FORMAT_SPECIAL = {\n  zip: '0',\n  zipPlus4: '1',\n  zip4: '1',\n  phone: '2',\n  ssn: '3'\n};\nconst FORMAT_DEFAULT = {\n  number: {\n    nDec: 0,\n    sepComma: false,\n    negStyle: 'MinusBlack',\n    currency: '',\n    currencyPrepend: true\n  },\n  percent: {\n    nDec: 0,\n    sepComma: false\n  }\n};\n\nexport default {\n  /**\n   * Must call if adding AcroForms to a document. Must also call font() before\n   * this method to set the default font.\n   */\n  initForm() {\n    if (!this._font) {\n      throw new Error('Must set a font before calling initForm method');\n    }\n    this._acroform = {\n      fonts: {},\n      defaultFont: this._font.name\n    };\n    this._acroform.fonts[this._font.id] = this._font.ref();\n\n    let data = {\n      Fields: [],\n      NeedAppearances: true,\n      DA: new String(`/${this._font.id} 0 Tf 0 g`),\n      DR: {\n        Font: {}\n      }\n    };\n    data.DR.Font[this._font.id] = this._font.ref();\n    const AcroForm = this.ref(data);\n    this._root.data.AcroForm = AcroForm;\n    return this;\n  },\n\n  /**\n   * Called automatically by document.js\n   */\n  endAcroForm() {\n    if (this._root.data.AcroForm) {\n      if (\n        !Object.keys(this._acroform.fonts).length &&\n        !this._acroform.defaultFont\n      ) {\n        throw new Error('No fonts specified for PDF form');\n      }\n      let fontDict = this._root.data.AcroForm.data.DR.Font;\n      Object.keys(this._acroform.fonts).forEach((name) => {\n        fontDict[name] = this._acroform.fonts[name];\n      });\n      this._root.data.AcroForm.data.Fields.forEach((fieldRef) => {\n        this._endChild(fieldRef);\n      });\n      this._root.data.AcroForm.end();\n    }\n    return this;\n  },\n\n  _endChild(ref) {\n    if (Array.isArray(ref.data.Kids)) {\n      ref.data.Kids.forEach((childRef) => {\n        this._endChild(childRef);\n      });\n      ref.end();\n    }\n    return this;\n  },\n\n  /**\n   * Creates and adds a form field to the document. Form fields are intermediate\n   * nodes in a PDF form that are used to specify form name heirarchy and form\n   * value defaults.\n   * @param {string} name - field name (T attribute in field dictionary)\n   * @param {object} options  - other attributes to include in field dictionary\n   */\n  formField(name, options = {}) {\n    let fieldDict = this._fieldDict(name, null, options);\n    let fieldRef = this.ref(fieldDict);\n    this._addToParent(fieldRef);\n    return fieldRef;\n  },\n\n  /**\n   * Creates and adds a Form Annotation to the document. Form annotations are\n   * called Widget annotations internally within a PDF file.\n   * @param {string} name - form field name (T attribute of widget annotation\n   * dictionary)\n   * @param {number} x\n   * @param {number} y\n   * @param {number} w\n   * @param {number} h\n   * @param {object} options\n   */\n  formAnnotation(name, type, x, y, w, h, options = {}) {\n    let fieldDict = this._fieldDict(name, type, options);\n    fieldDict.Subtype = 'Widget';\n    if (fieldDict.F === undefined) {\n      fieldDict.F = 4; // print the annotation\n    }\n\n    // Add Field annot to page, and get it's ref\n    this.annotate(x, y, w, h, fieldDict);\n    let annotRef = this.page.annotations[this.page.annotations.length - 1];\n\n    return this._addToParent(annotRef);\n  },\n\n  formText(name, x, y, w, h, options = {}) {\n    return this.formAnnotation(name, 'text', x, y, w, h, options);\n  },\n\n  formPushButton(name, x, y, w, h, options = {}) {\n    return this.formAnnotation(name, 'pushButton', x, y, w, h, options);\n  },\n\n  formCombo(name, x, y, w, h, options = {}) {\n    return this.formAnnotation(name, 'combo', x, y, w, h, options);\n  },\n\n  formList(name, x, y, w, h, options = {}) {\n    return this.formAnnotation(name, 'list', x, y, w, h, options);\n  },\n\n  formRadioButton(name, x, y, w, h, options = {}) {\n    return this.formAnnotation(name, 'radioButton', x, y, w, h, options);\n  },\n\n  formCheckbox(name, x, y, w, h, options = {}) {\n    return this.formAnnotation(name, 'checkbox', x, y, w, h, options);\n  },\n\n  _addToParent(fieldRef) {\n    let parent = fieldRef.data.Parent;\n    if (parent) {\n      if (!parent.data.Kids) {\n        parent.data.Kids = [];\n      }\n      parent.data.Kids.push(fieldRef);\n    } else {\n      this._root.data.AcroForm.data.Fields.push(fieldRef);\n    }\n    return this;\n  },\n\n  _fieldDict(name, type, options = {}) {\n    if (!this._acroform) {\n      throw new Error(\n        'Call document.initForm() method before adding form elements to document'\n      );\n    }\n    let opts = Object.assign({}, options);\n    if (type !== null) {\n      opts = this._resolveType(type, options);\n    }\n    opts = this._resolveFlags(opts);\n    opts = this._resolveJustify(opts);\n    opts = this._resolveFont(opts);\n    opts = this._resolveStrings(opts);\n    opts = this._resolveColors(opts);\n    opts = this._resolveFormat(opts);\n    opts.T = new String(name);\n    if (opts.parent) {\n      opts.Parent = opts.parent;\n      delete opts.parent;\n    }\n    return opts;\n  },\n\n  _resolveType(type, opts) {\n    if (type === 'text') {\n      opts.FT = 'Tx';\n    } else if (type === 'pushButton') {\n      opts.FT = 'Btn';\n      opts.pushButton = true;\n    } else if (type === 'radioButton') {\n      opts.FT = 'Btn';\n      opts.radioButton = true;\n    } else if (type === 'checkbox') {\n      opts.FT = 'Btn';\n    } else if (type === 'combo') {\n      opts.FT = 'Ch';\n      opts.combo = true;\n    } else if (type === 'list') {\n      opts.FT = 'Ch';\n    } else {\n      throw new Error(`Invalid form annotation type '${type}'`);\n    }\n    return opts;\n  },\n\n  _resolveFormat(opts) {\n    const f = opts.format;\n    if (f && f.type) {\n      let fnKeystroke;\n      let fnFormat;\n      let params = '';\n      if (FORMAT_SPECIAL[f.type] !== undefined) {\n        fnKeystroke = `AFSpecial_Keystroke`;\n        fnFormat = `AFSpecial_Format`;\n        params = FORMAT_SPECIAL[f.type];\n      } else {\n        let format = f.type.charAt(0).toUpperCase() + f.type.slice(1);\n        fnKeystroke = `AF${format}_Keystroke`;\n        fnFormat = `AF${format}_Format`;\n\n        if (f.type === 'date') {\n          fnKeystroke += 'Ex';\n          params = String(f.param);\n        } else if (f.type === 'time') {\n          params = String(f.param);\n        } else if (f.type === 'number') {\n          let p = Object.assign({}, FORMAT_DEFAULT.number, f);\n          params = String(\n            [\n              String(p.nDec),\n              p.sepComma ? '0' : '1',\n              '\"' + p.negStyle + '\"',\n              'null',\n              '\"' + p.currency + '\"',\n              String(p.currencyPrepend)\n            ].join(',')\n          );\n        } else if (f.type === 'percent') {\n          let p = Object.assign({}, FORMAT_DEFAULT.percent, f);\n          params = String([String(p.nDec), p.sepComma ? '0' : '1'].join(','));\n        }\n      }\n      opts.AA = opts.AA ? opts.AA : {};\n      opts.AA.K = {\n        S: 'JavaScript',\n        JS: new String(`${fnKeystroke}(${params});`)\n      };\n      opts.AA.F = {\n        S: 'JavaScript',\n        JS: new String(`${fnFormat}(${params});`)\n      };\n    }\n    delete opts.format;\n    return opts;\n  },\n\n  _resolveColors(opts) {\n    let color = this._normalizeColor(opts.backgroundColor);\n    if (color) {\n      if (!opts.MK) {\n        opts.MK = {};\n      }\n      opts.MK.BG = color;\n    }\n    color = this._normalizeColor(opts.borderColor);\n    if (color) {\n      if (!opts.MK) {\n        opts.MK = {};\n      }\n      opts.MK.BC = color;\n    }\n    delete opts.backgroundColor;\n    delete opts.borderColor;\n    return opts;\n  },\n\n  _resolveFlags(options) {\n    let result = 0;\n    Object.keys(options).forEach((key) => {\n      if (FIELD_FLAGS[key]) {\n        if (options[key]) {\n          result |= FIELD_FLAGS[key];\n        }\n        delete options[key];\n      }\n    });\n    if (result !== 0) {\n      options.Ff = options.Ff ? options.Ff : 0;\n      options.Ff |= result;\n    }\n    return options;\n  },\n\n  _resolveJustify(options) {\n    let result = 0;\n    if (options.align !== undefined) {\n      if (typeof FIELD_JUSTIFY[options.align] === 'number') {\n        result = FIELD_JUSTIFY[options.align];\n      }\n      delete options.align;\n    }\n    if (result !== 0) {\n      options.Q = result; // default\n    }\n    return options;\n  },\n\n  _resolveFont(options) {\n    // add current font to document-level AcroForm dict if necessary\n    if (this._acroform.fonts[this._font.id] == null) {\n      this._acroform.fonts[this._font.id] = this._font.ref();\n    }\n\n    // add current font to field's resource dict (RD) if not the default acroform font\n    if (this._acroform.defaultFont !== this._font.name) {\n      options.DR = { Font: {} };\n\n      // Get the fontSize option. If not set use auto sizing\n      const fontSize = options.fontSize || 0;\n\n      options.DR.Font[this._font.id] = this._font.ref();\n      options.DA = new String(`/${this._font.id} ${fontSize} Tf 0 g`);\n    }\n    return options;\n  },\n\n  _resolveStrings(options) {\n    let select = [];\n    function appendChoices(a) {\n      if (Array.isArray(a)) {\n        for (let idx = 0; idx < a.length; idx++) {\n          if (typeof a[idx] === 'string') {\n            select.push(new String(a[idx]));\n          } else {\n            select.push(a[idx]);\n          }\n        }\n      }\n    }\n    appendChoices(options.Opt);\n    if (options.select) {\n      appendChoices(options.select);\n      delete options.select;\n    }\n    if (select.length) {\n      options.Opt = select;\n    }\n\n    Object.keys(VALUE_MAP).forEach((key) => {\n      if (options[key] !== undefined) {\n        options[VALUE_MAP[key]] = options[key];\n        delete options[key];\n      }\n    });\n    ['V', 'DV'].forEach((key) => {\n      if (typeof options[key] === 'string') {\n        options[key] = new String(options[key]);\n      }\n    });\n\n    if (options.MK && options.MK.CA) {\n      options.MK.CA = new String(options.MK.CA);\n    }\n    if (options.label) {\n      options.MK = options.MK ? options.MK : {};\n      options.MK.CA = new String(options.label);\n      delete options.label;\n    }\n    return options;\n  }\n};\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/annotations.js",
    "content": "export default {\n  annotate(x, y, w, h, options) {\n    options.Type = 'Annot';\n    options.Rect = this._convertRect(x, y, w, h);\n    options.Border = [0, 0, 0];\n\n    if (options.Subtype === 'Link' && typeof options.F === 'undefined') {\n      options.F = 1 << 2; // Print Annotation Flag\n    }\n\n    if (options.Subtype !== 'Link') {\n      if (options.C == null) {\n        options.C = this._normalizeColor(options.color || [0, 0, 0]);\n      }\n    } // convert colors\n    delete options.color;\n\n    if (typeof options.Dest === 'string') {\n      options.Dest = new String(options.Dest);\n    }\n\n    // Capitalize keys\n    for (let key in options) {\n      const val = options[key];\n      options[key[0].toUpperCase() + key.slice(1)] = val;\n    }\n\n    const ref = this.ref(options);\n    this.page.annotations.push(ref);\n    ref.end();\n    return this;\n  },\n\n  note(x, y, w, h, contents, options = {}) {\n    options.Subtype = 'Text';\n    options.Contents = new String(contents);\n    if (options.Name == null) {\n      options.Name = 'Comment';\n    }\n    if (options.color == null) {\n      options.color = [243, 223, 92];\n    }\n    return this.annotate(x, y, w, h, options);\n  },\n\n  goTo(x, y, w, h, name, options = {}) {\n    options.Subtype = 'Link';\n    options.A = this.ref({\n      S: 'GoTo',\n      D: new String(name)\n    });\n    options.A.end();\n    return this.annotate(x, y, w, h, options);\n  },\n\n  link(x, y, w, h, url, options = {}) {\n    options.Subtype = 'Link';\n\n    if (typeof url === 'number') {\n      // Link to a page in the document (the page must already exist)\n      const pages = this._root.data.Pages.data;\n      if (url >= 0 && url < pages.Kids.length) {\n        options.A = this.ref({\n          S: 'GoTo',\n          D: [pages.Kids[url], 'XYZ', null, null, null]\n        });\n        options.A.end();\n      } else {\n        throw new Error(`The document has no page ${url}`);\n      }\n    } else {\n      // Link to an external url\n      options.A = this.ref({\n        S: 'URI',\n        URI: new String(url)\n      });\n      options.A.end();\n    }\n\n    return this.annotate(x, y, w, h, options);\n  },\n\n  _markup(x, y, w, h, options = {}) {\n    const [x1, y1, x2, y2] = this._convertRect(x, y, w, h);\n    options.QuadPoints = [x1, y2, x2, y2, x1, y1, x2, y1];\n    options.Contents = new String();\n    return this.annotate(x, y, w, h, options);\n  },\n\n  highlight(x, y, w, h, options = {}) {\n    options.Subtype = 'Highlight';\n    if (options.color == null) {\n      options.color = [241, 238, 148];\n    }\n    return this._markup(x, y, w, h, options);\n  },\n\n  underline(x, y, w, h, options = {}) {\n    options.Subtype = 'Underline';\n    return this._markup(x, y, w, h, options);\n  },\n\n  strike(x, y, w, h, options = {}) {\n    options.Subtype = 'StrikeOut';\n    return this._markup(x, y, w, h, options);\n  },\n\n  lineAnnotation(x1, y1, x2, y2, options = {}) {\n    options.Subtype = 'Line';\n    options.Contents = new String();\n    options.L = [x1, this.page.height - y1, x2, this.page.height - y2];\n    return this.annotate(x1, y1, x2, y2, options);\n  },\n\n  rectAnnotation(x, y, w, h, options = {}) {\n    options.Subtype = 'Square';\n    options.Contents = new String();\n    return this.annotate(x, y, w, h, options);\n  },\n\n  ellipseAnnotation(x, y, w, h, options = {}) {\n    options.Subtype = 'Circle';\n    options.Contents = new String();\n    return this.annotate(x, y, w, h, options);\n  },\n\n  textAnnotation(x, y, w, h, text, options = {}) {\n    options.Subtype = 'FreeText';\n    options.Contents = new String(text);\n    options.DA = new String();\n    return this.annotate(x, y, w, h, options);\n  },\n\n  fileAnnotation(x, y, w, h, file = {}, options = {}) {\n    // create hidden file\n    const filespec = this.file(file.src, Object.assign({ hidden: true }, file));\n\n    options.Subtype = 'FileAttachment';\n    options.FS = filespec;\n\n    // add description from filespec unless description (Contents) has already been set\n    if (options.Contents) {\n      options.Contents = new String(options.Contents);\n    } else if (filespec.data.Desc) {\n      options.Contents = filespec.data.Desc;\n    }\n\n    return this.annotate(x, y, w, h, options);\n  },\n\n  _convertRect(x1, y1, w, h) {\n    // flip y1 and y2\n    let y2 = y1;\n    y1 += h;\n\n    // make x2\n    let x2 = x1 + w;\n\n    // apply current transformation matrix to points\n    const [m0, m1, m2, m3, m4, m5] = this._ctm;\n    x1 = m0 * x1 + m2 * y1 + m4;\n    y1 = m1 * x1 + m3 * y1 + m5;\n    x2 = m0 * x2 + m2 * y2 + m4;\n    y2 = m1 * x2 + m3 * y2 + m5;\n\n    return [x1, y1, x2, y2];\n  }\n};\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/attachments.js",
    "content": "import fs from 'fs';\nimport CryptoJS from 'crypto-js';\n\nexport default {\n  /**\n   * Embed contents of `src` in PDF\n   * @param {Buffer | ArrayBuffer | string} src input Buffer, ArrayBuffer, base64 encoded string or path to file\n   * @param {object} options\n   *  * options.name: filename to be shown in PDF, will use `src` if none set\n   *  * options.type: filetype to be shown in PDF\n   *  * options.description: description to be shown in PDF\n   *  * options.hidden: if true, do not add attachment to EmbeddedFiles dictionary. Useful for file attachment annotations\n   *  * options.creationDate: override creation date\n   *  * options.modifiedDate: override modified date\n   *  * options.relationship: Relationship between the PDF document and its attached file. Can be 'Alternative', 'Data', 'Source', 'Supplement' or 'Unspecified'.\n   * @returns filespec reference\n   */\n  file(src, options = {}) {\n    options.name = options.name || src;\n    options.relationship = options.relationship || 'Unspecified';\n\n    const refBody = {\n      Type: 'EmbeddedFile',\n      Params: {}\n    };\n    let data;\n\n    if (!src) {\n      throw new Error('No src specified');\n    }\n    if (Buffer.isBuffer(src)) {\n      data = src;\n    } else if (src instanceof ArrayBuffer) {\n      data = Buffer.from(new Uint8Array(src));\n    } else {\n      let match;\n      if ((match = /^data:(.*?);base64,(.*)$/.exec(src))) {\n        if (match[1]) {\n          refBody.Subtype = match[1].replace('/', '#2F');\n        }\n        data = Buffer.from(match[2], 'base64');\n      } else {\n        data = fs.readFileSync(src);\n        if (!data) {\n          throw new Error(`Could not read contents of file at filepath ${src}`);\n        }\n\n        // update CreationDate and ModDate\n        const { birthtime, ctime } = fs.statSync(src);\n        refBody.Params.CreationDate = birthtime;\n        refBody.Params.ModDate = ctime;\n      }\n    }\n\n    // override creation date and modified date\n    if (options.creationDate instanceof Date) {\n      refBody.Params.CreationDate = options.creationDate;\n    }\n    if (options.modifiedDate instanceof Date) {\n      refBody.Params.ModDate = options.modifiedDate;\n    }\n    // add optional subtype\n    if (options.type) {\n      refBody.Subtype = options.type.replace('/', '#2F');\n    }\n\n    // add checksum and size information\n    const checksum = CryptoJS.MD5(\n      CryptoJS.lib.WordArray.create(new Uint8Array(data))\n    );\n    refBody.Params.CheckSum = new String(checksum);\n    refBody.Params.Size = data.byteLength;\n\n    // save some space when embedding the same file again\n    // if a file with the same name and metadata exists, reuse its reference\n    let ref;\n    if (!this._fileRegistry) this._fileRegistry = {};\n    let file = this._fileRegistry[options.name];\n    if (file && isEqual(refBody, file)) {\n      ref = file.ref;\n    } else {\n      ref = this.ref(refBody);\n      ref.end(data);\n\n      this._fileRegistry[options.name] = { ...refBody, ref };\n    }\n    // add filespec for embedded file\n    const fileSpecBody = {\n      Type: 'Filespec',\n      AFRelationship: options.relationship,\n      F: new String(options.name),\n      EF: { F: ref },\n      UF: new String(options.name)\n    };\n    if (options.description) {\n      fileSpecBody.Desc = new String(options.description);\n    }\n    const filespec = this.ref(fileSpecBody);\n    filespec.end();\n\n    if (!options.hidden) {\n      this.addNamedEmbeddedFile(options.name, filespec);\n    }\n\n    // Add file to the catalogue to be PDF/A3 compliant\n    if (this._root.data.AF) {\n      this._root.data.AF.push(filespec);\n    } else {\n      this._root.data.AF = [filespec];\n    }\n\n    return filespec;\n  }\n};\n\n/** check two embedded file metadata objects for equality */\nfunction isEqual(a, b) {\n  return (\n    a.Subtype === b.Subtype &&\n    a.Params.CheckSum.toString() === b.Params.CheckSum.toString() &&\n    a.Params.Size === b.Params.Size &&\n    a.Params.CreationDate.getTime() === b.Params.CreationDate.getTime() &&\n    ((a.Params.ModDate === undefined && b.Params.ModDate === undefined) ||\n      a.Params.ModDate.getTime() === b.Params.ModDate.getTime())\n  );\n}\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/color.js",
    "content": "import Gradient from '../gradient';\nimport pattern from '../pattern';\nimport SpotColor from '../spotcolor';\n\nconst { PDFGradient, PDFLinearGradient, PDFRadialGradient } = Gradient;\nconst { PDFTilingPattern } = pattern;\n\nexport default {\n  initColor() {\n    this.spotColors = {};\n    // The opacity dictionaries\n    this._opacityRegistry = {};\n    this._opacityCount = 0;\n    this._patternCount = 0;\n    return (this._gradCount = 0);\n  },\n\n  _normalizeColor(color) {\n    if (typeof color === 'string') {\n      if (color.charAt(0) === '#') {\n        if (color.length === 4) {\n          color = color.replace(\n            /#([0-9A-F])([0-9A-F])([0-9A-F])/i,\n            '#$1$1$2$2$3$3'\n          );\n        }\n        const hex = parseInt(color.slice(1), 16);\n        color = [hex >> 16, (hex >> 8) & 0xff, hex & 0xff];\n      } else if (namedColors[color]) {\n        color = namedColors[color];\n      } else if (this.spotColors[color]) {\n        return this.spotColors[color];\n      }\n    }\n\n    if (Array.isArray(color)) {\n      // RGB\n      if (color.length === 3) {\n        color = color.map((part) => part / 255);\n        // CMYK\n      } else if (color.length === 4) {\n        color = color.map((part) => part / 100);\n      }\n      return color;\n    }\n\n    return null;\n  },\n\n  _setColor(color, stroke) {\n    if (color instanceof PDFGradient) {\n      color.apply(stroke);\n      return true;\n      // see if tiling pattern, decode & apply it it\n    } else if (Array.isArray(color) && color[0] instanceof PDFTilingPattern) {\n      color[0].apply(stroke, color[1]);\n      return true;\n    }\n    // any other case should be a normal color and not a pattern\n    return this._setColorCore(color, stroke);\n  },\n\n  _setColorCore(color, stroke) {\n    color = this._normalizeColor(color);\n    if (!color) {\n      return false;\n    }\n\n    const op = stroke ? 'SCN' : 'scn';\n    const space = this._getColorSpace(color);\n    this._setColorSpace(space, stroke);\n\n    if (color instanceof SpotColor) {\n      this.page.colorSpaces[color.id] = color.ref;\n      this.addContent(`1 ${op}`);\n    } else {\n      this.addContent(`${color.join(' ')} ${op}`);\n    }\n\n    return true;\n  },\n\n  _setColorSpace(space, stroke) {\n    const op = stroke ? 'CS' : 'cs';\n    return this.addContent(`/${space} ${op}`);\n  },\n\n  _getColorSpace(color) {\n    if (color instanceof SpotColor) {\n      return color.id;\n    }\n\n    return color.length === 4 ? 'DeviceCMYK' : 'DeviceRGB';\n  },\n\n  fillColor(color, opacity) {\n    const set = this._setColor(color, false);\n    if (set) {\n      this.fillOpacity(opacity);\n    }\n\n    // save this for text wrapper, which needs to reset\n    // the fill color on new pages\n    this._fillColor = [color, opacity];\n    return this;\n  },\n\n  strokeColor(color, opacity) {\n    const set = this._setColor(color, true);\n    if (set) {\n      this.strokeOpacity(opacity);\n    }\n    return this;\n  },\n\n  opacity(opacity) {\n    this._doOpacity(opacity, opacity);\n    return this;\n  },\n\n  fillOpacity(opacity) {\n    this._doOpacity(opacity, null);\n    return this;\n  },\n\n  strokeOpacity(opacity) {\n    this._doOpacity(null, opacity);\n    return this;\n  },\n\n  _doOpacity(fillOpacity, strokeOpacity) {\n    let dictionary, name;\n    if (fillOpacity == null && strokeOpacity == null) {\n      return;\n    }\n\n    if (fillOpacity != null) {\n      fillOpacity = Math.max(0, Math.min(1, fillOpacity));\n    }\n    if (strokeOpacity != null) {\n      strokeOpacity = Math.max(0, Math.min(1, strokeOpacity));\n    }\n    const key = `${fillOpacity}_${strokeOpacity}`;\n\n    if (this._opacityRegistry[key]) {\n      [dictionary, name] = this._opacityRegistry[key];\n    } else {\n      dictionary = { Type: 'ExtGState' };\n\n      if (fillOpacity != null) {\n        dictionary.ca = fillOpacity;\n      }\n      if (strokeOpacity != null) {\n        dictionary.CA = strokeOpacity;\n      }\n\n      dictionary = this.ref(dictionary);\n      dictionary.end();\n      const id = ++this._opacityCount;\n      name = `Gs${id}`;\n      this._opacityRegistry[key] = [dictionary, name];\n    }\n\n    this.page.ext_gstates[name] = dictionary;\n    return this.addContent(`/${name} gs`);\n  },\n\n  linearGradient(x1, y1, x2, y2) {\n    return new PDFLinearGradient(this, x1, y1, x2, y2);\n  },\n\n  radialGradient(x1, y1, r1, x2, y2, r2) {\n    return new PDFRadialGradient(this, x1, y1, r1, x2, y2, r2);\n  },\n\n  pattern(bbox, xStep, yStep, stream) {\n    return new PDFTilingPattern(this, bbox, xStep, yStep, stream);\n  },\n\n  addSpotColor(name, C, M, Y, K) {\n    const color = new SpotColor(this, name, C, M, Y, K);\n    this.spotColors[name] = color;\n    return this;\n  }\n};\n\nvar namedColors = {\n  aliceblue: [240, 248, 255],\n  antiquewhite: [250, 235, 215],\n  aqua: [0, 255, 255],\n  aquamarine: [127, 255, 212],\n  azure: [240, 255, 255],\n  beige: [245, 245, 220],\n  bisque: [255, 228, 196],\n  black: [0, 0, 0],\n  blanchedalmond: [255, 235, 205],\n  blue: [0, 0, 255],\n  blueviolet: [138, 43, 226],\n  brown: [165, 42, 42],\n  burlywood: [222, 184, 135],\n  cadetblue: [95, 158, 160],\n  chartreuse: [127, 255, 0],\n  chocolate: [210, 105, 30],\n  coral: [255, 127, 80],\n  cornflowerblue: [100, 149, 237],\n  cornsilk: [255, 248, 220],\n  crimson: [220, 20, 60],\n  cyan: [0, 255, 255],\n  darkblue: [0, 0, 139],\n  darkcyan: [0, 139, 139],\n  darkgoldenrod: [184, 134, 11],\n  darkgray: [169, 169, 169],\n  darkgreen: [0, 100, 0],\n  darkgrey: [169, 169, 169],\n  darkkhaki: [189, 183, 107],\n  darkmagenta: [139, 0, 139],\n  darkolivegreen: [85, 107, 47],\n  darkorange: [255, 140, 0],\n  darkorchid: [153, 50, 204],\n  darkred: [139, 0, 0],\n  darksalmon: [233, 150, 122],\n  darkseagreen: [143, 188, 143],\n  darkslateblue: [72, 61, 139],\n  darkslategray: [47, 79, 79],\n  darkslategrey: [47, 79, 79],\n  darkturquoise: [0, 206, 209],\n  darkviolet: [148, 0, 211],\n  deeppink: [255, 20, 147],\n  deepskyblue: [0, 191, 255],\n  dimgray: [105, 105, 105],\n  dimgrey: [105, 105, 105],\n  dodgerblue: [30, 144, 255],\n  firebrick: [178, 34, 34],\n  floralwhite: [255, 250, 240],\n  forestgreen: [34, 139, 34],\n  fuchsia: [255, 0, 255],\n  gainsboro: [220, 220, 220],\n  ghostwhite: [248, 248, 255],\n  gold: [255, 215, 0],\n  goldenrod: [218, 165, 32],\n  gray: [128, 128, 128],\n  grey: [128, 128, 128],\n  green: [0, 128, 0],\n  greenyellow: [173, 255, 47],\n  honeydew: [240, 255, 240],\n  hotpink: [255, 105, 180],\n  indianred: [205, 92, 92],\n  indigo: [75, 0, 130],\n  ivory: [255, 255, 240],\n  khaki: [240, 230, 140],\n  lavender: [230, 230, 250],\n  lavenderblush: [255, 240, 245],\n  lawngreen: [124, 252, 0],\n  lemonchiffon: [255, 250, 205],\n  lightblue: [173, 216, 230],\n  lightcoral: [240, 128, 128],\n  lightcyan: [224, 255, 255],\n  lightgoldenrodyellow: [250, 250, 210],\n  lightgray: [211, 211, 211],\n  lightgreen: [144, 238, 144],\n  lightgrey: [211, 211, 211],\n  lightpink: [255, 182, 193],\n  lightsalmon: [255, 160, 122],\n  lightseagreen: [32, 178, 170],\n  lightskyblue: [135, 206, 250],\n  lightslategray: [119, 136, 153],\n  lightslategrey: [119, 136, 153],\n  lightsteelblue: [176, 196, 222],\n  lightyellow: [255, 255, 224],\n  lime: [0, 255, 0],\n  limegreen: [50, 205, 50],\n  linen: [250, 240, 230],\n  magenta: [255, 0, 255],\n  maroon: [128, 0, 0],\n  mediumaquamarine: [102, 205, 170],\n  mediumblue: [0, 0, 205],\n  mediumorchid: [186, 85, 211],\n  mediumpurple: [147, 112, 219],\n  mediumseagreen: [60, 179, 113],\n  mediumslateblue: [123, 104, 238],\n  mediumspringgreen: [0, 250, 154],\n  mediumturquoise: [72, 209, 204],\n  mediumvioletred: [199, 21, 133],\n  midnightblue: [25, 25, 112],\n  mintcream: [245, 255, 250],\n  mistyrose: [255, 228, 225],\n  moccasin: [255, 228, 181],\n  navajowhite: [255, 222, 173],\n  navy: [0, 0, 128],\n  oldlace: [253, 245, 230],\n  olive: [128, 128, 0],\n  olivedrab: [107, 142, 35],\n  orange: [255, 165, 0],\n  orangered: [255, 69, 0],\n  orchid: [218, 112, 214],\n  palegoldenrod: [238, 232, 170],\n  palegreen: [152, 251, 152],\n  paleturquoise: [175, 238, 238],\n  palevioletred: [219, 112, 147],\n  papayawhip: [255, 239, 213],\n  peachpuff: [255, 218, 185],\n  peru: [205, 133, 63],\n  pink: [255, 192, 203],\n  plum: [221, 160, 221],\n  powderblue: [176, 224, 230],\n  purple: [128, 0, 128],\n  red: [255, 0, 0],\n  rosybrown: [188, 143, 143],\n  royalblue: [65, 105, 225],\n  saddlebrown: [139, 69, 19],\n  salmon: [250, 128, 114],\n  sandybrown: [244, 164, 96],\n  seagreen: [46, 139, 87],\n  seashell: [255, 245, 238],\n  sienna: [160, 82, 45],\n  silver: [192, 192, 192],\n  skyblue: [135, 206, 235],\n  slateblue: [106, 90, 205],\n  slategray: [112, 128, 144],\n  slategrey: [112, 128, 144],\n  snow: [255, 250, 250],\n  springgreen: [0, 255, 127],\n  steelblue: [70, 130, 180],\n  tan: [210, 180, 140],\n  teal: [0, 128, 128],\n  thistle: [216, 191, 216],\n  tomato: [255, 99, 71],\n  turquoise: [64, 224, 208],\n  violet: [238, 130, 238],\n  wheat: [245, 222, 179],\n  white: [255, 255, 255],\n  whitesmoke: [245, 245, 245],\n  yellow: [255, 255, 0],\n  yellowgreen: [154, 205, 50]\n};\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/fonts.js",
    "content": "import PDFFont from '../font';\n\nexport default {\n  initFonts() {\n    // Lookup table for embedded fonts\n    this._fontFamilies = {};\n    this._fontCount = 0;\n\n    // Font state\n    this._fontSize = 12;\n    this._font = null;\n\n    this._registeredFonts = {};\n\n    // Set the default font\n    return this.font('Helvetica');\n  },\n\n  font(src, family, size) {\n    let cacheKey;\n    let font;\n    if (typeof family === 'number') {\n      size = family;\n      family = null;\n    }\n\n    // check registered fonts if src is a string\n    if (typeof src === 'string' && this._registeredFonts[src]) {\n      cacheKey = src;\n      ({ src, family } = this._registeredFonts[src]);\n    } else {\n      cacheKey = family || src;\n      if (typeof cacheKey !== 'string') {\n        cacheKey = null;\n      }\n    }\n\n    if (size != null) {\n      this.fontSize(size);\n    }\n\n    // fast path: check if the font is already in the PDF\n    if ((font = this._fontFamilies[cacheKey])) {\n      this._font = font;\n      return this;\n    }\n\n    // load the font\n    const id = `F${++this._fontCount}`;\n    this._font = PDFFont.open(this, src, family, id);\n\n    // check for existing font familes with the same name already in the PDF\n    // useful if the font was passed as a buffer\n    if ((font = this._fontFamilies[this._font.name])) {\n      this._font = font;\n      return this;\n    }\n\n    // save the font for reuse later\n    if (cacheKey) {\n      this._fontFamilies[cacheKey] = this._font;\n    }\n\n    if (this._font.name) {\n      this._fontFamilies[this._font.name] = this._font;\n    }\n\n    return this;\n  },\n\n  fontSize(_fontSize) {\n    this._fontSize = _fontSize;\n    return this;\n  },\n\n  currentLineHeight(includeGap) {\n    if (includeGap == null) {\n      includeGap = false;\n    }\n    return this._font.lineHeight(this._fontSize, includeGap);\n  },\n\n  registerFont(name, src, family) {\n    this._registeredFonts[name] = {\n      src,\n      family\n    };\n\n    return this;\n  }\n};\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/images.js",
    "content": "import PDFImage from '../image';\n\nexport default {\n  initImages() {\n    this._imageRegistry = {};\n    return (this._imageCount = 0);\n  },\n\n  image(src, x, y, options = {}) {\n    let bh, bp, bw, image, ip, left, left1, rotateAngle, originX, originY;\n    if (typeof x === 'object') {\n      options = x;\n      x = null;\n    }\n\n    // Ignore orientation based on document options or image options\n    const ignoreOrientation =\n      options.ignoreOrientation ||\n      (options.ignoreOrientation !== false && this.options.ignoreOrientation);\n\n    x = (left = x != null ? x : options.x) != null ? left : this.x;\n    y = (left1 = y != null ? y : options.y) != null ? left1 : this.y;\n\n    if (typeof src === 'string') {\n      image = this._imageRegistry[src];\n    }\n\n    if (!image) {\n      if (src.width && src.height) {\n        image = src;\n      } else {\n        image = this.openImage(src);\n      }\n    }\n\n    if (!image.obj) {\n      image.embed(this);\n    }\n\n    if (this.page.xobjects[image.label] == null) {\n      this.page.xobjects[image.label] = image.obj;\n    }\n\n    let { width, height } = image;\n\n    // If EXIF orientation calls for it, swap width and height\n    if (!ignoreOrientation && image.orientation > 4) {\n      [width, height] = [height, width];\n    }\n\n    let w = options.width || width;\n    let h = options.height || height;\n\n    if (options.width && !options.height) {\n      const wp = w / width;\n      w = width * wp;\n      h = height * wp;\n    } else if (options.height && !options.width) {\n      const hp = h / height;\n      w = width * hp;\n      h = height * hp;\n    } else if (options.scale) {\n      w = width * options.scale;\n      h = height * options.scale;\n    } else if (options.fit) {\n      [bw, bh] = options.fit;\n      bp = bw / bh;\n      ip = width / height;\n      if (ip > bp) {\n        w = bw;\n        h = bw / ip;\n      } else {\n        h = bh;\n        w = bh * ip;\n      }\n    } else if (options.cover) {\n      [bw, bh] = options.cover;\n      bp = bw / bh;\n      ip = width / height;\n      if (ip > bp) {\n        h = bh;\n        w = bh * ip;\n      } else {\n        w = bw;\n        h = bw / ip;\n      }\n    }\n\n    if (options.fit || options.cover) {\n      if (options.align === 'center') {\n        x = x + bw / 2 - w / 2;\n      } else if (options.align === 'right') {\n        x = x + bw - w;\n      }\n\n      if (options.valign === 'center') {\n        y = y + bh / 2 - h / 2;\n      } else if (options.valign === 'bottom') {\n        y = y + bh - h;\n      }\n    }\n\n    if (!ignoreOrientation) {\n      switch (image.orientation) {\n        // No orientation (need to flip image, though, because of the default transform matrix on the document)\n        default:\n        case 1:\n          h = -h;\n          y -= h;\n\n          rotateAngle = 0;\n          break;\n        // Flip Horizontal\n        case 2:\n          w = -w;\n          h = -h;\n          x -= w;\n          y -= h;\n\n          rotateAngle = 0;\n          break;\n        // Rotate 180 degrees\n        case 3:\n          originX = x;\n          originY = y;\n\n          h = -h;\n          x -= w;\n\n          rotateAngle = 180;\n          break;\n        // Flip vertical\n        case 4:\n          // Do nothing, image will be flipped\n\n          break;\n        // Flip horizontally and rotate 270 degrees CW\n        case 5:\n          originX = x;\n          originY = y;\n\n          [w, h] = [h, w];\n          y -= h;\n\n          rotateAngle = 90;\n          break;\n        // Rotate 90 degrees CW\n        case 6:\n          originX = x;\n          originY = y;\n\n          [w, h] = [h, w];\n          h = -h;\n\n          rotateAngle = 90;\n          break;\n        // Flip horizontally and rotate 90 degrees CW\n        case 7:\n          originX = x;\n          originY = y;\n\n          [w, h] = [h, w];\n          h = -h;\n          w = -w;\n          x -= w;\n\n          rotateAngle = 90;\n          break;\n        // Rotate 270 degrees CW\n        case 8:\n          originX = x;\n          originY = y;\n\n          [w, h] = [h, w];\n          h = -h;\n          x -= w;\n          y -= h;\n\n          rotateAngle = -90;\n          break;\n      }\n    } else {\n      h = -h;\n      y -= h;\n      rotateAngle = 0;\n    }\n\n    // create link annotations if the link option is given\n    if (options.link != null) {\n      this.link(x, y, w, h, options.link);\n    }\n    if (options.goTo != null) {\n      this.goTo(x, y, w, h, options.goTo);\n    }\n    if (options.destination != null) {\n      this.addNamedDestination(options.destination, 'XYZ', x, y, null);\n    }\n\n    // Set the current y position to below the image if it is in the document flow\n    if (this.y === y) {\n      this.y += h;\n    }\n\n    this.save();\n\n    if (rotateAngle) {\n      this.rotate(rotateAngle, {\n        origin: [originX, originY]\n      });\n    }\n\n    this.transform(w, 0, 0, h, x, y);\n    this.addContent(`/${image.label} Do`);\n    this.restore();\n\n    return this;\n  },\n\n  openImage(src) {\n    let image;\n    if (typeof src === 'string') {\n      image = this._imageRegistry[src];\n    }\n\n    if (!image) {\n      image = PDFImage.open(src, `I${++this._imageCount}`);\n      if (typeof src === 'string') {\n        this._imageRegistry[src] = image;\n      }\n    }\n\n    return image;\n  }\n};\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/markings.js",
    "content": "/*\nMarkings mixin - support marked content sequences in content streams\nBy Ben Schmidt\n*/\n\nimport PDFStructureElement from '../structure_element';\nimport PDFStructureContent from '../structure_content';\nimport PDFNumberTree from '../number_tree';\nimport PDFObject from '../object';\n\nexport default {\n  initMarkings(options) {\n    this.structChildren = [];\n\n    if (options.tagged) {\n      this.getMarkInfoDictionary().data.Marked = true;\n      this.getStructTreeRoot();\n    }\n  },\n\n  markContent(tag, options = null) {\n    if (tag === 'Artifact' || (options && options.mcid)) {\n      let toClose = 0;\n      this.page.markings.forEach((marking) => {\n        if (toClose || marking.structContent || marking.tag === 'Artifact') {\n          toClose++;\n        }\n      });\n      while (toClose--) {\n        this.endMarkedContent();\n      }\n    }\n\n    if (!options) {\n      this.page.markings.push({ tag });\n      this.addContent(`/${tag} BMC`);\n      return this;\n    }\n\n    this.page.markings.push({ tag, options });\n\n    const dictionary = {};\n\n    if (typeof options.mcid !== 'undefined') {\n      dictionary.MCID = options.mcid;\n    }\n    if (tag === 'Artifact') {\n      if (typeof options.type === 'string') {\n        dictionary.Type = options.type;\n      }\n      if (Array.isArray(options.bbox)) {\n        dictionary.BBox = [\n          options.bbox[0],\n          this.page.height - options.bbox[3],\n          options.bbox[2],\n          this.page.height - options.bbox[1]\n        ];\n      }\n      if (\n        Array.isArray(options.attached) &&\n        options.attached.every((val) => typeof val === 'string')\n      ) {\n        dictionary.Attached = options.attached;\n      }\n    }\n    if (tag === 'Span') {\n      if (options.lang) {\n        dictionary.Lang = new String(options.lang);\n      }\n      if (options.alt) {\n        dictionary.Alt = new String(options.alt);\n      }\n      if (options.expanded) {\n        dictionary.E = new String(options.expanded);\n      }\n      if (options.actual) {\n        dictionary.ActualText = new String(options.actual);\n      }\n    }\n\n    this.addContent(`/${tag} ${PDFObject.convert(dictionary)} BDC`);\n    return this;\n  },\n\n  markStructureContent(tag, options = {}) {\n    const pageStructParents = this.getStructParentTree().get(\n      this.page.structParentTreeKey\n    );\n    const mcid = pageStructParents.length;\n    pageStructParents.push(null);\n\n    this.markContent(tag, { ...options, mcid });\n\n    const structContent = new PDFStructureContent(this.page.dictionary, mcid);\n    this.page.markings.slice(-1)[0].structContent = structContent;\n    return structContent;\n  },\n\n  endMarkedContent() {\n    this.page.markings.pop();\n    this.addContent('EMC');\n    return this;\n  },\n\n  struct(type, options = {}, children = null) {\n    return new PDFStructureElement(this, type, options, children);\n  },\n\n  addStructure(structElem) {\n    const structTreeRoot = this.getStructTreeRoot();\n    structElem.setParent(structTreeRoot);\n    structElem.setAttached();\n    this.structChildren.push(structElem);\n    if (!structTreeRoot.data.K) {\n      structTreeRoot.data.K = [];\n    }\n    structTreeRoot.data.K.push(structElem.dictionary);\n    return this;\n  },\n\n  initPageMarkings(pageMarkings) {\n    pageMarkings.forEach((marking) => {\n      if (marking.structContent) {\n        const structContent = marking.structContent;\n        const newStructContent = this.markStructureContent(\n          marking.tag,\n          marking.options\n        );\n        structContent.push(newStructContent);\n        this.page.markings.slice(-1)[0].structContent = structContent;\n      } else {\n        this.markContent(marking.tag, marking.options);\n      }\n    });\n  },\n\n  endPageMarkings(page) {\n    const pageMarkings = page.markings;\n    pageMarkings.forEach(() => page.write('EMC'));\n    page.markings = [];\n    return pageMarkings;\n  },\n\n  getMarkInfoDictionary() {\n    if (!this._root.data.MarkInfo) {\n      this._root.data.MarkInfo = this.ref({});\n    }\n    return this._root.data.MarkInfo;\n  },\n\n  hasMarkInfoDictionary() {\n    return !!this._root.data.MarkInfo;\n  },\n\n  getStructTreeRoot() {\n    if (!this._root.data.StructTreeRoot) {\n      this._root.data.StructTreeRoot = this.ref({\n        Type: 'StructTreeRoot',\n        ParentTree: new PDFNumberTree(),\n        ParentTreeNextKey: 0\n      });\n    }\n    return this._root.data.StructTreeRoot;\n  },\n\n  getStructParentTree() {\n    return this.getStructTreeRoot().data.ParentTree;\n  },\n\n  createStructParentTreeNextKey() {\n    // initialise the MarkInfo dictionary\n    this.getMarkInfoDictionary();\n\n    const structTreeRoot = this.getStructTreeRoot();\n    const key = structTreeRoot.data.ParentTreeNextKey++;\n    structTreeRoot.data.ParentTree.add(key, []);\n    return key;\n  },\n\n  endMarkings() {\n    const structTreeRoot = this._root.data.StructTreeRoot;\n    if (structTreeRoot) {\n      structTreeRoot.end();\n      this.structChildren.forEach((structElem) => structElem.end());\n    }\n    if (this._root.data.MarkInfo) {\n      this._root.data.MarkInfo.end();\n    }\n  }\n};\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/metadata.js",
    "content": "import PDFMetadata from '../metadata';\n\nexport default {\n  initMetadata() {\n    this.metadata = new PDFMetadata();\n  },\n\n  appendXML(xml, newline = true) {\n    this.metadata.append(xml, newline);\n  },\n\n  _addInfo() {\n    this.appendXML(`\n        <rdf:Description rdf:about=\"\" xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\">\n            <xmp:CreateDate>${this.info.CreationDate.toISOString().split('.')[0] + 'Z'}</xmp:CreateDate>\n            <xmp:CreatorTool>${this.info.Creator}</xmp:CreatorTool>\n        </rdf:Description>\n        `);\n\n    if (this.info.Title || this.info.Author || this.info.Subject) {\n      this.appendXML(`\n            <rdf:Description rdf:about=\"\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n            `);\n\n      if (this.info.Title) {\n        this.appendXML(`\n                <dc:title>\n                    <rdf:Alt>\n                        <rdf:li xml:lang=\"x-default\">${this.info.Title}</rdf:li>\n                    </rdf:Alt>\n                </dc:title>\n                `);\n      }\n\n      if (this.info.Author) {\n        this.appendXML(`\n                <dc:creator>\n                    <rdf:Seq>\n                        <rdf:li>${this.info.Author}</rdf:li>\n                    </rdf:Seq>\n                </dc:creator>\n                `);\n      }\n\n      if (this.info.Subject) {\n        this.appendXML(`\n                <dc:description>\n                    <rdf:Alt>\n                        <rdf:li xml:lang=\"x-default\">${this.info.Subject}</rdf:li>\n                    </rdf:Alt>\n                </dc:description>\n                `);\n      }\n\n      this.appendXML(`\n            </rdf:Description>\n            `);\n    }\n\n    this.appendXML(\n      `\n        <rdf:Description rdf:about=\"\" xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\">\n            <pdf:Producer>${this.info.Creator}</pdf:Producer>`,\n      false\n    );\n\n    if (this.info.Keywords) {\n      this.appendXML(\n        `\n            <pdf:Keywords>${this.info.Keywords}</pdf:Keywords>`,\n        false\n      );\n    }\n\n    this.appendXML(`\n        </rdf:Description>\n        `);\n  },\n\n  endMetadata() {\n    this._addInfo();\n\n    this.metadata.end();\n\n    /*\n        Metadata was introduced in PDF 1.4, so adding it to 1.3\n        will likely only take up more space.\n        */\n    if (this.version != 1.3) {\n      this.metadataRef = this.ref({\n        length: this.metadata.getLength(),\n        Type: 'Metadata',\n        Subtype: 'XML'\n      });\n      this.metadataRef.compress = false;\n      this.metadataRef.write(Buffer.from(this.metadata.getXML(), 'utf-8'));\n      this.metadataRef.end();\n      this._root.data.Metadata = this.metadataRef;\n    }\n  }\n};\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/outline.js",
    "content": "import PDFOutline from '../outline';\n\nexport default {\n  initOutline() {\n    return (this.outline = new PDFOutline(this, null, null, null));\n  },\n\n  endOutline() {\n    this.outline.endOutline();\n    if (this.outline.children.length > 0) {\n      this._root.data.Outlines = this.outline.dictionary;\n      /* Custom fork start */\n      return (this._root.data.PageMode = this._root.data.PageMode || 'UseOutlines');\n      /* Custom fork end */\n    }\n  }\n};\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/pdfa.js",
    "content": "import fs from 'fs';\n\nexport default {\n  initPDFA(pSubset) {\n    if (pSubset.charAt(pSubset.length - 3) === '-') {\n      this.subset_conformance = pSubset\n        .charAt(pSubset.length - 1)\n        .toUpperCase();\n      this.subset = parseInt(pSubset.charAt(pSubset.length - 2));\n    } else {\n      // Default to Basic conformance when user doesn't specify\n      this.subset_conformance = 'B';\n      this.subset = parseInt(pSubset.charAt(pSubset.length - 1));\n    }\n  },\n\n  endSubset() {\n    this._addPdfaMetadata();\n    this._addColorOutputIntent();\n  },\n\n  _addColorOutputIntent() {\n    const iccProfile = fs.readFileSync(\n      `${__dirname}/data/sRGB_IEC61966_2_1.icc`\n    );\n\n    const colorProfileRef = this.ref({\n      Length: iccProfile.length,\n      N: 3\n    });\n    colorProfileRef.write(iccProfile);\n    colorProfileRef.end();\n\n    const intentRef = this.ref({\n      Type: 'OutputIntent',\n      S: 'GTS_PDFA1',\n      Info: new String('sRGB IEC61966-2.1'),\n      OutputConditionIdentifier: new String('sRGB IEC61966-2.1'),\n      DestOutputProfile: colorProfileRef\n    });\n    intentRef.end();\n\n    this._root.data.OutputIntents = [intentRef];\n  },\n\n  _getPdfaid() {\n    return `\n        <rdf:Description xmlns:pdfaid=\"http://www.aiim.org/pdfa/ns/id/\" rdf:about=\"\">\n            <pdfaid:part>${this.subset}</pdfaid:part>\n            <pdfaid:conformance>${this.subset_conformance}</pdfaid:conformance>\n        </rdf:Description>\n        `;\n  },\n\n  _addPdfaMetadata() {\n    this.appendXML(this._getPdfaid());\n  }\n};\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/pdfua.js",
    "content": "export default {\n  initPDFUA() {\n    this.subset = 1;\n  },\n\n  endSubset() {\n    this._addPdfuaMetadata();\n  },\n\n  _addPdfuaMetadata() {\n    this.appendXML(this._getPdfuaid());\n  },\n\n  _getPdfuaid() {\n    return `\n        <rdf:Description xmlns:pdfuaid=\"http://www.aiim.org/pdfua/ns/id/\" rdf:about=\"\">\n            <pdfuaid:part>${this.subset}</pdfuaid:part>\n        </rdf:Description>\n        `;\n  }\n};\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/subsets.js",
    "content": "import PDFA from './pdfa';\nimport PDFUA from './pdfua';\n\nexport default {\n  _importSubset(subset) {\n    Object.assign(this, subset);\n  },\n\n  initSubset(options) {\n    switch (options.subset) {\n      case 'PDF/A-1':\n      case 'PDF/A-1a':\n      case 'PDF/A-1b':\n      case 'PDF/A-2':\n      case 'PDF/A-2a':\n      case 'PDF/A-2b':\n      case 'PDF/A-3':\n      case 'PDF/A-3a':\n      case 'PDF/A-3b':\n        this._importSubset(PDFA);\n        this.initPDFA(options.subset);\n        break;\n      case 'PDF/UA':\n        this._importSubset(PDFUA);\n        this.initPDFUA();\n        break;\n    }\n  }\n};\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/text.js",
    "content": "import LineWrapper from '../line_wrapper';\nimport PDFObject from '../object';\nimport { cosine, sine } from '../utils';\n\nconst { number } = PDFObject;\n\nexport default {\n  initText() {\n    this._line = this._line.bind(this);\n\n    // Current coordinates\n    this.x = 0;\n    this.y = 0;\n    return (this._lineGap = 0);\n  },\n\n  lineGap(_lineGap) {\n    this._lineGap = _lineGap;\n    return this;\n  },\n\n  moveDown(lines) {\n    if (lines == null) {\n      lines = 1;\n    }\n    this.y += this.currentLineHeight(true) * lines + this._lineGap;\n    return this;\n  },\n\n  moveUp(lines) {\n    if (lines == null) {\n      lines = 1;\n    }\n    this.y -= this.currentLineHeight(true) * lines + this._lineGap;\n    return this;\n  },\n\n  _text(text, x, y, options, lineCallback) {\n    options = this._initOptions(x, y, options);\n\n    // Convert text to a string\n    text = text == null ? '' : `${text}`;\n\n    // if the wordSpacing option is specified, remove multiple consecutive spaces\n    if (options.wordSpacing) {\n      text = text.replace(/\\s{2,}/g, ' ');\n    }\n\n    const addStructure = () => {\n      if (options.structParent) {\n        options.structParent.add(\n          this.struct(options.structType || 'P', [\n            this.markStructureContent(options.structType || 'P')\n          ])\n        );\n      }\n    };\n\n    // We can save some bytes if there is no rotation\n    if (options.rotation !== 0) {\n      this.save();\n      this.rotate(-options.rotation, { origin: [this.x, this.y] });\n    }\n\n    // word wrapping\n    if (options.width) {\n      let wrapper = this._wrapper;\n      if (!wrapper) {\n        wrapper = new LineWrapper(this, options);\n        wrapper.on('line', lineCallback);\n        wrapper.on('firstLine', addStructure);\n      }\n\n      this._wrapper = options.continued ? wrapper : null;\n      this._textOptions = options.continued ? options : null;\n      wrapper.wrap(text, options);\n\n      // render paragraphs as single lines\n    } else {\n      for (let line of text.split('\\n')) {\n        addStructure();\n        lineCallback(line, options);\n      }\n    }\n\n    // Cleanup if there was a rotation\n    if (options.rotation !== 0) this.restore();\n\n    return this;\n  },\n\n  text(text, x, y, options) {\n    return this._text(text, x, y, options, this._line);\n  },\n\n  widthOfString(string, options = {}) {\n    const horizontalScaling = options.horizontalScaling || 100;\n    return (\n      ((this._font.widthOfString(string, this._fontSize, options.features) +\n        (options.characterSpacing || 0) * (string.length - 1)) *\n        horizontalScaling) /\n      100\n    );\n  },\n\n  /**\n   * Compute the bounding box of a string\n   * based on what will actually be rendered by `doc.text()`\n   *\n   * @param string - The string\n   * @param x - X position of text (defaults to this.x)\n   * @param y - Y position of text (defaults to this.y)\n   * @param options - Any text options (The same you would apply to `doc.text()`)\n   * @returns {{x: number, y: number, width: number, height: number}}\n   */\n  boundsOfString(string, x, y, options) {},\n\n  heightOfString(text, options) {\n    const { x, y } = this;\n\n    options = this._initOptions(options);\n    options.height = Infinity; // don't break pages\n\n    const lineGap = options.lineGap || this._lineGap || 0;\n    this._text(text, this.x, this.y, options, () => {\n      return (this.y += this.currentLineHeight(true) + lineGap);\n    });\n\n    const height = this.y - y;\n    this.x = x;\n    this.y = y;\n\n    return height;\n  },\n\n  list(list, x, y, options, wrapper) {\n    options = this._initOptions(x, y, options);\n\n    const listType = options.listType || 'bullet';\n    const unit = Math.round((this._font.ascender / 1000) * this._fontSize);\n    const midLine = unit / 2;\n    const r = options.bulletRadius || unit / 3;\n    const indent =\n      options.textIndent || (listType === 'bullet' ? r * 5 : unit * 2);\n    const itemIndent =\n      options.bulletIndent || (listType === 'bullet' ? r * 8 : unit * 2);\n\n    let level = 1;\n    const items = [];\n    const levels = [];\n    const numbers = [];\n\n    var flatten = function (list) {\n      let n = 1;\n      for (let i = 0; i < list.length; i++) {\n        const item = list[i];\n        if (Array.isArray(item)) {\n          level++;\n          flatten(item);\n          level--;\n        } else {\n          items.push(item);\n          levels.push(level);\n          if (listType !== 'bullet') {\n            numbers.push(n++);\n          }\n        }\n      }\n    };\n\n    flatten(list);\n\n    const label = function (n) {\n      switch (listType) {\n        case 'numbered':\n          return `${n}.`;\n        case 'lettered':\n          var letter = String.fromCharCode(((n - 1) % 26) + 65);\n          var times = Math.floor((n - 1) / 26 + 1);\n          var text = Array(times + 1).join(letter);\n          return `${text}.`;\n      }\n    };\n\n    const drawListItem = function (listItem, i) {\n      wrapper = new LineWrapper(this, options);\n      wrapper.on('line', this._line);\n\n      level = 1;\n      wrapper.once('firstLine', () => {\n        let item, itemType, labelType, bodyType;\n        if (options.structParent) {\n          if (options.structTypes) {\n            [itemType, labelType, bodyType] = options.structTypes;\n          } else {\n            [itemType, labelType, bodyType] = ['LI', 'Lbl', 'LBody'];\n          }\n        }\n\n        if (itemType) {\n          item = this.struct(itemType);\n          options.structParent.add(item);\n        } else if (options.structParent) {\n          item = options.structParent;\n        }\n\n        let l;\n        if ((l = levels[i++]) !== level) {\n          const diff = itemIndent * (l - level);\n          this.x += diff;\n          wrapper.lineWidth -= diff;\n          level = l;\n        }\n\n        if (item && (labelType || bodyType)) {\n          item.add(\n            this.struct(labelType || bodyType, [\n              this.markStructureContent(labelType || bodyType)\n            ])\n          );\n        }\n        switch (listType) {\n          case 'bullet':\n            this.circle(this.x - indent + r, this.y + midLine, r);\n            this.fill();\n            break;\n          case 'numbered':\n          case 'lettered':\n            var text = label(numbers[i - 1]);\n            this._fragment(text, this.x - indent, this.y, options);\n            break;\n        }\n\n        if (item && labelType && bodyType) {\n          item.add(\n            this.struct(bodyType, [this.markStructureContent(bodyType)])\n          );\n        }\n        if (item && item !== options.structParent) {\n          item.end();\n        }\n      });\n\n      wrapper.on('sectionStart', () => {\n        const pos = indent + itemIndent * (level - 1);\n        this.x += pos;\n        return (wrapper.lineWidth -= pos);\n      });\n\n      wrapper.on('sectionEnd', () => {\n        const pos = indent + itemIndent * (level - 1);\n        this.x -= pos;\n        return (wrapper.lineWidth += pos);\n      });\n\n      wrapper.wrap(listItem, options);\n    };\n\n    for (let i = 0; i < items.length; i++) {\n      drawListItem.call(this, items[i], i);\n    }\n\n    return this;\n  },\n\n  _initOptions(x = {}, y, options = {}) {\n    if (typeof x === 'object') {\n      options = x;\n      x = null;\n    }\n\n    // clone options object\n    const result = Object.assign({}, options);\n\n    // extend options with previous values for continued text\n    if (this._textOptions) {\n      for (let key in this._textOptions) {\n        const val = this._textOptions[key];\n        if (key !== 'continued') {\n          if (result[key] === undefined) {\n            result[key] = val;\n          }\n        }\n      }\n    }\n\n    // Update the current position\n    if (x != null) {\n      this.x = x;\n    }\n    if (y != null) {\n      this.y = y;\n    }\n\n    // wrap to margins if no x or y position passed\n    if (result.lineBreak !== false) {\n      if (result.width == null) {\n        result.width = this.page.width - this.x - this.page.margins.right;\n      }\n      result.width = Math.max(result.width, 0);\n    }\n\n    if (!result.columns) {\n      result.columns = 0;\n    }\n    if (result.columnGap == null) {\n      result.columnGap = 18;\n    } // 1/4 inch\n\n    // Normalize rotation to between 0 - 360\n    result.rotation = Number(options.rotation ?? 0) % 360;\n    if (result.rotation < 0) result.rotation += 360;\n\n    return result;\n  },\n\n  _line(text, options = {}, wrapper) {\n    this._fragment(text, this.x, this.y, options);\n    const lineGap = options.lineGap || this._lineGap || 0;\n\n    if (!wrapper) {\n      return (this.x += this.widthOfString(text, options));\n    } else {\n      return (this.y += this.currentLineHeight(true) + lineGap);\n    }\n  },\n\n  _fragment(text, x, y, options) {\n    let dy, encoded, i, positions, textWidth, words;\n    text = `${text}`.replace(/\\n/g, '');\n    if (text.length === 0) {\n      return;\n    }\n\n    // handle options\n    const align = options.align || 'left';\n    let wordSpacing = options.wordSpacing || 0;\n    const characterSpacing = options.characterSpacing || 0;\n    const horizontalScaling = options.horizontalScaling || 100;\n\n    // text alignments\n    if (options.width) {\n      switch (align) {\n        case 'right':\n          textWidth = this.widthOfString(text.replace(/\\s+$/, ''), options);\n          x += options.lineWidth - textWidth;\n          break;\n\n        case 'center':\n          x += options.lineWidth / 2 - options.textWidth / 2;\n          break;\n\n        case 'justify':\n          // calculate the word spacing value\n          words = text.trim().split(/\\s+/);\n          textWidth = this.widthOfString(text.replace(/\\s+/g, ''), options);\n          var spaceWidth = this.widthOfString(' ') + characterSpacing;\n          wordSpacing = Math.max(\n            0,\n            (options.lineWidth - textWidth) / Math.max(1, words.length - 1) -\n              spaceWidth\n          );\n          break;\n      }\n    }\n\n    // text baseline alignments based on http://wiki.apache.org/xmlgraphics-fop/LineLayout/AlignmentHandling\n    if (typeof options.baseline === 'number') {\n      dy = -options.baseline;\n    } else {\n      switch (options.baseline) {\n        case 'svg-middle':\n          dy = 0.5 * this._font.xHeight;\n          break;\n        case 'middle':\n        case 'svg-central':\n          dy = 0.5 * (this._font.descender + this._font.ascender);\n          break;\n        case 'bottom':\n        case 'ideographic':\n          dy = this._font.descender;\n          break;\n        case 'alphabetic':\n          dy = 0;\n          break;\n        case 'mathematical':\n          dy = 0.5 * this._font.ascender;\n          break;\n        case 'hanging':\n          dy = 0.8 * this._font.ascender;\n          break;\n        case 'top':\n          dy = this._font.ascender;\n          break;\n        default:\n          dy = this._font.ascender;\n      }\n      dy = (dy / 1000) * this._fontSize;\n    }\n\n    // calculate the actual rendered width of the string after word and character spacing\n    const renderedWidth =\n      options.textWidth +\n      wordSpacing * (options.wordCount - 1) +\n      characterSpacing * (text.length - 1);\n\n    // create link annotations if the link option is given\n    if (options.link != null) {\n      this.link(x, y, renderedWidth, this.currentLineHeight(), options.link);\n    }\n    if (options.goTo != null) {\n      this.goTo(x, y, renderedWidth, this.currentLineHeight(), options.goTo);\n    }\n    if (options.destination != null) {\n      this.addNamedDestination(options.destination, 'XYZ', x, y, null);\n    }\n\n    // create underline\n    if (options.underline) {\n      this.save();\n      if (!options.stroke) {\n        this.strokeColor(...(this._fillColor || []));\n      }\n\n      const lineWidth =\n        this._fontSize < 10 ? 0.5 : Math.floor(this._fontSize / 10);\n      this.lineWidth(lineWidth);\n\n      let lineY = y + this.currentLineHeight() - lineWidth;\n      this.moveTo(x, lineY);\n      this.lineTo(x + renderedWidth, lineY);\n      this.stroke();\n      this.restore();\n    }\n\n    // create strikethrough line\n    if (options.strike) {\n      this.save();\n      if (!options.stroke) {\n        this.strokeColor(...(this._fillColor || []));\n      }\n\n      const lineWidth =\n        this._fontSize < 10 ? 0.5 : Math.floor(this._fontSize / 10);\n      this.lineWidth(lineWidth);\n\n      let lineY = y + this.currentLineHeight() / 2;\n      this.moveTo(x, lineY);\n      this.lineTo(x + renderedWidth, lineY);\n      this.stroke();\n      this.restore();\n    }\n\n    this.save();\n\n    // oblique (angle in degrees or boolean)\n    if (options.oblique) {\n      let skew;\n      if (typeof options.oblique === 'number') {\n        skew = -Math.tan((options.oblique * Math.PI) / 180);\n      } else {\n        skew = -0.25;\n      }\n      this.transform(1, 0, 0, 1, x, y);\n      this.transform(1, 0, skew, 1, -skew * dy, 0);\n      this.transform(1, 0, 0, 1, -x, -y);\n    }\n\n    // flip coordinate system\n    this.transform(1, 0, 0, -1, 0, this.page.height);\n    y = this.page.height - y - dy;\n\n    // add current font to page if necessary\n    if (this.page.fonts[this._font.id] == null) {\n      this.page.fonts[this._font.id] = this._font.ref();\n    }\n\n    // begin the text object\n    this.addContent('BT');\n\n    // text position\n    this.addContent(`1 0 0 1 ${number(x)} ${number(y)} Tm`);\n\n    // font and font size\n    this.addContent(`/${this._font.id} ${number(this._fontSize)} Tf`);\n\n    // rendering mode\n    const mode = options.fill && options.stroke ? 2 : options.stroke ? 1 : 0;\n    if (mode) {\n      this.addContent(`${mode} Tr`);\n    }\n\n    // Character spacing\n    if (characterSpacing) {\n      this.addContent(`${number(characterSpacing)} Tc`);\n    }\n\n    // Horizontal scaling\n    if (horizontalScaling !== 100) {\n      this.addContent(`${horizontalScaling} Tz`);\n    }\n\n    // Add the actual text\n    // If we have a word spacing value, we need to encode each word separately\n    // since the normal Tw operator only works on character code 32, which isn't\n    // used for embedded fonts.\n    if (wordSpacing) {\n      words = text.trim().split(/\\s+/);\n      wordSpacing += this.widthOfString(' ') + characterSpacing;\n      wordSpacing *= 1000 / this._fontSize;\n\n      encoded = [];\n      positions = [];\n      for (let word of words) {\n        const [encodedWord, positionsWord] = this._font.encode(\n          word,\n          options.features\n        );\n        encoded = encoded.concat(encodedWord);\n        positions = positions.concat(positionsWord);\n\n        // add the word spacing to the end of the word\n        // clone object because of cache\n        const space = {};\n        const object = positions[positions.length - 1];\n        for (let key in object) {\n          const val = object[key];\n          space[key] = val;\n        }\n        space.xAdvance += wordSpacing;\n        positions[positions.length - 1] = space;\n      }\n    } else {\n      [encoded, positions] = this._font.encode(text, options.features);\n    }\n\n    const scale = this._fontSize / 1000;\n    const commands = [];\n    let last = 0;\n    let hadOffset = false;\n\n    // Adds a segment of text to the TJ command buffer\n    const addSegment = (cur) => {\n      if (last < cur) {\n        const hex = encoded.slice(last, cur).join('');\n        const advance =\n          positions[cur - 1].xAdvance - positions[cur - 1].advanceWidth;\n        commands.push(`<${hex}> ${number(-advance)}`);\n      }\n\n      return (last = cur);\n    };\n\n    // Flushes the current TJ commands to the output stream\n    const flush = (i) => {\n      addSegment(i);\n\n      if (commands.length > 0) {\n        this.addContent(`[${commands.join(' ')}] TJ`);\n        return (commands.length = 0);\n      }\n    };\n\n    for (i = 0; i < positions.length; i++) {\n      // If we have an x or y offset, we have to break out of the current TJ command\n      // so we can move the text position.\n      const pos = positions[i];\n      if (pos.xOffset || pos.yOffset) {\n        // Flush the current buffer\n        flush(i);\n\n        // Move the text position and flush just the current character\n        this.addContent(\n          `1 0 0 1 ${number(x + pos.xOffset * scale)} ${number(\n            y + pos.yOffset * scale\n          )} Tm`\n        );\n        flush(i + 1);\n\n        hadOffset = true;\n      } else {\n        // If the last character had an offset, reset the text position\n        if (hadOffset) {\n          this.addContent(`1 0 0 1 ${number(x)} ${number(y)} Tm`);\n          hadOffset = false;\n        }\n\n        // Group segments that don't have any advance adjustments\n        if (pos.xAdvance - pos.advanceWidth !== 0) {\n          addSegment(i + 1);\n        }\n      }\n\n      x += pos.xAdvance * scale;\n    }\n\n    // Flush any remaining commands\n    flush(i);\n\n    // end the text object\n    this.addContent('ET');\n\n    // restore flipped coordinate system\n    return this.restore();\n  }\n};\n"
  },
  {
    "path": "packages/pdfkit/src/mixins/vector.js",
    "content": "import SVGPath from '../path';\nimport PDFObject from '../object';\n\nconst { number } = PDFObject;\n\n// This constant is used to approximate a symmetrical arc using a cubic\n// Bezier curve.\nconst KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0);\nexport default {\n  initVector() {\n    this._ctm = [1, 0, 0, 1, 0, 0]; // current transformation matrix\n    return (this._ctmStack = []);\n  },\n\n  save() {\n    this._ctmStack.push(this._ctm.slice());\n    // TODO: save/restore colorspace and styles so not setting it unnessesarily all the time?\n    return this.addContent('q');\n  },\n\n  restore() {\n    this._ctm = this._ctmStack.pop() || [1, 0, 0, 1, 0, 0];\n    return this.addContent('Q');\n  },\n\n  closePath() {\n    return this.addContent('h');\n  },\n\n  lineWidth(w) {\n    return this.addContent(`${number(w)} w`);\n  },\n\n  _CAP_STYLES: {\n    BUTT: 0,\n    ROUND: 1,\n    SQUARE: 2\n  },\n\n  lineCap(c) {\n    if (typeof c === 'string') {\n      c = this._CAP_STYLES[c.toUpperCase()];\n    }\n    return this.addContent(`${c} J`);\n  },\n\n  _JOIN_STYLES: {\n    MITER: 0,\n    ROUND: 1,\n    BEVEL: 2\n  },\n\n  lineJoin(j) {\n    if (typeof j === 'string') {\n      j = this._JOIN_STYLES[j.toUpperCase()];\n    }\n    return this.addContent(`${j} j`);\n  },\n\n  miterLimit(m) {\n    return this.addContent(`${number(m)} M`);\n  },\n\n  dash(length, options = {}) {\n    const originalLength = length;\n    if (!Array.isArray(length)) {\n      length = [length, options.space || length];\n    }\n\n    const valid = length.every((x) => Number.isFinite(x) && x > 0);\n    if (!valid) {\n      throw new Error(\n        `dash(${JSON.stringify(originalLength)}, ${JSON.stringify(\n          options\n        )}) invalid, lengths must be numeric and greater than zero`\n      );\n    }\n\n    length = length.map(number).join(' ');\n    return this.addContent(`[${length}] ${number(options.phase || 0)} d`);\n  },\n\n  undash() {\n    return this.addContent('[] 0 d');\n  },\n\n  moveTo(x, y) {\n    return this.addContent(`${number(x)} ${number(y)} m`);\n  },\n\n  lineTo(x, y) {\n    return this.addContent(`${number(x)} ${number(y)} l`);\n  },\n\n  bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {\n    return this.addContent(\n      `${number(cp1x)} ${number(cp1y)} ${number(cp2x)} ${number(cp2y)} ${number(\n        x\n      )} ${number(y)} c`\n    );\n  },\n\n  quadraticCurveTo(cpx, cpy, x, y) {\n    return this.addContent(\n      `${number(cpx)} ${number(cpy)} ${number(x)} ${number(y)} v`\n    );\n  },\n\n  rect(x, y, w, h) {\n    return this.addContent(\n      `${number(x)} ${number(y)} ${number(w)} ${number(h)} re`\n    );\n  },\n\n  roundedRect(x, y, w, h, r) {\n    if (r == null) {\n      r = 0;\n    }\n    r = Math.min(r, 0.5 * w, 0.5 * h);\n\n    // amount to inset control points from corners (see `ellipse`)\n    const c = r * (1.0 - KAPPA);\n\n    this.moveTo(x + r, y);\n    this.lineTo(x + w - r, y);\n    this.bezierCurveTo(x + w - c, y, x + w, y + c, x + w, y + r);\n    this.lineTo(x + w, y + h - r);\n    this.bezierCurveTo(x + w, y + h - c, x + w - c, y + h, x + w - r, y + h);\n    this.lineTo(x + r, y + h);\n    this.bezierCurveTo(x + c, y + h, x, y + h - c, x, y + h - r);\n    this.lineTo(x, y + r);\n    this.bezierCurveTo(x, y + c, x + c, y, x + r, y);\n    return this.closePath();\n  },\n\n  ellipse(x, y, r1, r2) {\n    // based on http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas/2173084#2173084\n    if (r2 == null) {\n      r2 = r1;\n    }\n    x -= r1;\n    y -= r2;\n    const ox = r1 * KAPPA;\n    const oy = r2 * KAPPA;\n    const xe = x + r1 * 2;\n    const ye = y + r2 * 2;\n    const xm = x + r1;\n    const ym = y + r2;\n\n    this.moveTo(x, ym);\n    this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n    this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n    this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n    this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n    return this.closePath();\n  },\n\n  circle(x, y, radius) {\n    return this.ellipse(x, y, radius);\n  },\n\n  arc(x, y, radius, startAngle, endAngle, anticlockwise) {\n    if (anticlockwise == null) {\n      anticlockwise = false;\n    }\n    const TWO_PI = 2.0 * Math.PI;\n    const HALF_PI = 0.5 * Math.PI;\n\n    let deltaAng = endAngle - startAngle;\n\n    if (Math.abs(deltaAng) > TWO_PI) {\n      // draw only full circle if more than that is specified\n      deltaAng = TWO_PI;\n    } else if (deltaAng !== 0 && anticlockwise !== deltaAng < 0) {\n      // necessary to flip direction of rendering\n      const dir = anticlockwise ? -1 : 1;\n      deltaAng = dir * TWO_PI + deltaAng;\n    }\n\n    const numSegs = Math.ceil(Math.abs(deltaAng) / HALF_PI);\n    const segAng = deltaAng / numSegs;\n    const handleLen = (segAng / HALF_PI) * KAPPA * radius;\n    let curAng = startAngle;\n\n    // component distances between anchor point and control point\n    let deltaCx = -Math.sin(curAng) * handleLen;\n    let deltaCy = Math.cos(curAng) * handleLen;\n\n    // anchor point\n    let ax = x + Math.cos(curAng) * radius;\n    let ay = y + Math.sin(curAng) * radius;\n\n    // calculate and render segments\n    this.moveTo(ax, ay);\n\n    for (let segIdx = 0; segIdx < numSegs; segIdx++) {\n      // starting control point\n      const cp1x = ax + deltaCx;\n      const cp1y = ay + deltaCy;\n\n      // step angle\n      curAng += segAng;\n\n      // next anchor point\n      ax = x + Math.cos(curAng) * radius;\n      ay = y + Math.sin(curAng) * radius;\n\n      // next control point delta\n      deltaCx = -Math.sin(curAng) * handleLen;\n      deltaCy = Math.cos(curAng) * handleLen;\n\n      // ending control point\n      const cp2x = ax - deltaCx;\n      const cp2y = ay - deltaCy;\n\n      // render segment\n      this.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, ax, ay);\n    }\n\n    return this;\n  },\n\n  polygon(...points) {\n    this.moveTo(...(points.shift() || []));\n    for (let point of points) {\n      this.lineTo(...(point || []));\n    }\n    return this.closePath();\n  },\n\n  path(path) {\n    SVGPath.apply(this, path);\n    return this;\n  },\n\n  _windingRule(rule) {\n    if (/even-?odd/.test(rule)) {\n      return '*';\n    }\n\n    return '';\n  },\n\n  fill(color, rule) {\n    if (/(even-?odd)|(non-?zero)/.test(color)) {\n      rule = color;\n      color = null;\n    }\n\n    if (color) {\n      this.fillColor(color);\n    }\n    return this.addContent(`f${this._windingRule(rule)}`);\n  },\n\n  stroke(color) {\n    if (color) {\n      this.strokeColor(color);\n    }\n    return this.addContent('S');\n  },\n\n  fillAndStroke(fillColor, strokeColor, rule) {\n    if (strokeColor == null) {\n      strokeColor = fillColor;\n    }\n    const isFillRule = /(even-?odd)|(non-?zero)/;\n    if (isFillRule.test(fillColor)) {\n      rule = fillColor;\n      fillColor = null;\n    }\n\n    if (isFillRule.test(strokeColor)) {\n      rule = strokeColor;\n      strokeColor = fillColor;\n    }\n\n    if (fillColor) {\n      this.fillColor(fillColor);\n      this.strokeColor(strokeColor);\n    }\n\n    return this.addContent(`B${this._windingRule(rule)}`);\n  },\n\n  clip(rule) {\n    return this.addContent(`W${this._windingRule(rule)} n`);\n  },\n\n  transform(m11, m12, m21, m22, dx, dy) {\n    // keep track of the current transformation matrix\n    if (\n      m11 === 1 &&\n      m12 === 0 &&\n      m21 === 0 &&\n      m22 === 1 &&\n      dx === 0 &&\n      dy === 0\n    ) {\n      // Ignore identity transforms\n      return this;\n    }\n    const m = this._ctm;\n    const [m0, m1, m2, m3, m4, m5] = m;\n    m[0] = m0 * m11 + m2 * m12;\n    m[1] = m1 * m11 + m3 * m12;\n    m[2] = m0 * m21 + m2 * m22;\n    m[3] = m1 * m21 + m3 * m22;\n    m[4] = m0 * dx + m2 * dy + m4;\n    m[5] = m1 * dx + m3 * dy + m5;\n\n    const values = [m11, m12, m21, m22, dx, dy].map((v) => number(v)).join(' ');\n    return this.addContent(`${values} cm`);\n  },\n\n  translate(x, y) {\n    return this.transform(1, 0, 0, 1, x, y);\n  },\n\n  rotate(angle, options = {}) {\n    let y;\n    const rad = (angle * Math.PI) / 180;\n    const cos = Math.cos(rad);\n    const sin = Math.sin(rad);\n    let x = (y = 0);\n\n    if (options.origin != null) {\n      [x, y] = options.origin;\n      const x1 = x * cos - y * sin;\n      const y1 = x * sin + y * cos;\n      x -= x1;\n      y -= y1;\n    }\n\n    return this.transform(cos, sin, -sin, cos, x, y);\n  },\n\n  scale(xFactor, yFactor, options = {}) {\n    let y;\n    if (yFactor == null) {\n      yFactor = xFactor;\n    }\n    if (typeof yFactor === 'object') {\n      options = yFactor;\n      yFactor = xFactor;\n    }\n\n    let x = (y = 0);\n    if (options.origin != null) {\n      [x, y] = options.origin;\n      x -= xFactor * x;\n      y -= yFactor * y;\n    }\n\n    return this.transform(xFactor, 0, 0, yFactor, x, y);\n  }\n};\n"
  },
  {
    "path": "packages/pdfkit/src/name_tree.js",
    "content": "/*\nPDFNameTree - represents a name tree object\n*/\n\nimport PDFTree from './tree';\n\nclass PDFNameTree extends PDFTree {\n  _compareKeys(a, b) {\n    return a.localeCompare(b);\n  }\n\n  _keysName() {\n    return 'Names';\n  }\n\n  _dataForKey(k) {\n    return new String(k);\n  }\n}\n\nexport default PDFNameTree;\n"
  },
  {
    "path": "packages/pdfkit/src/number_tree.js",
    "content": "/*\nPDFNumberTree - represents a number tree object\n*/\n\nimport PDFTree from './tree';\n\nclass PDFNumberTree extends PDFTree {\n  _compareKeys(a, b) {\n    return parseInt(a) - parseInt(b);\n  }\n\n  _keysName() {\n    return 'Nums';\n  }\n\n  _dataForKey(k) {\n    return parseInt(k);\n  }\n}\n\nexport default PDFNumberTree;\n"
  },
  {
    "path": "packages/pdfkit/src/object.js",
    "content": "/*\nPDFObject - converts JavaScript types into their corresponding PDF types.\nBy Devon Govett\n*/\n\nimport PDFReference from './reference';\nimport PDFNameTree from './name_tree';\n\nconst pad = (str, length) => (Array(length + 1).join('0') + str).slice(-length);\n\nconst escapableRe = /[\\n\\r\\t\\b\\f()\\\\]/g;\nconst escapable = {\n  '\\n': '\\\\n',\n  '\\r': '\\\\r',\n  '\\t': '\\\\t',\n  '\\b': '\\\\b',\n  '\\f': '\\\\f',\n  '\\\\': '\\\\\\\\',\n  '(': '\\\\(',\n  ')': '\\\\)'\n};\n\n// Convert little endian UTF-16 to big endian\nconst swapBytes = function (buff) {\n  const l = buff.length;\n  if (l & 0x01) {\n    throw new Error('Buffer length must be even');\n  } else {\n    for (let i = 0, end = l - 1; i < end; i += 2) {\n      const a = buff[i];\n      buff[i] = buff[i + 1];\n      buff[i + 1] = a;\n    }\n  }\n\n  return buff;\n};\n\nclass PDFObject {\n  static convert(object) {\n    // String literals are converted to the PDF name type\n    if (typeof object === 'string') {\n      return `/${object}`;\n    }\n\n    // String objects are converted to PDF strings (UTF-16)\n    if (object instanceof String) {\n      let string = object;\n      // Detect if this is a unicode string\n      let isUnicode = false;\n      for (let i = 0, end = string.length; i < end; i++) {\n        if (string.charCodeAt(i) > 0x7f) {\n          isUnicode = true;\n          break;\n        }\n      }\n\n      // If so, encode it as big endian UTF-16\n      if (isUnicode) {\n        string = swapBytes(Buffer.from(`\\ufeff${string}`, 'utf16le')).toString(\n          'binary'\n        );\n      }\n\n      // Escape characters as required by the spec\n      string = string.replace(escapableRe, (c) => escapable[c]);\n\n      return `(${string})`;\n\n      // Buffers are converted to PDF hex strings\n    }\n\n    if (Buffer.isBuffer(object)) {\n      return `<${object.toString('hex')}>`;\n    }\n\n    if (object instanceof PDFReference || object instanceof PDFNameTree) {\n      return object.toString();\n    }\n\n    if (object instanceof Date) {\n      return (\n        `(D:${pad(object.getUTCFullYear(), 4)}` +\n        pad(object.getUTCMonth() + 1, 2) +\n        pad(object.getUTCDate(), 2) +\n        pad(object.getUTCHours(), 2) +\n        pad(object.getUTCMinutes(), 2) +\n        pad(object.getUTCSeconds(), 2) +\n        'Z)'\n      );\n    }\n\n    if (Array.isArray(object)) {\n      const items = Array.from(object)\n        .map((e) => PDFObject.convert(e))\n        .join(' ');\n      return `[${items}]`;\n    }\n\n    if ({}.toString.call(object) === '[object Object]') {\n      const out = ['<<'];\n      for (let key in object) {\n        const val = object[key];\n        out.push(`/${key} ${PDFObject.convert(val)}`);\n      }\n\n      out.push('>>');\n      return out.join('\\n');\n    }\n\n    if (typeof object === 'number') {\n      return PDFObject.number(object);\n    }\n\n    return `${object}`;\n  }\n\n  static number(n) {\n    if (n > -1e21 && n < 1e21) {\n      return Math.round(n * 1e6) / 1e6;\n    }\n\n    throw new Error(`unsupported number: ${n}`);\n  }\n}\n\nexport default PDFObject;\n"
  },
  {
    "path": "packages/pdfkit/src/outline.js",
    "content": "/* Custom fork start */\nconst DEFAULT_OPTIONS = {\n  top: 0,\n  left: 0,\n  zoom: 0,\n  fit: false,\n  pageNumber: null,\n  expanded: false\n};\n/* Custom fork end */\n\nclass PDFOutline {\n  constructor(document, parent, title, dest, options = DEFAULT_OPTIONS) {\n    this.document = document;\n    this.options = options;\n    this.outlineData = {};\n\n    if (dest !== null) {\n      /* Custom fork start */\n      const destWidth = dest.data.MediaBox[2];\n      const destHeight = dest.data.MediaBox[3];\n      const top = destHeight - (options.top || 0);\n      const left = destWidth - (options.left || 0);\n      const zoom = options.zoom || 0;\n\n      this.outlineData['Dest'] = options.fit\n        ? [dest, 'Fit']\n        : [dest, 'XYZ', left, top, zoom];\n      /* Custom fork end */\n    }\n\n    if (parent !== null) {\n      this.outlineData['Parent'] = parent;\n    }\n\n    if (title !== null) {\n      this.outlineData['Title'] = new String(title);\n    }\n\n    this.dictionary = this.document.ref(this.outlineData);\n    this.children = [];\n  }\n\n  addItem(title, options = DEFAULT_OPTIONS) {\n    /* Custom fork start */\n    const pages = this.document._root.data.Pages.data.Kids;\n\n    const dest =\n      options.pageNumber !== null\n        ? pages[options.pageNumber]\n        : this.document.page.dictionary;\n    /* Custom fork end */\n\n    const result = new PDFOutline(\n      this.document,\n      this.dictionary,\n      title,\n      dest,\n      options\n    );\n    this.children.push(result);\n\n    return result;\n  }\n\n  endOutline() {\n    if (this.children.length > 0) {\n      if (this.options.expanded) {\n        this.outlineData.Count = this.children.length;\n      }\n\n      const first = this.children[0],\n        last = this.children[this.children.length - 1];\n      this.outlineData.First = first.dictionary;\n      this.outlineData.Last = last.dictionary;\n\n      for (let i = 0, len = this.children.length; i < len; i++) {\n        const child = this.children[i];\n        if (i > 0) {\n          child.outlineData.Prev = this.children[i - 1].dictionary;\n        }\n        if (i < this.children.length - 1) {\n          child.outlineData.Next = this.children[i + 1].dictionary;\n        }\n        child.endOutline();\n      }\n    }\n\n    return this.dictionary.end();\n  }\n}\n\nexport default PDFOutline;\n"
  },
  {
    "path": "packages/pdfkit/src/page.js",
    "content": "/*\nPDFPage - represents a single page in the PDF document\nBy Devon Govett\n*/\n\n/**\n * @type {SideDefinition<Size>}\n */\nconst DEFAULT_MARGINS = {\n  top: 72,\n  left: 72,\n  bottom: 72,\n  right: 72\n};\n\nconst SIZES = {\n  '4A0': [4767.87, 6740.79],\n  '2A0': [3370.39, 4767.87],\n  A0: [2383.94, 3370.39],\n  A1: [1683.78, 2383.94],\n  A2: [1190.55, 1683.78],\n  A3: [841.89, 1190.55],\n  A4: [595.28, 841.89],\n  A5: [419.53, 595.28],\n  A6: [297.64, 419.53],\n  A7: [209.76, 297.64],\n  A8: [147.4, 209.76],\n  A9: [104.88, 147.4],\n  A10: [73.7, 104.88],\n  B0: [2834.65, 4008.19],\n  B1: [2004.09, 2834.65],\n  B2: [1417.32, 2004.09],\n  B3: [1000.63, 1417.32],\n  B4: [708.66, 1000.63],\n  B5: [498.9, 708.66],\n  B6: [354.33, 498.9],\n  B7: [249.45, 354.33],\n  B8: [175.75, 249.45],\n  B9: [124.72, 175.75],\n  B10: [87.87, 124.72],\n  C0: [2599.37, 3676.54],\n  C1: [1836.85, 2599.37],\n  C2: [1298.27, 1836.85],\n  C3: [918.43, 1298.27],\n  C4: [649.13, 918.43],\n  C5: [459.21, 649.13],\n  C6: [323.15, 459.21],\n  C7: [229.61, 323.15],\n  C8: [161.57, 229.61],\n  C9: [113.39, 161.57],\n  C10: [79.37, 113.39],\n  RA0: [2437.8, 3458.27],\n  RA1: [1729.13, 2437.8],\n  RA2: [1218.9, 1729.13],\n  RA3: [864.57, 1218.9],\n  RA4: [609.45, 864.57],\n  SRA0: [2551.18, 3628.35],\n  SRA1: [1814.17, 2551.18],\n  SRA2: [1275.59, 1814.17],\n  SRA3: [907.09, 1275.59],\n  SRA4: [637.8, 907.09],\n  EXECUTIVE: [521.86, 756.0],\n  FOLIO: [612.0, 936.0],\n  LEGAL: [612.0, 1008.0],\n  LETTER: [612.0, 792.0],\n  TABLOID: [792.0, 1224.0]\n};\n\nclass PDFPage {\n  constructor(document, options = {}) {\n    this.document = document;\n    this._options = options;\n    this.size = options.size || 'letter';\n    this.layout = options.layout || 'portrait';\n    this.userUnit = options.userUnit || 1.0;\n\n    // process margins\n    if (typeof options.margin === 'number') {\n      this.margins = {\n        top: options.margin,\n        left: options.margin,\n        bottom: options.margin,\n        right: options.margin\n      };\n\n      // default to 1 inch margins\n    } else {\n      this.margins = options.margins || DEFAULT_MARGINS;\n    }\n\n    // calculate page dimensions\n    const dimensions = Array.isArray(this.size)\n      ? this.size\n      : SIZES[this.size.toUpperCase()];\n    this.width = dimensions[this.layout === 'portrait' ? 0 : 1];\n    this.height = dimensions[this.layout === 'portrait' ? 1 : 0];\n\n    this.content = this.document.ref();\n\n    if (options.font) document.font(options.font, options.fontFamily);\n    if (options.fontSize) document.fontSize(options.fontSize);\n\n    // Initialize the Font, XObject, and ExtGState dictionaries\n    this.resources = this.document.ref({\n      ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI']\n    });\n\n    // The page dictionary\n    this.dictionary = this.document.ref({\n      Type: 'Page',\n      Parent: this.document._root.data.Pages,\n      MediaBox: [0, 0, this.width, this.height],\n      Contents: this.content,\n      Resources: this.resources,\n      UserUnit: this.userUnit\n    });\n\n    this.markings = [];\n  }\n\n  // Lazily create these objects\n  get fonts() {\n    const data = this.resources.data;\n    return data.Font != null ? data.Font : (data.Font = {});\n  }\n\n  get xobjects() {\n    const data = this.resources.data;\n    return data.XObject != null ? data.XObject : (data.XObject = {});\n  }\n\n  get ext_gstates() {\n    const data = this.resources.data;\n    return data.ExtGState != null ? data.ExtGState : (data.ExtGState = {});\n  }\n\n  get patterns() {\n    const data = this.resources.data;\n    return data.Pattern != null ? data.Pattern : (data.Pattern = {});\n  }\n\n  get colorSpaces() {\n    const data = this.resources.data;\n    return data.ColorSpace || (data.ColorSpace = {});\n  }\n\n  get annotations() {\n    const data = this.dictionary.data;\n    return data.Annots != null ? data.Annots : (data.Annots = []);\n  }\n\n  get structParentTreeKey() {\n    const data = this.dictionary.data;\n    return data.StructParents != null\n      ? data.StructParents\n      : (data.StructParents = this.document.createStructParentTreeNextKey());\n  }\n\n  maxY() {\n    return this.height - this.margins.bottom;\n  }\n\n  write(chunk) {\n    return this.content.write(chunk);\n  }\n\n  // Set tab order if document is tagged for accessibility.\n  _setTabOrder() {\n    if (!this.dictionary.Tabs && this.document.hasMarkInfoDictionary()) {\n      this.dictionary.data.Tabs = 'S';\n    }\n  }\n\n  end() {\n    this._setTabOrder();\n    this.dictionary.end();\n    this.resources.data.ColorSpace = this.resources.data.ColorSpace || {};\n    for (let color of Object.values(this.document.spotColors)) {\n      this.resources.data.ColorSpace[color.id] = color;\n    }\n    this.resources.end();\n    return this.content.end();\n  }\n}\n\nexport default PDFPage;\n"
  },
  {
    "path": "packages/pdfkit/src/path.js",
    "content": "let cx;\nlet cy;\nlet px;\nlet py;\nlet sx;\nlet sy;\n\ncx = cy = px = py = sx = sy = 0;\n\n// parseDataPath copy pasted from svgo\n// https://github.com/svg/svgo/blob/e4918ccdd1a2b5831defe0f00c1286744b479448/lib/path.js\n\n/**\n * @typedef {'M' | 'm' | 'Z' | 'z' | 'L' | 'l' | 'H' | 'h' | 'V' | 'v' | 'C' | 'c' | 'S' | 's' | 'Q' | 'q' | 'T' | 't' | 'A' | 'a'} PathDataCommand\n */\n\n/**\n * @typedef {Object} PathDataItem\n * @property {PathDataCommand} command\n * @property {number[]} args\n */\n\nconst argsCountPerCommand = {\n  M: 2,\n  m: 2,\n  Z: 0,\n  z: 0,\n  L: 2,\n  l: 2,\n  H: 1,\n  h: 1,\n  V: 1,\n  v: 1,\n  C: 6,\n  c: 6,\n  S: 4,\n  s: 4,\n  Q: 4,\n  q: 4,\n  T: 2,\n  t: 2,\n  A: 7,\n  a: 7\n};\n\n/**\n * @type {(c: string) => c is PathDataCommand}\n */\nconst isCommand = (c) => {\n  return c in argsCountPerCommand;\n};\n\n/**\n * @type {(c: string) => boolean}\n */\nconst isWsp = (c) => {\n  const codePoint = c.codePointAt(0);\n  return (\n    codePoint === 0x20 ||\n    codePoint === 0x9 ||\n    codePoint === 0xd ||\n    codePoint === 0xa\n  );\n};\n\n/**\n * @type {(c: string) => boolean}\n */\nconst isDigit = (c) => {\n  const codePoint = c.codePointAt(0);\n  if (codePoint == null) {\n    return false;\n  }\n  return 48 <= codePoint && codePoint <= 57;\n};\n\n/**\n * @typedef {'none' | 'sign' | 'whole' | 'decimal_point' | 'decimal' | 'e' | 'exponent_sign' | 'exponent'} ReadNumberState\n */\n\n/**\n * @type {(string: string, cursor: number) => [number, number | null]}\n */\nconst readNumber = (string, cursor) => {\n  let i = cursor;\n  let value = '';\n  let state = /** @type {ReadNumberState} */ ('none');\n  for (; i < string.length; i += 1) {\n    const c = string[i];\n    if (c === '+' || c === '-') {\n      if (state === 'none') {\n        state = 'sign';\n        value += c;\n        continue;\n      }\n      if (state === 'e') {\n        state = 'exponent_sign';\n        value += c;\n        continue;\n      }\n    }\n    if (isDigit(c)) {\n      if (state === 'none' || state === 'sign' || state === 'whole') {\n        state = 'whole';\n        value += c;\n        continue;\n      }\n      if (state === 'decimal_point' || state === 'decimal') {\n        state = 'decimal';\n        value += c;\n        continue;\n      }\n      if (state === 'e' || state === 'exponent_sign' || state === 'exponent') {\n        state = 'exponent';\n        value += c;\n        continue;\n      }\n    }\n    if (c === '.') {\n      if (state === 'none' || state === 'sign' || state === 'whole') {\n        state = 'decimal_point';\n        value += c;\n        continue;\n      }\n    }\n    if (c === 'E' || c === 'e') {\n      if (\n        state === 'whole' ||\n        state === 'decimal_point' ||\n        state === 'decimal'\n      ) {\n        state = 'e';\n        value += c;\n        continue;\n      }\n    }\n    break;\n  }\n  const number = Number.parseFloat(value);\n  if (Number.isNaN(number)) {\n    return [cursor, null];\n  }\n  // step back to delegate iteration to parent loop\n  return [i - 1, number];\n};\n\n/**\n * @type {(string: string) => Array<PathDataItem>}\n */\nconst parsePathData = (string) => {\n  /**\n   * @type {Array<PathDataItem>}\n   */\n  const pathData = [];\n  /**\n   * @type {null | PathDataCommand}\n   */\n  let command = null;\n  let args = /** @type {number[]} */ ([]);\n  let argsCount = 0;\n  let canHaveComma = false;\n  let hadComma = false;\n  for (let i = 0; i < string.length; i += 1) {\n    const c = string.charAt(i);\n    if (isWsp(c)) {\n      continue;\n    }\n    // allow comma only between arguments\n    if (canHaveComma && c === ',') {\n      if (hadComma) {\n        break;\n      }\n      hadComma = true;\n      continue;\n    }\n    if (isCommand(c)) {\n      if (hadComma) {\n        return pathData;\n      }\n      if (command == null) {\n        // moveto should be leading command\n        if (c !== 'M' && c !== 'm') {\n          return pathData;\n        }\n      } else {\n        // stop if previous command arguments are not flushed\n        if (args.length !== 0) {\n          return pathData;\n        }\n      }\n      command = c;\n      args = [];\n      argsCount = argsCountPerCommand[command];\n      canHaveComma = false;\n      // flush command without arguments\n      if (argsCount === 0) {\n        pathData.push({ command, args });\n      }\n      continue;\n    }\n    // avoid parsing arguments if no command detected\n    if (command == null) {\n      return pathData;\n    }\n    // read next argument\n    let newCursor = i;\n    let number = null;\n    if (command === 'A' || command === 'a') {\n      const position = args.length;\n      if (position === 0 || position === 1) {\n        // allow only positive number without sign as first two arguments\n        if (c !== '+' && c !== '-') {\n          [newCursor, number] = readNumber(string, i);\n        }\n      }\n      if (position === 2 || position === 5 || position === 6) {\n        [newCursor, number] = readNumber(string, i);\n      }\n      if (position === 3 || position === 4) {\n        // read flags\n        if (c === '0') {\n          number = 0;\n        }\n        if (c === '1') {\n          number = 1;\n        }\n      }\n    } else {\n      [newCursor, number] = readNumber(string, i);\n    }\n    if (number == null) {\n      return pathData;\n    }\n    args.push(number);\n    canHaveComma = true;\n    hadComma = false;\n    i = newCursor;\n    // flush arguments when necessary count is reached\n    if (args.length === argsCount) {\n      pathData.push({ command, args });\n      // subsequent moveto coordinates are threated as implicit lineto commands\n      if (command === 'M') {\n        command = 'L';\n      }\n      if (command === 'm') {\n        command = 'l';\n      }\n      args = [];\n    }\n  }\n  return pathData;\n};\n\nconst apply = function (commands, doc) {\n  // current point, control point, and subpath starting point\n  cx = cy = px = py = sx = sy = 0;\n\n  // run the commands\n  for (let i = 0; i < commands.length; i++) {\n    const { command, args } = commands[i];\n    if (typeof runners[command] === 'function') {\n      runners[command](doc, args);\n    }\n  }\n};\n\nconst runners = {\n  M(doc, a) {\n    cx = a[0];\n    cy = a[1];\n    px = py = null;\n    sx = cx;\n    sy = cy;\n    return doc.moveTo(cx, cy);\n  },\n\n  m(doc, a) {\n    cx += a[0];\n    cy += a[1];\n    px = py = null;\n    sx = cx;\n    sy = cy;\n    return doc.moveTo(cx, cy);\n  },\n\n  C(doc, a) {\n    cx = a[4];\n    cy = a[5];\n    px = a[2];\n    py = a[3];\n    return doc.bezierCurveTo(...a);\n  },\n\n  c(doc, a) {\n    doc.bezierCurveTo(\n      a[0] + cx,\n      a[1] + cy,\n      a[2] + cx,\n      a[3] + cy,\n      a[4] + cx,\n      a[5] + cy\n    );\n    px = cx + a[2];\n    py = cy + a[3];\n    cx += a[4];\n    return (cy += a[5]);\n  },\n\n  S(doc, a) {\n    if (px === null) {\n      px = cx;\n      py = cy;\n    }\n\n    doc.bezierCurveTo(cx - (px - cx), cy - (py - cy), a[0], a[1], a[2], a[3]);\n    px = a[0];\n    py = a[1];\n    cx = a[2];\n    return (cy = a[3]);\n  },\n\n  s(doc, a) {\n    if (px === null) {\n      px = cx;\n      py = cy;\n    }\n\n    doc.bezierCurveTo(\n      cx - (px - cx),\n      cy - (py - cy),\n      cx + a[0],\n      cy + a[1],\n      cx + a[2],\n      cy + a[3]\n    );\n    px = cx + a[0];\n    py = cy + a[1];\n    cx += a[2];\n    return (cy += a[3]);\n  },\n\n  Q(doc, a) {\n    px = a[0];\n    py = a[1];\n    cx = a[2];\n    cy = a[3];\n    return doc.quadraticCurveTo(a[0], a[1], cx, cy);\n  },\n\n  q(doc, a) {\n    doc.quadraticCurveTo(a[0] + cx, a[1] + cy, a[2] + cx, a[3] + cy);\n    px = cx + a[0];\n    py = cy + a[1];\n    cx += a[2];\n    return (cy += a[3]);\n  },\n\n  T(doc, a) {\n    if (px === null) {\n      px = cx;\n      py = cy;\n    } else {\n      px = cx - (px - cx);\n      py = cy - (py - cy);\n    }\n\n    doc.quadraticCurveTo(px, py, a[0], a[1]);\n    px = cx - (px - cx);\n    py = cy - (py - cy);\n    cx = a[0];\n    return (cy = a[1]);\n  },\n\n  t(doc, a) {\n    if (px === null) {\n      px = cx;\n      py = cy;\n    } else {\n      px = cx - (px - cx);\n      py = cy - (py - cy);\n    }\n\n    doc.quadraticCurveTo(px, py, cx + a[0], cy + a[1]);\n    cx += a[0];\n    return (cy += a[1]);\n  },\n\n  A(doc, a) {\n    solveArc(doc, cx, cy, a);\n    cx = a[5];\n    return (cy = a[6]);\n  },\n\n  a(doc, a) {\n    a[5] += cx;\n    a[6] += cy;\n    solveArc(doc, cx, cy, a);\n    cx = a[5];\n    return (cy = a[6]);\n  },\n\n  L(doc, a) {\n    cx = a[0];\n    cy = a[1];\n    px = py = null;\n    return doc.lineTo(cx, cy);\n  },\n\n  l(doc, a) {\n    cx += a[0];\n    cy += a[1];\n    px = py = null;\n    return doc.lineTo(cx, cy);\n  },\n\n  H(doc, a) {\n    cx = a[0];\n    px = py = null;\n    return doc.lineTo(cx, cy);\n  },\n\n  h(doc, a) {\n    cx += a[0];\n    px = py = null;\n    return doc.lineTo(cx, cy);\n  },\n\n  V(doc, a) {\n    cy = a[0];\n    px = py = null;\n    return doc.lineTo(cx, cy);\n  },\n\n  v(doc, a) {\n    cy += a[0];\n    px = py = null;\n    return doc.lineTo(cx, cy);\n  },\n\n  Z(doc) {\n    doc.closePath();\n    cx = sx;\n    return (cy = sy);\n  },\n\n  z(doc) {\n    doc.closePath();\n    cx = sx;\n    return (cy = sy);\n  }\n};\n\nconst solveArc = function (doc, x, y, coords) {\n  const [rx, ry, rot, large, sweep, ex, ey] = coords;\n  const segs = arcToSegments(ex, ey, rx, ry, large, sweep, rot, x, y);\n\n  for (let seg of segs) {\n    const bez = segmentToBezier(...seg);\n    doc.bezierCurveTo(...bez);\n  }\n};\n\n// from Inkscape svgtopdf, thanks!\nconst arcToSegments = function (x, y, rx, ry, large, sweep, rotateX, ox, oy) {\n  const th = rotateX * (Math.PI / 180);\n  const sin_th = Math.sin(th);\n  const cos_th = Math.cos(th);\n  rx = Math.abs(rx);\n  ry = Math.abs(ry);\n  px = cos_th * (ox - x) * 0.5 + sin_th * (oy - y) * 0.5;\n  py = cos_th * (oy - y) * 0.5 - sin_th * (ox - x) * 0.5;\n  let pl = (px * px) / (rx * rx) + (py * py) / (ry * ry);\n  if (pl > 1) {\n    pl = Math.sqrt(pl);\n    rx *= pl;\n    ry *= pl;\n  }\n\n  const a00 = cos_th / rx;\n  const a01 = sin_th / rx;\n  const a10 = -sin_th / ry;\n  const a11 = cos_th / ry;\n  const x0 = a00 * ox + a01 * oy;\n  const y0 = a10 * ox + a11 * oy;\n  const x1 = a00 * x + a01 * y;\n  const y1 = a10 * x + a11 * y;\n\n  const d = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0);\n  let sfactor_sq = 1 / d - 0.25;\n  if (sfactor_sq < 0) {\n    sfactor_sq = 0;\n  }\n  let sfactor = Math.sqrt(sfactor_sq);\n  if (sweep === large) {\n    sfactor = -sfactor;\n  }\n\n  const xc = 0.5 * (x0 + x1) - sfactor * (y1 - y0);\n  const yc = 0.5 * (y0 + y1) + sfactor * (x1 - x0);\n\n  const th0 = Math.atan2(y0 - yc, x0 - xc);\n  const th1 = Math.atan2(y1 - yc, x1 - xc);\n\n  let th_arc = th1 - th0;\n  if (th_arc < 0 && sweep === 1) {\n    th_arc += 2 * Math.PI;\n  } else if (th_arc > 0 && sweep === 0) {\n    th_arc -= 2 * Math.PI;\n  }\n\n  const segments = Math.ceil(Math.abs(th_arc / (Math.PI * 0.5 + 0.001)));\n  const result = [];\n\n  for (let i = 0; i < segments; i++) {\n    const th2 = th0 + (i * th_arc) / segments;\n    const th3 = th0 + ((i + 1) * th_arc) / segments;\n    result[i] = [xc, yc, th2, th3, rx, ry, sin_th, cos_th];\n  }\n\n  return result;\n};\n\nconst segmentToBezier = function (cx, cy, th0, th1, rx, ry, sin_th, cos_th) {\n  const a00 = cos_th * rx;\n  const a01 = -sin_th * ry;\n  const a10 = sin_th * rx;\n  const a11 = cos_th * ry;\n\n  const th_half = 0.5 * (th1 - th0);\n  const t =\n    ((8 / 3) * Math.sin(th_half * 0.5) * Math.sin(th_half * 0.5)) /\n    Math.sin(th_half);\n  const x1 = cx + Math.cos(th0) - t * Math.sin(th0);\n  const y1 = cy + Math.sin(th0) + t * Math.cos(th0);\n  const x3 = cx + Math.cos(th1);\n  const y3 = cy + Math.sin(th1);\n  const x2 = x3 + t * Math.sin(th1);\n  const y2 = y3 - t * Math.cos(th1);\n\n  return [\n    a00 * x1 + a01 * y1,\n    a10 * x1 + a11 * y1,\n    a00 * x2 + a01 * y2,\n    a10 * x2 + a11 * y2,\n    a00 * x3 + a01 * y3,\n    a10 * x3 + a11 * y3\n  ];\n};\n\nclass SVGPath {\n  static apply(doc, path) {\n    const commands = parsePathData(path);\n    apply(commands, doc);\n  }\n}\n\nexport default SVGPath;\n"
  },
  {
    "path": "packages/pdfkit/src/pattern.js",
    "content": "/*\nPDF tiling pattern support. Uncolored only.\n */\n\nconst underlyingColorSpaces = ['DeviceCMYK', 'DeviceRGB'];\n\nclass PDFTilingPattern {\n  constructor(doc, bBox, xStep, yStep, stream) {\n    this.doc = doc;\n    this.bBox = bBox;\n    this.xStep = xStep;\n    this.yStep = yStep;\n    this.stream = stream;\n  }\n\n  createPattern() {\n    // no resources needed for our current usage\n    // required entry\n    const resources = this.doc.ref();\n    resources.end();\n    // apply default transform matrix (flipped in the default doc._ctm)\n    // see document.js & gradient.js\n    const [m0, m1, m2, m3, m4, m5] = this.doc._ctm;\n    const [m11, m12, m21, m22, dx, dy] = [1, 0, 0, 1, 0, 0];\n    const m = [\n      m0 * m11 + m2 * m12,\n      m1 * m11 + m3 * m12,\n      m0 * m21 + m2 * m22,\n      m1 * m21 + m3 * m22,\n      m0 * dx + m2 * dy + m4,\n      m1 * dx + m3 * dy + m5\n    ];\n    const pattern = this.doc.ref({\n      Type: 'Pattern',\n      PatternType: 1, // tiling\n      PaintType: 2, // 1-colored, 2-uncolored\n      TilingType: 2, // 2-no distortion\n      BBox: this.bBox,\n      XStep: this.xStep,\n      YStep: this.yStep,\n      Matrix: m.map((v) => +v.toFixed(5)),\n      Resources: resources\n    });\n    pattern.end(this.stream);\n    return pattern;\n  }\n\n  embedPatternColorSpaces() {\n    // map each pattern to an underlying color space\n    // and embed on each page\n    underlyingColorSpaces.forEach((csName) => {\n      const csId = this.getPatternColorSpaceId(csName);\n\n      if (this.doc.page.colorSpaces[csId]) return;\n      const cs = this.doc.ref(['Pattern', csName]);\n      cs.end();\n      this.doc.page.colorSpaces[csId] = cs;\n    });\n  }\n\n  getPatternColorSpaceId(underlyingColorspace) {\n    return `CsP${underlyingColorspace}`;\n  }\n\n  embed() {\n    if (!this.id) {\n      this.doc._patternCount = this.doc._patternCount + 1;\n      this.id = 'P' + this.doc._patternCount;\n      this.pattern = this.createPattern();\n    }\n\n    // patterns are embedded in each page\n    if (!this.doc.page.patterns[this.id]) {\n      this.doc.page.patterns[this.id] = this.pattern;\n    }\n  }\n\n  apply(stroke, patternColor) {\n    // do any embedding/creating that might be needed\n    this.embedPatternColorSpaces();\n    this.embed();\n\n    const normalizedColor = this.doc._normalizeColor(patternColor);\n    if (!normalizedColor)\n      throw Error(`invalid pattern color. (value: ${patternColor})`);\n\n    // select one of the pattern color spaces\n    const csId = this.getPatternColorSpaceId(\n      this.doc._getColorSpace(normalizedColor)\n    );\n    this.doc._setColorSpace(csId, stroke);\n\n    // stroke/fill using the pattern and color (in the above underlying color space)\n    const op = stroke ? 'SCN' : 'scn';\n    return this.doc.addContent(\n      `${normalizedColor.join(' ')} /${this.id} ${op}`\n    );\n  }\n}\n\nexport default { PDFTilingPattern };\n"
  },
  {
    "path": "packages/pdfkit/src/reference.js",
    "content": "/*\nPDFReference - represents a reference to another object in the PDF object heirarchy\nBy Devon Govett\n*/\n\nimport zlib from 'zlib';\nimport stream from 'stream';\nimport PDFObject from './object';\n\nclass PDFReference extends stream.Writable {\n  constructor(document, id, data) {\n    super({ decodeStrings: false });\n\n    this.finalize = this.finalize.bind(this);\n    this.document = document;\n    this.id = id;\n    if (data == null) {\n      data = {};\n    }\n    this.data = data;\n\n    this.gen = 0;\n    this.deflate = null;\n    this.compress = this.document.compress && !this.data.Filter;\n    this.uncompressedLength = 0;\n    this.chunks = [];\n  }\n\n  initDeflate() {\n    this.data.Filter = 'FlateDecode';\n\n    this.deflate = zlib.createDeflate();\n    this.deflate.on('data', (chunk) => {\n      this.chunks.push(chunk);\n      return (this.data.Length += chunk.length);\n    });\n\n    return this.deflate.on('end', this.finalize);\n  }\n\n  _write(chunk, encoding, callback) {\n    if (!(chunk instanceof Uint8Array)) {\n      chunk = Buffer.from(chunk + '\\n', 'binary');\n    }\n\n    this.uncompressedLength += chunk.length;\n    if (this.data.Length == null) {\n      this.data.Length = 0;\n    }\n\n    if (this.compress) {\n      if (!this.deflate) {\n        this.initDeflate();\n      }\n      this.deflate.write(chunk);\n    } else {\n      this.chunks.push(chunk);\n      this.data.Length += chunk.length;\n    }\n\n    return callback();\n  }\n\n  end() {\n    super.end(...arguments);\n\n    if (this.deflate) {\n      return this.deflate.end();\n    }\n\n    return this.finalize();\n  }\n\n  finalize() {\n    this.offset = this.document._offset;\n\n    this.document._write(`${this.id} ${this.gen} obj`);\n    this.document._write(PDFObject.convert(this.data));\n\n    if (this.chunks.length) {\n      this.document._write('stream');\n      for (let chunk of Array.from(this.chunks)) {\n        this.document._write(chunk);\n      }\n\n      this.chunks.length = 0; // free up memory\n      this.document._write('\\nendstream');\n    }\n\n    this.document._write('endobj');\n    return this.document._refEnd(this);\n  }\n\n  toString() {\n    return `${this.id} ${this.gen} R`;\n  }\n}\n\nexport default PDFReference;\n"
  },
  {
    "path": "packages/pdfkit/src/security.js",
    "content": "/*\n   PDFSecurity - represents PDF security settings\n   By Yang Liu <hi@zesik.com>\n */\n\n// This file is ran directly with Node - needs to have .js extension\nimport MD5 from 'crypto-js/md5.js';\n\nconst wordArrayToBuffer = (wordArray) => {\n  const byteArray = [];\n\n  for (let i = 0; i < wordArray.sigBytes; i++) {\n    byteArray.push(\n      (wordArray.words[Math.floor(i / 4)] >> (8 * (3 - (i % 4)))) & 0xff\n    );\n  }\n\n  return Buffer.from(byteArray);\n};\n\nclass PDFSecurity {\n  static generateFileID(info = {}) {\n    let infoStr = `${info.CreationDate.getTime()}\\n`;\n\n    for (let key in info) {\n      if (!info.hasOwnProperty(key)) continue;\n      infoStr += `${key}: ${info[key].valueOf()}\\n`;\n    }\n\n    return wordArrayToBuffer(MD5(infoStr));\n  }\n}\n\nexport default PDFSecurity;\n"
  },
  {
    "path": "packages/pdfkit/src/spotcolor.js",
    "content": "export default class SpotColor {\n  constructor(doc, name, C, M, Y, K) {\n    this.id = 'CS' + Object.keys(doc.spotColors).length;\n    this.name = name;\n    this.values = [C, M, Y, K];\n    this.ref = doc.ref([\n      'Separation',\n      this.name,\n      'DeviceCMYK',\n      {\n        Range: [0, 1, 0, 1, 0, 1, 0, 1],\n        C0: [0, 0, 0, 0],\n        C1: this.values.map((value) => value / 100),\n        FunctionType: 2,\n        Domain: [0, 1],\n        N: 1\n      }\n    ]);\n    this.ref.end();\n  }\n\n  toString() {\n    return `${this.ref.id} 0 R`;\n  }\n}\n"
  },
  {
    "path": "packages/pdfkit/src/structure_content.js",
    "content": "/*\nPDFStructureContent - a reference to a marked structure content\nBy Ben Schmidt\n*/\n\nclass PDFStructureContent {\n  constructor(pageRef, mcid) {\n    this.refs = [{ pageRef, mcid }];\n  }\n\n  push(structContent) {\n    structContent.refs.forEach((ref) => this.refs.push(ref));\n  }\n}\n\nexport default PDFStructureContent;\n"
  },
  {
    "path": "packages/pdfkit/src/structure_element.js",
    "content": "/*\nPDFStructureElement - represents an element in the PDF logical structure tree\nBy Ben Schmidt\n*/\n\nimport PDFStructureContent from './structure_content';\n\nclass PDFStructureElement {\n  constructor(document, type, options = {}, children = null) {\n    this.document = document;\n\n    this._attached = false;\n    this._ended = false;\n    this._flushed = false;\n    this.dictionary = document.ref({\n      // Type: \"StructElem\",\n      S: type\n    });\n\n    const data = this.dictionary.data;\n\n    if (Array.isArray(options) || this._isValidChild(options)) {\n      children = options;\n      options = {};\n    }\n\n    if (typeof options.title !== 'undefined') {\n      data.T = new String(options.title);\n    }\n    if (typeof options.lang !== 'undefined') {\n      data.Lang = new String(options.lang);\n    }\n    if (typeof options.alt !== 'undefined') {\n      data.Alt = new String(options.alt);\n    }\n    if (typeof options.expanded !== 'undefined') {\n      data.E = new String(options.expanded);\n    }\n    if (typeof options.actual !== 'undefined') {\n      data.ActualText = new String(options.actual);\n    }\n\n    this._children = [];\n\n    if (children) {\n      if (!Array.isArray(children)) {\n        children = [children];\n      }\n      children.forEach((child) => this.add(child));\n      this.end();\n    }\n  }\n\n  add(child) {\n    if (this._ended) {\n      throw new Error(`Cannot add child to already-ended structure element`);\n    }\n\n    if (!this._isValidChild(child)) {\n      throw new Error(`Invalid structure element child`);\n    }\n\n    if (child instanceof PDFStructureElement) {\n      child.setParent(this.dictionary);\n      if (this._attached) {\n        child.setAttached();\n      }\n    }\n\n    if (child instanceof PDFStructureContent) {\n      this._addContentToParentTree(child);\n    }\n\n    if (typeof child === 'function' && this._attached) {\n      // _contentForClosure() adds the content to the parent tree\n      child = this._contentForClosure(child);\n    }\n\n    this._children.push(child);\n\n    return this;\n  }\n\n  _addContentToParentTree(content) {\n    content.refs.forEach(({ pageRef, mcid }) => {\n      const pageStructParents = this.document\n        .getStructParentTree()\n        .get(pageRef.data.StructParents);\n      pageStructParents[mcid] = this.dictionary;\n    });\n  }\n\n  setParent(parentRef) {\n    if (this.dictionary.data.P) {\n      throw new Error(`Structure element added to more than one parent`);\n    }\n\n    this.dictionary.data.P = parentRef;\n\n    this._flush();\n  }\n\n  setAttached() {\n    if (this._attached) {\n      return;\n    }\n\n    this._children.forEach((child, index) => {\n      if (child instanceof PDFStructureElement) {\n        child.setAttached();\n      }\n      if (typeof child === 'function') {\n        this._children[index] = this._contentForClosure(child);\n      }\n    });\n\n    this._attached = true;\n\n    this._flush();\n  }\n\n  end() {\n    if (this._ended) {\n      return;\n    }\n\n    this._children\n      .filter((child) => child instanceof PDFStructureElement)\n      .forEach((child) => child.end());\n\n    this._ended = true;\n\n    this._flush();\n  }\n\n  _isValidChild(child) {\n    return (\n      child instanceof PDFStructureElement ||\n      child instanceof PDFStructureContent ||\n      typeof child === 'function'\n    );\n  }\n\n  _contentForClosure(closure) {\n    const content = this.document.markStructureContent(this.dictionary.data.S);\n    closure();\n    this.document.endMarkedContent();\n\n    this._addContentToParentTree(content);\n\n    return content;\n  }\n\n  _isFlushable() {\n    if (!this.dictionary.data.P || !this._ended) {\n      return false;\n    }\n\n    return this._children.every((child) => {\n      if (typeof child === 'function') {\n        return false;\n      }\n      if (child instanceof PDFStructureElement) {\n        return child._isFlushable();\n      }\n      return true;\n    });\n  }\n\n  _flush() {\n    if (this._flushed || !this._isFlushable()) {\n      return;\n    }\n\n    this.dictionary.data.K = [];\n\n    this._children.forEach((child) => this._flushChild(child));\n\n    this.dictionary.end();\n\n    // free memory used by children; the dictionary itself may still be\n    // referenced by a parent structure element or root, but we can\n    // at least trim the tree here\n    this._children = [];\n    this.dictionary.data.K = null;\n\n    this._flushed = true;\n  }\n\n  _flushChild(child) {\n    if (child instanceof PDFStructureElement) {\n      this.dictionary.data.K.push(child.dictionary);\n    }\n\n    if (child instanceof PDFStructureContent) {\n      child.refs.forEach(({ pageRef, mcid }) => {\n        if (!this.dictionary.data.Pg) {\n          this.dictionary.data.Pg = pageRef;\n        }\n\n        if (this.dictionary.data.Pg === pageRef) {\n          this.dictionary.data.K.push(mcid);\n        } else {\n          this.dictionary.data.K.push({\n            Type: 'MCR',\n            Pg: pageRef,\n            MCID: mcid\n          });\n        }\n      });\n    }\n  }\n}\n\nexport default PDFStructureElement;\n"
  },
  {
    "path": "packages/pdfkit/src/tree.js",
    "content": "/*\nPDFTree - abstract base class for name and number tree objects\n*/\n\nimport PDFObject from './object';\n\nclass PDFTree {\n  constructor(options = {}) {\n    this._items = {};\n    // disable /Limits output for this tree\n    this.limits = typeof options.limits === 'boolean' ? options.limits : true;\n  }\n\n  add(key, val) {\n    return (this._items[key] = val);\n  }\n\n  get(key) {\n    return this._items[key];\n  }\n\n  toString() {\n    // Needs to be sorted by key\n    const sortedKeys = Object.keys(this._items).sort((a, b) =>\n      this._compareKeys(a, b)\n    );\n\n    const out = ['<<'];\n    if (this.limits && sortedKeys.length > 1) {\n      const first = sortedKeys[0],\n        last = sortedKeys[sortedKeys.length - 1];\n      out.push(\n        `  /Limits ${PDFObject.convert([this._dataForKey(first), this._dataForKey(last)])}`\n      );\n    }\n    out.push(`  /${this._keysName()} [`);\n    for (let key of sortedKeys) {\n      out.push(\n        `    ${PDFObject.convert(this._dataForKey(key))} ${PDFObject.convert(\n          this._items[key]\n        )}`\n      );\n    }\n    out.push(']');\n    out.push('>>');\n    return out.join('\\n');\n  }\n\n  _compareKeys(/*a, b*/) {\n    throw new Error('Must be implemented by subclasses');\n  }\n\n  _keysName() {\n    throw new Error('Must be implemented by subclasses');\n  }\n\n  _dataForKey(/*k*/) {\n    throw new Error('Must be implemented by subclasses');\n  }\n}\n\nexport default PDFTree;\n"
  },
  {
    "path": "packages/pdfkit/src/utils/range.js",
    "content": "const range = (left, right, inclusive) => {\n  let range = [];\n  let ascending = left < right;\n  let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n\n  for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n    range.push(i);\n  }\n\n  return range;\n};\n\nexport default range;\n"
  },
  {
    "path": "packages/pdfkit/src/utils.js",
    "content": "export function PDFNumber(n) {\n  // PDF numbers are strictly 32bit\n  // so convert this number to the nearest 32bit number\n  // @see ISO 32000-1 Annex C.2 (real numbers)\n  return Math.fround(n);\n}\n\n/**\n * Measurement of size\n *\n * @typedef {number | `${number}` | `${number}${'em' | 'in' | 'px' | 'cm' | 'mm' | 'pc' | 'ex' | 'ch' | 'rem' | 'vw' | 'vmin' | 'vmax' | '%' | 'pt'}`} Size\n */\n\n/**\n * Measurement of how wide something is, false means 0 and true means 1\n *\n * @typedef {Size | boolean} Wideness\n */\n\n/**\n * Side definitions\n * - To define all sides, use a single value\n * - To define up-down left-right, use a `[Y, X]` array\n * - To define each side, use `[top, right, bottom, left]` array\n * - Or `{vertical: SideValue, horizontal: SideValue}`\n * - Or `{top: SideValue, right: SideValue, bottom: SideValue, left: SideValue}`\n *\n * @template T\n * @typedef {T | [T, T] | [T, T, T, T] | { vertical: T; horizontal: T } | ExpandedSideDefinition<T>} SideDefinition<T>\n **/\n\n/**\n * @template T\n * @typedef {{ top: T; right: T; bottom: T; left: T }} ExpandedSideDefinition<T>\n */\n\n/**\n * Convert any side definition into a static structure\n *\n * @template S\n * @template D\n * @template O\n * @template {S | D} T\n * @param {SideDefinition<S>} sides - The sides to convert\n * @param {SideDefinition<D>} defaultDefinition - The value to use when no definition is provided\n * @param {function(T): O} transformer - The transformation to apply to the sides once normalized\n * @returns {ExpandedSideDefinition<O>}\n */\nexport function normalizeSides(\n  sides,\n  defaultDefinition = undefined,\n  transformer = (v) => v\n) {\n  if (\n    sides === undefined ||\n    sides === null ||\n    (typeof sides === 'object' && Object.keys(sides).length === 0)\n  ) {\n    sides = defaultDefinition;\n  }\n  if (typeof sides !== 'object' || sides === null) {\n    sides = [sides, sides, sides, sides];\n  }\n  if (Array.isArray(sides)) {\n    if (sides.length === 2) {\n      sides = { vertical: sides[0], horizontal: sides[1] };\n    } else {\n      sides = {\n        top: sides[0],\n        right: sides[1],\n        bottom: sides[2],\n        left: sides[3]\n      };\n    }\n  }\n\n  if ('vertical' in sides || 'horizontal' in sides) {\n    sides = {\n      top: sides.vertical,\n      right: sides.horizontal,\n      bottom: sides.vertical,\n      left: sides.horizontal\n    };\n  }\n\n  return {\n    top: transformer(sides.top),\n    right: transformer(sides.right),\n    bottom: transformer(sides.bottom),\n    left: transformer(sides.left)\n  };\n}\n\nexport const MM_TO_CM = 1 / 10; // 1MM = 1CM\nexport const CM_TO_IN = 1 / 2.54; // 1CM = 1/2.54 IN\nexport const PX_TO_IN = 1 / 96; // 1 PX = 1/96 IN\nexport const IN_TO_PT = 72; // 1 IN = 72 PT\nexport const PC_TO_PT = 12; // 1 PC = 12 PT\n\n/**\n * Get cosine in degrees of a\n *\n * Rounding errors are handled\n * @param a\n * @returns {number}\n */\nexport function cosine(a) {\n  if (a === 0) return 1;\n  if (a === 90) return 0;\n  if (a === 180) return -1;\n  if (a === 270) return 0;\n  return Math.cos((a * Math.PI) / 180);\n}\n\n/**\n * Get sine in degrees of a\n *\n * Rounding errors are handled\n * @param a\n * @returns {number}\n */\nexport function sine(a) {\n  if (a === 0) return 0;\n  if (a === 90) return 1;\n  if (a === 180) return 0;\n  if (a === 270) return -1;\n  return Math.sin((a * Math.PI) / 180);\n}\n"
  },
  {
    "path": "packages/pdfkit/src/virtual-fs.js",
    "content": "class VirtualFileSystem {\n  constructor() {\n    this.fileData = {};\n  }\n\n  readFileSync(fileName, options = {}) {\n    const encoding = typeof options === 'string' ? options : options.encoding;\n    const virtualFileName = normalizeFilename(fileName);\n\n    const data = this.fileData[virtualFileName];\n    if (data == null) {\n      throw new Error(\n        `File '${virtualFileName}' not found in virtual file system`\n      );\n    }\n\n    if (encoding) {\n      // return a string\n      return typeof data === 'string' ? data : data.toString(encoding);\n    }\n\n    return Buffer.from(data, typeof data === 'string' ? 'base64' : undefined);\n  }\n\n  writeFileSync(fileName, content) {\n    this.fileData[normalizeFilename(fileName)] = content;\n  }\n\n  bindFileData(data = {}, options = {}) {\n    if (options.reset) {\n      this.fileData = data;\n    } else {\n      Object.assign(this.fileData, data);\n    }\n  }\n}\n\nfunction normalizeFilename(fileName) {\n  if (fileName.indexOf(__dirname) === 0) {\n    fileName = fileName.substring(__dirname.length);\n  }\n\n  if (fileName.indexOf('/') === 0) {\n    fileName = fileName.substring(1);\n  }\n\n  return fileName;\n}\n\nexport default new VirtualFileSystem();\n"
  },
  {
    "path": "packages/pdfkit/tests/font/standard.test.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport StandardFont from '../../src/font.js';\n\ndescribe('standard fonts', () => {\n  it('should resolve advanceWidth of soft hyphen to be zero', () => {\n    const SOFT_HYPHEN = '\\u00AD';\n    const font = StandardFont.open({}, 'Helvetica', 'Helvetica', 'foobar');\n\n    expect(font.encode(SOFT_HYPHEN)[1][0].advanceWidth).toBe(0);\n  });\n});\n"
  },
  {
    "path": "packages/png-js/.gitignore",
    "content": "lib\n"
  },
  {
    "path": "packages/png-js/CHANGELOG.md",
    "content": "# @react-pdf/png-js\n\n## 3.0.0\n\n### Major Changes\n\n- [#2871](https://github.com/diegomura/react-pdf/pull/2871) [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119) Thanks [@diegomura](https://github.com/diegomura)! - feat!: drop cjs support\n\n## 2.3.1\n\n### Patch Changes\n\n- [#2605](https://github.com/diegomura/react-pdf/pull/2605) [`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - fix: fix CJS compatibility\n\n## 2.3.0\n\n### Minor Changes\n\n- [#2409](https://github.com/diegomura/react-pdf/pull/2409) [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Add support for native ESM\n\n## 2.2.0\n\n### Minor Changes\n\n- [#1891](https://github.com/diegomura/react-pdf/pull/1891) [`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - feat: compatibility with modern web bundlers and browsers\n\n### Patch Changes\n\n- [#1941](https://github.com/diegomura/react-pdf/pull/1941) [`001a208`](https://github.com/diegomura/react-pdf/commit/001a20812fa039d09931b22eb97a8869e3b31cc5) Thanks [@PhilippMeissner](https://github.com/PhilippMeissner)! - chore: adds missing licenses to package.json\n\n## 2.1.0\n\n### Minor Changes\n\n- [#1610](https://github.com/diegomura/react-pdf/pull/1610) [`4c5d527`](https://github.com/diegomura/react-pdf/commit/4c5d52721d29d843f1d09c3fd74370832429f70e) Thanks [@jeetiss](https://github.com/jeetiss)! - updated rollup rollup-plugins and babel\n\n### Patch Changes\n\n- [#1581](https://github.com/diegomura/react-pdf/pull/1581) [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca) Thanks [@jeetiss](https://github.com/jeetiss)! - added changelog with changesets\n"
  },
  {
    "path": "packages/png-js/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Devon Govett\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "packages/png-js/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n# @react-pdf/png-js\n\nA PNG decoder in JS for the canvas element or Node.js.\n\n## Acknowledges\n\nThis project is a fork of [png.js](https://github.com/foliojs/png.js) by @devongovett and continued under the scope of this project since it has react-pdf specific features. Any recongnition should go to him and the original project mantainers.\n\n## About this fork\n\n> Updated to 977b857a11676c1e720e79ed8d9178a005a9abd6\n\n- Build node and browser specific bundles\n- Uses rollup for build\n\n## Browser Usage\n\nSimply include png.js and zlib.js on your HTML page, create a canvas element, and call PNG.load to load an image.\n\n    <canvas></canvas>\n    <script src=\"zlib.js\"></script>\n    <script src=\"png.js\"></script>\n    <script>\n        var canvas = document.getElementsByTagName('canvas')[0];\n        PNG.load('some.png', canvas);\n    </script>\n\nThe source code for the browser version resides in `png.js` and also supports loading and displaying animated PNGs.\n\n## Node.js Usage\n\nInstall the module using npm\n\n    sudo npm install png-js\n\nRequire the module and decode a PNG\n\n    import PNG from 'png-js';\n    PNG.decode('some.png', function(pixels) {\n        // pixels is a 1d array (in rgba order) of decoded pixel data\n    });\n\nYou can also call `PNG.load` if you want to load the PNG (but not decode the pixels) synchronously. If you already\nhave the PNG data in a buffer, simply use `new PNG(buffer)`. In both of these cases, you need to call `png.decode`\nyourself which passes your callback the decoded pixels as a buffer. If you already have a buffer you want the pixels\ncopied to, call `copyToImageData` with your buffer and the decoded pixels as returned from `decodePixels`.\n"
  },
  {
    "path": "packages/png-js/babel.config.js",
    "content": "export default { extends: '../../babel.config.js' };\n"
  },
  {
    "path": "packages/png-js/package.json",
    "content": "{\n  \"name\": \"@react-pdf/png-js\",\n  \"description\": \"A PNG decoder in JS\",\n  \"version\": \"3.0.0\",\n  \"license\": \"MIT\",\n  \"type\": \"module\",\n  \"main\": \"./lib/png-js.js\",\n  \"browser\": {\n    \"./lib/png-js.js\": \"./lib/png-js.browser.js\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/png-js\"\n  },\n  \"author\": {\n    \"name\": \"Devon Govett\",\n    \"email\": \"devongovett@gmail.com\",\n    \"url\": \"http://badassjs.com/\"\n  },\n  \"scripts\": {\n    \"build\": \"rimraf ./lib && rollup -c\",\n    \"watch\": \"rimraf ./lib && rollup -c -w\"\n  },\n  \"files\": [\n    \"lib\"\n  ],\n  \"dependencies\": {\n    \"browserify-zlib\": \"^0.2.0\"\n  }\n}\n"
  },
  {
    "path": "packages/png-js/rollup.config.js",
    "content": "import babel from '@rollup/plugin-babel';\nimport replace from '@rollup/plugin-replace';\nimport ignore from 'rollup-plugin-ignore';\nimport alias from '@rollup/plugin-alias';\nimport nodePolyfills from 'rollup-plugin-polyfill-node';\nimport nodeResolve from '@rollup/plugin-node-resolve';\nimport commonjs from '@rollup/plugin-commonjs';\n\nimport pkg from './package.json' with { type: 'json' };\n\nconst input = 'src/index.js';\n\nconst babelConfig = () => ({\n  babelrc: true,\n  babelHelpers: 'runtime',\n  exclude: 'node_modules/**',\n});\n\nconst getExternal = ({ browser }) =>\n  browser\n    ? [\n        ...Object.keys(pkg.dependencies).filter(\n          (dep) => dep !== 'browserify-zlib',\n        ),\n      ]\n    : ['fs', ...Object.keys(pkg.dependencies)];\n\nconst getPlugins = ({ browser }) => [\n  ...(browser\n    ? [\n        ignore(['fs']),\n        alias({\n          entries: [{ find: 'zlib', replacement: 'browserify-zlib' }],\n        }),\n        commonjs(),\n        nodeResolve({ browser, preferBuiltins: !browser }),\n        nodePolyfills({\n          include: [/node_modules\\/.+\\.js/, /\\/png-js\\/src\\/.*\\.js/],\n        }),\n      ]\n    : []),\n  babel(babelConfig()),\n  replace({\n    preventAssignment: true,\n    values: {\n      BROWSER: JSON.stringify(browser),\n    },\n  }),\n];\n\nconst serverConfig = {\n  input,\n  output: { format: 'es', file: 'lib/png-js.js' },\n  external: getExternal({ browser: false }),\n  plugins: getPlugins({ browser: false }),\n};\n\nconst browserConfig = {\n  input,\n  output: { format: 'es', file: 'lib/png-js.browser.js' },\n  external: getExternal({ browser: true }),\n  plugins: getPlugins({ browser: true }),\n};\n\nexport default [serverConfig, browserConfig];\n"
  },
  {
    "path": "packages/png-js/src/index.js",
    "content": "import fs from 'fs';\nimport zlib from 'zlib';\n\nclass PNG {\n  static decode(path, fn) {\n    if (BROWSER) {\n      throw new Error('PNG.decode not available in browser build');\n    } else {\n      return fs.readFile(path, (err, file) => {\n        const png = new PNG(file);\n        return png.decode((pixels) => fn(pixels));\n      });\n    }\n  }\n\n  static load(path) {\n    if (BROWSER) {\n      throw new Error('PNG.load not available in browser build');\n    } else {\n      const file = fs.readFileSync(path);\n      return new PNG(file);\n    }\n  }\n\n  constructor(data) {\n    let i;\n    this.data = data;\n    this.pos = 8; // Skip the default header\n\n    this.palette = [];\n    this.imgData = [];\n    this.transparency = {};\n    this.text = {};\n\n    while (true) {\n      const chunkSize = this.readUInt32();\n      let section = '';\n      for (i = 0; i < 4; i++) {\n        section += String.fromCharCode(this.data[this.pos++]);\n      }\n\n      switch (section) {\n        case 'IHDR':\n          // we can grab  interesting values from here (like width, height, etc)\n          this.width = this.readUInt32();\n          this.height = this.readUInt32();\n          this.bits = this.data[this.pos++];\n          this.colorType = this.data[this.pos++];\n          this.compressionMethod = this.data[this.pos++];\n          this.filterMethod = this.data[this.pos++];\n          this.interlaceMethod = this.data[this.pos++];\n          break;\n\n        case 'PLTE':\n          this.palette = this.read(chunkSize);\n          break;\n\n        case 'IDAT':\n          for (i = 0; i < chunkSize; i++) {\n            this.imgData.push(this.data[this.pos++]);\n          }\n          break;\n\n        case 'tRNS':\n          // This chunk can only occur once and it must occur after the\n          // PLTE chunk and before the IDAT chunk.\n          this.transparency = {};\n          switch (this.colorType) {\n            case 3:\n              // Indexed color, RGB. Each byte in this chunk is an alpha for\n              // the palette index in the PLTE (\"palette\") chunk up until the\n              // last non-opaque entry. Set up an array, stretching over all\n              // palette entries which will be 0 (opaque) or 1 (transparent).\n              this.transparency.indexed = this.read(chunkSize);\n              var short = 255 - this.transparency.indexed.length;\n              if (short > 0) {\n                for (i = 0; i < short; i++) {\n                  this.transparency.indexed.push(255);\n                }\n              }\n              break;\n            case 0:\n              // Greyscale. Corresponding to entries in the PLTE chunk.\n              // Grey is two bytes, range 0 .. (2 ^ bit-depth) - 1\n              this.transparency.grayscale = this.read(chunkSize)[0];\n              break;\n            case 2:\n              // True color with proper alpha channel.\n              this.transparency.rgb = this.read(chunkSize);\n              break;\n          }\n          break;\n\n        case 'tEXt':\n          var text = this.read(chunkSize);\n          var index = text.indexOf(0);\n          var key = String.fromCharCode.apply(String, text.slice(0, index));\n          this.text[key] = String.fromCharCode.apply(\n            String,\n            text.slice(index + 1),\n          );\n          break;\n\n        case 'IEND':\n          // we've got everything we need!\n          switch (this.colorType) {\n            case 0:\n            case 3:\n            case 4:\n              this.colors = 1;\n              break;\n            case 2:\n            case 6:\n              this.colors = 3;\n              break;\n          }\n\n          this.hasAlphaChannel = [4, 6].includes(this.colorType);\n          var colors = this.colors + (this.hasAlphaChannel ? 1 : 0);\n          this.pixelBitlength = this.bits * colors;\n\n          switch (this.colors) {\n            case 1:\n              this.colorSpace = 'DeviceGray';\n              break;\n            case 3:\n              this.colorSpace = 'DeviceRGB';\n              break;\n          }\n\n          this.imgData = Buffer.from(this.imgData);\n          return;\n\n        default:\n          // unknown (or unimportant) section, skip it\n          this.pos += chunkSize;\n      }\n\n      this.pos += 4; // Skip the CRC\n\n      if (this.pos > this.data.length) {\n        throw new Error('Incomplete or corrupt PNG file');\n      }\n    }\n  }\n\n  read(bytes) {\n    const result = new Array(bytes);\n    for (let i = 0; i < bytes; i++) {\n      result[i] = this.data[this.pos++];\n    }\n    return result;\n  }\n\n  readUInt32() {\n    const b1 = this.data[this.pos++] << 24;\n    const b2 = this.data[this.pos++] << 16;\n    const b3 = this.data[this.pos++] << 8;\n    const b4 = this.data[this.pos++];\n    return b1 | b2 | b3 | b4;\n  }\n\n  readUInt16() {\n    const b1 = this.data[this.pos++] << 8;\n    const b2 = this.data[this.pos++];\n    return b1 | b2;\n  }\n\n  decodePixels(fn) {\n    return zlib.inflate(this.imgData, (err, data) => {\n      if (err) throw err;\n\n      var pos = 0;\n      const { width, height } = this;\n      var pixelBytes = this.pixelBitlength / 8;\n\n      const pixels = Buffer.alloc(width * height * pixelBytes);\n\n      function pass(x0, y0, dx, dy, singlePass = false) {\n        const w = Math.ceil((width - x0) / dx);\n        const h = Math.ceil((height - y0) / dy);\n\n        const scanlineLength = pixelBytes * w;\n        const buffer = singlePass ? pixels : Buffer.alloc(scanlineLength * h);\n\n        let row = 0;\n        let c = 0;\n\n        while (row < h && pos < data.length) {\n          var byte;\n          var col;\n          var i;\n          var left;\n          var upper;\n          switch (data[pos++]) {\n            case 0: // None\n              for (i = 0; i < scanlineLength; i++) {\n                buffer[c++] = data[pos++];\n              }\n              break;\n\n            case 1: // Sub\n              for (i = 0; i < scanlineLength; i++) {\n                byte = data[pos++];\n                left = i < pixelBytes ? 0 : buffer[c - pixelBytes];\n                buffer[c++] = (byte + left) % 256;\n              }\n              break;\n\n            case 2: // Up\n              for (i = 0; i < scanlineLength; i++) {\n                byte = data[pos++];\n                col = (i - (i % pixelBytes)) / pixelBytes;\n                upper =\n                  row &&\n                  buffer[\n                    (row - 1) * scanlineLength +\n                      col * pixelBytes +\n                      (i % pixelBytes)\n                  ];\n                buffer[c++] = (upper + byte) % 256;\n              }\n              break;\n\n            case 3: // Average\n              for (i = 0; i < scanlineLength; i++) {\n                byte = data[pos++];\n                col = (i - (i % pixelBytes)) / pixelBytes;\n                left = i < pixelBytes ? 0 : buffer[c - pixelBytes];\n                upper =\n                  row &&\n                  buffer[\n                    (row - 1) * scanlineLength +\n                      col * pixelBytes +\n                      (i % pixelBytes)\n                  ];\n                buffer[c++] = (byte + Math.floor((left + upper) / 2)) % 256;\n              }\n              break;\n\n            case 4: // Paeth\n              for (i = 0; i < scanlineLength; i++) {\n                var paeth;\n                var upperLeft;\n                byte = data[pos++];\n                col = (i - (i % pixelBytes)) / pixelBytes;\n                left = i < pixelBytes ? 0 : buffer[c - pixelBytes];\n\n                if (row === 0) {\n                  upper = upperLeft = 0;\n                } else {\n                  upper =\n                    buffer[\n                      (row - 1) * scanlineLength +\n                        col * pixelBytes +\n                        (i % pixelBytes)\n                    ];\n                  upperLeft =\n                    col &&\n                    buffer[\n                      (row - 1) * scanlineLength +\n                        (col - 1) * pixelBytes +\n                        (i % pixelBytes)\n                    ];\n                }\n\n                const p = left + upper - upperLeft;\n                const pa = Math.abs(p - left);\n                const pb = Math.abs(p - upper);\n                const pc = Math.abs(p - upperLeft);\n\n                if (pa <= pb && pa <= pc) {\n                  paeth = left;\n                } else if (pb <= pc) {\n                  paeth = upper;\n                } else {\n                  paeth = upperLeft;\n                }\n\n                buffer[c++] = (byte + paeth) % 256;\n              }\n              break;\n\n            default:\n              throw new Error(`Invalid filter algorithm: ${data[pos - 1]}`);\n          }\n\n          if (!singlePass) {\n            let pixelsPos = ((y0 + row * dy) * width + x0) * pixelBytes;\n            let bufferPos = row * scanlineLength;\n            for (i = 0; i < w; i++) {\n              for (let j = 0; j < pixelBytes; j++)\n                pixels[pixelsPos++] = buffer[bufferPos++];\n              pixelsPos += (dx - 1) * pixelBytes;\n            }\n          }\n\n          row++;\n        }\n      }\n\n      if (this.interlaceMethod === 1) {\n        /*\n          1 6 4 6 2 6 4 6\n          7 7 7 7 7 7 7 7\n          5 6 5 6 5 6 5 6\n          7 7 7 7 7 7 7 7\n          3 6 4 6 3 6 4 6\n          7 7 7 7 7 7 7 7\n          5 6 5 6 5 6 5 6\n          7 7 7 7 7 7 7 7\n        */\n        pass(0, 0, 8, 8); // 1\n        pass(4, 0, 8, 8); // 2\n        pass(0, 4, 4, 8); // 3\n        pass(2, 0, 4, 4); // 4\n        pass(0, 2, 2, 4); // 5\n        pass(1, 0, 2, 2); // 6\n        pass(0, 1, 1, 2); // 7\n      } else {\n        pass(0, 0, 1, 1, true);\n      }\n\n      return fn(pixels);\n    });\n  }\n\n  decodePalette() {\n    const { palette } = this;\n    const { length } = palette;\n    const transparency = this.transparency.indexed || [];\n    const ret = Buffer.alloc(transparency.length + length);\n    let pos = 0;\n    let c = 0;\n\n    for (let i = 0; i < length; i += 3) {\n      var left;\n      ret[pos++] = palette[i];\n      ret[pos++] = palette[i + 1];\n      ret[pos++] = palette[i + 2];\n      ret[pos++] = (left = transparency[c++]) != null ? left : 255;\n    }\n\n    return ret;\n  }\n\n  copyToImageData(imageData, pixels) {\n    let j;\n    var k;\n    let { colors } = this;\n    let palette = null;\n    let alpha = this.hasAlphaChannel;\n\n    if (this.palette.length) {\n      palette =\n        this._decodedPalette || (this._decodedPalette = this.decodePalette());\n      colors = 4;\n      alpha = true;\n    }\n\n    const data = imageData.data || imageData;\n    const { length } = data;\n    const input = palette || pixels;\n    let i = (j = 0);\n\n    if (colors === 1) {\n      while (i < length) {\n        k = palette ? pixels[i / 4] * 4 : j;\n        const v = input[k++];\n        data[i++] = v;\n        data[i++] = v;\n        data[i++] = v;\n        data[i++] = alpha ? input[k++] : 255;\n        j = k;\n      }\n    } else {\n      while (i < length) {\n        k = palette ? pixels[i / 4] * 4 : j;\n        data[i++] = input[k++];\n        data[i++] = input[k++];\n        data[i++] = input[k++];\n        data[i++] = alpha ? input[k++] : 255;\n        j = k;\n      }\n    }\n  }\n\n  decode(fn) {\n    const ret = Buffer.alloc(this.width * this.height * 4);\n    return this.decodePixels((pixels) => {\n      this.copyToImageData(ret, pixels);\n      return fn(ret);\n    });\n  }\n}\n\nexport default PNG;\n"
  },
  {
    "path": "packages/primitives/.gitignore",
    "content": "lib\n"
  },
  {
    "path": "packages/primitives/CHANGELOG.md",
    "content": "# @react-pdf/primitives\n\n## 4.1.1\n\n### Patch Changes\n\n- [#3067](https://github.com/diegomura/react-pdf/pull/3067) [`96c2464d`](https://github.com/diegomura/react-pdf/commit/96c2464dfaa7294e0d79b7ed64743bfd7b1a8c72) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert primitives package to TS\n\n## 4.1.0\n\n### Minor Changes\n\n- [`7cd71714`](https://github.com/diegomura/react-pdf/commit/7cd7171472b0f300db56b7805c5f966bf4ced6e2) Thanks [@diegomura](https://github.com/diegomura)! - feat: added Form Annotation support\n\n## 4.0.0\n\n### Major Changes\n\n- [#2871](https://github.com/diegomura/react-pdf/pull/2871) [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119) Thanks [@diegomura](https://github.com/diegomura)! - feat!: drop cjs support\n\n## 3.1.1\n\n### Patch Changes\n\n- [#2510](https://github.com/diegomura/react-pdf/pull/2510) [`42bbbda`](https://github.com/diegomura/react-pdf/commit/42bbbda48058acd2d36d7a92c812d133608c459e) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Fix require @react-pdf/primitives from CJS\n\n## 3.1.0\n\n### Minor Changes\n\n- [#2409](https://github.com/diegomura/react-pdf/pull/2409) [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Add support for native ESM\n\n## 3.0.1\n\n### Patch Changes\n\n- [#1845](https://github.com/diegomura/react-pdf/pull/1845) [`c6d5a8f`](https://github.com/diegomura/react-pdf/commit/c6d5a8fa9d26d3aca5593773844a5a1e9fad06ae) Thanks [@jeetiss](https://github.com/jeetiss)! - publish commonjs files to npm\n\n## 3.0.0\n\n### Major Changes\n\n- [#1658](https://github.com/diegomura/react-pdf/pull/1658) [`e938df0`](https://github.com/diegomura/react-pdf/commit/e938df0857642707b10b7f65f17ed22dc394ac1b) Thanks [@jeetiss](https://github.com/jeetiss)! - convert code to esm\n\n## 2.0.2\n\n### Patch Changes\n\n- [#1581](https://github.com/diegomura/react-pdf/pull/1581) [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca) Thanks [@jeetiss](https://github.com/jeetiss)! - added changelog with changesets\n"
  },
  {
    "path": "packages/primitives/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n# @react-pdf/primitives\n\nInternal element type constants for react-pdf. This package defines the primitive node types used throughout the react-pdf rendering pipeline.\n\n## Installation\n\n```bash\nyarn add @react-pdf/primitives\n```\n\n## Usage\n\n```js\nimport { View, Text, Page, Document } from '@react-pdf/primitives';\n\nconsole.log(View); // 'VIEW'\nconsole.log(Text); // 'TEXT'\nconsole.log(Page); // 'PAGE'\nconsole.log(Document); // 'DOCUMENT'\n```\n\nThese constants are primarily used internally by react-pdf packages to identify element types during the rendering process.\n\n## Available Primitives\n\n### Document Structure\n\n| Export     | Value        | Description                       |\n| ---------- | ------------ | --------------------------------- |\n| `Document` | `'DOCUMENT'` | Root document container           |\n| `Page`     | `'PAGE'`     | Individual page within a document |\n| `View`     | `'VIEW'`     | Generic container element         |\n| `Text`     | `'TEXT'`     | Text content container            |\n| `Link`     | `'LINK'`     | Hyperlink element                 |\n| `Note`     | `'NOTE'`     | Annotation/note element           |\n| `Image`    | `'IMAGE'`    | Image element                     |\n| `Canvas`   | `'CANVAS'`   | Custom drawing canvas             |\n\n### Form Elements\n\n| Export      | Value          | Description                   |\n| ----------- | -------------- | ----------------------------- |\n| `FieldSet`  | `'FIELD_SET'`  | Form field grouping container |\n| `TextInput` | `'TEXT_INPUT'` | Text input field              |\n| `Select`    | `'SELECT'`     | Dropdown select field         |\n| `Checkbox`  | `'CHECKBOX'`   | Checkbox input field          |\n| `List`      | `'LIST'`       | List element for forms        |\n\n### SVG Elements\n\n| Export           | Value               | Description                |\n| ---------------- | ------------------- | -------------------------- |\n| `Svg`            | `'SVG'`             | SVG root container         |\n| `G`              | `'G'`               | SVG group element          |\n| `Path`           | `'PATH'`            | SVG path element           |\n| `Rect`           | `'RECT'`            | SVG rectangle element      |\n| `Line`           | `'LINE'`            | SVG line element           |\n| `Circle`         | `'CIRCLE'`          | SVG circle element         |\n| `Ellipse`        | `'ELLIPSE'`         | SVG ellipse element        |\n| `Polygon`        | `'POLYGON'`         | SVG polygon element        |\n| `Polyline`       | `'POLYLINE'`        | SVG polyline element       |\n| `Tspan`          | `'TSPAN'`           | SVG text span element      |\n| `ClipPath`       | `'CLIP_PATH'`       | SVG clipping path          |\n| `Defs`           | `'DEFS'`            | SVG definitions container  |\n| `Stop`           | `'STOP'`            | Gradient stop element      |\n| `LinearGradient` | `'LINEAR_GRADIENT'` | Linear gradient definition |\n| `RadialGradient` | `'RADIAL_GRADIENT'` | Radial gradient definition |\n\n### Internal Types\n\n| Export         | Value             | Description                             |\n| -------------- | ----------------- | --------------------------------------- |\n| `TextInstance` | `'TEXT_INSTANCE'` | Internal representation of text content |\n\n## License\n\nMIT\n"
  },
  {
    "path": "packages/primitives/babel.config.js",
    "content": "export default { extends: '../../babel.config.js' };\n"
  },
  {
    "path": "packages/primitives/jest.config.js",
    "content": "export default {\n  testRegex: 'tests/.*?(test)\\\\.js$',\n};\n"
  },
  {
    "path": "packages/primitives/package.json",
    "content": "{\n  \"name\": \"@react-pdf/primitives\",\n  \"version\": \"4.1.1\",\n  \"license\": \"MIT\",\n  \"description\": \"Define uninitialized elements\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"type\": \"module\",\n  \"main\": \"./lib/index.js\",\n  \"types\": \"./lib/index.d.ts\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/primitives\"\n  },\n  \"scripts\": {\n    \"build\": \"rimraf ./lib && rollup -c\",\n    \"watch\": \"rimraf ./lib && rollup -c -w\",\n    \"test\": \"vitest\",\n    \"typecheck\": \"tsc --noEmit\"\n  },\n  \"files\": [\n    \"lib\"\n  ]\n}\n"
  },
  {
    "path": "packages/primitives/rollup.config.js",
    "content": "import typescript from '@rollup/plugin-typescript';\nimport { dts } from 'rollup-plugin-dts';\nimport del from 'rollup-plugin-delete';\n\nconst config = {\n  input: 'src/index.ts',\n  output: {\n    dir: 'lib',\n    format: 'es',\n  },\n  plugins: [typescript()],\n};\n\nconst dtsConfig = {\n  input: './lib/types/index.d.ts',\n  output: [{ file: 'lib/index.d.ts', format: 'es' }],\n  plugins: [dts(), del({ targets: 'lib/types', hook: 'buildEnd' })],\n};\n\nexport default [config, dtsConfig];\n"
  },
  {
    "path": "packages/primitives/src/index.ts",
    "content": "export const G = 'G';\nexport const Svg = 'SVG';\nexport const View = 'VIEW';\nexport const Text = 'TEXT';\nexport const Link = 'LINK';\nexport const Page = 'PAGE';\nexport const Note = 'NOTE';\nexport const Path = 'PATH';\nexport const Rect = 'RECT';\nexport const Line = 'LINE';\nexport const FieldSet = 'FIELD_SET';\nexport const TextInput = 'TEXT_INPUT';\nexport const Select = 'SELECT';\nexport const Checkbox = 'CHECKBOX';\nexport const List = 'LIST';\nexport const Stop = 'STOP';\nexport const Defs = 'DEFS';\nexport const Image = 'IMAGE';\nexport const Tspan = 'TSPAN';\nexport const Canvas = 'CANVAS';\nexport const Circle = 'CIRCLE';\nexport const Ellipse = 'ELLIPSE';\nexport const Polygon = 'POLYGON';\nexport const Document = 'DOCUMENT';\nexport const Polyline = 'POLYLINE';\nexport const ClipPath = 'CLIP_PATH';\nexport const TextInstance = 'TEXT_INSTANCE';\nexport const LinearGradient = 'LINEAR_GRADIENT';\nexport const RadialGradient = 'RADIAL_GRADIENT';\n"
  },
  {
    "path": "packages/primitives/tests/index.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport * as primitives from '../src/index';\n\ndescribe('primitives', () => {\n  test('should export group', () => {\n    expect(primitives.G).toBeTruthy();\n  });\n\n  test('should export svg', () => {\n    expect(primitives.Svg).toBeTruthy();\n  });\n\n  test('should export view', () => {\n    expect(primitives.View).toBeTruthy();\n  });\n\n  test('should export link', () => {\n    expect(primitives.Link).toBeTruthy();\n  });\n\n  test('should export page', () => {\n    expect(primitives.Page).toBeTruthy();\n  });\n\n  test('should export note', () => {\n    expect(primitives.Note).toBeTruthy();\n  });\n\n  test('should export path', () => {\n    expect(primitives.Path).toBeTruthy();\n  });\n\n  test('should export rect', () => {\n    expect(primitives.Rect).toBeTruthy();\n  });\n\n  test('should export line', () => {\n    expect(primitives.Line).toBeTruthy();\n  });\n\n  test('should export field set', () => {\n    expect(primitives.FieldSet).toBeTruthy();\n  });\n\n  test('should export text input', () => {\n    expect(primitives.TextInput).toBeTruthy();\n  });\n\n  test('should export form list', () => {\n    expect(primitives.List).toBeTruthy();\n  });\n\n  test('should export select', () => {\n    expect(primitives.Select).toBeTruthy();\n  });\n\n  test('should export stop', () => {\n    expect(primitives.Stop).toBeTruthy();\n  });\n\n  test('should export defs', () => {\n    expect(primitives.Defs).toBeTruthy();\n  });\n\n  test('should export image', () => {\n    expect(primitives.Image).toBeTruthy();\n  });\n\n  test('should export tspan', () => {\n    expect(primitives.Tspan).toBeTruthy();\n  });\n\n  test('should export canvas', () => {\n    expect(primitives.Canvas).toBeTruthy();\n  });\n\n  test('should export circle', () => {\n    expect(primitives.Circle).toBeTruthy();\n  });\n\n  test('should export ellipse', () => {\n    expect(primitives.Ellipse).toBeTruthy();\n  });\n\n  test('should export polygon', () => {\n    expect(primitives.Polygon).toBeTruthy();\n  });\n\n  test('should export document', () => {\n    expect(primitives.Document).toBeTruthy();\n  });\n\n  test('should export polyline', () => {\n    expect(primitives.Polyline).toBeTruthy();\n  });\n\n  test('should export clippath', () => {\n    expect(primitives.ClipPath).toBeTruthy();\n  });\n\n  test('should export text intance', () => {\n    expect(primitives.TextInstance).toBeTruthy();\n  });\n\n  test('should export text linear gradient', () => {\n    expect(primitives.LinearGradient).toBeTruthy();\n  });\n\n  test('should export text radial gradient', () => {\n    expect(primitives.RadialGradient).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "packages/primitives/tsconfig.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"compilerOptions\": {\n    \"outDir\": \"lib\",\n    \"declaration\": true,\n    \"declarationDir\": \"lib/types\",\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2022\", \"DOM\"],\n    \"moduleResolution\": \"Node\",\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": false,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"types\": [\"vitest/globals\"],\n  },\n  \"include\": [\"src\", \"globals.d.ts\"],\n}\n"
  },
  {
    "path": "packages/reconciler/.gitignore",
    "content": "lib\n"
  },
  {
    "path": "packages/reconciler/CHANGELOG.md",
    "content": "# @react-pdf/reconciler\n\n## 2.0.0\n\n### Major Changes\n\n- [#3224](https://github.com/diegomura/react-pdf/pull/3224) [`fafbcb12`](https://github.com/diegomura/react-pdf/commit/fafbcb12a0ecf3231165bb2944de7ad3b7761dec) Thanks [@ZandercraftGames](https://github.com/ZandercraftGames)! - feat: add React 19.2.X support\n\n### Patch Changes\n\n- [#3261](https://github.com/diegomura/react-pdf/pull/3261) [`2eba70bd`](https://github.com/diegomura/react-pdf/commit/2eba70bd9cbb942a675ac686a2b335164279035a) Thanks [@Nukem154](https://github.com/Nukem154)! - fix(reconciler): prevent crash when removing elements\n\n## 1.1.4\n\n### Patch Changes\n\n- [`b95a6dc4`](https://github.com/diegomura/react-pdf/commit/b95a6dc4350b0580ee8c1c8320871cc7145676f2) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert reconciler package to TS\n\n## 1.1.3\n\n### Patch Changes\n\n- [#2983](https://github.com/diegomura/react-pdf/pull/2983) [`1916e840`](https://github.com/diegomura/react-pdf/commit/1916e8405ce2b566110f2a1d66cfd8b4c4fa34d4) Thanks [@diegomura](https://github.com/diegomura)! - fix: conditional rendering\n\n- [#2980](https://github.com/diegomura/react-pdf/pull/2980) [`165c70fb`](https://github.com/diegomura/react-pdf/commit/165c70fbd31a7a4520af83b218a03f2f78f486e9) Thanks [@diegomura](https://github.com/diegomura)! - fix(reconciler): missing dependencies\n\n## 1.1.2\n\n### Patch Changes\n\n- [#2958](https://github.com/diegomura/react-pdf/pull/2958) [`f6e9e113`](https://github.com/diegomura/react-pdf/commit/f6e9e1136f47fe05f86158c76561729b2cc425c4) Thanks [@diegomura](https://github.com/diegomura)! - fix: add scheduler dependency\n\n## 1.1.1\n\n### Patch Changes\n\n- [#2943](https://github.com/diegomura/react-pdf/pull/2943) [`82192b3a`](https://github.com/diegomura/react-pdf/commit/82192b3a53cf5db62230287e7456dc5bdeee6244) Thanks [@diegomura](https://github.com/diegomura)! - fix: reconciler build\n\n## 1.1.0\n\n### Minor Changes\n\n- [`52b2f253`](https://github.com/diegomura/react-pdf/commit/52b2f25349bee0c09399bc2e7e5e89db5e1433fd) Thanks [@diegomura](https://github.com/diegomura)! - feat: add React 19 support\n\n## 1.0.1\n\n### Patch Changes\n\n- [#2936](https://github.com/diegomura/react-pdf/pull/2936) [`7add014c`](https://github.com/diegomura/react-pdf/commit/7add014c6bc9cff649dd1a56fc47214888613b6b) Thanks [@diegomura](https://github.com/diegomura)! - feat: pre-bundle + bump react-reconciler\n"
  },
  {
    "path": "packages/reconciler/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n# @react-pdf/reconciler\n"
  },
  {
    "path": "packages/reconciler/build/trim-reconciler.js",
    "content": "import * as recast from 'recast';\nimport { visit } from 'ast-types';\n\nconst trueLiteral = recast.types.builders.literal(true);\nconst falseLiteral = recast.types.builders.literal(false);\nconst nullLiteral = recast.types.builders.literal(null);\n\nconst KEEP_OPTIONS = {\n  commitUpdate: true,\n  commitTextUpdate: true,\n  removeChildFromContainer: true,\n  removeChild: true,\n  insertBefore: true,\n  appendChildToContainer: true,\n  appendChild: true,\n  shouldSetTextContent: true,\n  getChildHostContext: true,\n  getRootHostContext: true,\n  resetTextContent: true,\n  resetAfterCommit: true,\n  prepareUpdate: true,\n  clearContainer: true,\n  prepareForCommit: true,\n  getPublicInstance: true,\n  finalizeInitialChildren: true,\n  createTextInstance: true,\n  createInstance: true,\n  appendInitialChild: true,\n  noTimeout: true,\n  getCurrentUpdatePriority: true,\n  setCurrentUpdatePriority: true,\n  resolveUpdatePriority: true,\n  shouldAttemptEagerTransition: true,\n  requestPostPaintCallback: true,\n  maySuspendCommit: true,\n  detachDeletedInstance: true,\n  resolveEventTimeStamp: true,\n  resolveEventType: true,\n  trackSchedulerEvent: true,\n};\n\nconst STATIC_OPTIONS = {\n  useSyncScheduling: { value: true },\n  supportsMutation: { value: true },\n  isPrimaryRenderer: { value: false },\n  warnsIfNotActing: { value: false },\n};\n\nconst METHOD_KEYS = {\n  updateContainer: true,\n  updateContainerSync: true,\n  createContainer: true,\n  flushSyncWork: true,\n};\n\nfunction clearReconcilerOptions(path) {\n  const { node } = path;\n  const objectName = node.object?.name;\n  const optionName = node.property?.name;\n\n  // If we are not visiting config object, skip.\n  if (objectName !== '$$$hostConfig' && objectName !== '$$$config') return;\n\n  // If it's an option we want to keep, skip.\n  if (KEEP_OPTIONS[optionName]) return;\n\n  // If it's an option we want to replace, replace it.\n  if (STATIC_OPTIONS[optionName]) {\n    const newValue = STATIC_OPTIONS[optionName].value;\n    path.replace(newValue ? trueLiteral : falseLiteral);\n    return;\n  }\n\n  // Remove option.\n  path.replace(nullLiteral);\n}\n\nfunction clearReconcilerMethods(path) {\n  const { node } = path;\n  const objectName = node.object?.name;\n  const optionName = node.property?.name;\n\n  // If we are not visiting an exported method, skip.\n  if (objectName !== 'exports') return;\n\n  // If it's a method we want to keep, skip.\n  if (METHOD_KEYS[optionName]) return;\n\n  // Remove method.\n  path.parent.replace(nullLiteral);\n}\n\nconst trimReconciler = () => {\n  return {\n    name: 'trim-reconciler',\n\n    transform(code) {\n      const ast = recast.parse(code);\n\n      visit(ast, {\n        visitMemberExpression(path) {\n          clearReconcilerOptions(path);\n          clearReconcilerMethods(path);\n          this.traverse(path);\n        },\n      });\n\n      return { code: recast.print(ast).code };\n    },\n  };\n};\n\nexport default trimReconciler;\n"
  },
  {
    "path": "packages/reconciler/package.json",
    "content": "{\n  \"name\": \"@react-pdf/reconciler\",\n  \"version\": \"2.0.0\",\n  \"license\": \"MIT\",\n  \"description\": \"Define uninitialized elements\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"type\": \"module\",\n  \"main\": \"./lib/index.js\",\n  \"types\": \"./lib/index.d.ts\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/reconciler\"\n  },\n  \"scripts\": {\n    \"build\": \"rimraf ./lib && rollup -c\",\n    \"watch\": \"rimraf ./lib && rollup -c -w\",\n    \"size\": \"size-limit\",\n    \"lint\": \"eslint src\",\n    \"test\": \"vitest\"\n  },\n  \"files\": [\n    \"lib\"\n  ],\n  \"peerDependencies\": {\n    \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n  },\n  \"dependencies\": {\n    \"object-assign\": \"^4.1.1\",\n    \"scheduler\": \"0.25.0-rc-603e6108-20241029\"\n  },\n  \"devDependencies\": {\n    \"ast-types\": \"^0.14.2\",\n    \"react-reconciler-23\": \"npm:react-reconciler@0.23.0\",\n    \"react-reconciler-31\": \"npm:react-reconciler@0.31.0-rc-603e6108-20241029\",\n    \"react-reconciler-33\": \"npm:react-reconciler@0.33.0\",\n    \"recast\": \"^0.23.9\"\n  }\n}\n"
  },
  {
    "path": "packages/reconciler/rollup.config.js",
    "content": "import resolve from '@rollup/plugin-node-resolve';\nimport commonjs from '@rollup/plugin-commonjs';\nimport terser from '@rollup/plugin-terser';\nimport typescript from '@rollup/plugin-typescript';\nimport { dts } from 'rollup-plugin-dts';\nimport del from 'rollup-plugin-delete';\n\nimport trimReconciler from './build/trim-reconciler.js';\n\nexport default [\n  {\n    input: 'src/index.ts',\n    output: { format: 'es', file: 'lib/index.js' },\n    external: [\n      './reconciler-23.js',\n      './reconciler-31.js',\n      './reconciler-33.js',\n    ],\n    plugins: [typescript()],\n  },\n  {\n    input: 'src/reconciler-23.ts',\n    output: { format: 'es', file: 'lib/reconciler-23.js' },\n    plugins: [\n      typescript(),\n      resolve({ resolveOnly: ['react-reconciler-23'] }),\n      commonjs({ esmExternals: (id) => id === 'scheduler' }),\n      trimReconciler(),\n      terser({ compress: { dead_code: true } }),\n    ],\n  },\n  {\n    input: 'src/reconciler-31.ts',\n    output: { format: 'es', file: 'lib/reconciler-31.js' },\n    plugins: [\n      typescript(),\n      resolve({ resolveOnly: ['react-reconciler-31'] }),\n      commonjs({ esmExternals: (id) => id === 'scheduler' }),\n      trimReconciler(),\n      terser({ compress: { dead_code: true } }),\n    ],\n  },\n  {\n    input: 'src/reconciler-33.ts',\n    output: { format: 'es', file: 'lib/reconciler-33.js' },\n    plugins: [\n      typescript(),\n      resolve({ resolveOnly: ['react-reconciler-33'] }),\n      commonjs({ esmExternals: (id) => id === 'scheduler' }),\n      trimReconciler(),\n      terser({ compress: { dead_code: true } }),\n    ],\n  },\n  {\n    input: './lib/types/index.d.ts',\n    output: [{ file: 'lib/index.d.ts', format: 'es' }],\n    plugins: [dts(), del({ targets: 'lib/types', hook: 'buildEnd' })],\n  },\n];\n"
  },
  {
    "path": "packages/reconciler/src/index.ts",
    "content": "import React from 'react';\nimport createRendererForReact19 from './reconciler-31.js';\nimport createRendererForReact19_2 from './reconciler-33.js';\nimport createRendererForReact18AndLess from './reconciler-23.js';\n\nconst [major, minor] = React.version.split('.').map((v) => parseInt(v, 10));\n\nlet renderer;\n\nif (major >= 20 || (major === 19 && minor >= 2)) {\n  // Use the reconciler built for 19.2, assuming it's compatible with later versions.\n  renderer = createRendererForReact19_2;\n} else if (major === 19) {\n  // Use the older 19.x reconciler (for 19.0.x and 19.1.x)\n  renderer = createRendererForReact19;\n} else {\n  // Fallback for React 18.x and previous versions.\n  renderer = createRendererForReact18AndLess;\n}\n\nexport default renderer;\n"
  },
  {
    "path": "packages/reconciler/src/propsEqual.ts",
    "content": "/**\n * Checks if two sets of props are equal (recursively)\n *\n * @param {Object} a props A\n * @param {Object} b props B\n * @returns {boolean} props equals?\n *\n */\nconst propsEqual = (a, b) => {\n  const oldPropsKeys = Object.keys(a);\n  const newPropsKeys = Object.keys(b);\n\n  if (oldPropsKeys.length !== newPropsKeys.length) {\n    return false;\n  }\n\n  for (let i = 0; i < oldPropsKeys.length; i += 1) {\n    const propName = oldPropsKeys[i];\n\n    if (propName === 'render' && !a[propName] !== !b[propName]) {\n      return false;\n    }\n\n    if (propName !== 'children' && a[propName] !== b[propName]) {\n      if (\n        typeof a[propName] === 'object' &&\n        typeof b[propName] === 'object' &&\n        propsEqual(a[propName], b[propName])\n      ) {\n        continue;\n      }\n\n      return false;\n    }\n\n    if (\n      propName === 'children' &&\n      (typeof a[propName] === 'string' || typeof b[propName] === 'string')\n    ) {\n      return a[propName] === b[propName];\n    }\n  }\n\n  return true;\n};\n\nexport default propsEqual;\n"
  },
  {
    "path": "packages/reconciler/src/reconciler-23.ts",
    "content": "import Reconciler from 'react-reconciler-23/cjs/react-reconciler.production.min.js';\n\nimport propsEqual from './propsEqual';\nimport { ReconcilerFactory } from './types';\n\nconst emptyObject = {};\n\nconst createRenderer: ReconcilerFactory = ({\n  appendChild,\n  appendChildToContainer,\n  commitTextUpdate,\n  commitUpdate,\n  createInstance,\n  createTextInstance,\n  insertBefore,\n  removeChild,\n  removeChildFromContainer,\n  resetAfterCommit,\n}) => {\n  return Reconciler({\n    appendChild,\n    appendChildToContainer,\n    appendInitialChild: appendChild,\n    createInstance,\n    createTextInstance,\n    insertBefore,\n    commitUpdate,\n    commitTextUpdate,\n    removeChild,\n    removeChildFromContainer,\n    resetAfterCommit,\n    shouldSetTextContent: () => false,\n    finalizeInitialChildren: () => false,\n    getPublicInstance: (instance) => instance,\n    getRootHostContext: () => emptyObject,\n    getChildHostContext: () => emptyObject,\n    prepareForCommit() {},\n    clearContainer() {},\n    resetTextContent() {},\n    prepareUpdate: (element, type, oldProps, newProps) =>\n      !propsEqual(oldProps, newProps),\n  });\n};\n\nexport default createRenderer;\n"
  },
  {
    "path": "packages/reconciler/src/reconciler-31.ts",
    "content": "import Reconciler from 'react-reconciler-31';\nimport {\n  ConcurrentRoot,\n  DefaultEventPriority,\n} from 'react-reconciler-31/constants';\n\nimport propsEqual from './propsEqual';\nimport { ReconcilerFactory } from './types';\n\nconst emptyObject = {};\n\nconst logRecoverableError = console.error;\n\nconst createRenderer: ReconcilerFactory = ({\n  appendChild,\n  appendChildToContainer,\n  commitTextUpdate,\n  commitUpdate,\n  createInstance,\n  createTextInstance,\n  insertBefore,\n  removeChild,\n  removeChildFromContainer,\n  resetAfterCommit,\n}) => {\n  const _commitUpdate = (instance, type, oldProps, newProps) => {\n    if (propsEqual(oldProps, newProps)) return;\n    commitUpdate(instance, null, type, oldProps, newProps);\n  };\n\n  const reconciler = Reconciler({\n    appendChild,\n    appendChildToContainer,\n    appendInitialChild: appendChild,\n    createInstance,\n    createTextInstance,\n    insertBefore,\n    commitUpdate: _commitUpdate,\n    commitTextUpdate,\n    removeChild,\n    removeChildFromContainer,\n    resetAfterCommit,\n    noTimeout: -1,\n    shouldSetTextContent: () => false,\n    finalizeInitialChildren: () => false,\n    getPublicInstance: (instance) => instance,\n    getRootHostContext: () => emptyObject,\n    getChildHostContext: () => emptyObject,\n    prepareForCommit() {},\n    clearContainer() {},\n    resetTextContent() {},\n    getCurrentUpdatePriority: () => DefaultEventPriority,\n    maySuspendCommit: () => false,\n    requestPostPaintCallback: () => {},\n    resolveUpdatePriority: () => DefaultEventPriority,\n    setCurrentUpdatePriority: () => {},\n    shouldAttemptEagerTransition: () => false,\n    detachDeletedInstance: () => {},\n  });\n\n  const createContainer = (container) => {\n    return reconciler.createContainer(\n      container,\n      ConcurrentRoot, // tag\n      null, // hydration callbacks\n      false, // isStrictMode\n      null, // concurrentUpdatesByDefaultOverride\n      '', // identifierPrefix\n      logRecoverableError, // onUncaughtError\n      logRecoverableError, // onCaughtError\n      logRecoverableError, // onRecoverableError\n      null, // transitionCallbacks\n    );\n  };\n\n  const updateContainer = (doc, mountNode, parentComponent, callback) => {\n    reconciler.updateContainerSync(doc, mountNode, parentComponent, callback);\n    reconciler.flushSyncWork();\n  };\n\n  return {\n    createContainer,\n    updateContainer,\n  };\n};\n\nexport default createRenderer;\n"
  },
  {
    "path": "packages/reconciler/src/reconciler-33.ts",
    "content": "import Reconciler from 'react-reconciler-33';\nimport {\n  ConcurrentRoot,\n  DefaultEventPriority,\n} from 'react-reconciler-33/constants';\n\nimport propsEqual from './propsEqual';\nimport { ReconcilerFactory } from './types';\n\nconst emptyObject = {};\n\nconst logRecoverableError = console.error;\n\nconst createRenderer: ReconcilerFactory = ({\n  appendChild,\n  appendChildToContainer,\n  commitTextUpdate,\n  commitUpdate,\n  createInstance,\n  createTextInstance,\n  insertBefore,\n  removeChild,\n  removeChildFromContainer,\n  resetAfterCommit,\n}) => {\n  const _commitUpdate = (instance, type, oldProps, newProps) => {\n    if (propsEqual(oldProps, newProps)) return;\n    commitUpdate(instance, null, type, oldProps, newProps);\n  };\n\n  const reconciler = Reconciler({\n    appendChild,\n    appendChildToContainer,\n    appendInitialChild: appendChild,\n    createInstance,\n    createTextInstance,\n    insertBefore,\n    commitUpdate: _commitUpdate,\n    commitTextUpdate,\n    removeChild,\n    removeChildFromContainer,\n    resetAfterCommit,\n    noTimeout: -1,\n    shouldSetTextContent: () => false,\n    finalizeInitialChildren: () => false,\n    getPublicInstance: (instance) => instance,\n    getRootHostContext: () => emptyObject,\n    getChildHostContext: () => emptyObject,\n    prepareForCommit() {},\n    clearContainer() {},\n    resetTextContent() {},\n    getCurrentUpdatePriority: () => DefaultEventPriority,\n    maySuspendCommit: () => false,\n    requestPostPaintCallback: () => {},\n    resolveUpdatePriority: () => DefaultEventPriority,\n    setCurrentUpdatePriority: () => {},\n    shouldAttemptEagerTransition: () => false,\n    detachDeletedInstance: () => {},\n    resolveEventTimeStamp: () => {},\n    resolveEventType: () => {},\n    trackSchedulerEvent: () => {},\n  });\n\n  const createContainer = (container) => {\n    return reconciler.createContainer(\n      container, // containerInfo: Container\n      ConcurrentRoot, // tag: RootTag\n      null, // hydration callbacks: null | SuspenseHydrationCallbacks\n      false, // isStrictMode: boolean\n      null, // concurrentUpdatesByDefaultOverride: null | boolean\n      '', // identifierPrefix: string\n      logRecoverableError, // onUncaughtError: (error: mixed, errorInfo: {+componentStack?: ?string}) => void\n      logRecoverableError, // onCaughtError: (error: mixed, errorInfo: { ... }) => void\n      logRecoverableError, // onRecoverableError: (error: mixed, errorInfo: {+componentStack?: ?string}) => void\n      () => {}, // NEW IN REACT 19.2.0: onDefaultTransitionIndicator: () => void | (() => void)\n      null, // transitionCallbacks: null | TransitionTracingCallbacks\n    );\n  };\n\n  const updateContainer = (doc, mountNode, parentComponent, callback) => {\n    reconciler.updateContainerSync(doc, mountNode, parentComponent, callback);\n    reconciler.flushSyncWork();\n  };\n\n  return {\n    createContainer,\n    updateContainer,\n  };\n};\n\nexport default createRenderer;\n"
  },
  {
    "path": "packages/reconciler/src/types.ts",
    "content": "export interface Reconciler<T> {\n  createContainer: (container: any) => T;\n  updateContainer: (\n    element: T,\n    container: T,\n    parentComponent: T,\n    callback?: () => void,\n  ) => void;\n}\n\nexport type ReconcilerFactory = <I, T>(config: {\n  appendChild: (parent: I, child: I | T) => void;\n  appendChildToContainer: (parent: I, child: I | T) => void;\n  commitTextUpdate: (textInstance: T, oldText: string, newText: string) => void;\n  commitUpdate: (\n    instance: I,\n    updatePayload: any,\n    type: string,\n    oldProps: any,\n    newProps: any,\n  ) => void;\n  createInstance: (type: string, props: any) => I;\n  createTextInstance: (text: string) => T;\n  insertBefore: (parent: I, child: I | T, beforeChild: I | T) => void;\n  removeChild: (parent: I, child: I | T) => void;\n  removeChildFromContainer: (parent: I, child: I | T) => void;\n  resetAfterCommit: () => void;\n}) => Reconciler<I>;\n"
  },
  {
    "path": "packages/reconciler/tests/propsEqual.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport propsEqual from '../src/propsEqual';\n\ndescribe('propsEqual', () => {\n  test('should be true for two empty objects', () => {\n    expect(propsEqual({}, {})).toBeTruthy();\n  });\n\n  test('should be true for equal objects', () => {\n    const a = { foo: 'bar', bar: 'foo' };\n    const b = { bar: 'foo', foo: 'bar' };\n\n    expect(propsEqual(a, b)).toBeTruthy();\n  });\n\n  test('should be false for diffent length objects', () => {\n    const a = { foo: 'bar', bar: 'foo' };\n    const b = { baz: 'foo' };\n\n    expect(propsEqual(a, b)).toBeFalsy();\n  });\n\n  test('should be false if string children attributes differ', () => {\n    const a = { foo: 'bar', children: 'test' };\n    const b = { foo: 'bar', children: 'else' };\n\n    expect(propsEqual(a, b)).toBeFalsy();\n  });\n\n  test('should be false if nested values differ', () => {\n    const a = { foo: 'bar', something: { hey: 'there' } };\n    const b = { foo: 'bar', something: { hey: 'back' } };\n\n    expect(propsEqual(a, b)).toBeFalsy();\n  });\n});\n"
  },
  {
    "path": "packages/reconciler/tsconfig.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"compilerOptions\": {\n    \"outDir\": \"lib\",\n    \"declaration\": true,\n    \"declarationDir\": \"lib/types\",\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2022\", \"DOM\"],\n    \"moduleResolution\": \"Node\",\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": false,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"types\": [\"vitest/globals\"],\n  },\n  \"include\": [\"src\", \"globals.d.ts\"],\n}\n"
  },
  {
    "path": "packages/render/.gitignore",
    "content": "lib\n"
  },
  {
    "path": "packages/render/CHANGELOG.md",
    "content": "# @react-pdf/render\n\n## 4.3.2\n\n### Patch Changes\n\n- Updated dependencies [[`f034491b`](https://github.com/diegomura/react-pdf/commit/f034491b1f77ce6f18a5db88e70b10b9c502ca35)]:\n  - @react-pdf/textkit@6.1.0\n  - @react-pdf/types@2.9.2\n\n## 4.3.1\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/types@2.9.1\n\n## 4.3.0\n\n### Minor Changes\n\n- [#3112](https://github.com/diegomura/react-pdf/pull/3112) [`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a) Thanks [@diegomura](https://github.com/diegomura)! - feat: add xLinkHref, gradientTransform and gradientUnits support\n\n### Patch Changes\n\n- [`01b4ff5c`](https://github.com/diegomura/react-pdf/commit/01b4ff5cb00420dd37c2f28fb95822dd18cdd982) Thanks [@diegomura](https://github.com/diegomura)! - fix: debug prop\n\n- Updated dependencies [[`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a)]:\n  - @react-pdf/types@2.9.0\n\n## 4.2.1\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/types@2.8.2\n\n## 4.2.0\n\n### Minor Changes\n\n- [#3098](https://github.com/diegomura/react-pdf/pull/3098) [`bfb51ec0`](https://github.com/diegomura/react-pdf/commit/bfb51ec09b851c52659ce16fed1286173e9516a9) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert render package to TS\n\n- [#3102](https://github.com/diegomura/react-pdf/pull/3102) [`24690f52`](https://github.com/diegomura/react-pdf/commit/24690f5238e4eacf28351cf9996856a7d196d29e) Thanks [@diegomura](https://github.com/diegomura)! - feat: handle standard fonts in fonts package\n\n### Patch Changes\n\n- [#3104](https://github.com/diegomura/react-pdf/pull/3104) [`ddfa3675`](https://github.com/diegomura/react-pdf/commit/ddfa367587618b313b4b0b3b57a9a7631e8e7604) Thanks [@diegomura](https://github.com/diegomura)! - feat(textkit): expect font array\n\n- Updated dependencies [[`7cd66e4f`](https://github.com/diegomura/react-pdf/commit/7cd66e4fc37cd1393adc6250a919fe2629812082), [`ddfa3675`](https://github.com/diegomura/react-pdf/commit/ddfa367587618b313b4b0b3b57a9a7631e8e7604), [`c7b74963`](https://github.com/diegomura/react-pdf/commit/c7b749632f07db7808d58d99357dc830d4895da8), [`bfb51ec0`](https://github.com/diegomura/react-pdf/commit/bfb51ec09b851c52659ce16fed1286173e9516a9), [`24690f52`](https://github.com/diegomura/react-pdf/commit/24690f5238e4eacf28351cf9996856a7d196d29e), [`481b536f`](https://github.com/diegomura/react-pdf/commit/481b536f4ad145fb227829399b85a35838a506f8), [`b06d3a0f`](https://github.com/diegomura/react-pdf/commit/b06d3a0f64593ac18097efd061334f1e5bd70095)]:\n  - @react-pdf/types@2.8.1\n  - @react-pdf/textkit@6.0.0\n  - @react-pdf/fns@3.1.2\n\n## 4.1.2\n\n### Patch Changes\n\n- [#3065](https://github.com/diegomura/react-pdf/pull/3065) [`226467e3`](https://github.com/diegomura/react-pdf/commit/226467e39443d3690b8f8c3298aa8278b43fbfa6) Thanks [@diegomura](https://github.com/diegomura)! - refactor: partially unify pdfkit\n\n- Updated dependencies [[`96c2464d`](https://github.com/diegomura/react-pdf/commit/96c2464dfaa7294e0d79b7ed64743bfd7b1a8c72), [`24fe4bf8`](https://github.com/diegomura/react-pdf/commit/24fe4bf894fff055121926488b30d0bf212a9c45), [`700535c5`](https://github.com/diegomura/react-pdf/commit/700535c57ff1b105d923be70f4fc4bfdf4479f91), [`442ce355`](https://github.com/diegomura/react-pdf/commit/442ce35534f916b9146a35fd03870387ed488d92), [`3007d34a`](https://github.com/diegomura/react-pdf/commit/3007d34ad3e10bf32ada3631938f5bb08e1c549f)]:\n  - @react-pdf/primitives@4.1.1\n  - @react-pdf/types@2.8.0\n  - @react-pdf/fns@3.1.1\n  - @react-pdf/textkit@5.0.3\n\n## 4.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`d36ace66`](https://github.com/diegomura/react-pdf/commit/d36ace66c77d57d845894e89772be7ae0cdd25ee)]:\n  - @react-pdf/fns@3.1.0\n  - @react-pdf/textkit@5.0.2\n\n## 4.1.0\n\n### Minor Changes\n\n- [`7cd71714`](https://github.com/diegomura/react-pdf/commit/7cd7171472b0f300db56b7805c5f966bf4ced6e2) Thanks [@diegomura](https://github.com/diegomura)! - feat: added Form Annotation support\n\n### Patch Changes\n\n- [#3062](https://github.com/diegomura/react-pdf/pull/3062) [`5cc47319`](https://github.com/diegomura/react-pdf/commit/5cc47319bb428f6d4bcad21cd6dba9afca5cdc17) Thanks [@diegomura](https://github.com/diegomura)! - refactor: unify pdfkit image mixin\n\n- Updated dependencies [[`7cd71714`](https://github.com/diegomura/react-pdf/commit/7cd7171472b0f300db56b7805c5f966bf4ced6e2), [`01944231`](https://github.com/diegomura/react-pdf/commit/01944231a342d502b832aeecb4c313020b8360c8)]:\n  - @react-pdf/primitives@4.1.0\n  - @react-pdf/types@2.7.1\n\n## 4.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`00bfdc1e`](https://github.com/diegomura/react-pdf/commit/00bfdc1e5a6c673d2de7b3ab09d5020e932562fb)]:\n  - @react-pdf/textkit@5.0.1\n\n## 4.0.1\n\n### Patch Changes\n\n- [#2948](https://github.com/diegomura/react-pdf/pull/2948) [`03322a75`](https://github.com/diegomura/react-pdf/commit/03322a756f44863543673ff597582444c180989b) Thanks [@diegomura](https://github.com/diegomura)! - fix: stroke dash array computation\n\n- [#2945](https://github.com/diegomura/react-pdf/pull/2945) [`b5c0fe64`](https://github.com/diegomura/react-pdf/commit/b5c0fe646108a960a528290b175511842020d600) Thanks [@diegomura](https://github.com/diegomura)! - fix: skew transformation\n\n## 4.0.0\n\n### Major Changes\n\n- [#2871](https://github.com/diegomura/react-pdf/pull/2871) [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119) Thanks [@diegomura](https://github.com/diegomura)! - feat!: drop cjs support\n\n### Patch Changes\n\n- Updated dependencies [[`46c3047d`](https://github.com/diegomura/react-pdf/commit/46c3047de56ae82f062b72c4910a4e6096eee99f), [`55973278`](https://github.com/diegomura/react-pdf/commit/55973278ac8bc8f703b63844f57d6f155ae8d86f), [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119)]:\n  - @react-pdf/types@2.7.0\n  - @react-pdf/primitives@4.0.0\n  - @react-pdf/textkit@5.0.0\n  - @react-pdf/fns@3.0.0\n\n## 3.5.0\n\n### Minor Changes\n\n- [#2771](https://github.com/diegomura/react-pdf/pull/2771) [`8e6a832`](https://github.com/diegomura/react-pdf/commit/8e6a8320f86354aff950c296a96bc41a33e9dab2) Thanks [@nikischin](https://github.com/nikischin)! - fix: fix dpi\n\n### Patch Changes\n\n- [#2836](https://github.com/diegomura/react-pdf/pull/2836) [`53bf803`](https://github.com/diegomura/react-pdf/commit/53bf803465f4fecf13531d1a10697c3d4067cf8f) Thanks [@obi-awyss](https://github.com/obi-awyss)! - [fix] \"TypeError: renderFn is not a function\"\n  It may also address issue #2644\n- Updated dependencies [[`8e6a832`](https://github.com/diegomura/react-pdf/commit/8e6a8320f86354aff950c296a96bc41a33e9dab2), [`4bafab8`](https://github.com/diegomura/react-pdf/commit/4bafab8455c9003759f48bad20a720baf4ed189b)]:\n  - @react-pdf/types@2.6.0\n\n## 3.4.4\n\n### Patch Changes\n\n- Updated dependencies [[`22a34a9`](https://github.com/diegomura/react-pdf/commit/22a34a91b16a201cd8288e0dbea9368b12ca73f5)]:\n  - @react-pdf/types@2.5.0\n\n## 3.4.3\n\n### Patch Changes\n\n- [#2605](https://github.com/diegomura/react-pdf/pull/2605) [`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - fix: fix CJS compatibility\n\n- Updated dependencies [[`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71)]:\n  - @react-pdf/textkit@4.4.1\n  - @react-pdf/fns@2.2.1\n\n## 3.4.2\n\n### Patch Changes\n\n- Updated dependencies [[`9af07fe`](https://github.com/diegomura/react-pdf/commit/9af07feb59c2fe9c1d8960ac95f6fa6e03d16235), [`8350154`](https://github.com/diegomura/react-pdf/commit/83501541e3a050021e18e112bb472b2dabc142a7)]:\n  - @react-pdf/types@2.4.1\n  - @react-pdf/textkit@4.4.0\n  - @react-pdf/fns@2.2.0\n\n## 3.4.1\n\n### Patch Changes\n\n- [#2544](https://github.com/diegomura/react-pdf/pull/2544) [`b5380a1`](https://github.com/diegomura/react-pdf/commit/b5380a1a0a7397b4111d68ce97b4acb702d34d51) Thanks [@satelllte](https://github.com/satelllte)! - fix: creationDate and modificationDate types\n\n## 3.4.0\n\n### Minor Changes\n\n- [#2539](https://github.com/diegomura/react-pdf/pull/2539) [`fb5273d`](https://github.com/diegomura/react-pdf/commit/fb5273d8d80d919f7b9c214e02d67b79ce23fa19) Thanks [@diegomura](https://github.com/diegomura)! - feat: add creation and modification dates\n\n### Patch Changes\n\n- [#2538](https://github.com/diegomura/react-pdf/pull/2538) [`cfd050c`](https://github.com/diegomura/react-pdf/commit/cfd050c3ae0980f78c4a466565852d81c8254e19) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Fix strokeDasharray crash\n\n- Updated dependencies [[`fb5273d`](https://github.com/diegomura/react-pdf/commit/fb5273d8d80d919f7b9c214e02d67b79ce23fa19)]:\n  - @react-pdf/types@2.4.0\n\n## 3.3.2\n\n### Patch Changes\n\n- Updated dependencies [[`9e5842b`](https://github.com/diegomura/react-pdf/commit/9e5842bbecca6e249af2c5fc50078bb7ddd5420f)]:\n  - @react-pdf/types@2.3.6\n\n## 3.3.1\n\n### Patch Changes\n\n- Updated dependencies [[`42bbbda`](https://github.com/diegomura/react-pdf/commit/42bbbda48058acd2d36d7a92c812d133608c459e)]:\n  - @react-pdf/primitives@3.1.1\n\n## 3.3.0\n\n### Minor Changes\n\n- [#2409](https://github.com/diegomura/react-pdf/pull/2409) [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Add support for native ESM\n\n### Patch Changes\n\n- [#2498](https://github.com/diegomura/react-pdf/pull/2498) [`6bfe7e8`](https://github.com/diegomura/react-pdf/commit/6bfe7e8a30d96c04a1552800159992705f3605b1) Thanks [@diegomura](https://github.com/diegomura)! - fix: color parse error\n\n- Updated dependencies [[`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37)]:\n  - @react-pdf/primitives@3.1.0\n  - @react-pdf/textkit@4.3.0\n  - @react-pdf/fns@2.1.0\n\n## 3.2.8\n\n### Patch Changes\n\n- [#2363](https://github.com/diegomura/react-pdf/pull/2363) [`8654d00`](https://github.com/diegomura/react-pdf/commit/8654d003023dd0899cddfc2ea2f5a552e01cf570) Thanks [@azmy60](https://github.com/azmy60)! - fix: SVGPresentationAttributes types\n\n- Updated dependencies [[`e5c8fde`](https://github.com/diegomura/react-pdf/commit/e5c8fde9379a9a85ecac7e3d6273953e39d65f8d), [`45b2bd3`](https://github.com/diegomura/react-pdf/commit/45b2bd37037c605727ad5783f2f2a438dc19cac4), [`1f987cc`](https://github.com/diegomura/react-pdf/commit/1f987cc27c3fd1ef1b6748ebe58a289a78b538d2), [`4c40b14`](https://github.com/diegomura/react-pdf/commit/4c40b149cfed42f2513e1dd330a92ccc3363c04f)]:\n  - @react-pdf/types@2.3.5\n  - @react-pdf/textkit@4.2.1\n\n## 3.2.7\n\n### Patch Changes\n\n- Updated dependencies [[`4a55c1b`](https://github.com/diegomura/react-pdf/commit/4a55c1b2ed19e460ccae6e749ed94c16729a23c4)]:\n  - @react-pdf/types@2.3.4\n\n## 3.2.6\n\n### Patch Changes\n\n- [#2320](https://github.com/diegomura/react-pdf/pull/2320) [`5385a43`](https://github.com/diegomura/react-pdf/commit/5385a438cb4876d1dc00d49d5fdd2e07c0d16167) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Fixed empty strings replaced with defaults in `creator` and `producer` props\n\n- Updated dependencies [[`1e1fbdc`](https://github.com/diegomura/react-pdf/commit/1e1fbdc3c33ced46d8c7ebba7a196733cb789d59), [`8636812`](https://github.com/diegomura/react-pdf/commit/86368122ed87621d19ae3bc248080e17703d9fcb)]:\n  - @react-pdf/types@2.3.3\n\n## 3.2.5\n\n### Patch Changes\n\n- [#2311](https://github.com/diegomura/react-pdf/pull/2311) [`2e724df`](https://github.com/diegomura/react-pdf/commit/2e724dfaff3c9b39e9862d24b0d0e037c8a9e8c2) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Fixed crash on `transform=\"translate(1)\"`\n\n* [#2314](https://github.com/diegomura/react-pdf/pull/2314) [`d6018d5`](https://github.com/diegomura/react-pdf/commit/d6018d5a80492270ff5f5b4c00e694f7dc1cd93f) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Make `cx` and `cy` optional in `Circle` and `Ellipse`\n\n* Updated dependencies [[`a25dbcb`](https://github.com/diegomura/react-pdf/commit/a25dbcb32b65c300f5b088e8b210bb0c1abca5c2)]:\n  - @react-pdf/types@2.3.2\n\n## 3.2.4\n\n### Patch Changes\n\n- Updated dependencies [[`47e91cb`](https://github.com/diegomura/react-pdf/commit/47e91cbd8016046bb4e8389ba0d1c7ede9edce59)]:\n  - @react-pdf/types@2.3.1\n\n## 3.2.3\n\n### Patch Changes\n\n- Updated dependencies [[`2db67a3`](https://github.com/diegomura/react-pdf/commit/2db67a38b9be98b7816a2b5aa4733446b95e3724), [`eff1ff0`](https://github.com/diegomura/react-pdf/commit/eff1ff0fefcd710994e4654904ef55843af76a17)]:\n  - @react-pdf/textkit@4.2.0\n  - @react-pdf/types@2.3.0\n  - @react-pdf/fns@2.0.1\n\n## 3.2.2\n\n### Patch Changes\n\n- [#2205](https://github.com/diegomura/react-pdf/pull/2205) [`9a5e0be`](https://github.com/diegomura/react-pdf/commit/9a5e0befb89756db07ce053192a136df9d4ba905) Thanks [@jeetiss](https://github.com/jeetiss)! - update babel\n\n- Updated dependencies [[`9a5e0be`](https://github.com/diegomura/react-pdf/commit/9a5e0befb89756db07ce053192a136df9d4ba905)]:\n  - @react-pdf/textkit@4.1.1\n\n## 3.2.1\n\n### Patch Changes\n\n- Updated dependencies [[`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81), [`4bb97c3`](https://github.com/diegomura/react-pdf/commit/4bb97c3b92e82d7d7be2698c770f42560c6fcab6)]:\n  - @react-pdf/fns@2.0.0\n  - @react-pdf/textkit@4.1.0\n\n## 3.2.0\n\n### Minor Changes\n\n- [#1892](https://github.com/diegomura/react-pdf/pull/1892) [`035d3f8`](https://github.com/diegomura/react-pdf/commit/035d3f8d24fa4f4af9f350950d81b51547858367) Thanks [@diegomura](https://github.com/diegomura)! - feat: add skew transformation support\n\n### Patch Changes\n\n- [#1906](https://github.com/diegomura/react-pdf/pull/1906) [`884695b`](https://github.com/diegomura/react-pdf/commit/884695b44feb974f155c83e0714e8e939b4f641b) Thanks [@diegomura](https://github.com/diegomura)! - feat: build textkit with rollup & define public api\n\n- Updated dependencies [[`0fcc594`](https://github.com/diegomura/react-pdf/commit/0fcc594310d5af30ca1e752b3efc7a047e813dcb), [`37a9a74`](https://github.com/diegomura/react-pdf/commit/37a9a747f7677fa05e3ddf5669c0379aa65c1e39), [`884695b`](https://github.com/diegomura/react-pdf/commit/884695b44feb974f155c83e0714e8e939b4f641b)]:\n  - @react-pdf/textkit@4.0.0\n\n## 3.1.0\n\n### Minor Changes\n\n- [#1862](https://github.com/diegomura/react-pdf/pull/1862) [`1411d16`](https://github.com/diegomura/react-pdf/commit/1411d162e04ca237bad93729695c363fdf4bdbeb) Thanks [@diegomura](https://github.com/diegomura)! - feat: bookmarks support\n\n* [#1869](https://github.com/diegomura/react-pdf/pull/1869) [`5d2c308`](https://github.com/diegomura/react-pdf/commit/5d2c3088cf438a8abf1038b14a21117fecf59d57) Thanks [@diegomura](https://github.com/diegomura)! - feat: variable dpi\n\n### Patch Changes\n\n- [#1863](https://github.com/diegomura/react-pdf/pull/1863) [`eecddbd`](https://github.com/diegomura/react-pdf/commit/eecddbda083561273eda21ee9b8d6107ad21800b) Thanks [@diegomura](https://github.com/diegomura)! - fix: dont use global image cache\n\n* [#1864](https://github.com/diegomura/react-pdf/pull/1864) [`205aa03`](https://github.com/diegomura/react-pdf/commit/205aa0334c67e7436d0a35b95b919ecee189a192) Thanks [@diegomura](https://github.com/diegomura)! - fix: props undefiend access\n\n- [#1857](https://github.com/diegomura/react-pdf/pull/1857) [`d958b0a`](https://github.com/diegomura/react-pdf/commit/d958b0ae06a61c157b2581488a9121a0464222f4) Thanks [@diegomura](https://github.com/diegomura)! - feat: embed same image once in final document\n\n* [#1865](https://github.com/diegomura/react-pdf/pull/1865) [`24f5c77`](https://github.com/diegomura/react-pdf/commit/24f5c77706e12dbab45053cb704a2fe7cf60eb53) Thanks [@diegomura](https://github.com/diegomura)! - feat: add background color and border with Note support\n\n- [#1855](https://github.com/diegomura/react-pdf/pull/1855) [`9347466`](https://github.com/diegomura/react-pdf/commit/9347466e8cd33d149678903cf4cf53850a8fc64a) Thanks [@diegomura](https://github.com/diegomura)! - fix: image dimension warning for JSON sources\n\n* [#1861](https://github.com/diegomura/react-pdf/pull/1861) [`6730bc2`](https://github.com/diegomura/react-pdf/commit/6730bc210712e6fc67b94f89f23a3d86f6a203f9) Thanks [@diegomura](https://github.com/diegomura)! - fix: image opacity 0 rendering\n\n- [#1859](https://github.com/diegomura/react-pdf/pull/1859) [`810f459`](https://github.com/diegomura/react-pdf/commit/810f45904e9abeaff5583ed4ceb6d77e123bbaea) Thanks [@diegomura](https://github.com/diegomura)! - feat: build render package as ES module\n\n- Updated dependencies [[`1411d16`](https://github.com/diegomura/react-pdf/commit/1411d162e04ca237bad93729695c363fdf4bdbeb), [`4fadb48`](https://github.com/diegomura/react-pdf/commit/4fadb48983d7269452f89f80c7e341ece859aaee), [`ce8762f`](https://github.com/diegomura/react-pdf/commit/ce8762f6de5c796e69ec5a225c7f3ff9c619a960), [`5d2c308`](https://github.com/diegomura/react-pdf/commit/5d2c3088cf438a8abf1038b14a21117fecf59d57)]:\n  - @react-pdf/types@2.1.0\n\n## 3.0.0\n\n### Major Changes\n\n- [#1834](https://github.com/diegomura/react-pdf/pull/1834) [`7e97bb5`](https://github.com/diegomura/react-pdf/commit/7e97bb579aaa847e5a2de650b5b327ac90a465c7) Thanks [@diegomura](https://github.com/diegomura)! - refactor: remove ramda from render package\n\n### Patch Changes\n\n- [#1827](https://github.com/diegomura/react-pdf/pull/1827) [`7c1d373`](https://github.com/diegomura/react-pdf/commit/7c1d373a06b04369e762069be4b96d4e40371ecc) Thanks [@diegomura](https://github.com/diegomura)! - refactor: remove ramda from layout package\n\n* [#1838](https://github.com/diegomura/react-pdf/pull/1838) [`9bdb5c9`](https://github.com/diegomura/react-pdf/commit/9bdb5c934a822340754cd4c892d399f91f6218de) Thanks [@diegomura](https://github.com/diegomura)! - feat: create fns package\n\n* Updated dependencies [[`e938df0`](https://github.com/diegomura/react-pdf/commit/e938df0857642707b10b7f65f17ed22dc394ac1b), [`9bdb5c9`](https://github.com/diegomura/react-pdf/commit/9bdb5c934a822340754cd4c892d399f91f6218de), [`fe0f214`](https://github.com/diegomura/react-pdf/commit/fe0f214dbbf2f632b852ebfe65f886ecc4dd6953), [`9a2b935`](https://github.com/diegomura/react-pdf/commit/9a2b935cfe173f80425ed87d9f474da271c050d2)]:\n  - @react-pdf/primitives@3.0.0\n  - @react-pdf/fns@1.0.0\n  - @react-pdf/textkit@3.0.0\n  - @react-pdf/types@2.0.9\n\n## 2.1.0\n\n### Minor Changes\n\n- [#1654](https://github.com/diegomura/react-pdf/pull/1654) [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b) Thanks [@jeetiss](https://github.com/jeetiss)! - added `@babel/runtime` to dependencies\n\n### Patch Changes\n\n- [#1648](https://github.com/diegomura/react-pdf/pull/1648) [`46a4b0c`](https://github.com/diegomura/react-pdf/commit/46a4b0c88836e0653db0c8bae6f71f969882277c) Thanks [@jeetiss](https://github.com/jeetiss)! - fixed render crush when a node has `debug` prop and `margin: auto`\n\n* [#1581](https://github.com/diegomura/react-pdf/pull/1581) [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca) Thanks [@jeetiss](https://github.com/jeetiss)! - added changelog with changesets\n\n* Updated dependencies [[`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca), [`5d2d688`](https://github.com/diegomura/react-pdf/commit/5d2d688e18c830bb96c6e08446437d29f9f9c65f), [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b)]:\n  - @react-pdf/primitives@2.0.2\n  - @react-pdf/textkit@2.1.0\n  - @react-pdf/types@2.0.8\n"
  },
  {
    "path": "packages/render/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n# @react-pdf/render\n\n> React-pdf render engine\n\n## How to install\n\n```sh\nyarn add @react-pdf/render\n```\n\n## How it works\n\n```js\nimport render from '@react-pdf/render';\nimport primitives from '@react-pdf/primitives';\n\nconst view = {\n  type: primitives.View,\n  style: {\n    backgroundColor: 'red',\n    borderTopLeftRadius: 5,\n    borderTopRightRadius: 10,\n    borderBottomLeftRadius: 0,\n    borderBottomRightRadius: 15,\n    borderTopColor: 'yellow',\n    borderLeftColor: 'green',\n    borderBottomColor: 'black',\n    borderRightColor: 'purple',\n  },\n  box: {\n    left: 20,\n    top: 20,\n    width: 100,\n    height: 80,\n    borderTopWidth: 3,\n    borderLeftWidth: 2,\n    borderBottomWidth: 1,\n    borderRightWidth: 4,\n  },\n};\n\nconst doc = {\n  type: primitives.Document,\n  children: [\n    {\n      type: primitives.Page,\n      box: { width: 400, height: 600 },\n      children: [view],\n    },\n  ],\n};\n\n// Provide your own context\nconst ctx = createContext();\n\nrender.default(ctx, doc);\n```\n\nThis library exports a `render` function that takes two arguments:\n\n- _ctx_: This is the target context where the document is going to be rendered. React-pdf currently uses a [pdfkit](https://github.com/react-pdf/pdfkit) document as context, but it can target any other type of structure as long as it signature matches pdfkit API. In the future this will enable rendering documents into muliple formats in addition to PDF.\n- _node_: Document root node. A node is a nested structure that defines a single element in a document. They are defined by it's `type` and arguments.\n\n## Node structure\n\nA node represents a single element inside a document. It's mainly defined by it's `type` (mandatory) field in addition to other values to define where that element is positioned inside the document (`box`), how it looks (`style`), how it should behave (`params`) and what sub-nodes it contains (`children`).\n\nThe root node must always be of type `DOCUMENT`, containing as many `PAGE` nodes as desired inside it's children field.\n\nBare in mind this package does not handle any type of node positioning, inheritance, style transformations or any other layout related logic. It's role is limited to render exactly the node it get's into the provided context. Take this into account when definig styles as `paddingTop`, `paddingLeft` and so on instead of the shortcut `padding`. For layout or styles transformation this project provides separate packages.\n\n### node.type\n\nMandatory field specifiying the type of the particular node. The full list of types can be found and imported from `@react-pdf/primitives`\n\n### node.box\n\nDefines bounding box where a particular node is located inside a document\n\n- left\n- top\n- width\n- height\n- paddingTop\n- paddingLeft\n- paddingBottom\n- paddingRight\n- marginTop\n- marginLeft\n- marginBottom\n- marginRight\n- borderTopWidth\n- borderLeftWidth\n- borderBottomWidth\n- borderRightWidth\n\n### node.style\n\nDefines how the node looks like. There are some types of nodes that expect special style values, but generally all support:\n\n- color\n- opacity\n- overflow\n- backgroundColor\n- borderTopLeftRadius\n- borderTopRightRadius\n- borderBottomLeftRadius\n- borderBottomRightRadius\n- borderTopColor\n- borderLeftColor\n- borderBottomColor\n- borderRightColor\n- _others..._\n\n### node.props\n\nSpecific node params needed to render correctly ot behave like certain way. Specially needed for SVG nodes\n\n## PDF example\n\n```js\nimport fs from 'fs';\nimport render from '@react-pdf/render';\nimport pdfkit from '@react-pdf/pdfkit';\n\nconst PDFDocument = pdfkit.default;\n\nconst ctx = new PDFDocument({ autoFirstPage: false });\n\nconst doc = {}; // See above\n\nrender.default(ctx, doc);\n\nconst stream = fs.createWriteStream('./test.pdf');\n\nctx.pipe(stream);\n```\n\n## License\n\nMIT © [Diego Muracciole](http://github.com/diegomura)\n"
  },
  {
    "path": "packages/render/globals.d.ts",
    "content": "declare module 'abs-svg-path';\n\ndeclare module 'color-string' {\n  function get(hex: string): { model: string; value: number[] } | null;\n\n  function toHex(color: number[]): string;\n\n  export default {\n    get,\n    to: { hex: toHex },\n  };\n}\n\ndeclare module 'normalize-svg-path' {\n  export default function normalizePath(path: any[]): any[];\n}\n\ndeclare module 'parse-svg-path' {\n  export default function parsePath(path: string): any[];\n}\n"
  },
  {
    "path": "packages/render/jest.config.js",
    "content": "export default {\n  testRegex: 'tests/.*?(test)\\\\.js$',\n};\n"
  },
  {
    "path": "packages/render/package.json",
    "content": "{\n  \"name\": \"@react-pdf/render\",\n  \"version\": \"4.3.2\",\n  \"license\": \"MIT\",\n  \"description\": \"A render engine for Node and the browser\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"type\": \"module\",\n  \"main\": \"./lib/index.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/render\"\n  },\n  \"scripts\": {\n    \"test\": \"vitest\",\n    \"build\": \"rimraf ./lib && rollup -c\",\n    \"watch\": \"rimraf ./lib && rollup -c -w\",\n    \"typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.20.13\",\n    \"@react-pdf/fns\": \"3.1.2\",\n    \"@react-pdf/primitives\": \"^4.1.1\",\n    \"@react-pdf/textkit\": \"^6.1.0\",\n    \"@react-pdf/types\": \"^2.9.2\",\n    \"abs-svg-path\": \"^0.1.1\",\n    \"color-string\": \"^1.9.1\",\n    \"normalize-svg-path\": \"^1.1.0\",\n    \"parse-svg-path\": \"^0.1.2\",\n    \"svg-arc-to-cubic-bezier\": \"^3.2.0\"\n  },\n  \"devDependencies\": {\n    \"@react-pdf/layout\": \"^4.4.2\",\n    \"@types/abs-svg-path\": \"^0.1.3\",\n    \"@types/color-string\": \"^1.5.5\",\n    \"@types/pdfkit\": \"^0.13.9\"\n  },\n  \"files\": [\n    \"lib\"\n  ]\n}\n"
  },
  {
    "path": "packages/render/rollup.config.js",
    "content": "import json from '@rollup/plugin-json';\nimport typescript from '@rollup/plugin-typescript';\nimport { dts } from 'rollup-plugin-dts';\nimport del from 'rollup-plugin-delete';\n\nimport pkg from './package.json' with { type: 'json' };\n\nconst config = [\n  {\n    input: 'src/index.ts',\n    output: { format: 'es', file: 'lib/index.js' },\n    external: Object.keys(pkg.dependencies).concat(/@react-pdf/),\n    plugins: [json(), typescript()],\n  },\n  {\n    input: './lib/types/index.d.ts',\n    output: [{ file: 'lib/index.d.ts', format: 'es' }],\n    plugins: [dts(), del({ targets: 'lib/types', hook: 'buildEnd' })],\n  },\n];\n\nexport default config;\n"
  },
  {
    "path": "packages/render/src/index.ts",
    "content": "import type { SafeDocumentNode } from '@react-pdf/layout';\n\nimport renderNode from './primitives/renderNode';\nimport addBookmarks from './operations/addBookmarks';\nimport { Context } from './types';\n\nconst render = (ctx: Context, doc: SafeDocumentNode) => {\n  const pages = doc.children || [];\n  const options = { imageCache: new Map(), fieldSets: [] };\n\n  pages.forEach((page) => renderNode(ctx, page, options));\n\n  addBookmarks(ctx, doc);\n\n  ctx.end();\n\n  return ctx;\n};\n\nexport default render;\n"
  },
  {
    "path": "packages/render/src/operations/addBookmarks.ts",
    "content": "import { SafeDocumentNode, SafeNode } from '@react-pdf/layout';\n\nimport { Context } from '../types';\n\ntype Registry = Record<number, any>;\n\nconst addNodeBookmark = (\n  ctx: Context,\n  node: SafeNode,\n  pageNumber: number,\n  registry: Registry,\n) => {\n  if (!node.box) return;\n  if (!node.props) return;\n\n  if ('bookmark' in node.props && node.props.bookmark) {\n    const bookmark = node.props.bookmark;\n    const { title, parent, expanded, zoom, fit } = bookmark;\n    const outline = registry[parent!] || ctx.outline;\n    const top = bookmark.top || node.box.top;\n    const left = bookmark.left || node.box.left;\n    const instance = outline.addItem(title, {\n      pageNumber,\n      expanded,\n      top,\n      left,\n      zoom,\n      fit,\n    });\n\n    registry[bookmark.ref!] = instance;\n  }\n\n  if (!node.children) return;\n\n  node.children.forEach((child) =>\n    addNodeBookmark(ctx, child, pageNumber, registry),\n  );\n};\n\nconst addBookmarks = (ctx: Context, root: SafeDocumentNode) => {\n  const registry = {};\n\n  const pages = root.children || [];\n\n  pages.forEach((page, i) => {\n    addNodeBookmark(ctx, page, i, registry);\n  });\n};\n\nexport default addBookmarks;\n"
  },
  {
    "path": "packages/render/src/operations/clipNode.ts",
    "content": "// This constant is used to approximate a symmetrical arc using a cubic\n\nimport { SafeNode } from '@react-pdf/layout';\nimport { Context } from '../types';\n\n// Bezier curve.\nconst KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0);\n\nconst clipNode = (ctx: Context, node: SafeNode) => {\n  if (!node.box) return;\n  if (!node.style) return;\n\n  const { top, left, width, height } = node.box;\n\n  const {\n    borderTopLeftRadius = 0,\n    borderTopRightRadius = 0,\n    borderBottomRightRadius = 0,\n    borderBottomLeftRadius = 0,\n  } = node.style;\n\n  // Border top\n  // @ts-expect-error this is always a number due to resolve border radius step\n  const rtr = Math.min(borderTopRightRadius, 0.5 * width, 0.5 * height);\n  const ctr = rtr * (1.0 - KAPPA);\n\n  ctx.moveTo(left + rtr, top);\n  ctx.lineTo(left + width - rtr, top);\n  ctx.bezierCurveTo(\n    left + width - ctr,\n    top,\n    left + width,\n    top + ctr,\n    left + width,\n    top + rtr,\n  );\n\n  // Border right\n  // @ts-expect-error this is always a number due to resolve border radius step\n  const rbr = Math.min(borderBottomRightRadius, 0.5 * width, 0.5 * height);\n  const cbr = rbr * (1.0 - KAPPA);\n\n  ctx.lineTo(left + width, top + height - rbr);\n  ctx.bezierCurveTo(\n    left + width,\n    top + height - cbr,\n    left + width - cbr,\n    top + height,\n    left + width - rbr,\n    top + height,\n  );\n\n  // Border bottom\n  // @ts-expect-error this is always a number due to resolve border radius step\n  const rbl = Math.min(borderBottomLeftRadius, 0.5 * width, 0.5 * height);\n  const cbl = rbl * (1.0 - KAPPA);\n\n  ctx.lineTo(left + rbl, top + height);\n  ctx.bezierCurveTo(\n    left + cbl,\n    top + height,\n    left,\n    top + height - cbl,\n    left,\n    top + height - rbl,\n  );\n\n  // Border left\n  // @ts-expect-error this is always a number due to resolve border radius step\n  const rtl = Math.min(borderTopLeftRadius, 0.5 * width, 0.5 * height);\n  const ctl = rtl * (1.0 - KAPPA);\n\n  ctx.lineTo(left, top + rtl);\n  ctx.bezierCurveTo(left, top + ctl, left + ctl, top, left + rtl, top);\n  ctx.closePath();\n  ctx.clip();\n};\n\nexport default clipNode;\n"
  },
  {
    "path": "packages/render/src/operations/embedImage.ts",
    "content": "import { SafeImageNode } from '@react-pdf/layout';\nimport { Context } from '../types';\n\nconst embedImage = (ctx: Context, node: SafeImageNode) => {\n  const src = node.image!.data;\n\n  let image;\n\n  if (typeof src === 'string') {\n    image = ctx._imageRegistry[src];\n  }\n\n  if (!image) {\n    image = ctx.openImage(src);\n  }\n\n  if (!image.obj) {\n    image.embed(ctx);\n  }\n\n  return image;\n};\n\nexport default embedImage;\n"
  },
  {
    "path": "packages/render/src/operations/setDestination.ts",
    "content": "import { SafeNode } from '@react-pdf/layout';\n\nimport { Context } from '../types';\n\nconst setDestination = (ctx: Context, node: SafeNode) => {\n  if (!node.box) return;\n  if (!node.props) return;\n\n  if ('id' in node.props) {\n    ctx.addNamedDestination(node.props.id!, 'XYZ', null, node.box.top, null);\n  }\n};\n\nexport default setDestination;\n"
  },
  {
    "path": "packages/render/src/operations/setLink.ts",
    "content": "import { SafeNode } from '@react-pdf/layout';\nimport { Context } from '../types';\n\nconst isString = (value: any): value is string => typeof value === 'string';\n\nconst isSrcId = (value: string) => /^#.+/.test(value);\n\nconst renderLink = (ctx: Context, node: SafeNode, src: string) => {\n  if (!src || !node.box) return;\n\n  const isId = isSrcId(src);\n  const method = isId ? 'goTo' : 'link';\n  const value = isId ? src.slice(1) : src;\n  const { top, left, width, height } = node.box;\n\n  ctx[method](left, top, width, height, value);\n};\n\nconst setLink = (ctx: Context, node: SafeNode) => {\n  const props = node.props || {};\n\n  if ('src' in props && isString(props.src))\n    return renderLink(ctx, node, props.src);\n\n  if ('href' in props && isString(props.href))\n    return renderLink(ctx, node, props.href);\n};\n\nexport default setLink;\n"
  },
  {
    "path": "packages/render/src/operations/transform.ts",
    "content": "import { SafeNode } from '@react-pdf/layout';\nimport { Transform } from '@react-pdf/stylesheet';\n\nimport { Context } from '../types';\n\nconst applySingleTransformation = (\n  ctx: Context,\n  transform: Transform,\n  origin: number[],\n) => {\n  const { operation, value } = transform;\n\n  switch (operation) {\n    case 'scale': {\n      const [scaleX, scaleY] = value;\n      ctx.scale(scaleX, scaleY, { origin });\n      break;\n    }\n\n    case 'rotate': {\n      const [angle] = value;\n      ctx.rotate(angle, { origin });\n      break;\n    }\n\n    case 'translate': {\n      const [x, y = 0] = value;\n      ctx.translate(x, y, { origin });\n      break;\n    }\n\n    case 'skew': {\n      const [xAngle = 0, yAngle = 0] = value;\n      const radx = (xAngle * Math.PI) / 180;\n      const rady = (yAngle * Math.PI) / 180;\n      const tanx = Math.tan(radx);\n      const tany = Math.tan(rady);\n\n      let x = 0;\n      let y = 0;\n\n      if (origin != null) {\n        [x, y] = Array.from(origin);\n        const x1 = x + tanx * y;\n        const y1 = y + tany * x;\n        x -= x1;\n        y -= y1;\n      }\n\n      ctx.transform(1, tany, tanx, 1, x, y);\n      break;\n    }\n\n    case 'matrix': {\n      ctx.transform(...value);\n      break;\n    }\n\n    default: {\n      console.error(`Transform operation: '${operation}' doesn't supported`);\n    }\n  }\n};\n\nconst applyTransformations = (ctx: Context, node: SafeNode) => {\n  if (!node.origin) return;\n\n  const { props, style } = node;\n  const origin = [node.origin.left, node.origin.top];\n  const propsTransform = 'transform' in props ? props.transform : undefined;\n  const operations = style?.transform || propsTransform || [];\n\n  operations.forEach((operation) => {\n    applySingleTransformation(ctx, operation, origin);\n  });\n};\n\nexport default applyTransformations;\n"
  },
  {
    "path": "packages/render/src/primitives/renderBackground.ts",
    "content": "import { isNil } from '@react-pdf/fns';\n\nimport clipNode from '../operations/clipNode';\nimport parseColor from '../utils/parseColor';\nimport { Context } from '../types';\nimport { SafeNode } from '@react-pdf/layout';\n\nconst drawBackground = (ctx: Context, node: SafeNode) => {\n  if (!node.box) return;\n\n  const { top, left, width, height } = node.box;\n  const color = parseColor(node.style.backgroundColor);\n  const nodeOpacity = isNil(node.style?.opacity) ? 1 : node.style.opacity;\n  const opacity = Math.min(color.opacity, nodeOpacity);\n\n  ctx\n    .fillOpacity(opacity)\n    .fillColor(color.value)\n    .rect(left, top, width, height)\n    .fill();\n};\n\nconst renderBackground = (ctx: Context, node: SafeNode) => {\n  const hasBackground = !!node.box && !!node.style?.backgroundColor;\n\n  if (hasBackground) {\n    ctx.save();\n    clipNode(ctx, node);\n    drawBackground(ctx, node);\n    ctx.restore();\n  }\n};\n\nexport default renderBackground;\n"
  },
  {
    "path": "packages/render/src/primitives/renderBorders.ts",
    "content": "// Ref: https://www.w3.org/TR/css-backgrounds-3/#borders\n\nimport { Box, SafeNode } from '@react-pdf/layout';\nimport { Context } from '../types';\n\ntype SafeBorderStyle = {\n  borderTopColor: string;\n  borderTopWidth: number;\n  borderTopStyle: string;\n  borderLeftColor: string;\n  borderLeftWidth: number;\n  borderLeftStyle: string;\n  borderRightColor: string;\n  borderRightWidth: number;\n  borderRightStyle: string;\n  borderBottomColor: string;\n  borderBottomWidth: number;\n  borderBottomStyle: string;\n  borderTopLeftRadius: number;\n  borderTopRightRadius: number;\n  borderBottomLeftRadius: number;\n  borderBottomRightRadius: number;\n};\n\n// This constant is used to approximate a symmetrical arc using a cubic Bezier curve.\nconst KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0);\n\nconst clipBorderTop = (\n  ctx: Context,\n  layout: Box,\n  style: SafeBorderStyle,\n  rtr: number,\n  rtl: number,\n) => {\n  const { top, left, width, height } = layout;\n  const { borderTopWidth, borderRightWidth, borderLeftWidth } = style;\n\n  // Clip outer top border edge\n  ctx.moveTo(left + rtl, top);\n  ctx.lineTo(left + width - rtr, top);\n\n  // Ellipse coefficients outer top right cap\n  const c0 = rtr * (1.0 - KAPPA);\n\n  // Clip outer top right cap\n  ctx.bezierCurveTo(\n    left + width - c0,\n    top,\n    left + width,\n    top + c0,\n    left + width,\n    top + rtr,\n  );\n\n  // Move down in case the margin exceedes the radius\n  const topRightYCoord = top + Math.max(borderTopWidth, rtr);\n  ctx.lineTo(left + width, topRightYCoord);\n\n  // Clip inner top right cap\n  ctx.lineTo(left + width - borderRightWidth, topRightYCoord);\n\n  // Ellipse coefficients inner top right cap\n  const innerTopRightRadiusX = Math.max(rtr - borderRightWidth, 0);\n  const innerTopRightRadiusY = Math.max(rtr - borderTopWidth, 0);\n  const c1 = innerTopRightRadiusX * (1.0 - KAPPA);\n  const c2 = innerTopRightRadiusY * (1.0 - KAPPA);\n\n  // Clip inner top right cap\n  ctx.bezierCurveTo(\n    left + width - borderRightWidth,\n    top + borderTopWidth + c2,\n    left + width - borderRightWidth - c1,\n    top + borderTopWidth,\n    left + width - borderRightWidth - innerTopRightRadiusX,\n    top + borderTopWidth,\n  );\n\n  // Clip inner top border edge\n  ctx.lineTo(left + Math.max(rtl, borderLeftWidth), top + borderTopWidth);\n\n  // Ellipse coefficients inner top left cap\n  const innerTopLeftRadiusX = Math.max(rtl - borderLeftWidth, 0);\n  const innerTopLeftRadiusY = Math.max(rtl - borderTopWidth, 0);\n  const c3 = innerTopLeftRadiusX * (1.0 - KAPPA);\n  const c4 = innerTopLeftRadiusY * (1.0 - KAPPA);\n  const topLeftYCoord = top + Math.max(borderTopWidth, rtl);\n\n  // Clip inner top left cap\n  ctx.bezierCurveTo(\n    left + borderLeftWidth + c3,\n    top + borderTopWidth,\n    left + borderLeftWidth,\n    top + borderTopWidth + c4,\n    left + borderLeftWidth,\n    topLeftYCoord,\n  );\n  ctx.lineTo(left, topLeftYCoord);\n\n  // Move down in case the margin exceedes the radius\n  ctx.lineTo(left, top + rtl);\n\n  // Ellipse coefficients outer top left cap\n  const c5 = rtl * (1.0 - KAPPA);\n\n  // Clip outer top left cap\n  ctx.bezierCurveTo(left, top + c5, left + c5, top, left + rtl, top);\n  ctx.closePath();\n  ctx.clip();\n\n  // Clip border top cap joins\n  if (borderRightWidth) {\n    const trSlope = -borderTopWidth / borderRightWidth;\n    ctx.moveTo(left + width / 2, trSlope * (-width / 2) + top);\n    ctx.lineTo(left + width, top);\n    ctx.lineTo(left, top);\n    ctx.lineTo(left, top + height);\n    ctx.closePath();\n    ctx.clip();\n  }\n\n  if (borderLeftWidth) {\n    const trSlope = -borderTopWidth / borderLeftWidth;\n    ctx.moveTo(left + width / 2, trSlope * (-width / 2) + top);\n    ctx.lineTo(left, top);\n    ctx.lineTo(left + width, top);\n    ctx.lineTo(left + width, top + height);\n    ctx.closePath();\n    ctx.clip();\n  }\n};\n\nconst fillBorderTop = (\n  ctx: Context,\n  layout: Box,\n  style: SafeBorderStyle,\n  rtr: number,\n  rtl: number,\n) => {\n  const { top, left, width } = layout;\n  const {\n    borderTopColor,\n    borderTopWidth,\n    borderTopStyle,\n    borderRightWidth,\n    borderLeftWidth,\n  } = style;\n\n  const c0 = rtl * (1.0 - KAPPA);\n  const c1 = rtr * (1.0 - KAPPA);\n\n  ctx.moveTo(left, top + Math.max(rtl, borderTopWidth));\n  ctx.bezierCurveTo(left, top + c0, left + c0, top, left + rtl, top);\n  ctx.lineTo(left + width - rtr, top);\n  ctx.bezierCurveTo(\n    left + width - c1,\n    top,\n    left + width,\n    top + c1,\n    left + width,\n    top + rtr,\n  );\n\n  ctx.strokeColor(borderTopColor);\n  ctx.lineWidth(\n    Math.max(borderRightWidth, borderTopWidth, borderLeftWidth) * 2,\n  );\n\n  if (borderTopStyle === 'dashed') {\n    ctx.dash(borderTopWidth * 2, { space: borderTopWidth * 1.2 });\n  } else if (borderTopStyle === 'dotted') {\n    ctx.dash(borderTopWidth, { space: borderTopWidth * 1.2 });\n  }\n\n  ctx.stroke();\n  ctx.undash();\n};\n\nconst clipBorderRight = (\n  ctx: Context,\n  layout: Box,\n  style: SafeBorderStyle,\n  rtr: number,\n  rbr: number,\n) => {\n  const { top, left, width, height } = layout;\n  const { borderTopWidth, borderRightWidth, borderBottomWidth } = style;\n\n  // Clip outer right border edge\n  ctx.moveTo(left + width, top + rtr);\n  ctx.lineTo(left + width, top + height - rbr);\n\n  // Ellipse coefficients outer bottom right cap\n  const c0 = rbr * (1.0 - KAPPA);\n\n  // Clip outer top right cap\n  ctx.bezierCurveTo(\n    left + width,\n    top + height - c0,\n    left + width - c0,\n    top + height,\n    left + width - rbr,\n    top + height,\n  );\n\n  // Move left in case the margin exceedes the radius\n  const topBottomXCoord = left + width - Math.max(borderRightWidth, rbr);\n  ctx.lineTo(topBottomXCoord, top + height);\n\n  // Clip inner bottom right cap\n  ctx.lineTo(topBottomXCoord, top + height - borderBottomWidth);\n\n  // Ellipse coefficients inner bottom right cap\n  const innerBottomRightRadiusX = Math.max(rbr - borderRightWidth, 0);\n  const innerBottomRightRadiusY = Math.max(rbr - borderBottomWidth, 0);\n  const c1 = innerBottomRightRadiusX * (1.0 - KAPPA);\n  const c2 = innerBottomRightRadiusY * (1.0 - KAPPA);\n\n  // Clip inner top right cap\n  ctx.bezierCurveTo(\n    left + width - borderRightWidth - c1,\n    top + height - borderBottomWidth,\n    left + width - borderRightWidth,\n    top + height - borderBottomWidth - c2,\n    left + width - borderRightWidth,\n    top + height - Math.max(rbr, borderBottomWidth),\n  );\n\n  // Clip inner right border edge\n  ctx.lineTo(\n    left + width - borderRightWidth,\n    top + Math.max(rtr, borderTopWidth),\n  );\n\n  // Ellipse coefficients inner top right cap\n  const innerTopRightRadiusX = Math.max(rtr - borderRightWidth, 0);\n  const innerTopRightRadiusY = Math.max(rtr - borderTopWidth, 0);\n  const c3 = innerTopRightRadiusX * (1.0 - KAPPA);\n  const c4 = innerTopRightRadiusY * (1.0 - KAPPA);\n  const topRightXCoord = left + width - Math.max(rtr, borderRightWidth);\n\n  // Clip inner top left cap\n  ctx.bezierCurveTo(\n    left + width - borderRightWidth,\n    top + borderTopWidth + c4,\n    left + width - borderRightWidth - c3,\n    top + borderTopWidth,\n    topRightXCoord,\n    top + borderTopWidth,\n  );\n  ctx.lineTo(topRightXCoord, top);\n\n  // Move right in case the margin exceedes the radius\n  ctx.lineTo(left + width - rtr, top);\n\n  // Ellipse coefficients outer top right cap\n  const c5 = rtr * (1.0 - KAPPA);\n\n  // Clip outer top right cap\n  ctx.bezierCurveTo(\n    left + width - c5,\n    top,\n    left + width,\n    top + c5,\n    left + width,\n    top + rtr,\n  );\n\n  ctx.closePath();\n  ctx.clip();\n\n  // Clip border right cap joins\n  if (borderTopWidth) {\n    const trSlope = -borderTopWidth / borderRightWidth;\n    ctx.moveTo(left + width / 2, trSlope * (-width / 2) + top);\n    ctx.lineTo(left + width, top);\n    ctx.lineTo(left + width, top + height);\n    ctx.lineTo(left, top + height);\n    ctx.closePath();\n    ctx.clip();\n  }\n\n  if (borderBottomWidth) {\n    const brSlope = borderBottomWidth / borderRightWidth;\n    ctx.moveTo(left + width / 2, brSlope * (-width / 2) + top + height);\n    ctx.lineTo(left + width, top + height);\n    ctx.lineTo(left + width, top);\n    ctx.lineTo(left, top);\n    ctx.closePath();\n    ctx.clip();\n  }\n};\n\nconst fillBorderRight = (\n  ctx: Context,\n  layout: Box,\n  style: SafeBorderStyle,\n  rtr: number,\n  rbr: number,\n) => {\n  const { top, left, width, height } = layout;\n  const {\n    borderRightColor,\n    borderRightStyle,\n    borderRightWidth,\n    borderTopWidth,\n    borderBottomWidth,\n  } = style;\n\n  const c0 = rbr * (1.0 - KAPPA);\n  const c1 = rtr * (1.0 - KAPPA);\n\n  ctx.moveTo(left + width - rtr, top);\n  ctx.bezierCurveTo(\n    left + width - c1,\n    top,\n    left + width,\n    top + c1,\n    left + width,\n    top + rtr,\n  );\n  ctx.lineTo(left + width, top + height - rbr);\n  ctx.bezierCurveTo(\n    left + width,\n    top + height - c0,\n    left + width - c0,\n    top + height,\n    left + width - rbr,\n    top + height,\n  );\n\n  ctx.strokeColor(borderRightColor);\n  ctx.lineWidth(\n    Math.max(borderRightWidth, borderTopWidth, borderBottomWidth) * 2,\n  );\n\n  if (borderRightStyle === 'dashed') {\n    ctx.dash(borderRightWidth * 2, { space: borderRightWidth * 1.2 });\n  } else if (borderRightStyle === 'dotted') {\n    ctx.dash(borderRightWidth, { space: borderRightWidth * 1.2 });\n  }\n\n  ctx.stroke();\n  ctx.undash();\n};\n\nconst clipBorderBottom = (\n  ctx: Context,\n  layout: Box,\n  style: SafeBorderStyle,\n  rbl: number,\n  rbr: number,\n) => {\n  const { top, left, width, height } = layout;\n  const { borderBottomWidth, borderRightWidth, borderLeftWidth } = style;\n\n  // Clip outer top border edge\n  ctx.moveTo(left + width - rbr, top + height);\n  ctx.lineTo(left + rbl, top + height);\n\n  // Ellipse coefficients outer top right cap\n  const c0 = rbl * (1.0 - KAPPA);\n\n  // Clip outer top right cap\n  ctx.bezierCurveTo(\n    left + c0,\n    top + height,\n    left,\n    top + height - c0,\n    left,\n    top + height - rbl,\n  );\n\n  // Move up in case the margin exceedes the radius\n  const bottomLeftYCoord = top + height - Math.max(borderBottomWidth, rbl);\n  ctx.lineTo(left, bottomLeftYCoord);\n\n  // Clip inner bottom left cap\n  ctx.lineTo(left + borderLeftWidth, bottomLeftYCoord);\n\n  // Ellipse coefficients inner top right cap\n  const innerBottomLeftRadiusX = Math.max(rbl - borderLeftWidth, 0);\n  const innerBottomLeftRadiusY = Math.max(rbl - borderBottomWidth, 0);\n  const c1 = innerBottomLeftRadiusX * (1.0 - KAPPA);\n  const c2 = innerBottomLeftRadiusY * (1.0 - KAPPA);\n\n  // Clip inner bottom left cap\n  ctx.bezierCurveTo(\n    left + borderLeftWidth,\n    top + height - borderBottomWidth - c2,\n    left + borderLeftWidth + c1,\n    top + height - borderBottomWidth,\n    left + borderLeftWidth + innerBottomLeftRadiusX,\n    top + height - borderBottomWidth,\n  );\n\n  // Clip inner bottom border edge\n  ctx.lineTo(\n    left + width - Math.max(rbr, borderRightWidth),\n    top + height - borderBottomWidth,\n  );\n\n  // Ellipse coefficients inner top left cap\n  const innerBottomRightRadiusX = Math.max(rbr - borderRightWidth, 0);\n  const innerBottomRightRadiusY = Math.max(rbr - borderBottomWidth, 0);\n  const c3 = innerBottomRightRadiusX * (1.0 - KAPPA);\n  const c4 = innerBottomRightRadiusY * (1.0 - KAPPA);\n  const bottomRightYCoord = top + height - Math.max(borderBottomWidth, rbr);\n\n  // Clip inner top left cap\n  ctx.bezierCurveTo(\n    left + width - borderRightWidth - c3,\n    top + height - borderBottomWidth,\n    left + width - borderRightWidth,\n    top + height - borderBottomWidth - c4,\n    left + width - borderRightWidth,\n    bottomRightYCoord,\n  );\n  ctx.lineTo(left + width, bottomRightYCoord);\n\n  // Move down in case the margin exceedes the radius\n  ctx.lineTo(left + width, top + height - rbr);\n\n  // Ellipse coefficients outer top left cap\n  const c5 = rbr * (1.0 - KAPPA);\n\n  // Clip outer top left cap\n  ctx.bezierCurveTo(\n    left + width,\n    top + height - c5,\n    left + width - c5,\n    top + height,\n    left + width - rbr,\n    top + height,\n  );\n  ctx.closePath();\n  ctx.clip();\n\n  // Clip border bottom cap joins\n  if (borderRightWidth) {\n    const brSlope = borderBottomWidth / borderRightWidth;\n    ctx.moveTo(left + width / 2, brSlope * (-width / 2) + top + height);\n    ctx.lineTo(left + width, top + height);\n    ctx.lineTo(left, top + height);\n    ctx.lineTo(left, top);\n    ctx.closePath();\n    ctx.clip();\n  }\n\n  if (borderLeftWidth) {\n    const trSlope = -borderBottomWidth / borderLeftWidth;\n    ctx.moveTo(left + width / 2, trSlope * (width / 2) + top + height);\n    ctx.lineTo(left, top + height);\n    ctx.lineTo(left + width, top + height);\n    ctx.lineTo(left + width, top);\n    ctx.closePath();\n    ctx.clip();\n  }\n};\n\nconst fillBorderBottom = (\n  ctx: Context,\n  layout: Box,\n  style: SafeBorderStyle,\n  rbl: number,\n  rbr: number,\n) => {\n  const { top, left, width, height } = layout;\n  const {\n    borderBottomColor,\n    borderBottomStyle,\n    borderBottomWidth,\n    borderRightWidth,\n    borderLeftWidth,\n  } = style;\n\n  const c0 = rbl * (1.0 - KAPPA);\n  const c1 = rbr * (1.0 - KAPPA);\n\n  ctx.moveTo(left + width, top + height - rbr);\n  ctx.bezierCurveTo(\n    left + width,\n    top + height - c1,\n    left + width - c1,\n    top + height,\n    left + width - rbr,\n    top + height,\n  );\n  ctx.lineTo(left + rbl, top + height);\n  ctx.bezierCurveTo(\n    left + c0,\n    top + height,\n    left,\n    top + height - c0,\n    left,\n    top + height - rbl,\n  );\n\n  ctx.strokeColor(borderBottomColor);\n  ctx.lineWidth(\n    Math.max(borderBottomWidth, borderRightWidth, borderLeftWidth) * 2,\n  );\n\n  if (borderBottomStyle === 'dashed') {\n    ctx.dash(borderBottomWidth * 2, { space: borderBottomWidth * 1.2 });\n  } else if (borderBottomStyle === 'dotted') {\n    ctx.dash(borderBottomWidth, { space: borderBottomWidth * 1.2 });\n  }\n\n  ctx.stroke();\n  ctx.undash();\n};\n\nconst clipBorderLeft = (\n  ctx: Context,\n  layout: Box,\n  style: SafeBorderStyle,\n  rbl: number,\n  rtl: number,\n) => {\n  const { top, left, width, height } = layout;\n  const { borderTopWidth, borderLeftWidth, borderBottomWidth } = style;\n\n  // Clip outer left border edge\n  ctx.moveTo(left, top + height - rbl);\n  ctx.lineTo(left, top + rtl);\n\n  // Ellipse coefficients outer top left cap\n  const c0 = rtl * (1.0 - KAPPA);\n\n  // Clip outer top left cap\n  ctx.bezierCurveTo(left, top + c0, left + c0, top, left + rtl, top);\n\n  // Move right in case the margin exceedes the radius\n  const topLeftCoordX = left + Math.max(borderLeftWidth, rtl);\n  ctx.lineTo(topLeftCoordX, top);\n\n  // Clip inner top left cap\n  ctx.lineTo(topLeftCoordX, top + borderTopWidth);\n\n  // Ellipse coefficients inner top left cap\n  const innerTopLeftRadiusX = Math.max(rtl - borderLeftWidth, 0);\n  const innerTopLeftRadiusY = Math.max(rtl - borderTopWidth, 0);\n  const c1 = innerTopLeftRadiusX * (1.0 - KAPPA);\n  const c2 = innerTopLeftRadiusY * (1.0 - KAPPA);\n\n  // Clip inner top right cap\n  ctx.bezierCurveTo(\n    left + borderLeftWidth + c1,\n    top + borderTopWidth,\n    left + borderLeftWidth,\n    top + borderTopWidth + c2,\n    left + borderLeftWidth,\n    top + Math.max(rtl, borderTopWidth),\n  );\n\n  // Clip inner left border edge\n  ctx.lineTo(\n    left + borderLeftWidth,\n    top + height - Math.max(rbl, borderBottomWidth),\n  );\n\n  // Ellipse coefficients inner bottom left cap\n  const innerBottomLeftRadiusX = Math.max(rbl - borderLeftWidth, 0);\n  const innerBottomLeftRadiusY = Math.max(rbl - borderBottomWidth, 0);\n  const c3 = innerBottomLeftRadiusX * (1.0 - KAPPA);\n  const c4 = innerBottomLeftRadiusY * (1.0 - KAPPA);\n  const bottomLeftXCoord = left + Math.max(rbl, borderLeftWidth);\n\n  // Clip inner top left cap\n  ctx.bezierCurveTo(\n    left + borderLeftWidth,\n    top + height - borderBottomWidth - c4,\n    left + borderLeftWidth + c3,\n    top + height - borderBottomWidth,\n    bottomLeftXCoord,\n    top + height - borderBottomWidth,\n  );\n  ctx.lineTo(bottomLeftXCoord, top + height);\n\n  // Move left in case the margin exceedes the radius\n  ctx.lineTo(left + rbl, top + height);\n\n  // Ellipse coefficients outer top right cap\n  const c5 = rbl * (1.0 - KAPPA);\n\n  // Clip outer top right cap\n  ctx.bezierCurveTo(\n    left + c5,\n    top + height,\n    left,\n    top + height - c5,\n    left,\n    top + height - rbl,\n  );\n\n  ctx.closePath();\n  ctx.clip();\n\n  // Clip border right cap joins\n  if (borderBottomWidth) {\n    const trSlope = -borderBottomWidth / borderLeftWidth;\n    ctx.moveTo(left + width / 2, trSlope * (width / 2) + top + height);\n    ctx.lineTo(left, top + height);\n    ctx.lineTo(left, top);\n    ctx.lineTo(left + width, top);\n    ctx.closePath();\n    ctx.clip();\n  }\n\n  if (borderBottomWidth) {\n    const trSlope = -borderTopWidth / borderLeftWidth;\n    ctx.moveTo(left + width / 2, trSlope * (-width / 2) + top);\n    ctx.lineTo(left, top);\n    ctx.lineTo(left, top + height);\n    ctx.lineTo(left + width, top + height);\n    ctx.closePath();\n    ctx.clip();\n  }\n};\n\nconst fillBorderLeft = (\n  ctx: Context,\n  layout: Box,\n  style: SafeBorderStyle,\n  rbl: number,\n  rtl: number,\n) => {\n  const { top, left, height } = layout;\n  const {\n    borderLeftColor,\n    borderLeftStyle,\n    borderLeftWidth,\n    borderTopWidth,\n    borderBottomWidth,\n  } = style;\n\n  const c0 = rbl * (1.0 - KAPPA);\n  const c1 = rtl * (1.0 - KAPPA);\n\n  ctx.moveTo(left + rbl, top + height);\n  ctx.bezierCurveTo(\n    left + c0,\n    top + height,\n    left,\n    top + height - c0,\n    left,\n    top + height - rbl,\n  );\n  ctx.lineTo(left, top + rtl);\n  ctx.bezierCurveTo(left, top + c1, left + c1, top, left + rtl, top);\n\n  ctx.strokeColor(borderLeftColor);\n  ctx.lineWidth(\n    Math.max(borderLeftWidth, borderTopWidth, borderBottomWidth) * 2,\n  );\n\n  if (borderLeftStyle === 'dashed') {\n    ctx.dash(borderLeftWidth * 2, { space: borderLeftWidth * 1.2 });\n  } else if (borderLeftStyle === 'dotted') {\n    ctx.dash(borderLeftWidth, { space: borderLeftWidth * 1.2 });\n  }\n\n  ctx.stroke();\n  ctx.undash();\n};\n\nconst shouldRenderBorders = (node: SafeNode) =>\n  node.box &&\n  (node.box.borderTopWidth ||\n    node.box.borderRightWidth ||\n    node.box.borderBottomWidth ||\n    node.box.borderLeftWidth);\n\nconst renderBorders = (ctx: Context, node: SafeNode) => {\n  if (!node.box) return;\n  if (!shouldRenderBorders(node)) return;\n\n  const {\n    width,\n    height,\n    borderTopWidth = 0,\n    borderLeftWidth = 0,\n    borderRightWidth = 0,\n    borderBottomWidth = 0,\n  } = node.box;\n\n  const {\n    opacity = 1,\n    borderTopColor = 'black',\n    borderTopStyle = 'solid',\n    borderLeftColor = 'black',\n    borderLeftStyle = 'solid',\n    borderRightColor = 'black',\n    borderRightStyle = 'solid',\n    borderBottomColor = 'black',\n    borderBottomStyle = 'solid',\n  } = node.style;\n\n  // @ts-expect-error this is always a number due to resolve border radius step\n  const borderTopLeftRadius: number = node.style.borderTopLeftRadius || 0;\n  // @ts-expect-error this is always a number due to resolve border radius step\n  const borderTopRightRadius: number = node.style.borderTopRightRadius || 0;\n  // @ts-expect-error this is always a number due to resolve border radius step\n  const borderBottomLeftRadius: number = node.style.borderBottomLeftRadius || 0;\n  // @ts-expect-error this is always a number due to resolve border radius step\n  const borderBottomRightRadius: number =\n    node.style.borderBottomRightRadius || 0;\n\n  const style: SafeBorderStyle = {\n    borderTopColor,\n    borderTopWidth,\n    borderTopStyle,\n    borderLeftColor,\n    borderLeftWidth,\n    borderLeftStyle,\n    borderRightColor,\n    borderRightWidth,\n    borderRightStyle,\n    borderBottomColor,\n    borderBottomWidth,\n    borderBottomStyle,\n    borderTopLeftRadius,\n    borderTopRightRadius,\n    borderBottomLeftRadius,\n    borderBottomRightRadius,\n  };\n\n  const rtr = Math.min(borderTopRightRadius, 0.5 * width, 0.5 * height);\n  const rtl = Math.min(borderTopLeftRadius, 0.5 * width, 0.5 * height);\n  const rbr = Math.min(borderBottomRightRadius, 0.5 * width, 0.5 * height);\n  const rbl = Math.min(borderBottomLeftRadius, 0.5 * width, 0.5 * height);\n\n  ctx.save();\n  ctx.strokeOpacity(opacity);\n\n  if (borderTopWidth) {\n    ctx.save();\n    clipBorderTop(ctx, node.box, style, rtr, rtl);\n    fillBorderTop(ctx, node.box, style, rtr, rtl);\n    ctx.restore();\n  }\n\n  if (borderRightWidth) {\n    ctx.save();\n    clipBorderRight(ctx, node.box, style, rtr, rbr);\n    fillBorderRight(ctx, node.box, style, rtr, rbr);\n    ctx.restore();\n  }\n\n  if (borderBottomWidth) {\n    ctx.save();\n    clipBorderBottom(ctx, node.box, style, rbl, rbr);\n    fillBorderBottom(ctx, node.box, style, rbl, rbr);\n    ctx.restore();\n  }\n\n  if (borderLeftWidth) {\n    ctx.save();\n    clipBorderLeft(ctx, node.box, style, rbl, rtl);\n    fillBorderLeft(ctx, node.box, style, rbl, rtl);\n    ctx.restore();\n  }\n\n  ctx.restore();\n};\n\nexport default renderBorders;\n"
  },
  {
    "path": "packages/render/src/primitives/renderCanvas.ts",
    "content": "import { SafeCanvasNode } from '@react-pdf/layout';\nimport { Context } from '../types';\n\nconst availableMethods = [\n  'dash',\n  'clip',\n  'save',\n  'path',\n  'fill',\n  'font',\n  'text',\n  'rect',\n  'scale',\n  'moveTo',\n  'lineTo',\n  'stroke',\n  'rotate',\n  'circle',\n  'lineCap',\n  'opacity',\n  'ellipse',\n  'polygon',\n  'restore',\n  'lineJoin',\n  'fontSize',\n  'fillColor',\n  'lineWidth',\n  'translate',\n  'miterLimit',\n  'strokeColor',\n  'fillOpacity',\n  'roundedRect',\n  'fillAndStroke',\n  'strokeOpacity',\n  'bezierCurveTo',\n  'quadraticCurveTo',\n  'linearGradient',\n  'radialGradient',\n];\n\nconst painter = (ctx: Context) => {\n  const p = availableMethods.reduce(\n    (acc, prop) => ({\n      ...acc,\n      [prop]: (...args: any) => {\n        // @ts-expect-error ctx[prop] is a function\n        ctx[prop](...args);\n        return p;\n      },\n    }),\n    {},\n  );\n\n  return p;\n};\n\nconst renderCanvas = (ctx: Context, node: SafeCanvasNode) => {\n  if (!node.box) return;\n\n  const { top, left, width, height } = node.box;\n\n  const paddingTop = node.box.paddingTop || 0;\n  const paddingLeft = node.box.paddingLeft || 0;\n  const paddingRight = node.box.paddingRight || 0;\n  const paddingBottom = node.box.paddingBottom || 0;\n\n  const availableWidth = width - paddingLeft - paddingRight;\n  const availableHeight = height - paddingTop - paddingBottom;\n\n  if (!availableWidth || !availableHeight) {\n    console.warn(\n      'Canvas element has null width or height. Please provide valid values via the `style` prop in order to correctly render it.',\n    );\n  }\n\n  ctx.save().translate(left + paddingLeft, top + paddingTop);\n\n  if (node.props.paint) {\n    node.props.paint(painter(ctx), availableWidth, availableHeight);\n  }\n\n  ctx.restore();\n};\n\nexport default renderCanvas;\n"
  },
  {
    "path": "packages/render/src/primitives/renderCheckbox.ts",
    "content": "import { SafeCheckboxNode } from '@react-pdf/layout';\nimport { Context, RenderOptions } from '../types';\nimport { parseCheckboxOptions } from '../utils/parseFormOptions';\n\nconst renderCheckbox = (\n  ctx: Context,\n  node: SafeCheckboxNode,\n  options: RenderOptions,\n) => {\n  if (!node.box) return;\n\n  const { top, left, width, height } = node.box;\n\n  // Element's name\n  const name = node.props?.name || '';\n  const fieldSetOptions = options.fieldSets?.at(0);\n\n  if (!ctx._root.data.AcroForm) {\n    ctx.initForm();\n  }\n\n  ctx.formCheckbox(\n    name,\n    left,\n    top,\n    width,\n    height,\n    parseCheckboxOptions(ctx, node, fieldSetOptions),\n  );\n};\n\nexport default renderCheckbox;\n"
  },
  {
    "path": "packages/render/src/primitives/renderCircle.ts",
    "content": "import { SafeCircleNode } from '@react-pdf/layout';\n\nimport { Context } from '../types';\nimport { drawEllipse } from './renderEllipse';\n\nconst renderCircle = (ctx: Context, node: SafeCircleNode) => {\n  const cx = node.props?.cx;\n  const cy = node.props?.cy;\n  const r = node.props?.r;\n\n  drawEllipse(ctx, r, r, cx, cy);\n};\n\nexport default renderCircle;\n"
  },
  {
    "path": "packages/render/src/primitives/renderDebug.ts",
    "content": "import { SafeNode } from '@react-pdf/layout';\nimport { Context } from '../types';\n\nconst CONTENT_COLOR = '#a1c6e7';\nconst PADDING_COLOR = '#c4deb9';\nconst MARGIN_COLOR = '#f8cca1';\n\n// TODO: Draw debug boxes using clipping to enhance quality\n\nconst debugContent = (ctx: Context, node: SafeNode) => {\n  if (!node.box) return;\n\n  const {\n    left,\n    top,\n    width,\n    height,\n    paddingLeft = 0,\n    paddingTop = 0,\n    paddingRight = 0,\n    paddingBottom = 0,\n    borderLeftWidth = 0,\n    borderTopWidth = 0,\n    borderRightWidth = 0,\n    borderBottomWidth = 0,\n  } = node.box;\n\n  ctx\n    .fillColor(CONTENT_COLOR)\n    .opacity(0.5)\n    .rect(\n      left + paddingLeft + borderLeftWidth,\n      top + paddingTop + borderTopWidth,\n      width - paddingLeft - paddingRight - borderRightWidth - borderLeftWidth,\n      height - paddingTop - paddingBottom - borderTopWidth - borderBottomWidth,\n    )\n    .fill();\n};\n\nconst debugPadding = (ctx: Context, node: SafeNode) => {\n  if (!node.box) return;\n\n  const {\n    left,\n    top,\n    width,\n    height,\n    paddingLeft = 0,\n    paddingTop = 0,\n    paddingRight = 0,\n    paddingBottom = 0,\n    borderLeftWidth = 0,\n    borderTopWidth = 0,\n    borderRightWidth = 0,\n    borderBottomWidth = 0,\n  } = node.box;\n\n  ctx.fillColor(PADDING_COLOR).opacity(0.5);\n\n  // Padding top\n  ctx\n    .rect(\n      left + paddingLeft + borderLeftWidth,\n      top + borderTopWidth,\n      width - paddingRight - paddingLeft - borderLeftWidth - borderRightWidth,\n      paddingTop,\n    )\n    .fill();\n\n  // Padding left\n  ctx\n    .rect(\n      left + borderLeftWidth,\n      top + borderTopWidth,\n      paddingLeft,\n      height - borderTopWidth - borderBottomWidth,\n    )\n    .fill();\n\n  // Padding right\n  ctx\n    .rect(\n      left + width - paddingRight - borderRightWidth,\n      top + borderTopWidth,\n      paddingRight,\n      height - borderTopWidth - borderBottomWidth,\n    )\n    .fill();\n\n  // Padding bottom\n  ctx\n    .rect(\n      left + paddingLeft + borderLeftWidth,\n      top + height - paddingBottom - borderBottomWidth,\n      width - paddingRight - paddingLeft - borderLeftWidth - borderRightWidth,\n      paddingBottom,\n    )\n    .fill();\n};\n\nconst debugMargin = (ctx: Context, node: SafeNode) => {\n  if (!node.box) return;\n\n  const { left, top, width, height } = node.box;\n  const {\n    marginLeft = 0,\n    marginTop = 0,\n    marginRight = 0,\n    marginBottom = 0,\n  } = node.box;\n  ctx.fillColor(MARGIN_COLOR).opacity(0.5);\n\n  // Margin top\n  ctx.rect(left, top - marginTop, width, marginTop).fill();\n\n  // Margin left\n  ctx\n    .rect(\n      left - marginLeft,\n      top - marginTop,\n      marginLeft,\n      height + marginTop + marginBottom,\n    )\n    .fill();\n\n  // Margin right\n  ctx\n    .rect(\n      left + width,\n      top - marginTop,\n      marginRight,\n      height + marginTop + marginBottom,\n    )\n    .fill();\n\n  // Margin bottom\n  ctx.rect(left, top + height, width, marginBottom).fill();\n};\n\nconst debugText = (ctx: Context, node: SafeNode) => {\n  if (!node.box) return;\n\n  const { left, top, width, height } = node.box;\n  const {\n    marginLeft = 0,\n    marginTop = 0,\n    marginRight = 0,\n    marginBottom = 0,\n  } = node.box;\n\n  const roundedWidth = Math.round(width + marginLeft + marginRight);\n  const roundedHeight = Math.round(height + marginTop + marginBottom);\n\n  ctx\n    .fontSize(6)\n    .opacity(1)\n    .fillColor('black')\n    .text(\n      `${roundedWidth} x ${roundedHeight}`,\n      left - marginLeft,\n      Math.max(top - marginTop - 4, 1),\n      { width: Infinity },\n    );\n};\n\nconst debugOrigin = (ctx: Context, node: SafeNode) => {\n  if (node.origin) {\n    ctx\n      .circle(node.origin.left, node.origin.top, 3)\n      .fill('red')\n      .circle(node.origin.left, node.origin.top, 5)\n      .stroke('red');\n  }\n};\n\nconst renderDebug = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('debug' in node.props) || !node.props.debug) return;\n\n  ctx.save();\n\n  debugContent(ctx, node);\n  debugPadding(ctx, node);\n  debugMargin(ctx, node);\n  debugText(ctx, node);\n  debugOrigin(ctx, node);\n\n  ctx.restore();\n};\n\nexport default renderDebug;\n"
  },
  {
    "path": "packages/render/src/primitives/renderEllipse.ts",
    "content": "import { SafeEllipseNode } from '@react-pdf/layout';\nimport { Context } from '../types';\n\nconst KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0);\n\nexport const drawEllipse = (\n  ctx: Context,\n  rx: number,\n  ry: number,\n  cx: number = 0,\n  cy: number = 0,\n) => {\n  const x = cx - rx;\n  const y = cy - ry;\n  const ox = rx * KAPPA;\n  const oy = ry * KAPPA;\n  const xe = x + rx * 2;\n  const ye = y + ry * 2;\n  const xm = x + rx;\n  const ym = y + ry;\n\n  ctx.moveTo(x, ym);\n  ctx.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n  ctx.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n  ctx.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n  ctx.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n  ctx.closePath();\n};\n\nconst renderEllipse = (ctx: Context, node: SafeEllipseNode) => {\n  const { cx, cy, rx, ry } = node.props || {};\n\n  drawEllipse(ctx, rx, ry, cx, cy);\n};\n\nexport default renderEllipse;\n"
  },
  {
    "path": "packages/render/src/primitives/renderFieldSet.ts",
    "content": "import { SafeFieldSetNode } from '@react-pdf/layout';\nimport { Context, RenderOptions } from '../types';\n\nconst renderFieldSet = (\n  ctx: Context,\n  node: SafeFieldSetNode,\n  options: Pick<RenderOptions, 'fieldSets'>,\n) => {\n  const name = node.props?.name || '';\n\n  if (!ctx._root.data.AcroForm) {\n    ctx.initForm();\n  }\n\n  const formField = ctx.formField(name);\n  const option = options;\n\n  if (!option.fieldSets) {\n    option.fieldSets = [formField];\n  } else {\n    option.fieldSets.push(formField);\n  }\n};\n\nexport const cleanUpFieldSet = (\n  _ctx: Context,\n  _node: SafeFieldSetNode,\n  options: RenderOptions,\n) => {\n  options.fieldSets.pop();\n};\n\nexport default renderFieldSet;\n"
  },
  {
    "path": "packages/render/src/primitives/renderGlyphs.ts",
    "content": "/* eslint-disable no-return-assign */\n\nimport { Glyph, Position } from '@react-pdf/textkit';\nimport { Context } from '../types';\n\nconst number = (n: number) => {\n  if (n > -1e21 && n < 1e21) {\n    return Math.round(n * 1e6) / 1e6;\n  }\n\n  throw new Error(`unsupported number: ${n}`);\n};\n\nconst _renderGlyphs = (\n  ctx: Context,\n  encoded: Glyph[],\n  positions: Position[],\n  x: number,\n  y: number,\n) => {\n  const commands: string[] = [];\n  const scale = ctx._fontSize / 1000;\n\n  let i;\n  let last = 0;\n  let hadOffset = false;\n\n  ctx.save();\n\n  // flip coordinate system\n  ctx.transform(1, 0, 0, -1, 0, ctx.page.height);\n  y = ctx.page.height - y;\n\n  // add current font to page if necessary\n  if (ctx.page.fonts[ctx._font.id] == null) {\n    ctx.page.fonts[ctx._font.id] = ctx._font.ref();\n  }\n\n  // begin the text object\n  ctx.addContent('BT');\n\n  // text position\n  ctx.addContent(`1 0 0 1 ${number(x)} ${number(y)} Tm`);\n\n  // font and font size\n  ctx.addContent(`/${ctx._font.id} ${number(ctx._fontSize)} Tf`);\n\n  // Adds a segment of text to the TJ command buffer\n  const addSegment = (cur: number) => {\n    if (last < cur) {\n      const hex = encoded.slice(last, cur).join('');\n      const advance =\n        positions[cur - 1].xAdvance - positions[cur - 1].advanceWidth!;\n      commands.push(`<${hex}> ${number(-advance)}`);\n    }\n\n    return (last = cur);\n  };\n\n  // Flushes the current TJ commands to the output stream\n  const flush = (s: number) => {\n    addSegment(s);\n\n    if (commands.length > 0) {\n      ctx.addContent(`[${commands.join(' ')}] TJ`);\n      return (commands.length = 0);\n    }\n  };\n\n  for (i = 0; i < positions.length; i += 1) {\n    // If we have an x or y offset, we have to break out of the current TJ command\n    // so we can move the text position.\n    const pos = positions[i];\n    if (pos.xOffset || pos.yOffset) {\n      // Flush the current buffer\n      flush(i);\n\n      // Move the text position and flush just the current character\n      ctx.addContent(\n        `1 0 0 1 ${number(x + pos.xOffset * scale)} ${number(\n          y + pos.yOffset * scale,\n        )} Tm`,\n      );\n      flush(i + 1);\n\n      hadOffset = true;\n    } else {\n      // If the last character had an offset, reset the text position\n      if (hadOffset) {\n        ctx.addContent(`1 0 0 1 ${number(x)} ${number(y)} Tm`);\n        hadOffset = false;\n      }\n\n      // Group segments that don't have any advance adjustments\n      if (pos.xAdvance - pos.advanceWidth! !== 0) {\n        addSegment(i + 1);\n      }\n    }\n\n    x += pos.xAdvance * scale;\n  }\n\n  // Flush any remaining commands\n  flush(i);\n\n  // end the text object\n  ctx.addContent('ET');\n\n  // restore flipped coordinate system\n  return ctx.restore();\n};\n\nconst renderGlyphs = (\n  ctx: Context,\n  glyphs: Glyph[],\n  positions: Position[],\n  x: number,\n  y: number,\n) => {\n  const scale = 1000 / ctx._fontSize;\n  const unitsPerEm = ctx._font.font.unitsPerEm || 1000;\n  const advanceWidthScale = 1000 / unitsPerEm;\n\n  // Glyph encoding and positioning\n  const encodedGlyphs = ctx._font.encodeGlyphs(glyphs);\n  const encodedPositions = positions.map((pos, i) => ({\n    xAdvance: pos.xAdvance * scale,\n    yAdvance: pos.yAdvance * scale,\n    xOffset: pos.xOffset,\n    yOffset: pos.yOffset,\n    advanceWidth: glyphs[i].advanceWidth * advanceWidthScale,\n  }));\n\n  return _renderGlyphs(ctx, encodedGlyphs, encodedPositions, x, y);\n};\n\nexport default renderGlyphs;\n"
  },
  {
    "path": "packages/render/src/primitives/renderGroup.ts",
    "content": "const renderGroup = () => {\n  // noop\n};\n\nexport default renderGroup;\n"
  },
  {
    "path": "packages/render/src/primitives/renderImage.ts",
    "content": "import { isNil } from '@react-pdf/fns';\nimport { SafeImageNode } from '@react-pdf/layout';\n\nimport clipNode from '../operations/clipNode';\nimport embedImage from '../operations/embedImage';\nimport resolveObjectFit from '../utils/resolveObjectFit';\nimport { Context, RenderOptions } from '../types';\n\nconst drawImage = (\n  ctx: Context,\n  node: SafeImageNode,\n  options: RenderOptions,\n) => {\n  if (!node.box) return;\n  if (!node.image) return;\n\n  const { left, top } = node.box;\n  const opacity = node.style?.opacity;\n  const objectFit = node.style?.objectFit;\n  const objectPositionX = node.style?.objectPositionX;\n  const objectPositionY = node.style?.objectPositionY;\n  const paddingTop = node.box.paddingTop || 0;\n  const paddingRight = node.box.paddingRight || 0;\n  const paddingBottom = node.box.paddingBottom || 0;\n  const paddingLeft = node.box.paddingLeft || 0;\n  const imageCache = options.imageCache || new Map();\n\n  const { width, height, xOffset, yOffset } = resolveObjectFit(\n    objectFit,\n    node.box.width - paddingLeft - paddingRight,\n    node.box.height - paddingTop - paddingBottom,\n    node.image.width,\n    node.image.height,\n    objectPositionX,\n    objectPositionY,\n  );\n\n  if (node.image.data) {\n    if (width !== 0 && height !== 0) {\n      const cacheKey = node.image.key;\n\n      const image = imageCache.get(cacheKey) || embedImage(ctx, node);\n\n      if (cacheKey) imageCache.set(cacheKey, image);\n\n      const imageOpacity = isNil(opacity) ? 1 : opacity;\n\n      ctx\n        .fillOpacity(imageOpacity)\n        .image(\n          image,\n          left + paddingLeft + xOffset,\n          top + paddingTop + yOffset,\n          {\n            width,\n            height,\n          },\n        );\n    } else {\n      console.warn(\n        `Image with src '${JSON.stringify(\n          node.props.src || node.props.source,\n        )}' skipped due to invalid dimensions`,\n      );\n    }\n  }\n};\n\nconst renderImage = (\n  ctx: Context,\n  node: SafeImageNode,\n  options: RenderOptions,\n) => {\n  ctx.save();\n\n  clipNode(ctx, node);\n  drawImage(ctx, node, options);\n\n  ctx.restore();\n};\n\nexport default renderImage;\n"
  },
  {
    "path": "packages/render/src/primitives/renderLine.ts",
    "content": "import { SafeLineNode } from '@react-pdf/layout';\nimport { Context } from '../types';\n\nconst renderLine = (ctx: Context, node: SafeLineNode) => {\n  const { x1, x2, y1, y2 } = node.props || {};\n\n  ctx.moveTo(x1, y1);\n  ctx.lineTo(x2, y2);\n};\n\nexport default renderLine;\n"
  },
  {
    "path": "packages/render/src/primitives/renderList.ts",
    "content": "import { SafeListNode } from '@react-pdf/layout';\n\nimport { Context } from '../types';\nimport { parseSelectAndListFieldOptions } from '../utils/parseFormOptions';\n\nconst renderList = (ctx: Context, node: SafeListNode) => {\n  if (!node.box) return;\n\n  const { top, left, width, height } = node.box || {};\n\n  // Element's name\n  const name = ('name' in node.props ? node.props.name || '' : '') as string;\n\n  if (!ctx._root.data.AcroForm) {\n    ctx.initForm();\n  }\n\n  ctx.formList(\n    name,\n    left,\n    top,\n    width,\n    height,\n    parseSelectAndListFieldOptions(node),\n  );\n};\n\nexport default renderList;\n"
  },
  {
    "path": "packages/render/src/primitives/renderNode.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { SafeNode } from '@react-pdf/layout';\n\nimport renderSvg from './renderSvg';\nimport renderText from './renderText';\nimport renderPage from './renderPage';\nimport renderNote from './renderNote';\nimport renderImage from './renderImage';\nimport renderDebug from './renderDebug';\nimport renderCanvas from './renderCanvas';\nimport renderBorders from './renderBorders';\nimport renderBackground from './renderBackground';\nimport setLink from '../operations/setLink';\nimport clipNode from '../operations/clipNode';\nimport transform from '../operations/transform';\nimport setDestination from '../operations/setDestination';\nimport renderTextInput from './renderTextInput';\nimport renderSelect from './renderSelect';\nimport renderFieldSet, { cleanUpFieldSet } from './renderFieldSet';\nimport renderList from './renderList';\nimport renderCheckbox from './renderCheckbox';\nimport { Context, RenderOptions } from '../types';\n\ntype Primitives = (typeof P)[keyof typeof P];\n\nconst isRecursiveNode = (node: SafeNode) =>\n  node.type !== P.Text && node.type !== P.Svg;\n\nconst renderChildren = (\n  ctx: Context,\n  node: SafeNode,\n  options: RenderOptions,\n) => {\n  ctx.save();\n\n  if (node.box) {\n    ctx.translate(node.box.left, node.box.top);\n  }\n\n  const children = node.children || [];\n\n  const renderChild = (child: SafeNode) => renderNode(ctx, child, options);\n\n  children.forEach(renderChild);\n\n  ctx.restore();\n};\n\nconst renderFns: Partial<Record<Primitives, any>> = {\n  [P.Text]: renderText,\n  [P.Note]: renderNote,\n  [P.Image]: renderImage,\n  [P.FieldSet]: renderFieldSet,\n  [P.TextInput]: renderTextInput,\n  [P.Select]: renderSelect,\n  [P.Checkbox]: renderCheckbox,\n  [P.List]: renderList,\n  [P.Canvas]: renderCanvas,\n  [P.Svg]: renderSvg,\n  [P.Link]: setLink,\n};\n\nconst cleanUpFns: Partial<Record<Primitives, any>> = {\n  [P.FieldSet]: cleanUpFieldSet,\n};\n\nconst renderNode = (ctx: Context, node: SafeNode, options: RenderOptions) => {\n  const overflowHidden = node.style?.overflow === 'hidden';\n  const shouldRenderChildren = isRecursiveNode(node);\n\n  if (node.type === P.Page) renderPage(ctx, node);\n\n  ctx.save();\n\n  if (overflowHidden) clipNode(ctx, node);\n\n  transform(ctx, node);\n  renderBackground(ctx, node);\n  renderBorders(ctx, node);\n\n  const renderFn = renderFns[node.type];\n\n  if (renderFn) renderFn(ctx, node, options);\n\n  if (shouldRenderChildren) renderChildren(ctx, node, options);\n\n  const cleanUpFn = cleanUpFns[node.type];\n\n  if (cleanUpFn) cleanUpFn(ctx, node, options);\n\n  setDestination(ctx, node);\n  renderDebug(ctx, node);\n\n  ctx.restore();\n};\n\nexport default renderNode;\n"
  },
  {
    "path": "packages/render/src/primitives/renderNote.ts",
    "content": "import { SafeNoteNode } from '@react-pdf/layout';\n\nimport { Context } from '../types';\n\nconst renderNote = (ctx: Context, node: SafeNoteNode) => {\n  if (!node.box) return;\n\n  const { top, left } = node.box;\n  const value = node?.children?.[0].value || '';\n  const color = node.style?.backgroundColor;\n\n  ctx.note(left, top, 0, 0, value, { color });\n};\n\nexport default renderNote;\n"
  },
  {
    "path": "packages/render/src/primitives/renderPage.ts",
    "content": "import { SafePageNode } from '@react-pdf/layout';\nimport { Context } from '../types';\n\nconst renderPage = (ctx: Context, node: SafePageNode) => {\n  if (!node.box) return;\n\n  const { width, height } = node.box;\n  const dpi = node.props?.dpi || 72;\n  const userUnit = dpi / 72;\n\n  ctx.addPage({ size: [width, height], margin: 0, userUnit });\n};\n\nexport default renderPage;\n"
  },
  {
    "path": "packages/render/src/primitives/renderPath.ts",
    "content": "import { SafePathNode } from '@react-pdf/layout';\nimport { Context } from '../types';\n\nconst renderPath = (ctx: Context, node: SafePathNode) => {\n  const d = node.props?.d;\n\n  if (d) ctx.path(node.props.d);\n};\n\nexport default renderPath;\n"
  },
  {
    "path": "packages/render/src/primitives/renderPolygon.ts",
    "content": "import { SafePolygonNode } from '@react-pdf/layout';\n\nimport { Context } from '../types';\nimport parsePoints from '../svg/parsePoints';\nimport { drawPolyline } from './renderPolyline';\n\nconst renderPolygon = (ctx: Context, node: SafePolygonNode) => {\n  const points = parsePoints(node.props.points || '');\n  drawPolyline(ctx, points);\n  ctx.closePath();\n};\n\nexport default renderPolygon;\n"
  },
  {
    "path": "packages/render/src/primitives/renderPolyline.ts",
    "content": "import { SafePolylineNode } from '@react-pdf/layout';\n\nimport parsePoints from '../svg/parsePoints';\nimport { Context } from '../types';\n\nexport const drawPolyline = (ctx: Context, points: number[][]) => {\n  if (points.length > 0) {\n    ctx.moveTo(points[0][0], points[0][1]);\n    points.slice(1).forEach((p) => ctx.lineTo(p[0], p[1]));\n  }\n};\n\nconst renderPolyline = (ctx: Context, node: SafePolylineNode) => {\n  const points = parsePoints(node.props.points || '');\n  drawPolyline(ctx, points);\n};\n\nexport default renderPolyline;\n"
  },
  {
    "path": "packages/render/src/primitives/renderRect.ts",
    "content": "import { SafeRectNode } from '@react-pdf/layout';\nimport { Context } from '../types';\n\nconst KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0);\n\nconst renderRect = (ctx: Context, node: SafeRectNode) => {\n  const x = node.props?.x || 0;\n  const y = node.props?.y || 0;\n  const rx = node.props?.rx || 0;\n  const ry = node.props?.ry || 0;\n  const width = node.props?.width || 0;\n  const height = node.props?.height || 0;\n\n  if (!width || !height) return;\n\n  if (rx && ry) {\n    const krx = rx * KAPPA;\n    const kry = ry * KAPPA;\n\n    ctx.moveTo(x + rx, y);\n    ctx.lineTo(x - rx + width, y);\n    ctx.bezierCurveTo(\n      x - rx + width + krx,\n      y,\n      x + width,\n      y + ry - kry,\n      x + width,\n      y + ry,\n    );\n    ctx.lineTo(x + width, y + height - ry);\n    ctx.bezierCurveTo(\n      x + width,\n      y + height - ry + kry,\n      x - rx + width + krx,\n      y + height,\n      x - rx + width,\n      y + height,\n    );\n    ctx.lineTo(x + rx, y + height);\n    ctx.bezierCurveTo(\n      x + rx - krx,\n      y + height,\n      x,\n      y + height - ry + kry,\n      x,\n      y + height - ry,\n    );\n    ctx.lineTo(x, y + ry);\n    ctx.bezierCurveTo(x, y + ry - kry, x + rx - krx, y, x + rx, y);\n  } else {\n    ctx.moveTo(x, y);\n    ctx.lineTo(x + width, y);\n    ctx.lineTo(x + width, y + height);\n    ctx.lineTo(x, y + height);\n  }\n\n  ctx.closePath();\n};\n\nexport default renderRect;\n"
  },
  {
    "path": "packages/render/src/primitives/renderSelect.ts",
    "content": "import { SafeSelectNode } from '@react-pdf/layout';\n\nimport { Context } from '../types';\nimport { parseSelectAndListFieldOptions } from '../utils/parseFormOptions';\n\nconst renderSelect = (ctx: Context, node: SafeSelectNode) => {\n  if (!node.box) return;\n\n  const { top, left, width, height } = node.box;\n\n  // Element's name\n  const name = node.props?.name || '';\n\n  if (!ctx._root.data.AcroForm) {\n    ctx.initForm();\n  }\n\n  ctx.formCombo(\n    name,\n    left,\n    top,\n    width,\n    height,\n    parseSelectAndListFieldOptions(node),\n  );\n};\n\nexport default renderSelect;\n"
  },
  {
    "path": "packages/render/src/primitives/renderSvg.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport { isNil } from '@react-pdf/fns';\nimport { Transform } from '@react-pdf/stylesheet';\nimport {\n  SafeLinearGradientNode,\n  SafeNode,\n  SafeRadialGradientNode,\n  SafeSvgNode,\n} from '@react-pdf/layout';\n\nimport renderPath from './renderPath';\nimport renderRect from './renderRect';\nimport renderLine from './renderLine';\nimport renderGroup from './renderGroup';\nimport renderCircle from './renderCircle';\nimport renderSvgText from './renderSvgText';\nimport renderEllipse from './renderEllipse';\nimport renderPolygon from './renderPolygon';\nimport renderPolyline from './renderPolyline';\nimport renderSvgImage from './renderSvgImage';\nimport clipNode from '../operations/clipNode';\nimport transform from '../operations/transform';\nimport getBoundingBox from '../svg/getBoundingBox';\nimport { Context } from '../types';\n\ntype Primitives = (typeof P)[keyof typeof P];\n\nconst setStrokeWidth = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('strokeWidth' in node.props)) return;\n\n  const lineWidth = node.props.strokeWidth;\n  if (lineWidth) ctx.lineWidth(lineWidth);\n};\n\nconst setStrokeColor = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('stroke' in node.props)) return;\n\n  const strokeColor = node.props.stroke;\n  if (strokeColor) ctx.strokeColor(strokeColor);\n};\n\nconst setOpacity = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('opacity' in node.props)) return;\n\n  const opacity = node.props.opacity;\n  if (!isNil(opacity)) ctx.opacity(opacity);\n};\n\nconst setFillOpacity = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('fillOpacity' in node.props)) return;\n\n  const fillOpacity = node.props.fillOpacity || null;\n  if (!isNil(fillOpacity)) ctx.fillOpacity(fillOpacity);\n};\n\nconst setStrokeOpacity = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('strokeOpacity' in node.props)) return;\n\n  const strokeOpacity = node.props?.strokeOpacity;\n  if (!isNil(strokeOpacity)) ctx.strokeOpacity(strokeOpacity);\n};\n\nconst setLineJoin = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('strokeLinejoin' in node.props)) return;\n\n  const lineJoin = node.props.strokeLinejoin;\n  if (lineJoin) ctx.lineJoin(lineJoin);\n};\n\nconst setLineCap = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('strokeLinecap' in node.props)) return;\n\n  const lineCap = node.props?.strokeLinecap;\n  if (lineCap) ctx.lineCap(lineCap);\n};\n\nconst setLineDash = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('strokeDasharray' in node.props)) return;\n\n  const value = node.props?.strokeDasharray || null;\n\n  // @ts-expect-error check this works as expected\n  if (value) ctx.dash(value.split(/[\\s,]+/).map(Number));\n};\n\nconst hasLinearGradientFill = (node: SafeNode) => {\n  if (!node.props) return false;\n  if (!('fill' in node.props)) return false;\n  if (typeof node.props.fill === 'string') return false;\n\n  return node.props.fill?.type === P.LinearGradient;\n};\n\nconst hasRadialGradientFill = (node: SafeNode) => {\n  if (!node.props) return false;\n  if (!('fill' in node.props)) return false;\n  if (typeof node.props.fill === 'string') return false;\n\n  return node.props.fill?.type === P.RadialGradient;\n};\n\nfunction multiplyMatrices(m1: number[], m2: number[]) {\n  const a = m1[0] * m2[0] + m1[2] * m2[1];\n  const b = m1[1] * m2[0] + m1[3] * m2[1];\n  const c = m1[0] * m2[2] + m1[2] * m2[3];\n  const d = m1[1] * m2[2] + m1[3] * m2[3];\n  const e = m1[0] * m2[4] + m1[2] * m2[5] + m1[4];\n  const f = m1[1] * m2[4] + m1[3] * m2[5] + m1[5];\n  return [a, b, c, d, e, f];\n}\n\nconst transformGradient = (\n  grad: any,\n  transforms: Transform[],\n  bbox: number[],\n  units: string,\n) => {\n  const matrices = transforms.map((transform) => {\n    switch (transform.operation) {\n      case 'scale': {\n        const value = transform.value;\n        return [value[0], 0, 0, value[1], 0, 0];\n      }\n      case 'translate': {\n        const value = transform.value;\n        let x = value[0] || 0;\n        let y = value[1] || 0;\n\n        if (units === 'objectBoundingBox') {\n          x = (bbox[2] - bbox[0]) * x;\n          y = (bbox[3] - bbox[1]) * y;\n        }\n\n        return [1, 0, 0, 1, x, y];\n      }\n      case 'rotate': {\n        const value = transform.value;\n        const cos = Math.cos(value[0]);\n        const sin = Math.sin(value[0]);\n        return [cos, sin, -sin, cos, 0, 0];\n      }\n      case 'skew': {\n        const value = transform.value;\n        return [1, Math.tan(value[0]), Math.tan(value[1]), 1, 0, 0];\n      }\n      case 'matrix': {\n        const value = transform.value;\n        let x = value[4] || 0;\n        let y = value[5] || 0;\n\n        if (units === 'objectBoundingBox') {\n          x = (bbox[2] - bbox[0]) * x;\n          y = (bbox[3] - bbox[1]) * y;\n        }\n\n        return [value[0], value[1], value[2], value[3], x, y];\n      }\n      default:\n        return [1, 0, 0, 1, 0, 0];\n    }\n  });\n\n  const matrix = matrices.reduce(multiplyMatrices, [1, 0, 0, 1, 0, 0]);\n\n  grad.setTransform(...matrix);\n};\n\n// Math simplified from https://github.com/devongovett/svgkit/blob/master/src/elements/SVGGradient.js#L104\nconst setLinearGradientFill = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('fill' in node.props)) return;\n\n  const bbox = getBoundingBox(node);\n  const gradient = node.props?.fill as SafeLinearGradientNode;\n\n  if (!gradient) return;\n\n  const units = gradient.props.gradientUnits || 'objectBoundingBox';\n  const transforms = gradient.props.gradientTransform || [];\n\n  let x1 = gradient.props.x1 || 0;\n  let y1 = gradient.props.y1 || 0;\n  let x2 = gradient.props.x2 || 1;\n  let y2 = gradient.props.y2 || 0;\n\n  if (units === 'objectBoundingBox') {\n    const m0 = bbox[2] - bbox[0];\n    const m3 = bbox[3] - bbox[1];\n    const m4 = bbox[0];\n    const m5 = bbox[1];\n\n    x1 = m0 * x1 + m4;\n    y1 = m3 * y1 + m5;\n    x2 = m0 * x2 + m4;\n    y2 = m3 * y2 + m5;\n  }\n\n  const grad = ctx.linearGradient(x1, y1, x2, y2);\n\n  transformGradient(grad, transforms, bbox, units);\n\n  gradient.children?.forEach((stop) => {\n    grad.stop(stop.props.offset, stop.props.stopColor, stop.props.stopOpacity);\n  });\n\n  ctx.fill(grad);\n};\n\n// Math simplified from https://github.com/devongovett/svgkit/blob/master/src/elements/SVGGradient.js#L155\nconst setRadialGradientFill = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('fill' in node.props)) return;\n\n  const bbox = getBoundingBox(node);\n  const gradient = node.props?.fill as SafeRadialGradientNode;\n\n  if (!gradient) return;\n\n  const units = gradient.props.gradientUnits || 'objectBoundingBox';\n  const transforms = gradient.props.gradientTransform || [];\n\n  let r = gradient.props.r || 0.5;\n  let cx = gradient.props.cx || 0.5;\n  let cy = gradient.props.cy || 0.5;\n  let fx = gradient.props.fx || cx;\n  let fy = gradient.props.fy || cy;\n\n  if (units === 'objectBoundingBox') {\n    const m0 = bbox[2] - bbox[0];\n    const m3 = bbox[3] - bbox[1];\n    const m4 = bbox[0];\n    const m5 = bbox[1];\n\n    r = r * m0;\n    cx = m0 * cx + m4;\n    cy = m3 * cy + m5;\n    fx = m0 * fx + m4;\n    fy = m3 * fy + m5;\n  }\n\n  const grad = ctx.radialGradient(cx, cy, 0, fx, fy, r);\n\n  transformGradient(grad, transforms, bbox, units);\n\n  gradient.children?.forEach((stop) => {\n    grad.stop(stop.props.offset, stop.props.stopColor, stop.props.stopOpacity);\n  });\n\n  ctx.fill(grad);\n};\n\nconst setFillColor = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('fill' in node.props)) return;\n\n  const fillColor = node.props?.fill as string;\n\n  if (fillColor) ctx.fillColor(fillColor);\n};\n\nconst setFill = (ctx: Context, node: SafeNode) => {\n  if (hasLinearGradientFill(node)) return setLinearGradientFill(ctx, node);\n  if (hasRadialGradientFill(node)) return setRadialGradientFill(ctx, node);\n\n  return setFillColor(ctx, node);\n};\n\nconst draw = (ctx: Context, node: SafeNode) => {\n  const props = node.props || {};\n\n  if ('fill' in props && 'stroke' in props && props.fill && props.stroke) {\n    ctx.fillAndStroke(props.fillRule);\n  } else if ('fill' in props && props.fill) {\n    ctx.fill(props.fillRule);\n  } else if ('stroke' in props && props.stroke) {\n    ctx.stroke();\n  } else {\n    ctx.save();\n    ctx.opacity(0);\n    ctx.fill(null!);\n    ctx.restore();\n  }\n};\n\nconst noop = () => {};\n\nconst renderFns: Partial<Record<Primitives, any>> = {\n  [P.Tspan]: noop,\n  [P.TextInstance]: noop,\n  [P.Path]: renderPath,\n  [P.Rect]: renderRect,\n  [P.Line]: renderLine,\n  [P.G]: renderGroup,\n  [P.Text]: renderSvgText,\n  [P.Circle]: renderCircle,\n  [P.Image]: renderSvgImage,\n  [P.Ellipse]: renderEllipse,\n  [P.Polygon]: renderPolygon,\n  [P.Polyline]: renderPolyline,\n};\n\nconst renderNode = (ctx: Context, node: SafeNode) => {\n  const renderFn = renderFns[node.type];\n\n  if (renderFn) {\n    renderFn(ctx, node);\n  } else {\n    console.warn(`SVG node of type ${node.type} is not currently supported`);\n  }\n};\n\nconst drawNode = (ctx: Context, node: SafeNode) => {\n  setLineCap(ctx, node);\n  setLineDash(ctx, node);\n  setLineJoin(ctx, node);\n  setStrokeWidth(ctx, node);\n  setStrokeColor(ctx, node);\n  setFill(ctx, node);\n  setStrokeOpacity(ctx, node);\n  setFillOpacity(ctx, node);\n  setOpacity(ctx, node);\n  transform(ctx, node);\n  renderNode(ctx, node);\n  draw(ctx, node);\n};\n\nconst clipPath = (ctx: Context, node: SafeNode) => {\n  if (!node.props) return;\n  if (!('clipPath' in node.props)) return;\n\n  const value = node.props.clipPath;\n\n  if (value) {\n    const children = value.children || [];\n    children.forEach((child) => renderNode(ctx, child));\n    ctx.clip();\n  }\n};\n\nconst drawChildren = (ctx: Context, node: SafeNode) => {\n  const children = node.children || [];\n\n  children.forEach((child) => {\n    ctx.save();\n\n    clipPath(ctx, child);\n    drawNode(ctx, child);\n    drawChildren(ctx, child);\n\n    ctx.restore();\n  });\n};\n\nconst resolveAspectRatio = (ctx: Context, node: SafeSvgNode) => {\n  if (!node.box) return;\n\n  const { width, height } = node.box;\n  const { viewBox, preserveAspectRatio } = node.props;\n  const { meetOrSlice = 'meet', align = 'xMidYMid' } =\n    preserveAspectRatio || {};\n\n  if (viewBox == null || width == null || height == null) return;\n\n  const x = viewBox?.minX || 0;\n  const y = viewBox?.minY || 0;\n  const logicalWidth = viewBox?.maxX || width;\n  const logicalHeight = viewBox?.maxY || height;\n\n  const logicalRatio = logicalWidth / logicalHeight;\n  const physicalRatio = width / height;\n  const scaleX = width / logicalWidth;\n  const scaleY = height / logicalHeight;\n\n  if (align === 'none') {\n    ctx.scale(scaleX, scaleY);\n    ctx.translate(-x, -y);\n    return;\n  }\n\n  if (\n    (logicalRatio < physicalRatio && meetOrSlice === 'meet') ||\n    (logicalRatio >= physicalRatio && meetOrSlice === 'slice')\n  ) {\n    ctx.scale(scaleY, scaleY);\n\n    switch (align) {\n      case 'xMinYMin':\n      case 'xMinYMid':\n      case 'xMinYMax':\n        ctx.translate(-x, -y);\n        break;\n\n      case 'xMidYMin':\n      case 'xMidYMid':\n      case 'xMidYMax':\n        ctx.translate(\n          -x - (logicalWidth - (width * logicalHeight) / height) / 2,\n          -y,\n        );\n        break;\n\n      default:\n        ctx.translate(\n          -x - (logicalWidth - (width * logicalHeight) / height),\n          -y,\n        );\n    }\n  } else {\n    ctx.scale(scaleX, scaleX);\n\n    switch (align) {\n      case 'xMinYMin':\n      case 'xMidYMin':\n      case 'xMaxYMin':\n        ctx.translate(-x, -y);\n        break;\n\n      case 'xMinYMid':\n      case 'xMidYMid':\n      case 'xMaxYMid':\n        ctx.translate(\n          -x,\n          -y - (logicalHeight - (height * logicalWidth) / width) / 2,\n        );\n        break;\n\n      default:\n        ctx.translate(\n          -x,\n          -y - (logicalHeight - (height * logicalWidth) / width),\n        );\n    }\n  }\n};\n\nconst moveToOrigin = (ctx: Context, node: SafeSvgNode) => {\n  if (!node.box) return;\n\n  const { top, left } = node.box;\n\n  const paddingLeft = node.box.paddingLeft || 0;\n  const paddingTop = node.box.paddingTop || 0;\n\n  ctx.translate(left + paddingLeft, top + paddingTop);\n};\n\nconst renderSvg = (ctx: Context, node: SafeSvgNode) => {\n  ctx.save();\n\n  clipNode(ctx, node);\n  moveToOrigin(ctx, node);\n  resolveAspectRatio(ctx, node);\n  drawChildren(ctx, node);\n\n  ctx.restore();\n};\n\nexport default renderSvg;\n"
  },
  {
    "path": "packages/render/src/primitives/renderSvgImage.ts",
    "content": "import { SafeImageNode } from '@react-pdf/layout';\n\nimport { Context } from '../types';\n\nconst renderImage = (ctx: Context, node: SafeImageNode) => {\n  if (!node.box) return;\n  if (!node.image?.data) return;\n\n  const { x = 0, y = 0 } = node.props;\n  const { width, height, opacity } = node.style;\n  const paddingTop = node.box.paddingLeft || 0;\n  const paddingLeft = node.box.paddingLeft || 0;\n\n  if (width === 0 || height === 0) {\n    console.warn(\n      `Image with src '${\n        (node.props as any).href\n      }' skipped due to invalid dimensions`,\n    );\n    return;\n  }\n\n  if (typeof width === 'string' || typeof height === 'string') {\n    console.warn(\n      `Image with src '${\n        (node.props as any).href\n      }' skipped due to percentage width or height`,\n    );\n    return;\n  }\n\n  ctx.save();\n\n  ctx\n    .fillOpacity(opacity || 1)\n    .image(node.image.data, x + paddingLeft, y + paddingTop, {\n      width,\n      height,\n    });\n\n  ctx.restore();\n};\n\nexport default renderImage;\n"
  },
  {
    "path": "packages/render/src/primitives/renderSvgText.ts",
    "content": "import {\n  DominantBaseline,\n  SafeTextNode,\n  SafeTspanNode,\n  TextAnchor,\n} from '@react-pdf/layout';\nimport { AttributedString, Run } from '@react-pdf/textkit';\n\nimport { Context } from '../types';\nimport renderGlyphs from './renderGlyphs';\n\nconst renderRun = (ctx: Context, run: Run) => {\n  if (!run.glyphs) return;\n  if (!run.positions) return;\n\n  const runAdvanceWidth = run.xAdvance;\n  const font = run.attributes.font?.[0];\n  const { fontSize, color, opacity } = run.attributes;\n\n  if (color) ctx.fillColor(color);\n  ctx.fillOpacity(opacity!);\n\n  if (font) {\n    ctx.font(font.type === 'STANDARD' ? font.fullName : font, fontSize);\n  }\n\n  try {\n    renderGlyphs(ctx, run.glyphs!, run.positions!, 0, 0);\n  } catch (error) {\n    console.log(error);\n  }\n\n  ctx.translate(runAdvanceWidth!, 0);\n};\n\nconst renderSpan = (\n  ctx: Context,\n  line: AttributedString,\n  textAnchor?: TextAnchor,\n  dominantBaseline?: DominantBaseline,\n) => {\n  ctx.save();\n\n  const x = line.box?.x || 0;\n  const y = line.box?.y || 0;\n  const font = line.runs[0]?.attributes.font?.[0];\n  const scale = line.runs[0]?.attributes?.scale || 1;\n  const width = line.xAdvance!;\n\n  if (!font) return;\n\n  const ascent = font.ascent * scale;\n  const xHeight = font.xHeight * scale;\n  const descent = font.descent * scale;\n  const capHeight = font.capHeight * scale;\n\n  let xTranslate = x;\n  let yTranslate = y;\n\n  switch (textAnchor) {\n    case 'middle':\n      xTranslate = x - width / 2;\n      break;\n    case 'end':\n      xTranslate = x - width;\n      break;\n    default:\n      xTranslate = x;\n      break;\n  }\n\n  switch (dominantBaseline) {\n    case 'middle':\n    case 'central':\n      yTranslate = y + capHeight / 2;\n      break;\n    case 'hanging':\n      yTranslate = y + capHeight;\n      break;\n    case 'mathematical':\n      yTranslate = y + xHeight;\n      break;\n    case 'text-after-edge':\n      yTranslate = y + descent;\n      break;\n    case 'text-before-edge':\n      yTranslate = y + ascent;\n      break;\n    default:\n      yTranslate = y;\n      break;\n  }\n\n  ctx.translate(xTranslate, yTranslate);\n\n  line.runs.forEach((run) => renderRun(ctx, run));\n\n  ctx.restore();\n};\n\nconst renderSvgText = (ctx: Context, node: SafeTextNode) => {\n  const children = node.children as SafeTspanNode[];\n\n  children.forEach((span) =>\n    renderSpan(\n      ctx,\n      span.lines![0],\n      span.props.textAnchor,\n      span.props.dominantBaseline,\n    ),\n  );\n};\n\nexport default renderSvgText;\n"
  },
  {
    "path": "packages/render/src/primitives/renderText.ts",
    "content": "import { isNil } from '@react-pdf/fns';\n\nimport renderGlyphs from './renderGlyphs';\nimport parseColor from '../utils/parseColor';\nimport { Context } from '../types';\nimport { SafeTextNode } from '@react-pdf/layout';\nimport {\n  Attachment,\n  AttributedString,\n  DecorationLine,\n  Paragraph,\n  Rect,\n  Run,\n} from '@react-pdf/textkit';\n\nconst DEST_REGEXP = /^#.+/;\n\nconst isSrcId = (src: string) => src.match(DEST_REGEXP);\n\nconst renderAttachment = (ctx: Context, attachment: Attachment) => {\n  const { xOffset = 0, yOffset = 0, width, height, image } = attachment;\n\n  ctx.translate(-width + xOffset, -height + yOffset);\n\n  ctx.image(image, 0, 0, {\n    fit: [width, height],\n    align: 'center',\n    valign: 'bottom',\n  });\n};\n\nconst renderAttachments = (ctx: Context, run: Run, glyphs: Run['glyphs']) => {\n  if (!glyphs) return;\n  if (!run.positions) return;\n\n  const font = run.attributes.font?.[0];\n  if (!font) return;\n\n  ctx.save();\n\n  const space = font.glyphForCodePoint(0x20);\n  const objectReplacement = font.glyphForCodePoint(0xfffc);\n\n  let attachmentAdvance = 0;\n  for (let i = 0; i < glyphs.length; i += 1) {\n    const position = run.positions[i];\n    const glyph = glyphs[i];\n\n    attachmentAdvance += position.xAdvance || 0;\n\n    if (glyph.id === objectReplacement.id && run.attributes.attachment) {\n      ctx.translate(attachmentAdvance, position.yOffset || 0);\n      renderAttachment(ctx, run.attributes.attachment);\n      glyphs[i] = space;\n      attachmentAdvance = 0;\n    }\n  }\n\n  ctx.restore();\n};\n\nconst renderRun = (ctx: Context, run: Run) => {\n  if (!run.glyphs) return;\n  if (!run.positions) return;\n\n  const font = run.attributes.font?.[0];\n  if (!font) return;\n\n  const { fontSize, link } = run.attributes;\n  const color = parseColor(run.attributes.color);\n  const opacity = isNil(run.attributes.opacity)\n    ? color.opacity\n    : run.attributes.opacity;\n\n  const { height = 0, descent = 0, xAdvance = 0 } = run;\n\n  ctx.fillColor(color.value);\n  ctx.fillOpacity(opacity);\n\n  if (link) {\n    if (isSrcId(link)) {\n      ctx.goTo(0, -height - descent, xAdvance, height, link.slice(1));\n    } else {\n      ctx.link(0, -height - descent, xAdvance, height, link);\n    }\n  }\n\n  // Copy glyphs to avoid mutating the original array\n  const glyphs = [...run.glyphs];\n\n  renderAttachments(ctx, run, glyphs);\n\n  ctx.font(font.type === 'STANDARD' ? font.fullName : font, fontSize);\n\n  try {\n    renderGlyphs(ctx, glyphs, run.positions!, 0, 0);\n  } catch (error) {\n    console.log(error);\n  }\n\n  ctx.translate(xAdvance, 0);\n};\n\nconst renderBackground = (\n  ctx: Context,\n  rect: Rect,\n  backgroundColor: string,\n) => {\n  const color = parseColor(backgroundColor);\n\n  ctx.save();\n  ctx.fillOpacity(color.opacity);\n  ctx.rect(rect.x, rect.y, rect.width, rect.height);\n  ctx.fill(color.value);\n  ctx.restore();\n};\n\nconst renderDecorationLine = (ctx: Context, decorationLine: DecorationLine) => {\n  ctx.save();\n  ctx.lineWidth(decorationLine.rect.height);\n  ctx.strokeOpacity(decorationLine.opacity);\n\n  if (/dashed/.test(decorationLine.style)) {\n    ctx.dash(3 * decorationLine.rect.height, {});\n  } else if (/dotted/.test(decorationLine.style)) {\n    ctx.dash(decorationLine.rect.height, {});\n  }\n\n  if (/wavy/.test(decorationLine.style)) {\n    const dist = Math.max(2, decorationLine.rect.height);\n    let step = 1.1 * dist;\n    const stepCount = Math.floor(decorationLine.rect.width / (2 * step));\n\n    // Adjust step to fill entire width\n    const remainingWidth = decorationLine.rect.width - stepCount * 2 * step;\n    const adjustment = remainingWidth / stepCount / 2;\n    step += adjustment;\n\n    const cp1y = decorationLine.rect.y + dist;\n    const cp2y = decorationLine.rect.y - dist;\n    let { x } = decorationLine.rect;\n\n    ctx.moveTo(decorationLine.rect.x, decorationLine.rect.y);\n\n    for (let i = 0; i < stepCount; i += 1) {\n      ctx.bezierCurveTo(\n        x + step,\n        cp1y,\n        x + step,\n        cp2y,\n        x + 2 * step,\n        decorationLine.rect.y,\n      );\n      x += 2 * step;\n    }\n  } else {\n    ctx.moveTo(decorationLine.rect.x, decorationLine.rect.y);\n    ctx.lineTo(\n      decorationLine.rect.x + decorationLine.rect.width,\n      decorationLine.rect.y,\n    );\n\n    if (/double/.test(decorationLine.style)) {\n      ctx.moveTo(\n        decorationLine.rect.x,\n        decorationLine.rect.y + decorationLine.rect.height * 2,\n      );\n      ctx.lineTo(\n        decorationLine.rect.x + decorationLine.rect.width,\n        decorationLine.rect.y + decorationLine.rect.height * 2,\n      );\n    }\n  }\n\n  ctx.stroke(decorationLine.color);\n  ctx.restore();\n};\n\nconst renderLine = (ctx: Context, line: AttributedString) => {\n  if (!line.box) return;\n\n  const lineAscent = line.ascent || 0;\n\n  ctx.save();\n  ctx.translate(line.box.x, line.box.y + lineAscent);\n\n  for (let i = 0; i < line.runs.length; i += 1) {\n    const run = line.runs[i];\n    const isLastRun = i === line.runs.length - 1;\n\n    if (run.attributes.backgroundColor) {\n      const xAdvance = run.xAdvance ?? 0;\n      const overflowRight = isLastRun ? line.overflowRight ?? 0 : 0;\n\n      const backgroundRect = {\n        x: 0,\n        y: -lineAscent,\n        height: line.box.height,\n        width: xAdvance - overflowRight,\n      };\n\n      renderBackground(ctx, backgroundRect, run.attributes.backgroundColor);\n    }\n    renderRun(ctx, run);\n  }\n\n  ctx.restore();\n  ctx.save();\n  ctx.translate(line.box.x, line.box.y);\n\n  if (line.decorationLines) {\n    for (let i = 0; i < line.decorationLines.length; i += 1) {\n      const decorationLine = line.decorationLines[i];\n      renderDecorationLine(ctx, decorationLine);\n    }\n  }\n\n  ctx.restore();\n};\n\nconst renderBlock = (ctx: Context, block: Paragraph) => {\n  block.forEach((line) => {\n    renderLine(ctx, line);\n  });\n};\n\nconst renderText = (ctx: Context, node: SafeTextNode) => {\n  if (!node.box) return;\n  if (!node.lines) return;\n\n  const { top, left } = node.box;\n  const blocks = [node.lines];\n  const paddingTop = node.box?.paddingTop || 0;\n  const paddingLeft = node.box?.paddingLeft || 0;\n  const initialY = node.lines[0] ? node.lines[0].box!.y : 0;\n  const offsetX = node.alignOffset || 0;\n\n  ctx.save();\n  ctx.translate(left + paddingLeft - offsetX, top + paddingTop - initialY);\n\n  blocks.forEach((block) => {\n    renderBlock(ctx, block);\n  });\n\n  ctx.restore();\n};\n\nexport default renderText;\n"
  },
  {
    "path": "packages/render/src/primitives/renderTextInput.ts",
    "content": "import { SafeTextInputNode } from '@react-pdf/layout';\n\nimport { Context, RenderOptions } from '../types';\nimport { parseTextInputOptions } from '../utils/parseFormOptions';\n\nconst renderTextInput = (\n  ctx: Context,\n  node: SafeTextInputNode,\n  options: RenderOptions,\n) => {\n  if (!node.box) return;\n\n  const { top, left, width, height } = node.box;\n\n  // Element's name\n  const name = node.props?.name || '';\n  const fieldSetOptions = options.fieldSets?.at(0);\n\n  if (!ctx._root.data.AcroForm) {\n    ctx.initForm();\n  }\n\n  ctx.formText(\n    name,\n    left,\n    top,\n    width,\n    height,\n    parseTextInputOptions(node, fieldSetOptions),\n  );\n};\n\nexport default renderTextInput;\n"
  },
  {
    "path": "packages/render/src/svg/getBoundingBox.ts",
    "content": "import * as P from '@react-pdf/primitives';\nimport absPath from 'abs-svg-path';\nimport parsePath from 'parse-svg-path';\nimport normalizePath from 'normalize-svg-path';\n\nimport parsePoints from './parsePoints';\nimport {\n  SafeCircleNode,\n  SafeEllipseNode,\n  SafeLineNode,\n  SafeNode,\n  SafePathNode,\n  SafePolylineNode,\n  SafeRectNode,\n} from '@react-pdf/layout';\n\ntype Primitives = (typeof P)[keyof typeof P];\n\n// From https://github.com/dy/svg-path-bounds/blob/master/index.js\nconst getPathBoundingBox = (node: SafePathNode) => {\n  const path = normalizePath(absPath(parsePath(node.props?.d || '')));\n\n  if (!path.length) return [0, 0, 0, 0];\n\n  const bounds = [Infinity, Infinity, -Infinity, -Infinity];\n\n  for (let i = 0, l = path.length; i < l; i += 1) {\n    const points = path[i].slice(1);\n\n    for (let j = 0; j < points.length; j += 2) {\n      if (points[j + 0] < bounds[0]) bounds[0] = points[j + 0];\n      if (points[j + 1] < bounds[1]) bounds[1] = points[j + 1];\n      if (points[j + 0] > bounds[2]) bounds[2] = points[j + 0];\n      if (points[j + 1] > bounds[3]) bounds[3] = points[j + 1];\n    }\n  }\n\n  return bounds;\n};\n\nconst getCircleBoundingBox = (node: SafeCircleNode) => {\n  const r = node.props?.r || 0;\n  const cx = node.props?.cx || 0;\n  const cy = node.props?.cy || 0;\n\n  return [cx - r, cy - r, cx + r, cy + r];\n};\n\nconst getEllipseBoundingBox = (node: SafeEllipseNode) => {\n  const cx = node.props?.cx || 0;\n  const cy = node.props?.cy || 0;\n  const rx = node.props?.rx || 0;\n  const ry = node.props?.ry || 0;\n\n  return [cx - rx, cy - ry, cx + rx, cy + ry];\n};\n\nconst getLineBoundingBox = (node: SafeLineNode) => {\n  const x1 = node.props?.x1 || 0;\n  const y1 = node.props?.y1 || 0;\n  const x2 = node.props?.x2 || 0;\n  const y2 = node.props?.y2 || 0;\n\n  return [\n    Math.min(x1, x2),\n    Math.min(y1, y2),\n    Math.max(x1, x2),\n    Math.max(y1, y2),\n  ];\n};\n\nconst getRectBoundingBox = (node: SafeRectNode) => {\n  const x = node.props?.x || 0;\n  const y = node.props?.y || 0;\n  const width = node.props?.width || 0;\n  const height = node.props?.height || 0;\n\n  return [x, y, x + width, y + height];\n};\n\nconst max = (values: number[]) => Math.max(-Infinity, ...values);\nconst min = (values: number[]) => Math.min(Infinity, ...values);\n\nconst getPolylineBoundingBox = (node: SafePolylineNode) => {\n  const points = parsePoints(node.props?.points);\n\n  const xValues = points.map((p) => p[0]);\n  const yValues = points.map((p) => p[1]);\n\n  return [min(xValues), min(yValues), max(xValues), max(yValues)];\n};\n\nconst boundingBoxFns: Partial<Record<Primitives, any>> = {\n  [P.Rect]: getRectBoundingBox,\n  [P.Line]: getLineBoundingBox,\n  [P.Path]: getPathBoundingBox,\n  [P.Circle]: getCircleBoundingBox,\n  [P.Ellipse]: getEllipseBoundingBox,\n  [P.Polygon]: getPolylineBoundingBox,\n  [P.Polyline]: getPolylineBoundingBox,\n};\n\nconst getBoundingBox = (node: SafeNode): number[] => {\n  const boundingBoxFn = boundingBoxFns[node.type];\n  return boundingBoxFn ? boundingBoxFn(node) : [0, 0, 0, 0];\n};\n\nexport default getBoundingBox;\n"
  },
  {
    "path": "packages/render/src/svg/parsePoints.ts",
    "content": "const pairs = <T>(values: T[]): T[][] => {\n  const result = [];\n\n  for (let i = 0; i < values.length; i += 2) {\n    result.push([values[i], values[i + 1]]);\n  }\n\n  return result;\n};\n\n/**\n * Parse svg-like points into number arrays\n *\n * @param points string ex. \"20,30 50,60\"\n * @returns points array ex. [[20, 30], [50, 60]]\n */\nconst parsePoints = (points: string | null) => {\n  let values = (points || '')\n    .trim()\n    .replace(/,/g, ' ')\n    .replace(/(\\d)-(\\d)/g, '$1 -$2')\n    .split(/\\s+/);\n\n  if (values.length % 2 !== 0) {\n    values = values.slice(0, -1);\n  }\n\n  const mappedValues = values.map(parseFloat);\n\n  return pairs(mappedValues);\n};\n\nexport default parsePoints;\n"
  },
  {
    "path": "packages/render/src/types.ts",
    "content": "import { Font } from '@react-pdf/textkit';\nimport PDFKitDocument from 'pdfkit';\nimport PDFKitReference from 'pdfkit/js/reference';\n\ntype PDFFontSource = string | Buffer | Uint8Array | ArrayBuffer | Font;\n\nexport type Context = typeof PDFKitDocument & {\n  _root: any;\n  _font: any;\n  _imageRegistry: any;\n  _acroform: any;\n  _fontSize: number;\n\n  openImage: any;\n  addNamedDestination: any;\n  addPage(options?: any): Context;\n  translate(x: number, y: number, options: any): Context;\n  font(src: PDFFontSource, size?: number): Context;\n  font(src: PDFFontSource, family: string, size?: number): Context;\n};\n\nexport interface RenderOptions {\n  imageCache: Map<string | undefined, any>;\n  fieldSets: (typeof PDFKitReference)[];\n}\n"
  },
  {
    "path": "packages/render/src/utils/parseColor.ts",
    "content": "import colorString from 'color-string';\n\nconst black = { value: '#000', opacity: 1 };\n\n// TODO: parse to number[] in layout to avoid this step\nconst parseColor = (hex?: string) => {\n  if (!hex) return black;\n\n  const parsed = colorString.get(hex);\n\n  if (!parsed) return black;\n\n  const value = colorString.to.hex(parsed.value.slice(0, 3));\n  const opacity = parsed.value[3];\n\n  return { value, opacity };\n};\n\nexport default parseColor;\n"
  },
  {
    "path": "packages/render/src/utils/parseFormOptions.ts",
    "content": "import {\n  SafeCheckboxNode,\n  SafeListNode,\n  SafeSelectNode,\n  SafeTextInputNode,\n} from '@react-pdf/layout';\nimport { Context } from '../types';\n\nconst clean = (options: Record<string, any>) => {\n  const opt = { ...options };\n\n  // We need to ensure the elements are no present if not true\n  Object.entries(opt).forEach((pair) => {\n    if (!pair[1]) {\n      delete opt[pair[0]];\n    }\n  });\n\n  return opt;\n};\n\nconst parseCommonFormOptions = (node: any) => {\n  // Common Options\n  return {\n    required: node.props?.required || false,\n    noExport: node.props?.noExport || false,\n    readOnly: node.props?.readOnly || false,\n    value: node.props?.value || undefined,\n    defaultValue: node.props?.defaultValue || undefined,\n  };\n};\n\nconst parseTextInputOptions = (node: SafeTextInputNode, fieldSet: any) => {\n  return clean({\n    ...parseCommonFormOptions(node),\n    parent: fieldSet || undefined,\n    align: node.props?.align || 'left',\n    multiline: node.props?.multiline || undefined,\n    password: node.props?.password || false,\n    noSpell: node.props?.noSpell || false,\n    format: node.props?.format || undefined,\n    fontSize: node.props?.fontSize || undefined,\n    MaxLen: node.props?.maxLength || undefined,\n  });\n};\n\nconst parseSelectAndListFieldOptions = (\n  node: SafeListNode | SafeSelectNode,\n) => {\n  return clean({\n    ...parseCommonFormOptions(node),\n    sort: node.props?.sort || false,\n    edit: node.props?.edit || false,\n    multiSelect: node.props?.multiSelect || false,\n    noSpell: node.props?.noSpell || false,\n    select: node.props?.select || [''],\n  });\n};\n\nconst getAppearance = (\n  ctx: Context,\n  codepoint: '8' | '4' | ' ',\n  width: number,\n  height: number,\n) => {\n  const appearance = ctx.ref({\n    Type: 'XObject',\n    Subtype: 'Form',\n    BBox: [0, 0, width, height],\n    Resources: {\n      ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'],\n      Font: {\n        ZaDi: ctx._acroform.fonts.ZaDi,\n      },\n    },\n  });\n\n  appearance.initDeflate();\n\n  appearance.write(\n    `/Tx BMC\\nq\\n/ZaDi ${height * 0.8} Tf\\nBT\\n${width * 0.45} ${\n      height / 4\n    } Td (${codepoint}) Tj\\nET\\nQ\\nEMC`,\n  );\n\n  appearance.end(null);\n\n  return appearance;\n};\n\nconst parseCheckboxOptions = (\n  ctx: Context,\n  node: SafeCheckboxNode,\n  fieldSet: any,\n) => {\n  const { width, height } = node.box || {};\n\n  const onOption = node.props?.onState || 'Yes';\n  const offOption = node.props?.offState || 'Off';\n  const xMark = node.props?.xMark || false;\n\n  if (!Object.prototype.hasOwnProperty.call(ctx._acroform.fonts, 'ZaDi')) {\n    const ref = ctx.ref({\n      Type: 'Font',\n      Subtype: 'Type1',\n      BaseFont: 'ZapfDingbats',\n    });\n    ctx._acroform.fonts.ZaDi = ref;\n\n    ref.end(null);\n  }\n\n  const normalAppearance = {\n    [onOption]: getAppearance(ctx, xMark ? '8' : '4', width!, height!),\n    [offOption]: getAppearance(ctx, xMark ? ' ' : '8', width!, height!),\n  };\n\n  return clean({\n    ...parseCommonFormOptions(node),\n    backgroundColor: node.props?.backgroundColor || undefined,\n    borderColor: node.props?.borderColor || undefined,\n    parent: fieldSet || undefined,\n    value: `/${node.props?.checked === true ? onOption : offOption}`,\n    defaultValue: `/${node.props?.checked === true ? onOption : offOption}`,\n    AS: node.props?.checked === true ? onOption : offOption,\n    AP: { N: normalAppearance, D: normalAppearance },\n  });\n};\n\nexport {\n  parseTextInputOptions,\n  parseSelectAndListFieldOptions,\n  parseCheckboxOptions,\n};\n"
  },
  {
    "path": "packages/render/src/utils/resolveObjectFit.ts",
    "content": "import { matchPercent } from '@react-pdf/fns';\n\nconst isNumeric = (n: any): n is number => {\n  return !Number.isNaN(parseFloat(n)) && Number.isFinite(n);\n};\n\nconst applyContainObjectFit = (\n  cw: number,\n  ch: number,\n  iw: number,\n  ih: number,\n  px?: number | string,\n  py?: number | string,\n) => {\n  const cr = cw / ch;\n  const ir = iw / ih;\n\n  const pxp = matchPercent(px ?? null);\n  const pyp = matchPercent(py ?? null);\n  const pxv = pxp ? pxp.percent : 0.5;\n  const pyv = pyp ? pyp.percent : 0.5;\n\n  if (cr > ir) {\n    const height = ch;\n    const width = height * ir;\n    const yOffset = isNumeric(py) ? py : 0;\n    const xOffset = isNumeric(px) ? px : (cw - width) * pxv;\n\n    return { width, height, xOffset, yOffset };\n  }\n\n  const width = cw;\n  const height = width / ir;\n  const xOffset = isNumeric(px) ? px : 0;\n  const yOffset = isNumeric(py) ? py : (ch - height) * pyv;\n\n  return { width, height, yOffset, xOffset };\n};\n\nconst applyNoneObjectFit = (\n  cw: number,\n  ch: number,\n  iw: number,\n  ih: number,\n  px?: number | string,\n  py?: number | string,\n) => {\n  const width = iw;\n  const height = ih;\n  const pxp = matchPercent(px ?? null);\n  const pyp = matchPercent(py ?? null);\n  const pxv = pxp ? pxp.percent : 0.5;\n  const pyv = pyp ? pyp.percent : 0.5;\n  const xOffset = isNumeric(px) ? px : (cw - width) * pxv;\n  const yOffset = isNumeric(py) ? py : (ch - height) * pyv;\n\n  return { width, height, xOffset, yOffset };\n};\n\nconst applyCoverObjectFit = (\n  cw: number,\n  ch: number,\n  iw: number,\n  ih: number,\n  px?: number | string,\n  py?: number | string,\n) => {\n  const ir = iw / ih;\n  const cr = cw / ch;\n\n  const pxp = matchPercent(px ?? null);\n  const pyp = matchPercent(py ?? null);\n  const pxv = pxp ? pxp.percent : 0.5;\n  const pyv = pyp ? pyp.percent : 0.5;\n\n  if (cr > ir) {\n    const width = cw;\n    const height = width / ir;\n    const xOffset = isNumeric(px) ? px : 0;\n    const yOffset = isNumeric(py) ? py : (ch - height) * pyv;\n    return { width, height, yOffset, xOffset };\n  }\n\n  const height = ch;\n  const width = height * ir;\n  const xOffset = isNumeric(px) ? px : (cw - width) * pxv;\n  const yOffset = isNumeric(py) ? py : 0;\n  return { width, height, xOffset, yOffset };\n};\n\nconst applyScaleDownObjectFit = (\n  cw: number,\n  ch: number,\n  iw: number,\n  ih: number,\n  px?: number | string,\n  py?: number | string,\n) => {\n  const containDimension = applyContainObjectFit(cw, ch, iw, ih, px, py);\n  const noneDimension = applyNoneObjectFit(cw, ch, iw, ih, px, py);\n\n  return containDimension.width < noneDimension.width\n    ? containDimension\n    : noneDimension;\n};\n\nconst applyFillObjectFit = (\n  cw: number,\n  ch: number,\n  px?: number | string,\n  py?: number | string,\n) => {\n  return {\n    width: cw,\n    height: ch,\n    xOffset: matchPercent(px ?? null) ? 0 : (px as number) || 0,\n    yOffset: matchPercent(py ?? null) ? 0 : (py as number) || 0,\n  };\n};\n\nconst resolveObjectFit = (\n  type = 'fill',\n  cw: number,\n  ch: number,\n  iw: number,\n  ih: number,\n  px?: number | string,\n  py?: number | string,\n) => {\n  switch (type) {\n    case 'contain':\n      return applyContainObjectFit(cw, ch, iw, ih, px, py);\n    case 'cover':\n      return applyCoverObjectFit(cw, ch, iw, ih, px, py);\n    case 'none':\n      return applyNoneObjectFit(cw, ch, iw, ih, px, py);\n    case 'scale-down':\n      return applyScaleDownObjectFit(cw, ch, iw, ih, px, py);\n    default:\n      return applyFillObjectFit(cw, ch, px, py);\n  }\n};\n\nexport default resolveObjectFit;\n"
  },
  {
    "path": "packages/render/tests/ctx.ts",
    "content": "import { vi } from 'vitest';\n\nconst createCTX = () => {\n  const instance: any = {};\n\n  instance.info = {};\n  instance.end = vi.fn().mockReturnValue(instance);\n  instance.rect = vi.fn().mockReturnValue(instance);\n  instance.save = vi.fn().mockReturnValue(instance);\n  instance.fill = vi.fn().mockReturnValue(instance);\n  instance.image = vi.fn().mockReturnValue(instance);\n  instance.restore = vi.fn().mockReturnValue(instance);\n  instance.addPage = vi.fn().mockReturnValue(instance);\n  instance.fillColor = vi.fn().mockReturnValue(instance);\n  instance.fillOpacity = vi.fn().mockReturnValue(instance);\n  instance.roundedRect = vi.fn().mockReturnValue(instance);\n  instance.registerFont = vi.fn().mockReturnValue(instance);\n  instance.lineWidth = vi.fn().mockReturnValue(instance);\n  instance.moveTo = vi.fn().mockReturnValue(instance);\n  instance.quadraticCurveTo = vi.fn().mockReturnValue(instance);\n  instance.lineTo = vi.fn().mockReturnValue(instance);\n  instance.strokeColor = vi.fn().mockReturnValue(instance);\n  instance.strokeOpacity = vi.fn().mockReturnValue(instance);\n  instance.stroke = vi.fn().mockReturnValue(instance);\n  instance.dash = vi.fn().mockReturnValue(instance);\n  instance.note = vi.fn().mockReturnValue(instance);\n  instance.rotate = vi.fn().mockReturnValue(instance);\n  instance.scale = vi.fn().mockReturnValue(instance);\n  instance.translate = vi.fn().mockReturnValue(instance);\n  instance.link = vi.fn().mockReturnValue(instance);\n  instance.goTo = vi.fn().mockReturnValue(instance);\n  instance.addNamedDestination = vi.fn().mockReturnValue(instance);\n  instance.clip = vi.fn().mockReturnValue(instance);\n  instance.bezierCurveTo = vi.fn().mockReturnValue(instance);\n  instance.closePath = vi.fn().mockReturnValue(instance);\n  instance.undash = vi.fn().mockReturnValue(instance);\n  instance.moveTo = vi.fn().mockReturnValue(instance);\n  instance.path = vi.fn().mockReturnValue(instance);\n  instance.radialGradient = vi.fn().mockReturnValue(instance);\n  instance.linearGradient = vi.fn().mockReturnValue(instance);\n  instance.miterLimit = vi.fn().mockReturnValue(instance);\n  instance.fontSize = vi.fn().mockReturnValue(instance);\n  instance.lineJoin = vi.fn().mockReturnValue(instance);\n  instance.polygon = vi.fn().mockReturnValue(instance);\n  instance.circle = vi.fn().mockReturnValue(instance);\n  instance.ellipse = vi.fn().mockReturnValue(instance);\n  instance.opacity = vi.fn().mockReturnValue(instance);\n  instance.lineCap = vi.fn().mockReturnValue(instance);\n  instance.text = vi.fn().mockReturnValue(instance);\n  instance.font = vi.fn().mockReturnValue(instance);\n  instance._root = { data: { AcroForm: {} } };\n  instance.textInput = vi.fn().mockReturnValue(instance);\n  instance.formField = vi.fn().mockReturnValue(instance);\n  instance.formCombo = vi.fn().mockReturnValue(instance);\n  instance.formList = vi.fn().mockReturnValue(instance);\n  instance.formText = vi.fn().mockReturnValue(instance);\n  instance.initForm = vi.fn().mockReturnValue(instance);\n  instance.outline = {\n    children: [],\n    document: vi.fn().mockReturnValue(instance),\n    addItem: vi.fn().mockReturnValue(instance),\n    endOutline: vi.fn().mockReturnValue(instance),\n  };\n\n  return instance;\n};\n\nexport default createCTX;\n"
  },
  {
    "path": "packages/render/tests/operations/setDestination.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport * as P from '@react-pdf/primitives';\nimport { SafeNode } from '@react-pdf/layout';\n\nimport createCTX from '../ctx';\nimport setDestination from '../../src/operations/setDestination';\n\ndescribe('operations setDestination', () => {\n  test('should call addNamedDestination method to passed context if id present', () => {\n    const ctx = createCTX();\n    const box = { top: 20 };\n    const props = { id: 'test' };\n    const doc = { type: P.View, style: {}, props, box } as SafeNode;\n\n    setDestination(ctx, doc);\n\n    expect(ctx.addNamedDestination.mock.calls).toHaveLength(1);\n    expect(ctx.addNamedDestination.mock.calls[0][0]).toBe('test');\n    expect(ctx.addNamedDestination.mock.calls[0][3]).toBe(20);\n  });\n\n  test('should not call addNamedDestination method to passed context if id missed', () => {\n    const ctx = createCTX();\n    const doc = { type: P.View, style: {}, props: {} } as SafeNode;\n\n    setDestination(ctx, doc);\n\n    expect(ctx.addNamedDestination.mock.calls).toHaveLength(0);\n  });\n});\n"
  },
  {
    "path": "packages/render/tests/primitives/renderBackground.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport * as P from '@react-pdf/primitives';\nimport { Box, SafeNode } from '@react-pdf/layout';\n\nimport createCTX from '../ctx';\nimport renderBackground from '../../src/primitives/renderBackground';\n\ndescribe('primitive renderBackground', () => {\n  test('should not render if node has no background', () => {\n    const ctx = createCTX();\n    const node: SafeNode = { type: P.View, props: {}, style: {} };\n\n    renderBackground(ctx, node);\n\n    expect(ctx.fill.mock.calls).toHaveLength(0);\n  });\n\n  test('should not render if has background but no dimensions', () => {\n    const ctx = createCTX();\n    const node: SafeNode = {\n      type: P.View,\n      props: {},\n      style: { backgroundColor: 'red' },\n    };\n\n    renderBackground(ctx, node);\n\n    expect(ctx.fill.mock.calls).toHaveLength(0);\n  });\n\n  test('should render background correctly', () => {\n    const ctx = createCTX();\n    const box = { top: 20, left: 40, width: 140, height: 200 } as Box;\n    const style = { backgroundColor: 'red' };\n    const node: SafeNode = { type: P.View, style, props: {}, box };\n\n    renderBackground(ctx, node);\n\n    expect(ctx.fillColor.mock.calls).toEqual([['#FF0000']]);\n    expect(ctx.rect.mock.calls).toEqual([[40, 20, 140, 200]]);\n    expect(ctx.fill.mock.calls).toEqual([[]]);\n  });\n\n  test('should be scoped operation', () => {\n    const ctx = createCTX();\n    const box = { top: 20, left: 40, width: 140, height: 200 } as Box;\n    const style = { backgroundColor: 'red' };\n    const node: SafeNode = { type: P.View, style, box, props: {} };\n\n    renderBackground(ctx, node);\n\n    expect(ctx.save.mock.calls).toHaveLength(1);\n    expect(ctx.restore.mock.calls).toHaveLength(1);\n  });\n\n  test('should render with opacity 1 by default', () => {\n    const ctx = createCTX();\n    const box = { top: 20, left: 40, width: 140, height: 200 } as Box;\n    const style = { backgroundColor: 'red' };\n    const node: SafeNode = { type: P.View, style, box, props: {} };\n\n    renderBackground(ctx, node);\n\n    expect(ctx.fillOpacity.mock.calls).toEqual([[1]]);\n  });\n\n  test('should render background opacity', () => {\n    const ctx = createCTX();\n    const box = { top: 20, left: 40, width: 140, height: 200 } as Box;\n    const style = { backgroundColor: 'red', opacity: 0.8 };\n    const node: SafeNode = { type: P.View, style, box, props: {} };\n\n    renderBackground(ctx, node);\n\n    expect(ctx.fillOpacity.mock.calls).toEqual([[0.8]]);\n  });\n\n  test('should render background opacity 0', () => {\n    const ctx = createCTX();\n    const box = { top: 20, left: 40, width: 140, height: 200 } as Box;\n    const style = { backgroundColor: 'red', opacity: 0 };\n    const node: SafeNode = { type: P.View, style, box, props: {} };\n\n    renderBackground(ctx, node);\n\n    expect(ctx.fillOpacity.mock.calls).toEqual([[0]]);\n  });\n\n  test('should render background color opacity 0', () => {\n    const ctx = createCTX();\n    const box = { top: 20, left: 40, width: 140, height: 200 } as Box;\n    const style = { backgroundColor: 'rgba(0, 0, 0, 0)', opacity: 1 };\n    const node: SafeNode = { type: P.View, style, box, props: {} };\n\n    renderBackground(ctx, node);\n\n    expect(ctx.fillOpacity.mock.calls).toEqual([[0]]);\n  });\n});\n"
  },
  {
    "path": "packages/render/tests/primitives/renderCanvas.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport * as P from '@react-pdf/primitives';\n\nimport createCTX from '../ctx';\nimport renderCanvas from '../../src/primitives/renderCanvas';\nimport { Box, SafeCanvasNode } from '@react-pdf/layout';\n\ndescribe('primitive renderCanvas', () => {\n  test('should be scoped operation', () => {\n    const ctx = createCTX();\n    const box = { top: 20, left: 40, width: 140, height: 200 };\n    const node = { type: P.Canvas, box, props: {} } as SafeCanvasNode;\n\n    renderCanvas(ctx, node);\n\n    expect(ctx.save.mock.calls).toHaveLength(1);\n    expect(ctx.restore.mock.calls).toHaveLength(1);\n  });\n\n  test('should call paint method with ctx', () => {\n    const ctx = createCTX();\n    const box = { top: 20, left: 40, width: 140, height: 200 } as Box;\n    const paint = (p) => expect(p).toBeTruthy();\n    const node: SafeCanvasNode = {\n      type: P.Canvas,\n      box,\n      props: { paint },\n    } as SafeCanvasNode;\n\n    renderCanvas(ctx, node);\n  });\n\n  test('should remove dangerous methods from passed ctx', () => {\n    const ctx = createCTX();\n    const box = { top: 20, left: 40, width: 140, height: 200 };\n    const paint = (p) => expect(p.registerFont).toBeFalsy();\n    const node = { type: P.Canvas, box, props: { paint } } as SafeCanvasNode;\n\n    renderCanvas(ctx, node);\n  });\n\n  test('should get correct available width and height', () => {\n    const ctx = createCTX();\n    const box = { top: 20, left: 40, width: 140, height: 200 };\n    const paint = (_, width, height) => {\n      expect(width).toBe(140);\n      expect(height).toBe(200);\n    };\n    const node = { type: P.Canvas, box, props: { paint } } as SafeCanvasNode;\n\n    renderCanvas(ctx, node);\n  });\n\n  test('should get correct available width and height with paddings', () => {\n    const ctx = createCTX();\n    const box = {\n      top: 20,\n      left: 40,\n      width: 140,\n      height: 200,\n      paddingTop: 10,\n      paddingLeft: 20,\n      paddingBottom: 30,\n      paddingRight: 40,\n    };\n    const paint = (_, width, height) => {\n      expect(width).toBe(80);\n      expect(height).toBe(160);\n    };\n    const node = { type: P.Canvas, box, props: { paint } } as SafeCanvasNode;\n\n    renderCanvas(ctx, node);\n  });\n});\n"
  },
  {
    "path": "packages/render/tests/primitives/renderCircle.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport * as P from '@react-pdf/primitives';\n\nimport createCTX from '../ctx';\nimport renderCircle from '../../src/primitives/renderCircle';\nimport { SafeCircleNode } from '@react-pdf/layout';\n\nconst round = (num: number) => Math.round(num * 100) / 100;\n\ndescribe('primitive renderCircle', () => {\n  test('should render circle correctly', () => {\n    const ctx = createCTX();\n    const props = { cx: 50, cy: 80, r: 20 };\n    const node: SafeCircleNode = { type: P.Circle, props, style: {} };\n\n    renderCircle(ctx, node);\n\n    const bezierCalls = ctx.bezierCurveTo.mock.calls.map((c) => c.map(round));\n\n    expect(bezierCalls).toHaveLength(4);\n    expect(ctx.moveTo.mock.calls).toEqual([[30, 80]]);\n    expect(bezierCalls[0]).toEqual([30, 68.95, 38.95, 60, 50, 60]);\n    expect(bezierCalls[1]).toEqual([61.05, 60, 70, 68.95, 70, 80]);\n    expect(bezierCalls[2]).toEqual([70, 91.05, 61.05, 100, 50, 100]);\n    expect(bezierCalls[3]).toEqual([38.95, 100, 30, 91.05, 30, 80]);\n    expect(ctx.closePath.mock.calls).toHaveLength(1);\n  });\n});\n"
  },
  {
    "path": "packages/render/tests/primitives/renderEllipse.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport * as P from '@react-pdf/primitives';\n\nimport createCTX from '../ctx';\nimport renderEllipse from '../../src/primitives/renderEllipse';\nimport { SafeEllipseNode } from '@react-pdf/layout';\n\nconst round = (num) => Math.round(num * 100) / 100;\n\ndescribe('primitive renderEllipse', () => {\n  test('should render ellipse correctly', () => {\n    const ctx = createCTX();\n    const props = { cx: 50, cy: 80, rx: 20, ry: 10 };\n    const node: SafeEllipseNode = { type: P.Ellipse, props, style: {} };\n\n    renderEllipse(ctx, node);\n\n    const bezierCalls = ctx.bezierCurveTo.mock.calls.map((c) => c.map(round));\n\n    expect(bezierCalls).toHaveLength(4);\n    expect(ctx.moveTo.mock.calls).toEqual([[30, 80]]);\n    expect(bezierCalls[0]).toEqual([30, 74.48, 38.95, 70, 50, 70]);\n    expect(bezierCalls[1]).toEqual([61.05, 70, 70, 74.48, 70, 80]);\n    expect(bezierCalls[2]).toEqual([70, 85.52, 61.05, 90, 50, 90]);\n    expect(bezierCalls[3]).toEqual([38.95, 90, 30, 85.52, 30, 80]);\n    expect(ctx.closePath.mock.calls).toHaveLength(1);\n  });\n});\n"
  },
  {
    "path": "packages/render/tests/primitives/renderForm.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport * as P from '@react-pdf/primitives';\n\nimport createCTX from '../ctx';\nimport renderFieldSet from '../../src/primitives/renderFieldSet';\nimport { SafeFieldSetNode } from '@react-pdf/layout';\n\ndescribe('primitive renderFieldSet', () => {\n  test('should render FieldSet correctly', () => {\n    const ctx = createCTX();\n    const args = 'example';\n    const props = { name: args };\n    const node: SafeFieldSetNode = { type: P.FieldSet, props, style: {} };\n\n    renderFieldSet(ctx, node, { fieldSets: [] });\n\n    expect(ctx.formField.mock.calls).toHaveLength(1);\n    expect(ctx.formField.mock.calls[0]).toHaveLength(1);\n    expect(ctx.formField.mock.calls[0][0]).toBe(args);\n  });\n\n  test.todo('FieldSet with one textInput direct child', () => {\n    const ctx = createCTX();\n    const node: SafeFieldSetNode = {\n      type: P.FieldSet,\n      style: {},\n      props: { name: 'example' },\n      children: [{ type: P.TextInput, style: {}, props: {} }],\n    };\n\n    renderFieldSet(ctx, node, { fieldSets: [] });\n\n    expect(ctx.textInput.mock.calls).toHaveLength(1);\n  });\n});\n"
  },
  {
    "path": "packages/render/tests/svg/getBoundingBox.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport getBoundingBox from '../../src/svg/getBoundingBox';\n\ndescribe('path getBoundingBox', () => {\n  test('should return empty path bounding box', () => {\n    const bbox = getBoundingBox({\n      type: 'PATH',\n      props: { d: '' },\n      style: {},\n    });\n\n    expect(bbox).toEqual([0, 0, 0, 0]);\n  });\n\n  test('should return path bounding box', () => {\n    const bbox = getBoundingBox({\n      type: 'PATH',\n      style: {},\n      props: {\n        d: 'M150 0 L75 200 L225 200 Z',\n      },\n    });\n\n    expect(bbox).toEqual([75, 0, 225, 200]);\n  });\n\n  test('should return ellipse bounding box', () => {\n    const bbox = getBoundingBox({\n      type: 'ELLIPSE',\n      style: {},\n      props: {\n        cx: 200,\n        cy: 80,\n        rx: 100,\n        ry: 50,\n      },\n    });\n\n    expect(bbox).toEqual([100, 30, 300, 130]);\n  });\n\n  test('should return circle bounding box', () => {\n    const bbox = getBoundingBox({\n      type: 'CIRCLE',\n      style: {},\n      props: { cx: 50, cy: 50, r: 40 },\n    });\n\n    expect(bbox).toEqual([10, 10, 90, 90]);\n  });\n\n  test('should return line bounding box', () => {\n    const bbox = getBoundingBox({\n      type: 'LINE',\n      style: {},\n      props: { x1: 10, y1: 15, x2: 200, y2: 180 },\n    });\n\n    expect(bbox).toEqual([10, 15, 200, 180]);\n  });\n\n  test('should return inverted line bounding box', () => {\n    const bbox = getBoundingBox({\n      type: 'LINE',\n      style: {},\n      props: { x1: 200, y1: 180, x2: 10, y2: 15 },\n    });\n\n    expect(bbox).toEqual([10, 15, 200, 180]);\n  });\n\n  test('should return rect bounding box', () => {\n    const bbox = getBoundingBox({\n      type: 'RECT',\n      style: {},\n      props: { x: 50, y: 20, width: 150, height: 150 },\n    });\n\n    expect(bbox).toEqual([50, 20, 200, 170]);\n  });\n\n  test('should return polygon bounding box', () => {\n    const bbox = getBoundingBox({\n      type: 'POLYGON',\n      style: {},\n      props: { points: '200,10 250,190 160,210' },\n    });\n\n    expect(bbox).toEqual([160, 10, 250, 210]);\n  });\n\n  test('should return polyline bounding box', () => {\n    const bbox = getBoundingBox({\n      type: 'POLYGON',\n      style: {},\n      props: { points: '20,20 40,25 60,40 80,120 120,140 200,180' },\n    });\n\n    expect(bbox).toEqual([20, 20, 200, 180]);\n  });\n});\n"
  },
  {
    "path": "packages/render/tests/svg/parsePoints.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport parsePoints from '../../src/svg/parsePoints';\n\ndescribe('svg parsePoints', () => {\n  test('should return empty array for null argument', () => {\n    const points = parsePoints(null);\n    expect(points).toHaveLength(0);\n  });\n\n  test('should return empty array for empty string', () => {\n    const points = parsePoints('');\n    expect(points).toHaveLength(0);\n  });\n\n  test('should correctly parse svg points', () => {\n    const points = parsePoints('20,20 40,25 60,40 80,120 120,140 200,180');\n\n    expect(points[0]).toEqual([20, 20]);\n    expect(points[1]).toEqual([40, 25]);\n    expect(points[2]).toEqual([60, 40]);\n    expect(points[3]).toEqual([80, 120]);\n    expect(points[4]).toEqual([120, 140]);\n    expect(points[5]).toEqual([200, 180]);\n  });\n\n  test('should trim leading spaces', () => {\n    const points = parsePoints('   20,20');\n\n    expect(points[0]).toEqual([20, 20]);\n  });\n\n  test('should trim trailing spaces', () => {\n    const points = parsePoints('20,20   ');\n\n    expect(points[0]).toEqual([20, 20]);\n  });\n\n  test('should parse float values', () => {\n    const points = parsePoints('20.5,20.5');\n\n    expect(points[0]).toEqual([20.5, 20.5]);\n  });\n});\n"
  },
  {
    "path": "packages/render/tests/utils/objectFit.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolveObjectFit from '../../src/utils/resolveObjectFit';\n\ndescribe('object-fit', () => {\n  test('should fill to content box for portrait images', () => {\n    const result = resolveObjectFit('fill', 200, 200, 40, 80);\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should fill to content box for landscape images', () => {\n    const result = resolveObjectFit('fill', 200, 200, 80, 40);\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should contain inside content box for portrait images', () => {\n    const result = resolveObjectFit('contain', 200, 200, 40, 80);\n\n    expect(result.width).toBe(100);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(50);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should contain inside content box for landscape images', () => {\n    const result = resolveObjectFit('contain', 200, 200, 80, 40);\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(100);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(50);\n  });\n\n  test('should cover inside content box for portrait images', () => {\n    const result = resolveObjectFit('cover', 200, 200, 40, 80);\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(400);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(-100);\n  });\n\n  test('should cover inside content box for landscape images', () => {\n    const result = resolveObjectFit('cover', 200, 200, 80, 40);\n\n    expect(result.width).toBe(400);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(-100);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should not fit inside content box for smaller portrait images', () => {\n    const result = resolveObjectFit('none', 200, 200, 40, 80);\n\n    expect(result.width).toBe(40);\n    expect(result.height).toBe(80);\n    expect(result.xOffset).toBe(80);\n    expect(result.yOffset).toBe(60);\n  });\n\n  test('should not fit inside content box for bigger portrait images', () => {\n    const result = resolveObjectFit('none', 200, 200, 400, 800);\n\n    expect(result.width).toBe(400);\n    expect(result.height).toBe(800);\n    expect(result.xOffset).toBe(-100);\n    expect(result.yOffset).toBe(-300);\n  });\n\n  test('should not fit inside content box for smaller landscape images', () => {\n    const result = resolveObjectFit('none', 200, 200, 80, 40);\n\n    expect(result.width).toBe(80);\n    expect(result.height).toBe(40);\n    expect(result.xOffset).toBe(60);\n    expect(result.yOffset).toBe(80);\n  });\n\n  test('should not fit inside content box for bigger landscape images', () => {\n    const result = resolveObjectFit('none', 200, 200, 800, 400);\n\n    expect(result.width).toBe(800);\n    expect(result.height).toBe(400);\n    expect(result.xOffset).toBe(-300);\n    expect(result.yOffset).toBe(-100);\n  });\n\n  test('should scale-down inside content box for smaller portrait images', () => {\n    const result = resolveObjectFit('scale-down', 200, 200, 40, 80);\n\n    expect(result.width).toBe(40);\n    expect(result.height).toBe(80);\n    expect(result.xOffset).toBe(80);\n    expect(result.yOffset).toBe(60);\n  });\n\n  test('should scale-down inside content box for bigger portrait images', () => {\n    const result = resolveObjectFit('scale-down', 200, 200, 400, 800);\n\n    expect(result.width).toBe(100);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(50);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should scale-down inside content box for smaller landscape images', () => {\n    const result = resolveObjectFit('scale-down', 200, 200, 80, 40);\n\n    expect(result.width).toBe(80);\n    expect(result.height).toBe(40);\n    expect(result.xOffset).toBe(60);\n    expect(result.yOffset).toBe(80);\n  });\n\n  test('should scale-down inside content box for bigger landscape images', () => {\n    const result = resolveObjectFit('scale-down', 200, 200, 800, 400);\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(100);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(50);\n  });\n\n  test('should fill to content box for portrait images with fixed positions', () => {\n    const result = resolveObjectFit('fill', 200, 200, 40, 80, 20, 40);\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(20);\n    expect(result.yOffset).toBe(40);\n  });\n\n  test('should fill to content box for landscape images with fixed positions', () => {\n    const result = resolveObjectFit('fill', 200, 200, 80, 40, 20, 40);\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(20);\n    expect(result.yOffset).toBe(40);\n  });\n\n  test('should contain inside content box for portrait images with fixed positions', () => {\n    const result = resolveObjectFit('contain', 200, 200, 40, 80, 20, 40);\n\n    expect(result.width).toBe(100);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(20);\n    expect(result.yOffset).toBe(40);\n  });\n\n  test('should contain inside content box for landscape images with fixed positions', () => {\n    const result = resolveObjectFit('contain', 200, 200, 80, 40, 20, 40);\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(100);\n    expect(result.xOffset).toBe(20);\n    expect(result.yOffset).toBe(40);\n  });\n\n  test('should contain inside content box for portrait images with zero fixed positions', () => {\n    const result = resolveObjectFit('contain', 200, 200, 40, 80, 0, 0);\n\n    expect(result.width).toBe(100);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should contain inside content box for landscape images with zero fixed positions', () => {\n    const result = resolveObjectFit('contain', 200, 200, 80, 40, 0, 0);\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(100);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should cover inside content box for portrait images with fixed positions', () => {\n    const result = resolveObjectFit('cover', 200, 200, 40, 80, 20, 40);\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(400);\n    expect(result.xOffset).toBe(20);\n    expect(result.yOffset).toBe(40);\n  });\n\n  test('should cover inside content box for landscape images with fixed positions', () => {\n    const result = resolveObjectFit('cover', 200, 200, 80, 40, 20, 40);\n\n    expect(result.width).toBe(400);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(20);\n    expect(result.yOffset).toBe(40);\n  });\n\n  test('should cover inside content box for portrait images with zero fixed positions', () => {\n    const result = resolveObjectFit('cover', 200, 200, 40, 80, 0, 0);\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(400);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should cover inside content box for landscape images with zero fixed positions', () => {\n    const result = resolveObjectFit('cover', 200, 200, 80, 40, 0, 0);\n\n    expect(result.width).toBe(400);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should not fit inside content box for smaller portrait images with fixed positions', () => {\n    const result = resolveObjectFit('none', 200, 200, 40, 80, 20, 40);\n\n    expect(result.width).toBe(40);\n    expect(result.height).toBe(80);\n    expect(result.xOffset).toBe(20);\n    expect(result.yOffset).toBe(40);\n  });\n\n  test('should not fit inside content box for bigger portrait images with fixed positions', () => {\n    const result = resolveObjectFit('none', 200, 200, 400, 800, 20, 40);\n\n    expect(result.width).toBe(400);\n    expect(result.height).toBe(800);\n    expect(result.xOffset).toBe(20);\n    expect(result.yOffset).toBe(40);\n  });\n\n  test('should not fit inside content box for portrait images with zero fixed positions', () => {\n    const result = resolveObjectFit('none', 200, 200, 40, 80, 0, 0);\n\n    expect(result.width).toBe(40);\n    expect(result.height).toBe(80);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should not fit inside content box for landscape images with zero fixed positions', () => {\n    const result = resolveObjectFit('none', 200, 200, 800, 400, 0, 0);\n\n    expect(result.width).toBe(800);\n    expect(result.height).toBe(400);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should fill to content box for portrait images with percentage positions', () => {\n    const result = resolveObjectFit('fill', 200, 200, 40, 80, '20%', '40%');\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should fill to content box for landscape images with percentage positions', () => {\n    const result = resolveObjectFit('fill', 200, 200, 80, 40, '20%', '40%');\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should contain inside content box for portrait images with percentage positions', () => {\n    const result = resolveObjectFit('contain', 200, 200, 40, 80, '20%', '40%');\n\n    expect(result.width).toBe(100);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(20);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should contain inside content box for landscape images with percentage positions', () => {\n    const result = resolveObjectFit('contain', 200, 200, 80, 40, '20%', '40%');\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(100);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(40);\n  });\n\n  test('should contain inside content box for portrait images with zero percentage positions', () => {\n    const result = resolveObjectFit('contain', 200, 200, 40, 80, '0%', '0%');\n\n    expect(result.width).toBe(100);\n    expect(result.height).toBe(200);\n    expect(Math.abs(result.xOffset)).toBe(0);\n    expect(Math.abs(result.yOffset)).toBe(0);\n  });\n\n  test('should contain inside content box for landscape images with zero percentage positions', () => {\n    const result = resolveObjectFit('contain', 200, 200, 80, 40, '0%', '0%');\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(100);\n    expect(Math.abs(result.xOffset)).toBe(0);\n    expect(Math.abs(result.yOffset)).toBe(0);\n  });\n\n  test('should cover inside content box for portrait images with percentage positions', () => {\n    const result = resolveObjectFit('cover', 200, 200, 40, 80, '20%', '40%');\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(400);\n    expect(result.xOffset).toBe(0);\n    expect(result.yOffset).toBe(-80);\n  });\n\n  test('should cover inside content box for landscape images with percentage positions', () => {\n    const result = resolveObjectFit('cover', 200, 200, 80, 40, '20%', '40%');\n\n    expect(result.width).toBe(400);\n    expect(result.height).toBe(200);\n    expect(result.xOffset).toBe(-40);\n    expect(result.yOffset).toBe(0);\n  });\n\n  test('should cover inside content box for portrait images with zero percentage positions', () => {\n    const result = resolveObjectFit('cover', 200, 200, 40, 80, '0%', '0%');\n\n    expect(result.width).toBe(200);\n    expect(result.height).toBe(400);\n    expect(Math.abs(result.xOffset)).toBe(0);\n    expect(Math.abs(result.yOffset)).toBe(0);\n  });\n\n  test('should cover inside content box for landscape images with zero percentage positions', () => {\n    const result = resolveObjectFit('cover', 200, 200, 80, 40, '0%', '0%');\n\n    expect(result.width).toBe(400);\n    expect(result.height).toBe(200);\n    expect(Math.abs(result.xOffset)).toBe(0);\n    expect(Math.abs(result.yOffset)).toBe(0);\n  });\n\n  test('should not fit inside content box for smaller portrait images with percentage positions', () => {\n    const result = resolveObjectFit('none', 200, 200, 40, 80, '20%', '40%');\n\n    expect(result.width).toBe(40);\n    expect(result.height).toBe(80);\n    expect(result.xOffset).toBe(32);\n    expect(result.yOffset).toBe(48);\n  });\n\n  test('should not fit inside content box for bigger portrait images with percentage positions', () => {\n    const result = resolveObjectFit('none', 200, 200, 400, 800, '20%', '40%');\n\n    expect(result.width).toBe(400);\n    expect(result.height).toBe(800);\n    expect(result.xOffset).toBe(-40);\n    expect(result.yOffset).toBe(-240);\n  });\n\n  test('should not fit inside content box for portrait images with zero percentage positions', () => {\n    const result = resolveObjectFit('none', 200, 200, 40, 80, '0%', '0%');\n\n    expect(result.width).toBe(40);\n    expect(result.height).toBe(80);\n    expect(Math.abs(result.xOffset)).toBe(0);\n    expect(Math.abs(result.yOffset)).toBe(0);\n  });\n\n  test('should not fit inside content box for landscape images with zero percentage positions', () => {\n    const result = resolveObjectFit('none', 200, 200, 800, 400, '0%', '0%');\n\n    expect(result.width).toBe(800);\n    expect(result.height).toBe(400);\n    expect(Math.abs(result.xOffset)).toBe(0);\n    expect(Math.abs(result.yOffset)).toBe(0);\n  });\n});\n"
  },
  {
    "path": "packages/render/tests/utils/parseColor.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport parseColor from '../../src/utils/parseColor';\n\ndescribe('parse color util', () => {\n  test(`should parse regular hex color`, () => {\n    const color = parseColor('#FF00FF');\n    expect(color.value).toBe('#FF00FF');\n  });\n\n  test(`should parse opacity as 1 if not provided`, () => {\n    const color = parseColor('#FF00FF');\n    expect(color.opacity).toBe(1);\n  });\n\n  test(`should parse opacity as 1 when provided`, () => {\n    const color = parseColor('#FF00FFFF');\n    expect(color.opacity).toBe(1);\n  });\n\n  test(`should parse opacity as 0 when provided`, () => {\n    const color = parseColor('#FF00FF00');\n    expect(color.opacity).toBe(0);\n  });\n\n  test(`should parse opacit provided`, () => {\n    const color = parseColor('#FF00FF54');\n    expect(color.opacity).toBe(0.32941176470588235);\n  });\n});\n"
  },
  {
    "path": "packages/render/tsconfig.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"compilerOptions\": {\n    \"outDir\": \"lib\",\n    \"declaration\": true,\n    \"declarationDir\": \"lib/types\",\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2022\", \"DOM\"],\n    \"moduleResolution\": \"Node\",\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"types\": [\"vitest/globals\"],\n  },\n  \"include\": [\"src\", \"globals.d.ts\"],\n}\n"
  },
  {
    "path": "packages/renderer/.gitignore",
    "content": "lib\n"
  },
  {
    "path": "packages/renderer/.size-limit.cjs",
    "content": "module.exports = [\n  {\n    path: 'lib/react-pdf.browser.js',\n    limit: '550 kB',\n\n    modifyWebpackConfig: (config) => {\n      config.resolve = {\n        fallback: {\n          fs: false,\n        },\n        alias: {\n          // TODO: ignore iconv-lite on default because it contains exotic encodings like `win1251`, that isn't used in pdf\n          'iconv-lite': false,\n        },\n      };\n      return config;\n    },\n  },\n];\n"
  },
  {
    "path": "packages/renderer/CHANGELOG.md",
    "content": "# @react-pdf/renderer\n\n## 4.3.2\n\n### Patch Changes\n\n- Updated dependencies [[`f034491b`](https://github.com/diegomura/react-pdf/commit/f034491b1f77ce6f18a5db88e70b10b9c502ca35), [`2eba70bd`](https://github.com/diegomura/react-pdf/commit/2eba70bd9cbb942a675ac686a2b335164279035a), [`fafbcb12`](https://github.com/diegomura/react-pdf/commit/fafbcb12a0ecf3231165bb2944de7ad3b7761dec), [`cc1aff24`](https://github.com/diegomura/react-pdf/commit/cc1aff2454263f64d1f79c9df051d21d74f8d7cf)]:\n  - @react-pdf/pdfkit@4.1.0\n  - @react-pdf/reconciler@2.0.0\n  - @react-pdf/layout@4.4.2\n  - @react-pdf/font@4.0.4\n  - @react-pdf/render@4.3.2\n  - @react-pdf/types@2.9.2\n\n## 4.3.1\n\n### Patch Changes\n\n- [#3124](https://github.com/diegomura/react-pdf/pull/3124) [`dcc7b403`](https://github.com/diegomura/react-pdf/commit/dcc7b40313b5662b9bd16678fbc0b62eeaf65d71) Thanks [@pcorpet](https://github.com/pcorpet)! - feat(pdfdownloadlink): add a ref to the link component\n\n- Updated dependencies [[`beaffd3d`](https://github.com/diegomura/react-pdf/commit/beaffd3d2bb5ac81033ef53421413662d6d71158), [`a99d10fb`](https://github.com/diegomura/react-pdf/commit/a99d10fb2fbb6bfeb233ccb9bf0b703ed092e8d5), [`5cbe2fb0`](https://github.com/diegomura/react-pdf/commit/5cbe2fb0bde45c44eb68dde01f20feea245908c6), [`ec063bec`](https://github.com/diegomura/react-pdf/commit/ec063bec8d6a56df42849a8e66521fad7719dc29)]:\n  - @react-pdf/layout@4.4.1\n  - @react-pdf/pdfkit@4.0.4\n  - @react-pdf/render@4.3.1\n  - @react-pdf/font@4.0.3\n  - @react-pdf/types@2.9.1\n\n## 4.3.0\n\n### Minor Changes\n\n- [#3112](https://github.com/diegomura/react-pdf/pull/3112) [`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a) Thanks [@diegomura](https://github.com/diegomura)! - feat: add xLinkHref, gradientTransform and gradientUnits support\n\n### Patch Changes\n\n- [`01b4ff5c`](https://github.com/diegomura/react-pdf/commit/01b4ff5cb00420dd37c2f28fb95822dd18cdd982) Thanks [@diegomura](https://github.com/diegomura)! - fix: debug prop\n\n- Updated dependencies [[`01b4ff5c`](https://github.com/diegomura/react-pdf/commit/01b4ff5cb00420dd37c2f28fb95822dd18cdd982), [`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a), [`106699e8`](https://github.com/diegomura/react-pdf/commit/106699e850dad2285e6999d59975111f217e8a81)]:\n  - @react-pdf/render@4.3.0\n  - @react-pdf/layout@4.4.0\n  - @react-pdf/types@2.9.0\n  - @react-pdf/pdfkit@4.0.3\n  - @react-pdf/font@4.0.2\n\n## 4.2.4\n\n### Patch Changes\n\n- Updated dependencies [[`b95a6dc4`](https://github.com/diegomura/react-pdf/commit/b95a6dc4350b0580ee8c1c8320871cc7145676f2), [`e257f7ee`](https://github.com/diegomura/react-pdf/commit/e257f7ee18ff09f4895cd16c0b21b824678384c8)]:\n  - @react-pdf/reconciler@1.1.4\n  - @react-pdf/layout@4.3.1\n  - @react-pdf/font@4.0.1\n  - @react-pdf/render@4.2.1\n  - @react-pdf/types@2.8.2\n\n## 4.2.3\n\n### Patch Changes\n\n- Updated dependencies [[`a9ef6416`](https://github.com/diegomura/react-pdf/commit/a9ef6416473c86f6d8fe35c3d7231e642d6ae265), [`7cd66e4f`](https://github.com/diegomura/react-pdf/commit/7cd66e4fc37cd1393adc6250a919fe2629812082), [`ddfa3675`](https://github.com/diegomura/react-pdf/commit/ddfa367587618b313b4b0b3b57a9a7631e8e7604), [`bfb51ec0`](https://github.com/diegomura/react-pdf/commit/bfb51ec09b851c52659ce16fed1286173e9516a9), [`a2de2685`](https://github.com/diegomura/react-pdf/commit/a2de2685b25c797f266775c2e35a6535090393b7), [`24690f52`](https://github.com/diegomura/react-pdf/commit/24690f5238e4eacf28351cf9996856a7d196d29e), [`481b536f`](https://github.com/diegomura/react-pdf/commit/481b536f4ad145fb227829399b85a35838a506f8), [`b06d3a0f`](https://github.com/diegomura/react-pdf/commit/b06d3a0f64593ac18097efd061334f1e5bd70095), [`fce45ea5`](https://github.com/diegomura/react-pdf/commit/fce45ea5860038e7f3b227cabf0dd6212f4404b8)]:\n  - @react-pdf/layout@4.3.0\n  - @react-pdf/types@2.8.1\n  - @react-pdf/font@4.0.0\n  - @react-pdf/render@4.2.0\n  - @react-pdf/fns@3.1.2\n\n## 4.2.2\n\n### Patch Changes\n\n- [#3065](https://github.com/diegomura/react-pdf/pull/3065) [`226467e3`](https://github.com/diegomura/react-pdf/commit/226467e39443d3690b8f8c3298aa8278b43fbfa6) Thanks [@diegomura](https://github.com/diegomura)! - refactor: partially unify pdfkit\n\n- Updated dependencies [[`226467e3`](https://github.com/diegomura/react-pdf/commit/226467e39443d3690b8f8c3298aa8278b43fbfa6), [`96c2464d`](https://github.com/diegomura/react-pdf/commit/96c2464dfaa7294e0d79b7ed64743bfd7b1a8c72), [`24fe4bf8`](https://github.com/diegomura/react-pdf/commit/24fe4bf894fff055121926488b30d0bf212a9c45), [`700535c5`](https://github.com/diegomura/react-pdf/commit/700535c57ff1b105d923be70f4fc4bfdf4479f91), [`442ce355`](https://github.com/diegomura/react-pdf/commit/442ce35534f916b9146a35fd03870387ed488d92), [`3007d34a`](https://github.com/diegomura/react-pdf/commit/3007d34ad3e10bf32ada3631938f5bb08e1c549f)]:\n  - @react-pdf/pdfkit@4.0.2\n  - @react-pdf/render@4.1.2\n  - @react-pdf/primitives@4.1.1\n  - @react-pdf/types@2.8.0\n  - @react-pdf/layout@4.2.3\n  - @react-pdf/fns@3.1.1\n  - @react-pdf/font@3.1.0\n\n## 4.2.1\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/layout@4.2.2\n  - @react-pdf/render@4.1.1\n\n## 4.2.0\n\n### Minor Changes\n\n- [`7cd71714`](https://github.com/diegomura/react-pdf/commit/7cd7171472b0f300db56b7805c5f966bf4ced6e2) Thanks [@diegomura](https://github.com/diegomura)! - feat: added Form Annotation support\n\n### Patch Changes\n\n- [#3014](https://github.com/diegomura/react-pdf/pull/3014) [`685890bd`](https://github.com/diegomura/react-pdf/commit/685890bd841b7d2480157117fcd3cbb1334f6324) Thanks [@islam-kamel](https://github.com/islam-kamel)! - fix: PDFDownloadLinkProps Type Error\n\n- Updated dependencies [[`7cd71714`](https://github.com/diegomura/react-pdf/commit/7cd7171472b0f300db56b7805c5f966bf4ced6e2), [`fabecc56`](https://github.com/diegomura/react-pdf/commit/fabecc56727dfb6d590a3fa1e11f50250ecbbea1), [`01944231`](https://github.com/diegomura/react-pdf/commit/01944231a342d502b832aeecb4c313020b8360c8), [`6d875056`](https://github.com/diegomura/react-pdf/commit/6d875056a07e8479ef695416c1fed575491b6ff1), [`49daae8f`](https://github.com/diegomura/react-pdf/commit/49daae8fdfba672a3e828847232ee9b70bb51711), [`5cc47319`](https://github.com/diegomura/react-pdf/commit/5cc47319bb428f6d4bcad21cd6dba9afca5cdc17), [`aa0f6725`](https://github.com/diegomura/react-pdf/commit/aa0f672589683a66abc79f838291996ae9aaffb8)]:\n  - @react-pdf/primitives@4.1.0\n  - @react-pdf/render@4.1.0\n  - @react-pdf/layout@4.2.1\n  - @react-pdf/types@2.7.1\n  - @react-pdf/pdfkit@4.0.1\n  - @react-pdf/font@3.0.2\n\n## 4.1.6\n\n### Patch Changes\n\n- Updated dependencies [[`18834efa`](https://github.com/diegomura/react-pdf/commit/18834efac2787a636c378718fee40cbe74f01ab8)]:\n  - @react-pdf/layout@4.2.0\n\n## 4.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`1916e840`](https://github.com/diegomura/react-pdf/commit/1916e8405ce2b566110f2a1d66cfd8b4c4fa34d4), [`165c70fb`](https://github.com/diegomura/react-pdf/commit/165c70fbd31a7a4520af83b218a03f2f78f486e9)]:\n  - @react-pdf/reconciler@1.1.3\n  - @react-pdf/layout@4.1.3\n  - @react-pdf/render@4.0.2\n\n## 4.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`f6e9e113`](https://github.com/diegomura/react-pdf/commit/f6e9e1136f47fe05f86158c76561729b2cc425c4)]:\n  - @react-pdf/reconciler@1.1.2\n\n## 4.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`425f1183`](https://github.com/diegomura/react-pdf/commit/425f1183bba9a83fd5712a1371abb6cea2ed8fca), [`2c3c887e`](https://github.com/diegomura/react-pdf/commit/2c3c887ea2d3aed2863f49bff375d08feaf975aa)]:\n  - @react-pdf/layout@4.1.2\n\n## 4.1.2\n\n### Patch Changes\n\n- [#2951](https://github.com/diegomura/react-pdf/pull/2951) [`aab7d958`](https://github.com/diegomura/react-pdf/commit/aab7d95870d9073e4acb004aa0cce9cfa19b7f0e) Thanks [@diegomura](https://github.com/diegomura)! - fix: note rendering\n\n- Updated dependencies [[`03322a75`](https://github.com/diegomura/react-pdf/commit/03322a756f44863543673ff597582444c180989b), [`ed562b9b`](https://github.com/diegomura/react-pdf/commit/ed562b9b7f14bc76a1cd83aaaf1dab966bd7540b), [`b5c0fe64`](https://github.com/diegomura/react-pdf/commit/b5c0fe646108a960a528290b175511842020d600)]:\n  - @react-pdf/render@4.0.1\n  - @react-pdf/font@3.0.1\n  - @react-pdf/layout@4.1.1\n\n## 4.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`82192b3a`](https://github.com/diegomura/react-pdf/commit/82192b3a53cf5db62230287e7456dc5bdeee6244)]:\n  - @react-pdf/reconciler@1.1.1\n\n## 4.1.0\n\n### Minor Changes\n\n- [`52b2f253`](https://github.com/diegomura/react-pdf/commit/52b2f25349bee0c09399bc2e7e5e89db5e1433fd) Thanks [@diegomura](https://github.com/diegomura)! - feat: add React 19 support\n\n### Patch Changes\n\n- Updated dependencies [[`52b2f253`](https://github.com/diegomura/react-pdf/commit/52b2f25349bee0c09399bc2e7e5e89db5e1433fd)]:\n  - @react-pdf/reconciler@1.1.0\n\n## 4.0.2\n\n### Patch Changes\n\n- [#2936](https://github.com/diegomura/react-pdf/pull/2936) [`7add014c`](https://github.com/diegomura/react-pdf/commit/7add014c6bc9cff649dd1a56fc47214888613b6b) Thanks [@diegomura](https://github.com/diegomura)! - feat: pre-bundle + bump react-reconciler\n\n- Updated dependencies [[`b242e59a`](https://github.com/diegomura/react-pdf/commit/b242e59a14a856e280c9fcbad81f707248819721), [`7add014c`](https://github.com/diegomura/react-pdf/commit/7add014c6bc9cff649dd1a56fc47214888613b6b)]:\n  - @react-pdf/layout@4.1.0\n  - @react-pdf/reconciler@1.0.1\n\n## 4.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`58f9a047`](https://github.com/diegomura/react-pdf/commit/58f9a04740ed1331ef1dfa9999fb43c0ee10fa5b)]:\n  - @react-pdf/layout@4.0.1\n\n## 4.0.0\n\n### Major Changes\n\n- [#2871](https://github.com/diegomura/react-pdf/pull/2871) [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119) Thanks [@diegomura](https://github.com/diegomura)! - feat!: drop cjs support\n\n### Minor Changes\n\n- [#2876](https://github.com/diegomura/react-pdf/pull/2876) [`afe4bcfe`](https://github.com/diegomura/react-pdf/commit/afe4bcfe6f4b991cf22341242fc27d169b758d47) Thanks [@diegomura](https://github.com/diegomura)! - feat: add gap percentage support\n\n### Patch Changes\n\n- Updated dependencies [[`afe4bcfe`](https://github.com/diegomura/react-pdf/commit/afe4bcfe6f4b991cf22341242fc27d169b758d47), [`42570321`](https://github.com/diegomura/react-pdf/commit/42570321af54bf331ca81f09a102664cd9f7c46a), [`fdcef566`](https://github.com/diegomura/react-pdf/commit/fdcef5666e4eeed542b625d394cdfe60d6346600), [`46c3047d`](https://github.com/diegomura/react-pdf/commit/46c3047de56ae82f062b72c4910a4e6096eee99f), [`55973278`](https://github.com/diegomura/react-pdf/commit/55973278ac8bc8f703b63844f57d6f155ae8d86f), [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119)]:\n  - @react-pdf/layout@4.0.0\n  - @react-pdf/pdfkit@4.0.0\n  - @react-pdf/types@2.7.0\n  - @react-pdf/primitives@4.0.0\n  - @react-pdf/render@4.0.0\n  - @react-pdf/font@3.0.0\n\n## 3.4.5\n\n### Patch Changes\n\n- [#2669](https://github.com/diegomura/react-pdf/pull/2669) [`ed94775`](https://github.com/diegomura/react-pdf/commit/ed94775f4d44db0886ff08c71d09f446bace6392) Thanks [@Finanzasparahippies](https://github.com/Finanzasparahippies)! - fix: download IE checks\n\n- Updated dependencies [[`e425ca4`](https://github.com/diegomura/react-pdf/commit/e425ca4add7eb353b6282a40fd1020aad0da36c4), [`e42a79a`](https://github.com/diegomura/react-pdf/commit/e42a79a3857932a4ebc89feb6e4d2c891280d633), [`5af35ec`](https://github.com/diegomura/react-pdf/commit/5af35ec9743cc0d7bf75f5ca789627517ff35816), [`53bf803`](https://github.com/diegomura/react-pdf/commit/53bf803465f4fecf13531d1a10697c3d4067cf8f), [`8e6a832`](https://github.com/diegomura/react-pdf/commit/8e6a8320f86354aff950c296a96bc41a33e9dab2), [`4bafab8`](https://github.com/diegomura/react-pdf/commit/4bafab8455c9003759f48bad20a720baf4ed189b)]:\n  - @react-pdf/layout@3.13.0\n  - @react-pdf/render@3.5.0\n  - @react-pdf/pdfkit@3.2.0\n  - @react-pdf/types@2.6.0\n  - @react-pdf/font@2.5.2\n\n## 3.4.4\n\n### Patch Changes\n\n- Updated dependencies [[`22a34a9`](https://github.com/diegomura/react-pdf/commit/22a34a91b16a201cd8288e0dbea9368b12ca73f5)]:\n  - @react-pdf/types@2.5.0\n  - @react-pdf/font@2.5.1\n  - @react-pdf/layout@3.12.1\n  - @react-pdf/render@3.4.4\n\n## 3.4.3\n\n### Patch Changes\n\n- Updated dependencies [[`67c265a`](https://github.com/diegomura/react-pdf/commit/67c265a7e39cc0baa319f49137219677904695e6), [`713690c`](https://github.com/diegomura/react-pdf/commit/713690cca266116bb7e80d13cf84bc843f9dfd52)]:\n  - @react-pdf/layout@3.12.0\n  - @react-pdf/font@2.5.0\n  - @react-pdf/pdfkit@3.1.10\n\n## 3.4.2\n\n### Patch Changes\n\n- Updated dependencies [[`e2d21a4`](https://github.com/diegomura/react-pdf/commit/e2d21a433b881bb96ea4d0b3a01a7297dd1f4a94)]:\n  - @react-pdf/pdfkit@3.1.9\n  - @react-pdf/layout@3.11.5\n\n## 3.4.1\n\n### Patch Changes\n\n- Updated dependencies [[`68bfc57`](https://github.com/diegomura/react-pdf/commit/68bfc575adfb95302e320019715d1eec5398259f)]:\n  - @react-pdf/pdfkit@3.1.8\n  - @react-pdf/layout@3.11.4\n\n## 3.4.0\n\n### Minor Changes\n\n- [#2582](https://github.com/diegomura/react-pdf/pull/2582) [`fab09cc`](https://github.com/diegomura/react-pdf/commit/fab09cc9814326fdb44d2bcb7097ba9960d441d1) Thanks [@SethThoburn](https://github.com/SethThoburn)! - Pass \\_INTERNAL\\_\\_LAYOUT\\_\\_DATA\\_ to onRenderCallback in toBuffer\n\n### Patch Changes\n\n- Updated dependencies [[`da10a9b`](https://github.com/diegomura/react-pdf/commit/da10a9bb43dc4c4765687850444a24cbc4eb402a), [`087ee22`](https://github.com/diegomura/react-pdf/commit/087ee22f63a922a2d3ee01bae3b0351f99cb9021)]:\n  - @react-pdf/pdfkit@3.1.7\n  - @react-pdf/layout@3.11.3\n\n## 3.3.8\n\n### Patch Changes\n\n- Updated dependencies [[`dc54c13`](https://github.com/diegomura/react-pdf/commit/dc54c13625510482e93f80ed5cc07cf3a6a6d34c)]:\n  - @react-pdf/pdfkit@3.1.6\n  - @react-pdf/layout@3.11.2\n\n## 3.3.7\n\n### Patch Changes\n\n- [#2605](https://github.com/diegomura/react-pdf/pull/2605) [`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - fix: fix CJS compatibility\n\n- Updated dependencies [[`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71)]:\n  - @react-pdf/layout@3.11.1\n  - @react-pdf/render@3.4.3\n  - @react-pdf/font@2.4.4\n  - @react-pdf/pdfkit@3.1.5\n\n## 3.3.6\n\n### Patch Changes\n\n- Updated dependencies [[`9af07fe`](https://github.com/diegomura/react-pdf/commit/9af07feb59c2fe9c1d8960ac95f6fa6e03d16235), [`8350154`](https://github.com/diegomura/react-pdf/commit/83501541e3a050021e18e112bb472b2dabc142a7)]:\n  - @react-pdf/layout@3.11.0\n  - @react-pdf/types@2.4.1\n  - @react-pdf/pdfkit@3.1.4\n  - @react-pdf/font@2.4.3\n  - @react-pdf/render@3.4.2\n\n## 3.3.5\n\n### Patch Changes\n\n- Updated dependencies [[`0590324`](https://github.com/diegomura/react-pdf/commit/0590324d7a6d75c0a49520b3f99cfb6594239390)]:\n  - @react-pdf/pdfkit@3.1.3\n  - @react-pdf/layout@3.10.4\n\n## 3.3.4\n\n### Patch Changes\n\n- Updated dependencies [[`44bd45b`](https://github.com/diegomura/react-pdf/commit/44bd45b1961ca8bae4a2f84cc77db945e5c43419)]:\n  - @react-pdf/pdfkit@3.1.2\n  - @react-pdf/layout@3.10.3\n\n## 3.3.3\n\n### Patch Changes\n\n- [#2544](https://github.com/diegomura/react-pdf/pull/2544) [`b5380a1`](https://github.com/diegomura/react-pdf/commit/b5380a1a0a7397b4111d68ce97b4acb702d34d51) Thanks [@satelllte](https://github.com/satelllte)! - fix: creationDate and modificationDate types\n\n- Updated dependencies [[`b5380a1`](https://github.com/diegomura/react-pdf/commit/b5380a1a0a7397b4111d68ce97b4acb702d34d51)]:\n  - @react-pdf/render@3.4.1\n\n## 3.3.2\n\n### Patch Changes\n\n- Updated dependencies [[`fb5273d`](https://github.com/diegomura/react-pdf/commit/fb5273d8d80d919f7b9c214e02d67b79ce23fa19), [`cfd050c`](https://github.com/diegomura/react-pdf/commit/cfd050c3ae0980f78c4a466565852d81c8254e19)]:\n  - @react-pdf/render@3.4.0\n  - @react-pdf/types@2.4.0\n  - @react-pdf/font@2.4.2\n  - @react-pdf/layout@3.10.2\n\n## 3.3.1\n\n### Patch Changes\n\n- [#2529](https://github.com/diegomura/react-pdf/pull/2529) [`a35b1ba`](https://github.com/diegomura/react-pdf/commit/a35b1ba18d293df51293600d8d56015094d222d8) Thanks [@diegomura](https://github.com/diegomura)! - fix: jpeg exif orientation rendering\n\n- Updated dependencies [[`36c6ba3`](https://github.com/diegomura/react-pdf/commit/36c6ba30ae73a512f19fe5bc47ac8c304887c0da), [`a35b1ba`](https://github.com/diegomura/react-pdf/commit/a35b1ba18d293df51293600d8d56015094d222d8)]:\n  - @react-pdf/pdfkit@3.1.1\n  - @react-pdf/layout@3.10.1\n\n## 3.3.0\n\n### Minor Changes\n\n- [#2505](https://github.com/diegomura/react-pdf/pull/2505) [`0f5c43f`](https://github.com/diegomura/react-pdf/commit/0f5c43fa6f3c0b53c067200cc1ac21e651504760) Thanks [@diegomura](https://github.com/diegomura)! - feat: wasm yoga\n\n### Patch Changes\n\n- [#2515](https://github.com/diegomura/react-pdf/pull/2515) [`64f7bba`](https://github.com/diegomura/react-pdf/commit/64f7bba0d840d17188e50086169c84c415abd8d5) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Allow <G style={…} /> in TypeScript\n\n* [#2522](https://github.com/diegomura/react-pdf/pull/2522) [`e817223`](https://github.com/diegomura/react-pdf/commit/e8172231d07d10ece4ca960641f9ee52c5d4660d) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Make options in usePDF optional in TypeScript\n\n- [#2519](https://github.com/diegomura/react-pdf/pull/2519) [`cf73180`](https://github.com/diegomura/react-pdf/commit/cf7318069e63170e160a36602359fc8cbc3386c2) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Fix props unnecessarily required in LinearGradient and RadialGradient in TypeScript\n\n* [#2516](https://github.com/diegomura/react-pdf/pull/2516) [`66a40b2`](https://github.com/diegomura/react-pdf/commit/66a40b2e41cefe11f1ef8d467ba449a8861adb69) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Allow <Link href={…} /> in TypeScript\n\n* Updated dependencies [[`9e5842b`](https://github.com/diegomura/react-pdf/commit/9e5842bbecca6e249af2c5fc50078bb7ddd5420f), [`0f5c43f`](https://github.com/diegomura/react-pdf/commit/0f5c43fa6f3c0b53c067200cc1ac21e651504760)]:\n  - @react-pdf/types@2.3.6\n  - @react-pdf/layout@3.10.0\n  - @react-pdf/font@2.4.1\n  - @react-pdf/render@3.3.2\n\n## 3.2.1\n\n### Patch Changes\n\n- Updated dependencies [[`42bbbda`](https://github.com/diegomura/react-pdf/commit/42bbbda48058acd2d36d7a92c812d133608c459e)]:\n  - @react-pdf/primitives@3.1.1\n  - @react-pdf/layout@3.9.1\n  - @react-pdf/render@3.3.1\n\n## 3.2.0\n\n### Minor Changes\n\n- [#2409](https://github.com/diegomura/react-pdf/pull/2409) [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Add support for native ESM\n\n### Patch Changes\n\n- Updated dependencies [[`e705d98`](https://github.com/diegomura/react-pdf/commit/e705d9862e3364fde00cbe6cdaf06d492bf58526), [`6bfe7e8`](https://github.com/diegomura/react-pdf/commit/6bfe7e8a30d96c04a1552800159992705f3605b1), [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37), [`c8fe2c8`](https://github.com/diegomura/react-pdf/commit/c8fe2c86639cb8e44f26f78e62fc67379a8e3ceb), [`96ea576`](https://github.com/diegomura/react-pdf/commit/96ea5764cbe4e6e3869cd0fe6620e5216f94ffc0)]:\n  - @react-pdf/layout@3.9.0\n  - @react-pdf/render@3.3.0\n  - @react-pdf/primitives@3.1.0\n  - @react-pdf/pdfkit@3.1.0\n  - @react-pdf/font@2.4.0\n\n## 3.1.17\n\n### Patch Changes\n\n- Updated dependencies [[`0538bd9`](https://github.com/diegomura/react-pdf/commit/0538bd900e5490a5ef81bcdbd1676fc9f9ae6acb)]:\n  - @react-pdf/layout@3.8.0\n\n## 3.1.16\n\n### Patch Changes\n\n- [#2363](https://github.com/diegomura/react-pdf/pull/2363) [`8654d00`](https://github.com/diegomura/react-pdf/commit/8654d003023dd0899cddfc2ea2f5a552e01cf570) Thanks [@azmy60](https://github.com/azmy60)! - fix: SVGPresentationAttributes types\n\n- Updated dependencies [[`b227e0e`](https://github.com/diegomura/react-pdf/commit/b227e0e303da8bca754910f55f5d27dd18f3a874), [`e5c8fde`](https://github.com/diegomura/react-pdf/commit/e5c8fde9379a9a85ecac7e3d6273953e39d65f8d), [`45b2bd3`](https://github.com/diegomura/react-pdf/commit/45b2bd37037c605727ad5783f2f2a438dc19cac4), [`8654d00`](https://github.com/diegomura/react-pdf/commit/8654d003023dd0899cddfc2ea2f5a552e01cf570), [`b457a0c`](https://github.com/diegomura/react-pdf/commit/b457a0cc1c1352325e6c633af3000a3c9241f7f7), [`1f987cc`](https://github.com/diegomura/react-pdf/commit/1f987cc27c3fd1ef1b6748ebe58a289a78b538d2), [`4c40b14`](https://github.com/diegomura/react-pdf/commit/4c40b149cfed42f2513e1dd330a92ccc3363c04f)]:\n  - @react-pdf/layout@3.7.0\n  - @react-pdf/types@2.3.5\n  - @react-pdf/pdfkit@3.0.4\n  - @react-pdf/render@3.2.8\n  - @react-pdf/font@2.3.8\n\n## 3.1.15\n\n### Patch Changes\n\n- Updated dependencies [[`4cfb84d`](https://github.com/diegomura/react-pdf/commit/4cfb84d9f3d2301720b68b4c40a0257b9520c6e1)]:\n  - @react-pdf/pdfkit@3.0.3\n  - @react-pdf/layout@3.6.4\n\n## 3.1.14\n\n### Patch Changes\n\n- Updated dependencies [[`4a55c1b`](https://github.com/diegomura/react-pdf/commit/4a55c1b2ed19e460ccae6e749ed94c16729a23c4)]:\n  - @react-pdf/types@2.3.4\n  - @react-pdf/layout@3.6.3\n  - @react-pdf/font@2.3.7\n  - @react-pdf/render@3.2.7\n\n## 3.1.13\n\n### Patch Changes\n\n- [#2406](https://github.com/diegomura/react-pdf/pull/2406) [`3b5e1c7`](https://github.com/diegomura/react-pdf/commit/3b5e1c7c71a0f830ae2b70da8aac2b2bd5015ca3) Thanks [@JoachimKoenigslieb](https://github.com/JoachimKoenigslieb)! - Added an optional callback to the updateContainer method. This allows the user of the pdf instance to know when the update operation is finished in React. As this is an optional argument, no user code should be changed.\n\n## 3.1.12\n\n### Patch Changes\n\n- [#2247](https://github.com/diegomura/react-pdf/pull/2247) [`6d408c8`](https://github.com/diegomura/react-pdf/commit/6d408c838b1aa9bea0db63bf36b2a6932a20404c) Thanks [@jeetiss](https://github.com/jeetiss)! - ### updates for `usePDF` hook\n\n  `update` function takes the new document and renders it:\n\n  ```jsx\n  const PdfView = () => {\n    const [pdf, update] = usePdf();\n\n    useEffect(() => {\n      update(<PDFDocument />);\n    }, []);\n\n    if (pdf.loading) return null;\n\n    // use your PDF here\n    return <>{pdf.url}</>;\n  };\n  ```\n\n## 3.1.11\n\n### Patch Changes\n\n- Updated dependencies [[`5385a43`](https://github.com/diegomura/react-pdf/commit/5385a438cb4876d1dc00d49d5fdd2e07c0d16167), [`1e1fbdc`](https://github.com/diegomura/react-pdf/commit/1e1fbdc3c33ced46d8c7ebba7a196733cb789d59), [`8636812`](https://github.com/diegomura/react-pdf/commit/86368122ed87621d19ae3bc248080e17703d9fcb)]:\n  - @react-pdf/render@3.2.6\n  - @react-pdf/types@2.3.3\n  - @react-pdf/font@2.3.6\n  - @react-pdf/layout@3.6.2\n\n## 3.1.10\n\n### Patch Changes\n\n- [#2309](https://github.com/diegomura/react-pdf/pull/2309) [`113de53`](https://github.com/diegomura/react-pdf/commit/113de537b0fa9bae06a69e7c8daa988fe319fc6a) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Make `x` and `y` optional in `Rect`\n\n* [#2314](https://github.com/diegomura/react-pdf/pull/2314) [`d6018d5`](https://github.com/diegomura/react-pdf/commit/d6018d5a80492270ff5f5b4c00e694f7dc1cd93f) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Make `cx` and `cy` optional in `Circle` and `Ellipse`\n\n* Updated dependencies [[`a25dbcb`](https://github.com/diegomura/react-pdf/commit/a25dbcb32b65c300f5b088e8b210bb0c1abca5c2), [`2e724df`](https://github.com/diegomura/react-pdf/commit/2e724dfaff3c9b39e9862d24b0d0e037c8a9e8c2), [`d6018d5`](https://github.com/diegomura/react-pdf/commit/d6018d5a80492270ff5f5b4c00e694f7dc1cd93f)]:\n  - @react-pdf/types@2.3.2\n  - @react-pdf/render@3.2.5\n  - @react-pdf/font@2.3.5\n  - @react-pdf/layout@3.6.1\n\n## 3.1.9\n\n### Patch Changes\n\n- Updated dependencies [[`d48039c`](https://github.com/diegomura/react-pdf/commit/d48039c9e224346fd22395f48eb03ceffa5e3dd6)]:\n  - @react-pdf/layout@3.6.0\n\n## 3.1.8\n\n### Patch Changes\n\n- [#2232](https://github.com/diegomura/react-pdf/pull/2232) [`5832ff2`](https://github.com/diegomura/react-pdf/commit/5832ff20e1ce4a0e49cf5249dcdf4b304eab04c6) Thanks [@x-Wawa](https://github.com/x-Wawa)! - Add missing props types on `Document` component\n\n* [#2236](https://github.com/diegomura/react-pdf/pull/2236) [`37bfa1b`](https://github.com/diegomura/react-pdf/commit/37bfa1ba26386d1725f42ba5e108d8c72aa71e85) Thanks [@jeetiss](https://github.com/jeetiss)! - remove loose-envify dependency\n\n* Updated dependencies [[`47e91cb`](https://github.com/diegomura/react-pdf/commit/47e91cbd8016046bb4e8389ba0d1c7ede9edce59)]:\n  - @react-pdf/layout@3.5.1\n  - @react-pdf/types@2.3.1\n  - @react-pdf/font@2.3.4\n  - @react-pdf/render@3.2.4\n\n## 3.1.7\n\n### Patch Changes\n\n- [#2229](https://github.com/diegomura/react-pdf/pull/2229) [`b194b61`](https://github.com/diegomura/react-pdf/commit/b194b619b19a7683b64d47eaa2573635e6884e8d) Thanks [@jeetiss](https://github.com/jeetiss)! - deprecate `renderToString` use `renderToBuffer` instead\n\n- Updated dependencies [[`2db67a3`](https://github.com/diegomura/react-pdf/commit/2db67a38b9be98b7816a2b5aa4733446b95e3724)]:\n  - @react-pdf/layout@3.5.0\n  - @react-pdf/types@2.3.0\n  - @react-pdf/render@3.2.3\n  - @react-pdf/font@2.3.3\n\n## 3.1.6\n\n### Patch Changes\n\n- [#2205](https://github.com/diegomura/react-pdf/pull/2205) [`9a5e0be`](https://github.com/diegomura/react-pdf/commit/9a5e0befb89756db07ce053192a136df9d4ba905) Thanks [@jeetiss](https://github.com/jeetiss)! - update babel\n\n* [#2211](https://github.com/diegomura/react-pdf/pull/2211) [`f6667e7`](https://github.com/diegomura/react-pdf/commit/f6667e75449c241d02f9f44fb717a71443c555c1) Thanks [@jeetiss](https://github.com/jeetiss)! - configure automatic runtime for react\n\n* Updated dependencies [[`9a5e0be`](https://github.com/diegomura/react-pdf/commit/9a5e0befb89756db07ce053192a136df9d4ba905)]:\n  - @react-pdf/layout@3.4.1\n  - @react-pdf/pdfkit@3.0.2\n  - @react-pdf/render@3.2.2\n  - @react-pdf/font@2.3.2\n\n## 3.1.5\n\n### Patch Changes\n\n- [#2202](https://github.com/diegomura/react-pdf/pull/2202) [`f4d2b68`](https://github.com/diegomura/react-pdf/commit/f4d2b68765d146e4718140f65eeceb7e69e2cfee) Thanks [@jeetiss](https://github.com/jeetiss)! - add `events` as dependency to fix build in vite\n\n* [#2201](https://github.com/diegomura/react-pdf/pull/2201) [`75150ca`](https://github.com/diegomura/react-pdf/commit/75150ca137b709fcab6e7cefee9dfac6b48d5aaa) Thanks [@jeetiss](https://github.com/jeetiss)! - Reveal layout data in `onRender` callback\n\n  This is an experimental API, and it will change in the future. Use it at your own risk\n\n## 3.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`c981784`](https://github.com/diegomura/react-pdf/commit/c981784b172e9a7631edb7a1fe41ce77bc6ccdee)]:\n  - @react-pdf/layout@3.4.0\n\n## 3.1.3\n\n### Patch Changes\n\n- [#2173](https://github.com/diegomura/react-pdf/pull/2173) [`18cb161`](https://github.com/diegomura/react-pdf/commit/18cb161e3a40581e79b4d3ee0410cb2c3472e987) Thanks [@jeetiss](https://github.com/jeetiss)! - export renderToBuffer type\n\n* [#2172](https://github.com/diegomura/react-pdf/pull/2172) [`d0cc0bd`](https://github.com/diegomura/react-pdf/commit/d0cc0bd26f04731e1009fae15860892d04e5222f) Thanks [@rdennis](https://github.com/rdennis)! - Improved `children` prop types for react@18.\n\n## 3.1.2\n\n### Patch Changes\n\n- [#2170](https://github.com/diegomura/react-pdf/pull/2170) [`b06f8f4`](https://github.com/diegomura/react-pdf/commit/b06f8f4e2ac8490b75093e05bfdc9a7be5594936) Thanks [@jeetiss](https://github.com/jeetiss)! - fix both esm and commonjs entries\n\n## 3.1.1\n\n### Patch Changes\n\n- [#2161](https://github.com/diegomura/react-pdf/pull/2161) [`f648581`](https://github.com/diegomura/react-pdf/commit/f6485813c987f09a3aabca505fd0f6239ca5e58d) Thanks [@jeetiss](https://github.com/jeetiss)! - fix esm reexports\n\n## 3.1.0\n\n### Minor Changes\n\n- [#2140](https://github.com/diegomura/react-pdf/pull/2140) [`327f071`](https://github.com/diegomura/react-pdf/commit/327f071ea72a7abb22423009666ddf06838a0654) Thanks [@jeetiss](https://github.com/jeetiss)! - fix react peer dependency problem\n\n* [#2160](https://github.com/diegomura/react-pdf/pull/2160) [`a743c90`](https://github.com/diegomura/react-pdf/commit/a743c905fb5d201d2382bc9175fa36b83cc47284) Thanks [@jeetiss](https://github.com/jeetiss)! - implement flex gap\n\n### Patch Changes\n\n- [#2158](https://github.com/diegomura/react-pdf/pull/2158) [`2343a99`](https://github.com/diegomura/react-pdf/commit/2343a9982c647b0c6684df911d001120ed55596b) Thanks [@jeetiss](https://github.com/jeetiss)! - add type definition for renderToBuffer method\n\n* [#2149](https://github.com/diegomura/react-pdf/pull/2149) [`54e9625`](https://github.com/diegomura/react-pdf/commit/54e962505a9917b20b2a3ffe8508a36a6bbc4f30) Thanks [@jeetiss](https://github.com/jeetiss)! - Fix \"Invalid\" error when a text label is a child of a Tspan element\n\n- [#1798](https://github.com/diegomura/react-pdf/pull/1798) [`17a8006`](https://github.com/diegomura/react-pdf/commit/17a80066453454dce6141f7da2033d348b4d53c8) Thanks [@karlhorky](https://github.com/karlhorky)! - fix types for @types/react@18\n\n- Updated dependencies [[`a743c90`](https://github.com/diegomura/react-pdf/commit/a743c905fb5d201d2382bc9175fa36b83cc47284)]:\n  - @react-pdf/layout@3.3.0\n  - @react-pdf/types@2.2.0\n\n## 3.0.3\n\n### Patch Changes\n\n- [#2146](https://github.com/diegomura/react-pdf/pull/2146) [`2b05ef7`](https://github.com/diegomura/react-pdf/commit/2b05ef784b4ccf08dd06a91c4a6f054bddfaf5db) Thanks [@jeetiss](https://github.com/jeetiss)! - render text inside links\n\n## 3.0.2\n\n### Patch Changes\n\n- [#2115](https://github.com/diegomura/react-pdf/pull/2115) [`a3f62c9`](https://github.com/diegomura/react-pdf/commit/a3f62c910c0128e0b4312480414dbf8b26dbca1c) Thanks [@jeetiss](https://github.com/jeetiss)! - fix `renderToString` method in node js\n\n* [#2106](https://github.com/diegomura/react-pdf/pull/2106) [`24bb5de`](https://github.com/diegomura/react-pdf/commit/24bb5de969a854cc0226438985b34ef8ae2d7581) Thanks [@RDO34](https://github.com/RDO34)! - Add `dpi` and `bookmark` page prop types\n\n* Updated dependencies [[`24bb5de`](https://github.com/diegomura/react-pdf/commit/24bb5de969a854cc0226438985b34ef8ae2d7581), [`8536f10`](https://github.com/diegomura/react-pdf/commit/8536f103830a9ed00211fc4c821b221377885a07)]:\n  - @react-pdf/types@2.1.1\n  - @react-pdf/pdfkit@3.0.1\n\n## 3.0.1\n\n### Patch Changes\n\n- [#2056](https://github.com/diegomura/react-pdf/pull/2056) [`2ebba93`](https://github.com/diegomura/react-pdf/commit/2ebba93c43608a31655e99f226f1cf2d7006ac39) Thanks [@jasnross](https://github.com/jasnross)! - fix: TypeError when returning fragments or arrays from render prop\n\n- Updated dependencies [[`ce1c43c`](https://github.com/diegomura/react-pdf/commit/ce1c43c1b450b3737a23a356c5143626ac2a43ad), [`2ebba93`](https://github.com/diegomura/react-pdf/commit/2ebba93c43608a31655e99f226f1cf2d7006ac39), [`992b91b`](https://github.com/diegomura/react-pdf/commit/992b91b3866e8e24efa014eef4d3eeec6a40f9a5)]:\n  - @react-pdf/font@2.3.1\n  - @react-pdf/layout@3.2.1\n\n## 3.0.0\n\n### Major Changes\n\n- [#1908](https://github.com/diegomura/react-pdf/pull/1908) [`d1f3d5b`](https://github.com/diegomura/react-pdf/commit/d1f3d5b9b4103705e95e2160347ee253d842ed5d) Thanks [@diegomura](https://github.com/diegomura)! - chore: use fontkit mainline repo + drop node 12\n\n### Minor Changes\n\n- [#1891](https://github.com/diegomura/react-pdf/pull/1891) [`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - feat: compatibility with modern web bundlers and browsers\n\n### Patch Changes\n\n- [#1604](https://github.com/diegomura/react-pdf/pull/1604) [`7eefc33`](https://github.com/diegomura/react-pdf/commit/7eefc3323390c59bf6d4f923749526831572ef1a) Thanks [@jeetiss](https://github.com/jeetiss)! - fix: skip empty text instance creation in jsx conditions\n\n* [#1924](https://github.com/diegomura/react-pdf/pull/1924) [`3b054b7`](https://github.com/diegomura/react-pdf/commit/3b054b711f5dc0b1c4fd29feaf85b430baad2663) Thanks [@adamduncan](https://github.com/adamduncan)! - fix: bad type on onClick\n\n- [#1929](https://github.com/diegomura/react-pdf/pull/1929) [`9996158`](https://github.com/diegomura/react-pdf/commit/9996158636edf2118c4a6dcce08a00408b982993) Thanks [@diegomura](https://github.com/diegomura)! - feat: remove blob stream dependency\n\n- Updated dependencies [[`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81), [`001a208`](https://github.com/diegomura/react-pdf/commit/001a20812fa039d09931b22eb97a8869e3b31cc5), [`5fe9754`](https://github.com/diegomura/react-pdf/commit/5fe9754f21f103e17d1b70498ee7961cde779b22), [`d1f3d5b`](https://github.com/diegomura/react-pdf/commit/d1f3d5b9b4103705e95e2160347ee253d842ed5d), [`27403f9`](https://github.com/diegomura/react-pdf/commit/27403f9a6ac1bbcfb144afc201c4a3e5aca25cbd), [`9996158`](https://github.com/diegomura/react-pdf/commit/9996158636edf2118c4a6dcce08a00408b982993), [`1a89506`](https://github.com/diegomura/react-pdf/commit/1a89506b4d325822d1a60a8f964434a6f6eb2d3f)]:\n  - @react-pdf/pdfkit@3.0.0\n  - @react-pdf/font@2.3.0\n  - @react-pdf/layout@3.2.0\n  - @react-pdf/render@3.2.1\n\n## 2.3.0\n\n### Minor Changes\n\n- [#1902](https://github.com/diegomura/react-pdf/pull/1902) [`d011983`](https://github.com/diegomura/react-pdf/commit/d011983204cf45876594fa361f24b47e86c612c9) Thanks [@adamduncan](https://github.com/adamduncan)! - feat: add onClick event to PDFDownloadLink\n\n### Patch Changes\n\n- Updated dependencies [[`3acf53b`](https://github.com/diegomura/react-pdf/commit/3acf53b45200fa1415315f7dc22cc4b84a6b54c6), [`035d3f8`](https://github.com/diegomura/react-pdf/commit/035d3f8d24fa4f4af9f350950d81b51547858367), [`9527fe4`](https://github.com/diegomura/react-pdf/commit/9527fe4c9087818421eca4753172b06e3c0cb934), [`e94e50a`](https://github.com/diegomura/react-pdf/commit/e94e50a931df7347a8febc717ca76843502826c8), [`884695b`](https://github.com/diegomura/react-pdf/commit/884695b44feb974f155c83e0714e8e939b4f641b)]:\n  - @react-pdf/font@2.2.1\n  - @react-pdf/pdfkit@2.4.0\n  - @react-pdf/render@3.2.0\n  - @react-pdf/layout@3.1.2\n\n## 2.2.0\n\n### Minor Changes\n\n- [#1867](https://github.com/diegomura/react-pdf/pull/1867) [`4fadb48`](https://github.com/diegomura/react-pdf/commit/4fadb48983d7269452f89f80c7e341ece859aaee) Thanks [@diegomura](https://github.com/diegomura)! - feat: add page layout support\n\n* [#1868](https://github.com/diegomura/react-pdf/pull/1868) [`ce8762f`](https://github.com/diegomura/react-pdf/commit/ce8762f6de5c796e69ec5a225c7f3ff9c619a960) Thanks [@diegomura](https://github.com/diegomura)! - feat: add page mode support\n\n### Patch Changes\n\n- Updated dependencies [[`eecddbd`](https://github.com/diegomura/react-pdf/commit/eecddbda083561273eda21ee9b8d6107ad21800b), [`1411d16`](https://github.com/diegomura/react-pdf/commit/1411d162e04ca237bad93729695c363fdf4bdbeb), [`205aa03`](https://github.com/diegomura/react-pdf/commit/205aa0334c67e7436d0a35b95b919ecee189a192), [`70c3c9f`](https://github.com/diegomura/react-pdf/commit/70c3c9f52517dc2820765e657dd2bff6b47d1ef2), [`22fb0f0`](https://github.com/diegomura/react-pdf/commit/22fb0f008ac2a2e251657e9cbd97ccedb4ff67db), [`4fadb48`](https://github.com/diegomura/react-pdf/commit/4fadb48983d7269452f89f80c7e341ece859aaee), [`d958b0a`](https://github.com/diegomura/react-pdf/commit/d958b0ae06a61c157b2581488a9121a0464222f4), [`24f5c77`](https://github.com/diegomura/react-pdf/commit/24f5c77706e12dbab45053cb704a2fe7cf60eb53), [`ce8762f`](https://github.com/diegomura/react-pdf/commit/ce8762f6de5c796e69ec5a225c7f3ff9c619a960), [`5d2c308`](https://github.com/diegomura/react-pdf/commit/5d2c3088cf438a8abf1038b14a21117fecf59d57), [`9347466`](https://github.com/diegomura/react-pdf/commit/9347466e8cd33d149678903cf4cf53850a8fc64a), [`6730bc2`](https://github.com/diegomura/react-pdf/commit/6730bc210712e6fc67b94f89f23a3d86f6a203f9), [`810f459`](https://github.com/diegomura/react-pdf/commit/810f45904e9abeaff5583ed4ceb6d77e123bbaea)]:\n  - @react-pdf/render@3.1.0\n  - @react-pdf/layout@3.1.0\n  - @react-pdf/pdfkit@2.3.0\n  - @react-pdf/types@2.1.0\n\n## 2.1.2\n\n### Patch Changes\n\n- [#1836](https://github.com/diegomura/react-pdf/pull/1836) [`6c799ec`](https://github.com/diegomura/react-pdf/commit/6c799ec1bbe17106df6db109df4a62c70e39bd24) Thanks [@diegomura](https://github.com/diegomura)! - refactor: remove unused ramda dependency\n\n- Updated dependencies [[`e938df0`](https://github.com/diegomura/react-pdf/commit/e938df0857642707b10b7f65f17ed22dc394ac1b), [`7c1d373`](https://github.com/diegomura/react-pdf/commit/7c1d373a06b04369e762069be4b96d4e40371ecc), [`5458a00`](https://github.com/diegomura/react-pdf/commit/5458a00979d883341c6df094243cae859344d2b9), [`9bdb5c9`](https://github.com/diegomura/react-pdf/commit/9bdb5c934a822340754cd4c892d399f91f6218de), [`fe0f214`](https://github.com/diegomura/react-pdf/commit/fe0f214dbbf2f632b852ebfe65f886ecc4dd6953), [`7e97bb5`](https://github.com/diegomura/react-pdf/commit/7e97bb579aaa847e5a2de650b5b327ac90a465c7), [`9a2b935`](https://github.com/diegomura/react-pdf/commit/9a2b935cfe173f80425ed87d9f474da271c050d2), [`25a80eb`](https://github.com/diegomura/react-pdf/commit/25a80ebd5f96ade7101883624010bad51474967c)]:\n  - @react-pdf/primitives@3.0.0\n  - @react-pdf/layout@3.0.0\n  - @react-pdf/render@3.0.0\n  - @react-pdf/types@2.0.9\n  - @react-pdf/font@2.2.0\n  - @react-pdf/pdfkit@2.2.0\n\n## 2.1.1\n\n### Patch Changes\n\n- [#1681](https://github.com/diegomura/react-pdf/pull/1681) [`4eddbf5`](https://github.com/diegomura/react-pdf/commit/4eddbf5f21f5d58d4591d77e121faad5159424fc) Thanks [@dschu-lab](https://github.com/dschu-lab)! - defined renderToStream to return promise\n\n- Updated dependencies [[`90ab2f8`](https://github.com/diegomura/react-pdf/commit/90ab2f8c040afc3d42961404bdf2ae09fac599eb)]:\n  - @react-pdf/font@2.1.1\n  - @react-pdf/layout@2.1.1\n\n## 2.1.0\n\n### Minor Changes\n\n- [#1610](https://github.com/diegomura/react-pdf/pull/1610) [`4c5d527`](https://github.com/diegomura/react-pdf/commit/4c5d52721d29d843f1d09c3fd74370832429f70e) Thanks [@jeetiss](https://github.com/jeetiss)! - updated rollup rollup-plugins and babel\n\n* [#1654](https://github.com/diegomura/react-pdf/pull/1654) [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b) Thanks [@jeetiss](https://github.com/jeetiss)! - added `@babel/runtime` to dependencies\n\n### Patch Changes\n\n- [#1605](https://github.com/diegomura/react-pdf/pull/1605) [`e7a93bc`](https://github.com/diegomura/react-pdf/commit/e7a93bcc18ef1dad74dcc80e84e5dcf6e4b04443) Thanks [@jeetiss](https://github.com/jeetiss)! - removed duplicate of `scheduler` package\n\n* [#1581](https://github.com/diegomura/react-pdf/pull/1581) [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca) Thanks [@jeetiss](https://github.com/jeetiss)! - added changelog with changesets\n\n* Updated dependencies [[`6f0e8d2`](https://github.com/diegomura/react-pdf/commit/6f0e8d2a130d39350cc4f61ff5c743b4b262c98a), [`4c5d527`](https://github.com/diegomura/react-pdf/commit/4c5d52721d29d843f1d09c3fd74370832429f70e), [`46a4b0c`](https://github.com/diegomura/react-pdf/commit/46a4b0c88836e0653db0c8bae6f71f969882277c), [`d341ae6`](https://github.com/diegomura/react-pdf/commit/d341ae66e91774e95e82deb8d9162bf458688768), [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca), [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b), [`a592e99`](https://github.com/diegomura/react-pdf/commit/a592e99f7df7481697582c2a12f31ce7f9559c66)]:\n  - @react-pdf/layout@2.1.0\n  - @react-pdf/font@2.1.0\n  - @react-pdf/pdfkit@2.1.0\n  - @react-pdf/render@2.1.0\n  - @react-pdf/primitives@2.0.2\n  - @react-pdf/types@2.0.8\n"
  },
  {
    "path": "packages/renderer/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n  <p align=\"center\">React renderer for creating PDF files on the browser and server<p>\n  <p align=\"center\">\n    <a href=\"https://www.npmjs.com/package/@react-pdf/renderer\">\n      <img src=\"https://img.shields.io/npm/v/@react-pdf/renderer.svg\" />\n    </a>\n    <a href=\"https://travis-ci.org/diegomura/react-pdf\">\n      <img src=\"https://img.shields.io/travis/diegomura/react-pdf.svg\" />\n    </a>\n    <a href=\"https://github.com/diegomura/react-pdf/blob/master/LICENSE\">\n      <img src=\"https://img.shields.io/github/license/diegomura/react-pdf.svg\" />\n    </a>\n    <a href=\"https://spectrum.chat/react-pdf\">\n      <img src=\"https://withspectrum.github.io/badge/badge.svg\" />\n    </a>\n    <a href=\"https://github.com/prettier/prettier\">\n      <img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" />\n    </a>\n  </p>\n</p>\n\n## How to install\n\n```sh\nyarn add @react-pdf/renderer\n```\n\n## How it works\n\n```jsx\nimport { Document, Page, Text, View, StyleSheet } from '@react-pdf/renderer';\n\n// Create styles\nconst styles = StyleSheet.create({\n  page: {\n    flexDirection: 'row',\n    backgroundColor: '#E4E4E4',\n  },\n  section: {\n    margin: 10,\n    padding: 10,\n    flexGrow: 1,\n  },\n});\n\n// Create Document Component\nconst MyDocument = () => (\n  <Document>\n    <Page size=\"A4\" style={styles.page}>\n      <View style={styles.section}>\n        <Text>Section #1</Text>\n      </View>\n      <View style={styles.section}>\n        <Text>Section #2</Text>\n      </View>\n    </Page>\n  </Document>\n);\n```\n\n### `Web.` Render in DOM\n\n```jsx\nimport ReactDOM from 'react-dom';\nimport { PDFViewer } from '@react-pdf/renderer';\n\nconst App = () => (\n  <PDFViewer>\n    <MyDocument />\n  </PDFViewer>\n);\n\nReactDOM.render(<App />, document.getElementById('root'));\n```\n\n### `Node.` Save in a file\n\n```jsx\nimport ReactPDF from '@react-pdf/renderer';\n\nReactPDF.render(<MyDocument />, `${__dirname}/example.pdf`);\n```\n\n## Examples\n\nFor each example, try opening `output.pdf` to see the result.\n\n<table>\n\t<tbody>\n\t\t<tr>\n\t\t\t<td align=\"center\" valign=\"top\">\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/text/\">\n\t\t\t\t\t<img width=\"150\" height=\"150\" src=\"https://github.com/diegomura/react-pdf/blob/master/packages/examples/src/text/thumb.png?raw=true\">\n\t\t\t\t</a>\n\t\t\t\t<br>\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/text/\">Text</a>\n\t\t\t</td>\n\t\t\t<td align=\"center\" valign=\"top\">\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/resume/\">\n\t\t\t\t\t<img width=\"150\" height=\"150\" src=\"https://github.com/diegomura/react-pdf/blob/master/packages/examples/src/resume/thumb.png?raw=true\">\n\t\t\t\t</a>\n\t\t\t\t<br>\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/resume/\">Resume</a>\n\t\t\t</td>\n\t\t\t<td align=\"center\" valign=\"top\">\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/fractals/\">\n\t\t\t\t\t<img width=\"150\" height=\"150\" src=\"https://github.com/diegomura/react-pdf/blob/master/packages/examples/src/fractals/thumb.png?raw=true\">\n\t\t\t\t</a>\n\t\t\t\t<br>\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/fractals/\">Fractals</a>\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n<table>\n\t<tbody>\n\t\t<tr>\n\t\t\t<td align=\"center\" valign=\"top\">\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/knobs/\">\n\t\t\t\t\t<img width=\"150\" height=\"150\" src=\"https://github.com/diegomura/react-pdf/blob/master/packages/examples/src/knobs/thumb.png?raw=true\">\n\t\t\t\t</a>\n\t\t\t\t<br>\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/knobs/\">Knobs</a>\n\t\t\t</td>\n\t\t\t<td align=\"center\" valign=\"top\">\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/pageWrap/\">\n\t\t\t\t\t<img width=\"150\" height=\"150\" src=\"https://github.com/diegomura/react-pdf/blob/master/packages/examples/src/pageWrap/thumb.png?raw=true\">\n\t\t\t\t</a>\n\t\t\t\t<br>\n\t\t\t\t<a href=\"https://github.com/diegomura/react-pdf/tree/master/packages/examples/src/pageWrap/\">Page wrap</a>\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n\n## Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute]](CONTRIBUTING.md).\n<a href=\"https://github.com/diegomura/react-pdf/graphs/contributors\"><img src=\"https://opencollective.com/react-pdf/contributors.svg?width=890\" /></a>\n\n## Sponsors\n\nThank you to all our sponsors! [[Become a sponsors](https://opencollective.com/react-pdf#sponsors)]\n\n<a href=\"https://opencollective.com/react-pdf#sponsors\" target=\"_blank\"><img src=\"https://opencollective.com/react-pdf/sponsors.svg?width=890\"></a>\n\n## Backers\n\nThank you to all our backers! [[Become a backer](https://opencollective.com/react-pdf#backer)]\n\n<a href=\"https://opencollective.com/react-pdf#backers\" target=\"_blank\"><img src=\"https://opencollective.com/react-pdf/backers.svg?width=890\"></a>\n\n## License\n\nMIT © [Diego Muracciole](http://github.com/diegomura)\n\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Ftaylorudell%2Freact-pdf.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Ftaylorudell%2Freact-pdf?ref=badge_large)\n\n---\n\n![](https://img.shields.io/npm/dt/@react-pdf/renderer.svg?style=flat)\n"
  },
  {
    "path": "packages/renderer/babel.config.js",
    "content": "export default { extends: '../../babel.config.js' };\n"
  },
  {
    "path": "packages/renderer/index.d.ts",
    "content": "/* eslint-disable max-classes-per-file */\n\nimport * as React from 'react';\nimport {\n  Style,\n  PageSize,\n  FontStore,\n  PDFVersion,\n  Orientation,\n  SourceObject,\n  HyphenationCallback,\n  SVGPresentationAttributes,\n  Bookmark,\n  PageLayout,\n  PageMode,\n} from '@react-pdf/types';\n\ndeclare class ReactPDF {\n  static default: typeof ReactPDF;\n}\n\nexport = ReactPDF;\n\ndeclare namespace ReactPDF {\n  interface Styles {\n    [key: string]: Style;\n  }\n  interface OnRenderProps {\n    blob?: Blob;\n  }\n\n  interface DocumentProps {\n    style?: Style | Style[];\n    title?: string;\n    author?: string;\n    subject?: string;\n    creator?: string;\n    keywords?: string;\n    producer?: string;\n    language?: string;\n    creationDate?: Date;\n    modificationDate?: Date;\n    pdfVersion?: PDFVersion;\n    pageMode?: PageMode;\n    pageLayout?: PageLayout;\n    onRender?: (props: OnRenderProps) => any;\n  }\n\n  /**\n   * This component represent the PDF document itself. It must be the root\n   * of your tree element structure, and under no circumstances should it be\n   * used as children of another react-pdf component. In addition, it should\n   * only have childs of type <Page />.\n   */\n  export class Document extends React.Component<\n    React.PropsWithChildren<DocumentProps>\n  > {}\n\n  interface NodeProps {\n    id?: string;\n    style?: Style | Style[];\n    /**\n     * Render component in all wrapped pages.\n     * @see https://react-pdf.org/advanced#fixed-components\n     */\n    fixed?: boolean;\n    /**\n     * Force the wrapping algorithm to start a new page when rendering the\n     * element.\n     * @see https://react-pdf.org/advanced#page-breaks\n     */\n    break?: boolean;\n    /**\n     * Hint that no page wrapping should occur between all sibling elements following the element within n points\n     * @see https://react-pdf.org/advanced#orphan-&-widow-protection\n     */\n    minPresenceAhead?: number;\n  }\n\n  interface PageProps extends NodeProps {\n    /**\n     * Enable page wrapping for this page.\n     * @see https://react-pdf.org/components#page-wrapping\n     */\n    wrap?: boolean;\n    /**\n     * Enables debug mode on page bounding box.\n     * @see https://react-pdf.org/advanced#debugging\n     */\n    debug?: boolean;\n    size?: PageSize;\n    orientation?: Orientation;\n    dpi?: number;\n    bookmark?: Bookmark;\n  }\n\n  /**\n   * Represents single page inside the PDF document, or a subset of them if\n   * using the wrapping feature. A <Document /> can contain as many pages as\n   * you want, but ensure not rendering a page inside any component besides\n   * Document.\n   */\n  export class Page extends React.Component<\n    React.PropsWithChildren<PageProps>\n  > {}\n\n  interface ViewProps extends NodeProps {\n    id?: string;\n    /**\n     * Enable/disable page wrapping for element.\n     * @see https://react-pdf.org/components#page-wrapping\n     */\n    wrap?: boolean;\n    /**\n     * Enables debug mode on page bounding box.\n     * @see https://react-pdf.org/advanced#debugging\n     */\n    debug?: boolean;\n    render?: (props: {\n      pageNumber: number;\n      subPageNumber: number;\n    }) => React.ReactNode;\n  }\n\n  /**\n   * The most fundamental component for building a UI and is designed to be\n   * nested inside other views and can have 0 to many children.\n   */\n  export class View extends React.Component<\n    React.PropsWithChildren<ViewProps>\n  > {}\n\n  interface BaseImageProps extends NodeProps {\n    /**\n     * Enables debug mode on page bounding box.\n     * @see https://react-pdf.org/advanced#debugging\n     */\n    debug?: boolean;\n    cache?: boolean;\n  }\n\n  interface ImageWithSrcProp extends BaseImageProps {\n    src: SourceObject;\n  }\n\n  interface ImageWithSourceProp extends BaseImageProps {\n    source: SourceObject;\n  }\n\n  type ImageProps = ImageWithSrcProp | ImageWithSourceProp;\n\n  /**\n   * A React component for displaying network or local (Node only) JPG or\n   * PNG images, as well as base64 encoded image strings.\n   */\n  export class Image extends React.Component<ImageProps> {}\n\n  interface TextProps extends NodeProps {\n    id?: string;\n    /**\n     * Enable/disable page wrapping for element.\n     * @see https://react-pdf.org/components#page-wrapping\n     */\n    wrap?: boolean;\n    /**\n     * Enables debug mode on page bounding box.\n     * @see https://react-pdf.org/advanced#debugging\n     */\n    debug?: boolean;\n    render?: (props: {\n      pageNumber: number;\n      totalPages: number;\n      subPageNumber: number;\n      subPageTotalPages: number;\n    }) => React.ReactNode;\n    /**\n     * Override the default hyphenation-callback\n     * @see https://react-pdf.org/fonts#registerhyphenationcallback\n     */\n    hyphenationCallback?: HyphenationCallback;\n    /**\n     * Specifies the minimum number of lines in a text element that must be shown at the bottom of a page or its container.\n     * @see https://react-pdf.org/advanced#orphan-&-widow-protection\n     */\n    orphans?: number;\n    /**\n     * Specifies the minimum number of lines in a text element that must be shown at the top of a page or its container..\n     * @see https://react-pdf.org/advanced#orphan-&-widow-protection\n     */\n    widows?: number;\n  }\n\n  interface SVGTextProps extends SVGPresentationAttributes {\n    style?: SVGPresentationAttributes;\n    x: string | number;\n    y: string | number;\n    /**\n     * Override the default hyphenation-callback\n     * @see https://react-pdf.org/fonts#registerhyphenationcallback\n     */\n    hyphenationCallback?: HyphenationCallback;\n  }\n\n  /**\n   * A React component for displaying text. Text supports nesting of other\n   * Text or Link components to create inline styling.\n   */\n  export class Text extends React.Component<\n    React.PropsWithChildren<TextProps> | SVGTextProps\n  > {}\n\n  interface LinkProps extends NodeProps {\n    /**\n     * Enable/disable page wrapping for element.\n     * @see https://react-pdf.org/components#page-wrapping\n     */\n    wrap?: boolean;\n    /**\n     * Enables debug mode on page bounding box.\n     * @see https://react-pdf.org/advanced#debugging\n     */\n    debug?: boolean;\n    href?: string;\n    src?: string;\n  }\n\n  /**\n   * A React component for displaying a hyperlink. Link’s can be nested\n   * inside a Text component, or being inside any other valid primitive.\n   */\n  export class Link extends React.Component<\n    React.PropsWithChildren<LinkProps>\n  > {}\n\n  interface FormCommonProps extends NodeProps {\n    name?: string;\n    required?: boolean;\n    noExport?: boolean;\n    readOnly?: boolean;\n    value?: number | string;\n    defaultValue?: number | string;\n  }\n\n  interface FieldSetProps extends NodeProps {\n    name: string;\n  }\n\n  export class FieldSet extends React.Component<\n    React.PropsWithChildren<FieldSetProps>\n  > {}\n\n  // see http://pdfkit.org/docs/forms.html#text_field_formatting\n  interface TextInputFormatting {\n    type:\n      | 'date'\n      | 'time'\n      | 'percent'\n      | 'number'\n      | 'zip'\n      | 'zipPlus4'\n      | 'phone'\n      | 'ssn';\n    param?: string;\n    nDec?: number;\n    sepComma?: boolean;\n    negStyle?: 'MinusBlack' | 'Red' | 'ParensBlack' | 'ParensRed';\n    currency?: string;\n    currencyPrepend?: boolean;\n  }\n\n  // see http://pdfkit.org/docs/forms.html#text_field_formatting\n  interface TextInputProps extends FormCommonProps {\n    align?: 'left' | 'center' | 'right';\n    multiline?: boolean;\n    /**\n     * The text will be masked (e.g. with asterisks).\n     */\n    password?: boolean;\n    /**\n     * If set, text entered in the field is not spell-checked\n     */\n    noSpell?: boolean;\n    format?: TextInputFormatting;\n    /**\n     * Sets the fontSize (default or 0 means auto sizing)\n     */\n    fontSize?: number;\n    /**\n     * Sets the maximum length (characters) of the text in the field\n     */\n    maxLength?: number;\n  }\n\n  export class TextInput extends React.Component<TextInputProps> {}\n\n  interface CheckboxProps extends FormCommonProps {\n    backgroundColor?: string;\n    borderColor?: string;\n    checked?: boolean;\n    onState?: string;\n    offState?: string;\n    xMark?: boolean;\n  }\n\n  export class Checkbox extends React.Component<CheckboxProps> {}\n\n  interface SelectAndListPropsBase extends FormCommonProps {\n    sort?: boolean;\n    edit?: boolean;\n    multiSelect?: boolean;\n    noSpell?: boolean;\n    select?: string[];\n  }\n\n  type SelectAndListPropsWithEdit = SelectAndListPropsBase & {\n    edit: true | false;\n    noSpell: boolean;\n  };\n\n  type SelectAndListPropsWithNoSpell = SelectAndListPropsBase & {\n    edit: boolean;\n    noSpell: true | false;\n  };\n\n  type SelectAndListProps =\n    | SelectAndListPropsWithEdit\n    | SelectAndListPropsWithNoSpell;\n\n  export class Select extends React.Component<SelectAndListProps> {}\n\n  export class List extends React.Component<SelectAndListProps> {}\n\n  interface NoteProps extends NodeProps {\n    children: string;\n  }\n\n  export class Note extends React.Component<NoteProps> {}\n\n  interface CanvasProps extends NodeProps {\n    /**\n     * Enables debug mode on page bounding box.\n     * @see https://react-pdf.org/advanced#debugging\n     */\n    debug?: boolean;\n    paint: (\n      painter: any,\n      availableWidth: number,\n      availableHeight: number,\n    ) => null;\n  }\n\n  export class Canvas extends React.Component<CanvasProps> {}\n\n  interface SVGProps extends NodeProps, SVGPresentationAttributes {\n    /**\n     * Enables debug mode on page bounding box.\n     * @see https://react-pdf.org/advanced#debugging\n     */\n    debug?: boolean;\n    width?: string | number;\n    height?: string | number;\n    viewBox?: string;\n    preserveAspectRatio?: string;\n  }\n\n  /**\n   * The <SVG /> element is a container that defines a new coordinate system and viewport. It is used as the outermost element of SVG documents.\n   */\n  export class Svg extends React.Component<React.PropsWithChildren<SVGProps>> {}\n\n  interface LineProps extends SVGPresentationAttributes {\n    style?: SVGPresentationAttributes;\n    x1: string | number;\n    x2: string | number;\n    y1: string | number;\n    y2: string | number;\n  }\n\n  /**\n   * The <Line /> element is used to create a line.\n   */\n  export class Line extends React.Component<\n    React.PropsWithChildren<LineProps>\n  > {}\n\n  interface PolylineProps extends SVGPresentationAttributes {\n    style?: SVGPresentationAttributes;\n    points: string;\n  }\n\n  /**\n   * The <Polyline /> element is used to create any shape that consists of only straight lines (that is connected at several points).\n   */\n  export class Polyline extends React.Component<\n    React.PropsWithChildren<PolylineProps>\n  > {}\n\n  interface PolygonProps extends SVGPresentationAttributes {\n    style?: SVGPresentationAttributes;\n    points: string;\n  }\n\n  /**\n   * The <Polygon /> element is used to create a graphic that contains at least three sides.\n   * Polygons are made of straight lines, and the shape is \"closed\" (all the lines connect up).\n   */\n  export class Polygon extends React.Component<\n    React.PropsWithChildren<PolygonProps>\n  > {}\n\n  interface PathProps extends SVGPresentationAttributes {\n    style?: SVGPresentationAttributes;\n    d: string;\n  }\n\n  /**\n   * The <Path /> element is the most powerful element in the SVG library of basic shapes. It can be used to create lines, curves, arcs, and more.\n   */\n  export class Path extends React.Component<\n    React.PropsWithChildren<PathProps>\n  > {}\n\n  interface RectProps extends SVGPresentationAttributes {\n    style?: SVGPresentationAttributes;\n    x?: string | number;\n    y?: string | number;\n    width: string | number;\n    height: string | number;\n    rx?: string | number;\n    ry?: string | number;\n  }\n\n  /**\n   * The <Rect /> element is used to create a rectangle and variations of a rectangle shape.\n   */\n  export class Rect extends React.Component<\n    React.PropsWithChildren<RectProps>\n  > {}\n\n  interface CircleProps extends SVGPresentationAttributes {\n    style?: SVGPresentationAttributes;\n    cx?: string | number;\n    cy?: string | number;\n    r: string | number;\n  }\n\n  /**\n   * The <Circle /> element is used to create a circle.\n   */\n  export class Circle extends React.Component<\n    React.PropsWithChildren<CircleProps>\n  > {}\n\n  interface EllipseProps extends SVGPresentationAttributes {\n    style?: SVGPresentationAttributes;\n    cx?: string | number;\n    cy?: string | number;\n    rx: string | number;\n    ry: string | number;\n  }\n\n  /**\n   * The <Ellipse /> element is used to create an ellipse.\n   * An ellipse is closely related to a circle. The difference is that an ellipse has an x and a y radius that differs from each other, while a circle has equal x and y radius.\n   */\n  export class Ellipse extends React.Component<\n    React.PropsWithChildren<EllipseProps>\n  > {}\n\n  interface TspanProps extends SVGPresentationAttributes {\n    x?: string | number;\n    y?: string | number;\n  }\n\n  /**\n   * The <Tspan /> element defines a subtext within a <Text /> element or another <Tspan /> element.\n   * It allows for adjustment of the style and/or position of that subtext as needed.\n   */\n  export class Tspan extends React.Component<\n    React.PropsWithChildren<TspanProps>\n  > {}\n\n  interface GProps extends SVGPresentationAttributes {\n    style?: Style;\n  }\n\n  /**\n   * The <G /> SVG element is a container used to group other SVG elements.\n   * Transformations applied to the <G /> element are performed on its child elements, and its attributes are inherited by its children.\n   */\n  export class G extends React.Component<React.PropsWithChildren<GProps>> {}\n\n  interface StopProps {\n    offset: string | number;\n    stopColor: string;\n    stopOpacity?: string | number;\n  }\n\n  /**\n   * The SVG <Stop /> element defines a color and its position to use on a gradient. This element is always a child of a <LinearGradient /> or <RadialGradient /> element\n   */\n  export class Stop extends React.Component<\n    React.PropsWithChildren<StopProps>\n  > {}\n\n  // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n  interface DefsProps {}\n\n  /**\n   * The <Defs /> element is used to store graphical objects that will be used at a later time. Objects created inside a <Defs /> element are not rendered directly. To display them you have to reference them\n   */\n  export class Defs extends React.Component<\n    React.PropsWithChildren<DefsProps>\n  > {}\n\n  interface ClipPathProps {\n    id?: string;\n  }\n\n  /**\n   * The <ClipPath /> SVG element defines a clipping path, to be used by the clipPath property.\n   * A clipping path restricts the region to which paint can be applied. Conceptually, parts of the drawing that lie outside of the region bounded by the clipping path are not drawn.\n   */\n  export class ClipPath extends React.Component<\n    React.PropsWithChildren<ClipPathProps>\n  > {}\n\n  interface LinearGradientProps {\n    id: string;\n    x1?: string | number;\n    x2?: string | number;\n    y1?: string | number;\n    y2?: string | number;\n    xlinkHref?: string;\n    gradientTransform?: string;\n    gradientUnits?: 'userSpaceOnUse' | 'objectBoundingBox';\n  }\n\n  /**\n   * The <LinearGradient /> element lets authors define linear gradients that can be applied to fill or stroke of graphical elements.\n   */\n  export class LinearGradient extends React.Component<\n    React.PropsWithChildren<LinearGradientProps>\n  > {}\n\n  interface RadialGradientProps {\n    id: string;\n    cx?: string | number;\n    cy?: string | number;\n    r?: string | number;\n    fx?: string | number;\n    fy?: string | number;\n    xlinkHref?: string;\n    gradientTransform?: string;\n    gradientUnits?: 'userSpaceOnUse' | 'objectBoundingBox';\n  }\n\n  /**\n   * The <RadialGradient /> element lets authors define radial gradients that can be applied to fill or stroke of graphical elements.\n   */\n  export class RadialGradient extends React.Component<\n    React.PropsWithChildren<RadialGradientProps>\n  > {}\n\n  interface BlobProviderParams {\n    blob: Blob | null;\n    url: string | null;\n    loading: boolean;\n    error: Error | null;\n  }\n  interface BlobProviderProps {\n    document: React.ReactElement<DocumentProps>;\n    children: (params: BlobProviderParams) => React.ReactNode;\n  }\n\n  /**\n   * Easy and declarative way of getting document's blob data without\n   * showing it on screen.\n   * @see https://react-pdf.org/advanced#on-the-fly-rendering\n   * @platform web\n   */\n  export class BlobProvider extends React.Component<BlobProviderProps> {}\n\n  interface PDFViewerProps {\n    width?: number | string;\n    height?: number | string;\n    style?: Style | Style[];\n    className?: string;\n    children?: React.ReactElement<DocumentProps>;\n    innerRef?: React.Ref<HTMLIFrameElement>;\n    showToolbar?: boolean;\n  }\n\n  /**\n   * Iframe PDF viewer for client-side generated documents.\n   * @platform web\n   */\n  export class PDFViewer extends React.Component<PDFViewerProps> {}\n\n  interface PDFDownloadLinkProps\n    extends Omit<\n      React.AnchorHTMLAttributes<HTMLAnchorElement>,\n      'href' | 'children'\n    > {\n    /** PDF filename. Alias for anchor tag `download` attribute. */\n    fileName?: string;\n    document: React.ReactElement<DocumentProps>;\n    children?: React.ReactNode | React.FC<BlobProviderParams>;\n    onClick?: React.AnchorHTMLAttributes<HTMLAnchorElement>['onClick'] &\n      ((\n        event: React.MouseEvent<HTMLAnchorElement, MouseEvent>,\n        instance: UsePDFInstance,\n      ) => void);\n    ref?: React.Ref<HTMLAnchorElement> | undefined;\n  }\n\n  /**\n   * Anchor tag to enable generate and download PDF documents on the fly.\n   * @see https://react-pdf.org/advanced#on-the-fly-rendering\n   * @platform web\n   */\n  export class PDFDownloadLink extends React.Component<PDFDownloadLinkProps> {}\n\n  interface UsePDFInstance {\n    loading: boolean;\n    blob: Blob | null;\n    url: string | null;\n    error: string | null;\n  }\n\n  /**\n   * React hook for creating and updating a PDF document instance\n   * @platform web\n   */\n  export function usePDF(options?: {\n    document?: React.ReactElement<DocumentProps>;\n  }): [\n    UsePDFInstance,\n    (newDocument: React.ReactElement<DocumentProps>) => void,\n  ];\n\n  export const Font: FontStore;\n\n  export const StyleSheet: {\n    create: <T extends Styles>(styles: T) => T;\n  };\n\n  export const version: any;\n\n  export const PDFRenderer: any;\n\n  export const pdf: (initialValue?: React.ReactElement<DocumentProps>) => {\n    container: any;\n    isDirty: () => boolean;\n    toString: () => string;\n    toBlob: () => Promise<Blob>;\n    toBuffer: () => Promise<NodeJS.ReadableStream>;\n    on: (event: 'change', callback: () => void) => void;\n    updateContainer: (\n      document: React.ReactElement<any>,\n      callback?: () => void,\n    ) => void;\n    removeListener: (event: 'change', callback: () => void) => void;\n  };\n\n  export const renderToStream: (\n    document: React.ReactElement<DocumentProps>,\n  ) => Promise<NodeJS.ReadableStream>;\n\n  /**\n   * @deprecated use the `renderToBuffer` method\n   */\n  export const renderToString: (\n    document: React.ReactElement<DocumentProps>,\n  ) => Promise<string>;\n\n  export const renderToFile: (\n    document: React.ReactElement<DocumentProps>,\n    filePath: string,\n    callback?: (output: NodeJS.ReadableStream, _filePath: string) => any,\n  ) => Promise<NodeJS.ReadableStream>;\n\n  const render: typeof renderToFile;\n\n  /**\n   * Render document into a nodejs buffer\n   * @platform node\n   */\n  export const renderToBuffer: (\n    document: React.ReactElement<ReactPDF.DocumentProps>,\n  ) => Promise<Buffer>;\n}\n"
  },
  {
    "path": "packages/renderer/package.json",
    "content": "{\n  \"name\": \"@react-pdf/renderer\",\n  \"version\": \"4.3.2\",\n  \"license\": \"MIT\",\n  \"description\": \"Create PDF files on the browser and server\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"type\": \"module\",\n  \"main\": \"./lib/react-pdf.js\",\n  \"browser\": {\n    \"./lib/react-pdf.js\": \"./lib/react-pdf.browser.js\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/renderer\"\n  },\n  \"scripts\": {\n    \"build\": \"rimraf ./lib && rollup -c\",\n    \"watch\": \"rimraf ./lib && rollup -c -w\",\n    \"size\": \"size-limit\",\n    \"lint\": \"eslint src\",\n    \"test\": \"vitest && vitest --config vitest.browser.config.js\"\n  },\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.20.13\",\n    \"@react-pdf/fns\": \"3.1.2\",\n    \"@react-pdf/font\": \"^4.0.4\",\n    \"@react-pdf/layout\": \"^4.4.2\",\n    \"@react-pdf/pdfkit\": \"^4.1.0\",\n    \"@react-pdf/primitives\": \"^4.1.1\",\n    \"@react-pdf/reconciler\": \"^2.0.0\",\n    \"@react-pdf/render\": \"^4.3.2\",\n    \"@react-pdf/types\": \"^2.9.2\",\n    \"events\": \"^3.3.0\",\n    \"object-assign\": \"^4.1.1\",\n    \"prop-types\": \"^15.6.2\",\n    \"queue\": \"^6.0.1\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n  },\n  \"lint-staged\": {\n    \"*.js\": [\n      \"yarn lint\",\n      \"prettier --write\"\n    ]\n  },\n  \"files\": [\n    \"lib\",\n    \"index.d.ts\"\n  ],\n  \"collective\": {\n    \"type\": \"opencollective\",\n    \"url\": \"https://opencollective.com/react-pdf\",\n    \"logo\": \"https://opencollective.com/opencollective/logo.txt\"\n  },\n  \"devDependencies\": {\n    \"@size-limit/preset-big-lib\": \"^11.0.1\",\n    \"assert\": \"^2.0.0\",\n    \"browserify-zlib\": \"^0.2.0\",\n    \"buffer\": \"^6.0.3\",\n    \"process\": \"^0.11.10\",\n    \"size-limit\": \"^11.0.1\",\n    \"util\": \"^0.12.4\"\n  }\n}\n"
  },
  {
    "path": "packages/renderer/rollup.config.js",
    "content": "import json from '@rollup/plugin-json';\nimport babel from '@rollup/plugin-babel';\nimport nodeResolve from '@rollup/plugin-node-resolve';\nimport replace from '@rollup/plugin-replace';\nimport ignore from 'rollup-plugin-ignore';\nimport terser from '@rollup/plugin-terser';\nimport commonjs from '@rollup/plugin-commonjs';\nimport copy from 'rollup-plugin-copy';\n\nimport pkg from './package.json' with { type: 'json' };\n\nconst nodeInput = './src/node/index.js';\nconst domInput = './src/dom/index.js';\n\nconst babelConfig = () => ({\n  babelrc: true,\n  exclude: 'node_modules/**',\n  babelHelpers: 'runtime',\n  presets: [['@babel/preset-react', { runtime: 'automatic' }]],\n});\n\nconst getExternal = ({ browser }) => [\n  /@babel\\/runtime/,\n  'react/jsx-runtime',\n  ...(browser ? [] : ['fs', 'path', 'url']),\n  ...Object.keys(pkg.dependencies),\n  ...Object.keys(pkg.peerDependencies),\n];\n\nconst getPlugins = ({ browser, declarationDests, minify = false }) => [\n  json(),\n  ...(browser ? [ignore(['fs', 'path', 'url'])] : []),\n  babel(babelConfig()),\n  commonjs(),\n  nodeResolve({ browser, preferBuiltins: !browser }),\n  replace({\n    preventAssignment: true,\n    values: {\n      BROWSER: JSON.stringify(browser),\n    },\n  }),\n  copy({\n    targets: declarationDests.map((destPath) => {\n      const [dest, rename] = destPath.split('/');\n      return { src: 'index.d.ts', dest, rename };\n    }),\n  }),\n  ...(minify ? [terser()] : []),\n];\n\nconst serverConfig = {\n  input: nodeInput,\n  output: { file: 'lib/react-pdf.js', format: 'es', sourcemap: true },\n  external: getExternal({ browser: false }),\n  plugins: getPlugins({\n    browser: false,\n    declarationDests: ['lib/react-pdf.d.ts', 'lib/react-pdf.d.cts'],\n  }),\n};\n\nconst serverProdConfig = {\n  input: nodeInput,\n  output: { file: 'lib/react-pdf.min.js', sourcemap: false, format: 'es' },\n  external: getExternal({ browser: false }),\n  plugins: getPlugins({\n    browser: false,\n    declarationDests: ['lib/react-pdf.min.d.ts', 'lib/react-pdf.min.d.cts'],\n    minify: true,\n  }),\n};\n\nconst browserConfig = {\n  input: domInput,\n  output: { file: 'lib/react-pdf.browser.js', format: 'es', sourcemap: true },\n  external: getExternal({ browser: true }),\n  plugins: getPlugins({\n    browser: true,\n    declarationDests: [\n      'lib/react-pdf.browser.d.ts',\n      'lib/react-pdf.browser.d.cts',\n    ],\n  }),\n};\n\nconst browserProdConfig = {\n  input: domInput,\n  output: { file: 'lib/react-pdf.browser.min.js', format: 'es' },\n  external: getExternal({ browser: true }),\n  plugins: getPlugins({\n    browser: true,\n    declarationDests: [\n      'lib/react-pdf.browser.min.d.ts',\n      'lib/react-pdf.browser.min.d.cts',\n    ],\n    minify: true,\n  }),\n};\n\nexport default [\n  serverConfig,\n  serverProdConfig,\n  browserConfig,\n  browserProdConfig,\n];\n"
  },
  {
    "path": "packages/renderer/src/dom/BlobProvider.js",
    "content": "import { useEffect } from 'react';\n\nimport usePDF from './usePDF';\n\nexport const BlobProvider = ({ document: doc, children }) => {\n  const [instance, updateInstance] = usePDF();\n\n  useEffect(() => updateInstance(doc), [doc]);\n\n  if (!doc) {\n    console.warn('You should pass a valid document to BlobProvider');\n    return null;\n  }\n\n  return children(instance);\n};\n\nexport default BlobProvider;\n"
  },
  {
    "path": "packages/renderer/src/dom/PDFDownloadLink.js",
    "content": "import { forwardRef, useEffect } from 'react';\n\nimport usePDF from './usePDF';\n\nconst PDFDownloadLinkBase = (\n  {\n    fileName = 'document.pdf',\n    document: doc,\n    children,\n    onClick,\n    href,\n    ...rest\n  },\n  ref,\n) => {\n  const [instance, updateInstance] = usePDF();\n\n  useEffect(() => updateInstance(doc), [doc]);\n\n  if (!doc) {\n    console.warn('You should pass a valid document to PDFDownloadLink');\n    return null;\n  }\n\n  const handleDownloadIE = () => {\n    if (instance && window.navigator.msSaveBlob) {\n      // IE\n      window.navigator.msSaveBlob(instance.blob, fileName);\n    }\n  };\n\n  const handleClick = (event) => {\n    handleDownloadIE();\n    if (typeof onClick === 'function') onClick(event, instance);\n  };\n\n  return (\n    <a\n      href={instance.url}\n      download={fileName}\n      onClick={handleClick}\n      ref={ref}\n      {...rest}\n    >\n      {typeof children === 'function' ? children(instance) : children}\n    </a>\n  );\n};\n\nexport const PDFDownloadLink = forwardRef(PDFDownloadLinkBase);\n\nexport default PDFDownloadLink;\n"
  },
  {
    "path": "packages/renderer/src/dom/PDFViewer.js",
    "content": "import { useEffect } from 'react';\n\nimport usePDF from './usePDF';\n\nexport const PDFViewer = ({\n  title,\n  style,\n  className,\n  children,\n  innerRef,\n  showToolbar = true,\n  ...props\n}) => {\n  const [instance, updateInstance] = usePDF();\n\n  useEffect(() => updateInstance(children), [children]);\n\n  const src = instance.url\n    ? `${instance.url}#toolbar=${showToolbar ? 1 : 0}`\n    : null;\n\n  return (\n    <iframe\n      src={src}\n      title={title}\n      ref={innerRef}\n      style={style}\n      className={className}\n      {...props}\n    />\n  );\n};\n\nexport default PDFViewer;\n"
  },
  {
    "path": "packages/renderer/src/dom/index.js",
    "content": "import * as primitives from '@react-pdf/primitives';\n\nimport usePDF from './usePDF';\nimport PDFViewer from './PDFViewer';\nimport BlobProvider from './BlobProvider';\nimport PDFDownloadLink from './PDFDownloadLink';\nimport { pdf, version, Font, StyleSheet } from '../index';\n\nconst throwEnvironmentError = (name) => {\n  throw new Error(\n    `${name} is a Node specific API. You're either using this method in a browser, or your bundler is not loading react-pdf from the appropriate web build.`,\n  );\n};\n\nexport const renderToStream = () => {\n  throwEnvironmentError('renderToStream');\n};\n\nexport const renderToBuffer = () => {\n  throwEnvironmentError('renderToBuffer');\n};\n\nexport const renderToString = () => {\n  throwEnvironmentError('renderToString');\n};\n\nexport const renderToFile = () => {\n  throwEnvironmentError('renderToFile');\n};\n\nexport const render = () => {\n  throwEnvironmentError('render');\n};\n\nexport * from '../index';\n\nexport * from './usePDF';\n\nexport * from './PDFViewer';\n\nexport * from './BlobProvider';\n\nexport * from './PDFDownloadLink';\n\nexport * from '@react-pdf/primitives';\n\n// TODO: remove this default export in next major release because it breaks tree-shacking\nexport default {\n  pdf,\n  usePDF,\n  Font,\n  version,\n  StyleSheet,\n  PDFViewer,\n  BlobProvider,\n  PDFDownloadLink,\n  renderToStream,\n  renderToString,\n  renderToFile,\n  render,\n  ...primitives,\n};\n"
  },
  {
    "path": "packages/renderer/src/dom/usePDF.js",
    "content": "import queue from 'queue';\nimport { useState, useRef, useEffect, useCallback } from 'react';\n\nimport { pdf } from '../index';\n\n/**\n * PDF hook\n *\n * @param {Object} [options] hook options\n * @returns {[Object, Function]} pdf state and update function\n */\nexport const usePDF = ({ document } = {}) => {\n  const pdfInstance = useRef(null);\n\n  const [state, setState] = useState({\n    url: null,\n    blob: null,\n    error: null,\n    loading: !!document,\n  });\n\n  // Setup rendering queue\n  useEffect(() => {\n    const renderQueue = queue({ autostart: true, concurrency: 1 });\n\n    const queueDocumentRender = () => {\n      setState((prev) => ({ ...prev, loading: true }));\n\n      renderQueue.splice(0, renderQueue.length, () =>\n        state.error ? Promise.resolve() : pdfInstance.current.toBlob(),\n      );\n    };\n\n    const onRenderFailed = (error) => {\n      console.error(error);\n      setState((prev) => ({ ...prev, loading: false, error }));\n    };\n\n    const onRenderSuccessful = (blob) => {\n      setState({\n        blob,\n        error: null,\n        loading: false,\n        url: URL.createObjectURL(blob),\n      });\n    };\n\n    pdfInstance.current = pdf();\n    pdfInstance.current.on('change', queueDocumentRender);\n    if (document) {\n      pdfInstance.current.updateContainer(document);\n    }\n\n    renderQueue.on('error', onRenderFailed);\n    renderQueue.on('success', onRenderSuccessful);\n\n    return () => {\n      renderQueue.end();\n      pdfInstance.current.removeListener('change', queueDocumentRender);\n    };\n  }, []);\n\n  // Revoke old unused url instances\n  useEffect(() => {\n    return () => {\n      if (state.url) {\n        URL.revokeObjectURL(state.url);\n      }\n    };\n  }, [state.url]);\n\n  const update = useCallback((newDoc) => {\n    pdfInstance.current.updateContainer(newDoc);\n  }, []);\n\n  return [state, update];\n};\n\nexport default usePDF;\n"
  },
  {
    "path": "packages/renderer/src/index.js",
    "content": "import FontStore from '@react-pdf/font';\nimport renderPDF from '@react-pdf/render';\nimport PDFDocument from '@react-pdf/pdfkit';\nimport layoutDocument from '@react-pdf/layout';\nimport { upperFirst } from '@react-pdf/fns';\n\nimport { omitNils } from './utils';\nimport createRenderer from './renderer';\nimport packageJson from '../package.json';\n\nconst { version } = packageJson;\n\nconst fontStore = new FontStore();\n\n// We must keep a single renderer instance, otherwise React will complain\nlet renderer;\n\n// The pdf instance acts as an event emitter for DOM usage.\n// We only want to trigger an update when PDF content changes\nconst events = {};\n\nconst pdf = (initialValue) => {\n  const onChange = () => {\n    const listeners = events.change?.slice() || [];\n    for (let i = 0; i < listeners.length; i += 1) listeners[i]();\n  };\n\n  const container = { type: 'ROOT', document: null };\n  renderer = renderer || createRenderer({ onChange });\n  const mountNode = renderer.createContainer(container);\n\n  const updateContainer = (doc, callback) => {\n    renderer.updateContainer(doc, mountNode, null, callback);\n  };\n\n  if (initialValue) updateContainer(initialValue);\n\n  const render = async (compress = true) => {\n    const props = container.document.props || {};\n    const {\n      pdfVersion,\n      language,\n      pageLayout,\n      pageMode,\n      title,\n      author,\n      subject,\n      keyboards,\n      creator = 'react-pdf',\n      producer = 'react-pdf',\n      creationDate = new Date(),\n      modificationDate,\n    } = props;\n\n    const ctx = new PDFDocument({\n      compress,\n      pdfVersion,\n      lang: language,\n      displayTitle: true,\n      autoFirstPage: false,\n      info: omitNils({\n        Title: title,\n        Author: author,\n        Subject: subject,\n        Keywords: keyboards,\n        Creator: creator,\n        Producer: producer,\n        CreationDate: creationDate,\n        ModificationDate: modificationDate,\n      }),\n    });\n\n    if (pageLayout) {\n      ctx._root.data.PageLayout = upperFirst(pageLayout);\n    }\n\n    if (pageMode) {\n      ctx._root.data.PageMode = upperFirst(pageMode);\n    }\n\n    const layout = await layoutDocument(container.document, fontStore);\n    const fileStream = renderPDF(ctx, layout);\n    return { layout, fileStream };\n  };\n\n  const callOnRender = (params = {}) => {\n    if (container.document.props.onRender) {\n      container.document.props.onRender(params);\n    }\n  };\n\n  const toBlob = async () => {\n    const chunks = [];\n    const { layout: _INTERNAL__LAYOUT__DATA_, fileStream: instance } =\n      await render();\n\n    return new Promise((resolve, reject) => {\n      instance.on('data', (chunk) => {\n        chunks.push(\n          chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk),\n        );\n      });\n\n      instance.on('end', () => {\n        try {\n          const blob = new Blob(chunks, { type: 'application/pdf' });\n          callOnRender({ blob, _INTERNAL__LAYOUT__DATA_ });\n          resolve(blob);\n        } catch (error) {\n          reject(error);\n        }\n      });\n    });\n  };\n\n  // TODO: rename this method to `toStream` in next major release, because it return stream not a buffer\n  const toBuffer = async () => {\n    const { layout: _INTERNAL__LAYOUT__DATA_, fileStream } = await render();\n    callOnRender({ _INTERNAL__LAYOUT__DATA_ });\n\n    return fileStream;\n  };\n\n  /*\n   * TODO: remove this method in next major release. it is buggy\n   * see\n   * - https://github.com/diegomura/react-pdf/issues/2112\n   * - https://github.com/diegomura/react-pdf/issues/2095\n   */\n  const toString = async () => {\n    if (process.env.NODE_ENV === 'development') {\n      console.warn(\n        '`toString` is deprecated and will be removed in next major release',\n      );\n    }\n\n    let result = '';\n    const { fileStream: instance } = await render(false); // For some reason, when rendering to string if compress=true the document is blank\n\n    return new Promise((resolve, reject) => {\n      try {\n        instance.on('data', (buffer) => {\n          result += buffer;\n        });\n\n        instance.on('end', () => {\n          callOnRender();\n          resolve(result);\n        });\n      } catch (error) {\n        reject(error);\n      }\n    });\n  };\n\n  const on = (event, listener) => {\n    if (!events[event]) events[event] = [];\n    events[event].push(listener);\n  };\n\n  const removeListener = (event, listener) => {\n    if (!events[event]) return;\n    const idx = events[event].indexOf(listener);\n    if (idx > -1) events[event].splice(idx, 1);\n  };\n\n  return {\n    on,\n    container,\n    toBlob,\n    toBuffer,\n    toString,\n    removeListener,\n    updateContainer,\n  };\n};\n\nconst Font = fontStore;\n\nconst StyleSheet = {\n  create: (s) => s,\n};\n\nexport { version, Font, StyleSheet, pdf, createRenderer };\n"
  },
  {
    "path": "packages/renderer/src/node/index.js",
    "content": "import * as primitives from '@react-pdf/primitives';\n\nimport { renderToFile, renderToStream, renderToString } from './renderTo';\nimport { pdf, version, Font, StyleSheet } from '../index';\n\nconst throwEnvironmentError = (name) => {\n  throw new Error(\n    `${name} is a web specific API. You're either using this component on Node, or your bundler is not loading react-pdf from the appropriate web build.`,\n  );\n};\n\nexport const usePDF = () => {\n  throwEnvironmentError('usePDF');\n};\n\nexport const PDFViewer = () => {\n  throwEnvironmentError('PDFViewer');\n};\n\nexport const PDFDownloadLink = () => {\n  throwEnvironmentError('PDFDownloadLink');\n};\n\nexport const BlobProvider = () => {\n  throwEnvironmentError('BlobProvider');\n};\n\nexport const render = renderToFile;\n\nexport * from '../index';\n\nexport * from './renderTo';\n\nexport * from '@react-pdf/primitives';\n\n// TODO: remove this default export in next major release because it breaks tree-shacking\nexport default {\n  pdf,\n  Font,\n  version,\n  StyleSheet,\n  usePDF,\n  PDFViewer,\n  BlobProvider,\n  PDFDownloadLink,\n  renderToStream,\n  renderToString,\n  renderToFile,\n  render,\n  ...primitives,\n};\n"
  },
  {
    "path": "packages/renderer/src/node/renderTo.js",
    "content": "import fs from 'fs';\nimport { Buffer } from 'buffer';\n\nimport { pdf } from '../index';\n\n/**\n * @param {React.ReactElement} element\n * @returns {Promise<NodeJS.ReadableStream>}\n */\nexport const renderToStream = async (element) => {\n  const instance = pdf(element);\n  const stream = await instance.toBuffer();\n  return stream;\n};\n\n/**\n * @param {React.ReactElement} element\n * @param {string} filePath\n * @param {Function} [callback]\n */\nexport const renderToFile = async (element, filePath, callback) => {\n  const output = await renderToStream(element);\n  const stream = fs.createWriteStream(filePath);\n\n  output.pipe(stream);\n\n  return new Promise((resolve, reject) => {\n    stream.on('finish', () => {\n      if (callback) callback(output, filePath);\n      resolve(output);\n    });\n    stream.on('error', reject);\n  });\n};\n\n/**\n * @param {React.ReactElement} element\n * @returns {Promise<Buffer>}\n */\nexport const renderToBuffer = (element) =>\n  renderToStream(element).then(\n    (stream) =>\n      new Promise((resolve, reject) => {\n        const chunks = [];\n        stream.on('data', (chunk) => chunks.push(chunk));\n        stream.on('end', () => resolve(Buffer.concat(chunks)));\n        stream.on('error', (error) => reject(error));\n      }),\n  );\n\nexport const renderToString = (element) => {\n  if (process.env.NODE_ENV === 'development') {\n    console.warn(\n      '`renderToString` is deprecated and will be removed in next major release, use `renderToBuffer` instead',\n    );\n  }\n\n  return renderToBuffer(element).then((buffer) => buffer.toString());\n};\n"
  },
  {
    "path": "packages/renderer/src/renderer.js",
    "content": "import Reconciler from '@react-pdf/reconciler';\n\nconst createInstance = (type, { style, children, ...props }) => ({\n  type,\n  box: {},\n  style: style || {},\n  props: props || {},\n  children: [],\n});\n\nconst createTextInstance = (text) => ({ type: 'TEXT_INSTANCE', value: text });\n\nconst appendChild = (parent, child) => {\n  const isParentText =\n    parent.type === 'TEXT' ||\n    parent.type === 'LINK' ||\n    parent.type === 'TSPAN' ||\n    parent.type === 'NOTE';\n\n  const isChildTextInstance = child.type === 'TEXT_INSTANCE';\n  const isOrphanTextInstance = isChildTextInstance && !isParentText;\n\n  // Ignore orphan text instances.\n  // Caused by cases such as <>{name && <Text>{name}</Text>}</>\n  if (isOrphanTextInstance) {\n    console.warn(\n      `Invalid '${child.value}' string child outside <Text> component`,\n    );\n    return;\n  }\n\n  parent.children.push(child);\n};\n\nconst appendChildToContainer = (parentInstance, child) => {\n  if (parentInstance.type === 'ROOT') {\n    parentInstance.document = child;\n  } else {\n    appendChild(parentInstance, child);\n  }\n};\n\nconst insertBefore = (parentInstance, child, beforeChild) => {\n  const index = parentInstance.children?.indexOf(beforeChild);\n\n  if (index === undefined) return;\n\n  if (index !== -1 && child) parentInstance.children.splice(index, 0, child);\n};\n\nconst removeChild = (parentInstance, child) => {\n  const index = parentInstance.children?.indexOf(child);\n\n  if (index === undefined) return;\n\n  if (index !== -1) parentInstance.children.splice(index, 1);\n};\n\nconst removeChildFromContainer = (parentInstance, child) => {\n  const index = parentInstance.children?.indexOf(child);\n\n  if (index === undefined) return;\n\n  if (index !== -1) parentInstance.children.splice(index, 1);\n};\n\nconst commitTextUpdate = (textInstance, oldText, newText) => {\n  textInstance.value = newText;\n};\n\nconst commitUpdate = (instance, updatePayload, type, oldProps, newProps) => {\n  const { style, ...props } = newProps;\n  instance.props = props;\n  instance.style = style;\n};\n\nconst createRenderer = ({ onChange = () => {} }) =>\n  Reconciler({\n    appendChild,\n    appendChildToContainer,\n    commitTextUpdate,\n    commitUpdate,\n    createInstance,\n    createTextInstance,\n    insertBefore,\n    removeChild,\n    removeChildFromContainer,\n    resetAfterCommit: onChange,\n  });\n\nexport default createRenderer;\n"
  },
  {
    "path": "packages/renderer/src/utils.js",
    "content": "export const omitNils = (object) =>\n  Object.fromEntries(\n    Object.entries(object).filter(([, value]) => value !== undefined),\n  );\n"
  },
  {
    "path": "packages/renderer/tests/components.test.jsx",
    "content": "// Note that this file is ran using a separate Vitest configuration\nimport { describe, expect, it, vi } from 'vitest';\nimport { render, waitFor, screen } from '@testing-library/react';\nimport {\n  BlobProvider,\n  PDFViewer,\n  PDFDownloadLink,\n  Document,\n  Page,\n  Text,\n} from '@react-pdf/renderer';\n\nconst TestDocument = ({ title = 'Default' }) => (\n  <Document title={title}>\n    <Page>\n      <Text>Hello tests</Text>\n    </Page>\n  </Document>\n);\n\ndescribe('BlobProvider', () => {\n  it('calls render function', async () => {\n    const renderFunction = vi.fn();\n\n    render(\n      <BlobProvider document={<TestDocument />}>{renderFunction}</BlobProvider>,\n    );\n\n    await waitFor(() => expect(renderFunction).toBeCalledTimes(3));\n\n    expect(renderFunction).toHaveBeenCalledWith(\n      expect.objectContaining({\n        blob: expect.anything(),\n        url: expect.anything(),\n        error: null,\n        loading: false,\n      }),\n    );\n  });\n\n  it('renders iframe', async () => {\n    const { container } = render(\n      <PDFViewer>\n        <TestDocument />\n      </PDFViewer>,\n    );\n\n    await waitFor(() => expect(container.querySelector('iframe')).toBeTruthy());\n  });\n});\n\ndescribe('PDFDownloadLink', () => {\n  it('works', async () => {\n    render(<PDFDownloadLink document={<TestDocument />}>test</PDFDownloadLink>);\n\n    const link = await screen.findByText('test');\n    expect(link.getAttribute('download')).toBe('document.pdf');\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/debug.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { Document, Page, View, Text, Font } from '@react-pdf/renderer';\nimport renderToImage from './renderComponent';\n\n// pdf.js does not render default fonts in node and I use Open Sans (:\nFont.register({\n  family: 'Open Sans',\n  src: 'https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVZ0e.ttf',\n});\n\ndescribe('debug', () => {\n  test('should show size of Text component', async () => {\n    const image = await renderToImage(\n      <Document style={{ fontFamily: 'Open Sans' }}>\n        <Page size={[50, 25]}>\n          <Text debug>hello</Text>\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should show paddings and margins', async () => {\n    const image = await renderToImage(\n      <Document style={{ fontFamily: 'Open Sans' }}>\n        <Page size={[110, 65]}>\n          <View style={{ flexDirection: 'row' }}>\n            <Text style={{ margin: 20 }} debug>\n              a\n            </Text>\n            <Text style={{ padding: 20 }} debug>\n              b\n            </Text>\n            <Text debug>c</Text>\n          </View>\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should show origin pointer', async () => {\n    const image = await renderToImage(\n      <Document style={{ fontFamily: 'Open Sans' }}>\n        <Page size={[50, 25]}>\n          <Text style={{ transformOrigin: 'top left' }} debug>\n            hello\n          </Text>\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should not render debug if false passed', async () => {\n    const image = await renderToImage(\n      <Document style={{ fontFamily: 'Open Sans' }}>\n        <Page size={[50, 25]}>\n          <Text debug={false}>hello</Text>\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should not render debug if undefined passed', async () => {\n    const image = await renderToImage(\n      <Document style={{ fontFamily: 'Open Sans' }}>\n        <Page size={[50, 25]}>\n          <Text debug={undefined}>hello</Text>\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/dom.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport ReactPDF from '@react-pdf/renderer';\n\ndescribe('dom', () => {\n  test('should export font store', () => {\n    expect(ReactPDF.Font).toBeTruthy();\n  });\n\n  test('should export styleSheet', () => {\n    expect(ReactPDF.StyleSheet).toBeTruthy();\n  });\n\n  test('should export version info', () => {\n    expect(ReactPDF.version).toBeTruthy();\n  });\n\n  test('should throw error when trying to use renderToString', () => {\n    expect(() => ReactPDF.renderToString()).toThrow();\n  });\n\n  test('should throw error when trying to use renderToStream', () => {\n    expect(() => ReactPDF.renderToStream()).toThrow();\n  });\n\n  test('should throw error when trying to use renderToFile', () => {\n    expect(() => ReactPDF.renderToFile()).toThrow();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/emoji.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { Document, Page, Text, Font } from '@react-pdf/renderer';\nimport renderToImage from './renderComponent';\n\ndescribe('emoji', () => {\n  test('should support builder function', async () => {\n    Font.registerEmojiSource({\n      builder: (code) =>\n        `https://cdn.jsdelivr.net/gh/shuding/fluentui-emoji-unicode/assets/${code.toLowerCase()}_3d.png`,\n    });\n\n    const image = await renderToImage(\n      <Document>\n        <Page size={[100, 100]}>\n          <Text style={{ fontSize: 80 }}>💩</Text>\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should support Unicode 13.0 emoji', async () => {\n    Font.registerEmojiSource({\n      format: 'png',\n      url: 'https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/72x72/',\n    });\n\n    const image = await renderToImage(\n      <Document>\n        <Page size={[100, 100]}>\n          <Text style={{ fontSize: 80 }}>🦫</Text>\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/environment/jsdom.js",
    "content": "import { builtinEnvironments } from 'vitest/environments';\n\nfunction patchGlobals() {\n  if (typeof global.TextEncoder === 'undefined') {\n    global.TextEncoder = TextEncoder;\n    global.TextDecoder = TextDecoder;\n  }\n\n  if (typeof global.TextDecoder === 'undefined') {\n    global.TextDecoder = TextDecoder;\n  }\n\n  if (typeof global.URL.createObjectURL === 'undefined') {\n    global.URL.createObjectURL = (blob) => `[Blob - ${blob.size}]`;\n  }\n\n  if (typeof global.URL.revokeObjectURL === 'undefined') {\n    global.URL.revokeObjectURL = () => undefined;\n  }\n}\n\nexport default {\n  name: 'jsdom',\n  transformMode: 'web',\n  async setupVM({ jsdom = {} }) {\n    const superSetup = builtinEnvironments.jsdom.setupVM;\n\n    const result = await superSetup({ jsdom });\n\n    patchGlobals();\n\n    return result;\n  },\n  async setup(global, { jsdom = {} }) {\n    const superSetup = builtinEnvironments.jsdom.setup;\n\n    const result = await superSetup(global, { jsdom });\n\n    patchGlobals();\n\n    return result;\n  },\n};\n"
  },
  {
    "path": "packages/renderer/tests/flex.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { Document, Page, View } from '@react-pdf/renderer';\nimport renderToImage from './renderComponent';\n\nconst mount = async (children) => {\n  const image = await renderToImage(\n    <Document>\n      <Page style={{ backgroundColor: '#e2e2e2' }} size={[100, 25]}>\n        {children}\n      </Page>\n    </Document>,\n  );\n\n  return image;\n};\n\ndescribe('flex shorthand', () => {\n  test('should support auto', async () => {\n    const image = await mount(\n      <View style={{ flexDirection: 'row', gap: 2 }}>\n        <View style={{ height: 20, width: 20, backgroundColor: 'red' }} />\n        <View\n          style={{\n            height: 20,\n            width: 20,\n            flex: 'auto',\n            backgroundColor: 'red',\n          }}\n        />\n      </View>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should support flex-basis auto', async () => {\n    const image = await mount(\n      <View style={{ flexDirection: 'row', gap: 2 }}>\n        <View\n          style={{\n            height: 20,\n            width: 20,\n            flex: '1 0 auto',\n            backgroundColor: 'red',\n          }}\n        />\n        <View\n          style={{\n            height: 20,\n            width: 20,\n            flex: '1 0 auto',\n            backgroundColor: 'red',\n          }}\n        />\n      </View>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should do not grow on default', async () => {\n    const image = await mount(\n      <View style={{ flexDirection: 'row', gap: 2 }}>\n        <View\n          style={{\n            height: 20,\n            width: 20,\n            flexBasis: 20,\n            backgroundColor: 'red',\n          }}\n        />\n        <View\n          style={{\n            height: 20,\n            width: 20,\n            flexBasis: 20,\n            backgroundColor: 'red',\n          }}\n        />\n      </View>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should shrink on default', async () => {\n    const image = await mount(\n      <View style={{ flexDirection: 'row', gap: 2 }}>\n        <View\n          style={{\n            height: 20,\n            width: 20,\n            flexBasis: 60,\n            backgroundColor: 'red',\n          }}\n        />\n        <View\n          style={{\n            height: 20,\n            width: 20,\n            flexBasis: 60,\n            backgroundColor: 'red',\n          }}\n        />\n      </View>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/gap.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { Document, Page, View } from '@react-pdf/renderer';\nimport renderToImage from './renderComponent';\n\nconst mount = async (children) => {\n  const image = await renderToImage(\n    <Document>\n      <Page size={[100, 100]}>{children}</Page>\n    </Document>,\n  );\n\n  return image;\n};\n\nconst items = [\n  'red',\n  'red',\n  'red',\n  'green',\n  'green',\n  'green',\n  'blue',\n  'blue',\n  'blue',\n];\n\ndescribe('flex', () => {\n  test('should support gap', async () => {\n    const image = await mount(\n      <View\n        style={{\n          height: '100%',\n          width: '100%',\n          display: 'flex',\n          flexWrap: 'wrap',\n          backgroundColor: '#e2e2e2',\n          gap: 30,\n        }}\n      >\n        {items.map((color, index) => (\n          <View\n            key={index}\n            style={{\n              width: 10,\n              height: 10,\n              backgroundColor: color,\n            }}\n          />\n        ))}\n      </View>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should support percentage gap', async () => {\n    const image = await mount(\n      <View\n        style={{\n          height: '100%',\n          width: '100%',\n          display: 'flex',\n          flexWrap: 'wrap',\n          backgroundColor: '#e2e2e2',\n          gap: '15%',\n        }}\n      >\n        {items.map((color, index) => (\n          <View\n            key={index}\n            style={{\n              width: 10,\n              height: 10,\n              backgroundColor: color,\n            }}\n          />\n        ))}\n      </View>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should support rowGap and columnGap', async () => {\n    const image = await mount(\n      <View\n        style={{\n          height: '100%',\n          width: '100%',\n          display: 'flex',\n          flexWrap: 'wrap',\n          backgroundColor: '#e2e2e2',\n          rowGap: '60px',\n          columnGap: '80px',\n        }}\n      >\n        {items.slice(0, 4).map((color, index) => (\n          <View\n            key={index}\n            style={{\n              width: 10,\n              height: 10,\n              backgroundColor: color,\n            }}\n          />\n        ))}\n      </View>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should support percentage rowGap and columnGap', async () => {\n    const image = await mount(\n      <View\n        style={{\n          height: '100%',\n          width: '100%',\n          display: 'flex',\n          flexWrap: 'wrap',\n          backgroundColor: '#e2e2e2',\n          rowGap: '10%',\n          columnGap: '20%',\n        }}\n      >\n        {items.map((color, index) => (\n          <View\n            key={index}\n            style={{\n              width: 10,\n              height: 10,\n              backgroundColor: color,\n            }}\n          />\n        ))}\n      </View>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/images.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\nimport fs from 'fs';\nimport url from 'url';\nimport path from 'path';\nimport { Document, Page, View, Image } from '@react-pdf/renderer';\nimport renderToImage from './renderComponent';\n\nconst __dirname = path.dirname(url.fileURLToPath(import.meta.url));\n\nconst Orientation1 = fs.readFileSync(`${__dirname}/images/orientation-1.jpeg`);\nconst Orientation2 = fs.readFileSync(`${__dirname}/images/orientation-2.jpeg`);\nconst Orientation3 = fs.readFileSync(`${__dirname}/images/orientation-3.jpeg`);\nconst Orientation4 = fs.readFileSync(`${__dirname}/images/orientation-4.jpeg`);\nconst Orientation5 = fs.readFileSync(`${__dirname}/images/orientation-5.jpeg`);\nconst Orientation6 = fs.readFileSync(`${__dirname}/images/orientation-6.jpeg`);\nconst Orientation7 = fs.readFileSync(`${__dirname}/images/orientation-7.jpeg`);\nconst Orientation8 = fs.readFileSync(`${__dirname}/images/orientation-8.jpeg`);\n\nconst mount = async (children) => {\n  const image = await renderToImage(\n    <Document>\n      <Page>{children}</Page>\n    </Document>,\n  );\n\n  return image;\n};\n\ndescribe('Image', () => {\n  test('should render jpgs with different exif orientations', async () => {\n    const image = await mount(\n      <View style={{ flexDirection: 'row', flexWrap: 'wrap' }}>\n        <Image src={Orientation1} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation2} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation3} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation4} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation5} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation6} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation7} style={{ width: 220, margin: 5 }} />\n        <Image src={Orientation8} style={{ width: 220, margin: 5 }} />\n      </View>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/link.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { Document, Page, Link, Font, Text } from '@react-pdf/renderer';\nimport renderToImage from './renderComponent';\n\n// pdf.js does not render default fonts in node and I use Open Sans (:\nFont.register({\n  family: 'Open Sans',\n  src: 'https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVZ0e.ttf',\n});\n\nconst mount = async (children) => {\n  const image = await renderToImage(\n    <Document>\n      <Page size={[50, 25]}>{children}</Page>\n    </Document>,\n  );\n\n  return image;\n};\n\ndescribe('Link', () => {\n  test('should render text', async () => {\n    const image = await mount(\n      <Link\n        href=\"https://github.com/wojtekmaj/react-pdf\"\n        style={{ fontFamily: 'Open Sans' }}\n      >\n        hello\n      </Link>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should render TEXT component', async () => {\n    const image = await mount(\n      <Link\n        href=\"https://github.com/wojtekmaj/react-pdf\"\n        style={{ fontFamily: 'Open Sans', textDecoration: 'none' }}\n      >\n        he\n        <Text style={{ textDecoration: 'underline' }}>llo</Text>\n      </Link>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/namedDestinations.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { Document, Font, Link, Page, Text, View } from '@react-pdf/renderer';\nimport renderToImage from './renderComponent';\n\nFont.register({\n  family: 'Lato',\n  src: 'https://fonts.gstatic.com/s/lato/v16/S6uyw4BMUTPHjx4wWw.ttf',\n});\n\nconst Doc = () => (\n  <Document>\n    <Page\n      orientation=\"landscape\"\n      size=\"A4\"\n      style={{ padding: 30, fontSize: 24, fontFamily: 'Lato' }}\n    >\n      <View>\n        <Link href=\"#nameddestination\">\n          <Text>Click me to get to the named destination</Text>\n        </Link>\n      </View>\n      <View id=\"nameddestination\" break>\n        <Text>Here is the named destination</Text>\n      </View>\n    </Page>\n  </Document>\n);\n\ndescribe('named destinations', () => {\n  test('should visually match snapshot', async () => {\n    const image = await renderToImage(<Doc />);\n\n    expect(image).toMatchImageSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/node.test.jsx",
    "content": "import { describe, expect, test, vi } from 'vitest';\n\nimport fs from 'fs';\nimport path from 'path';\nimport url from 'url';\nimport ReactPDF from '../src/node';\n\nconst { Document, Page, View } = ReactPDF;\n\nconst __dirname = path.dirname(url.fileURLToPath(import.meta.url));\n\n/**\n * @param {Object} props\n */\nconst TestDocument = ({ onRender }) => {\n  return (\n    <Document onRender={onRender}>\n      <Page>\n        <View style={{ width: 20, height: 20, backgroundColor: 'red' }} />\n      </Page>\n    </Document>\n  );\n};\n\ndescribe('node', () => {\n  test('should render to string', async () => {\n    const document = await ReactPDF.renderToString(<TestDocument />);\n\n    expect(typeof document).toBe('string');\n    expect(document.indexOf('%PDF-1.3')).toBe(0);\n  });\n\n  test('should render to string call render callback', async () => {\n    const mock = vi.fn();\n\n    await ReactPDF.renderToString(<TestDocument onRender={mock} />);\n\n    expect(mock.mock.calls).toHaveLength(1);\n  });\n\n  test('should render to stream', async () => {\n    const document = await ReactPDF.renderToStream(<TestDocument />);\n\n    expect(typeof document).toBe('object');\n    expect(typeof document.pipe).toBe('function');\n  });\n\n  test('should render to stream call render callback', async () => {\n    const mock = vi.fn();\n\n    await ReactPDF.renderToStream(<TestDocument onRender={mock} />);\n\n    expect(mock.mock.calls).toHaveLength(1);\n  });\n\n  test('should render to file', async () => {\n    const pdfPath = `${__dirname}/test.pdf`;\n    await ReactPDF.renderToFile(<TestDocument />, pdfPath);\n\n    expect(fs.existsSync(pdfPath)).toBeTruthy();\n\n    fs.unlinkSync(pdfPath);\n  });\n\n  test('should export font store', () => {\n    expect(ReactPDF.Font).toBeTruthy();\n  });\n\n  test('should export styleSheet', () => {\n    expect(ReactPDF.StyleSheet).toBeTruthy();\n  });\n\n  test('should export version info', () => {\n    expect(ReactPDF.version).toBeTruthy();\n  });\n\n  test('should throw error when trying to use PDFViewer', () => {\n    expect(() => ReactPDF.PDFViewer()).toThrow();\n  });\n\n  test('should throw error when trying to use PDFDownloadLink', () => {\n    expect(() => ReactPDF.PDFDownloadLink()).toThrow();\n  });\n\n  test('should throw error when trying to use BlobProvider', () => {\n    expect(() => ReactPDF.BlobProvider()).toThrow();\n  });\n\n  test('should throw error when trying to use usePDF', () => {\n    expect(() => ReactPDF.usePDF()).toThrow();\n  });\n\n  test('should render a fragment', async () => {\n    const mock = vi.fn();\n\n    const doc = (\n      <Document onRender={mock}>\n        <Page>\n          <View>\n            <>\n              <View style={{ width: 20, height: 20, backgroundColor: 'red' }} />\n              <View style={{ width: 20, height: 20, backgroundColor: 'red' }} />\n            </>\n          </View>\n        </Page>\n      </Document>\n    );\n\n    await ReactPDF.renderToString(doc);\n\n    expect(mock.mock.calls).toHaveLength(1);\n  });\n\n  test('should render a fragment in render', async () => {\n    const renderMock = vi.fn().mockReturnValue(\n      <>\n        <View style={{ width: 20, height: 20, backgroundColor: 'red' }} />\n        <View style={{ width: 20, height: 20, backgroundColor: 'red' }} />\n      </>,\n    );\n\n    const doc = (\n      <Document>\n        <Page>\n          <View render={renderMock} />\n        </Page>\n      </Document>\n    );\n\n    await ReactPDF.renderToString(doc);\n\n    expect(renderMock.mock.calls).toHaveLength(2);\n  });\n\n  test('should render a child array', async () => {\n    const mock = vi.fn();\n\n    const children = [\n      <View\n        key=\"child1\"\n        style={{ width: 20, height: 20, backgroundColor: 'red' }}\n      />,\n      <View\n        key=\"child2\"\n        style={{ width: 20, height: 20, backgroundColor: 'red' }}\n      />,\n    ];\n\n    const doc = (\n      <Document onRender={mock}>\n        <Page>\n          <View>{children}</View>\n        </Page>\n      </Document>\n    );\n\n    await ReactPDF.renderToString(doc);\n\n    expect(mock.mock.calls).toHaveLength(1);\n  });\n\n  test('should render a child array in render', async () => {\n    const children = [\n      <View style={{ width: 20, height: 20, backgroundColor: 'red' }} />,\n      <View style={{ width: 20, height: 20, backgroundColor: 'red' }} />,\n    ];\n\n    const renderMock = vi.fn().mockReturnValue(children);\n\n    const doc = (\n      <Document>\n        <Page>\n          <View render={renderMock} />\n        </Page>\n      </Document>\n    );\n\n    await ReactPDF.renderToString(doc);\n\n    expect(renderMock.mock.calls).toHaveLength(2);\n  });\n\n  test('should render nested dynamic views', async () => {\n    const renderNode = (\n      <View\n        key=\"child1\"\n        style={{ width: 20, height: 20, backgroundColor: 'red' }}\n      />\n    );\n\n    const renderMock = vi.fn().mockReturnValue(renderNode);\n\n    const doc = (\n      <Document>\n        <Page>\n          <View render={renderMock} />\n          <View\n            render={() => {\n              return <View render={renderMock} />;\n            }}\n          />\n          <View\n            render={() => {\n              return (\n                <View\n                  render={() => {\n                    return <View render={renderMock} />;\n                  }}\n                />\n              );\n            }}\n          />\n        </Page>\n      </Document>\n    );\n\n    await ReactPDF.renderToString(doc);\n\n    expect(renderMock.mock.calls).toHaveLength(6);\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/orphanTexts.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { Text, Document, Page } from '@react-pdf/primitives';\nimport renderToImage from './renderComponent';\n\nconst emptyString = '';\n\nconst mount = async (children) => {\n  const image = await renderToImage(\n    <Document>\n      <Page size={[100, 100]}>{children}</Page>\n    </Document>,\n  );\n\n  return image;\n};\n\ndescribe('renderer', () => {\n  test('empty string', async () => {\n    const image = await mount(<>{emptyString && <Text>{emptyString}</Text>}</>);\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('string', async () => {\n    const image = await mount(<>{'text' || <Text>text</Text>}</>);\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('boolean', async () => {\n    const image = await mount(<>{true || <Text>text</Text>}</>);\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('zero', async () => {\n    const image = await mount(<>{0 && <Text>text</Text>}</>);\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('numbers', async () => {\n    const image = await mount(<>{10 || <Text>text</Text>}</>);\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('empty text element', async () => {\n    const image = await mount(<Text />);\n\n    expect(image).toMatchImageSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/pageWrap.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport {\n  Document,\n  Font,\n  Page,\n  Text,\n  Image,\n  StyleSheet,\n} from '@react-pdf/renderer';\nimport renderToImage from './renderComponent';\n\nconst styles = StyleSheet.create({\n  body: {\n    paddingTop: 35,\n    paddingBottom: 65,\n    paddingHorizontal: 35,\n  },\n  title: {\n    fontSize: 24,\n    textAlign: 'center',\n    fontFamily: 'Oswald',\n  },\n  author: {\n    fontSize: 12,\n    textAlign: 'center',\n    marginBottom: 40,\n  },\n  subtitle: {\n    fontSize: 18,\n    margin: 12,\n    fontFamily: 'Oswald',\n  },\n  text: {\n    fontFamily: 'Open Sans',\n    margin: 12,\n    fontSize: 14,\n    textAlign: 'justify',\n  },\n  image: {\n    marginVertical: 15,\n    marginHorizontal: 100,\n  },\n  header: {\n    fontFamily: 'Open Sans',\n    fontSize: 12,\n    marginBottom: 20,\n    textAlign: 'center',\n    color: 'grey',\n  },\n  pageNumber: {\n    fontFamily: 'Open Sans',\n    position: 'absolute',\n    fontSize: 12,\n    bottom: 30,\n    left: 0,\n    right: 0,\n    textAlign: 'center',\n    color: 'grey',\n  },\n});\n\nFont.register({\n  family: 'Oswald',\n  src: 'https://fonts.gstatic.com/s/oswald/v13/Y_TKV6o8WovbUd3m_X9aAA.ttf',\n});\n\nFont.register({\n  family: 'Open Sans',\n  src: 'https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVZ0e.ttf',\n});\n\nconst Subtitle = ({ children, ...props }) => (\n  <Text style={styles.subtitle} {...props}>\n    {children}\n  </Text>\n);\n\nconst PageWrap = () => (\n  <Document>\n    <Page style={styles.body} wrap>\n      <Text style={styles.header} fixed>\n        ~ Created with react-pdf ~\n      </Text>\n      <Text style={styles.title}>Don Quijote de la Mancha</Text>\n      <Text style={styles.author}>Miguel de Cervantes</Text>\n      <Image\n        style={styles.image}\n        src=\"https://react-pdf.org/images/quijote1.jpg\"\n      />\n      <Subtitle>\n        Capítulo I: Que trata de la condición y ejercicio del famoso hidalgo D.\n        Quijote de la Mancha\n      </Subtitle>\n      <Text style={styles.text}>\n        En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha\n        mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga\n        antigua, rocín flaco y galgo corredor. Una olla de algo más vaca que\n        carnero, salpicón las más noches, duelos y quebrantos los sábados,\n        lentejas los viernes, algún palomino de añadidura los domingos,\n        consumían las tres partes de su hacienda. El resto della concluían sayo\n        de velarte, calzas de velludo para las fiestas con sus pantuflos de lo\n        mismo, los días de entre semana se honraba con su vellori de lo más\n        fino. Tenía en su casa una ama que pasaba de los cuarenta, y una sobrina\n        que no llegaba a los veinte, y un mozo de campo y plaza, que así\n        ensillaba el rocín como tomaba la podadera. Frisaba la edad de nuestro\n        hidalgo con los cincuenta años, era de complexión recia, seco de carnes,\n        enjuto de rostro; gran madrugador y amigo de la caza. Quieren decir que\n        tenía el sobrenombre de Quijada o Quesada (que en esto hay alguna\n        diferencia en los autores que deste caso escriben), aunque por\n        conjeturas verosímiles se deja entender que se llama Quijana; pero esto\n        importa poco a nuestro cuento; basta que en la narración dél no se salga\n        un punto de la verdad.\n      </Text>\n      <Text style={styles.text}>\n        Es, pues, de saber, que este sobredicho hidalgo, los ratos que estaba\n        ocioso (que eran los más del año) se daba a leer libros de caballerías\n        con tanta afición y gusto, que olvidó casi de todo punto el ejercicio de\n        la caza, y aun la administración de su hacienda; y llegó a tanto su\n        curiosidad y desatino en esto, que vendió muchas hanegas de tierra de\n        sembradura, para comprar libros de caballerías en que leer; y así llevó\n        a su casa todos cuantos pudo haber dellos; y de todos ningunos le\n        parecían tan bien como los que compuso el famoso Feliciano de Silva:\n        porque la claridad de su prosa, y aquellas intrincadas razones suyas, le\n        parecían de perlas; y más cuando llegaba a leer aquellos requiebros y\n        cartas de desafío, donde en muchas partes hallaba escrito: la razón de\n        la sinrazón que a mi razón se hace, de tal manera mi razón enflaquece,\n        que con razón me quejo.\n      </Text>\n      <Text style={styles.text}>\n        Con estas y semejantes razones perdía el pobre caballero el juicio, y\n        desvelábase por entenderlas, y desentrañarles el sentido, que no se lo\n        sacara, ni las entendiera el mismo Aristóteles, si resucitara para sólo\n        ello. No estaba muy bien con las heridas que don Belianis daba y\n        recibía, porque se imaginaba que por grandes maestros que le hubiesen\n        curado, no dejaría de tener el rostro y todo el cuerpo lleno de\n        cicatrices y señales; pero con todo alababa en su autor aquel acabar su\n        libro con la promesa de aquella inacabable aventura, y muchas veces le\n        vino deseo de tomar la pluma, y darle fin al pie de la letra como allí\n        se promete; y sin duda alguna lo hiciera, y aun saliera con ello, si\n        otros mayores y continuos pensamientos no se lo estorbaran. Tuvo muchas\n        veces competencia con el cura de su lugar (que era hombre docto graduado\n        en Sigüenza), sobre cuál había sido mejor caballero, Palmerín de\n        Inglaterra o Amadís de Gaula; mas maese Nicolás, barbero del mismo\n        pueblo, decía que ninguno llegaba al caballero del Febo, y que si alguno\n        se le podía comparar, era don Galaor, hermano de Amadís de Gaula, porque\n        tenía muy acomodada condición para todo; que no era caballero\n        melindroso, ni tan llorón como su hermano, y que en lo de la valentía no\n        le iba en zaga.\n      </Text>\n      <Text style={styles.text}>\n        En resolución, él se enfrascó tanto en su lectura, que se le pasaban las\n        noches leyendo de claro en claro, y los días de turbio en turbio, y así,\n        del poco dormir y del mucho leer, se le secó el cerebro, de manera que\n        vino a perder el juicio. Llenósele la fantasía de todo aquello que leía\n        en los libros, así de encantamientos, como de pendencias, batallas,\n        desafíos, heridas, requiebros, amores, tormentas y disparates\n        imposibles, y asentósele de tal modo en la imaginación que era verdad\n        toda aquella máquina de aquellas soñadas invenciones que leía, que para\n        él no había otra historia más cierta en el mundo.\n      </Text>\n      <Subtitle break>\n        Capítulo II: Que trata de la primera salida que de su tierra hizo el\n        ingenioso Don Quijote\n      </Subtitle>\n      <Image\n        style={styles.image}\n        src=\"https://react-pdf.org/images/quijote2.png\"\n      />\n      <Text style={styles.text}>\n        Hechas, pues, estas prevenciones, no quiso aguardar más tiempo a poner\n        en efeto su pensamiento, apretándole a ello la falta que él pensaba que\n        hacía en el mundo su tardanza, según eran los agravios que pensaba\n        deshacer, tuertos que enderezar, sinrazones que emendar y abusos que\n        mejorar y deudas que satisfacer. Y así, sin dar parte a persona alguna\n        de su intención y sin que nadie le viese, una mañana, antes del día, que\n        era uno de los calurosos del mes de Julio, se armó de todas sus armas,\n        subió sobre Rocinante, puesta su mal compuesta celada, embrazó su\n        adarga, tomó su lanza y por la puerta falsa de un corral salió al campo\n        con grandísimo contento y alborozo de ver con cuánta facilidad había\n        dado principio a su buen deseo. Mas apenas se vio en el campo cuando le\n        asaltó un pensamiento terrible, y tal, que por poco le hiciera dejar la\n        comenzada empresa; y fue que le vino a la memoria que no era armado\n        caballero, y que, conforme a ley de caballería, ni podía ni debía tomar\n        armas con ningún caballero; y puesto que lo fuera, había de llevar armas\n        blancas, como novel caballero, sin empresa en el escudo, hasta que por\n        su esfuerzo la ganase. Estos pensamientos le hicieron titubear en su\n        propósito; mas pudiendo más su locura que otra razón alguna, propuso de\n        hacerse armar caballero del primero que topase, a imitación de otros\n        muchos que así lo hicieron, según él había leído en los libros que tal\n        le tenían. En lo de las armas blancas, pensaba limpiarlas de manera, en\n        teniendo lugar, que lo fuesen más que un arminio; y con esto se quietó y\n        prosiguió su camino, sin llevar otro que aquel que su caballo quería,\n        creyendo que en aquello consistía la fuerza de las aventuras\n      </Text>\n      <Text style={styles.text}>\n        Yendo, pues, caminando nuestro flamante aventurero, iba hablando consigo\n        mesmo, y diciendo: —¿Quién duda, sino que en los venideros tiempos,\n        cuando salga a luz la verdadera historia de mis famosos hechos, que el\n        sabio que los escribiere no ponga, cuando llegue a contar esta mi\n        primera salida tan de mañana, desta manera?: Apenas había el rubicundo\n        Apolo tendido por la faz de la ancha y espaciosa tierra las doradas\n        hebras de sus hermosos cabellos, y apenas los pequeños y pintados\n        pajarillos con sus arpadas lenguas habían saludado con dulce y meliflua\n        armonía la venida de la rosada Aurora, que, dejando la blanda cama del\n        celoso marido, por las puertas y balcones del manchego horizonte a los\n        mortales se mostraba, cuando el famoso caballero don Quijote de la\n        Mancha, dejando las ociosas plumas, subió sobre su famoso caballo\n        Rocinante y comenzó a caminar por el antiguo y conocido Campo de\n        Montiel.\n      </Text>\n      <Text style={styles.text}>\n        Y era la verdad que por él caminaba; y añadió diciendo: —Dichosa edad y\n        siglo dichoso aquel adonde saldrán a luz las famosas hazañas mías,\n        dignas de entallarse en bronces, esculpirse en mármoles y pintarse en\n        tablas, para memoria en lo futuro. ¡Oh tú, sabio encantador, quienquiera\n        que seas, a quien ha de tocar el ser coronista desta peregrina historia!\n        Ruégote que no te olvides de mi buen Rocinante, compañero eterno mío en\n        todos mis caminos y carreras.\n      </Text>\n      <Text style={styles.text}>\n        Luego volvía diciendo, como si verdaderamente fuera enamorado: —¡Oh\n        princesa Dulcinea, señora deste cautivo corazón! Mucho agravio me\n        habedes fecho en despedirme y reprocharme con el riguroso afincamiento\n        de mandarme no parecer ante la vuestra fermosura. Plégaos, señora, de\n        membraros deste vuestro sujeto corazón, que tantas cuitas por vuestro\n        amor padece. Con estos iba ensartando otros disparates, todos al modo de\n        los que sus libros le habían enseñado, imitando en cuanto podía su\n        lenguaje. Con esto caminaba tan despacio, y el sol entraba tan apriesa y\n        con tanto ardor, que fuera bastante a derretirle los sesos, si algunos\n        tuviera\n      </Text>\n      <Text style={styles.text}>\n        Casi todo aquel día caminó sin acontecerle cosa que de contar fuese, de\n        lo cual se desesperaba, porque quisiera topar luego luego con quien\n        hacer experiencia del valor de su fuerte brazo. Autores hay que dicen\n        que la primera aventura que le avino fue la del Puerto Lápice, otros\n        dicen que la de los molinos de viento; pero lo que yo he podido\n        averiguar en este caso, y lo que he hallado escrito en los anales de la\n        Mancha, es que él anduvo todo aquel día, y, al anochecer, su rocín y él\n        se hallaron cansados y muertos de hambre, y que, mirando a todas partes\n        por ver si descubriría algún castillo o alguna majada de pastores donde\n        recogerse y adonde pudiese remediar su mucha hambre y necesidad, vio, no\n        lejos del camino por donde iba, una venta, que fue como si viera una\n        estrella que, no a los portales, sino a los alcázares de su redención le\n        encaminaba. Diose priesa a caminar, y llegó a ella a tiempo que\n        anochecía.\n      </Text>\n      <Text\n        style={styles.pageNumber}\n        render={({ pageNumber, totalPages }) => `${pageNumber} / ${totalPages}`}\n        fixed\n      />\n    </Page>\n  </Document>\n);\n\ndescribe('pageWrap', () => {\n  test('should match snapshot', async () => {\n    const image = await renderToImage(<PageWrap />);\n\n    expect(image).toMatchImageSnapshot();\n  }, 30_000);\n});\n"
  },
  {
    "path": "packages/renderer/tests/renderComponent.js",
    "content": "import Canvas from 'canvas';\nimport pdfjs from 'pdfjs-dist/legacy/build/pdf';\n\nimport { renderToBuffer } from '@react-pdf/renderer';\n\n/**\n * copy-pasted code from\n * https://github.com/mozilla/pdf.js/blob/master/examples/node/pdf2png/pdf2png.js#L20-L49\n */\nconst NodeCanvasFactory = {\n  create(width, height) {\n    const canvas = Canvas.createCanvas(width, height);\n    const context = canvas.getContext('2d');\n    return {\n      canvas,\n      context,\n    };\n  },\n\n  reset(canvasAndContext, width, height) {\n    canvasAndContext.canvas.width = width;\n    canvasAndContext.canvas.height = height;\n  },\n\n  destroy(canvasAndContext) {\n    canvasAndContext.canvas.width = 0;\n    canvasAndContext.canvas.height = 0;\n    canvasAndContext.canvas = null;\n    canvasAndContext.context = null;\n  },\n};\n\nasync function getCanvas(pagePromise) {\n  const page = await pagePromise;\n  const viewport = page.getViewport({ scale: 1.0 });\n  const canvasFactory = NodeCanvasFactory;\n  const { canvas, context } = canvasFactory.create(\n    viewport.width,\n    viewport.height,\n  );\n  const renderContext = {\n    canvasContext: context,\n    viewport,\n    canvasFactory,\n  };\n\n  const renderTask = page.render(renderContext);\n  await renderTask.promise;\n\n  return canvas;\n}\n\nconst GAP = 10;\nconst composeCanvases = (canvases) => {\n  const [maxWidth, maxHeight] = canvases.reduce(\n    ([width, height], canvas) => [\n      Math.max(width, canvas.width),\n      Math.max(height, canvas.height),\n    ],\n    [0, 0],\n  );\n\n  const resultCanvas = Canvas.createCanvas(\n    maxWidth,\n    maxHeight * canvases.length + GAP * (canvases.length - 1),\n  );\n  const resultContext = resultCanvas.getContext('2d');\n\n  canvases.forEach((canvas, index) => {\n    if (index) {\n      resultContext.fillStyle = '#e2e2e2';\n      resultContext.fillRect(\n        0,\n        maxHeight * index + GAP * (index - 1),\n        maxWidth,\n        GAP,\n      );\n    }\n    resultContext.drawImage(canvas, 0, maxHeight * index + GAP * index);\n  });\n\n  return resultCanvas;\n};\n\n/**\n * Generates a array with numbers from 0 to length-1\n * @param {number} length — size of array\n * @returns {number[]} array\n */\nconst range = (length) => Array.from({ length }, (_, index) => index);\n\nconst renderComponent = async (element) => {\n  const source = await renderToBuffer(element);\n\n  const document = await pdfjs.getDocument({\n    data: source,\n    verbosity: 0,\n  }).promise;\n\n  const pages = range(document.numPages).map((pageIndex) =>\n    document.getPage(pageIndex + 1),\n  );\n\n  if (pages.length === 1) {\n    return (await getCanvas(pages[0])).toBuffer();\n  }\n\n  const canvases = await Promise.all(pages.map((page) => getCanvas(page)));\n  const pageSnapshots = composeCanvases(canvases);\n\n  return pageSnapshots.toBuffer();\n};\n\nexport default renderComponent;\n"
  },
  {
    "path": "packages/renderer/tests/resume.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport {\n  Link,\n  Text,\n  Font,\n  Page,\n  View,\n  Image,\n  Document,\n  StyleSheet,\n} from '@react-pdf/renderer';\nimport renderToImage from './renderComponent';\n\nconst headerStyles = StyleSheet.create({\n  container: {\n    flexDirection: 'row',\n    borderBottomWidth: 2,\n    borderBottomColor: '#112131',\n    borderBottomStyle: 'solid',\n    alignItems: 'stretch',\n  },\n  detailColumn: {\n    flexDirection: 'column',\n    flexGrow: 9,\n    textTransform: 'uppercase',\n  },\n  linkColumn: {\n    flexDirection: 'column',\n    flexGrow: 2,\n    alignSelf: 'flex-end',\n    justifySelf: 'flex-end',\n  },\n  name: {\n    fontSize: 24,\n    fontFamily: 'Lato Bold',\n  },\n  subtitle: {\n    fontSize: 10,\n    justifySelf: 'flex-end',\n    fontFamily: 'Lato',\n  },\n  link: {\n    fontFamily: 'Lato',\n    fontSize: 10,\n    color: 'black',\n    textDecoration: 'none',\n    alignSelf: 'flex-end',\n    justifySelf: 'flex-end',\n  },\n});\n\nconst Header = () => (\n  <View style={headerStyles.container}>\n    <View style={headerStyles.detailColumn}>\n      <Text style={headerStyles.name}>Luke Skywalker</Text>\n      <Text style={headerStyles.subtitle}>Jedi Master</Text>\n    </View>\n    <View style={headerStyles.linkColumn}>\n      <Link href=\"mailto:luke@theforce.com\" style={headerStyles.link}>\n        <Text>luke@theforce.com</Text>\n      </Link>\n    </View>\n  </View>\n);\n\nconst titleStyles = StyleSheet.create({\n  title: {\n    fontFamily: 'Lato Bold',\n    fontSize: 14,\n    marginBottom: 10,\n    textTransform: 'uppercase',\n  },\n});\n\nconst Title = ({ children }) => (\n  <Text style={titleStyles.title}>{children}</Text>\n);\n\nconst listStyles = StyleSheet.create({\n  item: {\n    flexDirection: 'row',\n    marginBottom: 5,\n  },\n  bulletPoint: {\n    fontFamily: 'Lato',\n    width: 10,\n    fontSize: 10,\n  },\n  itemContent: {\n    flex: 1,\n    fontSize: 10,\n    fontFamily: 'Lato',\n  },\n});\n\nconst List = ({ children }) => children;\n\nconst Item = ({ children }) => (\n  <View style={listStyles.item}>\n    <Text style={listStyles.bulletPoint}>•</Text>\n    <Text style={listStyles.itemContent}>{children}</Text>\n  </View>\n);\n\nconst skilsStyles = StyleSheet.create({\n  title: {\n    fontFamily: 'Lato Bold',\n    fontSize: 11,\n    marginBottom: 10,\n  },\n  skills: {\n    fontFamily: 'Lato',\n    fontSize: 10,\n    marginBottom: 10,\n  },\n});\n\nconst SkillEntry = ({ name, skills }) => (\n  <View>\n    <Text style={skilsStyles.title}>{name}</Text>\n    <List>\n      {skills.map((skill, i) => (\n        <Item key={i}>{skill}</Item>\n      ))}\n    </List>\n  </View>\n);\n\nconst Skills = () => (\n  <View>\n    <Title>Skills</Title>\n    <SkillEntry\n      name=\"Combat Abilities\"\n      skills={[\n        'Completed Jedi Master training and built a lightsaber from scratch in order to do battle against the Empire',\n        'Defeated the Rancor and rescued Princess Leia from Jabba the Hutt',\n        'Competent fighter pilot as well as an excelent shot with nearly any weapon',\n      ]}\n    />\n  </View>\n);\n\nconst educationStyles = StyleSheet.create({\n  container: {\n    marginBottom: 10,\n  },\n  school: {\n    fontFamily: 'Lato Bold',\n    fontSize: 10,\n  },\n  degree: {\n    fontFamily: 'Lato',\n    fontSize: 10,\n  },\n  candidate: {\n    fontFamily: 'Lato Italic',\n    fontSize: 10,\n  },\n});\n\nconst Education = () => (\n  <View style={educationStyles.container}>\n    <Title>Education</Title>\n    <Text style={educationStyles.school}>Jedi Academy</Text>\n    <Text style={educationStyles.degree}>Jedi Master</Text>\n    <Text style={educationStyles.candidate}>A long, long time ago</Text>\n  </View>\n);\n\nconst expStyles = StyleSheet.create({\n  container: {\n    flex: 1,\n    paddingTop: 30,\n    paddingLeft: 15,\n    '@media max-width: 400': {\n      paddingTop: 10,\n      paddingLeft: 0,\n    },\n  },\n  entryContainer: {\n    marginBottom: 10,\n  },\n  date: {\n    fontSize: 11,\n    fontFamily: 'Lato Italic',\n  },\n  detailLeftColumn: {\n    flexDirection: 'column',\n    marginLeft: 10,\n    marginRight: 10,\n  },\n  detailRightColumn: {\n    flexDirection: 'column',\n    flexGrow: 9,\n  },\n  bulletPoint: {\n    fontSize: 10,\n  },\n  details: {\n    fontSize: 10,\n    fontFamily: 'Lato',\n  },\n  headerContainer: {\n    flexDirection: 'row',\n    marginBottom: 10,\n  },\n  leftColumn: {\n    flexDirection: 'column',\n    flexGrow: 9,\n  },\n  rightColumn: {\n    flexDirection: 'column',\n    flexGrow: 1,\n    alignItems: 'flex-end',\n    justifySelf: 'flex-end',\n  },\n  title: {\n    fontSize: 11,\n    color: 'black',\n    textDecoration: 'none',\n    fontFamily: 'Lato Bold',\n  },\n});\n\nconst ExperienceEntry = ({ company, details, position, date }) => {\n  const title = `${company} | ${position}`;\n  return (\n    <View style={expStyles.entryContainer}>\n      <View style={expStyles.headerContainer}>\n        <View style={expStyles.leftColumn}>\n          <Text style={expStyles.title}>{title}</Text>\n        </View>\n        <View style={expStyles.rightColumn}>\n          <Text style={expStyles.date}>{date}</Text>\n        </View>\n      </View>\n      <List>\n        {details.map((detail, i) => (\n          <Item key={i}>{detail}</Item>\n        ))}\n      </List>\n    </View>\n  );\n};\n\nconst experienceData = [\n  {\n    company: 'Jedi Temple, Coruseant',\n    date: 'A long time ago...',\n    details: [\n      'Started a new Jedi Temple in order to train the next generation of Jedi Masters',\n      'Discovered and trained a new generation of Jedi Knights, which he recruited from within the New Republic',\n      'Communicates with decesased Jedi Masters such as Anakin Skywalker, Yoda, Obi-Wan Kenobi in order to learn the secrets of the Jedi Order',\n    ],\n    position: 'Head Jedi Master',\n  },\n  {\n    company: 'Rebel Alliance',\n    date: 'A long time ago...',\n    details: [\n      'Lead legions of troops into battle while demonstrating bravery, competence and honor',\n      'Created complicated battle plans in conjunction with other Rebel leaders in order to ensure the greatest chance of success',\n      'Defeated Darth Vader in single-combat, and convinced him to betray his mentor, the Emperor',\n    ],\n    position: 'General',\n  },\n  {\n    company: 'Rebel Alliance',\n    date: 'A long time ago...',\n    details: [\n      'Destroyed the Death Star by using the force to find its only weakness and delivering a torpedo into the center of the ship',\n      'Commanded of squadron of X-Wings into battle',\n      'Defeated an enemy AT-AT single handedly after his ship was destroyed',\n      'Awarded a medal for valor and bravery in battle for his successful destruction of the Death Star',\n    ],\n    position: 'Lieutenant Commander',\n  },\n  {\n    company: 'Tatooine Moisture Refinery',\n    date: 'A long time ago...',\n    details: [\n      'Replaced damaged power converters',\n      'Performed menial labor thoughout the farm in order to ensure its continued operation',\n    ],\n    position: 'Moisture Farmer',\n  },\n];\n\nconst Experience = () => (\n  <View style={expStyles.container}>\n    <Title>Experience</Title>\n    {experienceData.map(({ company, date, details, position }) => (\n      <ExperienceEntry\n        company={company}\n        date={date}\n        details={details}\n        key={company + position}\n        position={position}\n      />\n    ))}\n  </View>\n);\n\nconst resumeStyles = StyleSheet.create({\n  page: {\n    padding: 30,\n  },\n  container: {\n    flex: 1,\n    flexDirection: 'row',\n    '@media max-width: 400': {\n      flexDirection: 'column',\n    },\n  },\n  image: {\n    marginBottom: 10,\n  },\n  leftColumn: {\n    flexDirection: 'column',\n    width: 170,\n    paddingTop: 30,\n    paddingRight: 15,\n    '@media max-width: 400': {\n      width: '100%',\n      paddingRight: 0,\n    },\n    '@media orientation: landscape': {\n      width: 200,\n    },\n  },\n  footer: {\n    fontSize: 12,\n    fontFamily: 'Lato Bold',\n    textAlign: 'center',\n    marginTop: 15,\n    paddingTop: 5,\n    borderWidth: 3,\n    borderColor: 'gray',\n    borderStyle: 'dashed',\n    '@media orientation: landscape': {\n      marginTop: 10,\n    },\n  },\n});\n\nFont.register({\n  family: 'Open Sans',\n  src: 'https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVZ0e.ttf',\n});\n\nFont.register({\n  family: 'Lato',\n  src: 'https://fonts.gstatic.com/s/lato/v16/S6uyw4BMUTPHjx4wWw.ttf',\n});\n\nFont.register({\n  family: 'Lato Italic',\n  src: 'https://fonts.gstatic.com/s/lato/v16/S6u8w4BMUTPHjxsAXC-v.ttf',\n});\n\nFont.register({\n  family: 'Lato Bold',\n  src: 'https://fonts.gstatic.com/s/lato/v16/S6u9w4BMUTPHh6UVSwiPHA.ttf',\n});\n\nconst Resume = (props) => (\n  <Page {...props} style={resumeStyles.page}>\n    <Header />\n    <View style={resumeStyles.container}>\n      <View style={resumeStyles.leftColumn}>\n        <Image\n          src=\"https://react-pdf.org/images/luke.jpg\"\n          style={resumeStyles.image}\n        />\n        <Education />\n        <Skills />\n      </View>\n      <Experience />\n    </View>\n    <Text style={resumeStyles.footer}>\n      This IS the candidate you are looking for\n    </Text>\n  </Page>\n);\n\ndescribe('resume', () => {\n  test('should match snapshot', async () => {\n    const image = await renderToImage(\n      <Document\n        author=\"Luke Skywalker\"\n        keywords=\"awesome, resume, start wars\"\n        subject=\"The resume of Luke Skywalker\"\n        title=\"Resume\"\n      >\n        <Resume orientation=\"landscape\" size=\"A4\" />\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should match snapshot', async () => {\n    const image = await renderToImage(\n      <Document\n        author=\"Luke Skywalker\"\n        keywords=\"awesome, resume, start wars\"\n        subject=\"The resume of Luke Skywalker\"\n        title=\"Resume\"\n      >\n        <Resume size=\"A4\" />\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should match snapshot', async () => {\n    const image = await renderToImage(\n      <Document\n        author=\"Luke Skywalker\"\n        keywords=\"awesome, resume, start wars\"\n        subject=\"The resume of Luke Skywalker\"\n        title=\"Resume\"\n      >\n        <Resume size={[380, 1250]} />\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/svg.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { Document, Page, Svg, Font, Text, Tspan } from '@react-pdf/renderer';\nimport renderToImage from './renderComponent';\nimport { Tiger, Chart, Chart2, Gradients, Dasharrays } from './svgs';\n\n// pdf.js does not render default fonts in node and I use Open Sans (:\nFont.register({\n  family: 'Open Sans',\n  src: 'https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVZ0e.ttf',\n});\n\ndescribe('Svg', () => {\n  test('should render Tspan component', async () => {\n    const image = await renderToImage(\n      <Document>\n        <Page\n          style={{ border: '1 solid #e2e2e2', fontFamily: 'Open Sans' }}\n          size={[54, 47]}\n        >\n          <Svg width={52} viewBox=\"0 0 52 45\">\n            <Text x={2} y={20} style={{ fontFamily: 'Open Sans' }}>\n              hello{' '}\n              <Tspan x={2} y={35} fill=\"red\">\n                world\n              </Tspan>\n            </Text>\n          </Svg>\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should render Tiger', async () => {\n    const image = await renderToImage(\n      <Document>\n        <Page size={[400, 400]}>\n          <Tiger />\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should render Chart', async () => {\n    const image = await renderToImage(\n      <Document>\n        <Page size={[400, 267]}>\n          <Chart />\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should render Chart2', async () => {\n    const image = await renderToImage(\n      <Document>\n        <Page size={[400, 267]}>\n          <Chart2 />\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should render Gradients', async () => {\n    const image = await renderToImage(\n      <Document>\n        <Page size={[100, 200]}>\n          <Gradients />\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should render Dasharrays', async () => {\n    const image = await renderToImage(\n      <Document>\n        <Page size={[100, 200]}>\n          <Dasharrays />\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/svgs.jsx",
    "content": "import {\n  Svg,\n  G,\n  Polygon,\n  Rect,\n  Circle,\n  Path,\n  Text,\n  Tspan,\n  Defs,\n  ClipPath,\n  LinearGradient,\n  RadialGradient,\n  Stop,\n  Line,\n} from '@react-pdf/renderer';\n\nexport const Tiger = () => (\n  <Svg style={{ width: 400, height: 400 }}>\n    <G transform=\"scale(1) translate(100,10)\">\n      <Polygon\n        fill=\"#f2cc99\"\n        points=\" 69,18 82,8 99,3 118,5 135,12 149,21 156,13 165,9 177,13 183,28 180,50 164,91 155,107 154,114 151,121 141,127 139,136 155,206 157,251 126,342 133,357 128,376 83,376 75,368 67,350 61,350 53,369 4,369 2,361 5,354 12,342 16,321 4,257 4,244 7,218 9,179 26,127 43,93 32,77 30,70 24,67 16,49 17,35 18,23 30,12 40,7 53,7 62,12\"\n      />\n      <Polygon\n        fill=\"#e5b27f\"\n        points=\" 142,79 136,74 138,82 133,78 133,84 127,78 128,85 124,80 125,87 119,82 119,90 125,99 125,96 128,100 128,94 131,98 132,93 135,97 136,93 138,97 139,94 141,98 143,94 144,85\"\n      />\n      <Polygon\n        fill=\"#eb8080\"\n        points=\" 127,101 132,100 137,99 144,101 143,105 135,110\"\n      />\n      <Polygon\n        fill=\"#f2cc99\"\n        points=\" 178,229 157,248 139,296 126,349 137,356 158,357 183,342 212,332 235,288 235,261 228,252 212,250 188,251\"\n      />\n      <G fill=\"#9c826b\">\n        <Polygon points=\" 56,229 48,241 48,250 57,281 63,325 71,338 81,315 76,321 79,311 83,301 75,308 80,298 73,303 76,296 71,298 74,292 69,293 74,284 78,278 71,278 74,274 68,273 70,268 66,267 68,261 60,266 62,259 65,253 57,258 59,251 55,254 55,248 60,237 54,240 58,234 54,236\" />\n        <Polygon points=\" 74,363 79,368 81,368 85,362 89,363 92,370 96,373 101,372 108,361 110,371 113,373 116,371 120,358 122,363 123,371 126,371 129,367 132,357 135,361 130,376 127,377 94,378 84,376 76,371\" />\n        <Polygon points=\" 212,250 219,251 228,258 236,270 235,287 225,304 205,332 177,343 171,352 158,357 166,352 168,346 168,339 165,333 155,327 155,323 161,320 165,316 169,316 167,312 171,313 168,308 173,309 170,306 177,306 175,308 177,311 174,311 176,316 171,315 174,319 168,320 168,323 175,327 179,332 183,326 184,332 189,323 190,328 194,320 194,325 199,316 201,320 204,313 206,316 208,310 211,305 219,298 226,288 229,279 228,266 224,259 217,253\" />\n        <Polygon points=\" 151,205 151,238 149,252 141,268 128,282 121,301 130,300 126,313 118,324 116,337 120,346 133,352 133,340 137,333 145,329 156,327 153,319 153,291 157,271 170,259 178,277 193,250 174,216\" />\n        <Polygon points=\" 78,127 90,142 95,155 108,164 125,167 139,175 150,206 152,191 141,140 121,148 100,136\" />\n        <Polygon points=\" 21,58 35,63 38,68 32,69 42,74 40,79 47,80 54,83 45,94 34,81 32,73 24,66\" />\n        <Polygon points=\" 71,34 67,34 66,27 59,24 54,17 48,17 39,22 30,26 28,31 31,39 38,46 29,45 36,54 41,61 41,70 50,69 54,71 55,58 67,52 76,43 76,39 68,44\" />\n        <Polygon points=\" 139,74 141,83 143,89 144,104 148,104 155,106 154,86 157,77 155,72 150,77 144,77\" />\n        <Polygon points=\" 105,44 102,53 108,58 111,62 112,55\" />\n        <Polygon points=\" 141,48 141,54 144,58 139,62 137,66 136,59 137,52\" />\n        <Polygon points=\" 98,135 104,130 105,134 108,132 108,135 112,134 113,137 116,136 116,139 119,139 124,141 128,140 133,138 140,133 139,140 126,146 104,144\" />\n        <Polygon points=\" 97,116 103,119 103,116 111,118 116,117 122,114 127,107 135,111 142,107 141,114 145,118 149,121 145,125 140,124 127,121 113,125 100,124\" />\n        <Polygon points=\" 147,33 152,35 157,34 153,31 160,31 156,28 161,28 159,24 163,25 163,21 165,22 170,23 167,17 172,21 174,18 175,23 176,22 177,28 177,33 174,37 176,39 174,44 171,49 168,53 164,57 159,68 156,70 154,60 150,51 146,43 144,35\" />\n        <Polygon points=\" 85,72 89,74 93,75 100,76 105,75 102,79 94,79 88,76\" />\n        <Polygon points=\" 86,214 79,221 76,232 82,225 78,239 82,234 78,245 81,243 79,255 84,250 84,267 87,254 90,271 90,257 95,271 93,256 95,249 92,252 93,243 89,253 89,241 86,250 87,236 83,245 87,231 82,231 90,219 84,221\" />\n      </G>\n      <G fill=\"#ffcc7f\">\n        <Polygon points=\" 93,68 96,72 100,73 106,72 108,66 105,63 100,62\" />\n        <Polygon points=\" 144,64 142,68 142,73 146,74 150,73 154,64 149,62\" />\n      </G>\n      <G fill=\"#9c826b\">\n        <Polygon points=\" 57,91 42,111 52,105 41,117 53,112 46,120 53,116 50,124 57,119 55,127 61,122 60,130 67,126 66,134 71,129 72,136 77,130 76,137 80,133 82,138 86,135 96,135 94,129 86,124 83,117 77,123 79,117 73,120 75,112 68,116 71,111 65,114 69,107 63,110 68,102 61,107 66,98 61,103 63,97 57,99\" />\n        <Polygon points=\" 83,79 76,79 67,82 75,83 65,88 76,87 65,92 76,91 68,96 77,95 70,99 80,98 72,104 80,102 76,108 85,103 92,101 87,98 93,96 86,94 91,93 85,91 93,89 99,89 105,93 107,85 102,82 92,80\" />\n        <Polygon points=\" 109,77 111,83 109,89 113,94 117,90 117,81 114,78\" />\n        <Polygon points=\" 122,128 127,126 134,127 136,129 134,130 130,128 124,129\" />\n        <Polygon points=\" 78,27 82,32 80,33 82,36 78,37 82,40 78,42 81,46 76,47 78,49 74,50 82,52 87,50 83,48 91,46 86,45 91,42 88,40 92,37 86,34 90,31 86,29 89,26\" />\n        <Polygon points=\" 82,17 92,20 79,21 90,25 81,25 94,28 93,26 101,30 101,26 107,33 108,28 111,40 113,34 115,45 117,39 119,54 121,46 124,58 126,47 129,59 130,49 134,58 133,44 137,48 133,37 137,40 133,32 126,20 135,26 132,19 138,23 135,17 142,18 132,11 116,6 94,6 78,11 92,12 80,14 90,16\" />\n        <Polygon points=\" 142,234 132,227 124,223 115,220 110,225 118,224 127,229 135,236 122,234 115,237 113,242 121,238 139,243 121,245 111,254 95,254 102,244 104,235 110,229 100,231 104,224 113,216 122,215 132,217 141,224 145,230 149,240\" />\n        <Polygon points=\" 115,252 125,248 137,249 143,258 134,255 125,254\" />\n        <Polygon points=\" 114,212 130,213 140,219 147,225 144,214 137,209 128,207\" />\n        <Polygon points=\" 102,263 108,258 117,257 131,258 116,260 109,265\" />\n        <Polygon points=\" 51,241 35,224 40,238 23,224 31,242 19,239 28,247 17,246 25,250 37,254 39,263 44,271 47,294 48,317 51,328 60,351 60,323 53,262 47,246\" />\n        <Polygon points=\" 2,364 9,367 14,366 18,355 20,364 26,366 31,357 35,364 39,364 42,357 47,363 53,360 59,357 54,369 7,373\" />\n        <Polygon points=\" 7,349 19,345 25,339 18,341 23,333 28,326 23,326 27,320 23,316 25,311 20,298 15,277 12,264 9,249 10,223 3,248 5,261 15,307 17,326 11,343\" />\n        <Polygon points=\" 11,226 15,231 25,236 18,227\" />\n        <Polygon points=\" 13,214 19,217 32,227 23,214 16,208 15,190 24,148 31,121 24,137 14,170 8,189\" />\n        <Polygon points=\" 202,254 195,258 199,260 193,263 197,263 190,268 196,268 191,273 188,282 200,272 194,272 201,266 197,265 204,262 200,258 204,256\" />\n      </G>\n      <G fill=\"#845433\">\n        <Polygon points=\" 151,213 165,212 179,225 189,246 187,262 179,275 176,263 177,247 171,233 163,230 165,251 157,264 146,298 145,321 133,326 143,285 154,260 153,240\" />\n        <Polygon points=\" 91,132 95,145 97,154 104,148 107,155 109,150 111,158 115,152 118,159 120,153 125,161 126,155 133,164 132,154 137,163 137,152 142,163 147,186 152,192 148,167 141,143 124,145 105,143\" />\n      </G>\n      <G fill=\"#9c826b\">\n        <Polygon points=\" 31,57 23,52 26,51 20,44 23,42 21,36 22,29 25,23 24,32 30,43 26,41 30,50 26,48\" />\n        <Polygon points=\" 147,21 149,28 155,21 161,16 167,14 175,15 173,11 161,9\" />\n        <Polygon points=\" 181,39 175,51 169,57 171,65 165,68 165,75 160,76 162,91 171,71 180,51\" />\n        <Polygon points=\" 132,346 139,348 141,346 142,341 147,342 143,355 133,350\" />\n        <Polygon points=\" 146,355 151,352 155,348 157,343 160,349 151,356 147,357\" />\n        <Polygon points=\" 99,266 100,281 94,305 86,322 78,332 72,346 73,331 91,291\" />\n        <Polygon points=\" 20,347 32,342 45,340 54,345 45,350 42,353 38,350 31,353 29,356 23,350 19,353 15,349\" />\n        <Polygon points=\" 78,344 86,344 92,349 88,358 84,352\" />\n        <Polygon points=\" 93,347 104,344 117,345 124,354 121,357 116,351 112,351 108,355 102,351\" />\n      </G>\n      <G fill=\"#000000\">\n        <Polygon points=\" 105,12 111,18 113,24 113,29 119,34 116,23 112,16\" />\n        <Polygon points=\" 122,27 125,34 127,43 128,34 125,29\" />\n        <Polygon points=\" 115,13 122,19 122,15 113,10\" />\n      </G>\n      <G fill=\"#ffe5b2\">\n        <Polygon points=\" 116,172 107,182 98,193 98,183 90,199 89,189 84,207 88,206 87,215 95,206 93,219 91,230 98,216 97,226 104,214 112,209 104,208 113,202 126,200 139,207 132,198 142,203 134,192 142,195 134,187 140,185 130,181 136,177 126,177 125,171 116,180\" />\n        <Polygon points=\" 74,220 67,230 67,221 59,235 63,233 60,248 70,232 65,249 71,243 67,256 73,250 69,262 73,259 71,267 76,262 72,271 78,270 76,275 82,274 78,290 86,279 86,289 92,274 88,275 87,264 82,270 82,258 77,257 78,247 73,246 77,233 72,236\" />\n        <Polygon points=\" 133,230 147,242 148,250 145,254 138,247 129,246 142,245 138,241 128,237 137,238\" />\n        <Polygon points=\" 133,261 125,261 116,263 111,267 125,265\" />\n        <Polygon points=\" 121,271 109,273 103,279 99,305 92,316 85,327 83,335 89,340 97,341 94,336 101,336 96,331 103,330 97,327 108,325 99,322 109,321 100,318 110,317 105,314 110,312 107,310 113,308 105,306 114,303 105,301 115,298 107,295 115,294 108,293 117,291 109,289 117,286 109,286 118,283 112,281 118,279 114,278 119,276 115,274\" />\n        <Polygon points=\" 79,364 74,359 74,353 76,347 80,351 83,356 82,360\" />\n        <Polygon points=\" 91,363 93,356 97,353 103,355 105,360 103,366 99,371 94,368\" />\n        <Polygon points=\" 110,355 114,353 118,357 117,363 113,369 111,362\" />\n        <Polygon points=\" 126,354 123,358 124,367 126,369 129,361 129,357\" />\n        <Polygon points=\" 30,154 24,166 20,182 23,194 29,208 37,218 41,210 41,223 46,214 46,227 52,216 52,227 61,216 59,225 68,213 73,219 70,207 77,212 69,200 77,202 70,194 78,197 68,187 76,182 64,182 58,175 58,185 53,177 50,186 46,171 44,182 39,167 36,172 36,162 30,166\" />\n        <Polygon points=\" 44,130 41,137 45,136 43,150 48,142 48,157 53,150 52,164 60,156 61,169 64,165 66,175 70,167 74,176 77,168 80,183 85,172 90,182 93,174 98,181 99,173 104,175 105,169 114,168 102,163 95,157 94,166 90,154 87,162 82,149 75,159 72,148 68,155 67,143 62,148 62,138 58,145 56,133 52,142 52,128 49,134 47,125\" />\n        <Polygon points=\" 13,216 19,219 36,231 22,223 16,222 22,227 12,224 13,220 16,220\" />\n        <Polygon points=\" 10,231 14,236 25,239 27,237 19,234\" />\n        <Polygon points=\" 9,245 14,242 25,245 13,245\" />\n        <Polygon points=\" 33,255 26,253 18,254 25,256 18,258 27,260 18,263 27,265 19,267 29,270 21,272 29,276 21,278 30,281 22,283 31,287 24,288 32,292 23,293 34,298 26,299 37,303 32,305 39,309 33,309 39,314 34,314 40,318 34,317 40,321 34,321 41,326 33,326 40,330 33,332 39,333 33,337 42,337 54,341 49,337 52,335 47,330 50,330 45,325 49,325 45,321 48,321 45,316 46,306 45,286 43,274 36,261\" />\n        <Polygon points=\" 7,358 9,351 14,351 17,359 11,364\" />\n        <Polygon points=\" 44,354 49,351 52,355 49,361\" />\n        <Polygon points=\" 32,357 37,353 40,358 36,361\" />\n        <Polygon points=\" 139,334 145,330 154,330 158,334 154,341 152,348 145,350 149,340 147,336 141,339 139,345 136,342 136,339\" />\n        <Polygon points=\" 208,259 215,259 212,255 220,259 224,263 225,274 224,283 220,292 208,300 206,308 203,304 199,315 197,309 195,318 193,313 190,322 190,316 185,325 182,318 180,325 172,321 178,320 176,313 186,312 180,307 188,307 184,303 191,302 186,299 195,294 187,290 197,288 192,286 201,283 194,280 203,277 198,275 207,271 200,269 209,265 204,265 212,262\" />\n        <Polygon points=\" 106,126 106,131 109,132 111,134 115,132 115,135 119,133 118,137 123,137 128,137 133,134 136,130 136,127 132,124 118,128 112,128 106,126 106,126 106,126\" />\n        <Polygon points=\" 107,114 101,110 98,102 105,97 111,98 119,102 121,108 118,112 113,115\" />\n        <Polygon points=\" 148,106 145,110 146,116 150,118 152,111 151,107\" />\n        <Polygon points=\" 80,55 70,52 75,58 63,57 72,61 57,61 67,66 57,67 62,69 54,71 61,73 54,77 63,78 53,85 60,84 56,90 69,84 63,82 75,76 70,75 77,72 72,71 78,69 72,66 81,67 78,64 82,63 80,60 86,62\" />\n        <Polygon points=\" 87,56 91,52 96,50 102,56 98,56 92,60\" />\n        <Polygon points=\" 85,68 89,73 98,76 106,74 96,73 91,70\" />\n        <Polygon points=\" 115,57 114,64 111,64 115,75 122,81 122,74 126,79 126,74 131,78 130,72 133,77 131,68 126,61 119,57\" />\n        <Polygon points=\" 145,48 143,53 147,59 151,59 150,55\" />\n        <Polygon points=\" 26,22 34,15 43,10 52,10 59,16 47,15 32,22\" />\n        <Polygon points=\" 160,19 152,26 149,34 154,33 152,30 157,30 155,26 158,27 157,23 161,23\" />\n      </G>\n      <G fill=\"#000000\">\n        <Polygon points=\" 98,117 105,122 109,122 105,117 113,120 121,120 130,112 128,108 123,103 123,99 128,101 132,106 135,109 142,105 142,101 145,101 145,91 148,101 145,105 136,112 135,116 143,124 148,120 150,122 142,128 133,122 121,125 112,126 103,125 100,129 96,124\" />\n        <Polygon points=\" 146,118 152,118 152,115 149,115\" />\n        <Polygon points=\" 148,112 154,111 154,109 149,109\" />\n        <Polygon points=\" 106,112 108,115 114,116 118,114\" />\n        <Polygon points=\" 108,108 111,110 116,110 119,108\" />\n        <Polygon points=\" 106,104 109,105 117,106 115,104\" />\n        <Polygon points=\" 50,25 41,26 34,33 39,43 49,58 36,51 47,68 55,69 54,59 61,57 74,46 60,52 67,42 57,48 61,40 54,45 60,36 59,29 48,38 52,30 47,32\" />\n        <Polygon points=\" 147,34 152,41 155,49 161,53 157,47 164,47 158,43 168,44 159,40 164,37 169,37 164,33 169,34 165,28 170,30 170,25 173,29 175,27 176,32 173,36 175,39 172,42 172,46 168,49 170,55 162,57 158,63 155,58 153,50 149,46\" />\n        <Polygon points=\" 155,71 159,80 157,93 157,102 155,108 150,101 149,93 154,101 152,91 151,83 155,79\" />\n        <Polygon points=\" 112,78 115,81 114,91 112,87 113,82\" />\n        <Polygon points=\" 78,28 64,17 58,11 47,9 36,10 28,16 21,26 18,41 20,51 23,61 33,65 28,68 37,74 36,81 43,87 48,90 43,100 40,98 39,90 31,80 30,72 22,71 17,61 14,46 16,28 23,17 33,9 45,6 54,6 65,12\" />\n        <Polygon points=\" 67,18 76,9 87,5 101,2 118,3 135,8 149,20 149,26 144,19 132,12 121,9 105,7 89,8 76,14 70,20\" />\n        <Polygon points=\" 56,98 48,106 56,103 47,112 56,110 52,115 57,113 52,121 62,115 58,123 65,119 63,125 69,121 68,127 74,125 74,129 79,128 83,132 94,135 93,129 85,127 81,122 76,126 75,121 71,124 71,117 66,121 66,117 62,117 64,112 60,113 60,110 57,111 61,105 57,107 60,101 55,102\" />\n        <Polygon points=\" 101,132 103,138 106,134 106,139 112,136 111,142 115,139 114,143 119,142 125,145 131,142 135,138 140,134 140,129 143,135 145,149 150,171 149,184 145,165 141,150 136,147 132,151 131,149 126,152 125,150 121,152 117,148 111,152 110,148 105,149 104,145 98,150 96,138 94,132 94,130 98,132\" />\n        <Polygon points=\" 41,94 32,110 23,132 12,163 6,190 7,217 5,236 3,247 9,230 12,211 12,185 18,160 26,134 35,110 43,99\" />\n        <Polygon points=\" 32,246 41,250 50,257 52,267 53,295 53,323 59,350 54,363 51,365 44,366 42,360 40,372 54,372 59,366 62,353 71,352 75,335 73,330 66,318 68,302 64,294 67,288 63,286 63,279 59,275 58,267 56,262 50,247 42,235 44,246 32,236 35,244\" />\n        <Polygon points=\" 134,324 146,320 159,322 173,327 179,337 179,349 172,355 158,357 170,350 174,343 170,333 163,328 152,326 134,329\" />\n        <Polygon points=\" 173,339 183,334 184,338 191,329 194,332 199,323 202,325 206,318 209,320 213,309 221,303 228,296 232,289 234,279 233,269 230,262 225,256 219,253 208,252 198,252 210,249 223,250 232,257 237,265 238,277 238,291 232,305 221,323 218,335 212,342 200,349 178,348\" />\n        <Polygon points=\" 165,296 158,301 156,310 156,323 162,324 159,318 162,308 162,304\" />\n        <Polygon points=\" 99,252 105,244 107,234 115,228 121,228 131,235 122,233 113,235 109,246 121,239 133,243 121,243 110,251\" />\n        <Polygon points=\" 117,252 124,247 134,249 136,253 126,252\" />\n        <Polygon points=\" 117,218 132,224 144,233 140,225 132,219 117,218 117,218 117,218\" />\n        <Polygon points=\" 122,212 134,214 143,221 141,213 132,210\" />\n        <Polygon points=\" 69,352 70,363 76,373 86,378 97,379 108,379 120,377 128,378 132,373 135,361 133,358 132,366 127,375 121,374 121,362 119,367 117,374 110,376 110,362 107,357 106,371 104,375 97,376 90,375 90,368 86,362 83,364 86,369 85,373 78,370 73,362 71,351\" />\n        <Polygon points=\" 100,360 96,363 99,369 102,364\" />\n        <Polygon points=\" 115,360 112,363 114,369 117,364\" />\n        <Polygon points=\" 127,362 125,364 126,369 128,365\" />\n        <Polygon points=\" 5,255 7,276 11,304 15,320 13,334 6,348 2,353 0,363 5,372 12,374 25,372 38,372 44,369 42,367 36,368 31,369 30,360 27,368 20,370 16,361 15,368 10,369 3,366 3,359 6,352 11,348 17,331 19,316 12,291 9,274\" />\n        <Polygon points=\" 10,358 7,362 10,366 11,362\" />\n        <Polygon points=\" 25,357 22,360 24,366 27,360\" />\n        <Polygon points=\" 37,357 34,361 36,365 38,361\" />\n        <Polygon points=\" 49,356 46,359 47,364 50,360\" />\n        <Polygon points=\" 130,101 132,102 135,101 139,102 143,103 142,101 137,100 133,100\" />\n        <Polygon points=\" 106,48 105,52 108,56 109,52\" />\n        <Polygon points=\" 139,52 139,56 140,60 142,58 141,56\" />\n        <Polygon points=\" 25,349 29,351 30,355 33,350 37,348 42,351 45,347 49,345 44,343 36,345\" />\n        <Polygon points=\" 98,347 105,351 107,354 109,349 115,349 120,353 118,349 113,346 104,346\" />\n        <Polygon points=\" 83,348 87,352 87,357 89,351 87,348\" />\n        <Polygon points=\" 155,107 163,107 170,107 186,108 175,109 155,109\" />\n        <Polygon points=\" 153,114 162,113 175,112 192,114 173,114 154,115\" />\n        <Polygon points=\" 152,118 164,120 180,123 197,129 169,123 151,120\" />\n        <Polygon points=\" 68,109 87,106 107,106 106,108 88,108\" />\n        <Polygon points=\" 105,111 95,112 79,114 71,116 85,115 102,113\" />\n        <Polygon points=\" 108,101 98,99 87,99 78,99 93,100 105,102\" />\n        <Polygon points=\" 85,63 91,63 97,60 104,60 108,62 111,69 112,75 110,74 108,71 103,73 106,69 105,65 103,64 103,67 102,70 99,70 97,66 94,67 97,72 88,67 84,66\" />\n        <Polygon points=\" 140,74 141,66 144,61 150,61 156,62 153,70 150,73 152,65 150,65 151,68 149,71 146,71 144,66 143,70 143,74\" />\n        <Polygon points=\" 146,20 156,11 163,9 172,9 178,14 182,18 184,32 182,42 182,52 177,58 176,67 171,76 165,90 157,105 160,92 164,85 168,78 167,73 173,66 172,62 175,59 174,55 177,53 180,46 181,29 179,21 173,13 166,11 159,13 153,18 148,23\" />\n        <Polygon points=\" 150,187 148,211 150,233 153,247 148,267 135,283 125,299 136,292 131,313 122,328 122,345 129,352 133,359 133,367 137,359 148,356 140,350 131,347 129,340 132,332 140,328 137,322 140,304 154,265 157,244 155,223 161,220 175,229 186,247 185,260 176,275 178,287 185,277 188,261 196,253 189,236 174,213\" />\n        <Polygon points=\" 147,338 142,341 143,345 141,354 147,343\" />\n        <Polygon points=\" 157,342 156,349 150,356 157,353 163,346 162,342\" />\n        <Polygon points=\" 99,265 96,284 92,299 73,339 73,333 87,300\" />\n      </G>\n    </G>\n  </Svg>\n);\n\nexport const Chart = () => (\n  <Svg width=\"400\" viewBox=\"0 0 600 400\">\n    <Rect fill=\"#ffffff\" x=\"0\" y=\"0\" width=\"600\" height=\"400\" rx=\"0\" ry=\"0\" />\n    <Rect fill=\"none\" x=\"10\" y=\"10\" width=\"580\" height=\"375\" />\n    <Rect fill=\"none\" x=\"10\" y=\"10\" width=\"580\" height=\"375\" />\n    <G>\n      <G transform=\"translate(10,10) scale(1 1)\">\n        <Path\n          fill=\"#e1f3ef\"\n          d=\"M 289.97026371226053 42.00000302824253 A 146 146 0 1 1 267.8372206592401 43.69195721688695 L 290 188 A 0 0 0 1 0 290 188 Z\"\n          transform=\"translate(0,0)\"\n          stroke=\"#ffffff\"\n          strokeWidth=\"1\"\n          strokeLinejoin=\"round\"\n        />\n        <Path\n          fill=\"#725573\"\n          d=\"M 267.98153975936066 43.66986659525537 A 146 146 0 0 1 280.0229902761958 42.34129179149255 L 290 188 A 0 0 0 0 0 290 188 Z\"\n          transform=\"translate(0,0)\"\n          stroke=\"#ffffff\"\n          strokeWidth=\"1\"\n          strokeLinejoin=\"round\"\n        />\n        <Path\n          fill=\"#bad5d9\"\n          d=\"M 280.16865394863237 42.33138761277962 A 146 146 0 0 1 289.7972089290416 42.00014083643251 L 290 188 A 0 0 0 0 0 290 188 Z\"\n          transform=\"translate(0,0)\"\n          stroke=\"#ffffff\"\n          strokeWidth=\"1\"\n          strokeLinejoin=\"round\"\n        />\n      </G>\n      <G transform=\"translate(10,10) scale(1 1)\" />\n    </G>\n    <G visibility=\"visible\" transform=\"translate(10,10) scale(1 1)\">\n      <Path\n        fill=\"none\"\n        stroke=\"#e1f3ef\"\n        strokeWidth=\"1\"\n        d=\"M 308.267200557376 363.4992347258824 C 303.267200557376 363.4992347258824 301.91032777309874 345.5504493561899 301.4580368450064 339.5675208996257 L 301.00574591691407 333.5845924430615\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#725573\"\n        strokeWidth=\"1\"\n        d=\"M 198.01149501227187 35 C 203.01149501227187 35 272.81601016149165 30.937240272462915 273.46856673763756 36.90164886971116 L 274.12112331378347 42.866057466959404\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#bad5d9\"\n        strokeWidth=\"1\"\n        d=\"M 279.1013042228135 12 C 284.1013042228135 12 284.70457992729905 30.088763774538094 284.905671828794 36.08539299828981 L 285.106763730289 42.08202222204153\"\n      />\n      <G transform=\"translate(313,353)\">\n        <Text\n          x=\"5\"\n          style={{\n            fontFamily: 'Open Sans',\n            fontSize: '11',\n            fontWeight: 'bold',\n            color: '#000000',\n            fill: '#000000',\n          }}\n          y=\"16\"\n        >\n          <Tspan\n            x=\"5\"\n            y=\"16\"\n            fill=\"#FFFFFF\"\n            stroke=\"#FFFFFF\"\n            strokeWidth=\"2\"\n            strokeLinejoin=\"round\"\n          >\n            USD\n          </Tspan>\n          <Tspan x=\"5\" y=\"16\">\n            USD\n          </Tspan>\n        </Text>\n      </G>\n      <G transform=\"translate(161,25)\">\n        <Text\n          x=\"5\"\n          style={{\n            fontFamily: 'Open Sans',\n            fontSize: '11',\n            fontWeight: 'bold',\n            color: '#000000',\n            fill: '#000000',\n          }}\n          y=\"16\"\n        >\n          <Tspan\n            x=\"5\"\n            y=\"16\"\n            fill=\"#FFFFFF\"\n            stroke=\"#FFFFFF\"\n            strokeWidth=\"2\"\n            strokeLinejoin=\"round\"\n          >\n            EUR\n          </Tspan>\n          <Tspan x=\"5\" y=\"16\">\n            EUR\n          </Tspan>\n        </Text>\n      </G>\n      <G transform=\"translate(241,2)\">\n        <Text\n          x=\"5\"\n          style={{\n            fontFamily: 'Open Sans',\n            fontSize: '11',\n            fontWeight: 'bold',\n            color: '#000000',\n            fill: '#000000',\n          }}\n          y=\"16\"\n        >\n          <Tspan\n            x=\"5\"\n            y=\"16\"\n            fill=\"#FFFFFF\"\n            stroke=\"#FFFFFF\"\n            strokeWidth=\"2\"\n            strokeLinejoin=\"round\"\n          >\n            CHF\n          </Tspan>\n          <Tspan x=\"5\" y=\"16\">\n            CHF\n          </Tspan>\n        </Text>\n      </G>\n    </G>\n    <G>\n      <Rect\n        fill=\"none\"\n        rx=\"0\"\n        ry=\"0\"\n        x=\"0\"\n        y=\"0\"\n        width=\"8\"\n        height=\"8\"\n        visibility=\"hidden\"\n      />\n    </G>\n  </Svg>\n);\n\nexport const Chart2 = () => (\n  <Svg width=\"400\" viewBox=\"0 0 600 400\">\n    <Defs>\n      <LinearGradient x1=\"0\" x2=\"0\" y1=\"0\" y2=\"1\" id=\"highcharts-5xj7ee9-2948\">\n        <Stop offset=\"0\" stopColor=\"#B5E2D5\" stopOpacity=\"0.7\" />\n        <Stop offset=\"0.5\" stopColor=\"rgb(225,243,239)\" stopOpacity=\"0.5\" />\n        <Stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"1\" />\n      </LinearGradient>\n\n      <ClipPath id=\"highcharts-5xj7ee9-2949\">\n        <Rect x=\"0\" y=\"0\" width=\"544\" height=\"319\" fill=\"none\" />\n      </ClipPath>\n    </Defs>\n\n    <Rect fill=\"#ffffff\" x=\"0\" y=\"0\" width=\"600\" height=\"400\" rx=\"0\" ry=\"0\" />\n    <Rect fill=\"none\" x=\"46\" y=\"45\" width=\"544\" height=\"319\" />\n    <G>\n      <Path fill=\"none\" d=\"M 58.5 45 L 58.5 364\" opacity=\"1\" />\n      <Path fill=\"none\" d=\"M 167.5 45 L 167.5 364\" opacity=\"1\" />\n      <Path fill=\"none\" d=\"M 276.5 45 L 276.5 364\" opacity=\"1\" />\n      <Path fill=\"none\" d=\"M 384.5 45 L 384.5 364\" opacity=\"1\" />\n      <Path fill=\"none\" d=\"M 492.5 45 L 492.5 364\" opacity=\"1\" />\n    </G>\n    <G>\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 364.5 L 590 364.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 318.5 L 590 318.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 273.5 L 590 273.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 227.5 L 590 227.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 182.5 L 590 182.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 136.5 L 590 136.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 91.5 L 590 91.5\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#e6e6e6\"\n        strokeWidth=\"1\"\n        d=\"M 46 44.5 L 590 44.5\"\n        opacity=\"1\"\n      />\n    </G>\n    <Rect\n      fill=\"none\"\n      stroke=\"#cccccc\"\n      strokeWidth=\"1\"\n      x=\"45.5\"\n      y=\"44.5\"\n      width=\"545\"\n      height=\"320\"\n    />\n    <G>\n      <Path\n        fill=\"none\"\n        stroke=\"#ccd6eb\"\n        strokeWidth=\"1\"\n        d=\"M 58.5 364 L 58.5 374\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#ccd6eb\"\n        strokeWidth=\"1\"\n        d=\"M 167.5 364 L 167.5 374\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#ccd6eb\"\n        strokeWidth=\"1\"\n        d=\"M 276.5 364 L 276.5 374\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#ccd6eb\"\n        strokeWidth=\"1\"\n        d=\"M 384.5 364 L 384.5 374\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#ccd6eb\"\n        strokeWidth=\"1\"\n        d=\"M 492.5 364 L 492.5 374\"\n        opacity=\"1\"\n      />\n      <Path\n        fill=\"none\"\n        stroke=\"#ccd6eb\"\n        strokeWidth=\"1\"\n        d=\"M 46 364.5 L 590 364.5\"\n      />\n    </G>\n    <G>\n      <Path fill=\"none\" d=\"M 46 45 L 46 364\" />\n    </G>\n    <G>\n      <G\n        transform=\"translate(46,45) scale(1 1)\"\n        clip-Path=\"url(#highcharts-5xj7ee9-2949)\"\n      >\n        <Path\n          fill=\"url(#highcharts-5xj7ee9-2948)\"\n          d=\"M 0 229.26985714285718 L 2.0797378481704 230.31799999999998 L 4.1594756963408 228.6014761904762 L 6.2392135445112 229.46125714285716 L 8.3189513926816 228.27640000000002 L 10.398689240852 226.6905142857143 L 12.478427089022 227.21914285714286 L 14.558164937193 230.3909142857143 L 16.637902785363 230.26331428571427 L 18.717640633534 229.35188571428571 L 20.797378481704 224.44840000000002 L 22.877116329874 210.4306285714286 L 24.956854178045 177.0358857142857 L 27.036592026215 166.08051428571426 L 29.116329874386 169.36165714285715 L 31.196067722556 175.3892380952381 L 33.275805570726 223.51874285714285 L 35.355543418897 233.1981142857143 L 37.435281267067 207.86040000000003 L 39.515019115238 190.16957142857143 L 41.594756963408 181.68417142857143 L 43.674494811578 162.9452 L 45.754232659749 165.57011428571428 L 47.833970507919 180.21980952380952 L 49.91370835609 183.41588571428574 L 51.99344620426 212.05297142857142 L 54.07318405243 217.15697142857144 L 56.152921900601 217.3757142857143 L 58.232659748771 223.1906285714286 L 60.312397596942 206.2562857142857 L 62.392135445112 197.06908571428573 L 64.471873293282 189.6865142857143 L 66.551611141453 188.33152380952382 L 68.631348989623 176.52548571428574 L 70.711086837794 152.8648 L 72.790824685964 160.33851428571433 L 74.870562534134 156.2872142857143 L 76.950300382305 154.97931428571428 L 79.030038230475 181.192 L 81.109776078646 191.10834285714287 L 83.189513926816 183.83514285714284 L 85.269251774986 188.26468571428572 L 87.348989623157 185.45748571428572 L 89.428727471327 188.17354285714288 L 91.508465319498 136.9330285714286 L 93.588203167668 111.66519047619047 L 95.667941015838 112.30622857142856 L 97.747678864009 90.55954285714287 L 99.827416712179 77.56257142857146 L 101.90715456035 101.60150000000002 L 103.98689240852 108.73342857142859 L 106.06663025669 112.8166285714286 L 108.14636810486 155.23451428571428 L 110.22610595303 172.6428 L 112.3058438012 193.19247619047619 L 114.38558164937 181.68417142857143 L 116.46531949754 174.83022857142856 L 118.54505734571 169.9632 L 120.62479519388 139.8131428571429 L 122.70453304205 104.68668571428569 L 124.78427089022 98.7806285714286 L 126.86400873839 77.32560000000001 L 128.94374658656 86.05708571428573 L 131.02348443474 106.01737142857141 L 133.10322228291 139.63085714285717 L 135.18296013108 165.64302857142857 L 137.26269797925 203.9959428571429 L 139.34243582742 225.0165238095238 L 141.42217367559 229.71645714285714 L 143.50191152376 214.53205714285716 L 145.58164937193 202.95691428571428 L 147.6613872201 202.40550000000002 L 149.74112506827 194.35302857142858 L 151.82086291644 199.6757714285714 L 153.90060076461 218.81577142857145 L 155.98033861278 170.11814285714283 L 158.06007646095 146.13845714285713 L 160.13981430912 143.02137142857143 L 162.21955215729 142.96668571428572 L 164.29929000546 170.91108571428572 L 166.37902785363 238.90821428571428 L 168.4587657018 247.50754285714288 L 170.53850354997 250.5517142857143 L 172.61824139814 248.1273142857143 L 174.69797924631 241.14880952380952 L 176.77771709448 239.7057142857143 L 178.85745494265 227.21914285714286 L 180.93719279082 220.74800000000005 L 183.016930639 218.67450000000002 L 185.09666848717 226.52645714285717 L 187.17640633534 225.87022857142858 L 189.25614418351 224.4484 L 191.33588203168 209.50097142857143 L 193.41561987985 210.79520000000002 L 195.49535772802 216.39137142857146 L 197.57509557619 216.08148571428572 L 199.65483342436 239.23177142857145 L 201.73457127253 260.1824761904762 L 203.8143091207 255.78331428571428 L 205.89404696887 258.0801142857143 L 207.97378481704 264.7882285714286 L 210.05352266521 268.3245714285714 L 212.13326051338 278.69207142857147 L 214.21299836155 260.8690857142857 L 216.29273620972 257.6426285714286 L 218.37247405789 247.74451428571427 L 220.45221190606 241.39185714285713 L 222.53194975423 247.8721142857143 L 224.6116876024 242.53114285714287 L 226.69142545057 237.15371428571427 L 228.77116329874 237.40435714285712 L 230.85090114691 230.24508571428572 L 232.93063899508 214.47737142857142 L 235.01037684326 214.25862857142857 L 237.09011469143 211.25091428571432 L 239.1698525396 211.92537142857145 L 241.24959038777 225.14108571428574 L 243.32932823594 222.46148571428571 L 245.40906608411 214.69611428571432 L 247.48880393228 210.9957142857143 L 249.56854178045 208.26142857142855 L 251.64827962862 208.4984 L 253.72801747679 222.58908571428572 L 255.80775532496 235.71821428571428 L 257.88749317313 248.94760000000002 L 259.9672310213 243.31497142857143 L 262.04696886947 243.18737142857142 L 264.12670671764 241.07285714285715 L 266.20644456581 199.35980952380953 L 268.28618241398 153.32051428571432 L 270.36592026215 153.9038285714286 L 272.44565811032 157.13028571428575 L 274.52539595849 157.03914285714288 L 276.60513380666 203.68605714285712 L 278.68487165483 236.33342857142856 L 280.764609503 193.58742857142857 L 282.84434735117 93.58852380952382 L 284.92408519934 82.84885714285713 L 287.00382304752 67.02645714285711 L 289.08356089569 63.39897142857143 L 291.16329874386 81.46348571428572 L 293.24303659203 48.89814285714283 L 295.3227744402 45.425599999999974 L 297.40251228837 48.34217142857142 L 299.48225013654 41.178342857142866 L 301.56198798471 88.39034285714288 L 303.64172583288 131.1363428571429 L 305.72146368105 144.57080000000002 L 307.80120152922 171.54908571428575 L 309.88093937739 182.49838095238098 L 311.96067722556 165.97114285714287 L 314.04041507373 158.35160000000002 L 316.1201529219 156.54697142857142 L 318.19989077007 139.50325714285717 L 320.27962861824 173.17142857142858 L 322.35936646641 184.49137142857145 L 324.43910431458 192.78537142857144 L 326.51884216275 205.89171428571427 L 328.59858001092 226.45961904761904 L 330.67831785909 226.14365714285714 L 332.75805570726 187.59022857142855 L 334.83779355543 136.82365714285714 L 336.9175314036 84.17042857142857 L 338.99726925177 71.20080000000002 L 341.07700709995 71.54714285714289 L 343.15674494812 107.36628571428571 L 345.23648279629 142.54742857142858 L 347.31622064446 219.472 L 349.39595849263 221.98754285714284 L 351.4756963408 232.12262857142858 L 353.55543418897 196.10297142857144 L 355.63517203714 189.8657619047619 L 357.71490988531 183.3612 L 359.79464773348 151.1695428571429 L 361.87438558165 147.56028571428575 L 363.95412342982 156.9252142857143 L 366.03386127799 161.23171428571428 L 368.11359912616 162.52594285714287 L 370.19333697433 192.11091428571427 L 372.2730748225 166.75497142857142 L 374.35281267067 140.78533333333337 L 376.43255051884 122.47777142857143 L 378.51228836701 57.63874285714286 L 380.59202621518 45.49851428571429 L 382.67176406335 48.282928571428556 L 384.75150191152 44.09491428571431 L 386.83123975969 50.456685714285754 L 388.91097760786 86.95028571428574 L 390.99071545603 65.01523809523815 L 393.07045330421 75.15639999999999 L 395.15019115238 87.05965714285716 L 397.22992900055 119.59765714285712 L 399.30966684872 228.58628571428574 L 401.38940469689 235.14857142857144 L 403.46914254506 189.12142857142857 L 405.54888039323 157.8412 L 407.6286182414 154.45068571428573 L 409.70835608957 154.396 L 411.78809393774 157.51308571428572 L 413.86783178591 220.71154285714286 L 415.94756963408 242.7498857142857 L 418.02730748225 241.69262857142857 L 420.10704533042 246.54142857142858 L 422.18678317859 243.4608 L 424.26652102676 229.26074285714287 L 426.34625887493 212.47222857142856 L 428.4259967231 208.7855 L 430.50573457127 207.75102857142858 L 432.58547241944 213.5659428571429 L 434.66521026761 214.9513142857143 L 436.74494811578 225.6697142857143 L 438.82468596395 217.53977142857144 L 440.90442381212 211.85245714285713 L 442.98416166029 213.67531428571428 L 445.06389950847 212.74565714285717 L 447.14363735664 216.1452857142857 L 449.22337520481 234.18245714285712 L 451.30311305298 237.66411428571428 L 453.38285090115 236.20582857142858 L 455.46258874932 248.3825142857143 L 457.54232659749 243.93474285714285 L 459.62206444566 242.31240000000003 L 461.70180229383 249.7678857142857 L 463.781540142 259.17990476190477 L 465.86127799017 266.84805714285716 L 467.94101583834 273.7566857142857 L 470.02075368651 267.0121142857143 L 472.10049153468 260.75971428571427 L 474.18022938285 256.18434285714284 L 476.25996723102 257.9889714285714 L 478.33970507919 258.99154285714286 L 480.41944292736 231.2112 L 482.49918077553 216.85923809523808 L 484.5789186237 214.09457142857144 L 486.65865647187 209.4098285714286 L 488.73839432004 211.70662857142855 L 490.81813216821 231.68514285714286 L 492.89787001638 225.81554285714287 L 494.97760786455 223.82862857142857 L 497.05734571273 218.76108571428574 L 499.1370835609 223.5005142857143 L 501.21682140907 235.13338095238095 L 503.29655925724 237.68234285714286 L 505.37629710541 244.08057142857143 L 507.45603495358 251.66365714285712 L 509.53577280175 248.6605 L 511.61551064992 247.01537142857143 L 513.69524849809 221.34954285714286 L 515.77498634626 149.43782857142855 L 517.85472419443 141.89120000000003 L 519.9344620426 143.51354285714288 L 522.01419989077 147.23217142857143 L 524.09393773894 188.06417142857143 L 526.17367558711 216.95645714285715 L 528.25341343528 197.30909523809524 L 530.33315128345 196.1941142857143 L 532.41288913162 204.21468571428574 L 534.49262697979 203.55845714285715 L 536.57236482796 228.65464285714285 L 538.65210267613 231.6486857142857 L 540.7318405243 219.83657142857146 L 542.81157837247 208.47409523809526 L 542.81157837247 319 L 540.7318405243 319 L 538.65210267613 319 L 536.57236482796 319 L 534.49262697979 319 L 532.41288913162 319 L 530.33315128345 319 L 528.25341343528 319 L 526.17367558711 319 L 524.09393773894 319 L 522.01419989077 319 L 519.9344620426 319 L 517.85472419443 319 L 515.77498634626 319 L 513.69524849809 319 L 511.61551064992 319 L 509.53577280175 319 L 507.45603495358 319 L 505.37629710541 319 L 503.29655925724 319 L 501.21682140907 319 L 499.1370835609 319 L 497.05734571273 319 L 494.97760786455 319 L 492.89787001638 319 L 490.81813216821 319 L 488.73839432004 319 L 486.65865647187 319 L 484.5789186237 319 L 482.49918077553 319 L 480.41944292736 319 L 478.33970507919 319 L 476.25996723102 319 L 474.18022938285 319 L 472.10049153468 319 L 470.02075368651 319 L 467.94101583834 319 L 465.86127799017 319 L 463.781540142 319 L 461.70180229383 319 L 459.62206444566 319 L 457.54232659749 319 L 455.46258874932 319 L 453.38285090115 319 L 451.30311305298 319 L 449.22337520481 319 L 447.14363735664 319 L 445.06389950847 319 L 442.98416166029 319 L 440.90442381212 319 L 438.82468596395 319 L 436.74494811578 319 L 434.66521026761 319 L 432.58547241944 319 L 430.50573457127 319 L 428.4259967231 319 L 426.34625887493 319 L 424.26652102676 319 L 422.18678317859 319 L 420.10704533042 319 L 418.02730748225 319 L 415.94756963408 319 L 413.86783178591 319 L 411.78809393774 319 L 409.70835608957 319 L 407.6286182414 319 L 405.54888039323 319 L 403.46914254506 319 L 401.38940469689 319 L 399.30966684872 319 L 397.22992900055 319 L 395.15019115238 319 L 393.07045330421 319 L 390.99071545603 319 L 388.91097760786 319 L 386.83123975969 319 L 384.75150191152 319 L 382.67176406335 319 L 380.59202621518 319 L 378.51228836701 319 L 376.43255051884 319 L 374.35281267067 319 L 372.2730748225 319 L 370.19333697433 319 L 368.11359912616 319 L 366.03386127799 319 L 363.95412342982 319 L 361.87438558165 319 L 359.79464773348 319 L 357.71490988531 319 L 355.63517203714 319 L 353.55543418897 319 L 351.4756963408 319 L 349.39595849263 319 L 347.31622064446 319 L 345.23648279629 319 L 343.15674494812 319 L 341.07700709995 319 L 338.99726925177 319 L 336.9175314036 319 L 334.83779355543 319 L 332.75805570726 319 L 330.67831785909 319 L 328.59858001092 319 L 326.51884216275 319 L 324.43910431458 319 L 322.35936646641 319 L 320.27962861824 319 L 318.19989077007 319 L 316.1201529219 319 L 314.04041507373 319 L 311.96067722556 319 L 309.88093937739 319 L 307.80120152922 319 L 305.72146368105 319 L 303.64172583288 319 L 301.56198798471 319 L 299.48225013654 319 L 297.40251228837 319 L 295.3227744402 319 L 293.24303659203 319 L 291.16329874386 319 L 289.08356089569 319 L 287.00382304752 319 L 284.92408519934 319 L 282.84434735117 319 L 280.764609503 319 L 278.68487165483 319 L 276.60513380666 319 L 274.52539595849 319 L 272.44565811032 319 L 270.36592026215 319 L 268.28618241398 319 L 266.20644456581 319 L 264.12670671764 319 L 262.04696886947 319 L 259.9672310213 319 L 257.88749317313 319 L 255.80775532496 319 L 253.72801747679 319 L 251.64827962862 319 L 249.56854178045 319 L 247.48880393228 319 L 245.40906608411 319 L 243.32932823594 319 L 241.24959038777 319 L 239.1698525396 319 L 237.09011469143 319 L 235.01037684326 319 L 232.93063899508 319 L 230.85090114691 319 L 228.77116329874 319 L 226.69142545057 319 L 224.6116876024 319 L 222.53194975423 319 L 220.45221190606 319 L 218.37247405789 319 L 216.29273620972 319 L 214.21299836155 319 L 212.13326051338 319 L 210.05352266521 319 L 207.97378481704 319 L 205.89404696887 319 L 203.8143091207 319 L 201.73457127253 319 L 199.65483342436 319 L 197.57509557619 319 L 195.49535772802 319 L 193.41561987985 319 L 191.33588203168 319 L 189.25614418351 319 L 187.17640633534 319 L 185.09666848717 319 L 183.016930639 319 L 180.93719279082 319 L 178.85745494265 319 L 176.77771709448 319 L 174.69797924631 319 L 172.61824139814 319 L 170.53850354997 319 L 168.4587657018 319 L 166.37902785363 319 L 164.29929000546 319 L 162.21955215729 319 L 160.13981430912 319 L 158.06007646095 319 L 155.98033861278 319 L 153.90060076461 319 L 151.82086291644 319 L 149.74112506827 319 L 147.6613872201 319 L 145.58164937193 319 L 143.50191152376 319 L 141.42217367559 319 L 139.34243582742 319 L 137.26269797925 319 L 135.18296013108 319 L 133.10322228291 319 L 131.02348443474 319 L 128.94374658656 319 L 126.86400873839 319 L 124.78427089022 319 L 122.70453304205 319 L 120.62479519388 319 L 118.54505734571 319 L 116.46531949754 319 L 114.38558164937 319 L 112.3058438012 319 L 110.22610595303 319 L 108.14636810486 319 L 106.06663025669 319 L 103.98689240852 319 L 101.90715456035 319 L 99.827416712179 319 L 97.747678864009 319 L 95.667941015838 319 L 93.588203167668 319 L 91.508465319498 319 L 89.428727471327 319 L 87.348989623157 319 L 85.269251774986 319 L 83.189513926816 319 L 81.109776078646 319 L 79.030038230475 319 L 76.950300382305 319 L 74.870562534134 319 L 72.790824685964 319 L 70.711086837794 319 L 68.631348989623 319 L 66.551611141453 319 L 64.471873293282 319 L 62.392135445112 319 L 60.312397596942 319 L 58.232659748771 319 L 56.152921900601 319 L 54.07318405243 319 L 51.99344620426 319 L 49.91370835609 319 L 47.833970507919 319 L 45.754232659749 319 L 43.674494811578 319 L 41.594756963408 319 L 39.515019115238 319 L 37.435281267067 319 L 35.355543418897 319 L 33.275805570726 319 L 31.196067722556 319 L 29.116329874386 319 L 27.036592026215 319 L 24.956854178045 319 L 22.877116329874 319 L 20.797378481704 319 L 18.717640633534 319 L 16.637902785363 319 L 14.558164937193 319 L 12.478427089022 319 L 10.398689240852 319 L 8.3189513926816 319 L 6.2392135445112 319 L 4.1594756963408 319 L 2.0797378481704 319 L 0 319\"\n        />\n        <Path\n          fill=\"none\"\n          d=\"M 0 229.26985714285718 L 2.0797378481704 230.31799999999998 L 4.1594756963408 228.6014761904762 L 6.2392135445112 229.46125714285716 L 8.3189513926816 228.27640000000002 L 10.398689240852 226.6905142857143 L 12.478427089022 227.21914285714286 L 14.558164937193 230.3909142857143 L 16.637902785363 230.26331428571427 L 18.717640633534 229.35188571428571 L 20.797378481704 224.44840000000002 L 22.877116329874 210.4306285714286 L 24.956854178045 177.0358857142857 L 27.036592026215 166.08051428571426 L 29.116329874386 169.36165714285715 L 31.196067722556 175.3892380952381 L 33.275805570726 223.51874285714285 L 35.355543418897 233.1981142857143 L 37.435281267067 207.86040000000003 L 39.515019115238 190.16957142857143 L 41.594756963408 181.68417142857143 L 43.674494811578 162.9452 L 45.754232659749 165.57011428571428 L 47.833970507919 180.21980952380952 L 49.91370835609 183.41588571428574 L 51.99344620426 212.05297142857142 L 54.07318405243 217.15697142857144 L 56.152921900601 217.3757142857143 L 58.232659748771 223.1906285714286 L 60.312397596942 206.2562857142857 L 62.392135445112 197.06908571428573 L 64.471873293282 189.6865142857143 L 66.551611141453 188.33152380952382 L 68.631348989623 176.52548571428574 L 70.711086837794 152.8648 L 72.790824685964 160.33851428571433 L 74.870562534134 156.2872142857143 L 76.950300382305 154.97931428571428 L 79.030038230475 181.192 L 81.109776078646 191.10834285714287 L 83.189513926816 183.83514285714284 L 85.269251774986 188.26468571428572 L 87.348989623157 185.45748571428572 L 89.428727471327 188.17354285714288 L 91.508465319498 136.9330285714286 L 93.588203167668 111.66519047619047 L 95.667941015838 112.30622857142856 L 97.747678864009 90.55954285714287 L 99.827416712179 77.56257142857146 L 101.90715456035 101.60150000000002 L 103.98689240852 108.73342857142859 L 106.06663025669 112.8166285714286 L 108.14636810486 155.23451428571428 L 110.22610595303 172.6428 L 112.3058438012 193.19247619047619 L 114.38558164937 181.68417142857143 L 116.46531949754 174.83022857142856 L 118.54505734571 169.9632 L 120.62479519388 139.8131428571429 L 122.70453304205 104.68668571428569 L 124.78427089022 98.7806285714286 L 126.86400873839 77.32560000000001 L 128.94374658656 86.05708571428573 L 131.02348443474 106.01737142857141 L 133.10322228291 139.63085714285717 L 135.18296013108 165.64302857142857 L 137.26269797925 203.9959428571429 L 139.34243582742 225.0165238095238 L 141.42217367559 229.71645714285714 L 143.50191152376 214.53205714285716 L 145.58164937193 202.95691428571428 L 147.6613872201 202.40550000000002 L 149.74112506827 194.35302857142858 L 151.82086291644 199.6757714285714 L 153.90060076461 218.81577142857145 L 155.98033861278 170.11814285714283 L 158.06007646095 146.13845714285713 L 160.13981430912 143.02137142857143 L 162.21955215729 142.96668571428572 L 164.29929000546 170.91108571428572 L 166.37902785363 238.90821428571428 L 168.4587657018 247.50754285714288 L 170.53850354997 250.5517142857143 L 172.61824139814 248.1273142857143 L 174.69797924631 241.14880952380952 L 176.77771709448 239.7057142857143 L 178.85745494265 227.21914285714286 L 180.93719279082 220.74800000000005 L 183.016930639 218.67450000000002 L 185.09666848717 226.52645714285717 L 187.17640633534 225.87022857142858 L 189.25614418351 224.4484 L 191.33588203168 209.50097142857143 L 193.41561987985 210.79520000000002 L 195.49535772802 216.39137142857146 L 197.57509557619 216.08148571428572 L 199.65483342436 239.23177142857145 L 201.73457127253 260.1824761904762 L 203.8143091207 255.78331428571428 L 205.89404696887 258.0801142857143 L 207.97378481704 264.7882285714286 L 210.05352266521 268.3245714285714 L 212.13326051338 278.69207142857147 L 214.21299836155 260.8690857142857 L 216.29273620972 257.6426285714286 L 218.37247405789 247.74451428571427 L 220.45221190606 241.39185714285713 L 222.53194975423 247.8721142857143 L 224.6116876024 242.53114285714287 L 226.69142545057 237.15371428571427 L 228.77116329874 237.40435714285712 L 230.85090114691 230.24508571428572 L 232.93063899508 214.47737142857142 L 235.01037684326 214.25862857142857 L 237.09011469143 211.25091428571432 L 239.1698525396 211.92537142857145 L 241.24959038777 225.14108571428574 L 243.32932823594 222.46148571428571 L 245.40906608411 214.69611428571432 L 247.48880393228 210.9957142857143 L 249.56854178045 208.26142857142855 L 251.64827962862 208.4984 L 253.72801747679 222.58908571428572 L 255.80775532496 235.71821428571428 L 257.88749317313 248.94760000000002 L 259.9672310213 243.31497142857143 L 262.04696886947 243.18737142857142 L 264.12670671764 241.07285714285715 L 266.20644456581 199.35980952380953 L 268.28618241398 153.32051428571432 L 270.36592026215 153.9038285714286 L 272.44565811032 157.13028571428575 L 274.52539595849 157.03914285714288 L 276.60513380666 203.68605714285712 L 278.68487165483 236.33342857142856 L 280.764609503 193.58742857142857 L 282.84434735117 93.58852380952382 L 284.92408519934 82.84885714285713 L 287.00382304752 67.02645714285711 L 289.08356089569 63.39897142857143 L 291.16329874386 81.46348571428572 L 293.24303659203 48.89814285714283 L 295.3227744402 45.425599999999974 L 297.40251228837 48.34217142857142 L 299.48225013654 41.178342857142866 L 301.56198798471 88.39034285714288 L 303.64172583288 131.1363428571429 L 305.72146368105 144.57080000000002 L 307.80120152922 171.54908571428575 L 309.88093937739 182.49838095238098 L 311.96067722556 165.97114285714287 L 314.04041507373 158.35160000000002 L 316.1201529219 156.54697142857142 L 318.19989077007 139.50325714285717 L 320.27962861824 173.17142857142858 L 322.35936646641 184.49137142857145 L 324.43910431458 192.78537142857144 L 326.51884216275 205.89171428571427 L 328.59858001092 226.45961904761904 L 330.67831785909 226.14365714285714 L 332.75805570726 187.59022857142855 L 334.83779355543 136.82365714285714 L 336.9175314036 84.17042857142857 L 338.99726925177 71.20080000000002 L 341.07700709995 71.54714285714289 L 343.15674494812 107.36628571428571 L 345.23648279629 142.54742857142858 L 347.31622064446 219.472 L 349.39595849263 221.98754285714284 L 351.4756963408 232.12262857142858 L 353.55543418897 196.10297142857144 L 355.63517203714 189.8657619047619 L 357.71490988531 183.3612 L 359.79464773348 151.1695428571429 L 361.87438558165 147.56028571428575 L 363.95412342982 156.9252142857143 L 366.03386127799 161.23171428571428 L 368.11359912616 162.52594285714287 L 370.19333697433 192.11091428571427 L 372.2730748225 166.75497142857142 L 374.35281267067 140.78533333333337 L 376.43255051884 122.47777142857143 L 378.51228836701 57.63874285714286 L 380.59202621518 45.49851428571429 L 382.67176406335 48.282928571428556 L 384.75150191152 44.09491428571431 L 386.83123975969 50.456685714285754 L 388.91097760786 86.95028571428574 L 390.99071545603 65.01523809523815 L 393.07045330421 75.15639999999999 L 395.15019115238 87.05965714285716 L 397.22992900055 119.59765714285712 L 399.30966684872 228.58628571428574 L 401.38940469689 235.14857142857144 L 403.46914254506 189.12142857142857 L 405.54888039323 157.8412 L 407.6286182414 154.45068571428573 L 409.70835608957 154.396 L 411.78809393774 157.51308571428572 L 413.86783178591 220.71154285714286 L 415.94756963408 242.7498857142857 L 418.02730748225 241.69262857142857 L 420.10704533042 246.54142857142858 L 422.18678317859 243.4608 L 424.26652102676 229.26074285714287 L 426.34625887493 212.47222857142856 L 428.4259967231 208.7855 L 430.50573457127 207.75102857142858 L 432.58547241944 213.5659428571429 L 434.66521026761 214.9513142857143 L 436.74494811578 225.6697142857143 L 438.82468596395 217.53977142857144 L 440.90442381212 211.85245714285713 L 442.98416166029 213.67531428571428 L 445.06389950847 212.74565714285717 L 447.14363735664 216.1452857142857 L 449.22337520481 234.18245714285712 L 451.30311305298 237.66411428571428 L 453.38285090115 236.20582857142858 L 455.46258874932 248.3825142857143 L 457.54232659749 243.93474285714285 L 459.62206444566 242.31240000000003 L 461.70180229383 249.7678857142857 L 463.781540142 259.17990476190477 L 465.86127799017 266.84805714285716 L 467.94101583834 273.7566857142857 L 470.02075368651 267.0121142857143 L 472.10049153468 260.75971428571427 L 474.18022938285 256.18434285714284 L 476.25996723102 257.9889714285714 L 478.33970507919 258.99154285714286 L 480.41944292736 231.2112 L 482.49918077553 216.85923809523808 L 484.5789186237 214.09457142857144 L 486.65865647187 209.4098285714286 L 488.73839432004 211.70662857142855 L 490.81813216821 231.68514285714286 L 492.89787001638 225.81554285714287 L 494.97760786455 223.82862857142857 L 497.05734571273 218.76108571428574 L 499.1370835609 223.5005142857143 L 501.21682140907 235.13338095238095 L 503.29655925724 237.68234285714286 L 505.37629710541 244.08057142857143 L 507.45603495358 251.66365714285712 L 509.53577280175 248.6605 L 511.61551064992 247.01537142857143 L 513.69524849809 221.34954285714286 L 515.77498634626 149.43782857142855 L 517.85472419443 141.89120000000003 L 519.9344620426 143.51354285714288 L 522.01419989077 147.23217142857143 L 524.09393773894 188.06417142857143 L 526.17367558711 216.95645714285715 L 528.25341343528 197.30909523809524 L 530.33315128345 196.1941142857143 L 532.41288913162 204.21468571428574 L 534.49262697979 203.55845714285715 L 536.57236482796 228.65464285714285 L 538.65210267613 231.6486857142857 L 540.7318405243 219.83657142857146 L 542.81157837247 208.47409523809526\"\n          stroke=\"#56bd9f\"\n          strokeWidth=\"2\"\n          stroke-linejoin=\"round\"\n          stroke-linecap=\"round\"\n        />\n      </G>\n      <G transform=\"translate(46,45) scale(1 1)\" clip-Path=\"none\" />\n    </G>\n    <G>\n      <Text\n        x=\"59.369743309667\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"middle\"\n        transform=\"translate(0,0)\"\n        y=\"383\"\n        opacity=\"1\"\n      >\n        2015\n      </Text>\n      <Text\n        x=\"167.81321682141\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"middle\"\n        transform=\"translate(0,0)\"\n        y=\"383\"\n        opacity=\"1\"\n      >\n        2016\n      </Text>\n      <Text\n        x=\"276.55379574003\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"middle\"\n        transform=\"translate(0,0)\"\n        y=\"383\"\n        opacity=\"1\"\n      >\n        2017\n      </Text>\n      <Text\n        x=\"384.99726925177\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"middle\"\n        transform=\"translate(0,0)\"\n        y=\"383\"\n        opacity=\"1\"\n      >\n        2018\n      </Text>\n      <Text\n        x=\"493.44074276352\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"middle\"\n        transform=\"translate(0,0)\"\n        y=\"383\"\n        opacity=\"1\"\n      >\n        2019\n      </Text>\n    </G>\n    <G>\n      <Text\n        x=\"31\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"362\"\n        opacity=\"1\"\n      >\n        0%\n      </Text>\n      <Text\n        x=\"31\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"316\"\n        opacity=\"1\"\n      >\n        5%\n      </Text>\n      <Text\n        x=\"31\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"271\"\n        opacity=\"1\"\n      >\n        10%\n      </Text>\n      <Text\n        x=\"31\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"225\"\n        opacity=\"1\"\n      >\n        15%\n      </Text>\n      <Text\n        x=\"31\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"180\"\n        opacity=\"1\"\n      >\n        20%\n      </Text>\n      <Text\n        x=\"31\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"134\"\n        opacity=\"1\"\n      >\n        25%\n      </Text>\n      <Text\n        x=\"31\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"89\"\n        opacity=\"1\"\n      >\n        30%\n      </Text>\n      <Text\n        x=\"0\"\n        style={{\n          fontFamily: 'Open Sans',\n          color: '#666666',\n          fontSize: '11',\n          fill: '#666666',\n        }}\n        textAnchor=\"end\"\n        transform=\"translate(0,0)\"\n        y=\"-9999\"\n      >\n        35%\n      </Text>\n    </G>\n    <G transform=\"translate(0,0)\">\n      <G transform=\"translate(0,10)\">\n        <Text\n          x=\"46\"\n          y=\"15\"\n          style={{ fontFamily: 'Open Sans', color: '#666666', fill: '#666666' }}\n        >\n          Zoom\n        </Text>\n        <G transform=\"translate(158,0)\">\n          <Rect fill=\"none\" x=\"0\" y=\"0\" width=\"32\" height=\"22\" rx=\"2\" ry=\"2\" />\n          <Text\n            x=\"4.59375\"\n            style={{\n              fontFamily: 'Open Sans',\n              fontWeight: 'normal',\n              color: '#333333',\n              fill: '#333333',\n            }}\n            y=\"14\"\n          >\n            YTD\n          </Text>\n        </G>\n        <G transform=\"translate(232,0)\">\n          <Rect\n            fill=\"rgb(225, 243, 239)\"\n            fillOpacity=\" .50\"\n            x=\"0\"\n            y=\"0\"\n            width=\"32\"\n            height=\"22\"\n            rx=\"2\"\n            ry=\"2\"\n          />\n          <Text\n            x=\"8.6640625\"\n            style={{\n              fontFamily: 'Open Sans',\n              fontWeight: 'bold',\n              fill: '#000000',\n            }}\n            y=\"14\"\n          >\n            All\n          </Text>\n        </G>\n      </G>\n      <G transform=\"translate(331,10)\">\n        <G transform=\"translate(0,0)\" fill=\"#666666\">\n          <Text\n            x=\"2\"\n            y=\"14\"\n            style={{ fontFamily: 'Open Sans', fontSize: '12', fill: '#666666' }}\n          >\n            From\n          </Text>\n        </G>\n        <G transform=\"translate(38,0)\">\n          <Rect\n            fill=\"none\"\n            x=\"0.5\"\n            y=\"0.5\"\n            width=\"94\"\n            height=\"21\"\n            stroke=\"#cccccc\"\n            strokeWidth=\"1\"\n          />\n          <Text\n            x=\"11.9140625\"\n            y=\"14\"\n            style={{ fontFamily: 'Open Sans', fontSize: '12', fill: '#333333' }}\n          >\n            <Tspan>Nov 17, 2014</Tspan>\n          </Text>\n        </G>\n        <G transform=\"translate(142,0)\" fill=\"#666666\">\n          <Text\n            x=\"2\"\n            y=\"14\"\n            style={{ fontFamily: 'Open Sans', fontSize: '12', fill: '#666666' }}\n          >\n            To\n          </Text>\n        </G>\n        <G transform=\"translate(165,0)\">\n          <Rect\n            fill=\"none\"\n            x=\"0.5\"\n            y=\"0.5\"\n            width=\"94\"\n            height=\"21\"\n            stroke=\"#cccccc\"\n            strokeWidth=\"1\"\n          />\n          <Text\n            x=\"11.9140625\"\n            y=\"14\"\n            style={{ fontFamily: 'Open Sans', fontSize: '12', fill: '#333333' }}\n          >\n            <Tspan>Nov 22, 2019</Tspan>\n          </Text>\n        </G>\n      </G>\n    </G>\n  </Svg>\n);\n\nexport const Gradients = () => (\n  <Svg viewBox=\"0 0 10 20\" width=\"100\">\n    <Defs>\n      <LinearGradient id=\"myLinearGradient\">\n        <Stop offset=\"5%\" stopColor=\"gold\" />\n        <Stop offset=\"95%\" stopColor=\"red\" />\n      </LinearGradient>\n\n      <RadialGradient id=\"myRadialGradient\">\n        <Stop offset=\"10%\" stopColor=\"gold\" />\n        <Stop offset=\"95%\" stopColor=\"red\" />\n      </RadialGradient>\n    </Defs>\n\n    <Circle cx=\"5\" cy=\"5\" r=\"4\" fill=\"url('#myLinearGradient')\" />\n    <Circle cx=\"5\" cy=\"14\" r=\"4\" fill=\"url('#myRadialGradient')\" />\n  </Svg>\n);\n\nexport const Dasharrays = () => (\n  <Svg viewBox=\"0 0 10 20\" width=\"100\">\n    <Line\n      x1=\"0\"\n      y1=\"0\"\n      x2=\"10\"\n      y2=\"10\"\n      stroke=\"red\"\n      strokeWidth=\"1\"\n      strokeDasharray=\"2\"\n    />\n    <Circle\n      cx=\"5\"\n      cy=\"15\"\n      r=\"4\"\n      stroke=\"red\"\n      strokeWidth=\"1\"\n      strokeDasharray=\"2\"\n    />\n  </Svg>\n);\n"
  },
  {
    "path": "packages/renderer/tests/text.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport {\n  Document,\n  Page,\n  View,\n  Text,\n  Link,\n  Font,\n  StyleSheet,\n} from '@react-pdf/renderer';\nimport renderToImage from './renderComponent';\n\nconst styles = StyleSheet.create({\n  title: {\n    margin: 20,\n    fontSize: 25,\n    textAlign: 'center',\n    backgroundColor: '#e4e4e4',\n    textTransform: 'uppercase',\n    fontFamily: 'Oswald',\n  },\n  body: {\n    flexGrow: 1,\n  },\n  row: {\n    flexGrow: 1,\n    flexDirection: 'row',\n  },\n  block: {\n    flexGrow: 1,\n  },\n  text: {\n    width: '60%',\n    margin: 10,\n    fontFamily: 'Oswald',\n    textAlign: 'justify',\n  },\n  fill1: {\n    width: '40%',\n    backgroundColor: '#e14427',\n  },\n  fill2: {\n    flexGrow: 2,\n    backgroundColor: '#e6672d',\n  },\n  fill3: {\n    flexGrow: 2,\n    backgroundColor: '#e78632',\n  },\n  fill4: {\n    flexGrow: 2,\n    backgroundColor: '#e29e37',\n  },\n});\n\nFont.register({\n  family: 'Oswald',\n  src: 'https://fonts.gstatic.com/s/oswald/v13/Y_TKV6o8WovbUd3m_X9aAA.ttf',\n});\n\nconst TextTest = () => (\n  <Document>\n    <Page size=\"A4\">\n      <Link\n        style={styles.title}\n        href=\"https://es.wikipedia.org/wiki/Lorem_ipsum\"\n      >\n        Lorem Ipsum\n      </Link>\n      <View style={styles.body}>\n        <View style={styles.row}>\n          <Text style={styles.text}>\n            Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do\n            eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim\n            ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut\n            aliquip ex ea commodo consequat. Duis aute irure dolor in\n            reprehenderit in voluptate velit esse cillum.\n          </Text>\n          <View style={styles.fill1} />\n        </View>\n        <View style={styles.row}>\n          <View style={styles.fill2} />\n          <Text style={styles.text}>\n            Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do\n            eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim\n            ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut\n            aliquip ex ea commodo consequat. Duis aute irure dolor in\n            reprehenderit in voluptate velit esse cillum.\n          </Text>\n        </View>\n        <View style={styles.row}>\n          <Text style={styles.text}>\n            Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do\n            eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim\n            ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut\n            aliquip ex ea commodo consequat. Duis aute irure dolor in\n            reprehenderit in voluptate velit esse cillum.\n          </Text>\n          <View style={styles.fill3} />\n        </View>\n      </View>\n    </Page>\n  </Document>\n);\n\ndescribe('text', () => {\n  test('should match snapshot', async () => {\n    const image = await renderToImage(<TextTest />);\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should support verticalAlign super and sub', async () => {\n    const image = await renderToImage(\n      <Document>\n        <Page size={[90, 35]}>\n          <Text style={{ fontFamily: 'Oswald' }}>\n            Lorem\n            <Text style={{ verticalAlign: 'super', fontSize: 10 }}>ipsum</Text>\n            <Text style={{ verticalAlign: 'sub', fontSize: 10 }}>dolor</Text>\n          </Text>\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should hyphenate text with soft hyphen', async () => {\n    const shy = '\\u00ad';\n\n    const style = {\n      text: {\n        fontFamily: 'Oswald',\n        fontSize: 20,\n        width: 100,\n        border: '1px solid red',\n      },\n    };\n\n    const image = await renderToImage(\n      <Document>\n        <Page style={{ padding: 20 }}>\n          <Text\n            style={style.text}\n          >{`Potentieel broeikas${shy}gas${shy}emissie${shy}rapport`}</Text>\n\n          <Text\n            style={style.text}\n          >{`Potentieel broeikas${shy}gasemissie${shy}rapport`}</Text>\n        </Page>\n      </Document>,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/transform.test.jsx",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { Document, Page, View } from '@react-pdf/renderer';\nimport renderToImage from './renderComponent';\n\nconst TestDocument = ({ transform, width = 20, height = 20 }) => {\n  return (\n    <Document>\n      <Page size={[20, 20]}>\n        <View style={{ width, height, backgroundColor: 'black', transform }} />\n      </Page>\n    </Document>\n  );\n};\n\ndescribe('transform', () => {\n  test('should scale with two args', async () => {\n    const image = await renderToImage(\n      <TestDocument transform=\"scale(0.5, 0.5)\" />,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should scale with one arg', async () => {\n    const image = await renderToImage(<TestDocument transform=\"scale(0.5)\" />);\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should scale on X axis', async () => {\n    const image = await renderToImage(<TestDocument transform=\"scaleX(0.5)\" />);\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should scale on Y axis', async () => {\n    const image = await renderToImage(<TestDocument transform=\"scaleY(0.5)\" />);\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should translate to zero px', async () => {\n    const image = await renderToImage(\n      <TestDocument width={5} height={5} transform=\"translateX(0px)\" />,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should translate on X axis', async () => {\n    const image = await renderToImage(\n      <TestDocument width={5} height={5} transform=\"translateX(15px)\" />,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should translate on Y axis', async () => {\n    const image = await renderToImage(\n      <TestDocument width={5} height={5} transform=\"translateY(15px)\" />,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should translate on both axis', async () => {\n    const image = await renderToImage(\n      <TestDocument width={5} height={5} transform=\"translate(15px, 15px)\" />,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n\n  test('should rotate', async () => {\n    const image = await renderToImage(\n      <TestDocument width={15} height={15} transform=\"rotate(45deg)\" />,\n    );\n\n    expect(image).toMatchImageSnapshot();\n  });\n});\n"
  },
  {
    "path": "packages/renderer/tests/usePDF.test.jsx",
    "content": "// Note that this file is ran using a separate Vitest configuration\nimport { expect, it } from 'vitest';\n\nimport { renderHook, waitFor, act } from '@testing-library/react';\nimport { usePDF, Document, Page, Text } from '@react-pdf/renderer';\n\nconst TestDocument = ({ title = 'Default' }) => (\n  <Document title={title}>\n    <Page>\n      <Text>Hello tests</Text>\n    </Page>\n  </Document>\n);\n\nit('returns value, updater tuple', () => {\n  const { result } = renderHook(() => usePDF({ document: undefined }));\n\n  expect(Array.isArray(result.current)).toBeTruthy();\n  expect(result.current[0]).toMatchObject(\n    expect.objectContaining({\n      url: null,\n      blob: null,\n      error: null,\n      loading: false,\n    }),\n  );\n\n  expect(typeof result.current[1]).toBe('function');\n});\n\nit('works with no args', () => {\n  const { result } = renderHook(() => usePDF());\n\n  expect(Array.isArray(result.current)).toBeTruthy();\n  expect(typeof result.current[0]).toBe('object');\n  expect(typeof result.current[1]).toBe('function');\n});\n\nit('renders document', async () => {\n  const { result } = renderHook(() => usePDF({ document: <TestDocument /> }));\n\n  await waitFor(() => expect(result.current[0].loading).toBeFalsy());\n});\n\nit('updates document', async () => {\n  const { result } = renderHook(() => usePDF({ document: <TestDocument /> }));\n\n  await waitFor(() => expect(result.current[0].loading).toBeFalsy());\n\n  const pdfSize = result.current[0].blob.size;\n\n  act(() => result.current[1](<TestDocument title=\"Long long long title\" />));\n\n  await waitFor(() => expect(result.current[0].loading).toBeFalsy());\n\n  expect(result.current[0].blob.size).not.toEqual(pdfSize);\n});\n"
  },
  {
    "path": "packages/renderer/vitest.browser.config.js",
    "content": "import { defineConfig } from 'vitest/config';\nimport react from '@vitejs/plugin-react';\n\nexport default defineConfig({\n  plugins: [react()],\n  resolve: {\n    alias:\n      process.env.REACT_VERSION && process.env.REACT_VERSION !== '18'\n        ? [\n            {\n              find: 'react/jsx-dev-runtime',\n              replacement: `react-${process.env.REACT_VERSION}/jsx-dev-runtime`,\n            },\n            {\n              find: 'react',\n              replacement: `react-${process.env.REACT_VERSION}`,\n            },\n            {\n              find: 'react-dom',\n              replacement: `react-dom-${process.env.REACT_VERSION}`,\n            },\n          ]\n        : undefined,\n    conditions: ['browser'],\n    mainFields: ['browser'],\n  },\n  test: {\n    environment: './tests/environment/jsdom.js',\n    setupFiles: ['vitest.setup.js'],\n    include: ['tests/{components,dom,usePDF}.test.*'],\n    watch: false,\n  },\n});\n"
  },
  {
    "path": "packages/renderer/vitest.config.js",
    "content": "import { defineConfig, defaultExclude } from 'vitest/config';\nimport react from '@vitejs/plugin-react';\n\nexport default defineConfig({\n  plugins: [react()],\n  resolve: {\n    alias:\n      process.env.REACT_VERSION && process.env.REACT_VERSION !== '18'\n        ? [\n            {\n              find: 'react/jsx-dev-runtime',\n              replacement: `react-${process.env.REACT_VERSION}/jsx-dev-runtime`,\n            },\n            {\n              find: 'react',\n              replacement: `react-${process.env.REACT_VERSION}`,\n            },\n            {\n              find: 'react-dom',\n              replacement: `react-dom-${process.env.REACT_VERSION}`,\n            },\n          ]\n        : undefined,\n  },\n  test: {\n    // Necessary to avoid \"Module did not self-register\" error with canvas.node\n    pool: 'forks',\n    setupFiles: ['vitest.setup.js'],\n    include: ['tests/*.{test,spec}.?(c|m)[jt]s?(x)'],\n    exclude: [...defaultExclude, 'tests/{components,dom,usePDF}.test.*'],\n    watch: false,\n  },\n});\n"
  },
  {
    "path": "packages/renderer/vitest.setup.js",
    "content": "import { expect } from 'vitest';\nimport path from 'path';\nimport url from 'url';\nimport { configureToMatchImageSnapshot } from 'jest-image-snapshot';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nconsole.log(`Using React ${React.version} + ReactDOM ${ReactDOM.version}`);\n\nconst __dirname = path.dirname(url.fileURLToPath(import.meta.url));\n\nconst toMatchImageSnapshot = configureToMatchImageSnapshot({\n  customSnapshotsDir: `${__dirname}/tests/snapshots`,\n  customDiffDir: `${__dirname}/tests/diffs`,\n});\n\nexpect.extend({ toMatchImageSnapshot });\n"
  },
  {
    "path": "packages/stylesheet/.gitignore",
    "content": "lib\n"
  },
  {
    "path": "packages/stylesheet/CHANGELOG.md",
    "content": "# @react-pdf/stylesheet\n\n## 6.1.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/types@2.9.2\n\n## 6.1.1\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/types@2.9.1\n\n## 6.1.0\n\n### Minor Changes\n\n- [#3112](https://github.com/diegomura/react-pdf/pull/3112) [`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a) Thanks [@diegomura](https://github.com/diegomura)! - feat: add xLinkHref, gradientTransform and gradientUnits support\n\n### Patch Changes\n\n- Updated dependencies [[`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a)]:\n  - @react-pdf/types@2.9.0\n\n## 6.0.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/types@2.8.2\n\n## 6.0.1\n\n### Patch Changes\n\n- [#3099](https://github.com/diegomura/react-pdf/pull/3099) [`2a4f1bfc`](https://github.com/diegomura/react-pdf/commit/2a4f1bfca6b84e6c6bbde683447ce8079a1febbe) Thanks [@diegomura](https://github.com/diegomura)! - refactor: stylesheet types\n\n- [#3098](https://github.com/diegomura/react-pdf/pull/3098) [`bfb51ec0`](https://github.com/diegomura/react-pdf/commit/bfb51ec09b851c52659ce16fed1286173e9516a9) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert render package to TS\n\n- [#3092](https://github.com/diegomura/react-pdf/pull/3092) [`481b536f`](https://github.com/diegomura/react-pdf/commit/481b536f4ad145fb227829399b85a35838a506f8) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert layout package to TS\n\n- Updated dependencies [[`7cd66e4f`](https://github.com/diegomura/react-pdf/commit/7cd66e4fc37cd1393adc6250a919fe2629812082), [`481b536f`](https://github.com/diegomura/react-pdf/commit/481b536f4ad145fb227829399b85a35838a506f8)]:\n  - @react-pdf/types@2.8.1\n  - @react-pdf/fns@3.1.2\n\n## 6.0.0\n\n### Major Changes\n\n- [#3082](https://github.com/diegomura/react-pdf/pull/3082) [`24fe4bf8`](https://github.com/diegomura/react-pdf/commit/24fe4bf894fff055121926488b30d0bf212a9c45) Thanks [@diegomura](https://github.com/diegomura)! - feat: rework and type stylesheet package\n\n### Patch Changes\n\n- Updated dependencies [[`96c2464d`](https://github.com/diegomura/react-pdf/commit/96c2464dfaa7294e0d79b7ed64743bfd7b1a8c72), [`24fe4bf8`](https://github.com/diegomura/react-pdf/commit/24fe4bf894fff055121926488b30d0bf212a9c45), [`700535c5`](https://github.com/diegomura/react-pdf/commit/700535c57ff1b105d923be70f4fc4bfdf4479f91), [`442ce355`](https://github.com/diegomura/react-pdf/commit/442ce35534f916b9146a35fd03870387ed488d92), [`3007d34a`](https://github.com/diegomura/react-pdf/commit/3007d34ad3e10bf32ada3631938f5bb08e1c549f)]:\n  - @react-pdf/types@2.8.0\n  - @react-pdf/fns@3.1.1\n\n## 5.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`d36ace66`](https://github.com/diegomura/react-pdf/commit/d36ace66c77d57d845894e89772be7ae0cdd25ee)]:\n  - @react-pdf/fns@3.1.0\n\n## 5.2.1\n\n### Patch Changes\n\n- Updated dependencies [[`01944231`](https://github.com/diegomura/react-pdf/commit/01944231a342d502b832aeecb4c313020b8360c8)]:\n  - @react-pdf/types@2.7.1\n\n## 5.2.0\n\n### Minor Changes\n\n- [#2773](https://github.com/diegomura/react-pdf/pull/2773) [`18834efa`](https://github.com/diegomura/react-pdf/commit/18834efac2787a636c378718fee40cbe74f01ab8) Thanks [@nikischin](https://github.com/nikischin)! - Changed unit behavior according to PDF spec. Please note that all unitless values are considered as user unit which is a 72dpi equality of the value. This is according to PDF spec and ensures a consistent layout independent of the dpi setting.\n\n## 5.1.0\n\n### Minor Changes\n\n- [#2955](https://github.com/diegomura/react-pdf/pull/2955) [`425f1183`](https://github.com/diegomura/react-pdf/commit/425f1183bba9a83fd5712a1371abb6cea2ed8fca) Thanks [@diegomura](https://github.com/diegomura)! - feat: support rem units\n\n### Patch Changes\n\n- [#2952](https://github.com/diegomura/react-pdf/pull/2952) [`2c3c887e`](https://github.com/diegomura/react-pdf/commit/2c3c887ea2d3aed2863f49bff375d08feaf975aa) Thanks [@diegomura](https://github.com/diegomura)! - feat: support multiple line-height units\n\n## 5.0.1\n\n### Patch Changes\n\n- [#2950](https://github.com/diegomura/react-pdf/pull/2950) [`77e480cd`](https://github.com/diegomura/react-pdf/commit/77e480cdd161270ac07453525dfaf993e2d3f17f) Thanks [@diegomura](https://github.com/diegomura)! - feat: accept commas between transformations\n\n## 5.0.0\n\n### Major Changes\n\n- [#2871](https://github.com/diegomura/react-pdf/pull/2871) [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119) Thanks [@diegomura](https://github.com/diegomura)! - feat!: drop cjs support\n\n### Patch Changes\n\n- Updated dependencies [[`46c3047d`](https://github.com/diegomura/react-pdf/commit/46c3047de56ae82f062b72c4910a4e6096eee99f), [`55973278`](https://github.com/diegomura/react-pdf/commit/55973278ac8bc8f703b63844f57d6f155ae8d86f), [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119)]:\n  - @react-pdf/types@2.7.0\n  - @react-pdf/fns@3.0.0\n\n## 4.3.0\n\n### Minor Changes\n\n- [#2771](https://github.com/diegomura/react-pdf/pull/2771) [`8e6a832`](https://github.com/diegomura/react-pdf/commit/8e6a8320f86354aff950c296a96bc41a33e9dab2) Thanks [@nikischin](https://github.com/nikischin)! - fix: fix dpi\n\n### Patch Changes\n\n- Updated dependencies [[`8e6a832`](https://github.com/diegomura/react-pdf/commit/8e6a8320f86354aff950c296a96bc41a33e9dab2), [`4bafab8`](https://github.com/diegomura/react-pdf/commit/4bafab8455c9003759f48bad20a720baf4ed189b)]:\n  - @react-pdf/types@2.6.0\n\n## 4.2.5\n\n### Patch Changes\n\n- Updated dependencies [[`22a34a9`](https://github.com/diegomura/react-pdf/commit/22a34a91b16a201cd8288e0dbea9368b12ca73f5)]:\n  - @react-pdf/types@2.5.0\n\n## 4.2.4\n\n### Patch Changes\n\n- [#2605](https://github.com/diegomura/react-pdf/pull/2605) [`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - fix: fix CJS compatibility\n\n- Updated dependencies [[`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71)]:\n  - @react-pdf/fns@2.2.1\n\n## 4.2.3\n\n### Patch Changes\n\n- Updated dependencies [[`9af07fe`](https://github.com/diegomura/react-pdf/commit/9af07feb59c2fe9c1d8960ac95f6fa6e03d16235), [`8350154`](https://github.com/diegomura/react-pdf/commit/83501541e3a050021e18e112bb472b2dabc142a7)]:\n  - @react-pdf/types@2.4.1\n  - @react-pdf/fns@2.2.0\n\n## 4.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`fb5273d`](https://github.com/diegomura/react-pdf/commit/fb5273d8d80d919f7b9c214e02d67b79ce23fa19)]:\n  - @react-pdf/types@2.4.0\n\n## 4.2.1\n\n### Patch Changes\n\n- Updated dependencies [[`9e5842b`](https://github.com/diegomura/react-pdf/commit/9e5842bbecca6e249af2c5fc50078bb7ddd5420f)]:\n  - @react-pdf/types@2.3.6\n\n## 4.2.0\n\n### Minor Changes\n\n- [#2409](https://github.com/diegomura/react-pdf/pull/2409) [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Add support for native ESM\n\n### Patch Changes\n\n- [#2498](https://github.com/diegomura/react-pdf/pull/2498) [`6bfe7e8`](https://github.com/diegomura/react-pdf/commit/6bfe7e8a30d96c04a1552800159992705f3605b1) Thanks [@diegomura](https://github.com/diegomura)! - fix: color parse error\n\n- Updated dependencies [[`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37)]:\n  - @react-pdf/fns@2.1.0\n\n## 4.1.9\n\n### Patch Changes\n\n- Updated dependencies [[`e5c8fde`](https://github.com/diegomura/react-pdf/commit/e5c8fde9379a9a85ecac7e3d6273953e39d65f8d), [`1f987cc`](https://github.com/diegomura/react-pdf/commit/1f987cc27c3fd1ef1b6748ebe58a289a78b538d2), [`4c40b14`](https://github.com/diegomura/react-pdf/commit/4c40b149cfed42f2513e1dd330a92ccc3363c04f)]:\n  - @react-pdf/types@2.3.5\n\n## 4.1.8\n\n### Patch Changes\n\n- Updated dependencies [[`4a55c1b`](https://github.com/diegomura/react-pdf/commit/4a55c1b2ed19e460ccae6e749ed94c16729a23c4)]:\n  - @react-pdf/types@2.3.4\n\n## 4.1.7\n\n### Patch Changes\n\n- Updated dependencies [[`1e1fbdc`](https://github.com/diegomura/react-pdf/commit/1e1fbdc3c33ced46d8c7ebba7a196733cb789d59), [`8636812`](https://github.com/diegomura/react-pdf/commit/86368122ed87621d19ae3bc248080e17703d9fcb)]:\n  - @react-pdf/types@2.3.3\n\n## 4.1.6\n\n### Patch Changes\n\n- Updated dependencies [[`a25dbcb`](https://github.com/diegomura/react-pdf/commit/a25dbcb32b65c300f5b088e8b210bb0c1abca5c2)]:\n  - @react-pdf/types@2.3.2\n\n## 4.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`47e91cb`](https://github.com/diegomura/react-pdf/commit/47e91cbd8016046bb4e8389ba0d1c7ede9edce59)]:\n  - @react-pdf/types@2.3.1\n\n## 4.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`2db67a3`](https://github.com/diegomura/react-pdf/commit/2db67a38b9be98b7816a2b5aa4733446b95e3724), [`eff1ff0`](https://github.com/diegomura/react-pdf/commit/eff1ff0fefcd710994e4654904ef55843af76a17)]:\n  - @react-pdf/types@2.3.0\n  - @react-pdf/fns@2.0.1\n\n## 4.1.3\n\n### Patch Changes\n\n- [#2205](https://github.com/diegomura/react-pdf/pull/2205) [`9a5e0be`](https://github.com/diegomura/react-pdf/commit/9a5e0befb89756db07ce053192a136df9d4ba905) Thanks [@jeetiss](https://github.com/jeetiss)! - update babel\n\n## 4.1.2\n\n### Patch Changes\n\n- [#2191](https://github.com/diegomura/react-pdf/pull/2191) [`37c3d74`](https://github.com/diegomura/react-pdf/commit/37c3d741fc9ad7eb91508b5caf6a5a554243f7ff) Thanks [@jeetiss](https://github.com/jeetiss)! - revert flex shorthand defaults\n\n## 4.1.1\n\n### Patch Changes\n\n- [#2186](https://github.com/diegomura/react-pdf/pull/2186) [`72435bd`](https://github.com/diegomura/react-pdf/commit/72435bd81afdada5b811a1d82af0c873cfb62fa0) Thanks [@jeetiss](https://github.com/jeetiss)! - update yoga-layout to support flexBasis auto\n\n## 4.1.0\n\n### Minor Changes\n\n- [#2160](https://github.com/diegomura/react-pdf/pull/2160) [`a743c90`](https://github.com/diegomura/react-pdf/commit/a743c905fb5d201d2382bc9175fa36b83cc47284) Thanks [@jeetiss](https://github.com/jeetiss)! - implement flex gap\n\n### Patch Changes\n\n- Updated dependencies [[`a743c90`](https://github.com/diegomura/react-pdf/commit/a743c905fb5d201d2382bc9175fa36b83cc47284)]:\n  - @react-pdf/types@2.2.0\n\n## 4.0.0\n\n### Major Changes\n\n- [#1891](https://github.com/diegomura/react-pdf/pull/1891) [`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - feat: compatibility with modern web bundlers and browsers\n\n### Patch Changes\n\n- Updated dependencies [[`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81)]:\n  - @react-pdf/fns@2.0.0\n\n## 3.2.0\n\n### Minor Changes\n\n- [#1892](https://github.com/diegomura/react-pdf/pull/1892) [`035d3f8`](https://github.com/diegomura/react-pdf/commit/035d3f8d24fa4f4af9f350950d81b51547858367) Thanks [@diegomura](https://github.com/diegomura)! - feat: add skew transformation support\n\n## 3.1.0\n\n### Minor Changes\n\n- [#1869](https://github.com/diegomura/react-pdf/pull/1869) [`5d2c308`](https://github.com/diegomura/react-pdf/commit/5d2c3088cf438a8abf1038b14a21117fecf59d57) Thanks [@diegomura](https://github.com/diegomura)! - feat: variable dpi\n\n### Patch Changes\n\n- Updated dependencies [[`1411d16`](https://github.com/diegomura/react-pdf/commit/1411d162e04ca237bad93729695c363fdf4bdbeb), [`4fadb48`](https://github.com/diegomura/react-pdf/commit/4fadb48983d7269452f89f80c7e341ece859aaee), [`ce8762f`](https://github.com/diegomura/react-pdf/commit/ce8762f6de5c796e69ec5a225c7f3ff9c619a960), [`5d2c308`](https://github.com/diegomura/react-pdf/commit/5d2c3088cf438a8abf1038b14a21117fecf59d57)]:\n  - @react-pdf/types@2.1.0\n\n## 3.0.0\n\n### Major Changes\n\n- [#1829](https://github.com/diegomura/react-pdf/pull/1829) [`5458a00`](https://github.com/diegomura/react-pdf/commit/5458a00979d883341c6df094243cae859344d2b9) Thanks [@diegomura](https://github.com/diegomura)! - refactor: remove ramda from stylesheet package\n\n### Patch Changes\n\n- [#1838](https://github.com/diegomura/react-pdf/pull/1838) [`9bdb5c9`](https://github.com/diegomura/react-pdf/commit/9bdb5c934a822340754cd4c892d399f91f6218de) Thanks [@diegomura](https://github.com/diegomura)! - feat: create fns package\n\n- Updated dependencies [[`9bdb5c9`](https://github.com/diegomura/react-pdf/commit/9bdb5c934a822340754cd4c892d399f91f6218de), [`fe0f214`](https://github.com/diegomura/react-pdf/commit/fe0f214dbbf2f632b852ebfe65f886ecc4dd6953)]:\n  - @react-pdf/fns@1.0.0\n  - @react-pdf/types@2.0.9\n\n## 2.1.0\n\n### Minor Changes\n\n- [#1535](https://github.com/diegomura/react-pdf/pull/1535) [`1f0eb6e`](https://github.com/diegomura/react-pdf/commit/1f0eb6e0d4e75480de6745a204924d5075859db7) Thanks [@jeetiss](https://github.com/jeetiss)! - fixed `margin: auto` parsing\n\n* [#1654](https://github.com/diegomura/react-pdf/pull/1654) [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b) Thanks [@jeetiss](https://github.com/jeetiss)! - added `@babel/runtime` to dependencies\n\n### Patch Changes\n\n- [#1581](https://github.com/diegomura/react-pdf/pull/1581) [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca) Thanks [@jeetiss](https://github.com/jeetiss)! - added changelog with changesets\n\n- Updated dependencies [[`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca)]:\n  - @react-pdf/types@2.0.8\n"
  },
  {
    "path": "packages/stylesheet/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n# @react-pdf/stylesheet\n\nStyles resolution engine for react-pdf. Transforms CSS-like style objects into normalized, resolved values ready for layout and rendering. Handles unit conversions, color parsing, shorthand expansion, media queries, and style flattening.\n\n## Installation\n\n```bash\nyarn add @react-pdf/stylesheet\n```\n\n## Usage\n\n```js\nimport stylesheet from '@react-pdf/stylesheet';\n\nconst container = {\n  width: 400,\n  height: 600,\n  orientation: 'portrait',\n};\n\nconst style = {\n  margin: 20,\n  width: '50vw',\n  height: '20vh',\n  borderRadius: 5,\n  fontWeight: 'semibold',\n  borderBottom: '2 solid yellow',\n  '@media max-width: 500': {\n    backgroundColor: 'rgb(255, 0, 0)',\n  },\n};\n\nconst computed = stylesheet(container, style);\n\n// Result:\n// {\n//   width: 200,\n//   height: 120,\n//   marginTop: 20,\n//   marginLeft: 20,\n//   marginRight: 20,\n//   marginBottom: 20,\n//   borderTopLeftRadius: 5,\n//   borderTopRightRadius: 5,\n//   borderBottomLeftRadius: 5,\n//   borderBottomRightRadius: 5,\n//   fontWeight: 600,\n//   borderBottomWidth: 2,\n//   borderBottomStyle: 'solid',\n//   borderBottomColor: 'yellow',\n//   backgroundColor: '#FF0000'\n// }\n```\n\n## Features\n\n### Style Flattening\n\nMerges arrays of style objects into a single object. Supports nested arrays and filters out null/undefined values.\n\n```js\nimport stylesheet, { flatten } from '@react-pdf/stylesheet';\n\nconst baseStyle = { margin: 10, padding: 5 };\nconst activeStyle = { backgroundColor: 'blue' };\n\n// Pass an array of styles\nconst computed = stylesheet(container, [baseStyle, activeStyle]);\n\n// Or use flatten directly\nconst merged = flatten([baseStyle, null, activeStyle, undefined]);\n// => { margin: 10, padding: 5, backgroundColor: 'blue' }\n```\n\n### Media Queries\n\nApply styles conditionally based on container dimensions and orientation.\n\n```js\nconst style = {\n  fontSize: 12,\n  '@media max-width: 500': {\n    fontSize: 10,\n  },\n  '@media orientation: landscape': {\n    flexDirection: 'row',\n  },\n  '@media min-width: 400 and max-width: 800': {\n    padding: 20,\n  },\n};\n```\n\nSupported media features:\n\n- `min-width` / `max-width`\n- `min-height` / `max-height`\n- `orientation` (`portrait` | `landscape`)\n\n### Unit Conversion\n\nConverts various CSS units to points (the PDF standard unit).\n\n```js\nconst style = {\n  width: '2in', // 144pt (72pt per inch)\n  height: '50mm', // ~141.73pt\n  padding: '1cm', // ~28.35pt\n  margin: '10vh', // 10% of container height\n  fontSize: '5vw', // 5% of container width\n  gap: '2rem', // 36pt (default rem base: 18pt)\n  left: '100px', // ~100pt at 72dpi\n};\n```\n\n| Unit  | Description                          |\n| ----- | ------------------------------------ |\n| `pt`  | Points (default, 1pt = 1/72 inch)    |\n| `in`  | Inches (1in = 72pt)                  |\n| `mm`  | Millimeters                          |\n| `cm`  | Centimeters                          |\n| `vh`  | Percentage of container height       |\n| `vw`  | Percentage of container width        |\n| `rem` | Relative to rem base (default 18pt)  |\n| `px`  | Pixels (converted using DPI setting) |\n\n### Color Transformation\n\nNormalizes color values to hexadecimal format.\n\n```js\nimport { transformColor } from '@react-pdf/stylesheet';\n\ntransformColor('rgb(255, 0, 0)'); // => '#FF0000'\ntransformColor('rgba(0, 0, 255, 0.5)'); // => '#0000FF80'\ntransformColor('hsl(120, 100%, 50%)'); // => '#00FF00'\ntransformColor('hsla(0, 100%, 50%, 0.8)'); // => '#FF0000CC'\ntransformColor('red'); // => 'red' (passed through)\n```\n\n### Shorthand Expansion\n\nExpands CSS shorthand properties into their individual components.\n\n#### Margin & Padding\n\n```js\n// Input\n{ margin: '10 20 30 40' }\n// Output\n{\n  marginTop: 10,\n  marginRight: 20,\n  marginBottom: 30,\n  marginLeft: 40\n}\n\n// Also supports marginHorizontal/marginVertical\n{ marginHorizontal: 20, marginVertical: 10 }\n// Output\n{\n  marginTop: 10,\n  marginRight: 20,\n  marginBottom: 10,\n  marginLeft: 20\n}\n```\n\n#### Border\n\n```js\n// Input\n{ border: '2 solid red' }\n// Output\n{\n  borderTopWidth: 2,\n  borderTopStyle: 'solid',\n  borderTopColor: 'red',\n  borderRightWidth: 2,\n  borderRightStyle: 'solid',\n  borderRightColor: 'red',\n  borderBottomWidth: 2,\n  borderBottomStyle: 'solid',\n  borderBottomColor: 'red',\n  borderLeftWidth: 2,\n  borderLeftStyle: 'solid',\n  borderLeftColor: 'red',\n}\n\n// Border radius expansion\n{ borderRadius: 5 }\n// Output\n{\n  borderTopLeftRadius: 5,\n  borderTopRightRadius: 5,\n  borderBottomRightRadius: 5,\n  borderBottomLeftRadius: 5,\n}\n```\n\n#### Flex\n\n```js\n// Input\n{ flex: '1 0 auto' }\n// Output\n{\n  flexGrow: 1,\n  flexShrink: 0,\n  flexBasis: 'auto'\n}\n\n// Single value\n{ flex: 1 }\n// Output\n{ flexGrow: 1 }\n```\n\n#### Gap\n\n```js\n// Input\n{ gap: '10 20' }\n// Output\n{\n  rowGap: 10,\n  columnGap: 20\n}\n```\n\n#### Object Position\n\n```js\n// Input\n{ objectPosition: '50% 25%' }\n// Output\n{\n  objectPositionX: 0.5,\n  objectPositionY: 0.25\n}\n```\n\n#### Transform Origin\n\n```js\n// Input\n{ transformOrigin: 'center top' }\n// Output\n{\n  transformOriginX: '50%',\n  transformOriginY: '0%'\n}\n```\n\n### Transform Parsing\n\nParses CSS transform strings into structured transform arrays.\n\n```js\n// Input\n{\n  transform: 'translate(10, 20) rotate(45) scale(2)';\n}\n// Output\n{\n  transform: [\n    { operation: 'translate', value: [10, 20] },\n    { operation: 'rotate', value: [45] },\n    { operation: 'scale', value: [2, 2] },\n  ];\n}\n```\n\nSupported transform functions:\n\n- `translate(x, y)` - Translation\n- `translateX(x)` / `translateY(y)` - Single-axis translation\n- `rotate(angle)` - Rotation in degrees\n- `scale(x, y)` - Scaling (y defaults to x if omitted)\n- `scaleX(x)` / `scaleY(y)` - Single-axis scaling\n- `skew(x, y)` - Skewing in degrees\n- `skewX(x)` / `skewY(y)` - Single-axis skewing\n- `matrix(a, b, c, d, e, f)` - Full transformation matrix\n\n### Font Weight Resolution\n\nConverts font weight keywords to numeric values.\n\n| Keyword                    | Numeric Value |\n| -------------------------- | ------------- |\n| `thin`, `hairline`         | 100           |\n| `ultralight`, `extralight` | 200           |\n| `light`                    | 300           |\n| `normal`                   | 400           |\n| `medium`                   | 500           |\n| `semibold`, `demibold`     | 600           |\n| `bold`                     | 700           |\n| `ultrabold`, `extrabold`   | 800           |\n| `heavy`, `black`           | 900           |\n\n## API Reference\n\n### Default Export\n\n#### `stylesheet(container, style)`\n\nResolves styles for a given container.\n\n**Parameters:**\n\n- `container` - Container dimensions and settings\n- `style` - Style object or array of style objects\n\n**Returns:** Resolved style object with expanded shorthands and converted units\n\n### Named Exports\n\n#### `flatten(styles)`\n\nFlattens an array of style objects into a single merged object.\n\n```js\nimport { flatten } from '@react-pdf/stylesheet';\n\nflatten([{ margin: 10 }, null, { padding: 5 }]);\n// => { margin: 10, padding: 5 }\n```\n\n#### `transformColor(value)`\n\nTransforms RGB/HSL color strings to hexadecimal format.\n\n```js\nimport { transformColor } from '@react-pdf/stylesheet';\n\ntransformColor('rgb(255, 128, 0)'); // => '#FF8000'\n```\n\n## Types\n\n### Container\n\n```ts\ntype Container = {\n  width: number; // Container width in points\n  height: number; // Container height in points\n  dpi?: number; // DPI for px unit conversion (default: 72)\n  remBase?: number; // Base size for rem units (default: 18)\n  orientation?: 'landscape' | 'portrait';\n};\n```\n\n### Style\n\nThe input style object supporting all CSS-like properties:\n\n```ts\ntype Style = {\n  // Dimensions\n  width?: number | string;\n  height?: number | string;\n  minWidth?: number | string;\n  maxWidth?: number | string;\n  minHeight?: number | string;\n  maxHeight?: number | string;\n\n  // Flexbox\n  flex?: number | string;\n  flexDirection?: 'row' | 'row-reverse' | 'column' | 'column-reverse';\n  flexWrap?: 'nowrap' | 'wrap' | 'wrap-reverse';\n  flexGrow?: number | string;\n  flexShrink?: number | string;\n  flexBasis?: number | string;\n  alignItems?: 'flex-start' | 'flex-end' | 'center' | 'stretch' | 'baseline';\n  alignSelf?:\n    | 'auto'\n    | 'flex-start'\n    | 'flex-end'\n    | 'center'\n    | 'baseline'\n    | 'stretch';\n  alignContent?:\n    | 'flex-start'\n    | 'flex-end'\n    | 'center'\n    | 'stretch'\n    | 'space-between'\n    | 'space-around'\n    | 'space-evenly';\n  justifyContent?:\n    | 'flex-start'\n    | 'flex-end'\n    | 'center'\n    | 'space-around'\n    | 'space-between'\n    | 'space-evenly';\n\n  // Gap\n  gap?: number | string;\n  rowGap?: number | string;\n  columnGap?: number | string;\n\n  // Spacing\n  margin?: number | string;\n  marginTop?: number | string;\n  marginRight?: number | string;\n  marginBottom?: number | string;\n  marginLeft?: number | string;\n  marginHorizontal?: number | string;\n  marginVertical?: number | string;\n  padding?: number | string;\n  paddingTop?: number | string;\n  paddingRight?: number | string;\n  paddingBottom?: number | string;\n  paddingLeft?: number | string;\n  paddingHorizontal?: number | string;\n  paddingVertical?: number | string;\n\n  // Borders\n  border?: number | string;\n  borderTop?: number | string;\n  borderRight?: number | string;\n  borderBottom?: number | string;\n  borderLeft?: number | string;\n  borderWidth?: number | string;\n  borderStyle?: 'solid' | 'dashed' | 'dotted';\n  borderColor?: string;\n  borderRadius?: number | string;\n  borderTopLeftRadius?: number | string;\n  borderTopRightRadius?: number | string;\n  borderBottomRightRadius?: number | string;\n  borderBottomLeftRadius?: number | string;\n  // ... and per-side border properties\n\n  // Layout\n  display?: 'flex' | 'none';\n  position?: 'absolute' | 'relative' | 'static';\n  top?: number | string;\n  right?: number | string;\n  bottom?: number | string;\n  left?: number | string;\n  zIndex?: number | string;\n  overflow?: 'hidden';\n  aspectRatio?: number | string;\n\n  // Colors\n  backgroundColor?: string;\n  color?: string;\n  opacity?: number | string;\n\n  // Text\n  fontFamily?: string | string[];\n  fontSize?: number | string;\n  fontStyle?: 'normal' | 'italic' | 'oblique';\n  fontWeight?: FontWeight;\n  letterSpacing?: number | string;\n  lineHeight?: number | string;\n  textAlign?: 'left' | 'right' | 'center' | 'justify';\n  textDecoration?:\n    | 'none'\n    | 'underline'\n    | 'line-through'\n    | 'underline line-through';\n  textDecorationColor?: string;\n  textDecorationStyle?: 'solid' | 'dashed' | 'dotted';\n  textTransform?:\n    | 'none'\n    | 'capitalize'\n    | 'lowercase'\n    | 'uppercase'\n    | 'upperfirst';\n  textOverflow?: 'ellipsis';\n  maxLines?: number | string;\n\n  // Transform\n  transform?: string | Transform[];\n  transformOrigin?: number | string;\n  transformOriginX?: number | string;\n  transformOriginY?: number | string;\n\n  // Object positioning (for images)\n  objectFit?: string;\n  objectPosition?: number | string;\n  objectPositionX?: number | string;\n  objectPositionY?: number | string;\n\n  // SVG\n  fill?: string;\n  stroke?: string;\n  strokeWidth?: string | number;\n  strokeDasharray?: string;\n  fillOpacity?: string | number;\n  strokeOpacity?: string | number;\n  fillRule?: 'nonzero' | 'evenodd';\n  textAnchor?: 'start' | 'middle' | 'end';\n  strokeLinecap?: 'butt' | 'round' | 'square';\n  strokeLinejoin?: 'miter' | 'round' | 'bevel';\n  visibility?: 'visible' | 'hidden' | 'collapse';\n  clipPath?: string;\n  dominantBaseline?:\n    | 'auto'\n    | 'middle'\n    | 'central'\n    | 'hanging'\n    | 'mathematical'\n    | 'text-after-edge'\n    | 'text-before-edge';\n\n  // Media queries\n  [key: `@media${string}`]: Style;\n};\n```\n\n### SafeStyle\n\nThe resolved output style with normalized values:\n\n```ts\ntype SafeStyle = {\n  // All shorthand properties expanded\n  // All units converted to points (numbers)\n  // All colors normalized\n  // Transforms parsed into structured arrays\n};\n```\n\n### Transform\n\n```ts\ntype Transform =\n  | { operation: 'translate'; value: [number, number] }\n  | { operation: 'rotate'; value: [number] }\n  | { operation: 'scale'; value: [number, number] }\n  | { operation: 'skew'; value: [number, number] }\n  | {\n      operation: 'matrix';\n      value: [number, number, number, number, number, number];\n    };\n```\n\n### FontWeight\n\n```ts\ntype FontWeight =\n  | number\n  | 'thin'\n  | 'hairline'\n  | 'ultralight'\n  | 'extralight'\n  | 'light'\n  | 'normal'\n  | 'medium'\n  | 'semibold'\n  | 'demibold'\n  | 'bold'\n  | 'ultrabold'\n  | 'extrabold'\n  | 'heavy'\n  | 'black';\n```\n\n## License\n\nMIT\n"
  },
  {
    "path": "packages/stylesheet/globals.d.ts",
    "content": "declare module 'hsl-to-hex';\ndeclare module 'color-string';\ndeclare module 'media-engine';\ndeclare module 'postcss-value-parser/lib/parse.js';\ndeclare module 'postcss-value-parser/lib/unit.js';\n"
  },
  {
    "path": "packages/stylesheet/jest.config.js",
    "content": "export default {\n  testRegex: 'tests/.*?(test)\\\\.js$',\n};\n"
  },
  {
    "path": "packages/stylesheet/package.json",
    "content": "{\n  \"name\": \"@react-pdf/stylesheet\",\n  \"version\": \"6.1.2\",\n  \"license\": \"MIT\",\n  \"description\": \"A styles engine for Node and the browser\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"type\": \"module\",\n  \"main\": \"./lib/index.js\",\n  \"types\": \"./lib/index.d.ts\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/stylesheet\"\n  },\n  \"scripts\": {\n    \"test\": \"vitest\",\n    \"build\": \"rimraf ./lib && rollup -c\",\n    \"watch\": \"rimraf ./lib && rollup -c -w\",\n    \"typecheck\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@react-pdf/fns\": \"3.1.2\",\n    \"@react-pdf/types\": \"^2.9.2\",\n    \"color-string\": \"^1.9.1\",\n    \"hsl-to-hex\": \"^1.0.0\",\n    \"media-engine\": \"^1.0.3\",\n    \"postcss-value-parser\": \"^4.1.0\"\n  },\n  \"files\": [\n    \"lib\"\n  ]\n}\n"
  },
  {
    "path": "packages/stylesheet/rollup.config.js",
    "content": "import { dts } from 'rollup-plugin-dts';\nimport del from 'rollup-plugin-delete';\nimport typescript from '@rollup/plugin-typescript';\nimport localResolve from 'rollup-plugin-local-resolve';\n\nimport pkg from './package.json' with { type: 'json' };\n\nconst config = {\n  input: 'src/index.ts',\n  output: { format: 'es', file: 'lib/index.js' },\n  external: [...Object.keys(pkg.dependencies), /@react-pdf/],\n  plugins: [typescript(), localResolve()],\n};\n\nconst dtsConfig = {\n  input: './lib/types/index.d.ts',\n  output: [{ file: 'lib/index.d.ts', format: 'es' }],\n  plugins: [dts(), del({ targets: 'lib/types', hook: 'buildEnd' })],\n};\n\nexport default [config, dtsConfig];\n"
  },
  {
    "path": "packages/stylesheet/src/flatten/index.ts",
    "content": "import { compose, castArray } from '@react-pdf/fns';\nimport { Style } from '../types';\n\ntype StyleInput = Style | StyleInput[] | null | undefined;\n\n/**\n * Remove nil values from array\n *\n * @param array - Style array\n * @returns Style array without nils\n */\nconst compact = <T>(array: (T | null | undefined)[]): T[] =>\n  array.filter((item): item is T => item != null);\n\n/**\n * Merges style objects array\n *\n * @param styles - Style array\n * @returns Merged style object\n */\nconst mergeStyles = (styles: StyleInput[]): Style =>\n  styles.reduce<Style>((acc, style) => {\n    const s = Array.isArray(style) ? flatten(style) : style;\n\n    if (!s) return acc;\n\n    for (const key of Object.keys(s)) {\n      if (s[key] != null) {\n        acc[key] = s[key];\n      }\n    }\n\n    return acc;\n  }, {});\n\n/**\n * Flattens an array of style objects, into one aggregated style object.\n * Supports nested arrays of styles.\n *\n * @param styles - Style or style array (can be nested)\n * @returns Flattened style object\n */\nconst flatten = compose(mergeStyles, compact, castArray<StyleInput>);\n\nexport default flatten;\n"
  },
  {
    "path": "packages/stylesheet/src/index.ts",
    "content": "import { compose } from '@react-pdf/fns';\n\nimport flattenStyles from './flatten';\nimport resolveMediaQueries from './mediaQueries';\nimport { Container, Style } from './types';\nimport resolveStyle from './resolve';\n\ntype StyleParam = Style | null | undefined;\n/**\n * Resolves styles\n *\n * @param container\n * @param style - Style\n * @returns Resolved style\n */\nconst resolveStyles = (\n  container: Container,\n  style: StyleParam | StyleParam[],\n) => {\n  const computeMediaQueries = (value) => resolveMediaQueries(container, value);\n\n  return compose(\n    resolveStyle(container),\n    computeMediaQueries,\n    flattenStyles,\n  )(style);\n};\n\n// Utils exported for SVG processing\nexport { default as transformColor } from './utils/colors';\n\nexport { default as flatten } from './flatten';\n\nexport * from './types';\n\nexport default resolveStyles;\n"
  },
  {
    "path": "packages/stylesheet/src/mediaQueries/index.ts",
    "content": "import matchMedia from 'media-engine';\n\nimport { Container, Style } from '../types';\n\n/**\n * Resolves media queries in styles object\n *\n * @param container - Container for which styles are resolved\n * @param style - Style description\n * @returns Resolved style object\n */\nconst resolveMediaQueries = (container: Container, style: Style): Style => {\n  return Object.entries(style).reduce<Style>((acc, [key, value]) => {\n    if (key.startsWith('@media')) {\n      return { ...acc, ...matchMedia({ [key]: value }, container) };\n    }\n\n    return { ...acc, [key]: value };\n  }, {} as Style);\n};\n\nexport default resolveMediaQueries;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/borders.ts",
    "content": "import transformColor from '../utils/colors';\nimport transformUnit from '../utils/units';\nimport {\n  Container,\n  BorderSafeStyle,\n  BorderStyle,\n  BorderStyleValue,\n} from '../types';\nimport { processColorValue, processNoopValue, processUnitValue } from './utils';\n\n// Matches border shorthand: \"width style color\" (e.g., \"1px solid red\")\nconst BORDER_SHORTHAND_REGEX =\n  /^(?<width>-?\\d+(?:\\.\\d+)?(?:in|mm|cm|pt|vw|vh|px|rem)?)\\s+(?<style>\\S+)\\s+(?<color>.+)$/;\n\nconst matchBorderShorthand = (value: string) =>\n  BORDER_SHORTHAND_REGEX.exec(value);\n\ntype BorderKey = keyof BorderStyle;\n\nconst resolveBorderShorthand = <K extends BorderKey>(\n  key: K,\n  value: BorderStyle[K],\n  container: Container,\n): BorderSafeStyle => {\n  const match = matchBorderShorthand(`${value}`);\n\n  // Handle shorthand properties that don't match the full border pattern\n  // (e.g., borderColor: 'red', borderWidth: 5, borderRadius: 10)\n  if (!match) {\n    if (key.match(/Color$/)) {\n      const color = transformColor(`${value}`);\n      return {\n        borderTopColor: color,\n        borderRightColor: color,\n        borderBottomColor: color,\n        borderLeftColor: color,\n      };\n    }\n\n    if (key.match(/Style$/)) {\n      const style = value as BorderStyleValue;\n\n      if (typeof style === 'number')\n        throw new Error(`Invalid border style: ${style}`);\n\n      return {\n        borderTopStyle: style,\n        borderRightStyle: style,\n        borderBottomStyle: style,\n        borderLeftStyle: style,\n      };\n    }\n\n    if (key.match(/Width$/)) {\n      const width = transformUnit(container, value);\n\n      if (typeof width !== 'number')\n        throw new Error(`Invalid border width: ${width}`);\n\n      return {\n        borderTopWidth: width,\n        borderRightWidth: width,\n        borderBottomWidth: width,\n        borderLeftWidth: width,\n      };\n    }\n\n    if (key.match(/Radius$/)) {\n      const radius = transformUnit(container, value);\n\n      if (typeof radius !== 'number')\n        throw new Error(`Invalid border radius: ${radius}`);\n\n      return {\n        borderTopLeftRadius: radius,\n        borderTopRightRadius: radius,\n        borderBottomRightRadius: radius,\n        borderBottomLeftRadius: radius,\n      };\n    }\n\n    return { [key]: value };\n  }\n\n  // Full border shorthand matched: \"width style color\"\n  const {\n    width: widthMatch,\n    style: styleMatch,\n    color: colorMatch,\n  } = match.groups!;\n\n  const style = styleMatch as BorderStyleValue;\n  const color = transformColor(colorMatch);\n  const width = transformUnit(container, widthMatch);\n\n  if (key.match(/(Top|Right|Bottom|Left)$/)) {\n    return {\n      [`${key}Color`]: color,\n      [`${key}Style`]: style,\n      [`${key}Width`]: width,\n    };\n  }\n\n  if (typeof width !== 'number')\n    throw new Error(`Invalid border width: ${width}`);\n\n  if (typeof style === 'number')\n    throw new Error(`Invalid border style: ${style}`);\n\n  return {\n    borderTopColor: color,\n    borderTopStyle: style,\n    borderTopWidth: width,\n    borderRightColor: color,\n    borderRightStyle: style,\n    borderRightWidth: width,\n    borderBottomColor: color,\n    borderBottomStyle: style,\n    borderBottomWidth: width,\n    borderLeftColor: color,\n    borderLeftStyle: style,\n    borderLeftWidth: width,\n  };\n};\n\nconst handlers = {\n  border: resolveBorderShorthand<'border'>,\n  borderBottom: resolveBorderShorthand<'borderBottom'>,\n  borderBottomColor: processColorValue<'borderBottomColor'>,\n  borderBottomLeftRadius: processUnitValue<'borderBottomLeftRadius'>,\n  borderBottomRightRadius: processUnitValue<'borderBottomRightRadius'>,\n  borderBottomStyle: processNoopValue<'borderBottomStyle'>,\n  borderBottomWidth: processUnitValue<'borderBottomWidth'>,\n  borderColor: resolveBorderShorthand<'borderColor'>,\n  borderLeft: resolveBorderShorthand<'borderLeft'>,\n  borderLeftColor: processColorValue<'borderLeftColor'>,\n  borderLeftStyle: processNoopValue<'borderLeftStyle'>,\n  borderLeftWidth: processUnitValue<'borderLeftWidth'>,\n  borderRadius: resolveBorderShorthand<'borderRadius'>,\n  borderRight: resolveBorderShorthand<'borderRight'>,\n  borderRightColor: processColorValue<'borderRightColor'>,\n  borderRightStyle: processNoopValue<'borderRightStyle'>,\n  borderRightWidth: processUnitValue<'borderRightWidth'>,\n  borderStyle: resolveBorderShorthand<'borderStyle'>,\n  borderTop: resolveBorderShorthand<'borderTop'>,\n  borderTopColor: processColorValue<'borderTopColor'>,\n  borderTopLeftRadius: processUnitValue<'borderTopLeftRadius'>,\n  borderTopRightRadius: processUnitValue<'borderTopRightRadius'>,\n  borderTopStyle: processNoopValue<'borderTopStyle'>,\n  borderTopWidth: processUnitValue<'borderTopWidth'>,\n  borderWidth: resolveBorderShorthand<'borderWidth'>,\n};\n\nexport default handlers;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/boxModel.ts",
    "content": "import parse from 'postcss-value-parser/lib/parse.js';\nimport parseUnit from 'postcss-value-parser/lib/unit.js';\n\nimport transformUnit from '../utils/units';\nimport { Container } from '../types';\n\nconst BOX_MODEL_UNITS = new Set([\n  'px',\n  'in',\n  'mm',\n  'cm',\n  'pt',\n  '%',\n  'vw',\n  'vh',\n  'rem',\n  '',\n]);\n\ninterface ParseValue {\n  type: string;\n  value: string;\n}\n\nconst logError = (style: string | number | symbol, value: unknown) => {\n  const name = style.toString();\n\n  // eslint-disable-next-line no-console\n  console.error(`\n    @react-pdf/stylesheet parsing error:\n    ${name}: ${value},\n    ${' '.repeat(name.length + 2)}^\n    Unsupported ${name} value format\n  `);\n};\n\n/**\n * @param options\n * @param [options.expandsTo]\n * @param [options.maxValues]\n * @param [options.autoSupported]\n */\nconst expandBoxModel =\n  <S, E>({\n    expandsTo,\n    maxValues = 1,\n    autoSupported = false,\n  }: {\n    expandsTo?: ({ first, second, third, fourth }: Record<string, number>) => E;\n    maxValues?: number;\n    autoSupported?: boolean;\n  } = {}) =>\n  <K extends keyof S>(model: K, value: S[K], container: Container) => {\n    const nodes: ParseValue[] = parse(`${value}`);\n\n    const parts: string[] = [];\n\n    for (let i = 0; i < nodes.length; i++) {\n      const node = nodes[i];\n\n      // value contains `calc`, `url` or other css function\n      // `,`, `/` or strings that unsupported by margin and padding\n      if (\n        node.type === 'function' ||\n        node.type === 'string' ||\n        node.type === 'div'\n      ) {\n        logError(model, value);\n\n        return {} as E;\n      }\n\n      if (node.type === 'word') {\n        if (node.value === 'auto' && autoSupported) {\n          parts.push(node.value);\n        } else {\n          const result = parseUnit(node.value);\n\n          // when unit isn't specified this condition is true\n          if (result && BOX_MODEL_UNITS.has(result.unit)) {\n            parts.push(node.value);\n          } else {\n            logError(model, value);\n\n            return {} as E;\n          }\n        }\n      }\n    }\n\n    // checks that we have enough parsed values\n    if (parts.length > maxValues) {\n      logError(model, value);\n\n      return {} as E;\n    }\n\n    const first = transformUnit(container, parts[0]) as number;\n\n    if (expandsTo) {\n      const second = transformUnit(container, parts[1] || parts[0]) as number;\n      const third = transformUnit(container, parts[2] || parts[0]) as number;\n      const fourth = transformUnit(\n        container,\n        parts[3] || parts[1] || parts[0],\n      ) as number;\n\n      return expandsTo({ first, second, third, fourth });\n    }\n\n    return {\n      [model]: first,\n    } as E;\n  };\n\nexport default expandBoxModel;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/colors.ts",
    "content": "import { processColorValue, processNumberValue } from './utils';\n\nconst handlers = {\n  backgroundColor: processColorValue<'backgroundColor'>,\n  color: processColorValue<'color'>,\n  opacity: processNumberValue<'opacity'>,\n};\n\nexport default handlers;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/dimensions.ts",
    "content": "import { processUnitValue } from './utils';\n\nconst handlers = {\n  height: processUnitValue<'height'>,\n  maxHeight: processUnitValue<'maxHeight'>,\n  maxWidth: processUnitValue<'maxWidth'>,\n  minHeight: processUnitValue<'minHeight'>,\n  minWidth: processUnitValue<'minWidth'>,\n  width: processUnitValue<'width'>,\n};\n\nexport default handlers;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/flex.ts",
    "content": "// https://developer.mozilla.org/en-US/docs/Web/CSS/flex#values\n\nimport { parseFloat } from '@react-pdf/fns';\nimport { Container, Style, StyleKey } from '../types';\nimport transformUnit from '../utils/units';\nimport {\n  processNoopValue,\n  processNumberValue,\n  processUnitValue,\n} from './utils';\n\ntype FlexDefaults = (number | string)[];\n\n// TODO: change flex defaults to [0, 1, 'auto'] as in spec in next major release\nconst flexDefaults: FlexDefaults = [1, 1, 0];\n\nconst flexAuto: FlexDefaults = [1, 1, 'auto'];\n\nconst flexNone: FlexDefaults = [0, 0, 'auto'];\n\nconst flexInitial: FlexDefaults = [0, 1, 'auto'];\n\nconst processFlexShorthand = <K extends StyleKey>(\n  key: K,\n  value: Style[K],\n  container: Container,\n) => {\n  let defaults = flexDefaults;\n  let matches: string[] = [];\n\n  if (value === 'auto') {\n    defaults = flexAuto;\n  } else if (value === 'none') {\n    defaults = flexNone;\n  } else if (value === 'initial') {\n    defaults = flexInitial;\n  } else {\n    matches = `${value}`.split(' ');\n  }\n\n  const flexGrow = parseFloat(matches[0] || defaults[0]);\n  const flexShrink = parseFloat(matches[1] || defaults[1]);\n  const flexBasis = transformUnit(container, matches[2] || defaults[2]);\n\n  return { flexGrow, flexShrink, flexBasis };\n};\n\nconst handlers = {\n  alignContent: processNoopValue<'alignContent'>,\n  alignItems: processNoopValue<'alignItems'>,\n  alignSelf: processNoopValue<'alignSelf'>,\n  flex: processFlexShorthand<'flex'>,\n  flexBasis: processUnitValue<'flexBasis'>,\n  flexDirection: processNoopValue<'flexDirection'>,\n  flexFlow: processNoopValue<'flexFlow'>,\n  flexGrow: processNumberValue<'flexGrow'>,\n  flexShrink: processNumberValue<'flexShrink'>,\n  flexWrap: processNoopValue<'flexWrap'>,\n  justifyContent: processNoopValue<'justifyContent'>,\n  justifySelf: processNoopValue<'justifySelf'>,\n};\n\nexport default handlers;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/gap.ts",
    "content": "import { Container, GapSafeStyle, Style, StyleKey } from '../types';\nimport transformUnit from '../utils/units';\nimport { processUnitValue } from './utils';\n\nconst processGapShorthand = <K extends StyleKey>(\n  _key: K,\n  value: Style[K],\n  container: Container,\n): GapSafeStyle => {\n  const parts = `${value}`.split(' ');\n\n  const rowGap = transformUnit(container, parts[0]);\n  const columnGap = transformUnit(container, parts[1] || parts[0]);\n\n  return { rowGap, columnGap };\n};\n\nconst handlers = {\n  gap: processGapShorthand<'gap'>,\n  columnGap: processUnitValue<'columnGap'>,\n  rowGap: processUnitValue<'rowGap'>,\n};\n\nexport default handlers;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/index.ts",
    "content": "import borderHandlers from './borders';\nimport colorHandlers from './colors';\nimport dimensionHandlers from './dimensions';\nimport flexHandlers from './flex';\nimport gapHandlers from './gap';\nimport layoutHandlers from './layout';\nimport marginHandlers from './margins';\nimport paddingHandlers from './paddings';\nimport positioningHandlers from './positioning';\nimport textHandlers from './text';\nimport transformHandlers from './transform';\nimport svgHandlers from './svg';\nimport { Container, SafeStyle, Style, StyleKey } from '../types';\n\ntype Handler = (\n  key: StyleKey,\n  value: any,\n  container: Container,\n  style: Style,\n) => SafeStyle;\n\nconst shorthands: Partial<Record<StyleKey, Handler>> = {\n  ...borderHandlers,\n  ...colorHandlers,\n  ...dimensionHandlers,\n  ...flexHandlers,\n  ...gapHandlers,\n  ...layoutHandlers,\n  ...marginHandlers,\n  ...paddingHandlers,\n  ...positioningHandlers,\n  ...textHandlers,\n  ...transformHandlers,\n  ...svgHandlers,\n};\n\n/**\n * Expand shorthand properties and resolve units/values.\n *\n * @param container - Container dimensions for unit resolution\n * @returns Function that resolves a style object\n */\nconst resolve =\n  (container: Container) =>\n  (style: Style): SafeStyle => {\n    const propsArray = Object.keys(style) as StyleKey[];\n    const resolvedStyle: SafeStyle = {};\n\n    for (let i = 0; i < propsArray.length; i += 1) {\n      const key = propsArray[i];\n      const value = style[key];\n\n      if (!shorthands[key]) {\n        resolvedStyle[key] = value;\n        continue;\n      }\n\n      const resolved = shorthands[key](key, value, container, style);\n\n      Object.assign(resolvedStyle, resolved);\n    }\n\n    return resolvedStyle;\n  };\n\nexport default resolve;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/layout.ts",
    "content": "import {\n  processNoopValue,\n  processNumberValue,\n  processUnitValue,\n} from './utils';\n\nconst handlers = {\n  aspectRatio: processNumberValue<'aspectRatio'>,\n  bottom: processUnitValue<'bottom'>,\n  display: processNoopValue<'display'>,\n  left: processUnitValue<'left'>,\n  position: processNoopValue<'position'>,\n  right: processUnitValue<'right'>,\n  top: processUnitValue<'top'>,\n  overflow: processNoopValue<'overflow'>,\n  zIndex: processNumberValue<'zIndex'>,\n};\n\nexport default handlers;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/margins.ts",
    "content": "import { MarginSafeStyle, MarginStyle } from '../types';\nimport processBoxModel from './boxModel';\n\nconst processMargin = processBoxModel<MarginStyle, MarginSafeStyle>({\n  expandsTo: ({ first, second, third, fourth }) => ({\n    marginTop: first,\n    marginRight: second,\n    marginBottom: third,\n    marginLeft: fourth,\n  }),\n  maxValues: 4,\n  autoSupported: true,\n});\n\nconst processMarginVertical = processBoxModel<MarginStyle, MarginSafeStyle>({\n  expandsTo: ({ first, second }) => ({\n    marginTop: first,\n    marginBottom: second,\n  }),\n  maxValues: 2,\n  autoSupported: true,\n});\n\nconst processMarginHorizontal = processBoxModel<MarginStyle, MarginSafeStyle>({\n  expandsTo: ({ first, second }) => ({\n    marginRight: first,\n    marginLeft: second,\n  }),\n  maxValues: 2,\n  autoSupported: true,\n});\n\nconst processMarginSingle = processBoxModel<MarginStyle, MarginSafeStyle>({\n  autoSupported: true,\n});\n\nconst handlers = {\n  margin: processMargin<'margin'>,\n  marginBottom: processMarginSingle<'marginBottom'>,\n  marginHorizontal: processMarginHorizontal<'marginHorizontal'>,\n  marginLeft: processMarginSingle<'marginLeft'>,\n  marginRight: processMarginSingle<'marginRight'>,\n  marginTop: processMarginSingle<'marginTop'>,\n  marginVertical: processMarginVertical<'marginVertical'>,\n};\n\nexport default handlers;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/paddings.ts",
    "content": "import { PaddingSafeStyle, PaddingStyle } from '../types';\nimport processBoxModel from './boxModel';\n\nconst processPadding = processBoxModel<PaddingStyle, PaddingSafeStyle>({\n  expandsTo: ({ first, second, third, fourth }) => ({\n    paddingTop: first,\n    paddingRight: second,\n    paddingBottom: third,\n    paddingLeft: fourth,\n  }),\n  maxValues: 4,\n});\n\nconst processPaddingVertical = processBoxModel<PaddingStyle, PaddingSafeStyle>({\n  expandsTo: ({ first, second }) => ({\n    paddingTop: first,\n    paddingBottom: second,\n  }),\n  maxValues: 2,\n});\n\nconst processPaddingHorizontal = processBoxModel<\n  PaddingStyle,\n  PaddingSafeStyle\n>({\n  expandsTo: ({ first, second }) => ({\n    paddingRight: first,\n    paddingLeft: second,\n  }),\n  maxValues: 2,\n});\n\nconst processPaddingSingle = processBoxModel<PaddingStyle, PaddingSafeStyle>();\n\nconst handlers = {\n  padding: processPadding<'padding'>,\n  paddingBottom: processPaddingSingle<'paddingBottom'>,\n  paddingHorizontal: processPaddingHorizontal<'paddingHorizontal'>,\n  paddingLeft: processPaddingSingle<'paddingLeft'>,\n  paddingRight: processPaddingSingle<'paddingRight'>,\n  paddingTop: processPaddingSingle<'paddingTop'>,\n  paddingVertical: processPaddingVertical<'paddingVertical'>,\n};\n\nexport default handlers;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/positioning.ts",
    "content": "import transformUnit from '../utils/units';\nimport offsetKeyword from '../utils/offsetKeyword';\nimport { processNoopValue } from './utils';\nimport { Container, Style, StyleKey } from '../types';\n\nconst isVerticalKeyword = (value: string) =>\n  value === 'top' || value === 'bottom';\n\nconst processObjectPosition = <K extends StyleKey>(\n  key: K,\n  value: Style[K],\n  container: Container,\n) => {\n  const match = `${value}`.split(' ');\n\n  let xValue: string;\n  let yValue: string;\n\n  if (match.length === 1) {\n    // Per CSS spec, single vertical keywords (top/bottom) default X to 'center'\n    // Single horizontal keywords (left/right/center) default Y to 'center'\n    if (isVerticalKeyword(match[0])) {\n      xValue = 'center';\n      yValue = match[0];\n    } else {\n      xValue = match[0];\n      yValue = 'center';\n    }\n  } else {\n    xValue = match[0];\n    yValue = match[1];\n  }\n\n  const objectPositionX = offsetKeyword(transformUnit(container, xValue));\n  const objectPositionY = offsetKeyword(transformUnit(container, yValue));\n\n  return { objectPositionX, objectPositionY };\n};\n\nconst processObjectPositionValue = <K extends StyleKey>(\n  key: K,\n  value: Style[K],\n  container: Container,\n) => ({\n  [key]: offsetKeyword(transformUnit(container, value)),\n});\n\nconst handlers = {\n  objectPosition: processObjectPosition<'objectPosition'>,\n  objectPositionX: processObjectPositionValue<'objectPositionX'>,\n  objectPositionY: processObjectPositionValue<'objectPositionY'>,\n  objectFit: processNoopValue<'objectFit'>,\n};\n\nexport default handlers;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/svg.ts",
    "content": "import {\n  processColorValue,\n  processNoopValue,\n  processNumberValue,\n  processUnitValue,\n} from './utils';\n\nconst handlers = {\n  fill: processColorValue<'fill'>,\n  stroke: processColorValue<'stroke'>,\n  strokeDasharray: processNoopValue<'strokeDasharray'>,\n  strokeWidth: processUnitValue<'strokeWidth'>,\n  fillOpacity: processNumberValue<'fillOpacity'>,\n  strokeOpacity: processNumberValue<'strokeOpacity'>,\n  fillRule: processNoopValue<'fillRule'>,\n  textAnchor: processNoopValue<'textAnchor'>,\n  strokeLinecap: processNoopValue<'strokeLinecap'>,\n  strokeLinejoin: processNoopValue<'strokeLinejoin'>,\n  visibility: processNoopValue<'visibility'>,\n  clipPath: processNoopValue<'clipPath'>,\n  dominantBaseline: processNoopValue<'dominantBaseline'>,\n};\n\nexport default handlers;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/text.ts",
    "content": "import {\n  processColorValue,\n  processNoopValue,\n  processNumberValue,\n  processUnitValue,\n} from './utils';\n\nimport { matchPercent } from '@react-pdf/fns';\n\nimport castInt from '../utils/castInt';\nimport transformUnit from '../utils/units';\nimport { Container, FontWeight, Style, StyleKey } from '../types';\n\nconst DEFAULT_FONT_SIZE = 18;\n\nconst FONT_WEIGHTS: Record<string, number> = {\n  thin: 100,\n  hairline: 100,\n  ultralight: 200,\n  extralight: 200,\n  light: 300,\n  normal: 400,\n  medium: 500,\n  semibold: 600,\n  demibold: 600,\n  bold: 700,\n  ultrabold: 800,\n  extrabold: 800,\n  heavy: 900,\n  black: 900,\n};\n\nconst transformFontWeight = (value: FontWeight): number => {\n  if (!value) return FONT_WEIGHTS.normal;\n  if (typeof value === 'number') return value;\n\n  const lv = value.toLowerCase();\n\n  if (lv in FONT_WEIGHTS) return FONT_WEIGHTS[lv];\n\n  return castInt(value);\n};\n\nconst processFontWeight = <K extends StyleKey>(key: K, value: Style[K]) => {\n  return { [key]: transformFontWeight(value as FontWeight) };\n};\n\nconst transformLineHeight = (\n  value: Style['lineHeight'],\n  styles: Style,\n  container: Container,\n): string | number => {\n  if (value === '') return value;\n\n  const fontSize = transformUnit(\n    container,\n    styles.fontSize || DEFAULT_FONT_SIZE,\n  ) as number;\n  const lineHeight = transformUnit(container, value) as number;\n\n  // Percent values: use this number multiplied by the element's font size\n  const { percent } = matchPercent(lineHeight) || {};\n  if (percent) return percent * fontSize;\n\n  // Unitless values: use this number multiplied by the element's font size\n  return isNaN(Number(value)) ? lineHeight : lineHeight * fontSize;\n};\n\nconst processLineHeight = <K extends StyleKey>(\n  key: K,\n  value: Style[K],\n  container: Container,\n  styles: Style,\n) => {\n  return {\n    [key]: transformLineHeight(value, styles, container),\n  };\n};\n\nconst handlers = {\n  direction: processNoopValue<'direction'>,\n  fontFamily: processNoopValue<'fontFamily'>,\n  fontSize: processUnitValue<'fontSize'>,\n  fontStyle: processNoopValue<'fontStyle'>,\n  fontWeight: processFontWeight<'fontWeight'>,\n  letterSpacing: processUnitValue<'letterSpacing'>,\n  lineHeight: processLineHeight<'lineHeight'>,\n  maxLines: processNumberValue<'maxLines'>,\n  textAlign: processNoopValue<'textAlign'>,\n  textDecoration: processNoopValue<'textDecoration'>,\n  textDecorationColor: processColorValue<'textDecorationColor'>,\n  textDecorationStyle: processNoopValue<'textDecorationStyle'>,\n  textIndent: processNoopValue<'textIndent'>,\n  textOverflow: processNoopValue<'textOverflow'>,\n  textTransform: processNoopValue<'textTransform'>,\n  verticalAlign: processNoopValue<'verticalAlign'>,\n};\n\nexport default handlers;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/transform.ts",
    "content": "import transformUnit from '../utils/units';\nimport castFloat from '../utils/castFloat';\nimport offsetKeyword from '../utils/offsetKeyword';\nimport { Container, Style, StyleKey, Transform } from '../types';\n\nconst parse = (transformString: string) => {\n  const transforms = transformString.trim().split(/\\)[ ,]|\\)/);\n\n  // Handle \"initial\", \"inherit\", \"unset\".\n  if (transforms.length === 1) {\n    return [[transforms[0], true]];\n  }\n\n  const parsed = [];\n\n  for (let i = 0; i < transforms.length; i += 1) {\n    const transform = transforms[i];\n\n    if (transform) {\n      const [name, rawValue] = transform.split('(');\n      const splitChar = rawValue.indexOf(',') >= 0 ? ',' : ' ';\n      const value = rawValue.split(splitChar).map((val) => val.trim());\n      parsed.push({ operation: name.trim(), value });\n    }\n  }\n\n  return parsed;\n};\n\nconst parseAngle = (value: string) => {\n  const unitsRegexp = /(-?\\d*\\.?\\d*)(\\w*)?/i;\n  const match = unitsRegexp.exec(value);\n  const angle = match?.[1] ?? '';\n  const unit = match?.[2] ?? '';\n  const number = Number.parseFloat(angle);\n\n  return unit === 'rad' ? (number * 180) / Math.PI : number;\n};\n\ntype ParsedTransformOperation = {\n  operation: string;\n  value: string[];\n};\n\nconst normalizeTransformOperation = ({\n  operation,\n  value,\n}: ParsedTransformOperation): Transform => {\n  switch (operation) {\n    case 'scale': {\n      const [scaleX, scaleY = scaleX] = value.map((num) =>\n        Number.parseFloat(num),\n      );\n      return { operation: 'scale', value: [scaleX, scaleY] };\n    }\n\n    case 'scaleX': {\n      return { operation: 'scale', value: [Number.parseFloat(value[0]), 1] };\n    }\n    case 'scaleY': {\n      return { operation: 'scale', value: [1, Number.parseFloat(value[0])] };\n    }\n\n    case 'rotate': {\n      return { operation: 'rotate', value: [parseAngle(value[0])] };\n    }\n\n    case 'translate': {\n      const [x, y] = value.map((num) => Number.parseFloat(num));\n      return { operation: 'translate', value: [x, y] };\n    }\n\n    case 'translateX': {\n      return {\n        operation: 'translate',\n        value: [Number.parseFloat(value[0]), 0],\n      };\n    }\n\n    case 'translateY': {\n      return {\n        operation: 'translate',\n        value: [0, Number.parseFloat(value[0])],\n      };\n    }\n\n    case 'skew': {\n      return {\n        operation: 'skew',\n        value: value.map(parseAngle) as [number, number],\n      };\n    }\n\n    case 'skewX': {\n      return { operation: 'skew', value: [parseAngle(value[0]), 0] };\n    }\n\n    case 'skewY': {\n      return { operation: 'skew', value: [0, parseAngle(value[0])] };\n    }\n\n    default: {\n      // Handle matrix and other potential operations\n      return {\n        operation,\n        value: value.map((num) => Number.parseFloat(num)),\n      } as Transform;\n    }\n  }\n};\n\nconst normalize = (operations: ParsedTransformOperation[]): Transform[] => {\n  return operations.map((operation) => normalizeTransformOperation(operation));\n};\n\nconst processTransform = (key: 'transform', value: Style['transform']) => {\n  if (typeof value !== 'string') return { [key]: value };\n\n  return { [key]: normalize(parse(value)) };\n};\n\nconst Y_AXIS_SHORTHANDS: Record<string, boolean> = { top: true, bottom: true };\n\nconst sortTransformOriginPair = (a: string, b: string) => {\n  if (Y_AXIS_SHORTHANDS[a]) return 1;\n  if (Y_AXIS_SHORTHANDS[b]) return -1;\n  return 0;\n};\n\nconst getTransformOriginPair = (values: string[]): [string, string] => {\n  if (!values || values.length === 0) return ['center', 'center'];\n\n  const pair: [string, string] =\n    values.length === 1 ? [values[0], 'center'] : [values[0], values[1]];\n\n  return pair.sort(sortTransformOriginPair) as [string, string];\n};\n\n// Transforms shorthand transformOrigin values\nconst processTransformOriginShorthand = <K extends StyleKey>(\n  key: K,\n  value: Style[K],\n  container: Container,\n) => {\n  const match = `${value}`.split(' ');\n\n  const pair = getTransformOriginPair(match);\n\n  const transformOriginX = transformUnit(container, pair[0]);\n  const transformOriginY = transformUnit(container, pair[1]);\n\n  return {\n    transformOriginX:\n      offsetKeyword(transformOriginX) || castFloat(transformOriginX),\n    transformOriginY:\n      offsetKeyword(transformOriginY) || castFloat(transformOriginY),\n  };\n};\n\nconst processTransformOriginValue = <K extends StyleKey>(\n  key: K,\n  value: Style[K],\n  container: Container,\n) => {\n  const v = transformUnit(container, value);\n  return { [key]: offsetKeyword(v) || castFloat(v) };\n};\n\nconst handlers = {\n  transform: processTransform,\n  gradientTransform: processTransform,\n  transformOrigin: processTransformOriginShorthand<'transformOrigin'>,\n  transformOriginX: processTransformOriginValue<'transformOriginX'>,\n  transformOriginY: processTransformOriginValue<'transformOriginY'>,\n};\n\nexport default handlers;\n"
  },
  {
    "path": "packages/stylesheet/src/resolve/utils.ts",
    "content": "import { parseFloat } from '@react-pdf/fns';\n\nimport transformUnit from '../utils/units';\nimport transformColor from '../utils/colors';\nimport { Container, Style, StyleKey } from '../types';\n\nexport const processNumberValue = <K extends StyleKey>(\n  key: K,\n  value: Style[K],\n) =>\n  ({\n    [key]: parseFloat(value),\n  }) as const;\n\nexport const processUnitValue = <K extends StyleKey>(\n  key: K,\n  value: Style[K],\n  container: Container,\n) => ({\n  [key]: transformUnit(container, value),\n});\n\nexport const processColorValue = <K extends StyleKey>(\n  key: K,\n  value: Style[K],\n) => {\n  const result = { [key]: transformColor(value) };\n  return result as { [P in K]: string };\n};\n\nexport const processNoopValue = <K extends StyleKey>(\n  key: K,\n  value: Style[K],\n) => ({\n  [key]: value,\n});\n"
  },
  {
    "path": "packages/stylesheet/src/types.ts",
    "content": "export type Container = {\n  width: number;\n  height: number;\n  dpi?: number;\n  remBase?: number;\n  orientation?: 'landscape' | 'portrait';\n};\n\nexport type Percentage = `${string}%`;\n\n// Borders\n\nexport type BorderStyleValue = 'dashed' | 'dotted' | 'solid';\n\nexport type BorderShorthandStyle = {\n  border?: number | string;\n  borderTop?: number | string;\n  borderRight?: number | string;\n  borderBottom?: number | string;\n  borderLeft?: number | string;\n  borderColor?: string;\n  borderRadius?: number | string;\n  borderStyle?: BorderStyleValue;\n  borderWidth?: number | string;\n};\n\nexport type BorderExpandedStyle = {\n  borderTopColor?: string;\n  borderTopStyle?: BorderStyleValue;\n  borderTopWidth?: number | string;\n  borderRightColor?: string;\n  borderRightStyle?: BorderStyleValue;\n  borderRightWidth?: number | string;\n  borderBottomColor?: string;\n  borderBottomStyle?: BorderStyleValue;\n  borderBottomWidth?: number | string;\n  borderLeftColor?: string;\n  borderLeftStyle?: BorderStyleValue;\n  borderLeftWidth?: number | string;\n  borderTopLeftRadius?: number | string;\n  borderTopRightRadius?: number | string;\n  borderBottomRightRadius?: number | string;\n  borderBottomLeftRadius?: number | string;\n};\n\nexport type BorderSafeStyle = BorderExpandedStyle & {\n  borderTopWidth?: number;\n  borderRightWidth?: number;\n  borderBottomWidth?: number;\n  borderLeftWidth?: number;\n  borderTopLeftRadius?: number | Percentage;\n  borderTopRightRadius?: number | Percentage;\n  borderBottomRightRadius?: number | Percentage;\n  borderBottomLeftRadius?: number | Percentage;\n};\n\nexport type BorderStyle = BorderShorthandStyle & BorderExpandedStyle;\n\n// Flexbox\n\nexport type FlexboxShorthandStyle = {\n  flex?: number | string;\n};\n\nexport type AlignContent =\n  | 'flex-start'\n  | 'flex-end'\n  | 'center'\n  | 'stretch'\n  | 'space-between'\n  | 'space-around'\n  | 'space-evenly';\n\nexport type AlignItems =\n  | 'flex-start'\n  | 'flex-end'\n  | 'center'\n  | 'stretch'\n  | 'baseline';\n\nexport type AlignSelf =\n  | 'auto'\n  | 'flex-start'\n  | 'flex-end'\n  | 'center'\n  | 'baseline'\n  | 'stretch';\n\nexport type FlexDirection = 'row' | 'row-reverse' | 'column' | 'column-reverse';\n\nexport type FlexWrap = 'nowrap' | 'wrap' | 'wrap-reverse';\n\nexport type JustifyContent =\n  | 'flex-start'\n  | 'flex-end'\n  | 'center'\n  | 'space-around'\n  | 'space-between'\n  | 'space-evenly';\n\nexport type JustifySelf = string; // not really supported\n\nexport type FlexboxExpandedStyle = {\n  alignContent?: AlignContent;\n  alignItems?: AlignItems;\n  alignSelf?: AlignSelf;\n  flexDirection?: FlexDirection;\n  flexWrap?: FlexWrap;\n  flexFlow?: number | string;\n  flexGrow?: number | string;\n  flexShrink?: number | string;\n  flexBasis?: number | string;\n  justifySelf?: JustifySelf;\n  justifyContent?: JustifyContent;\n};\n\nexport type FlexboxSafeStyle = FlexboxExpandedStyle & {\n  flexGrow?: number;\n  flexShrink?: number;\n};\n\nexport type FlexboxStyle = FlexboxShorthandStyle & FlexboxExpandedStyle;\n\n// Gap\n\nexport type GapShorthandStyle = {\n  gap?: number | string;\n};\n\nexport type GapExpandedStyle = {\n  rowGap?: number | string;\n  columnGap?: number | string;\n};\n\nexport type GapSafeStyle = {\n  rowGap?: number | string;\n  columnGap?: number | string;\n};\n\nexport type GapStyle = GapShorthandStyle & GapExpandedStyle;\n\n// Sizing/positioning\n\nexport type PositionShorthandStyle = {\n  objectPosition?: number | string;\n};\n\nexport type PositionExpandedStyle = {\n  objectPositionX?: number | string;\n  objectPositionY?: number | string;\n  objectFit?: string;\n};\n\nexport type PositionSafeStyle = PositionExpandedStyle & {\n  objectPositionX?: number;\n  objectPositionY?: number;\n};\n\nexport type PositioningStyle = PositionShorthandStyle & PositionExpandedStyle;\n\n// Transform\n\nexport type ScaleTransform = {\n  operation: 'scale';\n  value: [number, number];\n};\n\nexport type TranslateTransform = {\n  operation: 'translate';\n  value: [number, number];\n};\n\nexport type RotateTransform = {\n  operation: 'rotate';\n  value: [number];\n};\n\nexport type SkewTransform = {\n  operation: 'skew';\n  value: [number, number];\n};\n\nexport type MatrixTransform = {\n  operation: 'matrix';\n  value: [number, number, number, number, number, number];\n};\n\nexport type Transform =\n  | ScaleTransform\n  | TranslateTransform\n  | RotateTransform\n  | SkewTransform\n  | MatrixTransform;\n\nexport type TransformShorthandStyle = {\n  transformOrigin?: number | string;\n};\n\nexport type TransformExpandedStyle = {\n  transformOriginX?: number | string;\n  transformOriginY?: number | string;\n  transform?: string | Transform[];\n  gradientTransform?: string | Transform[];\n};\n\nexport type TransformSafeStyle = Omit<TransformExpandedStyle, 'transform'> & {\n  transformOriginX?: number | Percentage;\n  transformOriginY?: number | Percentage;\n  transform?: Transform[];\n  gradientTransform?: Transform[];\n};\n\nexport type TransformStyle = TransformShorthandStyle & TransformExpandedStyle;\n\n// Layout\n\nexport type Display = 'flex' | 'none';\n\nexport type Position = 'absolute' | 'relative' | 'static';\n\nexport type LayoutStyle = {\n  aspectRatio?: number | string;\n  bottom?: number | string;\n  display?: Display;\n  left?: number | string;\n  position?: Position;\n  right?: number | string;\n  top?: number | string;\n  overflow?: 'hidden';\n  zIndex?: number | string;\n};\n\nexport type LayoutExpandedStyle = LayoutStyle;\n\nexport type LayoutSafeStyle = LayoutExpandedStyle & {\n  aspectRatio?: number;\n  bottom?: number;\n  left?: number;\n  right?: number;\n  top?: number;\n  zIndex?: number;\n};\n\n// Dimensions\n\nexport type DimensionStyle = {\n  height?: number | string;\n  maxHeight?: number | string;\n  maxWidth?: number | string;\n  minHeight?: number | string;\n  minWidth?: number | string;\n  width?: number | string;\n};\n\nexport type DimensionExpandedStyle = DimensionStyle;\n\nexport type DimensionSafeStyle = DimensionExpandedStyle & {\n  height?: number | Percentage;\n  maxHeight?: number | Percentage;\n  maxWidth?: number | Percentage;\n  minHeight?: number | Percentage;\n  minWidth?: number | Percentage;\n  width?: number | Percentage;\n};\n\n// Colors\n\nexport type ColorStyle = {\n  backgroundColor?: string;\n  color?: string;\n  opacity?: number | string;\n};\n\nexport type ColorExpandedStyle = ColorStyle;\n\nexport type ColorSafeStyle = {\n  backgroundColor?: string;\n  color?: string;\n  opacity?: number;\n};\n\n// Text\n\nexport type FontStyle = 'normal' | 'italic' | 'oblique';\n\nexport type FontWeight =\n  | string\n  | number\n  | 'thin'\n  | 'hairline'\n  | 'ultralight'\n  | 'extralight'\n  | 'light'\n  | 'normal'\n  | 'medium'\n  | 'semibold'\n  | 'demibold'\n  | 'bold'\n  | 'ultrabold'\n  | 'extrabold'\n  | 'heavy'\n  | 'black';\n\nexport type TextAlign = 'left' | 'right' | 'center' | 'justify';\n\nexport type TextDecoration =\n  | 'line-through'\n  | 'underline'\n  | 'none'\n  | 'line-through underline'\n  | 'underline line-through';\n\nexport type TextDecorationStyle = 'dashed' | 'dotted' | 'solid' | string;\n\nexport type TextTransform =\n  | 'capitalize'\n  | 'lowercase'\n  | 'uppercase'\n  | 'upperfirst'\n  | 'none';\n\nexport type VerticalAlign = 'sub' | 'super';\n\nexport type TextStyle = {\n  direction?: 'ltr' | 'rtl';\n  fontSize?: number | string;\n  fontFamily?: string | string[];\n  fontStyle?: FontStyle;\n  fontWeight?: FontWeight;\n  letterSpacing?: number | string;\n  lineHeight?: number | string;\n  maxLines?: number | string;\n  textAlign?: TextAlign;\n  textDecoration?: TextDecoration;\n  textDecorationColor?: string;\n  textDecorationStyle?: TextDecorationStyle;\n  textIndent?: any; // ?\n  textOverflow?: 'ellipsis';\n  textTransform?: TextTransform;\n  verticalAlign?: VerticalAlign;\n};\n\nexport type TextExpandedStyle = TextStyle;\n\nexport type TextSafeStyle = TextExpandedStyle & {\n  fontSize?: number;\n  fontWeight?: number;\n  letterSpacing?: number;\n  lineHeight?: number;\n};\n\n// Margins\n\nexport type MarginShorthandStyle = {\n  margin?: number | string;\n  marginHorizontal?: number | string;\n  marginVertical?: number | string;\n};\n\nexport type MarginExpandedStyle = {\n  marginTop?: number | string;\n  marginRight?: number | string;\n  marginBottom?: number | string;\n  marginLeft?: number | string;\n};\n\nexport type MarginSafeStyle = MarginExpandedStyle & {\n  marginTop?: number | Percentage;\n  marginRight?: number | Percentage;\n  marginBottom?: number | Percentage;\n  marginLeft?: number | Percentage;\n};\n\nexport type MarginStyle = MarginShorthandStyle & MarginExpandedStyle;\n\n// Paddings\n\nexport type PaddingShorthandStyle = {\n  padding?: number | string;\n  paddingHorizontal?: number | string;\n  paddingVertical?: number | string;\n};\n\nexport type PaddingExpandedStyle = {\n  paddingTop?: number | string;\n  paddingRight?: number | string;\n  paddingBottom?: number | string;\n  paddingLeft?: number | string;\n};\n\nexport type PaddingSafeStyle = PaddingExpandedStyle & {\n  paddingTop?: number | Percentage;\n  paddingRight?: number | Percentage;\n  paddingBottom?: number | Percentage;\n  paddingLeft?: number | Percentage;\n};\n\nexport type PaddingStyle = PaddingShorthandStyle & PaddingExpandedStyle;\n\n// Svg\n\nexport interface SvgStyle {\n  fill?: string;\n  stroke?: string;\n  strokeDasharray?: string;\n  strokeWidth?: string | number;\n  fillOpacity?: string | number;\n  fillRule?: 'nonzero' | 'evenodd';\n  strokeOpacity?: string | number;\n  textAnchor?: 'start' | 'middle' | 'end';\n  strokeLinecap?: 'butt' | 'round' | 'square';\n  strokeLinejoin?: 'butt' | 'round' | 'square' | 'miter' | 'bevel';\n  visibility?: 'visible' | 'hidden' | 'collapse';\n  clipPath?: string;\n  dominantBaseline?:\n    | 'auto'\n    | 'middle'\n    | 'central'\n    | 'hanging'\n    | 'mathematical'\n    | 'text-after-edge'\n    | 'text-before-edge';\n}\n\nexport type SvgExpandedStyle = SvgStyle;\n\nexport type SvgSafeStyle = SvgStyle & {\n  strokeWidth?: number;\n  fillOpacity?: number;\n  strokeOpacity?: number;\n};\n\n// Global\n\ntype BaseStyle = BorderStyle &\n  ColorStyle &\n  DimensionStyle &\n  FlexboxStyle &\n  GapStyle &\n  LayoutStyle &\n  MarginStyle &\n  PaddingStyle &\n  PositioningStyle &\n  TextStyle &\n  TransformStyle &\n  SvgStyle;\n\ntype MediaQueryStyle = {\n  [key in `@media${string}`]: BaseStyle;\n};\n\nexport type Style = BaseStyle & MediaQueryStyle;\n\nexport type StyleKey = keyof BaseStyle;\n\nexport type ExpandedStyle = BorderExpandedStyle &\n  ColorExpandedStyle &\n  DimensionExpandedStyle &\n  FlexboxExpandedStyle &\n  GapExpandedStyle &\n  LayoutExpandedStyle &\n  MarginExpandedStyle &\n  PaddingExpandedStyle &\n  PositionExpandedStyle &\n  TextExpandedStyle &\n  TransformExpandedStyle &\n  SvgExpandedStyle;\n\nexport type SafeStyle = BorderSafeStyle &\n  ColorSafeStyle &\n  DimensionSafeStyle &\n  FlexboxSafeStyle &\n  GapSafeStyle &\n  LayoutSafeStyle &\n  MarginSafeStyle &\n  PaddingSafeStyle &\n  PositionSafeStyle &\n  TextSafeStyle &\n  TransformSafeStyle &\n  SvgSafeStyle;\n"
  },
  {
    "path": "packages/stylesheet/src/utils/castFloat.ts",
    "content": "const matchNumber = (value: string): boolean =>\n  /^-?(\\d+\\.?\\d*|\\d*\\.\\d+)$/.test(value);\n\nconst castFloat = (value: string | number): string | number => {\n  if (typeof value !== 'string') return value;\n  if (matchNumber(value)) return parseFloat(value);\n  return value;\n};\n\nexport default castFloat;\n"
  },
  {
    "path": "packages/stylesheet/src/utils/castInt.ts",
    "content": "const castInt = (value: string | number): number => {\n  if (typeof value === 'number') return value;\n\n  return parseInt(value, 10);\n};\n\nexport default castInt;\n"
  },
  {
    "path": "packages/stylesheet/src/utils/colors.ts",
    "content": "import hlsToHex from 'hsl-to-hex';\nimport colorString from 'color-string';\n\nconst isRgb = (value: string) => /^rgba?\\(/i.test(value);\nconst isHsl = (value: string) => /^hsla?\\(/i.test(value);\n\n/**\n * Transform rgb color to hexa\n *\n * @param value - Styles value\n * @returns Transformed value\n */\nconst parseRgb = (value: string) => {\n  const rgb = colorString.get.rgb(value);\n  if (!rgb) return value;\n  return colorString.to.hex(rgb);\n};\n\n/**\n * Transform Hsl color to hexa\n *\n * @param value - Styles value\n * @returns Transformed value\n */\nconst parseHsl = (value: string) => {\n  const hsl = colorString.get.hsl(value);\n  if (!hsl) return value;\n\n  const [h, s, l, a] = hsl;\n  const hex = hlsToHex(Math.round(h), Math.round(s), Math.round(l));\n\n  // Append alpha channel if not fully opaque\n  if (a !== undefined && a < 1) {\n    const alphaHex = Math.round(a * 255)\n      .toString(16)\n      .toUpperCase()\n      .padStart(2, '0');\n    return hex.toUpperCase() + alphaHex;\n  }\n\n  return hex.toUpperCase();\n};\n\n/**\n * Transform given color to hexa\n *\n * @param value - Styles value\n * @returns Transformed value\n */\nconst transformColor = (value: string): string => {\n  if (isRgb(value)) return parseRgb(value);\n  if (isHsl(value)) return parseHsl(value);\n\n  return value;\n};\n\nexport default transformColor;\n"
  },
  {
    "path": "packages/stylesheet/src/utils/offsetKeyword.ts",
    "content": "const offsetKeyword = (value) => {\n  switch (value) {\n    case 'top':\n    case 'left':\n      return '0%';\n    case 'right':\n    case 'bottom':\n      return '100%';\n    case 'center':\n      return '50%';\n    default:\n      return value;\n  }\n};\n\nexport default offsetKeyword;\n"
  },
  {
    "path": "packages/stylesheet/src/utils/units.ts",
    "content": "import { Container } from '../types';\n\ntype Unit = 'in' | 'mm' | 'cm' | 'pt' | 'vh' | 'vw' | 'px' | 'rem';\n\ntype ParsedValue =\n  | { value: number; unit: Unit }\n  | { value: number | string; unit: undefined };\n\nconst VALUE_REGEX = /^(-?\\d*\\.?\\d+)(in|mm|cm|pt|vh|vw|px|rem)?$/;\n\nconst DEFAULT_DPI = 72;\nconst DEFAULT_REM_BASE = 18;\nconst MM_PER_INCH = 25.4;\nconst CM_PER_INCH = 2.54;\n\n/**\n * Parses scalar value in value and unit pairs\n *\n * @param value - Scalar value\n * @returns Parsed value\n */\nconst parseValue = (value: string | number): ParsedValue => {\n  if (typeof value === 'number') return { value, unit: undefined };\n\n  const match = VALUE_REGEX.exec(value);\n\n  return match\n    ? { value: parseFloat(match[1]), unit: (match[2] || 'pt') as Unit }\n    : { value, unit: undefined };\n};\n\n/**\n * Transform given scalar value to points\n *\n * @param container - Container with dimensions and settings\n * @param value - Styles value\n * @returns Transformed value in points\n */\nconst transformUnit = (\n  container: Container,\n  value: string | number,\n): number | string => {\n  const scalar = parseValue(value);\n\n  if (typeof scalar.value !== 'number') return scalar.value;\n\n  const inputDpi = container.dpi || DEFAULT_DPI;\n\n  switch (scalar.unit) {\n    case 'rem':\n      return scalar.value * (container.remBase || DEFAULT_REM_BASE);\n    case 'in':\n      return scalar.value * DEFAULT_DPI;\n    case 'mm':\n      return scalar.value * (DEFAULT_DPI / MM_PER_INCH);\n    case 'cm':\n      return scalar.value * (DEFAULT_DPI / CM_PER_INCH);\n    case 'vh':\n      return scalar.value * (container.height / 100);\n    case 'vw':\n      return scalar.value * (container.width / 100);\n    case 'px':\n      return Math.round(scalar.value * (DEFAULT_DPI / inputDpi));\n    default:\n      return scalar.value;\n  }\n};\n\nexport default transformUnit;\n"
  },
  {
    "path": "packages/stylesheet/tests/borders.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../src/resolve';\n\nconst container = { width: 200, height: 400, remBase: 10 };\n\nconst resolveStyle = resolve(container);\n\ndescribe('resolve stylesheet borders', () => {\n  test('should resolve border shorthand', () => {\n    const styles = resolveStyle({ border: '1in solid rgb(255, 0, 255)' });\n\n    expect(styles).toEqual({\n      borderTopStyle: 'solid',\n      borderLeftStyle: 'solid',\n      borderRightStyle: 'solid',\n      borderBottomStyle: 'solid',\n      borderTopColor: '#FF00FF',\n      borderLeftColor: '#FF00FF',\n      borderRightColor: '#FF00FF',\n      borderBottomColor: '#FF00FF',\n      borderTopWidth: 72,\n      borderLeftWidth: 72,\n      borderRightWidth: 72,\n      borderBottomWidth: 72,\n    });\n  });\n\n  test('should resolve border shorthand with decimal units', () => {\n    const styles = resolveStyle({ border: '1.5in solid rgb(255, 0, 255)' });\n\n    expect(styles).toEqual({\n      borderTopStyle: 'solid',\n      borderLeftStyle: 'solid',\n      borderRightStyle: 'solid',\n      borderBottomStyle: 'solid',\n      borderTopColor: '#FF00FF',\n      borderLeftColor: '#FF00FF',\n      borderRightColor: '#FF00FF',\n      borderBottomColor: '#FF00FF',\n      borderTopWidth: 108,\n      borderLeftWidth: 108,\n      borderRightWidth: 108,\n      borderBottomWidth: 108,\n    });\n  });\n\n  test('should resolve border top shorthand', () => {\n    const styles = resolveStyle({ borderTop: '3px dashed hsl(0, 100%, 50%)' });\n\n    expect(styles).toEqual({\n      borderTopWidth: 3,\n      borderTopStyle: 'dashed',\n      borderTopColor: '#FF0000',\n    });\n  });\n\n  test('should resolve border right shorthand', () => {\n    const styles = resolveStyle({ borderRight: '1 solid red' });\n\n    expect(styles).toEqual({\n      borderRightColor: 'red',\n      borderRightStyle: 'solid',\n      borderRightWidth: 1,\n    });\n  });\n\n  test('should resolve border bottom shorthand', () => {\n    const styles = resolveStyle({ borderBottom: '1px dashed #000' });\n\n    expect(styles).toEqual({\n      borderBottomColor: '#000',\n      borderBottomStyle: 'dashed',\n      borderBottomWidth: 1,\n    });\n  });\n\n  test('should resolve border left shorthand', () => {\n    const styles = resolveStyle({ borderLeft: '1in solid rgb(1, 0, 0)' });\n\n    expect(styles).toEqual({\n      borderLeftColor: '#010000',\n      borderLeftStyle: 'solid',\n      borderLeftWidth: 72,\n    });\n  });\n\n  test('should resolve border color shorthand', () => {\n    const styles = resolveStyle({ borderColor: 'red' });\n\n    expect(styles).toEqual({\n      borderTopColor: 'red',\n      borderRightColor: 'red',\n      borderBottomColor: 'red',\n      borderLeftColor: 'red',\n    });\n  });\n\n  test('should resolve border hex color shorthand', () => {\n    const styles = resolveStyle({ borderColor: '#FF0000' });\n\n    expect(styles).toEqual({\n      borderTopColor: '#FF0000',\n      borderRightColor: '#FF0000',\n      borderBottomColor: '#FF0000',\n      borderLeftColor: '#FF0000',\n    });\n  });\n\n  test('should resolve border rgb color shorthand', () => {\n    const styles = resolveStyle({ borderColor: 'rgb(255, 0, 0)' });\n\n    expect(styles).toEqual({\n      borderTopColor: '#FF0000',\n      borderRightColor: '#FF0000',\n      borderBottomColor: '#FF0000',\n      borderLeftColor: '#FF0000',\n    });\n  });\n\n  test('should resolve border rgba color shorthand', () => {\n    const styles = resolveStyle({ borderColor: 'rgba(0, 255, 0, 0.5)' });\n\n    expect(styles).toEqual({\n      borderTopColor: '#00FF0080',\n      borderRightColor: '#00FF0080',\n      borderBottomColor: '#00FF0080',\n      borderLeftColor: '#00FF0080',\n    });\n  });\n\n  test('should resolve border hsl color shorthand', () => {\n    const styles = resolveStyle({ borderColor: 'hsl(0, 100%, 50%)' });\n\n    expect(styles).toEqual({\n      borderTopColor: '#FF0000',\n      borderRightColor: '#FF0000',\n      borderBottomColor: '#FF0000',\n      borderLeftColor: '#FF0000',\n    });\n  });\n\n  test('should resolve border hsla color shorthand', () => {\n    const styles = resolveStyle({ borderColor: 'hsla(0, 100%, 50%, 0.5)' });\n\n    expect(styles).toEqual({\n      borderTopColor: '#FF000080',\n      borderRightColor: '#FF000080',\n      borderBottomColor: '#FF000080',\n      borderLeftColor: '#FF000080',\n    });\n  });\n\n  test('should resolve border hex color', () => {\n    const styles = resolveStyle({\n      borderTopColor: '#FF0000',\n      borderRightColor: '#FF0000',\n      borderBottomColor: '#FF0000',\n      borderLeftColor: '#FF0000',\n    });\n\n    expect(styles).toEqual({\n      borderTopColor: '#FF0000',\n      borderRightColor: '#FF0000',\n      borderBottomColor: '#FF0000',\n      borderLeftColor: '#FF0000',\n    });\n  });\n\n  test('should resolve border rgb color', () => {\n    const styles = resolveStyle({\n      borderTopColor: 'rgb(255, 0, 0)',\n      borderRightColor: 'rgb(255, 0, 0)',\n      borderBottomColor: 'rgb(255, 0, 0)',\n      borderLeftColor: 'rgb(255, 0, 0)',\n    });\n\n    expect(styles).toEqual({\n      borderTopColor: '#FF0000',\n      borderRightColor: '#FF0000',\n      borderBottomColor: '#FF0000',\n      borderLeftColor: '#FF0000',\n    });\n  });\n\n  test('should resolve border rgba color', () => {\n    const styles = resolveStyle({\n      borderTopColor: 'rgba(0, 255, 0, 0.5)',\n      borderRightColor: 'rgba(0, 255, 0, 0.5)',\n      borderBottomColor: 'rgba(0, 255, 0, 0.5)',\n      borderLeftColor: 'rgba(0, 255, 0, 0.5)',\n    });\n\n    expect(styles).toEqual({\n      borderTopColor: '#00FF0080',\n      borderRightColor: '#00FF0080',\n      borderBottomColor: '#00FF0080',\n      borderLeftColor: '#00FF0080',\n    });\n  });\n\n  test('should resolve border hsl color', () => {\n    const styles = resolveStyle({\n      borderTopColor: 'hsl(0, 100%, 50%)',\n      borderRightColor: 'hsl(0, 100%, 50%)',\n      borderBottomColor: 'hsl(0, 100%, 50%)',\n      borderLeftColor: 'hsl(0, 100%, 50%)',\n    });\n\n    expect(styles).toEqual({\n      borderTopColor: '#FF0000',\n      borderRightColor: '#FF0000',\n      borderBottomColor: '#FF0000',\n      borderLeftColor: '#FF0000',\n    });\n  });\n\n  test('should resolve border hsla color', () => {\n    const styles = resolveStyle({\n      borderTopColor: 'hsla(0, 100%, 50%, 0.5)',\n      borderRightColor: 'hsla(0, 100%, 50%, 0.5)',\n      borderBottomColor: 'hsla(0, 100%, 50%, 0.5)',\n      borderLeftColor: 'hsla(0, 100%, 50%, 0.5)',\n    });\n\n    expect(styles).toEqual({\n      borderTopColor: '#FF000080',\n      borderRightColor: '#FF000080',\n      borderBottomColor: '#FF000080',\n      borderLeftColor: '#FF000080',\n    });\n  });\n\n  test('should resolve border radius shorthand', () => {\n    const styles = resolveStyle({ borderRadius: '5px' });\n\n    expect(styles).toEqual({\n      borderTopLeftRadius: 5,\n      borderTopRightRadius: 5,\n      borderBottomRightRadius: 5,\n      borderBottomLeftRadius: 5,\n    });\n  });\n\n  test('should resolve border style shorthand', () => {\n    const styles = resolveStyle({ borderStyle: 'solid' });\n\n    expect(styles).toEqual({\n      borderTopStyle: 'solid',\n      borderRightStyle: 'solid',\n      borderBottomStyle: 'solid',\n      borderLeftStyle: 'solid',\n    });\n  });\n\n  test('should resolve border width shorthand', () => {\n    const styles = resolveStyle({ borderWidth: 5 });\n\n    expect(styles).toEqual({\n      borderTopWidth: 5,\n      borderRightWidth: 5,\n      borderBottomWidth: 5,\n      borderLeftWidth: 5,\n    });\n  });\n\n  test('should resolve borders in in', () => {\n    const styles = resolveStyle({\n      borderTopWidth: '1in',\n      borderRightWidth: '2in',\n      borderBottomWidth: '3in',\n      borderLeftWidth: '4in',\n    });\n\n    expect(styles.borderTopWidth).toBe(72);\n    expect(styles.borderRightWidth).toBe(72 * 2);\n    expect(styles.borderBottomWidth).toBe(72 * 3);\n    expect(styles.borderLeftWidth).toBe(72 * 4);\n  });\n\n  test('should resolve borders in vw', () => {\n    const styles = resolveStyle({\n      borderTopWidth: '10vw',\n      borderRightWidth: '20vw',\n      borderBottomWidth: '30vw',\n      borderLeftWidth: '40vw',\n    });\n\n    expect(styles.borderTopWidth).toBe(20);\n    expect(styles.borderRightWidth).toBe(40);\n    expect(styles.borderBottomWidth).toBe(60);\n    expect(styles.borderLeftWidth).toBe(80);\n  });\n\n  test('should resolve borders in vh', () => {\n    const styles = resolveStyle({\n      borderTopWidth: '10vh',\n      borderRightWidth: '20vh',\n      borderBottomWidth: '30vh',\n      borderLeftWidth: '40vh',\n    });\n\n    expect(styles.borderTopWidth).toBe(40);\n    expect(styles.borderRightWidth).toBe(80);\n    expect(styles.borderBottomWidth).toBe(120);\n    expect(styles.borderLeftWidth).toBe(160);\n  });\n\n  test('should resolve borders in mm', () => {\n    const styles = resolveStyle({\n      borderTopWidth: '1mm',\n      borderRightWidth: '2mm',\n      borderBottomWidth: '3mm',\n      borderLeftWidth: '4mm',\n    });\n\n    expect(styles.borderTopWidth).toBeCloseTo(2.83, 1);\n    expect(styles.borderRightWidth).toBeCloseTo(2.83 * 2, 1);\n    expect(styles.borderBottomWidth).toBeCloseTo(2.83 * 3, 1);\n    expect(styles.borderLeftWidth).toBeCloseTo(2.83 * 4, 1);\n  });\n\n  test('should resolve borders in cm', () => {\n    const styles = resolveStyle({\n      borderTopWidth: '1cm',\n      borderRightWidth: '2cm',\n      borderBottomWidth: '3cm',\n      borderLeftWidth: '4cm',\n    });\n\n    expect(styles.borderTopWidth).toBeCloseTo(28.346, 1);\n    expect(styles.borderRightWidth).toBeCloseTo(28.346 * 2, 1);\n    expect(styles.borderBottomWidth).toBeCloseTo(28.346 * 3, 1);\n    expect(styles.borderLeftWidth).toBeCloseTo(28.346 * 4, 1);\n  });\n\n  test('should resolve borders in rem', () => {\n    const styles = resolveStyle({\n      borderTopWidth: '1rem',\n      borderRightWidth: '2rem',\n      borderBottomWidth: '3rem',\n      borderLeftWidth: '4rem',\n    });\n\n    expect(styles.borderTopWidth).toBe(10);\n    expect(styles.borderRightWidth).toBe(20);\n    expect(styles.borderBottomWidth).toBe(30);\n    expect(styles.borderLeftWidth).toBe(40);\n  });\n\n  test('should resolve borders in pt', () => {\n    const styles = resolveStyle({\n      borderTopWidth: '10pt',\n      borderRightWidth: '20pt',\n      borderBottomWidth: '30pt',\n      borderLeftWidth: '40pt',\n    });\n\n    expect(styles.borderTopWidth).toBe(10);\n    expect(styles.borderRightWidth).toBe(20);\n    expect(styles.borderBottomWidth).toBe(30);\n    expect(styles.borderLeftWidth).toBe(40);\n  });\n\n  test('should resolve border width shorthand with string units', () => {\n    const styles = resolveStyle({ borderWidth: '2in' });\n\n    expect(styles).toEqual({\n      borderTopWidth: 144,\n      borderRightWidth: 144,\n      borderBottomWidth: 144,\n      borderLeftWidth: 144,\n    });\n  });\n\n  test('should resolve border shorthand with pt units', () => {\n    const styles = resolveStyle({ border: '10pt solid blue' });\n\n    expect(styles).toEqual({\n      borderTopStyle: 'solid',\n      borderLeftStyle: 'solid',\n      borderRightStyle: 'solid',\n      borderBottomStyle: 'solid',\n      borderTopColor: 'blue',\n      borderLeftColor: 'blue',\n      borderRightColor: 'blue',\n      borderBottomColor: 'blue',\n      borderTopWidth: 10,\n      borderLeftWidth: 10,\n      borderRightWidth: 10,\n      borderBottomWidth: 10,\n    });\n  });\n\n  test('should resolve border shorthand with rem units', () => {\n    const styles = resolveStyle({ border: '2rem dashed green' });\n\n    expect(styles).toEqual({\n      borderTopStyle: 'dashed',\n      borderLeftStyle: 'dashed',\n      borderRightStyle: 'dashed',\n      borderBottomStyle: 'dashed',\n      borderTopColor: 'green',\n      borderLeftColor: 'green',\n      borderRightColor: 'green',\n      borderBottomColor: 'green',\n      borderTopWidth: 20,\n      borderLeftWidth: 20,\n      borderRightWidth: 20,\n      borderBottomWidth: 20,\n    });\n  });\n\n  test('should resolve border shorthand with zero width', () => {\n    const styles = resolveStyle({ border: '0 solid red' });\n\n    expect(styles).toEqual({\n      borderTopStyle: 'solid',\n      borderLeftStyle: 'solid',\n      borderRightStyle: 'solid',\n      borderBottomStyle: 'solid',\n      borderTopColor: 'red',\n      borderLeftColor: 'red',\n      borderRightColor: 'red',\n      borderBottomColor: 'red',\n      borderTopWidth: 0,\n      borderLeftWidth: 0,\n      borderRightWidth: 0,\n      borderBottomWidth: 0,\n    });\n  });\n\n  test('should resolve individual border styles', () => {\n    const styles = resolveStyle({\n      borderTopStyle: 'solid',\n      borderRightStyle: 'dashed',\n      borderBottomStyle: 'dotted',\n      borderLeftStyle: 'solid',\n    });\n\n    expect(styles).toEqual({\n      borderTopStyle: 'solid',\n      borderRightStyle: 'dashed',\n      borderBottomStyle: 'dotted',\n      borderLeftStyle: 'solid',\n    });\n  });\n\n  test('should resolve individual border radius', () => {\n    const styles = resolveStyle({\n      borderTopLeftRadius: 5,\n      borderTopRightRadius: 10,\n      borderBottomRightRadius: 15,\n      borderBottomLeftRadius: 20,\n    });\n\n    expect(styles).toEqual({\n      borderTopLeftRadius: 5,\n      borderTopRightRadius: 10,\n      borderBottomRightRadius: 15,\n      borderBottomLeftRadius: 20,\n    });\n  });\n\n  test('should resolve individual border radius with units', () => {\n    const styles = resolveStyle({\n      borderTopLeftRadius: '1in',\n      borderTopRightRadius: '10vw',\n      borderBottomRightRadius: '10vh',\n      borderBottomLeftRadius: '1rem',\n    });\n\n    expect(styles).toEqual({\n      borderTopLeftRadius: 72,\n      borderTopRightRadius: 20,\n      borderBottomRightRadius: 40,\n      borderBottomLeftRadius: 10,\n    });\n  });\n\n  test('should resolve border radius shorthand with in units', () => {\n    const styles = resolveStyle({ borderRadius: '0.5in' });\n\n    expect(styles).toEqual({\n      borderTopLeftRadius: 36,\n      borderTopRightRadius: 36,\n      borderBottomRightRadius: 36,\n      borderBottomLeftRadius: 36,\n    });\n  });\n\n  test('should resolve border radius shorthand with rem units', () => {\n    const styles = resolveStyle({ borderRadius: '2rem' });\n\n    expect(styles).toEqual({\n      borderTopLeftRadius: 20,\n      borderTopRightRadius: 20,\n      borderBottomRightRadius: 20,\n      borderBottomLeftRadius: 20,\n    });\n  });\n\n  test('should resolve border radius shorthand with vw units', () => {\n    const styles = resolveStyle({ borderRadius: '5vw' });\n\n    expect(styles).toEqual({\n      borderTopLeftRadius: 10,\n      borderTopRightRadius: 10,\n      borderBottomRightRadius: 10,\n      borderBottomLeftRadius: 10,\n    });\n  });\n\n  test('should resolve border shorthand with multiple whitespaces', () => {\n    const styles = resolveStyle({ border: '2px   solid   blue' });\n\n    expect(styles).toEqual({\n      borderTopStyle: 'solid',\n      borderLeftStyle: 'solid',\n      borderRightStyle: 'solid',\n      borderBottomStyle: 'solid',\n      borderTopColor: 'blue',\n      borderLeftColor: 'blue',\n      borderRightColor: 'blue',\n      borderBottomColor: 'blue',\n      borderTopWidth: 2,\n      borderLeftWidth: 2,\n      borderRightWidth: 2,\n      borderBottomWidth: 2,\n    });\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/colors.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../src/resolve';\n\nconst container = { width: 200, height: 400, remBase: 10 };\n\nconst resolveStyle = resolve(container);\n\ndescribe('resolve stylesheet colors', () => {\n  test('should keep hex colors as they are', () => {\n    const styles = resolveStyle({\n      color: '#0000FF',\n      backgroundColor: '#FF0000',\n      textDecorationColor: '#00FF00',\n    });\n\n    expect(styles.color).toBe('#0000FF');\n    expect(styles.backgroundColor).toBe('#FF0000');\n    expect(styles.textDecorationColor).toBe('#00FF00');\n  });\n\n  test('should resolve rgb colors to hexa', () => {\n    const styles = resolveStyle({\n      color: 'rgb(255, 0, 0)',\n      backgroundColor: 'rgb(0, 0, 255)',\n      textDecorationColor: 'rgb(0, 255, 0)',\n    });\n\n    expect(styles.color).toBe('#FF0000');\n    expect(styles.backgroundColor).toBe('#0000FF');\n    expect(styles.textDecorationColor).toBe('#00FF00');\n  });\n\n  test('should resolve rgba colors to hexa', () => {\n    const styles = resolveStyle({\n      color: 'rgba(0, 255, 0, 0.5)',\n      backgroundColor: 'rgba(255, 255, 0, 0.1)',\n      textDecorationColor: 'rgba(0, 0, 255, 0.75)',\n    });\n\n    expect(styles.color).toBe('#00FF0080');\n    expect(styles.backgroundColor).toBe('#FFFF001A');\n    expect(styles.textDecorationColor).toBe('#0000FFBF');\n  });\n\n  test('should resolve hsl colors to hexa', () => {\n    const styles = resolveStyle({\n      color: 'hsl(0, 100%, 50%)',\n      backgroundColor: 'hsl(204, 100%, 50%)',\n      textDecorationColor: 'hsl(120, 100%, 50%)',\n    });\n\n    expect(styles.color).toBe('#FF0000');\n    expect(styles.backgroundColor).toBe('#0099FF');\n    expect(styles.textDecorationColor).toBe('#00FF00');\n  });\n\n  test('should resolve hsla colors to hexa', () => {\n    const styles = resolveStyle({\n      color: 'hsla(0, 100%, 50%, 0.5)',\n      backgroundColor: 'hsla(204, 100%, 50%, 1)',\n      textDecorationColor: 'hsla(120, 100%, 50%, 0.75)',\n    });\n\n    expect(styles.color).toBe('#FF000080');\n    expect(styles.backgroundColor).toBe('#0099FF');\n    expect(styles.textDecorationColor).toBe('#00FF00BF');\n  });\n\n  test('should resolve integer opacity', () => {\n    const styles = resolveStyle({ opacity: 0 });\n\n    expect(styles.opacity).toBe(0);\n  });\n\n  test('should resolve float opacity', () => {\n    const styles = resolveStyle({ opacity: 0.4 });\n\n    expect(styles.opacity).toBe(0.4);\n  });\n\n  test('should resolve string opacity', () => {\n    const styles = resolveStyle({ opacity: '0.4' });\n\n    expect(styles.opacity).toBe(0.4);\n  });\n\n  test('should keep named colors as they are', () => {\n    const styles = resolveStyle({\n      color: 'red',\n      backgroundColor: 'blue',\n      textDecorationColor: 'transparent',\n    });\n\n    expect(styles.color).toBe('red');\n    expect(styles.backgroundColor).toBe('blue');\n    expect(styles.textDecorationColor).toBe('transparent');\n  });\n\n  test('should keep short hex colors as they are', () => {\n    const styles = resolveStyle({\n      color: '#F00',\n      backgroundColor: '#0F0',\n      textDecorationColor: '#00F',\n    });\n\n    expect(styles.color).toBe('#F00');\n    expect(styles.backgroundColor).toBe('#0F0');\n    expect(styles.textDecorationColor).toBe('#00F');\n  });\n\n  test('should keep 8-digit hex colors as they are', () => {\n    const styles = resolveStyle({\n      color: '#FF000080',\n      backgroundColor: '#00FF00BF',\n    });\n\n    expect(styles.color).toBe('#FF000080');\n    expect(styles.backgroundColor).toBe('#00FF00BF');\n  });\n\n  test('should keep 4-digit hex colors as they are', () => {\n    const styles = resolveStyle({\n      color: '#F008',\n      backgroundColor: '#0F0F',\n    });\n\n    expect(styles.color).toBe('#F008');\n    expect(styles.backgroundColor).toBe('#0F0F');\n  });\n\n  test('should resolve full opacity', () => {\n    const styles = resolveStyle({ opacity: 1 });\n\n    expect(styles.opacity).toBe(1);\n  });\n\n  test('should resolve string full opacity', () => {\n    const styles = resolveStyle({ opacity: '1' });\n\n    expect(styles.opacity).toBe(1);\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/dimensions.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../src/resolve';\n\nconst container = { width: 200, height: 400, remBase: 10 };\n\nconst resolveStyle = resolve(container);\n\ndescribe('resolve stylesheet dimensions', () => {\n  test('should resolve width dimensions', () => {\n    const styles = resolveStyle({ width: '1in' });\n\n    expect(styles.width).toBe(72);\n  });\n\n  test('should resolve width px dimensions', () => {\n    const styles = resolveStyle({ width: '1px' });\n\n    expect(styles.width).toBe(1);\n  });\n\n  test('should resolve width mm dimensions', () => {\n    const styles = resolveStyle({ width: '1mm' });\n\n    expect(styles.width).toBeCloseTo(2.83, 1);\n  });\n\n  test('should resolve width cm dimensions', () => {\n    const styles = resolveStyle({ width: '1cm' });\n\n    expect(styles.width).toBeCloseTo(28.346, 1);\n  });\n\n  test('should resolve width vw dimensions', () => {\n    const styles = resolveStyle({ width: '50vw' });\n\n    expect(styles.width).toBe(100);\n  });\n\n  test('should resolve width vh dimensions', () => {\n    const styles = resolveStyle({ width: '50vh' });\n\n    expect(styles.width).toBe(200);\n  });\n\n  test('should resolve width percentage dimensions', () => {\n    const styles = resolveStyle({ width: '50%' });\n\n    expect(styles.width).toBe('50%');\n  });\n\n  test('should resolve min/max width in dimensions', () => {\n    const styles = resolveStyle({ minWidth: '1in', maxWidth: '2in' });\n\n    expect(styles.minWidth).toBe(72);\n    expect(styles.maxWidth).toBe(72 * 2);\n  });\n\n  test('should resolve min/max width mm dimensions', () => {\n    const styles = resolveStyle({ minWidth: '1mm', maxWidth: '2mm' });\n\n    expect(styles.minWidth).toBeCloseTo(2.83, 1);\n    expect(styles.maxWidth).toBeCloseTo(2.83 * 2, 1);\n  });\n\n  test('should resolve min/max width cm dimensions', () => {\n    const styles = resolveStyle({ minWidth: '1cm', maxWidth: '2cm' });\n\n    expect(styles.minWidth).toBeCloseTo(28.346, 1);\n    expect(styles.maxWidth).toBeCloseTo(28.346 * 2, 1);\n  });\n\n  test('should resolve min/max width vw dimensions', () => {\n    const styles = resolveStyle({ minWidth: '50vw', maxWidth: '20vw' });\n\n    expect(styles.minWidth).toBe(100);\n    expect(styles.maxWidth).toBe(40);\n  });\n\n  test('should resolve min/max width vh dimensions', () => {\n    const styles = resolveStyle({ minWidth: '50vh', maxWidth: '20vh' });\n\n    expect(styles.minWidth).toBe(200);\n    expect(styles.maxWidth).toBe(80);\n  });\n\n  test('should resolve min/max width percent dimensions', () => {\n    const styles = resolveStyle({ minWidth: '50%', maxWidth: '20%' });\n\n    expect(styles.minWidth).toBe('50%');\n    expect(styles.maxWidth).toBe('20%');\n  });\n\n  test('should resolve height dimensions', () => {\n    const styles = resolveStyle({ height: '1in' });\n\n    expect(styles.height).toBe(72);\n  });\n\n  test('should resolve height px dimensions', () => {\n    const styles = resolveStyle({ height: '1px' });\n\n    expect(styles.height).toBe(1);\n  });\n\n  test('should resolve height mm dimensions', () => {\n    const styles = resolveStyle({ height: '1mm' });\n\n    expect(styles.height).toBeCloseTo(2.83, 1);\n  });\n\n  test('should resolve height cm dimensions', () => {\n    const styles = resolveStyle({ height: '1cm' });\n\n    expect(styles.height).toBeCloseTo(28.346, 1);\n  });\n\n  test('should resolve height vw dimensions', () => {\n    const styles = resolveStyle({ height: '50vw' });\n\n    expect(styles.height).toBe(100);\n  });\n\n  test('should resolve height vh dimensions', () => {\n    const styles = resolveStyle({ height: '50vh' });\n\n    expect(styles.height).toBe(200);\n  });\n\n  test('should resolve height percentage dimensions', () => {\n    const styles = resolveStyle({ height: '50%' });\n\n    expect(styles.height).toBe('50%');\n  });\n\n  test('should resolve min/max height in dimensions', () => {\n    const styles = resolveStyle({ minHeight: '1in', maxHeight: '2in' });\n\n    expect(styles.minHeight).toBe(72);\n    expect(styles.maxHeight).toBe(72 * 2);\n  });\n\n  test('should resolve min/max height mm dimensions', () => {\n    const styles = resolveStyle({ minHeight: '1mm', maxHeight: '2mm' });\n\n    expect(styles.minHeight).toBeCloseTo(2.83, 1);\n    expect(styles.maxHeight).toBeCloseTo(2.83 * 2, 1);\n  });\n\n  test('should resolve min/max height cm dimensions', () => {\n    const styles = resolveStyle({ minHeight: '1cm', maxHeight: '2cm' });\n\n    expect(styles.minHeight).toBeCloseTo(28.346, 1);\n    expect(styles.maxHeight).toBeCloseTo(28.346 * 2, 1);\n  });\n\n  test('should resolve min/max height vw dimensions', () => {\n    const styles = resolveStyle({ minHeight: '50vw', maxHeight: '20vw' });\n\n    expect(styles.minHeight).toBe(100);\n    expect(styles.maxHeight).toBe(40);\n  });\n\n  test('should resolve min/max height vh dimensions', () => {\n    const styles = resolveStyle({ minHeight: '50vh', maxHeight: '20vh' });\n\n    expect(styles.minHeight).toBe(200);\n    expect(styles.maxHeight).toBe(80);\n  });\n\n  test('should resolve min/max height percentage dimensions', () => {\n    const styles = resolveStyle({ minHeight: '50%', maxHeight: '20%' });\n\n    expect(styles.minHeight).toBe('50%');\n    expect(styles.maxHeight).toBe('20%');\n  });\n\n  test('should resolve width pt dimensions', () => {\n    const styles = resolveStyle({ width: '100pt' });\n\n    expect(styles.width).toBe(100);\n  });\n\n  test('should resolve height pt dimensions', () => {\n    const styles = resolveStyle({ height: '100pt' });\n\n    expect(styles.height).toBe(100);\n  });\n\n  test('should resolve width rem dimensions', () => {\n    const styles = resolveStyle({ width: '2rem' });\n\n    expect(styles.width).toBe(20);\n  });\n\n  test('should resolve height rem dimensions', () => {\n    const styles = resolveStyle({ height: '2rem' });\n\n    expect(styles.height).toBe(20);\n  });\n\n  test('should resolve min/max width rem dimensions', () => {\n    const styles = resolveStyle({ minWidth: '1rem', maxWidth: '3rem' });\n\n    expect(styles.minWidth).toBe(10);\n    expect(styles.maxWidth).toBe(30);\n  });\n\n  test('should resolve min/max height rem dimensions', () => {\n    const styles = resolveStyle({ minHeight: '1rem', maxHeight: '3rem' });\n\n    expect(styles.minHeight).toBe(10);\n    expect(styles.maxHeight).toBe(30);\n  });\n\n  test('should resolve numeric width value', () => {\n    const styles = resolveStyle({ width: 100 });\n\n    expect(styles.width).toBe(100);\n  });\n\n  test('should resolve numeric height value', () => {\n    const styles = resolveStyle({ height: 100 });\n\n    expect(styles.height).toBe(100);\n  });\n\n  test('should resolve string number width as pt', () => {\n    const styles = resolveStyle({ width: '100' });\n\n    expect(styles.width).toBe(100);\n  });\n\n  test('should resolve negative width dimensions', () => {\n    const styles = resolveStyle({ width: '-10pt' });\n\n    expect(styles.width).toBe(-10);\n  });\n\n  test('should resolve zero width dimensions', () => {\n    const styles = resolveStyle({ width: '0' });\n\n    expect(styles.width).toBe(0);\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/flatten.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport flatten from '../src/flatten';\n\ndescribe('stylesheet flatten', () => {\n  test('should return empty object for undefined', () => {\n    const style = undefined;\n    const result = flatten(style);\n\n    expect(result).toEqual({});\n  });\n\n  test('should return empty object for null', () => {\n    const style = null;\n    const result = flatten(style);\n\n    expect(result).toEqual({});\n  });\n\n  test('should return empty object for empty object', () => {\n    const style = {};\n    const result = flatten(style);\n\n    expect(result).toEqual({});\n  });\n\n  test('should return empty object for empty array', () => {\n    const style: [] = [];\n    const result = flatten(style);\n\n    expect(result).toEqual({});\n  });\n\n  test('should return identity for single style object', () => {\n    const style = { color: 'red', textAlign: 'center' as const };\n    const result = flatten(style);\n\n    expect(result).toEqual(style);\n  });\n\n  test('should return identity for single style object array', () => {\n    const style = [{ color: 'red', textAlign: 'center' as const }];\n    const result = flatten(style);\n\n    expect(result).toEqual(style[0]);\n  });\n\n  test('should return identity for single style object array with nil values', () => {\n    const style = [\n      null,\n      { color: 'red', textAlign: 'center' as const },\n      undefined,\n    ];\n    const result = flatten(style);\n\n    expect(result).toEqual(style[1]);\n  });\n\n  test('should return flatten several style objects', () => {\n    const style = [\n      { backgroundColor: 'black' },\n      { color: 'red', textAlign: 'center' as const },\n    ];\n    const result = flatten(style);\n\n    expect(result).toEqual({\n      backgroundColor: 'black',\n      color: 'red',\n      textAlign: 'center',\n    });\n  });\n\n  test('should return object of merged values from array', () => {\n    const styles = [{ fontSize: 16, color: 'white' }, { color: 'green' }];\n    const result = flatten(styles);\n\n    return expect(result).toEqual({ fontSize: 16, color: 'green' });\n  });\n\n  test('should return flatten several style objects with nil values', () => {\n    const style = [\n      null,\n      { backgroundColor: 'black' },\n      undefined,\n      { color: 'red', textAlign: 'center' as const },\n      null,\n    ];\n    const result = flatten(style);\n\n    expect(result).toEqual({\n      backgroundColor: 'black',\n      color: 'red',\n      textAlign: 'center',\n    });\n  });\n\n  test('should return flatten nested style objects', () => {\n    const style = [\n      { backgroundColor: 'black' },\n      [{ color: 'red', textAlign: 'center' as const }],\n    ];\n    const result = flatten(style);\n\n    expect(result).toEqual({\n      backgroundColor: 'black',\n      color: 'red',\n      textAlign: 'center',\n    });\n  });\n\n  test('should return flatten nested style objects with nil values', () => {\n    const style = [\n      null,\n      { backgroundColor: 'black' },\n      undefined,\n      [null, { color: 'red', textAlign: 'center' as const }, undefined],\n    ];\n    const result = flatten(style);\n\n    expect(result).toEqual({\n      backgroundColor: 'black',\n      color: 'red',\n      textAlign: 'center',\n    });\n  });\n\n  test('should return empty object for array with only nil values', () => {\n    const style = [null, undefined, null];\n    const result = flatten(style);\n\n    expect(result).toEqual({});\n  });\n\n  test('should flatten deeply nested style arrays', () => {\n    const style = [\n      { color: 'red' },\n      [[{ fontSize: 12 }], [{ backgroundColor: 'blue' }]],\n      [[[{ margin: 10 }]]],\n    ];\n    const result = flatten(style);\n\n    expect(result).toEqual({\n      color: 'red',\n      fontSize: 12,\n      backgroundColor: 'blue',\n      margin: 10,\n    });\n  });\n\n  test('should ignore null values inside style objects', () => {\n    const style = [{ color: 'red', fontSize: null as unknown as number }];\n    const result = flatten(style);\n\n    expect(result).toEqual({ color: 'red' });\n  });\n\n  test('should ignore undefined values inside style objects', () => {\n    const style = [{ color: 'red', fontSize: undefined }];\n    const result = flatten(style);\n\n    expect(result).toEqual({ color: 'red' });\n  });\n\n  test('should not override with null values from later styles', () => {\n    const style = [\n      { color: 'red', fontSize: 12 },\n      { color: null as unknown as string },\n    ];\n    const result = flatten(style);\n\n    expect(result).toEqual({ color: 'red', fontSize: 12 });\n  });\n\n  test('should preserve falsy values like 0', () => {\n    const style = [{ margin: 10 }, { margin: 0 }];\n    const result = flatten(style);\n\n    expect(result).toEqual({ margin: 0 });\n  });\n\n  test('should preserve empty string values', () => {\n    const style = [{ color: 'red' }, { color: '' }];\n    const result = flatten(style);\n\n    expect(result).toEqual({ color: '' });\n  });\n\n  test('should handle complex merge with multiple overlapping keys', () => {\n    const style = [\n      { color: 'red', fontSize: 12, margin: 5 },\n      { color: 'blue', padding: 10 },\n      { fontSize: 14, margin: 10 },\n    ];\n    const result = flatten(style);\n\n    expect(result).toEqual({\n      color: 'blue',\n      fontSize: 14,\n      margin: 10,\n      padding: 10,\n    });\n  });\n\n  test('should handle nested arrays with overlapping keys', () => {\n    const style = [\n      { color: 'red' },\n      [{ color: 'blue' }, { color: 'green' }],\n      { color: 'yellow' },\n    ];\n    const result = flatten(style);\n\n    expect(result).toEqual({ color: 'yellow' });\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/flex.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../src/resolve';\n\nconst container = { width: 200, height: 400, remBase: 10 };\n\nconst resolveStyle = resolve(container);\n\ndescribe('resolve stylesheet flex', () => {\n  test('should resolve flex shorthand', () => {\n    const style = resolveStyle({ flex: '1 2 20%' });\n\n    expect(style).toEqual({\n      flexGrow: 1,\n      flexShrink: 2,\n      flexBasis: '20%',\n    });\n  });\n\n  test('should resolve flex align content', () => {\n    const styles = resolveStyle({ alignContent: 'center' });\n\n    expect(styles).toEqual({ alignContent: 'center' });\n  });\n\n  test('should resolve flex align items', () => {\n    const styles = resolveStyle({ alignItems: 'center' });\n\n    expect(styles).toEqual({ alignItems: 'center' });\n  });\n\n  test('should resolve flex align self', () => {\n    const styles = resolveStyle({ alignSelf: 'center' });\n\n    expect(styles).toEqual({ alignSelf: 'center' });\n  });\n\n  test('should resolve flex direction', () => {\n    const styles = resolveStyle({ flexDirection: 'row' });\n\n    expect(styles).toEqual({ flexDirection: 'row' });\n  });\n\n  test('should resolve flex wrap', () => {\n    const styles = resolveStyle({ flexWrap: 'wrap' });\n\n    expect(styles).toEqual({ flexWrap: 'wrap' });\n  });\n\n  test('should resolve flex grow', () => {\n    const styles = resolveStyle({ flexGrow: 1 });\n\n    expect(styles).toEqual({ flexGrow: 1 });\n  });\n\n  test('should resolve string flex grow', () => {\n    const styles = resolveStyle({ flexGrow: '1' });\n\n    expect(styles).toEqual({ flexGrow: 1 });\n  });\n\n  test('should resolve flex shrink', () => {\n    const styles = resolveStyle({ flexShrink: 1 });\n\n    expect(styles).toEqual({ flexShrink: 1 });\n  });\n\n  test('should resolve string flex shrink', () => {\n    const styles = resolveStyle({ flexShrink: '1' });\n\n    expect(styles).toEqual({ flexShrink: 1 });\n  });\n\n  test('should resolve flex basis', () => {\n    const styles = resolveStyle({ flexBasis: 1 });\n\n    expect(styles).toEqual({ flexBasis: 1 });\n  });\n\n  test('should resolve string flex basis', () => {\n    const styles = resolveStyle({ flexBasis: '1' });\n\n    expect(styles).toEqual({ flexBasis: 1 });\n  });\n\n  test('should resolve flex basis percent', () => {\n    const styles = resolveStyle({ flexBasis: '40%' });\n\n    expect(styles).toEqual({ flexBasis: '40%' });\n  });\n\n  test('should resolve flex basis auto', () => {\n    const styles = resolveStyle({ flexBasis: 'auto' });\n\n    expect(styles).toEqual({ flexBasis: 'auto' });\n  });\n\n  test('should resolve flex justify content', () => {\n    const styles = resolveStyle({ justifyContent: 'space-between' });\n\n    expect(styles).toEqual({ justifyContent: 'space-between' });\n  });\n\n  test('should resolve flex justify self', () => {\n    const styles = resolveStyle({ justifySelf: 'center' });\n\n    expect(styles).toEqual({ justifySelf: 'center' });\n  });\n\n  test('should resolve flex flow', () => {\n    const styles = resolveStyle({ flexFlow: 'row wrap' });\n\n    expect(styles).toEqual({ flexFlow: 'row wrap' });\n  });\n\n  test('should resolve flex shorthand auto', () => {\n    const style = resolveStyle({ flex: 'auto' });\n\n    expect(style).toEqual({\n      flexGrow: 1,\n      flexShrink: 1,\n      flexBasis: 'auto',\n    });\n  });\n\n  test('should resolve flex shorthand none', () => {\n    const style = resolveStyle({ flex: 'none' });\n\n    expect(style).toEqual({\n      flexGrow: 0,\n      flexShrink: 0,\n      flexBasis: 'auto',\n    });\n  });\n\n  test('should resolve flex shorthand initial', () => {\n    const style = resolveStyle({ flex: 'initial' });\n\n    expect(style).toEqual({\n      flexGrow: 0,\n      flexShrink: 1,\n      flexBasis: 'auto',\n    });\n  });\n\n  test('should resolve flex shorthand single value', () => {\n    const style = resolveStyle({ flex: '2' });\n\n    expect(style).toEqual({\n      flexGrow: 2,\n      flexShrink: 1,\n      flexBasis: 0,\n    });\n  });\n\n  test('should resolve flex shorthand two values', () => {\n    const style = resolveStyle({ flex: '2 3' });\n\n    expect(style).toEqual({\n      flexGrow: 2,\n      flexShrink: 3,\n      flexBasis: 0,\n    });\n  });\n\n  test('should resolve flex shorthand numeric value', () => {\n    const style = resolveStyle({ flex: 1 });\n\n    expect(style).toEqual({\n      flexGrow: 1,\n      flexShrink: 1,\n      flexBasis: 0,\n    });\n  });\n\n  test('should resolve flex basis with in unit', () => {\n    const styles = resolveStyle({ flexBasis: '1in' });\n\n    expect(styles).toEqual({ flexBasis: 72 });\n  });\n\n  test('should resolve flex basis with rem unit', () => {\n    const styles = resolveStyle({ flexBasis: '2rem' });\n\n    expect(styles).toEqual({ flexBasis: 20 });\n  });\n\n  test('should resolve flex basis with vw unit', () => {\n    const styles = resolveStyle({ flexBasis: '50vw' });\n\n    expect(styles).toEqual({ flexBasis: 100 });\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/gap.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../src/resolve';\n\nconst container = { width: 200, height: 400, remBase: 10 };\n\nconst resolveStyle = resolve(container);\n\ndescribe('resolve stylesheet gap', () => {\n  test('should resolve gap shorthand', () => {\n    const styles = resolveStyle({ gap: '2px' });\n\n    expect(styles).toEqual({\n      columnGap: 2,\n      rowGap: 2,\n    });\n  });\n\n  test('should resolve row gap', () => {\n    const styles = resolveStyle({ rowGap: '1in' });\n\n    expect(styles).toEqual({\n      rowGap: 72,\n    });\n  });\n\n  test('should resolve column gap', () => {\n    const styles = resolveStyle({ columnGap: '1in' });\n\n    expect(styles).toEqual({\n      columnGap: 72,\n    });\n  });\n\n  test('should resolve gap shorthand with two values', () => {\n    const styles = resolveStyle({ gap: '10px 20px' });\n\n    expect(styles).toEqual({\n      rowGap: 10,\n      columnGap: 20,\n    });\n  });\n\n  test('should resolve gap with rem unit', () => {\n    const styles = resolveStyle({ gap: '2rem' });\n\n    expect(styles).toEqual({\n      rowGap: 20,\n      columnGap: 20,\n    });\n  });\n\n  test('should resolve gap with vw unit', () => {\n    const styles = resolveStyle({ gap: '50vw' });\n\n    expect(styles).toEqual({\n      rowGap: 100,\n      columnGap: 100,\n    });\n  });\n\n  test('should resolve gap with vh unit', () => {\n    const styles = resolveStyle({ gap: '50vh' });\n\n    expect(styles).toEqual({\n      rowGap: 200,\n      columnGap: 200,\n    });\n  });\n\n  test('should resolve gap with pt unit', () => {\n    const styles = resolveStyle({ gap: '10pt' });\n\n    expect(styles).toEqual({\n      rowGap: 10,\n      columnGap: 10,\n    });\n  });\n\n  test('should resolve gap shorthand with mixed units', () => {\n    const styles = resolveStyle({ gap: '1in 2rem' });\n\n    expect(styles).toEqual({\n      rowGap: 72,\n      columnGap: 20,\n    });\n  });\n\n  test('should resolve row gap with rem unit', () => {\n    const styles = resolveStyle({ rowGap: '2rem' });\n\n    expect(styles).toEqual({\n      rowGap: 20,\n    });\n  });\n\n  test('should resolve column gap with rem unit', () => {\n    const styles = resolveStyle({ columnGap: '2rem' });\n\n    expect(styles).toEqual({\n      columnGap: 20,\n    });\n  });\n\n  test('should resolve numeric gap value', () => {\n    const styles = resolveStyle({ gap: 10 });\n\n    expect(styles).toEqual({\n      rowGap: 10,\n      columnGap: 10,\n    });\n  });\n\n  test('should resolve numeric row gap value', () => {\n    const styles = resolveStyle({ rowGap: 15 });\n\n    expect(styles).toEqual({\n      rowGap: 15,\n    });\n  });\n\n  test('should resolve numeric column gap value', () => {\n    const styles = resolveStyle({ columnGap: 15 });\n\n    expect(styles).toEqual({\n      columnGap: 15,\n    });\n  });\n\n  test('should resolve gap percentage value', () => {\n    const styles = resolveStyle({ gap: '10%' });\n\n    expect(styles).toEqual({\n      rowGap: '10%',\n      columnGap: '10%',\n    });\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/layout.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../src/resolve';\n\nconst container = { width: 200, height: 400, remBase: 10 };\n\nconst resolveStyle = resolve(container);\n\ndescribe('resolve stylesheet layout', () => {\n  test('should resolve positions in in dimensions', () => {\n    const styles = resolveStyle({\n      top: '1in',\n      right: '2in',\n      bottom: '3in',\n      left: '4in',\n    });\n\n    expect(styles.top).toBe(72);\n    expect(styles.right).toBe(72 * 2);\n    expect(styles.bottom).toBe(72 * 3);\n    expect(styles.left).toBe(72 * 4);\n  });\n\n  test('should resolve positions in mm dimensions', () => {\n    const styles = resolveStyle({\n      top: '1mm',\n      right: '2mm',\n      bottom: '3mm',\n      left: '4mm',\n    });\n\n    expect(styles.top).toBeCloseTo(2.83, 1);\n    expect(styles.right).toBeCloseTo(2.83 * 2, 1);\n    expect(styles.bottom).toBeCloseTo(2.83 * 3, 1);\n    expect(styles.left).toBeCloseTo(2.83 * 4, 1);\n  });\n\n  test('should resolve positions in cm dimensions', () => {\n    const styles = resolveStyle({\n      top: '1cm',\n      right: '2cm',\n      bottom: '3cm',\n      left: '4cm',\n    });\n\n    expect(styles.top).toBeCloseTo(28.346, 1);\n    expect(styles.right).toBeCloseTo(28.346 * 2, 1);\n    expect(styles.bottom).toBeCloseTo(28.346 * 3, 1);\n    expect(styles.left).toBeCloseTo(28.346 * 4, 1);\n  });\n\n  test('should resolve aspect ratio', () => {\n    const styles = resolveStyle({ aspectRatio: '2' });\n\n    expect(styles).toEqual({ aspectRatio: 2 });\n  });\n\n  test('should resolve display', () => {\n    const styles = resolveStyle({ display: 'flex' });\n\n    expect(styles).toEqual({ display: 'flex' });\n  });\n\n  test('should resolve position', () => {\n    const styles = resolveStyle({ position: 'absolute' });\n\n    expect(styles).toEqual({ position: 'absolute' });\n  });\n\n  test('should resolve overflow', () => {\n    const styles = resolveStyle({ overflow: 'hidden' });\n\n    expect(styles).toEqual({ overflow: 'hidden' });\n  });\n\n  test('should resolve z index', () => {\n    const styles = resolveStyle({ zIndex: '2' });\n\n    expect(styles).toEqual({ zIndex: 2 });\n  });\n\n  test('should resolve numeric z index', () => {\n    const styles = resolveStyle({ zIndex: 5 });\n\n    expect(styles).toEqual({ zIndex: 5 });\n  });\n\n  test('should resolve numeric aspect ratio', () => {\n    const styles = resolveStyle({ aspectRatio: 1.5 });\n\n    expect(styles).toEqual({ aspectRatio: 1.5 });\n  });\n\n  test('should resolve positions in px dimensions', () => {\n    const styles = resolveStyle({\n      top: '10px',\n      right: '20px',\n      bottom: '30px',\n      left: '40px',\n    });\n\n    expect(styles.top).toBe(10);\n    expect(styles.right).toBe(20);\n    expect(styles.bottom).toBe(30);\n    expect(styles.left).toBe(40);\n  });\n\n  test('should resolve positions in pt dimensions', () => {\n    const styles = resolveStyle({\n      top: '10pt',\n      right: '20pt',\n      bottom: '30pt',\n      left: '40pt',\n    });\n\n    expect(styles.top).toBe(10);\n    expect(styles.right).toBe(20);\n    expect(styles.bottom).toBe(30);\n    expect(styles.left).toBe(40);\n  });\n\n  test('should resolve positions in rem dimensions', () => {\n    const styles = resolveStyle({\n      top: '1rem',\n      right: '2rem',\n      bottom: '3rem',\n      left: '4rem',\n    });\n\n    expect(styles.top).toBe(10);\n    expect(styles.right).toBe(20);\n    expect(styles.bottom).toBe(30);\n    expect(styles.left).toBe(40);\n  });\n\n  test('should resolve positions in vw dimensions', () => {\n    const styles = resolveStyle({\n      top: '10vw',\n      right: '20vw',\n      bottom: '30vw',\n      left: '40vw',\n    });\n\n    expect(styles.top).toBe(20);\n    expect(styles.right).toBe(40);\n    expect(styles.bottom).toBe(60);\n    expect(styles.left).toBe(80);\n  });\n\n  test('should resolve positions in vh dimensions', () => {\n    const styles = resolveStyle({\n      top: '10vh',\n      right: '20vh',\n      bottom: '30vh',\n      left: '40vh',\n    });\n\n    expect(styles.top).toBe(40);\n    expect(styles.right).toBe(80);\n    expect(styles.bottom).toBe(120);\n    expect(styles.left).toBe(160);\n  });\n\n  test('should resolve positions in percentage dimensions', () => {\n    const styles = resolveStyle({\n      top: '10%',\n      right: '20%',\n      bottom: '30%',\n      left: '40%',\n    });\n\n    expect(styles.top).toBe('10%');\n    expect(styles.right).toBe('20%');\n    expect(styles.bottom).toBe('30%');\n    expect(styles.left).toBe('40%');\n  });\n\n  test('should resolve numeric positions', () => {\n    const styles = resolveStyle({\n      top: 10,\n      right: 20,\n      bottom: 30,\n      left: 40,\n    });\n\n    expect(styles.top).toBe(10);\n    expect(styles.right).toBe(20);\n    expect(styles.bottom).toBe(30);\n    expect(styles.left).toBe(40);\n  });\n\n  test('should resolve negative positions', () => {\n    const styles = resolveStyle({\n      top: '-10pt',\n      right: '-20pt',\n      bottom: '-30pt',\n      left: '-40pt',\n    });\n\n    expect(styles.top).toBe(-10);\n    expect(styles.right).toBe(-20);\n    expect(styles.bottom).toBe(-30);\n    expect(styles.left).toBe(-40);\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/margins.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../src/resolve';\n\nconst container = { width: 200, height: 400, remBase: 10 };\n\nconst resolveStyle = resolve(container);\n\ndescribe('resolve stylesheet margins', () => {\n  test('should ignore invalid values', () => {\n    const margins = [\n      { margin: '\"string\"' },\n      { margin: 'url(\"link.com\")' },\n      { margin: 'auto 2 black 4' },\n      { margin: 'calc(100% - 10px)' },\n      { margin: 'rgba(1 1 1 / 0.3)' },\n      { margin: '1, 2, 3' },\n      { marginLeft: 'yellow' },\n      { marginTop: '12lelkek' },\n      { marginBottom: '1 2 3' },\n      { marginHorizontal: '1 2 3' },\n      { margin: '1 2 3 4 5' },\n      { margin: () => {} },\n    ];\n    const expanded = {};\n\n    margins.forEach((style) => {\n      expect(resolveStyle(style as any)).toEqual(expanded);\n    });\n  });\n\n  test('should resolve margin shorthand', () => {\n    const styles = resolveStyle({ margin: '2in' });\n\n    expect(styles).toEqual({\n      marginLeft: 144,\n      marginRight: 144,\n      marginTop: 144,\n      marginBottom: 144,\n    });\n  });\n\n  test('should resolve margin axis shorthand', () => {\n    const styles = resolveStyle({ margin: '10px 1in' });\n\n    expect(styles).toEqual({\n      marginTop: 10,\n      marginLeft: 72,\n      marginRight: 72,\n      marginBottom: 10,\n    });\n  });\n\n  test('should resolve margin edges shorthand', () => {\n    const styles = resolveStyle({ margin: '10 20 30 40' });\n\n    expect(styles).toEqual({\n      marginTop: 10,\n      marginLeft: 40,\n      marginRight: 20,\n      marginBottom: 30,\n    });\n  });\n\n  test('should resolve margin edges shorthand units', () => {\n    const styles = resolveStyle({ margin: '10cm 20in 30mm 40pt' });\n\n    expect(styles).toEqual({\n      marginLeft: 40,\n      marginRight: 1440,\n      marginTop: 283.46456692913387,\n      marginBottom: 85.03937007874016,\n    });\n  });\n\n  test('should resolve margin edges shorthand negative values', () => {\n    const styles = resolveStyle({ margin: '-10 -20in -30mm -40%' });\n\n    expect(styles).toEqual({\n      marginTop: -10,\n      marginLeft: '-40%',\n      marginRight: -1440,\n      marginBottom: -85.03937007874016,\n    });\n  });\n\n  test('should resolve margin shorthand with auto', () => {\n    const margins = [\n      { margin: 'auto 2 3 4' },\n      { margin: '1 auto 3 4' },\n      { margin: '1 2 auto 4' },\n      { margin: '1 2 3 auto' },\n    ];\n\n    const expandedMargins = [\n      {\n        marginTop: 'auto',\n        marginRight: 2,\n        marginBottom: 3,\n        marginLeft: 4,\n      },\n      {\n        marginTop: 1,\n        marginRight: 'auto',\n        marginBottom: 3,\n        marginLeft: 4,\n      },\n      {\n        marginTop: 1,\n        marginRight: 2,\n        marginBottom: 'auto',\n        marginLeft: 4,\n      },\n      {\n        marginTop: 1,\n        marginRight: 2,\n        marginBottom: 3,\n        marginLeft: 'auto',\n      },\n    ];\n\n    margins.forEach((style, index) => {\n      expect(resolveStyle(style)).toEqual(expandedMargins[index]);\n    });\n  });\n\n  test('should resolve margin edges shorthand units with decimals', () => {\n    const styles = resolveStyle({\n      margin: '10.5cm 20.005in 30.10mm 40.0000005pt',\n    });\n\n    expect(styles).toEqual({\n      marginRight: 1440.36,\n      marginLeft: 40.0000005,\n      marginTop: 297.6377952755905,\n      marginBottom: 85.3228346456693,\n    });\n  });\n\n  test('should resolve margin auto shorthand', () => {\n    const styles = resolveStyle({ margin: 'auto' });\n\n    expect(styles).toEqual({\n      marginRight: 'auto',\n      marginLeft: 'auto',\n      marginTop: 'auto',\n      marginBottom: 'auto',\n    });\n  });\n\n  test('should resolve margin horizontal shorthand', () => {\n    const styles = resolveStyle({ marginHorizontal: 4 });\n\n    expect(styles).toEqual({\n      marginLeft: 4,\n      marginRight: 4,\n    });\n  });\n\n  test('should resolve margin horizontal edges shorthand', () => {\n    const styles = resolveStyle({ marginHorizontal: '1 2' });\n\n    expect(styles).toEqual({\n      marginRight: 1,\n      marginLeft: 2,\n    });\n  });\n\n  test('should resolve margin horizontal auto shorthand', () => {\n    const styles = resolveStyle({ marginHorizontal: 'auto' });\n\n    expect(styles).toEqual({\n      marginRight: 'auto',\n      marginLeft: 'auto',\n    });\n  });\n\n  test('should resolve margin vertical shorthand', () => {\n    const styles = resolveStyle({ marginVertical: '4' });\n\n    expect(styles).toEqual({\n      marginTop: 4,\n      marginBottom: 4,\n    });\n  });\n\n  test('should resolve margin vertical edges shorthand', () => {\n    const styles = resolveStyle({ marginVertical: '2 4' });\n\n    expect(styles).toEqual({\n      marginTop: 2,\n      marginBottom: 4,\n    });\n  });\n\n  test('should resolve margin vertical auth shorthand', () => {\n    const styles = resolveStyle({ marginVertical: 'auto' });\n\n    expect(styles).toEqual({\n      marginTop: 'auto',\n      marginBottom: 'auto',\n    });\n  });\n\n  test('should resolve margin units correctly', () => {\n    const styles = resolveStyle({\n      marginTop: '10cm',\n      marginRight: '20in',\n      marginBottom: '30mm',\n      marginLeft: '40pt',\n    });\n\n    expect(styles).toEqual({\n      marginLeft: 40,\n      marginRight: 1440,\n      marginTop: 283.46456692913387,\n      marginBottom: 85.03937007874016,\n    });\n  });\n\n  test('should resolve margin vw dimensions', () => {\n    const styles = resolveStyle({\n      marginTop: '10vw',\n      marginRight: '20vw',\n      marginBottom: '30vw',\n      marginLeft: '40vw',\n    });\n\n    expect(styles.marginTop).toBe(20);\n    expect(styles.marginRight).toBe(40);\n    expect(styles.marginBottom).toBe(60);\n    expect(styles.marginLeft).toBe(80);\n  });\n\n  test('should resolve margin vh dimensions', () => {\n    const styles = resolveStyle({\n      marginTop: '10vh',\n      marginRight: '20vh',\n      marginBottom: '30vh',\n      marginLeft: '40vh',\n    });\n\n    expect(styles.marginTop).toBe(40);\n    expect(styles.marginRight).toBe(80);\n    expect(styles.marginBottom).toBe(120);\n    expect(styles.marginLeft).toBe(160);\n  });\n\n  test('should resolve expanded margin mm dimensions', () => {\n    const styles = resolveStyle({\n      marginTop: '1mm',\n      marginRight: '2mm',\n      marginBottom: '3mm',\n      marginLeft: '4mm',\n    });\n\n    expect(styles.marginTop).toBeCloseTo(2.83, 1);\n    expect(styles.marginRight).toBeCloseTo(2.83 * 2, 1);\n    expect(styles.marginBottom).toBeCloseTo(2.83 * 3, 1);\n    expect(styles.marginLeft).toBeCloseTo(2.83 * 4, 1);\n  });\n\n  test('should resolve expanded margin cm dimensions', () => {\n    const styles = resolveStyle({\n      marginTop: '1cm',\n      marginRight: '2cm',\n      marginBottom: '3cm',\n      marginLeft: '4cm',\n    });\n\n    expect(styles.marginTop).toBeCloseTo(28.346, 1);\n    expect(styles.marginRight).toBeCloseTo(28.346 * 2, 1);\n    expect(styles.marginBottom).toBeCloseTo(28.346 * 3, 1);\n    expect(styles.marginLeft).toBeCloseTo(28.346 * 4, 1);\n  });\n\n  test('should resolve values with improper formatting', () => {\n    const styles = resolveStyle({ margin: '  1 ' });\n\n    expect(styles).toEqual({\n      marginTop: 1,\n      marginRight: 1,\n      marginBottom: 1,\n      marginLeft: 1,\n    });\n  });\n\n  test('should resolve margin shorthand with three values', () => {\n    const styles = resolveStyle({ margin: '10 20 30' });\n\n    expect(styles).toEqual({\n      marginTop: 10,\n      marginRight: 20,\n      marginBottom: 30,\n      marginLeft: 20,\n    });\n  });\n\n  test('should resolve individual margin with auto', () => {\n    const styles = resolveStyle({\n      marginTop: 'auto',\n      marginRight: 'auto',\n      marginBottom: 'auto',\n      marginLeft: 'auto',\n    });\n\n    expect(styles).toEqual({\n      marginTop: 'auto',\n      marginRight: 'auto',\n      marginBottom: 'auto',\n      marginLeft: 'auto',\n    });\n  });\n\n  test('should resolve individual margin with percentage', () => {\n    const styles = resolveStyle({\n      marginTop: '10%',\n      marginRight: '20%',\n      marginBottom: '30%',\n      marginLeft: '40%',\n    });\n\n    expect(styles).toEqual({\n      marginTop: '10%',\n      marginRight: '20%',\n      marginBottom: '30%',\n      marginLeft: '40%',\n    });\n  });\n\n  test('should resolve numeric individual margins', () => {\n    const styles = resolveStyle({\n      marginTop: 10,\n      marginRight: 20,\n      marginBottom: 30,\n      marginLeft: 40,\n    });\n\n    expect(styles).toEqual({\n      marginTop: 10,\n      marginRight: 20,\n      marginBottom: 30,\n      marginLeft: 40,\n    });\n  });\n\n  test('should resolve margin rem dimensions', () => {\n    const styles = resolveStyle({\n      marginTop: '1rem',\n      marginRight: '2rem',\n      marginBottom: '3rem',\n      marginLeft: '4rem',\n    });\n\n    expect(styles.marginTop).toBe(10);\n    expect(styles.marginRight).toBe(20);\n    expect(styles.marginBottom).toBe(30);\n    expect(styles.marginLeft).toBe(40);\n  });\n\n  test('should resolve margin shorthand with rem', () => {\n    const styles = resolveStyle({ margin: '2rem' });\n\n    expect(styles).toEqual({\n      marginTop: 20,\n      marginRight: 20,\n      marginBottom: 20,\n      marginLeft: 20,\n    });\n  });\n\n  test('should resolve margin horizontal with rem', () => {\n    const styles = resolveStyle({ marginHorizontal: '2rem' });\n\n    expect(styles).toEqual({\n      marginLeft: 20,\n      marginRight: 20,\n    });\n  });\n\n  test('should resolve margin vertical with rem', () => {\n    const styles = resolveStyle({ marginVertical: '2rem' });\n\n    expect(styles).toEqual({\n      marginTop: 20,\n      marginBottom: 20,\n    });\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/mediaQueries.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolveMediaQueries from '../src/mediaQueries';\n\ndescribe('media queries', () => {\n  describe('max-height', () => {\n    test('should match when container height is less than max-height', () => {\n      const styles = resolveMediaQueries(\n        { width: 100, height: 300 },\n        {\n          '@media max-height: 500': {\n            color: 'red',\n          },\n        },\n      );\n\n      expect(styles.color).toBe('red');\n    });\n\n    test('should not match when container height exceeds max-height', () => {\n      const styles = resolveMediaQueries(\n        { width: 100, height: 600 },\n        {\n          '@media max-height: 500': {\n            color: 'red',\n          },\n        },\n      );\n\n      expect(styles.color).toBe(undefined);\n    });\n  });\n\n  describe('min-height', () => {\n    test('should match when container height exceeds min-height', () => {\n      const styles = resolveMediaQueries(\n        { width: 100, height: 600 },\n        {\n          '@media min-height: 500': {\n            color: 'blue',\n          },\n        },\n      );\n\n      expect(styles.color).toBe('blue');\n    });\n\n    test('should not match when container height is less than min-height', () => {\n      const styles = resolveMediaQueries(\n        { width: 100, height: 300 },\n        {\n          '@media min-height: 500': {\n            color: 'blue',\n          },\n        },\n      );\n\n      expect(styles.color).toBe(undefined);\n    });\n  });\n\n  describe('max-width', () => {\n    test('should match when container width is less than max-width', () => {\n      const styles = resolveMediaQueries(\n        { width: 300, height: 100 },\n        {\n          '@media max-width: 500': {\n            color: 'red',\n          },\n        },\n      );\n\n      expect(styles.color).toBe('red');\n    });\n\n    test('should not match when container width exceeds max-width', () => {\n      const styles = resolveMediaQueries(\n        { width: 600, height: 100 },\n        {\n          '@media max-width: 500': {\n            color: 'red',\n          },\n        },\n      );\n\n      expect(styles.color).toBe(undefined);\n    });\n  });\n\n  describe('min-width', () => {\n    test('should match when container width exceeds min-width', () => {\n      const styles = resolveMediaQueries(\n        { width: 600, height: 100 },\n        {\n          '@media min-width: 500': {\n            color: 'green',\n          },\n        },\n      );\n\n      expect(styles.color).toBe('green');\n    });\n\n    test('should not match when container width is less than min-width', () => {\n      const styles = resolveMediaQueries(\n        { width: 300, height: 100 },\n        {\n          '@media min-width: 500': {\n            color: 'green',\n          },\n        },\n      );\n\n      expect(styles.color).toBe(undefined);\n    });\n  });\n\n  describe('orientation', () => {\n    test('should match portrait on portrait container', () => {\n      const styles = resolveMediaQueries(\n        { width: 10, height: 10, orientation: 'portrait' },\n        {\n          '@media orientation: portrait': {\n            color: 'red',\n          },\n        },\n      );\n\n      expect(styles.color).toBe('red');\n    });\n\n    test('should not match portrait on landscape container', () => {\n      const styles = resolveMediaQueries(\n        { width: 10, height: 10, orientation: 'landscape' },\n        {\n          '@media orientation: portrait': {\n            color: 'red',\n          },\n        },\n      );\n\n      expect(styles.color).toBe(undefined);\n    });\n\n    test('should match landscape on landscape container', () => {\n      const styles = resolveMediaQueries(\n        { width: 10, height: 10, orientation: 'landscape' },\n        {\n          '@media orientation: landscape': {\n            color: 'red',\n          },\n        },\n      );\n\n      expect(styles.color).toBe('red');\n    });\n\n    test('should not match landscape on portrait container', () => {\n      const styles = resolveMediaQueries(\n        { width: 10, height: 10, orientation: 'portrait' },\n        {\n          '@media orientation: landscape': {\n            color: 'red',\n          },\n        },\n      );\n\n      expect(styles.color).toBe(undefined);\n    });\n  });\n\n  describe('combined queries', () => {\n    test('should match when both conditions are met with \"and\" operator', () => {\n      const styles = resolveMediaQueries(\n        { width: 400, height: 600 },\n        {\n          '@media min-width: 300 and max-width: 500': {\n            color: 'purple',\n          },\n        },\n      );\n\n      expect(styles.color).toBe('purple');\n    });\n\n    test('should not match when one condition fails with \"and\" operator', () => {\n      const styles = resolveMediaQueries(\n        { width: 600, height: 600 },\n        {\n          '@media min-width: 300 and max-width: 500': {\n            color: 'purple',\n          },\n        },\n      );\n\n      expect(styles.color).toBe(undefined);\n    });\n\n    test('should match when first condition is met with \"or\" operator (comma)', () => {\n      const styles = resolveMediaQueries(\n        { width: 200, height: 100, orientation: 'landscape' },\n        {\n          '@media max-width: 300, orientation: portrait': {\n            color: 'orange',\n          },\n        },\n      );\n\n      expect(styles.color).toBe('orange');\n    });\n\n    test('should match when second condition is met with \"or\" operator (comma)', () => {\n      const styles = resolveMediaQueries(\n        { width: 600, height: 100, orientation: 'portrait' },\n        {\n          '@media max-width: 300, orientation: portrait': {\n            color: 'orange',\n          },\n        },\n      );\n\n      expect(styles.color).toBe('orange');\n    });\n\n    test('should not match when no conditions are met with \"or\" operator', () => {\n      const styles = resolveMediaQueries(\n        { width: 600, height: 100, orientation: 'landscape' },\n        {\n          '@media max-width: 300, orientation: portrait': {\n            color: 'orange',\n          },\n        },\n      );\n\n      expect(styles.color).toBe(undefined);\n    });\n  });\n\n  describe('style preservation', () => {\n    test('should preserve non-media-query styles', () => {\n      const styles = resolveMediaQueries(\n        { width: 100, height: 100 },\n        {\n          fontSize: 12,\n          backgroundColor: 'white',\n          '@media max-width: 500': {\n            color: 'red',\n          },\n        },\n      );\n\n      expect(styles.fontSize).toBe(12);\n      expect(styles.backgroundColor).toBe('white');\n      expect(styles.color).toBe('red');\n    });\n\n    test('should not include unmatched media query styles', () => {\n      const styles = resolveMediaQueries(\n        { width: 600, height: 100 },\n        {\n          fontSize: 12,\n          '@media max-width: 500': {\n            color: 'red',\n          },\n        },\n      );\n\n      expect(styles.fontSize).toBe(12);\n      expect(styles.color).toBe(undefined);\n    });\n\n    test('should handle empty style object', () => {\n      const styles = resolveMediaQueries({ width: 100, height: 100 }, {});\n\n      expect(styles).toEqual({});\n    });\n\n    test('should handle style with only non-media-query properties', () => {\n      const styles = resolveMediaQueries(\n        { width: 100, height: 100 },\n        {\n          fontSize: 14,\n          color: 'black',\n        },\n      );\n\n      expect(styles.fontSize).toBe(14);\n      expect(styles.color).toBe('black');\n    });\n  });\n\n  describe('multiple media queries', () => {\n    test('should apply all matching media queries', () => {\n      const styles = resolveMediaQueries(\n        { width: 400, height: 300 },\n        {\n          '@media max-width: 500': {\n            color: 'red',\n          },\n          '@media max-height: 400': {\n            backgroundColor: 'blue',\n          },\n        },\n      );\n\n      expect(styles.color).toBe('red');\n      expect(styles.backgroundColor).toBe('blue');\n    });\n\n    test('should only apply matching media queries when multiple exist', () => {\n      const styles = resolveMediaQueries(\n        { width: 400, height: 500 },\n        {\n          '@media max-width: 500': {\n            color: 'red',\n          },\n          '@media max-height: 400': {\n            backgroundColor: 'blue',\n          },\n        },\n      );\n\n      expect(styles.color).toBe('red');\n      expect(styles.backgroundColor).toBe(undefined);\n    });\n\n    test('should let later matching media queries override earlier ones', () => {\n      const styles = resolveMediaQueries(\n        { width: 400, height: 300 },\n        {\n          '@media max-width: 500': {\n            color: 'red',\n          },\n          '@media max-height: 400': {\n            color: 'blue',\n          },\n        },\n      );\n\n      expect(styles.color).toBe('blue');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/paddings.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../src/resolve';\n\nconst container = { width: 200, height: 400, remBase: 10 };\n\nconst resolveStyle = resolve(container);\n\ndescribe('resolve stylesheet paddings', () => {\n  test('should ignore invalid values', () => {\n    const paddings = [\n      { padding: '2 auto' },\n      { padding: '\"string\"' },\n      { padding: 'url(\"link.com\")' },\n      { padding: 'auto 2 black 4' },\n      { padding: 'calc(100% - 10px)' },\n      { padding: 'rgba(1 1 1 / 0.3)' },\n      { padding: '1, 2, 3' },\n      { paddingLeft: 'yellow' },\n      { paddingTop: '12lelkek' },\n      { paddingBottom: '1 2 3' },\n      { paddingHorizontal: '1 2 3' },\n      { padding: '1 2 3 4 5' },\n      { padding: () => {} },\n    ];\n    const expanded = {};\n\n    paddings.forEach((style) => {\n      expect(resolveStyle(style as any)).toEqual(expanded);\n    });\n  });\n\n  test('should resolve padding shorthand', () => {\n    const styles = resolveStyle({ padding: '2in' });\n\n    expect(styles).toEqual({\n      paddingLeft: 144,\n      paddingRight: 144,\n      paddingTop: 144,\n      paddingBottom: 144,\n    });\n  });\n\n  test('should resolve padding axis shorthand', () => {\n    const styles = resolveStyle({ padding: '10px 1in' });\n\n    expect(styles).toEqual({\n      paddingTop: 10,\n      paddingLeft: 72,\n      paddingRight: 72,\n      paddingBottom: 10,\n    });\n  });\n\n  test('should resolve padding edges shorthand', () => {\n    const styles = resolveStyle({ padding: '10 20 30 40' });\n\n    expect(styles).toEqual({\n      paddingTop: 10,\n      paddingLeft: 40,\n      paddingRight: 20,\n      paddingBottom: 30,\n    });\n  });\n\n  test('should resolve padding edges shorthand units', () => {\n    const styles = resolveStyle({ padding: '10cm 20in 30mm 40pt' });\n\n    expect(styles).toEqual({\n      paddingLeft: 40,\n      paddingRight: 1440,\n      paddingTop: 283.46456692913387,\n      paddingBottom: 85.03937007874016,\n    });\n  });\n\n  test('should resolve padding edges shorthand negative values', () => {\n    const styles = resolveStyle({ padding: '-10 -20in -30mm -40%' });\n\n    expect(styles).toEqual({\n      paddingTop: -10,\n      paddingLeft: '-40%',\n      paddingRight: -1440,\n      paddingBottom: -85.03937007874016,\n    });\n  });\n\n  test('should resolve padding edges shorthand units with decimals', () => {\n    const styles = resolveStyle({\n      padding: '10.5cm 20.005in 30.10mm 40.0000005pt',\n    });\n\n    expect(styles).toEqual({\n      paddingRight: 1440.36,\n      paddingLeft: 40.0000005,\n      paddingTop: 297.6377952755905,\n      paddingBottom: 85.3228346456693,\n    });\n  });\n\n  test('should resolve padding horizontal shorthand', () => {\n    const styles = resolveStyle({ paddingHorizontal: 4 });\n\n    expect(styles).toEqual({\n      paddingLeft: 4,\n      paddingRight: 4,\n    });\n  });\n\n  test('should resolve padding horizontal edges shorthand', () => {\n    const styles = resolveStyle({ paddingHorizontal: '1 2' });\n\n    expect(styles).toEqual({\n      paddingRight: 1,\n      paddingLeft: 2,\n    });\n  });\n\n  test('should resolve padding vertical shorthand', () => {\n    const styles = resolveStyle({ paddingVertical: '4' });\n\n    expect(styles).toEqual({\n      paddingTop: 4,\n      paddingBottom: 4,\n    });\n  });\n\n  test('should resolve padding vertical edges shorthand', () => {\n    const styles = resolveStyle({ paddingVertical: '2 4' });\n\n    expect(styles).toEqual({\n      paddingTop: 2,\n      paddingBottom: 4,\n    });\n  });\n\n  test('should resolve padding units correctly', () => {\n    const styles = resolveStyle({\n      paddingTop: '10cm',\n      paddingRight: '20in',\n      paddingBottom: '30mm',\n      paddingLeft: '40pt',\n    });\n\n    expect(styles).toEqual({\n      paddingLeft: 40,\n      paddingRight: 1440,\n      paddingTop: 283.46456692913387,\n      paddingBottom: 85.03937007874016,\n    });\n  });\n\n  test('should resolve padding vw dimensions', () => {\n    const styles = resolveStyle({\n      paddingTop: '10vw',\n      paddingRight: '20vw',\n      paddingBottom: '30vw',\n      paddingLeft: '40vw',\n    });\n\n    expect(styles.paddingTop).toBe(20);\n    expect(styles.paddingRight).toBe(40);\n    expect(styles.paddingBottom).toBe(60);\n    expect(styles.paddingLeft).toBe(80);\n  });\n\n  test('should resolve padding vh dimensions', () => {\n    const styles = resolveStyle({\n      paddingTop: '10vh',\n      paddingRight: '20vh',\n      paddingBottom: '30vh',\n      paddingLeft: '40vh',\n    });\n\n    expect(styles.paddingTop).toBe(40);\n    expect(styles.paddingRight).toBe(80);\n    expect(styles.paddingBottom).toBe(120);\n    expect(styles.paddingLeft).toBe(160);\n  });\n\n  test('should resolve expanded padding mm dimensions', () => {\n    const styles = resolveStyle({\n      paddingTop: '1mm',\n      paddingRight: '2mm',\n      paddingBottom: '3mm',\n      paddingLeft: '4mm',\n    });\n\n    expect(styles.paddingTop).toBeCloseTo(2.83, 1);\n    expect(styles.paddingRight).toBeCloseTo(2.83 * 2, 1);\n    expect(styles.paddingBottom).toBeCloseTo(2.83 * 3, 1);\n    expect(styles.paddingLeft).toBeCloseTo(2.83 * 4, 1);\n  });\n\n  test('should resolve expanded padding cm dimensions', () => {\n    const styles = resolveStyle({\n      paddingTop: '1cm',\n      paddingRight: '2cm',\n      paddingBottom: '3cm',\n      paddingLeft: '4cm',\n    });\n\n    expect(styles.paddingTop).toBeCloseTo(28.346, 1);\n    expect(styles.paddingRight).toBeCloseTo(28.346 * 2, 1);\n    expect(styles.paddingBottom).toBeCloseTo(28.346 * 3, 1);\n    expect(styles.paddingLeft).toBeCloseTo(28.346 * 4, 1);\n  });\n\n  test('should resolve values with improper formatting', () => {\n    const styles = resolveStyle({ padding: '  1 ' });\n\n    expect(styles).toEqual({\n      paddingTop: 1,\n      paddingRight: 1,\n      paddingBottom: 1,\n      paddingLeft: 1,\n    });\n  });\n\n  test('should resolve padding rem dimensions', () => {\n    const styles = resolveStyle({\n      paddingTop: '1rem',\n      paddingRight: '2rem',\n      paddingBottom: '3rem',\n      paddingLeft: '4rem',\n    });\n\n    expect(styles.paddingTop).toBe(10);\n    expect(styles.paddingRight).toBe(20);\n    expect(styles.paddingBottom).toBe(30);\n    expect(styles.paddingLeft).toBe(40);\n  });\n\n  test('should resolve padding shorthand with rem', () => {\n    const styles = resolveStyle({ padding: '2rem' });\n\n    expect(styles).toEqual({\n      paddingTop: 20,\n      paddingRight: 20,\n      paddingBottom: 20,\n      paddingLeft: 20,\n    });\n  });\n\n  test('should resolve padding horizontal with rem', () => {\n    const styles = resolveStyle({ paddingHorizontal: '2rem' });\n\n    expect(styles).toEqual({\n      paddingLeft: 20,\n      paddingRight: 20,\n    });\n  });\n\n  test('should resolve padding vertical with rem', () => {\n    const styles = resolveStyle({ paddingVertical: '2rem' });\n\n    expect(styles).toEqual({\n      paddingTop: 20,\n      paddingBottom: 20,\n    });\n  });\n\n  test('should resolve padding shorthand with three values', () => {\n    const styles = resolveStyle({ padding: '10 20 30' });\n\n    expect(styles).toEqual({\n      paddingTop: 10,\n      paddingRight: 20,\n      paddingBottom: 30,\n      paddingLeft: 20,\n    });\n  });\n\n  test('should resolve numeric individual paddings', () => {\n    const styles = resolveStyle({\n      paddingTop: 10,\n      paddingRight: 20,\n      paddingBottom: 30,\n      paddingLeft: 40,\n    });\n\n    expect(styles).toEqual({\n      paddingTop: 10,\n      paddingRight: 20,\n      paddingBottom: 30,\n      paddingLeft: 40,\n    });\n  });\n\n  test('should resolve individual padding with percentage', () => {\n    const styles = resolveStyle({\n      paddingTop: '10%',\n      paddingRight: '20%',\n      paddingBottom: '30%',\n      paddingLeft: '40%',\n    });\n\n    expect(styles).toEqual({\n      paddingTop: '10%',\n      paddingRight: '20%',\n      paddingBottom: '30%',\n      paddingLeft: '40%',\n    });\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/positioning.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../src/resolve';\n\nconst container = { width: 200, height: 400, remBase: 10 };\n\nconst resolveStyle = resolve(container);\n\ndescribe('resolve stylesheet positioning', () => {\n  test('should resolve object positining shorthand', () => {\n    const styles = resolveStyle({ objectPosition: '20 30' });\n\n    expect(styles).toEqual({\n      objectPositionX: 20,\n      objectPositionY: 30,\n    });\n  });\n\n  test('should resolve object positining percentage shorthand', () => {\n    const styles = resolveStyle({ objectPosition: '50% 50%' });\n\n    expect(styles).toEqual({\n      objectPositionX: '50%',\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object position left top shorthand', () => {\n    const styles = resolveStyle({ objectPosition: 'top left' });\n\n    expect(styles).toEqual({\n      objectPositionX: '0%',\n      objectPositionY: '0%',\n    });\n  });\n\n  test('should resolve object position left center shorthand', () => {\n    const styles = resolveStyle({ objectPosition: 'left center' });\n\n    expect(styles).toEqual({\n      objectPositionX: '0%',\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object position left bottom shorthand', () => {\n    const styles = resolveStyle({ objectPosition: 'left bottom' });\n\n    expect(styles).toEqual({\n      objectPositionX: '0%',\n      objectPositionY: '100%',\n    });\n  });\n\n  test('should resolve object position right top shorthand', () => {\n    const styles = resolveStyle({ objectPosition: 'right top' });\n\n    expect(styles).toEqual({\n      objectPositionX: '100%',\n      objectPositionY: '0%',\n    });\n  });\n\n  test('should resolve object position right center shorthand', () => {\n    const styles = resolveStyle({ objectPosition: 'right center' });\n\n    expect(styles).toEqual({\n      objectPositionX: '100%',\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object position right bottom shorthand', () => {\n    const styles = resolveStyle({ objectPosition: 'right bottom' });\n\n    expect(styles).toEqual({\n      objectPositionX: '100%',\n      objectPositionY: '100%',\n    });\n  });\n\n  test('should resolve object position center center shorthand', () => {\n    const styles = resolveStyle({ objectPosition: 'center center' });\n\n    expect(styles).toEqual({\n      objectPositionX: '50%',\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object positining', () => {\n    const styles = resolveStyle({\n      objectPositionX: '20',\n      objectPositionY: '30',\n    });\n\n    expect(styles).toEqual({\n      objectPositionX: 20,\n      objectPositionY: 30,\n    });\n  });\n\n  test('should resolve object positining percentage', () => {\n    const styles = resolveStyle({\n      objectPositionX: '50%',\n      objectPositionY: '50%',\n    });\n\n    expect(styles).toEqual({\n      objectPositionX: '50%',\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object position left top', () => {\n    const styles = resolveStyle({\n      objectPositionX: 'top',\n      objectPositionY: 'left',\n    });\n\n    expect(styles).toEqual({\n      objectPositionX: '0%',\n      objectPositionY: '0%',\n    });\n  });\n\n  test('should resolve object position left center', () => {\n    const styles = resolveStyle({\n      objectPositionX: 'left',\n      objectPositionY: 'center',\n    });\n\n    expect(styles).toEqual({\n      objectPositionX: '0%',\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object position left bottom', () => {\n    const styles = resolveStyle({\n      objectPositionX: 'left',\n      objectPositionY: 'bottom',\n    });\n\n    expect(styles).toEqual({\n      objectPositionX: '0%',\n      objectPositionY: '100%',\n    });\n  });\n\n  test('should resolve object position right top', () => {\n    const styles = resolveStyle({\n      objectPosition: 'right',\n      objectPositionY: 'top',\n    });\n\n    expect(styles).toEqual({\n      objectPositionX: '100%',\n      objectPositionY: '0%',\n    });\n  });\n\n  test('should resolve object position right center', () => {\n    const styles = resolveStyle({\n      objectPositionX: 'right',\n      objectPositionY: 'center',\n    });\n\n    expect(styles).toEqual({\n      objectPositionX: '100%',\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object position right bottom', () => {\n    const styles = resolveStyle({\n      objectPositionX: 'right',\n      objectPositionY: 'bottom',\n    });\n\n    expect(styles).toEqual({\n      objectPositionX: '100%',\n      objectPositionY: '100%',\n    });\n  });\n\n  test('should resolve object position center center', () => {\n    const styles = resolveStyle({\n      objectPositionX: 'center',\n      objectPositionY: 'center',\n    });\n\n    expect(styles).toEqual({\n      objectPositionX: '50%',\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object fit', () => {\n    const styles = resolveStyle({ objectFit: 'cover' });\n\n    expect(styles).toEqual({\n      objectFit: 'cover',\n    });\n  });\n\n  test('should resolve object fit contain', () => {\n    const styles = resolveStyle({ objectFit: 'contain' });\n\n    expect(styles).toEqual({\n      objectFit: 'contain',\n    });\n  });\n\n  test('should resolve object fit fill', () => {\n    const styles = resolveStyle({ objectFit: 'fill' });\n\n    expect(styles).toEqual({\n      objectFit: 'fill',\n    });\n  });\n\n  test('should resolve object fit none', () => {\n    const styles = resolveStyle({ objectFit: 'none' });\n\n    expect(styles).toEqual({\n      objectFit: 'none',\n    });\n  });\n\n  test('should resolve object fit scale-down', () => {\n    const styles = resolveStyle({ objectFit: 'scale-down' });\n\n    expect(styles).toEqual({\n      objectFit: 'scale-down',\n    });\n  });\n\n  test('should resolve object position single keyword center', () => {\n    const styles = resolveStyle({ objectPosition: 'center' });\n\n    expect(styles).toEqual({\n      objectPositionX: '50%',\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object position single keyword left', () => {\n    const styles = resolveStyle({ objectPosition: 'left' });\n\n    expect(styles).toEqual({\n      objectPositionX: '0%',\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object position single keyword right', () => {\n    const styles = resolveStyle({ objectPosition: 'right' });\n\n    expect(styles).toEqual({\n      objectPositionX: '100%',\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object position single keyword top', () => {\n    const styles = resolveStyle({ objectPosition: 'top' });\n\n    expect(styles).toEqual({\n      objectPositionX: '50%',\n      objectPositionY: '0%',\n    });\n  });\n\n  test('should resolve object position single keyword bottom', () => {\n    const styles = resolveStyle({ objectPosition: 'bottom' });\n\n    expect(styles).toEqual({\n      objectPositionX: '50%',\n      objectPositionY: '100%',\n    });\n  });\n\n  test('should resolve object position with in unit', () => {\n    const styles = resolveStyle({ objectPosition: '1in 2in' });\n\n    expect(styles).toEqual({\n      objectPositionX: 72,\n      objectPositionY: 144,\n    });\n  });\n\n  test('should resolve object position with rem unit', () => {\n    const styles = resolveStyle({ objectPosition: '1rem 2rem' });\n\n    expect(styles).toEqual({\n      objectPositionX: 10,\n      objectPositionY: 20,\n    });\n  });\n\n  test('should resolve object position with vw unit', () => {\n    const styles = resolveStyle({ objectPosition: '50vw 25vw' });\n\n    expect(styles).toEqual({\n      objectPositionX: 100,\n      objectPositionY: 50,\n    });\n  });\n\n  test('should resolve object position with vh unit', () => {\n    const styles = resolveStyle({ objectPosition: '50vh 25vh' });\n\n    expect(styles).toEqual({\n      objectPositionX: 200,\n      objectPositionY: 100,\n    });\n  });\n\n  test('should resolve object position with px unit', () => {\n    const styles = resolveStyle({ objectPosition: '10px 20px' });\n\n    expect(styles).toEqual({\n      objectPositionX: 10,\n      objectPositionY: 20,\n    });\n  });\n\n  test('should resolve object position with mixed keyword and value', () => {\n    const styles = resolveStyle({ objectPosition: 'left 50' });\n\n    expect(styles).toEqual({\n      objectPositionX: '0%',\n      objectPositionY: 50,\n    });\n  });\n\n  test('should resolve numeric objectPositionX and objectPositionY', () => {\n    const styles = resolveStyle({\n      objectPositionX: 20,\n      objectPositionY: 30,\n    });\n\n    expect(styles).toEqual({\n      objectPositionX: 20,\n      objectPositionY: 30,\n    });\n  });\n\n  test('should resolve objectPositionX with in unit', () => {\n    const styles = resolveStyle({ objectPositionX: '1in' });\n\n    expect(styles).toEqual({\n      objectPositionX: 72,\n    });\n  });\n\n  test('should resolve objectPositionY with rem unit', () => {\n    const styles = resolveStyle({ objectPositionY: '2rem' });\n\n    expect(styles).toEqual({\n      objectPositionY: 20,\n    });\n  });\n\n  test('should resolve object position single numeric value', () => {\n    const styles = resolveStyle({ objectPosition: '50' });\n\n    expect(styles).toEqual({\n      objectPositionX: 50,\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object position single percentage value', () => {\n    const styles = resolveStyle({ objectPosition: '25%' });\n\n    expect(styles).toEqual({\n      objectPositionX: '25%',\n      objectPositionY: '50%',\n    });\n  });\n\n  test('should resolve object position with zero values', () => {\n    const styles = resolveStyle({ objectPosition: '0 0' });\n\n    expect(styles).toEqual({\n      objectPositionX: 0,\n      objectPositionY: 0,\n    });\n  });\n\n  test('should resolve object position with negative values', () => {\n    const styles = resolveStyle({ objectPosition: '-10 -20' });\n\n    expect(styles).toEqual({\n      objectPositionX: -10,\n      objectPositionY: -20,\n    });\n  });\n\n  test('should resolve object position with mixed units', () => {\n    const styles = resolveStyle({ objectPosition: '1in 2rem' });\n\n    expect(styles).toEqual({\n      objectPositionX: 72,\n      objectPositionY: 20,\n    });\n  });\n\n  test('should resolve object position with cm unit', () => {\n    const styles = resolveStyle({ objectPosition: '2.54cm 5.08cm' });\n\n    expect(styles).toEqual({\n      objectPositionX: 72,\n      objectPositionY: 144,\n    });\n  });\n\n  test('should resolve object position with mm unit', () => {\n    const styles = resolveStyle({ objectPosition: '25.4mm 50.8mm' });\n\n    expect(styles).toEqual({\n      objectPositionX: 72,\n      objectPositionY: 144,\n    });\n  });\n\n  test('should resolve object position with value and keyword', () => {\n    const styles = resolveStyle({ objectPosition: '30% bottom' });\n\n    expect(styles).toEqual({\n      objectPositionX: '30%',\n      objectPositionY: '100%',\n    });\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/resolve.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../src/index';\n\ndescribe('stylesheet resolve', () => {\n  test('should return empty object for undefined', () => {\n    const style = undefined;\n    const result = resolve({ width: 10, height: 10 }, style);\n\n    expect(result).toEqual({});\n  });\n\n  test('should return empty object for null', () => {\n    const style = null;\n    const result = resolve({ width: 10, height: 10 }, style);\n\n    expect(result).toEqual({});\n  });\n\n  test('should return empty object for empty object', () => {\n    const style = {};\n    const result = resolve({ width: 10, height: 10 }, style);\n\n    expect(result).toEqual({});\n  });\n\n  test('should return identity for single style object', () => {\n    const style = { color: 'red', textAlign: 'center' as const };\n    const result = resolve({ width: 10, height: 10 }, style);\n\n    expect(result).toEqual(style);\n  });\n\n  test('should return identity for single style object array', () => {\n    const style = [{ color: 'red', textAlign: 'center' as const }];\n    const result = resolve({ width: 10, height: 10 }, style);\n\n    expect(result).toEqual(style[0]);\n  });\n\n  test('should return identity for single style object array with nil values', () => {\n    const style = [\n      null,\n      { color: 'red', textAlign: 'center' as const },\n      undefined,\n    ];\n    const result = resolve({ width: 10, height: 10 }, style);\n\n    expect(result).toEqual(style[1]);\n  });\n\n  test('should return several style objects flatten', () => {\n    const style = [\n      { backgroundColor: 'black' },\n      { color: 'red', textAlign: 'center' as const },\n    ];\n    const result = resolve({ width: 10, height: 10 }, style);\n\n    expect(result).toEqual({\n      backgroundColor: 'black',\n      color: 'red',\n      textAlign: 'center',\n    });\n  });\n\n  test('should return object of merged values from array', () => {\n    const styles = [{ fontSize: 16, color: 'white' }, { color: 'green' }];\n    const result = resolve({ width: 10, height: 10 }, styles);\n\n    return expect(result).toEqual({ fontSize: 16, color: 'green' });\n  });\n\n  test('should return flatten several style objects with nil values', () => {\n    const style = [\n      null,\n      { backgroundColor: 'black' },\n      undefined,\n      { color: 'red', textAlign: 'center' as const },\n      null,\n    ];\n    const result = resolve({ width: 10, height: 10 }, style);\n\n    expect(result).toEqual({\n      backgroundColor: 'black',\n      color: 'red',\n      textAlign: 'center',\n    });\n  });\n\n  test('should return flatten nested style objects', () => {\n    const style = [\n      { backgroundColor: 'black' },\n      [{ color: 'red', textAlign: 'center' as const }],\n    ];\n    const result = resolve({ width: 10, height: 10 }, style as any);\n\n    expect(result).toEqual({\n      backgroundColor: 'black',\n      color: 'red',\n      textAlign: 'center',\n    });\n  });\n\n  test('should return flatten nested style objects with nil values', () => {\n    const style = [\n      null,\n      { backgroundColor: 'black' },\n      undefined,\n      [null, { color: 'red', textAlign: 'center' as const }, undefined],\n    ];\n    const result = resolve({ width: 10, height: 10 }, style as any);\n\n    expect(result).toEqual({\n      backgroundColor: 'black',\n      color: 'red',\n      textAlign: 'center',\n    });\n  });\n\n  test('should return empty object for empty array', () => {\n    const style: any[] = [];\n    const result = resolve({ width: 10, height: 10 }, style);\n\n    expect(result).toEqual({});\n  });\n\n  test('should ignore false values in array', () => {\n    const condition = false;\n    const style = [\n      { backgroundColor: 'black' },\n      condition && { color: 'red' },\n      { fontSize: 12 },\n    ];\n    const result = resolve({ width: 10, height: 10 }, style as any);\n\n    expect(result).toEqual({\n      backgroundColor: 'black',\n      fontSize: 12,\n    });\n  });\n\n  test('should handle deeply nested arrays', () => {\n    const style = [\n      { backgroundColor: 'black' },\n      [[{ color: 'red' }, [{ fontSize: 12 }]]],\n    ];\n    const result = resolve({ width: 10, height: 10 }, style as any);\n\n    expect(result).toEqual({\n      backgroundColor: 'black',\n      color: 'red',\n      fontSize: 12,\n    });\n  });\n\n  test('should resolve unit values', () => {\n    const style = { width: '1in', height: '2in' };\n    const result = resolve({ width: 200, height: 400 }, style);\n\n    expect(result).toEqual({\n      width: 72,\n      height: 144,\n    });\n  });\n\n  test('should resolve shorthand values', () => {\n    const style = { margin: '10 20 30 40' };\n    const result = resolve({ width: 200, height: 400 }, style);\n\n    expect(result).toEqual({\n      marginTop: 10,\n      marginRight: 20,\n      marginBottom: 30,\n      marginLeft: 40,\n    });\n  });\n\n  test('should resolve vw and vh units based on container', () => {\n    const style = { width: '50vw', height: '25vh' };\n    const result = resolve({ width: 200, height: 400 }, style);\n\n    expect(result).toEqual({\n      width: 100,\n      height: 100,\n    });\n  });\n\n  test('should resolve rem units based on container remBase', () => {\n    const style = { width: '2rem', height: '3rem' };\n    const result = resolve({ width: 200, height: 400, remBase: 16 }, style);\n\n    expect(result).toEqual({\n      width: 32,\n      height: 48,\n    });\n  });\n\n  test('should resolve combined flattening and style resolution', () => {\n    const style = [{ margin: '10px' }, { padding: '20px', width: '1in' }];\n    const result = resolve({ width: 200, height: 400 }, style);\n\n    expect(result).toEqual({\n      marginTop: 10,\n      marginRight: 10,\n      marginBottom: 10,\n      marginLeft: 10,\n      paddingTop: 20,\n      paddingRight: 20,\n      paddingBottom: 20,\n      paddingLeft: 20,\n      width: 72,\n    });\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/text.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../src/resolve';\n\nconst container = { width: 200, height: 400, remBase: 10 };\n\nconst resolveStyle = resolve(container);\n\ndescribe('resolve stylesheet text', () => {\n  test('should resolve numeric font weight value', () => {\n    const styles = resolveStyle({ fontWeight: 800 });\n\n    expect(styles).toEqual({ fontWeight: 800 });\n  });\n\n  test('should resolve string font weight value', () => {\n    const styles = resolveStyle({ fontWeight: '800' });\n\n    expect(styles).toEqual({ fontWeight: 800 });\n  });\n\n  test('should resolve thin font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'thin' });\n\n    expect(styles).toEqual({ fontWeight: 100 });\n  });\n\n  test('should resolve hairline font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'hairline' });\n\n    expect(styles).toEqual({ fontWeight: 100 });\n  });\n\n  test('should resolve ultralight font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'ultralight' });\n\n    expect(styles).toEqual({ fontWeight: 200 });\n  });\n\n  test('should resolve extralight font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'extralight' });\n\n    expect(styles).toEqual({ fontWeight: 200 });\n  });\n\n  test('should resolve light font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'light' });\n\n    expect(styles).toEqual({ fontWeight: 300 });\n  });\n\n  test('should resolve normal font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'normal' });\n\n    expect(styles).toEqual({ fontWeight: 400 });\n  });\n\n  test('should resolve medium font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'medium' });\n\n    expect(styles).toEqual({ fontWeight: 500 });\n  });\n\n  test('should resolve semibold font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'semibold' });\n\n    expect(styles).toEqual({ fontWeight: 600 });\n  });\n\n  test('should resolve demibold font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'demibold' });\n\n    expect(styles).toEqual({ fontWeight: 600 });\n  });\n\n  test('should resolve bold font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'bold' });\n\n    expect(styles).toEqual({ fontWeight: 700 });\n  });\n\n  test('should resolve ultrabold font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'ultrabold' });\n\n    expect(styles).toEqual({ fontWeight: 800 });\n  });\n\n  test('should resolve extrabold font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'extrabold' });\n\n    expect(styles).toEqual({ fontWeight: 800 });\n  });\n\n  test('should resolve heavy font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'heavy' });\n\n    expect(styles).toEqual({ fontWeight: 900 });\n  });\n\n  test('should resolve black font weight', () => {\n    const styles = resolveStyle({ fontWeight: 'black' });\n\n    expect(styles).toEqual({ fontWeight: 900 });\n  });\n\n  test('should resolve font size', () => {\n    const styles = resolveStyle({ fontSize: 12 });\n\n    expect(styles).toEqual({ fontSize: 12 });\n  });\n\n  test('should resolve in font size', () => {\n    const styles = resolveStyle({ fontSize: '1in' });\n\n    expect(styles).toEqual({ fontSize: 72 });\n  });\n\n  test('should resolve font size rem units', () => {\n    const styles = resolveStyle({ fontSize: '2rem' });\n\n    expect(styles).toEqual({ fontSize: 20 });\n  });\n\n  test('should resolve font size rem units when base not specificed', () => {\n    const styles = resolve({ width: 100, height: 100 })({ fontSize: '2rem' });\n\n    expect(styles).toEqual({ fontSize: 36 });\n  });\n\n  test('should resolve line height number', () => {\n    const styles = resolveStyle({ lineHeight: 2 });\n\n    expect(styles.lineHeight).toBe(18 * 2);\n  });\n\n  test('should resolve number line height with font size', () => {\n    const styles = resolveStyle({ lineHeight: 2, fontSize: 10 });\n\n    expect(styles.lineHeight).toBe(10 * 2);\n  });\n\n  test('should resolve string line height', () => {\n    const styles = resolveStyle({ lineHeight: '2' });\n\n    expect(styles.lineHeight).toBe(18 * 2);\n  });\n\n  test('should resolve string line height  with font-size', () => {\n    const styles = resolveStyle({ lineHeight: '2', fontSize: 10 });\n\n    expect(styles.lineHeight).toBe(10 * 2);\n  });\n\n  test('should resolve percentage line height', () => {\n    const styles = resolveStyle({ lineHeight: '200%' });\n\n    expect(styles.lineHeight).toBe(18 * 2);\n  });\n\n  test('should resolve percentage line height with font-size', () => {\n    const styles = resolveStyle({ lineHeight: '200%', fontSize: 10 });\n\n    expect(styles.lineHeight).toBe(10 * 2);\n  });\n\n  test('should resolve px line height', () => {\n    const styles = resolveStyle({ lineHeight: '20px' });\n\n    expect(styles.lineHeight).toBe(20);\n  });\n\n  test('should resolve mm line height', () => {\n    const styles = resolveStyle({ lineHeight: '20mm' });\n\n    expect(styles.lineHeight).toBeCloseTo(56.69, 1);\n  });\n\n  test('should resolve font family', () => {\n    const styles = resolveStyle({ fontFamily: 'Helvetica' });\n\n    expect(styles).toEqual({ fontFamily: 'Helvetica' });\n  });\n\n  test('should resolve font families', () => {\n    const styles = resolveStyle({ fontFamily: ['Helvetica', 'Courier'] });\n\n    expect(styles).toEqual({ fontFamily: ['Helvetica', 'Courier'] });\n  });\n\n  test('should resolve font style', () => {\n    const styles = resolveStyle({ fontStyle: 'normal' });\n\n    expect(styles).toEqual({ fontStyle: 'normal' });\n  });\n\n  test('should resolve letter spacing', () => {\n    const styles = resolveStyle({ letterSpacing: 12 });\n\n    expect(styles).toEqual({ letterSpacing: 12 });\n  });\n\n  test('should resolve in line spacing', () => {\n    const styles = resolveStyle({ letterSpacing: '1in' });\n\n    expect(styles).toEqual({ letterSpacing: 72 });\n  });\n\n  test('should resolve max lines', () => {\n    const styles = resolveStyle({ maxLines: 1 });\n\n    expect(styles).toEqual({ maxLines: 1 });\n  });\n\n  test('should resolve text align', () => {\n    const styles = resolveStyle({ textAlign: 'center' });\n\n    expect(styles).toEqual({ textAlign: 'center' });\n  });\n\n  test('should resolve text decoration', () => {\n    const styles = resolveStyle({ textDecoration: 'underline' });\n\n    expect(styles).toEqual({ textDecoration: 'underline' });\n  });\n\n  test('should resolve text style', () => {\n    const styles = resolveStyle({ textDecorationStyle: 'dashed' });\n\n    expect(styles).toEqual({ textDecorationStyle: 'dashed' });\n  });\n\n  test('should resolve text overflow', () => {\n    const styles = resolveStyle({ textOverflow: 'ellipsis' });\n\n    expect(styles).toEqual({ textOverflow: 'ellipsis' });\n  });\n\n  test('should resolve text transform', () => {\n    const styles = resolveStyle({ textTransform: 'capitalize' });\n\n    expect(styles).toEqual({ textTransform: 'capitalize' });\n  });\n\n  test('should resolve text vertical align', () => {\n    const styles = resolveStyle({ verticalAlign: 'sub' });\n\n    expect(styles).toEqual({ verticalAlign: 'sub' });\n  });\n\n  test('should resolve direction ltr', () => {\n    const styles = resolveStyle({ direction: 'ltr' });\n\n    expect(styles).toEqual({ direction: 'ltr' });\n  });\n\n  test('should resolve direction rtl', () => {\n    const styles = resolveStyle({ direction: 'rtl' });\n\n    expect(styles).toEqual({ direction: 'rtl' });\n  });\n\n  test('should resolve text decoration color', () => {\n    const styles = resolveStyle({ textDecorationColor: 'red' });\n\n    expect(styles).toEqual({ textDecorationColor: 'red' });\n  });\n\n  test('should resolve text decoration color hex', () => {\n    const styles = resolveStyle({ textDecorationColor: '#ff0000' });\n\n    expect(styles).toEqual({ textDecorationColor: '#ff0000' });\n  });\n\n  test('should resolve text decoration color rgb', () => {\n    const styles = resolveStyle({ textDecorationColor: 'rgb(255, 0, 0)' });\n\n    expect(styles).toEqual({ textDecorationColor: '#FF0000' });\n  });\n\n  test('should resolve text indent', () => {\n    const styles = resolveStyle({ textIndent: 20 });\n\n    expect(styles).toEqual({ textIndent: 20 });\n  });\n\n  test('should resolve font size vw units', () => {\n    const styles = resolveStyle({ fontSize: '10vw' });\n\n    expect(styles).toEqual({ fontSize: 20 });\n  });\n\n  test('should resolve font size vh units', () => {\n    const styles = resolveStyle({ fontSize: '10vh' });\n\n    expect(styles).toEqual({ fontSize: 40 });\n  });\n\n  test('should resolve font size pt units', () => {\n    const styles = resolveStyle({ fontSize: '12pt' });\n\n    expect(styles).toEqual({ fontSize: 12 });\n  });\n\n  test('should resolve font size mm units', () => {\n    const styles = resolveStyle({ fontSize: '10mm' });\n\n    expect(styles.fontSize).toBeCloseTo(28.35, 1);\n  });\n\n  test('should resolve font size cm units', () => {\n    const styles = resolveStyle({ fontSize: '1cm' });\n\n    expect(styles.fontSize).toBeCloseTo(28.35, 1);\n  });\n\n  test('should resolve letter spacing rem units', () => {\n    const styles = resolveStyle({ letterSpacing: '0.5rem' });\n\n    expect(styles).toEqual({ letterSpacing: 5 });\n  });\n\n  test('should resolve letter spacing vw units', () => {\n    const styles = resolveStyle({ letterSpacing: '1vw' });\n\n    expect(styles).toEqual({ letterSpacing: 2 });\n  });\n\n  test('should resolve line height rem units', () => {\n    const styles = resolveStyle({ lineHeight: '2rem' });\n\n    expect(styles).toEqual({ lineHeight: 20 });\n  });\n\n  test('should resolve line height in units', () => {\n    const styles = resolveStyle({ lineHeight: '0.5in' });\n\n    expect(styles).toEqual({ lineHeight: 36 });\n  });\n\n  test('should resolve string max lines', () => {\n    const styles = resolveStyle({ maxLines: '3' });\n\n    expect(styles).toEqual({ maxLines: 3 });\n  });\n\n  test('should resolve font style italic', () => {\n    const styles = resolveStyle({ fontStyle: 'italic' });\n\n    expect(styles).toEqual({ fontStyle: 'italic' });\n  });\n\n  test('should resolve font style oblique', () => {\n    const styles = resolveStyle({ fontStyle: 'oblique' });\n\n    expect(styles).toEqual({ fontStyle: 'oblique' });\n  });\n\n  test('should resolve text align left', () => {\n    const styles = resolveStyle({ textAlign: 'left' });\n\n    expect(styles).toEqual({ textAlign: 'left' });\n  });\n\n  test('should resolve text align right', () => {\n    const styles = resolveStyle({ textAlign: 'right' });\n\n    expect(styles).toEqual({ textAlign: 'right' });\n  });\n\n  test('should resolve text align justify', () => {\n    const styles = resolveStyle({ textAlign: 'justify' });\n\n    expect(styles).toEqual({ textAlign: 'justify' });\n  });\n\n  test('should resolve text decoration line-through', () => {\n    const styles = resolveStyle({ textDecoration: 'line-through' });\n\n    expect(styles).toEqual({ textDecoration: 'line-through' });\n  });\n\n  test('should resolve text decoration style solid', () => {\n    const styles = resolveStyle({ textDecorationStyle: 'solid' });\n\n    expect(styles).toEqual({ textDecorationStyle: 'solid' });\n  });\n\n  test('should resolve text decoration style dotted', () => {\n    const styles = resolveStyle({ textDecorationStyle: 'dotted' });\n\n    expect(styles).toEqual({ textDecorationStyle: 'dotted' });\n  });\n\n  test('should resolve text transform uppercase', () => {\n    const styles = resolveStyle({ textTransform: 'uppercase' });\n\n    expect(styles).toEqual({ textTransform: 'uppercase' });\n  });\n\n  test('should resolve text transform lowercase', () => {\n    const styles = resolveStyle({ textTransform: 'lowercase' });\n\n    expect(styles).toEqual({ textTransform: 'lowercase' });\n  });\n\n  test('should resolve vertical align super', () => {\n    const styles = resolveStyle({ verticalAlign: 'super' });\n\n    expect(styles).toEqual({ verticalAlign: 'super' });\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tests/transform.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../src/resolve';\n\nconst container = { width: 200, height: 400, remBase: 10 };\n\nconst resolveStyle = resolve(container);\n\ndescribe('resolve stylesheet transform', () => {\n  test('should resolve transform origin shorthand', () => {\n    const style = resolveStyle({ transformOrigin: '20 1in' });\n\n    expect(style).toEqual({\n      transformOriginX: 20,\n      transformOriginY: 72,\n    });\n  });\n\n  test('should resolve transform origin percent shorthand', () => {\n    const style = resolveStyle({ transformOrigin: '50% 50%' });\n\n    expect(style).toEqual({\n      transformOriginX: '50%',\n      transformOriginY: '50%',\n    });\n  });\n\n  test('should resolve single value transform origin shorthand', () => {\n    const style = resolveStyle({ transformOrigin: '20' });\n\n    expect(style).toEqual({\n      transformOriginX: 20,\n      transformOriginY: '50%',\n    });\n  });\n\n  test('should resolve transform origin left shorthand', () => {\n    const style = resolveStyle({ transformOrigin: 'left' });\n\n    expect(style).toEqual({\n      transformOriginX: '0%',\n      transformOriginY: '50%',\n    });\n  });\n\n  test('should resolve transform origin top shorthand', () => {\n    const style = resolveStyle({ transformOrigin: 'top' });\n\n    expect(style).toEqual({\n      transformOriginX: '50%',\n      transformOriginY: '0%',\n    });\n  });\n\n  test('should resolve transform origin right shorthand', () => {\n    const style = resolveStyle({ transformOrigin: 'right' });\n\n    expect(style).toEqual({\n      transformOriginX: '100%',\n      transformOriginY: '50%',\n    });\n  });\n\n  test('should resolve transform origin bottom shorthand', () => {\n    const style = resolveStyle({ transformOrigin: 'bottom' });\n\n    expect(style).toEqual({\n      transformOriginX: '50%',\n      transformOriginY: '100%',\n    });\n  });\n\n  test('should resolve transform origin center shorthand', () => {\n    const style = resolveStyle({ transformOrigin: 'center' });\n\n    expect(style).toEqual({\n      transformOriginX: '50%',\n      transformOriginY: '50%',\n    });\n  });\n\n  test('should resolve transform origin', () => {\n    const style = resolveStyle({\n      transformOriginX: '20',\n      transformOriginY: '30',\n    });\n\n    expect(style.transformOriginX).toBe(20);\n    expect(style.transformOriginY).toBe(30);\n  });\n\n  test('should resolve transform origin percentages', () => {\n    const style = resolveStyle({\n      transformOriginX: '20%',\n      transformOriginY: '30%',\n    });\n\n    expect(style.transformOriginX).toBe('20%');\n    expect(style.transformOriginY).toBe('30%');\n  });\n\n  test('should resolve transform origin left top', () => {\n    const style = resolveStyle({\n      transformOriginX: 'left',\n      transformOriginY: 'top',\n    });\n\n    expect(style.transformOriginX).toBe('0%');\n    expect(style.transformOriginY).toBe('0%');\n  });\n\n  test('should resolve transform origin left center', () => {\n    const style = resolveStyle({\n      transformOriginX: 'left',\n      transformOriginY: 'center',\n    });\n\n    expect(style.transformOriginX).toBe('0%');\n    expect(style.transformOriginY).toBe('50%');\n  });\n\n  test('should resolve transform origin left bottom', () => {\n    const style = resolveStyle({\n      transformOriginX: 'left',\n      transformOriginY: 'bottom',\n    });\n\n    expect(style.transformOriginX).toBe('0%');\n    expect(style.transformOriginY).toBe('100%');\n  });\n\n  test('should resolve transform origin right top', () => {\n    const style = resolveStyle({\n      transformOriginX: 'right',\n      transformOriginY: 'top',\n    });\n\n    expect(style.transformOriginX).toBe('100%');\n    expect(style.transformOriginY).toBe('0%');\n  });\n\n  test('should resolve transform origin right center', () => {\n    const style = resolveStyle({\n      transformOriginX: 'right',\n      transformOriginY: 'center',\n    });\n\n    expect(style.transformOriginX).toBe('100%');\n    expect(style.transformOriginY).toBe('50%');\n  });\n\n  test('should resolve transform origin right bottom', () => {\n    const style = resolveStyle({\n      transformOriginX: 'right',\n      transformOriginY: 'bottom',\n    });\n\n    expect(style.transformOriginX).toBe('100%');\n    expect(style.transformOriginY).toBe('100%');\n  });\n\n  test('should resolve transform origin center center', () => {\n    const style = resolveStyle({\n      transformOriginX: 'center',\n      transformOriginY: 'center',\n    });\n\n    expect(style.transformOriginX).toBe('50%');\n    expect(style.transformOriginY).toBe('50%');\n  });\n\n  test('should resolve single value scale operation', () => {\n    const style = resolveStyle({ transform: 'scale(1)' });\n\n    expect(style.transform).toEqual([{ operation: 'scale', value: [1, 1] }]);\n  });\n\n  test('should resolve single value gradient scale operation', () => {\n    const style = resolveStyle({ gradientTransform: 'scale(1)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'scale', value: [1, 1] },\n    ]);\n  });\n\n  test('should resolve multiple value scale operation', () => {\n    const style = resolveStyle({ transform: 'scale(3, 2)' });\n\n    expect(style.transform).toEqual([{ operation: 'scale', value: [3, 2] }]);\n  });\n\n  test('should resolve multiple value gradient scale operation', () => {\n    const style = resolveStyle({ gradientTransform: 'scale(3, 2)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'scale', value: [3, 2] },\n    ]);\n  });\n\n  test('should resolve multiple value scale operation without comma separator', () => {\n    const style = resolveStyle({ transform: 'scale(3 2)' });\n\n    expect(style.transform).toEqual([{ operation: 'scale', value: [3, 2] }]);\n  });\n\n  test('should resolve multiple value gradient scale operation without comma separator', () => {\n    const style = resolveStyle({ gradientTransform: 'scale(3 2)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'scale', value: [3, 2] },\n    ]);\n  });\n\n  test('should resolve multiple value scale operation with negative and floats', () => {\n    const style = resolveStyle({ transform: 'scale(0.1, -10)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'scale', value: [0.1, -10] },\n    ]);\n  });\n\n  test('should resolve multiple value gradient scale operation with negative and floats', () => {\n    const style = resolveStyle({ gradientTransform: 'scale(0.1, -10)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'scale', value: [0.1, -10] },\n    ]);\n  });\n\n  test('should resolve scaleX operation', () => {\n    const style = resolveStyle({ transform: 'scaleX(10)' });\n\n    expect(style.transform).toEqual([{ operation: 'scale', value: [10, 1] }]);\n  });\n\n  test('should resolve scaleX gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'scaleX(10)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'scale', value: [10, 1] },\n    ]);\n  });\n\n  test('should resolve scaleY operation', () => {\n    const style = resolveStyle({ transform: 'scaleY(0.5)' });\n\n    expect(style.transform).toEqual([{ operation: 'scale', value: [1, 0.5] }]);\n  });\n\n  test('should resolve scaleY gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'scaleY(0.5)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'scale', value: [1, 0.5] },\n    ]);\n  });\n\n  test('should resolve translate operation', () => {\n    const style = resolveStyle({ transform: 'translate(10px, 20px)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'translate', value: [10, 20] },\n    ]);\n  });\n\n  test('should resolve translate gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'translate(10px, 20px)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'translate', value: [10, 20] },\n    ]);\n  });\n\n  test('should resolve translate operation without comma separator', () => {\n    const style = resolveStyle({ transform: 'translate(10px 20px)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'translate', value: [10, 20] },\n    ]);\n  });\n\n  test('should resolve translate gradient operation without comma separator', () => {\n    const style = resolveStyle({ gradientTransform: 'translate(10px 20px)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'translate', value: [10, 20] },\n    ]);\n  });\n\n  test('should resolve translate operation with negative and floats', () => {\n    const style = resolveStyle({ transform: 'translate(-110px, 0.29px)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'translate', value: [-110, 0.29] },\n    ]);\n  });\n\n  test('should resolve translate gradient operation with negative and floats', () => {\n    const style = resolveStyle({\n      gradientTransform: 'translate(-110px, 0.29px)',\n    });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'translate', value: [-110, 0.29] },\n    ]);\n  });\n\n  test('should resolve translateX operation', () => {\n    const style = resolveStyle({ transform: 'translateX(10px)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'translate', value: [10, 0] },\n    ]);\n  });\n\n  test('should resolve translateX gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'translateX(10px)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'translate', value: [10, 0] },\n    ]);\n  });\n\n  test('should resolve translateY operation', () => {\n    const style = resolveStyle({ transform: 'translateY(-10px)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'translate', value: [0, -10] },\n    ]);\n  });\n\n  test('should resolve translateY gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'translateY(-10px)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'translate', value: [0, -10] },\n    ]);\n  });\n\n  test('should resolve numeric rotate operation', () => {\n    const style = resolveStyle({ transform: 'rotate(120)' });\n\n    expect(style.transform).toEqual([{ operation: 'rotate', value: [120] }]);\n  });\n\n  test('should resolve numeric rotate gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'rotate(120)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'rotate', value: [120] },\n    ]);\n  });\n\n  test('should resolve float rotate operation', () => {\n    const style = resolveStyle({ transform: 'rotate(0.1)' });\n\n    expect(style.transform).toEqual([{ operation: 'rotate', value: [0.1] }]);\n  });\n\n  test('should resolve float rotate gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'rotate(0.1)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'rotate', value: [0.1] },\n    ]);\n  });\n\n  test('should resolve deg rotate operation', () => {\n    const style = resolveStyle({ transform: 'rotate(2deg)' });\n\n    expect(style.transform).toEqual([{ operation: 'rotate', value: [2] }]);\n  });\n\n  test('should resolve deg rotate gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'rotate(2deg)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'rotate', value: [2] },\n    ]);\n  });\n\n  test('should resolve negative deg rotate operation', () => {\n    const style = resolveStyle({ transform: 'rotate(-2deg)' });\n\n    expect(style.transform).toEqual([{ operation: 'rotate', value: [-2] }]);\n  });\n\n  test('should resolve negative deg rotate gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'rotate(-2deg)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'rotate', value: [-2] },\n    ]);\n  });\n\n  test('should resolve rad rotate operation', () => {\n    const style = resolveStyle({ transform: 'rotate(3.1416rad)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'rotate', value: [180.0004209182994] },\n    ]);\n  });\n\n  test('should resolve rad rotate gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'rotate(3.1416rad)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'rotate', value: [180.0004209182994] },\n    ]);\n  });\n\n  test('should resolve negative rad rotate operation', () => {\n    const style = resolveStyle({ transform: 'rotate(-3.1416rad)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'rotate', value: [-180.0004209182994] },\n    ]);\n  });\n\n  test('should resolve negative rad rotate gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'rotate(-3.1416rad)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'rotate', value: [-180.0004209182994] },\n    ]);\n  });\n\n  test('should resolve numeric skew operation', () => {\n    const style = resolveStyle({ transform: 'skew(120, 80)' });\n\n    expect(style.transform).toEqual([{ operation: 'skew', value: [120, 80] }]);\n  });\n\n  test('should resolve numeric skew gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'skew(120, 80)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'skew', value: [120, 80] },\n    ]);\n  });\n\n  test('should resolve float skew operation', () => {\n    const style = resolveStyle({ transform: 'skew(30.5, 40.5)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'skew', value: [30.5, 40.5] },\n    ]);\n  });\n\n  test('should resolve float skew gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'skew(30.5, 40.5)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'skew', value: [30.5, 40.5] },\n    ]);\n  });\n\n  test('should resolve deg skew operation', () => {\n    const style = resolveStyle({ transform: 'skew(2deg, 20deg)' });\n\n    expect(style.transform).toEqual([{ operation: 'skew', value: [2, 20] }]);\n  });\n\n  test('should resolve deg skew gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'skew(2deg, 20deg)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'skew', value: [2, 20] },\n    ]);\n  });\n\n  test('should resolve negative deg skew operation', () => {\n    const style = resolveStyle({ transform: 'skew(-2deg, -5deg)' });\n\n    expect(style.transform).toEqual([{ operation: 'skew', value: [-2, -5] }]);\n  });\n\n  test('should resolve negative deg skew gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'skew(-2deg, -5deg)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'skew', value: [-2, -5] },\n    ]);\n  });\n\n  test('should resolve rad skew operation', () => {\n    const style = resolveStyle({\n      transform: 'skew(3.1416rad, 3.1416rad)',\n    });\n\n    expect(style.transform).toEqual([\n      { operation: 'skew', value: [180.0004209182994, 180.0004209182994] },\n    ]);\n  });\n\n  test('should resolve rad skew gradient operation', () => {\n    const style = resolveStyle({\n      gradientTransform: 'skew(3.1416rad, 3.1416rad)',\n    });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'skew', value: [180.0004209182994, 180.0004209182994] },\n    ]);\n  });\n\n  test('should resolve negative rad skew operation', () => {\n    const style = resolveStyle({\n      transform: 'skew(-3.1416rad, -3.1416rad)',\n    });\n\n    expect(style.transform).toEqual([\n      { operation: 'skew', value: [-180.0004209182994, -180.0004209182994] },\n    ]);\n  });\n\n  test('should resolve negative rad skew gradient operation', () => {\n    const style = resolveStyle({\n      gradientTransform: 'skew(-3.1416rad, -3.1416rad)',\n    });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'skew', value: [-180.0004209182994, -180.0004209182994] },\n    ]);\n  });\n\n  test('should resolve mixed units skew operation', () => {\n    const style = resolveStyle({ transform: 'skew(-3.1416rad, 10deg)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'skew', value: [-180.0004209182994, 10] },\n    ]);\n  });\n\n  test('should resolve mixed units skew gradient operation', () => {\n    const style = resolveStyle({\n      gradientTransform: 'skew(-3.1416rad, 10deg)',\n    });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'skew', value: [-180.0004209182994, 10] },\n    ]);\n  });\n\n  test('should resolve skewX operation', () => {\n    const style = resolveStyle({ transform: 'skewX(-10)' });\n\n    expect(style.transform).toEqual([{ operation: 'skew', value: [-10, 0] }]);\n  });\n\n  test('should resolve skewX gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'skewX(-10)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'skew', value: [-10, 0] },\n    ]);\n  });\n\n  test('should resolve skewY operation', () => {\n    const style = resolveStyle({ transform: 'skewY(-10)' });\n\n    expect(style.transform).toEqual([{ operation: 'skew', value: [0, -10] }]);\n  });\n\n  test('should resolve skewY gradient operation', () => {\n    const style = resolveStyle({ gradientTransform: 'skewY(-10)' });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'skew', value: [0, -10] },\n    ]);\n  });\n\n  test('should resolve matrix operation', () => {\n    const style = resolveStyle({\n      transform: 'matrix(-1, -0.1, 0, 0.1, 1, 10)',\n    });\n\n    expect(style.transform).toEqual([\n      { operation: 'matrix', value: [-1, -0.1, 0, 0.1, 1, 10] },\n    ]);\n  });\n\n  test('should resolve matrix gradient operation', () => {\n    const style = resolveStyle({\n      gradientTransform: 'matrix(-1, -0.1, 0, 0.1, 1, 10)',\n    });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'matrix', value: [-1, -0.1, 0, 0.1, 1, 10] },\n    ]);\n  });\n\n  test('should resolve combined operations', () => {\n    const style = resolveStyle({\n      transform:\n        'translate(10px, 20px) scale(0.1, -10) matrix(-1, -0.1, 0, 0.1, 1, 10)',\n    });\n\n    expect(style.transform).toEqual([\n      { operation: 'translate', value: [10, 20] },\n      { operation: 'scale', value: [0.1, -10] },\n      { operation: 'matrix', value: [-1, -0.1, 0, 0.1, 1, 10] },\n    ]);\n  });\n\n  test('should resolve combined gradient operations', () => {\n    const style = resolveStyle({\n      gradientTransform:\n        'translate(10px, 20px) scale(0.1, -10) matrix(-1, -0.1, 0, 0.1, 1, 10)',\n    });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'translate', value: [10, 20] },\n      { operation: 'scale', value: [0.1, -10] },\n      { operation: 'matrix', value: [-1, -0.1, 0, 0.1, 1, 10] },\n    ]);\n  });\n\n  // This can happen when transform get's parsed as prop and then again on an SVG node\n  test('should leave parsed tranform value as is', () => {\n    const style = resolveStyle({\n      transform: [{ operation: 'rotate', value: [-180.0004209182994] }] as any,\n    });\n\n    expect(style.transform).toEqual([\n      { operation: 'rotate', value: [-180.0004209182994] },\n    ]);\n  });\n\n  // This can happen when transform get's parsed as prop and then again on an SVG node\n  test('should leave parsed tranform gradient value as is', () => {\n    const style = resolveStyle({\n      gradientTransform: [\n        { operation: 'rotate', value: [-180.0004209182994] },\n      ] as any,\n    });\n\n    expect(style.gradientTransform).toEqual([\n      { operation: 'rotate', value: [-180.0004209182994] },\n    ]);\n  });\n\n  test('should resolve transform origin with rem units', () => {\n    const style = resolveStyle({ transformOrigin: '2rem 3rem' });\n\n    expect(style).toEqual({\n      transformOriginX: 20,\n      transformOriginY: 30,\n    });\n  });\n\n  test('should resolve transform origin with vw units', () => {\n    const style = resolveStyle({ transformOrigin: '50vw 25vw' });\n\n    expect(style).toEqual({\n      transformOriginX: 100,\n      transformOriginY: 50,\n    });\n  });\n\n  test('should resolve transform origin with vh units', () => {\n    const style = resolveStyle({ transformOrigin: '50vh 25vh' });\n\n    expect(style).toEqual({\n      transformOriginX: 200,\n      transformOriginY: 100,\n    });\n  });\n\n  test('should resolve transformOriginX with rem unit', () => {\n    const style = resolveStyle({ transformOriginX: '2rem' });\n\n    expect(style).toEqual({ transformOriginX: 20 });\n  });\n\n  test('should resolve transformOriginY with vw unit', () => {\n    const style = resolveStyle({ transformOriginY: '50vw' });\n\n    expect(style).toEqual({ transformOriginY: 100 });\n  });\n\n  test('should resolve translate operation parses numeric value', () => {\n    const style = resolveStyle({ transform: 'translate(100, 200)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'translate', value: [100, 200] },\n    ]);\n  });\n\n  test('should resolve single value skew operation', () => {\n    const style = resolveStyle({ transform: 'skew(30deg)' });\n\n    expect(style.transform).toEqual([{ operation: 'skew', value: [30] }]);\n  });\n\n  test('should resolve transform origin top left shorthand', () => {\n    const style = resolveStyle({ transformOrigin: 'top left' });\n\n    expect(style).toEqual({\n      transformOriginX: '0%',\n      transformOriginY: '0%',\n    });\n  });\n\n  test('should resolve transform origin bottom right shorthand', () => {\n    const style = resolveStyle({ transformOrigin: 'bottom right' });\n\n    expect(style).toEqual({\n      transformOriginX: '100%',\n      transformOriginY: '100%',\n    });\n  });\n\n  test('should resolve transform origin center top shorthand', () => {\n    const style = resolveStyle({ transformOrigin: 'center top' });\n\n    expect(style).toEqual({\n      transformOriginX: '50%',\n      transformOriginY: '0%',\n    });\n  });\n\n  test('should resolve numeric transformOriginX and transformOriginY', () => {\n    const style = resolveStyle({\n      transformOriginX: 50,\n      transformOriginY: 100,\n    });\n\n    expect(style).toEqual({\n      transformOriginX: 50,\n      transformOriginY: 100,\n    });\n  });\n\n  test('should resolve combined rotate and translate operations', () => {\n    const style = resolveStyle({\n      transform: 'rotate(45deg) translate(10px, 20px)',\n    });\n\n    expect(style.transform).toEqual([\n      { operation: 'rotate', value: [45] },\n      { operation: 'translate', value: [10, 20] },\n    ]);\n  });\n\n  test('should resolve combined scale and rotate operations', () => {\n    const style = resolveStyle({\n      transform: 'scale(2) rotate(90deg)',\n    });\n\n    expect(style.transform).toEqual([\n      { operation: 'scale', value: [2, 2] },\n      { operation: 'rotate', value: [90] },\n    ]);\n  });\n\n  test('should resolve skewX with deg unit', () => {\n    const style = resolveStyle({ transform: 'skewX(30deg)' });\n\n    expect(style.transform).toEqual([{ operation: 'skew', value: [30, 0] }]);\n  });\n\n  test('should resolve skewY with deg unit', () => {\n    const style = resolveStyle({ transform: 'skewY(45deg)' });\n\n    expect(style.transform).toEqual([{ operation: 'skew', value: [0, 45] }]);\n  });\n\n  test('should resolve skewX with rad unit', () => {\n    const style = resolveStyle({ transform: 'skewX(1.5708rad)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'skew', value: [90.0002104591497, 0] },\n    ]);\n  });\n\n  test('should resolve skewY with rad unit', () => {\n    const style = resolveStyle({ transform: 'skewY(1.5708rad)' });\n\n    expect(style.transform).toEqual([\n      { operation: 'skew', value: [0, 90.0002104591497] },\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/stylesheet/tsconfig.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"compilerOptions\": {\n    \"outDir\": \"lib\",\n    \"declaration\": true,\n    \"declarationDir\": \"lib/types\",\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2022\", \"DOM\"],\n    \"moduleResolution\": \"Node\",\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": false,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"types\": [\"vitest/globals\"],\n  },\n  \"include\": [\"src\"],\n}\n"
  },
  {
    "path": "packages/textkit/.gitignore",
    "content": "node_modules/\n.DS_Store\ndist\n*.pdf\n*.ttf\nlerna-debug.log\nlib\n"
  },
  {
    "path": "packages/textkit/CHANGELOG.md",
    "content": "# @react-pdf/textkit\n\n## 6.1.0\n\n### Minor Changes\n\n- [#3188](https://github.com/diegomura/react-pdf/pull/3188) [`f034491b`](https://github.com/diegomura/react-pdf/commit/f034491b1f77ce6f18a5db88e70b10b9c502ca35) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - Fix and rework the hyphenation algorithm, and allow custom word hyphenation algorithms to specify whether a hyphen should be inserted in case the word is wrapped.\n\n  **Caution**: If you have been using a custom hyphenation callback - which hasn't been working properly since at least version 2.0.21 - then you will need to change your implementation to leave a soft hyphen character (`'\\u00AD'`) at the end of syllables where you want react-pdf to insert a hyphen when wrapping lines. Syllables without a final soft hyphen character will still be able to break, but will not produce a hyphen character at the end of the line.\n\n  This allows you to break correctly on normal hyphens or other special characters in your text. For example, to use the default english-language syllable breaking built into react-pdf, but also break after hyphens naturally occurring in your text (such as is often present in hyperlinks), you could use the following hyphenation callback:\n\n  ```js\n  import { Font } from \"@react-pdf/renderer\";\n\n  Font.registerHyphenationCallback((word, originalHyphenationCallback) => {\n    return originalHyphenationCallback(word).flatMap((w) => w.split(/(?<=-)/));\n  });\n  ```\n\n  (`flatMap` requires at least ES2019)\n\n## 6.0.0\n\n### Major Changes\n\n- [#3104](https://github.com/diegomura/react-pdf/pull/3104) [`ddfa3675`](https://github.com/diegomura/react-pdf/commit/ddfa367587618b313b4b0b3b57a9a7631e8e7604) Thanks [@diegomura](https://github.com/diegomura)! - feat(textkit): expect font array\n\n### Minor Changes\n\n- [#3102](https://github.com/diegomura/react-pdf/pull/3102) [`24690f52`](https://github.com/diegomura/react-pdf/commit/24690f5238e4eacf28351cf9996856a7d196d29e) Thanks [@diegomura](https://github.com/diegomura)! - feat: handle standard fonts in fonts package\n\n- [#3103](https://github.com/diegomura/react-pdf/pull/3103) [`b06d3a0f`](https://github.com/diegomura/react-pdf/commit/b06d3a0f64593ac18097efd061334f1e5bd70095) Thanks [@diegomura](https://github.com/diegomura)! - refactor: unify font substitution engines\n\n### Patch Changes\n\n- [`c7b74963`](https://github.com/diegomura/react-pdf/commit/c7b749632f07db7808d58d99357dc830d4895da8) Thanks [@diegomura](https://github.com/diegomura)! - fix: resolve attachments\n\n- [#3098](https://github.com/diegomura/react-pdf/pull/3098) [`bfb51ec0`](https://github.com/diegomura/react-pdf/commit/bfb51ec09b851c52659ce16fed1286173e9516a9) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert render package to TS\n\n- [#3092](https://github.com/diegomura/react-pdf/pull/3092) [`481b536f`](https://github.com/diegomura/react-pdf/commit/481b536f4ad145fb227829399b85a35838a506f8) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert layout package to TS\n\n- Updated dependencies [[`481b536f`](https://github.com/diegomura/react-pdf/commit/481b536f4ad145fb227829399b85a35838a506f8)]:\n  - @react-pdf/fns@3.1.2\n\n## 5.0.3\n\n### Patch Changes\n\n- [#3077](https://github.com/diegomura/react-pdf/pull/3077) [`442ce355`](https://github.com/diegomura/react-pdf/commit/442ce35534f916b9146a35fd03870387ed488d92) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert textkit package to TS\n\n- Updated dependencies [[`24fe4bf8`](https://github.com/diegomura/react-pdf/commit/24fe4bf894fff055121926488b30d0bf212a9c45), [`442ce355`](https://github.com/diegomura/react-pdf/commit/442ce35534f916b9146a35fd03870387ed488d92), [`3007d34a`](https://github.com/diegomura/react-pdf/commit/3007d34ad3e10bf32ada3631938f5bb08e1c549f)]:\n  - @react-pdf/fns@3.1.1\n\n## 5.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`d36ace66`](https://github.com/diegomura/react-pdf/commit/d36ace66c77d57d845894e89772be7ae0cdd25ee)]:\n  - @react-pdf/fns@3.1.0\n\n## 5.0.1\n\n### Patch Changes\n\n- [#2975](https://github.com/diegomura/react-pdf/pull/2975) [`00bfdc1e`](https://github.com/diegomura/react-pdf/commit/00bfdc1e5a6c673d2de7b3ab09d5020e932562fb) Thanks [@daslaf](https://github.com/daslaf)! - fix issue with indentation shrinking all lines\n\n## 5.0.0\n\n### Major Changes\n\n- [#2871](https://github.com/diegomura/react-pdf/pull/2871) [`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119) Thanks [@diegomura](https://github.com/diegomura)! - feat!: drop cjs support\n\n### Patch Changes\n\n- Updated dependencies [[`70f29a04`](https://github.com/diegomura/react-pdf/commit/70f29a0407b1d56e9a7932b25c0d69132e9b4119)]:\n  - @react-pdf/fns@3.0.0\n\n## 4.4.1\n\n### Patch Changes\n\n- [#2605](https://github.com/diegomura/react-pdf/pull/2605) [`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - fix: fix CJS compatibility\n\n- Updated dependencies [[`f7505ed`](https://github.com/diegomura/react-pdf/commit/f7505ed453a1a0ae960d0e5e4a1d155803861b71)]:\n  - @react-pdf/fns@2.2.1\n\n## 4.4.0\n\n### Minor Changes\n\n- [#2600](https://github.com/diegomura/react-pdf/pull/2600) [`8350154`](https://github.com/diegomura/react-pdf/commit/83501541e3a050021e18e112bb472b2dabc142a7) Thanks [@diegomura](https://github.com/diegomura)! - feat: bidi support\n\n### Patch Changes\n\n- Updated dependencies [[`8350154`](https://github.com/diegomura/react-pdf/commit/83501541e3a050021e18e112bb472b2dabc142a7)]:\n  - @react-pdf/fns@2.2.0\n\n## 4.3.0\n\n### Minor Changes\n\n- [#2409](https://github.com/diegomura/react-pdf/pull/2409) [`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Add support for native ESM\n\n### Patch Changes\n\n- Updated dependencies [[`b6a14fd`](https://github.com/diegomura/react-pdf/commit/b6a14fd160fab26a49f798e5294b0e361e67fe37)]:\n  - @react-pdf/fns@2.1.0\n\n## 4.2.1\n\n### Patch Changes\n\n- [#2479](https://github.com/diegomura/react-pdf/pull/2479) [`45b2bd3`](https://github.com/diegomura/react-pdf/commit/45b2bd37037c605727ad5783f2f2a438dc19cac4) Thanks [@diegomura](https://github.com/diegomura)! - fix linting\n\n## 4.2.0\n\n### Minor Changes\n\n- [#2214](https://github.com/diegomura/react-pdf/pull/2214) [`2db67a3`](https://github.com/diegomura/react-pdf/commit/2db67a38b9be98b7816a2b5aa4733446b95e3724) Thanks [@KODIKAS-NL](https://github.com/KODIKAS-NL)! - added base support for verticalAlign \"super\" and \"sub\"\n\n### Patch Changes\n\n- Updated dependencies [[`eff1ff0`](https://github.com/diegomura/react-pdf/commit/eff1ff0fefcd710994e4654904ef55843af76a17)]:\n  - @react-pdf/fns@2.0.1\n\n## 4.1.1\n\n### Patch Changes\n\n- [#2205](https://github.com/diegomura/react-pdf/pull/2205) [`9a5e0be`](https://github.com/diegomura/react-pdf/commit/9a5e0befb89756db07ce053192a136df9d4ba905) Thanks [@jeetiss](https://github.com/jeetiss)! - update babel\n\n## 4.1.0\n\n### Minor Changes\n\n- [#1891](https://github.com/diegomura/react-pdf/pull/1891) [`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - feat: compatibility with modern web bundlers and browsers\n\n### Patch Changes\n\n- [#1917](https://github.com/diegomura/react-pdf/pull/1917) [`4bb97c3`](https://github.com/diegomura/react-pdf/commit/4bb97c3b92e82d7d7be2698c770f42560c6fcab6) Thanks [@carlobeltrame](https://github.com/carlobeltrame)! - fix: console error when text overflows the last available rect\n\n- Updated dependencies [[`a5a933c`](https://github.com/diegomura/react-pdf/commit/a5a933c9733e4c77338ef76a2b3545b84a646a81)]:\n  - @react-pdf/fns@2.0.0\n\n## 4.0.0\n\n### Major Changes\n\n- [#1906](https://github.com/diegomura/react-pdf/pull/1906) [`884695b`](https://github.com/diegomura/react-pdf/commit/884695b44feb974f155c83e0714e8e939b4f641b) Thanks [@diegomura](https://github.com/diegomura)! - feat: build textkit with rollup & define public api\n\n### Minor Changes\n\n- [#1895](https://github.com/diegomura/react-pdf/pull/1895) [`37a9a74`](https://github.com/diegomura/react-pdf/commit/37a9a747f7677fa05e3ddf5669c0379aa65c1e39) Thanks [@diegomura](https://github.com/diegomura)! - feat: exclude rects on textkit layout container\n\n### Patch Changes\n\n- [#1907](https://github.com/diegomura/react-pdf/pull/1907) [`0fcc594`](https://github.com/diegomura/react-pdf/commit/0fcc594310d5af30ca1e752b3efc7a047e813dcb) Thanks [@diegomura](https://github.com/diegomura)! - chore: use unicode-properties mainline repo\n\n## 3.0.0\n\n### Major Changes\n\n- [#1830](https://github.com/diegomura/react-pdf/pull/1830) [`9a2b935`](https://github.com/diegomura/react-pdf/commit/9a2b935cfe173f80425ed87d9f474da271c050d2) Thanks [@diegomura](https://github.com/diegomura)! - refactor: remove ramda from textkit package\n\n### Patch Changes\n\n- [#1838](https://github.com/diegomura/react-pdf/pull/1838) [`9bdb5c9`](https://github.com/diegomura/react-pdf/commit/9bdb5c934a822340754cd4c892d399f91f6218de) Thanks [@diegomura](https://github.com/diegomura)! - feat: create fns package\n\n- Updated dependencies [[`434df31`](https://github.com/diegomura/react-pdf/commit/434df317a92ae5b51ee7b23a9f6500de0b6aa4aa), [`9bdb5c9`](https://github.com/diegomura/react-pdf/commit/9bdb5c934a822340754cd4c892d399f91f6218de)]:\n  - @react-pdf/unicode-properties@2.6.0\n  - @react-pdf/fns@1.0.0\n\n## 2.1.0\n\n### Minor Changes\n\n- [#1654](https://github.com/diegomura/react-pdf/pull/1654) [`ccf3bf2`](https://github.com/diegomura/react-pdf/commit/ccf3bf22867a9bd49668cdd3543ec32492a40e4b) Thanks [@jeetiss](https://github.com/jeetiss)! - added `@babel/runtime` to dependencies\n\n### Patch Changes\n\n- [#1581](https://github.com/diegomura/react-pdf/pull/1581) [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca) Thanks [@jeetiss](https://github.com/jeetiss)! - added changelog with changesets\n\n* [#1567](https://github.com/diegomura/react-pdf/pull/1567) [`5d2d688`](https://github.com/diegomura/react-pdf/commit/5d2d688e18c830bb96c6e08446437d29f9f9c65f) Thanks [@hayoung0Lee](https://github.com/hayoung0Lee)! - fixed line breaks for the case when the word in a text is bigger than the given width\n\n* Updated dependencies [[`4c5d527`](https://github.com/diegomura/react-pdf/commit/4c5d52721d29d843f1d09c3fd74370832429f70e), [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca)]:\n  - @react-pdf/unicode-properties@2.5.0\n"
  },
  {
    "path": "packages/textkit/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n# @react-pdf/textkit\n\n> An advanced text layout framework\n\nA comprehensive text layout engine for react-pdf. Handles complex text rendering including bidirectional text, line breaking, hyphenation, justification, font substitution, and text decoration.\n\n## Acknowledges\n\nThis project is a fork of [textkit](https://github.com/foliojs/textkit) by @devongovett and continued under the scope of this project since it has react-pdf specific features. Any recongnition should go to him and the original project mantainers.\n\n## Installation\n\n```bash\nyarn add @react-pdf/textkit\n```\n\n## Usage\n\n```js\nimport layoutEngine, {\n  bidi,\n  linebreaker,\n  justification,\n  textDecoration,\n  scriptItemizer,\n  wordHyphenation,\n  fontSubstitution,\n  fromFragments,\n} from '@react-pdf/textkit';\n\n// Create engines configuration\nconst engines = {\n  bidi: bidi(),\n  linebreaker: linebreaker({}),\n  justification: justification({}),\n  textDecoration: textDecoration(),\n  scriptItemizer: scriptItemizer(),\n  wordHyphenation: wordHyphenation(),\n  fontSubstitution: fontSubstitution(),\n};\n\n// Create attributed string from fragments\nconst attributedString = fromFragments([\n  { string: 'Hello ', attributes: { fontSize: 12, font: [myFont] } },\n  { string: 'World!', attributes: { fontSize: 12, font: [myFont] } },\n]);\n\n// Define container\nconst container = {\n  x: 0,\n  y: 0,\n  width: 400,\n  height: 600,\n};\n\n// Layout text\nconst layout = layoutEngine(engines);\nconst paragraphs = layout(attributedString, container, {});\n```\n\n## Layout Process\n\nThe layout engine processes text through the following steps:\n\n1. Split into paragraphs\n2. Get bidi runs and paragraph direction\n3. Font substitution - map to resolved font runs\n4. Script itemization\n5. Font shaping - text to glyphs\n6. Line breaking\n7. Bidi reordering\n8. Justification\n9. Get a list of rectangles by intersecting path, line, and exclusion paths\n10. Perform line breaking to get acceptable break points for each fragment\n11. Ellipsize line if necessary\n12. Bidi reordering\n13. Justification\n\n## Engines\n\nThe layout engine uses several specialized engines that can be customized:\n\n### bidi\n\nHandles bidirectional text analysis using the Unicode Bidirectional Algorithm. Determines text direction for mixed LTR/RTL content.\n\n```js\nimport { bidi } from '@react-pdf/textkit';\n\nconst bidiEngine = bidi();\nconst result = bidiEngine(attributedString);\n```\n\n### linebreaker\n\nPerforms line breaking using the Knuth-Plass algorithm with fallback to best-fit. Handles hyphenation points and produces optimal line breaks.\n\n```js\nimport { linebreaker } from '@react-pdf/textkit';\n\nconst linebreakerEngine = linebreaker({\n  tolerance: 4,\n  hyphenationPenalty: 100,\n});\n```\n\n### justification\n\nAdjusts character and word spacing to achieve justified text alignment. Based on Apple's justification algorithm.\n\n```js\nimport { justification } from '@react-pdf/textkit';\n\nconst justificationEngine = justification({\n  expandCharFactor: { before: 0, after: 0 },\n  shrinkCharFactor: { before: 0, after: 0 },\n  expandWhitespaceFactor: { before: 0.5, after: 0.5 },\n  shrinkWhitespaceFactor: { before: 0.5, after: 0.5 },\n});\n```\n\n### fontSubstitution\n\nAutomatically substitutes fonts when the primary font doesn't have glyphs for certain characters. Picks the best font from the font stack.\n\n```js\nimport { fontSubstitution } from '@react-pdf/textkit';\n\nconst fontSubstitutionEngine = fontSubstitution();\n```\n\n### scriptItemizer\n\nIdentifies Unicode script runs in text (Latin, Arabic, Han, etc.) to enable proper font selection and shaping.\n\n```js\nimport { scriptItemizer } from '@react-pdf/textkit';\n\nconst scriptItemizerEngine = scriptItemizer();\n```\n\n### wordHyphenation\n\nProvides word hyphenation using language-specific patterns. Supports soft hyphens and custom hyphenation callbacks.\n\n```js\nimport { wordHyphenation } from '@react-pdf/textkit';\n\nconst wordHyphenationEngine = wordHyphenation();\nconst syllables = wordHyphenationEngine('hyphenation'); // ['hy', 'phen', 'a', 'tion']\n```\n\n### textDecoration\n\nGenerates decoration lines (underline, strikethrough) for styled text runs.\n\n```js\nimport { textDecoration } from '@react-pdf/textkit';\n\nconst textDecorationEngine = textDecoration();\n```\n\n## API Reference\n\n### layoutEngine(engines)\n\nCreates a layout function with the specified engines.\n\n```js\nconst layout = layoutEngine(engines);\nconst paragraphs = layout(attributedString, container, options);\n```\n\n### fromFragments(fragments)\n\nCreates an AttributedString from text fragments.\n\n```js\nimport { fromFragments } from '@react-pdf/textkit';\n\nconst attributedString = fromFragments([\n  { string: 'Hello ', attributes: { fontSize: 14 } },\n  { string: 'World!', attributes: { fontSize: 14, color: 'blue' } },\n]);\n```\n\n## Types\n\n### AttributedString\n\nThe main data structure representing styled text:\n\n```ts\ntype AttributedString = {\n  string: string;\n  runs: Run[];\n  syllables?: string[];\n  box?: Rect;\n  decorationLines?: DecorationLine[];\n};\n```\n\n### Run\n\nA styled segment of text:\n\n```ts\ntype Run = {\n  start: number;\n  end: number;\n  attributes: Attributes;\n  glyphs?: Glyph[];\n  positions?: Position[];\n  glyphIndices?: number[];\n};\n```\n\n### Attributes\n\nStyle attributes for text runs:\n\n```ts\ntype Attributes = {\n  align?: string;\n  alignLastLine?: string;\n  attachment?: Attachment;\n  backgroundColor?: string;\n  bidiLevel?: number;\n  characterSpacing?: number;\n  color?: string;\n  direction?: 'rtl' | 'ltr';\n  features?: unknown[];\n  fill?: boolean;\n  font?: Font[];\n  fontSize?: number;\n  hangingPunctuation?: boolean;\n  hyphenationFactor?: number;\n  indent?: number;\n  justificationFactor?: number;\n  lineHeight?: number;\n  lineSpacing?: number;\n  link?: string;\n  margin?: number;\n  marginLeft?: number;\n  marginRight?: number;\n  opacity?: number;\n  padding?: number;\n  paddingTop?: number;\n  paragraphSpacing?: number;\n  scale?: number;\n  script?: unknown;\n  shrinkFactor?: number;\n  strike?: boolean;\n  strikeColor?: string;\n  strikeStyle?: string;\n  stroke?: boolean;\n  underline?: boolean;\n  underlineColor?: string;\n  underlineStyle?: string;\n  verticalAlign?: string;\n  wordSpacing?: number;\n  yOffset?: number;\n};\n```\n\n### Container\n\nThe area where text will be laid out:\n\n```ts\ntype Container = {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  truncateMode?: 'ellipsis';\n  maxLines?: number;\n  excludeRects?: Rect[];\n};\n```\n\n### Rect\n\nA rectangle definition:\n\n```ts\ntype Rect = {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n};\n```\n\n### Fragment\n\nInput format for creating attributed strings:\n\n```ts\ntype Fragment = {\n  string: string;\n  attributes?: Attributes;\n};\n```\n\n### LayoutOptions\n\nOptions for the layout process:\n\n```ts\ntype LayoutOptions = {\n  hyphenationCallback?: (\n    word: string | null,\n    fallback: (word: string | null) => string[],\n  ) => string[];\n  tolerance?: number;\n  hyphenationPenalty?: number;\n  expandCharFactor?: JustificationFactor;\n  shrinkCharFactor?: JustificationFactor;\n  expandWhitespaceFactor?: JustificationFactor;\n  shrinkWhitespaceFactor?: JustificationFactor;\n};\n```\n\n### Engines\n\nThe engines configuration object:\n\n```ts\ntype Engines = {\n  bidi: ReturnType<typeof bidi>;\n  linebreaker: ReturnType<typeof linebreaker>;\n  justification: ReturnType<typeof justification>;\n  fontSubstitution: ReturnType<typeof fontSubstitution>;\n  scriptItemizer: ReturnType<typeof scriptItemizer>;\n  textDecoration: ReturnType<typeof textDecoration>;\n  wordHyphenation?: ReturnType<typeof wordHyphenation>;\n};\n```\n\n## License\n\nMIT\n"
  },
  {
    "path": "packages/textkit/package.json",
    "content": "{\n  \"name\": \"@react-pdf/textkit\",\n  \"license\": \"MIT\",\n  \"version\": \"6.1.0\",\n  \"description\": \"An advanced text layout framework\",\n  \"type\": \"module\",\n  \"main\": \"./lib/textkit.js\",\n  \"types\": \"./lib/index.d.ts\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/textkit\"\n  },\n  \"contributors\": [\n    \"Devon Govett <devongovett@gmail.com>\",\n    \"Diego Muracciole <diegomuracciole@gmail.com>\"\n  ],\n  \"scripts\": {\n    \"test\": \"vitest\",\n    \"build\": \"rimraf ./lib && rollup -c\",\n    \"watch\": \"rimraf ./lib && rollup -c -w\",\n    \"typecheck\": \"tsc --noEmit\"\n  },\n  \"files\": [\n    \"lib\"\n  ],\n  \"dependencies\": {\n    \"@react-pdf/fns\": \"3.1.2\",\n    \"bidi-js\": \"^1.0.2\",\n    \"hyphen\": \"^1.6.4\",\n    \"unicode-properties\": \"^1.4.1\"\n  },\n  \"devDependencies\": {\n    \"@types/fontkit\": \"^2.0.7\"\n  }\n}\n"
  },
  {
    "path": "packages/textkit/rollup.config.js",
    "content": "import localResolve from 'rollup-plugin-local-resolve';\nimport typescript from '@rollup/plugin-typescript';\nimport { dts } from 'rollup-plugin-dts';\nimport del from 'rollup-plugin-delete';\n\nimport pkg from './package.json' with { type: 'json' };\n\nconst input = './src/index.ts';\n\nconst getExternal = () => [...Object.keys(pkg.dependencies), /hyphen/];\n\nconst getPlugins = () => [typescript(), localResolve()];\n\nconst config = {\n  input,\n  output: { format: 'es', file: 'lib/textkit.js' },\n  external: getExternal(),\n  plugins: getPlugins(),\n};\n\nconst dtsConfig = {\n  input: './lib/types/index.d.ts',\n  output: [{ file: 'lib/index.d.ts', format: 'es' }],\n  plugins: [dts(), del({ targets: 'lib/types', hook: 'buildEnd' })],\n};\n\nexport default [config, dtsConfig];\n"
  },
  {
    "path": "packages/textkit/src/attributedString/advanceWidth.ts",
    "content": "import runAdvanceWidth from '../run/advanceWidth';\nimport { AttributedString, Run } from '../types';\n\n/**\n * Returns attributed string advancewidth\n *\n * @param attributedString - Attributed string\n * @returns Advance width\n */\nconst advanceWidth = (attributedString: AttributedString) => {\n  const reducer = (acc: number, run: Run) => acc + runAdvanceWidth(run);\n  return attributedString.runs.reduce(reducer, 0);\n};\n\nexport default advanceWidth;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/advanceWidthBetween.ts",
    "content": "import filterRuns from '../run/filter';\nimport runAdvanceWidthBetween from '../run/advanceWidthBetween';\nimport { AttributedString } from '../types';\n\n/**\n * Advance width between start and end\n * Does not consider ligature splitting for the moment.\n * Check performance impact on supporting this\n *\n * @param start - Start offset\n * @param end - End offset\n * @param attributedString\n * @returns Advance width\n */\nconst advanceWidthBetween = (\n  start: number,\n  end: number,\n  attributedString: AttributedString,\n) => {\n  const runs = filterRuns(start, end, attributedString.runs);\n  return runs.reduce(\n    (acc, run) => acc + runAdvanceWidthBetween(start, end, run),\n    0,\n  );\n};\n\nexport default advanceWidthBetween;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/append.ts",
    "content": "import { last } from '@react-pdf/fns';\n\nimport emptyRun from '../run/empty';\nimport appendToRun from '../run/append';\nimport stringFromCodePoints from '../utils/stringFromCodePoints';\nimport { AttributedString, Glyph } from '../types';\n\n/**\n * Append glyph into last run of attributed string\n *\n * @param glyph - Glyph or code point\n * @param attributedString - Attributed string\n * @returns Attributed string with new glyph\n */\nconst append = (\n  glyph: Glyph | number | null,\n  attributedString: AttributedString,\n): AttributedString => {\n  const codePoints = typeof glyph === 'number' ? [glyph] : glyph?.codePoints;\n  const codePointsString = stringFromCodePoints(codePoints || []);\n  const string = attributedString.string + codePointsString;\n\n  const firstRuns = attributedString.runs.slice(0, -1);\n  const lastRun = last(attributedString.runs) || emptyRun();\n  const runs = firstRuns.concat(appendToRun(glyph, lastRun));\n\n  return Object.assign({}, attributedString, { string, runs });\n};\n\nexport default append;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/ascent.ts",
    "content": "import runAscent from '../run/ascent';\nimport { AttributedString, Run } from '../types';\n\n/**\n * Returns attributed string ascent\n *\n * @param attributedString - Attributed string\n * @returns Ascent\n */\nconst ascent = (attributedString: AttributedString) => {\n  const reducer = (acc: number, run: Run) => Math.max(acc, runAscent(run));\n  return attributedString.runs.reduce(reducer, 0);\n};\n\nexport default ascent;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/descent.ts",
    "content": "import runDescent from '../run/descent';\nimport { AttributedString, Run } from '../types';\n\n/**\n * Returns attributed string descent\n *\n * @param attributedString - Attributed string\n * @returns Descent\n */\nconst descent = (attributedString: AttributedString) => {\n  const reducer = (acc: number, run: Run) => Math.min(acc, runDescent(run));\n  return attributedString.runs.reduce(reducer, 0);\n};\n\nexport default descent;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/dropLast.ts",
    "content": "import { adjust, dropLast as arrayDropLast } from '@react-pdf/fns';\n\nimport runDropLast from '../run/dropLast';\nimport { AttributedString } from '../types';\n\n/**\n * Drop last glyph\n *\n * @param attributedString - Attributed string\n * @returns Attributed string with new glyph\n */\nconst dropLast = (attributedString: AttributedString) => {\n  const string = arrayDropLast(attributedString.string);\n  const runs = adjust(-1, runDropLast, attributedString.runs);\n\n  return Object.assign({}, attributedString, { string, runs });\n};\n\nexport default dropLast;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/empty.ts",
    "content": "import { AttributedString } from '../types';\n\n/**\n * Returns empty attributed string\n *\n * @returns Empty attributed string\n */\nconst empty = (): AttributedString => ({ string: '', runs: [] });\n\nexport default empty;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/end.ts",
    "content": "import { last } from '@react-pdf/fns';\nimport { AttributedString } from '../types';\n\n/**\n * Get attributed string end value\n *\n * @param attributedString - Attributed string\n * @returns End\n */\nconst end = (attributedString: AttributedString) => {\n  const { runs } = attributedString;\n  return runs.length === 0 ? 0 : last(runs).end;\n};\n\nexport default end;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/fromFragments.ts",
    "content": "import { AttributedString, Fragment, Run } from '../types';\n\n/**\n * Create attributed string from text fragments\n *\n * @param fragments - Fragments\n * @returns Attributed string\n */\nconst fromFragments = (fragments: Fragment[]): AttributedString => {\n  let offset = 0;\n  const strings: string[] = [];\n  const runs: Run[] = [];\n\n  for (let i = 0; i < fragments.length; i += 1) {\n    const fragment = fragments[i];\n    const fragmentLength = fragment.string.length;\n\n    strings.push(fragment.string);\n\n    runs.push({\n      ...fragment,\n      start: offset,\n      end: offset + fragmentLength,\n      attributes: fragment.attributes || {},\n    });\n\n    offset += fragmentLength;\n  }\n\n  return { string: strings.join(''), runs };\n};\n\nexport default fromFragments;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/glyphWidthAt.ts",
    "content": "import runAt from './runAt';\nimport glyphIndexAt from '../run/glyphIndexAt';\nimport { AttributedString } from '../types';\n\n/**\n * Get glyph width at string index\n *\n * @param index - String index\n * @param attributedString - Attributed string\n * @returns Glyph width\n */\nconst glyphWidthAt = (index: number, attributedString: AttributedString) => {\n  const run = runAt(index, attributedString);\n  const glyphIndex = glyphIndexAt(index, run);\n  return run.positions[glyphIndex].xAdvance;\n};\n\nexport default glyphWidthAt;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/height.ts",
    "content": "import runHeight from '../run/height';\nimport { AttributedString, Run } from '../types';\n\n/**\n * Returns attributed string height\n *\n * @param attributedString - Attributed string\n * @returns Height\n */\nconst height = (attributedString: AttributedString) => {\n  const reducer = (acc: number, run: Run) => Math.max(acc, runHeight(run));\n  return attributedString.runs.reduce(reducer, 0);\n};\n\nexport default height;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/indexAtOffset.ts",
    "content": "import runLength from '../run/length';\nimport runAdvanceWidth from '../run/advanceWidth';\nimport runIndexAtOffset from '../run/indexAtOffset';\nimport { AttributedString } from '../types';\n\n/**\n * Get string index at offset\n *\n * @param offset - Offset\n * @param attributedString - Attributed string\n * @returns String index at offset N\n */\nconst indexAtOffset = (offset: number, attributedString: AttributedString) => {\n  let index = 0;\n  let counter = 0;\n\n  const runs = attributedString.runs || [];\n\n  for (let i = 0; i < runs.length; i += 1) {\n    const run = runs[i];\n\n    const advanceWidth = runAdvanceWidth(run);\n\n    if (counter + advanceWidth > offset) {\n      return index + runIndexAtOffset(offset - counter, run);\n    }\n    counter += advanceWidth;\n    index += runLength(run);\n  }\n\n  return index;\n};\n\nexport default indexAtOffset;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/insertGlyph.ts",
    "content": "import append from './append';\nimport add from '../run/add';\nimport insert from '../run/insert';\nimport runIndexAt from './runIndexAt';\nimport stringFromCodePoints from '../utils/stringFromCodePoints';\nimport { AttributedString, Glyph } from '../types';\n\n/**\n * Insert glyph into attributed string\n *\n * @param index - Index\n * @param glyph - Glyph or code point\n * @param attributedString - Attributed string\n * @returns Attributed string with new glyph\n */\nconst insertGlyph = (\n  index: number,\n  glyph: Glyph | number,\n  attributedString: AttributedString,\n): AttributedString => {\n  const runIndex = runIndexAt(index, attributedString);\n\n  // Add glyph to the end if run index invalid\n  if (runIndex === -1) return append(glyph, attributedString);\n\n  const codePoints =\n    typeof glyph === 'number' ? [glyph] : glyph?.codePoints || [];\n\n  const string =\n    attributedString.string.slice(0, index) +\n    stringFromCodePoints(codePoints) +\n    attributedString.string.slice(index);\n\n  const runs = attributedString.runs.map((run, i) => {\n    if (i === runIndex) return insert(index - run.start, glyph, run);\n\n    if (i > runIndex) return add(codePoints.length, run);\n\n    return run;\n  });\n\n  return Object.assign({}, attributedString, { string, runs });\n};\n\nexport default insertGlyph;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/leadingOffset.ts",
    "content": "import isRunWhiteSpace from '../run/isWhiteSpace';\nimport runLeadingOffset from '../run/leadingOffset';\nimport { AttributedString } from '../types';\n\n/**\n * Get attributed string leading white space offset\n *\n * @param attributedString - Attributed string\n * @returns Leading white space offset\n */\nconst leadingOffset = (attributedString: AttributedString) => {\n  const runs = attributedString.runs || [];\n\n  let offset = 0;\n\n  for (const run of runs) {\n    offset += runLeadingOffset(run);\n\n    if (!isRunWhiteSpace(run)) break;\n  }\n\n  return offset;\n};\n\nexport default leadingOffset;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/length.ts",
    "content": "import start from './start';\nimport end from './end';\nimport { AttributedString } from '../types';\n\n/**\n * Get attributed string length\n *\n * @param attributedString - Attributed string\n * @returns End\n */\nconst length = (attributedString: AttributedString) => {\n  return end(attributedString) - start(attributedString);\n};\n\nexport default length;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/prepend.ts",
    "content": "import add from '../run/add';\nimport emptyRun from '../run/empty';\nimport prependToRun from '../run/prepend';\nimport { AttributedString, Glyph, Run } from '../types';\nimport stringFromCodePoints from '../utils/stringFromCodePoints';\n\n/**\n * Prepend glyph into first run of attributed string\n *\n * @param glyph - Glyph to prepend\n * @param attributedString - Attributed string\n * @returns Attributed string with new glyph\n */\nconst prepend = (\n  glyph: Glyph | null,\n  attributedString: AttributedString,\n): AttributedString => {\n  const codePoints = glyph?.codePoints || [];\n  const string = stringFromCodePoints(codePoints) + attributedString.string;\n\n  const offset = codePoints.length;\n  const { runs: existingRuns } = attributedString;\n  const firstRun = existingRuns[0] || emptyRun();\n\n  // Build new runs array: prepend to first run, offset remaining runs\n  const runs: Run[] = [prependToRun(glyph, firstRun)];\n  for (let i = 1; i < existingRuns.length; i += 1) {\n    runs.push(add(offset, existingRuns[i]));\n  }\n\n  return { ...attributedString, runs, string };\n};\n\nexport default prepend;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/runAt.ts",
    "content": "import { AttributedString } from '../types';\nimport runIndexAt from './runIndexAt';\n\n/**\n * Get run at char index\n *\n * @param index - Char index\n * @param attributedString - Attributed string\n * @returns Run\n */\nconst runAt = (index: number, attributedString: AttributedString) => {\n  const runIndex = runIndexAt(index, attributedString);\n  return attributedString.runs[runIndex];\n};\n\nexport default runAt;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/runIndexAt.ts",
    "content": "import runIndexAtInternal from '../run/runIndexAt';\nimport { AttributedString } from '../types';\n\n/**\n * Get run index at char index\n *\n * @param index - Char index\n * @param attributedString - Attributed string\n * @returns Run index\n */\nconst runIndexAt = (index: number, attributedString: AttributedString) => {\n  return runIndexAtInternal(index, attributedString.runs);\n};\n\nexport default runIndexAt;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/slice.ts",
    "content": "import sliceRun from '../run/slice';\nimport filterRuns from '../run/filter';\nimport subtractRun from '../run/subtract';\nimport { AttributedString, Run } from '../types';\n\n/**\n * Slice array of runs\n *\n * @param start - Offset\n * @param end - Offset\n * @param runs\n * @returns Sliced runs\n */\nconst sliceRuns = (start: number, end: number, runs: Run[]) => {\n  const sliceFirstRun = (a) => sliceRun(start - a.start, end - a.start, a);\n  const sliceLastRun = (a) => sliceRun(0, end - a.start, a);\n\n  return runs.map((run, i) => {\n    let result = run;\n\n    const isFirst = i === 0;\n    const isLast = !isFirst && i === runs.length - 1;\n\n    if (isFirst) result = sliceFirstRun(run);\n    if (isLast) result = sliceLastRun(run);\n\n    return subtractRun(start, result);\n  });\n};\n\n/**\n * Slice attributed string between two indices\n *\n * @param start - Offset\n * @param end - Offset\n * @param attributedString - Attributed string\n * @returns Attributed string\n */\nconst slice = (\n  start: number,\n  end: number,\n  attributedString: AttributedString,\n): AttributedString => {\n  if (attributedString.string.length === 0) return attributedString;\n\n  const string = attributedString.string.slice(start, end);\n  const filteredRuns = filterRuns(start, end, attributedString.runs);\n  const slicedRuns = sliceRuns(start, end, filteredRuns);\n\n  return Object.assign({}, attributedString, { string, runs: slicedRuns });\n};\n\nexport default slice;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/sliceAtOffset.ts",
    "content": "import slice from './slice';\nimport indexAtOffset from './indexAtOffset';\nimport { AttributedString } from '../types';\n\n/**\n * Slice attributed string at given offset\n *\n * @param offset - Offset\n * @param attributedString - Attributed string\n * @returns Attributed string\n */\nconst sliceAtOffset = (offset: number, attributedString: AttributedString) => {\n  const index = indexAtOffset(offset, attributedString);\n  return slice(0, index, attributedString);\n};\n\nexport default sliceAtOffset;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/start.ts",
    "content": "import { AttributedString } from '../types';\n\n/**\n * Get attributed string start value\n *\n * @param attributedString - Attributed string\n * @returns Start\n */\nconst start = (attributedString: AttributedString) => {\n  const { runs } = attributedString;\n  return runs.length === 0 ? 0 : runs[0].start;\n};\n\nexport default start;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/trailingOffset.ts",
    "content": "import isRunWhiteSpace from '../run/isWhiteSpace';\nimport runTrailingOffset from '../run/trailingOffset';\nimport { AttributedString } from '../types';\n\n/**\n * Get attributed string trailing white space offset\n *\n * @param attributedString - Attributed string\n * @returns Trailing white space offset\n */\nconst trailingOffset = (attributedString: AttributedString) => {\n  const runs = attributedString.runs || [];\n\n  let offset = 0;\n\n  for (let i = runs.length - 1; i >= 0; i -= 1) {\n    const run = runs[i];\n\n    offset += runTrailingOffset(run);\n\n    if (!isRunWhiteSpace(run)) break;\n  }\n\n  return offset;\n};\n\nexport default trailingOffset;\n"
  },
  {
    "path": "packages/textkit/src/attributedString/trim.ts",
    "content": "import { AttributedString } from '../types';\nimport slice from './slice';\n\nconst WHITESPACE_REGEX = /\\S/;\n\n/**\n * Find index of first non-whitespace character\n *\n * @param string - String to search\n * @returns Index of first non-whitespace character, or -1 if not found\n */\nconst findCharIndex = (string: string) => {\n  return string.search(WHITESPACE_REGEX);\n};\n\n/**\n * Find index of last non-whitespace character\n *\n * @param string - String to search\n * @returns Index of last non-whitespace character, or -1 if not found\n */\nconst findLastCharIndex = (string: string) => {\n  for (let i = string.length - 1; i >= 0; i -= 1) {\n    if (WHITESPACE_REGEX.test(string[i])) return i;\n  }\n  return -1;\n};\n\n/**\n * Removes (strips) whitespace from both ends of the attributted string.\n *\n * @param attributedString - Attributed string\n * @returns Attributed string\n */\nconst trim = (attributedString: AttributedString) => {\n  const start = findCharIndex(attributedString.string);\n  const end = findLastCharIndex(attributedString.string);\n\n  return slice(start, end + 1, attributedString);\n};\n\nexport default trim;\n"
  },
  {
    "path": "packages/textkit/src/engines/bidi/index.ts",
    "content": "import bidiFactory from 'bidi-js';\nimport { AttributedString, Run } from '../../types';\n\nconst bidi = bidiFactory();\n\nconst bidiEngine = () => {\n  /**\n   * @param attributedString - Attributed string\n   * @returns Attributed string\n   */\n  return (attributedString: AttributedString) => {\n    const { string } = attributedString;\n    const direction = attributedString.runs[0]?.attributes.direction;\n\n    const { levels } = bidi.getEmbeddingLevels(string, direction);\n\n    let lastLevel = null;\n    let lastIndex = 0;\n    let index = 0;\n    const runs: Run[] = [];\n\n    for (let i = 0; i < levels.length; i += 1) {\n      const level = levels[i];\n\n      if (level !== lastLevel) {\n        if (lastLevel !== null) {\n          runs.push({\n            start: lastIndex,\n            end: index,\n            attributes: { bidiLevel: lastLevel },\n          });\n        }\n\n        lastIndex = index;\n        lastLevel = level;\n      }\n\n      index += 1;\n    }\n\n    if (lastIndex < string.length) {\n      runs.push({\n        start: lastIndex,\n        end: string.length,\n        attributes: { bidiLevel: lastLevel },\n      });\n    }\n\n    const result: AttributedString = { string, runs };\n\n    return result;\n  };\n};\n\nexport default bidiEngine;\n"
  },
  {
    "path": "packages/textkit/src/engines/fontSubstitution/index.ts",
    "content": "import { last } from '@react-pdf/fns';\nimport { AttributedString, Font, Run } from '../../types';\n\nconst IGNORED_CODE_POINTS = [173];\n\nconst getFontSize = (run: Run) => run.attributes.fontSize || 12;\n\nconst pickFontFromFontStack = (\n  codePoint: number,\n  fontStack: Font[],\n  lastFont?: Font,\n) => {\n  if (IGNORED_CODE_POINTS.includes(codePoint)) return lastFont;\n\n  const fontStackWithFallback = [...fontStack, lastFont];\n\n  for (let i = 0; i < fontStackWithFallback.length; i += 1) {\n    const font = fontStackWithFallback[i];\n    if (\n      font &&\n      font.hasGlyphForCodePoint &&\n      font.hasGlyphForCodePoint(codePoint)\n    ) {\n      return font;\n    }\n  }\n\n  return fontStack.at(-1);\n};\n\nconst fontSubstitution =\n  () =>\n  ({ string, runs }: AttributedString) => {\n    let lastFont: Font | null = null;\n    let lastFontSize: number | null = null;\n    let lastIndex = 0;\n    let index = 0;\n\n    const res: Run[] = [];\n\n    for (let i = 0; i < runs.length; i += 1) {\n      const run = runs[i];\n\n      if (string.length === 0) {\n        res.push({\n          start: 0,\n          end: 0,\n          attributes: { font: run.attributes.font },\n        });\n        break;\n      }\n\n      const chars = string.slice(run.start, run.end);\n\n      for (let j = 0; j < chars.length; j += 1) {\n        const char = chars[j];\n        const codePoint = char.codePointAt(0);\n\n        // If the default font does not have a glyph and the fallback font does, we use it\n        const font = pickFontFromFontStack(\n          codePoint,\n          run.attributes.font,\n          lastFont,\n        );\n\n        const fontSize = getFontSize(run);\n\n        // If anything that would impact res has changed, update it\n        if (\n          font !== lastFont ||\n          fontSize !== lastFontSize ||\n          font.unitsPerEm !== lastFont?.unitsPerEm\n        ) {\n          if (lastFont) {\n            res.push({\n              start: lastIndex,\n              end: index,\n              attributes: {\n                font: [lastFont],\n                scale: lastFontSize / lastFont.unitsPerEm,\n              },\n            });\n          }\n\n          lastFont = font;\n          lastFontSize = fontSize;\n          lastIndex = index;\n        }\n\n        index += char.length;\n      }\n    }\n\n    if (lastIndex < string.length) {\n      const fontSize = getFontSize(last(runs));\n\n      res.push({\n        start: lastIndex,\n        end: string.length,\n        attributes: {\n          font: [lastFont],\n          scale: fontSize / lastFont.unitsPerEm,\n        },\n      });\n    }\n\n    return { string, runs: res } as AttributedString;\n  };\n\nexport default fontSubstitution;\n"
  },
  {
    "path": "packages/textkit/src/engines/index.ts",
    "content": "import bidi from './bidi';\nimport linebreaker from './linebreaker';\nimport justification from './justification';\nimport fontSubstitution from './fontSubstitution';\nimport textDecoration from './textDecoration';\nimport scriptItemizer from './scriptItemizer';\nimport wordHyphenation from './wordHyphenation';\n\nexport type Engines = {\n  bidi: typeof bidi;\n  linebreaker: typeof linebreaker;\n  justification: typeof justification;\n  fontSubstitution: typeof fontSubstitution;\n  scriptItemizer: typeof scriptItemizer;\n  textDecoration: typeof textDecoration;\n  wordHyphenation?: typeof wordHyphenation;\n};\n"
  },
  {
    "path": "packages/textkit/src/engines/justification/getDistances.ts",
    "content": "import { Factor } from './types';\n\nconst KASHIDA_PRIORITY = 0;\nconst NULL_PRIORITY = 3;\n\nconst getDistances = (gap: number, factors: Factor[]): number[] => {\n  let total = 0;\n  const priorities = [];\n  const unconstrained = [];\n\n  for (\n    let priority = KASHIDA_PRIORITY;\n    priority <= NULL_PRIORITY;\n    priority += 1\n  ) {\n    priorities[priority] = unconstrained[priority] = 0;\n  }\n\n  // sum the factors at each priority\n  for (let j = 0; j < factors.length; j += 1) {\n    const f = factors[j];\n    const sum = f.before + f.after;\n    total += sum;\n    priorities[f.priority] += sum;\n    if (f.unconstrained) {\n      unconstrained[f.priority] += sum;\n    }\n  }\n\n  // choose the priorities that need to be applied\n  let highestPriority = -1;\n  let highestPrioritySum = 0;\n  let remainingGap = gap;\n  let priority;\n\n  for (priority = KASHIDA_PRIORITY; priority <= NULL_PRIORITY; priority += 1) {\n    const prioritySum = priorities[priority];\n    if (prioritySum !== 0) {\n      if (highestPriority === -1) {\n        highestPriority = priority;\n        highestPrioritySum = prioritySum;\n      }\n\n      // if this priority covers the remaining gap, we're done\n      if (Math.abs(remainingGap) <= Math.abs(prioritySum)) {\n        priorities[priority] = remainingGap / prioritySum;\n        unconstrained[priority] = 0;\n        remainingGap = 0;\n        break;\n      }\n\n      // mark that we need to use 100% of the adjustment from\n      // this priority, and subtract the space that it consumes\n      priorities[priority] = 1;\n      remainingGap -= prioritySum;\n\n      // if this priority has unconstrained glyphs, let them consume the remaining space\n      if (unconstrained[priority] !== 0) {\n        unconstrained[priority] = remainingGap / unconstrained[priority];\n        remainingGap = 0;\n        break;\n      }\n    }\n  }\n\n  // zero out remaining priorities (if any)\n  for (let p = priority + 1; p <= NULL_PRIORITY; p += 1) {\n    priorities[p] = 0;\n    unconstrained[p] = 0;\n  }\n\n  // if there is still space left over, assign it to the highest priority that we saw.\n  // this violates their factors, but it only happens in extreme cases\n  if (remainingGap > 0 && highestPriority > -1) {\n    priorities[highestPriority] =\n      (highestPrioritySum + (gap - total)) / highestPrioritySum;\n  }\n\n  // create and return an array of distances to add to each glyph's advance\n  const distances = [];\n  for (let index = 0; index < factors.length; index += 1) {\n    // the distance to add to this glyph is the sum of the space to add\n    // after this glyph, and the space to add before the next glyph\n    const f = factors[index];\n    const next = factors[index + 1];\n    let dist = f.after * priorities[f.priority];\n\n    if (next) {\n      dist += next.before * priorities[next.priority];\n    }\n\n    // if this glyph is unconstrained, add the unconstrained distance as well\n    if (f.unconstrained) {\n      dist += f.after * unconstrained[f.priority];\n      if (next) {\n        dist += next.before * unconstrained[next.priority];\n      }\n    }\n\n    distances.push(dist);\n  }\n\n  return distances;\n};\n\nexport default getDistances;\n"
  },
  {
    "path": "packages/textkit/src/engines/justification/getFactors.ts",
    "content": "import isWhiteSpace from '../../glyph/isWhiteSpace';\nimport { AttributedString, Glyph, LayoutOptions } from '../../types';\nimport { Factor } from './types';\n\nenum Direction {\n  GROW = 0,\n  SHRINK = 1,\n}\n\nconst WHITESPACE_PRIORITY = 1;\nconst LETTER_PRIORITY = 2;\n\nconst EXPAND_WHITESPACE_FACTOR = {\n  before: 0.5,\n  after: 0.5,\n  priority: WHITESPACE_PRIORITY,\n  unconstrained: false,\n};\n\nconst EXPAND_CHAR_FACTOR = {\n  before: 0.14453125, // 37/256\n  after: 0.14453125,\n  priority: LETTER_PRIORITY,\n  unconstrained: false,\n};\n\nconst SHRINK_WHITESPACE_FACTOR = {\n  before: -0.04296875, // -11/256\n  after: -0.04296875,\n  priority: WHITESPACE_PRIORITY,\n  unconstrained: false,\n};\n\nconst SHRINK_CHAR_FACTOR = {\n  before: -0.04296875,\n  after: -0.04296875,\n  priority: LETTER_PRIORITY,\n  unconstrained: false,\n};\n\nconst getCharFactor = (direction: Direction, options: LayoutOptions) => {\n  const expandCharFactor = options.expandCharFactor || {};\n  const shrinkCharFactor = options.shrinkCharFactor || {};\n\n  return direction === Direction.GROW\n    ? Object.assign({}, EXPAND_CHAR_FACTOR, expandCharFactor)\n    : Object.assign({}, SHRINK_CHAR_FACTOR, shrinkCharFactor);\n};\n\nconst getWhitespaceFactor = (direction: Direction, options: LayoutOptions) => {\n  const expandWhitespaceFactor = options.expandWhitespaceFactor || {};\n  const shrinkWhitespaceFactor = options.shrinkWhitespaceFactor || {};\n\n  return direction === Direction.GROW\n    ? Object.assign({}, EXPAND_WHITESPACE_FACTOR, expandWhitespaceFactor)\n    : Object.assign({}, SHRINK_WHITESPACE_FACTOR, shrinkWhitespaceFactor);\n};\n\nconst factor =\n  (direction: Direction, options: LayoutOptions) => (glyphs: Glyph[]) => {\n    const charFactor = getCharFactor(direction, options);\n    const whitespaceFactor = getWhitespaceFactor(direction, options);\n\n    const factors: Factor[] = [];\n    for (let index = 0; index < glyphs.length; index += 1) {\n      let f: Factor;\n      const glyph = glyphs[index];\n\n      if (isWhiteSpace(glyph)) {\n        f = Object.assign({}, whitespaceFactor);\n\n        if (index === glyphs.length - 1) {\n          f.before = 0;\n\n          if (index > 0) {\n            factors[index - 1].after = 0;\n          }\n        }\n      } else if (glyph.isMark && index > 0) {\n        f = Object.assign({}, factors[index - 1]);\n        f.before = 0;\n        factors[index - 1].after = 0;\n      } else {\n        f = Object.assign({}, charFactor);\n      }\n\n      factors.push(f);\n    }\n\n    return factors;\n  };\n\nconst getFactors = (\n  gap: number,\n  line: AttributedString,\n  options: LayoutOptions,\n) => {\n  const direction = gap > 0 ? Direction.GROW : Direction.SHRINK;\n  const getFactor = factor(direction, options);\n\n  const factors = line.runs.reduce((acc: Factor[], run) => {\n    return acc.concat(getFactor(run.glyphs));\n  }, []);\n\n  factors[0].before = 0;\n  factors[factors.length - 1].after = 0;\n\n  return factors;\n};\n\nexport default getFactors;\n"
  },
  {
    "path": "packages/textkit/src/engines/justification/index.ts",
    "content": "import getFactors from './getFactors';\nimport getDistances from './getDistances';\nimport advanceWidth from '../../attributedString/advanceWidth';\nimport { AttributedString, LayoutOptions } from '../../types';\n\n/**\n * Adjust run positions by given distances\n *\n * @param distances\n * @param line\n * @returns Line\n */\nconst justifyLine = (distances: number[], line: AttributedString) => {\n  let index = 0;\n  for (const run of line.runs) {\n    for (const position of run.positions) {\n      position.xAdvance += distances[index++];\n    }\n  }\n\n  return line;\n};\n\n/**\n * A JustificationEngine is used by a Typesetter to perform line fragment\n * justification. This implementation is based on a description of Apple's\n * justification algorithm from a PDF in the Apple Font Tools package.\n *\n * @param options - Layout options\n */\nconst justification = (options: LayoutOptions) => {\n  /**\n   * @param line\n   * @returns Line\n   */\n  return (line: AttributedString) => {\n    const gap = line.box.width - advanceWidth(line);\n\n    if (gap === 0) return line; // Exact fit\n\n    const factors = getFactors(gap, line, options);\n    const distances = getDistances(gap, factors);\n\n    return justifyLine(distances, line);\n  };\n};\n\nexport default justification;\n"
  },
  {
    "path": "packages/textkit/src/engines/justification/types.ts",
    "content": "export type Factor = {\n  before: number;\n  after: number;\n  priority?: number;\n  unconstrained?: boolean;\n};\n"
  },
  {
    "path": "packages/textkit/src/engines/linebreaker/bestFit.ts",
    "content": "import { Node } from './types';\n\nconst INFINITY = 10000;\n\nconst skipPastGlueAndPenalty = (nodes: Node[], start: number): Node => {\n  let j = start + 1;\n  for (; j < nodes.length; j++) {\n    if (nodes[j].type !== 'glue' && nodes[j].type !== 'penalty') {\n      break;\n    }\n  }\n  return nodes[j - 1];\n};\n\nconst getNextBreakpoint = (\n  subnodes: Node[],\n  widths: number[],\n  lineNumber: number,\n) => {\n  let position: number | null = null;\n  let minimumBadness = Infinity;\n\n  const sum = { width: 0, stretch: 0, shrink: 0 };\n  const lineLength = widths[Math.min(lineNumber, widths.length - 1)];\n\n  const calculateRatio = (node: Node) => {\n    const stretch = 'stretch' in node ? node.stretch : null;\n\n    if (sum.width < lineLength) {\n      if (!stretch) return INFINITY;\n\n      return sum.stretch - stretch > 0\n        ? (lineLength - sum.width) / sum.stretch\n        : INFINITY;\n    }\n\n    const shrink = 'shrink' in node ? node.shrink : null;\n\n    if (sum.width > lineLength) {\n      if (!shrink) return INFINITY;\n\n      return sum.shrink - shrink > 0\n        ? (lineLength - sum.width) / sum.shrink\n        : INFINITY;\n    }\n\n    return 0;\n  };\n\n  let hyphenWidth = 0;\n\n  for (let i = 0; i < subnodes.length; i += 1) {\n    const node = subnodes[i];\n\n    if (node.type === 'box') {\n      sum.width += node.width;\n    }\n\n    if (node.type === 'glue') {\n      sum.width += node.width;\n      sum.stretch += node.stretch;\n      sum.shrink += node.shrink;\n    }\n\n    const potentialEndOfLine = skipPastGlueAndPenalty(subnodes, i);\n    hyphenWidth =\n      potentialEndOfLine.type === 'penalty' ? potentialEndOfLine.width : 0;\n\n    if (sum.width - sum.shrink + hyphenWidth > lineLength) {\n      if (position === null) {\n        let j = i === 0 ? i + 1 : i;\n\n        while (\n          j < subnodes.length &&\n          (subnodes[j].type === 'glue' || subnodes[j].type === 'penalty')\n        ) {\n          j++;\n        }\n\n        position = j - 1;\n      }\n      break;\n    }\n\n    if (node.type === 'penalty' || node.type === 'glue') {\n      const ratio = calculateRatio(node);\n      const penalty = node.type === 'penalty' ? node.penalty : 0;\n      const badness = 100 * Math.abs(ratio) ** 3 + penalty;\n\n      if (minimumBadness >= badness) {\n        position = i;\n        minimumBadness = badness;\n      }\n    }\n  }\n\n  return sum.width - sum.shrink + hyphenWidth > lineLength ? position : null;\n};\n\nconst applyBestFit = (nodes: Node[], widths: number[]): number[] => {\n  let count = 0;\n  let lineNumber = 0;\n  let subnodes = nodes;\n  const breakpoints = [0];\n\n  while (subnodes.length > 0) {\n    const breakpoint = getNextBreakpoint(subnodes, widths, lineNumber);\n\n    if (breakpoint !== null) {\n      count += breakpoint;\n      breakpoints.push(count);\n      subnodes = subnodes.slice(breakpoint + 1, subnodes.length);\n      count++;\n      lineNumber++;\n    } else {\n      subnodes = [];\n    }\n  }\n\n  return breakpoints;\n};\n\nexport default applyBestFit;\n"
  },
  {
    "path": "packages/textkit/src/engines/linebreaker/index.ts",
    "content": "import bestFit from './bestFit';\nimport knuthPlass from './knuthPlass';\nimport slice from '../../attributedString/slice';\nimport insertGlyph from '../../attributedString/insertGlyph';\nimport advanceWidthBetween from '../../attributedString/advanceWidthBetween';\nimport { AttributedString, Attributes, LayoutOptions } from '../../types';\nimport { Node } from './types';\n\nconst HYPHEN = 0x002d;\nconst TOLERANCE_STEPS = 5;\nconst TOLERANCE_LIMIT = 50;\n\nconst opts = {\n  width: 3,\n  stretch: 6,\n  shrink: 9,\n};\n\n/**\n * Slice attributed string to many lines\n *\n * @param attributedString - Attributed string\n * @param nodes\n * @param breaks\n * @returns Attributed strings\n */\nconst breakLines = (\n  attributedString: AttributedString,\n  nodes: Node[],\n  breaks: number[],\n) => {\n  let start = 0;\n  let end = null;\n\n  const lines: AttributedString[] = breaks.reduce((acc, breakPoint) => {\n    const node = nodes[breakPoint];\n    const prevNode = nodes[breakPoint - 1];\n\n    // Last breakpoint corresponds to K&P mandatory final glue\n    if (breakPoint === nodes.length - 1) return acc;\n\n    let line: AttributedString;\n    if (node.type === 'penalty') {\n      // @ts-expect-error penalty node will always preceed box or glue node\n      end = prevNode.end;\n\n      line = slice(start, end, attributedString);\n\n      line = insertGlyph(line.string.length, HYPHEN, line);\n    } else {\n      end = node.end;\n      line = slice(start, end, attributedString);\n    }\n\n    start = end;\n\n    return [...acc, line];\n  }, []);\n\n  lines.push(slice(start, attributedString.string.length, attributedString));\n\n  return lines;\n};\n\n/**\n * Return Knuth & Plass nodes based on line and previously calculated syllables\n *\n * @param attributedString - Attributed string\n * @param attributes - Attributes\n * @param options - Layout options\n * @returns ?\n */\nconst getNodes = (\n  attributedString: AttributedString,\n  { align }: Attributes,\n  options: LayoutOptions,\n): Node[] => {\n  let start = 0;\n\n  const hyphenWidth = 5;\n\n  const { syllables } = attributedString;\n\n  const hyphenPenalty =\n    options.hyphenationPenalty || (align === 'justify' ? 100 : 600);\n\n  const result = syllables.reduce((acc: Node[], s: string, index: number) => {\n    const width = advanceWidthBetween(\n      start,\n      start + s.length,\n      attributedString,\n    );\n\n    if (s.trim() === '') {\n      const stretch = (width * opts.width) / opts.stretch;\n      const shrink = (width * opts.width) / opts.shrink;\n      const end = start + s.length;\n\n      // Add glue node. Glue nodes are used to fill the space between words.\n      acc.push(knuthPlass.glue(width, start, end, stretch, shrink));\n    } else {\n      const hyphenated = syllables[index + 1] !== ' ';\n      const end = start + s.length;\n\n      // Add box node. Box nodes are used to represent words.\n      acc.push(knuthPlass.box(width, start, end, hyphenated));\n\n      if (syllables[index + 1] && hyphenated) {\n        // Add penalty node. Penalty nodes are used to represent hyphenation points.\n        acc.push(knuthPlass.penalty(hyphenWidth, hyphenPenalty, 1));\n      }\n    }\n\n    start += s.length;\n\n    return acc;\n  }, []);\n\n  // Add mandatory final glue\n  result.push(knuthPlass.glue(0, start, start, knuthPlass.infinity, 0));\n  result.push(knuthPlass.penalty(0, -knuthPlass.infinity, 1));\n\n  return result;\n};\n\n/**\n * @param attributedString - Attributed string\n * @returns Attributes\n */\nconst getAttributes = (attributedString: AttributedString) => {\n  return attributedString.runs?.[0]?.attributes || {};\n};\n\n/**\n * Performs Knuth & Plass line breaking algorithm\n * Fallbacks to best fit algorithm if latter not successful\n *\n * @param options - Layout options\n */\nconst linebreaker = (options: LayoutOptions) => {\n  /**\n   * @param attributedString - Attributed string\n   * @param availableWidths - Available widths\n   * @returns Attributed string\n   */\n  return (attributedString: AttributedString, availableWidths: number[]) => {\n    let tolerance = options.tolerance || 4;\n\n    const attributes = getAttributes(attributedString);\n    const nodes = getNodes(attributedString, attributes, options);\n\n    let breaks = knuthPlass(nodes, availableWidths, tolerance);\n\n    // Try again with a higher tolerance if the line breaking failed.\n    while (breaks.length === 0 && tolerance < TOLERANCE_LIMIT) {\n      tolerance += TOLERANCE_STEPS;\n      breaks = knuthPlass(nodes, availableWidths, tolerance);\n    }\n\n    if (breaks.length === 0 || (breaks.length === 1 && breaks[0] === 0)) {\n      breaks = bestFit(nodes, availableWidths);\n    }\n\n    return breakLines(attributedString, nodes, breaks.slice(1));\n  };\n};\n\nexport default linebreaker;\n"
  },
  {
    "path": "packages/textkit/src/engines/linebreaker/knuthPlass.ts",
    "content": "/**\n * Licensed under the new BSD License.\n * Copyright 2009-2010, Bram Stein\n * All rights reserved.\n */\n\nimport LinkedList from './linkedList';\nimport { BoxNode, GlueNode, Node, PenaltyNode } from './types';\n\ntype Sum = {\n  width: number;\n  stretch: number;\n  shrink: number;\n};\n\nfunction breakpoint(\n  position: number,\n  demerits: number,\n  line: number,\n  fitnessClass: number,\n  totals: unknown,\n  previous: unknown,\n): any {\n  return {\n    position,\n    demerits,\n    line,\n    fitnessClass,\n    totals: totals || {\n      width: 0,\n      stretch: 0,\n      shrink: 0,\n    },\n    previous,\n  };\n}\n\nfunction computeCost(\n  nodes: Node[],\n  lineLengths: number[],\n  sum: Sum,\n  end: number,\n  active,\n  currentLine: number,\n) {\n  let width = sum.width - active.totals.width;\n  let stretch = 0;\n  let shrink = 0;\n\n  // If the current line index is within the list of linelengths, use it, otherwise use\n  // the last line length of the list.\n  const lineLength =\n    currentLine < lineLengths.length\n      ? lineLengths[currentLine - 1]\n      : lineLengths[lineLengths.length - 1];\n\n  if (nodes[end].type === 'penalty') {\n    width += nodes[end].width;\n  }\n\n  // Calculate the stretch ratio\n  if (width < lineLength) {\n    stretch = sum.stretch - active.totals.stretch;\n\n    if (stretch > 0) {\n      return (lineLength - width) / stretch;\n    }\n\n    return linebreak.infinity;\n  }\n\n  // Calculate the shrink ratio\n  if (width > lineLength) {\n    shrink = sum.shrink - active.totals.shrink;\n\n    if (shrink > 0) {\n      return (lineLength - width) / shrink;\n    }\n\n    return linebreak.infinity;\n  }\n\n  // perfect match\n  return 0;\n}\n\n// Add width, stretch and shrink values from the current\n// break point up to the next box or forced penalty.\nfunction computeSum(nodes: Node[], sum: Sum, breakPointIndex: number) {\n  const result = {\n    width: sum.width,\n    stretch: sum.stretch,\n    shrink: sum.shrink,\n  };\n\n  for (let i = breakPointIndex; i < nodes.length; i += 1) {\n    const node = nodes[i];\n\n    if (node.type === 'glue') {\n      result.width += node.width;\n      result.stretch += node.stretch;\n      result.shrink += node.shrink;\n    } else if (\n      node.type === 'box' ||\n      (node.type === 'penalty' &&\n        node.penalty === -linebreak.infinity &&\n        i > breakPointIndex)\n    ) {\n      break;\n    }\n  }\n\n  return result;\n}\n\nfunction findBestBreakpoints(activeNodes) {\n  const breakpoints: number[] = [];\n\n  if (activeNodes.size() === 0) return [];\n\n  let tmp: any = { data: { demerits: Infinity } };\n\n  // Find the best active node (the one with the least total demerits.)\n  activeNodes.forEach((node) => {\n    if (node.data.demerits < tmp.data.demerits) {\n      tmp = node;\n    }\n  });\n\n  while (tmp !== null) {\n    breakpoints.push(tmp.data.position);\n    tmp = tmp.data.previous;\n  }\n\n  return breakpoints.reverse();\n}\n\n/**\n * @param nodes\n * @param availableWidths\n * @param tolerance\n * @preserve Knuth and Plass line breaking algorithm in JavaScript\n */\nconst linebreak = (\n  nodes: Node[],\n  availableWidths: number[],\n  tolerance?: number,\n): number[] => {\n  // Demerits are used as a way to penalize bad line breaks\n  //  - line: applied to each line, depending on how much spaces need to stretch or shrink\n  //  - flagged: applied when consecutive lines end in hyphenation\n  //  - fitness: algorithm groups lines into fitness classes based on how loose or tight the spacing is.\n  //             if a paragraph has consecutive lines from different fitness classes,\n  //             a fitness demerit is applied to maintain visual consistency.\n  const options = {\n    demerits: { line: 10, flagged: 100, fitness: 3000 },\n    tolerance: tolerance || 3,\n  };\n\n  const activeNodes = new LinkedList();\n  const sum = { width: 0, stretch: 0, shrink: 0 };\n  const lineLengths = availableWidths;\n\n  // Add an active node for the start of the paragraph.\n  activeNodes.push(\n    new LinkedList.Node(breakpoint(0, 0, 0, 0, undefined, null)),\n  );\n\n  // The main loop of the algorithm\n  function mainLoop(node: Node, index: number, nodes: Node[]) {\n    let active = activeNodes.first();\n\n    // The inner loop iterates through all the active nodes with line < currentLine and then\n    // breaks out to insert the new active node candidates before looking at the next active\n    // nodes for the next lines. The result of this is that the active node list is always\n    // sorted by line number.\n    while (active !== null) {\n      let currentLine = 0;\n\n      // Candidates fo each fitness class\n      const candidates = [\n        { active: undefined, demerits: Infinity },\n        { active: undefined, demerits: Infinity },\n        { active: undefined, demerits: Infinity },\n        { active: undefined, demerits: Infinity },\n      ];\n\n      // Iterate through the linked list of active nodes to find new potential active nodes and deactivate current active nodes.\n      while (active !== null) {\n        currentLine = active.data.line + 1;\n\n        const ratio = computeCost(\n          nodes,\n          lineLengths,\n          sum,\n          index,\n          active.data,\n          currentLine,\n        );\n\n        // Deactive nodes when the distance between the current active node and the\n        // current node becomes too large (i.e. it exceeds the stretch limit and the stretch\n        // ratio becomes negative) or when the current node is a forced break (i.e. the end\n        // of the paragraph when we want to remove all active nodes, but possibly have a final\n        // candidate active node---if the paragraph can be set using the given tolerance value.)\n        if (\n          ratio < -1 ||\n          (node.type === 'penalty' && node.penalty === -linebreak.infinity)\n        ) {\n          activeNodes.remove(active);\n        }\n\n        // If the ratio is within the valid range of -1 <= ratio <= tolerance calculate the\n        // total demerits and record a candidate active node.\n        if (ratio >= -1 && ratio <= options.tolerance) {\n          const badness = 100 * Math.pow(Math.abs(ratio), 3);\n\n          let demerits = 0;\n\n          // Positive penalty\n          if (node.type === 'penalty' && node.penalty >= 0) {\n            demerits =\n              Math.pow(options.demerits.line + badness, 2) +\n              Math.pow(node.penalty, 2);\n            // Negative penalty but not a forced break\n          } else if (\n            node.type === 'penalty' &&\n            node.penalty !== -linebreak.infinity\n          ) {\n            demerits =\n              Math.pow(options.demerits.line + badness, 2) -\n              Math.pow(node.penalty, 2);\n            // All other cases\n          } else {\n            demerits = Math.pow(options.demerits.line + badness, 2);\n          }\n\n          if (\n            node.type === 'penalty' &&\n            nodes[active.data.position].type === 'penalty'\n          ) {\n            demerits +=\n              options.demerits.flagged *\n              node.flagged *\n              // @ts-expect-error node is penalty here\n              nodes[active.data.position].flagged;\n          }\n\n          // Calculate the fitness class for this candidate active node.\n          let currentClass;\n          if (ratio < -0.5) {\n            currentClass = 0;\n          } else if (ratio <= 0.5) {\n            currentClass = 1;\n          } else if (ratio <= 1) {\n            currentClass = 2;\n          } else {\n            currentClass = 3;\n          }\n\n          // Add a fitness penalty to the demerits if the fitness classes of two adjacent lines differ too much.\n          if (Math.abs(currentClass - active.data.fitnessClass) > 1) {\n            demerits += options.demerits.fitness;\n          }\n\n          // Add the total demerits of the active node to get the total demerits of this candidate node.\n          demerits += active.data.demerits;\n\n          // Only store the best candidate for each fitness class\n          if (demerits < candidates[currentClass].demerits) {\n            candidates[currentClass] = { active, demerits };\n          }\n        }\n\n        active = active.next;\n\n        // Stop iterating through active nodes to insert new candidate active nodes in the active list\n        // before moving on to the active nodes for the next line.\n        // TODO: The Knuth and Plass paper suggests a conditional for currentLine < j0. This means paragraphs\n        // with identical line lengths will not be sorted by line number. Find out if that is a desirable outcome.\n        // For now I left this out, as it only adds minimal overhead to the algorithm and keeping the active node\n        // list sorted has a higher priority.\n        if (active !== null && active.data.line >= currentLine) {\n          break;\n        }\n      }\n\n      const tmpSum = computeSum(nodes, sum, index);\n\n      for (\n        let fitnessClass = 0;\n        fitnessClass < candidates.length;\n        fitnessClass += 1\n      ) {\n        const candidate = candidates[fitnessClass];\n\n        if (candidate.demerits === Infinity) continue;\n\n        const newNode = new LinkedList.Node(\n          breakpoint(\n            index,\n            candidate.demerits,\n            candidate.active.data.line + 1,\n            fitnessClass,\n            tmpSum,\n            candidate.active,\n          ),\n        );\n        if (active !== null) {\n          activeNodes.insertBefore(active, newNode);\n        } else {\n          activeNodes.push(newNode);\n        }\n      }\n    }\n  }\n\n  nodes.forEach((node, index, nodes) => {\n    if (node.type === 'box') {\n      sum.width += node.width;\n      return;\n    }\n\n    if (node.type === 'glue') {\n      const precedesBox = index > 0 && nodes[index - 1].type === 'box';\n      if (precedesBox) mainLoop(node, index, nodes);\n\n      sum.width += node.width;\n      sum.stretch += node.stretch;\n      sum.shrink += node.shrink;\n\n      return;\n    }\n\n    if (node.type === 'penalty' && node.penalty !== linebreak.infinity) {\n      mainLoop(node, index, nodes);\n    }\n  });\n\n  return findBestBreakpoints(activeNodes);\n};\n\nlinebreak.infinity = 10000;\n\nlinebreak.glue = (\n  width: number,\n  start: number,\n  end: number,\n  stretch: number,\n  shrink: number,\n): GlueNode => ({\n  type: 'glue',\n  start,\n  end,\n  width,\n  stretch,\n  shrink,\n});\n\nlinebreak.box = (\n  width: number,\n  start: number,\n  end: number,\n  hyphenated = false,\n): BoxNode => ({\n  type: 'box',\n  width,\n  start,\n  end,\n  hyphenated,\n});\n\nlinebreak.penalty = (\n  width: number,\n  penalty: number,\n  flagged: number,\n): PenaltyNode => ({\n  type: 'penalty',\n  width,\n  penalty,\n  flagged,\n});\n\nexport default linebreak;\n"
  },
  {
    "path": "packages/textkit/src/engines/linebreaker/linkedList.ts",
    "content": "/* eslint-disable max-classes-per-file */\nclass LinkedListNode {\n  data: any;\n  prev: LinkedListNode | null;\n  next: LinkedListNode | null;\n\n  constructor(data: any) {\n    this.data = data;\n    this.prev = null;\n    this.next = null;\n  }\n}\n\nclass LinkedList {\n  static Node = LinkedListNode;\n\n  head: LinkedListNode | null;\n  tail: LinkedListNode | null;\n  listSize: number;\n  listLength: number;\n\n  constructor() {\n    this.head = null;\n    this.tail = null;\n    this.listSize = 0;\n    this.listLength = 0;\n  }\n\n  isLinked(node: LinkedListNode) {\n    return !(\n      (node &&\n        node.prev === null &&\n        node.next === null &&\n        this.tail !== node &&\n        this.head !== node) ||\n      this.isEmpty()\n    );\n  }\n\n  size() {\n    return this.listSize;\n  }\n\n  isEmpty() {\n    return this.listSize === 0;\n  }\n\n  first() {\n    return this.head;\n  }\n\n  last() {\n    return this.last;\n  }\n\n  forEach(callback: (node: LinkedListNode) => void) {\n    let node = this.head;\n\n    while (node !== null) {\n      callback(node);\n      node = node.next;\n    }\n  }\n\n  at(i: number) {\n    let node = this.head;\n    let index = 0;\n\n    if (i >= this.listLength || i < 0) {\n      return null;\n    }\n\n    while (node !== null) {\n      if (i === index) {\n        return node;\n      }\n      node = node.next;\n      index += 1;\n    }\n    return null;\n  }\n\n  insertAfter(node: LinkedListNode, newNode: LinkedListNode) {\n    if (!this.isLinked(node)) return this;\n\n    newNode.prev = node;\n    newNode.next = node.next;\n\n    if (node.next === null) {\n      this.tail = newNode;\n    } else {\n      node.next.prev = newNode;\n    }\n\n    node.next = newNode;\n\n    this.listSize += 1;\n\n    return this;\n  }\n\n  insertBefore(node: LinkedListNode, newNode: LinkedListNode) {\n    if (!this.isLinked(node)) return this;\n\n    newNode.prev = node.prev;\n    newNode.next = node;\n\n    if (node.prev === null) {\n      this.head = newNode;\n    } else {\n      node.prev.next = newNode;\n    }\n\n    node.prev = newNode;\n\n    this.listSize += 1;\n\n    return this;\n  }\n\n  push(node: LinkedListNode) {\n    if (this.head === null) {\n      this.unshift(node);\n    } else {\n      this.insertAfter(this.tail, node);\n    }\n\n    return this;\n  }\n\n  unshift(node: LinkedListNode) {\n    if (this.head === null) {\n      this.head = node;\n      this.tail = node;\n      node.prev = null;\n      node.next = null;\n      this.listSize += 1;\n    } else {\n      this.insertBefore(this.head, node);\n    }\n\n    return this;\n  }\n\n  remove(node: LinkedListNode) {\n    if (!this.isLinked(node)) return this;\n\n    if (node.prev === null) {\n      this.head = node.next;\n    } else {\n      node.prev.next = node.next;\n    }\n\n    if (node.next === null) {\n      this.tail = node.prev;\n    } else {\n      node.next.prev = node.prev;\n    }\n\n    this.listSize -= 1;\n\n    return this;\n  }\n}\n\nexport default LinkedList;\n"
  },
  {
    "path": "packages/textkit/src/engines/linebreaker/types.ts",
    "content": "export type LinebreakOptions = {\n  tolerance?: number;\n};\n\nexport type PenaltyNode = {\n  type: 'penalty';\n  width: number;\n  penalty: number;\n  flagged?: number;\n};\n\nexport type BoxNode = {\n  type: 'box';\n  width: number;\n  start: number;\n  end: number;\n  hyphenated?: boolean;\n};\n\nexport type GlueNode = {\n  type: 'glue';\n  width: number;\n  start: number;\n  end: number;\n  stretch: number;\n  shrink: number;\n};\n\nexport type Node = PenaltyNode | BoxNode | GlueNode;\n"
  },
  {
    "path": "packages/textkit/src/engines/scriptItemizer/index.ts",
    "content": "import unicode from 'unicode-properties';\n\nimport empty from '../../attributedString/empty';\nimport { AttributedString, Run } from '../../types';\n\nconst ignoredScripts = ['Common', 'Inherited', 'Unknown'];\n\n/**\n * Resolves unicode script in runs, grouping equal runs together\n */\nconst scriptItemizer = () => {\n  /**\n   * @param attributedString - Attributed string\n   * @returns Attributed string\n   */\n  return (attributedString: AttributedString) => {\n    const { string } = attributedString;\n\n    let lastScript = 'Unknown';\n    let lastIndex = 0;\n    let index = 0;\n\n    const runs: Run[] = [];\n\n    if (!string) return empty();\n\n    for (let i = 0; i < string.length; i += 1) {\n      const char = string[i];\n\n      const codePoint = char.codePointAt(0);\n      const script = unicode.getScript(codePoint);\n\n      if (script !== lastScript && !ignoredScripts.includes(script)) {\n        if (lastScript !== 'Unknown') {\n          runs.push({\n            start: lastIndex,\n            end: index,\n            attributes: { script: lastScript },\n          });\n        }\n\n        lastIndex = index;\n        lastScript = script;\n      }\n\n      index += char.length;\n    }\n\n    if (lastIndex < string.length) {\n      runs.push({\n        start: lastIndex,\n        end: string.length,\n        attributes: { script: lastScript },\n      });\n    }\n\n    const result: AttributedString = { string, runs: runs };\n\n    return result;\n  };\n};\n\nexport default scriptItemizer;\n"
  },
  {
    "path": "packages/textkit/src/engines/textDecoration/index.ts",
    "content": "import runAscent from '../../run/ascent';\nimport ascent from '../../attributedString/ascent';\nimport runAdvanceWidth from '../../run/advanceWidth';\nimport advanceWidth from '../../attributedString/advanceWidth';\nimport { AttributedString } from '../../types';\n\n// The base font size used for calculating underline thickness.\nconst BASE_FONT_SIZE = 12;\n\n/**\n * A TextDecorationEngine is used by a Typesetter to generate\n * DecorationLines for a line fragment, including underlines\n * and strikes.\n */\nconst textDecoration = () => (line: AttributedString) => {\n  let x = line.overflowLeft || 0;\n  const overflowRight = line.overflowRight || 0;\n  const maxX = advanceWidth(line) - overflowRight;\n\n  line.decorationLines = [];\n\n  for (let i = 0; i < line.runs.length; i += 1) {\n    const run = line.runs[i];\n\n    const width = Math.min(maxX - x, runAdvanceWidth(run));\n    const thickness = Math.max(\n      0.5,\n      Math.floor(run.attributes.fontSize / BASE_FONT_SIZE),\n    );\n\n    if (run.attributes.underline) {\n      const rect = {\n        x,\n        y: ascent(line) + thickness * 2,\n        width,\n        height: thickness,\n      };\n      const decorationLine = {\n        rect,\n        opacity: run.attributes.opacity,\n        color: run.attributes.underlineColor || 'black',\n        style: run.attributes.underlineStyle || 'solid',\n      };\n\n      line.decorationLines.push(decorationLine);\n    }\n\n    if (run.attributes.strike) {\n      const y = ascent(line) - runAscent(run) / 3;\n      const rect = { x, y, width, height: thickness };\n      const decorationLine = {\n        rect,\n        opacity: run.attributes.opacity,\n        color: run.attributes.strikeColor || 'black',\n        style: run.attributes.strikeStyle || 'solid',\n      };\n\n      line.decorationLines.push(decorationLine);\n    }\n\n    x += width;\n  }\n\n  return line;\n};\n\nexport default textDecoration;\n"
  },
  {
    "path": "packages/textkit/src/engines/wordHyphenation/index.ts",
    "content": "import hyphen from 'hyphen';\nimport pattern from 'hyphen/patterns/en-us.js';\nimport { isNil } from '@react-pdf/fns';\n\nconst SOFT_HYPHEN = '\\u00ad';\nconst hyphenator = hyphen(pattern);\n\n/**\n * @param word\n * @returns Word parts\n */\nconst splitHyphen = (word: string) => {\n  return word.split(SOFT_HYPHEN);\n};\n\nconst cache: Record<string, string[]> = {};\n\n/**\n * @param word\n * @returns Word parts\n */\nconst getParts = (word: string) => {\n  const base = word.includes(SOFT_HYPHEN) ? word : hyphenator(word);\n  return splitHyphen(base);\n};\n\nconst wordHyphenation = () => {\n  /**\n   * @param word - Word\n   * @returns Word parts\n   */\n  return (word: string | null) => {\n    const cacheKey = `_${word}`;\n\n    if (isNil(word)) return [];\n    if (cache[cacheKey]) return cache[cacheKey];\n\n    cache[cacheKey] = getParts(word);\n\n    return cache[cacheKey];\n  };\n};\n\nexport default wordHyphenation;\n"
  },
  {
    "path": "packages/textkit/src/glyph/fromCodePoint.ts",
    "content": "import { Font, Glyph } from '../types';\n\n/**\n * Get glyph for a given code point\n *\n * @param codePoint - Unicode code point (0 is treated as invalid)\n * @param font - Font to get glyph from\n * @returns Glyph or null if font/codePoint is invalid\n */\nconst fromCodePoint = (\n  codePoint: number | null,\n  font: Font | string | null,\n): Glyph | null => {\n  // String fonts (e.g., 'Helvetica') don't support glyph lookup\n  if (typeof font === 'string') return null;\n\n  // Require valid font and non-zero code point\n  if (!font || !codePoint) return null;\n\n  return font.glyphForCodePoint(codePoint);\n};\n\nexport default fromCodePoint;\n"
  },
  {
    "path": "packages/textkit/src/glyph/isWhiteSpace.ts",
    "content": "import { Glyph } from '../types';\n\n/**\n * ASCII code for space character.\n * Note: Only space (32) is considered whitespace for typographic layout purposes,\n * not tabs, newlines, or other control characters.\n */\nconst SPACE_CODE = 32;\n\n/**\n * Check if glyph contains a space character\n *\n * @param glyph - Glyph\n * @returns Whether glyph contains a space\n */\nconst isWhiteSpace = (glyph: Glyph | null) => {\n  const codePoints = glyph?.codePoints || [];\n  return codePoints.includes(SPACE_CODE);\n};\n\nexport default isWhiteSpace;\n"
  },
  {
    "path": "packages/textkit/src/glyph/slice.ts",
    "content": "import { Font, Glyph } from '../types';\n\n/**\n * Slice glyph between codePoints range.\n * Useful for breaking ligatures into individual glyphs.\n *\n * @param start - Start code point index\n * @param end - End code point index\n * @param font - Font to generate new glyphs from\n * @param glyph - Glyph to be sliced\n * @returns Array of sliced glyph parts\n */\nconst slice = (\n  start: number,\n  end: number,\n  font: Font,\n  glyph: Glyph,\n): Glyph[] => {\n  if (!glyph) return [];\n  if (start === end) return [];\n\n  const { codePoints } = glyph;\n\n  if (start === 0 && end === codePoints.length) return [glyph];\n  if (!font) return [glyph];\n\n  const slicedCodePoints = codePoints.slice(start, end);\n  const string = String.fromCodePoint(...slicedCodePoints);\n\n  // Force LTR direction to prevent fontkit from reversing the string\n  return font.layout(string, undefined, undefined, undefined, 'ltr').glyphs;\n};\n\nexport default slice;\n"
  },
  {
    "path": "packages/textkit/src/index.ts",
    "content": "import layoutEngine from './layout';\nimport bidi from './engines/bidi';\nimport linebreaker from './engines/linebreaker';\nimport justification from './engines/justification';\nimport textDecoration from './engines/textDecoration';\nimport scriptItemizer from './engines/scriptItemizer';\nimport wordHyphenation from './engines/wordHyphenation';\nimport fontSubstitution from './engines/fontSubstitution';\nimport fromFragments from './attributedString/fromFragments';\n\nexport {\n  bidi,\n  linebreaker,\n  justification,\n  textDecoration,\n  scriptItemizer,\n  wordHyphenation,\n  fontSubstitution,\n  fromFragments,\n};\n\nexport * from './types';\n\nexport default layoutEngine;\n"
  },
  {
    "path": "packages/textkit/src/indices/append.ts",
    "content": "import { isNil, last } from '@react-pdf/fns';\n\n/**\n * Append glyph indices with given length\n *\n * Ex. appendIndices(3, [0, 1, 2, 2]) => [0, 1, 2, 2, 3, 3, 3]\n *\n * @param length - Length to append\n * @param indices - Glyph indices\n * @returns Extended glyph indices\n */\nconst appendIndices = (length: number, indices: number[]) => {\n  const lastIndex = last(indices);\n  const value = isNil(lastIndex) ? 0 : lastIndex + 1;\n  const newIndices = Array(length).fill(value);\n\n  return indices.concat(newIndices);\n};\n\nexport default appendIndices;\n"
  },
  {
    "path": "packages/textkit/src/indices/normalize.ts",
    "content": "/**\n * Returns new array starting with zero, keeping the same relation between consecutive values.\n *\n * @param array - List of numbers\n * @returns Normalized array starting at zero\n */\nconst normalize = (array: number[]): number[] => {\n  if (array.length === 0) return [];\n  const offset = array[0];\n  return array.map((value) => value - offset);\n};\n\nexport default normalize;\n"
  },
  {
    "path": "packages/textkit/src/indices/prepend.ts",
    "content": "/**\n * Prepend glyph indices with given length\n *\n * Ex. prepend(3, [0, 1, 2, 2]) => [0, 0, 0, 1, 2, 3, 3]\n *\n * @param length - Length to prepend\n * @param indices - Glyph indices\n * @returns Extended glyph indices\n */\nconst prepend = (length: number, indices: number[]): number[] => {\n  if (length === 0) return indices;\n\n  const result = Array<number>(length).fill(0);\n\n  for (let i = 0; i < indices.length; i += 1) {\n    result.push(indices[i] + 1);\n  }\n\n  return result;\n};\n\nexport default prepend;\n"
  },
  {
    "path": "packages/textkit/src/indices/resolve.ts",
    "content": "import { Glyph } from '../types';\n\n/**\n * Resolve string indices based on glyphs code points.\n * Maps each glyph to its corresponding string index, handling ligatures\n * by assigning the same index to all code points within a ligature.\n *\n * @param glyphs - Array of glyphs (may contain undefined for missing glyphs)\n * @returns Glyph indices array\n */\nconst resolve = (glyphs: (Glyph | undefined)[] = []): number[] => {\n  const result: number[] = [];\n  let currentIndex = 0;\n\n  for (let i = 0; i < glyphs.length; i += 1) {\n    const glyph = glyphs[i];\n    const codePointCount = glyph?.codePoints?.length || 1;\n\n    for (let j = 0; j < codePointCount; j += 1) {\n      result.push(currentIndex);\n    }\n\n    currentIndex += 1;\n  }\n\n  return result;\n};\n\nexport default resolve;\n"
  },
  {
    "path": "packages/textkit/src/layout/applyDefaultStyles.ts",
    "content": "import { AttributedString, Attributes, Run } from '../types';\n\n/**\n * @param attributes - Attributes\n * @returns Attributes with defaults\n */\nconst applyAttributes = (a: Attributes): Attributes => {\n  return {\n    align: a.align || (a.direction === 'rtl' ? 'right' : 'left'),\n    alignLastLine:\n      a.alignLastLine || (a.align === 'justify' ? 'left' : a.align || 'left'),\n    attachment: a.attachment || null,\n    backgroundColor: a.backgroundColor || null,\n    bullet: a.bullet || null,\n    characterSpacing: a.characterSpacing || 0,\n    color: a.color || 'black',\n    direction: a.direction || 'ltr',\n    features: a.features || [],\n    fill: a.fill !== false,\n    font: a.font || [],\n    fontSize: a.fontSize || 12,\n    hangingPunctuation: a.hangingPunctuation || false,\n    hyphenationFactor: a.hyphenationFactor || 0,\n    indent: a.indent || 0,\n    justificationFactor: a.justificationFactor || 1,\n    lineHeight: a.lineHeight || null,\n    lineSpacing: a.lineSpacing || 0,\n    link: a.link || null,\n    marginLeft: a.marginLeft || a.margin || 0,\n    marginRight: a.marginRight || a.margin || 0,\n    opacity: a.opacity,\n    paddingTop: a.paddingTop || a.padding || 0,\n    paragraphSpacing: a.paragraphSpacing || 0,\n    script: a.script || null,\n    shrinkFactor: a.shrinkFactor || 0,\n    strike: a.strike || false,\n    strikeColor: a.strikeColor || a.color || 'black',\n    strikeStyle: a.strikeStyle || 'solid',\n    stroke: a.stroke || false,\n    underline: a.underline || false,\n    underlineColor: a.underlineColor || a.color || 'black',\n    underlineStyle: a.underlineStyle || 'solid',\n    verticalAlign: a.verticalAlign || null,\n    wordSpacing: a.wordSpacing || 0,\n    yOffset: a.yOffset || 0,\n  };\n};\n\n/**\n * Apply default style to run\n *\n * @param run - Run\n * @returns Run with default styles\n */\nconst applyRunStyles = (run: Run): Run => {\n  const attributes = applyAttributes(run.attributes);\n  return Object.assign({}, run, { attributes });\n};\n\n/**\n * Apply default attributes for an attributed string\n */\nconst applyDefaultStyles = () => {\n  return (attributedString: AttributedString): AttributedString => {\n    const string = attributedString.string || '';\n    const runs = (attributedString.runs || []).map(applyRunStyles);\n\n    return { string, runs };\n  };\n};\n\nexport default applyDefaultStyles;\n"
  },
  {
    "path": "packages/textkit/src/layout/bidiMirroring.ts",
    "content": "import bidiFactory from 'bidi-js';\nimport { repeat } from '@react-pdf/fns';\nimport { AttributedString, Run } from '../types';\n\nconst bidi = bidiFactory();\n\n/**\n * @param runs\n * @returns Bidi levels\n */\nconst getBidiLevels = (runs: Run[]) => {\n  return runs.reduce((acc: number[], run) => {\n    const length = run.end - run.start;\n    const levels = repeat(run.attributes.bidiLevel, length);\n    return acc.concat(levels);\n  }, []);\n};\n\n/**\n * Perform bidi mirroring\n */\nconst mirrorString = () => {\n  /**\n   * @param attributedString - Attributed string\n   * @returns Attributed string\n   */\n  return (attributedString: AttributedString) => {\n    const levels = getBidiLevels(attributedString.runs);\n\n    let updatedString = '';\n    attributedString.string.split('').forEach((char, index) => {\n      const isRTL = levels[index] % 2 === 1;\n      const mirroredChar = isRTL\n        ? bidi.getMirroredCharacter(attributedString.string.charAt(index))\n        : null;\n      updatedString += mirroredChar || char;\n    });\n\n    const result: AttributedString = {\n      ...attributedString,\n      string: updatedString,\n    };\n\n    return result;\n  };\n};\n\nexport default mirrorString;\n"
  },
  {
    "path": "packages/textkit/src/layout/bidiReordering.ts",
    "content": "import bidiFactory from 'bidi-js';\nimport { repeat } from '@react-pdf/fns';\n\nimport stringLength from '../attributedString/length';\nimport { AttributedString, Paragraph, Run } from '../types';\n\nconst bidi = bidiFactory();\n\nconst getBidiLevels = (runs: Run[]) => {\n  return runs.reduce((acc, run) => {\n    const length = run.end - run.start;\n    const levels = repeat(run.attributes.bidiLevel, length);\n    return acc.concat(levels);\n  }, []);\n};\n\nconst getReorderedIndices = (string: string, segments) => {\n  // Fill an array with indices\n  const indices = [];\n  for (let i = 0; i < string.length; i += 1) {\n    indices[i] = i;\n  }\n  // Reverse each segment in order\n  segments.forEach(([start, end]) => {\n    const slice = indices.slice(start, end + 1);\n    for (let i = slice.length - 1; i >= 0; i -= 1) {\n      indices[end - i] = slice[i];\n    }\n  });\n\n  return indices;\n};\n\nconst getItemAtIndex = (runs: Run[], objectName: string, index: number) => {\n  for (let i = 0; i < runs.length; i += 1) {\n    const run = runs[i];\n    const updatedIndex = run.glyphIndices[index - run.start];\n    if (index >= run.start && index < run.end) {\n      return run[objectName][updatedIndex];\n    }\n  }\n\n  throw new Error(`index ${index} out of range`);\n};\n\nconst reorderLine = (line: AttributedString) => {\n  const levels = getBidiLevels(line.runs);\n  const direction = line.runs[0]?.attributes.direction;\n  const level = direction === 'rtl' ? 1 : 0;\n  const end = stringLength(line) - 1;\n  const paragraphs = [{ start: 0, end, level }];\n  const embeddingLevels = { paragraphs, levels };\n\n  const segments = bidi.getReorderSegments(line.string, embeddingLevels);\n\n  // No need for bidi reordering\n  if (segments.length === 0) return line;\n\n  const indices = getReorderedIndices(line.string, segments);\n\n  const updatedString = bidi.getReorderedString(line.string, embeddingLevels);\n\n  const updatedRuns = line.runs.map((run) => {\n    const selectedIndices = indices.slice(run.start, run.end);\n    const updatedGlyphs = [];\n    const updatedPositions = [];\n\n    const addedGlyphs = new Set();\n\n    for (let i = 0; i < selectedIndices.length; i += 1) {\n      const index = selectedIndices[i];\n\n      const glyph = getItemAtIndex(line.runs, 'glyphs', index);\n\n      if (addedGlyphs.has(glyph.id)) continue;\n\n      updatedGlyphs.push(glyph);\n      updatedPositions.push(getItemAtIndex(line.runs, 'positions', index));\n\n      if (glyph.isLigature) {\n        addedGlyphs.add(glyph.id);\n      }\n    }\n\n    return {\n      ...run,\n      glyphs: updatedGlyphs,\n      positions: updatedPositions,\n    };\n  });\n\n  return {\n    box: line.box,\n    runs: updatedRuns,\n    string: updatedString,\n  } as AttributedString;\n};\n\nconst reorderParagraph = (paragraph: Paragraph) => paragraph.map(reorderLine);\n\n/**\n * Perform bidi reordering\n *\n * @returns Reordered paragraphs\n */\nconst bidiReordering = () => {\n  /**\n   * @param paragraphs - Paragraphs\n   * @returns Reordered paragraphs\n   */\n  return (paragraphs: Paragraph[]) => paragraphs.map(reorderParagraph);\n};\n\nexport default bidiReordering;\n"
  },
  {
    "path": "packages/textkit/src/layout/finalizeFragments.ts",
    "content": "import { last, compose } from '@react-pdf/fns';\n\nimport runHeight from '../run/height';\nimport runAscent from '../run/ascent';\nimport runDescent from '../run/descent';\nimport runAdvanceWidth from '../run/advanceWidth';\nimport advanceWidth from '../attributedString/advanceWidth';\nimport leadingOffset from '../attributedString/leadingOffset';\nimport trailingOffset from '../attributedString/trailingOffset';\nimport dropLast from '../attributedString/dropLast';\nimport { Engines } from '../engines';\nimport { AttributedString, LayoutOptions, Paragraph } from '../types';\n\nconst ALIGNMENT_FACTORS = { center: 0.5, right: 1 };\n\n/**\n * Remove new line char at the end of line if present\n *\n * @param line\n * @returns Line\n */\nconst removeNewLine = (line: AttributedString) => {\n  return last(line.string) === '\\n' ? dropLast(line) : line;\n};\n\nconst getOverflowLeft = (line: AttributedString) => {\n  return leadingOffset(line) + (line.overflowLeft || 0);\n};\n\nconst getOverflowRight = (line: AttributedString) => {\n  return trailingOffset(line) + (line.overflowRight || 0);\n};\n\n/**\n * Ignore whitespace at the start and end of a line for alignment\n *\n * @param line\n * @returns Line\n */\nconst adjustOverflow = (line: AttributedString): AttributedString => {\n  const overflowLeft = getOverflowLeft(line);\n  const overflowRight = getOverflowRight(line);\n\n  const x = line.box.x - overflowLeft;\n  const width = line.box.width + overflowLeft + overflowRight;\n  const box = Object.assign({}, line.box, { x, width });\n\n  return Object.assign({}, line, { box, overflowLeft, overflowRight });\n};\n\n/**\n * Performs line justification by calling appropiate engine\n *\n * @param engines - Engines\n * @param options - Layout options\n * @param align - Text align\n */\nconst justifyLine = (\n  engines: Engines,\n  options: LayoutOptions,\n  align: string,\n) => {\n  /**\n   * @param line - Line\n   * @returns Line\n   */\n  return (line: AttributedString) => {\n    const lineWidth = advanceWidth(line);\n    const alignFactor = ALIGNMENT_FACTORS[align] || 0;\n    const remainingWidth = Math.max(0, line.box.width - lineWidth);\n    const shouldJustify = align === 'justify' || lineWidth > line.box.width;\n\n    const x = line.box.x + remainingWidth * alignFactor;\n    const box = Object.assign({}, line.box, { x });\n    const newLine = Object.assign({}, line, { box });\n\n    return shouldJustify ? engines.justification(options)(newLine) : newLine;\n  };\n};\n\nconst finalizeLine = (line: AttributedString): AttributedString => {\n  let lineAscent = 0;\n  let lineDescent = 0;\n  let lineHeight = 0;\n  let lineXAdvance = 0;\n\n  const runs = line.runs.map((run) => {\n    const height = runHeight(run);\n    const ascent = runAscent(run);\n    const descent = runDescent(run);\n    const xAdvance = runAdvanceWidth(run);\n\n    lineHeight = Math.max(lineHeight, height);\n    lineAscent = Math.max(lineAscent, ascent);\n    lineDescent = Math.max(lineDescent, descent);\n    lineXAdvance += xAdvance;\n\n    return Object.assign({}, run, { height, ascent, descent, xAdvance });\n  });\n\n  return Object.assign({}, line, {\n    runs,\n    height: lineHeight,\n    ascent: lineAscent,\n    descent: lineDescent,\n    xAdvance: lineXAdvance,\n  });\n};\n\n/**\n * Finalize line by performing line justification\n * and text decoration (using appropiate engines)\n *\n * @param engines - Engines\n * @param options - Layout options\n */\nconst finalizeBlock = (engines: Engines, options: LayoutOptions) => {\n  /**\n   * @param line - Line\n   * @param i - Line index\n   * @param lines - Total lines\n   * @returns Line\n   */\n  return (line: AttributedString, index: number, lines: AttributedString[]) => {\n    const isLastFragment = index === lines.length - 1;\n    const style = line.runs?.[0]?.attributes || {};\n    const align = isLastFragment ? style.alignLastLine : style.align;\n\n    return compose(\n      finalizeLine,\n      engines.textDecoration(),\n      justifyLine(engines, options, align),\n      adjustOverflow,\n      removeNewLine,\n    )(line);\n  };\n};\n\n/**\n * Finalize line block by performing line justification\n * and text decoration (using appropiate engines)\n *\n * @param engines - Engines\n * @param options - Layout options\n */\nconst finalizeFragments = (engines: Engines, options: LayoutOptions) => {\n  /**\n   * @param paragraphs - Paragraphs\n   * @returns Paragraphs\n   */\n  return (paragraphs: Paragraph[]): Paragraph[] => {\n    const blockFinalizer = finalizeBlock(engines, options);\n    return paragraphs.map((paragraph) => paragraph.map(blockFinalizer));\n  };\n};\n\nexport default finalizeFragments;\n"
  },
  {
    "path": "packages/textkit/src/layout/generateGlyphs.ts",
    "content": "import scale from '../run/scale';\nimport resolveGlyphIndices from '../indices/resolve';\nimport { AttributedString, Position, Run } from '../types';\n\nconst getCharacterSpacing = (run: Run) => {\n  return run.attributes?.characterSpacing || 0;\n};\n\n/**\n * Scale run positions\n *\n * @param  run\n * @param  positions\n * @returns Scaled positions\n */\nconst scalePositions = (run: Run, positions: Position[]): Position[] => {\n  const runScale = scale(run);\n  const characterSpacing = getCharacterSpacing(run);\n\n  return positions.map((position, i) => {\n    const isLast = i === positions.length;\n    const xSpacing = isLast ? 0 : characterSpacing;\n\n    return Object.assign({}, position, {\n      xAdvance: position.xAdvance * runScale + xSpacing,\n      yAdvance: position.yAdvance * runScale,\n      xOffset: position.xOffset * runScale,\n      yOffset: position.yOffset * runScale,\n    });\n  });\n};\n\n/**\n * Create glyph run\n *\n * @param string string\n */\nconst layoutRun = (string: string) => {\n  /**\n   * @param run - Run\n   * @returns Glyph run\n   */\n  return (run: Run) => {\n    const { start, end, attributes = {} } = run;\n    const { font } = attributes;\n\n    if (!font) return { ...run, glyphs: [], glyphIndices: [], positions: [] };\n\n    const runString = string.slice(start, end);\n\n    if (typeof font === 'string') throw new Error('Invalid font');\n\n    // passing LTR To force fontkit to not reverse the string\n    const glyphRun = font[0].layout(\n      runString,\n      undefined,\n      undefined,\n      undefined,\n      'ltr',\n    );\n\n    const positions = scalePositions(run, glyphRun.positions);\n    const glyphIndices = resolveGlyphIndices(glyphRun.glyphs);\n\n    const result: Run = {\n      ...run,\n      positions,\n      glyphIndices,\n      glyphs: glyphRun.glyphs,\n    };\n\n    return result;\n  };\n};\n\n/**\n * Generate glyphs for single attributed string\n */\nconst generateGlyphs = () => {\n  /**\n   * @param attributedString - Attributed string\n   * @returns Attributed string with glyphs\n   */\n  return (attributedString: AttributedString) => {\n    const runs = attributedString.runs.map(layoutRun(attributedString.string));\n    const res: AttributedString = Object.assign({}, attributedString, { runs });\n    return res;\n  };\n};\n\nexport default generateGlyphs;\n"
  },
  {
    "path": "packages/textkit/src/layout/generateLineRects.ts",
    "content": "import intersects from '../rect/intersects';\nimport partition from '../rect/partition';\nimport { Container, Rect } from '../types';\n\nconst getLineFragment = (lineRect: Rect, excludeRect: Rect): Rect[] => {\n  if (!intersects(excludeRect, lineRect)) return [lineRect];\n\n  const eStart = excludeRect.x;\n  const eEnd = excludeRect.x + excludeRect.width;\n  const lStart = lineRect.x;\n  const lEnd = lineRect.x + lineRect.width;\n\n  const a = Object.assign({}, lineRect, { width: eStart - lStart });\n  const b = Object.assign({}, lineRect, { x: eEnd, width: lEnd - eEnd });\n\n  return [a, b].filter((r) => r.width > 0);\n};\n\nconst getLineFragments = (rect: Rect, excludeRects: Rect[]) => {\n  let fragments = [rect];\n\n  for (let i = 0; i < excludeRects.length; i += 1) {\n    const excludeRect = excludeRects[i];\n\n    fragments = fragments.reduce((acc, fragment) => {\n      const pieces = getLineFragment(fragment, excludeRect);\n      return acc.concat(pieces);\n    }, []);\n  }\n\n  return fragments;\n};\n\nconst generateLineRects = (container: Container, height: number) => {\n  const { excludeRects, ...rect } = container;\n\n  if (!excludeRects) return [rect];\n\n  const lineRects: Rect[] = [];\n  const maxY = Math.max(...excludeRects.map((r) => r.y + r.height));\n\n  let currentRect = rect;\n\n  while (currentRect.y < maxY) {\n    const [lineRect, rest] = partition(currentRect, height);\n    const lineRectFragments = getLineFragments(lineRect, excludeRects);\n\n    currentRect = rest;\n    lineRects.push(...lineRectFragments);\n  }\n\n  return [...lineRects, currentRect];\n};\n\nexport default generateLineRects;\n"
  },
  {
    "path": "packages/textkit/src/layout/index.ts",
    "content": "import { compose } from '@react-pdf/fns';\n\nimport wrapWords from './wrapWords';\nimport typesetter from './typesetter';\nimport bidiReordering from './bidiReordering';\nimport generateGlyphs from './generateGlyphs';\nimport resolveYOffset from './resolveYOffset';\nimport preprocessRuns from './preprocessRuns';\nimport splitParagraphs from './splitParagraphs';\nimport finalizeFragments from './finalizeFragments';\nimport resolveAttachments from './resolveAttachments';\nimport applyDefaultStyles from './applyDefaultStyles';\nimport verticalAlignment from './verticalAlign';\nimport bidiMirroring from './bidiMirroring';\nimport { AttributedString, Container, LayoutOptions } from '../types';\nimport type { Engines } from '../engines';\n\n/**\n * A LayoutEngine is the main object that performs text layout.\n * It accepts an AttributedString and a Container object\n * to layout text into, and uses several helper objects to perform\n * various layout tasks. These objects can be overridden to customize\n * layout behavior.\n */\nconst layoutEngine = (engines: Engines) => {\n  return (\n    attributedString: AttributedString,\n    container: Container,\n    options: LayoutOptions = {},\n  ) => {\n    const processParagraph = compose(\n      resolveYOffset(),\n      resolveAttachments(),\n      verticalAlignment(),\n      generateGlyphs(),\n      wrapWords(engines, options),\n      bidiMirroring(),\n      preprocessRuns(engines),\n    );\n\n    const processParagraphs = (paragraphs: AttributedString[]) =>\n      paragraphs.map(processParagraph);\n\n    return compose(\n      finalizeFragments(engines, options),\n      bidiReordering(),\n      typesetter(engines, options, container),\n      processParagraphs,\n      splitParagraphs(),\n      applyDefaultStyles(),\n    )(attributedString);\n  };\n};\n\nexport default layoutEngine;\n"
  },
  {
    "path": "packages/textkit/src/layout/layoutParagraph.ts",
    "content": "import omit from '../run/omit';\nimport stringHeight from '../attributedString/height';\nimport generateLineRects from './generateLineRects';\nimport {\n  AttributedString,\n  Container,\n  Rect,\n  LayoutOptions,\n  Paragraph,\n} from '../types';\nimport { Engines } from '../engines';\n\nconst ATTACHMENT_CODE = '\\ufffc'; // 65532\n\n/**\n * Remove attachment attribute if no char present\n *\n * @param line - Line\n * @returns Line\n */\nconst purgeAttachments = (line: AttributedString) => {\n  const shouldPurge = !line.string.includes(ATTACHMENT_CODE);\n\n  if (!shouldPurge) return line;\n\n  const runs = line.runs.map((run) => omit('attachment', run));\n\n  return Object.assign({}, line, { runs });\n};\n\n/**\n * Layout paragraphs inside rectangle\n *\n * @param rects - Rects\n * @param lines - Attributed strings\n * @param indent\n * @returns layout blocks\n */\nconst layoutLines = (\n  rects: Rect[],\n  lines: AttributedString[],\n  indent: number,\n) => {\n  let rect = rects.shift();\n  let currentY = rect.y;\n\n  return lines.map((line, i) => {\n    const lineIndent = i === 0 ? indent : 0;\n    const style = line.runs?.[0]?.attributes || {};\n    const height = Math.max(stringHeight(line), style.lineHeight);\n\n    if (currentY + height > rect.y + rect.height && rects.length > 0) {\n      rect = rects.shift();\n      currentY = rect.y;\n    }\n\n    const newLine: AttributedString = {\n      string: line.string,\n      runs: line.runs,\n      box: {\n        x: rect.x + lineIndent,\n        y: currentY,\n        width: rect.width - lineIndent,\n        height,\n      },\n    };\n\n    currentY += height;\n\n    return purgeAttachments(newLine);\n  });\n};\n\ntype layoutParagraphEngines = Pick<Engines, 'linebreaker'>;\n\n/**\n * Performs line breaking and layout\n *\n * @param engines - Engines\n * @param options - Layout options\n */\nconst layoutParagraph = (\n  engines: layoutParagraphEngines,\n  options: LayoutOptions = {},\n) => {\n  /**\n   * @param container - Container\n   * @param paragraph - Attributed string\n   * @returns Layout block\n   */\n  return (container: Container, paragraph: AttributedString): Paragraph => {\n    const height = stringHeight(paragraph);\n    const indent = paragraph.runs?.[0]?.attributes?.indent || 0;\n    const rects = generateLineRects(container, height);\n\n    const availableWidths = rects.map((r) => r.width);\n    availableWidths.unshift(availableWidths[0] - indent);\n\n    const lines = engines.linebreaker(options)(paragraph, availableWidths);\n\n    return layoutLines(rects, lines, indent);\n  };\n};\n\nexport default layoutParagraph;\n"
  },
  {
    "path": "packages/textkit/src/layout/preprocessRuns.ts",
    "content": "import { isNil } from '@react-pdf/fns';\n\nimport omit from '../run/omit';\nimport flatten from '../run/flatten';\nimport empty from '../attributedString/empty';\nimport { AttributedString } from '../types';\nimport type { Engines } from '../engines';\n\n/**\n *\n * @param attributedString\n * @returns Attributed string without font\n */\nconst omitFont = (attributedString: AttributedString): AttributedString => {\n  const runs = attributedString.runs.map((run) => omit('font', run));\n  return Object.assign({}, attributedString, { runs });\n};\n\ntype ProcessRunsEngines = Pick<\n  Engines,\n  'bidi' | 'scriptItemizer' | 'fontSubstitution'\n>;\n\n/**\n * Performs font substitution and script itemization on attributed string\n *\n * @param engines - engines\n */\nconst preprocessRuns = (engines: ProcessRunsEngines) => {\n  /**\n   * @param attributedString - Attributed string\n   * @returns Processed attributed string\n   */\n  return (attributedString: AttributedString | null) => {\n    if (isNil(attributedString)) return empty();\n\n    const { string } = attributedString;\n    const { fontSubstitution, scriptItemizer, bidi } = engines;\n\n    const { runs: omittedFontRuns } = omitFont(attributedString);\n    const { runs: itemizationRuns } = scriptItemizer()(attributedString);\n    const { runs: substitutedRuns } = fontSubstitution()(attributedString);\n    const { runs: bidiRuns } = bidi()(attributedString);\n\n    const runs = bidiRuns\n      .concat(substitutedRuns)\n      .concat(itemizationRuns)\n      .concat(omittedFontRuns);\n\n    return { string, runs: flatten(runs) } as AttributedString;\n  };\n};\n\nexport default preprocessRuns;\n"
  },
  {
    "path": "packages/textkit/src/layout/resolveAttachments.ts",
    "content": "import { AttributedString, Run } from '../types';\n\nconst ATTACHMENT_CODE = 0xfffc; // 65532\n\nconst isReplaceGlyph = (glyph) => glyph.codePoints.includes(ATTACHMENT_CODE);\n\n/**\n * Resolve attachments of run\n *\n * @param run\n * @returns Run\n */\nconst resolveRunAttachments = (run: Run) => {\n  if (!run.positions) return run;\n\n  const glyphs = run.glyphs || [];\n  const attachment = run.attributes?.attachment;\n\n  if (!attachment) return run;\n\n  const positions = run.positions.map((position, i) => {\n    const glyph = glyphs[i];\n\n    if (attachment.width && isReplaceGlyph(glyph)) {\n      return Object.assign({}, position, { xAdvance: attachment.width });\n    }\n\n    return Object.assign({}, position);\n  });\n\n  return Object.assign({}, run, { positions });\n};\n\n/**\n * Resolve attachments for multiple paragraphs\n */\nconst resolveAttachments = () => {\n  /**\n   * @param attributedString - Attributed string\n   * @returns Attributed string\n   */\n  return (attributedString: AttributedString) => {\n    const runs = attributedString.runs.map(resolveRunAttachments);\n    const res: AttributedString = Object.assign({}, attributedString, { runs });\n    return res;\n  };\n};\n\nexport default resolveAttachments;\n"
  },
  {
    "path": "packages/textkit/src/layout/resolveYOffset.ts",
    "content": "import { AttributedString, Run } from '../types';\n\n/**\n * Resolves yOffset for run\n *\n * @param run - Run\n * @returns Run\n */\nconst resolveRunYOffset = (run: Run) => {\n  if (!run.positions) return run;\n\n  const unitsPerEm = run.attributes?.font?.[0]?.unitsPerEm || 0;\n  const yOffset = (run.attributes?.yOffset || 0) * unitsPerEm;\n  const positions = run.positions.map((p) => Object.assign({}, p, { yOffset }));\n\n  return Object.assign({}, run, { positions });\n};\n\n/**\n * Resolves yOffset for multiple paragraphs\n */\nconst resolveYOffset = () => {\n  /**\n   * @param attributedString - Attributed string\n   * @returns Attributed string\n   */\n  return (attributedString: AttributedString) => {\n    const runs = attributedString.runs.map(resolveRunYOffset);\n    const res: AttributedString = Object.assign({}, attributedString, { runs });\n    return res;\n  };\n};\n\nexport default resolveYOffset;\n"
  },
  {
    "path": "packages/textkit/src/layout/splitParagraphs.ts",
    "content": "import length from '../attributedString/length';\nimport slice from '../attributedString/slice';\nimport { AttributedString } from '../types';\n\n/**\n * Breaks attributed string into paragraphs\n */\nconst splitParagraphs = () => {\n  /**\n   * @param attributedString - Attributed string\n   * @returns Paragraphs attributed strings\n   */\n  return (attributedString: AttributedString) => {\n    const paragraphs: AttributedString[] = [];\n\n    let start = 0;\n    let breakPoint = attributedString.string.indexOf('\\n') + 1;\n\n    while (breakPoint > 0) {\n      paragraphs.push(slice(start, breakPoint, attributedString));\n      start = breakPoint;\n      breakPoint = attributedString.string.indexOf('\\n', breakPoint) + 1;\n    }\n\n    if (start === 0) {\n      paragraphs.push(attributedString);\n    } else if (start < attributedString.string.length) {\n      paragraphs.push(slice(start, length(attributedString), attributedString));\n    }\n\n    return paragraphs;\n  };\n};\n\nexport default splitParagraphs;\n"
  },
  {
    "path": "packages/textkit/src/layout/typesetter.ts",
    "content": "import { isNil } from '@react-pdf/fns';\n\nimport copyRect from '../rect/copy';\nimport cropRect from '../rect/crop';\nimport blockHeight from '../paragraph/height';\nimport truncateBlock from '../paragraph/truncate';\nimport layoutParagraph from './layoutParagraph';\nimport sliceBlockAtHeight from '../paragraph/sliceAtHeight';\nimport { AttributedString, Container, Paragraph } from '../types';\nimport { Engines } from '../engines';\n\n/**\n * Layout paragraphs inside container until it does not\n * fit anymore, performing line wrapping in the process.\n *\n * @param  engines - Engines\n * @param  options - Layout options\n * @param container - Container\n */\nconst typesetter = (engines: Engines, options, container: Container) => {\n  /**\n   * @param attributedStrings - Attributed strings (paragraphs)\n   * @returns Paragraph blocks\n   */\n  return (attributedStrings: AttributedString[]) => {\n    const result: Paragraph[] = [];\n    const paragraphs = [...attributedStrings];\n    const layout = layoutParagraph(engines, options);\n    const maxLines = isNil(container.maxLines) ? Infinity : container.maxLines;\n    const truncateEllipsis = container.truncateMode === 'ellipsis';\n\n    let linesCount = maxLines;\n    let paragraphRect = copyRect(container);\n    let nextParagraph = paragraphs.shift();\n\n    while (linesCount > 0 && nextParagraph) {\n      const paragraph = layout(paragraphRect, nextParagraph);\n      const slicedBlock = paragraph.slice(0, linesCount);\n      const linesHeight = blockHeight(slicedBlock);\n\n      const shouldTruncate =\n        truncateEllipsis && paragraph.length !== slicedBlock.length;\n\n      linesCount -= slicedBlock.length;\n\n      if (paragraphRect.height >= linesHeight) {\n        result.push(shouldTruncate ? truncateBlock(slicedBlock) : slicedBlock);\n        paragraphRect = cropRect(linesHeight, paragraphRect);\n        nextParagraph = paragraphs.shift();\n      } else {\n        result.push(\n          truncateBlock(sliceBlockAtHeight(paragraphRect.height, slicedBlock)),\n        );\n        break;\n      }\n    }\n\n    return result;\n  };\n};\n\nexport default typesetter;\n"
  },
  {
    "path": "packages/textkit/src/layout/verticalAlign.ts",
    "content": "import { AttributedString } from '../types';\n\n/**\n * Apply scaling and yOffset for verticalAlign 'sub' and 'super'.\n */\nconst verticalAlignment = () => {\n  /**\n   * @param attributedString - Attributed string\n   * @returns Attributed string\n   */\n  return (attributedString: AttributedString) => {\n    attributedString.runs.forEach((run) => {\n      const { attributes } = run;\n      const { verticalAlign } = attributes;\n\n      if (verticalAlign === 'sub') {\n        attributes.yOffset = -0.2;\n      } else if (verticalAlign === 'super') {\n        attributes.yOffset = 0.4;\n      }\n    });\n    return attributedString;\n  };\n};\n\nexport default verticalAlignment;\n"
  },
  {
    "path": "packages/textkit/src/layout/wrapWords.ts",
    "content": "import fromFragments from '../attributedString/fromFragments';\nimport { Engines } from '../engines';\nimport { AttributedString, LayoutOptions } from '../types';\n\nconst SOFT_HYPHEN = '\\u00ad';\n\n/**\n * Default word hyphenation engine used when no one provided.\n * Does not perform word hyphenation at all\n *\n * @param word\n * @returns Same word\n */\nconst defaultHyphenate = (word: string) => [word];\n\n/**\n * Remove soft hyphens from word\n *\n * @param word\n * @returns Word without soft hyphens\n */\nconst removeSoftHyphens = (word: string) => {\n  return word.replaceAll(SOFT_HYPHEN, '');\n};\n\n/**\n * Wrap words of attribute string\n *\n * @param engines layout engines\n * @param options layout options\n */\nconst wrapWords = (\n  engines: Partial<Engines> = {},\n  options: LayoutOptions = {},\n) => {\n  /**\n   * @param attributedString - Attributed string\n   * @returns Attributed string including syllables\n   */\n  return (attributedString: AttributedString) => {\n    const syllables = [];\n    const fragments = [];\n\n    const builtinHyphenate = engines.wordHyphenation?.() || defaultHyphenate;\n\n    const hyphenate = options.hyphenationCallback || builtinHyphenate;\n\n    let offset = 0;\n\n    for (let i = 0; i < attributedString.runs.length; i += 1) {\n      let string = '';\n\n      const run = attributedString.runs[i];\n\n      const words = attributedString.string\n        .slice(run.start, run.end)\n        .split(/([ ]+)/g)\n        .filter(Boolean);\n\n      for (let j = 0; j < words.length; j += 1) {\n        const word = words[j];\n        const parts = hyphenate(word, builtinHyphenate).map(removeSoftHyphens);\n\n        syllables.push(...parts);\n        string += parts.join('');\n      }\n\n      // Modify run start and end based on removed soft hyphens.\n      const runOffset = run.end - run.start - string.length;\n      const start = run.start - offset;\n      const end = run.end - offset - runOffset;\n\n      fragments.push({ ...run, start, end, string });\n\n      offset += runOffset;\n    }\n\n    const result: AttributedString = { ...fromFragments(fragments), syllables };\n\n    return result;\n  };\n};\n\nexport default wrapWords;\n"
  },
  {
    "path": "packages/textkit/src/paragraph/height.ts",
    "content": "import { Paragraph } from '../types';\n\n/**\n * Get paragraph block height\n *\n * @param paragraph - Paragraph\n * @returns Paragraph block height\n */\nconst height = (paragraph: Paragraph) => {\n  return paragraph.reduce((acc, block) => acc + block.box.height, 0);\n};\n\nexport default height;\n"
  },
  {
    "path": "packages/textkit/src/paragraph/sliceAtHeight.ts",
    "content": "import { Paragraph } from '../types';\n\n/**\n * Slice block at given height\n *\n * @param height - Height\n * @param paragraph - Paragraph\n * @returns Sliced paragraph\n */\nconst sliceAtHeight = (height: number, paragraph: Paragraph) => {\n  const newBlock = [];\n\n  let counter = 0;\n\n  for (let i = 0; i < paragraph.length; i += 1) {\n    const line = paragraph[i];\n\n    counter += line.box.height;\n\n    if (counter < height) {\n      newBlock.push(line);\n    } else {\n      break;\n    }\n  }\n\n  return newBlock;\n};\n\nexport default sliceAtHeight;\n"
  },
  {
    "path": "packages/textkit/src/paragraph/truncate.ts",
    "content": "import { last } from '@react-pdf/fns';\n\nimport trim from '../attributedString/trim';\nimport append from '../attributedString/append';\nimport { Font, Paragraph } from '../types';\n\nconst ELLIPSIS_UNICODE = 8230;\nconst ELLIPSIS_STRING = String.fromCharCode(ELLIPSIS_UNICODE);\n\n/**\n * Get ellipsis codepoint. This may be different in standard and embedded fonts\n *\n * @param font\n * @returns Ellipsis codepoint\n */\nconst getEllipsisCodePoint = (font: Font) => {\n  if (!font.encode) return ELLIPSIS_UNICODE;\n\n  const [codePoints] = font.encode(ELLIPSIS_STRING);\n\n  return parseInt(codePoints[0], 16);\n};\n\n/**\n * Trucante block with ellipsis\n *\n * @param paragraph - Paragraph\n * @returns Sliced paragraph\n */\nconst truncate = (paragraph: Paragraph) => {\n  const runs = last(paragraph)?.runs || [];\n  const font = last(runs)?.attributes?.font[0];\n\n  if (font) {\n    const index = paragraph.length - 1;\n    const codePoint = getEllipsisCodePoint(font);\n    const glyph = font.glyphForCodePoint(codePoint);\n    const lastBlock = append(glyph, trim(paragraph[index]));\n\n    return Object.assign([], paragraph, { [index]: lastBlock });\n  }\n\n  return paragraph;\n};\n\nexport default truncate;\n"
  },
  {
    "path": "packages/textkit/src/positions/advanceWidth.ts",
    "content": "import { Position } from '../types';\n\n/**\n * Return positions advance width\n *\n * @param positions - Positions\n * @returns {number} advance width\n */\nconst advanceWidth = (positions: Position[]) => {\n  return positions.reduce((acc, pos) => acc + (pos.xAdvance || 0), 0);\n};\n\nexport default advanceWidth;\n"
  },
  {
    "path": "packages/textkit/src/rect/area.ts",
    "content": "import { Rect } from '../types';\n\n/**\n * Returns rect area\n *\n * @param rect - Rect\n * @returns Rect area\n */\nconst area = (rect: Rect | null) => {\n  return rect ? rect.height * rect.width : 0;\n};\n\nexport default area;\n"
  },
  {
    "path": "packages/textkit/src/rect/bottomLeft.ts",
    "content": "import maxY from './maxY';\nimport { Coordinate, Rect } from '../types';\n\nconst ZERO = { x: 0, y: 0 };\n\n/**\n * Returns rect bottom left coordinate\n *\n * @param rect - Rect\n * @returns Bottom left coordinate\n */\nconst bottomLeft = (rect: Rect | null): Coordinate => {\n  return rect ? { x: rect.x || 0, y: maxY(rect) } : ZERO;\n};\n\nexport default bottomLeft;\n"
  },
  {
    "path": "packages/textkit/src/rect/bottomRight.ts",
    "content": "import { Coordinate, Rect } from '../types';\nimport maxX from './maxX';\nimport maxY from './maxY';\n\nconst ZERO = { x: 0, y: 0 };\n\n/**\n * Returns rect bottom right coordinate\n *\n * @param rect - Rect\n * @returns Bottom right coordinate\n */\nconst bottomRight = (rect: Rect | null): Coordinate => {\n  return rect ? { x: maxX(rect), y: maxY(rect) } : ZERO;\n};\n\nexport default bottomRight;\n"
  },
  {
    "path": "packages/textkit/src/rect/copy.ts",
    "content": "import { Rect } from '../types';\n\n/**\n * Clone rect\n *\n * @param rect - Rect\n * @returns Cloned rect\n */\nconst copy = (rect: Rect): Rect => {\n  return Object.assign({}, rect);\n};\n\nexport default copy;\n"
  },
  {
    "path": "packages/textkit/src/rect/crop.ts",
    "content": "import { Rect } from '../types';\nimport partition from './partition';\n\n/**\n * Crop upper section of rect\n *\n * @param height - Height\n * @param rect - Rect\n * @returns Cropped rect\n */\nconst crop = (height: number, rect: Rect) => {\n  const [, result] = partition(rect, height);\n  return result;\n};\n\nexport default crop;\n"
  },
  {
    "path": "packages/textkit/src/rect/empty.ts",
    "content": "import { Rect } from '../types';\n\n/**\n * Returns empty rect\n *\n * @returns Empty rect\n */\nconst empty = (): Rect => {\n  return {\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0,\n  };\n};\n\nexport default empty;\n"
  },
  {
    "path": "packages/textkit/src/rect/equals.ts",
    "content": "import { Rect } from '../types';\n\n/**\n * Check if two rect are equal\n *\n * @param a - Rect A\n * @param b - Rect B\n * @returns Whether rects are equal\n *\n */\nconst equals = (a: Rect, b: Rect) => {\n  return (\n    a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height\n  );\n};\n\nexport default equals;\n"
  },
  {
    "path": "packages/textkit/src/rect/intersects.ts",
    "content": "import { Rect } from '../types';\n\n/**\n * Checks if two rects intersect each other\n *\n * @param a - Rect A\n * @param b - Rect B\n * @returns Whether rects intersect\n */\nconst intersects = (a: Rect, b: Rect) => {\n  const x = Math.max(a.x, b.x);\n  const num1 = Math.min(a.x + a.width, b.x + b.width);\n  const y = Math.max(a.y, b.y);\n  const num2 = Math.min(a.y + a.height, b.y + b.height);\n\n  return num1 >= x && num2 >= y;\n};\n\nexport default intersects;\n"
  },
  {
    "path": "packages/textkit/src/rect/maxX.ts",
    "content": "import { Rect } from '../types';\n\n/**\n * Returns max rect X coordinate\n *\n * @param rect - Rect\n * @returns X coordinate\n */\nconst maxX = (rect: Rect | null) => {\n  return rect ? rect.x + rect.width : 0;\n};\n\nexport default maxX;\n"
  },
  {
    "path": "packages/textkit/src/rect/maxY.ts",
    "content": "import { Rect } from '../types';\n\n/**\n * Returns max rect Y coordinate\n *\n * @param rect - Rect\n * @returns Y coordinate\n */\nconst maxY = (rect: Rect | null) => {\n  return rect ? rect.y + rect.height : 0;\n};\n\nexport default maxY;\n"
  },
  {
    "path": "packages/textkit/src/rect/partition.ts",
    "content": "import { Rect } from '../types';\n\n/**\n * Partition rect in two in the vertical direction\n *\n * @param rect - Rect\n * @param height - Height\n * @returns Partitioned rects\n */\nconst partition = (rect: Rect, height: number): [Rect, Rect] => {\n  const a = Object.assign({}, rect, { height });\n\n  const b = Object.assign({}, rect, {\n    y: rect.y + height,\n    height: rect.height - height,\n  });\n\n  return [a, b];\n};\n\nexport default partition;\n"
  },
  {
    "path": "packages/textkit/src/run/add.ts",
    "content": "import { Run } from '../types';\n\n/**\n * Add scalar to run\n *\n * @param index - Scalar\n * @param run - Run\n * @returns Added run\n */\nconst add = (index: number, run: Run): Run => {\n  const start = run.start + index;\n  const end = run.end + index;\n\n  return Object.assign({}, run, { start, end });\n};\n\nexport default add;\n"
  },
  {
    "path": "packages/textkit/src/run/advanceWidth.ts",
    "content": "import positionsAdvanceWidth from '../positions/advanceWidth';\nimport { Run } from '../types';\n\n/**\n * Return run advance width\n *\n * @param run - Run\n * @returns Advance width\n */\nconst advanceWidth = (run: Run) => {\n  return positionsAdvanceWidth(run.positions || []);\n};\n\nexport default advanceWidth;\n"
  },
  {
    "path": "packages/textkit/src/run/advanceWidthBetween.ts",
    "content": "import glyphIndexAt from './glyphIndexAt';\nimport positionsAdvanceWidth from '../positions/advanceWidth';\nimport { Run } from '../types';\n\n/**\n * Advance width between two string indices\n *\n * @param start - Glyph index\n * @param end - Glyph index\n * @param run - Run\n * @returns Advanced width run\n */\nconst advanceWidthBetween = (start: number, end: number, run: Run) => {\n  const runStart = run.start || 0;\n  const glyphStartIndex = Math.max(0, glyphIndexAt(start - runStart, run));\n  const glyphEndIndex = Math.max(0, glyphIndexAt(end - runStart, run));\n  const positions = (run.positions || []).slice(glyphStartIndex, glyphEndIndex);\n\n  return positionsAdvanceWidth(positions);\n};\n\nexport default advanceWidthBetween;\n"
  },
  {
    "path": "packages/textkit/src/run/append.ts",
    "content": "import scale from './scale';\nimport getFont from './getFont';\nimport isNumber from '../utils/isNumber';\nimport appendIndices from '../indices/append';\nimport glyphFromCodePoint from '../glyph/fromCodePoint';\nimport { Glyph, Run } from '../types';\n\n/**\n * Append glyph to run\n *\n * @param glyph - Glyph\n * @param run - Run\n * @returns Run with glyph\n */\nconst appendGlyph = (glyph: Glyph, run: Run): Run => {\n  const glyphLength = glyph.codePoints?.length || 0;\n  const end = run.end + glyphLength;\n  const glyphs = run.glyphs.concat(glyph);\n  const glyphIndices = appendIndices(glyphLength, run.glyphIndices);\n\n  if (!run.positions)\n    return Object.assign({}, run, { end, glyphs, glyphIndices });\n\n  const positions = run.positions.concat({\n    xAdvance: glyph.advanceWidth * scale(run),\n    yAdvance: 0,\n    xOffset: 0,\n    yOffset: 0,\n  });\n\n  return Object.assign({}, run, { end, glyphs, glyphIndices, positions });\n};\n\n/**\n * Append glyph or code point to run\n *\n * @param value - Glyph or codePoint\n * @param run - Run\n * @returns Run with glyph\n */\nconst append = (value: Glyph | number | null, run: Run): Run => {\n  if (!value) return run;\n\n  const font = getFont(run);\n  const glyph = isNumber(value) ? glyphFromCodePoint(value, font) : value;\n\n  return appendGlyph(glyph, run);\n};\n\nexport default append;\n"
  },
  {
    "path": "packages/textkit/src/run/ascent.ts",
    "content": "import { Run } from '../types';\nimport scale from './scale';\n\n/**\n * Get run ascent\n *\n * @param run - Run\n * @returns Ascent\n */\nconst ascent = (run: Run) => {\n  const { font, attachment } = run.attributes;\n  const attachmentHeight = attachment?.height || 0;\n  const fontAscent = typeof font === 'string' ? 0 : font?.[0]?.ascent || 0;\n\n  return Math.max(attachmentHeight, fontAscent * scale(run));\n};\n\nexport default ascent;\n"
  },
  {
    "path": "packages/textkit/src/run/concat.ts",
    "content": "import { last } from '@react-pdf/fns';\n\nimport length from './length';\nimport normalizeIndices from '../indices/normalize';\nimport { Run } from '../types';\n\n/**\n * Concats two runs into one\n *\n * @param runA - First run\n * @param runB - Second run\n * @returns Concatenated run\n */\nconst concat = (runA: Run, runB: Run): Run => {\n  const end = runA.end + length(runB);\n\n  const glyphs = (runA.glyphs || []).concat(runB.glyphs || []);\n  const positions = (runA.positions || []).concat(runB.positions || []);\n  const attributes = Object.assign({}, runA.attributes, runB.attributes);\n\n  const runAIndices = runA.glyphIndices || [];\n  const runALastIndex = last(runAIndices) || 0;\n  const runBIndices = (runB.glyphIndices || []).map(\n    (i) => i + runALastIndex + 1,\n  );\n  const glyphIndices = normalizeIndices(runAIndices.concat(runBIndices));\n\n  return Object.assign({}, runA, {\n    end,\n    glyphs,\n    positions,\n    attributes,\n    glyphIndices,\n  });\n};\n\nexport default concat;\n"
  },
  {
    "path": "packages/textkit/src/run/descent.ts",
    "content": "import { Run } from '../types';\nimport scale from './scale';\n\n/**\n * Get run descent\n *\n * @param run - Run\n * @returns Descent\n */\nconst descent = (run: Run) => {\n  const font = run.attributes?.font;\n  const fontDescent = typeof font === 'string' ? 0 : font?.[0]?.descent || 0;\n\n  return scale(run) * fontDescent;\n};\n\nexport default descent;\n"
  },
  {
    "path": "packages/textkit/src/run/dropLast.ts",
    "content": "import { Run } from '../types';\nimport slice from './slice';\n\n/**\n * Drop last char of run\n *\n * @param run - Run\n * @returns Run without last char\n */\nconst dropLast = (run: Run) => {\n  return slice(0, run.end - run.start - 1, run);\n};\n\nexport default dropLast;\n"
  },
  {
    "path": "packages/textkit/src/run/empty.ts",
    "content": "import { Run } from '../types';\n\n/**\n * Returns empty run\n *\n * @returns Empty run\n */\nconst empty = (): Run => {\n  return {\n    start: 0,\n    end: 0,\n    glyphIndices: [],\n    glyphs: [],\n    positions: [],\n    attributes: {},\n  };\n};\n\nexport default empty;\n"
  },
  {
    "path": "packages/textkit/src/run/filter.ts",
    "content": "import { Run } from '../types';\nimport runIndexAt from './runIndexAt';\n\n/**\n * Filter runs contained between start and end\n *\n * @param start\n * @param end\n * @param runs\n * @returns Filtered runs\n */\nconst filter = (start: number, end: number, runs: Run[]) => {\n  const startIndex = runIndexAt(start, runs);\n  const endIndex = Math.max(runIndexAt(end - 1, runs), startIndex);\n\n  return runs.slice(startIndex, endIndex + 1);\n};\n\nexport default filter;\n"
  },
  {
    "path": "packages/textkit/src/run/flatten.ts",
    "content": "import sort from './sort';\nimport isEmpty from './isEmpty';\nimport { Attributes, Run } from '../types';\n\ntype Point = ['start' | 'end', number, Attributes, number];\n\n/**\n * Sort points in ascending order\n * @param a - First point\n * @param b - Second point\n * @returns Sort order\n */\nconst sortPoints = (a: Point, b: Point) => {\n  return a[1] - b[1] || a[3] - b[3];\n};\n\n/**\n * @param runs\n * @returns Points\n */\nconst generatePoints = (runs: Run[]) => {\n  const result: Point[] = runs.reduce((acc, run, i) => {\n    return acc.concat([\n      ['start', run.start, run.attributes, i],\n      ['end', run.end, run.attributes, i],\n    ]);\n  }, []);\n\n  return result.sort(sortPoints);\n};\n\n/**\n * @param runs\n * @returns Merged runs\n */\nconst mergeRuns = (runs: Run[]): Run => {\n  return runs.reduce((acc: any, run) => {\n    const attributes = Object.assign({}, acc.attributes, run.attributes);\n    return Object.assign({}, run, { attributes });\n  }, {});\n};\n\n/**\n * @param runs\n * @returns Grouped runs\n */\nconst groupEmptyRuns = (runs: Run[]): Run[][] => {\n  const groups = runs.reduce((acc, run) => {\n    if (!acc[run.start]) acc[run.start] = [];\n    acc[run.start].push(run);\n    return acc;\n  }, []);\n\n  return Object.values(groups);\n};\n\n/**\n * @param runs\n * @returns Flattened runs\n */\nconst flattenEmptyRuns = (runs: Run[]) => {\n  return groupEmptyRuns(runs).map(mergeRuns);\n};\n\n/**\n * @param runs\n * @returns Flattened runs\n */\nconst flattenRegularRuns = (runs: Run[]) => {\n  const res: Run[] = [];\n  const points = generatePoints(runs);\n\n  let start = -1;\n  let attrs = {};\n  const stack = [];\n\n  for (let i = 0; i < points.length; i += 1) {\n    const [type, offset, attributes] = points[i];\n\n    if (start !== -1 && start < offset) {\n      res.push({\n        start,\n        end: offset,\n        attributes: attrs,\n        glyphIndices: [],\n        glyphs: [],\n        positions: [],\n      });\n    }\n\n    if (type === 'start') {\n      stack.push(attributes);\n      attrs = Object.assign({}, attrs, attributes);\n    } else {\n      attrs = {};\n\n      for (let j = 0; j < stack.length; j += 1) {\n        if (stack[j] === attributes) {\n          stack.splice(j--, 1);\n        } else {\n          attrs = Object.assign({}, attrs, stack[j]);\n        }\n      }\n    }\n\n    start = offset;\n  }\n\n  return res;\n};\n\n/**\n * Flatten many runs\n *\n * @param runs\n * @returns Flattened runs\n */\nconst flatten = (runs: Run[] = []) => {\n  const emptyRuns = flattenEmptyRuns(runs.filter((run) => isEmpty(run)));\n  const regularRuns = flattenRegularRuns(runs.filter((run) => !isEmpty(run)));\n\n  return sort(emptyRuns.concat(regularRuns));\n};\n\nexport default flatten;\n"
  },
  {
    "path": "packages/textkit/src/run/getFont.ts",
    "content": "import { Run } from '../types';\n\n/**\n * Get run font\n *\n * @param run - Run\n * @returns Font\n */\nconst getFont = (run: Run) => {\n  return run.attributes?.font?.[0] || null;\n};\n\nexport default getFont;\n"
  },
  {
    "path": "packages/textkit/src/run/glyphIndexAt.ts",
    "content": "import { isNil } from '@react-pdf/fns';\nimport { Run } from '../types';\n\n/**\n * Return glyph index at string index, if glyph indices present.\n * Otherwise return string index\n *\n * @param index - Index\n * @param run - Run\n * @returns Glyph index\n */\nconst glyphIndexAt = (index: number, run: Run) => {\n  const result = run?.glyphIndices?.[index];\n  return isNil(result) ? index : result;\n};\n\nexport default glyphIndexAt;\n"
  },
  {
    "path": "packages/textkit/src/run/height.ts",
    "content": "import { Run } from '../types';\nimport ascent from './ascent';\nimport descent from './descent';\nimport lineGap from './lineGap';\n\n/**\n * Get run height\n *\n * @param run - Run\n * @returns Height\n */\nconst height = (run: Run) => {\n  const lineHeight = run.attributes?.lineHeight;\n  return lineHeight || lineGap(run) + ascent(run) - descent(run);\n};\n\nexport default height;\n"
  },
  {
    "path": "packages/textkit/src/run/indexAtOffset.ts",
    "content": "import { Run } from '../types';\n\n/**\n * Get string index at offset\n *\n * @param offset - Offset\n * @param run - Run\n * @returns String index at offset N\n */\nconst indexAtOffset = (offset: number, run: Run) => {\n  let counter = 0;\n  let index = 0;\n\n  const glyphs = run.glyphs || [];\n  const positions = run.positions || [];\n\n  for (let i = 0; i < positions.length; i += 1) {\n    const { xAdvance } = positions[i];\n\n    if (counter + xAdvance > offset) return index;\n\n    counter += xAdvance;\n    index += glyphs[i]?.codePoints?.length || 0;\n  }\n\n  return index;\n};\n\nexport default indexAtOffset;\n"
  },
  {
    "path": "packages/textkit/src/run/insert.ts",
    "content": "import slice from './slice';\nimport concat from './concat';\nimport append from './append';\nimport getFont from './getFont';\nimport isNumber from '../utils/isNumber';\nimport glyphFromCodePoint from '../glyph/fromCodePoint';\nimport { Glyph, Run } from '../types';\n\n/**\n * Insert glyph to run in the given index\n *\n * @param index - Index\n * @param glyph - Glyph\n * @param run - Run\n * @returns Run with glyph\n */\nconst insertGlyph = (index: number, glyph: Glyph, run: Run) => {\n  if (!glyph) return run;\n\n  // Split resolves ligature splitting in case new glyph breaks some\n  const leadingRun = slice(0, index, run);\n  const trailingRun = slice(index, Infinity, run);\n\n  return concat(append(glyph, leadingRun), trailingRun);\n};\n\n/**\n * Insert either glyph or code point to run in the given index\n *\n * @param index - Index\n * @param value - Glyph or codePoint\n * @param run - Run\n * @returns Run with glyph\n */\nconst insert = (index: number, value: Glyph | number | null, run: Run) => {\n  const font = getFont(run);\n  const glyph = isNumber(value) ? glyphFromCodePoint(value, font) : value;\n  return insertGlyph(index, glyph, run);\n};\n\nexport default insert;\n"
  },
  {
    "path": "packages/textkit/src/run/isEmpty.ts",
    "content": "import { Run } from '../types';\n\n/**\n * Is run empty (start === end)\n *\n * @param run - Run\n * @returns Is run empty\n */\nconst isEmpty = (run: Run) => {\n  return run.start === run.end;\n};\n\nexport default isEmpty;\n"
  },
  {
    "path": "packages/textkit/src/run/isWhiteSpace.ts",
    "content": "import isGlyphWhiteSpace from '../glyph/isWhiteSpace';\nimport { Run } from '../types';\n\n/**\n * Check if run is entirely whitespace\n *\n * @param run - Run\n * @returns Whether run is entirely whitespace\n */\nconst isWhiteSpace = (run: Run) => {\n  const glyphs = run?.glyphs || [];\n\n  return glyphs.length > 0 && glyphs.every(isGlyphWhiteSpace);\n};\n\nexport default isWhiteSpace;\n"
  },
  {
    "path": "packages/textkit/src/run/leadingOffset.ts",
    "content": "import isWhiteSpace from '../glyph/isWhiteSpace';\nimport { Run } from '../types';\n\n/**\n * Get white space leading positions\n *\n * @param run - Run\n * @returns White space leading positions\n */\nconst leadingPositions = (run: Run) => {\n  const glyphs = run.glyphs || [];\n  const positions = run.positions || [];\n  const leadingWhitespaces = glyphs.findIndex((g) => !isWhiteSpace(g));\n\n  return leadingWhitespaces === -1\n    ? positions\n    : positions.slice(0, leadingWhitespaces);\n};\n\n/**\n * Get run leading white space offset\n *\n * @param run - Run\n * @returns Leading white space offset\n */\nconst leadingOffset = (run: Run) => {\n  if (!run) return 0;\n\n  const positions = leadingPositions(run);\n\n  return positions.reduce((acc, pos) => acc + (pos.xAdvance || 0), 0);\n};\n\nexport default leadingOffset;\n"
  },
  {
    "path": "packages/textkit/src/run/length.ts",
    "content": "import { Run } from '../types';\n\n/**\n * Get run length\n *\n * @param run - Run\n * @returns Length\n */\nconst length = (run: Run) => {\n  return run.end - run.start;\n};\n\nexport default length;\n"
  },
  {
    "path": "packages/textkit/src/run/lineGap.ts",
    "content": "import { Run } from '../types';\nimport scale from './scale';\n\n/**\n * Get run lineGap\n *\n * @param run - Run\n * @returns LineGap\n */\nconst lineGap = (run: Run) => {\n  const font = run.attributes?.font;\n  const lineGap = typeof font === 'string' ? 0 : font?.[0]?.lineGap || 0;\n  return lineGap * scale(run);\n};\n\nexport default lineGap;\n"
  },
  {
    "path": "packages/textkit/src/run/offset.ts",
    "content": "import { Run } from '../types';\n\n/**\n * Get ligature offset by index\n *\n * Ex. ffi ligature\n *\n *   glyphs:         l  o  f  f  i  m\n *   glyphIndices:   0  1  2  2  2  3\n *   offset:         0  0  0  1  2  0\n *\n * @param index\n * @param run - Run\n * @returns Ligature offset\n */\nconst offset = (index: number, run: Run) => {\n  if (!run) return 0;\n\n  const glyphIndices = run.glyphIndices || [];\n  const value = glyphIndices[index];\n\n  return glyphIndices.slice(0, index).filter((i) => i === value).length;\n};\n\nexport default offset;\n"
  },
  {
    "path": "packages/textkit/src/run/omit.ts",
    "content": "import { Attributes, Run } from '../types';\n\n/**\n * Omit attribute from run\n *\n * @param value - Attribute key\n * @param run - Run\n * @returns Run without ommited attribute\n */\nconst omit = (value: keyof Attributes, run: Run): Run => {\n  const attributes = Object.assign({}, run.attributes);\n\n  delete attributes[value];\n\n  return Object.assign({}, run, { attributes });\n};\n\nexport default omit;\n"
  },
  {
    "path": "packages/textkit/src/run/prepend.ts",
    "content": "import scale from './scale';\nimport getFont from './getFont';\nimport isNumber from '../utils/isNumber';\nimport prependIndices from '../indices/prepend';\nimport glyphFromCodePoint from '../glyph/fromCodePoint';\nimport { Glyph, Position, Run } from '../types';\n\n/**\n * Prepend glyph to run\n *\n * @param glyph - Glyph\n * @param run - Run\n * @returns Run with glyph\n */\nconst prependGlyph = (glyph: Glyph, run: Run): Run => {\n  const runScale = scale(run);\n  const glyphLength = glyph.codePoints.length;\n\n  const end = run.end + glyphLength;\n  const glyphIndices = prependIndices(glyphLength, run.glyphIndices);\n  const glyphs = [glyph].concat(run.glyphs);\n\n  const positions: Position[] = [\n    {\n      xAdvance: glyph.advanceWidth * runScale,\n      yAdvance: 0,\n      xOffset: 0,\n      yOffset: 0,\n    },\n  ].concat(run.positions);\n\n  return Object.assign({}, run, { end, glyphs, glyphIndices, positions });\n};\n\n/**\n * Prepend glyph or code point on run\n *\n * @param value - Glyph or codePoint\n * @param run - Run\n * @returns Run with glyph\n */\nconst prepend = (value: Glyph | number | null, run: Run) => {\n  if (!value) return run;\n\n  const font = getFont(run);\n  const glyph = isNumber(value) ? glyphFromCodePoint(value, font) : value;\n\n  return prependGlyph(glyph, run);\n};\n\nexport default prepend;\n"
  },
  {
    "path": "packages/textkit/src/run/runIndexAt.ts",
    "content": "import { Run } from '../types';\n\n/**\n * Get run index that contains passed index\n *\n * @param index - Index\n * @param runs - Runs\n * @returns Run index\n */\nconst runIndexAt = (index: number, runs: Run[]) => {\n  if (!runs) return -1;\n\n  return runs.findIndex((run) => run.start <= index && index < run.end);\n};\n\nexport default runIndexAt;\n"
  },
  {
    "path": "packages/textkit/src/run/scale.ts",
    "content": "import { Run } from '../types';\n\n/**\n * Calculate run scale\n *\n * @param run - Run\n * @returns Scale\n */\nconst calculateScale = (run: Run) => {\n  const attributes = run.attributes || {};\n  const fontSize = attributes.fontSize || 12;\n  const font = attributes.font;\n  const unitsPerEm = typeof font === 'string' ? null : font?.[0]?.unitsPerEm;\n\n  return unitsPerEm ? fontSize / unitsPerEm : 0;\n};\n\n/**\n * Get run scale\n *\n * @param  run\n * @returns Scale\n */\nconst scale = (run: Run) => {\n  return run.attributes?.scale || calculateScale(run);\n};\n\nexport default scale;\n"
  },
  {
    "path": "packages/textkit/src/run/slice.ts",
    "content": "import scale from './scale';\nimport offset from './offset';\nimport getFont from './getFont';\nimport sliceGlyph from '../glyph/slice';\nimport glyphIndexAt from './glyphIndexAt';\nimport normalizeIndices from '../indices/normalize';\nimport { Glyph, Position, Run } from '../types';\n\n/**\n * Slice run between glyph indices range\n *\n * @param start - Glyph index\n * @param end - Glyph index\n * @param run - Run\n * @returns Sliced run\n */\nconst slice = (start: number, end: number, run: Run): Run => {\n  const runScale = scale(run);\n  const font = getFont(run);\n\n  // Get glyph start and end indices\n  const startIndex = glyphIndexAt(start, run);\n  const endIndex = glyphIndexAt(end, run);\n\n  // Get start and end glyph\n  const startGlyph = run.glyphs?.[startIndex];\n  const endGlyph = run.glyphs?.[endIndex];\n\n  // Get start ligature chunks (if any)\n  const startOffset = offset(start, run);\n  const startGlyphs =\n    startOffset > 0 ? sliceGlyph(startOffset, Infinity, font, startGlyph) : [];\n\n  // Get end ligature chunks (if any)\n  const endOffset = offset(end, run);\n  const endGlyphs = sliceGlyph(0, endOffset, font, endGlyph);\n\n  // Compute new glyphs\n  const sliceStart = startIndex + Math.min(1, startOffset);\n  const glyphs = (run.glyphs || []).slice(sliceStart, endIndex);\n\n  // Compute new positions\n  const glyphPosition = (g: Glyph): Position => ({\n    xAdvance: g.advanceWidth * runScale,\n    yAdvance: 0,\n    xOffset: 0,\n    yOffset: 0,\n  });\n  const startPositions = startGlyphs.map(glyphPosition);\n  const positions = (run.positions || []).slice(sliceStart, endIndex);\n  const endPositions = endGlyphs.map(glyphPosition);\n\n  return Object.assign({}, run, {\n    start: Math.max(run.start + start, 0),\n    end: Math.max(Math.min(run.end, run.start + end), 0),\n    glyphIndices: normalizeIndices((run.glyphIndices || []).slice(start, end)),\n    glyphs: [startGlyphs, glyphs, endGlyphs].flat(),\n    positions: [startPositions, positions, endPositions].flat(),\n  });\n};\n\nexport default slice;\n"
  },
  {
    "path": "packages/textkit/src/run/sort.ts",
    "content": "import { Run } from '../types';\n\n/**\n * Sort runs in ascending order\n *\n * @param runs\n * @returns Sorted runs\n */\nconst sort = (runs: Run[]) => {\n  return runs.sort((a, b) => a.start - b.start || a.end - b.end);\n};\n\nexport default sort;\n"
  },
  {
    "path": "packages/textkit/src/run/subtract.ts",
    "content": "import { Run } from '../types';\n\n/**\n * Subtract scalar to run\n *\n * @param index - Scalar\n * @param run - Run\n * @returns Subtracted run\n */\nconst subtract = (index: number, run: Run): Run => {\n  const start = run.start - index;\n  const end = run.end - index;\n\n  return Object.assign({}, run, { start, end });\n};\n\nexport default subtract;\n"
  },
  {
    "path": "packages/textkit/src/run/trailingOffset.ts",
    "content": "import { reverse } from '@react-pdf/fns';\nimport isWhiteSpace from '../glyph/isWhiteSpace';\nimport { Run } from '../types';\n\n/**\n * Get white space trailing positions\n *\n * @param run run\n * @returns White space trailing positions\n */\nconst trailingPositions = (run: Run) => {\n  const glyphs = reverse(run.glyphs || []);\n  const positions = reverse(run.positions || []);\n  const leadingWhitespaces = glyphs.findIndex((g) => !isWhiteSpace(g));\n\n  return leadingWhitespaces === -1\n    ? positions\n    : positions.slice(0, leadingWhitespaces);\n};\n\n/**\n * Get run trailing white space offset\n *\n * @param run - Run\n * @returns Trailing white space offset\n */\nconst trailingOffset = (run: Run) => {\n  if (!run) return 0;\n\n  const positions = trailingPositions(run);\n\n  return positions.reduce((acc, pos) => acc + (pos.xAdvance || 0), 0);\n};\n\nexport default trailingOffset;\n"
  },
  {
    "path": "packages/textkit/src/types.ts",
    "content": "import type { Glyph as FontkitGlyph } from 'fontkit';\nimport type { Font } from '@react-pdf/font';\nimport { Factor as JustificationFactor } from './engines/justification/types';\n\nexport type Coordinate = {\n  x: number;\n  y: number;\n};\n\nexport type Rect = {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n};\n\nexport type Container = Rect & {\n  truncateMode?: 'ellipsis';\n  maxLines?: number;\n  excludeRects?: Rect[];\n};\n\nexport type Glyph = FontkitGlyph;\n\nexport type Position = {\n  xAdvance: number;\n  yAdvance: number;\n  xOffset: number;\n  yOffset: number;\n  // TODO: remove?\n  advanceWidth?: number;\n};\n\nexport type Attachment = {\n  x?: number;\n  y?: number;\n  width: number;\n  height: number;\n  xOffset?: number;\n  yOffset?: number;\n  image: Buffer;\n};\n\nexport type Attributes = {\n  align?: string;\n  alignLastLine?: string;\n  attachment?: Attachment;\n  backgroundColor?: string;\n  bidiLevel?: number;\n  bullet?: unknown;\n  characterSpacing?: number;\n  color?: string;\n  direction?: 'rtl' | 'ltr';\n  features?: unknown[];\n  fill?: boolean;\n  font?: Font[];\n  fontSize?: number;\n  hangingPunctuation?: boolean;\n  hyphenationFactor?: number;\n  indent?: number;\n  justificationFactor?: number;\n  lineHeight?: number;\n  lineSpacing?: number;\n  link?: string;\n  margin?: number;\n  marginLeft?: number;\n  marginRight?: number;\n  opacity?: number;\n  padding?: number;\n  paddingTop?: number;\n  paragraphSpacing?: number;\n  scale?: number;\n  script?: unknown;\n  shrinkFactor?: number;\n  strike?: boolean;\n  strikeColor?: string;\n  strikeStyle?: string;\n  stroke?: boolean;\n  underline?: boolean;\n  underlineColor?: string;\n  underlineStyle?: string;\n  verticalAlign?: string;\n  wordSpacing?: number;\n  yOffset?: number;\n};\n\nexport type Run = {\n  start: number;\n  end: number;\n  attributes: Attributes;\n  glyphIndices?: number[];\n  glyphs?: Glyph[];\n  positions?: Position[];\n  xAdvance?: number;\n\n  // TODO: Remove these properties\n  height?: number;\n  descent?: number;\n};\n\nexport type DecorationLine = {\n  rect: Rect;\n  opacity: number;\n  color: string;\n  style: string;\n};\n\nexport type AttributedString = {\n  string: string;\n  syllables?: string[];\n  runs: Run[];\n  box?: Rect;\n  decorationLines?: DecorationLine[];\n\n  // TODO: Remove these properties\n  overflowLeft?: number;\n  overflowRight?: number;\n  xAdvance?: number;\n  ascent?: number;\n};\n\nexport type Fragment = {\n  string: string;\n  attributes?: Attributes;\n};\n\nexport type Paragraph = AttributedString[];\n\nexport type LayoutOptions = {\n  hyphenationCallback?: (\n    word: string | null,\n    fallback: (word: string | null) => string[],\n  ) => string[];\n  tolerance?: number;\n  hyphenationPenalty?: number;\n  expandCharFactor?: JustificationFactor;\n  shrinkCharFactor?: JustificationFactor;\n  expandWhitespaceFactor?: JustificationFactor;\n  shrinkWhitespaceFactor?: JustificationFactor;\n};\n\nexport type { Font } from '@react-pdf/font';\n"
  },
  {
    "path": "packages/textkit/src/utils/isNumber.ts",
    "content": "/**\n * Check if value is a number\n *\n * @param value - Value to check\n * @returns Whether value is a number\n */\nconst isNumber = (value: unknown): value is number => {\n  return typeof value === 'number';\n};\n\nexport default isNumber;\n"
  },
  {
    "path": "packages/textkit/src/utils/stringFromCodePoints.ts",
    "content": "/**\n * Get string from array of code points\n *\n * @param codePoints - Points\n * @returns String\n */\nconst stringFromCodePoints = (codePoints: number[] | null) => {\n  return String.fromCodePoint(...(codePoints || []));\n};\n\nexport default stringFromCodePoints;\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/advanceWidth.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/attributedString/empty';\nimport advanceWidth from '../../src/attributedString/advanceWidth';\n\ndescribe('attributeString advanceWidth operator', () => {\n  test('should return 0 for empty string', () => {\n    expect(advanceWidth(empty())).toBe(0);\n  });\n\n  test('should return 0 if runs dont have positions', () => {\n    const string = {\n      string: '',\n      runs: [\n        {\n          start: 2,\n          end: 5,\n          attributes: {},\n        },\n        {\n          start: 5,\n          end: 8,\n          attributes: {},\n        },\n      ],\n    };\n\n    expect(advanceWidth(string)).toBe(0);\n  });\n\n  test('should return advance width for single run', () => {\n    const string = {\n      string: '',\n      runs: [\n        {\n          start: 0,\n          end: 2,\n          glyphIndices: [],\n          glyphs: [],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n          attributes: {},\n        },\n      ],\n    };\n\n    expect(advanceWidth(string)).toBe(15);\n  });\n\n  test('should handle mixed runs with and without positions', () => {\n    const string = {\n      string: '',\n      runs: [\n        {\n          start: 0,\n          end: 2,\n          attributes: {},\n        },\n        {\n          start: 2,\n          end: 4,\n          glyphIndices: [],\n          glyphs: [],\n          positions: [\n            { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 3, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n          attributes: {},\n        },\n      ],\n    };\n\n    expect(advanceWidth(string)).toBe(10);\n  });\n\n  test('should sum up runs advance width', () => {\n    const runs = [\n      {\n        start: 2,\n        end: 4,\n        glyphIndices: [],\n        glyphs: [],\n        positions: [\n          {\n            xAdvance: 5,\n            yAdvance: 0,\n            xOffset: 0,\n            yOffset: 0,\n          },\n          {\n            xAdvance: 10,\n            yAdvance: 0,\n            xOffset: 0,\n            yOffset: 0,\n          },\n        ],\n        attributes: {},\n      },\n      {\n        start: 4,\n        end: 6,\n        glyphIndices: [],\n        glyphs: [],\n        positions: [\n          {\n            xAdvance: 15,\n            yAdvance: 0,\n            xOffset: 0,\n            yOffset: 0,\n          },\n          {\n            xAdvance: 20,\n            yAdvance: 0,\n            xOffset: 0,\n            yOffset: 0,\n          },\n        ],\n        attributes: {},\n      },\n    ];\n    const string = { string: '', runs };\n\n    expect(advanceWidth(string)).toBe(50);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/advanceWidthBetween.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/attributedString/empty';\nimport advanceWidthBetween from '../../src/attributedString/advanceWidthBetween';\n\ndescribe('attributeString advanceWidthBetween operator', () => {\n  test('should return 0 for empty string', () => {\n    expect(advanceWidthBetween(2, 4, empty())).toBe(0);\n  });\n\n  test('should return 0 if runs dont have positions', () => {\n    const string = {\n      string: '',\n      runs: [\n        { start: 2, end: 5, attributes: {} },\n        { start: 5, end: 8, attributes: {} },\n      ],\n    };\n\n    expect(advanceWidthBetween(0, 10, string)).toBe(0);\n  });\n\n  test('should sum up single run advance width', () => {\n    const string = {\n      string: '',\n      runs: [\n        {\n          start: 0,\n          end: 4,\n          attributes: {},\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 12, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    expect(advanceWidthBetween(1, 3, string)).toBe(22);\n  });\n\n  test('should sum up multiple runs advance width', () => {\n    const string = {\n      string: '',\n      runs: [\n        {\n          start: 0,\n          end: 4,\n          attributes: {},\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 12, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n        {\n          start: 4,\n          end: 6,\n          attributes: {},\n          positions: [\n            { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 20, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    expect(advanceWidthBetween(2, 6, string)).toBe(62);\n  });\n\n  test('should sum up single run advance width when not starting on zero', () => {\n    const string = {\n      string: '',\n      runs: [\n        {\n          start: 2,\n          end: 6,\n          attributes: {},\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 12, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    expect(advanceWidthBetween(3, 5, string)).toBe(22);\n  });\n\n  test('should sum up multiple runs advance width when not starting on zero', () => {\n    const string = {\n      string: '',\n      runs: [\n        {\n          start: 2,\n          end: 6,\n          attributes: {},\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 12, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n        {\n          start: 6,\n          end: 8,\n          attributes: {},\n          positions: [\n            { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 20, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    expect(advanceWidthBetween(4, 8, string)).toBe(62);\n  });\n\n  test('should return 0 when start equals end', () => {\n    const string = {\n      string: '',\n      runs: [\n        {\n          start: 0,\n          end: 4,\n          attributes: {},\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 12, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    expect(advanceWidthBetween(2, 2, string)).toBe(0);\n  });\n\n  test('should return 0 when range is completely outside of runs', () => {\n    const string = {\n      string: '',\n      runs: [\n        {\n          start: 0,\n          end: 4,\n          attributes: {},\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 12, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    expect(advanceWidthBetween(10, 15, string)).toBe(0);\n  });\n\n  test('should handle range partially overlapping at the start of a run', () => {\n    const string = {\n      string: '',\n      runs: [\n        {\n          start: 5,\n          end: 9,\n          attributes: {},\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 12, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    // Range 3-7 overlaps with run 5-9 at positions 5-7 (indices 0-2)\n    expect(advanceWidthBetween(3, 7, string)).toBe(15); // 5 + 10\n  });\n\n  test('should handle range partially overlapping at the end of a run', () => {\n    const string = {\n      string: '',\n      runs: [\n        {\n          start: 0,\n          end: 4,\n          attributes: {},\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 12, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    // Range 2-10 overlaps with run 0-4 at positions 2-4 (indices 2-4)\n    expect(advanceWidthBetween(2, 10, string)).toBe(27); // 12 + 15\n  });\n\n  test('should handle single position in range', () => {\n    const string = {\n      string: '',\n      runs: [\n        {\n          start: 0,\n          end: 4,\n          attributes: {},\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 12, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    expect(advanceWidthBetween(1, 2, string)).toBe(10);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/append.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport font from '../internal/font';\nimport pluck from '../internal/pluck';\nimport empty from '../../src/attributedString/empty';\nimport append from '../../src/attributedString/append';\nimport { Glyph } from '../../src/types';\n\ndescribe('attributeString append operator', () => {\n  test('should return copy of string if no glyph provided', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 3, 4],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lorem', runs };\n    const result = append(null, string);\n\n    expect(result).not.toBe(string);\n    expect(result).toEqual(string);\n  });\n\n  test('should append glyph to empty string', () => {\n    const string = empty();\n    const glyph = { id: 76, codePoints: [76], advanceWidth: 10 } as Glyph; // L\n    const result = append(glyph, string);\n\n    expect(result).toHaveProperty('string', 'L');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 1);\n    expect(result.runs[0].glyphIndices).toEqual([0]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76]);\n  });\n\n  test('should append glyph on single run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 3, 4],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lorem', runs };\n    const glyph = { id: 76, codePoints: [76], advanceWidth: 8 } as Glyph; // L\n    const result = append(glyph, string);\n\n    expect(result).toHaveProperty('string', 'loremL');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 6);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 114, 101, 109, 76,\n    ]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([\n      5, 6, 7, 8, 9, 8,\n    ]);\n  });\n\n  test('should append code point on single run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 3, 4],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lorem', runs };\n    const result = append(76, string);\n\n    expect(result).toHaveProperty('string', 'loremL');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 6);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 114, 101, 109, 76,\n    ]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([\n      5, 6, 7, 8, 9, 8,\n    ]);\n  });\n\n  test('should append glyph on multiple run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2],\n        attributes: { font: [font], fontSize: 2 },\n      },\n      {\n        start: 3,\n        end: 5,\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lorem', runs };\n    const glyph = { id: 76, codePoints: [76], advanceWidth: 8 } as Glyph; // L\n    const result = append(glyph, string);\n\n    expect(result).toHaveProperty('string', 'loremL');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 3);\n    expect(result.runs[1]).toHaveProperty('start', 3);\n    expect(result.runs[1]).toHaveProperty('end', 6);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2]);\n    expect(result.runs[1].glyphIndices).toEqual([0, 1, 2]);\n\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 114]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([101, 109, 76]);\n\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([5, 6, 7]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([8, 9, 8]);\n  });\n\n  test('should append code point on multiple run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2],\n        attributes: { font: [font], fontSize: 2 },\n      },\n      {\n        start: 3,\n        end: 5,\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lorem', runs };\n    const result = append(76, string);\n\n    expect(result).toHaveProperty('string', 'loremL');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 3);\n    expect(result.runs[1]).toHaveProperty('start', 3);\n    expect(result.runs[1]).toHaveProperty('end', 6);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2]);\n    expect(result.runs[1].glyphIndices).toEqual([0, 1, 2]);\n\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 114]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([101, 109, 76]);\n\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([5, 6, 7]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([8, 9, 8]);\n  });\n\n  test('should append ligature glyph on single run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 3, 4],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lorem', runs };\n    const glyph = {\n      id: 64257,\n      codePoints: [102, 105],\n      advanceWidth: 10,\n    } as Glyph; // fi\n    const result = append(glyph, string);\n\n    expect(result).toHaveProperty('string', 'loremfi');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 7);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 3, 4, 5, 5]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 114, 101, 109, 64257,\n    ]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([\n      5, 6, 7, 8, 9, 10,\n    ]);\n  });\n\n  test('should append ligaure glyph on multiple run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2],\n        attributes: { font: [font], fontSize: 2 },\n      },\n      {\n        start: 3,\n        end: 5,\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lorem', runs };\n    const glyph = {\n      id: 64257,\n      codePoints: [102, 105],\n      advanceWidth: 10,\n    } as Glyph; // fi\n    const result = append(glyph, string);\n\n    expect(result).toHaveProperty('string', 'loremfi');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 3);\n    expect(result.runs[1]).toHaveProperty('start', 3);\n    expect(result.runs[1]).toHaveProperty('end', 7);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2]);\n    expect(result.runs[1].glyphIndices).toEqual([0, 1, 2, 2]);\n\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 114]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([101, 109, 64257]);\n\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([5, 6, 7]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([8, 9, 10]);\n  });\n\n  test('should not mutate the original string when appending', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const originalString = { string: 'lor', runs };\n    const originalRunsLength = originalString.runs.length;\n    const originalStringValue = originalString.string;\n\n    const glyph = { id: 76, codePoints: [76], advanceWidth: 8 } as Glyph;\n    append(glyph, originalString);\n\n    expect(originalString.string).toBe(originalStringValue);\n    expect(originalString.runs).toHaveLength(originalRunsLength);\n  });\n\n  test('should return same string when appending undefined', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lor', runs };\n    // @ts-expect-error - testing undefined handling\n    const result = append(undefined, string);\n\n    expect(result).not.toBe(string);\n    expect(result.string).toBe('lor');\n    expect(result.runs).toHaveLength(1);\n  });\n\n  test('should set correct position values when appending glyph with advanceWidth', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 2,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lo', runs };\n    const glyph = { id: 114, codePoints: [114], advanceWidth: 10 } as Glyph; // r with advanceWidth 10\n    const result = append(glyph, string);\n\n    const lastPosition =\n      result.runs[0].positions![result.runs[0].positions!.length - 1];\n\n    expect(lastPosition.yAdvance).toBe(0);\n    expect(lastPosition.xAdvance).toBe(10);\n    expect(lastPosition.xOffset).toBe(0);\n    expect(lastPosition.yOffset).toBe(0);\n  });\n\n  test('should append glyph to string with run without positions', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        glyphIndices: [0, 1, 2],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lor', runs };\n    const glyph = { id: 101, codePoints: [101], advanceWidth: 8 } as Glyph; // e\n    const result = append(glyph, string);\n\n    expect(result).toHaveProperty('string', 'lore');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('end', 4);\n    expect(result.runs[0].positions).toBeUndefined();\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 114, 101]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/ascent.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/attributedString/empty';\nimport ascent from '../../src/attributedString/ascent';\nimport { Font } from '../../src/types';\n\nconst font = { ascent: 10, unitsPerEm: 2 } as Font;\n\ndescribe('attributeString ascent operator', () => {\n  test('should return 0 for empty string', () => {\n    expect(ascent(empty())).toBe(0);\n  });\n\n  test('should return 0 if runs dont have font', () => {\n    const string = {\n      string: '',\n      attributes: {},\n      runs: [\n        { start: 2, end: 5, attributes: {} },\n        { start: 5, end: 8, attributes: {} },\n      ],\n    };\n\n    expect(ascent(string)).toBe(0);\n  });\n\n  test('should return ascent for single run', () => {\n    const runs = [\n      { start: 0, end: 5, attributes: { fontSize: 10, font: [font] } }, // 50\n    ];\n    const string = { string: '', runs };\n\n    expect(ascent(string)).toBe(50);\n  });\n\n  test('should max runs ascent', () => {\n    const runs = [\n      { start: 2, end: 4, attributes: { fontSize: 10, font: [font] } }, // 50\n      { start: 4, end: 6, attributes: { fontSize: 12, font: [font] } }, // 60\n    ];\n    const string = { string: '', runs };\n\n    expect(ascent(string)).toBe(60);\n  });\n\n  test('should sum up runs ascent with attachments', () => {\n    const runs = [\n      { start: 4, end: 6, attributes: { fontSize: 12, font: [font] } }, // 60\n      {\n        start: 2,\n        end: 4,\n        attributes: {\n          fontSize: 10,\n          font: [font],\n          attachment: { width: 70, height: 70, image: Buffer.from('') },\n        },\n      }, // 70\n    ];\n    const string = { string: '', runs };\n\n    expect(ascent(string)).toBe(70);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/descent.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/attributedString/empty';\nimport descent from '../../src/attributedString/descent';\nimport { Font } from '../../src/types';\n\nconst font = { descent: -10, unitsPerEm: 2 } as Font;\n\ndescribe('attributeString descent operator', () => {\n  test('should return 0 for empty string', () => {\n    expect(descent(empty())).toBe(0);\n  });\n\n  test('should return 0 if runs dont have font', () => {\n    const string = {\n      string: '',\n      runs: [\n        { start: 2, end: 5, attributes: {} },\n        { start: 5, end: 8, attributes: {} },\n      ],\n    };\n\n    expect(descent(string)).toBe(0);\n  });\n\n  test('should return descent for single run', () => {\n    const runs = [\n      { start: 0, end: 5, attributes: { fontSize: 10, font: [font] } }, // -50\n    ];\n    const string = { string: '', runs };\n\n    expect(descent(string)).toBe(-50);\n  });\n\n  test('should return min runs descent', () => {\n    const runs = [\n      { start: 2, end: 4, attributes: { fontSize: 10, font: [font] } }, // -50\n      { start: 4, end: 6, attributes: { fontSize: 12, font: [font] } }, // -60\n    ];\n    const string = { string: '', runs };\n\n    expect(descent(string)).toBe(-60);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/dropLast.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport pluck from '../internal/pluck';\nimport dropLast from '../../src/attributedString/dropLast';\nimport { Glyph } from '../../src/types';\n\ndescribe('attributeString dropLast operator', () => {\n  test('should dropLast with one run', () => {\n    const runs = [{ start: 0, end: 11, attributes: { font: [] } }];\n    const string = { string: 'Lorem ipsum', runs };\n    const result = dropLast(string);\n\n    expect(result.string).toBe('Lorem ipsu');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 10);\n    expect(result.runs[0]).toHaveProperty('attributes', { font: [] });\n  });\n\n  test('should dropLast with two runs', () => {\n    const string = {\n      string: 'Lorem ipsum',\n      runs: [\n        { start: 0, end: 6, attributes: { font: [] } },\n        { start: 6, end: 11, attributes: { fontSize: 16 } },\n      ],\n    };\n    const splittedString = dropLast(string);\n\n    expect(splittedString.string).toBe('Lorem ipsu');\n    expect(splittedString.runs[0]).toHaveProperty('start', 0);\n    expect(splittedString.runs[0]).toHaveProperty('end', 6);\n    expect(splittedString.runs[0]).toHaveProperty('attributes', { font: [] });\n    expect(splittedString.runs[1]).toHaveProperty('start', 6);\n    expect(splittedString.runs[1]).toHaveProperty('end', 10);\n    expect(splittedString.runs[1]).toHaveProperty('attributes', {\n      fontSize: 16,\n    });\n  });\n\n  test('should slice with several runs', () => {\n    const runs = [\n      { start: 0, end: 3, attributes: { font: [] } },\n      { start: 3, end: 6, attributes: { fontSize: 16 } },\n      { start: 6, end: 11, attributes: { fontSize: 20 } },\n    ];\n    const string = { string: 'Lorem ipsum', runs };\n    const splittedString = dropLast(string);\n\n    expect(splittedString.string).toBe('Lorem ipsu');\n    expect(splittedString.runs[0]).toHaveProperty('start', 0);\n    expect(splittedString.runs[0]).toHaveProperty('end', 3);\n    expect(splittedString.runs[0]).toHaveProperty('attributes', { font: [] });\n    expect(splittedString.runs[1]).toHaveProperty('start', 3);\n    expect(splittedString.runs[1]).toHaveProperty('end', 6);\n    expect(splittedString.runs[1]).toHaveProperty('attributes', {\n      fontSize: 16,\n    });\n    expect(splittedString.runs[2]).toHaveProperty('start', 6);\n    expect(splittedString.runs[2]).toHaveProperty('end', 10);\n    expect(splittedString.runs[2]).toHaveProperty('attributes', {\n      fontSize: 20,\n    });\n  });\n\n  test('should dropLast glyphs with one run', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 3, 4],\n      },\n    ];\n\n    const string = { string: 'Lorem', runs, sylables: [] };\n    const result = dropLast(string);\n\n    expect(result.string).toBe('Lore');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 4);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 3]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 114, 101]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([6, 7, 8, 9]);\n  });\n\n  test('should dropLast glyphs with several runs', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2],\n      },\n      {\n        start: 3,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1],\n      },\n    ];\n    const string = { string: 'Lorem', runs };\n    const result = dropLast(string);\n\n    expect(result.string).toBe('Lore');\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 3);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 114]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([6, 7, 8]);\n\n    expect(result.runs[1]).toHaveProperty('start', 3);\n    expect(result.runs[1]).toHaveProperty('end', 4);\n    expect(result.runs[1].glyphIndices).toEqual([0]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([101]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([9]);\n  });\n\n  test('should return empty string when dropping last from single character', () => {\n    const runs = [{ start: 0, end: 1, attributes: { font: [] } }];\n    const string = { string: 'A', runs };\n    const result = dropLast(string);\n\n    expect(result.string).toBe('');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 0);\n    expect(result.runs[0]).toHaveProperty('attributes', { font: [] });\n  });\n\n  test('should handle empty string', () => {\n    const runs = [{ start: 0, end: 0, attributes: { font: [] } }];\n    const string = { string: '', runs };\n    const result = dropLast(string);\n\n    expect(result.string).toBe('');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 0);\n  });\n\n  test('should make last run empty when it has single character', () => {\n    const runs = [\n      { start: 0, end: 5, attributes: { font: [] } },\n      { start: 5, end: 6, attributes: { fontSize: 16 } },\n    ];\n    const string = { string: 'Lorem!', runs };\n    const result = dropLast(string);\n\n    expect(result.string).toBe('Lorem');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 5);\n    expect(result.runs[0]).toHaveProperty('attributes', { font: [] });\n    expect(result.runs[1]).toHaveProperty('start', 5);\n    expect(result.runs[1]).toHaveProperty('end', 5);\n    expect(result.runs[1]).toHaveProperty('attributes', { fontSize: 16 });\n  });\n\n  test('should preserve other attributed string properties', () => {\n    const runs = [{ start: 0, end: 5, attributes: { font: [] } }];\n    const string = {\n      string: 'Lorem',\n      runs,\n      syllables: ['Lo', 'rem'],\n      customProp: 'test',\n    } as ReturnType<typeof dropLast> & { customProp: string };\n    const result = dropLast(string) as typeof string;\n\n    expect(result.string).toBe('Lore');\n    expect(result.syllables).toEqual(['Lo', 'rem']);\n    expect(result.customProp).toBe('test');\n  });\n\n  test('should dropLast glyph from single character run', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 1,\n        attributes: {},\n        glyphs: [{ id: 65, advanceWidth: 0, codePoints: [65] }] as Glyph[], // A\n        positions: [{ xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 }],\n        glyphIndices: [0],\n      },\n    ];\n\n    const string = { string: 'A', runs };\n    const result = dropLast(string);\n\n    expect(result.string).toBe('');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 0);\n    expect(result.runs[0].glyphIndices).toEqual([]);\n    expect(result.runs[0].glyphs).toEqual([]);\n    expect(result.runs[0].positions).toEqual([]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/empty.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/attributedString/empty';\n\ndescribe('attributeString empty operator', () => {\n  test('should return empty attributed string', () => {\n    const result = empty();\n\n    expect(result).toHaveProperty('string', '');\n    expect(result).toHaveProperty('runs', []);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/end.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/attributedString/empty';\nimport end from '../../src/attributedString/end';\n\ndescribe('attributeString end operator', () => {\n  test('should return 0 for empty string', () => {\n    expect(end(empty())).toBe(0);\n  });\n\n  test('should return end value for single run', () => {\n    const string = {\n      string: '',\n      runs: [{ start: 0, end: 5, attributes: {} }],\n    };\n    expect(end(string)).toBe(5);\n  });\n\n  test('should return last run end value', () => {\n    const string = {\n      string: '',\n      runs: [\n        { start: 2, end: 5, attributes: {} },\n        { start: 5, end: 8, attributes: {} },\n      ],\n    };\n    expect(end(string)).toBe(8);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/fromFragments.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport fromFragments from '../../src/attributedString/fromFragments';\n\ndescribe('attributeString fromFragments operator', () => {\n  test('should return empty attributed string for no fragments', () => {\n    const attributedString = fromFragments([]);\n\n    expect(attributedString.string).toBe('');\n    expect(attributedString.runs).toHaveLength(0);\n  });\n\n  test('should be constructed by one fragment', () => {\n    const attributedString = fromFragments([{ string: 'Hey' }]);\n\n    expect(attributedString.string).toBe('Hey');\n    expect(attributedString.runs[0]).toHaveProperty('start', 0);\n    expect(attributedString.runs[0]).toHaveProperty('end', 3);\n  });\n\n  test('should be constructed by fragments', () => {\n    const attributedString = fromFragments([\n      { string: 'Hey' },\n      { string: ' ho' },\n    ]);\n\n    expect(attributedString.string).toBe('Hey ho');\n    expect(attributedString.runs[0]).toHaveProperty('start', 0);\n    expect(attributedString.runs[0]).toHaveProperty('end', 3);\n    expect(attributedString.runs[1]).toHaveProperty('start', 3);\n    expect(attributedString.runs[1]).toHaveProperty('end', 6);\n  });\n\n  test('should preserve fragment attributes', () => {\n    const attributedString = fromFragments([\n      { string: 'Hey', attributes: { font: [] } },\n      { string: ' ho', attributes: { fontSize: 16 } },\n    ]);\n\n    expect(attributedString.runs[0]).toHaveProperty('attributes', { font: [] });\n    expect(attributedString.runs[1]).toHaveProperty('attributes', {\n      fontSize: 16,\n    });\n  });\n\n  test('should default to empty attributes when not provided', () => {\n    const attributedString = fromFragments([\n      { string: 'Hey' },\n      { string: ' ho' },\n    ]);\n\n    expect(attributedString.runs[0]).toHaveProperty('attributes', {});\n    expect(attributedString.runs[1]).toHaveProperty('attributes', {});\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/height.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/attributedString/empty';\nimport height from '../../src/attributedString/height';\nimport { Font } from '../../src/types';\n\nconst font = { descent: 10, ascent: 15, lineGap: 5, unitsPerEm: 2 } as Font;\n\ndescribe('attributeString height operator', () => {\n  test('should return 0 for empty string', () => {\n    expect(height(empty())).toBe(0);\n  });\n\n  test('should return 0 if runs dont have font', () => {\n    const string = {\n      string: '',\n      runs: [\n        { start: 2, end: 5, attributes: {} },\n        { start: 5, end: 8, attributes: {} },\n      ],\n    };\n\n    expect(height(string)).toBe(0);\n  });\n\n  test('should max runs height', () => {\n    const runs = [\n      { start: 2, end: 4, attributes: { fontSize: 10, font: [font] } }, // 50\n      { start: 4, end: 6, attributes: { fontSize: 12, font: [font] } }, // 60\n    ];\n    const string = { string: '', runs };\n\n    expect(height(string)).toBe(60);\n  });\n\n  test('should sum up runs height with lineHeight', () => {\n    const runs = [\n      { start: 2, end: 4, attributes: { fontSize: 10, font: [font] } }, // 50\n      {\n        start: 4,\n        end: 6,\n        attributes: { fontSize: 12, lineHeight: 70, font: [font] },\n      }, // 70\n    ];\n    const string = { string: '', runs };\n\n    expect(height(string)).toBe(70);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/indexAtOffset.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport indexAtOffset from '../../src/attributedString/indexAtOffset';\nimport { Glyph } from '../../src/types';\n\ndescribe('attributeString indexAtOffset operator', () => {\n  test('should return 0 for empty attributed string', () => {\n    const string = { string: '', runs: [] };\n\n    expect(indexAtOffset(0, string)).toBe(0);\n    expect(indexAtOffset(10, string)).toBe(0);\n  });\n\n  test('should return index for single run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n    ];\n\n    const string = { string: 'Lorem', runs };\n\n    expect(indexAtOffset(5, string)).toBe(0);\n    expect(indexAtOffset(7, string)).toBe(1);\n    expect(indexAtOffset(13, string)).toBe(2);\n    expect(indexAtOffset(22, string)).toBe(3);\n    expect(indexAtOffset(30, string)).toBe(4);\n    expect(indexAtOffset(42, string)).toBe(5);\n  });\n\n  test('should return index for multiple run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n      {\n        start: 3,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n    ];\n    const string = { string: 'Lorem', runs };\n\n    expect(indexAtOffset(5, string)).toBe(0);\n    expect(indexAtOffset(7, string)).toBe(1);\n    expect(indexAtOffset(13, string)).toBe(2);\n    expect(indexAtOffset(22, string)).toBe(3);\n    expect(indexAtOffset(30, string)).toBe(4);\n    expect(indexAtOffset(42, string)).toBe(5);\n  });\n\n  test('should return index for single run string with ligature', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n    ];\n\n    const string = { string: 'Lofim', runs };\n\n    expect(indexAtOffset(5, string)).toBe(0);\n    expect(indexAtOffset(7, string)).toBe(1);\n    expect(indexAtOffset(13, string)).toBe(2);\n    expect(indexAtOffset(24, string)).toBe(4);\n    expect(indexAtOffset(32, string)).toBe(5);\n    expect(indexAtOffset(40, string)).toBe(5);\n  });\n\n  test('should return index for multiple run string with ligature', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 4,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n      {\n        start: 4,\n        end: 8,\n        attributes: {},\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n    ];\n    const string = { string: 'Lfirefim', runs };\n\n    expect(indexAtOffset(5, string)).toBe(0);\n    expect(indexAtOffset(7, string)).toBe(1);\n    expect(indexAtOffset(16, string)).toBe(3);\n    expect(indexAtOffset(25, string)).toBe(4);\n    expect(indexAtOffset(33, string)).toBe(5);\n    expect(indexAtOffset(43, string)).toBe(7);\n    expect(indexAtOffset(48, string)).toBe(8);\n    expect(indexAtOffset(60, string)).toBe(8);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/insertGlyph.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport pluck from '../internal/pluck';\nimport insertGlyph from '../../src/attributedString/insertGlyph';\nimport { Glyph } from '../../src/types';\nimport font from '../internal/font';\nimport empty from '../../src/attributedString/empty';\n\ndescribe('attributeString insertGlyph operator', () => {\n  test('should insert glyph on single run string at beggining', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 3, 4],\n        },\n      ],\n    };\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(0, glyph, string);\n\n    expect(result).toHaveProperty('string', 'ilorem');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 6);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      105, 76, 111, 114, 101, 109,\n    ]);\n  });\n\n  test('should insert glyph on single run string at end', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 3, 4],\n        },\n      ],\n    };\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(5, glyph, string);\n\n    expect(result).toHaveProperty('string', 'loremi');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 6);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 114, 101, 109, 105,\n    ]);\n  });\n\n  test('should insert glyph on single run string at middle', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 3, 4],\n        },\n      ],\n    };\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(3, glyph, string);\n\n    expect(result).toHaveProperty('string', 'loriem');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 6);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 114, 105, 101, 109,\n    ]);\n  });\n\n  test('should insert ligature glyph on single run string at beggining', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 3, 4],\n        },\n      ],\n    };\n    const glyph = {\n      id: 64257,\n      advanceWidth: 0,\n      codePoints: [102, 105],\n    } as Glyph; // fi\n    const result = insertGlyph(0, glyph, string);\n\n    expect(result).toHaveProperty('string', 'filorem');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 7);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      64257, 76, 111, 114, 101, 109,\n    ]);\n  });\n\n  test('should insert ligature glyph on single run string at end', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 3, 4],\n        },\n      ],\n    };\n    const glyph = {\n      id: 64257,\n      advanceWidth: 0,\n      codePoints: [102, 105],\n    } as Glyph; // fi\n    const result = insertGlyph(5, glyph, string);\n\n    expect(result).toHaveProperty('string', 'loremfi');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 7);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 114, 101, 109, 64257,\n    ]);\n  });\n\n  test('should insert ligature glyph on single run string at middile', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 3, 4],\n        },\n      ],\n    };\n    const glyph = {\n      id: 64257,\n      advanceWidth: 0,\n      codePoints: [102, 105],\n    } as Glyph; // fi\n    const result = insertGlyph(3, glyph, string);\n\n    expect(result).toHaveProperty('string', 'lorfiem');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 7);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 114, 64257, 101, 109,\n    ]);\n  });\n\n  test('should insert glyph on single run with ligature string at beggining', () => {\n    const string = {\n      string: 'lofiem',\n      runs: [\n        {\n          start: 0,\n          end: 6,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 2, 3, 4],\n        },\n      ],\n    };\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(0, glyph, string);\n\n    expect(result).toHaveProperty('string', 'ilofiem');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 7);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      105, 76, 111, 64257, 101, 109,\n    ]);\n  });\n\n  test('should insert glyph on single run with ligature string at end', () => {\n    const string = {\n      string: 'lofiem',\n      runs: [\n        {\n          start: 0,\n          end: 6,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 2, 3, 4],\n        },\n      ],\n    };\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(6, glyph, string);\n\n    expect(result).toHaveProperty('string', 'lofiemi');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 7);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 64257, 101, 109, 105,\n    ]);\n  });\n\n  test('should insert glyph on single run with ligature string at middle', () => {\n    const string = {\n      string: 'lofiem',\n      runs: [\n        {\n          start: 0,\n          end: 6,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 2, 3, 4],\n        },\n      ],\n    };\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(4, glyph, string);\n\n    expect(result).toHaveProperty('string', 'lofiiem');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 7);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 64257, 105, 101, 109,\n    ]);\n  });\n\n  test('should insert glyph at beggining of first run of two run string', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 2,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          ] as Glyph[],\n          glyphIndices: [0, 1],\n        },\n        {\n          start: 2,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2],\n        },\n      ],\n    };\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(0, glyph, string);\n\n    expect(result).toHaveProperty('string', 'ilorem');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 3);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([105, 76, 111]);\n\n    expect(result.runs[1]).toHaveProperty('start', 3);\n    expect(result.runs[1]).toHaveProperty('end', 6);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([114, 101, 109]);\n  });\n\n  test('should insert glyph on first run of two run string', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 2,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          ] as Glyph[],\n          glyphIndices: [0, 1],\n        },\n        {\n          start: 2,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2],\n        },\n      ],\n    };\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(1, glyph, string);\n\n    expect(result).toHaveProperty('string', 'liorem');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 3);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 105, 111]);\n\n    expect(result.runs[1]).toHaveProperty('start', 3);\n    expect(result.runs[1]).toHaveProperty('end', 6);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([114, 101, 109]);\n  });\n\n  test('should insert glyph at beggining of second run of two run string', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 2,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          ] as Glyph[],\n          glyphIndices: [0, 1],\n        },\n        {\n          start: 2,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2],\n        },\n      ],\n    };\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(2, glyph, string);\n\n    expect(result).toHaveProperty('string', 'loirem');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 2);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111]);\n\n    expect(result.runs[1]).toHaveProperty('start', 2);\n    expect(result.runs[1]).toHaveProperty('end', 6);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([105, 114, 101, 109]);\n  });\n\n  test('should insert glyph on second run of two run string', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 2,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          ] as Glyph[],\n          glyphIndices: [0, 1],\n        },\n        {\n          start: 2,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2],\n        },\n      ],\n    };\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(2, glyph, string);\n\n    expect(result).toHaveProperty('string', 'loirem');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 2);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111]);\n\n    expect(result.runs[1]).toHaveProperty('start', 2);\n    expect(result.runs[1]).toHaveProperty('end', 6);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([105, 114, 101, 109]);\n  });\n\n  test('should insert ligature glyph on first run of two run string', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 2,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          ] as Glyph[],\n          glyphIndices: [0, 1],\n        },\n        {\n          start: 2,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2],\n        },\n      ],\n    };\n    const glyph = {\n      id: 64259,\n      advanceWidth: 0,\n      codePoints: [102, 102, 105],\n    } as Glyph; // ffii\n    const result = insertGlyph(1, glyph, string);\n\n    expect(result).toHaveProperty('string', 'lffiorem');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 5);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 64259, 111]);\n\n    expect(result.runs[1]).toHaveProperty('start', 5);\n    expect(result.runs[1]).toHaveProperty('end', 8);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([114, 101, 109]);\n  });\n\n  test('should insert ligature glyph on second run of two run string', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 2,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          ] as Glyph[],\n          glyphIndices: [0, 1],\n        },\n        {\n          start: 2,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2],\n        },\n      ],\n    };\n    const glyph = {\n      id: 64259,\n      advanceWidth: 0,\n      codePoints: [102, 102, 105],\n    } as Glyph; // ffii\n    const result = insertGlyph(4, glyph, string);\n\n    expect(result).toHaveProperty('string', 'loreffim');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 2);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111]);\n\n    expect(result.runs[1]).toHaveProperty('start', 2);\n    expect(result.runs[1]).toHaveProperty('end', 8);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([114, 101, 64259, 109]);\n  });\n\n  test('should insert glyph using code point number instead of Glyph object', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {\n            font: [font],\n          },\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 3, 4],\n        },\n      ],\n    };\n    const codePoint = 105; // 'i'\n    const result = insertGlyph(2, codePoint, string);\n\n    expect(result).toHaveProperty('string', 'loirem');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 6);\n  });\n\n  test('should append glyph when index is beyond string length', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 3, 4],\n        },\n      ],\n    };\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(10, glyph, string);\n\n    expect(result).toHaveProperty('string', 'loremi');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 6);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 114, 101, 109, 105,\n    ]);\n  });\n\n  test('should handle empty attributed string by appending', () => {\n    const string = empty();\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(0, glyph, string);\n\n    expect(result).toHaveProperty('string', 'i');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 1);\n  });\n\n  test('should insert glyph on three run string at middle run', () => {\n    const string = {\n      string: 'loremipsum',\n      runs: [\n        {\n          start: 0,\n          end: 3,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2],\n        },\n        {\n          start: 3,\n          end: 7,\n          attributes: {},\n          glyphs: [\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n            { id: 105, advanceWidth: 0, codePoints: [105] }, // i\n            { id: 112, advanceWidth: 0, codePoints: [112] }, // p\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 3],\n        },\n        {\n          start: 7,\n          end: 10,\n          attributes: {},\n          glyphs: [\n            { id: 115, advanceWidth: 0, codePoints: [115] }, // s\n            { id: 117, advanceWidth: 0, codePoints: [117] }, // u\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2],\n        },\n      ],\n    };\n    const glyph = { id: 120, advanceWidth: 0, codePoints: [120] } as Glyph; // x\n    const result = insertGlyph(5, glyph, string);\n\n    expect(result).toHaveProperty('string', 'loremxipsum');\n    expect(result.runs).toHaveLength(3);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 3);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 114]);\n\n    expect(result.runs[1]).toHaveProperty('start', 3);\n    expect(result.runs[1]).toHaveProperty('end', 8);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([\n      101, 109, 120, 105, 112,\n    ]);\n\n    expect(result.runs[2]).toHaveProperty('start', 8);\n    expect(result.runs[2]).toHaveProperty('end', 11);\n    expect(pluck('id', result.runs[2].glyphs!)).toEqual([115, 117, 109]);\n  });\n\n  test('should insert glyph at end of two run string', () => {\n    const string = {\n      string: 'lorem',\n      runs: [\n        {\n          start: 0,\n          end: 2,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          ] as Glyph[],\n          glyphIndices: [0, 1],\n        },\n        {\n          start: 2,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2],\n        },\n      ],\n    };\n    const glyph = { id: 105, advanceWidth: 0, codePoints: [105] } as Glyph;\n    const result = insertGlyph(5, glyph, string);\n\n    expect(result).toHaveProperty('string', 'loremi');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 2);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111]);\n\n    expect(result.runs[1]).toHaveProperty('start', 2);\n    expect(result.runs[1]).toHaveProperty('end', 6);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([114, 101, 109, 105]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/leadingOffset.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/attributedString/empty';\nimport leadingOffset from '../../src/attributedString/leadingOffset';\nimport { Glyph } from '../../src/types';\n\ndescribe('attributeString leadingOffset operator', () => {\n  test('should return zero for single run string without spaces', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n    const result = leadingOffset(string);\n\n    expect(result).toBe(0);\n  });\n\n  test('should return zero for multipe run string without spaces', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 3,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n        {\n          start: 3,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    const result = leadingOffset(string);\n\n    expect(result).toBe(0);\n  });\n\n  test('should return correct offset for single run string with spaces', () => {\n    const string = {\n      string: '  rem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    const result = leadingOffset(string);\n\n    expect(result).toBe(11);\n  });\n\n  test('should return correct offset for multiple run string with spaces', () => {\n    const string = {\n      string: '  rem',\n      runs: [\n        {\n          start: 0,\n          end: 3,\n          attributes: {},\n          glyphs: [\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n        {\n          start: 3,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    const result = leadingOffset(string);\n\n    expect(result).toBe(11);\n  });\n\n  test('should return zero for empty attributed string', () => {\n    const result = leadingOffset(empty());\n\n    expect(result).toBe(0);\n  });\n\n  test('should return correct offset for string with only spaces', () => {\n    const string = {\n      string: '   ',\n      runs: [\n        {\n          start: 0,\n          end: 3,\n          attributes: {},\n          glyphs: [\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    const result = leadingOffset(string);\n\n    expect(result).toBe(18);\n  });\n\n  test('should return correct offset for multiple runs with spaces', () => {\n    const string = {\n      string: '  rem',\n      runs: [\n        {\n          start: 0,\n          end: 2,\n          attributes: {},\n          glyphs: [\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n        {\n          start: 2,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    const result = leadingOffset(string);\n\n    expect(result).toBe(22);\n  });\n\n  test('should return correct offset for single leading space', () => {\n    const string = {\n      string: ' orem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    const result = leadingOffset(string);\n\n    expect(result).toBe(5);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/length.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/attributedString/empty';\nimport length from '../../src/attributedString/length';\n\ndescribe('attributeString length operator', () => {\n  test('should return 0 for empty string', () => {\n    expect(length(empty())).toBe(0);\n  });\n\n  test('should return correct length for attributed string', () => {\n    const string = {\n      string: '',\n      runs: [\n        { start: 2, end: 5, attributes: {} },\n        { start: 5, end: 8, attributes: {} },\n      ],\n    };\n    expect(length(string)).toBe(6);\n  });\n\n  test('should return correct length for single run', () => {\n    const string = {\n      string: '',\n      runs: [{ start: 0, end: 10, attributes: {} }],\n    };\n    expect(length(string)).toBe(10);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/prepend.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport font from '../internal/font';\nimport pluck from '../internal/pluck';\nimport empty from '../../src/attributedString/empty';\nimport prepend from '../../src/attributedString/prepend';\nimport { Glyph } from '../../src/types';\n\ndescribe('attributeString prepend operator', () => {\n  test('should return copy of string if no glyph provided', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 3, 4],\n      },\n    ];\n\n    const string = { string: 'lorem', runs };\n    const result = prepend(null, string);\n\n    expect(result).not.toBe(string);\n    expect(result).toEqual(string);\n  });\n\n  test('should prepend glyph to empty string', () => {\n    const string = empty();\n    const glyph = { id: 76, codePoints: [76], advanceWidth: 10 } as Glyph; // L\n    const result = prepend(glyph, string);\n\n    expect(result).toHaveProperty('string', 'L');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 1);\n    expect(result.runs[0].glyphIndices).toEqual([0]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76]);\n  });\n\n  test('should prepend glyph on single run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 3, 4],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lorem', runs };\n    const glyph = { id: 76, codePoints: [76], advanceWidth: 10 } as Glyph; // L\n    const result = prepend(glyph, string);\n\n    expect(result).toHaveProperty('string', 'Llorem');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 6);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 76, 111, 114, 101, 109,\n    ]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([\n      10, 5, 6, 7, 8, 9,\n    ]);\n  });\n\n  test('should prepend glyph on multiple run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2],\n        attributes: { font: [font], fontSize: 2 },\n      },\n      {\n        start: 3,\n        end: 5,\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lorem', runs };\n    const glyph = { id: 76, codePoints: [76], advanceWidth: 10 } as Glyph; // L\n    const result = prepend(glyph, string);\n\n    expect(result).toHaveProperty('string', 'Llorem');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 4);\n    expect(result.runs[1]).toHaveProperty('start', 4);\n    expect(result.runs[1]).toHaveProperty('end', 6);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 3]);\n    expect(result.runs[1].glyphIndices).toEqual([0, 1]);\n\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 76, 111, 114]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([101, 109]);\n\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([10, 5, 6, 7]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([8, 9]);\n  });\n\n  test('should prepend ligature glyph on single run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 3, 4],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lorem', runs };\n    const glyph = {\n      id: 64257,\n      codePoints: [102, 105],\n      advanceWidth: 10,\n    } as Glyph; // fi\n    const result = prepend(glyph, string);\n\n    expect(result).toHaveProperty('string', 'filorem');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 7);\n    expect(result.runs[0].glyphIndices).toEqual([0, 0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      64257, 76, 111, 114, 101, 109,\n    ]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([\n      10, 5, 6, 7, 8, 9,\n    ]);\n  });\n\n  test('should prepend ligaure glyph on multiple run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2],\n        attributes: { font: [font], fontSize: 2 },\n      },\n      {\n        start: 3,\n        end: 5,\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lorem', runs };\n    const glyph = {\n      id: 64257,\n      codePoints: [102, 105],\n      advanceWidth: 10,\n    } as Glyph; // fi\n    const result = prepend(glyph, string);\n\n    expect(result).toHaveProperty('string', 'filorem');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 5);\n    expect(result.runs[1]).toHaveProperty('start', 5);\n    expect(result.runs[1]).toHaveProperty('end', 7);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 0, 1, 2, 3]);\n    expect(result.runs[1].glyphIndices).toEqual([0, 1]);\n\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([64257, 76, 111, 114]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([101, 109]);\n\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([10, 5, 6, 7]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([8, 9]);\n  });\n\n  test('should not mutate the original string when prepending', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const originalString = { string: 'lor', runs };\n    const originalRunsLength = originalString.runs.length;\n    const originalStringValue = originalString.string;\n\n    const glyph = { id: 76, codePoints: [76], advanceWidth: 8 } as Glyph;\n    prepend(glyph, originalString);\n\n    expect(originalString.string).toBe(originalStringValue);\n    expect(originalString.runs).toHaveLength(originalRunsLength);\n  });\n\n  test('should return same string when prepending undefined', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lor', runs };\n    // @ts-expect-error - testing undefined handling\n    const result = prepend(undefined, string);\n\n    expect(result).not.toBe(string);\n    expect(result.string).toBe('lor');\n    expect(result.runs).toHaveLength(1);\n  });\n\n  test('should set correct position values when prepending glyph with advanceWidth', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 2,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lo', runs };\n    const glyph = { id: 114, codePoints: [114], advanceWidth: 10 } as Glyph; // r with advanceWidth 10\n    const result = prepend(glyph, string);\n\n    const firstPosition = result.runs[0].positions![0];\n\n    expect(firstPosition.yAdvance).toBe(0);\n    expect(firstPosition.xAdvance).toBe(10);\n    expect(firstPosition.xOffset).toBe(0);\n    expect(firstPosition.yOffset).toBe(0);\n  });\n\n  test('should prepend glyph to string with run without positions', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        glyphIndices: [0, 1, 2],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'lor', runs };\n    const glyph = { id: 101, codePoints: [101], advanceWidth: 8 } as Glyph; // e\n    const result = prepend(glyph, string);\n\n    expect(result).toHaveProperty('string', 'elor');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 4);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([101, 76, 111, 114]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/runAt.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport runAt from '../../src/attributedString/runAt';\nimport empty from '../../src/attributedString/empty';\n\nconst string = {\n  string: 'hello world',\n  runs: [\n    { start: 0, end: 6, attributes: {} }, // 'hello '\n    { start: 6, end: 12, attributes: {} }, // 'world'\n  ],\n};\n\nconst singleRunString = {\n  string: 'hello',\n  runs: [{ start: 0, end: 5, attributes: {} }],\n};\n\nconst multiRunString = {\n  string: 'hello world foo',\n  runs: [\n    { start: 0, end: 6, attributes: {} }, // 'hello '\n    { start: 6, end: 12, attributes: {} }, // 'world '\n    { start: 12, end: 15, attributes: {} }, // 'foo'\n  ],\n};\n\ndescribe('attributeString runAt operator', () => {\n  test('should get index at start of first run', () => {\n    const result = runAt(0, string);\n    expect(result).toBe(string.runs[0]);\n  });\n\n  test('should get index at end of first run', () => {\n    const result = runAt(5, string);\n    expect(result).toBe(string.runs[0]);\n  });\n\n  test('should get index at start of last run', () => {\n    const result = runAt(6, string);\n    expect(result).toBe(string.runs[1]);\n  });\n\n  test('should get index at end of last run', () => {\n    const result = runAt(11, string);\n    expect(result).toBe(string.runs[1]);\n  });\n\n  test('should get -1 at invalid index', () => {\n    const result = runAt(12, string);\n    expect(result).toBeFalsy();\n  });\n\n  test('should return undefined for empty string', () => {\n    const result = runAt(0, empty());\n    expect(result).toBeUndefined();\n  });\n\n  test('should return undefined for negative index', () => {\n    const result = runAt(-1, string);\n    expect(result).toBeUndefined();\n  });\n\n  test('should get run for single run string', () => {\n    const result = runAt(2, singleRunString);\n    expect(result).toBe(singleRunString.runs[0]);\n  });\n\n  test('should get middle run in multi-run string', () => {\n    const result = runAt(8, multiRunString);\n    expect(result).toBe(multiRunString.runs[1]);\n  });\n\n  test('should get last run in multi-run string', () => {\n    const result = runAt(13, multiRunString);\n    expect(result).toBe(multiRunString.runs[2]);\n  });\n\n  test('should get run at middle of first run', () => {\n    const result = runAt(3, string);\n    expect(result).toBe(string.runs[0]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/runIndexAt.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport runIndexAt from '../../src/attributedString/runIndexAt';\nimport empty from '../../src/attributedString/empty';\n\nconst string = {\n  string: 'hello world',\n  runs: [\n    { start: 0, end: 6, attributes: {} }, // 'hello '\n    { start: 6, end: 12, attributes: {} }, // 'world'\n  ],\n};\n\nconst singleRunString = {\n  string: 'hello',\n  runs: [{ start: 0, end: 5, attributes: {} }],\n};\n\nconst multiRunString = {\n  string: 'hello world foo',\n  runs: [\n    { start: 0, end: 6, attributes: {} }, // 'hello '\n    { start: 6, end: 12, attributes: {} }, // 'world '\n    { start: 12, end: 15, attributes: {} }, // 'foo'\n  ],\n};\n\ndescribe('attributeString runIndexAt operator', () => {\n  test('should get index at start of first run', () => {\n    const result = runIndexAt(0, string);\n    expect(result).toBe(0);\n  });\n\n  test('should get index at end of first run', () => {\n    const result = runIndexAt(5, string);\n    expect(result).toBe(0);\n  });\n\n  test('should get index at start of last run', () => {\n    const result = runIndexAt(6, string);\n    expect(result).toBe(1);\n  });\n\n  test('should get index at end of last run', () => {\n    const result = runIndexAt(11, string);\n    expect(result).toBe(1);\n  });\n\n  test('should get -1 at invalid index', () => {\n    const result = runIndexAt(12, string);\n    expect(result).toBe(-1);\n  });\n\n  test('should return -1 for empty string', () => {\n    const result = runIndexAt(0, empty());\n    expect(result).toBe(-1);\n  });\n\n  test('should return -1 for negative index', () => {\n    const result = runIndexAt(-1, string);\n    expect(result).toBe(-1);\n  });\n\n  test('should get index for single run string', () => {\n    const result = runIndexAt(2, singleRunString);\n    expect(result).toBe(0);\n  });\n\n  test('should get middle run index in multi-run string', () => {\n    const result = runIndexAt(8, multiRunString);\n    expect(result).toBe(1);\n  });\n\n  test('should get last run index in multi-run string', () => {\n    const result = runIndexAt(13, multiRunString);\n    expect(result).toBe(2);\n  });\n\n  test('should get run index at middle of first run', () => {\n    const result = runIndexAt(3, string);\n    expect(result).toBe(0);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/slice.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport font from '../internal/font';\nimport pluck from '../internal/pluck';\nimport slice from '../../src/attributedString/slice';\nimport { Glyph } from '../../src/types';\nimport empty from '../../src/attributedString/empty';\n\nconst testString = 'Lorem ipsum';\nconst testRuns = [\n  { start: 0, end: 6, attributes: { font: [] } },\n  { start: 6, end: 11, attributes: { fontSize: 16 } },\n];\n\ndescribe('attributeString slice operator', () => {\n  test('should return same attributed string when empty', () => {\n    const string = empty();\n    const sliced = slice(0, 0, string);\n\n    expect(sliced).toBe(string);\n  });\n\n  test('should slice from start of string', () => {\n    const string = { string: testString, runs: testRuns };\n    const sliced = slice(0, 5, string);\n\n    expect(sliced.string).toBe('Lorem');\n    expect(sliced.runs.length).toBe(1);\n    expect(sliced.runs[0]).toHaveProperty('start', 0);\n    expect(sliced.runs[0]).toHaveProperty('end', 5);\n    expect(sliced.runs[0]).toHaveProperty('attributes', { font: [] });\n  });\n\n  test('should slice to end of string', () => {\n    const string = { string: testString, runs: testRuns };\n    const sliced = slice(6, 11, string);\n\n    expect(sliced.string).toBe('ipsum');\n    expect(sliced.runs.length).toBe(1);\n    expect(sliced.runs[0]).toHaveProperty('start', 0);\n    expect(sliced.runs[0]).toHaveProperty('end', 5);\n    expect(sliced.runs[0]).toHaveProperty('attributes', { fontSize: 16 });\n  });\n\n  test('should slice entire string', () => {\n    const string = { string: testString, runs: testRuns };\n    const sliced = slice(0, 11, string);\n\n    expect(sliced.string).toBe('Lorem ipsum');\n    expect(sliced.runs.length).toBe(2);\n    expect(sliced.runs[0]).toHaveProperty('start', 0);\n    expect(sliced.runs[0]).toHaveProperty('end', 6);\n    expect(sliced.runs[0]).toHaveProperty('attributes', { font: [] });\n    expect(sliced.runs[1]).toHaveProperty('start', 6);\n    expect(sliced.runs[1]).toHaveProperty('end', 11);\n    expect(sliced.runs[1]).toHaveProperty('attributes', { fontSize: 16 });\n  });\n\n  test('should return empty string when start equals end', () => {\n    const string = { string: testString, runs: testRuns };\n    const sliced = slice(5, 5, string);\n\n    expect(sliced.string).toBe('');\n  });\n\n  test('should slice with one run', () => {\n    const runs = [{ start: 0, end: 11, attributes: { font: [] } }];\n    const string = { string: testString, runs };\n    const sliced = slice(2, 8, string);\n\n    expect(sliced.string).toBe('rem ip');\n    expect(sliced.runs[0]).toHaveProperty('start', 0);\n    expect(sliced.runs[0]).toHaveProperty('end', 6);\n    expect(sliced.runs[0]).toHaveProperty('attributes', { font: [] });\n  });\n\n  test('should slice with two runs', () => {\n    const string = { string: testString, runs: testRuns };\n    const splittedString = slice(2, 8, string);\n\n    expect(splittedString.string).toBe('rem ip');\n    expect(splittedString.runs[0]).toHaveProperty('start', 0);\n    expect(splittedString.runs[0]).toHaveProperty('end', 4);\n    expect(splittedString.runs[0]).toHaveProperty('attributes', { font: [] });\n    expect(splittedString.runs[1]).toHaveProperty('start', 4);\n    expect(splittedString.runs[1]).toHaveProperty('end', 6);\n    expect(splittedString.runs[1]).toHaveProperty('attributes', {\n      fontSize: 16,\n    });\n  });\n\n  test('should slice with several runs', () => {\n    const runs = [\n      { start: 0, end: 3, attributes: { font: [] } },\n      { start: 3, end: 6, attributes: { fontSize: 16 } },\n      { start: 6, end: 11, attributes: { fontSize: 20 } },\n    ];\n    const string = { string: testString, runs };\n    const splittedString = slice(2, 8, string);\n\n    expect(splittedString.string).toBe('rem ip');\n    expect(splittedString.runs[0]).toHaveProperty('start', 0);\n    expect(splittedString.runs[0]).toHaveProperty('end', 1);\n    expect(splittedString.runs[0]).toHaveProperty('attributes', { font: [] });\n    expect(splittedString.runs[1]).toHaveProperty('start', 1);\n    expect(splittedString.runs[1]).toHaveProperty('end', 4);\n    expect(splittedString.runs[1]).toHaveProperty('attributes', {\n      fontSize: 16,\n    });\n    expect(splittedString.runs[2]).toHaveProperty('start', 4);\n    expect(splittedString.runs[2]).toHaveProperty('end', 6);\n    expect(splittedString.runs[2]).toHaveProperty('attributes', {\n      fontSize: 20,\n    });\n  });\n\n  test('should ignore unnecesary leading runs when slice', () => {\n    const string = { string: testString, runs: testRuns };\n    const splittedString = slice(6, 11, string);\n\n    expect(splittedString.runs.length).toBe(1);\n    expect(splittedString.string).toBe('ipsum');\n    expect(splittedString.runs[0]).toHaveProperty('start', 0);\n    expect(splittedString.runs[0]).toHaveProperty('end', 5);\n    expect(splittedString.runs[0]).toHaveProperty('attributes', {\n      fontSize: 16,\n    });\n  });\n\n  test('should ignore unnecesary trailing runs when slice', () => {\n    const string = { string: testString, runs: testRuns };\n    const splittedString = slice(1, 6, string);\n\n    expect(splittedString.runs.length).toBe(1);\n    expect(splittedString.string).toBe('orem ');\n    expect(splittedString.runs[0]).toHaveProperty('start', 0);\n    expect(splittedString.runs[0]).toHaveProperty('end', 5);\n    expect(splittedString.runs[0]).toHaveProperty('attributes', { font: [] });\n  });\n\n  test('should slice glyphs when one run', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 3, 4],\n      },\n    ];\n\n    const string = { string: 'Lorem', runs, sylables: [] };\n    const sliced = slice(1, 4, string);\n\n    expect(sliced.runs[0].glyphIndices).toEqual([0, 1, 2]);\n    expect(pluck('id', sliced.runs[0].glyphs!)).toEqual([111, 114, 101]);\n    expect(pluck('xAdvance', sliced.runs[0].positions!)).toEqual([7, 8, 9]);\n  });\n\n  test('should slice glyphs with several runs', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2],\n      },\n      {\n        start: 3,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1],\n      },\n    ];\n    const string = { string: 'Lorem', runs };\n    const sliced = slice(1, 4, string);\n\n    expect(sliced.runs[0].glyphIndices).toEqual([0, 1]);\n    expect(pluck('id', sliced.runs[0].glyphs!)).toEqual([111, 114]);\n    expect(pluck('xAdvance', sliced.runs[0].positions!)).toEqual([7, 8]);\n\n    expect(sliced.runs[1].glyphIndices).toEqual([0]);\n    expect(pluck('id', sliced.runs[1].glyphs!)).toEqual([101]);\n    expect(pluck('xAdvance', sliced.runs[1].positions!)).toEqual([9]);\n  });\n\n  test('should slice glyphs ending on ligature', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 2, 3],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'Lofim', runs, sylables: [] };\n    const sliced = slice(1, 3, string);\n\n    expect(sliced).toHaveProperty('string', 'of');\n    expect(sliced.runs[0].glyphIndices).toEqual([0, 1]);\n    expect(pluck('id', sliced.runs[0].glyphs!)).toEqual([111, 102]);\n    expect(pluck('xAdvance', sliced.runs[0].positions!)).toEqual([7, 8]);\n  });\n\n  test('should slice glyphs starting on ligature', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 2, 3],\n        attributes: { font: [font], fontSize: 2 },\n      },\n    ];\n\n    const string = { string: 'Lofim', runs, sylables: [] };\n    const sliced = slice(3, 5, string);\n\n    expect(sliced).toHaveProperty('string', 'im');\n    expect(sliced.runs[0].glyphIndices).toEqual([0, 1]);\n    expect(pluck('id', sliced.runs[0].glyphs!)).toEqual([105, 109]);\n    expect(pluck('xAdvance', sliced.runs[0].positions!)).toEqual([8, 9]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/sliceAtOffset.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport pluck from '../internal/pluck';\nimport sliceAtOffset from '../../src/attributedString/sliceAtOffset';\nimport { Glyph } from '../../src/types';\nimport empty from '../../src/attributedString/empty';\n\ndescribe('attributeString sliceAtOffset operator', () => {\n  test('should return empty string for empty attributed string', () => {\n    const result = sliceAtOffset(10, empty());\n\n    expect(result).toHaveProperty('string', '');\n    expect(result.runs).toHaveLength(0);\n  });\n\n  test('should return empty string at zero offset', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 3, 4],\n      },\n    ];\n\n    const string = { string: 'Lorem', runs };\n    const result = sliceAtOffset(0, string);\n\n    expect(result).toHaveProperty('string', '');\n  });\n\n  test('should slice single run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 3, 4],\n      },\n    ];\n\n    const string = { string: 'Lorem', runs };\n    const result = sliceAtOffset(22, string);\n\n    expect(result).toHaveProperty('string', 'Lor');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 114]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([6, 7, 8]);\n  });\n\n  test('should slice complete single run string when exceeding offset', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n        glyphIndices: [0, 1, 2, 3, 4],\n      },\n    ];\n\n    const string = { string: 'Lorem', runs };\n    const result = sliceAtOffset(70, string);\n\n    expect(result).not.toBe(string);\n    expect(result).toEqual(string);\n  });\n\n  test('should slice single run string before ligature', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 2, 2, 3],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n    ];\n\n    const string = { string: 'Lofim', runs };\n    const result = sliceAtOffset(15, string);\n\n    expect(result).toHaveProperty('string', 'Lo');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([6, 7]);\n  });\n\n  test('should slice single run string after ligature', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 2, 2, 3],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n    ];\n\n    const string = { string: 'Lofim', runs };\n    const result = sliceAtOffset(24, string);\n\n    expect(result).toHaveProperty('string', 'Lofi');\n    expect(result.runs).toHaveLength(1);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 2]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 64257]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([6, 7, 10]);\n  });\n\n  test('should slice multiple run string', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        glyphIndices: [0, 1, 2],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n      {\n        start: 3,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1],\n        positions: [\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n    ];\n\n    const string = { string: 'Lorem', runs };\n    const result = sliceAtOffset(32, string);\n\n    expect(result).toHaveProperty('string', 'Lore');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 114]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([6, 7, 8]);\n\n    expect(result.runs[1].glyphIndices).toEqual([0]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([101]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([9]);\n  });\n\n  test('should slice complete multiple run string when exceeding offset', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 3,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        glyphIndices: [0, 1, 2],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n      {\n        start: 3,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1],\n        positions: [\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n    ];\n\n    const string = { string: 'Lorem', runs };\n    const result = sliceAtOffset(70, string);\n\n    expect(result).not.toBe(string);\n    expect(result).toEqual(string);\n  });\n\n  test('should slice multiple run string before ligature in 1st run', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 4,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 2],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n      {\n        start: 4,\n        end: 8,\n        attributes: {},\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 2],\n        positions: [\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n    ];\n\n    const string = { string: 'Lfirefim', runs };\n    const result = sliceAtOffset(7, string);\n\n    expect(result).toHaveProperty('string', 'L');\n    expect(result.runs).toHaveLength(1);\n\n    expect(result.runs[0].glyphIndices).toEqual([0]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([6]);\n  });\n\n  test('should slice multiple run string after ligature in 1st run', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 4,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 2],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n      {\n        start: 4,\n        end: 8,\n        attributes: {},\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 2],\n        positions: [\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n    ];\n\n    const string = { string: 'Lfirefim', runs };\n    const result = sliceAtOffset(17, string);\n\n    expect(result).toHaveProperty('string', 'Lfi');\n    expect(result.runs).toHaveLength(1);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 1]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 64257]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([6, 10]);\n  });\n\n  test('should slice multiple run string before ligature in 2nd run', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 4,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 2],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n      {\n        start: 4,\n        end: 8,\n        attributes: {},\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 2],\n        positions: [\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n    ];\n\n    const string = { string: 'Lfirefim', runs };\n    const result = sliceAtOffset(34, string);\n\n    expect(result).toHaveProperty('string', 'Lfire');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 1, 2]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 64257, 114]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([6, 10, 8]);\n\n    expect(result.runs[1].glyphIndices).toEqual([0]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([101]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([9]);\n  });\n\n  test('should slice multiple run string after ligature in 2nd run', () => {\n    const runs = [\n      {\n        start: 0,\n        end: 4,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 0, codePoints: [76] }, // L\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 2],\n        positions: [\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n      {\n        start: 4,\n        end: 8,\n        attributes: {},\n        glyphs: [\n          { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n          { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 2],\n        positions: [\n          { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        ],\n      },\n    ];\n\n    const string = { string: 'Lfirefim', runs };\n    const result = sliceAtOffset(44, string);\n\n    expect(result).toHaveProperty('string', 'Lfirefi');\n    expect(result.runs).toHaveLength(2);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 1, 2]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 64257, 114]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([6, 10, 8]);\n\n    expect(result.runs[1].glyphIndices).toEqual([0, 1, 1]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([101, 64257]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([9, 10]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/start.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/attributedString/empty';\nimport start from '../../src/attributedString/start';\n\ndescribe('attributeString start operator', () => {\n  test('should return 0 for empty string', () => {\n    expect(start(empty())).toBe(0);\n  });\n\n  test('should return start value for single run', () => {\n    const string = {\n      string: '',\n      runs: [{ start: 0, end: 5, attributes: {} }],\n    };\n    expect(start(string)).toBe(0);\n  });\n\n  test('should return first run start value', () => {\n    const string = {\n      string: '',\n      runs: [\n        { start: 2, end: 5, attributes: {} },\n        { start: 5, end: 8, attributes: {} },\n      ],\n    };\n    expect(start(string)).toBe(2);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/trailingOffset.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport trailingOffset from '../../src/attributedString/trailingOffset';\nimport { Glyph } from '../../src/types';\nimport empty from '../../src/attributedString/empty';\n\ndescribe('attributeString trailingOffset operator', () => {\n  test('should return zero for single run string without spaces', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n    const result = trailingOffset(string);\n\n    expect(result).toBe(0);\n  });\n\n  test('should return zero for multipe run string without spaces', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 3,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n        {\n          start: 3,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    const result = trailingOffset(string);\n\n    expect(result).toBe(0);\n  });\n\n  test('should return correct offset for single run string with spaces', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    const result = trailingOffset(string);\n\n    expect(result).toBe(17);\n  });\n\n  test('should return correct offset for multiple run string with spaces', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 3,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n        {\n          start: 3,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    const result = trailingOffset(string);\n\n    expect(result).toBe(9);\n  });\n\n  test('should return zero for empty attributed string', () => {\n    const result = trailingOffset(empty());\n\n    expect(result).toBe(0);\n  });\n\n  test('should return zero for run with no glyphs', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [] as Glyph[],\n          positions: [],\n        },\n      ],\n    };\n\n    const result = trailingOffset(string);\n\n    expect(result).toBe(0);\n  });\n\n  test('should return offset when run has only spaces', () => {\n    const string = {\n      string: '   ',\n      runs: [\n        {\n          start: 0,\n          end: 3,\n          attributes: {},\n          glyphs: [\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    const result = trailingOffset(string);\n\n    expect(result).toBe(15);\n  });\n\n  test('should return correct offset for multiple runs with spaces', () => {\n    const string = {\n      string: 'L     ',\n      runs: [\n        {\n          start: 0,\n          end: 3,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n        {\n          start: 3,\n          end: 6,\n          attributes: {},\n          glyphs: [\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n            { id: 32, advanceWidth: 0, codePoints: [32] }, // space\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n        },\n      ],\n    };\n\n    const result = trailingOffset(string);\n\n    expect(result).toBe(20);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/attributedString/trim.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/attributedString/empty';\nimport trim from '../../src/attributedString/trim';\n\ndescribe('attributeString trim operator', () => {\n  test('should handle empty string', () => {\n    const result = trim(empty());\n\n    expect(result).toHaveProperty('string', '');\n    expect(result.runs).toHaveLength(0);\n  });\n\n  test('should handle whitespace only string', () => {\n    const string = {\n      string: '   ',\n      runs: [{ start: 0, end: 3, attributes: {} }],\n    };\n    const result = trim(string);\n\n    expect(result).toHaveProperty('string', '');\n    expect(result.runs).toHaveLength(0);\n  });\n\n  test('should trim tab characters', () => {\n    const string = {\n      string: '\\t\\thello world\\t\\t',\n      runs: [{ start: 0, end: 15, attributes: {} }],\n    };\n    const result = trim(string);\n\n    expect(result).toHaveProperty('string', 'hello world');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 11);\n  });\n\n  test('should trim newline characters', () => {\n    const string = {\n      string: '\\n\\nhello world\\n\\n',\n      runs: [{ start: 0, end: 15, attributes: {} }],\n    };\n    const result = trim(string);\n\n    expect(result).toHaveProperty('string', 'hello world');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 11);\n  });\n\n  test('should remove left strips', () => {\n    const string = {\n      string: '  hello world',\n      runs: [{ start: 0, end: 13, attributes: {} }],\n    };\n    const result = trim(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toHaveProperty('string', 'hello world');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 11);\n  });\n\n  test('should remove right strips', () => {\n    const string = {\n      string: 'hello world  ',\n      runs: [{ start: 0, end: 13, attributes: {} }],\n    };\n    const result = trim(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toHaveProperty('string', 'hello world');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 11);\n  });\n\n  test('should remove both sides strips', () => {\n    const string = {\n      string: '  hello world  ',\n      runs: [{ start: 0, end: 15, attributes: {} }],\n    };\n    const result = trim(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toHaveProperty('string', 'hello world');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 11);\n  });\n\n  test('should not change trimmed string', () => {\n    const string = {\n      string: 'hello world',\n      runs: [{ start: 0, end: 11, attributes: {} }],\n    };\n    const result = trim(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toHaveProperty('string', 'hello world');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 11);\n  });\n\n  test('should trim multipe runs', () => {\n    const string = {\n      string: '  hello world  ',\n      runs: [\n        { start: 0, end: 8, attributes: {} },\n        { start: 8, end: 15, attributes: {} },\n      ],\n    };\n    const result = trim(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toHaveProperty('string', 'hello world');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 6);\n    expect(result.runs[1]).toHaveProperty('start', 6);\n    expect(result.runs[1]).toHaveProperty('end', 11);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/engines/bidi.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport bidi from '../../src/engines/bidi';\n\nconst bidiInstance = bidi();\n\ndescribe('bidi', () => {\n  test('should return string with correct bidi level for ltr', () => {\n    const result = bidiInstance({\n      string: 'English عربي English עִברִית فارسی 1234 English عربي ١٢٣٤٥',\n      runs: [\n        {\n          start: 0,\n          end: 100,\n          attributes: {\n            direction: 'ltr',\n          },\n        },\n      ],\n    });\n    expect(result.runs.length).toBe(8);\n    expect(result.runs[0].attributes.bidiLevel).toBe(0);\n    expect(result.runs[1].attributes.bidiLevel).toBe(1);\n    expect(result.runs[2].attributes.bidiLevel).toBe(0);\n    expect(result.runs[3].attributes.bidiLevel).toBe(1);\n    expect(result.runs[4].attributes.bidiLevel).toBe(2);\n    expect(result.runs[5].attributes.bidiLevel).toBe(0);\n    expect(result.runs[6].attributes.bidiLevel).toBe(1);\n    expect(result.runs[7].attributes.bidiLevel).toBe(2);\n  });\n\n  test('should return string with correct bidi level for rtl', () => {\n    const result = bidiInstance({\n      string: 'English عربي English עִברִית فارسی 1234 English عربي ١٢٣٤٥',\n      runs: [\n        {\n          start: 0,\n          end: 100,\n          attributes: {\n            direction: 'rtl',\n          },\n        },\n      ],\n    });\n    expect(result.runs.length).toBe(9);\n    expect(result.runs[0].attributes.bidiLevel).toBe(2);\n    expect(result.runs[1].attributes.bidiLevel).toBe(1);\n    expect(result.runs[2].attributes.bidiLevel).toBe(2);\n    expect(result.runs[3].attributes.bidiLevel).toBe(1);\n    expect(result.runs[4].attributes.bidiLevel).toBe(2);\n    expect(result.runs[5].attributes.bidiLevel).toBe(1);\n    expect(result.runs[6].attributes.bidiLevel).toBe(2);\n    expect(result.runs[7].attributes.bidiLevel).toBe(1);\n    expect(result.runs[8].attributes.bidiLevel).toBe(2);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/engines/fontSubstitution.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport FontStore from '@react-pdf/font';\n\nimport fontSubstitution from '../../src/engines/fontSubstitution';\n\nconst instance = fontSubstitution();\n\nconst fontStore = new FontStore();\n\ndescribe('FontSubstitution', () => {\n  test('should return empty array if no runs passed', () => {\n    const string = instance({ string: '', runs: [] });\n\n    expect(string).toHaveProperty('runs', []);\n    expect(string).toHaveProperty('string', '');\n  });\n\n  test('should merge consecutive runs with same font', () => {\n    const helvetica = fontStore.getFont({ fontFamily: 'Helvetica' }).data;\n\n    const run1 = {\n      start: 0,\n      end: 3,\n      attributes: { font: [helvetica] },\n    } as any;\n\n    const run2 = {\n      start: 3,\n      end: 5,\n      attributes: { font: [helvetica] },\n    } as any;\n\n    const string = instance({ string: 'Lorem', runs: [run1, run2] });\n\n    expect(string).toHaveProperty('string', 'Lorem');\n    expect(string.runs).toHaveLength(1);\n    expect(string.runs[0]).toHaveProperty('start', 0);\n    expect(string.runs[0]).toHaveProperty('end', 5);\n    expect(string.runs[0].attributes.font).toEqual([helvetica]);\n  });\n\n  test('should substitute many runs', () => {\n    const helvetica = fontStore.getFont({ fontFamily: 'Helvetica' }).data;\n    const helveticaBold = fontStore.getFont({\n      fontFamily: 'Helvetica',\n      fontWeight: 700,\n    }).data;\n\n    const run1 = {\n      start: 0,\n      end: 3,\n      attributes: { font: [helveticaBold] },\n    } as any;\n\n    const run2 = { start: 3, end: 5, attributes: { font: [helvetica] } } as any;\n\n    const string = instance({ string: 'Lorem', runs: [run1, run2] });\n\n    expect(string).toHaveProperty('string', 'Lorem');\n    expect(string.runs).toHaveLength(2);\n    expect(string.runs[0]).toHaveProperty('start', 0);\n    expect(string.runs[0]).toHaveProperty('end', 3);\n    expect(string.runs[0].attributes.font).toEqual([helveticaBold]);\n    expect(string.runs[1]).toHaveProperty('start', 3);\n    expect(string.runs[1]).toHaveProperty('end', 5);\n    expect(string.runs[1].attributes.font).toEqual([helvetica]);\n  });\n\n  describe('Fallback Font', () => {\n    const SimplifiedChineseFont = {\n      name: 'SimplifiedChineseFont',\n      hasGlyphForCodePoint: (codePoint) => codePoint === 20320,\n    };\n\n    test('should utilize a fallback font that supports the provided glyph', () => {\n      const helvetica = fontStore.getFont({ fontFamily: 'Helvetica' }).data;\n\n      const run = {\n        start: 0,\n        end: 1,\n        attributes: {\n          font: [helvetica, SimplifiedChineseFont],\n        },\n      } as any;\n\n      const string = instance({ string: '你', runs: [run] });\n\n      expect(string).toHaveProperty('string', '你');\n      expect(string.runs).toHaveLength(1);\n      expect(string.runs[0]).toHaveProperty('start', 0);\n      expect(string.runs[0]).toHaveProperty('end', 1);\n      expect(string.runs[0].attributes.font).toEqual([SimplifiedChineseFont]);\n    });\n\n    test('should split a run when fallback font is used on a portion of the run', () => {\n      const helvetica = fontStore.getFont({ fontFamily: 'Helvetica' }).data;\n\n      const run = {\n        start: 0,\n        end: 2,\n        attributes: {\n          font: [helvetica, SimplifiedChineseFont],\n        },\n      } as any;\n\n      const string = instance({ string: 'A你', runs: [run] });\n\n      expect(string).toHaveProperty('string', 'A你');\n      expect(string.runs).toHaveLength(2);\n      expect(string.runs[0]).toHaveProperty('start', 0);\n      expect(string.runs[0]).toHaveProperty('end', 1);\n      expect(string.runs[0].attributes.font).toEqual([helvetica]);\n      expect(string.runs[1]).toHaveProperty('start', 1);\n      expect(string.runs[1]).toHaveProperty('end', 2);\n      expect(string.runs[1].attributes.font).toEqual([SimplifiedChineseFont]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/engines/linebreaker.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport linebreakerFactory from '../../src/engines/linebreaker';\nimport applyBestFit from '../../src/engines/linebreaker/bestFit';\nimport applyKnuthPlass from '../../src/engines/linebreaker/knuthPlass';\nimport font from '../internal/font';\n\nconst width = 50;\n\ndescribe('linebreaker', () => {\n  const linebreaker = linebreakerFactory({});\n\n  test('should break lines and adds hyphens only where indicated', () => {\n    const attributedString = {\n      string: 'Potentieel broeikasgasemissierapport',\n      runs: [\n        {\n          start: 0,\n          end: 36,\n          attributes: { font: [font] },\n          glyphIndices: [\n            0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,\n            19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n          ],\n          positions: [\n            {\n              xAdvance: 11.106,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 667,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 5.004,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 278,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 5.004,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 278,\n            },\n            {\n              xAdvance: 3.9959999999999996,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 222,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 3.9959999999999996,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 222,\n            },\n            {\n              xAdvance: 5.004,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 278,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 5.994,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 333,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 3.9959999999999996,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 222,\n            },\n            {\n              xAdvance: 9,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 500,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 9,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 500,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 9,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 500,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 14.993999999999998,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 833,\n            },\n            {\n              xAdvance: 3.9959999999999996,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 222,\n            },\n            {\n              xAdvance: 9,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 500,\n            },\n            {\n              xAdvance: 9,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 500,\n            },\n            {\n              xAdvance: 3.9959999999999996,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 222,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 5.813999999999999,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 333,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 10.008,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 556,\n            },\n            {\n              xAdvance: 6.7139999999999995,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 333,\n            },\n            {\n              xAdvance: 5.004,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n              advanceWidth: 278,\n            },\n          ],\n          glyphs: [],\n          string: 'Potentieel broeikasgasemissierapport',\n        },\n      ],\n      syllables: ['Potentieel', ' ', 'broeikasgas', 'emissie', 'rapport'],\n    };\n\n    const result = linebreaker(attributedString, [10]);\n\n    expect(result.map((line) => line.string)).toEqual([\n      'Potentieel ',\n      'broeikasgas-',\n      'emissie-',\n      'rapport',\n    ]);\n  });\n});\n\ndescribe('bestFit', () => {\n  test('should return at least one breakpoint', () => {\n    const node = [\n      {\n        type: 'box' as const,\n        width: 25,\n        start: 0,\n        end: 5,\n      },\n      {\n        type: 'glue' as const,\n        width: 0,\n        stretch: 10000,\n        shrink: 0,\n        start: 5,\n        end: 6,\n      },\n      {\n        type: 'penalty' as const,\n        width: 0,\n        penalty: -10000,\n      },\n    ];\n\n    const breakpoints = applyBestFit(node, [width]);\n    expect(breakpoints.length).toBe(1);\n  });\n\n  test('should break lines when the subnode is bigger than the given widths', () => {\n    const node = [\n      {\n        type: 'box' as const,\n        width: 55,\n        start: 0,\n        end: 5,\n      },\n      {\n        type: 'glue' as const,\n        width: 5,\n        stretch: 1,\n        shrink: 1,\n        start: 5,\n        end: 6,\n      },\n      {\n        type: 'box' as const,\n        width: 55,\n        start: 6,\n        end: 11,\n      },\n      {\n        type: 'glue' as const,\n        width: 5,\n        stretch: 1,\n        shrink: 1,\n        start: 11,\n        end: 12,\n      },\n      {\n        type: 'box' as const,\n        width: 25,\n        start: 12,\n        end: 17,\n      },\n      {\n        type: 'glue' as const,\n        width: 0,\n        stretch: 10000,\n        shrink: 0,\n        start: 17,\n        end: 18,\n      },\n      {\n        type: 'penalty' as const,\n        width: 0,\n        penalty: -10000,\n      },\n    ];\n\n    const breakpoints = applyBestFit(node, [width]);\n\n    expect(breakpoints.length).toBe(3);\n  });\n\n  test('should consider the length of a potentially added hyphen when calculating breakpoints', () => {\n    const node = [\n      {\n        type: 'box' as const,\n        width: 25,\n        start: 0,\n        end: 5,\n      },\n      {\n        type: 'penalty' as const,\n        penalty: 1000,\n        width: 0,\n        stretch: 0,\n        shrink: 0,\n        start: 5,\n        end: 6,\n      },\n      {\n        type: 'box' as const,\n        width: 20,\n        start: 6,\n        end: 10,\n      },\n      {\n        type: 'penalty' as const,\n        penalty: 1000,\n        width: 6,\n        stretch: 0,\n        shrink: 0,\n        start: 10,\n        end: 11,\n      },\n      {\n        type: 'box' as const,\n        width: 25,\n        start: 11,\n        end: 15,\n      },\n      {\n        type: 'glue' as const,\n        width: 6,\n        stretch: 1,\n        shrink: 1,\n        start: 15,\n        end: 16,\n      },\n      {\n        type: 'box' as const,\n        width: 30,\n        start: 16,\n        end: 20,\n      },\n    ];\n\n    const breakpoints = applyBestFit(node, [width]);\n\n    expect(breakpoints).toEqual([0, 1, 5]);\n  });\n});\n\ndescribe('knuthPlass', () => {\n  test('should return at least one breakpoint', () => {\n    const node = [\n      {\n        type: 'box' as const,\n        width: 8,\n        start: 0,\n        end: 3,\n      }, // Lo\n      {\n        type: 'penalty' as const,\n        width: 2,\n        penalty: 100,\n      }, // -\n      {\n        type: 'box' as const,\n        width: 12,\n        start: 3,\n        end: 6,\n      }, // rem\n      {\n        type: 'glue' as const,\n        width: 4,\n        stretch: 10000,\n        shrink: 0,\n        start: 6,\n        end: 7,\n      }, // <space>\n      {\n        type: 'box' as const,\n        width: 8,\n        start: 7,\n        end: 9,\n      }, // ip\n      {\n        type: 'penalty' as const,\n        width: 2,\n        penalty: 100,\n      }, // -\n      {\n        type: 'box' as const,\n        width: 12,\n        start: 9,\n        end: 12,\n      }, // sum\n      {\n        type: 'glue' as const,\n        width: 4,\n        stretch: 10000,\n        shrink: 0,\n        start: 12,\n        end: 13,\n      }, // <space>\n      {\n        type: 'box' as const,\n        width: 8,\n        start: 13,\n        end: 15,\n      }, // do\n      {\n        type: 'penalty' as const,\n        width: 2,\n        penalty: 100,\n      }, // -\n      {\n        type: 'box' as const,\n        width: 12,\n        start: 15,\n        end: 18,\n      }, // lor\n      {\n        type: 'glue' as const,\n        width: 0,\n        stretch: 10000,\n        shrink: 0,\n        start: 18,\n        end: 18,\n      }, // KP mandatory end\n      {\n        type: 'penalty' as const,\n        width: 0,\n        penalty: -10000,\n      }, // KP mandatory end\n    ];\n\n    const breakpoints = applyKnuthPlass(node, [width]);\n    expect(breakpoints.length).toBe(3);\n    expect(breakpoints).toEqual([0, 7, 12]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/engines/scriptItemizer.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport scriptItemizer from '../../src/engines/scriptItemizer';\n\nconst instance = scriptItemizer();\n\ndescribe('scriptItemizer', () => {\n  test('should return empty array for empty string', () => {\n    const string = instance({ string: '', runs: [] });\n\n    expect(string).toHaveProperty('runs', []);\n    expect(string).toHaveProperty('string', '');\n  });\n\n  test('should return run with correct latin script', () => {\n    const string = instance({ string: 'Lorem', runs: [] });\n\n    expect(string).toHaveProperty('string', 'Lorem');\n    expect(string.runs).toHaveLength(1);\n    expect(string.runs[0]).toHaveProperty('start', 0);\n    expect(string.runs[0]).toHaveProperty('end', 5);\n    expect(string.runs[0].attributes).toHaveProperty('script', 'Latin');\n  });\n\n  test('should return run with correct non-latin script', () => {\n    const string = '្ញុំអាចញ៉ាំកញ្';\n    const value = instance({ string, runs: [] });\n\n    expect(value).toHaveProperty('string', string);\n    expect(value.runs).toHaveLength(1);\n    expect(value.runs[0]).toHaveProperty('start', 0);\n    expect(value.runs[0]).toHaveProperty('end', 14);\n    expect(value.runs[0].attributes.script).toBe('Khmer');\n  });\n\n  test('should return runs with correct script for many scripts', () => {\n    const string = '្ញុំអាចញ៉ាំកញ្Lorem';\n    const value = instance({ string, runs: [] });\n\n    expect(value).toHaveProperty('string', string);\n    expect(value.runs).toHaveLength(2);\n    expect(value.runs[0]).toHaveProperty('start', 0);\n    expect(value.runs[0]).toHaveProperty('end', 14);\n    expect(value.runs[0].attributes.script).toBe('Khmer');\n    expect(value.runs[1]).toHaveProperty('start', 14);\n    expect(value.runs[1]).toHaveProperty('end', 19);\n    expect(value.runs[1].attributes.script).toBe('Latin');\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/engines/wordHyphenation.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\n\nconst hyphenator = vi.fn((v) => {\n  if (v === '') return '';\n  if (v === 'something') return 'some\\u00adthing';\n  if (v === 'neumonia') return 'neu\\u00admo\\u00adnia';\n  if (v === 'programming') return 'pro\\u00adgram\\u00adming';\n\n  return v;\n});\n\nvi.mock('hyphen', () => ({ default: () => hyphenator }));\n\nconst wordHyphenation = (await import('../../src/engines/wordHyphenation'))\n  .default;\n\nconst instance = wordHyphenation();\n\ndescribe('wordHyphenation', () => {\n  beforeEach(() => {\n    hyphenator.mockClear();\n  });\n\n  test('should return empty array if null param', () => {\n    expect(instance(null)).toEqual([]);\n    expect(hyphenator.mock.calls).toHaveLength(0);\n  });\n\n  test('should return empty part for empty string', () => {\n    expect(instance('')).toEqual(['']);\n    expect(hyphenator.mock.calls).toHaveLength(1);\n  });\n\n  test('should hyphenate word', () => {\n    const word = 'something';\n    const parts = instance(word);\n\n    expect(parts).toHaveLength(2);\n    expect(parts[0]).toEqual('some');\n    expect(parts[1]).toEqual('thing');\n    expect(hyphenator.mock.calls).toHaveLength(1);\n  });\n\n  test('should hyphenate word in many parts', () => {\n    const word = 'neumonia';\n    const parts = instance(word);\n\n    expect(parts).toHaveLength(3);\n    expect(parts[0]).toEqual('neu');\n    expect(parts[1]).toEqual('mo');\n    expect(parts[2]).toEqual('nia');\n    expect(hyphenator.mock.calls).toHaveLength(1);\n  });\n\n  test('should hyphenate word with soft hyphen', () => {\n    const word = 'so\\u00admething';\n    const parts = instance(word);\n\n    expect(parts).toHaveLength(2);\n    expect(parts[0]).toEqual('so');\n    expect(parts[1]).toEqual('mething');\n    expect(hyphenator.mock.calls).toHaveLength(0);\n  });\n\n  test('should hyphenate word with many soft hyphen', () => {\n    const word = 'so\\u00adme\\u00adthing';\n    const parts = instance(word);\n\n    expect(parts).toHaveLength(3);\n    expect(parts[0]).toEqual('so');\n    expect(parts[1]).toEqual('me');\n    expect(parts[2]).toEqual('thing');\n    expect(hyphenator.mock.calls).toHaveLength(0);\n  });\n\n  test('should get previously hyphenated word from cache', () => {\n    const word = 'programming';\n\n    // Hyphen not called yet\n    expect(hyphenator.mock.calls).toHaveLength(0);\n\n    instance(word);\n\n    // Hyphen called once for word\n    expect(hyphenator.mock.calls).toHaveLength(1);\n\n    const parts = instance(word);\n\n    expect(parts).toHaveLength(3);\n    expect(parts[0]).toEqual('pro');\n    expect(parts[1]).toEqual('gram');\n    expect(parts[2]).toEqual('ming');\n\n    // Hyphen not called again. Got value from cache\n    expect(hyphenator.mock.calls).toHaveLength(1);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/glyph/fromCodePoint.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\nimport fromCodePoint from '../../src/glyph/fromCodePoint';\n\nconst font = {\n  glyphForCodePoint: vi.fn((x) => ({\n    id: x,\n    codePoints: [x],\n    advanceWidth: 5,\n  })),\n};\n\ndescribe('glyph fromCodePoint operator', () => {\n  beforeEach(() => {\n    font.glyphForCodePoint.mockClear();\n  });\n\n  test('should return null if no font provided', () => {\n    const result = fromCodePoint(76, null);\n\n    expect(result).toBeNull();\n  });\n\n  test('should return null if no value provided', () => {\n    const result = fromCodePoint(null, font as any);\n\n    expect(result).toBeNull();\n  });\n\n  test('should return null if font is a string', () => {\n    const result = fromCodePoint(76, 'Helvetica');\n\n    expect(result).toBeNull();\n  });\n\n  test('should return null if both font and value are null', () => {\n    const result = fromCodePoint(null, null);\n\n    expect(result).toBeNull();\n  });\n\n  test('should return null if value is zero', () => {\n    const result = fromCodePoint(0, font as any);\n\n    expect(result).toBeNull();\n  });\n\n  test('should get glyph from font', () => {\n    const result = fromCodePoint(76, font as any);\n\n    expect(result).toHaveProperty('id', 76);\n    expect(font.glyphForCodePoint.mock.calls).toHaveLength(1);\n  });\n\n  test('should get glyph for different code point', () => {\n    const result = fromCodePoint(65, font as any);\n\n    expect(result).toHaveProperty('id', 65);\n    expect(result).toHaveProperty('codePoints', [65]);\n    expect(font.glyphForCodePoint).toHaveBeenCalledWith(65);\n  });\n\n  test('should get glyph for emoji code point', () => {\n    const result = fromCodePoint(128512, font as any);\n\n    expect(result).toHaveProperty('id', 128512);\n    expect(font.glyphForCodePoint).toHaveBeenCalledWith(128512);\n  });\n\n  test('should get glyph for space code point', () => {\n    const result = fromCodePoint(32, font as any);\n\n    expect(result).toHaveProperty('id', 32);\n    expect(font.glyphForCodePoint).toHaveBeenCalledWith(32);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/glyph/isWhiteSpace.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport isWhiteSpace from '../../src/glyph/isWhiteSpace';\nimport { Glyph } from '../../src/types';\n\ndescribe('glyph isWhiteSpace operator', () => {\n  test('should return false if no glyph provided', () => {\n    const result = isWhiteSpace(null);\n\n    expect(result).toBeFalsy();\n  });\n\n  test('should return false for non white space glyph', () => {\n    const result = isWhiteSpace({\n      id: 45,\n      codePoints: [45],\n      advanceWidth: 0,\n    } as Glyph);\n\n    expect(result).toBeFalsy();\n  });\n\n  test('should return true for white space glyph', () => {\n    const result = isWhiteSpace({\n      id: 32,\n      codePoints: [32],\n      advanceWidth: 0,\n    } as Glyph);\n\n    expect(result).toBeTruthy();\n  });\n\n  test('should return true when whitespace is in multiple codePoints', () => {\n    const result = isWhiteSpace({\n      id: 100,\n      codePoints: [65, 32, 66],\n      advanceWidth: 0,\n    } as Glyph);\n\n    expect(result).toBeTruthy();\n  });\n\n  test('should return false for letter glyph', () => {\n    const result = isWhiteSpace({\n      id: 65,\n      codePoints: [65],\n      advanceWidth: 0,\n    } as Glyph);\n\n    expect(result).toBeFalsy();\n  });\n\n  test('should return false for number glyph', () => {\n    const result = isWhiteSpace({\n      id: 48,\n      codePoints: [48],\n      advanceWidth: 0,\n    } as Glyph);\n\n    expect(result).toBeFalsy();\n  });\n\n  test('should return false for tab character (code 9)', () => {\n    const result = isWhiteSpace({\n      id: 9,\n      codePoints: [9],\n      advanceWidth: 0,\n    } as Glyph);\n\n    expect(result).toBeFalsy();\n  });\n\n  test('should return false for newline character (code 10)', () => {\n    const result = isWhiteSpace({\n      id: 10,\n      codePoints: [10],\n      advanceWidth: 0,\n    } as Glyph);\n\n    expect(result).toBeFalsy();\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/glyph/slice.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport slice from '../../src/glyph/slice';\nimport font from '../internal/font';\nimport { Glyph, Font } from '../../src/types';\n\ndescribe('glyph slice operator', () => {\n  test('should return empty array for null glyph', () => {\n    const sliced = slice(0, 1, font, null as unknown as Glyph);\n\n    expect(sliced).toHaveLength(0);\n  });\n\n  test('should return empty array for undefined glyph', () => {\n    const sliced = slice(0, 1, font, undefined as unknown as Glyph);\n\n    expect(sliced).toHaveLength(0);\n  });\n\n  test('should return same glyph when no font provided', () => {\n    const glyph = { id: 76, advanceWidth: 10, codePoints: [76] } as Glyph;\n    const sliced = slice(0, 1, null as unknown as Font, glyph);\n\n    expect(sliced).toHaveLength(1);\n    expect(sliced[0]).toBe(glyph);\n  });\n\n  test('should return no glyph for empty slice', () => {\n    const glyph = { id: 76, advanceWidth: 10, codePoints: [76] } as Glyph;\n    const sliced = slice(0, 0, font, glyph);\n\n    expect(sliced).toHaveLength(0);\n  });\n\n  test('should return no glyph when start equals end', () => {\n    const glyph = { id: 76, advanceWidth: 10, codePoints: [76] } as Glyph;\n    const sliced = slice(1, 1, font, glyph);\n\n    expect(sliced).toHaveLength(0);\n  });\n\n  test('should return same glyph for exact slice', () => {\n    const glyph = { id: 76, advanceWidth: 10, codePoints: [76] } as Glyph;\n    const sliced = slice(0, 1, font, glyph);\n\n    expect(sliced).toHaveLength(1);\n    expect(sliced[0]).toHaveProperty('id', 76);\n    expect(sliced[0]).toHaveProperty('codePoints', [76]);\n  });\n\n  test('should return same ligature glyphs for exact slice', () => {\n    const glyph = {\n      id: 64257,\n      advanceWidth: 10,\n      codePoints: [102, 105],\n    } as Glyph; // fi;\n\n    const sliced = slice(0, 2, font, glyph);\n\n    expect(sliced).toHaveLength(1);\n    expect(sliced[0]).toHaveProperty('id', 64257);\n    expect(sliced[0]).toHaveProperty('codePoints', [102, 105]);\n  });\n\n  test('should return same long ligature glyphs for exact slice', () => {\n    const glyph = {\n      id: 64259,\n      advanceWidth: 10,\n      codePoints: [102, 102, 105],\n    } as Glyph; // fi;\n\n    const sliced = slice(0, 3, font, glyph);\n\n    expect(sliced).toHaveLength(1);\n    expect(sliced[0]).toHaveProperty('id', 64259);\n    expect(sliced[0]).toHaveProperty('codePoints', [102, 102, 105]);\n  });\n\n  test('should break ligature glyph in half at start', () => {\n    const glyph = {\n      id: 64257,\n      advanceWidth: 10,\n      codePoints: [102, 105],\n    } as Glyph; // fi;\n\n    const sliced = slice(0, 1, font, glyph);\n\n    expect(sliced).toHaveLength(1);\n    expect(sliced[0]).toHaveProperty('id', 102);\n    expect(sliced[0]).toHaveProperty('codePoints', [102]);\n  });\n\n  test('should break ligature glyph in half at end', () => {\n    const glyph = {\n      id: 64257,\n      advanceWidth: 10,\n      codePoints: [102, 105],\n    } as Glyph; // fi;\n\n    const sliced = slice(1, 2, font, glyph);\n\n    expect(sliced).toHaveLength(1);\n    expect(sliced[0]).toHaveProperty('id', 105);\n    expect(sliced[0]).toHaveProperty('codePoints', [105]);\n  });\n\n  test('should break long ligature glyph in 1st char at start', () => {\n    const glyph = {\n      id: 64259,\n      advanceWidth: 10,\n      codePoints: [102, 102, 105],\n    } as Glyph; // fi;\n\n    const sliced = slice(0, 1, font, glyph);\n\n    expect(sliced).toHaveLength(1);\n    expect(sliced[0]).toHaveProperty('id', 102);\n    expect(sliced[0]).toHaveProperty('codePoints', [102]);\n  });\n\n  test('should break long ligature glyph in 1st char at end', () => {\n    const glyph = {\n      id: 64259,\n      advanceWidth: 10,\n      codePoints: [102, 102, 105],\n    } as Glyph; // fi;\n\n    const sliced = slice(1, 3, font, glyph);\n\n    expect(sliced).toHaveLength(1);\n    expect(sliced[0]).toHaveProperty('id', 64257);\n    expect(sliced[0]).toHaveProperty('codePoints', [102, 105]);\n  });\n\n  test('should break long ligature glyph in 2nd char at start', () => {\n    const glyph = {\n      id: 64259,\n      advanceWidth: 10,\n      codePoints: [102, 102, 105],\n    } as Glyph; // ffi;\n\n    const sliced = slice(0, 2, font, glyph);\n\n    expect(sliced).toHaveLength(2);\n    expect(sliced[0]).toHaveProperty('id', 102);\n    expect(sliced[0]).toHaveProperty('codePoints', [102]);\n    expect(sliced[1]).toHaveProperty('id', 102);\n    expect(sliced[1]).toHaveProperty('codePoints', [102]);\n  });\n\n  test('should break long ligature glyph in 2nd char at end', () => {\n    const glyph = {\n      id: 64259,\n      advanceWidth: 10,\n      codePoints: [102, 102, 105],\n    } as Glyph; // fi;\n\n    const sliced = slice(2, 3, font, glyph);\n\n    expect(sliced).toHaveLength(1);\n    expect(sliced[0]).toHaveProperty('id', 105);\n    expect(sliced[0]).toHaveProperty('codePoints', [105]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/indices/append.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport append from '../../src/indices/append';\n\ndescribe('indices append operator', () => {\n  test('should append indices to empty string', () => {\n    const result = append(2, []);\n    expect(result).toEqual([0, 0]);\n  });\n\n  test('should return same empty array if zero passed', () => {\n    const result = append(0, []);\n    expect(result).toEqual([]);\n  });\n\n  test('should return same array if zero passed', () => {\n    const result = append(0, [0, 1, 2]);\n    expect(result).toEqual([0, 1, 2]);\n  });\n\n  test('should append correct amont of values', () => {\n    const result = append(3, [0, 1, 2, 2]);\n    expect(result).toEqual([0, 1, 2, 2, 3, 3, 3]);\n  });\n\n  test('should append single value to array', () => {\n    const result = append(1, [0, 1, 2]);\n    expect(result).toEqual([0, 1, 2, 3]);\n  });\n\n  test('should append to array with repeated values at end', () => {\n    const result = append(2, [0, 0, 1, 1]);\n    expect(result).toEqual([0, 0, 1, 1, 2, 2]);\n  });\n\n  test('should append single value to empty array', () => {\n    const result = append(1, []);\n    expect(result).toEqual([0]);\n  });\n\n  test('should append to single element array', () => {\n    const result = append(2, [0]);\n    expect(result).toEqual([0, 1, 1]);\n  });\n\n  test('should append large number of values', () => {\n    const result = append(5, [0, 1]);\n    expect(result).toEqual([0, 1, 2, 2, 2, 2, 2]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/indices/normalize.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport normalizeArray from '../../src/indices/normalize';\n\ndescribe('indices normalizeArray operator', () => {\n  test('should return empty array for empty array', () => {\n    expect(normalizeArray([])).toEqual([]);\n  });\n\n  test('should normalize consecutive numbers', () => {\n    const list = [2, 3, 4];\n\n    expect(normalizeArray(list)).toEqual([0, 1, 2]);\n  });\n\n  test('should normalize consecutive numbers starting on zero', () => {\n    const list = [0, 1, 2];\n\n    expect(normalizeArray(list)).toEqual([0, 1, 2]);\n  });\n\n  test('should normalize non-consecutive numbers', () => {\n    const list = [2, 5, 8];\n\n    expect(normalizeArray(list)).toEqual([0, 3, 6]);\n  });\n\n  test('should normalize ascending non-consecutive numbers starting on zero', () => {\n    const list = [0, 3, 8];\n\n    expect(normalizeArray(list)).toEqual([0, 3, 8]);\n  });\n\n  test('should normalize single element array', () => {\n    const list = [5];\n\n    expect(normalizeArray(list)).toEqual([0]);\n  });\n\n  test('should normalize single element zero', () => {\n    const list = [0];\n\n    expect(normalizeArray(list)).toEqual([0]);\n  });\n\n  test('should normalize negative numbers', () => {\n    const list = [-3, -2, -1];\n\n    expect(normalizeArray(list)).toEqual([0, 1, 2]);\n  });\n\n  test('should normalize mixed negative and positive numbers', () => {\n    const list = [-2, 0, 2];\n\n    expect(normalizeArray(list)).toEqual([0, 2, 4]);\n  });\n\n  test('should normalize large starting number', () => {\n    const list = [100, 101, 102];\n\n    expect(normalizeArray(list)).toEqual([0, 1, 2]);\n  });\n\n  test('should normalize array with repeated values', () => {\n    const list = [5, 5, 6, 6];\n\n    expect(normalizeArray(list)).toEqual([0, 0, 1, 1]);\n  });\n\n  test('should normalize descending numbers', () => {\n    const list = [10, 8, 6];\n\n    expect(normalizeArray(list)).toEqual([0, -2, -4]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/indices/prepend.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport prepend from '../../src/indices/prepend';\n\ndescribe('indices prepend operator', () => {\n  test('should prepend indices to empty string', () => {\n    const result = prepend(2, []);\n    expect(result).toEqual([0, 0]);\n  });\n\n  test('should return same empty array if zero passed', () => {\n    const result = prepend(0, []);\n    expect(result).toEqual([]);\n  });\n\n  test('should return same array if zero passed', () => {\n    const result = prepend(0, [0, 1, 2]);\n    expect(result).toEqual([0, 1, 2]);\n  });\n\n  test('should prepend correct amont of values', () => {\n    const result = prepend(3, [0, 1, 2, 2]);\n    expect(result).toEqual([0, 0, 0, 1, 2, 3, 3]);\n  });\n\n  test('should prepend single value to array', () => {\n    const result = prepend(1, [0, 1, 2]);\n    expect(result).toEqual([0, 1, 2, 3]);\n  });\n\n  test('should prepend single value to empty array', () => {\n    const result = prepend(1, []);\n    expect(result).toEqual([0]);\n  });\n\n  test('should prepend to single element array', () => {\n    const result = prepend(2, [0]);\n    expect(result).toEqual([0, 0, 1]);\n  });\n\n  test('should prepend to array with repeated values', () => {\n    const result = prepend(2, [0, 0, 1, 1]);\n    expect(result).toEqual([0, 0, 1, 1, 2, 2]);\n  });\n\n  test('should prepend large number of values', () => {\n    const result = prepend(5, [0, 1]);\n    expect(result).toEqual([0, 0, 0, 0, 0, 1, 2]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/indices/resolve.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport resolve from '../../src/indices/resolve';\nimport { Glyph } from '../../src/types';\n\nconst singleGlyph = { id: 1, advanceWidth: 0, codePoints: [0] } as Glyph;\n\nconst ligatureGlyph = { id: 1, advanceWidth: 0, codePoints: [0, 1] } as Glyph;\n\nconst longerLigatureGlyph = {\n  id: 1,\n  advanceWidth: 0,\n  codePoints: [0, 1, 2],\n} as Glyph;\n\ndescribe('indices resolve operator', () => {\n  test('should return empty array from empty array', () => {\n    const result = resolve([]);\n    expect(result).toEqual([]);\n  });\n\n  test('should return same indices from simple chars', () => {\n    // ex. lorem\n    const result = resolve([\n      singleGlyph,\n      singleGlyph,\n      singleGlyph,\n      singleGlyph,\n      singleGlyph,\n    ]);\n\n    expect(result).toEqual([0, 1, 2, 3, 4]);\n  });\n\n  test('should return correct glyph indices when starting with ligature', () => {\n    // ex. firem\n    const result = resolve([\n      ligatureGlyph,\n      singleGlyph,\n      singleGlyph,\n      singleGlyph,\n    ]);\n\n    expect(result).toEqual([0, 0, 1, 2, 3]);\n  });\n\n  test('should return correct glyph indices when contain ligature', () => {\n    // ex. lofim\n    const result = resolve([\n      singleGlyph,\n      singleGlyph,\n      ligatureGlyph,\n      singleGlyph,\n    ]);\n\n    expect(result).toEqual([0, 1, 2, 2, 3]);\n  });\n\n  test('should return correct glyph indices when ending in ligature', () => {\n    // ex. lorfi\n    const result = resolve([\n      singleGlyph,\n      singleGlyph,\n      singleGlyph,\n      ligatureGlyph,\n    ]);\n\n    expect(result).toEqual([0, 1, 2, 3, 3]);\n  });\n\n  test('should return correct glyph indices when starting with long ligature', () => {\n    // ex. ffirem\n    const result = resolve([\n      longerLigatureGlyph,\n      singleGlyph,\n      singleGlyph,\n      singleGlyph,\n    ]);\n\n    expect(result).toEqual([0, 0, 0, 1, 2, 3]);\n  });\n\n  test('should return correct glyph indices when contain long ligature', () => {\n    // ex. loffim\n    const result = resolve([\n      singleGlyph,\n      singleGlyph,\n      longerLigatureGlyph,\n      singleGlyph,\n    ]);\n\n    expect(result).toEqual([0, 1, 2, 2, 2, 3]);\n  });\n\n  test('should return correct glyph indices when ending in long ligature', () => {\n    // ex. lorffi\n    const result = resolve([\n      singleGlyph,\n      singleGlyph,\n      singleGlyph,\n      longerLigatureGlyph,\n    ]);\n\n    expect(result).toEqual([0, 1, 2, 3, 3, 3]);\n  });\n\n  test('should fill undefined index at start', () => {\n    // ex. lorem\n    const result = resolve([\n      undefined,\n      singleGlyph,\n      singleGlyph,\n      singleGlyph,\n      singleGlyph,\n    ]);\n\n    expect(result).toEqual([0, 1, 2, 3, 4]);\n  });\n\n  test('should fill undefined index at middle', () => {\n    // ex. lorem\n    const result = resolve([\n      singleGlyph,\n      singleGlyph,\n      undefined,\n      singleGlyph,\n      singleGlyph,\n    ]);\n\n    expect(result).toEqual([0, 1, 2, 3, 4]);\n  });\n\n  test('should fill undefined index at end', () => {\n    // ex. lorem\n    const result = resolve([\n      singleGlyph,\n      singleGlyph,\n      singleGlyph,\n      singleGlyph,\n      undefined,\n    ]);\n\n    expect(result).toEqual([0, 1, 2, 3, 4]);\n  });\n\n  test('should return indices for single glyph', () => {\n    const result = resolve([singleGlyph]);\n\n    expect(result).toEqual([0]);\n  });\n\n  test('should return indices for single ligature glyph', () => {\n    const result = resolve([ligatureGlyph]);\n\n    expect(result).toEqual([0, 0]);\n  });\n\n  test('should return indices for single long ligature glyph', () => {\n    const result = resolve([longerLigatureGlyph]);\n\n    expect(result).toEqual([0, 0, 0]);\n  });\n\n  test('should handle consecutive ligatures', () => {\n    // ex. fifi\n    const result = resolve([ligatureGlyph, ligatureGlyph]);\n\n    expect(result).toEqual([0, 0, 1, 1]);\n  });\n\n  test('should handle multiple consecutive ligatures', () => {\n    // ex. fififi\n    const result = resolve([ligatureGlyph, ligatureGlyph, ligatureGlyph]);\n\n    expect(result).toEqual([0, 0, 1, 1, 2, 2]);\n  });\n\n  test('should handle consecutive long ligatures', () => {\n    // ex. ffiffi\n    const result = resolve([longerLigatureGlyph, longerLigatureGlyph]);\n\n    expect(result).toEqual([0, 0, 0, 1, 1, 1]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/internal/bidiEngine.ts",
    "content": "import { vi } from 'vitest';\nimport { AttributedString, Run } from '../../src/types';\n\n/**\n * Test the bidi engine based on the string 'Lorem'\n * Returns emp if no runs present, or arbitrary bidi levels otherwise\n *\n *  *   L     o     r     e     m\n * |---- Level 1 ------|-- Level 2 -|\n *\n * @param attributedString\n * @return Attributed string\n */\n\nexport const bidiEngineImpl = vi.fn((attributedString: AttributedString) => {\n  const runs: Run[] =\n    attributedString.runs.length === 0\n      ? []\n      : [\n          { start: 0, end: 3, attributes: { bidiLevel: 0 } },\n          { start: 3, end: 5, attributes: { bidiLevel: 1 } },\n        ];\n\n  const res: AttributedString = Object.assign({}, attributedString, { runs });\n\n  return res;\n});\n\nconst bidiEngine = vi.fn(() => bidiEngineImpl);\n\nexport default bidiEngine;\n"
  },
  {
    "path": "packages/textkit/tests/internal/font.ts",
    "content": "import { GlyphRun } from 'fontkit';\n\nimport { Font, Glyph } from '../../src/types';\n\nconst shortLigature = { id: 64257, codePoints: [102, 105], advanceWidth: 10 };\n\nconst longLigature = {\n  id: 64259,\n  codePoints: [102, 102, 105],\n  advanceWidth: 10,\n};\n\nconst glyphForCodePoint = (v: number): Glyph => {\n  if (v === 64257) return shortLigature;\n  if (v === 64259) return longLigature;\n\n  return { id: v, codePoints: [v], advanceWidth: 8 };\n};\n\nconst glyphFromChar = (v) => glyphForCodePoint(v.codePointAt(0));\n\nconst layoutGlyphs = (v) => {\n  const splits = v.split(/(ffi|fi|.)/g);\n  const result = splits.map((s) => {\n    if (s === 'fi') return [shortLigature];\n    if (s === 'ffi') return [longLigature];\n\n    return s.split('').map(glyphFromChar);\n  });\n\n  return result.flat();\n};\n\nconst layoutPositions = (positions) => {\n  return positions.map((pos) => ({\n    xAdvance: pos.advanceWidth || 0,\n    yAdvance: 0,\n    xOffset: 0,\n    yOffset: 0,\n  }));\n};\n\nconst layoutStringIndices = (glyphs) => {\n  let counter = 0;\n  const stringIndices: number[] = [];\n\n  for (let i = 0; i < glyphs.length; i += 1) {\n    const glyph = glyphs[i];\n    stringIndices.push(counter);\n    counter += glyph.codePoints.length;\n  }\n\n  return stringIndices;\n};\n\nconst layout = (string: string): GlyphRun => {\n  const glyphs = layoutGlyphs(string);\n  const positions = layoutPositions(glyphs);\n  const stringIndices = layoutStringIndices(glyphs);\n\n  const advanceWidth = glyphs.reduce(\n    (acc: number, glyph) => acc + glyph.advanceWidth,\n    0,\n  );\n  const advanceHeight = glyphs.reduce(\n    (acc: number, glyph) => acc + glyph.advanceHeight,\n    0,\n  );\n\n  const bbox = {\n    minX: 0,\n    minY: 0,\n    maxX: 0,\n    maxY: 0,\n    width: 0,\n    height: 0,\n  };\n\n  return {\n    glyphs,\n    positions,\n    stringIndices,\n    script: 'latin',\n    language: 'en',\n    direction: 'ltr',\n    features: {},\n    advanceWidth,\n    advanceHeight,\n    bbox,\n  };\n};\n\nconst font = {\n  layout,\n  glyphForCodePoint,\n  unitsPerEm: 2,\n  ascent: 2,\n  descent: -2,\n  lineGap: 0,\n} as Font;\n\nexport default font;\n"
  },
  {
    "path": "packages/textkit/tests/internal/fontSubstitutionEngine.ts",
    "content": "import { vi } from 'vitest';\nimport { AttributedString, Run } from '../../src/types';\n\n/**\n * Test font substitution based on the string 'Lorem'\n * Returns empry if no runs present, or arbitrary font substitution otherwise\n *\n *   L     o     r     e     m\n * |- Courier -|-- Helvetica --|\n *\n * @param attributedString\n * @returns Attributed string\n */\nexport const fontSubstitutionImpl = vi.fn((attributedString) => {\n  const runs: Run[] =\n    attributedString.runs.length === 0\n      ? []\n      : [\n          { start: 0, end: 2, attributes: { fontSize: 10 } },\n          { start: 2, end: 5, attributes: { fontSize: 12 } },\n        ];\n\n  const res: AttributedString = Object.assign({}, attributedString, { runs });\n\n  return res;\n});\n\nconst fontSubstitutionEngine = vi.fn(() => fontSubstitutionImpl);\n\nexport default fontSubstitutionEngine;\n"
  },
  {
    "path": "packages/textkit/tests/internal/pluck.ts",
    "content": "const pluck = (key: string, array: any[]) => array.map((v) => v[key]);\n\nexport default pluck;\n"
  },
  {
    "path": "packages/textkit/tests/internal/scriptItemizer.ts",
    "content": "import { vi } from 'vitest';\nimport { AttributedString, Run } from '../../src/types';\n\n/**\n * Test script itemizer based on the string 'Lorem'\n * Returns empty if no runs present, or arbitrary script itemization otherwise\n *\n *   L     o     r     e     m\n * |---- Latin ----|- Non-latin-|\n *\n * @param attributedString\n * @returns attributed string\n */\nexport const scriptItemizerImpl = vi.fn(\n  (attributedString: AttributedString) => {\n    const runs: Run[] =\n      attributedString.runs.length === 0\n        ? []\n        : [\n            { start: 0, end: 3, attributes: { script: 'Latin' } },\n            { start: 3, end: 5, attributes: { script: 'Non-latin' } },\n          ];\n\n    const res: AttributedString = Object.assign({}, attributedString, { runs });\n\n    return res;\n  },\n);\n\nconst scriptItemizer = vi.fn(() => scriptItemizerImpl);\n\nexport default scriptItemizer;\n"
  },
  {
    "path": "packages/textkit/tests/layout/applyDefaultStyles.test.ts",
    "content": "/* eslint-disable vitest/expect-expect */\n\nimport { describe, expect, test } from 'vitest';\n\nimport applyDefaultStyles from '../../src/layout/applyDefaultStyles';\n\nconst applyDefaultStylesInstance = applyDefaultStyles();\n\nconst DEFAULTS = {\n  align: 'left',\n  attachment: null,\n  backgroundColor: null,\n  characterSpacing: 0,\n  color: 'black',\n  features: [],\n  fill: true,\n  font: [],\n  fontSize: 12,\n  hangingPunctuation: false,\n  hyphenationFactor: 0,\n  indent: 0,\n  justificationFactor: 1,\n  lineHeight: null,\n  lineSpacing: 0,\n  link: null,\n  marginLeft: 0,\n  marginRight: 0,\n  paddingTop: 0,\n  paragraphSpacing: 0,\n  underline: false,\n  underlineColor: 'black',\n  underlineStyle: 'solid',\n  script: null,\n  shrinkFactor: 0,\n  strike: false,\n  strikeColor: 'black',\n  strikeStyle: 'solid',\n  stroke: false,\n  verticalAlign: null,\n  wordSpacing: 0,\n  yOffset: 0,\n};\n\nconst OVERRIDES = {\n  align: 'right',\n  attachment: [],\n  backgroundColor: 'red',\n  characterSpacing: 5,\n  color: 'red',\n  features: ['test'],\n  fill: false,\n  font: { font: true },\n  fontSize: 15,\n  hangingPunctuation: true,\n  hyphenationFactor: 5,\n  indent: 5,\n  justificationFactor: 5,\n  lineHeight: 10,\n  lineSpacing: 5,\n  link: 'link',\n  marginLeft: 10,\n  marginRight: 10,\n  opacity: 0.4,\n  paddingTop: 5,\n  paragraphSpacing: 5,\n  underline: true,\n  underlineColor: 'red',\n  underlineStyle: 'dashed',\n  script: 'latin',\n  shrinkFactor: 5,\n  strike: true,\n  strikeColor: 'red',\n  strikeStyle: 'dashed',\n  stroke: true,\n  verticalAlign: 'super',\n  wordSpacing: 5,\n  yOffset: 5,\n};\n\nconst shouldDefault = (attribute, value) => () => {\n  const result = applyDefaultStylesInstance({\n    string: 'Lorem',\n    runs: [{ start: 0, end: 5, attributes: {} }],\n  });\n  expect(result.runs[0].attributes).toHaveProperty(attribute, value);\n};\n\nconst shouldOverride = (attribute, value) => () => {\n  const result = applyDefaultStylesInstance({\n    string: 'Lorem',\n    runs: [{ start: 0, end: 5, attributes: { [attribute]: value } }],\n  });\n  expect(result.runs[0].attributes).toHaveProperty(attribute, value);\n};\n\ndescribe('applyDefaultStyles', () => {\n  test('should return passed string unchanged', () => {\n    const result = applyDefaultStylesInstance({\n      string: 'Lorem',\n      runs: [],\n    });\n\n    expect(result.string).toEqual('Lorem');\n    expect(result.runs).toHaveLength(0);\n  });\n\n  // Default overrides\n  Object.keys(DEFAULTS).forEach((key) => {\n    test(\n      `should apply default ${key} to passed run`,\n      shouldDefault(key, DEFAULTS[key]),\n    );\n  });\n\n  // Overrides\n  Object.keys(OVERRIDES).forEach((key) => {\n    test(\n      `should apply ${key} to passed run`,\n      shouldOverride(key, DEFAULTS[key]),\n    );\n  });\n\n  test('should underline color get color value if not present', () => {\n    const result = applyDefaultStylesInstance({\n      string: 'Lorem',\n      runs: [{ start: 0, end: 5, attributes: { color: 'red' } }],\n    });\n\n    expect(result.runs[0].attributes).toHaveProperty('underlineColor', 'red');\n  });\n\n  test('should margin right get margin value if not present', () => {\n    const result = applyDefaultStylesInstance({\n      string: 'Lorem',\n      runs: [{ start: 0, end: 5, attributes: { margin: 5 } }],\n    });\n\n    expect(result.runs[0].attributes).toHaveProperty('marginRight', 5);\n  });\n\n  test('should margin left get margin value if not present', () => {\n    const result = applyDefaultStylesInstance({\n      string: 'Lorem',\n      runs: [{ start: 0, end: 5, attributes: { margin: 5 } }],\n    });\n\n    expect(result.runs[0].attributes).toHaveProperty('marginLeft', 5);\n  });\n\n  test('should padding top get padding value if not present', () => {\n    const result = applyDefaultStylesInstance({\n      string: 'Lorem',\n      runs: [{ start: 0, end: 5, attributes: { padding: 5 } }],\n    });\n\n    expect(result.runs[0].attributes).toHaveProperty('paddingTop', 5);\n  });\n\n  test('should opacity be zero', () => {\n    const result = applyDefaultStylesInstance({\n      string: 'Lorem',\n      runs: [{ start: 0, end: 5, attributes: { opacity: 0 } }],\n    });\n\n    expect(result.runs[0].attributes).toHaveProperty('opacity', 0);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/layout/bidiMirroring.test.ts",
    "content": "import { describe, test, expect } from 'vitest';\n\nimport bidiMirroring from '../../src/layout/bidiMirroring';\n\nconst bidiMirrorInstance = bidiMirroring();\n\nconst swapElements = (arr, firstIndex, lastIndex) => {\n  const tmp = arr;\n  [tmp[firstIndex], tmp[lastIndex]] = [tmp[lastIndex], tmp[firstIndex]];\n  return tmp;\n};\n\nconst initializeToIndex = (size) => {\n  const arr = new Array(size);\n  for (let i = 0; i < size; i += 1) {\n    arr[i] = i;\n  }\n  return arr;\n};\n\ndescribe('bidiMirroring', () => {\n  test('should mirror characters correctly', () => {\n    const word = '(Lorem)';\n    const attributedString = {\n      string: word,\n      runs: [\n        {\n          attributes: {\n            direction: 'rtl' as const,\n            bidiLevel: 1,\n          },\n          start: 0,\n          end: 7,\n          glyphs: initializeToIndex(word.length),\n          positions: initializeToIndex(word.length),\n          glyphIndices: initializeToIndex(word.length),\n        },\n      ],\n    };\n    const result = bidiMirrorInstance(attributedString);\n\n    expect(result.string).toBe(')Lorem(');\n    const expectedGlyphs = swapElements(\n      attributedString.runs[0].glyphs,\n      0,\n      attributedString.runs[0].glyphs.length - 1,\n    );\n    const expectedPositions = swapElements(\n      attributedString.runs[0].positions,\n      0,\n      attributedString.runs[0].positions.length - 1,\n    );\n\n    expect(result.runs[0].glyphs).toEqual(expectedGlyphs);\n    expect(result.runs[0].positions).toEqual(expectedPositions);\n  });\n\n  test('should not mirror any characters', () => {\n    const word = '(Lorem)';\n    const attributedString = {\n      string: word,\n      runs: [\n        {\n          attributes: {\n            direction: 'rtl' as const,\n            bidiLevel: 0,\n          },\n          start: 0,\n          end: 7,\n          glyphs: initializeToIndex(word.length),\n          positions: initializeToIndex(word.length),\n          glyphIndices: initializeToIndex(word.length),\n        },\n      ],\n    };\n    const result = bidiMirrorInstance(attributedString);\n\n    expect(result.string).toBe(word);\n    expect(result.runs[0].glyphs).toEqual(attributedString.runs[0].glyphs);\n    expect(result.runs[0].positions).toEqual(\n      attributedString.runs[0].positions,\n    );\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/layout/bidiReordering.test.ts",
    "content": "import { describe, test, expect } from 'vitest';\n\nimport bidiReordering from '../../src/layout/bidiReordering';\nimport { Glyph } from '../../src/types';\n\nconst bidiReorderingInstance = bidiReordering();\n\nconst initializeToIndex = (size: number) => {\n  const arr = new Array(size);\n  for (let i = 0; i < size; i += 1) {\n    arr[i] = i;\n  }\n  return arr;\n};\n\ndescribe('bidiReordering', () => {\n  test('should return reversed string', () => {\n    const word = 'Lorem';\n    const wordReversed = word.split('').reverse().join('');\n    const string = {\n      string: word,\n      runs: [\n        {\n          attributes: {\n            direction: 'rtl' as const,\n            bidiLevel: 1,\n          },\n          start: 0,\n          end: 5,\n          glyphs: initializeToIndex(5),\n          positions: initializeToIndex(5),\n          glyphIndices: initializeToIndex(5),\n        },\n      ],\n    };\n    const result = bidiReorderingInstance([[string]]);\n    expect(result[0][0].string).toBe(wordReversed);\n    expect(result[0][0].runs[0].glyphs).toEqual(\n      string.runs[0].glyphs.reverse(),\n    );\n    expect(result[0][0].runs[0].positions).toEqual(\n      string.runs[0].positions.reverse(),\n    );\n  });\n\n  test('should return normal string for direction ltr', () => {\n    const word = 'Lorem';\n    const string = {\n      string: word,\n      runs: [\n        {\n          attributes: {\n            direction: 'ltr' as const,\n            bidiLevel: 0,\n          },\n          start: 0,\n          end: 5,\n          glyphs: initializeToIndex(word.length),\n          positions: initializeToIndex(word.length),\n          glyphIndices: initializeToIndex(word.length),\n        },\n      ],\n    };\n    const result = bidiReorderingInstance([[string]]);\n    expect(result[0][0].string).toBe(word);\n    expect(result[0][0].runs[0].glyphs).toEqual(string.runs[0].glyphs);\n    expect(result[0][0].runs[0].positions).toEqual(string.runs[0].positions);\n  });\n\n  test('should return part of the string reversed', () => {\n    const string = {\n      string: 'Lorem ipsum',\n      runs: [\n        {\n          attributes: {\n            direction: 'ltr' as const,\n            bidiLevel: 0,\n          },\n          start: 0,\n          end: 6,\n          glyphs: initializeToIndex(6),\n          positions: initializeToIndex(6),\n          glyphIndices: initializeToIndex(6),\n        },\n        {\n          attributes: {\n            direction: 'rtl' as const,\n            bidiLevel: 1,\n          },\n          start: 6,\n          end: 11,\n          glyphs: initializeToIndex(5),\n          positions: initializeToIndex(5),\n          glyphIndices: initializeToIndex(5),\n        },\n      ],\n    };\n    const result = bidiReorderingInstance([[string]]);\n\n    expect(result[0][0].string).toBe('Lorem muspi');\n    expect(result[0][0].runs[0].glyphs).toEqual(string.runs[0].glyphs);\n    expect(result[0][0].runs[0].positions).toEqual(string.runs[0].positions);\n\n    expect(result[0][0].runs[1].glyphs).toEqual(\n      string.runs[1].glyphs.reverse(),\n    );\n    expect(result[0][0].runs[1].positions).toEqual(\n      string.runs[1].positions.reverse(),\n    );\n  });\n\n  test('should return string reversed not repeating ligatures characters', () => {\n    const string = {\n      string: 'Lore',\n      runs: [\n        {\n          attributes: {\n            direction: 'rtl' as const,\n            bidiLevel: 1,\n          },\n          start: 0,\n          end: 4,\n          glyphs: [\n            { id: 0, advanceWidth: 10, codePoints: [0], isLigature: true },\n            { id: 0, advanceWidth: 10, codePoints: [0], isLigature: true },\n            { id: 0, advanceWidth: 10, codePoints: [0], isLigature: true },\n            { id: 0, advanceWidth: 10, codePoints: [0], isLigature: true },\n          ] as Glyph[],\n          positions: [\n            { xAdvance: 0, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 0, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 0, yAdvance: 0, xOffset: 0, yOffset: 0 },\n            { xAdvance: 0, yAdvance: 0, xOffset: 0, yOffset: 0 },\n          ],\n          glyphIndices: initializeToIndex(4),\n        },\n      ],\n    };\n\n    const result = bidiReorderingInstance([[string]]);\n\n    expect(result[0][0].string).toBe('eroL');\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/layout/generateGlyphs.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport font from '../internal/font';\nimport pluck from '../internal/pluck';\nimport generateGlyphs from '../../src/layout/generateGlyphs';\n\nconst instance = generateGlyphs();\n\ndescribe('generateGlyphs', () => {\n  test('should return empty glyphs if font not provided', () => {\n    const result = instance({\n      string: 'Lorem ipsum',\n      runs: [\n        {\n          start: 0,\n          end: 11,\n          attributes: {},\n        },\n      ],\n    });\n\n    expect(result).toHaveProperty('string', 'Lorem ipsum');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 11);\n    expect(result.runs[0]).toHaveProperty('glyphs', []);\n    expect(result.runs[0]).toHaveProperty('glyphIndices', []);\n    expect(result.runs[0]).toHaveProperty('positions', []);\n  });\n\n  test('should return correctly generate simple string glyphs', () => {\n    const result = instance({\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: { font: [font], fontSize: 2 },\n        },\n      ],\n    });\n\n    expect(result).toHaveProperty('string', 'Lorem');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 5);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 3, 4]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 114, 101, 109,\n    ]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([\n      8, 8, 8, 8, 8,\n    ]);\n  });\n\n  test('should return correctly generate multi-run simple string glyphs', () => {\n    const result = instance({\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 3,\n          attributes: { font: [font], fontSize: 2 },\n        },\n        {\n          start: 3,\n          end: 5,\n          attributes: { font: [font], fontSize: 2 },\n        },\n      ],\n    });\n\n    expect(result).toHaveProperty('string', 'Lorem');\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 3);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 114]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([8, 8, 8]);\n\n    expect(result.runs[1]).toHaveProperty('start', 3);\n    expect(result.runs[1]).toHaveProperty('end', 5);\n    expect(result.runs[1].glyphIndices).toEqual([0, 1]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([101, 109]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([8, 8]);\n  });\n\n  test('should return correctly generate ligature glyphs', () => {\n    const result = instance({\n      string: 'Lofim',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: { font: [font], fontSize: 2 },\n        },\n      ],\n    });\n\n    expect(result).toHaveProperty('string', 'Lofim');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 5);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 2, 3]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 64257, 109]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([8, 8, 10, 8]);\n  });\n\n  test('should return correctly generate multi ligature glyphs', () => {\n    const result = instance({\n      string: 'Lofimffido',\n      runs: [\n        {\n          start: 0,\n          end: 10,\n          attributes: { font: [font], fontSize: 2 },\n        },\n      ],\n    });\n\n    expect(result).toHaveProperty('string', 'Lofimffido');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 10);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 2, 3, 4, 4, 4, 5, 6]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 64257, 109, 64259, 100, 111,\n    ]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([\n      8, 8, 10, 8, 10, 8, 8,\n    ]);\n  });\n\n  test('should return correctly generate multi-run breaking ligature glyphs', () => {\n    const result = instance({\n      string: 'Lofim',\n      runs: [\n        {\n          start: 0,\n          end: 3,\n          attributes: { font: [font], fontSize: 2 },\n        },\n        {\n          start: 3,\n          end: 5,\n          attributes: { font: [font], fontSize: 2 },\n        },\n      ],\n    });\n\n    expect(result).toHaveProperty('string', 'Lofim');\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 3);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 102]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([8, 8, 8]);\n\n    expect(result.runs[1]).toHaveProperty('start', 3);\n    expect(result.runs[1]).toHaveProperty('end', 5);\n    expect(result.runs[1].glyphIndices).toEqual([0, 1]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([105, 109]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([8, 8]);\n  });\n\n  test('should return correctly generate multi-run ligature glyphs', () => {\n    const result = instance({\n      string: 'Lofim',\n      runs: [\n        {\n          start: 0,\n          end: 4,\n          attributes: { font: [font], fontSize: 2 },\n        },\n        {\n          start: 4,\n          end: 5,\n          attributes: { font: [font], fontSize: 2 },\n        },\n      ],\n    });\n\n    expect(result).toHaveProperty('string', 'Lofim');\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 4);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 2]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 64257]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([8, 8, 10]);\n\n    expect(result.runs[1]).toHaveProperty('start', 4);\n    expect(result.runs[1]).toHaveProperty('end', 5);\n    expect(result.runs[1].glyphIndices).toEqual([0]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([109]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([8]);\n  });\n\n  test('should return correctly generate glyphs starting with ligature', () => {\n    const result = instance({\n      string: 'filom',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: { font: [font], fontSize: 2 },\n        },\n      ],\n    });\n\n    expect(result).toHaveProperty('string', 'filom');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 5);\n    expect(result.runs[0].glyphIndices).toEqual([0, 0, 1, 2, 3]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([64257, 108, 111, 109]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([10, 8, 8, 8]);\n  });\n\n  test('should return correctly generate glyphs breaking ligature at start', () => {\n    const result = instance({\n      string: 'filom',\n      runs: [\n        {\n          start: 0,\n          end: 1,\n          attributes: { font: [font], fontSize: 2 },\n        },\n        {\n          start: 1,\n          end: 5,\n          attributes: { font: [font], fontSize: 2 },\n        },\n      ],\n    });\n\n    expect(result).toHaveProperty('string', 'filom');\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 1);\n    expect(result.runs[0].glyphIndices).toEqual([0]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([102]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([8]);\n\n    expect(result.runs[1]).toHaveProperty('start', 1);\n    expect(result.runs[1]).toHaveProperty('end', 5);\n    expect(result.runs[1].glyphIndices).toEqual([0, 1, 2, 3]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([105, 108, 111, 109]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([8, 8, 8, 8]);\n  });\n\n  test('should return correctly generate glyphs ending with ligature', () => {\n    const result = instance({\n      string: 'Lorfi',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: { font: [font], fontSize: 2 },\n        },\n      ],\n    });\n\n    expect(result).toHaveProperty('string', 'Lorfi');\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 5);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 3, 3]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 114, 64257]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([8, 8, 8, 10]);\n  });\n\n  test('should return correctly generate glyphs breaking ligature at the end', () => {\n    const result = instance({\n      string: 'Lorfi',\n      runs: [\n        {\n          start: 0,\n          end: 4,\n          attributes: { font: [font], fontSize: 2 },\n        },\n        {\n          start: 4,\n          end: 5,\n          attributes: { font: [font], fontSize: 2 },\n        },\n      ],\n    });\n\n    expect(result).toHaveProperty('string', 'Lorfi');\n\n    expect(result.runs[0]).toHaveProperty('start', 0);\n    expect(result.runs[0]).toHaveProperty('end', 4);\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 3]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([76, 111, 114, 102]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([8, 8, 8, 8]);\n\n    expect(result.runs[1]).toHaveProperty('start', 4);\n    expect(result.runs[1]).toHaveProperty('end', 5);\n    expect(result.runs[1].glyphIndices).toEqual([0]);\n    expect(pluck('id', result.runs[1].glyphs!)).toEqual([105]);\n    expect(pluck('xAdvance', result.runs[1].positions!)).toEqual([8]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/layout/layoutParagraph.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport layoutParagraph from '../../src/layout/layoutParagraph';\n\ndescribe('layoutParagraph', () => {\n  test('should keep overflowing text in the last rect', () => {\n    const linebreaker = () => (attributedString) => [attributedString];\n\n    const layout = layoutParagraph({ linebreaker }!);\n\n    const container = {\n      excludeRects: [],\n      x: 2,\n      y: 4,\n      width: 20,\n      height: 10,\n    };\n    const paragraph = {\n      string: 'Lorem',\n      runs: [\n        { start: 0, end: 5, attributes: { lineHeight: 11, color: 'red' } },\n      ],\n    };\n\n    layout(container, paragraph);\n\n    expect(true).toBe(true);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/layout/preprocessRuns.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\nimport empty from '../../src/attributedString/empty';\nimport preprocessRuns from '../../src/layout/preprocessRuns';\nimport scriptItemizer, { scriptItemizerImpl } from '../internal/scriptItemizer';\nimport bidi, { bidiEngineImpl } from '../internal/bidiEngine';\nimport fontSubstitution, {\n  fontSubstitutionImpl,\n} from '../internal/fontSubstitutionEngine';\n\nconst preprocessor = preprocessRuns({ bidi, scriptItemizer, fontSubstitution });\n\ndescribe('preprocessRuns', () => {\n  beforeEach(() => {\n    scriptItemizerImpl.mockClear();\n    fontSubstitutionImpl.mockClear();\n    bidiEngineImpl.mockClear();\n  });\n\n  test('should call both engines with attributed string', () => {\n    const param = empty();\n\n    preprocessor(param);\n\n    expect(scriptItemizerImpl.mock.calls).toHaveLength(1);\n    expect(scriptItemizerImpl.mock.calls[0][0]).toBe(param);\n    expect(fontSubstitutionImpl.mock.calls).toHaveLength(1);\n    expect(fontSubstitutionImpl.mock.calls[0][0]).toBe(param);\n    expect(bidiEngineImpl.mock.calls).toHaveLength(1);\n    expect(bidiEngineImpl.mock.calls[0][0]).toBe(param);\n  });\n\n  test('should return empty value for null param', () => {\n    const string = preprocessor(null);\n\n    expect(string).toHaveProperty('string', '');\n    expect(string).toHaveProperty('runs', []);\n  });\n\n  test('should return empty value for empty attributed string', () => {\n    const string = preprocessor(empty());\n\n    expect(string).toHaveProperty('string', '');\n    expect(string).toHaveProperty('runs', []);\n  });\n\n  test('should return flatten runs', () => {\n    const string = preprocessor({\n      string: 'Lorem',\n      runs: [{ start: 0, end: 5, attributes: { color: 'red' } }],\n    });\n\n    expect(string).toHaveProperty('string', 'Lorem');\n    expect(string.runs).toHaveLength(3);\n\n    expect(string.runs[0]).toHaveProperty('start', 0);\n    expect(string.runs[0]).toHaveProperty('end', 2);\n    expect(string.runs[0].attributes).toHaveProperty('color', 'red');\n    expect(string.runs[0].attributes).toHaveProperty('script', 'Latin');\n    expect(string.runs[0].attributes).toHaveProperty('fontSize', 10);\n    expect(string.runs[0].attributes).toHaveProperty('bidiLevel', 0);\n\n    expect(string.runs[1]).toHaveProperty('start', 2);\n    expect(string.runs[1]).toHaveProperty('end', 3);\n    expect(string.runs[1].attributes).toHaveProperty('color', 'red');\n    expect(string.runs[1].attributes).toHaveProperty('script', 'Latin');\n    expect(string.runs[1].attributes).toHaveProperty('fontSize', 12);\n    expect(string.runs[1].attributes).toHaveProperty('bidiLevel', 0);\n\n    expect(string.runs[2]).toHaveProperty('start', 3);\n    expect(string.runs[2]).toHaveProperty('end', 5);\n    expect(string.runs[2].attributes).toHaveProperty('color', 'red');\n    expect(string.runs[2].attributes).toHaveProperty('script', 'Non-latin');\n    expect(string.runs[2].attributes).toHaveProperty('fontSize', 12);\n    expect(string.runs[2].attributes).toHaveProperty('bidiLevel', 1);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/layout/resolveAttachments.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport pluck from '../internal/pluck';\nimport resolveAttachments from '../../src/layout/resolveAttachments';\nimport { Glyph } from '../../src/types';\n\nconst instance = resolveAttachments();\n\ndescribe('resolveAttachments', () => {\n  test('should return same string if no attributes present', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 8,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // l\n            {\n              xAdvance: 7,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // o\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // r\n            {\n              xAdvance: 5,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // e\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 1, 2, 3, 4],\n        },\n      ],\n    };\n    const result = instance(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toEqual(string);\n  });\n\n  test('should return same string if no attachment present', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 8,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // l\n            {\n              xAdvance: 7,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // o\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // r\n            {\n              xAdvance: 5,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // e\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 1, 2, 3, 4],\n          attributes: { font: [] },\n        },\n      ],\n    };\n    const result = instance(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toEqual(string);\n  });\n\n  test('should return same string if no attachment code point present', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 8,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // l\n            {\n              xAdvance: 7,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // o\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // r\n            {\n              xAdvance: 5,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // e\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 1, 2, 3, 4],\n          attributes: {\n            attachment: { height: 20, width: 20, image: Buffer.from('') },\n          },\n        },\n      ],\n    };\n    const result = instance(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toEqual(string);\n  });\n\n  test('should return same string if attachment code point present but no attachment', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 8,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // l\n            {\n              xAdvance: 7,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // o\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // r\n            {\n              xAdvance: 5,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // e\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 1, 2, 3, 4],\n        },\n      ],\n    };\n    const result = instance(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toEqual(string);\n  });\n\n  test('should not mutate passed string', () => {\n    const string = {\n      string: `Lo${String.fromCodePoint(65532)}em`,\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n            { id: 65532, advanceWidth: 10, codePoints: [65532] }, // ATTACHMENT REPLACE\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 8,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // l\n            {\n              xAdvance: 7,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // o\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // ATTACHMENT REPLACE\n            {\n              xAdvance: 5,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // e\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 1, 2, 3, 4],\n          attributes: {\n            attachment: { height: 20, width: 20, image: Buffer.from('') },\n          },\n        },\n      ],\n    };\n\n    instance(string);\n\n    expect(string.runs[0].glyphIndices).toEqual([0, 1, 2, 3, 4]);\n    expect(pluck('id', string.runs[0].glyphs)).toEqual([\n      76, 111, 65532, 101, 109,\n    ]);\n    expect(pluck('xAdvance', string.runs[0].positions)).toEqual([\n      8, 7, 6, 5, 4,\n    ]);\n  });\n\n  test('should change attachment glyph position appropiately', () => {\n    const string = {\n      string: `Lo${String.fromCodePoint(65532)}em`,\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n            { id: 65532, advanceWidth: 10, codePoints: [65532] }, // ATTACHMENT REPLACE\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 8,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // l\n            {\n              xAdvance: 7,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // o\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, //  ATTACHMENT REPLACE\n            {\n              xAdvance: 5,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // e\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 1, 2, 3, 4],\n          attributes: {\n            attachment: { height: 20, width: 20, image: Buffer.from('') },\n          },\n        },\n      ],\n    };\n    const result = instance(string);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 3, 4]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 65532, 101, 109,\n    ]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([\n      8, 7, 20, 5, 4,\n    ]);\n  });\n\n  test('should change attachment glyph position appropiately when ligature is present before', () => {\n    const string = {\n      string: `Lo${String.fromCodePoint(65532)}em`,\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          glyphs: [\n            { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n            { id: 65532, advanceWidth: 10, codePoints: [65532] }, // ATTACHMENT REPLACE\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 10,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // fi\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, //  ATTACHMENT REPLACE\n            {\n              xAdvance: 5,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // e\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 0, 1, 2, 3],\n          attributes: {\n            attachment: { height: 20, width: 20, image: Buffer.from('') },\n          },\n        },\n      ],\n    };\n    const result = instance(string);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 0, 1, 2, 3]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      64257, 65532, 101, 109,\n    ]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([\n      10, 20, 5, 4,\n    ]);\n  });\n\n  test('should change attachment glyph position appropiately when ligature is present after', () => {\n    const string = {\n      string: `Lo${String.fromCodePoint(65532)}em`,\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 65532, advanceWidth: 10, codePoints: [65532] }, // ATTACHMENT REPLACE\n            { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 7,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // l\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, //  ATTACHMENT REPLACE\n            {\n              xAdvance: 10,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // fi\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 1, 2, 2, 3],\n          attributes: {\n            attachment: { height: 20, width: 20, image: Buffer.from('') },\n          },\n        },\n      ],\n    };\n    const result = instance(string);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 2, 3]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 65532, 64257, 109,\n    ]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([\n      7, 20, 10, 4,\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/layout/resolveYOffset.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport font from '../internal/font';\nimport pluck from '../internal/pluck';\nimport resolveYOffset from '../../src/layout/resolveYOffset';\nimport { Glyph } from '../../src/types';\n\nconst instance = resolveYOffset();\n\ndescribe('resolveYOffset', () => {\n  test('should return same string if no attributes present', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: {},\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 8,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // l\n            {\n              xAdvance: 7,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // o\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // r\n            {\n              xAdvance: 5,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // e\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 1, 2, 3, 4],\n        },\n      ],\n    };\n    const result = instance(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toEqual(string);\n  });\n\n  test('should return same string if no yOffset present', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 8,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // l\n            {\n              xAdvance: 7,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // o\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // r\n            {\n              xAdvance: 5,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // e\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 1, 2, 3, 4],\n          attributes: { font: [] },\n        },\n      ],\n    };\n    const result = instance(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toEqual(string);\n  });\n\n  test('should return same string if no font present', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 8,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // l\n            {\n              xAdvance: 7,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // o\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // r\n            {\n              xAdvance: 5,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // e\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 1, 2, 3, 4],\n          attributes: { yOffset: 20 },\n        },\n      ],\n    };\n    const result = instance(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toEqual(string);\n  });\n\n  test('should return same string if no positions present', () => {\n    const string = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          glyphIndices: [0, 1, 2, 3, 4],\n          attributes: { yOffset: 20, font: [font] },\n        },\n      ],\n    };\n    const result = instance(string);\n\n    expect(result).not.toBe(string);\n    expect(result).toEqual(string);\n  });\n\n  test('should not mutate passed string', () => {\n    const string = {\n      string: `Lorem`,\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 8,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // l\n            {\n              xAdvance: 7,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // o\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // r\n            {\n              xAdvance: 5,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // e\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 1, 2, 3, 4],\n          attributes: { yOffset: 20, font: [font] },\n        },\n      ],\n    };\n\n    instance(string);\n\n    expect(string.runs[0].glyphIndices).toEqual([0, 1, 2, 3, 4]);\n    expect(pluck('id', string.runs[0].glyphs)).toEqual([\n      76, 111, 114, 101, 109,\n    ]);\n    expect(pluck('xAdvance', string.runs[0].positions)).toEqual([\n      8, 7, 6, 5, 4,\n    ]);\n  });\n\n  test('should change glyph positions appropiately', () => {\n    const string = {\n      string: `Lorem`,\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          glyphs: [\n            { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n            { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n            { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n            { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n            { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n          ] as Glyph[],\n          positions: [\n            {\n              xAdvance: 8,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // l\n            {\n              xAdvance: 7,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // o\n            {\n              xAdvance: 6,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // r\n            {\n              xAdvance: 5,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // e\n            {\n              xAdvance: 4,\n              yAdvance: 0,\n              xOffset: 0,\n              yOffset: 0,\n            }, // m\n          ],\n          glyphIndices: [0, 1, 2, 3, 4],\n          attributes: { yOffset: 20, font: [font] },\n        },\n      ],\n    };\n    const result = instance(string);\n\n    expect(result.runs[0].glyphIndices).toEqual([0, 1, 2, 3, 4]);\n    expect(pluck('id', result.runs[0].glyphs!)).toEqual([\n      76, 111, 114, 101, 109,\n    ]);\n    expect(pluck('xAdvance', result.runs[0].positions!)).toEqual([\n      8, 7, 6, 5, 4,\n    ]);\n    expect(pluck('yOffset', result.runs[0].positions!)).toEqual([\n      40, 40, 40, 40, 40,\n    ]); // yOffset * font.unitsPerEm\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/layout/splitParagraphs.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport splitParagraphs from '../../src/layout/splitParagraphs';\nimport fromFragments from '../../src/attributedString/fromFragments';\n\nconst splitParagraphsInstance = splitParagraphs();\n\ndescribe('splitParagraphs', () => {\n  test('should split single paragraph', () => {\n    const string = fromFragments([{ string: 'Lorem' }]);\n    const paragraphs = splitParagraphsInstance(string);\n\n    expect(paragraphs).toHaveLength(1);\n    expect(paragraphs[0].string).toEqual('Lorem');\n  });\n\n  test('should layout break line in between fragment', () => {\n    const string = fromFragments([{ string: 'Lorem\\nipsum' }]);\n    const paragraphs = splitParagraphsInstance(string);\n\n    expect(paragraphs).toHaveLength(2);\n    expect(paragraphs[0].string).toEqual('Lorem\\n');\n    expect(paragraphs[1].string).toEqual('ipsum');\n  });\n\n  test('should split paragraph starting with break line', () => {\n    const string = fromFragments([{ string: '\\nipsum' }]);\n    const paragraphs = splitParagraphsInstance(string);\n\n    expect(paragraphs).toHaveLength(2);\n    expect(paragraphs[0].string).toEqual('\\n');\n    expect(paragraphs[1].string).toEqual('ipsum');\n  });\n\n  test('should layout paragraph starting with \\\\n on different runs', () => {\n    const string = fromFragments([{ string: '\\n' }, { string: 'Lorem' }]);\n    const paragraphs = splitParagraphsInstance(string);\n\n    expect(paragraphs).toHaveLength(2);\n    expect(paragraphs[0].string).toEqual('\\n');\n    expect(paragraphs[1].string).toEqual('Lorem');\n  });\n\n  test('should layout two consecutive break lines at the beggining of fragment', () => {\n    const string = fromFragments([{ string: '\\n\\nLorem' }]);\n    const paragraphs = splitParagraphsInstance(string);\n\n    expect(paragraphs).toHaveLength(3);\n    expect(paragraphs[0].string).toEqual('\\n');\n    expect(paragraphs[1].string).toEqual('\\n');\n    expect(paragraphs[2].string).toEqual('Lorem');\n  });\n\n  test('should layout two consecutive break lines in between fragment', () => {\n    const string = fromFragments([{ string: 'Lorem\\n\\nipsum' }]);\n    const paragraphs = splitParagraphsInstance(string);\n\n    expect(paragraphs).toHaveLength(3);\n    expect(paragraphs[0].string).toEqual('Lorem\\n');\n    expect(paragraphs[1].string).toEqual('\\n');\n    expect(paragraphs[2].string).toEqual('ipsum');\n  });\n\n  test('should ignore break line at the end of fragment', () => {\n    const string = fromFragments([{ string: 'Lorem\\n' }]);\n    const paragraphs = splitParagraphsInstance(string);\n\n    expect(paragraphs).toHaveLength(1);\n    expect(paragraphs[0].string).toEqual('Lorem\\n');\n  });\n\n  test('should layout two consecutive break lines at the end of fragment', () => {\n    const string = fromFragments([{ string: 'Lorem\\n\\n' }]);\n    const paragraphs = splitParagraphsInstance(string);\n\n    expect(paragraphs).toHaveLength(2);\n    expect(paragraphs[0].string).toEqual('Lorem\\n');\n    expect(paragraphs[1].string).toEqual('\\n');\n  });\n\n  test('should layout two consecutive break lines in different runs', () => {\n    const string = fromFragments([\n      { string: 'Lorem' },\n      { string: '\\n' },\n      { string: '\\nipsum' },\n    ]);\n    const paragraphs = splitParagraphsInstance(string);\n\n    expect(paragraphs).toHaveLength(3);\n    expect(paragraphs[0].string).toEqual('Lorem\\n');\n    expect(paragraphs[1].string).toEqual('\\n');\n    expect(paragraphs[2].string).toEqual('ipsum');\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/layout/verticalAlign.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport verticalAlignment from '../../src/layout/verticalAlign';\n\ndescribe('verticalAlign', () => {\n  test('should apply vertical alignment \"super\" to string', () => {\n    const instance = verticalAlignment();\n    const text = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: { fontSize: 12, color: 'red', verticalAlign: 'super' },\n        },\n      ],\n    };\n\n    const result = instance(text);\n\n    expect(result.runs[0].attributes).toHaveProperty('yOffset', 0.4);\n  });\n  test('should apply vertical alignment \"sub\" to string', () => {\n    const instance = verticalAlignment();\n    const text = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: { fontSize: 12, color: 'red', verticalAlign: 'sub' },\n        },\n      ],\n    };\n\n    const result = instance(text);\n\n    expect(result.runs[0].attributes).toHaveProperty('yOffset', -0.2);\n  });\n\n  test('should ignore vertical alignment value if it is not \"sub\" or \"super\"', () => {\n    const instance = verticalAlignment();\n    const text = {\n      string: 'Lorem',\n      runs: [\n        {\n          start: 0,\n          end: 5,\n          attributes: { fontSize: 12, color: 'red', verticalAlign: 'center' },\n        },\n      ],\n    };\n\n    const result = instance(text);\n\n    expect(result.runs[0].attributes).not.toHaveProperty('yOffset');\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/layout/wrapWords.test.ts",
    "content": "import { beforeEach, describe, expect, test, vi } from 'vitest';\nimport wrapWords from '../../src/layout/wrapWords';\n\nconst emptyInstance = wrapWords({}, {});\nconst wordHyphenationEngine = vi.fn((x) => [x]);\nconst defaultInstance = wrapWords(\n  { wordHyphenation: () => wordHyphenationEngine },\n  {},\n);\nconst mutateWordHyphenationEngine = vi.fn((x) => (x === ' ' ? [x] : [`${x}o`]));\nconst mutateInstance = wrapWords(\n  { wordHyphenation: () => mutateWordHyphenationEngine },\n  {},\n);\n\ndescribe('wrapWords', () => {\n  describe('when engine provided', () => {\n    beforeEach(() => {\n      wordHyphenationEngine.mockClear();\n      mutateWordHyphenationEngine.mockClear();\n    });\n\n    test('should return no syllables when empty string provided', () => {\n      const result = defaultInstance({ string: '', runs: [] });\n\n      expect(result.syllables).toEqual([]);\n      expect(result.string).toEqual('');\n      expect(wordHyphenationEngine.mock.calls).toHaveLength(0);\n    });\n\n    test('should return syllables when single run string', () => {\n      const result = defaultInstance({\n        string: 'Lorem ipsum',\n        runs: [\n          {\n            start: 0,\n            end: 11,\n            attributes: {},\n          },\n        ],\n      });\n\n      expect(result.syllables).toEqual(['Lorem', ' ', 'ipsum']);\n      expect(result.runs).toHaveLength(1);\n      expect(result.runs[0]).toHaveProperty('start', 0);\n      expect(result.runs[0]).toHaveProperty('end', 11);\n\n      expect(wordHyphenationEngine.mock.calls).toHaveLength(3);\n      expect(wordHyphenationEngine.mock.calls[0][0]).toEqual('Lorem');\n      expect(wordHyphenationEngine.mock.calls[1][0]).toEqual(' ');\n      expect(wordHyphenationEngine.mock.calls[2][0]).toEqual('ipsum');\n    });\n\n    test('should return syllables when multipe runs string', () => {\n      const result = defaultInstance({\n        string: 'Lorem ipsum',\n        runs: [\n          {\n            start: 0,\n            end: 5,\n            attributes: {},\n          },\n          {\n            start: 5,\n            end: 11,\n            attributes: {},\n          },\n        ],\n      });\n\n      expect(result.syllables).toEqual(['Lorem', ' ', 'ipsum']);\n      expect(result.runs).toHaveLength(2);\n      expect(result.runs[0]).toHaveProperty('start', 0);\n      expect(result.runs[0]).toHaveProperty('end', 5);\n      expect(result.runs[1]).toHaveProperty('start', 5);\n      expect(result.runs[1]).toHaveProperty('end', 11);\n\n      expect(wordHyphenationEngine.mock.calls).toHaveLength(3);\n      expect(wordHyphenationEngine.mock.calls[0][0]).toEqual('Lorem');\n      expect(wordHyphenationEngine.mock.calls[1][0]).toEqual(' ');\n      expect(wordHyphenationEngine.mock.calls[2][0]).toEqual('ipsum');\n    });\n\n    test('should return mutated string if engine changes string value', () => {\n      const result = mutateInstance({\n        string: 'Lorem ipsum',\n        runs: [\n          {\n            start: 0,\n            end: 11,\n            attributes: {},\n          },\n        ],\n      });\n\n      expect(result.syllables).toEqual(['Loremo', ' ', 'ipsumo']);\n      expect(result.runs).toHaveLength(1);\n      expect(result.runs[0]).toHaveProperty('start', 0);\n      expect(result.runs[0]).toHaveProperty('end', 13);\n\n      expect(mutateWordHyphenationEngine.mock.calls).toHaveLength(3);\n      expect(mutateWordHyphenationEngine.mock.calls[0][0]).toEqual('Lorem');\n      expect(mutateWordHyphenationEngine.mock.calls[1][0]).toEqual(' ');\n      expect(mutateWordHyphenationEngine.mock.calls[2][0]).toEqual('ipsum');\n    });\n  });\n\n  describe('when no engine provided', () => {\n    test('should return no syllables when empty string provided', () => {\n      const result = emptyInstance({ string: '', runs: [] });\n\n      expect(result.syllables).toEqual([]);\n      expect(result.string).toEqual('');\n    });\n\n    test('should return unhyphenated syllables when single run string', () => {\n      const result = emptyInstance({\n        string: 'Lorem ipsum',\n        runs: [\n          {\n            start: 0,\n            end: 11,\n            attributes: {},\n          },\n        ],\n      });\n\n      expect(result.syllables).toEqual(['Lorem', ' ', 'ipsum']);\n      expect(result.runs).toHaveLength(1);\n      expect(result.runs[0]).toHaveProperty('start', 0);\n      expect(result.runs[0]).toHaveProperty('end', 11);\n    });\n\n    test('should return unhyphenated syllables when multipe runs string', () => {\n      const result = emptyInstance({\n        string: 'Lorem ipsum',\n        runs: [\n          {\n            start: 0,\n            end: 5,\n            attributes: {},\n          },\n          {\n            start: 5,\n            end: 11,\n            attributes: {},\n          },\n        ],\n      });\n\n      expect(result.syllables).toEqual(['Lorem', ' ', 'ipsum']);\n      expect(result.runs).toHaveLength(2);\n      expect(result.runs[0]).toHaveProperty('start', 0);\n      expect(result.runs[0]).toHaveProperty('end', 5);\n      expect(result.runs[1]).toHaveProperty('start', 5);\n      expect(result.runs[1]).toHaveProperty('end', 11);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/rect/area.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/rect/empty';\nimport area from '../../src/rect/area';\n\ndescribe('rect area operator', () => {\n  test('should return zero if no rect provided', () => {\n    expect(area(null)).toEqual(0);\n  });\n\n  test('should return zero for empty rect', () => {\n    expect(area(empty())).toEqual(0);\n  });\n\n  test('should return rect area correctly', () => {\n    const rect = { x: 2, y: 10, width: 4, height: 8 };\n    expect(area(rect)).toEqual(32);\n  });\n\n  test('should return area for rect at origin', () => {\n    const rect = { x: 0, y: 0, width: 10, height: 5 };\n    expect(area(rect)).toEqual(50);\n  });\n\n  test('should return zero for rect with zero width', () => {\n    const rect = { x: 5, y: 5, width: 0, height: 10 };\n    expect(area(rect)).toEqual(0);\n  });\n\n  test('should return zero for rect with zero height', () => {\n    const rect = { x: 5, y: 5, width: 10, height: 0 };\n    expect(area(rect)).toEqual(0);\n  });\n\n  test('should return area for square rect', () => {\n    const rect = { x: 0, y: 0, width: 7, height: 7 };\n    expect(area(rect)).toEqual(49);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/rect/bottomLeft.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/rect/empty';\nimport bottomLeft from '../../src/rect/bottomLeft';\n\ndescribe('rect bottomLeft operator', () => {\n  test('should return zero point if no rect provided', () => {\n    const coord = bottomLeft(null);\n    expect(coord).toHaveProperty('x', 0);\n    expect(coord).toHaveProperty('y', 0);\n  });\n\n  test('should return zero point if empty rect provided', () => {\n    const coord = bottomLeft(empty());\n    expect(coord).toHaveProperty('x', 0);\n    expect(coord).toHaveProperty('y', 0);\n  });\n\n  test('should return rect bottomLeft correctly', () => {\n    const rect = { x: 2, y: 10, width: 4, height: 8 };\n    const coord = bottomLeft(rect);\n\n    expect(coord).toHaveProperty('x', 2);\n    expect(coord).toHaveProperty('y', 18);\n  });\n\n  test('should return bottomLeft for rect at origin', () => {\n    const rect = { x: 0, y: 0, width: 100, height: 50 };\n    const coord = bottomLeft(rect);\n\n    expect(coord).toHaveProperty('x', 0);\n    expect(coord).toHaveProperty('y', 50);\n  });\n\n  test('should return bottomLeft for rect with zero height', () => {\n    const rect = { x: 5, y: 10, width: 20, height: 0 };\n    const coord = bottomLeft(rect);\n\n    expect(coord).toHaveProperty('x', 5);\n    expect(coord).toHaveProperty('y', 10);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/rect/bottomRight.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/rect/empty';\nimport bottomRight from '../../src/rect/bottomRight';\n\ndescribe('rect bottomRight operator', () => {\n  test('should return zero point if no rect provided', () => {\n    const coord = bottomRight(null);\n    expect(coord).toHaveProperty('x', 0);\n    expect(coord).toHaveProperty('y', 0);\n  });\n\n  test('should return zero point if empty rect provided', () => {\n    const coord = bottomRight(empty());\n    expect(coord).toHaveProperty('x', 0);\n    expect(coord).toHaveProperty('y', 0);\n  });\n\n  test('should return rect bottomRight correctly', () => {\n    const rect = { x: 2, y: 10, width: 4, height: 8 };\n    const coord = bottomRight(rect);\n\n    expect(coord).toHaveProperty('x', 6);\n    expect(coord).toHaveProperty('y', 18);\n  });\n\n  test('should return bottomRight for rect at origin', () => {\n    const rect = { x: 0, y: 0, width: 100, height: 50 };\n    const coord = bottomRight(rect);\n\n    expect(coord).toHaveProperty('x', 100);\n    expect(coord).toHaveProperty('y', 50);\n  });\n\n  test('should return bottomRight for rect with zero dimensions', () => {\n    const rect = { x: 5, y: 10, width: 0, height: 0 };\n    const coord = bottomRight(rect);\n\n    expect(coord).toHaveProperty('x', 5);\n    expect(coord).toHaveProperty('y', 10);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/rect/copy.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport copy from '../../src/rect/copy';\n\ndescribe('rect copy operator', () => {\n  test('should create copy of rect', () => {\n    const rect = { x: 2, y: 4, width: 20, height: 10 };\n    const copied = copy(rect);\n\n    expect(copied).not.toBe(rect);\n    expect(copied).toHaveProperty('x', 2);\n    expect(copied).toHaveProperty('y', 4);\n    expect(copied).toHaveProperty('width', 20);\n    expect(copied).toHaveProperty('height', 10);\n  });\n\n  test('should not mutate original rect when copy is modified', () => {\n    const rect = { x: 2, y: 4, width: 20, height: 10 };\n    const copied = copy(rect);\n\n    copied.x = 100;\n    copied.y = 200;\n    copied.width = 300;\n    copied.height = 400;\n\n    expect(rect).toHaveProperty('x', 2);\n    expect(rect).toHaveProperty('y', 4);\n    expect(rect).toHaveProperty('width', 20);\n    expect(rect).toHaveProperty('height', 10);\n  });\n\n  test('should copy empty rect', () => {\n    const rect = { x: 0, y: 0, width: 0, height: 0 };\n    const copied = copy(rect);\n\n    expect(copied).not.toBe(rect);\n    expect(copied).toEqual({ x: 0, y: 0, width: 0, height: 0 });\n  });\n\n  test('should copy rect at origin with dimensions', () => {\n    const rect = { x: 0, y: 0, width: 100, height: 50 };\n    const copied = copy(rect);\n\n    expect(copied).not.toBe(rect);\n    expect(copied).toEqual({ x: 0, y: 0, width: 100, height: 50 });\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/rect/crop.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport crop from '../../src/rect/crop';\n\ndescribe('rect crop operator', () => {\n  test('should return full rect when cropping with height 0', () => {\n    const rect = { x: 10, y: 10, width: 90, height: 110 };\n    const result = crop(0, rect);\n\n    expect(result).toEqual({ x: 10, y: 10, width: 90, height: 110 });\n  });\n\n  test('should crop upper section correctly', () => {\n    const rect = { x: 10, y: 10, width: 90, height: 110 };\n    const result = crop(20, rect);\n\n    expect(result).toEqual({ x: 10, y: 30, width: 90, height: 90 });\n  });\n\n  test('should return empty height rect when cropping full height', () => {\n    const rect = { x: 10, y: 10, width: 90, height: 110 };\n    const result = crop(110, rect);\n\n    expect(result).toEqual({ x: 10, y: 120, width: 90, height: 0 });\n  });\n\n  test('should handle rect at origin', () => {\n    const rect = { x: 0, y: 0, width: 100, height: 50 };\n    const result = crop(25, rect);\n\n    expect(result).toEqual({ x: 0, y: 25, width: 100, height: 25 });\n  });\n\n  test('should handle cropping half the height', () => {\n    const rect = { x: 5, y: 5, width: 40, height: 100 };\n    const result = crop(50, rect);\n\n    expect(result).toEqual({ x: 5, y: 55, width: 40, height: 50 });\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/rect/empty.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/rect/empty';\n\ndescribe('rect empty operator', () => {\n  test('should return empty rect', () => {\n    const result = empty();\n\n    expect(result).toHaveProperty('x', 0);\n    expect(result).toHaveProperty('y', 0);\n    expect(result).toHaveProperty('width', 0);\n    expect(result).toHaveProperty('height', 0);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/rect/equals.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport equals from '../../src/rect/equals';\n\ndescribe('rect equals operator', () => {\n  test('should return false for different rects', () => {\n    const rectA = { x: 3, y: 6, width: 10, height: 20 };\n    const rectB = { x: 2, y: 5, width: 12, height: 218 };\n\n    expect(equals(rectA, rectB)).toBeFalsy();\n  });\n\n  test('should return true for equal rects', () => {\n    const rectA = { x: 3, y: 6, width: 10, height: 20 };\n    const rectB = { x: 3, y: 6, width: 10, height: 20 };\n\n    expect(equals(rectA, rectB)).toBeTruthy();\n  });\n\n  test('should return false when only x differs', () => {\n    const rectA = { x: 3, y: 6, width: 10, height: 20 };\n    const rectB = { x: 4, y: 6, width: 10, height: 20 };\n\n    expect(equals(rectA, rectB)).toBeFalsy();\n  });\n\n  test('should return false when only y differs', () => {\n    const rectA = { x: 3, y: 6, width: 10, height: 20 };\n    const rectB = { x: 3, y: 7, width: 10, height: 20 };\n\n    expect(equals(rectA, rectB)).toBeFalsy();\n  });\n\n  test('should return false when only width differs', () => {\n    const rectA = { x: 3, y: 6, width: 10, height: 20 };\n    const rectB = { x: 3, y: 6, width: 11, height: 20 };\n\n    expect(equals(rectA, rectB)).toBeFalsy();\n  });\n\n  test('should return false when only height differs', () => {\n    const rectA = { x: 3, y: 6, width: 10, height: 20 };\n    const rectB = { x: 3, y: 6, width: 10, height: 21 };\n\n    expect(equals(rectA, rectB)).toBeFalsy();\n  });\n\n  test('should return true for two empty rects at origin', () => {\n    const rectA = { x: 0, y: 0, width: 0, height: 0 };\n    const rectB = { x: 0, y: 0, width: 0, height: 0 };\n\n    expect(equals(rectA, rectB)).toBeTruthy();\n  });\n\n  test('should return true when comparing same rect reference', () => {\n    const rect = { x: 3, y: 6, width: 10, height: 20 };\n\n    expect(equals(rect, rect)).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/rect/intersects.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport intersects from '../../src/rect/intersects';\n\ndescribe('rect intersects operator', () => {\n  test('should not intesect on top-left corner', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 0, y: 0, width: 30, height: 30 };\n\n    expect(intersects(a, b)).toEqual(false);\n  });\n\n  test('should intesect on top-left corner', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 0, y: 0, width: 60, height: 60 };\n\n    expect(intersects(a, b)).toEqual(true);\n  });\n\n  test('should not intesect on top edge', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 50, y: 0, width: 30, height: 30 };\n\n    expect(intersects(a, b)).toEqual(false);\n  });\n\n  test('should intesect on top edge', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 50, y: 0, width: 30, height: 60 };\n\n    expect(intersects(a, b)).toEqual(true);\n  });\n\n  test('should not intesect on top-right corner', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 150, y: 0, width: 50, height: 50 };\n\n    expect(intersects(a, b)).toEqual(false);\n  });\n\n  test('should intesect on top-right corner', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 70, y: 0, width: 50, height: 50 };\n\n    expect(intersects(a, b)).toEqual(true);\n  });\n\n  test('should not intesect on right edge', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 150, y: 40, width: 30, height: 30 };\n\n    expect(intersects(a, b)).toEqual(false);\n  });\n\n  test('should intesect on right edge', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 130, y: 40, width: 30, height: 30 };\n\n    expect(intersects(a, b)).toEqual(true);\n  });\n\n  test('should not intesect on bottom-right corner', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 150, y: 170, width: 50, height: 50 };\n\n    expect(intersects(a, b)).toEqual(false);\n  });\n\n  test('should intesect on bottom-right corner', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 70, y: 120, width: 50, height: 50 };\n\n    expect(intersects(a, b)).toEqual(true);\n  });\n\n  test('should not intesect on bottom edge', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 70, y: 180, width: 30, height: 30 };\n\n    expect(intersects(a, b)).toEqual(false);\n  });\n\n  test('should intesect on bottom edge', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 70, y: 100, width: 30, height: 30 };\n\n    expect(intersects(a, b)).toEqual(true);\n  });\n\n  test('should not intesect on bottom-left corner', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 0, y: 170, width: 50, height: 50 };\n\n    expect(intersects(a, b)).toEqual(false);\n  });\n\n  test('should intesect on bottom-left corner', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 0, y: 120, width: 50, height: 50 };\n\n    expect(intersects(a, b)).toEqual(true);\n  });\n\n  test('should not intesect on left edge', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 0, y: 60, width: 30, height: 30 };\n\n    expect(intersects(a, b)).toEqual(false);\n  });\n\n  test('should intesect on left edge', () => {\n    const a = { x: 50, y: 50, width: 90, height: 110 };\n    const b = { x: 30, y: 60, width: 30, height: 30 };\n\n    expect(intersects(a, b)).toEqual(true);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/rect/maxX.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/rect/empty';\nimport maxX from '../../src/rect/maxX';\n\ndescribe('rect maxX operator', () => {\n  test('should return zero if no rect provided', () => {\n    expect(maxX(null)).toBe(0);\n  });\n\n  test('should return zero if empty rect provided', () => {\n    expect(maxX(empty())).toBe(0);\n  });\n\n  test('should return rect maxX correctly', () => {\n    const rect = { x: 2, y: 10, width: 4, height: 8 };\n    expect(maxX(rect)).toBe(6);\n  });\n\n  test('should return maxX for rect at origin', () => {\n    const rect = { x: 0, y: 0, width: 100, height: 50 };\n    expect(maxX(rect)).toBe(100);\n  });\n\n  test('should return x for rect with zero width', () => {\n    const rect = { x: 15, y: 10, width: 0, height: 20 };\n    expect(maxX(rect)).toBe(15);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/rect/maxY.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/rect/empty';\nimport maxY from '../../src/rect/maxY';\n\ndescribe('rect maxY operator', () => {\n  test('should return zero if no rect provided', () => {\n    expect(maxY(null)).toBe(0);\n  });\n\n  test('should return zero if empty rect provided', () => {\n    expect(maxY(empty())).toBe(0);\n  });\n\n  test('should return rect maxY correctly', () => {\n    const rect = { x: 2, y: 10, width: 4, height: 8 };\n    expect(maxY(rect)).toBe(18);\n  });\n\n  test('should return maxY for rect at origin', () => {\n    const rect = { x: 0, y: 0, width: 100, height: 50 };\n    expect(maxY(rect)).toBe(50);\n  });\n\n  test('should return y for rect with zero height', () => {\n    const rect = { x: 10, y: 25, width: 20, height: 0 };\n    expect(maxY(rect)).toBe(25);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/rect/partition.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport partition from '../../src/rect/partition';\n\ndescribe('rect partition operator', () => {\n  test('should return empty rect if height 0', () => {\n    const target = { x: 10, y: 10, width: 90, height: 110 };\n    const result = partition(target, 0);\n\n    expect(result).toEqual([\n      { x: 10, y: 10, width: 90, height: 0 },\n      { x: 10, y: 10, width: 90, height: 110 },\n    ]);\n  });\n\n  test('should return correct partition', () => {\n    const target = { x: 10, y: 10, width: 90, height: 110 };\n    const result = partition(target, 20);\n\n    expect(result).toEqual([\n      { x: 10, y: 10, width: 90, height: 20 },\n      { x: 10, y: 30, width: 90, height: 90 },\n    ]);\n  });\n\n  test('should return full rect in second partition when height equals rect height', () => {\n    const target = { x: 10, y: 10, width: 90, height: 110 };\n    const result = partition(target, 110);\n\n    expect(result).toEqual([\n      { x: 10, y: 10, width: 90, height: 110 },\n      { x: 10, y: 120, width: 90, height: 0 },\n    ]);\n  });\n\n  test('should handle rect at origin', () => {\n    const target = { x: 0, y: 0, width: 100, height: 50 };\n    const result = partition(target, 25);\n\n    expect(result).toEqual([\n      { x: 0, y: 0, width: 100, height: 25 },\n      { x: 0, y: 25, width: 100, height: 25 },\n    ]);\n  });\n\n  test('should partition at half height', () => {\n    const target = { x: 5, y: 5, width: 40, height: 100 };\n    const result = partition(target, 50);\n\n    expect(result).toEqual([\n      { x: 5, y: 5, width: 40, height: 50 },\n      { x: 5, y: 55, width: 40, height: 50 },\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/add.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport add from '../../src/run/add';\n\ndescribe('run add operator', () => {\n  test('should return equal run if 0', () => {\n    const attributes = { font: [] };\n    const run = {\n      start: 5,\n      end: 15,\n      attributes,\n      glyphIndices: [],\n      glyphs: [],\n      positions: [],\n    };\n    const added = add(0, run);\n\n    expect(added).not.toBe(run);\n    expect(added).toHaveProperty('start', 5);\n    expect(added).toHaveProperty('end', 15);\n    expect(added).toHaveProperty('attributes', attributes);\n  });\n\n  test('should return added run', () => {\n    const attributes = { font: [] };\n    const run = {\n      start: 5,\n      end: 15,\n      attributes,\n      glyphIndices: [],\n      glyphs: [],\n      positions: [],\n    };\n    const added = add(5, run);\n\n    expect(added).not.toBe(run);\n    expect(added).toHaveProperty('start', 10);\n    expect(added).toHaveProperty('end', 20);\n    expect(added).toHaveProperty('attributes', attributes);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/advanceWidth.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport advanceWidth from '../../src/run/advanceWidth';\n\ndescribe('run advanceWidth operator', () => {\n  test('should return 0 if positions not present', () => {\n    const run = {\n      start: 5,\n      end: 15,\n      attributes: {},\n    };\n\n    expect(advanceWidth(run)).toBe(0);\n  });\n\n  test('should return 0 if positions empty', () => {\n    const run = {\n      start: 5,\n      end: 15,\n      attributes: {},\n    };\n\n    expect(advanceWidth(run)).toBe(0);\n  });\n\n  test('should sum up positions values', () => {\n    const positions = [\n      { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n    ];\n    const run = {\n      start: 5,\n      end: 15,\n      attributes: {},\n      positions,\n      glyphs: [],\n      glyphIndices: [],\n    };\n\n    expect(advanceWidth(run)).toBe(30);\n  });\n\n  test('should ignore invalid positions', () => {\n    const positions = [\n      { xAdvance: 5 },\n      { xAdvance: 10 },\n      { xAdvance: 15 },\n      { someAdvance: 15 },\n    ];\n    const run = {\n      start: 5,\n      end: 15,\n      attributes: {},\n      positions,\n      glyphs: [],\n      glyphIndices: [],\n    };\n\n    // @ts-expect-error - intentionally invalid argument\n    expect(advanceWidth(run)).toBe(30);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/advanceWidthBetween.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport advanceWidthBetween from '../../src/run/advanceWidthBetween';\n\ndescribe('run advanceWidthBetween operator', () => {\n  test('should return 0 if positions not present', () => {\n    const run = { start: 5, end: 15, attributes: {} };\n\n    expect(advanceWidthBetween(8, 10, run)).toBe(0);\n  });\n\n  test('should return 0 if positions empty', () => {\n    const run = { start: 5, end: 15, attributes: {}, positions: [] };\n\n    expect(advanceWidthBetween(8, 10, run)).toBe(0);\n  });\n\n  test('should return 0 for leading start and end', () => {\n    const run = {\n      start: 5,\n      end: 10,\n      attributes: {},\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 17, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 18, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n\n    expect(advanceWidthBetween(1, 2, run)).toBe(0);\n  });\n\n  test('should return 0 for trailing start and end', () => {\n    const run = {\n      start: 5,\n      end: 10,\n      attributes: {},\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 17, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 18, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n\n    expect(advanceWidthBetween(10, 15, run)).toBe(0);\n  });\n\n  test('should return correct width when leading start', () => {\n    const run = {\n      start: 5,\n      end: 10,\n      attributes: {},\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 17, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 18, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n\n    expect(advanceWidthBetween(3, 7, run)).toBe(15);\n  });\n\n  test('should return correct width when trailing end', () => {\n    const run = {\n      start: 5,\n      end: 10,\n      attributes: {},\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 17, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 18, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n\n    expect(advanceWidthBetween(8, 15, run)).toBe(35);\n  });\n\n  test('should return correct width when leading start and trailing end', () => {\n    const run = {\n      start: 5,\n      end: 10,\n      attributes: {},\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 17, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 18, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n\n    expect(advanceWidthBetween(3, 15, run)).toBe(65);\n  });\n\n  test('should sum up positions values', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 17, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 18, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n\n    expect(advanceWidthBetween(1, 4, run)).toBe(42);\n  });\n\n  test('should sum up positions values when not starting on zero', () => {\n    const positions = [\n      { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      { xAdvance: 15, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      { xAdvance: 17, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      { xAdvance: 18, yAdvance: 0, xOffset: 0, yOffset: 0 },\n    ];\n    const run = { start: 5, end: 10, attributes: {}, positions };\n\n    expect(advanceWidthBetween(7, 9, run)).toBe(32);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/append.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport font from '../internal/font';\nimport pluck from '../internal/pluck';\nimport append from '../../src/run/append';\nimport { Glyph } from '../../src/types';\n\ndescribe('run append glyph operator', () => {\n  test('should return same run if no glyph provided', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n    };\n\n    const result = append(null, run);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 5);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 114, 101, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9]);\n  });\n\n  test('should append glyph at run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = { id: 105, codePoints: [105], advanceWidth: 10 } as Glyph; // i\n    const result = append(glyph, run);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 6);\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 114, 101, 109, 105]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9, 10]);\n  });\n\n  test('should append ligature glyph at run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = {\n      id: 64257,\n      codePoints: [102, 105],\n      advanceWidth: 10,\n    } as Glyph; // fi\n    const result = append(glyph, run); // loremfi\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([\n      76, 111, 114, 101, 109, 64257,\n    ]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9, 10]);\n  });\n\n  test('should append glyph at run with ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = { id: 105, codePoints: [105], advanceWidth: 10 } as Glyph; // i\n    const result = append(glyph, run); // lofimi\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 2, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 64257, 109, 105]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 10]);\n  });\n\n  test('should append ligature glyph before run ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = {\n      id: 64259,\n      codePoints: [102, 102, 105],\n      advanceWidth: 10,\n    } as Glyph; // ffi\n    const result = append(glyph, run); //  lofimffi\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 2, 3, 4, 4, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 64257, 109, 64259]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 10]);\n  });\n});\n\ndescribe('run append code point operator', () => {\n  test('should return same run if no code point provided', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = append(null, run);\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 114, 101, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9]);\n  });\n\n  test('should append code point at run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = append(105, run);\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 114, 101, 109, 105]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9, 8]);\n  });\n\n  test('should append ligature code point at run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = append(64257, run); // loremfi\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([\n      76, 111, 114, 101, 109, 64257,\n    ]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9, 10]);\n  });\n\n  test('should append code point at run with ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = append(105, run); // lofimi\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 2, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 64257, 109, 105]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 8]);\n  });\n\n  test('should append ligature code point before run ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = append(64259, run); //  lofimffi\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 2, 3, 4, 4, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 64257, 109, 64259]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 10]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/ascent.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport ascent from '../../src/run/ascent';\nimport { Font } from '../../src/types';\n\ndescribe('run ascent operator', () => {\n  test('should return 0 if font not present', () => {\n    const run = { start: 0, end: 0, attributes: { fontSize: 12 } };\n\n    expect(ascent(run)).toBe(0);\n  });\n\n  test('should return 0 if fontSize not present', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { font: [{ unitsPerEm: 2 } as Font] },\n    };\n\n    expect(ascent(run)).toBe(0);\n  });\n\n  test('should return 0 if unknown font unitsPerEm', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { fontSize: 12, font: [{ ascent: 10 } as Font] },\n    };\n\n    expect(ascent(run)).toBe(0);\n  });\n\n  test('should return 0 if unknown font ascent', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { fontSize: 12, font: [{ unitsPerEm: 2 } as Font] },\n    };\n\n    expect(ascent(run)).toBe(0);\n  });\n\n  test('should return correct font ascent', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: {\n        fontSize: 12,\n        font: [{ ascent: 10, unitsPerEm: 2 } as Font],\n      },\n    };\n\n    expect(ascent(run)).toBe((10 * 12) / 2);\n  });\n\n  test('should return correct font ascent with shortest attachment', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: {\n        fontSize: 12,\n        attachment: { width: 5, height: 5, image: Buffer.from('') },\n        font: [{ ascent: 10, unitsPerEm: 2 } as Font],\n      },\n    };\n\n    expect(ascent(run)).toBe((10 * 12) / 2);\n  });\n\n  test('should return attachment height if taller', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: {\n        fontSize: 12,\n        attachment: { width: 70, height: 70, image: Buffer.from('') },\n        font: [{ ascent: 10, unitsPerEm: 2 } as Font],\n      },\n    };\n\n    expect(ascent(run)).toBe(70);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/concat.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport pluck from '../internal/pluck';\nimport concat from '../../src/run/concat';\nimport { Glyph } from '../../src/types';\n\ndescribe('run concat operator', () => {\n  test('should concat with empty run return same run', () => {\n    const runA = { start: 0, end: 5, attributes: {} };\n    const runB = { start: 0, end: 0, attributes: {} };\n\n    const result = concat(runA, runB);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 5);\n  });\n\n  test('should merge runs attributes', () => {\n    const runA = {\n      start: 0,\n      end: 3,\n      attributes: { font: [] },\n    };\n    const runB = {\n      start: 3,\n      end: 5,\n      attributes: { fontSize: 16 },\n    };\n\n    const result = concat(runA, runB);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 5);\n    expect(result).toHaveProperty('attributes', { font: [], fontSize: 16 });\n  });\n\n  test('should concat runs glyphs', () => {\n    const runA = {\n      start: 0,\n      end: 3,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n      ] as Glyph[],\n    };\n    const runB = {\n      start: 3,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n    };\n\n    const result = concat(runA, runB);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 5);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 114, 101, 109]);\n  });\n\n  test('should concat runs positions', () => {\n    const runA = {\n      start: 0,\n      end: 3,\n      attributes: {},\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n    const runB = {\n      start: 3,\n      end: 5,\n      attributes: {},\n      positions: [\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n\n    const result = concat(runA, runB);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 5);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9]);\n  });\n\n  test('should concat runs glyph indices', () => {\n    const runA = {\n      start: 0,\n      end: 3,\n      attributes: {},\n      glyphIndices: [0, 1, 2],\n    };\n    const runB = {\n      start: 3,\n      end: 5,\n      attributes: {},\n      glyphIndices: [0, 1],\n    };\n\n    const result = concat(runA, runB);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 5);\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/descent.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport descent from '../../src/run/descent';\nimport { Font } from '../../src/types';\n\ndescribe('run descent operator', () => {\n  test('should return 0 if font not present', () => {\n    const run = { start: 0, end: 0, attributes: { fontSize: 12 } };\n\n    expect(descent(run)).toBe(0);\n  });\n\n  test('should return 0 if fontSize not present', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { font: [{ unitsPerEm: 2 } as Font] },\n    };\n\n    expect(descent(run)).toBe(0);\n  });\n\n  test('should return 0 if unknown font unitsPerEm', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { fontSize: 12, font: [{ descent: -10 } as Font] },\n    };\n\n    expect(Math.abs(descent(run))).toBe(0);\n  });\n\n  test('should return 0 if unknown font descent', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { fontSize: 12, font: [{ unitsPerEm: 2 } as Font] },\n    };\n\n    expect(descent(run)).toBe(0);\n  });\n\n  test('should return correct font descent', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: {\n        fontSize: 12,\n        font: [{ descent: -10, unitsPerEm: 2 } as Font],\n      },\n    };\n\n    expect(descent(run)).toBe(-(10 * 12) / 2);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/dropLast.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport pluck from '../internal/pluck';\nimport dropLast from '../../src/run/dropLast';\nimport { Glyph } from '../../src/types';\n\ndescribe('run dropLast operator', () => {\n  test('should have one less char', () => {\n    const run = { start: 5, end: 10, attributes: {} };\n    const result = dropLast(run);\n\n    expect(result).toHaveProperty('start', 5);\n    expect(result).toHaveProperty('end', 9);\n  });\n\n  test('should correctly drop last glyph', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] },\n        { id: 111, advanceWidth: 0, codePoints: [111] },\n        { id: 82, advanceWidth: 0, codePoints: [82] },\n        { id: 74, advanceWidth: 0, codePoints: [74] },\n        { id: 109, advanceWidth: 0, codePoints: [109] },\n      ] as Glyph[],\n    };\n    const result = dropLast(run);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 4);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 82, 74]);\n  });\n\n  test('should correctly drop last position', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      positions: [\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n    const result = dropLast(run);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 4);\n    expect(pluck('xAdvance', result.positions!)).toEqual([6, 7, 8, 9]);\n  });\n\n  test('should correctly drop last glyph index', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] },\n        { id: 111, advanceWidth: 0, codePoints: [111] },\n        { id: 82, advanceWidth: 0, codePoints: [82] },\n        { id: 74, advanceWidth: 0, codePoints: [74] },\n        { id: 109, advanceWidth: 0, codePoints: [109] },\n      ] as Glyph[],\n      glyphIndices: [0, 1, 2, 3, 4],\n    };\n    const result = dropLast(run);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 4);\n    expect(result.glyphIndices).toEqual([0, 1, 2, 3]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/empty.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/run/empty';\n\ndescribe('run empty operator', () => {\n  test('should return empty run', () => {\n    const result = empty();\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 0);\n    expect(result).toHaveProperty('glyphs', []);\n    expect(result).toHaveProperty('glyphIndices', []);\n    expect(result).toHaveProperty('positions', []);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/filter.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport filter from '../../src/run/filter';\n\ndescribe('run filter operator', () => {\n  test('should return empty array if no runs passed', () => {\n    const filtered = filter(2, 15, []);\n\n    expect(filtered).toHaveLength(0);\n  });\n\n  test('should filter only one run', () => {\n    const attributes = { font: [] };\n    const runs = [{ start: 0, end: 15, attributes }];\n    const filtered = filter(2, 15, runs);\n\n    expect(filtered).toHaveLength(1);\n    expect(filtered[0]).toEqual(runs[0]);\n  });\n\n  test('should filter many runs', () => {\n    const runs = [\n      { start: 0, end: 6, attributes: {} },\n      { start: 6, end: 12, attributes: {} },\n    ];\n    const filtered = filter(2, 11, runs);\n\n    expect(filtered).toHaveLength(2);\n    expect(filtered[0]).toEqual(runs[0]);\n    expect(filtered[1]).toEqual(runs[1]);\n  });\n\n  test('should filter trailing runs', () => {\n    const runs = [\n      { start: 0, end: 6, attributes: {} },\n      { start: 6, end: 12, attributes: {} },\n    ];\n    const filtered = filter(7, 11, runs);\n\n    expect(filtered).toHaveLength(1);\n    expect(filtered[0]).toEqual(runs[1]);\n  });\n\n  test('should filter leading runs', () => {\n    const runs = [\n      { start: 0, end: 6, attributes: {} },\n      { start: 6, end: 12, attributes: {} },\n    ];\n    const filtered = filter(1, 5, runs);\n\n    expect(filtered).toHaveLength(1);\n    expect(filtered[0]).toEqual(runs[0]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/flatten.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport flatten from '../../src/run/flatten';\n\ndescribe('run flatten operator', () => {\n  test('should return empty array if no runs passed', () => {\n    const runs = flatten();\n\n    expect(runs).toHaveLength(0);\n  });\n\n  test('should return empty run', () => {\n    const runs = flatten([{ start: 0, end: 0, attributes: { strike: true } }]);\n\n    expect(runs).toHaveLength(1);\n    expect(runs[0].attributes).toEqual({ strike: true });\n  });\n\n  test('should merge two equal empty runs', () => {\n    const runs = flatten([\n      { start: 0, end: 0, attributes: { strike: true } },\n      { start: 0, end: 0, attributes: { color: 'red' } },\n    ]);\n\n    expect(runs).toHaveLength(1);\n    expect(runs[0]).toHaveProperty('start', 0);\n    expect(runs[0]).toHaveProperty('end', 0);\n    expect(runs[0].attributes).toEqual({ strike: true, color: 'red' });\n  });\n\n  test('should merge two differet empty runs', () => {\n    const runs = flatten([\n      { start: 0, end: 0, attributes: { strike: true } },\n      { start: 5, end: 5, attributes: { color: 'red' } },\n    ]);\n\n    expect(runs).toHaveLength(2);\n    expect(runs[0]).toHaveProperty('start', 0);\n    expect(runs[0]).toHaveProperty('end', 0);\n    expect(runs[0].attributes).toEqual({ strike: true });\n    expect(runs[1]).toHaveProperty('start', 5);\n    expect(runs[1]).toHaveProperty('end', 5);\n    expect(runs[1].attributes).toEqual({ color: 'red' });\n  });\n\n  test('should merge two equal runs into one', () => {\n    const runs = flatten([\n      { start: 0, end: 10, attributes: { strike: true } },\n      { start: 0, end: 10, attributes: { color: 'red' } },\n    ]);\n\n    expect(runs).toHaveLength(1);\n    expect(runs[0]).toHaveProperty('start', 0);\n    expect(runs[0]).toHaveProperty('end', 10);\n    expect(runs[0].attributes).toEqual({ strike: true, color: 'red' });\n  });\n\n  test('should split containing runs in two', () => {\n    const runs = flatten([\n      { start: 0, end: 10, attributes: { strike: true } },\n      { start: 0, end: 15, attributes: { color: 'red' } },\n    ]);\n\n    expect(runs).toHaveLength(2);\n\n    expect(runs[0]).toHaveProperty('start', 0);\n    expect(runs[0]).toHaveProperty('end', 10);\n    expect(runs[0].attributes).toEqual({ strike: true, color: 'red' });\n\n    expect(runs[1]).toHaveProperty('start', 10);\n    expect(runs[1]).toHaveProperty('end', 15);\n    expect(runs[1].attributes).toEqual({ color: 'red' });\n  });\n\n  test('should split containing runs in three', () => {\n    const runs = flatten([\n      { start: 0, end: 10, attributes: { strike: true } },\n      { start: 5, end: 15, attributes: { color: 'red' } },\n    ]);\n\n    expect(runs).toHaveLength(3);\n\n    expect(runs[0]).toHaveProperty('start', 0);\n    expect(runs[0]).toHaveProperty('end', 5);\n    expect(runs[0].attributes).toEqual({ strike: true });\n\n    expect(runs[1]).toHaveProperty('start', 5);\n    expect(runs[1]).toHaveProperty('end', 10);\n    expect(runs[1].attributes).toEqual({ strike: true, color: 'red' });\n\n    expect(runs[2]).toHaveProperty('start', 10);\n    expect(runs[2]).toHaveProperty('end', 15);\n    expect(runs[2].attributes).toEqual({ color: 'red' });\n  });\n\n  test('should leave disjoint runs as they are', () => {\n    const runs = flatten([\n      { start: 0, end: 10, attributes: { strike: true } },\n      { start: 10, end: 20, attributes: { color: 'red' } },\n    ]);\n\n    expect(runs).toHaveLength(2);\n\n    expect(runs[0]).toHaveProperty('start', 0);\n    expect(runs[0]).toHaveProperty('end', 10);\n    expect(runs[0].attributes).toEqual({ strike: true });\n\n    expect(runs[1]).toHaveProperty('start', 10);\n    expect(runs[1]).toHaveProperty('end', 20);\n    expect(runs[1].attributes).toEqual({ color: 'red' });\n  });\n\n  test('should fill empty spaces with empty runs', () => {\n    const runs = flatten([\n      { start: 0, end: 10, attributes: { strike: true } },\n      { start: 15, end: 20, attributes: { color: 'red' } },\n    ]);\n\n    expect(runs).toHaveLength(3);\n\n    expect(runs[1]).toHaveProperty('start', 10);\n    expect(runs[1]).toHaveProperty('end', 15);\n    expect(runs[1].attributes).toEqual({});\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/getFont.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport font from '../internal/font';\nimport getFont from '../../src/run/getFont';\n\ndescribe('run getFont glyph operator', () => {\n  test('should return null if run does not have attributes', () => {\n    const run = { start: 0, end: 5, attributes: {} };\n    expect(getFont(run)).toBeNull();\n  });\n\n  test('should return null if run does not have font', () => {\n    const run = { start: 0, end: 5, attributes: {} };\n    expect(getFont(run)).toBeNull();\n  });\n\n  test('should return first font when present', () => {\n    const run = { start: 0, end: 5, attributes: { font: [font] } };\n    expect(getFont(run)).toBe(font);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/glyphIndexAt.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport glyphIndexAt from '../../src/run/glyphIndexAt';\n\ndescribe('run glyphIndexAt operator', () => {\n  test('should return string index if no glyph indices present', () => {\n    const run = { start: 0, end: 5, attributes: {} };\n\n    expect(glyphIndexAt(1, run)).toBe(1);\n  });\n\n  test('should correctly return glyph index', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphIndices: [0, 1, 2, 3, 4],\n    };\n\n    expect(glyphIndexAt(1, run)).toBe(1);\n  });\n\n  test('should correctly return trailing glyph index when ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphIndices: [0, 1, 2, 2, 3],\n    };\n\n    expect(glyphIndexAt(1, run)).toBe(1);\n  });\n\n  test('should correctly return leading glyph index when ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphIndices: [0, 1, 2, 2, 3],\n    };\n\n    expect(glyphIndexAt(4, run)).toBe(3);\n  });\n\n  test('should correctly return glyph index at ligature start', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphIndices: [0, 1, 2, 2, 3],\n    };\n\n    expect(glyphIndexAt(2, run)).toBe(2);\n  });\n\n  test('should correctly return glyph index at ligature end', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphIndices: [0, 1, 2, 2, 3],\n    };\n\n    expect(glyphIndexAt(3, run)).toBe(2);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/height.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport height from '../../src/run/height';\nimport { Font } from '../../src/types';\n\ndescribe('run height operator', () => {\n  test('should return 0 if attributes empty', () => {\n    const run = { start: 0, end: 0, attributes: {} };\n\n    expect(height(run)).toBe(0);\n  });\n\n  test('should line height if present', () => {\n    const run = { start: 0, end: 0, attributes: { lineHeight: 20 } };\n\n    expect(height(run)).toBe(20);\n  });\n\n  test('should return 0 if font not present', () => {\n    const run = { start: 0, end: 0, attributes: { fontSize: 12 } };\n\n    expect(height(run)).toBe(0);\n  });\n\n  test('should return 0 if fontSize not present', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { font: [{ unitsPerEm: 2 } as Font] },\n    };\n\n    expect(height(run)).toBe(0);\n  });\n\n  test('should return 0 if unknown font unitsPerEm', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { fontSize: 12, font: [{ fullName: 'other' } as Font] },\n    };\n\n    expect(height(run)).toBe(0);\n  });\n\n  test('should return 0 if unknown font descent', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { fontSize: 12, font: [{ unitsPerEm: 2 } as Font] },\n    };\n\n    expect(height(run)).toBe(0);\n  });\n\n  test('should return 0 if unknown font ascent', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { fontSize: 12, font: [{ unitsPerEm: 2 } as Font] },\n    };\n\n    expect(height(run)).toBe(0);\n  });\n\n  test('should return correct height', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: {\n        fontSize: 12,\n        font: [{ descent: -10, ascent: 15, lineGap: 2, unitsPerEm: 2 } as Font],\n      },\n    };\n\n    expect(height(run)).toBe(((15 + 10 + 2) * 12) / 2);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/indexAtOffset.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport indexAtOffset from '../../src/run/indexAtOffset';\nimport { Glyph } from '../../src/types';\n\ndescribe('run indexAtOffset operator', () => {\n  test('should return 0 if positions not present', () => {\n    const run = { start: 0, end: 5, attributes: {} };\n\n    expect(indexAtOffset(5, run)).toBe(0);\n  });\n\n  test('should return 0 if positions empty', () => {\n    const run = { start: 0, end: 5, attributes: {}, positions: [] };\n\n    expect(indexAtOffset(5, run)).toBe(0);\n  });\n\n  test('should return 0 if glyphs not present', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      positions: [\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 3, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 2, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n\n    expect(indexAtOffset(5, run)).toBe(0);\n  });\n\n  test('should return 0 if glyphs empty', () => {\n    const run = {\n      start: 5,\n      end: 15,\n      glyphs: [],\n      attributes: {},\n      positions: [\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 3, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 2, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n\n    expect(indexAtOffset(5, run)).toBe(0);\n  });\n\n  test('should return correct index', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 0, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 0, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 3, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 2, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n\n    expect(indexAtOffset(5, run)).toBe(0);\n    expect(indexAtOffset(10, run)).toBe(1);\n    expect(indexAtOffset(12, run)).toBe(2);\n    expect(indexAtOffset(15, run)).toBe(3);\n    expect(indexAtOffset(19, run)).toBe(4);\n    expect(indexAtOffset(21, run)).toBe(5);\n    expect(indexAtOffset(30, run)).toBe(5);\n  });\n\n  test('should return correct index with ligatures', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 0, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 0, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 0, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 0, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 3, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n    };\n\n    expect(indexAtOffset(5, run)).toBe(0);\n    expect(indexAtOffset(10, run)).toBe(1);\n    expect(indexAtOffset(12, run)).toBe(2);\n    expect(indexAtOffset(15, run)).toBe(2);\n    expect(indexAtOffset(21, run)).toBe(4);\n    expect(indexAtOffset(24, run)).toBe(5);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/insert.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport font from '../internal/font';\nimport pluck from '../internal/pluck';\nimport insert from '../../src/run/insert';\nimport { Glyph } from '../../src/types';\n\ndescribe('run insert glyph operator', () => {\n  test('should return same run if no glyph provided', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = insert(2, null, run);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 5);\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 114, 101, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9]);\n  });\n\n  test('should insert glyph at beggining of run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = { id: 105, codePoints: [105], advanceWidth: 10 } as Glyph; // i\n    const result = insert(0, glyph, run);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 6);\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([105, 76, 111, 114, 101, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([10, 5, 6, 7, 8, 9]);\n  });\n\n  test('should insert glyph at end of run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = { id: 105, codePoints: [105], advanceWidth: 10 } as Glyph; // i\n    const result = insert(5, glyph, run);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 6);\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 114, 101, 109, 105]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9, 10]);\n  });\n\n  test('should insert glyph at middle of run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = { id: 105, codePoints: [105], advanceWidth: 10 } as Glyph; // i\n    const result = insert(2, glyph, run);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 6);\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 105, 114, 101, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 10, 7, 8, 9]);\n  });\n\n  test('should insert ligature glyph at beggining of run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = {\n      id: 64257,\n      codePoints: [102, 105],\n      advanceWidth: 10,\n    } as Glyph; // fi\n    const result = insert(0, glyph, run); // filorem\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 7);\n    expect(result).toHaveProperty('glyphIndices', [0, 0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([\n      64257, 76, 111, 114, 101, 109,\n    ]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([10, 5, 6, 7, 8, 9]);\n  });\n\n  test('should insert ligature glyph at end of run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = {\n      id: 64257,\n      codePoints: [102, 105],\n      advanceWidth: 10,\n    } as Glyph; // fi\n    const result = insert(5, glyph, run); // loremfi\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 7);\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([\n      76, 111, 114, 101, 109, 64257,\n    ]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9, 10]);\n  });\n\n  test('should insert ligature glyph at middle of run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = {\n      id: 64257,\n      codePoints: [102, 105],\n      advanceWidth: 10,\n    } as Glyph; // fi\n    const result = insert(2, glyph, run); // lofirem\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 7);\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([\n      76, 111, 64257, 114, 101, 109,\n    ]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 10, 7, 8, 9]);\n  });\n\n  test('should insert glyph before run ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = { id: 105, codePoints: [105], advanceWidth: 10 } as Glyph; // i\n    const result = insert(2, glyph, run); // liofim\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 6);\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 105, 64257, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 10, 7, 8]);\n  });\n\n  test('should insert glyph after run ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = { id: 105, codePoints: [105], advanceWidth: 10 } as Glyph; // i\n    const result = insert(4, glyph, run);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 6);\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 2, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 64257, 105, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 10, 8]);\n  });\n\n  test('should insert glyph in the middle of ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = { id: 105, codePoints: [105], advanceWidth: 10 } as Glyph; // i\n    const result = insert(3, glyph, run);\n\n    expect(result).toHaveProperty('start', 0);\n    expect(result).toHaveProperty('end', 6);\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 102, 105, 105, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 8, 10, 8, 8]);\n  });\n\n  test('should insert ligature glyph before run ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = {\n      id: 64259,\n      codePoints: [102, 102, 105],\n      advanceWidth: 10,\n    } as Glyph; // ffi\n    const result = insert(1, glyph, run); // lffiofim\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 1, 1, 2, 3, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 64259, 111, 64257, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 10, 6, 7, 8]);\n  });\n\n  test('should insert ligature glyph after run ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = {\n      id: 64259,\n      codePoints: [102, 102, 105],\n      advanceWidth: 10,\n    } as Glyph; // ffi\n    const result = insert(4, glyph, run); // lofiffim\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 2, 3, 3, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 64257, 64259, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 10, 8]);\n  });\n});\n\ndescribe('run insert code point operator', () => {\n  test('should return same run if no glyph provided', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = insert(2, null, run);\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 114, 101, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9]);\n  });\n\n  test('should insert code point at beggining of run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = insert(0, 105, run);\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([105, 76, 111, 114, 101, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([8, 5, 6, 7, 8, 9]);\n  });\n\n  test('should insert code point at end of run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = insert(5, 105, run);\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 114, 101, 109, 105]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9, 8]);\n  });\n\n  test('should insert code point at middle of run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = insert(2, 105, run);\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 105, 114, 101, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 8, 7, 8, 9]);\n  });\n\n  test('should insert ligature code point at beggining of run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = insert(0, 64257, run); // filorem\n\n    expect(result).toHaveProperty('glyphIndices', [0, 0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([\n      64257, 76, 111, 114, 101, 109,\n    ]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([10, 5, 6, 7, 8, 9]);\n  });\n\n  test('should insert ligature code point at end of run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = insert(2, 64257, run); // lofirem\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([\n      76, 111, 64257, 114, 101, 109,\n    ]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 10, 7, 8, 9]);\n  });\n\n  test('should insert ligature code point at middle of run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = insert(5, 64257, run); // loremfi\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([\n      76, 111, 114, 101, 109, 64257,\n    ]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9, 10]);\n  });\n\n  test('should insert code point before run ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = insert(1, 105, run);\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 105, 111, 64257, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 8, 6, 7, 8]);\n  });\n\n  test('should insert code point after run ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = insert(4, 105, run);\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 2, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 64257, 105, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 8]);\n  });\n\n  test('should insert ligature code point before run ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = insert(1, 64259, run); // lffiofim\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 1, 1, 2, 3, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 64259, 111, 64257, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 10, 6, 7, 8]);\n  });\n\n  test('should insert ligature code point after run ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = insert(4, 64259, run); // lofiffim\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 2, 3, 3, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 64257, 64259, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 10, 8]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/isEmpty.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport isEmpty from '../../src/run/isEmpty';\n\ndescribe('run isEmpty operator', () => {\n  test('should be truthy for empty run', () => {\n    const run = { start: 5, end: 5, attributes: {} };\n\n    expect(isEmpty(run)).toBeTruthy();\n  });\n\n  test('should be falsy for non-empty run', () => {\n    const run = { start: 5, end: 10, attributes: {} };\n\n    expect(isEmpty(run)).toBeFalsy();\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/leadingOffset.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/run/empty';\nimport leadingOffset from '../../src/run/leadingOffset';\nimport { Glyph } from '../../src/types';\n\ndescribe('run leadingOffset operator', () => {\n  test('should return zero for empty run', () => {\n    const result = leadingOffset(empty());\n\n    expect(result).toBe(0);\n  });\n\n  test('should return zero if no leafing spaces', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n    };\n\n    const result = leadingOffset(run);\n\n    expect(result).toBe(0);\n  });\n\n  test('should return trailing space of one space', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 32, advanceWidth: 10, codePoints: [32] }, // space\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n    };\n\n    const result = leadingOffset(run);\n\n    expect(result).toBe(5);\n  });\n\n  test('should return trailing space of many spaces', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 32, advanceWidth: 10, codePoints: [32] }, // space\n        { id: 32, advanceWidth: 10, codePoints: [32] }, // space\n        { id: 32, advanceWidth: 10, codePoints: [32] }, // space\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n    };\n\n    const result = leadingOffset(run);\n\n    expect(result).toBe(18);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/length.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport length from '../../src/run/length';\n\ndescribe('run length operator', () => {\n  test('should be zero for empty run', () => {\n    const run = { start: 5, end: 5, attributes: {} };\n\n    expect(length(run)).toBe(0);\n  });\n\n  test('should be correct length for run', () => {\n    const run = { start: 5, end: 15, attributes: {} };\n\n    expect(length(run)).toBe(10);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/lineGap.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport lineGap from '../../src/run/lineGap';\nimport { Font } from '../../src/types';\n\ndescribe('run lineGap operator', () => {\n  test('should return 0 if font not present', () => {\n    const run = { start: 0, end: 0, attributes: { fontSize: 12 } };\n\n    expect(lineGap(run)).toBe(0);\n  });\n\n  test('should return 0 if fontSize not present', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { font: [{ unitsPerEm: 2 } as Font] },\n    };\n\n    expect(lineGap(run)).toBe(0);\n  });\n\n  test('should return 0 if unknown font unitsPerEm', () => {\n    const font = { descent: 10 } as Font;\n\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { fontSize: 12, font: [font] },\n    };\n\n    expect(lineGap(run)).toBe(0);\n  });\n\n  test('should return 0 if unknown font decent', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { fontSize: 12, font: [{ unitsPerEm: 2 } as Font] },\n    };\n\n    expect(lineGap(run)).toBe(0);\n  });\n\n  test('should return correct font lineGap', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: {\n        fontSize: 12,\n        font: [{ lineGap: 10, unitsPerEm: 2 } as Font],\n      },\n    };\n\n    expect(lineGap(run)).toBe((10 * 12) / 2);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/offset.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport offset from '../../src/run/offset';\nimport { Glyph } from '../../src/types';\n\ndescribe('run offset operator', () => {\n  test('should return always 0 if no glyphIndices present', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 102, advanceWidth: 10, codePoints: [102] }, // f\n        { id: 105, advanceWidth: 10, codePoints: [105] }, // i\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n    };\n\n    expect(offset(0, run)).toBe(0);\n    expect(offset(1, run)).toBe(0);\n    expect(offset(2, run)).toBe(0);\n    expect(offset(3, run)).toBe(0);\n    expect(offset(4, run)).toBe(0);\n  });\n\n  test('should return always 0 for run without ligatures', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 102, advanceWidth: 10, codePoints: [102] }, // f\n        { id: 105, advanceWidth: 10, codePoints: [105] }, // i\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      glyphIndices: [0, 1, 2, 3, 4],\n    };\n\n    expect(offset(0, run)).toBe(0);\n    expect(offset(1, run)).toBe(0);\n    expect(offset(2, run)).toBe(0);\n    expect(offset(3, run)).toBe(0);\n    expect(offset(4, run)).toBe(0);\n  });\n\n  test('should correctly return offset for run with ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      glyphIndices: [0, 1, 2, 2, 3],\n    };\n\n    expect(offset(0, run)).toBe(0);\n    expect(offset(1, run)).toBe(0);\n    expect(offset(2, run)).toBe(0);\n    expect(offset(3, run)).toBe(1);\n    expect(offset(4, run)).toBe(0);\n  });\n\n  test('should correctly return offset for run with long ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 64259, advanceWidth: 10, codePoints: [102, 102, 105] }, // ffi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      glyphIndices: [0, 1, 1, 1, 2],\n    };\n\n    expect(offset(0, run)).toBe(0);\n    expect(offset(1, run)).toBe(0);\n    expect(offset(2, run)).toBe(1);\n    expect(offset(3, run)).toBe(2);\n    expect(offset(4, run)).toBe(0);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/omit.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport omit from '../../src/run/omit';\n\ndescribe('run omit operator', () => {\n  test('should omit passed attribute', () => {\n    const run = { start: 5, end: 15, attributes: { font: [] } };\n    const ommited = omit('font', run);\n\n    expect(ommited).toHaveProperty('start', 5);\n    expect(ommited).toHaveProperty('end', 15);\n    expect(ommited.attributes).not.toHaveProperty('font');\n  });\n\n  test('should not omit other attribute', () => {\n    const run = { start: 5, end: 15, attributes: { font: [] } };\n    const ommited = omit('fontSize', run);\n\n    expect(ommited).toHaveProperty('start', 5);\n    expect(ommited).toHaveProperty('end', 15);\n    expect(ommited.attributes).toHaveProperty('font', []);\n  });\n\n  test('should preserve other attributes', () => {\n    const run = {\n      start: 5,\n      end: 15,\n      attributes: { font: [], fontSize: 16 },\n    };\n    const ommited = omit('font', run);\n\n    expect(ommited).toHaveProperty('start', 5);\n    expect(ommited).toHaveProperty('end', 15);\n    expect(ommited.attributes).not.toHaveProperty('font');\n    expect(ommited.attributes).toHaveProperty('fontSize', 16);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/prepend.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport font from '../internal/font';\nimport pluck from '../internal/pluck';\nimport prepend from '../../src/run/prepend';\nimport { Glyph } from '../../src/types';\n\ndescribe('run prepend glyph operator', () => {\n  test('should return same run if no glyph provided', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = prepend(null, run);\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 114, 101, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9]);\n  });\n\n  test('should prepend glyph at run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = { id: 105, codePoints: [105], advanceWidth: 10 } as Glyph; // i\n    const result = prepend(glyph, run);\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([105, 76, 111, 114, 101, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([10, 5, 6, 7, 8, 9]);\n  });\n\n  test('should prepend ligature glyph at run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = {\n      id: 64257,\n      codePoints: [102, 105],\n      advanceWidth: 10,\n    } as Glyph; // fi\n    const result = prepend(glyph, run); // filorem\n\n    expect(result).toHaveProperty('glyphIndices', [0, 0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([\n      64257, 76, 111, 114, 101, 109,\n    ]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([10, 5, 6, 7, 8, 9]);\n  });\n\n  test('should prepend glyph at run with ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = { id: 105, codePoints: [105], advanceWidth: 10 } as Glyph; // i\n    const result = prepend(glyph, run); // ilofim\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([105, 76, 111, 64257, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([10, 5, 6, 7, 8]);\n  });\n\n  test('should prepend ligature glyph before run ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const glyph = {\n      id: 64259,\n      codePoints: [102, 102, 105],\n      advanceWidth: 10,\n    } as Glyph; // ffi\n    const result = prepend(glyph, run); //  ffilofim\n\n    expect(result).toHaveProperty('glyphIndices', [0, 0, 0, 1, 2, 3, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([64259, 76, 111, 64257, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([10, 5, 6, 7, 8]);\n  });\n});\n\ndescribe('run prepend code point operator', () => {\n  test('should return same run if no code point provided', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = prepend(null, run);\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([76, 111, 114, 101, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([5, 6, 7, 8, 9]);\n  });\n\n  test('should prepend code point at run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = prepend(105, run);\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([105, 76, 111, 114, 101, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([8, 5, 6, 7, 8, 9]);\n  });\n\n  test('should prepend ligature code point at run', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = prepend(64257, run); // filorem\n\n    expect(result).toHaveProperty('glyphIndices', [0, 0, 1, 2, 3, 4, 5]);\n    expect(pluck('id', result.glyphs!)).toEqual([\n      64257, 76, 111, 114, 101, 109,\n    ]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([10, 5, 6, 7, 8, 9]);\n  });\n\n  test('should prepend code point at run with ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = prepend(105, run); // ilofim\n\n    expect(result).toHaveProperty('glyphIndices', [0, 1, 2, 3, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([105, 76, 111, 64257, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([8, 5, 6, 7, 8]);\n  });\n\n  test('should prepend ligature code point before run ligature', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 2, 3],\n      attributes: { font: [font], fontSize: 2 },\n    };\n\n    const result = prepend(64259, run); //  ffilofim\n\n    expect(result).toHaveProperty('glyphIndices', [0, 0, 0, 1, 2, 3, 3, 4]);\n    expect(pluck('id', result.glyphs!)).toEqual([64259, 76, 111, 64257, 109]);\n    expect(pluck('xAdvance', result.positions!)).toEqual([10, 5, 6, 7, 8]);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/runIndexAt.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport runIndexAt from '../../src/run/runIndexAt';\n\nconst runs = [\n  { start: 0, end: 6, attributes: {} },\n  { start: 6, end: 12, attributes: {} },\n];\n\ndescribe('run runIndexAt operator', () => {\n  test('should get index at start of first run', () => {\n    const result = runIndexAt(0, runs);\n    expect(result).toBe(0);\n  });\n\n  test('should get index at end of first run', () => {\n    const result = runIndexAt(5, runs);\n    expect(result).toBe(0);\n  });\n\n  test('should get index at start of last run', () => {\n    const result = runIndexAt(6, runs);\n    expect(result).toBe(1);\n  });\n\n  test('should get index at end of last run', () => {\n    const result = runIndexAt(11, runs);\n    expect(result).toBe(1);\n  });\n\n  test('should get -1 at invalid index', () => {\n    const result = runIndexAt(12, runs);\n    expect(result).toBe(-1);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/scale.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport scale from '../../src/run/scale';\nimport { Font } from '../../src/types';\n\ndescribe('run scale operator', () => {\n  test('should return 0 if font not present', () => {\n    const run = { start: 0, end: 0, attributes: { fontSize: 12 } };\n\n    expect(scale(run)).toBe(0);\n  });\n\n  test('should return 0 if unknown font unitsPerEm', () => {\n    const font = [{ ascent: 0 } as Font];\n\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { fontSize: 12, font },\n    };\n\n    expect(scale(run)).toBe(0);\n  });\n\n  test('should return correct font scale', () => {\n    const run = {\n      start: 0,\n      end: 0,\n      attributes: { fontSize: 12, font: [{ unitsPerEm: 2 } as Font] },\n    };\n\n    expect(scale(run)).toBe(12 / 2);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/slice.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport font from '../internal/font';\nimport pluck from '../internal/pluck';\nimport slice from '../../src/run/slice';\nimport { Glyph } from '../../src/types';\n\ndescribe('run slice operator', () => {\n  describe('slice start and end', () => {\n    test('should slice containing range', () => {\n      const attributes = { font: [] };\n      const run = { start: 0, end: 10, attributes };\n      const sliced = slice(2, 5, run);\n\n      expect(sliced).toHaveProperty('start', 2);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(sliced).toHaveProperty('attributes', attributes);\n    });\n\n    test('should slice exact range', () => {\n      const attributes = { font: [] };\n      const run = { start: 0, end: 10, attributes };\n      const sliced = slice(0, 10, run);\n\n      expect(sliced).toHaveProperty('start', 0);\n      expect(sliced).toHaveProperty('end', 10);\n      expect(sliced).toHaveProperty('attributes', attributes);\n    });\n\n    test('should slice exceeding range', () => {\n      const attributes = { font: [] };\n      const run = { start: 0, end: 10, attributes };\n      const sliced = slice(2, 20, run);\n\n      expect(sliced).toHaveProperty('start', 2);\n      expect(sliced).toHaveProperty('end', 10);\n      expect(sliced).toHaveProperty('attributes', attributes);\n    });\n\n    test('should slice containing range when start not zero', () => {\n      const attributes = { font: [] };\n      const run = { start: 5, end: 15, attributes };\n      const sliced = slice(2, 5, run);\n\n      expect(sliced).toHaveProperty('start', 7);\n      expect(sliced).toHaveProperty('end', 10);\n      expect(sliced).toHaveProperty('attributes', attributes);\n    });\n\n    test('should slice exact range when start not zero', () => {\n      const attributes = { font: [] };\n      const run = { start: 5, end: 15, attributes };\n      const sliced = slice(0, 10, run);\n\n      expect(sliced).toHaveProperty('start', 5);\n      expect(sliced).toHaveProperty('end', 15);\n      expect(sliced).toHaveProperty('attributes', attributes);\n    });\n\n    test('should slice exceeding range when start not zero', () => {\n      const attributes = { font: [] };\n      const run = { start: 5, end: 15, attributes };\n      const sliced = slice(8, 13, run);\n\n      expect(sliced).toHaveProperty('start', 13);\n      expect(sliced).toHaveProperty('end', 15);\n      expect(sliced).toHaveProperty('attributes', attributes);\n    });\n  });\n\n  describe('slice glyphs', () => {\n    test('should exact slice return same glyphs', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n      };\n      const sliced = slice(0, 5, run);\n\n      expect(sliced).toHaveProperty('start', 0);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(pluck('id', sliced.glyphs!)).toEqual([76, 111, 114, 101, 109]);\n    });\n\n    test('should exact slice with ligature return same glyphs', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n      };\n      const sliced = slice(0, 5, run);\n\n      expect(sliced).toHaveProperty('start', 0);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(sliced.glyphs).toHaveLength(4);\n      expect(pluck('id', sliced.glyphs!)).toEqual([76, 111, 64257, 109]);\n    });\n\n    test('should correctly slice glyphs', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n          { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n          { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n      };\n      const sliced = slice(2, 4, run);\n\n      expect(pluck('id', sliced.glyphs!)).toEqual([114, 101]);\n    });\n\n    test('should correctly slice glyphs containing ligature', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 2, 2, 3],\n      };\n      const sliced = slice(1, 5, run);\n\n      expect(sliced).toHaveProperty('start', 1);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(sliced.glyphs).toHaveLength(3);\n      expect(pluck('id', sliced.glyphs!)).toEqual([111, 64257, 109]);\n    });\n\n    test('should correctly slice glyphs containing ligature at start', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 0, 1, 2, 3],\n        attributes: { font: [font] },\n      };\n      const sliced = slice(1, 5, run);\n\n      expect(sliced).toHaveProperty('start', 1);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(sliced.glyphs).toHaveLength(4);\n      expect(pluck('id', sliced.glyphs!)).toEqual([105, 76, 111, 109]);\n    });\n\n    test('should correctly slice glyphs starting in ligature', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 2, 2, 3],\n      };\n      const sliced = slice(2, 5, run);\n\n      expect(sliced).toHaveProperty('start', 2);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(sliced.glyphs).toHaveLength(2);\n      expect(pluck('id', sliced.glyphs!)).toEqual([64257, 109]);\n    });\n\n    test('should correctly slice glyphs ending in ligature', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 2, 2, 3],\n      };\n      const sliced = slice(1, 4, run);\n\n      expect(sliced).toHaveProperty('start', 1);\n      expect(sliced).toHaveProperty('end', 4);\n      expect(sliced.glyphs).toHaveLength(2);\n      expect(pluck('id', sliced.glyphs!)).toEqual([111, 64257]);\n    });\n\n    test('should correctly slice glyphs breaking ligature at start', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 2, 2, 3],\n        attributes: { font: [font] },\n      };\n      const sliced = slice(3, 5, run);\n\n      expect(sliced).toHaveProperty('start', 3);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(sliced.glyphs).toHaveLength(2);\n      expect(pluck('id', sliced.glyphs!)).toEqual([105, 109]);\n    });\n\n    test('should correctly slice glyphs breaking ligature at end', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 2, 2, 3],\n        attributes: { font: [font] },\n      };\n      const sliced = slice(1, 3, run);\n\n      expect(sliced).toHaveProperty('start', 1);\n      expect(sliced).toHaveProperty('end', 3);\n      expect(sliced.glyphs).toHaveLength(2);\n      expect(pluck('id', sliced.glyphs!)).toEqual([111, 102]);\n    });\n\n    test('should correctly slice glyphs starting in long ligature', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 64259, advanceWidth: 10, codePoints: [102, 102, 105] }, // ffi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 1, 2],\n        attributes: { font: [font] },\n      };\n      const sliced = slice(1, 5, run);\n\n      expect(sliced).toHaveProperty('start', 1);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(sliced.glyphs).toHaveLength(2);\n      expect(pluck('id', sliced.glyphs!)).toEqual([64259, 109]);\n    });\n\n    test('should correctly slice glyphs ending in long ligature', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 64259, advanceWidth: 10, codePoints: [102, 102, 105] }, // ffi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 1, 2],\n        attributes: { font: [font] },\n      };\n      const sliced = slice(0, 4, run);\n\n      expect(sliced).toHaveProperty('start', 0);\n      expect(sliced).toHaveProperty('end', 4);\n      expect(sliced.glyphs).toHaveLength(2);\n      expect(pluck('id', sliced.glyphs!)).toEqual([76, 64259]);\n    });\n\n    test('should correctly slice glyphs breaking long ligature at 1st char at start', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 64259, advanceWidth: 10, codePoints: [102, 102, 105] }, // ffi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 1, 2],\n        attributes: { font: [font] },\n      };\n      const sliced = slice(2, 5, run);\n\n      expect(sliced).toHaveProperty('start', 2);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(sliced.glyphs).toHaveLength(2);\n      expect(pluck('id', sliced.glyphs!)).toEqual([64257, 109]);\n    });\n\n    test('should correctly slice glyphs breaking long ligature at 2nd char at start', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 64259, advanceWidth: 10, codePoints: [102, 102, 105] }, // ffi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 1, 2],\n        attributes: { font: [font] },\n      };\n      const sliced = slice(3, 5, run);\n\n      expect(sliced).toHaveProperty('start', 3);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(sliced.glyphs).toHaveLength(2);\n      expect(pluck('id', sliced.glyphs!)).toEqual([105, 109]);\n    });\n\n    test('should correctly slice glyphs breaking long ligature at 1st char at end', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 64259, advanceWidth: 10, codePoints: [102, 102, 105] }, // ffi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 1, 2],\n        attributes: { font: [font] },\n      };\n      const sliced = slice(0, 2, run);\n\n      expect(sliced).toHaveProperty('start', 0);\n      expect(sliced).toHaveProperty('end', 2);\n      expect(sliced.glyphs).toHaveLength(2);\n      expect(pluck('id', sliced.glyphs!)).toEqual([76, 102]);\n    });\n\n    test('should correctly slice glyphs breaking long ligature at 2nd char at end', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 64259, advanceWidth: 10, codePoints: [102, 102, 105] }, // ffi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        glyphIndices: [0, 1, 1, 1, 2],\n        attributes: { font: [font] },\n      };\n      const sliced = slice(0, 3, run);\n\n      expect(sliced).toHaveProperty('start', 0);\n      expect(sliced).toHaveProperty('end', 3);\n      expect(sliced.glyphs).toHaveLength(3);\n      expect(pluck('id', sliced.glyphs!)).toEqual([76, 102, 102]);\n    });\n  });\n\n  describe('slice positions', () => {\n    test('should exact slice return same positions', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 }, // l\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 }, // o\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 }, // r\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 }, // e\n          { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 }, // m\n        ],\n      };\n      const sliced = slice(0, 5, run);\n\n      expect(sliced).toHaveProperty('start', 0);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(pluck('xAdvance', sliced.positions!)).toEqual([8, 7, 6, 5, 4]);\n    });\n\n    test('should exact slice with ligature return same positions', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 }, // l\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 }, // o\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 }, // fi\n          { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 }, // m\n        ],\n      };\n      const sliced = slice(0, 5, run);\n\n      expect(sliced).toHaveProperty('start', 0);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(pluck('xAdvance', sliced.positions!)).toEqual([8, 7, 10, 4]);\n    });\n\n    test('should correctly slice positions', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 }, // l\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 }, // o\n          { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 }, // r\n          { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 }, // e\n          { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 }, // m\n        ],\n      };\n      const sliced = slice(2, 4, run);\n\n      expect(pluck('xAdvance', sliced.positions!)).toEqual([6, 5]);\n    });\n\n    test('should correctly slice positions containing ligature', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 }, // l\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 }, // o\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 }, // fi\n          { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 }, // m\n        ],\n      };\n      const sliced = slice(1, 5, run);\n\n      expect(sliced).toHaveProperty('start', 1);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(pluck('xAdvance', sliced.positions!)).toEqual([7, 10, 4]);\n    });\n\n    test('should correctly slice positions starting in ligature', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 }, // l\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 }, // o\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 }, // fi\n          { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 }, // m\n        ],\n        glyphIndices: [0, 1, 2, 2, 3],\n      };\n      const sliced = slice(2, 5, run);\n\n      expect(sliced).toHaveProperty('start', 2);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(pluck('xAdvance', sliced.positions!)).toEqual([10, 4]);\n    });\n\n    test('should correctly slice positions ending in ligature', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 }, // l\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 }, // o\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 }, // fi\n          { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 }, // m\n        ],\n        glyphIndices: [0, 1, 2, 2, 3],\n      };\n      const sliced = slice(1, 4, run);\n\n      expect(sliced).toHaveProperty('start', 1);\n      expect(sliced).toHaveProperty('end', 4);\n      expect(pluck('xAdvance', sliced.positions!)).toEqual([7, 10]);\n    });\n\n    test('should correctly slice positions breaking ligature at start', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 }, // l\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 }, // o\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 }, // fi\n          { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 }, // m\n        ],\n        glyphIndices: [0, 1, 2, 2, 3],\n        attributes: { font: [font], fontSize: 2 },\n      };\n      const sliced = slice(3, 5, run);\n\n      expect(sliced).toHaveProperty('start', 3);\n      expect(sliced).toHaveProperty('end', 5);\n      expect(pluck('xAdvance', sliced.positions!)).toEqual([8, 4]);\n    });\n\n    test('should correctly slice positions breaking ligature at end', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        glyphs: [\n          { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n          { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n          { id: 64257, advanceWidth: 10, codePoints: [102, 105] }, // fi\n          { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n        ] as Glyph[],\n        positions: [\n          { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 }, // l\n          { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 }, // o\n          { xAdvance: 10, yAdvance: 0, xOffset: 0, yOffset: 0 }, // fi\n          { xAdvance: 4, yAdvance: 0, xOffset: 0, yOffset: 0 }, // m\n        ],\n        glyphIndices: [0, 1, 2, 2, 3],\n        attributes: { font: [font], fontSize: 2 },\n      };\n      const sliced = slice(1, 3, run);\n\n      expect(sliced).toHaveProperty('start', 1);\n      expect(sliced).toHaveProperty('end', 3);\n      expect(pluck('xAdvance', sliced.positions!)).toEqual([7, 8]);\n    });\n  });\n\n  describe('slice glyph indices', () => {\n    test('should exact slice return same glyph indices', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphIndices: [0, 1, 2, 3, 4],\n      };\n      const sliced = slice(0, 5, run);\n\n      expect(sliced.glyphIndices).toEqual([0, 1, 2, 3, 4]);\n    });\n\n    test('should correctly slice glyph indices', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphIndices: [0, 1, 2, 3, 4],\n      };\n      const sliced = slice(2, 4, run);\n\n      expect(sliced.glyphIndices).toEqual([0, 1]);\n    });\n\n    test('should exact slice return same glyph indices when ligature', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphIndices: [0, 1, 2, 2, 3],\n      };\n      const sliced = slice(0, 5, run);\n\n      expect(sliced.glyphIndices).toEqual([0, 1, 2, 2, 3]);\n    });\n\n    test('should correctly slice glyph indices containing ligature', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphIndices: [0, 1, 2, 2, 3],\n      };\n      const sliced = slice(1, 5, run);\n\n      expect(sliced.glyphIndices).toEqual([0, 1, 1, 2]);\n    });\n\n    test('should correctly slice glyph indices starting in ligature', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphIndices: [0, 1, 2, 2, 3],\n      };\n      const sliced = slice(2, 5, run);\n\n      expect(sliced.glyphIndices).toEqual([0, 0, 1]);\n    });\n\n    test('should correctly slice glyph indices ending in ligature', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphIndices: [0, 1, 2, 2, 3],\n      };\n      const sliced = slice(1, 4, run);\n\n      expect(sliced.glyphIndices).toEqual([0, 1, 1]);\n    });\n\n    test('should correctly slice glyph indices breaking ligature at start', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphIndices: [0, 1, 2, 2, 3],\n      };\n      const sliced = slice(3, 5, run);\n\n      expect(sliced.glyphIndices).toEqual([0, 1]);\n    });\n\n    test('should correctly slice glyph indices breaking ligature at end', () => {\n      const run = {\n        start: 0,\n        end: 5,\n        attributes: {},\n        glyphIndices: [0, 1, 2, 2, 3],\n      };\n      const sliced = slice(1, 3, run);\n\n      expect(sliced.glyphIndices).toEqual([0, 1]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/sort.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport sort from '../../src/run/sort';\n\ndescribe('run sort operator', () => {\n  test('should sort no runs', () => {\n    const sorted = sort([]);\n\n    expect(sorted).toHaveLength(0);\n  });\n\n  test('should sort one run', () => {\n    const runs = [{ start: 5, end: 15, attributes: {} }];\n    const sorted = sort(runs);\n\n    expect(sorted).toHaveLength(1);\n    expect(sorted[0]).toHaveProperty('start', 5);\n    expect(sorted[0]).toHaveProperty('end', 15);\n  });\n\n  test('should sort ordered runs', () => {\n    const runs = [\n      { start: 5, end: 15, attributes: {} },\n      { start: 10, end: 25, attributes: {} },\n    ];\n    const sorted = sort(runs);\n\n    expect(sorted).toHaveLength(2);\n    expect(sorted[0]).toHaveProperty('start', 5);\n    expect(sorted[0]).toHaveProperty('end', 15);\n    expect(sorted[1]).toHaveProperty('start', 10);\n    expect(sorted[1]).toHaveProperty('end', 25);\n  });\n\n  test('should sort unordered runs', () => {\n    const runs = [\n      { start: 10, end: 25, attributes: {} },\n      { start: 5, end: 15, attributes: {} },\n    ];\n    const sorted = sort(runs);\n\n    expect(sorted).toHaveLength(2);\n    expect(sorted[0]).toHaveProperty('start', 5);\n    expect(sorted[0]).toHaveProperty('end', 15);\n    expect(sorted[1]).toHaveProperty('start', 10);\n    expect(sorted[1]).toHaveProperty('end', 25);\n  });\n\n  test('should sort many runs', () => {\n    const runs = [\n      { start: 10, end: 25, attributes: {} },\n      { start: 0, end: 10, attributes: {} },\n      { start: 5, end: 15, attributes: {} },\n    ];\n    const sorted = sort(runs);\n\n    expect(sorted).toHaveLength(3);\n    expect(sorted[0]).toHaveProperty('start', 0);\n    expect(sorted[0]).toHaveProperty('end', 10);\n    expect(sorted[1]).toHaveProperty('start', 5);\n    expect(sorted[1]).toHaveProperty('end', 15);\n    expect(sorted[2]).toHaveProperty('start', 10);\n    expect(sorted[2]).toHaveProperty('end', 25);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/subtract.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport subtract from '../../src/run/subtract';\n\ndescribe('run subtract operator', () => {\n  test('should return equal run if 0', () => {\n    const attributes = { font: [] };\n    const run = { start: 5, end: 15, attributes };\n    const subtracted = subtract(0, run);\n\n    expect(subtracted).not.toBe(run);\n    expect(subtracted).toHaveProperty('start', 5);\n    expect(subtracted).toHaveProperty('end', 15);\n    expect(subtracted).toHaveProperty('attributes', attributes);\n  });\n\n  test('should return subtracted run', () => {\n    const attributes = { font: [] };\n    const run = { start: 5, end: 15, attributes };\n    const subtracted = subtract(5, run);\n\n    expect(subtracted).not.toBe(run);\n    expect(subtracted).toHaveProperty('start', 0);\n    expect(subtracted).toHaveProperty('end', 10);\n    expect(subtracted).toHaveProperty('attributes', attributes);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/run/trailingOffset.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport empty from '../../src/run/empty';\nimport trailingOffset from '../../src/run/trailingOffset';\nimport { Glyph } from '../../src/types';\n\ndescribe('run trailingOffset operator', () => {\n  test('should return zero for empty run', () => {\n    const result = trailingOffset(empty());\n\n    expect(result).toBe(0);\n  });\n\n  test('should return zero if no leafing spaces', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 109, advanceWidth: 10, codePoints: [109] }, // m\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n    };\n\n    const result = trailingOffset(run);\n\n    expect(result).toBe(0);\n  });\n\n  test('should return trailing space of one space', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 114, advanceWidth: 10, codePoints: [114] }, // r\n        { id: 101, advanceWidth: 10, codePoints: [101] }, // e\n        { id: 32, advanceWidth: 10, codePoints: [32] }, // space\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n    };\n\n    const result = trailingOffset(run);\n\n    expect(result).toBe(9);\n  });\n\n  test('should return trailing space of many spaces', () => {\n    const run = {\n      start: 0,\n      end: 5,\n      attributes: {},\n      glyphs: [\n        { id: 76, advanceWidth: 10, codePoints: [76] }, // l\n        { id: 111, advanceWidth: 10, codePoints: [111] }, // o\n        { id: 32, advanceWidth: 10, codePoints: [32] }, // space\n        { id: 32, advanceWidth: 10, codePoints: [32] }, // space\n        { id: 32, advanceWidth: 10, codePoints: [32] }, // space\n      ] as Glyph[],\n      positions: [\n        { xAdvance: 5, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 6, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 7, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 8, yAdvance: 0, xOffset: 0, yOffset: 0 },\n        { xAdvance: 9, yAdvance: 0, xOffset: 0, yOffset: 0 },\n      ],\n      glyphIndices: [0, 1, 2, 3, 4],\n    };\n\n    const result = trailingOffset(run);\n\n    expect(result).toBe(24);\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/utils/isNumber.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport isNumber from '../../src/utils/isNumber';\n\ndescribe('utils isNumber operator', () => {\n  test('should return true for number argument', () => {\n    expect(isNumber(3)).toBeTruthy();\n  });\n\n  test('should return true for float argument', () => {\n    expect(isNumber(3.6)).toBeTruthy();\n  });\n\n  test('should return true for zero', () => {\n    expect(isNumber(0)).toBeTruthy();\n  });\n\n  test('should return true for negative number', () => {\n    expect(isNumber(-5)).toBeTruthy();\n  });\n\n  test('should return true for NaN', () => {\n    expect(isNumber(NaN)).toBeTruthy();\n  });\n\n  test('should return true for Infinity', () => {\n    expect(isNumber(Infinity)).toBeTruthy();\n  });\n\n  test('should return true for negative Infinity', () => {\n    expect(isNumber(-Infinity)).toBeTruthy();\n  });\n\n  test('should return false for string argument', () => {\n    expect(isNumber('not a number')).toBeFalsy();\n  });\n\n  test('should return false for numeric string', () => {\n    expect(isNumber('123')).toBeFalsy();\n  });\n\n  test('should return false for true argument', () => {\n    expect(isNumber(true)).toBeFalsy();\n  });\n\n  test('should return false for false argument', () => {\n    expect(isNumber(false)).toBeFalsy();\n  });\n\n  test('should return false for object argument', () => {\n    expect(isNumber({ foo: 'baz' })).toBeFalsy();\n  });\n\n  test('should return false for null', () => {\n    expect(isNumber(null)).toBeFalsy();\n  });\n\n  test('should return false for undefined', () => {\n    expect(isNumber(undefined)).toBeFalsy();\n  });\n\n  test('should return false for array', () => {\n    expect(isNumber([1, 2, 3])).toBeFalsy();\n  });\n\n  test('should return false for empty array', () => {\n    expect(isNumber([])).toBeFalsy();\n  });\n\n  test('should return false for function', () => {\n    expect(isNumber(() => 5)).toBeFalsy();\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tests/utils/stringFromCodePoints.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport stringFromCodePoints from '../../src/utils/stringFromCodePoints';\n\ndescribe('utils stringFromCodePoints operator', () => {\n  test('should return empty string if no param passed', () => {\n    expect(stringFromCodePoints(null)).toBe('');\n  });\n\n  test('should return empty string if empty array passed', () => {\n    expect(stringFromCodePoints([])).toBe('');\n  });\n\n  test('should return get correct string for single code point', () => {\n    expect(stringFromCodePoints([76])).toBe('L');\n  });\n\n  test('should return get correct string for single ligature code point', () => {\n    expect(stringFromCodePoints([64257])).toBe('ﬁ');\n  });\n\n  test('should return get correct string for multipe code points', () => {\n    expect(stringFromCodePoints([76, 77, 78])).toBe('LMN');\n  });\n\n  test('should return get correct string for multipe ligautre code points', () => {\n    expect(stringFromCodePoints([64257, 64259])).toBe('ﬁﬃ');\n  });\n\n  test('should return get correct string for even mode code points', () => {\n    expect(stringFromCodePoints([76, 64257, 77, 64259, 78])).toBe('LﬁMﬃN');\n  });\n\n  test('should return correct string for emoji code point', () => {\n    expect(stringFromCodePoints([128512])).toBe('😀');\n  });\n\n  test('should return correct string for multiple emoji code points', () => {\n    expect(stringFromCodePoints([128512, 128513, 128514])).toBe('😀😁😂');\n  });\n\n  test('should return correct string for space code point', () => {\n    expect(stringFromCodePoints([32])).toBe(' ');\n  });\n\n  test('should return correct string for newline code point', () => {\n    expect(stringFromCodePoints([10])).toBe('\\n');\n  });\n\n  test('should return correct string for tab code point', () => {\n    expect(stringFromCodePoints([9])).toBe('\\t');\n  });\n\n  test('should return correct string for unicode symbols', () => {\n    expect(stringFromCodePoints([169, 174, 8364])).toBe('©®€');\n  });\n\n  test('should return correct string for high surrogate plane characters', () => {\n    expect(stringFromCodePoints([119070])).toBe('𝄞'); // musical G clef\n  });\n});\n"
  },
  {
    "path": "packages/textkit/tsconfig.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"compilerOptions\": {\n    \"outDir\": \"lib\",\n    \"declaration\": true,\n    \"declarationDir\": \"lib/types\",\n    \"target\": \"ES2022\",\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2022\", \"DOM\"],\n    \"moduleResolution\": \"Node\",\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": false,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"types\": [\"vitest/globals\"],\n  },\n  \"include\": [\"src\"],\n}\n"
  },
  {
    "path": "packages/types/CHANGELOG.md",
    "content": "# @react-pdf/types\n\n## 2.9.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/font@4.0.4\n  - @react-pdf/stylesheet@6.1.2\n\n## 2.9.1\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @react-pdf/font@4.0.3\n  - @react-pdf/stylesheet@6.1.1\n\n## 2.9.0\n\n### Minor Changes\n\n- [#3112](https://github.com/diegomura/react-pdf/pull/3112) [`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a) Thanks [@diegomura](https://github.com/diegomura)! - feat: add xLinkHref, gradientTransform and gradientUnits support\n\n### Patch Changes\n\n- Updated dependencies [[`f89f75c1`](https://github.com/diegomura/react-pdf/commit/f89f75c1f132ba19b54847c3ac23efec675f8d0a)]:\n  - @react-pdf/stylesheet@6.1.0\n  - @react-pdf/font@4.0.2\n\n## 2.8.2\n\n### Patch Changes\n\n- Updated dependencies [[`e257f7ee`](https://github.com/diegomura/react-pdf/commit/e257f7ee18ff09f4895cd16c0b21b824678384c8)]:\n  - @react-pdf/font@4.0.1\n  - @react-pdf/stylesheet@6.0.2\n\n## 2.8.1\n\n### Patch Changes\n\n- [#3087](https://github.com/diegomura/react-pdf/pull/3087) [`7cd66e4f`](https://github.com/diegomura/react-pdf/commit/7cd66e4fc37cd1393adc6250a919fe2629812082) Thanks [@diegomura](https://github.com/diegomura)! - fix: font exported types\n\n- Updated dependencies [[`2a4f1bfc`](https://github.com/diegomura/react-pdf/commit/2a4f1bfca6b84e6c6bbde683447ce8079a1febbe), [`7cd66e4f`](https://github.com/diegomura/react-pdf/commit/7cd66e4fc37cd1393adc6250a919fe2629812082), [`bfb51ec0`](https://github.com/diegomura/react-pdf/commit/bfb51ec09b851c52659ce16fed1286173e9516a9), [`a2de2685`](https://github.com/diegomura/react-pdf/commit/a2de2685b25c797f266775c2e35a6535090393b7), [`24690f52`](https://github.com/diegomura/react-pdf/commit/24690f5238e4eacf28351cf9996856a7d196d29e), [`481b536f`](https://github.com/diegomura/react-pdf/commit/481b536f4ad145fb227829399b85a35838a506f8)]:\n  - @react-pdf/stylesheet@6.0.1\n  - @react-pdf/font@4.0.0\n\n## 2.8.0\n\n### Minor Changes\n\n- [#3082](https://github.com/diegomura/react-pdf/pull/3082) [`24fe4bf8`](https://github.com/diegomura/react-pdf/commit/24fe4bf894fff055121926488b30d0bf212a9c45) Thanks [@diegomura](https://github.com/diegomura)! - feat: rework and type stylesheet package\n\n- [#3079](https://github.com/diegomura/react-pdf/pull/3079) [`700535c5`](https://github.com/diegomura/react-pdf/commit/700535c57ff1b105d923be70f4fc4bfdf4479f91) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert font package to TS\n\n### Patch Changes\n\n- [#3067](https://github.com/diegomura/react-pdf/pull/3067) [`96c2464d`](https://github.com/diegomura/react-pdf/commit/96c2464dfaa7294e0d79b7ed64743bfd7b1a8c72) Thanks [@diegomura](https://github.com/diegomura)! - refactor: convert primitives package to TS\n\n- Updated dependencies [[`96c2464d`](https://github.com/diegomura/react-pdf/commit/96c2464dfaa7294e0d79b7ed64743bfd7b1a8c72), [`24fe4bf8`](https://github.com/diegomura/react-pdf/commit/24fe4bf894fff055121926488b30d0bf212a9c45), [`700535c5`](https://github.com/diegomura/react-pdf/commit/700535c57ff1b105d923be70f4fc4bfdf4479f91)]:\n  - @react-pdf/primitives@4.1.1\n  - @react-pdf/stylesheet@6.0.0\n  - @react-pdf/font@3.1.0\n\n## 2.7.1\n\n### Patch Changes\n\n- [#3019](https://github.com/diegomura/react-pdf/pull/3019) [`01944231`](https://github.com/diegomura/react-pdf/commit/01944231a342d502b832aeecb4c313020b8360c8) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Fixed HyphenationCallback type (confusing argument name, removed extra argument)\n\n## 2.7.0\n\n### Minor Changes\n\n- [#2875](https://github.com/diegomura/react-pdf/pull/2875) [`46c3047d`](https://github.com/diegomura/react-pdf/commit/46c3047de56ae82f062b72c4910a4e6096eee99f) Thanks [@diegomura](https://github.com/diegomura)! - feat: add position: static support\n\n- [#2874](https://github.com/diegomura/react-pdf/pull/2874) [`55973278`](https://github.com/diegomura/react-pdf/commit/55973278ac8bc8f703b63844f57d6f155ae8d86f) Thanks [@diegomura](https://github.com/diegomura)! - feat: add align-content: space-evenly support\n\n## 2.6.0\n\n### Minor Changes\n\n- [#2771](https://github.com/diegomura/react-pdf/pull/2771) [`8e6a832`](https://github.com/diegomura/react-pdf/commit/8e6a8320f86354aff950c296a96bc41a33e9dab2) Thanks [@nikischin](https://github.com/nikischin)! - fix: fix dpi\n\n### Patch Changes\n\n- [#2727](https://github.com/diegomura/react-pdf/pull/2727) [`4bafab8`](https://github.com/diegomura/react-pdf/commit/4bafab8455c9003759f48bad20a720baf4ed189b) Thanks [@hendrikmolder](https://github.com/hendrikmolder)! - accept string array for `fontFamily` in stylesheets\n\n## 2.5.0\n\n### Minor Changes\n\n- [#2723](https://github.com/diegomura/react-pdf/pull/2723) [`22a34a9`](https://github.com/diegomura/react-pdf/commit/22a34a91b16a201cd8288e0dbea9368b12ca73f5) Thanks [@hendrikmolder](https://github.com/hendrikmolder)! - Allow passing a string array to fontFamily\n\n## 2.4.1\n\n### Patch Changes\n\n- [#2573](https://github.com/diegomura/react-pdf/pull/2573) [`9af07fe`](https://github.com/diegomura/react-pdf/commit/9af07feb59c2fe9c1d8960ac95f6fa6e03d16235) Thanks [@davbrito](https://github.com/davbrito)! - feat: add support for resolving blob images\n\n## 2.4.0\n\n### Minor Changes\n\n- [#2539](https://github.com/diegomura/react-pdf/pull/2539) [`fb5273d`](https://github.com/diegomura/react-pdf/commit/fb5273d8d80d919f7b9c214e02d67b79ce23fa19) Thanks [@diegomura](https://github.com/diegomura)! - feat: add creation and modification dates\n\n## 2.3.6\n\n### Patch Changes\n\n- [#2525](https://github.com/diegomura/react-pdf/pull/2525) [`9e5842b`](https://github.com/diegomura/react-pdf/commit/9e5842bbecca6e249af2c5fc50078bb7ddd5420f) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Fix rowGap and columnGap style properties not accepting strings\n\n## 2.3.5\n\n### Patch Changes\n\n- [#2453](https://github.com/diegomura/react-pdf/pull/2453) [`e5c8fde`](https://github.com/diegomura/react-pdf/commit/e5c8fde9379a9a85ecac7e3d6273953e39d65f8d) Thanks [@chuckspencer-aiq](https://github.com/chuckspencer-aiq)! - fix: add clipPath to typing for SVGPresentationAttributes\n\n* [#2467](https://github.com/diegomura/react-pdf/pull/2467) [`1f987cc`](https://github.com/diegomura/react-pdf/commit/1f987cc27c3fd1ef1b6748ebe58a289a78b538d2) Thanks [@JaeSeoKim](https://github.com/JaeSeoKim)! - feat: add withVariationSelectors option to registerEmojiSource [#2466](https://github.com/diegomura/react-pdf/issues/2466)\n\n- [#2416](https://github.com/diegomura/react-pdf/pull/2416) [`4c40b14`](https://github.com/diegomura/react-pdf/commit/4c40b149cfed42f2513e1dd330a92ccc3363c04f) Thanks [@TheMikeyRoss](https://github.com/TheMikeyRoss)! - Updated svg.d.ts to include strokeLinejoin\n\n## 2.3.4\n\n### Patch Changes\n\n- [#2130](https://github.com/diegomura/react-pdf/pull/2130) [`4a55c1b`](https://github.com/diegomura/react-pdf/commit/4a55c1b2ed19e460ccae6e749ed94c16729a23c4) Thanks [@PoornakumarRasiraju](https://github.com/PoornakumarRasiraju)! - fix: allow credentials option in Image\n\n## 2.3.3\n\n### Patch Changes\n\n- [#2276](https://github.com/diegomura/react-pdf/pull/2276) [`1e1fbdc`](https://github.com/diegomura/react-pdf/commit/1e1fbdc3c33ced46d8c7ebba7a196733cb789d59) Thanks [@renchap](https://github.com/renchap)! - add `aspectRatio` style property\n\n* [#2293](https://github.com/diegomura/react-pdf/pull/2293) [`8636812`](https://github.com/diegomura/react-pdf/commit/86368122ed87621d19ae3bc248080e17703d9fcb) Thanks [@BryanAbate](https://github.com/BryanAbate)! - fix type for `getRegisteredFonts` method\n\n## 2.3.2\n\n### Patch Changes\n\n- [#2310](https://github.com/diegomura/react-pdf/pull/2310) [`a25dbcb`](https://github.com/diegomura/react-pdf/commit/a25dbcb32b65c300f5b088e8b210bb0c1abca5c2) Thanks [@wojtekmaj](https://github.com/wojtekmaj)! - Fixed all strings allowed in `fontWeight` in `Font.register`\n\n## 2.3.1\n\n### Patch Changes\n\n- [#2252](https://github.com/diegomura/react-pdf/pull/2252) [`47e91cb`](https://github.com/diegomura/react-pdf/commit/47e91cbd8016046bb4e8389ba0d1c7ede9edce59) Thanks [@jeetiss](https://github.com/jeetiss)! - implement function as emoji source to build more complex urls\n\n## 2.3.0\n\n### Minor Changes\n\n- [#2214](https://github.com/diegomura/react-pdf/pull/2214) [`2db67a3`](https://github.com/diegomura/react-pdf/commit/2db67a38b9be98b7816a2b5aa4733446b95e3724) Thanks [@KODIKAS-NL](https://github.com/KODIKAS-NL)! - added base support for verticalAlign \"super\" and \"sub\"\n\n## 2.2.0\n\n### Minor Changes\n\n- [#2160](https://github.com/diegomura/react-pdf/pull/2160) [`a743c90`](https://github.com/diegomura/react-pdf/commit/a743c905fb5d201d2382bc9175fa36b83cc47284) Thanks [@jeetiss](https://github.com/jeetiss)! - implement flex gap\n\n## 2.1.1\n\n### Patch Changes\n\n- [#2106](https://github.com/diegomura/react-pdf/pull/2106) [`24bb5de`](https://github.com/diegomura/react-pdf/commit/24bb5de969a854cc0226438985b34ef8ae2d7581) Thanks [@RDO34](https://github.com/RDO34)! - Add `dpi` and `bookmark` page prop types\n\n## 2.1.0\n\n### Minor Changes\n\n- [#1862](https://github.com/diegomura/react-pdf/pull/1862) [`1411d16`](https://github.com/diegomura/react-pdf/commit/1411d162e04ca237bad93729695c363fdf4bdbeb) Thanks [@diegomura](https://github.com/diegomura)! - feat: bookmarks support\n\n* [#1867](https://github.com/diegomura/react-pdf/pull/1867) [`4fadb48`](https://github.com/diegomura/react-pdf/commit/4fadb48983d7269452f89f80c7e341ece859aaee) Thanks [@diegomura](https://github.com/diegomura)! - feat: add page layout support\n\n- [#1868](https://github.com/diegomura/react-pdf/pull/1868) [`ce8762f`](https://github.com/diegomura/react-pdf/commit/ce8762f6de5c796e69ec5a225c7f3ff9c619a960) Thanks [@diegomura](https://github.com/diegomura)! - feat: add page mode support\n\n* [#1869](https://github.com/diegomura/react-pdf/pull/1869) [`5d2c308`](https://github.com/diegomura/react-pdf/commit/5d2c3088cf438a8abf1038b14a21117fecf59d57) Thanks [@diegomura](https://github.com/diegomura)! - feat: variable dpi\n\n## 2.0.9\n\n### Patch Changes\n\n- [#1843](https://github.com/diegomura/react-pdf/pull/1843) [`fe0f214`](https://github.com/diegomura/react-pdf/commit/fe0f214dbbf2f632b852ebfe65f886ecc4dd6953) Thanks [@diegomura](https://github.com/diegomura)! - fix: add ID1 type\n\n## 2.0.8\n\n### Patch Changes\n\n- [#1581](https://github.com/diegomura/react-pdf/pull/1581) [`04449ab`](https://github.com/diegomura/react-pdf/commit/04449ab352db0cca2155024dd3e8c690e42193ca) Thanks [@jeetiss](https://github.com/jeetiss)! - added changelog with changesets\n"
  },
  {
    "path": "packages/types/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/5600341/27505816-c8bc37aa-587f-11e7-9a86-08a2d081a8b9.png\" height=\"280px\">\n</p>\n\n# @react-pdf/types\n\n> React-pdf TypeScript definitions\n\n## How to install\n\n```sh\nyarn add @react-pdf/types\n```\n\n## License\n\nMIT © [Diego Muracciole](http://github.com/diegomura)\n"
  },
  {
    "path": "packages/types/bookmark.d.ts",
    "content": "interface ExpandedBookmark {\n  title: string;\n  top?: number;\n  left?: number;\n  zoom?: number;\n  fit?: true | false;\n  expanded?: true | false;\n}\n\nexport type Bookmark = string | ExpandedBookmark;\n"
  },
  {
    "path": "packages/types/context.d.ts",
    "content": "// instance.registerFont = vi.fn().mockReturnValue(instance);\n// instance.note = vi.fn().mockReturnValue(instance);\n// instance.rotate = vi.fn().mockReturnValue(instance);\n// instance.scale = vi.fn().mockReturnValue(instance);\n// instance.translate = vi.fn().mockReturnValue(instance);\n// instance.link = vi.fn().mockReturnValue(instance);\n// instance.goTo = vi.fn().mockReturnValue(instance);\n// instance.addNamedDestination = vi.fn().mockReturnValue(instance);\n// instance.clip = vi.fn().mockReturnValue(instance);\n// instance.closePath = vi.fn().mockReturnValue(instance);\n// instance.path = vi.fn().mockReturnValue(instance);\n// instance.radialGradient = vi.fn().mockReturnValue(instance);\n// instance.linearGradient = vi.fn().mockReturnValue(instance);\n// instance.fontSize = vi.fn().mockReturnValue(instance);\n// instance.text = vi.fn().mockReturnValue(instance);\n// instance.font = vi.fn().mockReturnValue(instance);\n\ninterface DocumentInfo {\n  Producer?: string;\n  Creator?: string;\n  CreationDate?: Date;\n  Title?: string;\n  Author?: string;\n  Keywords?: string;\n  ModDate?: Date;\n}\n\ninterface PageOption {\n  margin?: number;\n  size?: number[] | string;\n}\n\ninterface ImageOption {\n  width?: number;\n  height?: number;\n}\n\ntype ColorValue = string;\n\nexport interface Context {\n  info: DocumentInfo;\n  undash(): this;\n  end: () => void;\n  save: () => this;\n  restore: () => this;\n  lineCap(c: string): this;\n  miterLimit(m: any): this;\n  lineJoin(j: string): this;\n  lineWidth(w: number): this;\n  fill(color?: ColorValue): this;\n  stroke(color?: ColorValue): this;\n  moveTo(x: number, y: number): this;\n  lineTo(x: number, y: number): this;\n  opacity(opacity: number): this;\n  fillOpacity(opacity: number): this;\n  addPage(options?: PageOption): this;\n  polygon(...points: number[][]): this;\n  strokeOpacity(opacity: number): this;\n  dash(length: number, option: any): this;\n  circle(x: number, y: number, raduis: number): this;\n  fillColor(color: ColorValue, opacity?: number): this;\n  rect(x: number, y: number, w: number, h: number): this;\n  strokeColor(color: ColorValue, opacity?: number): this;\n  ellipse(x: number, y: number, r1: number, r2?: number): this;\n  quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): this;\n  image(src: any, x?: number, y?: number, options?: ImageOption): Context;\n  roundedRect(x: number, y: number, w: number, h: number, r?: number): this;\n  bezierCurveTo(\n    cp1x: number,\n    cp1y: number,\n    cp2x: number,\n    cp2y: number,\n    x: number,\n    y: number,\n  ): this;\n}\n"
  },
  {
    "path": "packages/types/font.d.ts",
    "content": "export {\n  FontStyle,\n  FontWeight,\n  EmojiSource,\n  FontDescriptor,\n  HyphenationCallback,\n  FontStoreType as FontStore,\n} from '@react-pdf/font';\n"
  },
  {
    "path": "packages/types/image.d.ts",
    "content": "type HTTPMethod = 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\ntype SourceURL = string;\n\ntype SourceBuffer = Buffer;\n\ntype SourceBlob = Blob;\n\ntype SourceDataBuffer = { data: Buffer; format: 'png' | 'jpg' };\n\ntype SourceURLObject = {\n  uri: string;\n  method?: HTTPMethod;\n  body?: any;\n  headers?: any;\n  credentials?: 'omit' | 'same-origin' | 'include';\n};\n\ntype Source =\n  | SourceURL\n  | SourceBuffer\n  | SourceBlob\n  | SourceDataBuffer\n  | SourceURLObject\n  | undefined;\n\ntype SourceFactory = () => Source;\n\ntype SourceAsync = Promise<Source>;\n\ntype SourceAsyncFactory = () => Promise<Source>;\n\nexport type SourceObject =\n  | Source\n  | SourceFactory\n  | SourceAsync\n  | SourceAsyncFactory;\n"
  },
  {
    "path": "packages/types/index.d.ts",
    "content": "export * from './pdf';\nexport * from './svg';\nexport * from './node';\nexport * from './page';\nexport * from './font';\nexport * from './style';\nexport * from './image';\nexport * from './context';\nexport * from './primitive';\nexport * from './bookmark';\n"
  },
  {
    "path": "packages/types/node.d.ts",
    "content": "import { Style } from './style';\nimport { Primitive } from './primitive';\nimport { HyphenationCallback } from './font';\nimport { PageSize, Orientation } from './page';\nimport { Bookmark } from './bookmark';\n\ninterface BaseProps {\n  id?: string;\n  fixed?: boolean;\n  break?: boolean;\n  debug?: boolean;\n  bookmark?: Bookmark;\n  minPresenceAhead?: number;\n}\n\ntype DynamicRenderCallback = (props: {\n  pageNumber: number;\n  totalPages: number;\n}) => any;\n\ninterface TextProps extends BaseProps {\n  wrap?: boolean;\n  widows?: number;\n  orphans?: number;\n  render?: DynamicRenderCallback;\n  hyphenationCallback?: HyphenationCallback;\n}\n\ninterface ViewProps extends BaseProps {\n  wrap?: boolean;\n  render?: (props: { pageNumber: number }) => any;\n}\n\ninterface PageProps extends BaseProps {\n  wrap?: boolean;\n  size?: PageSize;\n  orientation?: Orientation;\n  dpi?: number;\n}\n\ntype PageLayout =\n  | 'singlePage'\n  | 'oneColumn'\n  | 'twoColumnLeft'\n  | 'twoColumnRight'\n  | 'twoPageLeft'\n  | 'twoPageRight';\n\ntype PageMode =\n  | 'useNone'\n  | 'useOutlines'\n  | 'useThumbs'\n  | 'fullScreen'\n  | 'useOC'\n  | 'useAttachments';\n\ninterface DocumentProps {\n  title?: string;\n  author?: string;\n  subject?: string;\n  keywords?: string;\n  creator?: string;\n  producer?: string;\n  creationDate?: Date;\n  modificationDate?: Date;\n  pageLayout?: PageLayout;\n  pageMode?: PageMode;\n}\n\ninterface TextInstanceNode {\n  type: Primitive.TextInstance;\n  value: string;\n}\n\ninterface TextNode {\n  type: Primitive.Text;\n  lines?: any[];\n  style?: Style;\n  props?: TextProps;\n  children?: TextInstanceNode[];\n}\n\ninterface ViewNode {\n  type: Primitive.View;\n  style?: Style;\n  props?: ViewProps;\n  children?: (ViewNode | TextNode)[];\n}\n\ninterface PageNode {\n  type: Primitive.Page;\n  style?: Style;\n  props?: PageProps;\n  children?: (ViewNode | TextNode)[];\n}\n\nexport interface DocumentNode {\n  type: Primitive.Document;\n  props?: DocumentProps;\n  children: PageNode[];\n}\n\nexport type Node = DocumentNode | PageNode | ViewNode;\n"
  },
  {
    "path": "packages/types/package.json",
    "content": "{\n  \"name\": \"@react-pdf/types\",\n  \"version\": \"2.9.2\",\n  \"license\": \"MIT\",\n  \"description\": \"React-pdf TypeScript definitions\",\n  \"author\": \"Diego Muracciole <diegomuracciole@gmail.com>\",\n  \"homepage\": \"https://github.com/diegomura/react-pdf#readme\",\n  \"main\": \"index.d.ts\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/diegomura/react-pdf.git\",\n    \"directory\": \"packages/types\"\n  },\n  \"dependencies\": {\n    \"@react-pdf/font\": \"^4.0.4\",\n    \"@react-pdf/primitives\": \"^4.1.1\",\n    \"@react-pdf/stylesheet\": \"^6.1.2\"\n  }\n}\n"
  },
  {
    "path": "packages/types/page.d.ts",
    "content": "export type Orientation = 'portrait' | 'landscape';\n\ntype StandardPageSize =\n  | '4A0'\n  | '2A0'\n  | 'A0'\n  | 'A1'\n  | 'A2'\n  | 'A3'\n  | 'A4'\n  | 'A5'\n  | 'A6'\n  | 'A7'\n  | 'A8'\n  | 'A9'\n  | 'A10'\n  | 'B0'\n  | 'B1'\n  | 'B2'\n  | 'B3'\n  | 'B4'\n  | 'B5'\n  | 'B6'\n  | 'B7'\n  | 'B8'\n  | 'B9'\n  | 'B10'\n  | 'C0'\n  | 'C1'\n  | 'C2'\n  | 'C3'\n  | 'C4'\n  | 'C5'\n  | 'C6'\n  | 'C7'\n  | 'C8'\n  | 'C9'\n  | 'C10'\n  | 'RA0'\n  | 'RA1'\n  | 'RA2'\n  | 'RA3'\n  | 'RA4'\n  | 'SRA0'\n  | 'SRA1'\n  | 'SRA2'\n  | 'SRA3'\n  | 'SRA4'\n  | 'EXECUTIVE'\n  | 'FOLIO'\n  | 'LEGAL'\n  | 'LETTER'\n  | 'TABLOID'\n  | 'ID1';\n\ntype StaticSize = number | string;\n\nexport type PageSize =\n  | StandardPageSize\n  | [StaticSize]\n  | [StaticSize, StaticSize]\n  | { width: StaticSize; height?: StaticSize };\n"
  },
  {
    "path": "packages/types/pdf.d.ts",
    "content": "export type PDFVersion = '1.3' | '1.4' | '1.5' | '1.6' | '1.7' | '1.7ext3';\n"
  },
  {
    "path": "packages/types/primitive.d.ts",
    "content": "import * as P from '@react-pdf/primitives';\n\nexport enum Primitive {\n  G = P.G,\n  Svg = P.Svg,\n  View = P.View,\n  Text = P.Text,\n  Link = P.Link,\n  Page = P.Page,\n  Note = P.Note,\n  Path = P.Path,\n  Rect = P.Rect,\n  Line = P.Line,\n  Stop = P.Stop,\n  Defs = P.Defs,\n  Image = P.Image,\n  Tspan = P.Tspan,\n  Canvas = P.Canvas,\n  Circle = P.Circle,\n  Ellipse = P.Ellipse,\n  Polygon = P.Polygon,\n  Document = P.Document,\n  Polyline = P.Polyline,\n  ClipPath = P.ClipPath,\n  TextInstance = P.TextInstance,\n  LinearGradient = P.LinearGradient,\n  RadialGradient = P.RadialGradient,\n}\n"
  },
  {
    "path": "packages/types/style.d.ts",
    "content": "export { Style } from '@react-pdf/stylesheet';\n"
  },
  {
    "path": "packages/types/svg.d.ts",
    "content": "export interface SVGPresentationAttributes {\n  fill?: string;\n  color?: string;\n  stroke?: string;\n  transform?: string;\n  strokeDasharray?: string;\n  opacity?: string | number;\n  strokeWidth?: string | number;\n  fillOpacity?: string | number;\n  fillRule?: 'nonzero' | 'evenodd';\n  strokeOpacity?: string | number;\n  textAnchor?: 'start' | 'middle' | 'end';\n  strokeLinecap?: 'butt' | 'round' | 'square';\n  strokeLinejoin?: 'butt' | 'round' | 'square' | 'miter' | 'bevel';\n  visibility?: 'visible' | 'hidden' | 'collapse';\n  clipPath?: string;\n  dominantBaseline?:\n    | 'auto'\n    | 'middle'\n    | 'central'\n    | 'hanging'\n    | 'mathematical'\n    | 'text-after-edge'\n    | 'text-before-edge';\n}\n"
  },
  {
    "path": "vitest.config.js",
    "content": "import { defineConfig } from 'vitest/config';\nimport react from '@vitejs/plugin-react';\n\nexport default defineConfig({\n  plugins: [react()],\n  test: {\n    watch: false,\n    poolOptions: {\n      threads: {\n        isolate: false,\n      },\n    },\n  },\n});\n"
  },
  {
    "path": "vitest.workspace.js",
    "content": "export default [\n  'packages/fns',\n  'packages/font',\n  'packages/image',\n  'packages/render',\n  'packages/layout',\n  'packages/svgkit',\n  'packages/textkit',\n  'packages/renderer/vitest.config.js',\n  'packages/renderer/vitest.browser.config.js',\n  'packages/stylesheet',\n  'packages/primitives',\n];\n"
  }
]