diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..e9dcdb3 --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +DOCS_ORIGIN=http://localhost:4321 +DOCS_BRANCH=docs-new +# Optional locally; deployment requires both. Never commit real credentials. +HCTI_API_ID= +HCTI_API_KEY= diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 94f2c41..988f310 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,46 +1,93 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. -# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake -# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby - -# - uses: actions/cache@v2 -# with: -# path: vendor/bundle -# key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} -# restore-keys: | -# ${{ runner.os }}-gems- - -name: Deploy +name: Build and deploy docs on: - workflow_dispatch: push: - branches: [ main ] + branches: [docs-new, main] + pull_request: + branches: [main] + workflow_dispatch: +permissions: + contents: read -jobs: - Deploy: +concurrency: + group: docs-${{ github.ref }} + cancel-in-progress: true +jobs: + check: runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '24' + cache: npm + - run: npm ci + - run: npm test + - run: npm run build + env: + DOCS_ORIGIN: https://docs-new-docs.mike.workers.dev + DOCS_BRANCH: ${{ github.head_ref || github.ref_name }} + - run: npm run check:migration + preview: + needs: check + if: github.ref == 'refs/heads/docs-new' && github.event_name != 'pull_request' + runs-on: ubuntu-latest + environment: + name: docs-preview + url: https://docs-new-docs.mike.workers.dev steps: - - uses: actions/checkout@v4 - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: 3.1 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '24' + cache: npm + - run: npm ci + - name: Build with signed HCTI Open Graph URLs + run: npm run build + env: + DOCS_ORIGIN: https://docs-new-docs.mike.workers.dev + DOCS_BRANCH: docs-new + REQUIRE_OG_SIGNING: 'true' + HCTI_API_ID: ${{ secrets.V2_HCTI_API_ID }} + HCTI_API_KEY: ${{ secrets.V2_HCTI_API_KEY }} + - run: npm run check:migration + - name: Upload preview version (does not deploy to production) + run: npx wrangler versions upload --preview-alias docs-new + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CF_API_TOKEN }} + - name: Verify preview routes and headers + run: node scripts/check-preview.mjs https://docs-new-docs.mike.workers.dev - - name: Bundle install - run: | - bundle config path vendor/bundle - bundle install --jobs 4 --retry 3 - - name: Build site - env: - HCTI_API_KEY: ${{ secrets.HCTI_API_KEY }} - run: JEKYLL_ENV=production bundle exec jekyll build - - name: Publish - uses: cloudflare/wrangler-action@v3 - with: - apiToken: ${{ secrets.CF_API_TOKEN }} + production: + needs: check + if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request' + runs-on: ubuntu-latest + environment: + name: docs-production + url: https://docs.htmlcsstoimage.com + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '24' + cache: npm + - run: npm ci + - name: Build production docs with signed HCTI Open Graph URLs + run: npm run build + env: + DOCS_ORIGIN: https://docs.htmlcsstoimage.com + DOCS_ENV: production + DOCS_BRANCH: main + REQUIRE_OG_SIGNING: 'true' + HCTI_API_ID: ${{ secrets.V2_HCTI_API_ID }} + HCTI_API_KEY: ${{ secrets.V2_HCTI_API_KEY }} + - run: npm run check:migration + - name: Verify production metadata and sitemap + run: node scripts/check-production.mjs + - name: Deploy production Worker + run: npx wrangler deploy + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CF_API_TOKEN }} diff --git a/.gitignore b/.gitignore index cb327e1..4be0d88 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,18 @@ _site .sass-cache .jekyll-cache .jekyll-metadata +.ruby-lsp/ +.DS_Store vendor /.idea +node_modules/ +.astro/ +.wrangler/ +dist/ +src/generated/ +migration-report.json +.env +.env.* +!.env.example + +reports/ diff --git a/.ruby-version b/.ruby-version deleted file mode 100644 index ff365e0..0000000 --- a/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -3.1.3 diff --git a/404.html b/404.html deleted file mode 100644 index 086a5c9..0000000 --- a/404.html +++ /dev/null @@ -1,25 +0,0 @@ ---- -permalink: /404.html -layout: default ---- - - - -
-

404

- -

Page not found :(

-

The requested page could not be found.

-
diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 0ee38e7..0000000 --- a/Gemfile +++ /dev/null @@ -1,43 +0,0 @@ -source "https://rubygems.org" -# Hello! This is where you manage which Jekyll version is used to run. -# When you want to use a different version, change it below, save the -# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: -# -# bundle exec jekyll serve -# -# This will help ensure the proper Jekyll version is running. -# Happy Jekylling! -gem "jekyll", "~> 4.3.1" - -gem "just-the-docs", git: 'https://github.com/mscoutermarsh/just-the-docs' -gem "pry" -gem "pry-byebug" -gem 'jekyll-octicons' -gem 'yui-compressor' -gem 'uglifier' -gem 'htmlcsstoimage-api' - -# If you want to use GitHub Pages, remove the "gem "jekyll"" above and -# uncomment the line below. To upgrade, run `bundle update github-pages`. -# gem "github-pages", group: :jekyll_plugins -# If you have any plugins, put them here! -group :jekyll_plugins do - gem "jekyll-feed", "~> 0.12" - gem 'jekyll-include_snippet' - gem "jekyll_asset_pipeline" - gem 'liquid' - gem 'jekyll-sitemap' - gem "jekyll-last-modified-at" - gem 'jekyll-cloudinary' -end - -# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem -# and associated library. -platforms :mingw, :x64_mingw, :mswin, :jruby do - gem "tzinfo", "~> 1.2" - gem "tzinfo-data" -end - -# Performance-booster for watching directories on Windows -gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin] - diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index cec52e3..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,140 +0,0 @@ -GIT - remote: https://github.com/mscoutermarsh/just-the-docs - revision: 8ed553fb55b52bd21c6fe55df1fb58779e21c45d - specs: - just-the-docs (0.3.0) - jekyll (>= 3.8.5) - jekyll-seo-tag (~> 2.0) - rake (>= 12.3.1, < 13.1.0) - -GEM - remote: https://rubygems.org/ - specs: - addressable (2.8.1) - public_suffix (>= 2.0.2, < 6.0) - byebug (11.1.3) - coderay (1.1.3) - colorator (1.1.0) - concurrent-ruby (1.1.10) - em-websocket (0.5.3) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0) - eventmachine (1.2.7) - execjs (2.7.0) - fastimage (2.2.6) - ffi (1.15.5) - forwardable-extended (2.6.0) - htmlcsstoimage-api (0.1.3) - addressable (> 2.5.0) - httparty (> 0.10) - http_parser.rb (0.8.0) - httparty (0.21.0) - mini_mime (>= 1.0.0) - multi_xml (>= 0.5.2) - i18n (1.12.0) - concurrent-ruby (~> 1.0) - jekyll (4.3.1) - addressable (~> 2.4) - colorator (~> 1.0) - em-websocket (~> 0.5) - i18n (~> 1.0) - jekyll-sass-converter (>= 2.0, < 4.0) - jekyll-watch (~> 2.0) - kramdown (~> 2.3, >= 2.3.1) - kramdown-parser-gfm (~> 1.0) - liquid (~> 4.0) - mercenary (>= 0.3.6, < 0.5) - pathutil (~> 0.9) - rouge (>= 3.0, < 5.0) - safe_yaml (~> 1.0) - terminal-table (>= 1.8, < 4.0) - webrick (~> 1.7) - jekyll-cloudinary (1.14.1) - fastimage (~> 2.0) - jekyll (>= 3.6, < 5) - jekyll-feed (0.14.0) - jekyll (>= 3.7, < 5.0) - jekyll-include_snippet (0.2.0) - liquid (>= 3.0) - jekyll-last-modified-at (1.3.0) - jekyll (>= 3.7, < 5.0) - posix-spawn (~> 0.3.9) - jekyll-octicons (17.7.0) - jekyll (>= 3.6, < 5.0) - octicons (= 17.7.0) - jekyll-sass-converter (2.2.0) - sassc (> 2.0.1, < 3.0) - jekyll-seo-tag (2.6.1) - jekyll (>= 3.3, < 5.0) - jekyll-sitemap (1.4.0) - jekyll (>= 3.7, < 5.0) - jekyll-watch (2.2.1) - listen (~> 3.0) - jekyll_asset_pipeline (0.6.2) - jekyll (>= 3.5, < 5.0) - liquid (~> 4.0) - kramdown (2.4.0) - rexml - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - liquid (4.0.3) - listen (3.7.1) - rb-fsevent (~> 0.10, >= 0.10.3) - rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.4.0) - method_source (1.0.0) - mini_mime (1.1.2) - multi_xml (0.6.0) - octicons (17.7.0) - pathutil (0.16.2) - forwardable-extended (~> 2.6) - posix-spawn (0.3.14) - pry (0.13.1) - coderay (~> 1.1) - method_source (~> 1.0) - pry-byebug (3.9.0) - byebug (~> 11.0) - pry (~> 0.13.0) - public_suffix (5.0.1) - rake (13.0.6) - rb-fsevent (0.11.2) - rb-inotify (0.10.1) - ffi (~> 1.0) - rexml (3.2.5) - rouge (4.0.1) - safe_yaml (1.0.5) - sassc (2.4.0) - ffi (~> 1.9) - terminal-table (3.0.2) - unicode-display_width (>= 1.1.1, < 3) - uglifier (4.2.0) - execjs (>= 0.3.0, < 3) - unicode-display_width (2.3.0) - webrick (1.7.0) - yui-compressor (0.12.0) - -PLATFORMS - ruby - -DEPENDENCIES - htmlcsstoimage-api - jekyll (~> 4.3.1) - jekyll-cloudinary - jekyll-feed (~> 0.12) - jekyll-include_snippet - jekyll-last-modified-at - jekyll-octicons - jekyll-sitemap - jekyll_asset_pipeline - just-the-docs! - liquid - pry - pry-byebug - tzinfo (~> 1.2) - tzinfo-data - uglifier - wdm (~> 0.1.1) - yui-compressor - -BUNDLED WITH - 2.5.0 diff --git a/README.md b/README.md index 14c5ba3..dacaf35 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,189 @@ -# Docs +# HTML/CSS to Image docs - +The `docs-new` branch rewrites the docs with Astro, Starlight, and Tailwind, +served by the existing Cloudflare `docs` Worker. Production is still the Jekyll +site until cutover. -👋 This is the source for our documentation site: https://docs.htmlcsstoimage.com. +Pages live in `src/content/docs` as native Markdown/MDX. There is no Jekyll build, +Liquid compatibility layer, or content conversion step. Original URLs, redirects, image paths, and +heading anchors are checked against the inventory in `migration/`. -If you've found an error, or would like to suggest an improvement, please open an issue or a pull request. +## Local development -## Get help -If you need help with your account, please email us: support@htmlcsstoimage.com +Use Node.js 22.12 or later: -## Development +```sh +npm ci +npm run dev +``` + +To test Worker behavior, including images, redirects, and Markdown negotiation: -This is a static site generated by Jekyll and served from [Cloudflare Workers](https://blog.cloudflare.com/workers-sites/). +```sh +npm run build +npm run preview +``` -To run it locally, you need Ruby installed. +Use the local URL printed by Wrangler. `npm run dev` serves Astro directly and +does not run the Worker middleware. HCTI credentials are optional locally; signed +Open Graph image metadata is omitted when credentials are absent. -1. Install the gems +## Validation +```sh +npm test +npm run build +npm run check:migration +node scripts/check-preview.mjs http://localhost:8787 ``` -bundle install -``` -2. Start the development server +Pass the actual Wrangler URL to the last command. `npm run check:migration` +requires all 148 original routes to exist or redirect to a native page. It checks +old anchors, internal links, assets, external-link attributes, and Markdown +exports, and writes `migration-report.json`. CI runs this complete-site gate. + +## Fonts + +IBM Plex Sans and Mono are configured through Astro's built-in Fontsource provider +in `astro.config.mjs`. Astro downloads and caches fonts during the build, then +serves fingerprinted WOFF2 files from `/_astro/fonts/` with immutable caching. +Visitors make no Google Fonts requests. The font license is in +`public/assets/fonts/OFL.txt`. + +`` supplies font-face declarations and adjusted fallbacks. Only the normal +Latin Sans face is preloaded; other subsets, italics, and Mono load as needed. +Docs and OG cards share the same self-hosted Sans font. New/uncached font builds +need network access to Fontsource; rendering the deployed site does not. + +## Page prefetching + +`src/scripts/prefetch.ts` warms internal HTML pages on hover, focus, or pointer down +using the same fetch request as Astro's ClientRouter. Navigation waits for an +in-flight prefetch, then uses the browser cache. The Worker's page responses use +`Cache-Control: private, max-age=60` and `Vary: Accept`, so HTML and Markdown stay +separate. Content can remain cached in a browser for up to a minute after deployment. + +Astro's native link-prefetch is disabled because its response was not reused by +ClientRouter in our browser tests. The helper skips external links, downloads, +Markdown links, explicit full-navigation links, and slow/data-saving connections. +DevTools' Disable cache option prevents cache reuse when testing this behavior. + +## Bundle analysis + +Run `npm run analyze` to build the site and generate interactive reports in +`reports/bundle-client.html` and `reports/bundle-prerender.html`, with JSON +versions alongside them. An SSR report is also generated if that environment runs. +The client report shows bundled browser JavaScript; prerender/SSR reports describe +build-time rendering code and are not browser downloads. Toggle gzip/Brotli sizes +and inspect imports to find large dependencies. Compression sizes are estimates, +not measured Cloudflare transfers. + +Reports are ignored by Git and stay outside `dist`, so they are never deployed. +Normal builds do not run the analyzer. Font files, runtime-loaded Pagefind +assets, and copied public assets need separate browser network measurements. + +## Page titles + +`title` is the default title, including the browser/SEO title. Optional +`page_title` overrides the visible H1, breadcrumb, page actions, and Markdown +title. Optional `og_title` overrides Open Graph/Twitter title metadata and the +generated HCTI image heading. Both fall back to `title` when omitted. +```yaml +title: "HTML-to-Image, PDF & Screenshot MCP" +page_title: "Integrating the HTML/CSS to Image MCP Server" +og_title: "HTML-to-Image, PDF & Screenshot MCP" ``` -HCTI_API_KEY=key bundle exec jekyll serve --livereload + +## Changelog entries + +Add one Markdown file in `src/content/docs/changelog`, named +`YYYY_MM_DD__entry-title.md`. For example: + +```yaml +--- +title: "Official Go client" +slug: changelog/2026-09-15-official-go-client +description: "Typed Go requests, responses, and signed URL helpers." +section: Changelog +tableOfContents: false +changelog: + date: '2026-09-15' + anchor: official-go-client +sidebar: + hidden: true +--- ``` -`HCTI_API_KEY` is only required to be set for production. You can set it to a fake value for development. +Write the full release notes below the YAML. `description` supplies the archive +and homepage summary. Dates sort newest first; the homepage shows five entries. +The archive groups updates by year. Keep each `slug` and `changelog.anchor` +stable so individual page URLs and existing archive links continue working. +Every entry receives the same Markdown export and OG metadata as other docs. +Entry pages include breadcrumbs and chronological Previous/Next links; the +oldest and newest entries show only the neighbor that exists. + +## Components and Markdown + +Components must render useful static content for both readers and agents. +The build exports rendered articles as Markdown. Request an ordinary page URL +with `Accept: text/markdown`, or use its `.md` URL. Images include alt text and +captions; parameter tables become GFM tables. See [the component authoring +contract](scripts/MARKDOWN.md). + +`llms.txt` indexes every native page's Markdown URL. `llms-full.txt` contains the +same exported articles in one file; both are refreshed during each build. + +Documentation images use build-time Sharp optimization and `starlight-image-zoom` +for enlargement. `npm run build` and `npm run dev` prepare AVIF/WebP variants at +384, 768, 1280, and 1600 pixels (never upscaling small originals). `DocImage` +selects these static files with ``/`srcset`; no Cloudflare Images binding +or runtime transformation is needed. Originals in `public/assets/images` retain +their URLs for Markdown and full-resolution zoom. Commit generated variants in +`public/assets/images/g` and their manifest in `src/data/images.json` alongside source +image changes. Builds reuse these files by source-content/settings hash, including +on fresh checkouts and CI; only missing or changed variants are encoded. File +modification dates are not used, so Git checkout does not trigger re-encoding. +Variants are grouped by the original path without its extension, for example +`public/assets/images/g/template-editor/te-quote-preset-editor/.w768.avif`. +Missing variants are recreated; obsolete variants and empty source folders are +removed automatically when preparing images. +Run `npm run prepare:images` after adding or replacing images during development. +Do not introduce Cloudinary tags or legacy style classes. + +The build applies `target="_blank" rel="noopener"` to external HTTP(S) +links across complete rendered pages, including components, navigation and footer. +Internal docs links and email links retain their normal behavior. `npm run check` +enforces this policy. Use the built Worker preview to check it; Astro's development +server does not run post-build integrations. + +## Preview deployment + +GitHub Actions builds `docs-new` and uploads a version of the existing Worker +with the `docs-new` preview alias: + +https://docs-new-docs.mike.workers.dev + +Required Actions secrets are `CF_API_TOKEN`, `V2_HCTI_API_ID`, and +`V2_HCTI_API_KEY`. The latter two are mapped to `HCTI_API_ID` and `HCTI_API_KEY` +for build-time signing with the HCTI npm package. Signing creates stable URLs; +it does not request image generation during the build. + +The workflow uses `wrangler versions upload`, which does not deploy that version +to production. The production job runs only on `main` (never pull requests), after validation. +Static assets (`/_astro/`, `/_og/`, `/assets/`, `/pagefind/`, `/search/`, and `/favicon.ico`) bypass +the Worker. Pages still run through it for Markdown negotiation and redirects. +`public/_headers` preserves security headers and marks workers.dev asset responses noindex. +Preview responses are marked noindex. Merging into `main` triggers a fresh production +build with the production origin, indexable metadata, and signed HCTI URLs, then +deploys the existing `docs` Worker. The production metadata gate runs before deployment. + +The build publishes a single `/sitemap.xml`, advertised by `/robots.txt`. +If the sitemap eventually needs multiple chunks, that same URL becomes the index. +`/sitemap-index.xml` redirects to `/sitemap.xml` for compatibility. Individual +changelog entries have priority 0.2; other documentation pages have priority 0.8. -## Production -[![](https://github.com/htmlcsstoimage/docs/workflows/Deploy/badge.svg)](https://github.com/htmlcsstoimage/docs/actions) +## Help -Docs are built and deployed with GitHub Actions. +For account help, email support@htmlcsstoimage.com. For documentation fixes, +open an issue or pull request in this repository. diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 794115f..0000000 --- a/_config.yml +++ /dev/null @@ -1,120 +0,0 @@ -# Welcome to Jekyll! -# -# This config file is meant for settings that affect your whole blog, values -# which you are expected to set up once and rarely edit after that. If you find -# yourself editing this file very often, consider using Jekyll's data files -# feature for the data you need to update frequently. -# -# For technical reasons, this file is *NOT* reloaded automatically when you use -# 'bundle exec jekyll serve'. If you change this file, please restart the server process. -# -# If you need help with YAML syntax, here are some quick references for you: -# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml -# https://learnxinyminutes.com/docs/yaml/ -# -# Site settings -# These are used to personalize your new site. If you look in the HTML files, -# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. -# You can create any custom variable you would like, and they will be accessible -# in the templates via {{ site.myvariable }}. - -title: HTML/CSS to Image -email: support@htmlcsstoimage.com -description: >- # this means to ignore newlines until "baseurl:" - The API for generating high quality images from HTML/CSS. Convert HTML/CSS to an image (png, jpeg or webp). -baseurl: "" # the subpath of your site, e.g. /blog -url: "https://docs.htmlcsstoimage.com" # the base hostname & protocol for your site, e.g. http://example.com -twitter_username: htmlcsstoimage.com -github_username: htmlcsstoimage -logo: "/assets/images/HCTI.png" - -highlighter: rouge -markdown: kramdown -kramdown: - syntax_highlighter: rouge - syntax_highlighter_opts: - block: - line_numbers: false - -# Build settings -theme: just-the-docs -color_scheme: hcti -plugins: - - jekyll-sitemap - - jekyll-octicons - - jekyll-last-modified-at - -defaults: - - scope: - path: "" - values: - description: "Convert HTML to an image (jpg, png, webp). Renders images exactly like Google Chrome. Works with PHP, JavaScript, Ruby, .NET and more." - -last_edit_timestamp: true -last_edit_time_format: "%b %e %Y at %I:%M %p" # uses ruby's time format: https://ruby-doc.org/stdlib-2.7.0/libdoc/time/rdoc/Time.html - -cloudinary: - cloud_name: hcti - origin_url: https://docs.htmlcsstoimage.com - verbose: true - presets: - default: - min_width: 400 - max_width: 1200 - quality: "auto:good" - sizes: "400px" - fetch_format: auto - fallback_max_width: 800 - steps: 4 - attributes: - loading: "lazy" - class: "cloudinary-image" - -# Footer "Edit this page on GitHub" link text -gh_edit_link: true # show or hide edit this page link -gh_edit_link_text: "Edit this page on GitHub." -gh_edit_repository: "https://github.com/htmlcsstoimage/docs" # the github URL for your repo -gh_edit_branch: "main" # the branch that your docs is served from -gh_edit_view_mode: "tree" - -footer_content: "Built with extensive integration tests and serious care for developer happiness.
© 2018-2026 Code Happy, LLC." - -# Back to top link -back_to_top: true -back_to_top_text: "Back to top" - -# ga_tracking: UA-32961413-2 -search: - heading_level: 4 - -# Aux links for the upper right navigation -aux_links: - "Get an API Key": - - "https://htmlcsstoimage.com" - "Demo": - - "https://htmlcsstoimage.com/#demo" - -# Exclude from processing. -# The following items will not be processed, by default. -# Any item listed under the `exclude:` key here will be automatically added to -# the internal "default list". -# -# Excluded items can be processed by explicitly listing the directories or -# their entries' file path in the `include:` list. -# -exclude: - - dist - - searchIndex.js - - wrangler.toml - - workers-site/ - - archive/ - - .sass-cache/ - - .jekyll-cache/ - - gemfiles/ - - Gemfile - - Gemfile.lock - - node_modules/ - - vendor/bundle/ - - vendor/cache/ - - vendor/gems/ - - vendor/ruby/ diff --git a/_includes/additional_parameters.md b/_includes/additional_parameters.md deleted file mode 100644 index 45fb66e..0000000 --- a/_includes/additional_parameters.md +++ /dev/null @@ -1,31 +0,0 @@ -{% comment %} - Renders additional parameters from _data/parameters.json. - - context="html", "url", "templates", "og_config", "og_config_management", - or "create_and_render" - filters to parameters supported in that context. With no context, the table - keeps the combined HTML/URL API view. create_and_render=true remains supported - for existing callers. Set include_primary=true to also show primary fields - such as css when listing all supported options for a context. -{% endcomment %} -{% assign parameter_context = include.context | default: "api" -%} -{% if include.create_and_render -%} - {% assign parameter_context = "create_and_render" -%} -{% endif -%} -| Name | Type | Description | -|:-----|:-----|:------------| -{% for parameter in site.data.parameters.parameters -%} - {% assign show_parameter = false -%} - {% if parameter.additional or include.include_primary -%} - {% if parameter_context == "api" -%} - {% if parameter.support.html or parameter.support.url -%} - {% assign show_parameter = true -%} - {% endif -%} - {% elsif parameter.support[parameter_context] -%} - {% assign show_parameter = true -%} - {% endif -%} - {% endif -%} - {% if show_parameter -%} -| **[{{ parameter.name }}]({{ parameter.link }})** | `{{ parameter.type }}` | {{ parameter.description }} | - {% endif -%} -{% endfor -%} diff --git a/_includes/code_footer.md b/_includes/code_footer.md deleted file mode 100644 index 41407bd..0000000 --- a/_includes/code_footer.md +++ /dev/null @@ -1,22 +0,0 @@ -
- -{% if include.version == 1 %} -## Need help? - -Talk to a human. Please email us **support@htmlcsstoimage.com** with any questions and we'll gladly help you get started. - -{% endif %} -{% if include.version == 2 %} -## Need help? - -We're always looking to improve this documentation. Please send us an email: **support@htmlcsstoimage.com**. We respond fast. - -{% endif %} -{% if include.version == 3 %} -## Need help? - -Talk to a human: **support@htmlcsstoimage.com**. We always respond within 24 hours. And often, even faster. - -{% endif %} - - diff --git a/_includes/copy_page.html b/_includes/copy_page.html deleted file mode 100644 index e0f1034..0000000 --- a/_includes/copy_page.html +++ /dev/null @@ -1,151 +0,0 @@ -{% comment %} - Copy Page Component - Provides a dropdown to copy the page as markdown or view the raw markdown -{% endcomment %} - -{% if site.gh_edit_repository and site.gh_edit_branch and page.path %} - {% comment %} Extract repo path from full URL {% endcomment %} - {% assign repo_parts = site.gh_edit_repository | split: "github.com/" %} - {% assign repo_path = repo_parts[1] %} - {% assign raw_url = "https://raw.githubusercontent.com/" | append: repo_path | append: "/" | append: site.gh_edit_branch | append: "/" | append: page.path %} - {% assign view_url = site.gh_edit_repository | append: "/raw/refs/heads/" | append: site.gh_edit_branch | append: "/" | append: page.path %} - {% assign current_page_url = site.url | append: page.url %} - {% assign encoded_page_url = current_page_url | url_encode %} - {% assign chatgpt_url = "https://chatgpt.com/?hints=search&prompt=Read+from+" | append: encoded_page_url | append: "+so+I+can+ask+questions+about+it." %} - {% assign claude_url = "https://claude.ai/new?q=Read%20from%20" | append: encoded_page_url | append: "%20so%20I%20can%20ask%20questions%20about%20it." %} - - - - -{% endif %} - diff --git a/_includes/head.html b/_includes/head.html deleted file mode 100644 index 22ae433..0000000 --- a/_includes/head.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - {% if page.description %} - - {% else %} - - {% endif %} - - - - - {% seo %} - - {% if site.gh_edit_repository and site.gh_edit_branch and page.path %} - {% assign repo_parts = site.gh_edit_repository | split: "github.com/" %} - {% assign repo_path = repo_parts[1] %} - - {% endif %} - - {% if page.url == "/" %} - - {% endif %} - - {% include head_custom.html %} - - diff --git a/_includes/head_custom.html b/_includes/head_custom.html deleted file mode 100644 index 64965cf..0000000 --- a/_includes/head_custom.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/_includes/hint.md b/_includes/hint.md deleted file mode 100644 index e674e0f..0000000 --- a/_includes/hint.md +++ /dev/null @@ -1,15 +0,0 @@ -
-{% assign hint_heading = include.heading | default: true %} -{% if hint_heading == false or hint_heading == "false" %} -
-{% octicon info height:20 class:"right left" aria-label:info %} -{{ include.title }} -
-{% else %} -

-{% octicon info height:20 class:"right left" aria-label:info %} -{{ include.title }} -

-{% endif %} -{{ include.text | markdownify }} -
diff --git a/_includes/intro.md b/_includes/intro.md deleted file mode 100644 index 49c6e2a..0000000 --- a/_includes/intro.md +++ /dev/null @@ -1,47 +0,0 @@ -# {{ include.language }}: HTML/CSS to Image -{: .no_toc } -{: .fs-9 } - -Generate Images and PDFs with {{ include.language }}. Renders exactly like Google Chrome. -{: .code-title } -Render PNG, JPG, or WebP images + PDFs with {{ include.language }} from HTML/CSS or reusable dynamic templates. -{: .code-subtitle} - - -[Live demo](https://htmlcsstoimage.com/#demo){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 target="_blank" } -[Get an API Key](https://htmlcsstoimage.com){: .btn .fs-5 .mb-4 .mb-md-0 target="_blank" } -
- -## Generating images with {{include.language}} -1. The API takes your HTML/CSS and runs it inside a real instance of Google Chrome to **convert your HTML into an image**. -2. Use {{include.language}} to send the API your HTML/CSS. -3. You'll get back JSON with the URL to your generated image. - -For more details on how this works, see [Creating an image](/getting-started/using-the-api#creating-an-image). - -**Example API response:** -```json -{ - "url": "https://hcti.io/v1/image/be4c5118-fe19-462b-a49e-48cf72697a9d", - "id": "be4c5118-fe19-462b-a49e-48cf72697a9d" -} -``` - -{% cloudinary /assets/images/dog-rates-example.png sizes="500px" alt="Image generated with {{ include.language }}. Convert HTML to an image using {{ include.language }}." %} - -## Authentication with {{ include.language }} -The API uses [HTTP Basic authentication](https://en.wikipedia.org/wiki/Basic_access_authentication). - -Your username is your **User ID** and your password is your **API Key**. Both of these are available from the [dashboard](https://htmlcsstoimage.com/dashboard). The {{ include.language }} code sample demonstrates how to authenticate your request. - -You can sign up for a free API key to get started. - -Free API Key for {{ include.language }}{: .btn .btn-blue .fs-5 .mb-4 .mb-md-0 } - -
- -## {{ include.language }} example code - -This {{ include.language }} code example sends an HTTP POST to the `https://hcti.io/v1/image` API to convert your HTML/CSS to an image. - -For API ID/key terminology, scoped credentials, and access errors, see [authentication and API keys](/getting-started/using-the-api/api-keys/). Image creation requires `images:create`. diff --git a/_includes/mcp_tools.md b/_includes/mcp_tools.md deleted file mode 100644 index 9005112..0000000 --- a/_includes/mcp_tools.md +++ /dev/null @@ -1,32 +0,0 @@ -## Available tools - -HTML/CSS to Image (HCTI) supports these core MCP tools across clients. Access depends on the [permissions approved for your connection](/integrations/mcp/permissions/). Ask your assistant to use HCTI by name when you want it to render HTML/CSS or capture a website. - -### Account usage - -| Tool | What it does | -|:-----|:------------| -| **check_usage** | Check images used, the account's image allowance, the next reset date, and whether overages are enabled. Does not render an image. | - -### Screenshots and rendering - -| Tool | What it does | -|:-----|:------------| -| **create_image** | Render HTML and CSS as PNG, JPG, WebP, or PDF. Accepts rendering options such as `device_scale`, `viewport_width`, `viewport_height`, and `ms_delay`. | -| **create_url_image** | Capture a public webpage or a specific element using a CSS selector. Supports viewport settings and cookie banner blocking. | -| **create_templated_image** | Render a saved template using its `template_id` and a `template_values` object. | -| **create_batch_images** | Render multiple variations in one request, with shared `default_options` and per-image `variations`. | -| **get_max_batch_size** | Check the authorized account's current batch limit before preparing a batch. | - -### Template management - -| Tool | What it does | -|:-----|:------------| -| **create_template** | Save HTML and CSS as a reusable template with variables. | -| **update_template** | Update an existing template by ID. | -| **list_templates** | Find templates in the connected HCTI account. | -| **list_template_versions** | Inspect the version history of a template. | - -See the [rendering parameters](/integrations/mcp/#image-parameters) for available options and the [Template Editor guide](/template-editor/) for designing reusable templates. - -More management capabilities are available for proxies, storage destinations, and Open Graph configurations. See the [complete MCP tools reference](/integrations/mcp/tools/) for all tools and required permissions. diff --git a/_includes/nav.html b/_includes/nav.html deleted file mode 100644 index 307b647..0000000 --- a/_includes/nav.html +++ /dev/null @@ -1,84 +0,0 @@ - diff --git a/_includes/og_config_parameter_support.md b/_includes/og_config_parameter_support.md deleted file mode 100644 index 65942d3..0000000 --- a/_includes/og_config_parameter_support.md +++ /dev/null @@ -1,4 +0,0 @@ -{% capture og_parameter_support_text -%} -The dashboard provides the most common screenshot controls when you create an OG Image Config. See the [full list of supported `hcti:` page parameters](/getting-started/og-images/supported-parameters/) for every available page-level override. -{% endcapture -%} -{% include hint.md title="Parameter support" heading=false text=og_parameter_support_text %} diff --git a/_includes/og_image_platform_grid.html b/_includes/og_image_platform_grid.html deleted file mode 100644 index af64657..0000000 --- a/_includes/og_image_platform_grid.html +++ /dev/null @@ -1,73 +0,0 @@ - diff --git a/_includes/operation-card.html b/_includes/operation-card.html deleted file mode 100644 index 0fa7a82..0000000 --- a/_includes/operation-card.html +++ /dev/null @@ -1,19 +0,0 @@ -{% assign operation = include.operation %} -{% assign operation_id = operation.id | default: operation.title | slugify %} -
-

{{ operation.title | escape }}

-
- {{ operation.method | escape }} - {{ operation.path | escape }} -
-
-
-
Permission required
-
{{ operation.permission | escape }}
-
-
-
MCP tool
-
{% if operation.mcp_tool %}{{ operation.mcp_tool | escape }}{% else %}Not available{% endif %}
-
-
-
diff --git a/_includes/operation-cards.html b/_includes/operation-cards.html deleted file mode 100644 index 32408fb..0000000 --- a/_includes/operation-cards.html +++ /dev/null @@ -1,9 +0,0 @@ -{% comment %} - Usage: {% include operation-cards.html resource="storage-destinations" %} - Operation definitions live in _data/operations.json, keyed by resource. -{% endcomment %} -
- {% for operation in site.data.operations[include.resource] %} - {% include operation-card.html operation=operation %} - {% endfor %} -
diff --git a/_includes/template-editor/Property_Opacity.md b/_includes/template-editor/Property_Opacity.md deleted file mode 100644 index 4ba67c9..0000000 --- a/_includes/template-editor/Property_Opacity.md +++ /dev/null @@ -1,8 +0,0 @@ -{% capture opacity_details %} -Opacity controls transparency for the whole block, including its content and styling. Lower opacity makes the block more transparent. - -{% include template-editor/templatable-properties.md items="Opacity" %} -{% endcapture %} - -{% assign opacity_details_summary = include.details | default: "Transparency for the block" %} -{% include template-editor/property.md name="Opacity" details=opacity_details_summary more=opacity_details templated=true %} diff --git a/_includes/template-editor/Property_Padding.md b/_includes/template-editor/Property_Padding.md deleted file mode 100644 index d2589c0..0000000 --- a/_includes/template-editor/Property_Padding.md +++ /dev/null @@ -1,22 +0,0 @@ -{% capture padding_details %} -Padding creates space inside the block's edge before content is laid out. - -
-
-
Simple
-

Use one value when every side should have the same inset.

-
- -
-
Advanced
-

Open Advanced Padding to set top, right, bottom, and left independently.

-
-
- -{% if include.panel %} -{% include hint.md title="Panel spacing" text="Panel padding is separate from gap and child margin. Padding creates space inside the panel edge; gap and child margin control spacing between child blocks." heading=false %} -{% endif %} -{% endcapture %} - -{% assign padding_details_summary = include.details | default: "Space inside the block edge" %} -{% include template-editor/property.md name="Padding" details=padding_details_summary more=padding_details %} diff --git a/_includes/template-editor/block-specific-options-intro.md b/_includes/template-editor/block-specific-options-intro.md deleted file mode 100644 index f013efe..0000000 --- a/_includes/template-editor/block-specific-options-intro.md +++ /dev/null @@ -1 +0,0 @@ -## Block Specific Properties diff --git a/_includes/template-editor/child-properties-intro.md b/_includes/template-editor/child-properties-intro.md deleted file mode 100644 index e0be4b6..0000000 --- a/_includes/template-editor/child-properties-intro.md +++ /dev/null @@ -1,2 +0,0 @@ -{% assign child_panel_type = include.type | default: "panel" %} -When a block is inside a {{ child_panel_type }} Panel, extra properties become available for how that block sits inside the panel and relates to the other children. Select the child block to edit these properties. diff --git a/_includes/template-editor/common-block-options.md b/_includes/template-editor/common-block-options.md deleted file mode 100644 index 0576c04..0000000 --- a/_includes/template-editor/common-block-options.md +++ /dev/null @@ -1,131 +0,0 @@ -## Common Properties - -Most blocks share a core set of properties. The right sidebar shows the properties available for the current selection, including controls added by the parent panel. - -{% assign extra_size = include.extra_size | default: include.extra_extra_size %} -{% assign extra_arrange = include.extra_arrange | default: include.extra_extra_arrange %} -{% assign extra_background = include.extra_background | default: include.extra_extra_background %} -{% assign extra_border = include.extra_border | default: include.extra_extra_border %} -{% assign extra_shadow = include.extra_shadow | default: include.extra_extra_shadow %} - -{% capture size_details %} -
-
-
Width
-

Controls the block's horizontal space. Use a fixed value for a predictable footprint, `%` when the width should respond to the canvas or parent panel, or auto sizing when content or layout should decide the width.

-
- -
-
Height
-

Controls the block's vertical space. Height can be fixed, flexible, or constrained with minimum and maximum values when a block needs room to grow without getting too large or too small.

-
- -
-
Aspect Ratio
-

Keeps width and height connected so a block can scale without stretching. This is useful for images, shapes, and blocks that need to preserve a specific proportion.

-
-
- -

For units, auto sizing modes, min/max values, and responsive sizing patterns, see the Sizing and Positioning guide.

- -{% if extra_size %} -{{ extra_size }} -{% endif %} -{% endcapture %} - -{% capture arrange_details %} -
-
-
X and Y
-

Set the block's position on the canvas or inside a Free Panel. X controls horizontal placement; Y controls vertical placement. Positions can use fixed units or `%` values with anchors.

-
- -
-
Alignment
-

Move a block to common canvas positions, or use anchors to decide how the block lines up to a percent-based X or Y value.

-
- -
-
Rotation and Flip
-

Rotate the block or flip it horizontally or vertically without changing the block's content.

-
- -
-
Lock and Layer Order
-

Lock a block to avoid accidental edits, or move it forward and backward when blocks overlap.

-
-
- -

For anchoring, percent positions, panel behavior, and layer order, see the Sizing and Positioning guide.

- -{% if extra_arrange %} -{{ extra_arrange }} -{% endif %} -{% endcapture %} - -{% capture background_details %} -
-
-
Solid
-

Assign a single color as the background of the block.

- {% include template-editor/templatable-properties.md items="Color" %} -
- -
-
Gradient
-

Use a linear, radial, or conic gradient. Gradients are built from stops, and each stop has a color and a position. Stops are ordered by position, so moving a stop changes how the colors blend across the block.

- {% include template-editor/templatable-properties.md items="Stop colors|Stop positions" %} -

Linear and conic gradients also include an angle control.

-
- -
-
Pattern
-

Choose a pattern, then customize the colors it exposes. Some patterns also include a size control. Different patterns use different numbers of colors, so the available controls change after you choose a pattern.

- {% include template-editor/templatable-properties.md items="Pattern colors|Pattern size" %} -

Patterns are sourced from css-pattern.com.

-
-
- -{% include hint.md title="Canvas backgrounds" text="Canvas and block backgrounds are separate. A transparent block can show the canvas background or the parent panel behind it." heading=false %} - -{% if extra_background %} -{{ extra_background }} -{% endif %} -{% endcapture %} - -{% capture border_details %} -Border controls are split into simple and advanced modes. - -
-
-
Simple
-

Use simple border controls when the same color, thickness, line style, and corner radius should apply everywhere.

-
- -
-
Advanced
-

Open Advanced Border to edit sides and corners separately. Sides can have their own color, thickness, and line style. Corners can have their own radius.

-
-
- -{% if extra_border %} -{{ extra_border }} -{% endif %} -{% endcapture %} - -{% capture shadow_details %} -Shadows can be layered. Use a regular shadow for depth, an inner shadow for inset effects, or a glow when the shadow should spread evenly around the block. - -{% if extra_shadow %} -{{ extra_shadow }} -{% endif %} -{% endcapture %} - -
-
PropertyDetails
- {% include template-editor/property.md name="Size" details="Control how much space the block takes up" more=size_details templated=true %} - {% include template-editor/property.md name="Arrange" details="Place and manage the block in its layout" more=arrange_details %} - {% include template-editor/property.md name="Background" details="Style the surface behind the block's content" more=background_details templated=true %} - {% include template-editor/property.md name="Border" details="Define the block's edge and corners" more=border_details %} - {% include template-editor/property.md name="Shadow" details="Layer shadows to add depth to your blocks" more=shadow_details %} -
diff --git a/_includes/template-editor/grid-tracks.md b/_includes/template-editor/grid-tracks.md deleted file mode 100644 index c058303..0000000 --- a/_includes/template-editor/grid-tracks.md +++ /dev/null @@ -1,28 +0,0 @@ -## Grid Tracks - -Grid and Table Panels are built from tracks: columns and rows. Tracks can have their own size and background. - -
-
-
Selecting Tracks
-

Hover a column or row on the canvas and click its track selector to edit that track. The right sidebar switches to the selected column or row and shows track-specific controls.

-

When the panel itself is selected, the right sidebar also includes a collapsible Rows/Columns item. Open it to select a row or column without using the canvas hover target.

-
- -
-
Track Size
-

Use track size to control how much space a row or column receives inside the panel.

-
    -
  • Defined uses a value with fr, %, or px units.
  • -
  • Auto lets the track size itself from its contents.
  • -
  • Min Content sizes the track to the smallest content-based size it can use.
  • -
  • Max Content sizes the track around its largest content-based size.
  • -
-
- -
-
Track Background
-

Track backgrounds apply to the selected row or column. Use them for bands, separators, highlighted columns, or table-like layouts.

-

A child block's own background is drawn above the track background. Transparent blocks let the track background show through.

-
-
diff --git a/_includes/template-editor/hard-hat-icon.md b/_includes/template-editor/hard-hat-icon.md deleted file mode 100644 index a6557c0..0000000 --- a/_includes/template-editor/hard-hat-icon.md +++ /dev/null @@ -1,9 +0,0 @@ -{%- assign icon_variant = include.variant | default: "solid" -%} -{%- assign icon_color = include.color | default: "#475569" -%} -{%- assign icon_label = include.label | default: "Variable mode" -%} -{%- if icon_variant == "outline" -%} - {%- assign icon_href = "/assets/images/template-editor-hard-hat.svg#template-editor-hard-hat-outline" -%} -{%- else -%} - {%- assign icon_href = "/assets/images/template-editor-hard-hat-solid.svg#template-editor-hard-hat-solid" -%} -{%- endif -%} - diff --git a/_includes/template-editor/property.md b/_includes/template-editor/property.md deleted file mode 100644 index ae1c546..0000000 --- a/_includes/template-editor/property.md +++ /dev/null @@ -1,44 +0,0 @@ -{% assign property_name = include.name | default: include.property %} -{% assign property_details = include.details | default: include.summary %} -{% assign property_template_marker = include.templated | default: include.templatable %} -{% assign property_can_template = false %} -{% if property_template_marker == true or property_template_marker == "true" %} - {% assign property_can_template = true %} -{% endif %} -{% capture rendered_details %}{{ property_details | markdownify | strip }}{% endcapture %} -{% assign rendered_details = rendered_details | remove_first: "

" | remove: "

" %} - -{% if include.more %} -
- - - {% if property_can_template %} - Templatable - {% endif %} - - - {{ property_name }} - - {{ rendered_details }} - -
-
- {{ include.more | markdownify }} -
-
-
-{% else %} -
-
- - {% if property_can_template %} - Templatable - {% endif %} - - - {{ property_name }} - - {{ rendered_details }} -
-
-{% endif %} diff --git a/_includes/template-editor/templatable-properties.md b/_includes/template-editor/templatable-properties.md deleted file mode 100644 index 5133353..0000000 --- a/_includes/template-editor/templatable-properties.md +++ /dev/null @@ -1,15 +0,0 @@ -{% assign templatable_items = include.items | default: "" | strip %} -{% if templatable_items != "" %} -
-
Can be templated
-
    - {% assign templatable_item_list = templatable_items | split: "|" %} - {% for item in templatable_item_list %} - {% assign item_text = item | strip %} - {% if item_text != "" %} -
  • {{ item_text }}
  • - {% endif %} - {% endfor %} -
-
-{% endif %} diff --git a/_includes/template-editor/templating-note.md b/_includes/template-editor/templating-note.md deleted file mode 100644 index 74a5229..0000000 --- a/_includes/template-editor/templating-note.md +++ /dev/null @@ -1,3 +0,0 @@ -Many properties can use [Variables](/template-editor/variables/) to assign their value when each image is created. - -Variables can be required, ignored, or given a fallback value. When you render the template, pass values with `template_values`. diff --git a/_includes/template_additional_parameters.md b/_includes/template_additional_parameters.md deleted file mode 100644 index 582365b..0000000 --- a/_includes/template_additional_parameters.md +++ /dev/null @@ -1 +0,0 @@ -{% include additional_parameters.md context="templates" %} diff --git a/_includes/title.html b/_includes/title.html deleted file mode 100644 index 8bd3fa8..0000000 --- a/_includes/title.html +++ /dev/null @@ -1,5 +0,0 @@ -{% if site.logo %} - -{% else %} - {{ site.title }} -{% endif %} diff --git a/_includes/toc.html b/_includes/toc.html deleted file mode 100644 index 904077b..0000000 --- a/_includes/toc.html +++ /dev/null @@ -1,93 +0,0 @@ -{% comment %} - Table of Contents generator - Extracts h2 and h3 headings from the page content and generates a TOC -{% endcomment %} - -{% assign content_string = include.content %} -{% assign headings_found = false %} - -{% comment %} Check if there are any h2 headings with id attributes {% endcomment %} -{% if content_string contains '

-

On this page

-
    - {% comment %} Split content by

to get each h2 section {% endcomment %} - {% assign sections = content_string | split: '' %} - - {% for section in sections %} - {% comment %} Check if this section contains an h2 opening tag {% endcomment %} - {% if section contains '

' %} - {% assign h2_before_anchor = h2_content | split: '' %} - {% assign after_anchor_parts = h2_content | split: '' %} - {% assign heading_text = after_anchor_parts[1] | strip_html | strip | truncate: 80, "" %} - {% else %} - {% comment %} No anchor, get text after the closing > {% endcomment %} - {% assign after_tag_parts = h2_content | split: '>' %} - {% assign heading_text = after_tag_parts[1] | strip_html | strip | truncate: 80, "" %} - {% endif %} - - {% if heading_text != "" and heading_id != "" %} -
  • - {{ heading_text }} - - {% comment %} Look for h3 headings in the next section {% endcomment %} - {% assign next_index = forloop.index %} - {% if next_index < sections.size %} - {% assign next_section = sections[next_index] %} - {% if next_section contains '

    - {% assign h3_sections = next_section | split: '

    ' %} - {% for h3_section in h3_sections %} - {% if h3_section contains '

    ' %} - {% assign h3_before_anchor = h3_content | split: '' %} - {% assign h3_after_anchor = h3_content | split: '' %} - {% assign h3_text = h3_after_anchor[1] | strip_html | strip | truncate: 60, "" %} - {% else %} - {% assign h3_after_tag = h3_content | split: '>' %} - {% assign h3_text = h3_after_tag[1] | strip_html | strip | truncate: 60, "" %} - {% endif %} - - {% if h3_text != "" and h3_id != "" and forloop.index < 8 %} -
  • - {{ h3_text }} -
  • - {% endif %} - {% endif %} - {% endfor %} - - {% endif %} - {% endif %} -

  • - {% endif %} - {% endif %} - {% endfor %} - - -{% endif %} diff --git a/_layouts/default.html b/_layouts/default.html deleted file mode 100644 index bbf5a7b..0000000 --- a/_layouts/default.html +++ /dev/null @@ -1,268 +0,0 @@ ---- -layout: table_wrappers ---- - - - - -{% include head.html %} - - - - Link - - - - - - Search - - - - - - Menu - - - - - - Expand - - - - - - Document - - - - - - -
    - -
    -
    - {% if site.search_enabled != false %} - - {% endif %} - {% if site.aux_links %} - - {% endif %} -
    -
    - {% unless page.url == "/" %} - {% if page.parent %} - - {% else %} -
    - {% include copy_page.html %} -
    - {% endif %} - {% endunless %} - - {% comment %} Capture the rendered content for TOC extraction {% endcomment %} - {% capture rendered_content %} - {% if site.heading_anchors != false %} - {% include vendor/anchor_headings.html html=content anchorBody="" anchorClass="anchor-heading" %} - {% else %} - {{ content }} - {% endif %} - {% endcapture %} - -
    -
    - {{ rendered_content }} - - {% if page.has_children == true and page.has_toc != false %} -
    -

    Table of contents

    -
      - {%- assign children_list = pages_list | where: "parent", page.title | where: "grand_parent", page.parent -%} - {% for child in children_list %} -
    • - {{ child.title }}{% if child.summary %} - {{ child.summary }}{% endif %} -
    • - {% endfor %} -
    - {% endif %} - - {% if site.footer_content != nil or site.last_edit_timestamp or site.gh_edit_link %} -
    -
    - {% if site.back_to_top %} -

    {{ site.back_to_top_text }}

    - {% endif %} - {% if site.footer_content != nil %} -

    {{ site.footer_content }}

    - {% endif %} - - {% if site.last_edit_timestamp or site.gh_edit_link %} -
    - {% if site.last_edit_timestamp and site.last_edit_time_format and page.last_modified_at %} -

    - Page last modified: {{ page.last_modified_at | date: site.last_edit_time_format }}. -

    - {% endif %} - {% if - site.gh_edit_link and - site.gh_edit_link_text and - site.gh_edit_repository and - site.gh_edit_branch and - site.gh_edit_view_mode - %} -

    - {{ site.gh_edit_link_text }} -

    - {% endif %} -
    - {% endif %} -
    - {% endif %} - -
    - - -
    -
    - - {% if site.search_enabled != false %} - {% if site.search.button %} - - - - {% endif %} - -
    - {% endif %} -
    -
    - - - - - {% javascript_asset_tag global %} - - /assets/js/just-the-docs.js - - /assets/js/lunr.js - {% endjavascript_asset_tag %} - - - - - - - - - - diff --git a/_layouts/template-editor-block.html b/_layouts/template-editor-block.html deleted file mode 100644 index 2702ea1..0000000 --- a/_layouts/template-editor-block.html +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: page ---- -{{ content }} - -{% assign template_editor_templated_content = page.templated_content | default: "" | strip %} -
    -

    Templated Content

    - {% if template_editor_templated_content != "" %} - {{ template_editor_templated_content | markdownify }} - {% endif %} - {% capture template_editor_templating_note %} - {% include template-editor/templating-note.md %} - {% endcapture %} - {{ template_editor_templating_note | markdownify }} -
    diff --git a/_plugins/jekyll_asset_pipeline.rb b/_plugins/jekyll_asset_pipeline.rb deleted file mode 100644 index 38920bd..0000000 --- a/_plugins/jekyll_asset_pipeline.rb +++ /dev/null @@ -1,61 +0,0 @@ -require 'jekyll_asset_pipeline' - -module JekyllAssetPipeline - class CssTagTemplate < JekyllAssetPipeline::Template - def self.filetype - '.css' - end - - def html - file_path = "#{output_path}/#{@filename}" - - # Load all CSS files directly as stylesheets - "\n" - end - end -end - -module JekyllAssetPipeline - class JsTagTemplate < JekyllAssetPipeline::Template - def self.filetype - '.js' - end - - def html - file_path = "#{output_path}/#{@filename}" - - if @filename.match? "highlighting" - return "\n" \ - end - - "\n" \ - end - end -end - -module JekyllAssetPipeline - class CssCompressor < JekyllAssetPipeline::Compressor - require 'yui/compressor' - - def self.filetype - '.css' - end - - def compress - return @content - # return YUI::CssCompressor.new.compress(@content) - end - end - - class JavaScriptCompressor < JekyllAssetPipeline::Compressor - require 'uglifier' - - def self.filetype - '.js' - end - - def compress - Uglifier.compile(@content, harmony: true) - end - end -end diff --git a/_plugins/jeykll_html_css_to_image.rb b/_plugins/jeykll_html_css_to_image.rb deleted file mode 100644 index 0ae24ea..0000000 --- a/_plugins/jeykll_html_css_to_image.rb +++ /dev/null @@ -1,54 +0,0 @@ -require "json" -require "htmlcsstoimage" - -module Jekyll - class HtmlCssToImageTag < Liquid::Tag - attr_reader :input, :template_params, :template_id - - def initialize(tag_name, input, tokens) - super - @input = input - end - - def render(context) - key = hcti_key(context) - # Return placeholder for local development without API key - return "https://via.placeholder.com/600x400?text=HCTI+Image+Placeholder" unless key - - input = parse_input(@input, context) - @template_id = input["template_id"] - @template_params = input - @template_params.delete("template_id") - - client = HTMLCSSToImage.new(api_key: key) - image = client.create_image_from_template(template_id, @template_params) - - image.url - end - - private - - def hcti_key(context) - env_var = ENV["HCTI_API_KEY"] - return env_var if env_var - - hcti_config = context.registers[:site].config["hcti"] - if hcti_config - key = hcti_config["api_key"] - end - - return key if key - # Return nil for local development - the tag will return a placeholder - nil - end - - def parse_input(input, context) - return nil if input.nil? || input.empty? - # Allows the use of variables - input = Liquid::Template.parse(input).render(context) - JSON.parse(input) - end - end -end - -Liquid::Template.register_tag('hcti_image_url', Jekyll::HtmlCssToImageTag) diff --git a/_sass/color_schemes/hcti.scss b/_sass/color_schemes/hcti.scss deleted file mode 100644 index ca79852..0000000 --- a/_sass/color_schemes/hcti.scss +++ /dev/null @@ -1,137 +0,0 @@ -// -// Typography -// - -$body-font-family: -apple-system, BlinkMacSystemFont, "helvetica neue", - helvetica, roboto, noto, "segoe ui", arial, sans-serif !default; -$mono-font-family: "SFMono-Regular", Menlo, Consolas, Monospace !default; -$root-font-size: 16px !default; // Base font-size for rems -$body-line-height: 1.4 !default; -$content-line-height: 1.6 !default; -$body-heading-line-height: 1.25 !default; - -// -// Colors -// - -$white: #fff !default; - -$grey-dk-000: #959396 !default; -$grey-dk-100: #5c5962 !default; -$grey-dk-200: #44434d !default; -$grey-dk-250: #302d36 !default; -$grey-dk-300: #27262b !default; - -$grey-lt-000: #f5f6fa !default; -$grey-lt-100: #eeebee !default; -$grey-lt-200: #ecebed !default; -$grey-lt-300: #e6e1e8 !default; - -$purple-000: #7253ed !default; -$purple-100: #5e41d0 !default; -$purple-200: #4e26af !default; -$purple-300: #381885 !default; - -$blue-000: #2c84fa !default; -$blue-100: #2869e6 !default; -$blue-200: #264caf !default; -$blue-300: #183385 !default; - -$hcti-green: #018a59 !default; // Darker green for WCAG AA contrast (5.3:1 on white) -$hcti-green-light: #02b875 !default; // Original lighter green for decorative use -$green-000: #41d693 !default; -$green-100: #11b584 !default; -$green-200: #009c7b !default; -$green-300: #026e57 !default; - -$yellow-000: #ffeb82 !default; -$yellow-100: #fadf50 !default; -$yellow-200: #f7d12e !default; -$yellow-300: #e7af06 !default; - -$red-000: #f77e7e !default; -$red-100: #f96e65 !default; -$red-200: #e94c4c !default; -$red-300: #dd2e2e !default; - -$body-background-color: $white !default; -$sidebar-color: #343a40 !default; -$search-background-color: $white !default; -$table-background-color: $white !default; -$code-background-color: $grey-lt-000 !default; -$feedback-color: darken($sidebar-color, 3%) !default; - -$body-text-color: $grey-dk-100 !default; -$body-heading-color: $grey-dk-300 !default; -$search-result-preview-color: $grey-dk-000 !default; -$nav-child-link-color: $grey-dk-100 !default; -$link-color: $hcti-green; -$btn-primary-color: $hcti-green; -$base-button-color: #f7f7f7 !default; - -// -// Spacing -// - -$spacing-unit: 1rem; // 1rem == 16px - -$spacers: ( - sp-0: 0, - sp-1: $spacing-unit * 0.25, - sp-2: $spacing-unit * 0.5, - sp-3: $spacing-unit * 0.75, - sp-4: $spacing-unit, - sp-5: $spacing-unit * 1.5, - sp-6: $spacing-unit * 2, - sp-7: $spacing-unit * 2.5, - sp-8: $spacing-unit * 3, - sp-9: $spacing-unit * 3.5, - sp-10: $spacing-unit * 4, -) !default; - -$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px -$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px -$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px -$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px -$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px -$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px -$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px -$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px -$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px -$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px - -// -// Borders -// - -$border: 1px solid !default; -$border-radius: 4px !default; -$border-color: $grey-lt-100 !default; - -// -// Grid system -// - -$gutter-spacing: $sp-6 !default; -$gutter-spacing-sm: $sp-4 !default; -$nav-width: 264px !default; -$nav-width-md: 248px !default; -$nav-list-item-height: $sp-6 !default; -$nav-list-item-height-sm: $sp-8 !default; -$nav-list-expander-right: true; -$content-width: 1600px !default; -$header-height: 60px !default; -$search-results-width: $content-width - $nav-width !default; -$transition-duration: 400ms; - -// -// Media queries in pixels -// - -$media-queries: ( - xs: 320px, - sm: 500px, - md: $content-width, - lg: $content-width + $nav-width, - xl: 1400px, -) !default; diff --git a/_sass/custom/custom.scss b/_sass/custom/custom.scss deleted file mode 100644 index aa934e1..0000000 --- a/_sass/custom/custom.scss +++ /dev/null @@ -1,1410 +0,0 @@ -body { - background-color: $sidebar-color; -} - -.main-content .operation-cards { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 0.75rem; - margin: 1.25rem 0 2rem; -} - -.main-content .operation-card { - min-width: 0; - padding: 1rem 1.25rem; - border: 1px solid #e3e6eb; - border-radius: 6px; - background: #fff; - - h3 { - margin: 0 0 0.5rem; - font-size: 1rem; - font-weight: 600; - line-height: 1.4; - } - - code { - padding: 0; - border: 0; - background: transparent; - font-size: 0.8125rem; - color: #d63384; - overflow-wrap: anywhere; - } - - .operation-card__endpoint { - display: flex; - align-items: baseline; - gap: 0.625rem; - - code { - color: #292d35; - } - } - - .operation-card__method { - flex-shrink: 0; - padding: 0.125rem 0.375rem; - border-radius: 3px; - background: #eef1f5; - color: #404854; - font-size: 0.6875rem; - font-weight: 700; - line-height: 1.5; - } - - .operation-card__method--get { - background: #edf4ff; - color: #245ca0; - } - - .operation-card__method--post { - background: #eaf7f0; - color: #236344; - } - - .operation-card__method--put { - background: #fff5e6; - color: #855510; - } - - .operation-card__method--delete { - background: #fceeee; - color: #a03636; - } - - .operation-card__details { - display: grid; - grid-template-columns: 1fr; - gap: 0.375rem 1rem; - margin: 0.75rem 0 0; - - div { - min-width: 0; - } - - dt { - float: none; - width: auto; - text-align: left; - margin: 0 0 0.125rem; - color: #656b75; - font-size: 0.75rem; - font-weight: 400; - - &::after { - content: none; - } - } - - dd { - margin: 0; - line-height: 1.4; - } - } -} - -@media (max-width: 1000px) { - .main-content .operation-cards { - grid-template-columns: 1fr; - } -} - -@media (max-width: 480px) { - .main-content .operation-card { - padding: 0.875rem 1rem; - - .operation-card__details { - grid-template-columns: 1fr; - gap: 0.625rem; - } - } -} - -.main-content .image-rate-limit-callout { - margin: 1.5rem 0 2rem; - padding: 1.25rem 1.5rem; - background: #effaf5; - border: 1px solid #d3eadd; - border-left: 4px solid #02b875; - border-radius: 6px; - - p { - margin: 0; - color: #23543f; - font-size: clamp(1.125rem, 2vw, 1.375rem); - font-weight: 600; - line-height: 1.45; - } - - strong { - font-weight: inherit; - } -} - -// ============================================================================= -// Accessibility: Improved Contrast Fixes -// ============================================================================= - -// Override grey text utilities for better contrast (WCAG AA requires 4.5:1) -// $grey-dk-000 (#959396) only has ~3.5:1 contrast on white, so we use darker colors -.text-grey-dk-000 { - color: $grey-dk-100 !important; // #5c5962 has ~6:1 contrast ratio -} - -// DocSearch placeholder - improve contrast for search button -.DocSearch-Button-Placeholder { - color: #5c5962 !important; // Better contrast than default light grey -} - -.DocSearch-Button { - .DocSearch-Search-Icon { - color: #5c5962 !important; - } -} - -// Site footer text contrast fix -.site-footer { - color: $grey-lt-100 !important; // Light color on dark background for sidebar -} - -// Aux navigation buttons (Get an API Key, Demo) - improve link contrast -// $hcti-green (#02b875) has ~3.6:1 contrast on white, need 4.5:1 for WCAG AA -.aux-nav { - .site-button { - color: #018a59 !important; // Darker green with ~5.3:1 contrast ratio on white - - &:hover { - color: #016847 !important; // Even darker on hover for clear feedback - } - } -} - -.cloudinary-image { - width: auto; - height: auto; -} - -.main { - background-color: white; - border-right: $border $border-color; - height: 100%; - margin-right: auto; -} - -.site-button { - &:hover { - background-color: unset; - text-decoration: underline; - background-image: unset !important; - } -} - -img { - vertical-align: bottom; - margin: 0; - padding: 0; - border: 0; -} - -.te-doc-figure { - margin: 1.5rem 0 2rem; - - img { - display: block; - width: 100%; - max-width: 100%; - height: auto; - background: white; - border: $border $border-color; - border-radius: 6px; - box-shadow: 0 8px 24px rgba(31, 35, 40, 0.08); - } -} -.te-doc-figure.centered img{ - margin-left: auto; - margin-right: auto; -} - -.te-doc-figure--sidebar { - img { - max-width: 430px; - } -} - -.te-doc-figure--natural { - img { - width: auto; - max-width: 100%; - } -} - -.te-doc-section-with-aside { - display: grid; - grid-template-columns: minmax(0, 1fr) clamp(12rem, 26%, 18rem); - gap: 1.25rem; - align-items: start; - margin-bottom: 1.5rem; -} - -.te-doc-figure--inline { - margin: 0.25rem 0 0; -} - -.te-doc-figure--wide { - margin-left: -0.5rem; - margin-right: -0.5rem; -} - -// ============================================================================= -// OG Image Platform Guide Cards -// ============================================================================= - -.cms-guide-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 1rem; - margin: 1.5rem 0 2rem; -} - -.cms-guide-card { - position: relative; - display: flex; - min-width: 0; - min-height: 12rem; - flex-direction: column; - overflow: hidden; - padding: 1.25rem 3.5rem 1.25rem 1.25rem; - color: $grey-dk-300 !important; - background: linear-gradient(145deg, white 65%, mix(white, $grey-lt-000, 35%)); - background-image: linear-gradient(145deg, white 65%, mix(white, $grey-lt-000, 35%)) !important; - border: 1px solid $border-color; - border-radius: 10px; - box-shadow: 0 4px 14px rgba(31, 35, 40, 0.06); - text-decoration: none !important; - transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease; - - &:hover { - color: $grey-dk-300 !important; - background-image: linear-gradient(145deg, white 65%, mix(white, $grey-lt-000, 20%)) !important; - border-color: $link-color; - box-shadow: 0 10px 24px rgba(31, 35, 40, 0.1); - text-decoration: none !important; - transform: translateY(-2px); - - .cms-guide-card__arrow { - color: white; - background: $link-color; - transform: translateX(2px); - } - } - - &:focus-visible { - outline: 3px solid rgba($link-color, 0.35); - outline-offset: 3px; - } -} - -.cms-guide-card__logo { - display: flex; - height: 3.5rem; - align-items: center; - margin-bottom: 1.1rem; - - img { - display: block; - width: auto; - max-width: 3.5rem; - height: auto; - max-height: 3.5rem; - border: 0 !important; - object-fit: contain; - } -} - -.cms-guide-card__logo--wordmark img { - max-width: 10.5rem; - max-height: 3.25rem; -} - -.cms-guide-card__logo--sitepress img { - max-width: 3.75rem; - max-height: 3.75rem; -} - -.cms-guide-card__title { - display: block; - margin-bottom: 0.35rem; - color: $grey-dk-300; - font-size: 1.05rem; - line-height: 1.3; - white-space: normal; -} - -.cms-guide-card__description { - display: block; - color: $grey-dk-100; - font-size: 0.88rem; - line-height: 1.45; - white-space: normal; -} - -.cms-guide-card__arrow { - position: absolute; - right: 1rem; - bottom: 1rem; - display: inline-flex; - width: 2rem; - height: 2rem; - align-items: center; - justify-content: center; - color: $link-color; - background: rgba($link-color, 0.1); - border-radius: 50%; - font-size: 1.15rem; - line-height: 1; - transition: color 0.15s ease, background-color 0.15s ease, transform 0.15s ease; -} - -@media (max-width: 42rem) { - .cms-guide-grid { - grid-template-columns: minmax(0, 1fr); - } - - .cms-guide-card { - min-height: 11rem; - } -} - -@media (max-width: 50rem) { - .te-doc-section-with-aside { - display: block; - } - - .te-doc-figure--inline { - width: 100%; - margin: 1rem 0 1.5rem; - } -} - -// Inline code styling (single backticks and raw inline ) - light pink text, no background -code.language-plaintext.highlighter-rouge, -p > code, -li > code, -td > code, -dd > code { - background-color: transparent !important; - color: #d63384 !important; // Light pinkish color - padding: 0.1em 0.2em !important; - font-size: 0.9em; - border: none !important; - border-radius: 0 !important; -} - -::selection { - background: $blue-100 !important; -} - -.code-toolbar { - position: relative; - pre { - background-color: #1e1e2e !important; - } - code { - border: unset; - color: #cdd6f4 !important; - } - - .toolbar-item { - position: absolute; - padding: 8px; - top: 0px; - right: 0px; - color: $grey-lt-100; - - .success { - svg { - fill: $link-color; - } - } - } -} - -// Improved code block styling for better contrast -pre[class*="language-"], -code[class*="language-"] { - background-color: #1e1e2e !important; - color: #cdd6f4 !important; - border: none !important; -} - -pre[class*="language-"] { - border-radius: 6px; - padding: 1rem !important; -} - -// Syntax highlighting colors (dark theme) -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: #6c7086 !important; -} - -.token.string, -.token.attr-value { - color: #a6e3a1 !important; -} - -.token.punctuation, -.token.operator { - color: #89dceb !important; -} - -.token.property, -.token.tag, -.token.boolean, -.token.number, -.token.constant, -.token.symbol { - color: #fab387 !important; -} - -.token.selector, -.token.attr-name, -.token.char, -.token.builtin { - color: #f9e2af !important; -} - -.token.keyword, -.token.atrule { - color: #cba6f7 !important; -} - -.token.function { - color: #89b4fa !important; -} - -.token.url, -.token.variable { - color: #f38ba8 !important; -} - -// Bash/Shell specific syntax highlighting -.language-bash, -.language-shell, -.language-sh { - // Command names (curl, echo, etc.) - .token.function { - color: #89b4fa !important; - font-weight: 600; - } - - // Flags and parameters (-X, -d, -u, --data-urlencode) - .token.parameter, - .token.variable { - color: #f9e2af !important; - } - - // Strings (single and double quoted) - .token.string { - color: #a6e3a1 !important; - } - - // URLs - .token.url { - color: #89dceb !important; - } - - // Operators and punctuation - .token.operator { - color: #f38ba8 !important; - } -} - -// Additional bash-specific token styling for better visibility -pre[class*="language-bash"], -pre[class*="language-shell"], -pre[class*="language-sh"] { - .token.assign-left { - color: #cba6f7 !important; - } -} - -.code-example { - align-text: center; - .hcti-container { - margin: auto; - display: inline-block; - background-color: transparentize($blue-100, 0.75); - border: 1px dashed $blue-100; - } - background-image: linear-gradient(0deg,rgba(225,228,232,0),rgba(225,228,232,0) 7px,#e1e4e8 ,rgba(225,228,232,0) 8px),linear-gradient(90deg,rgba(225,228,232,0),rgba(225,228,232,0) 7px,#e1e4e8 ,rgba(225,228,232,0) 8px); - background-position: center center; - background-size: 15px 15px; -} - -.hint { - svg { - vertical-align: middle; - margin-top: -2px; - margin-right: 4px; - fill: $blue-000; - } - .hint-title { - color: $body-heading-color; - font-weight: 700; - line-height: 1.25; - margin-bottom: 0.5rem; - } - p { - margin-left: 28px; - color: $grey-dk-200; - } - background: linear-gradient(140deg, rgba(245,246,250,0.30) 0%, rgba(245,246,250,1) 61%); - border: 1px solid $grey-lt-100; - border-radius: 4px; - box-sizing: border-box; - margin-bottom: .75rem; - margin-top: .75rem; - overflow: auto; - padding: .75rem; -} - -.http-method { - span { - background-color: $grey-lt-100; - border-radius: 3px; - box-sizing: border-box; - color: black; - padding: 4px 8px; - text-transform: uppercase; - } - color: $grey-dk-200; - border-color: none; - border-left: solid $blue-100 4px; - background-color: $code-background-color; - background: linear-gradient(140deg, rgba(245,246,250,0.50) 0%, rgba(245,246,250,1) 61%); - border-radius: 3px; - box-sizing: border-box; - line-height: 1.45; - margin-bottom: 16px; - margin-top: 10px; - padding: 8px; - padding-top: 16px; - padding-bottom: 16px; -} - -img { - border: $border; - border-color: $border-color; -} - -.nav-list-link { - font-weight: 500; - color: #3b454e; - - &.child { - font-weight: 400 !important; - } -} - -.nav-list-link.active { - color: $link-color !important; -} - -// ============================================================================= -// Right Sidebar Table of Contents -// ============================================================================= - -.site-container { - display: flex; - - @media (max-width: 800px) { - max-width: 100%; - flex-direction: column; - } - - @media (min-width: 1600px) { - max-width: 1700px; - margin-left: auto; - margin-right: auto; - } - - @media (min-width: 1900px) { - max-width: 1900px; - } - - @media (min-width: 2200px) { - max-width: 2100px; - } -} - -@media (min-width: 1200px) { - .main { - max-width: 1200px !important; - } - - .main-content-wrap { - max-width: none !important; - } -} - -.content-with-toc { - display: flex; - gap: 2rem; - - @media (min-width: 1600px) { - gap: 2.5rem; - } -} - -// Main content in flex container -.content-with-toc > .main-content { - flex: 1; - min-width: 0; - - - @media (max-width: 800px) { - max-width: 100%; - } -} - -.toc-sidebar { - flex: 0 0 200px; - width: 200px; - - // Hide on medium screens - @media (max-width: 1200px) { - display: none; - } - - // Wider on larger screens - @media (min-width: 1600px) { - flex: 0 0 240px; - width: 240px; - } -} - -.toc-nav { - position: sticky; - top: 2rem; - max-height: calc(100vh - 4rem); - overflow-y: auto; - padding-bottom: 2rem; -} - -.toc-title { - font-size: 0.75rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.05em; - color: $grey-dk-000; - margin-bottom: 0.75rem; - padding-left: 0.75rem; -} - -.toc-list { - list-style: none; - padding: 0; - margin: 0; - border-left: 1px solid $grey-lt-200; -} - -.toc-item { - margin: 0; - - &.toc-h2 { - margin-top: 0.25rem; - } - - &.toc-h3 { - margin-top: 0.125rem; - } -} - -.toc-link { - display: block; - padding: 0.25rem 0.75rem; - font-size: 0.8125rem; - line-height: 1.4; - color: $grey-dk-100; - text-decoration: none; - border-left: 2px solid transparent; - margin-left: -1px; - transition: color 0.15s ease, border-color 0.15s ease, font-weight 0.15s ease; - - &:hover { - color: $link-color; - border-left-color: $grey-lt-100; - } - - // Active state for scroll-spy - &.toc-active { - color: $link-color !important; - border-left-color: $link-color !important; - font-weight: 600; - background-color: rgba($link-color, 0.08); - } -} - -.toc-h3 .toc-link { - padding-left: 1.25rem; - font-size: 0.75rem; - color: $grey-dk-000; - - &.toc-active { - color: $link-color; - font-weight: 600; - } -} - -.toc-sublist { - list-style: none; - padding: 0; - margin: 0; -} - -// Hide the inline markdown-toc when we have the sidebar -// Only show inline TOC on smaller screens where sidebar is hidden -#markdown-toc { - @media (min-width: 1201px) { - display: none; - } -} - -@media (min-width: 1201px) { - // Hide inline TOC elements when the sidebar TOC is visible. - .main-content > .text-delta:has(+ #markdown-toc), - .main-content > hr:has(+ #markdown-toc), - .main-content > hr:has(+ .text-delta + #markdown-toc) { - display: none; - } -} - -// ============================================================================= -// Copy Page Dropdown -// ============================================================================= - -.breadcrumb-with-actions { - display: flex; - justify-content: space-between; - align-items: center; - gap: 1rem; - margin-bottom: 0.5rem; - - .breadcrumb-nav, .breadcrumb-nav-list { - flex: 1; - margin-bottom: 0 !important; - } -} - -.page-header-actions { - display: flex; - justify-content: flex-end; - margin-bottom: 1rem; - margin-top: -0.5rem; -} - -.copy-page-dropdown { - position: relative; - display: inline-block; - - @media (max-width: 800px) { - display: none; // Hide on mobile to save space - } -} - -.copy-page-btn { - display: flex; - align-items: center; - gap: 0.375rem; - padding: 0.375rem 0.75rem; - font-size: 0.875rem; - font-weight: 500; - color: $grey-dk-200; - background-color: white; - border: 1px solid $grey-lt-200; - border-radius: 6px; - cursor: pointer; - transition: all 0.15s ease; - white-space: nowrap; - - &:hover { - background-color: $grey-lt-000; - border-color: $grey-lt-100; - color: $grey-dk-300; - } - - &:focus { - outline: 2px solid $link-color; - outline-offset: 2px; - } - - &[aria-expanded="true"] { - background-color: $grey-lt-000; - border-color: $grey-lt-100; - - .dropdown-arrow { - transform: rotate(180deg); - } - } - - svg { - flex-shrink: 0; - } - - .dropdown-arrow { - transition: transform 0.2s ease; - } -} - -.copy-page-menu { - position: absolute; - top: calc(100% + 0.5rem); - right: 0; - min-width: 280px; - background-color: white; - border: 1px solid $grey-lt-200; - border-radius: 8px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1), 0 0 1px rgba(0, 0, 0, 0.1); - z-index: 1000; - opacity: 0; - visibility: hidden; - transform: translateY(-8px); - transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease; - overflow: hidden; - - &.show { - opacity: 1; - visibility: visible; - transform: translateY(0); - } -} - -.copy-page-menu-item { - display: flex; - align-items: flex-start; - gap: 0.875rem; - padding: 0.875rem 1rem; - width: 100%; - background: none; - border: none; - text-align: left; - cursor: pointer; - transition: background-color 0.15s ease; - text-decoration: none; - color: inherit; - - &:hover { - background-color: $grey-lt-000; - } - - &:active { - background-color: $grey-lt-100; - } - - &:not(:last-child) { - border-bottom: 1px solid $grey-lt-100; - } - - svg { - flex-shrink: 0; - margin-top: 0.1875rem; - color: $grey-dk-100; - } - - .ai-icon { - width: 16px; - height: 16px; - } -} - -.menu-item-text { - flex: 1; - min-width: 0; -} - -.menu-item-title { - font-size: 0.875rem; - font-weight: 500; - color: $grey-dk-300; - margin-bottom: 0.25rem; -} - -.menu-item-subtitle { - font-size: 0.8125rem; - color: $grey-dk-100; - line-height: 1.4; -} - -// ============================================================================= -// Template Editor Property Lists -// ============================================================================= - -.te-property-list { - margin: 1rem 0 1.5rem; - border: 1px solid $border-color; - border-radius: 8px; - overflow: hidden; -} - -.te-property-list__header { - display: grid; - grid-template-columns: 1rem minmax(8rem, 0.36fr) 1fr; - gap: 1rem; - padding: 0.65rem 0.9rem; - background: $grey-lt-000; - border-bottom: 1px solid $border-color; - color: $grey-dk-200; - font-size: 0.72rem; - font-weight: 700; - letter-spacing: 0.08em; - text-transform: uppercase; - - &::before { - content: ""; - } -} - -.te-property { - margin: 0; - border-bottom: 1px solid $border-color; - background: white; - - &:last-child { - border-bottom: 0; - } -} - -.te-property__summary { - display: grid; - grid-template-columns: 1rem minmax(8rem, 0.36fr) 1fr; - gap: 1rem; - align-items: center; - padding: 0.85rem 0.9rem; -} - -details.te-property > .te-property__summary { - cursor: pointer; - list-style: none; - position: relative; - padding-right: 2.25rem; - -webkit-user-select: none; - user-select: none; - - &::-webkit-details-marker { - display: none; - } - - &::after { - position: absolute; - top: 0.95rem; - right: 1rem; - width: 0.45rem; - height: 0.45rem; - border-right: 2px solid $grey-dk-100; - border-bottom: 2px solid $grey-dk-100; - content: ""; - transform: rotate(45deg); - transform-origin: center; - } - - &:hover { - background: $grey-lt-000; - } -} - -details.te-property[open] > .te-property__summary { - border-bottom: 1px solid $border-color; - - &::after { - top: 1.1rem; - transform: rotate(225deg); - } -} - -.te-property__variable { - display: flex; - align-items: flex-start; - justify-content: center; - min-height: 1rem; -} - -.te-property__name { - color: $grey-dk-300; - font-weight: 700; -} - -.te-property__name-text { - min-width: 0; -} - -.te-property__templated-icon { - width: 0.9rem; - height: 0.9rem; - flex: 0 0 auto; - opacity: 0.72; - margin-top: 0.1rem; - border: none; -} - -.te-property__details { - color: $grey-dk-100; - line-height: 1.45; - - p { - margin: 0; - } -} - -.te-property__more { - display: grid; - grid-template-columns: 1rem minmax(8rem, 0.36fr) 1fr; - gap: 1rem; - padding: 0 0.9rem; - color: $grey-dk-200; - background: mix(white, $grey-lt-000, 45%); - - .anchor-heading { - display: none !important; - } - - .hint { - margin: 0.85rem 0 0; - padding: 0.6rem 0.7rem; - overflow: visible; - background: rgba($grey-lt-000, 0.55); - border-color: mix($border-color, white, 72%); - border-left: 1px solid mix($border-color, white, 72%); - border-radius: 4px; - - h3, - .hint-title { - margin: 0 0 0.2rem; - color: $grey-dk-300; - font-size: 0.84rem; - font-weight: 700; - letter-spacing: 0; - line-height: 1.3; - text-transform: none; - } - - p { - margin: 0; - color: $grey-dk-100; - font-size: 0.86rem; - line-height: 1.5; - } - - svg { - width: 0.78rem; - height: 0.78rem; - margin-top: -0.12rem; - fill: $grey-dk-100; - } - } - - p { - margin: 0 0 0.75rem; - line-height: 1.55; - } - - h3 { - margin: 0.95rem 0 0.25rem; - font-size: 0.92rem; - } - - > :first-child { - margin-top: 0; - } - - > :last-child { - margin-bottom: 0; - } -} - -.te-property__more-inner { - grid-column: 2 / 4; - max-width: 44rem; - padding: 1rem 0 1.05rem; -} - -.te-property__sections { - margin: 0.85rem 0; -} - -.te-property__section { - padding: 0.8rem 0; - margin: 0; - border-top: 1px solid $border-color; - - &:first-child { - padding-top: 0; - border-top: 0; - } - - &:last-child { - padding-bottom: 0; - } -} - -.te-property__subhead { - margin-bottom: 0.25rem; - color: $grey-dk-300; - font-size: 0.77rem; - font-weight: 700; - letter-spacing: 0.06em; - line-height: 1.3; - text-transform: uppercase; -} - -.te-property__meta { - color: $grey-dk-100; - font-size: 0.88rem; -} - -.te-property-templatable { - margin: 0.55rem 0 0.75rem; -} - -.te-property-templatable__title { - color: $grey-dk-100; - font-size: 0.76rem; - font-weight: 700; - letter-spacing: 0.06em; - line-height: 1.3; - text-transform: uppercase; -} - -.te-property-templatable__list { - margin: 0.3rem 0 0; - padding: 0; - color: $grey-dk-200; - font-size: 0.9rem; - list-style: none; - line-height: 1.45; - - li { - display: flex; - align-items: baseline; - gap: 0.5rem; - margin: 0.12rem 0; - padding-left: 0; - list-style: none; - - &::before { - display: none !important; - content: none !important; - } - - &::marker { - content: ""; - } - } -} - -.te-property-templatable__marker { - width: 0.22rem; - height: 0.22rem; - flex: 0 0 0.22rem; - background: $grey-dk-000; - border-radius: 50%; - transform: translateY(-0.16rem); -} - -.te-compact-list { - margin: 0.4rem 0 0; - padding-left: 1.05rem; - - li { - margin: 0.15rem 0; - } -} - -.te-variable-modes-grid { - display: grid; - grid-template-columns: 2.25rem max-content minmax(0, 1fr); - margin: 0.85rem 0 1rem; - overflow: hidden; - color: $grey-dk-100; - border: 1px solid $border-color; - border-radius: 4px; - - > * { - min-height: 2.45rem; - padding: 0.65rem 0.75rem; - border-top: 1px solid $border-color; - } - - > :nth-child(-n + 3) { - min-height: auto; - padding-top: 0.55rem; - padding-bottom: 0.55rem; - color: $grey-dk-100; - font-size: 0.82rem; - font-weight: 700; - background: mix(white, $grey-lt-000, 45%); - border-top: 0; - } - - > :nth-child(3n + 1) { - display: flex; - align-items: center; - justify-content: center; - padding-right: 0.45rem; - padding-left: 0.45rem; - } -} - -.te-variable-modes-grid__icon svg { - display: inline-block; -} - -@media (max-width: 42rem) { - .te-property-list__header { - display: none; - } - - .te-property__summary { - grid-template-columns: 1rem 1fr; - gap: 0.25rem 0.75rem; - } - - .te-property__details { - grid-column: 2; - } - - .te-property__more { - grid-template-columns: 1rem 1fr; - gap: 0.25rem 0.75rem; - } - - .te-property__more-inner { - grid-column: 2; - } -} - -// ============================================================================= -// Cursor MCP Install Button -// ============================================================================= - -.cursor-install-btn { - display: inline-block; - margin-bottom: 1rem; - transition: opacity 0.15s ease, transform 0.15s ease; - - &:hover { - opacity: 0.85; - transform: translateY(-1px); - } - - img { - border: none !important; - vertical-align: middle; - height: 38px !important; - width: auto !important; - } -} - -// ============================================================================= -// Mobile Responsive Fixes -// ============================================================================= - -@media (max-width: 900px) { - // Fix horizontal overflow on mobile - .main { - max-width: 100% !important; - width: 100%; - overflow-x: hidden; - } - - .main-content-wrap { - max-width: 100% !important; - padding-left: 15px; - padding-right: 15px; - } - - .content-with-toc { - max-width: 100%; - } - - .main-content table { - display: block; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - max-width: 100%; - } - - // Code blocks on mobile - ensure they stay within container and scroll - div.highlight { - max-width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - - pre { - max-width: 100%; - } - - code { - white-space: pre; - } - } - - // Hide copy button on mobile - .copy-btn { - display: none !important; - } -} - -.code-title{ - font-size: 1.5rem; - font-weight: 300; - margin-bottom: 0rem; - margin-top: 0.5rem; -} -.code-subtitle{ - font-size: 0.9rem; - color: $grey-dk-200; - font-weight: 200; - margin-top: 0.25rem; -} - -.main-content > h1:first-of-type{ - margin-top: 0 !important; -} - -// Give client walkthroughs a quieter title and clear separation between steps. -.main-content.mcp-client-guide { - > h1 { font-size: 2rem; line-height: 1.25; margin-bottom: 1rem; } - > .mcp-lead { font-size: 1.125rem; line-height: 1.6; } - > h2 { margin-top: 3rem; margin-bottom: 1rem; } - > ol > li { margin-bottom: 0.75rem; } - - .mcp-config { - margin: 1.5rem 0 2rem; - padding: 1rem 1.25rem; - border: 1px solid $grey-lt-200; - border-radius: 6px; - - summary { cursor: pointer; font-weight: 500; } - &[open] summary { margin-bottom: 1rem; } - } - - @media (max-width: 600px) { - > h1 { font-size: 1.625rem; } - } -} - -// Prose prompts should stay readable at every viewport width. -.main-content .language-text.highlighter-rouge { - .highlight { min-width: 0; } - - pre, - pre code { - white-space: pre-wrap; - overflow-wrap: anywhere; - word-break: normal; - } -} diff --git a/_sass/layout.scss b/_sass/layout.scss deleted file mode 100644 index 2cd1585..0000000 --- a/_sass/layout.scss +++ /dev/null @@ -1,209 +0,0 @@ -// -// The basic two column layout -// - -.side-bar { - z-index: 0; - flex-wrap: wrap; - background-color: $sidebar-color; - @include mq(md){ - margin-left: auto; - } - - // @include mq(md) { - // flex-wrap: nowrap; - // position: fixed; - // width: $nav-width-md; - // height: 100%; - // flex-direction: column; - // border-right: $border $border-color; - // align-items: flex-end; - // } -} -.side-bar-inner{ - @include mq(md) { - position: sticky; - top:0; - } -} - -.main { - flex-grow: 1; - @include mq(md) { - position: relative; - max-width: $content-width; - // margin-left: $nav-width-md; - } - - @include mq(lg) { - // margin-left: calc( - // (100% - #{$nav-width + $content-width}) / 2 + #{$nav-width} - // ); - } -} - -.main-content-wrap { - @include container; - padding-top: $gutter-spacing-sm; - padding-bottom: $gutter-spacing-sm; - - @include mq(md) { - padding-top: $gutter-spacing; - padding-bottom: $gutter-spacing; - } -} - -.main-header { - z-index: 0; - display: none; - background-color: $sidebar-color; - - @include mq(md) { - display: flex; - justify-content: space-between; - height: $header-height; - background-color: $body-background-color; - border-bottom: $border $border-color; - } - - &.nav-open { - display: block; - - @include mq(md) { - display: flex; - } - } -} - -.site-nav, -.site-header, -.site-footer { - width: 100%; - - @include mq(lg) { - width: $nav-width; - } -} - -.site-nav { - display: none; - - &.nav-open { - display: block; - } - - @include mq(md) { - display: block; - padding-top: $sp-8; - padding-bottom: $gutter-spacing-sm; - overflow-y: auto; - flex: 1 1 auto; - } -} - -.site-header { - display: flex; - min-height: $header-height; - align-items: center; - - @include mq(md) { - height: $header-height; - max-height: $header-height; - border-bottom: $border $border-color; - } -} - -.site-title { - @include container; - flex-grow: 1; - display: flex; - height: 100%; - align-items: center; - padding-top: $sp-3; - padding-bottom: $sp-3; - color: $body-heading-color; - @include fs-6; - - @include mq(md) { - padding-top: $sp-2; - padding-bottom: $sp-2; - } -} - -@if variable-exists(logo) { - .site-logo { - width: 100%; - height: 100%; - background-image: url($logo); - background-repeat: no-repeat; - background-position: left center; - background-size: contain; - } -} - -.site-button { - display: flex; - height: 100%; - padding: $gutter-spacing-sm; - align-items: center; -} - -@include mq(md) { - .site-header .site-button { - display: none; - } -} - -.site-title:hover { - background-image: linear-gradient( - -90deg, - rgba($feedback-color, 1) 0%, - rgba($feedback-color, 0.8) 80%, - rgba($feedback-color, 0) 100% - ); -} - -.site-button:hover { - background-image: linear-gradient( - -90deg, - rgba($feedback-color, 1) 0%, - rgba($feedback-color, 0.8) 100% - ); -} - -// stylelint-disable selector-max-type - -body { - position: relative; - padding-bottom: $sp-10; - overflow-y: scroll; - - @include mq(md) { - position: static; - padding-bottom: 0; - } -} - -// stylelint-enable selector-max-type - -.site-footer { - @include container; - position: absolute; - bottom: 0; - left: 0; - padding-top: $sp-4; - padding-bottom: $sp-4; - color: $grey-dk-000; - @include fs-2; - - @include mq(md) { - position: static; - justify-self: end; - } -} - -.icon { - width: $sp-5; - height: $sp-5; - color: $link-color; -} diff --git a/_sass/modules.scss b/_sass/modules.scss deleted file mode 100644 index d82591b..0000000 --- a/_sass/modules.scss +++ /dev/null @@ -1,20 +0,0 @@ -// -// Import external dependencies -// -@import "./vendor/normalize.scss/normalize.scss"; - -// -// Modules -// -@import "./base"; -@import "./layout"; -@import "./content"; -@import "./navigation"; -@import "./typography"; -@import "./labels"; -@import "./buttons"; -@import "./search"; -@import "./tables"; -@import "./code"; -@import "./utilities/utilities"; -@import "./print"; diff --git a/assets/css/search.css b/assets/css/search.css deleted file mode 100644 index 9c44f5e..0000000 --- a/assets/css/search.css +++ /dev/null @@ -1,8 +0,0 @@ -.search { - margin-top: 10px; -} - -.DocSearch-Button { - width: 50%; - min-width: 150px; -} diff --git a/assets/css/syntax.css b/assets/css/syntax.css deleted file mode 100644 index 54d90b7..0000000 --- a/assets/css/syntax.css +++ /dev/null @@ -1,286 +0,0 @@ -/** - * Rouge Syntax Highlighting - One Dark Theme - * Build-time highlighting - no JavaScript required - */ - -/* Code block container */ -.highlight { - background: #1e1e2e; - border-radius: 6px; - margin: 1em 0; - overflow-x: auto; -} - -.highlight pre { - margin: 0; - padding: 1em; - overflow-x: auto; - line-height: 1.5; -} - -.highlight code { - background: transparent; - border: none; - padding: 0; - font-family: "SF Mono", "Fira Code", "Consolas", "Monaco", monospace; - font-size: 0.9em; - color: #cdd6f4; -} - -/* Inline code */ -code { - background: #313244; - border-radius: 4px; - padding: 0.2em 0.4em; - font-size: 0.9em; - color: #cdd6f4; -} - -pre code { - background: transparent; - padding: 0; -} - -/* Rouge token colors - One Dark / Catppuccin inspired */ - -/* Comments */ -.highlight .c, /* Comment */ -.highlight .c1, /* Comment.Single */ -.highlight .cm, /* Comment.Multiline */ -.highlight .cp, /* Comment.Preproc */ -.highlight .cs, /* Comment.Special */ -.highlight .ch /* Comment.Hashbang */ -{ - color: #6c7086; - font-style: italic; -} - -/* Strings */ -.highlight .s, /* String */ -.highlight .s1, /* String.Single */ -.highlight .s2, /* String.Double */ -.highlight .sb, /* String.Backtick */ -.highlight .sc, /* String.Char */ -.highlight .sd, /* String.Doc */ -.highlight .se, /* String.Escape */ -.highlight .sh, /* String.Heredoc */ -.highlight .si, /* String.Interpol */ -.highlight .sr, /* String.Regex */ -.highlight .ss, /* String.Symbol */ -.highlight .sx /* String.Other */ -{ - color: #a6e3a1; -} - -/* Numbers */ -.highlight .m, /* Number */ -.highlight .mf, /* Number.Float */ -.highlight .mh, /* Number.Hex */ -.highlight .mi, /* Number.Integer */ -.highlight .mo, /* Number.Oct */ -.highlight .mb, /* Number.Bin */ -.highlight .mx, /* Number.Other */ -.highlight .il /* Number.Integer.Long */ -{ - color: #fab387; -} - -/* Keywords */ -.highlight .k, /* Keyword */ -.highlight .kc, /* Keyword.Constant */ -.highlight .kd, /* Keyword.Declaration */ -.highlight .kn, /* Keyword.Namespace */ -.highlight .kp, /* Keyword.Pseudo */ -.highlight .kr, /* Keyword.Reserved */ -.highlight .kt /* Keyword.Type */ -{ - color: #cba6f7; -} - -/* Names/Identifiers */ -.highlight .n /* Name */ -{ - color: #cdd6f4; -} - -.highlight .na /* Name.Attribute */ -{ - color: #89b4fa; -} - -.highlight .nb /* Name.Builtin */ -{ - color: #f38ba8; -} - -.highlight .nc /* Name.Class */ -{ - color: #f9e2af; -} - -.highlight .nd /* Name.Decorator */ -{ - color: #cba6f7; -} - -.highlight .nf, /* Name.Function */ -.highlight .fm /* Name.Function.Magic */ -{ - color: #89b4fa; -} - -.highlight .ni /* Name.Entity */ -{ - color: #fab387; -} - -.highlight .nl /* Name.Label */ -{ - color: #89dceb; -} - -.highlight .nn /* Name.Namespace */ -{ - color: #f9e2af; -} - -.highlight .no /* Name.Constant */ -{ - color: #fab387; -} - -.highlight .nt /* Name.Tag */ -{ - color: #f38ba8; -} - -.highlight .nv, /* Name.Variable */ -.highlight .vc, /* Name.Variable.Class */ -.highlight .vg, /* Name.Variable.Global */ -.highlight .vi, /* Name.Variable.Instance */ -.highlight .vm /* Name.Variable.Magic */ -{ - color: #f38ba8; -} - -/* Operators */ -.highlight .o, /* Operator */ -.highlight .ow /* Operator.Word */ -{ - color: #89dceb; -} - -/* Punctuation */ -.highlight .p /* Punctuation */ -{ - color: #cdd6f4; -} - -/* Generic */ -.highlight .gd /* Generic.Deleted */ -{ - color: #f38ba8; - background: rgba(243, 139, 168, 0.1); -} - -.highlight .ge /* Generic.Emph */ -{ - font-style: italic; -} - -.highlight .gh /* Generic.Heading */ -{ - color: #89b4fa; - font-weight: bold; -} - -.highlight .gi /* Generic.Inserted */ -{ - color: #a6e3a1; - background: rgba(166, 227, 161, 0.1); -} - -.highlight .gs /* Generic.Strong */ -{ - font-weight: bold; -} - -.highlight .gu /* Generic.Subheading */ -{ - color: #89dceb; -} - -/* Errors */ -.highlight .err /* Error */ -{ - color: #f38ba8; -} - -/* Text/Whitespace */ -.highlight .w /* Text.Whitespace */ -{ - color: #6c7086; -} - -/* Shell/Bash specific - these get good highlighting with Rouge */ -.highlight .nb /* Builtin commands like curl, echo, cd */ -{ - color: #89b4fa; - font-weight: 500; -} - -.highlight .nv /* Variables like $HOME */ -{ - color: #f38ba8; -} - -/* Selection */ -.highlight ::selection { - background: #45475a; -} - -.highlight ::-moz-selection { - background: #45475a; -} - -/* Copy button */ -.copy-btn { - position: absolute; - top: 0.5em; - right: 0.5em; - background: #45475a; - color: #cdd6f4; - border: none; - border-radius: 4px; - padding: 0.3em 0.7em; - font-size: 0.75em; - cursor: pointer; - opacity: 0; - transition: opacity 0.2s ease, background 0.2s ease; -} - -.highlight:hover .copy-btn { - opacity: 1; -} - -.copy-btn:hover { - background: #585b70; -} - -/* Mobile Responsive Styles */ -@media (max-width: 800px) { - /* Hide copy button on mobile (no hover on touch devices) */ - .copy-btn { - display: none; - } - - /* Fix code block overflow */ - .highlight { - max-width: 100%; - } - - .highlight pre { - max-width: 100%; - } -} - diff --git a/assets/js/analytics.js b/assets/js/analytics.js deleted file mode 100644 index 3d50aed..0000000 --- a/assets/js/analytics.js +++ /dev/null @@ -1,2649 +0,0 @@ -(function() { - /* - - Copyright The Closure Library Authors. - SPDX-License-Identifier: Apache-2.0 -*/ - var l = this || self - , m = function(a, b) { - a = a.split("."); - var c = l; - a[0]in c || "undefined" == typeof c.execScript || c.execScript("var " + a[0]); - for (var d; a.length && (d = a.shift()); ) - a.length || void 0 === b ? c = c[d] && c[d] !== Object.prototype[d] ? c[d] : c[d] = {} : c[d] = b - }; - var q = function(a, b) { - for (var c in b) - b.hasOwnProperty(c) && (a[c] = b[c]) - } - , r = function(a) { - for (var b in a) - if (a.hasOwnProperty(b)) - return !0; - return !1 - }; - var t = window - , u = document - , v = function(a, b) { - u.addEventListener ? u.addEventListener(a, b, !1) : u.attachEvent && u.attachEvent("on" + a, b) - }; - var w = /^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i; - var x = {} - , y = function() { - x.TAGGING = x.TAGGING || []; - x.TAGGING[1] = !0 - }; - var z = /:[0-9]+$/ - , B = function(a, b) { - b && (b = String(b).toLowerCase()); - if ("protocol" === b || "port" === b) - a.protocol = A(a.protocol) || A(t.location.protocol); - "port" === b ? a.port = String(Number(a.hostname ? a.port : t.location.port) || ("http" == a.protocol ? 80 : "https" == a.protocol ? 443 : "")) : "host" === b && (a.hostname = (a.hostname || t.location.hostname).replace(z, "").toLowerCase()); - var c = A(a.protocol); - b && (b = String(b).toLowerCase()); - switch (b) { - case "url_no_fragment": - b = ""; - a && a.href && (b = a.href.indexOf("#"), - b = 0 > b ? a.href : a.href.substr(0, b)); - a = b; - break; - case "protocol": - a = c; - break; - case "host": - a = a.hostname.replace(z, "").toLowerCase(); - break; - case "port": - a = String(Number(a.port) || ("http" == c ? 80 : "https" == c ? 443 : "")); - break; - case "path": - a.pathname || a.hostname || y(); - a = "/" == a.pathname.substr(0, 1) ? a.pathname : "/" + a.pathname; - a = a.split("/"); - a: if (b = [], - c = a[a.length - 1], - Array.prototype.indexOf) - b = b.indexOf(c), - b = "number" == typeof b ? b : -1; - else { - for (var d = 0; d < b.length; d++) - if (b[d] === c) { - b = d; - break a - } - b = -1 - } - 0 <= b && (a[a.length - 1] = ""); - a = a.join("/"); - break; - case "query": - a = a.search.replace("?", ""); - break; - case "extension": - a = a.pathname.split("."); - a = 1 < a.length ? a[a.length - 1] : ""; - a = a.split("/")[0]; - break; - case "fragment": - a = a.hash.replace("#", ""); - break; - default: - a = a && a.href - } - return a - } - , A = function(a) { - return a ? a.replace(":", "").toLowerCase() : "" - } - , C = function(a) { - var b = u.createElement("a"); - a && (b.href = a); - var c = b.pathname; - "/" !== c[0] && (a || y(), - c = "/" + c); - a = b.hostname.replace(z, ""); - return { - href: b.href, - protocol: b.protocol, - host: b.host, - hostname: a, - pathname: c, - search: b.search, - hash: b.hash, - port: b.port - } - }; - function D() { - for (var a = E, b = {}, c = 0; c < a.length; ++c) - b[a[c]] = c; - return b - } - function F() { - var a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - a += a.toLowerCase() + "0123456789-_"; - return a + "." - } - var E, G; - function H(a) { - E = E || F(); - G = G || D(); - for (var b = [], c = 0; c < a.length; c += 3) { - var d = c + 1 < a.length - , f = c + 2 < a.length - , e = a.charCodeAt(c) - , g = d ? a.charCodeAt(c + 1) : 0 - , h = f ? a.charCodeAt(c + 2) : 0 - , k = e >> 2; - e = (e & 3) << 4 | g >> 4; - g = (g & 15) << 2 | h >> 6; - h &= 63; - f || (h = 64, - d || (g = 64)); - b.push(E[k], E[e], E[g], E[h]) - } - return b.join("") - } - function I(a) { - function b(k) { - for (; d < a.length; ) { - var n = a.charAt(d++) - , p = G[n]; - if (null != p) - return p; - if (!/^[\s\xa0]*$/.test(n)) - throw Error("Unknown base64 encoding at char: " + n); - } - return k - } - E = E || F(); - G = G || D(); - for (var c = "", d = 0; ; ) { - var f = b(-1) - , e = b(0) - , g = b(64) - , h = b(64); - if (64 === h && -1 === f) - return c; - c += String.fromCharCode(f << 2 | e >> 4); - 64 != g && (c += String.fromCharCode(e << 4 & 240 | g >> 2), - 64 != h && (c += String.fromCharCode(g << 6 & 192 | h))) - } - } - ;var J; - var N = function() { - var a = K - , b = L - , c = M() - , d = function(g) { - a(g.target || g.srcElement || {}) - } - , f = function(g) { - b(g.target || g.srcElement || {}) - }; - if (!c.init) { - v("mousedown", d); - v("keyup", d); - v("submit", f); - var e = HTMLFormElement.prototype.submit; - HTMLFormElement.prototype.submit = function() { - b(this); - e.call(this) - } - ; - c.init = !0 - } - } - , O = function(a, b, c) { - for (var d = M().decorators, f = {}, e = 0; e < d.length; ++e) { - var g = d[e], h; - if (h = !c || g.forms) - a: { - h = g.domains; - var k = a - , n = !!g.sameHost; - if (h && (n || k !== u.location.hostname)) - for (var p = 0; p < h.length; p++) - if (h[p]instanceof RegExp) { - if (h[p].test(k)) { - h = !0; - break a - } - } else if (0 <= k.indexOf(h[p]) || n && 0 <= h[p].indexOf(k)) { - h = !0; - break a - } - h = !1 - } - h && (h = g.placement, - void 0 == h && (h = g.fragment ? 2 : 1), - h === b && q(f, g.callback())) - } - return f - } - , M = function() { - var a = {}; - var b = t.google_tag_data; - t.google_tag_data = void 0 === b ? a : b; - a = t.google_tag_data; - b = a.gl; - b && b.decorators || (b = { - decorators: [] - }, - a.gl = b); - return b - }; - var P = /(.*?)\*(.*?)\*(.*)/ - , aa = /([^?#]+)(\?[^#]*)?(#.*)?/; - function Q(a) { - return new RegExp("(.*?)(^|&)" + a + "=([^&]*)&?(.*)") - } - var S = function(a) { - var b = [], c; - for (c in a) - if (a.hasOwnProperty(c)) { - var d = a[c]; - void 0 !== d && d === d && null !== d && "[object Object]" !== d.toString() && (b.push(c), - b.push(H(String(d)))) - } - a = b.join("*"); - return ["1", R(a), a].join("*") - } - , R = function(a, b) { - a = [window.navigator.userAgent, (new Date).getTimezoneOffset(), window.navigator.userLanguage || window.navigator.language, Math.floor((new Date).getTime() / 60 / 1E3) - (void 0 === b ? 0 : b), a].join("*"); - if (!(b = J)) { - b = Array(256); - for (var c = 0; 256 > c; c++) { - for (var d = c, f = 0; 8 > f; f++) - d = d & 1 ? d >>> 1 ^ 3988292384 : d >>> 1; - b[c] = d - } - } - J = b; - b = 4294967295; - for (c = 0; c < a.length; c++) - b = b >>> 8 ^ J[(b ^ a.charCodeAt(c)) & 255]; - return ((b ^ -1) >>> 0).toString(36) - } - , ca = function(a) { - return function(b) { - var c = C(t.location.href) - , d = c.search.replace("?", ""); - a: { - var f = d.split("&"); - for (var e = 0; e < f.length; e++) { - var g = f[e].split("="); - if ("_gl" === decodeURIComponent(g[0]).replace(/\+/g, " ")) { - f = g.slice(1).join("="); - break a - } - } - f = void 0 - } - b.query = T(f || "") || {}; - f = B(c, "fragment"); - e = f.match(Q("_gl")); - b.fragment = T(e && e[3] || "") || {}; - a && ba(c, d, f) - } - }; - function U(a, b) { - if (a = Q(a).exec(b)) { - var c = a[2] - , d = a[4]; - b = a[1]; - d && (b = b + c + d) - } - return b - } - var ba = function(a, b, c) { - function d(e, g) { - e = U("_gl", e); - e.length && (e = g + e); - return e - } - if (t.history && t.history.replaceState) { - var f = Q("_gl"); - if (f.test(b) || f.test(c)) - a = B(a, "path"), - b = d(b, "?"), - c = d(c, "#"), - t.history.replaceState({}, void 0, "" + a + b + c) - } - } - , T = function(a) { - var b = void 0 === b ? 3 : b; - try { - if (a) { - a: { - for (var c = 0; 3 > c; ++c) { - var d = P.exec(a); - if (d) { - var f = d; - break a - } - a = decodeURIComponent(a) - } - f = void 0 - } - if (f && "1" === f[1]) { - var e = f[2] - , g = f[3]; - a: { - for (f = 0; f < b; ++f) - if (e === R(g, f)) { - var h = !0; - break a - } - h = !1 - } - if (h) { - b = {}; - var k = g ? g.split("*") : []; - for (g = 0; g < k.length; g += 2) - b[k[g]] = I(k[g + 1]); - return b - } - } - } - } catch (n) {} - }; - function V(a, b, c, d) { - function f(k) { - k = U(a, k); - var n = k.charAt(k.length - 1); - k && "&" !== n && (k += "&"); - return k + h - } - d = void 0 === d ? !1 : d; - var e = aa.exec(c); - if (!e) - return ""; - c = e[1]; - var g = e[2] || ""; - e = e[3] || ""; - var h = a + "=" + b; - d ? e = "#" + f(e.substring(1)) : g = "?" + f(g.substring(1)); - return "" + c + g + e - } - function W(a, b) { - var c = "FORM" === (a.tagName || "").toUpperCase() - , d = O(b, 1, c) - , f = O(b, 2, c); - b = O(b, 3, c); - r(d) && (d = S(d), - c ? X("_gl", d, a) : Y("_gl", d, a, !1)); - !c && r(f) && (c = S(f), - Y("_gl", c, a, !0)); - for (var e in b) - b.hasOwnProperty(e) && Z(e, b[e], a) - } - function Z(a, b, c, d) { - if (c.tagName) { - if ("a" === c.tagName.toLowerCase()) - return Y(a, b, c, d); - if ("form" === c.tagName.toLowerCase()) - return X(a, b, c) - } - if ("string" == typeof c) - return V(a, b, c, d) - } - function Y(a, b, c, d) { - c.href && (a = V(a, b, c.href, void 0 === d ? !1 : d), - w.test(a) && (c.href = a)) - } - function X(a, b, c) { - if (c && c.action) { - var d = (c.method || "").toLowerCase(); - if ("get" === d) { - d = c.childNodes || []; - for (var f = !1, e = 0; e < d.length; e++) { - var g = d[e]; - if (g.name === a) { - g.setAttribute("value", b); - f = !0; - break - } - } - f || (d = u.createElement("input"), - d.setAttribute("type", "hidden"), - d.setAttribute("name", a), - d.setAttribute("value", b), - c.appendChild(d)) - } else - "post" === d && (a = V(a, b, c.action), - w.test(a) && (c.action = a)) - } - } - var K = function(a) { - try { - a: { - for (var b = 100; a && 0 < b; ) { - if (a.href && a.nodeName.match(/^a(?:rea)?$/i)) { - var c = a; - break a - } - a = a.parentNode; - b-- - } - c = null - } - if (c) { - var d = c.protocol; - "http:" !== d && "https:" !== d || W(c, c.hostname) - } - } catch (f) {} - } - , L = function(a) { - try { - if (a.action) { - var b = B(C(a.action), "host"); - W(a, b) - } - } catch (c) {} - }; - m("google_tag_data.glBridge.auto", function(a, b, c, d) { - N(); - c = "fragment" === c ? 2 : 1; - a = { - callback: a, - domains: b, - fragment: 2 === c, - placement: c, - forms: !!d, - sameHost: !1 - }; - M().decorators.push(a) - }); - m("google_tag_data.glBridge.decorate", function(a, b, c) { - a = S(a); - return Z("_gl", a, b, !!c) - }); - m("google_tag_data.glBridge.generate", S); - m("google_tag_data.glBridge.get", function(a, b) { - var c = ca(!!b); - b = M(); - b.data || (b.data = { - query: {}, - fragment: {} - }, - c(b.data)); - c = {}; - if (b = b.data) - q(c, b.query), - a && q(c, b.fragment); - return c - }); -} -)(window); -(function() { - function La(a) { - var b = 1, c; - if (a) - for (b = 0, - c = a.length - 1; 0 <= c; c--) { - var d = a.charCodeAt(c); - b = (b << 6 & 268435455) + d + (d << 14); - d = b & 266338304; - b = 0 != d ? b ^ d >> 21 : b - } - return b - } - ;/* - - Copyright The Closure Library Authors. - SPDX-License-Identifier: Apache-2.0 -*/ - var $c = function(a) { - this.C = a || [] - }; - $c.prototype.set = function(a) { - this.C[a] = !0 - } - ; - $c.prototype.encode = function() { - for (var a = [], b = 0; b < this.C.length; b++) - this.C[b] && (a[Math.floor(b / 6)] ^= 1 << b % 6); - for (b = 0; b < a.length; b++) - a[b] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(a[b] || 0); - return a.join("") + "~" - } - ; - var ha = window.GoogleAnalyticsObject, F; - if (F = void 0 != ha) - F = -1 < (ha.constructor + "").indexOf("String"); - var wa; - if (wa = F) { - var Ea = window.GoogleAnalyticsObject; - wa = Ea ? Ea.replace(/^[\s\xa0]+|[\s\xa0]+$/g, "") : "" - } - var gb = wa || "ga" - , jd = /^(?:utma\.)?\d+\.\d+$/ - , kd = /^amp-[\w.-]{22,64}$/ - , Ba = !1; - var vd = new $c; - function J(a) { - vd.set(a) - } - var Td = function(a) { - a = Dd(a); - a = new $c(a); - for (var b = vd.C.slice(), c = 0; c < a.C.length; c++) - b[c] = b[c] || a.C[c]; - return (new $c(b)).encode() - } - , Dd = function(a) { - a = a.get(Gd); - ka(a) || (a = []); - return a - }; - var ea = function(a) { - return "function" == typeof a - } - , ka = function(a) { - return "[object Array]" == Object.prototype.toString.call(Object(a)) - } - , qa = function(a) { - return void 0 != a && -1 < (a.constructor + "").indexOf("String") - } - , D = function(a, b) { - return 0 == a.indexOf(b) - } - , sa = function(a) { - return a ? a.replace(/^[\s\xa0]+|[\s\xa0]+$/g, "") : "" - } - , ra = function() { - for (var a = O.navigator.userAgent + (M.cookie ? M.cookie : "") + (M.referrer ? M.referrer : ""), b = a.length, c = O.history.length; 0 < c; ) - a += c-- ^ b++; - return [hd() ^ La(a) & 2147483647, Math.round((new Date).getTime() / 1E3)].join(".") - } - , ta = function(a) { - var b = M.createElement("img"); - b.width = 1; - b.height = 1; - b.src = a; - return b - } - , ua = function() {} - , K = function(a) { - if (encodeURIComponent instanceof Function) - return encodeURIComponent(a); - J(28); - return a - } - , L = function(a, b, c, d) { - try { - a.addEventListener ? a.addEventListener(b, c, !!d) : a.attachEvent && a.attachEvent("on" + b, c) - } catch (e) { - J(27) - } - } - , f = /^[\w\-:/.?=&%!\[\]]+$/ - , Nd = /^[\w+/_-]+[=]{0,2}$/ - , be = function(a, b) { - return E(M.location[b ? "href" : "search"], a) - } - , E = function(a, b) { - return (a = a.match("(?:&|#|\\?)" + K(b).replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1") + "=([^&#]*)")) && 2 == a.length ? a[1] : "" - } - , xa = function() { - var a = "" + M.location.hostname; - return 0 == a.indexOf("www.") ? a.substring(4) : a - } - , de = function(a, b) { - var c = a.indexOf(b); - if (5 == c || 6 == c) - if (a = a.charAt(c + b.length), - "/" == a || "?" == a || "" == a || ":" == a) - return !0; - return !1 - } - , ya = function(a, b) { - var c = M.referrer; - if (/^(https?|android-app):\/\//i.test(c)) { - if (a) - return c; - a = "//" + M.location.hostname; - if (!de(c, a)) - return b && (b = a.replace(/\./g, "-") + ".cdn.ampproject.org", - de(c, b)) ? void 0 : c - } - } - , za = function(a, b) { - if (1 == b.length && null != b[0] && "object" === typeof b[0]) - return b[0]; - for (var c = {}, d = Math.min(a.length + 1, b.length), e = 0; e < d; e++) - if ("object" === typeof b[e]) { - for (var g in b[e]) - b[e].hasOwnProperty(g) && (c[g] = b[e][g]); - break - } else - e < a.length && (c[a[e]] = b[e]); - return c - }; - var ee = function() { - this.keys = []; - this.values = {}; - this.m = {} - }; - ee.prototype.set = function(a, b, c) { - this.keys.push(a); - c ? this.m[":" + a] = b : this.values[":" + a] = b - } - ; - ee.prototype.get = function(a) { - return this.m.hasOwnProperty(":" + a) ? this.m[":" + a] : this.values[":" + a] - } - ; - ee.prototype.map = function(a) { - for (var b = 0; b < this.keys.length; b++) { - var c = this.keys[b] - , d = this.get(c); - d && a(c, d) - } - } - ; - var O = window - , M = document - , va = function(a, b) { - return setTimeout(a, b) - }; - var Qa = window - , Za = document - , G = function(a) { - var b = Qa._gaUserPrefs; - if (b && b.ioo && b.ioo() || a && !0 === Qa["ga-disable-" + a]) - return !0; - try { - var c = Qa.external; - if (c && c._gaUserPrefs && "oo" == c._gaUserPrefs) - return !0 - } catch (g) {} - a = []; - b = String(Za.cookie).split(";"); - for (c = 0; c < b.length; c++) { - var d = b[c].split("=") - , e = d[0].replace(/^\s*|\s*$/g, ""); - e && "AMP_TOKEN" == e && ((d = d.slice(1).join("=").replace(/^\s*|\s*$/g, "")) && (d = decodeURIComponent(d)), - a.push(d)) - } - for (b = 0; b < a.length; b++) - if ("$OPT_OUT" == a[b]) - return !0; - return Za.getElementById("__gaOptOutExtension") ? !0 : !1 - }; - var Ca = function(a) { - var b = [] - , c = M.cookie.split(";"); - a = new RegExp("^\\s*" + a + "=\\s*(.*?)\\s*$"); - for (var d = 0; d < c.length; d++) { - var e = c[d].match(a); - e && b.push(e[1]) - } - return b - } - , zc = function(a, b, c, d, e, g, ca) { - e = G(e) ? !1 : eb.test(M.location.hostname) || "/" == c && vc.test(d) ? !1 : !0; - if (!e) - return !1; - b && 1200 < b.length && (b = b.substring(0, 1200)); - c = a + "=" + b + "; path=" + c + "; "; - g && (c += "expires=" + (new Date((new Date).getTime() + g)).toGMTString() + "; "); - d && "none" !== d && (c += "domain=" + d + ";"); - ca && (c += ca + ";"); - d = M.cookie; - M.cookie = c; - if (!(d = d != M.cookie)) - a: { - a = Ca(a); - for (d = 0; d < a.length; d++) - if (b == a[d]) { - d = !0; - break a - } - d = !1 - } - return d - } - , Cc = function(a) { - return encodeURIComponent ? encodeURIComponent(a).replace(/\(/g, "%28").replace(/\)/g, "%29") : a - } - , vc = /^(www\.)?google(\.com?)?(\.[a-z]{2})?$/ - , eb = /(^|\.)doubleclick\.net$/i; - var oc, Id = /^.*Version\/?(\d+)[^\d].*$/i, ne = function() { - if (void 0 !== O.__ga4__) - return O.__ga4__; - if (void 0 === oc) { - var a = O.navigator.userAgent; - if (a) { - var b = a; - try { - b = decodeURIComponent(a) - } catch (c) {} - if (a = !(0 <= b.indexOf("Chrome")) && !(0 <= b.indexOf("CriOS")) && (0 <= b.indexOf("Safari/") || 0 <= b.indexOf("Safari,"))) - b = Id.exec(b), - a = 11 <= (b ? Number(b[1]) : -1); - oc = a - } else - oc = !1 - } - return oc - }; - var Fa, Ga, fb, Ab, ja = /^https?:\/\/[^/]*cdn\.ampproject\.org\//, Ue = /^(?:www\.|m\.|amp\.)+/, Ub = [], da = function(a) { - if (ye(a[Kd])) { - if (void 0 === Ab) { - var b; - if (b = (b = De.get()) && b._ga || void 0) - Ab = b, - J(81) - } - if (void 0 !== Ab) - return a[Q] || (a[Q] = Ab), - !1 - } - if (a[Kd]) { - J(67); - if (a[ac] && "cookie" != a[ac]) - return !1; - if (void 0 !== Ab) - a[Q] || (a[Q] = Ab); - else { - a: { - b = String(a[W] || xa()); - var c = String(a[Yb] || "/") - , d = Ca(String(a[U] || "_ga")); - b = na(d, b, c); - if (!b || jd.test(b)) - b = !0; - else if (b = Ca("AMP_TOKEN"), - 0 == b.length) - b = !0; - else { - if (1 == b.length && (b = decodeURIComponent(b[0]), - "$RETRIEVING" == b || "$OPT_OUT" == b || "$ERROR" == b || "$NOT_FOUND" == b)) { - b = !0; - break a - } - b = !1 - } - } - if (b && tc(ic, String(a[Na]))) - return !0 - } - } - return !1 - }, ic = function() { - Z.D([ua]) - }, tc = function(a, b) { - var c = Ca("AMP_TOKEN"); - if (1 < c.length) - return J(55), - !1; - c = decodeURIComponent(c[0] || ""); - if ("$OPT_OUT" == c || "$ERROR" == c || G(b)) - return J(62), - !1; - if (!ja.test(M.referrer) && "$NOT_FOUND" == c) - return J(68), - !1; - if (void 0 !== Ab) - return J(56), - va(function() { - a(Ab) - }, 0), - !0; - if (Fa) - return Ub.push(a), - !0; - if ("$RETRIEVING" == c) - return J(57), - va(function() { - tc(a, b) - }, 1E4), - !0; - Fa = !0; - c && "$" != c[0] || (xc("$RETRIEVING", 3E4), - setTimeout(Mc, 3E4), - c = ""); - return Pc(c, b) ? (Ub.push(a), - !0) : !1 - }, Pc = function(a, b, c) { - if (!window.JSON) - return J(58), - !1; - var d = O.XMLHttpRequest; - if (!d) - return J(59), - !1; - var e = new d; - if (!("withCredentials"in e)) - return J(60), - !1; - e.open("POST", (c || "https://ampcid.google.com/v1/publisher:getClientId") + "?key=AIzaSyA65lEHUEizIsNtlbNo-l2K18dT680nsaM", !0); - e.withCredentials = !0; - e.setRequestHeader("Content-Type", "text/plain"); - e.onload = function() { - Fa = !1; - if (4 == e.readyState) { - try { - 200 != e.status && (J(61), - Qc("", "$ERROR", 3E4)); - var g = JSON.parse(e.responseText); - g.optOut ? (J(63), - Qc("", "$OPT_OUT", 31536E6)) : g.clientId ? Qc(g.clientId, g.securityToken, 31536E6) : !c && g.alternateUrl ? (Ga && clearTimeout(Ga), - Fa = !0, - Pc(a, b, g.alternateUrl)) : (J(64), - Qc("", "$NOT_FOUND", 36E5)) - } catch (ca) { - J(65), - Qc("", "$ERROR", 3E4) - } - e = null - } - } - ; - d = { - originScope: "AMP_ECID_GOOGLE" - }; - a && (d.securityToken = a); - e.send(JSON.stringify(d)); - Ga = va(function() { - J(66); - Qc("", "$ERROR", 3E4) - }, 1E4); - return !0 - }, Mc = function() { - Fa = !1 - }, xc = function(a, b) { - if (void 0 === fb) { - fb = ""; - for (var c = id(), d = 0; d < c.length; d++) { - var e = c[d]; - if (zc("AMP_TOKEN", encodeURIComponent(a), "/", e, "", b)) { - fb = e; - return - } - } - } - zc("AMP_TOKEN", encodeURIComponent(a), "/", fb, "", b) - }, Qc = function(a, b, c) { - Ga && clearTimeout(Ga); - b && xc(b, c); - Ab = a; - b = Ub; - Ub = []; - for (c = 0; c < b.length; c++) - b[c](a) - }, ye = function(a) { - a: { - if (ja.test(M.referrer)) { - var b = M.location.hostname.replace(Ue, ""); - b: { - var c = M.referrer; - c = c.replace(/^https?:\/\//, ""); - var d = c.replace(/^[^/]+/, "").split("/") - , e = d[2]; - d = (d = "s" == e ? d[3] : e) ? decodeURIComponent(d) : d; - if (!d) { - if (0 == c.indexOf("xn--")) { - c = ""; - break b - } - (c = c.match(/(.*)\.cdn\.ampproject\.org\/?$/)) && 2 == c.length && (d = c[1].replace(/-/g, ".").replace(/\.\./g, "-")) - } - c = d ? d.replace(Ue, "") : "" - } - (d = b === c) || (c = "." + c, - d = b.substring(b.length - c.length, b.length) === c); - if (d) { - b = !0; - break a - } else - J(78) - } - b = !1 - } - return b && !1 !== a - }; - var bd = function(a) { - return (a ? "https:" : Ba || "https:" == M.location.protocol ? "https:" : "http:") + "//www.google-analytics.com" - } - , Da = function(a) { - this.name = "len"; - this.message = a + "-8192" - } - , ba = function(a, b, c) { - c = c || ua; - if (2036 >= b.length) - wc(a, b, c); - else if (8192 >= b.length) - x(a, b, c) || wd(a, b, c) || wc(a, b, c); - else - throw ge("len", b.length), - new Da(b.length); - } - , pe = function(a, b, c, d) { - d = d || ua; - wd(a + "?" + b, "", d, c) - } - , wc = function(a, b, c) { - var d = ta(a + "?" + b); - d.onload = d.onerror = function() { - d.onload = null; - d.onerror = null; - c() - } - } - , wd = function(a, b, c, d) { - var e = O.XMLHttpRequest; - if (!e) - return !1; - var g = new e; - if (!("withCredentials"in g)) - return !1; - a = a.replace(/^http:/, "https:"); - g.open("POST", a, !0); - g.withCredentials = !0; - g.setRequestHeader("Content-Type", "text/plain"); - g.onreadystatechange = function() { - if (4 == g.readyState) { - if (d) - try { - var ca = g.responseText; - if (1 > ca.length) - ge("xhr", "ver", "0"), - c(); - else if ("1" != ca.charAt(0)) - ge("xhr", "ver", String(ca.length)), - c(); - else if (3 < d.count++) - ge("xhr", "tmr", "" + d.count), - c(); - else if (1 == ca.length) - c(); - else { - var l = ca.charAt(1); - if ("d" == l) - pe("https://stats.g.doubleclick.net/j/collect", d.U, d, c); - else if ("g" == l) { - wc("https://www.google.%/ads/ga-audiences".replace("%", "com"), d.google, c); - var k = ca.substring(2); - k && (/^[a-z.]{1,6}$/.test(k) ? wc("https://www.google.%/ads/ga-audiences".replace("%", k), d.google, ua) : ge("tld", "bcc", k)) - } else - ge("xhr", "brc", l), - c() - } - } catch (w) { - ge("xhr", "rsp"), - c() - } - else - c(); - g = null - } - } - ; - g.send(b); - return !0 - } - , x = function(a, b, c) { - return O.navigator.sendBeacon ? O.navigator.sendBeacon(a, b) ? (c(), - !0) : !1 : !1 - } - , ge = function(a, b, c) { - 1 <= 100 * Math.random() || G("?") || (a = ["t=error", "_e=" + a, "_v=j83", "sr=1"], - b && a.push("_f=" + b), - c && a.push("_m=" + K(c.substring(0, 100))), - a.push("aip=1"), - a.push("z=" + hd()), - wc(bd(!0) + "/u/d", a.join("&"), ua)) - }; - var qc = function() { - return O.gaData = O.gaData || {} - } - , h = function(a) { - var b = qc(); - return b[a] = b[a] || {} - }; - var Ha = function() { - this.M = [] - }; - Ha.prototype.add = function(a) { - this.M.push(a) - } - ; - Ha.prototype.D = function(a) { - try { - for (var b = 0; b < this.M.length; b++) { - var c = a.get(this.M[b]); - c && ea(c) && c.call(O, a) - } - } catch (d) {} - b = a.get(Ia); - b != ua && ea(b) && (a.set(Ia, ua, !0), - setTimeout(b, 10)) - } - ; - function Ja(a) { - if (100 != a.get(Ka) && La(P(a, Q)) % 1E4 >= 100 * R(a, Ka)) - throw "abort"; - } - function Ma(a) { - if (G(P(a, Na))) - throw "abort"; - } - function Oa() { - var a = M.location.protocol; - if ("http:" != a && "https:" != a) - throw "abort"; - } - function Pa(a) { - try { - O.navigator.sendBeacon ? J(42) : O.XMLHttpRequest && "withCredentials"in new O.XMLHttpRequest && J(40) - } catch (c) {} - a.set(ld, Td(a), !0); - a.set(Ac, R(a, Ac) + 1); - var b = []; - ue.map(function(c, d) { - d.F && (c = a.get(c), - void 0 != c && c != d.defaultValue && ("boolean" == typeof c && (c *= 1), - b.push(d.F + "=" + K("" + c)))) - }); - !1 === a.get(xe) && b.push("npa=1"); - b.push("z=" + Bd()); - a.set(Ra, b.join("&"), !0) - } - function Sa(a) { - var b = P(a, fa); - !b && a.get(Vd) && (b = "beacon"); - var c = P(a, gd) - , d = P(a, oe) - , e = c || (d || bd(!1) + "") + "/collect"; - switch (P(a, ad)) { - case "d": - e = c || (d || bd(!1) + "") + "/j/collect"; - b = a.get(qe) || void 0; - pe(e, P(a, Ra), b, a.Z(Ia)); - break; - case "b": - e = c || (d || bd(!1) + "") + "/r/collect"; - default: - b ? (c = P(a, Ra), - d = (d = a.Z(Ia)) || ua, - "image" == b ? wc(e, c, d) : "xhr" == b && wd(e, c, d) || "beacon" == b && x(e, c, d) || ba(e, c, d)) : ba(e, P(a, Ra), a.Z(Ia)) - } - e = P(a, Na); - e = h(e); - b = e.hitcount; - e.hitcount = b ? b + 1 : 1; - e.first_hit || (e.first_hit = (new Date).getTime()); - e = P(a, Na); - delete h(e).pending_experiments; - a.set(Ia, ua, !0) - } - function Hc(a) { - qc().expId && a.set(Nc, qc().expId); - qc().expVar && a.set(Oc, qc().expVar); - var b = P(a, Na); - if (b = h(b).pending_experiments) { - var c = []; - for (d in b) - b.hasOwnProperty(d) && b[d] && c.push(encodeURIComponent(d) + "." + encodeURIComponent(b[d])); - var d = c.join("!") - } else - d = void 0; - d && ((b = a.get(m)) && (d = b + "!" + d), - a.set(m, d, !0)) - } - function cd() { - if (O.navigator && "preview" == O.navigator.loadPurpose) - throw "abort"; - } - function yd(a) { - var b = O.gaDevIds || []; - if (ka(b)) { - var c = a.get("&did"); - qa(c) && 0 < c.length && (b = b.concat(c.split(","))); - c = []; - for (var d = 0; d < b.length; d++) { - var e; - a: { - for (e = 0; e < c.length; e++) - if (b[d] == c[e]) { - e = !0; - break a - } - e = !1 - } - e || c.push(b[d]) - } - 0 != c.length && a.set("&did", c.join(","), !0) - } - } - function vb(a) { - if (!a.get(Na)) - throw "abort"; - } - ;var hd = function() { - return Math.round(2147483647 * Math.random()) - } - , Bd = function() { - try { - var a = new Uint32Array(1); - O.crypto.getRandomValues(a); - return a[0] & 2147483647 - } catch (b) { - return hd() - } - }; - function Ta(a) { - var b = R(a, Ua); - 500 <= b && J(15); - var c = P(a, Va); - if ("transaction" != c && "item" != c) { - c = R(a, Wa); - var d = (new Date).getTime() - , e = R(a, Xa); - 0 == e && a.set(Xa, d); - e = Math.round(2 * (d - e) / 1E3); - 0 < e && (c = Math.min(c + e, 20), - a.set(Xa, d)); - if (0 >= c) - throw "abort"; - a.set(Wa, --c) - } - a.set(Ua, ++b) - } - ;var Ya = function() { - this.data = new ee - }; - Ya.prototype.get = function(a) { - var b = $a(a) - , c = this.data.get(a); - b && void 0 == c && (c = ea(b.defaultValue) ? b.defaultValue() : b.defaultValue); - return b && b.Z ? b.Z(this, a, c) : c - } - ; - var P = function(a, b) { - a = a.get(b); - return void 0 == a ? "" : "" + a - } - , R = function(a, b) { - a = a.get(b); - return void 0 == a || "" === a ? 0 : Number(a) - }; - Ya.prototype.Z = function(a) { - return (a = this.get(a)) && ea(a) ? a : ua - } - ; - Ya.prototype.set = function(a, b, c) { - if (a) - if ("object" == typeof a) - for (var d in a) - a.hasOwnProperty(d) && ab(this, d, a[d], c); - else - ab(this, a, b, c) - } - ; - var ab = function(a, b, c, d) { - if (void 0 != c) - switch (b) { - case Na: - wb.test(c) - } - var e = $a(b); - e && e.o ? e.o(a, b, c, d) : a.data.set(b, c, d) - }; - var ue = new ee - , ve = [] - , bb = function(a, b, c, d, e) { - this.name = a; - this.F = b; - this.Z = d; - this.o = e; - this.defaultValue = c - } - , $a = function(a) { - var b = ue.get(a); - if (!b) - for (var c = 0; c < ve.length; c++) { - var d = ve[c] - , e = d[0].exec(a); - if (e) { - b = d[1](e); - ue.set(b.name, b); - break - } - } - return b - } - , yc = function(a) { - var b; - ue.map(function(c, d) { - d.F == a && (b = d) - }); - return b && b.name - } - , S = function(a, b, c, d, e) { - a = new bb(a,b,c,d,e); - ue.set(a.name, a); - return a.name - } - , cb = function(a, b) { - ve.push([new RegExp("^" + a + "$"), b]) - } - , T = function(a, b, c) { - return S(a, b, c, void 0, db) - } - , db = function() {}; - var hb = T("apiVersion", "v") - , ib = T("clientVersion", "_v"); - S("anonymizeIp", "aip"); - var jb = S("adSenseId", "a") - , Va = S("hitType", "t") - , Ia = S("hitCallback") - , Ra = S("hitPayload"); - S("nonInteraction", "ni"); - S("currencyCode", "cu"); - S("dataSource", "ds"); - var Vd = S("useBeacon", void 0, !1) - , fa = S("transport"); - S("sessionControl", "sc", ""); - S("sessionGroup", "sg"); - S("queueTime", "qt"); - var Ac = S("_s", "_s"); - S("screenName", "cd"); - var kb = S("location", "dl", "") - , lb = S("referrer", "dr") - , mb = S("page", "dp", ""); - S("hostname", "dh"); - var nb = S("language", "ul") - , ob = S("encoding", "de"); - S("title", "dt", function() { - return M.title || void 0 - }); - cb("contentGroup([0-9]+)", function(a) { - return new bb(a[0],"cg" + a[1]) - }); - var pb = S("screenColors", "sd") - , qb = S("screenResolution", "sr") - , rb = S("viewportSize", "vp") - , sb = S("javaEnabled", "je") - , tb = S("flashVersion", "fl"); - S("campaignId", "ci"); - S("campaignName", "cn"); - S("campaignSource", "cs"); - S("campaignMedium", "cm"); - S("campaignKeyword", "ck"); - S("campaignContent", "cc"); - var ub = S("eventCategory", "ec") - , xb = S("eventAction", "ea") - , yb = S("eventLabel", "el") - , zb = S("eventValue", "ev") - , Bb = S("socialNetwork", "sn") - , Cb = S("socialAction", "sa") - , Db = S("socialTarget", "st") - , Eb = S("l1", "plt") - , Fb = S("l2", "pdt") - , Gb = S("l3", "dns") - , Hb = S("l4", "rrt") - , Ib = S("l5", "srt") - , Jb = S("l6", "tcp") - , Kb = S("l7", "dit") - , Lb = S("l8", "clt") - , Ve = S("l9", "_gst") - , We = S("l10", "_gbt") - , Xe = S("l11", "_cst") - , Ye = S("l12", "_cbt") - , Mb = S("timingCategory", "utc") - , Nb = S("timingVar", "utv") - , Ob = S("timingLabel", "utl") - , Pb = S("timingValue", "utt"); - S("appName", "an"); - S("appVersion", "av", ""); - S("appId", "aid", ""); - S("appInstallerId", "aiid", ""); - S("exDescription", "exd"); - S("exFatal", "exf"); - var Nc = S("expId", "xid") - , Oc = S("expVar", "xvar") - , m = S("exp", "exp") - , Rc = S("_utma", "_utma") - , Sc = S("_utmz", "_utmz") - , Tc = S("_utmht", "_utmht") - , Ua = S("_hc", void 0, 0) - , Xa = S("_ti", void 0, 0) - , Wa = S("_to", void 0, 20); - cb("dimension([0-9]+)", function(a) { - return new bb(a[0],"cd" + a[1]) - }); - cb("metric([0-9]+)", function(a) { - return new bb(a[0],"cm" + a[1]) - }); - S("linkerParam", void 0, void 0, Bc, db); - var Ze = T("_cd2l", void 0, !1) - , ld = S("usage", "_u") - , Gd = S("_um"); - S("forceSSL", void 0, void 0, function() { - return Ba - }, function(a, b, c) { - J(34); - Ba = !!c - }); - var ed = S("_j1", "jid") - , ia = S("_j2", "gjid"); - cb("\\&(.*)", function(a) { - var b = new bb(a[0],a[1]) - , c = yc(a[0].substring(1)); - c && (b.Z = function(d) { - return d.get(c) - } - , - b.o = function(d, e, g, ca) { - d.set(c, g, ca) - } - , - b.F = void 0); - return b - }); - var Qb = T("_oot") - , dd = S("previewTask") - , Rb = S("checkProtocolTask") - , md = S("validationTask") - , Sb = S("checkStorageTask") - , Uc = S("historyImportTask") - , Tb = S("samplerTask") - , Vb = S("_rlt") - , Wb = S("buildHitTask") - , Xb = S("sendHitTask") - , Vc = S("ceTask") - , zd = S("devIdTask") - , Cd = S("timingTask") - , Ld = S("displayFeaturesTask") - , oa = S("customTask") - , ze = S("fpsCrossDomainTask") - , V = T("name") - , Q = T("clientId", "cid") - , n = T("clientIdTime") - , xd = T("storedClientId") - , Ad = S("userId", "uid") - , Na = T("trackingId", "tid") - , U = T("cookieName", void 0, "_ga") - , W = T("cookieDomain") - , Yb = T("cookiePath", void 0, "/") - , Zb = T("cookieExpires", void 0, 63072E3) - , Hd = T("cookieUpdate", void 0, !0) - , Be = T("cookieFlags", void 0, "") - , $b = T("legacyCookieDomain") - , Wc = T("legacyHistoryImport", void 0, !0) - , ac = T("storage", void 0, "cookie") - , bc = T("allowLinker", void 0, !1) - , cc = T("allowAnchor", void 0, !0) - , Ka = T("sampleRate", "sf", 100) - , dc = T("siteSpeedSampleRate", void 0, 1) - , ec = T("alwaysSendReferrer", void 0, !1) - , I = T("_gid", "_gid") - , la = T("_gcn") - , Kd = T("useAmpClientId") - , ce = T("_gclid") - , fe = T("_gt") - , he = T("_ge", void 0, 7776E6) - , ie = T("_gclsrc") - , je = T("storeGac", void 0, !0) - , oe = S("_x_19") - , Ae = S("_fplc", "_fplc") - , gd = S("transportUrl") - , Md = S("_r", "_r") - , qe = S("_dp") - , ad = S("_jt", void 0, "n") - , Ud = S("allowAdFeatures", void 0, !0) - , xe = S("allowAdPersonalizationSignals", void 0, !0); - function X(a, b, c, d) { - b[a] = function() { - try { - return d && J(d), - c.apply(this, arguments) - } catch (e) { - throw ge("exc", a, e && e.name), - e; - } - } - } - ;var Od = function() { - this.V = 100; - this.$ = this.fa = !1; - this.oa = "detourexp"; - this.groups = 1 - } - , Ed = function(a) { - var b = new Od, c; - if (b.fa && b.$) - return 0; - b.$ = !0; - if (a) { - if (b.oa && void 0 !== a.get(b.oa)) - return R(a, b.oa); - if (0 == a.get(dc)) - return 0 - } - if (0 == b.V) - return 0; - void 0 === c && (c = Bd()); - return 0 == c % b.V ? Math.floor(c / b.V) % b.groups + 1 : 0 - }; - function fc() { - var a, b; - if ((b = (b = O.navigator) ? b.plugins : null) && b.length) - for (var c = 0; c < b.length && !a; c++) { - var d = b[c]; - -1 < d.name.indexOf("Shockwave Flash") && (a = d.description) - } - if (!a) - try { - var e = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); - a = e.GetVariable("$version") - } catch (g) {} - if (!a) - try { - e = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"), - a = "WIN 6,0,21,0", - e.AllowScriptAccess = "always", - a = e.GetVariable("$version") - } catch (g) {} - if (!a) - try { - e = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"), - a = e.GetVariable("$version") - } catch (g) {} - a && (e = a.match(/[\d]+/g)) && 3 <= e.length && (a = e[0] + "." + e[1] + " r" + e[2]); - return a || void 0 - } - ;var Ee = function() { - var a = Ca("FPLC"); - return 0 < a.length ? a[0] : void 0 - } - , Fe = function(a) { - P(a, oe) && a.get(Ze) && a.set(Ae, Ee() || "0") - }; - var aa = function(a) { - var b = Math.min(R(a, dc), 100); - return La(P(a, Q)) % 100 >= b ? !1 : !0 - } - , gc = function(a) { - var b = {}; - if (Ec(b) || Fc(b)) { - var c = b[Eb]; - void 0 == c || Infinity == c || isNaN(c) || (0 < c ? (Y(b, Gb), - Y(b, Jb), - Y(b, Ib), - Y(b, Fb), - Y(b, Hb), - Y(b, Kb), - Y(b, Lb), - Y(b, Ve), - Y(b, We), - Y(b, Xe), - Y(b, Ye), - va(function() { - a(b) - }, 10)) : L(O, "load", function() { - gc(a) - }, !1)) - } - } - , Ec = function(a) { - var b = O.performance || O.webkitPerformance; - b = b && b.timing; - if (!b) - return !1; - var c = b.navigationStart; - if (0 == c) - return !1; - a[Eb] = b.loadEventStart - c; - a[Gb] = b.domainLookupEnd - b.domainLookupStart; - a[Jb] = b.connectEnd - b.connectStart; - a[Ib] = b.responseStart - b.requestStart; - a[Fb] = b.responseEnd - b.responseStart; - a[Hb] = b.fetchStart - c; - a[Kb] = b.domInteractive - c; - a[Lb] = b.domContentLoadedEventStart - c; - a[Ve] = N.L - c; - a[We] = N.ya - c; - O.google_tag_manager && O.google_tag_manager._li && (b = O.google_tag_manager._li, - a[Xe] = b.cst, - a[Ye] = b.cbt); - return !0 - } - , Fc = function(a) { - if (O.top != O) - return !1; - var b = O.external - , c = b && b.onloadT; - b && !b.isValidLoadTime && (c = void 0); - 2147483648 < c && (c = void 0); - 0 < c && b.setPageReadyTime(); - if (void 0 == c) - return !1; - a[Eb] = c; - return !0 - } - , Y = function(a, b) { - var c = a[b]; - if (isNaN(c) || Infinity == c || 0 > c) - a[b] = void 0 - } - , Fd = function(a) { - return function(b) { - if ("pageview" == b.get(Va) && !a.I) { - a.I = !0; - var c = aa(b) - , d = 0 < E(P(b, kb), "gclid").length; - (c || d) && gc(function(e) { - c && a.send("timing", e); - d && a.send("adtiming", e) - }) - } - } - }; - var hc = !1 - , mc = function(a) { - if ("cookie" == P(a, ac)) { - if (a.get(Hd) || P(a, xd) != P(a, Q)) { - var b = 1E3 * R(a, Zb); - ma(a, Q, U, b); - a.data.set(xd, P(a, Q)) - } - (a.get(Hd) || uc(a) != P(a, I)) && ma(a, I, la, 864E5); - if (a.get(je)) { - var c = P(a, ce); - if (c) { - var d = Math.min(R(a, he), 1E3 * R(a, Zb)); - d = Math.min(d, 1E3 * R(a, fe) + d - (new Date).getTime()); - a.data.set(he, d); - b = {}; - var e = P(a, fe) - , g = P(a, ie) - , ca = kc(P(a, Yb)) - , l = lc(P(a, W)) - , k = P(a, Na) - , w = P(a, Be); - g && "aw.ds" != g ? b && (b.ua = !0) : (c = ["1", e, Cc(c)].join("."), - 0 < d && (b && (b.ta = !0), - zc("_gac_" + Cc(k), c, ca, l, k, d, w))); - le(b) - } - } else - J(75); - (a = P(a, Ae)) && zc("FPLC", a, "/", "none", "", void 0, "Secure") - } - } - , ma = function(a, b, c, d) { - var e = nd(a, b); - if (e) { - c = P(a, c); - var g = kc(P(a, Yb)) - , ca = lc(P(a, W)) - , l = P(a, Be) - , k = P(a, Na); - if ("auto" != ca) - zc(c, e, g, ca, k, d, l) && (hc = !0); - else { - J(32); - for (var w = id(), Ce = 0; Ce < w.length; Ce++) - if (ca = w[Ce], - a.data.set(W, ca), - e = nd(a, b), - zc(c, e, g, ca, k, d, l)) { - hc = !0; - return - } - a.data.set(W, "auto") - } - } - } - , uc = function(a) { - var b = Ca(P(a, la)); - return Xd(a, b) - } - , nc = function(a) { - if ("cookie" == P(a, ac) && !hc && (mc(a), - !hc)) - throw "abort"; - } - , Yc = function(a) { - if (a.get(Wc)) { - var b = P(a, W) - , c = P(a, $b) || xa() - , d = Xc("__utma", c, b); - d && (J(19), - a.set(Tc, (new Date).getTime(), !0), - a.set(Rc, d.R), - (b = Xc("__utmz", c, b)) && d.hash == b.hash && a.set(Sc, b.R)) - } - } - , nd = function(a, b) { - b = Cc(P(a, b)); - var c = lc(P(a, W)).split(".").length; - a = jc(P(a, Yb)); - 1 < a && (c += "-" + a); - return b ? ["GA1", c, b].join(".") : "" - } - , Xd = function(a, b) { - return na(b, P(a, W), P(a, Yb)) - } - , na = function(a, b, c) { - if (!a || 1 > a.length) - J(12); - else { - for (var d = [], e = 0; e < a.length; e++) { - var g = a[e]; - var ca = g.split("."); - var l = ca.shift(); - ("GA1" == l || "1" == l) && 1 < ca.length ? (g = ca.shift().split("-"), - 1 == g.length && (g[1] = "1"), - g[0] *= 1, - g[1] *= 1, - ca = { - H: g, - s: ca.join(".") - }) : ca = kd.test(g) ? { - H: [0, 0], - s: g - } : void 0; - ca && d.push(ca) - } - if (1 == d.length) - return J(13), - d[0].s; - if (0 == d.length) - J(12); - else { - J(14); - d = Gc(d, lc(b).split(".").length, 0); - if (1 == d.length) - return d[0].s; - d = Gc(d, jc(c), 1); - 1 < d.length && J(41); - return d[0] && d[0].s - } - } - } - , Gc = function(a, b, c) { - for (var d = [], e = [], g, ca = 0; ca < a.length; ca++) { - var l = a[ca]; - l.H[c] == b ? d.push(l) : void 0 == g || l.H[c] < g ? (e = [l], - g = l.H[c]) : l.H[c] == g && e.push(l) - } - return 0 < d.length ? d : e - } - , lc = function(a) { - return 0 == a.indexOf(".") ? a.substr(1) : a - } - , id = function() { - var a = [] - , b = xa().split("."); - if (4 == b.length) { - var c = b[b.length - 1]; - if (parseInt(c, 10) == c) - return ["none"] - } - for (c = b.length - 2; 0 <= c; c--) - a.push(b.slice(c).join(".")); - b = M.location.hostname; - eb.test(b) || vc.test(b) || a.push("none"); - return a - } - , kc = function(a) { - if (!a) - return "/"; - 1 < a.length && a.lastIndexOf("/") == a.length - 1 && (a = a.substr(0, a.length - 1)); - 0 != a.indexOf("/") && (a = "/" + a); - return a - } - , jc = function(a) { - a = kc(a); - return "/" == a ? 1 : a.split("/").length - } - , le = function(a) { - a.ta && J(77); - a.na && J(74); - a.pa && J(73); - a.ua && J(69) - }; - function Xc(a, b, c) { - "none" == b && (b = ""); - var d = [] - , e = Ca(a); - a = "__utma" == a ? 6 : 2; - for (var g = 0; g < e.length; g++) { - var ca = ("" + e[g]).split("."); - ca.length >= a && d.push({ - hash: ca[0], - R: e[g], - O: ca - }) - } - if (0 != d.length) - return 1 == d.length ? d[0] : Zc(b, d) || Zc(c, d) || Zc(null, d) || d[0] - } - function Zc(a, b) { - if (null == a) - var c = a = 1; - else - c = La(a), - a = La(D(a, ".") ? a.substring(1) : "." + a); - for (var d = 0; d < b.length; d++) - if (b[d].hash == c || b[d].hash == a) - return b[d] - } - ;var Jc = new RegExp(/^https?:\/\/([^\/:]+)/) - , De = O.google_tag_data.glBridge - , Kc = /(.*)([?&#])(?:_ga=[^&#]*)(?:&?)(.*)/ - , od = /(.*)([?&#])(?:_gac=[^&#]*)(?:&?)(.*)/; - function Bc(a) { - if (a.get(Ze)) - return J(35), - De.generate($e(a)); - var b = P(a, Q) - , c = P(a, I) || ""; - b = "_ga=2." + K(pa(c + b, 0) + "." + c + "-" + b); - (a = af(a)) ? (J(44), - a = "&_gac=1." + K([pa(a.qa, 0), a.timestamp, a.qa].join("."))) : a = ""; - return b + a - } - function Ic(a, b) { - var c = new Date - , d = O.navigator - , e = d.plugins || []; - a = [a, d.userAgent, c.getTimezoneOffset(), c.getYear(), c.getDate(), c.getHours(), c.getMinutes() + b]; - for (b = 0; b < e.length; ++b) - a.push(e[b].description); - return La(a.join(".")) - } - function pa(a, b) { - var c = new Date - , d = O.navigator - , e = c.getHours() + Math.floor((c.getMinutes() + b) / 60); - return La([a, d.userAgent, d.language || "", c.getTimezoneOffset(), c.getYear(), c.getDate() + Math.floor(e / 24), (24 + e) % 24, (60 + c.getMinutes() + b) % 60].join(".")) - } - var Dc = function(a) { - J(48); - this.target = a; - this.T = !1 - }; - Dc.prototype.ca = function(a, b) { - if (a) { - if (this.target.get(Ze)) - return De.decorate($e(this.target), a, b); - if (a.tagName) { - if ("a" == a.tagName.toLowerCase()) { - a.href && (a.href = qd(this, a.href, b)); - return - } - if ("form" == a.tagName.toLowerCase()) - return rd(this, a) - } - if ("string" == typeof a) - return qd(this, a, b) - } - } - ; - var qd = function(a, b, c) { - var d = Kc.exec(b); - d && 3 <= d.length && (b = d[1] + (d[3] ? d[2] + d[3] : "")); - (d = od.exec(b)) && 3 <= d.length && (b = d[1] + (d[3] ? d[2] + d[3] : "")); - a = a.target.get("linkerParam"); - var e = b.indexOf("?"); - d = b.indexOf("#"); - c ? b += (-1 == d ? "#" : "&") + a : (c = -1 == e ? "?" : "&", - b = -1 == d ? b + (c + a) : b.substring(0, d) + c + a + b.substring(d)); - b = b.replace(/&+_ga=/, "&_ga="); - return b = b.replace(/&+_gac=/, "&_gac=") - } - , rd = function(a, b) { - if (b && b.action) - if ("get" == b.method.toLowerCase()) { - a = a.target.get("linkerParam").split("&"); - for (var c = 0; c < a.length; c++) { - var d = a[c].split("=") - , e = d[1]; - d = d[0]; - for (var g = b.childNodes || [], ca = !1, l = 0; l < g.length; l++) - if (g[l].name == d) { - g[l].setAttribute("value", e); - ca = !0; - break - } - ca || (g = M.createElement("input"), - g.setAttribute("type", "hidden"), - g.setAttribute("name", d), - g.setAttribute("value", e), - b.appendChild(g)) - } - } else - "post" == b.method.toLowerCase() && (b.action = qd(a, b.action)) - }; - Dc.prototype.S = function(a, b, c) { - function d(g) { - try { - g = g || O.event; - a: { - var ca = g.target || g.srcElement; - for (g = 100; ca && 0 < g; ) { - if (ca.href && ca.nodeName.match(/^a(?:rea)?$/i)) { - var l = ca; - break a - } - ca = ca.parentNode; - g-- - } - l = {} - } - ("http:" == l.protocol || "https:" == l.protocol) && sd(a, l.hostname || "") && l.href && (l.href = qd(e, l.href, b)) - } catch (k) { - J(26) - } - } - var e = this; - this.target.get(Ze) ? De.auto(function() { - return $e(e.target) - }, a, b ? "fragment" : "", c) : (this.T || (this.T = !0, - L(M, "mousedown", d, !1), - L(M, "keyup", d, !1)), - c && L(M, "submit", function(g) { - g = g || O.event; - if ((g = g.target || g.srcElement) && g.action) { - var ca = g.action.match(Jc); - ca && sd(a, ca[1]) && rd(e, g) - } - })) - } - ; - function sd(a, b) { - if (b == M.location.hostname) - return !1; - for (var c = 0; c < a.length; c++) - if (a[c]instanceof RegExp) { - if (a[c].test(b)) - return !0 - } else if (0 <= b.indexOf(a[c])) - return !0; - return !1 - } - function ke(a, b) { - return b != Ic(a, 0) && b != Ic(a, -1) && b != Ic(a, -2) && b != pa(a, 0) && b != pa(a, -1) && b != pa(a, -2) - } - function $e(a) { - var b = af(a) - , c = {}; - return c._ga = a.get(Q), - c._gid = a.get(I) || void 0, - c._gac = b ? [b.qa, b.timestamp].join(".") : void 0, - c._fplc = Ee(), - c - } - function af(a) { - function b(e) { - return void 0 == e || "" === e ? 0 : Number(e) - } - var c = a.get(ce); - if (c && a.get(je)) { - var d = b(a.get(fe)); - if (1E3 * d + b(a.get(he)) <= (new Date).getTime()) - J(76); - else - return { - timestamp: d, - qa: c - } - } - } - ;var p = /^(GTM|OPT)-[A-Z0-9]+$/ - , q = /;_gaexp=[^;]*/g - , r = /;((__utma=)|([^;=]+=GAX?\d+\.))[^;]*/g - , Aa = /^https?:\/\/[\w\-.]+\.google.com(:\d+)?\/optimize\/opt-launch\.html\?.*$/ - , t = function(a) { - function b(d, e) { - e && (c += "&" + d + "=" + K(e)) - } - var c = "https://www.google-analytics.com/gtm/js?id=" + K(a.id); - "dataLayer" != a.B && b("l", a.B); - b("t", a.target); - b("cid", a.clientId); - b("cidt", a.ka); - b("gac", a.la); - b("aip", a.ia); - a.sync && b("m", "sync"); - b("cycle", a.G); - a.qa && b("gclid", a.qa); - Aa.test(M.referrer) && b("cb", String(hd())); - return c - }; - var Jd = function(a, b, c) { - this.aa = b; - (b = c) || (b = (b = P(a, V)) && "t0" != b ? Wd.test(b) ? "_gat_" + Cc(P(a, Na)) : "_gat_" + Cc(b) : "_gat"); - this.Y = b; - this.ra = null - } - , Rd = function(a, b) { - var c = b.get(Wb); - b.set(Wb, function(e) { - Pd(a, e, ed); - Pd(a, e, ia); - var g = c(e); - Qd(a, e); - return g - }); - var d = b.get(Xb); - b.set(Xb, function(e) { - var g = d(e); - if (se(e)) { - if (ne() !== H(a, e)) { - J(80); - var ca = { - U: re(a, e, 1), - google: re(a, e, 2), - count: 0 - }; - pe("https://stats.g.doubleclick.net/j/collect", ca.U, ca) - } else - ta(re(a, e, 0)); - e.set(ed, "", !0) - } - return g - }) - } - , Pd = function(a, b, c) { - !1 === b.get(Ud) || b.get(c) || ("1" == Ca(a.Y)[0] ? b.set(c, "", !0) : b.set(c, "" + hd(), !0)) - } - , Qd = function(a, b) { - se(b) && zc(a.Y, "1", P(b, Yb), P(b, W), P(b, Na), 6E4, P(b, Be)) - } - , se = function(a) { - return !!a.get(ed) && !1 !== a.get(Ud) - } - , re = function(a, b, c) { - var d = new ee - , e = function(ca) { - $a(ca).F && d.set($a(ca).F, b.get(ca)) - }; - e(hb); - e(ib); - e(Na); - e(Q); - e(ed); - if (0 == c || 1 == c) - e(Ad), - e(ia), - e(I); - d.set($a(ld).F, Td(b)); - var g = ""; - d.map(function(ca, l) { - g += K(ca) + "="; - g += K("" + l) + "&" - }); - g += "z=" + hd(); - 0 == c ? g = a.aa + g : 1 == c ? g = "t=dc&aip=1&_r=3&" + g : 2 == c && (g = "t=sr&aip=1&_r=4&slf_rd=1&" + g); - return g - } - , H = function(a, b) { - null === a.ra && (a.ra = 1 === Ed(b), - a.ra && J(33)); - return a.ra - } - , Wd = /^gtm\d+$/; - var fd = function(a, b) { - a = a.b; - if (!a.get("dcLoaded")) { - var c = new $c(Dd(a)); - c.set(29); - a.set(Gd, c.C); - b = b || {}; - var d; - b[U] && (d = Cc(b[U])); - b = new Jd(a,"https://stats.g.doubleclick.net/r/collect?t=dc&aip=1&_r=3&",d); - Rd(b, a); - a.set("dcLoaded", !0) - } - }; - var Sd = function(a) { - if (!a.get("dcLoaded") && "cookie" == a.get(ac)) { - var b = new Jd(a); - Pd(b, a, ed); - Pd(b, a, ia); - Qd(b, a); - if (se(a)) { - var c = ne() !== H(b, a); - a.set(Md, 1, !0); - c ? (J(79), - a.set(ad, "d", !0), - a.set(qe, { - U: re(b, a, 1), - google: re(b, a, 2), - count: 0 - }, !0)) : a.set(ad, "b", !0) - } - } - }; - var Lc = function() { - var a = O.gaGlobal = O.gaGlobal || {}; - return a.hid = a.hid || hd() - }; - var wb = /^(UA|YT|MO|GP)-(\d+)-(\d+)$/ - , pc = function(a) { - function b(e, g) { - d.b.data.set(e, g) - } - function c(e, g) { - b(e, g); - d.filters.add(e) - } - var d = this; - this.b = new Ya; - this.filters = new Ha; - b(V, a[V]); - b(Na, sa(a[Na])); - b(U, a[U]); - b(W, a[W] || xa()); - b(Yb, a[Yb]); - b(Zb, a[Zb]); - b(Hd, a[Hd]); - b(Be, a[Be]); - b($b, a[$b]); - b(Wc, a[Wc]); - b(bc, a[bc]); - b(cc, a[cc]); - b(Ka, a[Ka]); - b(dc, a[dc]); - b(ec, a[ec]); - b(ac, a[ac]); - b(Ad, a[Ad]); - b(n, a[n]); - b(Kd, a[Kd]); - b(je, a[je]); - b(Ze, a[Ze]); - b(oe, a[oe]); - b(hb, 1); - b(ib, "j83"); - c(Qb, Ma); - c(oa, ua); - c(dd, cd); - c(Rb, Oa); - c(md, vb); - c(Sb, nc); - c(Uc, Yc); - c(Tb, Ja); - c(Vb, Ta); - c(Vc, Hc); - c(zd, yd); - c(Ld, Sd); - c(ze, Fe); - c(Wb, Pa); - c(Xb, Sa); - c(Cd, Fd(this)); - pd(this.b); - td(this.b, a[Q]); - this.b.set(jb, Lc()) - } - , td = function(a, b) { - var c = P(a, U); - a.data.set(la, "_ga" == c ? "_gid" : c + "_gid"); - if ("cookie" == P(a, ac)) { - hc = !1; - c = Ca(P(a, U)); - c = Xd(a, c); - if (!c) { - c = P(a, W); - var d = P(a, $b) || xa(); - c = Xc("__utma", d, c); - void 0 != c ? (J(10), - c = c.O[1] + "." + c.O[2]) : c = void 0 - } - c && (hc = !0); - if (d = c && !a.get(Hd)) - if (d = c.split("."), - 2 != d.length) - d = !1; - else if (d = Number(d[1])) { - var e = R(a, Zb); - d = d + e < (new Date).getTime() / 1E3 - } else - d = !1; - d && (c = void 0); - c && (a.data.set(xd, c), - a.data.set(Q, c), - (c = uc(a)) && a.data.set(I, c)); - if (a.get(je) && (c = a.get(ce), - d = a.get(ie), - !c || d && "aw.ds" != d)) { - c = {}; - if (M) { - d = []; - e = M.cookie.split(";"); - for (var g = /^\s*_gac_(UA-\d+-\d+)=\s*(.+?)\s*$/, ca = 0; ca < e.length; ca++) { - var l = e[ca].match(g); - l && d.push({ - ja: l[1], - value: l[2] - }) - } - e = {}; - if (d && d.length) - for (g = 0; g < d.length; g++) - (ca = d[g].value.split("."), - "1" != ca[0] || 3 != ca.length) ? c && (c.na = !0) : ca[1] && (e[d[g].ja] ? c && (c.pa = !0) : e[d[g].ja] = [], - e[d[g].ja].push({ - timestamp: ca[1], - qa: ca[2] - })); - d = e - } else - d = {}; - d = d[P(a, Na)]; - le(c); - d && 0 != d.length && (c = d[0], - a.data.set(fe, c.timestamp), - a.data.set(ce, c.qa)) - } - } - if (a.get(Hd) && (c = be("_ga", !!a.get(cc)), - g = be("_gl", !!a.get(cc)), - d = De.get(a.get(cc)), - e = d._ga, - g && 0 < g.indexOf("_ga*") && !e && J(30), - g = d.gclid, - ca = d._gac, - c || e || g || ca)) - if (c && e && J(36), - a.get(bc) || ye(a.get(Kd))) { - e && (J(38), - a.data.set(Q, e), - d._gid && (J(51), - a.data.set(I, d._gid))); - g ? (J(82), - a.data.set(ce, g), - d.gclsrc && a.data.set(ie, d.gclsrc)) : ca && (e = ca.split(".")) && 2 === e.length && (J(37), - a.data.set(ce, e[0]), - a.data.set(fe, e[1])); - if (d = d._fplc) - J(83), - a.data.set(Ae, d); - if (c) - b: if (d = c.indexOf("."), - -1 == d) - J(22); - else { - e = c.substring(0, d); - g = c.substring(d + 1); - d = g.indexOf("."); - c = g.substring(0, d); - g = g.substring(d + 1); - if ("1" == e) { - if (d = g, - ke(d, c)) { - J(23); - break b - } - } else if ("2" == e) { - d = g.indexOf("-"); - e = ""; - 0 < d ? (e = g.substring(0, d), - d = g.substring(d + 1)) : d = g.substring(1); - if (ke(e + d, c)) { - J(53); - break b - } - e && (J(2), - a.data.set(I, e)) - } else { - J(22); - break b - } - J(11); - a.data.set(Q, d); - if (c = be("_gac", !!a.get(cc))) - c = c.split("."), - "1" != c[0] || 4 != c.length ? J(72) : ke(c[3], c[1]) ? J(71) : (a.data.set(ce, c[3]), - a.data.set(fe, c[2]), - J(70)) - } - } else - J(21); - b && (J(9), - a.data.set(Q, K(b))); - a.get(Q) || (b = (b = O.gaGlobal) && b.from_cookie && "cookie" !== P(a, ac) ? void 0 : (b = b && b.vid) && -1 !== b.search(jd) ? b : void 0, - b ? (J(17), - a.data.set(Q, b)) : (J(8), - a.data.set(Q, ra()))); - a.get(I) || (J(3), - a.data.set(I, ra())); - mc(a); - b = O.gaGlobal = O.gaGlobal || {}; - c = P(a, Q); - a = c === P(a, xd); - if (void 0 == b.vid || a && !b.from_cookie) - b.vid = c, - b.from_cookie = a - } - , pd = function(a) { - var b = O.navigator - , c = O.screen - , d = M.location; - a.set(lb, ya(!!a.get(ec), !!a.get(Kd))); - if (d) { - var e = d.pathname || ""; - "/" != e.charAt(0) && (J(31), - e = "/" + e); - a.set(kb, d.protocol + "//" + d.hostname + e + d.search) - } - c && a.set(qb, c.width + "x" + c.height); - c && a.set(pb, c.colorDepth + "-bit"); - c = M.documentElement; - var g = (e = M.body) && e.clientWidth && e.clientHeight - , ca = []; - c && c.clientWidth && c.clientHeight && ("CSS1Compat" === M.compatMode || !g) ? ca = [c.clientWidth, c.clientHeight] : g && (ca = [e.clientWidth, e.clientHeight]); - c = 0 >= ca[0] || 0 >= ca[1] ? "" : ca.join("x"); - a.set(rb, c); - a.set(tb, fc()); - a.set(ob, M.characterSet || M.charset); - a.set(sb, b && "function" === typeof b.javaEnabled && b.javaEnabled() || !1); - a.set(nb, (b && (b.language || b.browserLanguage) || "").toLowerCase()); - a.data.set(ce, be("gclid", !0)); - a.data.set(ie, be("gclsrc", !0)); - a.data.set(fe, Math.round((new Date).getTime() / 1E3)); - if (d && a.get(cc) && (b = M.location.hash)) { - b = b.split(/[?&#]+/); - d = []; - for (c = 0; c < b.length; ++c) - (D(b[c], "utm_id") || D(b[c], "utm_campaign") || D(b[c], "utm_source") || D(b[c], "utm_medium") || D(b[c], "utm_term") || D(b[c], "utm_content") || D(b[c], "gclid") || D(b[c], "dclid") || D(b[c], "gclsrc")) && d.push(b[c]); - 0 < d.length && (b = "#" + d.join("&"), - a.set(kb, a.get(kb) + b)) - } - }; - pc.prototype.get = function(a) { - return this.b.get(a) - } - ; - pc.prototype.set = function(a, b) { - this.b.set(a, b) - } - ; - var me = { - pageview: [mb], - event: [ub, xb, yb, zb], - social: [Bb, Cb, Db], - timing: [Mb, Nb, Pb, Ob] - }; - pc.prototype.send = function(a) { - if (!(1 > arguments.length)) { - if ("string" === typeof arguments[0]) { - var b = arguments[0]; - var c = [].slice.call(arguments, 1) - } else - b = arguments[0] && arguments[0][Va], - c = arguments; - b && (c = za(me[b] || [], c), - c[Va] = b, - this.b.set(c, void 0, !0), - this.filters.D(this.b), - this.b.data.m = {}) - } - } - ; - pc.prototype.ma = function(a, b) { - var c = this; - u(a, c, b) || (v(a, function() { - u(a, c, b) - }), - y(String(c.get(V)), a, void 0, b, !0)) - } - ; - var rc = function(a) { - if ("prerender" == M.visibilityState) - return !1; - a(); - return !0 - } - , z = function(a) { - if (!rc(a)) { - J(16); - var b = !1 - , c = function() { - if (!b && rc(a)) { - b = !0; - var d = c - , e = M; - e.removeEventListener ? e.removeEventListener("visibilitychange", d, !1) : e.detachEvent && e.detachEvent("onvisibilitychange", d) - } - }; - L(M, "visibilitychange", c) - } - }; - var te = /^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/ - , sc = function(a) { - if (ea(a[0])) - this.u = a[0]; - else { - var b = te.exec(a[0]); - null != b && 4 == b.length && (this.c = b[1] || "t0", - this.K = b[2] || "", - this.methodName = b[3], - this.a = [].slice.call(a, 1), - this.K || (this.A = "create" == this.methodName, - this.i = "require" == this.methodName, - this.g = "provide" == this.methodName, - this.ba = "remove" == this.methodName), - this.i && (3 <= this.a.length ? (this.X = this.a[1], - this.W = this.a[2]) : this.a[1] && (qa(this.a[1]) ? this.X = this.a[1] : this.W = this.a[1]))); - b = a[1]; - a = a[2]; - if (!this.methodName) - throw "abort"; - if (this.i && (!qa(b) || "" == b)) - throw "abort"; - if (this.g && (!qa(b) || "" == b || !ea(a))) - throw "abort"; - if (ud(this.c) || ud(this.K)) - throw "abort"; - if (this.g && "t0" != this.c) - throw "abort"; - } - }; - function ud(a) { - return 0 <= a.indexOf(".") || 0 <= a.indexOf(":") - } - ;var Yd, Zd, $d, A; - Yd = new ee; - $d = new ee; - A = new ee; - Zd = { - ec: 45, - ecommerce: 46, - linkid: 47 - }; - var u = function(a, b, c) { - b == N || b.get(V); - var d = Yd.get(a); - if (!ea(d)) - return !1; - b.plugins_ = b.plugins_ || new ee; - if (b.plugins_.get(a)) - return !0; - b.plugins_.set(a, new d(b,c || {})); - return !0 - } - , y = function(a, b, c, d, e) { - if (!ea(Yd.get(b)) && !$d.get(b)) { - Zd.hasOwnProperty(b) && J(Zd[b]); - a = N.j(a); - if (p.test(b)) { - J(52); - if (!a) - return !0; - c = d || {}; - d = { - id: b, - B: c.dataLayer || "dataLayer", - ia: !!a.get("anonymizeIp"), - sync: e, - G: !1 - }; - a.get(">m") == b && (d.G = !0); - var g = String(a.get("name")); - "t0" != g && (d.target = g); - G(String(a.get("trackingId"))) || (d.clientId = String(a.get(Q)), - d.ka = Number(a.get(n)), - c = c.palindrome ? r : q, - c = (c = M.cookie.replace(/^|(; +)/g, ";").match(c)) ? c.sort().join("").substring(1) : void 0, - d.la = c, - d.qa = E(a.b.get(kb) || "", "gclid")); - c = d.B; - g = (new Date).getTime(); - O[c] = O[c] || []; - g = { - "gtm.start": g - }; - e || (g.event = "gtm.js"); - O[c].push(g); - c = t(d) - } - !c && Zd.hasOwnProperty(b) ? (J(39), - c = b + ".js") : J(43); - if (c) { - if (a) { - var ca = a.get(oe); - qa(ca) || (ca = void 0) - } - c && 0 <= c.indexOf("/") || (c = (ca || bd(!1)) + "/plugins/ua/" + c); - ca = ae(c); - a = ca.protocol; - d = M.location.protocol; - if (("https:" == a || a == d || ("http:" != a ? 0 : "http:" == d)) && B(ca)) { - if (ca = ca.url) - a = (a = M.querySelector && M.querySelector("script[nonce]") || null) ? a.nonce || a.getAttribute && a.getAttribute("nonce") || "" : "", - e ? (e = "", - a && Nd.test(a) && (e = ' nonce="' + a + '"'), - f.test(ca) && M.write("\x3c/script>')) : (e = M.createElement("script"), - e.type = "text/javascript", - e.async = !0, - e.src = ca, - a && e.setAttribute("nonce", a), - ca = M.getElementsByTagName("script")[0], - ca.parentNode.insertBefore(e, ca)); - $d.set(b, !0) - } - } - } - } - , v = function(a, b) { - var c = A.get(a) || []; - c.push(b); - A.set(a, c) - } - , C = function(a, b) { - Yd.set(a, b); - b = A.get(a) || []; - for (var c = 0; c < b.length; c++) - b[c](); - A.set(a, []) - } - , B = function(a) { - var b = ae(M.location.href); - if (D(a.url, "https://www.google-analytics.com/gtm/js?id=")) - return !0; - if (a.query || 0 <= a.url.indexOf("?") || 0 <= a.path.indexOf("://")) - return !1; - if (a.host == b.host && a.port == b.port) - return !0; - b = "http:" == a.protocol ? 80 : 443; - return "www.google-analytics.com" == a.host && (a.port || b) == b && D(a.path, "/plugins/") ? !0 : !1 - } - , ae = function(a) { - function b(l) { - var k = l.hostname || "" - , w = 0 <= k.indexOf("]"); - k = k.split(w ? "]" : ":")[0].toLowerCase(); - w && (k += "]"); - w = (l.protocol || "").toLowerCase(); - w = 1 * l.port || ("http:" == w ? 80 : "https:" == w ? 443 : ""); - l = l.pathname || ""; - D(l, "/") || (l = "/" + l); - return [k, "" + w, l] - } - var c = M.createElement("a"); - c.href = M.location.href; - var d = (c.protocol || "").toLowerCase() - , e = b(c) - , g = c.search || "" - , ca = d + "//" + e[0] + (e[1] ? ":" + e[1] : ""); - D(a, "//") ? a = d + a : D(a, "/") ? a = ca + a : !a || D(a, "?") ? a = ca + e[2] + (a || g) : 0 > a.split("/")[0].indexOf(":") && (a = ca + e[2].substring(0, e[2].lastIndexOf("/")) + "/" + a); - c.href = a; - d = b(c); - return { - protocol: (c.protocol || "").toLowerCase(), - host: d[0], - port: d[1], - path: d[2], - query: c.search || "", - url: a || "" - } - }; - var Z = { - ga: function() { - Z.f = [] - } - }; - Z.ga(); - Z.D = function(a) { - var b = Z.J.apply(Z, arguments); - b = Z.f.concat(b); - for (Z.f = []; 0 < b.length && !Z.v(b[0]) && !(b.shift(), - 0 < Z.f.length); ) - ; - Z.f = Z.f.concat(b) - } - ; - Z.J = function(a) { - for (var b = [], c = 0; c < arguments.length; c++) - try { - var d = new sc(arguments[c]); - d.g ? C(d.a[0], d.a[1]) : (d.i && (d.ha = y(d.c, d.a[0], d.X, d.W)), - b.push(d)) - } catch (e) {} - return b - } - ; - Z.v = function(a) { - try { - if (a.u) - a.u.call(O, N.j("t0")); - else { - var b = a.c == gb ? N : N.j(a.c); - if (a.A) { - if ("t0" == a.c && (b = N.create.apply(N, a.a), - null === b)) - return !0 - } else if (a.ba) - N.remove(a.c); - else if (b) - if (a.i) { - if (a.ha && (a.ha = y(a.c, a.a[0], a.X, a.W)), - !u(a.a[0], b, a.W)) - return !0 - } else if (a.K) { - var c = a.methodName - , d = a.a - , e = b.plugins_.get(a.K); - e[c].apply(e, d) - } else - b[a.methodName].apply(b, a.a) - } - } catch (g) {} - } - ; - var N = function(a) { - J(1); - Z.D.apply(Z, [arguments]) - }; - N.h = {}; - N.P = []; - N.L = 0; - N.ya = 0; - N.answer = 42; - var we = [Na, W, V]; - N.create = function(a) { - var b = za(we, [].slice.call(arguments)); - b[V] || (b[V] = "t0"); - var c = "" + b[V]; - if (N.h[c]) - return N.h[c]; - if (da(b)) - return null; - b = new pc(b); - N.h[c] = b; - N.P.push(b); - c = qc().tracker_created; - if (ea(c)) - try { - c(b) - } catch (d) {} - return b - } - ; - N.remove = function(a) { - for (var b = 0; b < N.P.length; b++) - if (N.P[b].get(V) == a) { - N.P.splice(b, 1); - N.h[a] = null; - break - } - } - ; - N.j = function(a) { - return N.h[a] - } - ; - N.getAll = function() { - return N.P.slice(0) - } - ; - N.N = function() { - "ga" != gb && J(49); - var a = O[gb]; - if (!a || 42 != a.answer) { - N.L = a && a.l; - N.ya = 1 * new Date; - N.loaded = !0; - var b = O[gb] = N; - X("create", b, b.create); - X("remove", b, b.remove); - X("getByName", b, b.j, 5); - X("getAll", b, b.getAll, 6); - b = pc.prototype; - X("get", b, b.get, 7); - X("set", b, b.set, 4); - X("send", b, b.send); - X("requireSync", b, b.ma); - b = Ya.prototype; - X("get", b, b.get); - X("set", b, b.set); - if ("https:" != M.location.protocol && !Ba) { - a: { - b = M.getElementsByTagName("script"); - for (var c = 0; c < b.length && 100 > c; c++) { - var d = b[c].src; - if (d && 0 == d.indexOf(bd(!0) + "/analytics")) { - b = !0; - break a - } - } - b = !1 - } - b && (Ba = !0) - } - (O.gaplugins = O.gaplugins || {}).Linker = Dc; - b = Dc.prototype; - C("linker", Dc); - X("decorate", b, b.ca, 20); - X("autoLink", b, b.S, 25); - C("displayfeatures", fd); - C("adfeatures", fd); - a = a && a.q; - ka(a) ? Z.D.apply(N, a) : J(50) - } - } - ; - N.da = function() { - for (var a = N.getAll(), b = 0; b < a.length; b++) - a[b].get(V) - } - ; - var Ge = N.N - , He = O[gb]; - He && He.r ? Ge() : z(Ge); - z(function() { - Z.D(["provide", "render", ua]) - }); -} -)(window); - diff --git a/assets/js/clipboard.min.js b/assets/js/clipboard.min.js deleted file mode 100644 index 28650f3..0000000 --- a/assets/js/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.6 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return o={},r.m=n=[function(t,e){t.exports=function(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var o=this;function r(){o.off(t,r),e.apply(n,arguments)}return r._=e,this.on(t,r,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;o 0) { - var tokenMetadata = lunr.utils.clone(metadata) || {} - tokenMetadata["position"] = [sliceStart, sliceLength] - tokenMetadata["index"] = tokens.length - - tokens.push( - new lunr.Token ( - str.slice(sliceStart, sliceEnd), - tokenMetadata - ) - ) - } - - sliceStart = sliceEnd + 1 - } - - } - - return tokens -} - -/** - * The separator used to split a string into tokens. Override this property to change the behaviour of - * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens. - * - * @static - * @see lunr.tokenizer - */ -lunr.tokenizer.separator = /[\s\-]+/ -/*! - * lunr.Pipeline - * Copyright (C) 2019 Oliver Nightingale - */ - -/** - * lunr.Pipelines maintain an ordered list of functions to be applied to all - * tokens in documents entering the search index and queries being ran against - * the index. - * - * An instance of lunr.Index created with the lunr shortcut will contain a - * pipeline with a stop word filter and an English language stemmer. Extra - * functions can be added before or after either of these functions or these - * default functions can be removed. - * - * When run the pipeline will call each function in turn, passing a token, the - * index of that token in the original list of all tokens and finally a list of - * all the original tokens. - * - * The output of functions in the pipeline will be passed to the next function - * in the pipeline. To exclude a token from entering the index the function - * should return undefined, the rest of the pipeline will not be called with - * this token. - * - * For serialisation of pipelines to work, all functions used in an instance of - * a pipeline should be registered with lunr.Pipeline. Registered functions can - * then be loaded. If trying to load a serialised pipeline that uses functions - * that are not registered an error will be thrown. - * - * If not planning on serialising the pipeline then registering pipeline functions - * is not necessary. - * - * @constructor - */ -lunr.Pipeline = function () { - this._stack = [] -} - -lunr.Pipeline.registeredFunctions = Object.create(null) - -/** - * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token - * string as well as all known metadata. A pipeline function can mutate the token string - * or mutate (or add) metadata for a given token. - * - * A pipeline function can indicate that the passed token should be discarded by returning - * null, undefined or an empty string. This token will not be passed to any downstream pipeline - * functions and will not be added to the index. - * - * Multiple tokens can be returned by returning an array of tokens. Each token will be passed - * to any downstream pipeline functions and all will returned tokens will be added to the index. - * - * Any number of pipeline functions may be chained together using a lunr.Pipeline. - * - * @interface lunr.PipelineFunction - * @param {lunr.Token} token - A token from the document being processed. - * @param {number} i - The index of this token in the complete list of tokens for this document/field. - * @param {lunr.Token[]} tokens - All tokens for this document/field. - * @returns {(?lunr.Token|lunr.Token[])} - */ - -/** - * Register a function with the pipeline. - * - * Functions that are used in the pipeline should be registered if the pipeline - * needs to be serialised, or a serialised pipeline needs to be loaded. - * - * Registering a function does not add it to a pipeline, functions must still be - * added to instances of the pipeline for them to be used when running a pipeline. - * - * @param {lunr.PipelineFunction} fn - The function to check for. - * @param {String} label - The label to register this function with - */ -lunr.Pipeline.registerFunction = function (fn, label) { - if (label in this.registeredFunctions) { - lunr.utils.warn('Overwriting existing registered function: ' + label) - } - - fn.label = label - lunr.Pipeline.registeredFunctions[fn.label] = fn -} - -/** - * Warns if the function is not registered as a Pipeline function. - * - * @param {lunr.PipelineFunction} fn - The function to check for. - * @private - */ -lunr.Pipeline.warnIfFunctionNotRegistered = function (fn) { - var isRegistered = fn.label && (fn.label in this.registeredFunctions) - - if (!isRegistered) { - lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\n', fn) - } -} - -/** - * Loads a previously serialised pipeline. - * - * All functions to be loaded must already be registered with lunr.Pipeline. - * If any function from the serialised data has not been registered then an - * error will be thrown. - * - * @param {Object} serialised - The serialised pipeline to load. - * @returns {lunr.Pipeline} - */ -lunr.Pipeline.load = function (serialised) { - var pipeline = new lunr.Pipeline - - serialised.forEach(function (fnName) { - var fn = lunr.Pipeline.registeredFunctions[fnName] - - if (fn) { - pipeline.add(fn) - } else { - throw new Error('Cannot load unregistered function: ' + fnName) - } - }) - - return pipeline -} - -/** - * Adds new functions to the end of the pipeline. - * - * Logs a warning if the function has not been registered. - * - * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline. - */ -lunr.Pipeline.prototype.add = function () { - var fns = Array.prototype.slice.call(arguments) - - fns.forEach(function (fn) { - lunr.Pipeline.warnIfFunctionNotRegistered(fn) - this._stack.push(fn) - }, this) -} - -/** - * Adds a single function after a function that already exists in the - * pipeline. - * - * Logs a warning if the function has not been registered. - * - * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. - * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. - */ -lunr.Pipeline.prototype.after = function (existingFn, newFn) { - lunr.Pipeline.warnIfFunctionNotRegistered(newFn) - - var pos = this._stack.indexOf(existingFn) - if (pos == -1) { - throw new Error('Cannot find existingFn') - } - - pos = pos + 1 - this._stack.splice(pos, 0, newFn) -} - -/** - * Adds a single function before a function that already exists in the - * pipeline. - * - * Logs a warning if the function has not been registered. - * - * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. - * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. - */ -lunr.Pipeline.prototype.before = function (existingFn, newFn) { - lunr.Pipeline.warnIfFunctionNotRegistered(newFn) - - var pos = this._stack.indexOf(existingFn) - if (pos == -1) { - throw new Error('Cannot find existingFn') - } - - this._stack.splice(pos, 0, newFn) -} - -/** - * Removes a function from the pipeline. - * - * @param {lunr.PipelineFunction} fn The function to remove from the pipeline. - */ -lunr.Pipeline.prototype.remove = function (fn) { - var pos = this._stack.indexOf(fn) - if (pos == -1) { - return - } - - this._stack.splice(pos, 1) -} - -/** - * Runs the current list of functions that make up the pipeline against the - * passed tokens. - * - * @param {Array} tokens The tokens to run through the pipeline. - * @returns {Array} - */ -lunr.Pipeline.prototype.run = function (tokens) { - var stackLength = this._stack.length - - for (var i = 0; i < stackLength; i++) { - var fn = this._stack[i] - var memo = [] - - for (var j = 0; j < tokens.length; j++) { - var result = fn(tokens[j], j, tokens) - - if (result === null || result === void 0 || result === '') continue - - if (Array.isArray(result)) { - for (var k = 0; k < result.length; k++) { - memo.push(result[k]) - } - } else { - memo.push(result) - } - } - - tokens = memo - } - - return tokens -} - -/** - * Convenience method for passing a string through a pipeline and getting - * strings out. This method takes care of wrapping the passed string in a - * token and mapping the resulting tokens back to strings. - * - * @param {string} str - The string to pass through the pipeline. - * @param {?object} metadata - Optional metadata to associate with the token - * passed to the pipeline. - * @returns {string[]} - */ -lunr.Pipeline.prototype.runString = function (str, metadata) { - var token = new lunr.Token (str, metadata) - - return this.run([token]).map(function (t) { - return t.toString() - }) -} - -/** - * Resets the pipeline by removing any existing processors. - * - */ -lunr.Pipeline.prototype.reset = function () { - this._stack = [] -} - -/** - * Returns a representation of the pipeline ready for serialisation. - * - * Logs a warning if the function has not been registered. - * - * @returns {Array} - */ -lunr.Pipeline.prototype.toJSON = function () { - return this._stack.map(function (fn) { - lunr.Pipeline.warnIfFunctionNotRegistered(fn) - - return fn.label - }) -} -/*! - * lunr.Vector - * Copyright (C) 2019 Oliver Nightingale - */ - -/** - * A vector is used to construct the vector space of documents and queries. These - * vectors support operations to determine the similarity between two documents or - * a document and a query. - * - * Normally no parameters are required for initializing a vector, but in the case of - * loading a previously dumped vector the raw elements can be provided to the constructor. - * - * For performance reasons vectors are implemented with a flat array, where an elements - * index is immediately followed by its value. E.g. [index, value, index, value]. This - * allows the underlying array to be as sparse as possible and still offer decent - * performance when being used for vector calculations. - * - * @constructor - * @param {Number[]} [elements] - The flat list of element index and element value pairs. - */ -lunr.Vector = function (elements) { - this._magnitude = 0 - this.elements = elements || [] -} - - -/** - * Calculates the position within the vector to insert a given index. - * - * This is used internally by insert and upsert. If there are duplicate indexes then - * the position is returned as if the value for that index were to be updated, but it - * is the callers responsibility to check whether there is a duplicate at that index - * - * @param {Number} insertIdx - The index at which the element should be inserted. - * @returns {Number} - */ -lunr.Vector.prototype.positionForIndex = function (index) { - // For an empty vector the tuple can be inserted at the beginning - if (this.elements.length == 0) { - return 0 - } - - var start = 0, - end = this.elements.length / 2, - sliceLength = end - start, - pivotPoint = Math.floor(sliceLength / 2), - pivotIndex = this.elements[pivotPoint * 2] - - while (sliceLength > 1) { - if (pivotIndex < index) { - start = pivotPoint - } - - if (pivotIndex > index) { - end = pivotPoint - } - - if (pivotIndex == index) { - break - } - - sliceLength = end - start - pivotPoint = start + Math.floor(sliceLength / 2) - pivotIndex = this.elements[pivotPoint * 2] - } - - if (pivotIndex == index) { - return pivotPoint * 2 - } - - if (pivotIndex > index) { - return pivotPoint * 2 - } - - if (pivotIndex < index) { - return (pivotPoint + 1) * 2 - } -} - -/** - * Inserts an element at an index within the vector. - * - * Does not allow duplicates, will throw an error if there is already an entry - * for this index. - * - * @param {Number} insertIdx - The index at which the element should be inserted. - * @param {Number} val - The value to be inserted into the vector. - */ -lunr.Vector.prototype.insert = function (insertIdx, val) { - this.upsert(insertIdx, val, function () { - throw "duplicate index" - }) -} - -/** - * Inserts or updates an existing index within the vector. - * - * @param {Number} insertIdx - The index at which the element should be inserted. - * @param {Number} val - The value to be inserted into the vector. - * @param {function} fn - A function that is called for updates, the existing value and the - * requested value are passed as arguments - */ -lunr.Vector.prototype.upsert = function (insertIdx, val, fn) { - this._magnitude = 0 - var position = this.positionForIndex(insertIdx) - - if (this.elements[position] == insertIdx) { - this.elements[position + 1] = fn(this.elements[position + 1], val) - } else { - this.elements.splice(position, 0, insertIdx, val) - } -} - -/** - * Calculates the magnitude of this vector. - * - * @returns {Number} - */ -lunr.Vector.prototype.magnitude = function () { - if (this._magnitude) return this._magnitude - - var sumOfSquares = 0, - elementsLength = this.elements.length - - for (var i = 1; i < elementsLength; i += 2) { - var val = this.elements[i] - sumOfSquares += val * val - } - - return this._magnitude = Math.sqrt(sumOfSquares) -} - -/** - * Calculates the dot product of this vector and another vector. - * - * @param {lunr.Vector} otherVector - The vector to compute the dot product with. - * @returns {Number} - */ -lunr.Vector.prototype.dot = function (otherVector) { - var dotProduct = 0, - a = this.elements, b = otherVector.elements, - aLen = a.length, bLen = b.length, - aVal = 0, bVal = 0, - i = 0, j = 0 - - while (i < aLen && j < bLen) { - aVal = a[i], bVal = b[j] - if (aVal < bVal) { - i += 2 - } else if (aVal > bVal) { - j += 2 - } else if (aVal == bVal) { - dotProduct += a[i + 1] * b[j + 1] - i += 2 - j += 2 - } - } - - return dotProduct -} - -/** - * Calculates the similarity between this vector and another vector. - * - * @param {lunr.Vector} otherVector - The other vector to calculate the - * similarity with. - * @returns {Number} - */ -lunr.Vector.prototype.similarity = function (otherVector) { - return this.dot(otherVector) / this.magnitude() || 0 -} - -/** - * Converts the vector to an array of the elements within the vector. - * - * @returns {Number[]} - */ -lunr.Vector.prototype.toArray = function () { - var output = new Array (this.elements.length / 2) - - for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) { - output[j] = this.elements[i] - } - - return output -} - -/** - * A JSON serializable representation of the vector. - * - * @returns {Number[]} - */ -lunr.Vector.prototype.toJSON = function () { - return this.elements -} -/* eslint-disable */ -/*! - * lunr.stemmer - * Copyright (C) 2019 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - */ - -/** - * lunr.stemmer is an english language stemmer, this is a JavaScript - * implementation of the PorterStemmer taken from http://tartarus.org/~martin - * - * @static - * @implements {lunr.PipelineFunction} - * @param {lunr.Token} token - The string to stem - * @returns {lunr.Token} - * @see {@link lunr.Pipeline} - * @function - */ -lunr.stemmer = (function(){ - var step2list = { - "ational" : "ate", - "tional" : "tion", - "enci" : "ence", - "anci" : "ance", - "izer" : "ize", - "bli" : "ble", - "alli" : "al", - "entli" : "ent", - "eli" : "e", - "ousli" : "ous", - "ization" : "ize", - "ation" : "ate", - "ator" : "ate", - "alism" : "al", - "iveness" : "ive", - "fulness" : "ful", - "ousness" : "ous", - "aliti" : "al", - "iviti" : "ive", - "biliti" : "ble", - "logi" : "log" - }, - - step3list = { - "icate" : "ic", - "ative" : "", - "alize" : "al", - "iciti" : "ic", - "ical" : "ic", - "ful" : "", - "ness" : "" - }, - - c = "[^aeiou]", // consonant - v = "[aeiouy]", // vowel - C = c + "[^aeiouy]*", // consonant sequence - V = v + "[aeiou]*", // vowel sequence - - mgr0 = "^(" + C + ")?" + V + C, // [C]VC... is m>0 - meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$", // [C]VC[V] is m=1 - mgr1 = "^(" + C + ")?" + V + C + V + C, // [C]VCVC... is m>1 - s_v = "^(" + C + ")?" + v; // vowel in stem - - var re_mgr0 = new RegExp(mgr0); - var re_mgr1 = new RegExp(mgr1); - var re_meq1 = new RegExp(meq1); - var re_s_v = new RegExp(s_v); - - var re_1a = /^(.+?)(ss|i)es$/; - var re2_1a = /^(.+?)([^s])s$/; - var re_1b = /^(.+?)eed$/; - var re2_1b = /^(.+?)(ed|ing)$/; - var re_1b_2 = /.$/; - var re2_1b_2 = /(at|bl|iz)$/; - var re3_1b_2 = new RegExp("([^aeiouylsz])\\1$"); - var re4_1b_2 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - - var re_1c = /^(.+?[^aeiou])y$/; - var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; - - var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; - - var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; - var re2_4 = /^(.+?)(s|t)(ion)$/; - - var re_5 = /^(.+?)e$/; - var re_5_1 = /ll$/; - var re3_5 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - - var porterStemmer = function porterStemmer(w) { - var stem, - suffix, - firstch, - re, - re2, - re3, - re4; - - if (w.length < 3) { return w; } - - firstch = w.substr(0,1); - if (firstch == "y") { - w = firstch.toUpperCase() + w.substr(1); - } - - // Step 1a - re = re_1a - re2 = re2_1a; - - if (re.test(w)) { w = w.replace(re,"$1$2"); } - else if (re2.test(w)) { w = w.replace(re2,"$1$2"); } - - // Step 1b - re = re_1b; - re2 = re2_1b; - if (re.test(w)) { - var fp = re.exec(w); - re = re_mgr0; - if (re.test(fp[1])) { - re = re_1b_2; - w = w.replace(re,""); - } - } else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1]; - re2 = re_s_v; - if (re2.test(stem)) { - w = stem; - re2 = re2_1b_2; - re3 = re3_1b_2; - re4 = re4_1b_2; - if (re2.test(w)) { w = w + "e"; } - else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,""); } - else if (re4.test(w)) { w = w + "e"; } - } - } - - // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say) - re = re_1c; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - w = stem + "i"; - } - - // Step 2 - re = re_2; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = re_mgr0; - if (re.test(stem)) { - w = stem + step2list[suffix]; - } - } - - // Step 3 - re = re_3; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = re_mgr0; - if (re.test(stem)) { - w = stem + step3list[suffix]; - } - } - - // Step 4 - re = re_4; - re2 = re2_4; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = re_mgr1; - if (re.test(stem)) { - w = stem; - } - } else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1] + fp[2]; - re2 = re_mgr1; - if (re2.test(stem)) { - w = stem; - } - } - - // Step 5 - re = re_5; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = re_mgr1; - re2 = re_meq1; - re3 = re3_5; - if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) { - w = stem; - } - } - - re = re_5_1; - re2 = re_mgr1; - if (re.test(w) && re2.test(w)) { - re = re_1b_2; - w = w.replace(re,""); - } - - // and turn initial Y back to y - - if (firstch == "y") { - w = firstch.toLowerCase() + w.substr(1); - } - - return w; - }; - - return function (token) { - return token.update(porterStemmer); - } -})(); - -lunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer') -/*! - * lunr.stopWordFilter - * Copyright (C) 2019 Oliver Nightingale - */ - -/** - * lunr.generateStopWordFilter builds a stopWordFilter function from the provided - * list of stop words. - * - * The built in lunr.stopWordFilter is built using this generator and can be used - * to generate custom stopWordFilters for applications or non English languages. - * - * @function - * @param {Array} token The token to pass through the filter - * @returns {lunr.PipelineFunction} - * @see lunr.Pipeline - * @see lunr.stopWordFilter - */ -lunr.generateStopWordFilter = function (stopWords) { - var words = stopWords.reduce(function (memo, stopWord) { - memo[stopWord] = stopWord - return memo - }, {}) - - return function (token) { - if (token && words[token.toString()] !== token.toString()) return token - } -} - -/** - * lunr.stopWordFilter is an English language stop word list filter, any words - * contained in the list will not be passed through the filter. - * - * This is intended to be used in the Pipeline. If the token does not pass the - * filter then undefined will be returned. - * - * @function - * @implements {lunr.PipelineFunction} - * @params {lunr.Token} token - A token to check for being a stop word. - * @returns {lunr.Token} - * @see {@link lunr.Pipeline} - */ -lunr.stopWordFilter = lunr.generateStopWordFilter([ - 'a', - 'able', - 'about', - 'across', - 'after', - 'all', - 'almost', - 'also', - 'am', - 'among', - 'an', - 'and', - 'any', - 'are', - 'as', - 'at', - 'be', - 'because', - 'been', - 'but', - 'by', - 'can', - 'cannot', - 'could', - 'dear', - 'did', - 'do', - 'does', - 'either', - 'else', - 'ever', - 'every', - 'for', - 'from', - 'get', - 'got', - 'had', - 'has', - 'have', - 'he', - 'her', - 'hers', - 'him', - 'his', - 'how', - 'however', - 'i', - 'if', - 'in', - 'into', - 'is', - 'it', - 'its', - 'just', - 'least', - 'let', - 'like', - 'likely', - 'may', - 'me', - 'might', - 'most', - 'must', - 'my', - 'neither', - 'no', - 'nor', - 'not', - 'of', - 'off', - 'often', - 'on', - 'only', - 'or', - 'other', - 'our', - 'own', - 'rather', - 'said', - 'say', - 'says', - 'she', - 'should', - 'since', - 'so', - 'some', - 'than', - 'that', - 'the', - 'their', - 'them', - 'then', - 'there', - 'these', - 'they', - 'this', - 'tis', - 'to', - 'too', - 'twas', - 'us', - 'wants', - 'was', - 'we', - 'were', - 'what', - 'when', - 'where', - 'which', - 'while', - 'who', - 'whom', - 'why', - 'will', - 'with', - 'would', - 'yet', - 'you', - 'your' -]) - -lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter') -/*! - * lunr.trimmer - * Copyright (C) 2019 Oliver Nightingale - */ - -/** - * lunr.trimmer is a pipeline function for trimming non word - * characters from the beginning and end of tokens before they - * enter the index. - * - * This implementation may not work correctly for non latin - * characters and should either be removed or adapted for use - * with languages with non-latin characters. - * - * @static - * @implements {lunr.PipelineFunction} - * @param {lunr.Token} token The token to pass through the filter - * @returns {lunr.Token} - * @see lunr.Pipeline - */ -lunr.trimmer = function (token) { - return token.update(function (s) { - return s.replace(/^\W+/, '').replace(/\W+$/, '') - }) -} - -lunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer') -/*! - * lunr.TokenSet - * Copyright (C) 2019 Oliver Nightingale - */ - -/** - * A token set is used to store the unique list of all tokens - * within an index. Token sets are also used to represent an - * incoming query to the index, this query token set and index - * token set are then intersected to find which tokens to look - * up in the inverted index. - * - * A token set can hold multiple tokens, as in the case of the - * index token set, or it can hold a single token as in the - * case of a simple query token set. - * - * Additionally token sets are used to perform wildcard matching. - * Leading, contained and trailing wildcards are supported, and - * from this edit distance matching can also be provided. - * - * Token sets are implemented as a minimal finite state automata, - * where both common prefixes and suffixes are shared between tokens. - * This helps to reduce the space used for storing the token set. - * - * @constructor - */ -lunr.TokenSet = function () { - this.final = false - this.edges = {} - this.id = lunr.TokenSet._nextId - lunr.TokenSet._nextId += 1 -} - -/** - * Keeps track of the next, auto increment, identifier to assign - * to a new tokenSet. - * - * TokenSets require a unique identifier to be correctly minimised. - * - * @private - */ -lunr.TokenSet._nextId = 1 - -/** - * Creates a TokenSet instance from the given sorted array of words. - * - * @param {String[]} arr - A sorted array of strings to create the set from. - * @returns {lunr.TokenSet} - * @throws Will throw an error if the input array is not sorted. - */ -lunr.TokenSet.fromArray = function (arr) { - var builder = new lunr.TokenSet.Builder - - for (var i = 0, len = arr.length; i < len; i++) { - builder.insert(arr[i]) - } - - builder.finish() - return builder.root -} - -/** - * Creates a token set from a query clause. - * - * @private - * @param {Object} clause - A single clause from lunr.Query. - * @param {string} clause.term - The query clause term. - * @param {number} [clause.editDistance] - The optional edit distance for the term. - * @returns {lunr.TokenSet} - */ -lunr.TokenSet.fromClause = function (clause) { - if ('editDistance' in clause) { - return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance) - } else { - return lunr.TokenSet.fromString(clause.term) - } -} - -/** - * Creates a token set representing a single string with a specified - * edit distance. - * - * Insertions, deletions, substitutions and transpositions are each - * treated as an edit distance of 1. - * - * Increasing the allowed edit distance will have a dramatic impact - * on the performance of both creating and intersecting these TokenSets. - * It is advised to keep the edit distance less than 3. - * - * @param {string} str - The string to create the token set from. - * @param {number} editDistance - The allowed edit distance to match. - * @returns {lunr.Vector} - */ -lunr.TokenSet.fromFuzzyString = function (str, editDistance) { - var root = new lunr.TokenSet - - var stack = [{ - node: root, - editsRemaining: editDistance, - str: str - }] - - while (stack.length) { - var frame = stack.pop() - - // no edit - if (frame.str.length > 0) { - var char = frame.str.charAt(0), - noEditNode - - if (char in frame.node.edges) { - noEditNode = frame.node.edges[char] - } else { - noEditNode = new lunr.TokenSet - frame.node.edges[char] = noEditNode - } - - if (frame.str.length == 1) { - noEditNode.final = true - } - - stack.push({ - node: noEditNode, - editsRemaining: frame.editsRemaining, - str: frame.str.slice(1) - }) - } - - if (frame.editsRemaining == 0) { - continue - } - - // insertion - if ("*" in frame.node.edges) { - var insertionNode = frame.node.edges["*"] - } else { - var insertionNode = new lunr.TokenSet - frame.node.edges["*"] = insertionNode - } - - if (frame.str.length == 0) { - insertionNode.final = true - } - - stack.push({ - node: insertionNode, - editsRemaining: frame.editsRemaining - 1, - str: frame.str - }) - - // deletion - // can only do a deletion if we have enough edits remaining - // and if there are characters left to delete in the string - if (frame.str.length > 1) { - stack.push({ - node: frame.node, - editsRemaining: frame.editsRemaining - 1, - str: frame.str.slice(1) - }) - } - - // deletion - // just removing the last character from the str - if (frame.str.length == 1) { - frame.node.final = true - } - - // substitution - // can only do a substitution if we have enough edits remaining - // and if there are characters left to substitute - if (frame.str.length >= 1) { - if ("*" in frame.node.edges) { - var substitutionNode = frame.node.edges["*"] - } else { - var substitutionNode = new lunr.TokenSet - frame.node.edges["*"] = substitutionNode - } - - if (frame.str.length == 1) { - substitutionNode.final = true - } - - stack.push({ - node: substitutionNode, - editsRemaining: frame.editsRemaining - 1, - str: frame.str.slice(1) - }) - } - - // transposition - // can only do a transposition if there are edits remaining - // and there are enough characters to transpose - if (frame.str.length > 1) { - var charA = frame.str.charAt(0), - charB = frame.str.charAt(1), - transposeNode - - if (charB in frame.node.edges) { - transposeNode = frame.node.edges[charB] - } else { - transposeNode = new lunr.TokenSet - frame.node.edges[charB] = transposeNode - } - - if (frame.str.length == 1) { - transposeNode.final = true - } - - stack.push({ - node: transposeNode, - editsRemaining: frame.editsRemaining - 1, - str: charA + frame.str.slice(2) - }) - } - } - - return root -} - -/** - * Creates a TokenSet from a string. - * - * The string may contain one or more wildcard characters (*) - * that will allow wildcard matching when intersecting with - * another TokenSet. - * - * @param {string} str - The string to create a TokenSet from. - * @returns {lunr.TokenSet} - */ -lunr.TokenSet.fromString = function (str) { - var node = new lunr.TokenSet, - root = node - - /* - * Iterates through all characters within the passed string - * appending a node for each character. - * - * When a wildcard character is found then a self - * referencing edge is introduced to continually match - * any number of any characters. - */ - for (var i = 0, len = str.length; i < len; i++) { - var char = str[i], - final = (i == len - 1) - - if (char == "*") { - node.edges[char] = node - node.final = final - - } else { - var next = new lunr.TokenSet - next.final = final - - node.edges[char] = next - node = next - } - } - - return root -} - -/** - * Converts this TokenSet into an array of strings - * contained within the TokenSet. - * - * This is not intended to be used on a TokenSet that - * contains wildcards, in these cases the results are - * undefined and are likely to cause an infinite loop. - * - * @returns {string[]} - */ -lunr.TokenSet.prototype.toArray = function () { - var words = [] - - var stack = [{ - prefix: "", - node: this - }] - - while (stack.length) { - var frame = stack.pop(), - edges = Object.keys(frame.node.edges), - len = edges.length - - if (frame.node.final) { - /* In Safari, at this point the prefix is sometimes corrupted, see: - * https://github.com/olivernn/lunr.js/issues/279 Calling any - * String.prototype method forces Safari to "cast" this string to what - * it's supposed to be, fixing the bug. */ - frame.prefix.charAt(0) - words.push(frame.prefix) - } - - for (var i = 0; i < len; i++) { - var edge = edges[i] - - stack.push({ - prefix: frame.prefix.concat(edge), - node: frame.node.edges[edge] - }) - } - } - - return words -} - -/** - * Generates a string representation of a TokenSet. - * - * This is intended to allow TokenSets to be used as keys - * in objects, largely to aid the construction and minimisation - * of a TokenSet. As such it is not designed to be a human - * friendly representation of the TokenSet. - * - * @returns {string} - */ -lunr.TokenSet.prototype.toString = function () { - // NOTE: Using Object.keys here as this.edges is very likely - // to enter 'hash-mode' with many keys being added - // - // avoiding a for-in loop here as it leads to the function - // being de-optimised (at least in V8). From some simple - // benchmarks the performance is comparable, but allowing - // V8 to optimize may mean easy performance wins in the future. - - if (this._str) { - return this._str - } - - var str = this.final ? '1' : '0', - labels = Object.keys(this.edges).sort(), - len = labels.length - - for (var i = 0; i < len; i++) { - var label = labels[i], - node = this.edges[label] - - str = str + label + node.id - } - - return str -} - -/** - * Returns a new TokenSet that is the intersection of - * this TokenSet and the passed TokenSet. - * - * This intersection will take into account any wildcards - * contained within the TokenSet. - * - * @param {lunr.TokenSet} b - An other TokenSet to intersect with. - * @returns {lunr.TokenSet} - */ -lunr.TokenSet.prototype.intersect = function (b) { - var output = new lunr.TokenSet, - frame = undefined - - var stack = [{ - qNode: b, - output: output, - node: this - }] - - while (stack.length) { - frame = stack.pop() - - // NOTE: As with the #toString method, we are using - // Object.keys and a for loop instead of a for-in loop - // as both of these objects enter 'hash' mode, causing - // the function to be de-optimised in V8 - var qEdges = Object.keys(frame.qNode.edges), - qLen = qEdges.length, - nEdges = Object.keys(frame.node.edges), - nLen = nEdges.length - - for (var q = 0; q < qLen; q++) { - var qEdge = qEdges[q] - - for (var n = 0; n < nLen; n++) { - var nEdge = nEdges[n] - - if (nEdge == qEdge || qEdge == '*') { - var node = frame.node.edges[nEdge], - qNode = frame.qNode.edges[qEdge], - final = node.final && qNode.final, - next = undefined - - if (nEdge in frame.output.edges) { - // an edge already exists for this character - // no need to create a new node, just set the finality - // bit unless this node is already final - next = frame.output.edges[nEdge] - next.final = next.final || final - - } else { - // no edge exists yet, must create one - // set the finality bit and insert it - // into the output - next = new lunr.TokenSet - next.final = final - frame.output.edges[nEdge] = next - } - - stack.push({ - qNode: qNode, - output: next, - node: node - }) - } - } - } - } - - return output -} -lunr.TokenSet.Builder = function () { - this.previousWord = "" - this.root = new lunr.TokenSet - this.uncheckedNodes = [] - this.minimizedNodes = {} -} - -lunr.TokenSet.Builder.prototype.insert = function (word) { - var node, - commonPrefix = 0 - - if (word < this.previousWord) { - throw new Error ("Out of order word insertion") - } - - for (var i = 0; i < word.length && i < this.previousWord.length; i++) { - if (word[i] != this.previousWord[i]) break - commonPrefix++ - } - - this.minimize(commonPrefix) - - if (this.uncheckedNodes.length == 0) { - node = this.root - } else { - node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child - } - - for (var i = commonPrefix; i < word.length; i++) { - var nextNode = new lunr.TokenSet, - char = word[i] - - node.edges[char] = nextNode - - this.uncheckedNodes.push({ - parent: node, - char: char, - child: nextNode - }) - - node = nextNode - } - - node.final = true - this.previousWord = word -} - -lunr.TokenSet.Builder.prototype.finish = function () { - this.minimize(0) -} - -lunr.TokenSet.Builder.prototype.minimize = function (downTo) { - for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) { - var node = this.uncheckedNodes[i], - childKey = node.child.toString() - - if (childKey in this.minimizedNodes) { - node.parent.edges[node.char] = this.minimizedNodes[childKey] - } else { - // Cache the key for this node since - // we know it can't change anymore - node.child._str = childKey - - this.minimizedNodes[childKey] = node.child - } - - this.uncheckedNodes.pop() - } -} -/*! - * lunr.Index - * Copyright (C) 2019 Oliver Nightingale - */ - -/** - * An index contains the built index of all documents and provides a query interface - * to the index. - * - * Usually instances of lunr.Index will not be created using this constructor, instead - * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be - * used to load previously built and serialized indexes. - * - * @constructor - * @param {Object} attrs - The attributes of the built search index. - * @param {Object} attrs.invertedIndex - An index of term/field to document reference. - * @param {Object} attrs.fieldVectors - Field vectors - * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens. - * @param {string[]} attrs.fields - The names of indexed document fields. - * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms. - */ -lunr.Index = function (attrs) { - this.invertedIndex = attrs.invertedIndex - this.fieldVectors = attrs.fieldVectors - this.tokenSet = attrs.tokenSet - this.fields = attrs.fields - this.pipeline = attrs.pipeline -} - -/** - * A result contains details of a document matching a search query. - * @typedef {Object} lunr.Index~Result - * @property {string} ref - The reference of the document this result represents. - * @property {number} score - A number between 0 and 1 representing how similar this document is to the query. - * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match. - */ - -/** - * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple - * query language which itself is parsed into an instance of lunr.Query. - * - * For programmatically building queries it is advised to directly use lunr.Query, the query language - * is best used for human entered text rather than program generated text. - * - * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported - * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello' - * or 'world', though those that contain both will rank higher in the results. - * - * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can - * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding - * wildcards will increase the number of documents that will be found but can also have a negative - * impact on query performance, especially with wildcards at the beginning of a term. - * - * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term - * hello in the title field will match this query. Using a field not present in the index will lead - * to an error being thrown. - * - * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term - * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported - * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2. - * Avoid large values for edit distance to improve query performance. - * - * Each term also supports a presence modifier. By default a term's presence in document is optional, however - * this can be changed to either required or prohibited. For a term's presence to be required in a document the - * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and - * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not - * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'. - * - * To escape special characters the backslash character '\' can be used, this allows searches to include - * characters that would normally be considered modifiers, e.g. `foo\~2` will search for a term "foo~2" instead - * of attempting to apply a boost of 2 to the search term "foo". - * - * @typedef {string} lunr.Index~QueryString - * @example Simple single term query - * hello - * @example Multiple term query - * hello world - * @example term scoped to a field - * title:hello - * @example term with a boost of 10 - * hello^10 - * @example term with an edit distance of 2 - * hello~2 - * @example terms with presence modifiers - * -foo +bar baz - */ - -/** - * Performs a search against the index using lunr query syntax. - * - * Results will be returned sorted by their score, the most relevant results - * will be returned first. For details on how the score is calculated, please see - * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}. - * - * For more programmatic querying use lunr.Index#query. - * - * @param {lunr.Index~QueryString} queryString - A string containing a lunr query. - * @throws {lunr.QueryParseError} If the passed query string cannot be parsed. - * @returns {lunr.Index~Result[]} - */ -lunr.Index.prototype.search = function (queryString) { - return this.query(function (query) { - var parser = new lunr.QueryParser(queryString, query) - parser.parse() - }) -} - -/** - * A query builder callback provides a query object to be used to express - * the query to perform on the index. - * - * @callback lunr.Index~queryBuilder - * @param {lunr.Query} query - The query object to build up. - * @this lunr.Query - */ - -/** - * Performs a query against the index using the yielded lunr.Query object. - * - * If performing programmatic queries against the index, this method is preferred - * over lunr.Index#search so as to avoid the additional query parsing overhead. - * - * A query object is yielded to the supplied function which should be used to - * express the query to be run against the index. - * - * Note that although this function takes a callback parameter it is _not_ an - * asynchronous operation, the callback is just yielded a query object to be - * customized. - * - * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query. - * @returns {lunr.Index~Result[]} - */ -lunr.Index.prototype.query = function (fn) { - // for each query clause - // * process terms - // * expand terms from token set - // * find matching documents and metadata - // * get document vectors - // * score documents - - var query = new lunr.Query(this.fields), - matchingFields = Object.create(null), - queryVectors = Object.create(null), - termFieldCache = Object.create(null), - requiredMatches = Object.create(null), - prohibitedMatches = Object.create(null) - - /* - * To support field level boosts a query vector is created per - * field. An empty vector is eagerly created to support negated - * queries. - */ - for (var i = 0; i < this.fields.length; i++) { - queryVectors[this.fields[i]] = new lunr.Vector - } - - fn.call(query, query) - - for (var i = 0; i < query.clauses.length; i++) { - /* - * Unless the pipeline has been disabled for this term, which is - * the case for terms with wildcards, we need to pass the clause - * term through the search pipeline. A pipeline returns an array - * of processed terms. Pipeline functions may expand the passed - * term, which means we may end up performing multiple index lookups - * for a single query term. - */ - var clause = query.clauses[i], - terms = null, - clauseMatches = lunr.Set.complete - - if (clause.usePipeline) { - terms = this.pipeline.runString(clause.term, { - fields: clause.fields - }) - } else { - terms = [clause.term] - } - - for (var m = 0; m < terms.length; m++) { - var term = terms[m] - - /* - * Each term returned from the pipeline needs to use the same query - * clause object, e.g. the same boost and or edit distance. The - * simplest way to do this is to re-use the clause object but mutate - * its term property. - */ - clause.term = term - - /* - * From the term in the clause we create a token set which will then - * be used to intersect the indexes token set to get a list of terms - * to lookup in the inverted index - */ - var termTokenSet = lunr.TokenSet.fromClause(clause), - expandedTerms = this.tokenSet.intersect(termTokenSet).toArray() - - /* - * If a term marked as required does not exist in the tokenSet it is - * impossible for the search to return any matches. We set all the field - * scoped required matches set to empty and stop examining any further - * clauses. - */ - if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) { - for (var k = 0; k < clause.fields.length; k++) { - var field = clause.fields[k] - requiredMatches[field] = lunr.Set.empty - } - - break - } - - for (var j = 0; j < expandedTerms.length; j++) { - /* - * For each term get the posting and termIndex, this is required for - * building the query vector. - */ - var expandedTerm = expandedTerms[j], - posting = this.invertedIndex[expandedTerm], - termIndex = posting._index - - for (var k = 0; k < clause.fields.length; k++) { - /* - * For each field that this query term is scoped by (by default - * all fields are in scope) we need to get all the document refs - * that have this term in that field. - * - * The posting is the entry in the invertedIndex for the matching - * term from above. - */ - var field = clause.fields[k], - fieldPosting = posting[field], - matchingDocumentRefs = Object.keys(fieldPosting), - termField = expandedTerm + "/" + field, - matchingDocumentsSet = new lunr.Set(matchingDocumentRefs) - - /* - * if the presence of this term is required ensure that the matching - * documents are added to the set of required matches for this clause. - * - */ - if (clause.presence == lunr.Query.presence.REQUIRED) { - clauseMatches = clauseMatches.union(matchingDocumentsSet) - - if (requiredMatches[field] === undefined) { - requiredMatches[field] = lunr.Set.complete - } - } - - /* - * if the presence of this term is prohibited ensure that the matching - * documents are added to the set of prohibited matches for this field, - * creating that set if it does not yet exist. - */ - if (clause.presence == lunr.Query.presence.PROHIBITED) { - if (prohibitedMatches[field] === undefined) { - prohibitedMatches[field] = lunr.Set.empty - } - - prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet) - - /* - * Prohibited matches should not be part of the query vector used for - * similarity scoring and no metadata should be extracted so we continue - * to the next field - */ - continue - } - - /* - * The query field vector is populated using the termIndex found for - * the term and a unit value with the appropriate boost applied. - * Using upsert because there could already be an entry in the vector - * for the term we are working with. In that case we just add the scores - * together. - */ - queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b }) - - /** - * If we've already seen this term, field combo then we've already collected - * the matching documents and metadata, no need to go through all that again - */ - if (termFieldCache[termField]) { - continue - } - - for (var l = 0; l < matchingDocumentRefs.length; l++) { - /* - * All metadata for this term/field/document triple - * are then extracted and collected into an instance - * of lunr.MatchData ready to be returned in the query - * results - */ - var matchingDocumentRef = matchingDocumentRefs[l], - matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field), - metadata = fieldPosting[matchingDocumentRef], - fieldMatch - - if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) { - matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata) - } else { - fieldMatch.add(expandedTerm, field, metadata) - } - - } - - termFieldCache[termField] = true - } - } - } - - /** - * If the presence was required we need to update the requiredMatches field sets. - * We do this after all fields for the term have collected their matches because - * the clause terms presence is required in _any_ of the fields not _all_ of the - * fields. - */ - if (clause.presence === lunr.Query.presence.REQUIRED) { - for (var k = 0; k < clause.fields.length; k++) { - var field = clause.fields[k] - requiredMatches[field] = requiredMatches[field].intersect(clauseMatches) - } - } - } - - /** - * Need to combine the field scoped required and prohibited - * matching documents into a global set of required and prohibited - * matches - */ - var allRequiredMatches = lunr.Set.complete, - allProhibitedMatches = lunr.Set.empty - - for (var i = 0; i < this.fields.length; i++) { - var field = this.fields[i] - - if (requiredMatches[field]) { - allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field]) - } - - if (prohibitedMatches[field]) { - allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field]) - } - } - - var matchingFieldRefs = Object.keys(matchingFields), - results = [], - matches = Object.create(null) - - /* - * If the query is negated (contains only prohibited terms) - * we need to get _all_ fieldRefs currently existing in the - * index. This is only done when we know that the query is - * entirely prohibited terms to avoid any cost of getting all - * fieldRefs unnecessarily. - * - * Additionally, blank MatchData must be created to correctly - * populate the results. - */ - if (query.isNegated()) { - matchingFieldRefs = Object.keys(this.fieldVectors) - - for (var i = 0; i < matchingFieldRefs.length; i++) { - var matchingFieldRef = matchingFieldRefs[i] - var fieldRef = lunr.FieldRef.fromString(matchingFieldRef) - matchingFields[matchingFieldRef] = new lunr.MatchData - } - } - - for (var i = 0; i < matchingFieldRefs.length; i++) { - /* - * Currently we have document fields that match the query, but we - * need to return documents. The matchData and scores are combined - * from multiple fields belonging to the same document. - * - * Scores are calculated by field, using the query vectors created - * above, and combined into a final document score using addition. - */ - var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]), - docRef = fieldRef.docRef - - if (!allRequiredMatches.contains(docRef)) { - continue - } - - if (allProhibitedMatches.contains(docRef)) { - continue - } - - var fieldVector = this.fieldVectors[fieldRef], - score = queryVectors[fieldRef.fieldName].similarity(fieldVector), - docMatch - - if ((docMatch = matches[docRef]) !== undefined) { - docMatch.score += score - docMatch.matchData.combine(matchingFields[fieldRef]) - } else { - var match = { - ref: docRef, - score: score, - matchData: matchingFields[fieldRef] - } - matches[docRef] = match - results.push(match) - } - } - - /* - * Sort the results objects by score, highest first. - */ - return results.sort(function (a, b) { - return b.score - a.score - }) -} - -/** - * Prepares the index for JSON serialization. - * - * The schema for this JSON blob will be described in a - * separate JSON schema file. - * - * @returns {Object} - */ -lunr.Index.prototype.toJSON = function () { - var invertedIndex = Object.keys(this.invertedIndex) - .sort() - .map(function (term) { - return [term, this.invertedIndex[term]] - }, this) - - var fieldVectors = Object.keys(this.fieldVectors) - .map(function (ref) { - return [ref, this.fieldVectors[ref].toJSON()] - }, this) - - return { - version: lunr.version, - fields: this.fields, - fieldVectors: fieldVectors, - invertedIndex: invertedIndex, - pipeline: this.pipeline.toJSON() - } -} - -/** - * Loads a previously serialized lunr.Index - * - * @param {Object} serializedIndex - A previously serialized lunr.Index - * @returns {lunr.Index} - */ -lunr.Index.load = function (serializedIndex) { - var attrs = {}, - fieldVectors = {}, - serializedVectors = serializedIndex.fieldVectors, - invertedIndex = Object.create(null), - serializedInvertedIndex = serializedIndex.invertedIndex, - tokenSetBuilder = new lunr.TokenSet.Builder, - pipeline = lunr.Pipeline.load(serializedIndex.pipeline) - - if (serializedIndex.version != lunr.version) { - lunr.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + lunr.version + "' does not match serialized index '" + serializedIndex.version + "'") - } - - for (var i = 0; i < serializedVectors.length; i++) { - var tuple = serializedVectors[i], - ref = tuple[0], - elements = tuple[1] - - fieldVectors[ref] = new lunr.Vector(elements) - } - - for (var i = 0; i < serializedInvertedIndex.length; i++) { - var tuple = serializedInvertedIndex[i], - term = tuple[0], - posting = tuple[1] - - tokenSetBuilder.insert(term) - invertedIndex[term] = posting - } - - tokenSetBuilder.finish() - - attrs.fields = serializedIndex.fields - - attrs.fieldVectors = fieldVectors - attrs.invertedIndex = invertedIndex - attrs.tokenSet = tokenSetBuilder.root - attrs.pipeline = pipeline - - return new lunr.Index(attrs) -} -/*! - * lunr.Builder - * Copyright (C) 2019 Oliver Nightingale - */ - -/** - * lunr.Builder performs indexing on a set of documents and - * returns instances of lunr.Index ready for querying. - * - * All configuration of the index is done via the builder, the - * fields to index, the document reference, the text processing - * pipeline and document scoring parameters are all set on the - * builder before indexing. - * - * @constructor - * @property {string} _ref - Internal reference to the document reference field. - * @property {string[]} _fields - Internal reference to the document fields to index. - * @property {object} invertedIndex - The inverted index maps terms to document fields. - * @property {object} documentTermFrequencies - Keeps track of document term frequencies. - * @property {object} documentLengths - Keeps track of the length of documents added to the index. - * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing. - * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing. - * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index. - * @property {number} documentCount - Keeps track of the total number of documents indexed. - * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75. - * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2. - * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space. - * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index. - */ -lunr.Builder = function () { - this._ref = "id" - this._fields = Object.create(null) - this._documents = Object.create(null) - this.invertedIndex = Object.create(null) - this.fieldTermFrequencies = {} - this.fieldLengths = {} - this.tokenizer = lunr.tokenizer - this.pipeline = new lunr.Pipeline - this.searchPipeline = new lunr.Pipeline - this.documentCount = 0 - this._b = 0.75 - this._k1 = 1.2 - this.termIndex = 0 - this.metadataWhitelist = [] -} - -/** - * Sets the document field used as the document reference. Every document must have this field. - * The type of this field in the document should be a string, if it is not a string it will be - * coerced into a string by calling toString. - * - * The default ref is 'id'. - * - * The ref should _not_ be changed during indexing, it should be set before any documents are - * added to the index. Changing it during indexing can lead to inconsistent results. - * - * @param {string} ref - The name of the reference field in the document. - */ -lunr.Builder.prototype.ref = function (ref) { - this._ref = ref -} - -/** - * A function that is used to extract a field from a document. - * - * Lunr expects a field to be at the top level of a document, if however the field - * is deeply nested within a document an extractor function can be used to extract - * the right field for indexing. - * - * @callback fieldExtractor - * @param {object} doc - The document being added to the index. - * @returns {?(string|object|object[])} obj - The object that will be indexed for this field. - * @example Extracting a nested field - * function (doc) { return doc.nested.field } - */ - -/** - * Adds a field to the list of document fields that will be indexed. Every document being - * indexed should have this field. Null values for this field in indexed documents will - * not cause errors but will limit the chance of that document being retrieved by searches. - * - * All fields should be added before adding documents to the index. Adding fields after - * a document has been indexed will have no effect on already indexed documents. - * - * Fields can be boosted at build time. This allows terms within that field to have more - * importance when ranking search results. Use a field boost to specify that matches within - * one field are more important than other fields. - * - * @param {string} fieldName - The name of a field to index in all documents. - * @param {object} attributes - Optional attributes associated with this field. - * @param {number} [attributes.boost=1] - Boost applied to all terms within this field. - * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document. - * @throws {RangeError} fieldName cannot contain unsupported characters '/' - */ -lunr.Builder.prototype.field = function (fieldName, attributes) { - if (/\//.test(fieldName)) { - throw new RangeError ("Field '" + fieldName + "' contains illegal character '/'") - } - - this._fields[fieldName] = attributes || {} -} - -/** - * A parameter to tune the amount of field length normalisation that is applied when - * calculating relevance scores. A value of 0 will completely disable any normalisation - * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b - * will be clamped to the range 0 - 1. - * - * @param {number} number - The value to set for this tuning parameter. - */ -lunr.Builder.prototype.b = function (number) { - if (number < 0) { - this._b = 0 - } else if (number > 1) { - this._b = 1 - } else { - this._b = number - } -} - -/** - * A parameter that controls the speed at which a rise in term frequency results in term - * frequency saturation. The default value is 1.2. Setting this to a higher value will give - * slower saturation levels, a lower value will result in quicker saturation. - * - * @param {number} number - The value to set for this tuning parameter. - */ -lunr.Builder.prototype.k1 = function (number) { - this._k1 = number -} - -/** - * Adds a document to the index. - * - * Before adding fields to the index the index should have been fully setup, with the document - * ref and all fields to index already having been specified. - * - * The document must have a field name as specified by the ref (by default this is 'id') and - * it should have all fields defined for indexing, though null or undefined values will not - * cause errors. - * - * Entire documents can be boosted at build time. Applying a boost to a document indicates that - * this document should rank higher in search results than other documents. - * - * @param {object} doc - The document to add to the index. - * @param {object} attributes - Optional attributes associated with this document. - * @param {number} [attributes.boost=1] - Boost applied to all terms within this document. - */ -lunr.Builder.prototype.add = function (doc, attributes) { - var docRef = doc[this._ref], - fields = Object.keys(this._fields) - - this._documents[docRef] = attributes || {} - this.documentCount += 1 - - for (var i = 0; i < fields.length; i++) { - var fieldName = fields[i], - extractor = this._fields[fieldName].extractor, - field = extractor ? extractor(doc) : doc[fieldName], - tokens = this.tokenizer(field, { - fields: [fieldName] - }), - terms = this.pipeline.run(tokens), - fieldRef = new lunr.FieldRef (docRef, fieldName), - fieldTerms = Object.create(null) - - this.fieldTermFrequencies[fieldRef] = fieldTerms - this.fieldLengths[fieldRef] = 0 - - // store the length of this field for this document - this.fieldLengths[fieldRef] += terms.length - - // calculate term frequencies for this field - for (var j = 0; j < terms.length; j++) { - var term = terms[j] - - if (fieldTerms[term] == undefined) { - fieldTerms[term] = 0 - } - - fieldTerms[term] += 1 - - // add to inverted index - // create an initial posting if one doesn't exist - if (this.invertedIndex[term] == undefined) { - var posting = Object.create(null) - posting["_index"] = this.termIndex - this.termIndex += 1 - - for (var k = 0; k < fields.length; k++) { - posting[fields[k]] = Object.create(null) - } - - this.invertedIndex[term] = posting - } - - // add an entry for this term/fieldName/docRef to the invertedIndex - if (this.invertedIndex[term][fieldName][docRef] == undefined) { - this.invertedIndex[term][fieldName][docRef] = Object.create(null) - } - - // store all whitelisted metadata about this token in the - // inverted index - for (var l = 0; l < this.metadataWhitelist.length; l++) { - var metadataKey = this.metadataWhitelist[l], - metadata = term.metadata[metadataKey] - - if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) { - this.invertedIndex[term][fieldName][docRef][metadataKey] = [] - } - - this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata) - } - } - - } -} - -/** - * Calculates the average document length for this index - * - * @private - */ -lunr.Builder.prototype.calculateAverageFieldLengths = function () { - - var fieldRefs = Object.keys(this.fieldLengths), - numberOfFields = fieldRefs.length, - accumulator = {}, - documentsWithField = {} - - for (var i = 0; i < numberOfFields; i++) { - var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), - field = fieldRef.fieldName - - documentsWithField[field] || (documentsWithField[field] = 0) - documentsWithField[field] += 1 - - accumulator[field] || (accumulator[field] = 0) - accumulator[field] += this.fieldLengths[fieldRef] - } - - var fields = Object.keys(this._fields) - - for (var i = 0; i < fields.length; i++) { - var fieldName = fields[i] - accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName] - } - - this.averageFieldLength = accumulator -} - -/** - * Builds a vector space model of every document using lunr.Vector - * - * @private - */ -lunr.Builder.prototype.createFieldVectors = function () { - var fieldVectors = {}, - fieldRefs = Object.keys(this.fieldTermFrequencies), - fieldRefsLength = fieldRefs.length, - termIdfCache = Object.create(null) - - for (var i = 0; i < fieldRefsLength; i++) { - var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), - fieldName = fieldRef.fieldName, - fieldLength = this.fieldLengths[fieldRef], - fieldVector = new lunr.Vector, - termFrequencies = this.fieldTermFrequencies[fieldRef], - terms = Object.keys(termFrequencies), - termsLength = terms.length - - - var fieldBoost = this._fields[fieldName].boost || 1, - docBoost = this._documents[fieldRef.docRef].boost || 1 - - for (var j = 0; j < termsLength; j++) { - var term = terms[j], - tf = termFrequencies[term], - termIndex = this.invertedIndex[term]._index, - idf, score, scoreWithPrecision - - if (termIdfCache[term] === undefined) { - idf = lunr.idf(this.invertedIndex[term], this.documentCount) - termIdfCache[term] = idf - } else { - idf = termIdfCache[term] - } - - score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf) - score *= fieldBoost - score *= docBoost - scoreWithPrecision = Math.round(score * 1000) / 1000 - // Converts 1.23456789 to 1.234. - // Reducing the precision so that the vectors take up less - // space when serialised. Doing it now so that they behave - // the same before and after serialisation. Also, this is - // the fastest approach to reducing a number's precision in - // JavaScript. - - fieldVector.insert(termIndex, scoreWithPrecision) - } - - fieldVectors[fieldRef] = fieldVector - } - - this.fieldVectors = fieldVectors -} - -/** - * Creates a token set of all tokens in the index using lunr.TokenSet - * - * @private - */ -lunr.Builder.prototype.createTokenSet = function () { - this.tokenSet = lunr.TokenSet.fromArray( - Object.keys(this.invertedIndex).sort() - ) -} - -/** - * Builds the index, creating an instance of lunr.Index. - * - * This completes the indexing process and should only be called - * once all documents have been added to the index. - * - * @returns {lunr.Index} - */ -lunr.Builder.prototype.build = function () { - this.calculateAverageFieldLengths() - this.createFieldVectors() - this.createTokenSet() - - return new lunr.Index({ - invertedIndex: this.invertedIndex, - fieldVectors: this.fieldVectors, - tokenSet: this.tokenSet, - fields: Object.keys(this._fields), - pipeline: this.searchPipeline - }) -} - -/** - * Applies a plugin to the index builder. - * - * A plugin is a function that is called with the index builder as its context. - * Plugins can be used to customise or extend the behaviour of the index - * in some way. A plugin is just a function, that encapsulated the custom - * behaviour that should be applied when building the index. - * - * The plugin function will be called with the index builder as its argument, additional - * arguments can also be passed when calling use. The function will be called - * with the index builder as its context. - * - * @param {Function} plugin The plugin to apply. - */ -lunr.Builder.prototype.use = function (fn) { - var args = Array.prototype.slice.call(arguments, 1) - args.unshift(this) - fn.apply(this, args) -} -/** - * Contains and collects metadata about a matching document. - * A single instance of lunr.MatchData is returned as part of every - * lunr.Index~Result. - * - * @constructor - * @param {string} term - The term this match data is associated with - * @param {string} field - The field in which the term was found - * @param {object} metadata - The metadata recorded about this term in this field - * @property {object} metadata - A cloned collection of metadata associated with this document. - * @see {@link lunr.Index~Result} - */ -lunr.MatchData = function (term, field, metadata) { - var clonedMetadata = Object.create(null), - metadataKeys = Object.keys(metadata || {}) - - // Cloning the metadata to prevent the original - // being mutated during match data combination. - // Metadata is kept in an array within the inverted - // index so cloning the data can be done with - // Array#slice - for (var i = 0; i < metadataKeys.length; i++) { - var key = metadataKeys[i] - clonedMetadata[key] = metadata[key].slice() - } - - this.metadata = Object.create(null) - - if (term !== undefined) { - this.metadata[term] = Object.create(null) - this.metadata[term][field] = clonedMetadata - } -} - -/** - * An instance of lunr.MatchData will be created for every term that matches a - * document. However only one instance is required in a lunr.Index~Result. This - * method combines metadata from another instance of lunr.MatchData with this - * objects metadata. - * - * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one. - * @see {@link lunr.Index~Result} - */ -lunr.MatchData.prototype.combine = function (otherMatchData) { - var terms = Object.keys(otherMatchData.metadata) - - for (var i = 0; i < terms.length; i++) { - var term = terms[i], - fields = Object.keys(otherMatchData.metadata[term]) - - if (this.metadata[term] == undefined) { - this.metadata[term] = Object.create(null) - } - - for (var j = 0; j < fields.length; j++) { - var field = fields[j], - keys = Object.keys(otherMatchData.metadata[term][field]) - - if (this.metadata[term][field] == undefined) { - this.metadata[term][field] = Object.create(null) - } - - for (var k = 0; k < keys.length; k++) { - var key = keys[k] - - if (this.metadata[term][field][key] == undefined) { - this.metadata[term][field][key] = otherMatchData.metadata[term][field][key] - } else { - this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key]) - } - - } - } - } -} - -/** - * Add metadata for a term/field pair to this instance of match data. - * - * @param {string} term - The term this match data is associated with - * @param {string} field - The field in which the term was found - * @param {object} metadata - The metadata recorded about this term in this field - */ -lunr.MatchData.prototype.add = function (term, field, metadata) { - if (!(term in this.metadata)) { - this.metadata[term] = Object.create(null) - this.metadata[term][field] = metadata - return - } - - if (!(field in this.metadata[term])) { - this.metadata[term][field] = metadata - return - } - - var metadataKeys = Object.keys(metadata) - - for (var i = 0; i < metadataKeys.length; i++) { - var key = metadataKeys[i] - - if (key in this.metadata[term][field]) { - this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key]) - } else { - this.metadata[term][field][key] = metadata[key] - } - } -} -/** - * A lunr.Query provides a programmatic way of defining queries to be performed - * against a {@link lunr.Index}. - * - * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method - * so the query object is pre-initialized with the right index fields. - * - * @constructor - * @property {lunr.Query~Clause[]} clauses - An array of query clauses. - * @property {string[]} allFields - An array of all available fields in a lunr.Index. - */ -lunr.Query = function (allFields) { - this.clauses = [] - this.allFields = allFields -} - -/** - * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause. - * - * This allows wildcards to be added to the beginning and end of a term without having to manually do any string - * concatenation. - * - * The wildcard constants can be bitwise combined to select both leading and trailing wildcards. - * - * @constant - * @default - * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour - * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists - * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists - * @see lunr.Query~Clause - * @see lunr.Query#clause - * @see lunr.Query#term - * @example query term with trailing wildcard - * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING }) - * @example query term with leading and trailing wildcard - * query.term('foo', { - * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING - * }) - */ - -lunr.Query.wildcard = new String ("*") -lunr.Query.wildcard.NONE = 0 -lunr.Query.wildcard.LEADING = 1 -lunr.Query.wildcard.TRAILING = 2 - -/** - * Constants for indicating what kind of presence a term must have in matching documents. - * - * @constant - * @enum {number} - * @see lunr.Query~Clause - * @see lunr.Query#clause - * @see lunr.Query#term - * @example query term with required presence - * query.term('foo', { presence: lunr.Query.presence.REQUIRED }) - */ -lunr.Query.presence = { - /** - * Term's presence in a document is optional, this is the default value. - */ - OPTIONAL: 1, - - /** - * Term's presence in a document is required, documents that do not contain - * this term will not be returned. - */ - REQUIRED: 2, - - /** - * Term's presence in a document is prohibited, documents that do contain - * this term will not be returned. - */ - PROHIBITED: 3 -} - -/** - * A single clause in a {@link lunr.Query} contains a term and details on how to - * match that term against a {@link lunr.Index}. - * - * @typedef {Object} lunr.Query~Clause - * @property {string[]} fields - The fields in an index this clause should be matched against. - * @property {number} [boost=1] - Any boost that should be applied when matching this clause. - * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be. - * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline. - * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended. - * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents. - */ - -/** - * Adds a {@link lunr.Query~Clause} to this query. - * - * Unless the clause contains the fields to be matched all fields will be matched. In addition - * a default boost of 1 is applied to the clause. - * - * @param {lunr.Query~Clause} clause - The clause to add to this query. - * @see lunr.Query~Clause - * @returns {lunr.Query} - */ -lunr.Query.prototype.clause = function (clause) { - if (!('fields' in clause)) { - clause.fields = this.allFields - } - - if (!('boost' in clause)) { - clause.boost = 1 - } - - if (!('usePipeline' in clause)) { - clause.usePipeline = true - } - - if (!('wildcard' in clause)) { - clause.wildcard = lunr.Query.wildcard.NONE - } - - if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) { - clause.term = "*" + clause.term - } - - if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) { - clause.term = "" + clause.term + "*" - } - - if (!('presence' in clause)) { - clause.presence = lunr.Query.presence.OPTIONAL - } - - this.clauses.push(clause) - - return this -} - -/** - * A negated query is one in which every clause has a presence of - * prohibited. These queries require some special processing to return - * the expected results. - * - * @returns boolean - */ -lunr.Query.prototype.isNegated = function () { - for (var i = 0; i < this.clauses.length; i++) { - if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) { - return false - } - } - - return true -} - -/** - * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause} - * to the list of clauses that make up this query. - * - * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion - * to a token or token-like string should be done before calling this method. - * - * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an - * array, each term in the array will share the same options. - * - * @param {object|object[]} term - The term(s) to add to the query. - * @param {object} [options] - Any additional properties to add to the query clause. - * @returns {lunr.Query} - * @see lunr.Query#clause - * @see lunr.Query~Clause - * @example adding a single term to a query - * query.term("foo") - * @example adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard - * query.term("foo", { - * fields: ["title"], - * boost: 10, - * wildcard: lunr.Query.wildcard.TRAILING - * }) - * @example using lunr.tokenizer to convert a string to tokens before using them as terms - * query.term(lunr.tokenizer("foo bar")) - */ -lunr.Query.prototype.term = function (term, options) { - if (Array.isArray(term)) { - term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this) - return this - } - - var clause = options || {} - clause.term = term.toString() - - this.clause(clause) - - return this -} -lunr.QueryParseError = function (message, start, end) { - this.name = "QueryParseError" - this.message = message - this.start = start - this.end = end -} - -lunr.QueryParseError.prototype = new Error -lunr.QueryLexer = function (str) { - this.lexemes = [] - this.str = str - this.length = str.length - this.pos = 0 - this.start = 0 - this.escapeCharPositions = [] -} - -lunr.QueryLexer.prototype.run = function () { - var state = lunr.QueryLexer.lexText - - while (state) { - state = state(this) - } -} - -lunr.QueryLexer.prototype.sliceString = function () { - var subSlices = [], - sliceStart = this.start, - sliceEnd = this.pos - - for (var i = 0; i < this.escapeCharPositions.length; i++) { - sliceEnd = this.escapeCharPositions[i] - subSlices.push(this.str.slice(sliceStart, sliceEnd)) - sliceStart = sliceEnd + 1 - } - - subSlices.push(this.str.slice(sliceStart, this.pos)) - this.escapeCharPositions.length = 0 - - return subSlices.join('') -} - -lunr.QueryLexer.prototype.emit = function (type) { - this.lexemes.push({ - type: type, - str: this.sliceString(), - start: this.start, - end: this.pos - }) - - this.start = this.pos -} - -lunr.QueryLexer.prototype.escapeCharacter = function () { - this.escapeCharPositions.push(this.pos - 1) - this.pos += 1 -} - -lunr.QueryLexer.prototype.next = function () { - if (this.pos >= this.length) { - return lunr.QueryLexer.EOS - } - - var char = this.str.charAt(this.pos) - this.pos += 1 - return char -} - -lunr.QueryLexer.prototype.width = function () { - return this.pos - this.start -} - -lunr.QueryLexer.prototype.ignore = function () { - if (this.start == this.pos) { - this.pos += 1 - } - - this.start = this.pos -} - -lunr.QueryLexer.prototype.backup = function () { - this.pos -= 1 -} - -lunr.QueryLexer.prototype.acceptDigitRun = function () { - var char, charCode - - do { - char = this.next() - charCode = char.charCodeAt(0) - } while (charCode > 47 && charCode < 58) - - if (char != lunr.QueryLexer.EOS) { - this.backup() - } -} - -lunr.QueryLexer.prototype.more = function () { - return this.pos < this.length -} - -lunr.QueryLexer.EOS = 'EOS' -lunr.QueryLexer.FIELD = 'FIELD' -lunr.QueryLexer.TERM = 'TERM' -lunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE' -lunr.QueryLexer.BOOST = 'BOOST' -lunr.QueryLexer.PRESENCE = 'PRESENCE' - -lunr.QueryLexer.lexField = function (lexer) { - lexer.backup() - lexer.emit(lunr.QueryLexer.FIELD) - lexer.ignore() - return lunr.QueryLexer.lexText -} - -lunr.QueryLexer.lexTerm = function (lexer) { - if (lexer.width() > 1) { - lexer.backup() - lexer.emit(lunr.QueryLexer.TERM) - } - - lexer.ignore() - - if (lexer.more()) { - return lunr.QueryLexer.lexText - } -} - -lunr.QueryLexer.lexEditDistance = function (lexer) { - lexer.ignore() - lexer.acceptDigitRun() - lexer.emit(lunr.QueryLexer.EDIT_DISTANCE) - return lunr.QueryLexer.lexText -} - -lunr.QueryLexer.lexBoost = function (lexer) { - lexer.ignore() - lexer.acceptDigitRun() - lexer.emit(lunr.QueryLexer.BOOST) - return lunr.QueryLexer.lexText -} - -lunr.QueryLexer.lexEOS = function (lexer) { - if (lexer.width() > 0) { - lexer.emit(lunr.QueryLexer.TERM) - } -} - -// This matches the separator used when tokenising fields -// within a document. These should match otherwise it is -// not possible to search for some tokens within a document. -// -// It is possible for the user to change the separator on the -// tokenizer so it _might_ clash with any other of the special -// characters already used within the search string, e.g. :. -// -// This means that it is possible to change the separator in -// such a way that makes some words unsearchable using a search -// string. -lunr.QueryLexer.termSeparator = lunr.tokenizer.separator - -lunr.QueryLexer.lexText = function (lexer) { - while (true) { - var char = lexer.next() - - if (char == lunr.QueryLexer.EOS) { - return lunr.QueryLexer.lexEOS - } - - // Escape character is '\' - if (char.charCodeAt(0) == 92) { - lexer.escapeCharacter() - continue - } - - if (char == ":") { - return lunr.QueryLexer.lexField - } - - if (char == "~") { - lexer.backup() - if (lexer.width() > 0) { - lexer.emit(lunr.QueryLexer.TERM) - } - return lunr.QueryLexer.lexEditDistance - } - - if (char == "^") { - lexer.backup() - if (lexer.width() > 0) { - lexer.emit(lunr.QueryLexer.TERM) - } - return lunr.QueryLexer.lexBoost - } - - // "+" indicates term presence is required - // checking for length to ensure that only - // leading "+" are considered - if (char == "+" && lexer.width() === 1) { - lexer.emit(lunr.QueryLexer.PRESENCE) - return lunr.QueryLexer.lexText - } - - // "-" indicates term presence is prohibited - // checking for length to ensure that only - // leading "-" are considered - if (char == "-" && lexer.width() === 1) { - lexer.emit(lunr.QueryLexer.PRESENCE) - return lunr.QueryLexer.lexText - } - - if (char.match(lunr.QueryLexer.termSeparator)) { - return lunr.QueryLexer.lexTerm - } - } -} - -lunr.QueryParser = function (str, query) { - this.lexer = new lunr.QueryLexer (str) - this.query = query - this.currentClause = {} - this.lexemeIdx = 0 -} - -lunr.QueryParser.prototype.parse = function () { - this.lexer.run() - this.lexemes = this.lexer.lexemes - - var state = lunr.QueryParser.parseClause - - while (state) { - state = state(this) - } - - return this.query -} - -lunr.QueryParser.prototype.peekLexeme = function () { - return this.lexemes[this.lexemeIdx] -} - -lunr.QueryParser.prototype.consumeLexeme = function () { - var lexeme = this.peekLexeme() - this.lexemeIdx += 1 - return lexeme -} - -lunr.QueryParser.prototype.nextClause = function () { - var completedClause = this.currentClause - this.query.clause(completedClause) - this.currentClause = {} -} - -lunr.QueryParser.parseClause = function (parser) { - var lexeme = parser.peekLexeme() - - if (lexeme == undefined) { - return - } - - switch (lexeme.type) { - case lunr.QueryLexer.PRESENCE: - return lunr.QueryParser.parsePresence - case lunr.QueryLexer.FIELD: - return lunr.QueryParser.parseField - case lunr.QueryLexer.TERM: - return lunr.QueryParser.parseTerm - default: - var errorMessage = "expected either a field or a term, found " + lexeme.type - - if (lexeme.str.length >= 1) { - errorMessage += " with value '" + lexeme.str + "'" - } - - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } -} - -lunr.QueryParser.parsePresence = function (parser) { - var lexeme = parser.consumeLexeme() - - if (lexeme == undefined) { - return - } - - switch (lexeme.str) { - case "-": - parser.currentClause.presence = lunr.Query.presence.PROHIBITED - break - case "+": - parser.currentClause.presence = lunr.Query.presence.REQUIRED - break - default: - var errorMessage = "unrecognised presence operator'" + lexeme.str + "'" - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } - - var nextLexeme = parser.peekLexeme() - - if (nextLexeme == undefined) { - var errorMessage = "expecting term or field, found nothing" - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } - - switch (nextLexeme.type) { - case lunr.QueryLexer.FIELD: - return lunr.QueryParser.parseField - case lunr.QueryLexer.TERM: - return lunr.QueryParser.parseTerm - default: - var errorMessage = "expecting term or field, found '" + nextLexeme.type + "'" - throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) - } -} - -lunr.QueryParser.parseField = function (parser) { - var lexeme = parser.consumeLexeme() - - if (lexeme == undefined) { - return - } - - if (parser.query.allFields.indexOf(lexeme.str) == -1) { - var possibleFields = parser.query.allFields.map(function (f) { return "'" + f + "'" }).join(', '), - errorMessage = "unrecognised field '" + lexeme.str + "', possible fields: " + possibleFields - - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } - - parser.currentClause.fields = [lexeme.str] - - var nextLexeme = parser.peekLexeme() - - if (nextLexeme == undefined) { - var errorMessage = "expecting term, found nothing" - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } - - switch (nextLexeme.type) { - case lunr.QueryLexer.TERM: - return lunr.QueryParser.parseTerm - default: - var errorMessage = "expecting term, found '" + nextLexeme.type + "'" - throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) - } -} - -lunr.QueryParser.parseTerm = function (parser) { - var lexeme = parser.consumeLexeme() - - if (lexeme == undefined) { - return - } - - parser.currentClause.term = lexeme.str.toLowerCase() - - if (lexeme.str.indexOf("*") != -1) { - parser.currentClause.usePipeline = false - } - - var nextLexeme = parser.peekLexeme() - - if (nextLexeme == undefined) { - parser.nextClause() - return - } - - switch (nextLexeme.type) { - case lunr.QueryLexer.TERM: - parser.nextClause() - return lunr.QueryParser.parseTerm - case lunr.QueryLexer.FIELD: - parser.nextClause() - return lunr.QueryParser.parseField - case lunr.QueryLexer.EDIT_DISTANCE: - return lunr.QueryParser.parseEditDistance - case lunr.QueryLexer.BOOST: - return lunr.QueryParser.parseBoost - case lunr.QueryLexer.PRESENCE: - parser.nextClause() - return lunr.QueryParser.parsePresence - default: - var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" - throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) - } -} - -lunr.QueryParser.parseEditDistance = function (parser) { - var lexeme = parser.consumeLexeme() - - if (lexeme == undefined) { - return - } - - var editDistance = parseInt(lexeme.str, 10) - - if (isNaN(editDistance)) { - var errorMessage = "edit distance must be numeric" - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } - - parser.currentClause.editDistance = editDistance - - var nextLexeme = parser.peekLexeme() - - if (nextLexeme == undefined) { - parser.nextClause() - return - } - - switch (nextLexeme.type) { - case lunr.QueryLexer.TERM: - parser.nextClause() - return lunr.QueryParser.parseTerm - case lunr.QueryLexer.FIELD: - parser.nextClause() - return lunr.QueryParser.parseField - case lunr.QueryLexer.EDIT_DISTANCE: - return lunr.QueryParser.parseEditDistance - case lunr.QueryLexer.BOOST: - return lunr.QueryParser.parseBoost - case lunr.QueryLexer.PRESENCE: - parser.nextClause() - return lunr.QueryParser.parsePresence - default: - var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" - throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) - } -} - -lunr.QueryParser.parseBoost = function (parser) { - var lexeme = parser.consumeLexeme() - - if (lexeme == undefined) { - return - } - - var boost = parseInt(lexeme.str, 10) - - if (isNaN(boost)) { - var errorMessage = "boost must be numeric" - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } - - parser.currentClause.boost = boost - - var nextLexeme = parser.peekLexeme() - - if (nextLexeme == undefined) { - parser.nextClause() - return - } - - switch (nextLexeme.type) { - case lunr.QueryLexer.TERM: - parser.nextClause() - return lunr.QueryParser.parseTerm - case lunr.QueryLexer.FIELD: - parser.nextClause() - return lunr.QueryParser.parseField - case lunr.QueryLexer.EDIT_DISTANCE: - return lunr.QueryParser.parseEditDistance - case lunr.QueryLexer.BOOST: - return lunr.QueryParser.parseBoost - case lunr.QueryLexer.PRESENCE: - parser.nextClause() - return lunr.QueryParser.parsePresence - default: - var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" - throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) - } -} - - /** - * export the module via AMD, CommonJS or as a browser global - * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js - */ - ;(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(factory) - } else if (typeof exports === 'object') { - /** - * Node. Does not work with strict CommonJS, but - * only CommonJS-like enviroments that support module.exports, - * like Node. - */ - module.exports = factory() - } else { - // Browser globals (root is window) - root.lunr = factory() - } - }(this, function () { - /** - * Just return a value to define the module export. - * This example returns an object, but the module - * can return a function as the exported value. - */ - return lunr - })) -})(); diff --git a/assets/js/search-index.json b/assets/js/search-index.json deleted file mode 100644 index 1cbdf82..0000000 --- a/assets/js/search-index.json +++ /dev/null @@ -1 +0,0 @@ -{"docs":{"0":{"doc":"Base64 to image","title":"Convert base64 to an image","content":"Learn how to generate PNG’s or JPG’s from base64. Works with Zapier and Integromat. ","url":"https://docs.htmlcsstoimage.com/guides/converting-base64-to-image/#convert-base64-to-an-image","relUrl":"/guides/converting-base64-to-image/#convert-base64-to-an-image"},"1":{"doc":"Base64 to image","title":"How it works","content":"To render base64 to an image, you can use an img tag and set the src to the base64 of your image. <!-- Base64 is truncated for the example --> <img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRo...\" width=\"100px\"/> . ","url":"https://docs.htmlcsstoimage.com/guides/converting-base64-to-image/#how-it-works","relUrl":"/guides/converting-base64-to-image/#how-it-works"},"2":{"doc":"Base64 to image","title":"Example","content":"In this example we convert a base64 of our logo into an image. <img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAtlQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////mRsMIwAAAPF0Uk5TABFXq+D4J5zruf3++ljq5JZkXF0HCAQFAwIGFyUjFQE5ipuZgixFj3oiC0aSwdXSvpBZgStanW1KkZpPpxjAeRqL6O6IlLUNG8XTH3zy3Gj33VUTnte49aGT+fvs/LQQmPHmpAp9LQkPOlZy4ncmZ9ai8288S83aXjY/NxRhzmCf77wgKdhsYm70DBzCQL3PIbN2Docz2y+35YBNhjKo39SmgySvlUJz3hKFKLGO0WkWU8rZOMcqLunIpcNUhOcZxPD2MXEdyTuu0LKqrGUeNDDjUuFbzKN7uj2JSH+2cH6wUalHjD7tu0lBv8ZQrZegjQY38awAAAABYktHRPLbto54AAAACXBIWXMAAABIAAAASABGyWs+AAAG3klEQVRo3u2aCVdTRxSABwgGeGHP9mJjXKoiUlRcsaKWpUEQCgoIjXGBCGhBgyIqoLKYKosKIosLgiJVRK0baNWqtdqqdUOLtlprW7VqN3v/Qect2ZRjYk5yek6bezhM5t6Z+TJz77yZeRmEEHJwdOI4g5XFmePk6IBo6cV1sXbrjLhwe9Htu7rZpn0AN1dMcOBS7RM8ZysLj6AIXAfk7oE/eHp5+/haVXy8vTxxwx7uyIlq352PrC58d4rghDj4v5fA+u0jJPDCTXMQjk+ety3aR8ibh6MVUSHrYxuADzW5aICvbQC+doAdYAf8ewChSCQSsynJ6iS935L2kSAZpRdLRAYi1FbR514PkPXtx+0/4O2B5KDBOPUbQun8hwa8Ezhs+IihQSNHIfHoMVwutz8r3LECJBwXzGjGjw9+V2IK4D+BWuyI4JCJ9KI3CasmvxdK0EqXMAgnRRFGy+L7chQ5RZ+NijYFkEzFW4CY2A/kwZ5x4BY/DaHpCTxwTnRNCpyByybzRSlAhIV6fAgKl9CZSpglR7PneIaGzsW1QkNT06ab9IFqnlIZnJ6BMue7gscCIRJ/NAOyshdmZkoXqQFy+MIUWLwkd2keLHPMXZ5FAdD0Ffm54UplQH5+QaEZTl6pUIylUkEyePZFSLoKPFaLmBqLoUiCe1CcjzJLYFUpWqOhAUwt3sdmRtFahWIdDcihAT5lkFDOWCoqnSchUQAUr0ezN8DGKgpQLdfW4q0zH7CpBkufCRRAvBnKHFkLWRs0Gcmy3erqWUBkJczhvzmARyQ2JCU1uG6hAPwiSM01sku3+mawAPG27Y3IAoAu6DBAsAOaGo0rimWIBTAzzwJAahSW5mIasBM4tegVYQGGA/smPtjV0tIiHbWbAohaweMTqwMMwlS2R6HIlmltpMwKgJfmQcFeaM5l223st5wNGmYeGNXijTULIGvzUyj2VYgQv30/hE4rR4IDSjj4abRckHHo8BE42kL1o3f7sQ5QD2qPZJ6eqiGjek1VKLZ3drb4mwQcr04liBOfBWXMGzYXFHvHF6LSWQSUbZyVcPLUTIBZfXCZ9cMT62aAc7ym4zTVNfnnwzSJZ3AtjaZ5RKYpwIIyOkBbz56jU85AhNbkfMGG7fnqL6kyF3SBfIDqwsWv9E/TxFJTgIrN+6urq8d8LXTcgdNLS6inRNtp7pH4E1mXd3ifpcu0B1yppqV/AZWV+H5TzcrVawJTACTyLy8vF8gQmYFTFTuRMq7Xz78h9dfGkKScET6jIFVsXlf+tVFkNbED7AA7wA6wA2wKkLffuHGjtraxMd1ghSVD6mktpS510J1khBU3GTVluFklMAdQkRDf5dlFydFbeu24c7cZZVcWR7Nhe19md0F+253FqrHhtnqr3AzA6TLdCpum60LGHaNzDXH7bhulzvzO+DVgVr0ZgO+bdOVvF+iGYtdLb1bP36O+bMYApZF2SqkZAMn9fSmtUXR55Q+6NTZkUXA8gEtOSkTEmAccN4Bi+jVW1Y+DI1Lm1AGEYUvAwxWkGQC8+SIrKgHizgN0XNdry38COLiQFAr5mSvS8MblAXMcI4XiGie8X8EWsXEzrwvTn/GZrmE3QNlovc4f5y9Lmc/Xh+PxXqG1qH4BUEvND1M8tEUAM5bfwvutHeU9AsiRBMSMsxzQuBcgL7p3JX0E6Qkg3k5A8SOLAaSfAohdJMpWgts+cU+A9G6AunqLAfhsB13HEKqPBeiuMgJQrxbEbdtKcBjtlFsMOI0HPw0PPn8AdsVqQ0Dq40l+W1uTZlJzZBCyFKDCLj6/JPLixchriwGuZhoAgMDCzNmVQosBtdjFCk13Xl6eGof7lieGAFZ457aJkKUA2SSj6U+EC/UA5dywsF/PxD7dUyVDFgPYo4dOaMeygPi198fdfzLQgTSq8YaAaTG4+G5GLl0mIM5bDzA+WVoGUOUAxIxWyWvk+E/1zAPgymzGcEnfm1cBgUPMA5BtSzn46zw/RA88WViAz18n3A+JkcwhvQQ/0oa2d7ZHGviXLFzYuaaxASD20UuWngGyZ0lNeA7FqE9dk+AZFfRbYDF2c9fEw7L8K8146Jxj1erA3y+odOX/eBqlVmvmspaOPaaOsf5/6lyLl45DldpcUu8iA7cvS9eWr2kwDoimdBMAwV/aEC0JQWj2VW2onnS4p9A306FzqCqZMAJ0S00AUMvdohwsyeEFVKAf3/WCyr0Y2YmiNyXcyaEl+XG+fmVpf1iUo5Pkv5+bPmWSEj4WCVtQrM8xBipn9PZVp37F8l/e2dkBdsD/EmDTn3vjbPuDdZztf3K3+aUBm197sPnFDZtfPbH95RkbX//5B5xjvkQSpORpAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE4LTEwLTA4VDAxOjAyOjQ2KzAwOjAw67fvvgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOC0xMC0wOFQwMTowMjo0NiswMDowMJrqVwIAAABGdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDYuNy44LTkgMjAxNC0wNS0xMiBRMTYgaHR0cDovL3d3dy5pbWFnZW1hZ2ljay5vcmfchu0AAAAAGHRFWHRUaHVtYjo6RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAGHRFWHRUaHVtYjo6SW1hZ2U6OmhlaWdodAAxOTIPAHKFAAAAF3RFWHRUaHVtYjo6SW1hZ2U6OldpZHRoADE5MtOsIQgAAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTUzODk2MDU2NpdfbhIAAAAPdEVYdFRodW1iOjpTaXplADBCQpSiPuwAAABWdEVYdFRodW1iOjpVUkkAZmlsZTovLy9tbnRsb2cvZmF2aWNvbnMvMjAxOC0xMC0wOC8yYzhhM2FiNDNiMzY1NjQ2ZmJlMmVkOWVmNjkyMzdhMS5pY28ucG5nfF1VugAAAABJRU5ErkJggg==\" width=\"100px\"/> . ","url":"https://docs.htmlcsstoimage.com/guides/converting-base64-to-image/#example","relUrl":"/guides/converting-base64-to-image/#example"},"3":{"doc":"Base64 to image","title":"Use this with Zapier or Integromat","content":"We have integrations for both Zapier and Integromat. You can use the example code above to convert base64 to images. Zapier Integromat . ","url":"https://docs.htmlcsstoimage.com/guides/converting-base64-to-image/#use-this-with-zapier-or-integromat","relUrl":"/guides/converting-base64-to-image/#use-this-with-zapier-or-integromat"},"4":{"doc":"Base64 to image","title":"Need help?","content":"Talk to a human: support@htmlcsstoimage.com. We always respond within 24 hours. And often, even faster. ","url":"https://docs.htmlcsstoimage.com/guides/converting-base64-to-image/#need-help","relUrl":"/guides/converting-base64-to-image/#need-help"},"5":{"doc":"Base64 to image","title":"Base64 to image","content":" ","url":"https://docs.htmlcsstoimage.com/guides/converting-base64-to-image/","relUrl":"/guides/converting-base64-to-image/"},"6":{"doc":"C#","title":"C#: HTML/CSS to Image","content":"Generate a png, jpg or webp images with C#. Renders exactly like Google Chrome. Live demo Get an API Key . | Generating images with C# | Authentication with C# | C# example code | Need help? | . ","url":"https://docs.htmlcsstoimage.com/example-code/c/#c-htmlcss-to-image","relUrl":"/example-code/c/#c-htmlcss-to-image"},"7":{"doc":"C#","title":"Generating images with C#","content":". | The API takes your HTML/CSS and runs it inside a real instance of Google Chrome to convert your html into an image. | Use C# to send the API your HTML/CSS. | You’ll get back json with the URL to your generated image. | . For more details on how this works, see Creating an image. Example API response: . { \"url\": \"https://hcti.io/v1/image/be4c5118-fe19-462b-a49e-48cf72697a9d\" } . ","url":"https://docs.htmlcsstoimage.com/example-code/c/#generating-images-with-c","relUrl":"/example-code/c/#generating-images-with-c"},"8":{"doc":"C#","title":"Authentication with C#","content":"The API uses HTTP Basic authentication. Your username is your User ID and your password is your API Key. Both of these are available from the dashboard. The C# code sample demonstrates how to authenticate your request. You can signup for a free API key to get started. Free API Key for C# . ","url":"https://docs.htmlcsstoimage.com/example-code/c/#authentication-with-c","relUrl":"/example-code/c/#authentication-with-c"},"9":{"doc":"C#","title":"C# example code","content":"This C# code example sends an HTTP POST to the https://hcti.io/v1/image API. Converting your HTML/CSS to an image with C#. This code creates a WebClient, sets credentials and POSTS the HTML & CSS as values to the API. The response will be json with the URL to the generated image. using System.Net; namespace htciExample { class Program { static void Main() { byte[] result; string html = \"<div class='ping'>Pong ✅</div>\"; string css = \".ping {padding: 20px; font-family:'sans-serif'; }\"; using (var client = new WebClient()) { string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(\"user_id:api_key\")); client.Headers[HttpRequestHeader.Authorization] = \"Basic \" + credentials; result = client.UploadValues( \"https://hcti.io/v1/image\", \"POST\", new System.Collections.Specialized.NameValueCollection() { { \"html\", html }, { \"css\", css } } ); } string resultString = System.Text.Encoding.UTF8.GetString(result); Console.WriteLine(resultString); // {\"url\":\"https://hcti.io/v1/image/404ed70d-dcb9-4778-9be4-fad912321d5b\"} } } } . ","url":"https://docs.htmlcsstoimage.com/example-code/c/#c-example-code","relUrl":"/example-code/c/#c-example-code"},"10":{"doc":"C#","title":"Need help?","content":"We’re always looking to improve this documentation. Please send us an email: support@htmlcsstoimage.com. We respond fast. ","url":"https://docs.htmlcsstoimage.com/example-code/c/#need-help","relUrl":"/example-code/c/#need-help"},"11":{"doc":"C#","title":"C#","content":" ","url":"https://docs.htmlcsstoimage.com/example-code/c/","relUrl":"/example-code/c/"},"12":{"doc":"Changelog","title":"Changelog","content":"Always improving. Updates to HTML/CSS to Image are posted here. ","url":"https://docs.htmlcsstoimage.com/changelog/","relUrl":"/changelog/"},"13":{"doc":"Changelog","title":"What we’re currently working on","content":". | PDF support | WYSIWYG image editor. Making it easier for people to design images for use with the API. | Image template API. | Improving the dashboard with more information about your account. | . If you have feature requests, please send them to us: support@htmlcsstoimage.com. ","url":"https://docs.htmlcsstoimage.com/changelog/#what-were-currently-working-on","relUrl":"/changelog/#what-were-currently-working-on"},"14":{"doc":"Changelog","title":"Font rendering improvements","content":"October 2, 2020 . We released a patch update to the HTML/CSS to Image Ruby Client. It fixes an issue with addressable not being loaded. ","url":"https://docs.htmlcsstoimage.com/changelog/#font-rendering-improvements","relUrl":"/changelog/#font-rendering-improvements"},"15":{"doc":"Changelog","title":"Font rendering improvements","content":"September 30, 2020 . We have released a large update to the fonts available to the API. Previously, we were missing some character sets and some images would show an empty square instead of the correct character. Our goal is to be able to perfectly render text from any language. If you notice any more missing characters, please send us the image URL so that we can investigate it. ","url":"https://docs.htmlcsstoimage.com/changelog/#font-rendering-improvements-1","relUrl":"/changelog/#font-rendering-improvements-1"},"16":{"doc":"Changelog","title":"Various performance improvements released","content":"September 10, 2020 . We’ve been working on further improving the performance of the API. Initial image renders are now ~30% faster. We have also improved caching of images. When cached, you can expect an average of 30-50ms when downloading an image. ","url":"https://docs.htmlcsstoimage.com/changelog/#various-performance-improvements-released","relUrl":"/changelog/#various-performance-improvements-released"},"17":{"doc":"Changelog","title":"Zapier plugin released from beta!","content":"August 31, 2020 . The HTML/CSS to Image Zapier integration has graduated from beta. Zapier wrote up a nice blog post about the integration. It’s become very popular quickly and we’ve seen many inventive ways people are improving their businesses through automated image generation. | HTML/CSS to Image Zapier integration | . ","url":"https://docs.htmlcsstoimage.com/changelog/#zapier-plugin-released-from-beta","relUrl":"/changelog/#zapier-plugin-released-from-beta"},"18":{"doc":"Changelog","title":"New Live Editor","content":"August 16, 2020 . We’ve rebuilt the live demo. Now you can preview your HTML/CSS as you edit it. Then click the image button to see it converted into an image. This makes it much easier to prototype your images inside a browser. | HTML/CSS to Image Demo | . ","url":"https://docs.htmlcsstoimage.com/changelog/#new-live-editor","relUrl":"/changelog/#new-live-editor"},"19":{"doc":"Changelog","title":"Ruby Client released","content":"August 7, 2020 . We have released the first version of our new ruby client. This allows for easier integration with the API using Ruby. | HTML/CSS to Image Ruby Client | . ","url":"https://docs.htmlcsstoimage.com/changelog/#ruby-client-released","relUrl":"/changelog/#ruby-client-released"},"20":{"doc":"Changelog","title":"Integromat updates","content":"August 3, 2020 . We’ve added additional parameters to the Integromat integration. You can now use selector, ms_delay and device_scale. | HTML/CSS to Image Integromat Integration | . ","url":"https://docs.htmlcsstoimage.com/changelog/#integromat-updates","relUrl":"/changelog/#integromat-updates"},"21":{"doc":"Changelog","title":"Template API","content":"July 27, 2020 . The Template API is now available. With templates, you can create re-usable HTML that contains variables. These variables can be replaced when creating an image, making for even simpler image generation. | HTML/CSS to Image Template API | . ","url":"https://docs.htmlcsstoimage.com/changelog/#template-api","relUrl":"/changelog/#template-api"},"22":{"doc":"Changelog","title":"Render when ready","content":"July 26, 2020 . We have added the render_when_ready parameter to image creation. This gives you control over when the image is rendered. By setting render_when_ready to true, we will wait to generate the image until your HTML calls the ScreenshotReady() function in JavaScript. This is useful for images that have complex JS and you need control over when it’s ready to have an image created. ","url":"https://docs.htmlcsstoimage.com/changelog/#render-when-ready","relUrl":"/changelog/#render-when-ready"},"23":{"doc":"Changelog","title":"New Zapier templates","content":"July 22, 2020 . We have added additional Zapier templates to the integration. You can see them here: HTML/CSS to Image Templates. ","url":"https://docs.htmlcsstoimage.com/changelog/#new-zapier-templates","relUrl":"/changelog/#new-zapier-templates"},"24":{"doc":"Changelog","title":"Introducing the US-EAST region","content":"July 7, 2020 . We have enabled our US-EAST region. Your API requests will now be automatically routed to either US-WEST or US-EAST based on where you ae located. This will improve latency for requests as well as reliability of the API. We will automatically fail over to the other region is one is unhealthy. We plan to introduce an EU region in the future. ","url":"https://docs.htmlcsstoimage.com/changelog/#introducing-the-us-east-region","relUrl":"/changelog/#introducing-the-us-east-region"},"25":{"doc":"Changelog","title":"Brand new docs site","content":"July 5, 2020 . We’ve released a new version of our documentation website. It’s now simpler, faster & we’ve improved the organization of all the content. Please send us any feedback. ","url":"https://docs.htmlcsstoimage.com/changelog/#brand-new-docs-site","relUrl":"/changelog/#brand-new-docs-site"},"26":{"doc":"Changelog","title":"URL to Image performance improvements","content":"July 17, 2020 . We have been working on performance improvements to URL to Image. We’ve improved reliability when screenshotting webpages with large amounts of network requests and JavaScript. ","url":"https://docs.htmlcsstoimage.com/changelog/#url-to-image-performance-improvements","relUrl":"/changelog/#url-to-image-performance-improvements"},"27":{"doc":"Changelog","title":"URL to Image","content":"March 27, 2020 . We’ve added the ability to create images from URL’s. We’re calling this URL to Image. Learn more. ","url":"https://docs.htmlcsstoimage.com/changelog/#url-to-image","relUrl":"/changelog/#url-to-image"},"28":{"doc":"Changelog","title":"ms_delay parameter","content":"February 12, 2020 . We have added the ms_delay parameter. Allowing you to specify how long you want the rendered to wait before generating the image. Useful for HTML with many assets or JavaScript that needs extra time to load. ","url":"https://docs.htmlcsstoimage.com/changelog/#ms_delay-parameter","relUrl":"/changelog/#ms_delay-parameter"},"29":{"doc":"Changelog","title":"Deleting images","content":"December 12, 2019 . We have added the Delete endpoint. You can now delete an image and it will be completely removed from our servers. Requests to the image URL will return 410. ","url":"https://docs.htmlcsstoimage.com/changelog/#deleting-images","relUrl":"/changelog/#deleting-images"},"30":{"doc":"Changelog","title":"Integromat integration","content":"November 29, 2019 . Our Integromat integration is now available. You can use the integration to connect HTML/CSS to Image with the thousands of integrations available on Integromat. ","url":"https://docs.htmlcsstoimage.com/changelog/#integromat-integration","relUrl":"/changelog/#integromat-integration"},"31":{"doc":"Curl","title":"Curl","content":"Generate a png, jpg or webp images from your terminal with cURL. Live demo Get an API Key . | Generate an image with cURL | Response | Need help? | . ","url":"https://docs.htmlcsstoimage.com/example-code/curl/","relUrl":"/example-code/curl/"},"32":{"doc":"Curl","title":"Generate an image with cURL","content":"Run this command in your terminal to generate an image using the API. For more details on how this works, see Creating an image. # Replace UserID and APIKey with your credentials from the dashboard https://htmlcsstoimage.com/dashboard curl -X POST https://hcti.io/v1/image -u 'UserID:APIKey'\\ -d html=\"<div class='ping'>Pong ✅</div>\" \\ -d css=\".ping { padding: 20px; font-family: 'sans-serif'; }\" . ","url":"https://docs.htmlcsstoimage.com/example-code/curl/#generate-an-image-with-curl","relUrl":"/example-code/curl/#generate-an-image-with-curl"},"33":{"doc":"Curl","title":"Response","content":"The API will return a json payload with the URL to your new image. { \"url\":\"https://hcti.io/v1/image/1eecf460-e2e5-4db1-9db6-cf862c34a744\" } . ","url":"https://docs.htmlcsstoimage.com/example-code/curl/#response","relUrl":"/example-code/curl/#response"},"34":{"doc":"Curl","title":"Need help?","content":"Talk to a human: support@htmlcsstoimage.com. We always respond within 24 hours. And often, even faster. ","url":"https://docs.htmlcsstoimage.com/example-code/curl/#need-help","relUrl":"/example-code/curl/#need-help"},"35":{"doc":"Duplicate image detection","title":"Duplicate image detection","content":"Learn how we protect your image quota from endless loops and bugs. ","url":"https://docs.htmlcsstoimage.com/guides/duplicate-image-detection/","relUrl":"/guides/duplicate-image-detection/"},"36":{"doc":"Duplicate image detection","title":"What happens if I create the same image multiple times?","content":"The API will automatically detect if an API key is creating the same image repeatedly within a short time period. When this happens, a new image will not be created and you will get back the URL to the existing image. | This protects you from accidentally using up your image quota due to a bug in a script or abuse from a user/robot. | We use the entire payload sent to the API to determine duplicates. If there a single character difference between images, it will not be considered a duplicate. | . ","url":"https://docs.htmlcsstoimage.com/guides/duplicate-image-detection/#what-happens-if-i-create-the-same-image-multiple-times","relUrl":"/guides/duplicate-image-detection/#what-happens-if-i-create-the-same-image-multiple-times"},"37":{"doc":"Duplicate image detection","title":"\n\nFYI\n","content":"This feature should not be relied on for stopping the creation of duplicate images. Duplicate detection happens on our Edge CDN. This means it is geographically dependent. If you create identical images from servers in two different locations, we won’t be able to detect that they are the same. ","url":"https://docs.htmlcsstoimage.com/guides/duplicate-image-detection/","relUrl":"/guides/duplicate-image-detection/"},"38":{"doc":"Duplicate image detection","title":"URL Images","content":"Duplicate image detection is not enabled for images created from a URL. It only works for images generated with the html parameter. ","url":"https://docs.htmlcsstoimage.com/guides/duplicate-image-detection/#url-images","relUrl":"/guides/duplicate-image-detection/#url-images"},"39":{"doc":"Duplicate image detection","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/guides/duplicate-image-detection/#need-help","relUrl":"/guides/duplicate-image-detection/#need-help"},"40":{"doc":"Convert email to images","title":"Convert HTML emails to images","content":"Generate images of full webpages and emails with HTML/CSS to Image. Renders exactly like Google Chrome. Live demo Get an API Key . ","url":"https://docs.htmlcsstoimage.com/guides/convert-emails-images/#convert-html-emails-to-images","relUrl":"/guides/convert-emails-images/#convert-html-emails-to-images"},"41":{"doc":"Convert email to images","title":"Generating images from emails","content":"The API takes your HTML/CSS and runs it inside a real instance of Google Chrome to convert your html into an image. This works great for both HTML emails and full webpages. For more details on how this works, see Creating an image. Try it yourself . ","url":"https://docs.htmlcsstoimage.com/guides/convert-emails-images/#generating-images-from-emails","relUrl":"/guides/convert-emails-images/#generating-images-from-emails"},"42":{"doc":"Convert email to images","title":"Include full <html>","content":"To render a full email or webpage with the API, pass the full HTML markup. Starting and ending with the <html> tags. | The API will enter full page mode and render the entire page as displayed by Google Chrome. | When rendering a full page, be sure to include full paths to all outside assets so that the API is able to download them. Relative paths will not work. | . ","url":"https://docs.htmlcsstoimage.com/guides/convert-emails-images/#include-full-html","relUrl":"/guides/convert-emails-images/#include-full-html"},"43":{"doc":"Convert email to images","title":"Need help?","content":"We’re always looking to improve this documentation. Please send us an email: support@htmlcsstoimage.com. We respond fast. ","url":"https://docs.htmlcsstoimage.com/guides/convert-emails-images/#need-help","relUrl":"/guides/convert-emails-images/#need-help"},"44":{"doc":"Convert email to images","title":"Convert email to images","content":" ","url":"https://docs.htmlcsstoimage.com/guides/convert-emails-images/","relUrl":"/guides/convert-emails-images/"},"45":{"doc":"External CSS, JavaScript & Fonts","title":"External CSS, JavaScript & Fonts","content":"Learn how to include external assets when generating images. The API supports including any CSS file, JavaScript file or custom font. You can do this by including them in your HTML/CSS. Be sure to use the full URL to the asset. We are unable to download relative URLs. ","url":"https://docs.htmlcsstoimage.com/guides/external-css-js-and-fonts/#external-css-javascript--fonts","relUrl":"/guides/external-css-js-and-fonts/#external-css-javascript--fonts"},"46":{"doc":"External CSS, JavaScript & Fonts","title":"External JavaScript Example","content":"To include JavaScript, you can load it in by using a normal script tag in your html. Replace src with the URL to your JavaScript file. <script crossorigin src=\"https://unpkg.com/react@16/umd/react.production.min.js\"></script> . ","url":"https://docs.htmlcsstoimage.com/guides/external-css-js-and-fonts/#external-javascript-example","relUrl":"/guides/external-css-js-and-fonts/#external-javascript-example"},"47":{"doc":"External CSS, JavaScript & Fonts","title":"External CSS Example","content":"For an external CSS file, add it to your HTML with the following. Replace href with the URL to your CSS file. <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/Primer/10.8.1/build.css\" /> . ","url":"https://docs.htmlcsstoimage.com/guides/external-css-js-and-fonts/#external-css-example","relUrl":"/guides/external-css-js-and-fonts/#external-css-example"},"48":{"doc":"External CSS, JavaScript & Fonts","title":"External Font Example","content":"You can load in a custom font using CSS. @font-face {   font-family: \"CustomFont\";   src: url(https://url-to-your-font/FontNameRegular.ttc); } .box {   font-family: \"CustomFont\" } . Your font will need proper CORS headers set for this to work. To test it, visit test-cors.org and paste in your font link. If it does not work, check that you have the following header set on your server. access-control-allow-origin: * . ","url":"https://docs.htmlcsstoimage.com/guides/external-css-js-and-fonts/#external-font-example","relUrl":"/guides/external-css-js-and-fonts/#external-font-example"},"49":{"doc":"External CSS, JavaScript & Fonts","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/guides/external-css-js-and-fonts/#need-help","relUrl":"/guides/external-css-js-and-fonts/#need-help"},"50":{"doc":"External CSS, JavaScript & Fonts","title":"External CSS, JavaScript & Fonts","content":" ","url":"https://docs.htmlcsstoimage.com/guides/external-css-js-and-fonts/","relUrl":"/guides/external-css-js-and-fonts/"},"51":{"doc":"FAQ","title":"Frequently Asked Questions","content":"Not finding your answer here? Please email us: support@htmlcsstoimage.com. We enjoy helping people debug their HTML. . | Is there a rate limit? | Why is my image twice as large as expected? | Can you provide an SLA? | I need to generate a large amount of images one time, which plan should I use? | Can I use external CSS stylesheets? | Can I use external JavaScript? | Can I use my own Font Awesome Pro icons? | How do I render an entire webpage? | How long will my image URL work? | Can I load external images? | How do I upgrade my account? | Do you support Chinese, Japanese and Korean characters? | How much bandwidth can I use? | Can I use the API for a hackathon? | Can I set my images filename? | What version of Google Chrome does HCTI use? | I have other questions, who do I ask? | . ","url":"https://docs.htmlcsstoimage.com/faq/#frequently-asked-questions","relUrl":"/faq/#frequently-asked-questions"},"52":{"doc":"FAQ","title":"Is there a rate limit?","content":"No rate limits here. You’ll be able to create images up until you reach your account limit. ","url":"https://docs.htmlcsstoimage.com/faq/#is-there-a-rate-limit","relUrl":"/faq/#is-there-a-rate-limit"},"53":{"doc":"FAQ","title":"Why is my image twice as large as expected?","content":"By default we render images for high resolution screens. This is known as @2X. This ensures your image looks great on devices like iPhones and high resolution monitors. You can adjust this back to @1X by setting device_scale:1 when creating your image. ","url":"https://docs.htmlcsstoimage.com/faq/#why-is-my-image-twice-as-large-as-expected","relUrl":"/faq/#why-is-my-image-twice-as-large-as-expected"},"54":{"doc":"FAQ","title":"Can you provide an SLA?","content":"Absolutely. All of our enterprise plans include an SLA. Contact us at support@htmlcsstoimage.com and we can build a custom plan for your specific needs. ","url":"https://docs.htmlcsstoimage.com/faq/#can-you-provide-an-sla","relUrl":"/faq/#can-you-provide-an-sla"},"55":{"doc":"FAQ","title":"I need to generate a large amount of images one time, which plan should I use?","content":"If an existing monthly plan does not fit your needs, please email us at: support@htmlcsstoimage.com with the number of images you need to generate. We can send you a one time invoice and credit your account with the number of images you need to generate. ","url":"https://docs.htmlcsstoimage.com/faq/#i-need-to-generate-a-large-amount-of-images-one-time-which-plan-should-i-use","relUrl":"/faq/#i-need-to-generate-a-large-amount-of-images-one-time-which-plan-should-i-use"},"56":{"doc":"FAQ","title":"Can I use external CSS stylesheets?","content":"Yes, embed the link tag in your HTML and it will be loaded on render. Multiple CSS files are supported. Large files may slow down initial render time. See this CodePen for an example. ","url":"https://docs.htmlcsstoimage.com/faq/#can-i-use-external-css-stylesheets","relUrl":"/faq/#can-i-use-external-css-stylesheets"},"57":{"doc":"FAQ","title":"Can I use external JavaScript?","content":"Yes, external JavaScript works. embeE the link tag in your HTML and it will be loaded on render. ","url":"https://docs.htmlcsstoimage.com/faq/#can-i-use-external-javascript","relUrl":"/faq/#can-i-use-external-javascript"},"58":{"doc":"FAQ","title":"Can I use my own Font Awesome Pro icons?","content":"Yes, include the <link> tag to the Font Awesome CDN in your html. You may need to add localhost to your hostname whitelist for us render icons using your account. ","url":"https://docs.htmlcsstoimage.com/faq/#can-i-use-my-own-font-awesome-pro-icons","relUrl":"/faq/#can-i-use-my-own-font-awesome-pro-icons"},"59":{"doc":"FAQ","title":"How do I render an entire webpage?","content":"We recommend passing the url to your webpage to the API. Learn how to do that here: . Alternatively, when passing your HTML to the API, include the full HTML markup. Starting and ending with the <html> tags. The HCTI API will enter full page mode and render the entire page as displayed by Google Chrome. ","url":"https://docs.htmlcsstoimage.com/faq/#how-do-i-render-an-entire-webpage","relUrl":"/faq/#how-do-i-render-an-entire-webpage"},"60":{"doc":"FAQ","title":"How long will my image URL work?","content":"Forever. As long as your HCTI account is active, we keep a copy of your generated image stored and accessible from your image url. ","url":"https://docs.htmlcsstoimage.com/faq/#how-long-will-my-image-url-work","relUrl":"/faq/#how-long-will-my-image-url-work"},"61":{"doc":"FAQ","title":"Can I load external images?","content":"Yes, be sure to include the full URL to your external image. The API will load it before creating the image. <img src=\"https://example.com/yourimage.png\" /> . ","url":"https://docs.htmlcsstoimage.com/faq/#can-i-load-external-images","relUrl":"/faq/#can-i-load-external-images"},"62":{"doc":"FAQ","title":"How do I upgrade my account?","content":"You may change your plan anytime by visiting the Dashboard. ","url":"https://docs.htmlcsstoimage.com/faq/#how-do-i-upgrade-my-account","relUrl":"/faq/#how-do-i-upgrade-my-account"},"63":{"doc":"FAQ","title":"Do you support Chinese, Japanese and Korean characters?","content":"Yes. We have Noto CJK installed in our image renderer. If you find any language/character set that does not render correctly, please send us an email and we’ll get it added for you. ","url":"https://docs.htmlcsstoimage.com/faq/#do-you-support-chinese-japanese-and-korean-characters","relUrl":"/faq/#do-you-support-chinese-japanese-and-korean-characters"},"64":{"doc":"FAQ","title":"How much bandwidth can I use?","content":"All images served by the hcti.io domain are cached by Cloudflare’s global content delivery network. Bandwidth is unlimited and paid for as a part of your subscription. ","url":"https://docs.htmlcsstoimage.com/faq/#how-much-bandwidth-can-i-use","relUrl":"/faq/#how-much-bandwidth-can-i-use"},"65":{"doc":"FAQ","title":"Can I use the API for a hackathon?","content":"Definitely. If you’re a student and using the API to build something cool. Email us and we’d be happy to add free images to your account. ","url":"https://docs.htmlcsstoimage.com/faq/#can-i-use-the-api-for-a-hackathon","relUrl":"/faq/#can-i-use-the-api-for-a-hackathon"},"66":{"doc":"FAQ","title":"Can I set my images filename?","content":"The filename for your image is a randomly generated (and unique!) UUID. We currently do not have the option to set the filename. The v1/image namespace is shared by everyone who uses the API. Auto generating the file names makes your content more secure (hard to guess). We also use these long keys as partition keys for our infrastructure. This helps us scale the API for creating millions of images each month. Using UUID’s helps us keep the service easy to use, fast and secure. Which is important to us. ","url":"https://docs.htmlcsstoimage.com/faq/#can-i-set-my-images-filename","relUrl":"/faq/#can-i-set-my-images-filename"},"67":{"doc":"FAQ","title":"What version of Google Chrome does HCTI use?","content":"We regularly keep HCTI up-to-date with the latest version of Chrome. We run a full test suite to ensure images render as expected before upgrading the API. ","url":"https://docs.htmlcsstoimage.com/faq/#what-version-of-google-chrome-does-hcti-use","relUrl":"/faq/#what-version-of-google-chrome-does-hcti-use"},"68":{"doc":"FAQ","title":"I have other questions, who do I ask?","content":"Email us! support@htmlcsstoimage.com. We’d love to hear from you. We’re great at debugging rendering issues, send us your toughest problems. ","url":"https://docs.htmlcsstoimage.com/faq/#i-have-other-questions-who-do-i-ask","relUrl":"/faq/#i-have-other-questions-who-do-i-ask"},"69":{"doc":"FAQ","title":"FAQ","content":" ","url":"https://docs.htmlcsstoimage.com/faq/","relUrl":"/faq/"},"70":{"doc":"File formats","title":"File formats","content":"Convert images from HTML to jpg, png or webp. ","url":"https://docs.htmlcsstoimage.com/guides/file-formats/","relUrl":"/guides/file-formats/"},"71":{"doc":"File formats","title":"File formats","content":"The API supports jpg, png and webp. If no file extension is passed, you’ll get back a png by default. If you need a different file format, adjust the extension on the url. | Format | Example | . | jpg | https://hcti.io/v1/image/a3ab2ab2-906e-4b5c-a88d-41a1c3f3779e.jpg | . | png | https://hcti.io/v1/image/a3ab2ab2-906e-4b5c-a88d-41a1c3f3779e.png | . | webp | https://hcti.io/v1/image/a3ab2ab2-906e-4b5c-a88d-41a1c3f3779e.webp | . ","url":"https://docs.htmlcsstoimage.com/guides/file-formats/","relUrl":"/guides/file-formats/"},"72":{"doc":"File formats","title":"Automatic next-gen format (WebP) - enabled for all customers","content":"It’s recommend by Google to serve your images in next-gen formats (such as WebP). | Improves your pagespeed | Increases SEO | . Our edge servers will detect the browser being used to download an image. If the browser supports WebP, the image will be served in WebP. | This is enabled for all paid customers. | . ","url":"https://docs.htmlcsstoimage.com/guides/file-formats/#automatic-next-gen-format-webp---enabled-for-all-customers","relUrl":"/guides/file-formats/#automatic-next-gen-format-webp---enabled-for-all-customers"},"73":{"doc":"GoLang","title":"GoLang: HTML/CSS to Image","content":"Generate a png, jpg or webp images with GoLang. Renders exactly like Google Chrome. Live demo Get an API Key . | Generating images with GoLang | Authentication with GoLang | GoLang example code | Need help? | . ","url":"https://docs.htmlcsstoimage.com/example-code/go/#golang-htmlcss-to-image","relUrl":"/example-code/go/#golang-htmlcss-to-image"},"74":{"doc":"GoLang","title":"Generating images with GoLang","content":". | The API takes your HTML/CSS and runs it inside a real instance of Google Chrome to convert your html into an image. | Use GoLang to send the API your HTML/CSS. | You’ll get back json with the URL to your generated image. | . For more details on how this works, see Creating an image. Example API response: . { \"url\": \"https://hcti.io/v1/image/be4c5118-fe19-462b-a49e-48cf72697a9d\" } . ","url":"https://docs.htmlcsstoimage.com/example-code/go/#generating-images-with-golang","relUrl":"/example-code/go/#generating-images-with-golang"},"75":{"doc":"GoLang","title":"Authentication with GoLang","content":"The API uses HTTP Basic authentication. Your username is your User ID and your password is your API Key. Both of these are available from the dashboard. The GoLang code sample demonstrates how to authenticate your request. You can signup for a free API key to get started. Free API Key for GoLang . ","url":"https://docs.htmlcsstoimage.com/example-code/go/#authentication-with-golang","relUrl":"/example-code/go/#authentication-with-golang"},"76":{"doc":"GoLang","title":"GoLang example code","content":"This GoLang code example sends an HTTP POST to the https://hcti.io/v1/image API. Converting your HTML/CSS to an image with GoLang. package main import ( \"bytes\" \"encoding/json\" \"fmt\" \"io/ioutil\" \"log\" \"net/http\" \"time\" ) const ( userID = \"your_user_id\" apiKey = \"your_api_key\" ) func main() { data := map[string]string{ \"html\": \"<div class='ping'>Pong ✅</div>\", \"css\": \".ping { padding: 20px; font-family: 'sans-serif'; }\", } reqBody, err := json.Marshal(data) if err != nil { log.Fatalf(\"unable to marshal data: %s\", err.Error()) } req, err := http.NewRequest(\"POST\", \"https://hcti.io/v1/image\", bytes.NewReader(reqBody)) if err != nil { log.Fatalf(\"unable to create new request: %s\", err.Error()) } req.SetBasicAuth(userID, apiKey) client := &http.Client{Timeout: time.Second * 10} resp, err := client.Do(req) if err != nil { log.Fatalf(\"request was unsuccessful: %s\", err.Error()) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatalf(\"unable to read response body: %s\", err.Error()) } fmt.Println(string(body)) // {\"url\":\"https://hcti.io/v1/image/f1e2762b-1f95-4f99-ab5d-0444b26dfd42\"} } . ","url":"https://docs.htmlcsstoimage.com/example-code/go/#golang-example-code","relUrl":"/example-code/go/#golang-example-code"},"77":{"doc":"GoLang","title":"Need help?","content":"We’re always looking to improve this documentation. Please send us an email: support@htmlcsstoimage.com. We respond fast. ","url":"https://docs.htmlcsstoimage.com/example-code/go/#need-help","relUrl":"/example-code/go/#need-help"},"78":{"doc":"GoLang","title":"GoLang","content":" ","url":"https://docs.htmlcsstoimage.com/example-code/go/","relUrl":"/example-code/go/"},"79":{"doc":"Google Apps Script","title":"Google Apps Script: HTML/CSS to Image","content":"Generate a png, jpg or webp images with Google Apps Script. Live demo Get an API Key . | Generate an image with Google Apps Script | Example code | Need help? | . ","url":"https://docs.htmlcsstoimage.com/example-code/google-apps-script/#google-apps-script-htmlcss-to-image","relUrl":"/example-code/google-apps-script/#google-apps-script-htmlcss-to-image"},"80":{"doc":"Google Apps Script","title":"Generate an image with Google Apps Script","content":"With Google Apps Script, you can build add-ons for Google. It is based on JavaScript, but includes built in functions that you’ll need to use to work with the HTML/CSS to Image API. Our documented JavaScript examples won’t work with GAS. You can make use of the built in UrlFetchApp to generate images with the API. ","url":"https://docs.htmlcsstoimage.com/example-code/google-apps-script/#generate-an-image-with-google-apps-script","relUrl":"/example-code/google-apps-script/#generate-an-image-with-google-apps-script"},"81":{"doc":"Google Apps Script","title":"Example code","content":"This shows you how to authenticate with the API and pass parameters in a POST request. This is passing html/css parameters to the API. You can adapt this sample to pass any parameters or work with any of our endpoints. var formData = { 'html': 'Test', 'css': 'test', }; var options = { 'method' : 'post', 'payload' : formData }; // Replace username with your User ID and password with your API Key options.headers = {\"Authorization\": \"Basic \" + Utilities.base64Encode(username + \":\" + password)}; UrlFetchApp.fetch(\"https://hcti.io/v1/image\", options); . ","url":"https://docs.htmlcsstoimage.com/example-code/google-apps-script/#example-code","relUrl":"/example-code/google-apps-script/#example-code"},"82":{"doc":"Google Apps Script","title":"Need help?","content":"We’re always looking to improve this documentation. Please send us an email: support@htmlcsstoimage.com. We respond fast. ","url":"https://docs.htmlcsstoimage.com/example-code/google-apps-script/#need-help","relUrl":"/example-code/google-apps-script/#need-help"},"83":{"doc":"Google Apps Script","title":"Google Apps Script","content":" ","url":"https://docs.htmlcsstoimage.com/example-code/google-apps-script/","relUrl":"/example-code/google-apps-script/"},"84":{"doc":"Setting height and width","title":"Setting height and width","content":"Learn how to set the height and width for your images with the API. . | Setting height & width in HTML . | Adding margins around the image | . | Setting the Viewport | Understanding high resolution (retina) images | Resize on the fly with query params . | Examples | . | Height and width for print . | A4 paper example | Business card example | . | Need help? | . ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/","relUrl":"/getting-started/setting-height-and-width/"},"85":{"doc":"Setting height and width","title":"Setting height & width in HTML","content":"When sending an HTML snippet to the API it will auto crop your image to the height/width of the outermost HTML element. | The following example will generate a screenshot that is 400px wide and 200px tall. | . Note: This works for HTML snippets only. Full HTML pages (has <html> and <body> tags) will not automatically crop. ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/#setting-height--width-in-html","relUrl":"/getting-started/setting-height-and-width/#setting-height--width-in-html"},"86":{"doc":"Setting height and width","title":"Hello, world","content":"<div style=\"height: 200px; width: 400px; border: 1px solid; text-align: center;\"> <h2>Hello, world</h2> </div> . See how in the code sample we have set the height: 200px; width: 400px; in the outermost div. ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/","relUrl":"/getting-started/setting-height-and-width/"},"87":{"doc":"Setting height and width","title":"Adding margins around the image","content":"Margins are respected by the auto crop. To add some space around your image, you can add margin: 20px to the outermost element. ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/#adding-margins-around-the-image","relUrl":"/getting-started/setting-height-and-width/#adding-margins-around-the-image"},"88":{"doc":"Setting height and width","title":"Height and width example","content":"<div style=\"height: 200px; width: 400px; margin: 20px; border: 1px solid; text-align: center;\"> <h2>Height and width example</h2> </div> . ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/","relUrl":"/getting-started/setting-height-and-width/"},"89":{"doc":"Setting height and width","title":"Setting the Viewport","content":"When rendering your image, we use a live instance of Google Chrome running on one of our servers. In Chrome, the viewport is the total viewable area rendered by the browser. | By default, the viewport is set to: 1366x768. If you use the API to screenshot a url or send a full HTML page, you will get back an image rendered inside the default viewport. | You can customize this by adjusting the viewport_height and viewport_width parameters while creating your image. | We recommend using this for images rendered by url or when sending a full page. HTML snippets are better sized using automatic cropping and height/width in CSS. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/#setting-the-viewport","relUrl":"/getting-started/setting-height-and-width/#setting-the-viewport"},"90":{"doc":"Setting height and width","title":"Understanding high resolution (retina) images","content":"Every device has a DPR (device pixel ratio). Higher quality screens will have a 2x or higher DPR. This means, for crip/clear images, they need 2x or 3x as many pixels as a traditional, lower resolution screen. | We render HTML/CSS images @2X by default. | This results in a high quality image that will work well with any monitor. | When specifying 400px in your HTML, the resulting image will be 800px to account for high resolution screens. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/#understanding-high-resolution-retina-images","relUrl":"/getting-started/setting-height-and-width/#understanding-high-resolution-retina-images"},"91":{"doc":"Setting height and width","title":"Resize on the fly with query params","content":"Every image generated by the API can also be adjusted on the fly with the height and width query params. | This is useful for displaying images at different resolutions without having to setup your own CDN. | When only one param is passed, the API will maintain the aspect ratio of the original image. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/#resize-on-the-fly-with-query-params","relUrl":"/getting-started/setting-height-and-width/#resize-on-the-fly-with-query-params"},"92":{"doc":"Setting height and width","title":"Examples","content":"?width=400 . ?height=300 . ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/#examples","relUrl":"/getting-started/setting-height-and-width/#examples"},"93":{"doc":"Setting height and width","title":"Height and width for print","content":"Images generated by the API can also be used for print. Learn how to convert pixels to DPI (dots per inch). | Inches to pixels Formula:(DPI * (size in inches)) / 2 = pixels | DPI = Dots Per Inch. For a high quality print, you will want 300 DPI. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/#height-and-width-for-print","relUrl":"/getting-started/setting-height-and-width/#height-and-width-for-print"},"94":{"doc":"Setting height and width","title":"A4 paper example","content":"For a 300 DPI print on A4 (8.27 x 11.69 inches) paper, you would do the following: . | Width: (300 * 8.27) / 2 = 1240 pixels | Height: (300 * 11.69) / 2 = 1754 pixels | . ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/#a4-paper-example","relUrl":"/getting-started/setting-height-and-width/#a4-paper-example"},"95":{"doc":"Setting height and width","title":"Business card example","content":"For a 300 DPI business card (3.5 x 2 inches). | Width: (300 * 3.5) / 2 = 525 pixels | Height: (300 * 2) / 2 = 300 pixels | . Once you have determined your height and width in pixels, you can then set your HTML to render the exact size you need. We recommend doing this by adding height and width style parameters to the outermost HTML element in your code. ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/#business-card-example","relUrl":"/getting-started/setting-height-and-width/#business-card-example"},"96":{"doc":"Setting height and width","title":"Need help?","content":"Talk to a human: support@htmlcsstoimage.com. We always respond within 24 hours. And often, even faster. ","url":"https://docs.htmlcsstoimage.com/getting-started/setting-height-and-width/#need-help","relUrl":"/getting-started/setting-height-and-width/#need-help"},"97":{"doc":"Image charts with Highcharts.js","title":"Image charts with Highcharts.js","content":"Learn how to include external assets when generating images. You can generate images of charts using Highcharts.js + the HTML/CSS to Image API. ","url":"https://docs.htmlcsstoimage.com/guides/image-charts-with-highchartsjs/","relUrl":"/guides/image-charts-with-highchartsjs/"},"98":{"doc":"Image charts with Highcharts.js","title":"Example HTML","content":"The HCTI API supports JavaScript. Load in highcharts.js via a script tag in your HTML. <script src=\"https://code.highcharts.com/highcharts.js\"></script> <script src=\"https://code.highcharts.com/modules/series-label.js\"></script> <div id=\"container\"></div> <script> Highcharts.chart('container', { chart: { animation: false }, title: { text: 'Solar Employment Growth by Sector, 2010-2016' }, subtitle: { text: 'Source: thesolarfoundation.com' }, yAxis: { title: { text: 'Number of Employees' } }, legend: { layout: 'vertical', align: 'right', verticalAlign: 'middle' }, plotOptions: { series: { animation: false, label: { connectorAllowed: false }, pointStart: 2010 } }, series: [{ name: 'Installation', data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175] }, { name: 'Manufacturing', data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434] }, { name: 'Sales & Distribution', data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387] }, { name: 'Project Development', data: [null, null, 7988, 12169, 15112, 22452, 34400, 34227] }, { name: 'Other', data: [12908, 5948, 8105, 11248, 8989, 11816, 18274, 18111] }], responsive: { rules: [{ condition: { maxWidth: 500 }, chartOptions: { legend: { layout: 'horizontal', align: 'center', verticalAlign: 'bottom' } } }] } }); </script> . ","url":"https://docs.htmlcsstoimage.com/guides/image-charts-with-highchartsjs/#example-html","relUrl":"/guides/image-charts-with-highchartsjs/#example-html"},"99":{"doc":"Image charts with Highcharts.js","title":"\n\nDisable animations\n","content":"Be sure to disable animation when rendering your chart. Otherwise, you may see a partial render of the chart. ","url":"https://docs.htmlcsstoimage.com/guides/image-charts-with-highchartsjs/","relUrl":"/guides/image-charts-with-highchartsjs/"},"100":{"doc":"Image charts with Highcharts.js","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/guides/image-charts-with-highchartsjs/#need-help","relUrl":"/guides/image-charts-with-highchartsjs/#need-help"},"101":{"doc":"HTML/CSS to Image API","title":"HTML/CSS to Image API","content":"Your search for pixel perfect image generation ends here. Live demo Get an API Key . The API for generating high quality images from HTML/CSS. No yak shaving required. | converts HTML to png, jpg or webp | screenshot any url | no janky fonts, or blurry images | . ","url":"https://docs.htmlcsstoimage.com/","relUrl":"/"},"102":{"doc":"HTML/CSS to Image API","title":"Converting HTML to a png","content":"This image was created using just HTML/CSS and the HCTI API. <div class=\"p-4 text-center mt-4\" style=\"width: 500px\"> <span class=\"tweet-text mb-4\"> This is Little Bear. He tolerates baths because he knows how phenomenal his floof will appear afterwards. 13/10 </span> <div class=\"mt-2 p-4\"> <img src=\"https://docs.htmlcsstoimage.com/assets/images/dog.jpg\" class=\"rounded-circle shadow border mt-4\" width=\"100px\"> </div> <h4 class=\"mt-2\"> WeRateDogs </h4> <span class=\"text-muted\">@dog_rates</span> </div> <!-- Include external CSS, JavaScript or Fonts! --> <link href=\"https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk\" crossorigin=\"anonymous\"> <link href=\"https://fonts.googleapis.com/css2?family=Cabin:wght@700&display=swap\" rel=\"stylesheet\"> . Try it yourself . ","url":"https://docs.htmlcsstoimage.com/#converting-html-to-a-png","relUrl":"/#converting-html-to-a-png"},"103":{"doc":"HTML/CSS to Image API","title":"Quick start example code","content":"To get started quickly, take a look at our example code. | PHP | JavaScript | Ruby | Python | GoLang | C# | Curl | VB.NET | . Prefer #NoCode? We also integrate with Zapier and Integromat. ","url":"https://docs.htmlcsstoimage.com/#quick-start-example-code","relUrl":"/#quick-start-example-code"},"104":{"doc":"HTML/CSS to Image API","title":"\n\nWorks with any language\n","content":"Your favorite language not here? Don’t worry, we work with any language or framework. See the curl example for how to make a request. Email us if you need help getting started. We’d love to add more example code here. ","url":"https://docs.htmlcsstoimage.com/","relUrl":"/"},"105":{"doc":"HTML/CSS to Image API","title":"Image Examples","content":"Your imagination is the only limit. We render HTML/CSS just like Google Chrome. Here are a few examples of ways people have used the API to automate their image generation. ","url":"https://docs.htmlcsstoimage.com/#image-examples","relUrl":"/#image-examples"},"106":{"doc":"HTML/CSS to Image API","title":"Social Images: Dev.to","content":"Dev.to uses the API to autogenerate thousands of custom images for Twitter and Facebook. To see how they do it, take a look at their code (it’s open source!). ","url":"https://docs.htmlcsstoimage.com/#social-images-devto","relUrl":"/#social-images-devto"},"107":{"doc":"HTML/CSS to Image API","title":"Product Hunt Makers Social Cards","content":". Product Hunt uses HTML/CSS to Image to dynamically generate social cards for Maker Goals. Source code for this example on CodePen. ","url":"https://docs.htmlcsstoimage.com/#product-hunt-makers-social-cards","relUrl":"/#product-hunt-makers-social-cards"},"108":{"doc":"HTML/CSS to Image API","title":"Remote Stories Social Cards","content":". Source code for this example on CodePen. ","url":"https://docs.htmlcsstoimage.com/#remote-stories-social-cards","relUrl":"/#remote-stories-social-cards"},"109":{"doc":"HTML/CSS to Image API","title":"Highlighted Text Shots","content":"Generate images from your users comments. Add the ability to highlight and share. Source code for this example on CodePen. ","url":"https://docs.htmlcsstoimage.com/#highlighted-text-shots","relUrl":"/#highlighted-text-shots"},"110":{"doc":"HTML/CSS to Image API","title":"Auto Generated Job Listing","content":"Generate images from job listings for sharing in emails, ads or social media. Source code for this example on CodePen. ","url":"https://docs.htmlcsstoimage.com/#auto-generated-job-listing","relUrl":"/#auto-generated-job-listing"},"111":{"doc":"HTML/CSS to Image API","title":"Full Webpage Screenshots","content":"Pass a URL or entire webpage to the API to generate a full page screenshot. Here we passed stripe.com’s to the API. ","url":"https://docs.htmlcsstoimage.com/#full-webpage-screenshots","relUrl":"/#full-webpage-screenshots"},"112":{"doc":"HTML/CSS to Image API","title":"Screenshot part of a page","content":"Use the selector param to focus on a specific part of a page. ","url":"https://docs.htmlcsstoimage.com/#screenshot-part-of-a-page","relUrl":"/#screenshot-part-of-a-page"},"113":{"doc":"HTML/CSS to Image API","title":"Resize on the Fly","content":"Once an image is generated, use query params to adjust to any size you need with the width and height params. When only one param is passed, the API will maintain the aspect ratio of the original image. ?width=400 . ?height=300 . ","url":"https://docs.htmlcsstoimage.com/#resize-on-the-fly","relUrl":"/#resize-on-the-fly"},"114":{"doc":"HTML/CSS to Image API","title":"Get an API key","content":"To use this API, you’ll first need an API key. You may retrieve one by signing up here. Free API Key API Docs . ","url":"https://docs.htmlcsstoimage.com/#get-an-api-key","relUrl":"/#get-an-api-key"},"115":{"doc":"Integrations","title":"Integrations","content":"Connect the HTML/CSS to Image API to thousands of other services. Live demo Get an API Key . ","url":"https://docs.htmlcsstoimage.com/integrations/","relUrl":"/integrations/"},"116":{"doc":"Example code","title":"Example code","content":"To get started quickly, take a look at our example code for generating images. Live demo Get an API Key . ","url":"https://docs.htmlcsstoimage.com/example-code/","relUrl":"/example-code/"},"117":{"doc":"Getting started","title":"Getting started","content":"Start here to learn how to use the HTML/CSS to Image API. Live demo Get an API Key . ","url":"https://docs.htmlcsstoimage.com/getting-started/","relUrl":"/getting-started/"},"118":{"doc":"Guides","title":"Guides","content":"Use these guides to get started converting images with HTML/CSS to Image. Live demo Get an API Key . ","url":"https://docs.htmlcsstoimage.com/guides/#guides","relUrl":"/guides/#guides"},"119":{"doc":"Guides","title":"Guides","content":". ","url":"https://docs.htmlcsstoimage.com/guides/","relUrl":"/guides/"},"120":{"doc":"Insomnia REST Client","title":"Insomnia: HTML/CSS to Image API","content":"Learn how to use the API to generate an image using Insomnia . ","url":"https://docs.htmlcsstoimage.com/guides/insomnia/#insomnia-htmlcss-to-image-api","relUrl":"/guides/insomnia/#insomnia-htmlcss-to-image-api"},"121":{"doc":"Insomnia REST Client","title":"Insomnia","content":"Insomnia is an HTTP client that is useful for interacting with API’s. Download Insomnia here (Mac OSX only). ","url":"https://docs.htmlcsstoimage.com/guides/insomnia/#insomnia","relUrl":"/guides/insomnia/#insomnia"},"122":{"doc":"Insomnia REST Client","title":"Authorization","content":"First, you’ll want to set authorization to Basic and enter your API_ID and API_KEY from the Dashboard. ","url":"https://docs.htmlcsstoimage.com/guides/insomnia/#authorization","relUrl":"/guides/insomnia/#authorization"},"123":{"doc":"Insomnia REST Client","title":"Passing HTML/CSS","content":"Then, enter your HTML/CSS as parameters for the request. Press send, and you’re done. ","url":"https://docs.htmlcsstoimage.com/guides/insomnia/#passing-htmlcss","relUrl":"/guides/insomnia/#passing-htmlcss"},"124":{"doc":"Insomnia REST Client","title":"Insomnia REST Client","content":" ","url":"https://docs.htmlcsstoimage.com/guides/insomnia/","relUrl":"/guides/insomnia/"},"125":{"doc":"Instagram embed","title":"Convert an Instagram post into an image","content":"Learn how to use the API to generate an image from an Instagram post. ","url":"https://docs.htmlcsstoimage.com/guides/instagram-embed/#convert-an-instagram-post-into-an-image","relUrl":"/guides/instagram-embed/#convert-an-instagram-post-into-an-image"},"126":{"doc":"Instagram embed","title":"How it works","content":"To generate a screenshot of an Instagram post, you can make use of the Instagram embed API. You can generate this code yourself by viewing an Instagram post in a web browser. Clicking the top right hamburger menu, and then “Embed”. ","url":"https://docs.htmlcsstoimage.com/guides/instagram-embed/#how-it-works","relUrl":"/guides/instagram-embed/#how-it-works"},"127":{"doc":"Instagram embed","title":"Example code","content":"Copy this example, and swap out the href to create an image of any post you’d like. HTML . <script src=\"https://platform.instagram.com/en_US/embeds.js\"></script> <blockquote style=\"width:600px;\" class=\"instagram-media\" data-instgrm-version=\"7\" > <!-- replace this href with the link to the post --> <a href=\"https://www.instagram.com/p/B2EkgKalrO6/\"></a> </blockquote> . Try it yourself . ","url":"https://docs.htmlcsstoimage.com/guides/instagram-embed/#example-code","relUrl":"/guides/instagram-embed/#example-code"},"128":{"doc":"Instagram embed","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/guides/instagram-embed/#need-help","relUrl":"/guides/instagram-embed/#need-help"},"129":{"doc":"Instagram embed","title":"Instagram embed","content":" ","url":"https://docs.htmlcsstoimage.com/guides/instagram-embed/","relUrl":"/guides/instagram-embed/"},"130":{"doc":"Integromat integration","title":"Integromat: HTML/CSS to Image","content":"Generate images on Integromat with HTML/CSS to Image. Renders exactly like Google Chrome. Integromat integration Get an API Key . Connect HTML/CSS to Image with thousands of integrations on Integromat. ","url":"https://docs.htmlcsstoimage.com/integrations/integromat/#integromat-htmlcss-to-image","relUrl":"/integrations/integromat/#integromat-htmlcss-to-image"},"131":{"doc":"Integromat integration","title":"Available Actions","content":"Our Integromat integration includes four actions. | Create an Image with HTML/CSS | Create a Screenshot of a URL | Get an Image | Make an API Call | . To learn about all the parameters available, see Using the API. ","url":"https://docs.htmlcsstoimage.com/integrations/integromat/#available-actions","relUrl":"/integrations/integromat/#available-actions"},"132":{"doc":"Integromat integration","title":"Example scenarios","content":"Use one of our pre-defined scenarios to get started quickly with Integromat + HTML/CSS to Image. | Take a screenshot of a webpage and send it to Telegram | Generate an HTML/CSS Invoice from new Google Sheets rows | Generate an image from Tweets via HTML/CSS and share it on Discord | . ","url":"https://docs.htmlcsstoimage.com/integrations/integromat/#example-scenarios","relUrl":"/integrations/integromat/#example-scenarios"},"133":{"doc":"Integromat integration","title":"Authentication","content":"When connecting the integration to your account, you can retrieve your User ID and API Key from the dashboard. Get your free API Key . ","url":"https://docs.htmlcsstoimage.com/integrations/integromat/#authentication","relUrl":"/integrations/integromat/#authentication"},"134":{"doc":"Integromat integration","title":"Need help?","content":"Talk to a human: support@htmlcsstoimage.com. We always respond within 24 hours. And often, even faster. ","url":"https://docs.htmlcsstoimage.com/integrations/integromat/#need-help","relUrl":"/integrations/integromat/#need-help"},"135":{"doc":"Integromat integration","title":"Integromat integration","content":" ","url":"https://docs.htmlcsstoimage.com/integrations/integromat/","relUrl":"/integrations/integromat/"},"136":{"doc":"JavaScript","title":"JavaScript: HTML/CSS to Image","content":"Generate a png, jpg or webp images with JavaScript. Renders exactly like Google Chrome. Live demo Get an API Key . | Generating images with JavaScript | Authentication with JavaScript | JavaScript example code | JavaScript example - async/await | Plain JavaScript (Node.js) example | Client side JavaScript example with Fetch API | Need help? | . ","url":"https://docs.htmlcsstoimage.com/example-code/javascript/#javascript-htmlcss-to-image","relUrl":"/example-code/javascript/#javascript-htmlcss-to-image"},"137":{"doc":"JavaScript","title":"Generating images with JavaScript","content":". | The API takes your HTML/CSS and runs it inside a real instance of Google Chrome to convert your html into an image. | Use JavaScript to send the API your HTML/CSS. | You’ll get back json with the URL to your generated image. | . For more details on how this works, see Creating an image. Example API response: . { \"url\": \"https://hcti.io/v1/image/be4c5118-fe19-462b-a49e-48cf72697a9d\" } . ","url":"https://docs.htmlcsstoimage.com/example-code/javascript/#generating-images-with-javascript","relUrl":"/example-code/javascript/#generating-images-with-javascript"},"138":{"doc":"JavaScript","title":"Authentication with JavaScript","content":"The API uses HTTP Basic authentication. Your username is your User ID and your password is your API Key. Both of these are available from the dashboard. The JavaScript code sample demonstrates how to authenticate your request. You can signup for a free API key to get started. Free API Key for JavaScript . ","url":"https://docs.htmlcsstoimage.com/example-code/javascript/#authentication-with-javascript","relUrl":"/example-code/javascript/#authentication-with-javascript"},"139":{"doc":"JavaScript","title":"JavaScript example code","content":"This JavaScript code example sends an HTTP POST to the https://hcti.io/v1/image API. Converting your HTML/CSS to an image with JavaScript. This example uses the Request client. Install with npm install request. const request = require('request') // Define your HTML/CSS const data = { html: \"<div class='box'>JavaScript ✅</div>\", css: \".box { border: 4px solid #03B875; padding: 20px; font-family: 'Roboto'; }\", google_fonts: \"Roboto\" } // Create an image by sending a POST to the API. // Retrieve your api_id and api_key from the Dashboard. https://htmlcsstoimage.com/dashboard request.post({ url: 'https://hcti.io/v1/image', form: data}) .auth(API_ID, API_KEY) .on('data', function(data) { console.log(JSON.parse(data)) }) // {\"url\": \"https://hcti.io/v1/image/1113184e-419f-49f1-b231-2069942a186f\"} . To see all of the available parameters, see: Creating an image. ","url":"https://docs.htmlcsstoimage.com/example-code/javascript/#javascript-example-code","relUrl":"/example-code/javascript/#javascript-example-code"},"140":{"doc":"JavaScript","title":"\n\nCan I use this in a browser?\n","content":"We recommend only using the API server-side. This is important because it keeps your API key secret. If you expose them in the browser, they can be used by anyone. ","url":"https://docs.htmlcsstoimage.com/example-code/javascript/","relUrl":"/example-code/javascript/"},"141":{"doc":"JavaScript","title":"JavaScript example - async/await","content":"If your code supports async/await, we recommend using the following. This example uses the Request promise client. Install with npm install request-promise. require('request') const request = require('request-promise') // Define your HTML/CSS const data = { html: \"<div class='box'>JavaScript ✅</div>\", css: \".box { border: 4px solid #03B875; padding: 20px; font-family: 'Roboto'; }\", google_fonts: \"Roboto\" } // Create an image by sending a POST to the API. // Retrieve your api_id and api_key from the Dashboard. https://htmlcsstoimage.com/dashboard const image = await request .post({ url: 'https://hcti.io/v1/image', form: data}) .auth(API_ID, API_KEY) const { url } = JSON.parse(image) // {\"url\": \"https://hcti.io/v1/image/1113184e-419f-49f1-b231-2069942a186f\"} . ","url":"https://docs.htmlcsstoimage.com/example-code/javascript/#javascript-example---asyncawait","relUrl":"/example-code/javascript/#javascript-example---asyncawait"},"142":{"doc":"JavaScript","title":"Plain JavaScript (Node.js) example","content":"If you prefer not to install an HTTP library for making the request. This example shows you how to use the API without any dependencies. const https = require('https') const data = JSON.stringify({ html: \"<div class='box'>JavaScript ✅</div>\", css: \".box { border: 4px solid #03B875; padding: 20px; font-family: 'Roboto'; }\", google_fonts: \"Roboto\" }) // Retrieve your api_id and api_key from the Dashboard. https://htmlcsstoimage.com/dashboard const apiId = \"your-api-id\" const apiKey = \"your-api-key\" const options = { hostname: 'hcti.io', port: 443, path: '/v1/image', method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Basic ' + new Buffer(apiId + ':' + apiKey).toString('base64') } } const req = https.request(options, (res) => { console.log(`statusCode: ${res.statusCode}`) res.on('data', (d) => { const image = JSON.parse(d) console.log(image[\"url\"]) }) }) req.on('error', (error) => { console.error(error) }) req.write(data) req.end() . ","url":"https://docs.htmlcsstoimage.com/example-code/javascript/#plain-javascript-nodejs-example","relUrl":"/example-code/javascript/#plain-javascript-nodejs-example"},"143":{"doc":"JavaScript","title":"Client side JavaScript example with Fetch API","content":". | Use the Fetch API to make an HTTP POST request to the API | Supported by modern browsers | Recommended for internal applications only to keep your API key safe | . const json = { html: \"<div class='test'>Hello, world!</div>\", css: \".test { background-color: green; }\" }; const username = \"user-id\"; const password = \"api-key\"; const options = { method: 'POST', body: JSON.stringify(json), headers: { 'Content-Type': 'application/json', 'Authorization': 'Basic ' + btoa(username + \":\" + password) } } fetch('https://hcti.io/v1/image', options) .then(res => { if (res.ok) { return res.json(); } else { return Promise.reject(res.status); } }) .then(data => { // Image URL is available here console.log(data.url) }) .catch(err => console.error(err)); . ","url":"https://docs.htmlcsstoimage.com/example-code/javascript/#client-side-javascript-example-with-fetch-api","relUrl":"/example-code/javascript/#client-side-javascript-example-with-fetch-api"},"144":{"doc":"JavaScript","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/example-code/javascript/#need-help","relUrl":"/example-code/javascript/#need-help"},"145":{"doc":"JavaScript","title":"JavaScript","content":" ","url":"https://docs.htmlcsstoimage.com/example-code/javascript/","relUrl":"/example-code/javascript/"},"146":{"doc":"PHP","title":"PHP: HTML/CSS to Image","content":"Generate a png, jpg or webp images with PHP. Renders exactly like Google Chrome. Live demo Get an API Key . | Generating images with PHP | Authentication with PHP | PHP example code | PHP example with Guzzle library | Need help? | . ","url":"https://docs.htmlcsstoimage.com/example-code/php/#php-htmlcss-to-image","relUrl":"/example-code/php/#php-htmlcss-to-image"},"147":{"doc":"PHP","title":"Generating images with PHP","content":". | The API takes your HTML/CSS and runs it inside a real instance of Google Chrome to convert your html into an image. | Use PHP to send the API your HTML/CSS. | You’ll get back json with the URL to your generated image. | . For more details on how this works, see Creating an image. Example API response: . { \"url\": \"https://hcti.io/v1/image/be4c5118-fe19-462b-a49e-48cf72697a9d\" } . ","url":"https://docs.htmlcsstoimage.com/example-code/php/#generating-images-with-php","relUrl":"/example-code/php/#generating-images-with-php"},"148":{"doc":"PHP","title":"Authentication with PHP","content":"The API uses HTTP Basic authentication. Your username is your User ID and your password is your API Key. Both of these are available from the dashboard. The PHP code sample demonstrates how to authenticate your request. You can signup for a free API key to get started. Free API Key for PHP . ","url":"https://docs.htmlcsstoimage.com/example-code/php/#authentication-with-php","relUrl":"/example-code/php/#authentication-with-php"},"149":{"doc":"PHP","title":"PHP example code","content":"This PHP code example sends an HTTP POST to the https://hcti.io/v1/image API. Converting your HTML/CSS to an image with PHP. <?php $html = <<<EOD <div class='box'> Generated from PHP ✅ </div> EOD; $css = <<<EOD .box { border: 4px solid #03B875; padding: 20px; font-family: 'Roboto'; } EOD; $google_fonts = \"Roboto\"; $data = array('html'=>$html, 'css'=>$css, 'google_fonts'=>$google_fonts); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, \"https://hcti.io/v1/image\"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_POST, 1); // Retrieve your user_id and api_key from https://htmlcsstoimage.com/dashboard curl_setopt($ch, CURLOPT_USERPWD, \"user_id\" . \":\" . \"api_key\"); $headers = array(); $headers[] = \"Content-Type: application/x-www-form-urlencoded\"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } curl_close ($ch); $res = json_decode($result,true); echo $res['url']; // https://hcti.io/v1/image/202dc04d-5efc-482e-8f92-bb51612c84cf ?> . ","url":"https://docs.htmlcsstoimage.com/example-code/php/#php-example-code","relUrl":"/example-code/php/#php-example-code"},"150":{"doc":"PHP","title":"PHP example with Guzzle library","content":"Using an HTTP library such as Guzzle can simplify your code even further. Here’s an example of how to use the HTML/CSS to Image API with Guzzle. Installation instructions for Guzzle are here. <?php require 'vendor/autoload.php'; $html = \"<div class='ping'>Pong ✅</div>\"; $css = \".ping { padding: 20px; font-family: 'sans-serif'; }\"; $client = new GuzzleHttpClient(); // Retrieve your user_id and api_key from https://htmlcsstoimage.com/dashboard $res = $client->request('POST', 'https://hcti.io/v1/image', [ 'auth' => ['user_id', 'api_key'], 'form_params' => ['html' => $html, 'css' => $css] ]); echo $res->getBody(); // {\"url\":\"https://hcti.io/v1/image/5803a3f0-abd3-4f56-9e6c-3823d7466ed6\"} ?> . The code turns out to be a bit more readable and less complex when using Guzzle. A great option if you’re open to adding the library to your project. ","url":"https://docs.htmlcsstoimage.com/example-code/php/#php-example-with-guzzle-library","relUrl":"/example-code/php/#php-example-with-guzzle-library"},"151":{"doc":"PHP","title":"Need help?","content":"We’re always looking to improve this documentation. Please send us an email: support@htmlcsstoimage.com. We respond fast. ","url":"https://docs.htmlcsstoimage.com/example-code/php/#need-help","relUrl":"/example-code/php/#need-help"},"152":{"doc":"PHP","title":"PHP","content":" ","url":"https://docs.htmlcsstoimage.com/example-code/php/","relUrl":"/example-code/php/"},"153":{"doc":"Postman","title":"Postman: HTML/CSS to Image API","content":"Learn how to use the API to generate an image using Postman . ","url":"https://docs.htmlcsstoimage.com/guides/postman/#postman-htmlcss-to-image-api","relUrl":"/guides/postman/#postman-htmlcss-to-image-api"},"154":{"doc":"Postman","title":"Postman","content":"Postman is an HTTP client that is useful for testing out API’s. Download Postman from https://www.getpostman.com/. ","url":"https://docs.htmlcsstoimage.com/guides/postman/","relUrl":"/guides/postman/"},"155":{"doc":"Postman","title":"URL","content":"For creating an image, create a new POST request to https://hcti.io/v1/image. ","url":"https://docs.htmlcsstoimage.com/guides/postman/#url","relUrl":"/guides/postman/#url"},"156":{"doc":"Postman","title":"Authorization","content":"Go to the Authorization tab, select “Basic Auth” and enter your User ID and API Key (available from your Dashboard). ","url":"https://docs.htmlcsstoimage.com/guides/postman/#authorization","relUrl":"/guides/postman/#authorization"},"157":{"doc":"Postman","title":"Set HTML/CSS","content":"Go to “Body” and click “form-data”. Then enter your HTML/CSS. ","url":"https://docs.htmlcsstoimage.com/guides/postman/#set-htmlcss","relUrl":"/guides/postman/#set-htmlcss"},"158":{"doc":"Postman","title":"Done","content":"Press send and you’ll get back the URL to your generated image. ","url":"https://docs.htmlcsstoimage.com/guides/postman/#done","relUrl":"/guides/postman/#done"},"159":{"doc":"Python","title":"Python: HTML/CSS to Image","content":"Generate a png, jpg or webp images with Python. Renders exactly like Google Chrome. Live demo Get an API Key . | Generating images with Python | Authentication with Python | Python example code | Need help? | . ","url":"https://docs.htmlcsstoimage.com/example-code/python/#python-htmlcss-to-image","relUrl":"/example-code/python/#python-htmlcss-to-image"},"160":{"doc":"Python","title":"Generating images with Python","content":". | The API takes your HTML/CSS and runs it inside a real instance of Google Chrome to convert your html into an image. | Use Python to send the API your HTML/CSS. | You’ll get back json with the URL to your generated image. | . For more details on how this works, see Creating an image. Example API response: . { \"url\": \"https://hcti.io/v1/image/be4c5118-fe19-462b-a49e-48cf72697a9d\" } . ","url":"https://docs.htmlcsstoimage.com/example-code/python/#generating-images-with-python","relUrl":"/example-code/python/#generating-images-with-python"},"161":{"doc":"Python","title":"Authentication with Python","content":"The API uses HTTP Basic authentication. Your username is your User ID and your password is your API Key. Both of these are available from the dashboard. The Python code sample demonstrates how to authenticate your request. You can signup for a free API key to get started. Free API Key for Python . ","url":"https://docs.htmlcsstoimage.com/example-code/python/#authentication-with-python","relUrl":"/example-code/python/#authentication-with-python"},"162":{"doc":"Python","title":"Python example code","content":"This Python code example sends an HTTP POST to the https://hcti.io/v1/image API. Converting your HTML/CSS to an image with Python. # pip3 install requests import requests HCTI_API_ENDPOINT = \"https://hcti.io/v1/image\" # Retrieve these from https://htmlcsstoimage.com/dashboard HCTI_API_USER_ID = 'your-user-id' HCTI_API_KEY = 'your-api-key' data = { 'html': \"<div class='box'>Hello, world!</div>\", 'css': \".box { color: white; background-color: #0f79b9; padding: 10px; font-family: Roboto }\", 'google_fonts': \"Roboto\" } image = requests.post(url = HCTI_API_ENDPOINT, data = data, auth=(HCTI_API_USER_ID, HCTI_API_KEY)) print(\"Your image URL is: %s\"%image.json()['url']) # https://hcti.io/v1/image/7ed741b8-f012-431e-8282-7eedb9910b32 . ","url":"https://docs.htmlcsstoimage.com/example-code/python/#python-example-code","relUrl":"/example-code/python/#python-example-code"},"163":{"doc":"Python","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/example-code/python/#need-help","relUrl":"/example-code/python/#need-help"},"164":{"doc":"Python","title":"Python","content":" ","url":"https://docs.htmlcsstoimage.com/example-code/python/","relUrl":"/example-code/python/"},"165":{"doc":"Render when ready","title":"Render when ready","content":"Control exactly when your image gets rendered. The render_when_ready parameter allows you total control over when the API generates the image for you. Set the parameter to true and the API will wait to generate the screenshot until it sees an element on the page with the ID HCTIReadyNow. to call the JavaScript function ScreenShotReady() before it generates the image. ","url":"https://docs.htmlcsstoimage.com/guides/render-when-ready/","relUrl":"/guides/render-when-ready/"},"166":{"doc":"Render when ready","title":"JavaScript Helper","content":"For images generated with HTML/CSS (this does not work for URL to Image, we have added a helper function ScreenshotReady(). Once ScreenshotReady() is called, an element with HCTIReadyNow will be added to the page. This will trigger the API to generate the image. <div>Hello, world.</div> <script> setTimeout(function(){ ScreenshotReady() }, 2000); </script> . This will call ScreenshotReady() after 2 seconds. Delaying the API from generating the image. ","url":"https://docs.htmlcsstoimage.com/guides/render-when-ready/#javascript-helper","relUrl":"/guides/render-when-ready/#javascript-helper"},"167":{"doc":"Render when ready","title":"Using with URL to Image","content":"When using URL to Image, you can trigger the rendering of the image by placing an element on the page with the ID HCTIReadyNow. The JavaScript helper is not avilable for URL to Image, since we do not have full control over the page. ","url":"https://docs.htmlcsstoimage.com/guides/render-when-ready/#using-with-url-to-image","relUrl":"/guides/render-when-ready/#using-with-url-to-image"},"168":{"doc":"Render when ready","title":"When to use this","content":"This parameter is most useful for images with complex JavaScript and you need the image generated at a specific time. For most images, this will not be needed and the API will automatically take the image once all of the HTML is done loading. Alternatively, the ms_delay parameter could be useful to you. It allows you to set a specific amount of time before the image is generated. ","url":"https://docs.htmlcsstoimage.com/guides/render-when-ready/#when-to-use-this","relUrl":"/guides/render-when-ready/#when-to-use-this"},"169":{"doc":"Render when ready","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/guides/render-when-ready/#need-help","relUrl":"/guides/render-when-ready/#need-help"},"170":{"doc":"Rendering emoji","title":"Rendering Emoji","content":"Emoji rendering is built in and handled automatically for you. ","url":"https://docs.htmlcsstoimage.com/guides/rendering-emoji/#rendering-emoji","relUrl":"/guides/rendering-emoji/#rendering-emoji"},"171":{"doc":"Rendering emoji","title":"How it works","content":"Emoji’s are automatically replaced with images for consistent and clear rendering. This is enabled for you by default. ","url":"https://docs.htmlcsstoimage.com/guides/rendering-emoji/#how-it-works","relUrl":"/guides/rendering-emoji/#how-it-works"},"172":{"doc":"Rendering emoji","title":"emoji class","content":"Each image has an emojiclass added to it on render. This makes it easy to tweak their display. Here is the default CSS we apply to all emoji. To make tweaks, adjust it and include it in your CSS to override the defaults. /* Take advantage of the built in 'emoji' class to modify the display of emoji */ img.emoji { height: 2em; width: 2em; margin: 0 .05em 0 .1em; } . ","url":"https://docs.htmlcsstoimage.com/guides/rendering-emoji/#emoji-class","relUrl":"/guides/rendering-emoji/#emoji-class"},"173":{"doc":"Rendering emoji","title":"Rendering emoji","content":" ","url":"https://docs.htmlcsstoimage.com/guides/rendering-emoji/","relUrl":"/guides/rendering-emoji/"},"174":{"doc":"Ruby","title":"Ruby: HTML/CSS to Image","content":"Generate a png, jpg or webp images with Ruby. Renders exactly like Google Chrome. Live demo Get an API Key . | Generating images with Ruby | Ruby Example Code | Example with HTTParty | Ruby on Rails example with caching . | Rendering a Rails view | . | Need help? | . ","url":"https://docs.htmlcsstoimage.com/example-code/ruby/#ruby-htmlcss-to-image","relUrl":"/example-code/ruby/#ruby-htmlcss-to-image"},"175":{"doc":"Ruby","title":"Generating images with Ruby","content":"The API takes your HTML/CSS and runs it inside a real instance of Google Chrome to convert your html into an image. Use Ruby to send the API your HTML/CSS. You’ll get back the URL to your generated image. For more details on how this works, see Creating an image. ","url":"https://docs.htmlcsstoimage.com/example-code/ruby/#generating-images-with-ruby","relUrl":"/example-code/ruby/#generating-images-with-ruby"},"176":{"doc":"Ruby","title":"Ruby Example Code","content":"Use the HTML/CSS to Image Ruby client to interact with the API. Add this line to your application’s Gemfile: . gem 'htmlcsstoimage-api' . Initializing the API client . require \"htmlcsstoimage\" # Retrieve your user id and api key from https://htmlcsstoimage.com/dashboard client = HTMLCSSToImage.new(user_id: \"user-id\", api_key: \"api-key\") . Alternatively, you can set ENV[\"HCTI_USER_ID\"] and ENV[\"HCTI_API_KEY\"]. These will be loaded automatically. client = HTMLCSSToImage.new . Creating an image . image = client.create_image(\"<div>Hello, world</div>\", css: \"div { background-color: red; font-family: Roboto; }\", google_fonts: \"Roboto\") image => #<HTMLCSSToImage::ApiResponse url=\"https://hcti.io/v1/image/254b444c-dd82-4cc1-94ef-aa4b3a6870a6\", id=\"254b444c-dd82-4cc1-94ef-aa4b3a6870a6\"> image.url => \"https://hcti.io/v1/image/254b444c-dd82-4cc1-94ef-aa4b3a6870a6\" . To see additional methods available with the Ruby gem, see the documentation here. ","url":"https://docs.htmlcsstoimage.com/example-code/ruby/#ruby-example-code","relUrl":"/example-code/ruby/#ruby-example-code"},"177":{"doc":"Ruby","title":"Example with HTTParty","content":"This example uses the HTTParty gem. Install with gem install httparty, or add it to your Gemfile. require \"httparty\" # Retrieve your user id and api key from the Dashboard auth = { username: 'user_id', password: 'api_key' } html = \"<div class='ping'>Pong ✅</div>\" css = \".ping { padding: 20px; font-family: 'sans-serif'; }\" image = HTTParty.post(\"https://hcti.io/v1/image\", body: { html: html, css: css }, basic_auth: auth) # => {\"url\"=>\"https://hcti.io/v1/image/bde7d5bf-f7bb-49d9-b931-74e5512b8738\"} . ","url":"https://docs.htmlcsstoimage.com/example-code/ruby/#example-with-httparty","relUrl":"/example-code/ruby/#example-with-httparty"},"178":{"doc":"Ruby","title":"Ruby on Rails example with caching","content":"This example uses Rails built in caching. | The cache key is a SHA of your html/css and google fonts. | You’ll only generate a unique image once. | If your HTML changes at all, a new image will be created. Subsequent calls using the same HTML/CSS parameters will return the cached URL rather than creating a new image. | . require \"htmlcsstoimage\" def self.fetch_url(html:, css: nil, google_fonts: nil) cache_key = \"htmlcssimage/#{html}/#{css}/#{google_fonts}\" cached_url = Rails.cache.read(cache_key) return cached_url if cached_url.present? client = HTMLCSSToImage.new image = client.create_image(html: html, css: css, google_fonts: google_fonts) if image.success? Rails.cache.write(cache_key, image.url, expires_in: CACHE_EXPIRATION) end image.url end . ","url":"https://docs.htmlcsstoimage.com/example-code/ruby/#ruby-on-rails-example-with-caching","relUrl":"/example-code/ruby/#ruby-on-rails-example-with-caching"},"179":{"doc":"Ruby","title":"Rendering a Rails view","content":"This can be useful from within a controller. To render a view from Rails and pass it to the API, use render_to_string from within a controller action. With this, you can create an image from a template and redirects the user to the image. html = render_to_string(\"path/to/view\", formats: :html, layout: false) redirect_to fetch_url(html: html, google_fonts: \"Roboto|Roboto+Condensed\"), status: :found . ","url":"https://docs.htmlcsstoimage.com/example-code/ruby/#rendering-a-rails-view","relUrl":"/example-code/ruby/#rendering-a-rails-view"},"180":{"doc":"Ruby","title":"\n\nReal world example\n","content":"Take a look at dev.to’s source code to see how they implemented this for generating social cards. Code on GitHub. ","url":"https://docs.htmlcsstoimage.com/example-code/ruby/","relUrl":"/example-code/ruby/"},"181":{"doc":"Ruby","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/example-code/ruby/#need-help","relUrl":"/example-code/ruby/#need-help"},"182":{"doc":"Ruby","title":"Ruby","content":" ","url":"https://docs.htmlcsstoimage.com/example-code/ruby/","relUrl":"/example-code/ruby/"},"183":{"doc":"Image Templates","title":"Image Templates","content":"Create re-usable templates to make image generation easy. Get an API Key . | What are Templates? . | Handlebars variables | Common usecases | Example | . | Creating a Template . | Parameters | Additional parameters | Example responses | . | Editing a Template . | Parameters | Additional parameters | . | Creating an image with a template . | Parameters | . | Listing your templates . | Example responses | . | Listing your template versions . | Example responses | . | Need help? | . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/","relUrl":"/getting-started/templates/"},"184":{"doc":"Image Templates","title":"What are Templates?","content":"A template allows you to define HTML that includes variables to be substituted at the time of image creation. ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#what-are-templates","relUrl":"/getting-started/templates/#what-are-templates"},"185":{"doc":"Image Templates","title":"Handlebars variables","content":"Templates support handlebars variables. This allows you to place {{title_text}} in your HTML. Then have that replaced with any value you’d like while creating your image. ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#handlebars-variables","relUrl":"/getting-started/templates/#handlebars-variables"},"186":{"doc":"Image Templates","title":"Common usecases","content":". | Define a reusable template, then pass variables to it to generate unique images. | Create images using signed urls in a GET request (no need to POST and store the URL). | Useful for social sharing images. Such as og:image or twitter:image. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#common-usecases","relUrl":"/getting-started/templates/#common-usecases"},"187":{"doc":"Image Templates","title":"Example","content":"This image was generated with a template. { \"text\": \"With templates, you can use variables to replace parts of your image.\", \"avatar_url\": \"https://avataaars.io/?avatarStyle=Transparent&topType=ShortHairDreads01&accessoriesType=Round&hairColor=BrownDark&facialHairType=BeardLight&facialHairColor=BrownDark&clotheType=BlazerShirt&eyeType=Happy&eyebrowType=DefaultNatural&mouthType=Eating&skinColor=Brown\", \"name\": \"Freddy\", \"username\": \"@freddy\", } . HTML: . <div class=\"p-4 text-center mt-4\" style=\"width: 500px\"> <span class=\"tweet-text mb-4\"> {{text}} </span> <div class=\"mt-2 p-4\"> <img src=\"{{avatar_url}}\" class=\"rounded-circle shadow border mt-4\" width=\"100px\"> </div> <h4 class=\"mt-2\"> {{name}} </h4> <span class=\"text-muted\">{{username}}</span> </div> . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#example","relUrl":"/getting-started/templates/#example"},"188":{"doc":"Image Templates","title":"Creating a Template","content":"To generate a template, make an HTTP request to the API. post https://hcti.io/v1/template . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#creating-a-template","relUrl":"/getting-started/templates/#creating-a-template"},"189":{"doc":"Image Templates","title":"Parameters","content":"The create template endpoint accepts the following parameters. Accepted as either json or formdata. | Name | Type | Description | . | html* | String | This is the HTML you want to render. You can send an HTML snippet (<div>Your content</div>) or an entire webpage. | . | css | String | The CSS for your image. | . | name | String | A short name to identify your template max length 64 | . | description | String | Description to elaborate on the use of your template max length 1024 | . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#parameters","relUrl":"/getting-started/templates/#parameters"},"190":{"doc":"Image Templates","title":"\n\nRequired params\n","content":"For creating a template, html is required while css is optional. name and description are optional, but may be useful to help you differentiate your templates in the future. ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/","relUrl":"/getting-started/templates/"},"191":{"doc":"Image Templates","title":"Additional parameters","content":"Optional parameters for greater control over your image. | Name | Type | Description | . | google_fonts | String | Google fonts to be loaded. Example: Roboto. Multiple fonts can be loaded like this: Roboto|Open Sans | . | selector | String | A CSS selector for an element on the webpage. We’ll crop the image to this specific element. For example: section#complete-toolkit.container-lg | . | ms_delay | Integer | The number of milliseconds the API should delay before generating the image. This is useful when waiting for JavaScript. We recommend starting with 500. Large values slow down the initial render time. | . | device_scale | Double | This adjusts the pixel ratio for the screenshot. Minimum: 1, Maximum: 3. | . | viewport_width | Integer | Set the width of Chrome’s viewport. This will disable automatic cropping. Both height and width parameters must be set if using either. | . | viewport_height | Integer | Set the height of Chrome’s viewport. This will disable automatic cropping. Both height and width parameters must be set if using either. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#additional-parameters","relUrl":"/getting-started/templates/#additional-parameters"},"192":{"doc":"Image Templates","title":"Example responses","content":"STATUS: 201 CREATED . { \"template_id\": \"t-b0354248-e7f6-4cca-81c6-2b4a70a16388\", \"template_version\": 1594409399761 } . STATUS: 400 BAD REQUEST . { \"error\": \"Bad Request\", \"statusCode\": 400, \"message\": \"HTML is Required\" } . STATUS: 429 TOO MANY REQUESTS . { \"error\": \"Plan limit exceeded\", \"statusCode\": 429, \"message\": \"The tryit plan is limited to 1 template\" } . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#example-responses","relUrl":"/getting-started/templates/#example-responses"},"193":{"doc":"Image Templates","title":"\n\nPlan Limits\n","content":"Free plans can create 1 template. Paid plans can create 1,000. You can edit your existing templates an unlimited number of times. ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/","relUrl":"/getting-started/templates/"},"194":{"doc":"Image Templates","title":"Editing a Template","content":"To edit a template you’ve already made, make an HTTP request to the API with the template_id listed in the CREATE response. post https://hcti.io/v1/template/:template_id . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#editing-a-template","relUrl":"/getting-started/templates/#editing-a-template"},"195":{"doc":"Image Templates","title":"Parameters","content":"The edit template endpoint accepts the following parameters. Accepted as either json or formdata. | Name | Type | Description | . | html* | String | This is the HTML you want to render. You can send an HTML snippet (<div>Your content</div>) or an entire webpage. | . | css | String | The CSS for your image. | . | name | String | A short name to identify your template max length 64 | . | description | String | Description to elaborate on the use of your template max length 1024 | . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#parameters-1","relUrl":"/getting-started/templates/#parameters-1"},"196":{"doc":"Image Templates","title":"\n\nRequired params\n","content":"For creating a template, html is required while css is optional. name and description are optional, but may be useful to help you differentiate your templates in the future. ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/","relUrl":"/getting-started/templates/"},"197":{"doc":"Image Templates","title":"Additional parameters","content":"Optional parameters for greater control over your image. | Name | Type | Description | . | google_fonts | String | Google fonts to be loaded. Example: Roboto. Multiple fonts can be loaded like this: Roboto|Open Sans | . | selector | String | A CSS selector for an element on the webpage. We’ll crop the image to this specific element. For example: section#complete-toolkit.container-lg | . | ms_delay | Integer | The number of milliseconds the API should delay before generating the image. This is useful when waiting for JavaScript. We recommend starting with 500. Large values slow down the initial render time. | . | device_scale | Double | This adjusts the pixel ratio for the screenshot. Minimum: 1, Maximum: 3. | . | render_when_ready | Boolean | Set to true to control when the image is generated. Call ScreenshotReady() from JavaScript to generate the image. Learn more. | . | viewport_width | Integer | Set the width of Chrome’s viewport. This will disable automatic cropping. Both height and width parameters must be set if using either. | . | viewport_height | Integer | Set the height of Chrome’s viewport. This will disable automatic cropping. Both height and width parameters must be set if using either. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#additional-parameters-1","relUrl":"/getting-started/templates/#additional-parameters-1"},"198":{"doc":"Image Templates","title":"Creating an image with a template","content":"To generate a templated image, make an HTTP request to the API using the template_id listed in the CREATE response. post https://hcti.io/v1/image/:template_id . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#creating-an-image-with-a-template","relUrl":"/getting-started/templates/#creating-an-image-with-a-template"},"199":{"doc":"Image Templates","title":"\n\nTemplate Versions\n","content":"When you create an image using a template_id, it will automatically utilize the most recent version of that template. If you want to create an image from a specific template_version you can append /:template_version to your POST: hcti.io/v1/image/:template_id/:template_version . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/","relUrl":"/getting-started/templates/"},"200":{"doc":"Image Templates","title":"Parameters","content":"The create templated image endpoint accepts the following parameters, accepted as either json or formdata. | If you use formdata, your template_values need to be JSON encoded. | . | Name | Type | Description | . | template_values* | JSON | These are the variables that will be substituted in your template’s HTML. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#parameters-2","relUrl":"/getting-started/templates/#parameters-2"},"201":{"doc":"Image Templates","title":"Listing your templates","content":"To list all of your templates, send a get to v1/template. Authentication is required. get https://hcti.io/v1/template . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#listing-your-templates","relUrl":"/getting-started/templates/#listing-your-templates"},"202":{"doc":"Image Templates","title":"Example responses","content":"STATUS: 200 OK . { \"data\": [ { \"css\": null, \"created_at\": \"2020-07-19T17:16:43.987+00:00\", \"description\": null, \"device_scale\": 2.0, \"google_fonts\": null, \"html\": \"<blockquote class=\\\"twitter-tweet\\\" style=\\\"width: 400px;\\\" data-dnt=\\\"true\\\">\\n<p lang=\\\"en\\\" dir=\\\"ltr\\\"></p>\\n\\n<a href=\\\"\\\"></a>\\n\\n</blockquote> <script async src=\\\"https://platform.twitter.com/widgets.js\\\" charset=\\\"utf-8\\\"></script>\", \"id\": \"t-5ff7b966-d32c-4143-bda3-57a440e97a80\", \"max_wait_ms\": null, \"ms_delay\": 1500, \"name\": null, \"render_when_ready\": null, \"updated_at\": \"2020-07-19T17:16:43.987+00:00\", \"version\": 1595179003987, \"viewport_height\": null, \"viewport_width\": null } ], \"pagination\": { \"next_page_start\": null } } . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#example-responses-1","relUrl":"/getting-started/templates/#example-responses-1"},"203":{"doc":"Image Templates","title":"Listing your template versions","content":"To list all versions of a template, send a get to v1/template/:template_id. Authentication is required. get https://hcti.io/v1/template/:template_id . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#listing-your-template-versions","relUrl":"/getting-started/templates/#listing-your-template-versions"},"204":{"doc":"Image Templates","title":"Example responses","content":"STATUS: 200 OK . { \"data\": [ { \"css\": null, \"created_at\": \"2020-07-19T17:16:43.987+00:00\", \"description\": null, \"device_scale\": 2.0, \"google_fonts\": null, \"html\": \"<blockquote class=\\\"twitter-tweet\\\" style=\\\"width: 400px;\\\" data-dnt=\\\"true\\\">\\n<p lang=\\\"en\\\" dir=\\\"ltr\\\"></p>\\n\\n<a href=\\\"\\\"></a>\\n\\n</blockquote> <script async src=\\\"https://platform.twitter.com/widgets.js\\\" charset=\\\"utf-8\\\"></script>\", \"id\": \"t-5ff7b966-d32c-4143-bda3-57a440e97a80\", \"max_wait_ms\": null, \"ms_delay\": 1500, \"name\": null, \"render_when_ready\": null, \"updated_at\": \"2020-07-19T17:16:43.987+00:00\", \"version\": 1595179003987, \"viewport_height\": null, \"viewport_width\": null } ], \"pagination\": { \"next_page_start\": null } } . ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#example-responses-2","relUrl":"/getting-started/templates/#example-responses-2"},"205":{"doc":"Image Templates","title":"Need help?","content":"We’re always looking to improve this documentation. Please send us an email: support@htmlcsstoimage.com. We respond fast. ","url":"https://docs.htmlcsstoimage.com/getting-started/templates/#need-help","relUrl":"/getting-started/templates/#need-help"},"206":{"doc":"Transparent background","title":"Transparent background","content":"Learn how to create images with transparent backgrounds. ","url":"https://docs.htmlcsstoimage.com/guides/transparent-background/","relUrl":"/guides/transparent-background/"},"207":{"doc":"Transparent background","title":"How it works","content":"To render an image with a transparent background, include the following in your CSS when generating your image. body { background-color: transparent; } . ","url":"https://docs.htmlcsstoimage.com/guides/transparent-background/#how-it-works","relUrl":"/guides/transparent-background/#how-it-works"},"208":{"doc":"Transparent background","title":"Example","content":"This image has background-color: transparent; set on the body. Try it yourself . ","url":"https://docs.htmlcsstoimage.com/guides/transparent-background/#example","relUrl":"/guides/transparent-background/#example"},"209":{"doc":"Transparent background","title":"\n\nWorks with PNG's only\n","content":"Transparency is only supported by the PNG file format. By default, all images are rendered as PNG’s. If you render the image as a JPG or Webp, the background will be white. ","url":"https://docs.htmlcsstoimage.com/guides/transparent-background/","relUrl":"/guides/transparent-background/"},"210":{"doc":"Transparent background","title":"Need help?","content":"Talk to a human: support@htmlcsstoimage.com. We always respond within 24 hours. And often, even faster. ","url":"https://docs.htmlcsstoimage.com/guides/transparent-background/#need-help","relUrl":"/guides/transparent-background/#need-help"},"211":{"doc":"Twitter screenshot","title":"Screenshot a Tweet","content":"Use the HTML/CSS to Image API to generate images of tweets. ","url":"https://docs.htmlcsstoimage.com/guides/twitter-screenshot/#screenshot-a-tweet","relUrl":"/guides/twitter-screenshot/#screenshot-a-tweet"},"212":{"doc":"Twitter screenshot","title":"How it works","content":"To generate a screenshot of a Tweet, we can make use of the Twitter embed API. For the image to work, make sure you set the selector param to .twitter-tweet and ms_delay to 1500. This gives the embed extra time to load and has the API properly crop the tweet. ","url":"https://docs.htmlcsstoimage.com/guides/twitter-screenshot/#how-it-works","relUrl":"/guides/twitter-screenshot/#how-it-works"},"213":{"doc":"Twitter screenshot","title":"Example code","content":"Copy this example, and swap out the href to create an image of any tweet you’d like. HTML . <blockquote class=\"twitter-tweet\" style=\"width: 400px;\" data-dnt=\"true\"> <p lang=\"en\" dir=\"ltr\"></p> <a href=\"https://twitter.com/fortnitegame/status/1253524351376330752\"></a> </blockquote> <script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script> . Important: set these parameters when creating the image. | selector: .twitter-tweet | ms_delay: 1500 | . ","url":"https://docs.htmlcsstoimage.com/guides/twitter-screenshot/#example-code","relUrl":"/guides/twitter-screenshot/#example-code"},"214":{"doc":"Twitter screenshot","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/guides/twitter-screenshot/#need-help","relUrl":"/guides/twitter-screenshot/#need-help"},"215":{"doc":"Twitter screenshot","title":"Twitter screenshot","content":" ","url":"https://docs.htmlcsstoimage.com/guides/twitter-screenshot/","relUrl":"/guides/twitter-screenshot/"},"216":{"doc":"URL to Image","title":"URL to Image","content":"The high resolution screenshot API you’ve been searching for. Get an API Key . | Creating an image from a URL | Additional parameters | Screenshot examples | Screenshot part of a page with Selector | CSS Selectors | Need help getting started? | . ","url":"https://docs.htmlcsstoimage.com/getting-started/url-to-image/","relUrl":"/getting-started/url-to-image/"},"217":{"doc":"URL to Image","title":"Creating an image from a URL","content":"With the API, you can automate taking a screenshot of any website. Pass the url param to the hcti.io/v1/image endpoint, and we’ll generate a screenshot for you. Here’s an example using cURL. curl -X POST https://hcti.io/v1/image -u 'UserID:APIKey' -d url=\"https://google.com\" . Don’t write code? Don’t worry, you can also do this with our Zapier integration. ","url":"https://docs.htmlcsstoimage.com/getting-started/url-to-image/#creating-an-image-from-a-url","relUrl":"/getting-started/url-to-image/#creating-an-image-from-a-url"},"218":{"doc":"URL to Image","title":"Additional parameters","content":"To customize your image further, you can take advantage of the following optional parameters. | Parameter |   | . | viewport_width | Set the width of Chrome’s viewport. Defaults to 1366. | . | viewport_height | Set the height of Chrome’s viewport. Defaults to 768. | . | device_scale | This adjusts the pixel ratio for the device. Default: 1. Maximum 3. | . | full_screen | When set to true, the API will generate an image of the entire height of the page. | . | ms_delay | The number of milliseconds the API should delay before taking the screenshot. This is useful when waiting for JavaScript. If you need to use this, we recommend starting with a low number, such as 500. Increasing this value slows down the speed of your initial render. | . | selector | A CSS selector for an element on the webpage. We’ll crop the image to this specific element. For example: section#complete-toolkit.container-lg | . ","url":"https://docs.htmlcsstoimage.com/getting-started/url-to-image/#additional-parameters","relUrl":"/getting-started/url-to-image/#additional-parameters"},"219":{"doc":"URL to Image","title":"Screenshot examples","content":"A full screenshot of stripe.com. With device scale set to 2, for a super high resolution image. ","url":"https://docs.htmlcsstoimage.com/getting-started/url-to-image/#screenshot-examples","relUrl":"/getting-started/url-to-image/#screenshot-examples"},"220":{"doc":"URL to Image","title":"Screenshot part of a page with Selector","content":"You can set a selector to target a specific part of the page. For example, on Stripe’s homepage, there is an element with the CSS selector section#complete-toolkit.container-lg. When passing that to the API, we crop to that element only. ","url":"https://docs.htmlcsstoimage.com/getting-started/url-to-image/#screenshot-part-of-a-page-with-selector","relUrl":"/getting-started/url-to-image/#screenshot-part-of-a-page-with-selector"},"221":{"doc":"URL to Image","title":"CSS Selectors","content":"To learn about CSS Selectors, we recommend this article. There are also Chrome extensions that detect them for you, we like using: Selector Gadget. ","url":"https://docs.htmlcsstoimage.com/getting-started/url-to-image/#css-selectors","relUrl":"/getting-started/url-to-image/#css-selectors"},"222":{"doc":"URL to Image","title":"Need help getting started?","content":"We’d be happy to walk you through getting started. Send us an email: support@htmlcsstoimage.com. We’re experts at generating images and will help you get going using the API. ","url":"https://docs.htmlcsstoimage.com/getting-started/url-to-image/#need-help-getting-started","relUrl":"/getting-started/url-to-image/#need-help-getting-started"},"223":{"doc":"Using Google Fonts","title":"Using Google Fonts","content":"Learn how to load in Google Fonts and use them in your images. ","url":"https://docs.htmlcsstoimage.com/guides/using-google-fonts/","relUrl":"/guides/using-google-fonts/"},"224":{"doc":"Using Google Fonts","title":"How it works","content":"The API supports all Google Fonts. To use them, you must specify the fonts you would like loaded via the google_fonts parameter when creating your image. | To load a single font, set the parameter to the font name: google_fonts=Roboto. And then set the font family in your CSS: font-family: 'Roboto';. On render, the API will load the font and use it for creating your image. | Multiple fonts must be delimited by the | character: google_fonts=Open Sans|Roboto|Montserrat . | . ","url":"https://docs.htmlcsstoimage.com/guides/using-google-fonts/#how-it-works","relUrl":"/guides/using-google-fonts/#how-it-works"},"225":{"doc":"Using Google Fonts","title":"\n\nFonts and rendering speed\n","content":"A large number of custom fonts can slow down initial render time. Only include the fonts you use. ","url":"https://docs.htmlcsstoimage.com/guides/using-google-fonts/","relUrl":"/guides/using-google-fonts/"},"226":{"doc":"Using Google Fonts","title":"Example","content":"This image was rendered using multiple Google Fonts. Here was passed google_fonts=Montserrat|Roboto. And then referenced them in the CSS. HTML . <div class=\"box\"> <h1>Hello world! 😎 /h1> <p>Just getting started with the HTML/CSS to Image <code>API</code>.</p> </div> <div class=\"box fancy-font gradient\"> <h1>Fancy font + Gradient + Emoji 😍</h1> </div> . CSS .box { width: 300px; border: 1px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); font-family: 'Roboto'; background-color: #F1FFFF; height: 125px; text-align: center; padding: 20px; margin: 20px; } .gradient{ background: linear-gradient(135deg, #ffffff 0%,#f3f3f3 50%,#ededed 51%,#ffffff 100%); } .fancy-font { font-family: 'Montserrat'; } h1 { padding: 0px; } p { padding: 0px; } code { font-family: \"Courier New\"; color: #d9534f; } body { background-color: #03B874; } . Try it yourself . ","url":"https://docs.htmlcsstoimage.com/guides/using-google-fonts/#example","relUrl":"/guides/using-google-fonts/#example"},"227":{"doc":"Using Google Fonts","title":"Using other web fonts","content":"The API supports loading in any type of web font. You can do this by including your font in your HTML with a normal link tag. It will get loaded in at render like a normal webpage. ","url":"https://docs.htmlcsstoimage.com/guides/using-google-fonts/#using-other-web-fonts","relUrl":"/guides/using-google-fonts/#using-other-web-fonts"},"228":{"doc":"Using Google Fonts","title":"Handling flash of unstyled text (FOUT)","content":"If you are seeing intermittent issues with your font rendering, it’s possible that the image is being rendered before the font has updated the text. To fix this, you can use the ms_delay parameter to adjust how long the API lets the HTML render before creating the image. Start with a low value, such as 500 and increase from there until your image generates reliably. ","url":"https://docs.htmlcsstoimage.com/guides/using-google-fonts/#handling-flash-of-unstyled-text-fout","relUrl":"/guides/using-google-fonts/#handling-flash-of-unstyled-text-fout"},"229":{"doc":"Using Google Fonts","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/guides/using-google-fonts/#need-help","relUrl":"/guides/using-google-fonts/#need-help"},"230":{"doc":"Using the API","title":"Using the HTML/CSS to Image API","content":"Generate images from HTML and CSS. Live demo Get an API Key . | Authentication | Creating an image . | Parameters | Additional parameters | Example responses | . | Getting an image . | File formats | Query parameters | . | Deleting an image . | Example response | . | Need help? | . ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/#using-the-htmlcss-to-image-api","relUrl":"/getting-started/using-the-api/#using-the-htmlcss-to-image-api"},"231":{"doc":"Using the API","title":"Authentication","content":"The API uses HTTP Basic authentication. | Your username is your User ID and your password is your API Key. Both of these are available from the dashboard. The code samples demonstrate how to authenticate your request. | Treat your API Key like a password. If exposed, it could be used to create images using your account. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/#authentication","relUrl":"/getting-started/using-the-api/#authentication"},"232":{"doc":"Using the API","title":"Creating an image","content":"To generate an image, make an HTTP request to the API. post https://hcti.io/v1/image . ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/#creating-an-image","relUrl":"/getting-started/using-the-api/#creating-an-image"},"233":{"doc":"Using the API","title":"Parameters","content":"The create image endpoint accepts the following parameters. Accepted as either json or formdata. | Name | Type | Description | . | html* | String | This is the HTML you want to render. You can send an HTML snippet (<div>Your content</div>) or an entire webpage. | . | css | String | The CSS for your image. | . | url* | String | The fully qualified URL to a public webpage. Such as https://htmlcsstoimage.com. When passed this will override the html param and will generate a screenshot of the url. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/#parameters","relUrl":"/getting-started/using-the-api/#parameters"},"234":{"doc":"Using the API","title":"\n\nRequired params\n","content":"For creating an image, either url or html are required. css is optional. ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/","relUrl":"/getting-started/using-the-api/"},"235":{"doc":"Using the API","title":"Additional parameters","content":"Optional parameters for greater control over your image. | Name | Type | Description | . | google_fonts | String | Google fonts to be loaded. Example: Roboto. Multiple fonts can be loaded like this: Roboto|Open Sans | . | selector | String | A CSS selector for an element on the webpage. We’ll crop the image to this specific element. For example: section#complete-toolkit.container-lg | . | ms_delay | Integer | The number of milliseconds the API should delay before generating the image. This is useful when waiting for JavaScript. We recommend starting with 500. Large values slow down the initial render time. | . | device_scale | Double | This adjusts the pixel ratio for the screenshot. Minimum: 1, Maximum: 3. | . | render_when_ready | Boolean | Set to true to control when the image is generated. Call ScreenshotReady() from JavaScript to generate the image. Learn more. | . | full_screen | Boolean | When set to true, the API will generate an image of the entire height of the page. | . | viewport_width | Integer | Set the width of Chrome’s viewport. This will disable automatic cropping. Both height and width parameters must be set if using either. | . | viewport_height | Integer | Set the height of Chrome’s viewport. This will disable automatic cropping. Both height and width parameters must be set if using either. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/#additional-parameters","relUrl":"/getting-started/using-the-api/#additional-parameters"},"236":{"doc":"Using the API","title":"Example responses","content":"STATUS: 201 CREATED . { \"url\": \"https://hcti.io/v1/image/be4c5118-fe19-462b-a49e-48cf72697a9d\" } . STATUS: 400 BAD REQUEST . { \"error\": \"Bad Request\", \"statusCode\": 400, \"message\": \"HTML is Required\" } . STATUS: 429 TOO MANY REQUESTS . { \"error\": \"Plan limit exceeded\", \"statusCode\": 429, \"message\": \"You've used 3055 of your 3000 renders. Upgrade via the Dashboard: https://htmlcsstoimage.com/dashboard\" } . ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/#example-responses","relUrl":"/getting-started/using-the-api/#example-responses"},"237":{"doc":"Using the API","title":"Getting an image","content":"After creating an image, you can use the returned URL to either download your image, or use it directly in your website. get https://hcti.io/v1/image/:image_id . This URL is permanent for as long as your account is active. It’s automatically cached and optimized by Cloudflare’s global content delivery network. You can use it directly on your webpages and not worry about hurting your page speed score. | Lossless optimization: each image is optimized with no change in image quality. | Global cache: the image is cached near your users to reduce latency. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/#getting-an-image","relUrl":"/getting-started/using-the-api/#getting-an-image"},"238":{"doc":"Using the API","title":"File formats","content":"The API supports jpg, png and webp. If no file extension is passed, you’ll get back a png by default. If you need a different file format, adjust the extension on the url. | Format | Example | . | png | https://hcti.io/v1/image/a3ab2ab2-906e-4b5c-a88d-41a1c3f3779e.png | . | jpg | https://hcti.io/v1/image/a3ab2ab2-906e-4b5c-a88d-41a1c3f3779e.jpg | . | webp | https://hcti.io/v1/image/a3ab2ab2-906e-4b5c-a88d-41a1c3f3779e.webp | . ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/#file-formats","relUrl":"/getting-started/using-the-api/#file-formats"},"239":{"doc":"Using the API","title":"\n\nPNG by default\n","content":"The API returns png by default. If no extension is on the URL, a png will be generated. ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/","relUrl":"/getting-started/using-the-api/"},"240":{"doc":"Using the API","title":"Query parameters","content":"Query parameters can be added to the URL to adjust your image. | Name | Type | Description | . | height | Integer | The height of the image. Maximum 5000. | . | width | Integer | The width of the image. Maximum 5000. | . | dl | Integer | Set dl=1 and the image will be served as a downloadable attachment. | . ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/#query-parameters","relUrl":"/getting-started/using-the-api/#query-parameters"},"241":{"doc":"Using the API","title":"Deleting an image","content":"delete https://hcti.io/v1/image/:image_id . To delete an image using the API, you can send a DELETE request to your image URL. This will remove your image from our servers and clear the caching for the image in our CDN. Because our CDN servers are distributed throughout the world, it may take a few minutes for this to take effect. ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/#deleting-an-image","relUrl":"/getting-started/using-the-api/#deleting-an-image"},"242":{"doc":"Using the API","title":"Example response","content":"STATUS: 202 ACCEPTED . ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/#example-response","relUrl":"/getting-started/using-the-api/#example-response"},"243":{"doc":"Using the API","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/#need-help","relUrl":"/getting-started/using-the-api/#need-help"},"244":{"doc":"Using the API","title":"Using the API","content":" ","url":"https://docs.htmlcsstoimage.com/getting-started/using-the-api/","relUrl":"/getting-started/using-the-api/"},"245":{"doc":"VB.NET","title":"VB.NET: HTML/CSS to Image","content":"Generate a png, jpg or webp images from your terminal with VB.NET . Live demo Get an API Key . | Generate an image with VB.NET | Example code | Need help? | . ","url":"https://docs.htmlcsstoimage.com/example-code/vb.net/#vbnet-htmlcss-to-image","relUrl":"/example-code/vb.net/#vbnet-htmlcss-to-image"},"246":{"doc":"VB.NET","title":"Generate an image with VB.NET","content":"The API takes your HTML/CSS and runs it in an instance of Google Chrome to convert your html into an image. Use VB.NET to send the API your HTML/CSS. You’ll get back the URL to your generated image. For more details on how this works, see Creating an image. ","url":"https://docs.htmlcsstoimage.com/example-code/vb.net/#generate-an-image-with-vbnet","relUrl":"/example-code/vb.net/#generate-an-image-with-vbnet"},"247":{"doc":"VB.NET","title":"Example code","content":"This code creates a WebClient, sets credentials and POSTS the HTML & CSS as values to the API. The response will be json with the URL to the generated image. Imports System Imports System.Net Public Module htciExample Sub Main() Dim result As Byte() Dim html As String = \"<div class='ping'>Pong ✅</div>\" Dim css As String = \".ping {padding: 20px; font-family:'sans-serif'; }\" Using client = New WebClient client.Credentials = New NetworkCredential(\"user_id\", \"api_key\") result = client.UploadValues( \"https://hcti.io/v1/image\", \"POST\", New Specialized.NameValueCollection() From { {\"html\", html}, {\"css\", css} } ) End Using Dim resultString = System.Text.Encoding.UTF8.GetString(result) Console.WriteLine(resultString) '{\"url\":\"https://hcti.io/v1/image/9dce5b30-3d9a-46b3-926b-651e5955f9a2\"} End Sub End Module . ","url":"https://docs.htmlcsstoimage.com/example-code/vb.net/#example-code","relUrl":"/example-code/vb.net/#example-code"},"248":{"doc":"VB.NET","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/example-code/vb.net/#need-help","relUrl":"/example-code/vb.net/#need-help"},"249":{"doc":"VB.NET","title":"VB.NET","content":" ","url":"https://docs.htmlcsstoimage.com/example-code/vb.net/","relUrl":"/example-code/vb.net/"},"250":{"doc":"Zapier integration","title":"Zapier: HTML/CSS to Image","content":"Generate images on Zapier with HTML/CSS to Image. Renders exactly like Google Chrome. Zapier integration Get an API Key . | Available Actions | Authentication | Create images from HTML/CSS | Create images from a URL | Troubleshooting . | Designing images with HTML/CSS | 429 error | Blank images | . | Need help? | . Connect HTML/CSS to Image with thousands of integrations on Zapier. ","url":"https://docs.htmlcsstoimage.com/integrations/zapier/#zapier-htmlcss-to-image","relUrl":"/integrations/zapier/#zapier-htmlcss-to-image"},"251":{"doc":"Zapier integration","title":"Available Actions","content":"Our Zapier integration includes two actions. | Create images from HTML/CSS | Create images from a URL | . ","url":"https://docs.htmlcsstoimage.com/integrations/zapier/#available-actions","relUrl":"/integrations/zapier/#available-actions"},"252":{"doc":"Zapier integration","title":"Authentication","content":"When connecting the integration to your account, you can retrieve your User ID and API Key from the dashboard. Get your free API Key . ","url":"https://docs.htmlcsstoimage.com/integrations/zapier/#authentication","relUrl":"/integrations/zapier/#authentication"},"253":{"doc":"Zapier integration","title":"Create images from HTML/CSS","content":"The Zapier integration makes it simple to create an image with the API. When creating an image you will see these options: . HTML is the only required value. The rest are optional. | Name | Type | Description | . | html* | String | This is the HTML you want to render. You can send an HTML snippet (<div>Your content</div>) or an entire webpage. | . | css | String | The CSS for your image. | . | google_fonts | String | Google fonts to be loaded. Example: Roboto. Multiple fonts can be loaded like this: Roboto|Open Sans | . | ms_delay | Integer | The number of milliseconds the API should delay before generating the image. This is useful when waiting for JavaScript. We recommend starting with 500. Large values slow down the initial render time. | . | device_scale | Double | This adjusts the pixel ratio for the screenshot. Minimum: 1, Maximum: 3. | . ","url":"https://docs.htmlcsstoimage.com/integrations/zapier/#create-images-from-htmlcss","relUrl":"/integrations/zapier/#create-images-from-htmlcss"},"254":{"doc":"Zapier integration","title":"\n\nVariables in your HTML\n","content":"When creating your HTML, the power of Zapier is using values from previous steps. You can integrate in values from Twitter, Airtable, Wordpress or any other of the Zapier integrations. Make your images unique and customized for the situation. ","url":"https://docs.htmlcsstoimage.com/integrations/zapier/","relUrl":"/integrations/zapier/"},"255":{"doc":"Zapier integration","title":"Create images from a URL","content":"With this Zapier integration, you can generate a screenshot of any website. The only required value is URL the rest are optional. | Name | Type | Description | . | url* | String | The fully qualified URL to a public webpage. Such as https://htmlcsstoimage.com. When passed this will override the html param and will generate a screenshot of the url. | . | device_scale | Double | This adjusts the pixel ratio for the screenshot. Minimum: 1, Maximum: 3. | . | ms_delay | Integer | The number of milliseconds the API should delay before generating the image. This is useful when waiting for JavaScript. We recommend starting with 500. Large values slow down the initial render time. | . | viewport_width | Integer | Set the width of Chrome’s viewport. This will disable automatic cropping. Both height and width parameters must be set if using either. | . | viewport_height | Integer | Set the height of Chrome’s viewport. This will disable automatic cropping. Both height and width parameters must be set if using either. | . | selector | String | A CSS selector for an element on the webpage. We’ll crop the image to this specific element. For example: section#complete-toolkit.container-lg | . ","url":"https://docs.htmlcsstoimage.com/integrations/zapier/#create-images-from-a-url","relUrl":"/integrations/zapier/#create-images-from-a-url"},"256":{"doc":"Zapier integration","title":"Troubleshooting","content":"If you have trouble with the Zapier integration, please send us an email: support@htmlcsstoimage.com and we’ll help you out. ","url":"https://docs.htmlcsstoimage.com/integrations/zapier/#troubleshooting","relUrl":"/integrations/zapier/#troubleshooting"},"257":{"doc":"Zapier integration","title":"Designing images with HTML/CSS","content":"Creating your image design can be the most challenging part. We suggest mocking up your image using Codepen. It allows you to see your HTML/CSS and edit it live. ","url":"https://docs.htmlcsstoimage.com/integrations/zapier/#designing-images-with-htmlcss","relUrl":"/integrations/zapier/#designing-images-with-htmlcss"},"258":{"doc":"Zapier integration","title":"429 error","content":"If you receive this error, it means you have exceeded your plan limit for creating images this month. Take a look at your Dashboard to check your usage and upgrade your plan. ","url":"https://docs.htmlcsstoimage.com/integrations/zapier/#429-error","relUrl":"/integrations/zapier/#429-error"},"259":{"doc":"Zapier integration","title":"Blank images","content":"When taking a screenshot of a URL, if you see a blank image, this often means that the screenshot was taken before the page was able to render anything. This can sometimes happen with complex pages that use a lot of JavaScript. To fix it, try adjusting the ms_delay value to slow down taking the screenshot. ","url":"https://docs.htmlcsstoimage.com/integrations/zapier/#blank-images","relUrl":"/integrations/zapier/#blank-images"},"260":{"doc":"Zapier integration","title":"Need help?","content":"Talk to a human. Please email us support@htmlcsstoimage.com with any questions and we’ll gladly help you get started. ","url":"https://docs.htmlcsstoimage.com/integrations/zapier/#need-help","relUrl":"/integrations/zapier/#need-help"},"261":{"doc":"Zapier integration","title":"Zapier integration","content":" ","url":"https://docs.htmlcsstoimage.com/integrations/zapier/","relUrl":"/integrations/zapier/"}},"index":{"version":"2.3.8","fields":["title","content","relUrl"],"fieldVectors":[["title/0",[0,423.403,1,562.031,2,1.729]],["content/0",[1,8.68,3,7.563,4,2.947,5,13.265,6,14.721,7,5.193,8,7.413,9,8.257]],["relUrl/0",[1,3.719,2,0.008,10,2.644,11,4.365]],["title/1",[7,482.63]],["content/1",[1,10.363,2,0.029,12,3.253,13,1.807,14,12.091,15,7.537,16,4.621,17,10.108,18,10.108,19,12.091,20,1.17,21,7.324,22,9.05,23,12.091,24,10.895,25,1.353]],["relUrl/1",[1,2.86,7,1.711,10,2.938,26,4.851]],["title/2",[20,132.427]],["content/2",[0,6.412,1,8.511,2,0.026,20,1.397,22,10.805,24,13.008,25,1.616,27,14.435,28,14.435]],["relUrl/2",[1,3.218,10,3.306,29,5.458]],["title/3",[8,479.992,9,534.649,13,142.47]],["content/3",[0,5.845,1,7.759,2,0.024,8,8.394,9,9.35,13,1.967,20,1.274,25,1.473,30,6.045,31,7.759,32,3.701,33,13.159]],["relUrl/3",[1,2.574,8,2.198,9,2.448,10,2.644,34,4.365]],["title/4",[35,319.567,36,246.91]],["content/4",[37,7.275,38,7.275,39,5.816,40,8.349,41,8.578,42,9.75,43,10.6,44,10.6,45,9.75,46,9.75]],["relUrl/4",[1,2.86,10,2.938,36,1.066,47,4.371]],["title/5",[1,662.491,2,2.038]],["content/5",[]],["relUrl/5",[1,3.218,2,0.01,10,3.306]],["title/6",[2,1.729,48,562.031,49,248.196]],["content/6",[2,0.025,4,2.803,12,2.722,20,0.979,25,2.16,32,2.846,35,2.878,36,2.224,48,10.219,50,5.198,51,5.675,52,5.307,53,6.308,54,3.311,55,4.495,56,4.904,57,5.307,58,1.343,59,3.569,60,4.648]],["relUrl/6",[2,0.009,20,0.47,61,4.371,62,2.544]],["title/7",[2,1.729,4,190.797,48,562.031]],["content/7",[0,3.651,2,0.026,4,1.645,7,2.899,13,1.228,20,0.796,25,2.163,48,4.846,49,3.144,54,2.689,55,3.651,58,1.899,63,4.059,64,4.979,65,5.283,66,5.46,67,5.283,68,1.964,69,3.016,70,4.504,71,4.724,72,4.724,73,3.284,74,4.311,75,5.283,76,3.712,77,2.117,78,3.712,79,5.886,80,5.886,81,5.886,82,5.886,83,5.886]],["relUrl/7",[2,0.009,20,0.47,48,2.86,84,4.851]],["title/8",[48,662.491,60,516.149]],["content/8",[13,1.533,25,1.148,31,6.048,32,2.885,48,8.335,58,2.313,59,5.706,60,6.494,85,5.066,86,6.048,87,6.394,88,5.38,89,5.165,90,6.593,91,5.38,92,5.165,93,6.814,94,7.347,95,4.412,96,7.678,97,8.813,98,3.619]],["relUrl/8",[20,0.528,48,3.218,99,5.458]],["title/9",[20,92.265,32,268.084,48,562.031]],["content/9",[0,2.182,2,0.015,4,0.983,13,1.207,16,1.877,20,0.475,25,2.243,32,2.272,48,4.763,49,1.279,58,1.072,68,2.849,69,1.802,72,2.823,73,1.336,77,1.265,78,2.218,85,2.426,86,2.896,100,4.57,101,4.763,102,7.279,103,8.601,104,3.381,105,3.589,106,2.896,107,4.426,108,4.426,109,4.426,110,3.867,111,4.911,112,4.911,113,4.911,114,4.106,115,4.106,116,6.36,117,7.43,118,2.576,119,3.517,120,2.691,121,3.676,122,2.896,123,2.823,124,1.647,125,4.426,126,3.517,127,4.426,128,2.576,129,4.237,130,4.911,131,4.911,132,4.426,133,4.911,134,4.426,135,4.426,136,4.426,137,4.911,138,4.911,139,4.911,140,4.911,141,4.911]],["relUrl/9",[20,0.658,32,1.364,61,4.371]],["title/10",[35,319.567,36,246.91]],["content/10",[39,5.708,40,8.194,41,8.418,69,5.099,142,8.663,143,8.194,144,6.613,145,8.932,146,6.173,147,5.099,148,9.568]],["relUrl/10",[20,0.528,36,1.199,149,5.458]],["title/11",[48,806.681]],["content/11",[]],["relUrl/11",[20,0.604,150,6.24]],["title/12",[151,1232.854]],["content/12",[2,0.027,40,8.855,49,3.91,100,6.671,144,7.146,152,10.756,153,7.877]],["relUrl/12",[151,6.562]],["title/13",[7,336.258,142,594.197,154,796.879]],["content/13",[2,0.029,13,1.492,25,2.152,39,4.1,58,1.841,69,3.663,74,5.236,92,5.027,95,4.294,144,4.75,146,4.434,155,9.983,156,5.35,157,9.983,158,8.346,159,5.027,160,8.346,161,7.86,162,7.86,163,3.663,164,9.983,165,5.599,166,8.996]],["relUrl/13",[7,1.925,154,4.563,167,5.458]],["title/14",[12,256.459,124,319.664,144,453.591]],["content/14",[2,0.023,25,1.423,49,3.309,128,6.666,152,9.103,168,12.71,169,7.923,170,6.666,171,7.923,172,12.71,173,7.305,174,10.626,175,10.626,176,12.71,177,10.626,178,6.16]],["relUrl/14",[12,1.469,144,2.597,179,4.919]],["title/15",[12,256.459,124,319.664,144,453.591]],["content/15",[2,0.024,12,2.582,16,3.668,25,1.074,58,1.273,69,3.521,73,2.611,74,5.033,91,5.033,124,3.218,146,4.263,152,6.873,170,5.033,171,5.982,180,8.648,181,8.648,182,5.383,183,9.597,184,13.496,185,11.18,186,8.023,187,9.597,188,9.597,189,9.597,190,9.597,191,8.648,192,9.597,193,5.658,194,8.023,195,9.597,196,9.597]],["relUrl/15",[12,1.305,144,2.308,179,4.371,197,2.788]],["title/16",[144,393.865,171,515.958,198,827.686,199,592.784]],["content/16",[2,0.03,7,3.83,12,2.921,25,1.215,46,7.474,58,1.441,144,6.993,170,5.694,180,9.783,181,13.242,199,7.775,200,9.783,201,7.474,202,9.076,203,6.767,204,7.212,205,9.761,206,8.126,207,10.856,208,10.856,209,7.212]],["relUrl/16",[144,2.308,171,3.024,199,3.474,210,4.851]],["title/17",[8,416.79,171,515.958,211,745.853,212,691.952]],["content/17",[2,0.027,4,1.783,8,7.544,25,1.833,30,6.882,49,3.333,100,3.957,144,4.239,161,7.014,170,4.672,201,6.133,212,7.447,213,7.014,214,8.908,215,8.908,216,8.908,217,6.38,218,8.908,219,8.908,220,6.133,221,8.908,222,8.908,223,8.908,224,7.014,225,8.908,226,6.668,227,8.908,228,8.027,229,7.014,230,8.027,231,7.447]],["relUrl/17",[171,3.024,211,4.371,212,4.055,232,4.851]],["title/18",[56,461.978,129,499.956,158,796.879]],["content/18",[0,4.495,2,0.031,25,1.94,49,3.646,56,4.904,57,7.345,65,6.504,76,4.57,159,5.095,160,8.459,170,5.307,201,6.966,204,6.721,213,7.967,233,10.118,234,10.118,235,10.118,236,6.966,237,8.459,238,10.118,239,7.967,240,10.118,241,6.966]],["relUrl/18",[56,2.645,158,4.563,242,4.919]],["title/19",[128,499.956,171,594.197,173,547.833]],["content/19",[2,0.021,13,1.697,25,2.035,30,5.215,49,2.956,58,1.506,128,7.943,129,5.955,160,9.491,170,5.955,171,7.077,173,9.793,213,8.939,243,10.231,244,9.491,245,6.368,246,7.541]],["relUrl/19",[128,2.863,171,3.402,247,5.458]],["title/20",[9,630.215,152,804.697]],["content/20",[2,0.021,9,8.581,13,1.723,25,2.047,30,7.028,49,3.002,170,6.047,201,7.938,204,7.658,213,9.077,248,7.938,249,6.318,250,7.187,251,3.915,252,6.178,253,6.178,254,7.41]],["relUrl/20",[152,4.469,255,5.623]],["title/21",[58,149.088,163,412.282]],["content/21",[2,0.029,4,2.025,25,1.94,45,6.966,49,2.635,58,1.858,68,2.418,77,3.607,91,5.307,159,5.095,163,5.893,170,5.307,204,6.721,256,7.247,257,9.118,258,7.574,259,9.118,260,10.118,261,8.73,262,6.504,263,9.118]],["relUrl/21",[58,0.828,264,6.24]],["title/22",[12,302.299,265,841.026]],["content/22",[2,0.032,4,1.873,12,2.517,13,1.398,16,3.576,25,1.047,35,2.661,68,2.236,77,2.41,170,4.907,220,6.441,249,5.127,251,3.177,256,6.7,265,7.003,266,9.355,267,9.494,268,7.821,269,8.43,270,8.805,271,9.127,272,7.003,273,6.013,274,7.366,275,6.215,276,7.003,277,7.366,278,3.177,279,7.366,280,6.441]],["relUrl/22",[265,4.671,281,6.24]],["title/23",[8,479.992,129,499.956,163,349.764]],["content/23",[2,0.024,8,6.626,25,1.473,30,6.045,49,3.426,76,5.943,153,6.902,163,6.117,170,6.902,249,7.211,250,8.203,256,9.425,282,13.159]],["relUrl/23",[8,2.749,163,2.003,242,4.919]],["title/24",[283,858.954,284,796.879,285,796.879]],["content/24",[25,1.088,58,1.807,95,5.858,144,4.626,170,5.099,204,6.458,243,8.761,256,6.963,271,6.694,283,8.761,284,11.386,285,13.142,286,6.963,287,7.463,288,9.722,289,9.722,290,8.761,291,9.722,292,8.761,293,8.761,294,8.761,295,8.128,296,9.722,297,5.889,298,9.722,299,5.732,300,9.722,301,8.128]],["relUrl/24",[284,4.563,285,4.563,302,5.458]],["title/25",[129,434.125,303,827.686,304,691.952,305,745.853]],["content/25",[25,1.29,46,7.938,69,4.23,104,7.938,129,6.047,144,5.486,145,7.41,146,5.121,170,6.047,171,7.187,201,10.533,204,7.658,220,7.938,245,6.467,256,8.257,263,10.389,306,11.529,307,9.077,308,11.529,309,7.938,310,11.529]],["relUrl/25",[129,2.544,304,4.055,305,4.371,311,4.851]],["title/26",[2,1.501,73,225.154,144,393.865,199,592.784]],["content/26",[2,0.022,7,4.265,25,1.353,73,3.289,95,5.2,144,7.512,170,6.342,182,6.782,199,8.659,201,8.324,256,8.659,278,4.106,295,10.108,312,12.091,313,5.042,314,5.652,315,9.05,316,10.108]],["relUrl/26",[2,0.009,144,2.308,199,3.474,317,4.371]],["title/27",[2,2.038,73,305.645]],["content/27",[2,0.03,3,6.53,25,1.423,73,3.457,74,6.666,77,3.274,142,7.923,170,6.666,201,8.751,249,6.965,257,11.453,275,8.443,318,12.71,319,11.453,320,12.71]],["relUrl/27",[2,0.011,317,5.623]],["title/28",[251,381.53,253,602.116]],["content/28",[2,0.02,4,2.205,12,2.964,13,1.647,25,1.233,35,3.133,68,2.633,170,5.778,178,5.339,226,8.246,246,7.318,249,6.037,251,3.741,253,5.904,273,7.081,278,3.741,321,11.017,322,9.928,323,9.21,324,7.318,325,7.318,326,6.332,327,8.674,328,9.928,329,5.441]],["relUrl/28",[251,2.119,330,6.24]],["title/29",[2,2.038,331,841.026]],["content/29",[2,0.029,25,1.376,73,3.343,95,5.286,204,8.164,249,6.735,322,11.075,331,11.943,332,12.29,333,11.075,334,8.462,335,12.29,336,11.075,337,8.462,338,8.802,339,12.29]],["relUrl/29",[2,0.011,340,6.24]],["title/30",[9,630.215,30,516.149]],["content/30",[2,0.023,9,9.046,13,1.868,25,1.399,30,8.203,49,3.254,91,8.459,204,8.301,333,11.261,341,12.497,342,12.497,343,8.95,344,9.354]],["relUrl/30",[30,2.866,255,5.623]],["title/31",[345,908.803]],["content/31",[2,0.027,4,3.031,25,2.18,35,3.229,36,2.495,50,5.833,51,6.368,52,5.955,56,5.502,57,5.955,58,1.506,59,4.005,78,5.127,345,10.059,346,9.491]],["relUrl/31",[20,0.604,347,6.24]],["title/32",[2,1.729,4,190.797,345,633.182]],["content/32",[2,0.023,4,1.762,7,3.105,13,1.316,25,1.933,58,1.168,64,5.332,74,4.617,75,5.658,76,3.975,77,2.267,92,4.432,100,3.91,101,5.19,103,7.359,119,6.304,120,4.824,122,5.19,123,5.059,124,2.952,126,6.304,262,5.658,345,5.847,346,7.359,348,8.802,349,7.932,350,7.359,351,5.658,352,6.931,353,7.932,354,7.932,355,10.61,356,8.802,357,8.802,358,5.059,359,5.847]],["relUrl/32",[2,0.009,20,0.47,345,3.222,360,4.851]],["title/33",[78,617.895]],["content/33",[2,0.023,25,2.031,58,1.716,72,7.432,73,3.518,129,6.782,338,9.261,361,10.81,362,12.931,363,12.931,364,12.931,365,12.931,366,12.931]],["relUrl/33",[20,0.604,367,6.24]],["title/34",[35,319.567,36,246.91]],["content/34",[37,7.275,38,7.275,39,5.816,40,8.349,41,8.578,42,9.75,43,10.6,44,10.6,45,9.75,46,9.75]],["relUrl/34",[20,0.528,36,1.199,368,5.458]],["title/35",[2,1.729,369,750.514,370,633.182]],["content/35",[2,0.027,3,7.715,371,13.533,372,13.533,373,15.018,374,15.018,375,13.533]],["relUrl/35",[2,0.01,370,3.626,376,4.086]],["title/36",[2,1.188,77,168.753,329,323.568,377,490.4,378,490.4,379,421.097]],["content/36",[2,0.03,13,1.776,25,1.747,42,5.537,58,1.875,59,2.837,71,4.622,73,2.188,77,3.06,129,4.218,185,5.759,217,5.759,287,4.407,329,3.972,361,6.723,369,9.354,370,5.342,371,7.246,372,7.246,375,7.246,377,6.019,378,6.019,380,8.042,381,6.723,382,8.042,383,6.723,384,8.042,385,8.042,386,4.871,387,8.042,388,8.042,389,4.622,390,8.042,391,7.246,392,7.246,393,6.019,394,8.042,395,8.042]],["relUrl/36",[2,0.009,77,0.803,329,1.539,376,2.333,377,2.333,378,2.333,379,2.003,396,3.116]],["title/37",[397,1368.119]],["content/37",[2,0.027,77,2.88,166,10.077,268,9.349,292,10.077,337,7.699,369,11.803,370,9.958,377,8.37,378,8.37,393,8.37,398,11.182,399,11.182,400,10.077,401,8.805,402,8.805,403,11.182,404,10.077,405,11.182,406,10.077,407,10.077]],["relUrl/37",[2,0.01,370,3.626,376,4.086]],["title/38",[2,2.038,73,305.645]],["content/38",[2,0.034,4,2.731,7,4.812,68,3.26,73,3.711,77,3.514,251,4.632,286,9.77,369,10.741,370,9.062]],["relUrl/38",[2,0.012,376,3.631,408,4.851]],["title/39",[35,319.567,36,246.91]],["content/39",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/39",[2,0.009,36,1.066,376,3.631,412,4.851]],["title/40",[0,367.653,2,1.501,68,197.821,147,303.709]],["content/40",[2,0.03,4,2.544,12,3.42,25,1.423,49,3.309,53,7.923,54,4.159,55,5.646,56,6.16,57,6.666,58,1.686,59,4.484,147,4.664,314,5.941,413,6.811]],["relUrl/40",[2,0.007,10,2.403,68,0.948,147,2.158,414,3.967]],["title/41",[2,1.729,4,190.797,147,349.764]],["content/41",[0,4.686,2,0.026,7,5.084,25,1.181,31,6.22,49,2.747,54,3.452,55,4.686,58,1.4,63,5.21,64,6.39,65,6.78,66,7.007,67,6.78,68,3.444,74,5.533,75,6.78,76,4.764,77,2.717,147,3.871,314,4.931,413,5.653,415,8.306,416,7.555,417,7.555]],["relUrl/41",[2,0.008,10,2.644,147,2.314,418,4.365]],["title/42",[413,510.811,419,489.704,420,750.514]],["content/42",[7,3.105,12,4.004,15,5.487,25,1.823,54,2.88,55,3.91,58,1.975,68,2.104,98,3.105,147,3.23,209,5.847,314,4.115,327,6.931,389,5.059,413,9.254,419,4.522,420,6.931,421,4.717,422,7.932,423,6.589,424,6.304,425,7.494,426,7.932,427,6.931,428,6.589,429,11.436,430,8.802,431,7.932]],["relUrl/42",[10,2.644,68,1.043,147,1.602,413,2.339,432,4.365]],["title/43",[35,319.567,36,246.91]],["content/43",[39,5.708,40,8.194,41,8.418,69,5.099,142,8.663,143,8.194,144,6.613,145,8.932,146,6.173,147,5.099,148,9.568]],["relUrl/43",[10,2.938,36,1.066,147,1.78,433,4.851]],["title/44",[0,423.403,2,1.729,147,349.764]],["content/44",[]],["relUrl/44",[2,0.01,10,3.306,147,2.003]],["title/45",[104,503.555,105,220.231,124,245.277,278,248.354,434,375.747]],["content/45",[2,0.02,3,5.577,4,2.173,13,1.623,49,2.827,58,1.441,73,3.997,105,3.269,124,3.641,156,5.818,209,7.212,278,3.686,327,11.57,413,5.818,419,8.558,428,8.126,431,9.783,434,5.577,435,8.665,436,6.576,437,10.856]],["relUrl/45",[105,1.659,124,1.219,278,1.235,280,2.504,438,2.604,439,2.863]],["title/46",[20,92.265,278,323.675,434,489.704]],["content/46",[13,1.868,15,7.79,17,10.447,25,1.399,68,2.987,73,3.399,178,6.057,262,8.032,278,5.476,386,7.57,419,6.42,435,7.368,440,11.261,441,8.95,442,12.497,443,12.497]],["relUrl/46",[20,0.384,105,1.195,278,1.347,280,2.732,438,2.841,439,3.124]],["title/47",[20,92.265,105,287.022,434,489.704]],["content/47",[21,7.699,25,1.423,68,3.038,73,3.457,105,4.909,262,8.169,434,6.53,435,9.613,444,8.169,445,7.699,446,10.626,447,11.453,448,11.453,449,12.71]],["relUrl/47",[20,0.384,105,1.771,280,2.732,438,2.841,439,3.124]],["title/48",[20,92.265,124,319.664,434,489.704]],["content/48",[7,4.259,13,1.228,16,4.615,17,6.871,25,2.032,35,2.338,105,2.475,124,5.89,178,3.983,246,5.46,270,5.46,337,5.659,358,6.939,436,4.979,445,4.979,450,8.219,451,12.073,452,8.219,453,8.219,454,5.659,455,8.219,456,8.219,457,9.506,458,9.037,459,7.406,460,8.219,461,8.219,462,6.152,463,7.406,464,7.406,465,6.871]],["relUrl/48",[20,0.384,105,1.195,124,1.331,280,2.732,438,2.841,439,3.124]],["title/49",[35,319.567,36,246.91]],["content/49",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/49",[36,0.959,105,1.314,280,3.005,438,3.126,466,3.933]],["title/50",[25,81.866,105,220.231,124,245.277,278,248.354,434,375.747]],["content/50",[]],["relUrl/50",[105,1.461,124,1.627,280,3.34,438,3.474]],["title/51",[409,489.704,467,953.196,468,713.493]],["content/51",[2,0.025,4,1.099,7,1.937,12,1.477,13,2.346,16,2.099,25,2.199,35,1.562,36,1.207,39,2.255,54,1.797,55,2.439,58,0.729,68,1.312,73,1.494,105,1.653,124,1.841,146,2.439,147,2.015,153,2.88,156,2.943,161,4.323,165,3.08,178,2.661,182,4.961,185,3.933,206,4.11,239,4.323,245,3.08,278,1.865,297,3.326,299,3.238,314,2.567,315,4.11,324,3.647,329,2.712,389,3.156,409,2.821,434,5.706,468,4.11,469,4.948,470,5.491,471,5.491,472,4.948,473,4.323,474,3.529,475,4.59,476,4.59,477,4.323,478,4.59,479,4.323,480,4.59,481,4.323,482,3.933,483,4.59,484,4.59,485,4.59,486,4.323,487,4.59,488,4.323,489,3.647]],["relUrl/51",[409,2.804,468,4.086,490,5.458]],["title/52",[473,884.665,474,722.172]],["content/52",[2,0.025,70,7.615,77,3.579,153,7.289,165,7.794,217,9.952,274,10.941,473,10.941,474,11.087,491,13.896]],["relUrl/52",[473,4.298,474,3.508,492,4.563]],["title/53",[2,1.501,182,464.25,206,619.545,475,691.952]],["content/53",[2,0.031,12,3.009,16,4.274,71,6.427,77,2.88,143,6.593,415,8.805,493,6.774,494,9.635,495,9.958,496,10.077,497,11.182,498,10.077,499,10.077,500,8.805,501,11.182,502,10.077,503,5.993,504,11.182,505,11.182]],["relUrl/53",[2,0.008,182,2.448,206,3.267,475,3.649,506,4.365]],["title/54",[476,939.317,477,884.665]],["content/54",[35,3.88,39,5.603,299,10.054,419,7.008,436,8.264,477,10.741,507,13.642,508,13.642,509,13.642,510,11.404,511,8.504]],["relUrl/54",[476,4.563,477,4.298,512,3.758]],["title/55",[2,0.905,4,99.902,13,74.598,35,141.953,182,279.945,297,302.337,299,294.282,315,373.588,329,246.495]],["content/55",[2,0.028,4,3.062,35,4.884,39,4.735,69,4.23,146,5.121,147,4.23,165,6.467,297,6.984,299,6.798,329,5.694,383,9.638,513,11.529,514,11.529,515,9.537,516,10.389,517,11.529]],["relUrl/55",[2,0.005,4,0.582,13,0.435,35,0.827,182,1.631,297,1.762,299,1.715,315,2.177,329,1.436,492,2.431]],["title/56",[13,123.71,105,249.229,434,425.223,478,691.952]],["content/56",[12,4.159,15,7.3,20,1.133,68,2.799,76,5.289,105,3.526,156,6.275,178,5.675,182,6.568,203,7.3,329,5.783,379,7.527,435,9.114,462,8.765,518,8.765,519,8.765,520,7.527,521,7.527,522,8.387]],["relUrl/56",[13,0.652,105,1.314,434,2.242,478,3.649,512,3.005]],["title/57",[13,142.47,278,323.675,434,489.704]],["content/57",[7,4.995,12,3.81,15,8.827,68,3.384,178,6.863,278,4.808,434,7.275,462,10.6,518,10.6,523,14.161]],["relUrl/57",[13,0.725,278,1.647,434,2.492,512,3.34]],["title/58",[13,109.316,124,245.277,479,575.866,480,611.441,481,575.866]],["content/58",[12,3.362,13,1.868,15,7.79,35,3.554,68,2.987,124,4.191,165,7.009,401,9.839,419,6.42,444,8.032,479,9.839,481,9.839,518,9.354,524,12.497,525,12.497,526,11.261,527,12.497]],["relUrl/58",[13,0.593,124,1.331,479,3.124,480,3.317,481,3.124,512,2.732]],["title/59",[12,256.459,314,445.569,389,547.833]],["content/59",[3,5.129,12,2.686,15,6.223,25,1.117,54,3.266,55,4.434,58,2.116,68,3.316,73,2.716,98,3.522,153,5.236,314,4.666,389,5.737,413,7.435,419,5.129,420,7.86,421,7.435,422,8.996,423,7.472,424,7.15,425,6.986,426,8.996,427,7.86,489,6.631,528,5.599,529,8.346]],["relUrl/59",[12,1.305,314,2.267,389,2.788,530,3.819]],["title/60",[2,1.501,7,291.982,73,225.154,324,549.809]],["content/60",[2,0.031,4,2.681,73,3.644,165,7.514,324,8.899,464,12.072,489,8.899,531,13.396,532,12.072,533,10.027,534,11.199,535,12.072]],["relUrl/60",[2,0.008,7,1.54,73,1.187,324,2.899,530,3.437]],["title/61",[2,1.729,178,461.978,434,489.704]],["content/61",[2,0.03,21,7.699,22,9.514,25,1.423,58,1.686,73,3.457,77,3.274,178,6.16,326,7.305,413,6.811,419,6.53,428,9.514,434,6.53,518,9.514,536,12.71]],["relUrl/61",[2,0.009,178,2.351,434,2.492,512,3.34]],["title/62",[165,630.215,482,804.697]],["content/62",[92,7.88,299,9.227,459,14.102,537,13.083,538,15.649]],["relUrl/62",[165,3.061,482,3.909,530,4.298]],["title/63",[156,391.943,185,523.812,483,611.441,484,611.441,485,611.441]],["content/63",[2,0.023,12,4.387,16,4.858,69,4.664,146,5.646,147,4.664,249,6.965,410,6.16,469,11.453,518,9.514,539,12.71,540,12.71,541,8.443,542,12.71,543,12.71]],["relUrl/63",[156,2.126,185,2.841,483,3.317,484,3.317,485,3.317,544,3.967]],["title/64",[13,142.47,239,750.514,486,750.514]],["content/64",[2,0.023,205,8.589,309,8.903,316,10.81,486,10.181,545,10.81,546,11.652,547,12.931,548,11.652,549,11.652,550,11.652,551,11.652,552,10.81,553,8.061,554,12.931]],["relUrl/64",[13,0.725,239,3.819,486,3.819,530,3.819]],["title/65",[13,142.47,58,126.48,487,796.879]],["content/65",[2,0.023,13,1.933,58,1.716,97,8.061,147,4.745,165,7.253,444,8.311,510,10.81,555,12.931,556,10.81,557,12.931,558,12.931,559,12.931,560,10.181,561,11.652]],["relUrl/65",[13,0.725,58,0.644,487,4.055,512,3.34]],["title/66",[2,1.729,16,364.336,488,750.514]],["content/66",[2,0.022,4,2.378,13,2.332,16,3.074,36,2.611,58,1.576,59,4.191,74,4.218,77,2.071,108,7.246,148,5.537,154,6.723,159,4.049,309,5.537,324,5.342,435,4.742,488,9.354,533,6.019,562,8.042,563,6.332,564,8.042,565,4.511,566,7.246,567,6.019,568,8.042,569,6.019,570,4.131,571,11.881,572,8.042,573,8.042,574,8.042,575,8.042,576,7.246,577,8.042,578,6.723,579,7.246,580,8.042,581,7.246,582,6.723,583,5.759]],["relUrl/66",[2,0.009,16,1.854,488,3.819,512,3.34]],["title/67",[13,109.316,54,239.315,55,324.875,245,410.234,489,485.837]],["content/67",[2,0.022,12,3.253,55,5.371,58,1.604,64,7.324,206,9.05,217,8.659,245,6.782,326,6.949,413,6.479,458,9.05,482,8.659,489,8.031,499,10.895,533,9.05,584,12.091,585,12.091,586,12.091,587,12.091]],["relUrl/67",[13,0.593,54,1.298,55,1.762,245,2.225,489,2.635,588,3.967]],["title/68",[409,577.236,468,841.026]],["content/68",[12,3.604,39,5.502,69,4.916,142,8.351,147,4.916,175,11.199,415,10.548,472,12.072,560,10.548,589,12.072,590,13.396,591,13.396,592,13.396]],["relUrl/68",[409,2.804,468,4.086,492,4.563]],["title/69",[593,1232.854]],["content/69",[]],["relUrl/69",[593,6.562]],["title/70",[435,662.491,594,630.215]],["content/70",[0,6.808,2,0.028,50,7.874,51,8.597,52,8.039,68,3.663]],["relUrl/70",[594,3.5,595,5.216]],["title/71",[435,662.491,594,630.215]],["content/71",[20,0.738,25,2.264,35,2.17,50,7.036,51,6.408,52,5.992,58,1.012,70,4.181,71,4.385,73,2.075,156,4.089,393,5.711,421,4.089,435,6.736,493,4.622,503,4.089,594,6.408,596,8.995,597,12.342,598,12.342,599,12.342,600,12.342,601,6.875,602,6.875,603,6.875]],["relUrl/71",[594,3.5,595,5.216]],["title/72",[52,311.197,286,424.929,287,325.133,436,359.41,594,332.792,604,496.016,605,496.016]],["content/72",[2,0.028,13,1.381,25,2.105,52,8.02,54,3.023,144,4.397,156,4.951,177,7.724,209,6.137,220,6.361,241,9.046,286,6.617,337,6.361,370,6.137,400,8.326,436,5.597,528,5.182,545,10.984,552,7.724,594,5.182,604,7.724,605,7.724,606,6.361,607,9.239,608,7.724,609,9.239]],["relUrl/72",[52,1.76,286,2.404,436,2.033,594,1.883,595,2.806,604,2.806,605,2.806,610,3.356]],["title/73",[2,1.729,49,248.196,611,562.031]],["content/73",[2,0.025,4,2.803,12,2.722,20,0.979,25,2.16,32,2.846,35,2.878,36,2.224,50,5.198,51,5.675,52,5.307,53,6.308,54,3.311,55,4.495,56,4.904,57,5.307,58,1.343,59,3.569,60,4.648,611,10.219]],["relUrl/73",[2,0.009,20,0.47,62,2.544,612,4.371]],["title/74",[2,1.729,4,190.797,611,562.031]],["content/74",[0,3.651,2,0.026,4,1.645,7,2.899,13,1.228,20,0.796,25,2.163,49,3.144,54,2.689,55,3.651,58,1.899,63,4.059,64,4.979,65,5.283,66,5.46,67,5.283,68,1.964,69,3.016,70,4.504,71,4.724,72,4.724,73,3.284,74,4.311,75,5.283,76,3.712,77,2.117,78,3.712,79,5.886,80,5.886,81,5.886,82,5.886,83,5.886,611,4.846]],["relUrl/74",[2,0.009,20,0.47,611,2.86,613,4.851]],["title/75",[60,516.149,611,662.491]],["content/75",[13,1.533,25,1.148,31,6.048,32,2.885,58,2.313,59,5.706,60,6.494,85,5.066,86,6.048,87,6.394,88,5.38,89,5.165,90,6.593,91,5.38,92,5.165,93,6.814,94,7.347,95,4.412,96,7.678,97,8.813,98,3.619,611,8.335]],["relUrl/75",[20,0.528,611,3.218,614,5.458]],["title/76",[20,92.265,32,268.084,611,562.031]],["content/76",[0,1.894,2,0.008,20,0.413,25,2.241,32,1.199,49,1.11,58,0.566,68,1.019,69,1.565,77,1.098,78,1.926,85,2.106,95,1.834,100,1.894,101,4.234,105,1.284,114,6.004,115,3.565,118,2.237,119,3.054,120,2.337,121,3.192,122,2.514,123,2.451,124,1.43,126,3.054,128,2.237,129,2.237,200,3.843,329,2.106,349,3.843,350,6.004,358,2.451,359,2.833,583,3.054,611,4.234,615,4.264,616,4.264,617,4.264,618,4.264,619,4.264,620,4.264,621,3.192,622,4.264,623,4.264,624,4.264,625,4.234,626,4.264,627,4.264,628,14.748,629,4.264,630,9.836,631,9.303,632,4.264,633,10.915,634,10.915,635,3.843,636,4.264,637,4.264,638,4.264,639,4.264,640,4.264,641,4.264,642,4.264,643,4.264,644,4.264,645,4.264,646,4.264,647,4.944,648,4.264,649,4.264,650,4.264,651,4.264,652,4.264,653,4.264,654,4.264,655,4.264]],["relUrl/76",[20,0.658,32,1.364,612,4.371]],["title/77",[35,319.567,36,246.91]],["content/77",[39,5.708,40,8.194,41,8.418,69,5.099,142,8.663,143,8.194,144,6.613,145,8.932,146,6.173,147,5.099,148,9.568]],["relUrl/77",[20,0.528,36,1.199,656,5.458]],["title/78",[611,806.681]],["content/78",[]],["relUrl/78",[20,0.604,657,6.24]],["title/79",[2,1.327,49,190.44,54,239.315,386,443.047,658,455.925]],["content/79",[2,0.026,4,2.913,20,1.036,25,2.143,32,3.009,35,3.043,36,2.351,50,5.497,51,6.002,52,5.612,54,4.761,56,5.186,57,5.612,58,1.42,59,3.775,386,8.815,658,9.071]],["relUrl/79",[2,0.006,20,0.325,62,1.76,386,2.033,658,3.231,659,2.512,660,3.356]],["title/80",[2,1.327,4,146.397,54,239.315,386,443.047,658,455.925]],["content/80",[2,0.025,4,1.998,7,4.894,13,2.074,20,0.966,35,2.839,49,2.599,54,4.539,58,1.841,70,5.47,145,6.416,159,5.027,277,7.86,278,4.711,290,8.996,297,6.047,386,6.047,407,8.996,419,5.129,444,6.416,510,8.346,658,6.223,661,10.923,662,9.983,663,9.983]],["relUrl/80",[2,0.006,20,0.325,54,1.098,386,2.033,658,3.231,659,2.512,664,3.356]],["title/81",[20,108.757,32,316.002]],["content/81",[7,2.585,25,2.249,49,1.908,58,1.774,59,2.585,60,3.367,68,1.752,86,4.321,87,4.569,88,3.844,89,3.691,90,7.124,93,4.868,95,3.152,100,4.924,105,2.207,127,9.989,186,6.127,251,4.539,262,4.711,334,5.046,361,6.127,421,7.164,458,8.297,565,6.217,665,7.329,666,8.297,667,5.771,668,7.329,669,5.046,670,7.329,671,7.329]],["relUrl/81",[20,0.422,32,1.228,658,2.721,659,3.267,672,4.365]],["title/82",[35,319.567,36,246.91]],["content/82",[39,5.708,40,8.194,41,8.418,69,5.099,142,8.663,143,8.194,144,6.613,145,8.932,146,6.173,147,5.099,148,9.568]],["relUrl/82",[20,0.422,36,0.959,658,2.721,659,3.267,673,4.365]],["title/83",[54,311.895,386,577.414,658,594.197]],["content/83",[]],["relUrl/83",[20,0.47,386,2.938,658,3.024,659,3.631]],["title/84",[16,364.336,674,391.516,675,437.881]],["content/84",[2,0.024,3,3.729,16,5.079,20,1.286,25,2.32,35,2.064,36,1.595,58,0.963,68,1.735,104,4.997,229,5.714,249,3.977,494,4.665,495,4.821,674,5.458,675,6.104,676,4.997,677,5.714,678,4.665,679,6.54,680,6.067,681,5.714,682,5.198,683,4.821,684,4.171,685,5.432,686,6.067,687,5.714,688,4.524]],["relUrl/84",[674,1.992,675,2.228,689,1.263,690,2.788]],["title/85",[16,279.553,68,174.804,104,503.555,674,300.408,675,335.984]],["content/85",[2,0.018,4,1.946,7,3.43,15,6.06,20,0.941,25,1.76,58,1.29,68,4.071,69,3.567,287,5.328,313,4.054,413,5.21,420,7.655,425,4.896,445,5.889,569,7.277,691,9.754,692,8.49,693,8.761,694,7.655,695,5.732,696,6.694,697,9.722,698,8.128,699,9.722,700,9.722,701,9.722]],["relUrl/85",[68,0.869,674,2.263,675,1.67,689,0.947,690,2.09,702,3.277]],["title/86",[703,1123.575,704,884.665]],["content/86",[16,4.211,25,1.233,32,3.098,76,4.976,93,7.318,118,5.778,120,6.037,193,6.496,674,4.525,675,6.818,694,8.674,696,10.218,698,12.408,705,9.928,706,7.081,707,9.21,708,7.89,709,8.674,710,9.928,711,11.017,712,11.017,713,9.928]],["relUrl/86",[674,1.992,675,2.228,689,1.263,690,2.788]],["title/87",[2,1.501,249,453.567,676,569.859,677,651.692]],["content/87",[2,0.024,123,7.699,444,10.836,569,10.027,676,11.607,677,10.548,692,8.351,694,10.548,695,7.899,714,13.396,715,13.396]],["relUrl/87",[2,0.007,674,1.494,676,2.504,677,2.863,689,0.947,690,2.09,716,3.636]],["title/88",[20,92.265,674,391.516,675,437.881]],["content/88",[25,1.376,118,6.446,120,6.735,123,7.064,193,7.247,675,7.329,676,8.462,696,8.462,698,10.275,705,11.075,706,7.899,707,10.275,708,8.802,709,9.677,710,11.075,717,12.29,718,12.29]],["relUrl/88",[674,1.992,675,2.228,689,1.263,690,2.788]],["title/89",[16,429.459,678,722.172]],["content/89",[2,0.026,12,3.912,13,2.173,16,2.67,25,1.754,54,2.286,55,4.747,56,3.385,58,0.927,64,4.231,65,4.49,67,4.49,68,2.554,69,3.921,71,4.015,73,2.907,77,1.799,105,2.103,241,4.809,251,2.372,287,3.828,297,4.231,313,2.913,337,4.809,413,5.727,425,5.381,436,4.231,493,6.474,503,3.743,528,3.918,678,8.342,691,5.003,692,4.354,693,6.294,719,6.294,720,6.985,721,6.985,722,6.985,723,4.64,724,4.64,725,6.985,726,5.5]],["relUrl/89",[674,1.793,678,2.805,689,1.137,690,2.509,702,3.933]],["title/90",[2,1.327,494,470.092,495,485.837,679,659.071,680,611.441]],["content/90",[2,0.028,7,2.837,12,2.164,25,1.864,35,2.287,49,2.094,68,1.922,116,9.354,165,4.511,226,6.019,294,7.246,323,6.723,402,6.332,493,4.871,494,7.636,495,7.892,496,12.732,498,12.732,500,9.354,502,7.246,696,5.537,727,11.881,728,7.197,729,5.169,730,11.881,731,9.354,732,8.042,733,8.042,734,8.042,735,8.042,736,8.042]],["relUrl/90",[2,0.006,494,2.157,495,2.229,674,1.379,680,2.806,689,0.874,690,1.929,737,3.356]],["title/91",[681,651.692,682,592.784,683,549.809,684,475.698]],["content/91",[2,0.029,4,2.025,13,1.512,25,1.94,58,1.858,297,6.129,393,7.574,401,7.967,421,5.422,427,7.967,465,8.459,495,6.721,503,5.422,674,4.156,675,4.648,682,7.247,683,6.721,684,8.048,729,6.504,738,9.118,739,10.118,740,10.118,741,9.118,742,9.118]],["relUrl/91",[674,1.494,682,2.604,683,2.416,684,2.09,689,0.947,690,2.09,743,3.636]],["title/92",[20,132.427]],["content/92",[25,2.101,744,14.405,745,14.405]],["relUrl/92",[674,1.992,689,1.263,690,2.788,746,4.851]],["title/93",[674,391.516,675,437.881,685,713.493]],["content/93",[0,4.156,2,0.017,3,4.806,4,1.873,13,1.398,25,2.159,58,1.241,169,5.832,325,6.215,494,6.013,685,9.922,726,7.366,728,9.326,731,7.366,747,12.87,748,13.256,749,13.256,750,14,751,9.355,752,7.821]],["relUrl/93",[674,1.63,675,1.823,685,2.97,689,1.033,690,2.28,753,3.967]],["title/94",[20,92.265,686,796.879,687,750.514]],["content/94",[25,2.274,169,8.568,352,7.756,445,5.967,674,4.046,675,4.525,685,7.373,686,8.235,687,7.756,728,8.326,747,8.235,750,8.235,752,13.235,754,13.745,755,13.745,756,9.851,757,9.851]],["relUrl/94",[20,0.384,674,1.63,687,3.124,689,1.033,690,2.28,758,3.967]],["title/95",[20,92.265,229,750.514,688,594.197]],["content/95",[12,2.118,16,3.009,25,2.14,32,2.214,35,2.239,68,2.795,169,9.627,229,6.198,249,4.314,251,2.673,352,6.198,391,7.093,528,4.415,674,5.731,675,6.409,688,4.907,694,6.198,695,4.641,726,6.198,728,8.452,747,6.581,750,6.581,752,12.911,759,11.694,760,7.871,761,5.892,762,7.871,763,7.871,764,7.871]],["relUrl/95",[20,0.384,674,1.63,688,2.473,689,1.033,690,2.28,765,3.967]],["title/96",[35,319.567,36,246.91]],["content/96",[37,7.275,38,7.275,39,5.816,40,8.349,41,8.578,42,9.75,43,10.6,44,10.6,45,9.75,46,9.75]],["relUrl/96",[36,0.959,674,1.793,689,1.137,690,2.509,766,4.365]],["title/97",[2,1.729,767,633.182,768,796.879]],["content/97",[2,0.033,3,6.643,4,3.3,13,1.933,25,1.447,49,3.367,58,1.716,327,10.181,419,6.643,434,6.643,767,8.589,768,10.81]],["relUrl/97",[767,3.626,769,4.298,770,4.919]],["title/98",[20,108.757,68,268.54]],["content/98",[15,2.204,25,2.247,58,0.469,68,0.845,78,1.597,104,2.434,118,1.854,156,1.894,178,1.713,193,4.77,278,1.2,386,2.141,441,4.382,489,2.348,515,2.204,541,2.348,570,5.598,625,6.425,709,4.818,767,2.348,768,2.955,771,2.783,772,3.535,773,3.535,774,3.535,775,3.535,776,3.186,777,3.535,778,5.115,779,7.29,780,6.119,781,3.535,782,3.535,783,3.535,784,3.535,785,6.119,786,3.535,787,3.535,788,2.434,789,3.535,790,3.535,791,3.535,792,6.119,793,5.514,794,3.535,795,3.186,796,6.119,797,3.535,798,3.535,799,6.119,800,3.535,801,3.535,802,3.535,803,3.535,804,3.535,805,3.535,806,3.535,807,3.535,808,3.535,809,3.535,810,3.535,811,3.535,812,3.535,813,3.535,814,3.535,815,3.535,816,3.535,817,3.535,818,3.535,819,3.535,820,3.535,821,3.186,822,3.535,823,3.535,824,3.535,825,3.535,826,3.535,827,3.535,828,3.535,829,3.535,830,3.186,831,3.535,832,5.115,833,3.535,834,3.535,835,3.535,836,3.535,837,3.535,838,3.535,839,3.535,840,3.535,841,3.535,842,3.535,843,3.535,844,3.535,845,3.535,846,3.535,847,3.535,848,3.535,849,3.535,850,2.348,851,3.535,852,3.535,853,2.783,854,3.535,855,3.186]],["relUrl/98",[68,1.159,767,3.222,769,3.819,856,4.851]],["title/99",[778,939.317,857,804.697]],["content/99",[12,4.695,76,6.395,428,10.6,767,11.592,778,11.838,857,10.142,858,14.161,859,14.161]],["relUrl/99",[767,3.626,769,4.298,770,4.919]],["title/100",[35,319.567,36,246.91]],["content/100",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/100",[36,1.066,767,3.222,769,3.819,860,4.851]],["title/101",[2,1.729,49,248.196,58,126.48]],["content/101",[0,4.156,2,0.028,4,2.653,25,2.055,49,2.436,50,4.806,51,5.247,52,4.907,56,4.534,57,4.907,58,1.759,59,3.3,68,2.236,73,2.545,124,3.137,153,4.907,313,3.901,423,7.003,494,6.013,728,5.667,731,7.366,861,8.43,862,9.355,863,9.355,864,9.355,865,4.907,866,9.355,867,9.355]],["relUrl/101",[25,0.815]],["title/102",[0,423.403,50,489.704,68,227.818]],["content/102",[2,0.011,13,0.946,18,5.293,21,3.835,22,4.739,25,1.109,49,1.649,58,0.84,77,1.631,105,1.907,118,5.195,120,5.428,124,2.123,169,3.947,193,5.84,278,2.15,416,4.535,417,4.535,419,3.253,434,3.253,447,8.925,448,5.706,489,4.206,706,4.07,853,4.985,868,5.706,869,10.993,870,8.925,871,5.293,872,5.706,873,8.925,874,5.706,875,5.706,876,8.925,877,6.332,878,6.332,879,6.332,880,6.332,881,6.332,882,6.332,883,6.332,884,6.332,885,6.332,886,6.332,887,5.706,888,8.925,889,5.293,890,6.332,891,5.706,892,5.706,893,5.293,894,5.706,895,5.706,896,5.706,897,6.332,898,5.706,899,5.706,900,6.332,901,6.332,902,6.332,903,6.332,904,6.332,905,6.332,906,6.332]],["relUrl/102",[0,2.424,50,2.804,68,1.305]],["title/103",[20,80.116,32,232.784,98,291.982,907,745.853]],["content/103",[8,5.238,9,5.834,20,1.007,25,2.275,30,4.778,32,2.925,48,6.133,63,5.137,98,3.669,143,6.133,173,5.978,224,8.19,278,3.532,345,6.909,611,6.133,908,5.978,909,6.133,910,7.449,911,9.373,912,10.401]],["relUrl/103",[20,0.47,32,1.364,98,1.711,907,4.371]],["title/104",[7,396.363,194,939.317]],["content/104",[7,3.886,20,1.437,32,3.098,35,3.133,36,2.421,74,5.778,76,4.976,95,4.738,98,3.886,147,4.043,153,7.784,159,5.548,194,12.408,345,7.318,444,7.081,560,8.674,589,9.928,689,2.869,913,11.017,914,9.928,915,9.21,916,11.017]],["relUrl/104",[25,0.815]],["title/105",[2,2.038,20,108.757]],["content/105",[2,0.023,4,2.544,12,3.42,13,1.9,20,1.23,49,3.309,54,4.159,55,5.646,58,1.686,153,6.666,161,10.007,228,11.453,231,10.626,474,8.169,917,12.71,918,11.453]],["relUrl/105",[2,0.011,20,0.604]],["title/106",[2,1.729,919,594.197,920,858.954]],["content/106",[2,0.023,13,1.9,32,3.575,58,1.686,63,6.277,76,5.74,143,7.494,220,8.751,344,9.514,436,7.699,788,8.751,920,11.453,921,12.71,922,9.514,923,12.71,924,11.453]],["relUrl/106",[2,0.01,919,3.402,925,5.458]],["title/107",[688,455.925,919,455.925,926,611.441,927,611.441,928,611.441]],["content/107",[2,0.023,4,2.544,13,1.9,20,1.23,25,1.423,32,3.575,49,3.309,191,11.453,522,9.103,688,7.923,788,8.751,919,7.923,926,10.626,927,10.626,928,10.626,929,12.71]],["relUrl/107",[688,2.721,919,2.721,926,3.649,927,3.649,928,3.649]],["title/108",[688,515.958,919,515.958,930,745.853,931,745.853]],["content/108",[20,1.515,25,1.752,32,4.401,522,11.208,788,10.774]],["relUrl/108",[688,3.024,919,3.024,930,4.371,931,4.371]],["title/109",[193,562.031,932,796.879,933,858.954]],["content/109",[2,0.025,4,2.731,20,1.32,32,3.837,88,7.155,319,12.293,444,8.768,522,9.77,567,10.211,788,9.392,932,11.404,934,13.642]],["relUrl/109",[193,3.218,932,4.563,933,4.919]],["title/110",[4,165.674,569,619.545,935,691.952,936,515.958]],["content/110",[2,0.024,4,2.681,20,1.297,32,3.768,147,4.916,249,7.341,522,9.594,567,10.027,788,9.223,919,8.351,935,11.199,936,8.351,937,12.072]],["relUrl/110",[4,0.971,569,3.631,935,4.055,936,3.024]],["title/111",[313,397.468,314,445.569,413,510.811]],["content/111",[4,2.681,58,2.237,73,3.644,153,7.026,313,5.586,314,6.262,389,7.699,413,7.179,421,9.034,425,6.746,938,13.396]],["relUrl/111",[313,2.276,314,2.551,413,2.925]],["title/112",[313,397.468,425,479.992,553,594.197]],["content/112",[13,2.245,252,8.048,425,7.562,511,9.362,553,9.362,684,8.631,939,15.018]],["relUrl/112",[313,2.276,425,2.749,553,3.402]],["title/113",[681,884.665,682,804.697]],["content/113",[2,0.027,4,2.205,13,1.647,25,1.661,35,3.133,58,1.462,297,6.674,421,5.904,465,9.21,503,5.904,674,4.525,675,5.061,683,7.318,684,9.646,726,8.674,729,7.081,741,9.928,742,9.928,744,9.928,745,9.928,761,8.246]],["relUrl/113",[681,4.913,682,4.469]],["title/114",[58,149.088,59,396.363]],["content/114",[13,1.837,25,1.376,35,3.496,58,2.488,59,5.628,70,6.735,97,7.661,153,6.446,217,8.802,244,10.275,297,7.445,304,10.275,940,7.445,941,11.075]],["relUrl/114",[58,0.828,59,2.201]],["title/115",[30,628.488]],["content/115",[2,0.025,25,1.555,49,3.618,56,6.735,57,7.289,58,2.289,59,4.902,343,9.952,344,10.402,581,12.522]],["relUrl/115",[30,3.345]],["title/116",[20,108.757,32,316.002]],["content/116",[2,0.024,4,2.681,20,1.297,25,1.499,32,3.768,56,6.493,57,7.026,58,1.778,59,4.726,63,6.616,98,4.726,143,7.899,224,10.548]],["relUrl/116",[20,0.604,32,1.755]],["title/117",[98,396.363,689,292.56]],["content/117",[2,0.025,3,7.008,13,2.039,25,1.527,49,3.552,56,6.612,57,7.155,58,2.263,59,4.812,98,4.812,153,7.155]],["relUrl/117",[98,2.201,689,1.625]],["title/118",[942,1077.21]],["content/118",[0,6.059,2,0.031,13,2.039,25,1.527,49,3.552,56,6.612,57,7.155,58,1.81,59,4.812,98,4.812,942,10.741]],["relUrl/118",[943,7.282]],["title/119",[942,1077.21]],["content/119",[25,1.912]],["relUrl/119",[942,5.734]],["title/120",[2,1.501,49,215.516,58,109.826,944,619.545]],["content/120",[2,0.027,3,7.563,4,2.947,13,2.671,25,1.648,58,1.953,944,11.019]],["relUrl/120",[2,0.009,58,0.644,62,2.544,945,4.371]],["title/121",[944,1024.074]],["content/121",[13,2.077,85,6.863,128,7.289,153,7.289,209,9.231,944,12.911,946,12.522,947,12.522,948,13.896,949,13.896]],["relUrl/121",[945,6.562]],["title/122",[669,941.946]],["content/122",[16,5.413,70,7.76,86,8.349,92,7.131,244,11.838,325,9.406,424,10.142,669,9.75,950,11.15,951,9.102]],["relUrl/122",[952,7.282]],["title/123",[49,292.56,421,602.116]],["content/123",[49,3.833,69,5.402,95,6.332,251,4.999,424,10.543,556,12.307,953,13.265,954,12.307]],["relUrl/123",[62,3.273,955,6.24]],["title/124",[128,499.956,944,713.493,956,796.879]],["content/124",[]],["relUrl/124",[957,7.282]],["title/125",[0,367.653,2,1.501,100,367.653,958,619.545]],["content/125",[2,0.027,3,7.715,4,3.006,13,2.245,58,1.993,100,6.671,958,11.241]],["relUrl/125",[2,0.008,100,1.939,958,3.267,959,3.267,960,4.365]],["title/126",[7,482.63]],["content/126",[4,3.031,13,1.697,32,3.193,58,1.506,100,6.727,159,5.717,237,9.491,241,7.816,313,4.734,417,8.131,519,11.335,795,10.231,958,12.755,961,8.498,962,8.939,963,11.353,964,11.353,965,11.353]],["relUrl/126",[7,1.925,959,4.086,966,5.458]],["title/127",[20,108.757,32,316.002]],["content/127",[2,0.018,18,8.128,20,0.941,21,8.25,25,1.76,68,2.324,77,2.504,100,6.05,262,6.249,416,6.963,417,6.963,441,6.963,446,11.386,462,7.277,534,8.128,625,5.732,937,8.761,967,8.761,968,7.277,969,8.128,970,9.722,971,7.655,972,9.722,973,9.722,974,9.722,975,9.722,976,8.761,977,9.722,978,8.761]],["relUrl/127",[32,1.535,959,4.086,979,5.458]],["title/128",[35,319.567,36,246.91]],["content/128",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/128",[36,1.199,959,4.086,980,5.458]],["title/129",[519,841.026,958,841.026]],["content/129",[]],["relUrl/129",[519,4.671,959,4.671]],["title/130",[2,1.729,9,534.649,49,248.196]],["content/130",[2,0.032,4,2.381,9,9.782,12,3.201,25,1.332,30,7.176,49,4.067,53,7.416,54,3.893,55,5.285,58,1.579,59,4.197,343,8.521,344,8.905]],["relUrl/130",[2,0.01,62,2.863,981,5.458]],["title/131",[91,589.32,982,746.359]],["content/131",[2,0.026,3,5.497,9,6.002,13,1.599,25,2.143,30,4.915,49,2.786,58,1.931,73,2.911,76,4.833,77,3.748,91,5.612,159,5.388,251,3.633,275,7.108,313,4.462,419,5.497,982,7.108,983,10.7]],["relUrl/131",[982,4.145,984,6.24]],["title/132",[20,108.757,985,939.317]],["content/132",[2,0.024,4,2.701,9,5.383,13,1.434,25,2.072,49,4.065,54,3.14,63,4.74,69,3.521,98,3.385,129,5.033,224,7.556,297,5.813,313,4.002,314,4.486,516,8.648,567,7.183,771,7.556,985,8.023,986,9.597,987,7.183,988,9.597,989,9.597,990,9.597,991,6.375,992,9.597]],["relUrl/132",[985,5.216,993,6.24]],["title/133",[60,628.488]],["content/133",[25,1.499,30,6.154,58,2.237,59,5.947,88,7.026,89,6.746,92,6.746,97,8.351,165,7.514,343,9.594,940,8.115]],["relUrl/133",[994,7.282]],["title/134",[35,319.567,36,246.91]],["content/134",[37,7.275,38,7.275,39,5.816,40,8.349,41,8.578,42,9.75,43,10.6,44,10.6,45,9.75,46,9.75]],["relUrl/134",[36,1.371,995,6.24]],["title/135",[9,630.215,30,516.149]],["content/135",[]],["relUrl/135",[996,7.282]],["title/136",[2,1.729,49,248.196,278,323.675]],["content/136",[2,0.022,4,2.436,12,2.236,20,1.535,25,2.168,32,2.337,35,2.364,36,1.826,50,4.27,51,4.662,52,4.359,53,5.181,54,2.719,55,3.692,56,4.028,57,4.359,58,1.615,59,2.932,60,3.818,128,4.359,278,6.186,997,6.948,998,7.489,999,7.489,1000,6.544,1001,6.544]],["relUrl/136",[2,0.009,20,0.47,62,2.544,1002,4.055]],["title/137",[2,1.729,4,190.797,278,323.675]],["content/137",[0,3.651,2,0.026,4,1.645,7,2.899,13,1.228,20,0.796,25,2.163,49,3.144,54,2.689,55,3.651,58,1.899,63,4.059,64,4.979,65,5.283,66,5.46,67,5.283,68,1.964,69,3.016,70,4.504,71,4.724,72,4.724,73,3.284,74,4.311,75,5.283,76,3.712,77,2.117,78,3.712,79,5.886,80,5.886,81,5.886,82,5.886,83,5.886,278,2.791]],["relUrl/137",[2,0.009,20,0.47,278,1.647,1003,4.851]],["title/138",[60,516.149,278,381.53]],["content/138",[13,1.533,25,1.148,31,6.048,32,2.885,58,2.313,59,5.706,60,6.494,85,5.066,86,6.048,87,6.394,88,5.38,89,5.165,90,6.593,91,5.38,92,5.165,93,6.814,94,7.347,95,4.412,96,7.678,97,8.813,98,3.619,278,4.8]],["relUrl/138",[20,0.528,278,1.853,1004,5.458]],["title/139",[20,92.265,32,268.084,278,323.675]],["content/139",[0,2.513,2,0.021,13,0.846,20,0.877,25,2.065,32,1.591,49,2.359,58,1.202,68,1.352,69,3.325,73,2.465,76,4.092,77,2.334,85,2.794,91,2.968,92,2.849,95,4.874,100,4.025,101,5.342,105,1.704,118,2.968,120,3.1,122,3.336,123,3.252,124,1.897,128,2.968,251,1.921,278,3.077,351,3.637,358,3.252,454,3.895,541,6.019,621,6.782,625,5.342,706,3.637,708,4.052,940,3.427,950,4.455,951,5.824,987,4.235,1005,5.098,1006,5.098,1007,4.73,1008,4.235,1009,4.455,1010,5.342,1011,3.1,1012,5.658,1013,4.455,1014,5.098,1015,5.658,1016,5.658,1017,5.658,1018,5.098,1019,5.098,1020,5.098,1021,5.098,1022,5.098]],["relUrl/139",[20,0.658,32,1.364,1002,4.055]],["title/140",[13,167.935,241,773.578]],["content/140",[13,2.491,58,2.212,59,4.642,241,9.06,337,9.06,528,7.381,533,9.85,583,9.425,1000,10.361,1023,13.159,1024,11.858,1025,13.159]],["relUrl/140",[20,0.604,1026,5.623]],["title/141",[20,92.265,278,323.675,997,796.879]],["content/141",[2,0.017,13,1.371,20,0.556,25,2.126,32,1.616,49,1.496,58,0.762,68,1.373,69,2.108,73,3.114,77,1.48,92,2.893,95,5.622,100,4.074,101,3.387,105,1.73,118,3.013,120,3.148,122,3.387,123,3.302,124,1.927,128,3.013,156,3.079,351,3.693,358,3.302,445,3.48,454,3.956,528,3.222,541,6.093,621,9.784,625,5.408,706,3.693,708,4.115,940,3.48,950,4.524,951,5.895,987,4.3,997,4.803,1005,5.177,1006,8.265,1007,4.803,1008,4.3,1009,4.524,1010,5.408,1011,3.148,1013,4.524,1014,5.177,1018,5.177,1019,5.177,1020,5.177,1021,5.177,1022,5.177,1027,11.449,1028,5.745,1029,5.745]],["relUrl/141",[20,0.658,1002,4.055,1030,4.851]],["title/142",[20,80.116,278,281.056,998,745.853,999,745.853]],["content/142",[2,0.009,13,0.711,20,0.46,21,6.092,25,2.232,58,1.334,59,1.677,68,1.136,85,3.884,86,2.803,89,2.394,92,2.394,95,2.045,100,2.112,105,1.432,118,2.494,120,2.605,122,2.803,123,2.733,124,1.594,129,2.494,159,2.394,186,3.975,258,3.559,309,3.273,350,3.975,351,3.056,355,3.975,358,2.733,404,4.284,429,4.284,454,3.273,457,3.743,526,4.284,541,3.158,546,4.284,565,2.667,566,4.284,621,11.048,625,2.803,635,4.284,667,3.743,669,3.273,706,3.056,708,3.405,738,4.284,911,4.284,940,2.88,950,3.743,951,3.056,1007,3.975,1008,3.559,1009,3.743,1010,4.637,1011,2.605,1031,3.559,1032,4.754,1033,4.754,1034,4.754,1035,4.754,1036,4.754,1037,2.667,1038,4.284,1039,4.754,1040,4.754,1041,4.754,1042,4.754,1043,4.754,1044,4.754,1045,4.754,1046,4.754,1047,4.754,1048,3.158,1049,4.754,1050,4.754,1051,4.754]],["relUrl/142",[20,0.611,278,1.482,1052,4.365,1053,4.365]],["title/143",[20,63.416,58,86.933,128,343.631,278,222.469,1000,515.846,1001,515.846]],["content/143",[2,0.009,13,0.764,21,6.41,25,2.304,58,1.621,59,2.945,68,1.222,72,2.939,73,1.391,85,2.526,86,3.015,87,3.188,88,2.682,89,2.575,90,5.366,91,2.682,95,2.199,100,3.709,105,1.54,118,2.682,153,2.682,156,2.74,159,2.575,241,3.521,309,3.521,338,5.98,457,4.026,458,3.828,528,2.868,533,3.828,565,4.683,621,9.142,647,3.521,667,4.026,669,3.521,1001,4.026,1037,2.868,1038,4.608,1054,5.114,1055,5.114,1056,5.114,1057,5.114,1058,5.114,1059,4.608,1060,3.098,1061,3.662,1062,5.114,1063,5.114,1064,5.114,1065,5.114,1066,5.114,1067,5.114,1068,5.114,1069,5.114,1070,5.114,1071,5.114,1072,5.114,1073,5.114]],["relUrl/143",[20,0.533,58,0.483,278,1.235,1000,2.863,1001,2.863,1074,3.636]],["title/144",[35,319.567,36,246.91]],["content/144",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/144",[20,0.528,36,1.199,1075,5.458]],["title/145",[278,464.569]],["content/145",[]],["relUrl/145",[20,0.604,1026,5.623]],["title/146",[2,1.729,49,248.196,908,547.833]],["content/146",[2,0.024,4,2.677,12,2.549,20,1.295,25,2.166,32,2.665,35,2.695,36,2.082,50,4.867,51,5.314,52,4.969,53,5.906,54,3.1,55,4.208,56,4.592,57,4.969,58,1.257,59,3.342,60,4.352,908,10.208,1031,7.092,1076,7.46]],["relUrl/146",[2,0.009,20,0.47,62,2.544,1077,4.055]],["title/147",[2,1.729,4,190.797,908,547.833]],["content/147",[0,3.651,2,0.026,4,1.645,7,2.899,13,1.228,20,0.796,25,2.163,49,3.144,54,2.689,55,3.651,58,1.899,63,4.059,64,4.979,65,5.283,66,5.46,67,5.283,68,1.964,69,3.016,70,4.504,71,4.724,72,4.724,73,3.284,74,4.311,75,5.283,76,3.712,77,2.117,78,3.712,79,5.886,80,5.886,81,5.886,82,5.886,83,5.886,908,4.724]],["relUrl/147",[2,0.009,20,0.47,908,2.788,1078,4.851]],["title/148",[60,516.149,908,645.755]],["content/148",[13,1.533,25,1.148,31,6.048,32,2.885,58,2.313,59,5.706,60,6.494,85,5.066,86,6.048,87,6.394,88,5.38,89,5.165,90,6.593,91,5.38,92,5.165,93,6.814,94,7.347,95,4.412,96,7.678,97,8.813,98,3.619,908,8.125]],["relUrl/148",[20,0.528,908,3.137,1079,5.458]],["title/149",[20,92.265,32,268.084,908,547.833]],["content/149",[0,2.125,2,0.009,4,0.958,20,0.463,21,2.899,25,2.159,32,1.346,49,1.246,58,0.635,68,1.144,69,1.756,85,2.363,100,2.125,101,4.662,105,1.441,116,3.768,118,2.51,120,2.622,122,2.821,123,2.75,124,1.605,197,4.544,258,3.582,309,3.294,351,3.076,358,2.75,454,3.294,457,7.954,625,2.821,706,3.076,708,3.427,908,5.806,940,2.899,951,5.081,1008,3.582,1009,3.768,1010,4.662,1011,2.622,1013,3.768,1037,2.684,1048,3.179,1080,4.312,1081,7.906,1082,4.785,1083,7.906,1084,4.785,1085,4.785,1086,4.785,1087,7.906,1088,4.785,1089,13.988,1090,4.785,1091,4.785,1092,4.785,1093,4.785,1094,4.785,1095,6.609,1096,4.785,1097,4.785,1098,4.785,1099,4.785,1100,4.785,1101,4.785,1102,4.785,1103,4.785,1104,7.124,1105,4.785,1106,4.785,1107,4.785,1108,4.785,1109,4.785,1110,4.785,1111,4.785,1112,4.785,1113,4.785]],["relUrl/149",[20,0.658,32,1.364,1077,4.055]],["title/150",[20,80.116,908,475.698,1031,619.545,1076,651.692]],["content/150",[2,0.01,13,1.644,20,0.524,21,8.396,25,1.971,32,2.459,45,3.725,49,1.409,58,0.718,68,2.629,74,2.838,85,2.672,101,3.19,105,3.312,118,2.838,119,3.875,120,2.965,121,4.05,122,3.19,123,3.11,124,1.815,126,3.875,128,4.585,129,2.838,153,2.838,202,4.524,249,2.965,258,6.543,279,4.26,351,3.478,358,3.11,359,3.594,415,4.26,541,3.594,556,4.524,565,3.035,606,3.725,830,4.876,865,2.838,924,4.876,940,3.278,951,5.619,968,4.05,1031,6.543,1076,9.942,1080,4.876,1095,7.308,1104,4.876,1114,5.411,1115,4.876,1116,5.411,1117,5.411,1118,5.411,1119,5.411,1120,4.524,1121,5.411,1122,5.411,1123,5.411,1124,5.411,1125,5.411,1126,5.411,1127,5.411,1128,5.411,1129,5.411,1130,5.411,1131,5.411]],["relUrl/150",[20,0.611,1031,3.267,1076,3.437,1077,3.649]],["title/151",[35,319.567,36,246.91]],["content/151",[39,5.708,40,8.194,41,8.418,69,5.099,142,8.663,143,8.194,144,6.613,145,8.932,146,6.173,147,5.099,148,9.568]],["relUrl/151",[20,0.528,36,1.199,1132,5.458]],["title/152",[908,786.302]],["content/152",[]],["relUrl/152",[20,0.604,1133,6.24]],["title/153",[2,1.501,49,215.516,58,109.826,1134,651.692]],["content/153",[2,0.027,3,7.563,4,2.947,13,2.671,25,1.648,58,1.953,1134,11.591]],["relUrl/153",[2,0.009,58,0.644,62,2.544,1135,4.851]],["title/154",[1134,1077.21]],["content/154",[13,2.117,85,6.994,128,7.427,209,9.406,458,10.6,947,12.761,968,10.6,1134,13.74,1136,14.161]],["relUrl/154",[1137,7.282]],["title/155",[73,372.168]],["content/155",[2,0.027,77,4.659,95,6.459,100,6.671,101,8.855,129,7.877]],["relUrl/155",[1138,7.282]],["title/156",[669,941.946]],["content/156",[58,1.778,59,4.726,86,7.899,88,7.026,89,6.746,91,7.026,92,6.746,424,9.594,669,9.223,1120,11.199,1139,11.199,1140,13.396,1141,13.396]],["relUrl/156",[1142,7.282]],["title/157",[16,429.459,49,292.56]],["content/157",[49,3.91,237,12.555,424,10.756,625,8.855,647,10.34,1013,11.824,1139,12.555]],["relUrl/157",[62,3.273,1143,6.24]],["title/158",[954,1143.758]],["content/158",[2,0.027,4,3.006,69,5.511,70,8.23,71,8.631,73,4.085,953,13.533]],["relUrl/158",[1144,7.282]],["title/159",[2,1.729,49,248.196,909,562.031]],["content/159",[2,0.025,4,2.803,12,2.722,20,0.979,25,2.16,32,2.846,35,2.878,36,2.224,50,5.198,51,5.675,52,5.307,53,6.308,54,3.311,55,4.495,56,4.904,57,5.307,58,1.343,59,3.569,60,4.648,909,10.219]],["relUrl/159",[2,0.009,20,0.47,62,2.544,1145,4.371]],["title/160",[2,1.729,4,190.797,909,562.031]],["content/160",[0,3.651,2,0.026,4,1.645,7,2.899,13,1.228,20,0.796,25,2.163,49,3.144,54,2.689,55,3.651,58,1.899,63,4.059,64,4.979,65,5.283,66,5.46,67,5.283,68,1.964,69,3.016,70,4.504,71,4.724,72,4.724,73,3.284,74,4.311,75,5.283,76,3.712,77,2.117,78,3.712,79,5.886,80,5.886,81,5.886,82,5.886,83,5.886,909,4.846]],["relUrl/160",[2,0.009,20,0.47,909,2.86,1146,4.851]],["title/161",[60,516.149,909,662.491]],["content/161",[13,1.533,25,1.148,31,6.048,32,2.885,58,2.313,59,5.706,60,6.494,85,5.066,86,6.048,87,6.394,88,5.38,89,5.165,90,6.593,91,5.38,92,5.165,93,6.814,94,7.347,95,4.412,96,7.678,97,8.813,98,3.619,909,8.335]],["relUrl/161",[20,0.528,909,3.218,1147,5.458]],["title/162",[20,92.265,32,268.084,909,562.031]],["content/162",[0,2.765,2,0.022,20,0.603,25,2.162,32,1.751,49,1.621,58,1.297,59,2.196,68,1.488,69,2.284,73,1.694,85,3.075,88,3.265,89,3.135,95,4.204,100,2.765,101,5.763,105,1.875,118,3.265,122,3.671,124,2.088,351,4.001,358,3.578,454,4.286,541,4.136,583,4.459,625,7.115,909,5.763,940,3.771,1010,5.763,1011,3.412,1059,5.61,1060,3.771,1061,7,1148,6.226,1149,9.774,1150,6.226,1151,9.774,1152,6.226,1153,5.61,1154,6.226,1155,6.226,1156,6.226,1157,6.226,1158,6.226,1159,6.226,1160,6.226,1161,6.226,1162,6.226,1163,6.226,1164,6.226]],["relUrl/162",[20,0.658,32,1.364,1145,4.371]],["title/163",[35,319.567,36,246.91]],["content/163",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/163",[20,0.528,36,1.199,1165,5.458]],["title/164",[909,806.681]],["content/164",[]],["relUrl/164",[20,0.604,1166,6.24]],["title/165",[12,302.299,265,841.026]],["content/165",[2,0.029,4,3.147,12,2.616,16,3.716,53,6.06,58,1.807,76,4.391,89,4.896,246,6.458,251,4.625,267,6.963,270,9.047,271,6.694,272,7.277,273,6.249,274,7.655,275,6.458,276,7.277,277,7.655,278,3.301,313,4.054,326,5.588,425,4.896,689,2.531,695,5.732,719,8.761,1167,8.128]],["relUrl/165",[265,4.671,1168,4.011]],["title/166",[278,381.53,1169,884.665]],["content/166",[2,0.03,4,3.06,7,3.259,25,1.471,49,2.406,58,1.743,73,2.513,169,5.76,249,7.2,275,8.728,276,12.465,277,7.275,425,4.653,695,5.448,761,6.916,776,8.326,855,8.326,1167,7.724,1169,7.275,1170,8.326,1171,9.239,1172,9.239,1173,9.239,1174,9.239,1175,9.239,1176,6.361]],["relUrl/166",[1168,3.508,1169,4.298,1177,5.458]],["title/167",[2,1.729,13,142.47,73,259.297]],["content/167",[2,0.032,12,3.201,13,1.778,73,4.249,89,5.991,270,7.903,271,8.191,278,4.04,413,6.376,425,7.866,695,7.015,1167,9.946,1169,9.368,1170,10.721,1178,10.721,1179,11.897]],["relUrl/167",[2,0.009,73,1.32,1168,3.118,1180,4.851]],["title/168",[13,204.486]],["content/168",[2,0.033,4,2.777,13,2.074,16,3.816,35,3.946,58,1.325,63,4.93,68,2.386,178,4.838,246,6.631,251,4.711,253,5.35,278,3.39,279,7.86,287,5.47,315,7.472,326,5.737,329,6.852,511,8.648,529,8.346,761,7.472,954,8.346]],["relUrl/168",[13,0.816,1168,3.508,1181,5.458]],["title/169",[35,319.567,36,246.91]],["content/169",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/169",[36,1.199,1168,3.508,1182,5.458]],["title/170",[12,302.299,1183,746.359]],["content/170",[12,4.21,287,8.576,661,12.322,1183,10.395,1184,14.102]],["relUrl/170",[1168,3.508,1183,3.626,1185,5.458]],["title/171",[7,482.63]],["content/171",[2,0.026,12,3.884,262,9.278,286,10.338,287,7.91,493,8.744,1186,14.435,1187,14.435,1188,13.008]],["relUrl/171",[7,1.925,1168,3.508,1189,5.458]],["title/172",[110,884.665,1183,746.359]],["content/172",[2,0.016,12,2.314,25,1.915,63,4.247,105,3.757,110,6.77,153,4.51,159,6.283,249,4.712,419,4.418,427,9.825,493,7.559,503,4.608,578,7.189,582,7.189,661,6.77,674,3.532,675,3.95,676,5.92,1183,9.756,1190,8.599,1191,12.478,1192,8.599,1193,7.189,1194,7.749,1195,8.599,1196,8.599,1197,12.478,1198,11.244,1199,8.599,1200,8.599]],["relUrl/172",[110,4.298,1168,3.508,1201,5.458]],["title/173",[12,302.299,1183,746.359]],["content/173",[]],["relUrl/173",[1168,4.011,1183,4.145]],["title/174",[2,1.729,49,248.196,173,547.833]],["content/174",[2,0.023,4,2.519,12,3.386,20,1.431,25,2.243,32,2.447,35,2.474,36,1.912,50,4.469,51,4.879,52,4.563,53,5.423,54,2.847,55,3.864,56,4.216,57,4.563,58,1.154,59,3.069,173,9.311,205,5.779,961,6.512,1202,6.85,1203,8.664]],["relUrl/174",[2,0.009,20,0.47,62,2.544,1204,4.055]],["title/175",[2,1.729,4,190.797,173,547.833]],["content/175",[0,4.686,2,0.03,4,2.111,7,3.721,13,1.577,49,3.752,54,3.452,55,4.686,58,1.912,63,5.21,64,6.39,65,6.78,66,7.007,67,6.78,68,2.521,69,3.871,70,5.781,71,6.063,73,2.87,74,5.533,75,6.78,76,4.764,77,2.717,173,6.063]],["relUrl/175",[2,0.009,20,0.47,173,2.788,1205,4.851]],["title/176",[20,92.265,32,268.084,173,547.833]],["content/176",[2,0.023,13,0.797,16,2.039,21,5.234,25,2.034,49,1.389,58,1.825,59,3.048,76,3.902,77,1.374,88,4.532,89,4.351,91,2.797,105,1.606,124,1.789,128,6.567,145,3.428,153,2.797,173,4.966,178,2.585,203,3.325,250,3.325,287,2.923,351,3.428,358,3.065,444,3.428,529,4.459,667,4.199,713,4.806,865,2.797,940,3.231,946,4.806,951,3.428,1010,5.094,1011,2.923,1060,3.231,1061,3.82,1206,5.333,1207,5.333,1208,4.806,1209,7.786,1210,7.786,1211,5.333,1212,5.333,1213,5.333,1214,4.806,1215,5.333,1216,5.333,1217,5.333,1218,5.333,1219,5.333,1220,10.89,1221,10.89,1222,10.89,1223,8.64,1224,5.333,1225,5.333,1226,4.806,1227,5.333]],["relUrl/176",[20,0.658,32,1.364,1204,4.055]],["title/177",[20,108.757,1202,884.665]],["content/177",[2,0.013,13,1.054,20,0.683,21,4.271,25,2.173,58,0.936,59,2.487,68,3.12,87,4.396,88,3.698,89,3.551,90,4.532,92,3.551,105,3.931,118,3.698,119,5.05,120,3.864,121,5.278,122,4.158,123,4.053,124,2.365,126,5.05,358,4.053,359,4.684,444,4.532,541,7.15,647,4.855,865,3.698,940,4.271,951,4.532,1095,5.895,1120,8.999,1202,10.279,1208,6.354,1209,9.7,1228,7.051,1229,7.051,1230,7.051,1231,7.051,1232,7.051,1233,7.051,1234,7.051]],["relUrl/177",[20,0.528,1202,4.298,1235,5.458]],["title/178",[20,80.116,173,475.698,205,549.809,1203,569.859]],["content/178",[2,0.025,4,1.267,13,1.48,20,0.613,25,2.021,49,2.579,54,2.072,59,2.234,68,2.367,70,3.47,73,1.722,77,2.551,105,3.673,124,2.123,128,3.321,129,5.195,205,8.104,251,2.15,275,4.206,338,7.094,378,4.739,423,7.414,537,5.293,563,4.985,630,8.925,661,4.985,761,4.739,865,3.321,1011,6.685,1203,4.359,1210,5.706,1214,5.706,1226,8.925,1236,6.332,1237,6.332,1238,6.332,1239,6.332,1240,6.332,1241,6.332,1242,9.905,1243,6.332,1244,6.332,1245,6.332,1246,6.332,1247,6.332,1248,6.332,1249,6.332]],["relUrl/178",[20,0.611,205,2.899,1203,3.005,1204,3.649]],["title/179",[12,256.459,961,713.493,1203,656.273]],["content/179",[2,0.025,12,2.616,13,2.036,25,1.524,42,9.377,58,1.29,68,3.757,77,2.504,88,5.099,163,3.567,270,9.047,421,5.21,594,5.453,779,8.761,793,8.761,961,7.277,982,6.458,1011,5.328,1203,6.694,1250,9.722,1251,9.722,1252,9.722,1253,9.722,1254,9.722,1255,9.722,1256,6.963,1257,9.722]],["relUrl/179",[20,0.47,961,3.631,1203,3.34,1258,4.851]],["title/180",[20,92.265,66,633.182,704,750.514]],["content/180",[4,2.731,32,4.796,63,6.737,76,6.161,143,8.043,688,8.504,788,9.392,919,8.504,1259,13.642,1260,13.642,1261,13.642]],["relUrl/180",[20,0.604,1262,5.623]],["title/181",[35,319.567,36,246.91]],["content/181",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/181",[20,0.528,36,1.199,1263,5.458]],["title/182",[173,786.302]],["content/182",[]],["relUrl/182",[20,0.604,1262,5.623]],["title/183",[2,2.038,163,412.282]],["content/183",[2,0.017,4,1.196,20,1.294,25,2.374,35,1.7,36,1.313,58,0.793,59,2.108,77,3.027,78,5.307,159,3.009,163,5.956,236,4.114,245,3.352,250,5.899,251,4.946,258,4.473,259,5.385,261,3.725,582,4.996,936,5.899,1264,4.996,1265,5.385,1266,4.996]],["relUrl/183",[689,1.625,1267,4.671]],["title/184",[163,502.014]],["content/184",[2,0.026,68,3.384,163,5.196,246,9.406,261,8.827,268,11.838,329,6.994,419,7.275,987,10.6,1268,12.761]],["relUrl/184",[163,2.003,689,1.421,1269,5.458]],["title/185",[261,700.407,1264,939.317]],["content/185",[2,0.024,68,3.202,77,3.451,106,7.899,156,7.179,163,4.916,246,8.899,261,8.351,262,8.61,969,11.199,1178,12.072,1264,11.199,1270,13.396]],["relUrl/185",[261,3.402,689,1.421,1271,5.458]],["title/186",[1265,1012.488,1266,939.317]],["content/186",[2,0.029,4,2.025,13,2.093,25,2.107,35,2.878,73,3.809,77,2.606,95,4.352,100,4.495,163,3.713,261,6.308,421,5.422,535,9.118,563,7.967,567,7.574,606,6.966,919,6.308,941,9.118,987,7.574,1272,10.118,1273,10.118,1274,10.118]],["relUrl/186",[689,1.421,1266,4.563,1275,5.458]],["title/187",[20,132.427]],["content/187",[2,0.02,4,1.425,13,1.064,22,5.329,25,1.769,68,1.701,87,4.438,118,5.687,120,5.941,163,3.978,169,4.438,193,8.657,261,4.438,262,4.576,553,4.438,570,5.57,706,4.576,853,5.605,868,6.415,869,11.834,870,9.77,871,5.951,872,6.415,873,9.77,874,6.415,875,6.415,876,9.77,887,6.415,888,9.77,889,5.951,891,6.415,892,6.415,893,5.951,894,6.415,895,6.415,896,6.415,898,6.415,899,6.415,1276,7.119,1277,7.119,1278,10.842,1279,7.119,1280,7.119]],["relUrl/187",[689,1.625,1281,4.913]],["title/188",[77,289.409,163,412.282]],["content/188",[4,2.889,25,1.616,58,1.915,85,7.129,95,6.209,100,6.412,159,7.269,163,5.297,1282,13.008]],["relUrl/188",[163,2.003,689,1.421,1283,4.919]],["title/189",[251,464.569]],["content/189",[2,0.012,12,1.764,13,0.98,25,2.316,68,2.981,69,2.405,72,3.767,77,1.688,105,3.064,117,8.764,163,4.576,251,2.226,314,3.064,325,4.354,334,4.513,381,5.48,389,3.767,445,3.971,570,6.407,666,4.906,691,4.694,1037,3.676,1284,7.617,1285,6.995,1286,5.161,1287,5.161,1288,5.907,1289,9.169,1290,9.169,1291,5.907,1292,5.907,1293,5.907]],["relUrl/189",[689,1.625,1294,5.216]],["title/190",[684,645.755,865,589.32]],["content/190",[13,1.967,36,2.892,68,3.145,77,3.39,105,3.962,163,6.117,301,11.001,565,9.35,570,6.761,865,6.902,1285,7.381,1295,11.858]],["relUrl/190",[689,1.625,1267,4.671]],["title/191",[250,700.407,251,381.53]],["content/191",[2,0.017,4,0.849,12,1.141,13,1.385,16,4.157,20,0.692,25,2.263,31,4.214,54,1.387,58,0.563,98,1.496,105,1.277,106,2.5,117,4.455,124,2.397,178,3.464,182,2.378,197,2.437,203,2.643,248,2.919,251,3.146,252,3.83,253,2.272,254,2.725,270,2.816,271,2.919,273,2.725,278,1.44,287,3.916,313,1.768,314,1.982,326,2.437,329,2.094,359,2.816,379,2.725,410,2.055,503,2.272,511,2.643,515,2.643,520,2.725,521,2.725,528,2.378,565,2.378,570,2.178,674,3.805,675,4.256,678,4.594,692,5.775,695,4.214,723,2.816,724,2.816,728,2.568,729,2.725,850,2.816,857,5.119,1010,2.5,1011,2.323,1037,2.378,1176,2.919,1285,2.378,1296,3.545,1297,3.338,1298,3.037,1299,3.037,1300,3.037,1301,6.635,1302,3.037,1303,3.174,1304,3.174,1305,2.919,1306,5.35]],["relUrl/191",[251,1.853,689,1.421,1307,4.919]],["title/192",[20,108.757,78,507.45]],["content/192",[25,2.199,68,1.881,77,2.028,95,6.001,163,2.888,197,4.524,226,5.892,299,6.895,474,7.516,865,4.129,1048,7.768,1256,9.993,1308,7.093,1309,6.198,1310,6.581,1311,7.871,1312,7.871,1313,7.871,1314,7.871,1315,7.871,1316,7.093,1317,7.871,1318,10.538,1319,10.538,1320,10.538,1321,10.538,1322,9.207,1323,6.581,1324,7.871]],["relUrl/192",[78,2.465,689,1.421,1281,4.298]],["title/193",[299,662.491,474,722.172]],["content/193",[77,4.246,97,8.061,163,6.049,197,7.432,236,8.903,299,9.72,329,6.386,383,10.81,515,8.061,551,11.652,552,10.81,1325,12.931]],["relUrl/193",[689,1.625,1267,4.671]],["title/194",[163,412.282,236,773.578]],["content/194",[25,1.423,58,1.686,77,3.274,78,5.74,85,6.277,95,5.467,100,5.646,159,6.4,163,4.664,236,8.751,936,7.923,1309,10.007,1326,11.453,1327,12.71,1328,12.71,1329,11.453]],["relUrl/194",[163,2.003,689,1.421,1330,5.458]],["title/195",[251,464.569]],["content/195",[2,0.012,12,1.764,13,0.98,25,2.316,68,2.981,69,2.405,72,3.767,105,3.064,117,8.764,163,4.576,236,4.513,251,2.226,314,3.064,325,4.354,334,4.513,381,5.48,389,3.767,445,3.971,570,6.407,666,4.906,691,4.694,1037,3.676,1284,7.617,1285,6.995,1286,5.161,1287,5.161,1288,5.907,1289,9.169,1290,9.169,1291,5.907,1292,5.907,1293,5.907]],["relUrl/195",[197,3.137,689,1.421,1294,4.563]],["title/196",[684,645.755,865,589.32]],["content/196",[13,1.967,36,2.892,68,3.145,77,3.39,105,3.962,163,6.117,301,11.001,565,9.35,570,6.761,865,6.902,1285,7.381,1295,11.858]],["relUrl/196",[689,1.625,1267,4.671]],["title/197",[250,700.407,251,381.53]],["content/197",[2,0.021,3,1.966,4,1.719,12,1.029,13,1.283,16,4.37,20,0.634,25,2.265,31,3.862,54,1.252,58,0.508,74,2.007,98,1.35,105,1.152,106,2.256,117,4.083,124,2.196,178,3.174,182,2.146,197,2.199,203,2.385,248,2.634,251,2.916,252,3.51,253,2.05,254,2.459,267,2.74,270,4.351,271,2.634,272,2.864,273,2.459,275,2.541,276,2.864,278,2.224,287,3.589,313,1.595,314,1.788,326,2.199,329,1.89,359,2.541,379,2.459,410,1.854,503,2.05,511,2.385,515,2.385,520,2.459,521,2.459,528,2.146,565,2.146,570,1.966,674,3.527,675,3.945,678,4.21,692,5.353,695,3.862,723,2.541,724,2.541,728,2.318,729,2.459,850,2.541,857,4.691,1010,2.256,1011,2.097,1037,2.146,1176,2.634,1285,2.146,1296,3.198,1297,3.012,1298,2.74,1299,2.74,1300,2.74,1301,6.15,1302,2.74,1303,2.864,1304,2.864,1305,2.634,1306,4.902,1331,3.448]],["relUrl/197",[197,2.788,251,1.647,689,1.263,1307,4.371]],["title/198",[2,1.729,77,245.523,163,349.764]],["content/198",[2,0.023,4,2.588,13,1.933,25,1.447,58,1.716,77,3.331,78,5.84,85,6.386,95,5.562,100,5.744,159,6.511,163,4.745,936,8.061,1309,10.181,1332,12.931]],["relUrl/198",[2,0.009,163,1.78,689,1.263,1283,4.371]],["title/199",[163,412.282,245,630.215]],["content/199",[2,0.029,13,1.807,25,1.353,77,4.066,100,5.371,163,4.436,245,6.782,287,6.626,325,8.031,511,7.537,1309,9.52,1316,14.225,1333,12.091,1334,12.091,1335,12.091,1336,12.091]],["relUrl/199",[689,1.625,1267,4.671]],["title/200",[251,464.569]],["content/200",[2,0.017,13,1.381,25,2.288,35,2.628,68,2.208,72,8.788,77,2.38,163,3.39,251,3.137,261,5.76,334,6.361,445,5.597,570,4.747,666,9.835,1037,5.182,1268,8.326,1284,9.835,1285,5.182,1337,13.139,1338,9.239,1339,9.239]],["relUrl/200",[169,3.402,689,1.421,1294,4.563]],["title/201",[163,412.282,936,700.407]],["content/201",[25,1.648,60,6.762,69,5.402,163,5.402,865,7.721,936,9.176,1282,13.265,1340,14.721]],["relUrl/201",[163,2.003,689,1.421,1341,4.919]],["title/202",[20,108.757,78,507.45]],["content/202",[25,2.046,68,1.58,89,3.33,105,1.991,170,5.374,245,3.709,253,3.544,254,4.25,267,4.736,441,4.736,570,3.397,625,6.041,696,4.553,723,4.393,724,4.393,832,14.955,971,5.207,991,4.393,1011,3.624,1256,4.736,1285,3.709,1310,5.528,1342,5.959,1343,5.959,1344,5.959,1345,9.232,1346,9.232,1347,5.959,1348,5.959,1349,5.959,1350,5.959,1351,5.959,1352,5.959,1353,5.959,1354,5.528,1355,5.959,1356,5.959,1357,5.959,1358,5.959,1359,5.959,1360,5.959,1361,5.959,1362,5.959,1363,5.959,1364,5.207,1365,5.959,1366,5.959,1367,5.959,1368,5.959]],["relUrl/202",[78,2.191,197,2.788,689,1.263,1281,3.819]],["title/203",[163,349.764,245,534.649,936,594.197]],["content/203",[25,1.616,60,6.631,69,5.297,163,5.297,245,8.097,865,7.571,936,8.999,1329,13.008,1369,14.435]],["relUrl/203",[163,1.78,245,2.721,689,1.263,1341,4.371]],["title/204",[20,108.757,78,507.45]],["content/204",[25,2.046,68,1.58,89,3.33,105,1.991,170,5.374,245,3.709,253,3.544,254,4.25,267,4.736,441,4.736,570,3.397,625,6.041,696,4.553,723,4.393,724,4.393,832,14.955,971,5.207,991,4.393,1011,3.624,1256,4.736,1285,3.709,1310,5.528,1342,5.959,1343,5.959,1344,5.959,1345,9.232,1346,9.232,1347,5.959,1348,5.959,1349,5.959,1350,5.959,1351,5.959,1352,5.959,1353,5.959,1354,5.528,1355,5.959,1356,5.959,1357,5.959,1358,5.959,1359,5.959,1360,5.959,1361,5.959,1362,5.959,1363,5.959,1364,5.207,1365,5.959,1366,5.959,1367,5.959,1368,5.959]],["relUrl/204",[78,2.191,169,3.024,689,1.263,1281,3.819]],["title/205",[35,319.567,36,246.91]],["content/205",[39,5.708,40,8.194,41,8.418,69,5.099,142,8.663,143,8.194,144,6.613,145,8.932,146,6.173,147,5.099,148,9.568]],["relUrl/205",[36,1.199,689,1.421,1370,5.458]],["title/206",[1060,680.624,1371,841.026]],["content/206",[2,0.028,3,8.04,77,4.031,1060,9.48,1371,11.714]],["relUrl/206",[1060,3.78,1372,4.671]],["title/207",[7,482.63]],["content/207",[2,0.03,4,2.544,12,3.42,25,2.015,105,3.827,419,6.53,445,7.699,647,8.751,1060,9.877,1061,9.103,1371,12.204]],["relUrl/207",[7,1.925,1372,4.086,1373,5.458]],["title/208",[20,132.427]],["content/208",[2,0.026,16,5.518,25,1.616,416,10.338,417,10.338,647,9.939,1060,8.744,1061,10.338,1371,10.805]],["relUrl/208",[1372,4.671,1374,6.24]],["title/209",[7,396.363,1375,1123.575]],["content/209",[2,0.03,5,11.652,12,4.435,50,6.643,51,7.253,52,6.782,156,6.929,435,7.624,493,7.833,594,7.253,1060,7.833,1153,11.652,1371,9.679]],["relUrl/209",[1060,3.78,1372,4.671]],["title/210",[35,319.567,36,246.91]],["content/210",[37,7.275,38,7.275,39,5.816,40,8.349,41,8.578,42,9.75,43,10.6,44,10.6,45,9.75,46,9.75]],["relUrl/210",[36,1.199,1372,4.086,1376,5.458]],["title/211",[313,468.513,991,746.359]],["content/211",[2,0.033,4,3.006,13,2.245,49,3.91,58,1.993,991,9.976]],["relUrl/211",[991,3.626,1377,4.086,1378,5.458]],["title/212",[7,482.63]],["content/212",[2,0.019,4,2.111,7,3.721,13,1.577,16,4.032,58,1.912,159,7.257,178,5.112,252,5.653,253,5.653,269,9.506,313,4.399,328,9.506,329,5.21,428,7.896,519,10.787,684,6.063,692,6.576,922,10.787,991,10.903,1364,8.306,1379,10.549]],["relUrl/212",[7,1.925,1377,4.086,1380,5.458]],["title/213",[20,108.757,32,316.002]],["content/213",[2,0.023,16,3.287,20,0.832,25,1.997,68,2.055,77,3.214,251,2.92,252,4.608,253,4.608,441,6.158,446,7.189,534,7.189,583,6.158,625,5.07,696,5.92,871,7.189,922,6.437,967,7.749,968,6.437,969,7.189,971,6.77,976,7.749,978,7.749,991,9.756,1354,7.189,1364,6.77,1381,8.599,1382,8.599,1383,8.599,1384,8.599,1385,8.599,1386,8.599,1387,8.599,1388,8.599,1389,8.599]],["relUrl/213",[32,1.535,1377,4.086,1390,5.458]],["title/214",[35,319.567,36,246.91]],["content/214",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/214",[36,1.199,1377,4.086,1391,5.458]],["title/215",[313,468.513,922,841.026]],["content/215",[]],["relUrl/215",[313,2.602,1377,4.671]],["title/216",[2,2.038,73,305.645]],["content/216",[2,0.018,20,0.941,25,2.215,35,2.765,36,2.136,58,1.807,59,3.43,73,2.645,77,2.504,98,3.43,105,2.927,250,6.06,251,3.301,252,7.299,313,6.555,425,4.896,494,6.249,495,6.458,553,6.06,689,2.531,861,8.761,1326,8.761]],["relUrl/216",[2,0.01,689,1.421,1392,3.758]],["title/217",[2,1.729,73,259.297,77,245.523]],["content/217",[4,1.972,8,4.96,13,1.472,20,0.953,25,1.103,30,4.525,32,2.77,58,1.307,63,4.865,73,2.68,100,4.376,101,5.808,231,8.235,307,7.756,313,5.732,334,6.782,345,9.131,352,7.756,353,8.877,354,8.877,355,8.235,410,4.774,421,5.279,684,5.661,914,12.386,915,8.235,1115,8.877,1393,9.851,1394,9.851,1395,9.851]],["relUrl/217",[2,0.008,73,1.187,689,1.137,1392,3.005,1396,4.365]],["title/218",[250,700.407,251,381.53]],["content/218",[2,0.019,4,0.983,12,1.321,13,1.207,16,3.932,20,0.475,25,2.253,35,1.397,58,1.072,63,3.989,98,1.733,105,1.479,106,2.896,197,2.823,202,4.106,203,3.062,248,3.381,251,2.743,252,4.329,253,2.632,254,3.157,272,3.676,273,3.157,278,1.668,313,2.048,314,2.296,326,2.823,389,2.823,410,2.38,425,2.473,436,2.975,445,2.975,493,6.232,500,3.867,503,2.632,511,3.062,515,5.035,520,3.157,521,3.157,528,2.755,565,2.755,606,3.381,608,4.106,674,3.318,675,2.256,678,5.192,692,3.062,695,4.763,723,3.262,724,3.262,728,2.975,729,3.157,850,3.262,1176,3.381,1194,4.426,1298,3.517,1299,3.517,1300,3.517,1302,3.517,1305,3.381,1306,6.046,1397,4.911,1398,4.911,1399,4.426,1400,4.426,1401,4.106]],["relUrl/218",[251,1.647,689,1.263,1392,3.34,1402,4.851]],["title/219",[20,108.757,313,468.513]],["content/219",[2,0.025,16,5.312,169,8.663,313,5.795,413,7.447,494,8.932,495,9.231,500,10.941,576,12.522,1403,13.896,1404,13.896]],["relUrl/219",[20,0.47,689,1.263,1392,3.34,1405,4.371]],["title/220",[252,443.551,313,345.132,425,416.79,553,515.958]],["content/220",[16,4.621,20,1.17,58,1.604,105,3.641,252,8.459,421,6.479,425,6.088,511,7.537,553,7.537,692,7.537,695,9.308,1298,8.659,1299,8.659,1300,8.659,1406,12.091,1407,12.091,1408,12.091]],["relUrl/220",[252,2.126,425,1.998,553,2.473,689,1.033,1392,2.732,1405,3.575]],["title/221",[105,338.326,252,602.116]],["content/221",[3,7.139,13,2.077,55,6.173,105,4.184,252,9.244,370,9.231,528,7.794,596,10.941,1409,13.896,1410,13.896]],["relUrl/221",[252,2.599,689,1.263,1392,3.34,1411,4.851]],["title/222",[35,235.411,36,181.888,98,291.982,689,215.516]],["content/222",[2,0.023,4,2.501,13,1.868,36,2.746,39,5.133,58,1.658,69,4.585,98,4.408,142,7.79,147,4.585,230,11.261,560,9.839,561,11.261,689,3.254,1139,10.447,1412,12.497,1413,12.497]],["relUrl/222",[36,0.872,47,3.575,98,1.4,689,1.532,1392,2.732]],["title/223",[13,142.47,54,311.895,124,319.664]],["content/223",[2,0.028,3,7.874,13,2.291,54,5.015,124,5.14,178,7.428]],["relUrl/223",[54,1.786,124,1.83,1414,3.758]],["title/224",[7,482.63]],["content/224",[2,0.022,12,2.236,13,1.819,16,4.652,25,1.974,54,2.719,58,1.615,77,3.135,105,2.503,124,6.265,156,4.454,178,6.98,185,5.952,251,4.133,323,6.948,358,6.996,379,5.342,392,7.489,570,4.27,771,6.544,1010,4.9,1011,4.554,1415,8.311,1416,8.311,1417,8.311,1418,8.311]],["relUrl/224",[7,1.711,54,1.587,1414,3.34,1419,4.851]],["title/225",[12,256.459,124,319.664,1401,796.879]],["content/225",[12,3.67,13,2.039,124,5.718,182,7.652,203,8.504,329,6.737,419,7.008,436,8.264,515,8.504,520,8.768,521,8.768]],["relUrl/225",[54,1.786,124,1.83,1414,3.758]],["title/226",[20,132.427]],["content/226",[2,0.013,12,1.181,13,0.656,25,2.105,32,1.235,49,1.143,54,1.436,68,1.049,98,1.549,105,2.216,118,3.86,120,4.033,122,5.602,123,5.46,124,4.774,129,2.303,153,2.303,193,2.588,358,5.46,379,2.822,416,3.144,417,3.144,421,2.353,454,5.066,647,3.022,674,1.803,675,2.017,676,3.022,689,1.143,704,3.456,706,2.822,707,3.67,709,3.456,853,3.456,889,3.67,893,3.67,1008,3.286,1010,2.588,1060,5.755,1061,6.804,1183,2.916,1198,13.457,1420,4.39,1421,4.39,1422,4.39,1423,4.39,1424,4.39,1425,4.39,1426,4.39,1427,4.39,1428,7.359,1429,4.39,1430,4.39,1431,7.359,1432,4.39,1433,4.39,1434,4.39,1435,7.359,1436,4.39,1437,4.39,1438,4.39,1439,4.39,1440,4.39,1441,4.39,1442,4.39,1443,4.39,1444,4.39,1445,4.39,1446,4.39,1447,4.39,1448,4.39,1449,4.39,1450,7.359,1451,4.39,1452,4.39,1453,4.39]],["relUrl/226",[54,1.786,1414,3.758,1454,5.458]],["title/227",[13,142.47,124,319.664,962,750.514]],["content/227",[12,3.42,15,7.923,58,1.686,68,3.038,124,5.468,156,6.811,178,7.902,314,5.941,419,6.53,440,14.692,462,9.514,962,10.007,1037,7.129]],["relUrl/227",[54,1.428,124,1.464,962,3.437,1414,3.005,1455,4.365]],["title/228",[193,431.244,1184,659.071,1456,659.071,1457,659.071,1458,659.071]],["content/228",[2,0.028,4,1.873,12,4.142,13,1.398,58,1.241,68,2.236,76,4.225,77,2.41,98,3.3,106,5.516,124,4.445,152,6.7,174,7.821,175,7.821,177,7.821,193,5.516,220,6.441,251,3.177,253,5.013,274,7.366,295,7.821,324,6.215,326,7.618,503,5.013,606,6.441,608,7.821,850,6.215,1400,8.43,1459,9.355,1460,9.355,1461,9.355]],["relUrl/228",[54,1.19,193,2.144,1414,2.504,1456,3.277,1457,3.277,1458,3.277,1462,3.636]],["title/229",[35,319.567,36,246.91]],["content/229",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/229",[36,1.066,54,1.587,466,4.371,1414,3.34]],["title/230",[2,1.501,13,123.71,49,215.516,58,109.826]],["content/230",[2,0.028,4,1.592,20,1.141,25,2.354,35,2.263,36,1.748,56,3.856,57,4.173,58,1.056,59,2.806,60,3.655,68,1.901,77,2.049,78,5.323,105,2.396,250,4.959,251,4.768,331,5.955,435,4.691,594,4.462,683,5.285,689,2.072]],["relUrl/230",[2,0.007,58,0.526,62,2.081,689,1.033,1463,2.174,1464,3.967]],["title/231",[60,628.488]],["content/231",[2,0.018,13,2.366,25,1.918,31,5.808,32,2.77,58,2.101,59,4.849,60,6.314,77,2.537,85,4.865,86,5.808,87,6.141,88,5.167,89,4.96,90,8.835,91,5.167,92,4.96,93,6.543,94,7.055,95,4.237,165,5.525,1024,8.877,1465,9.851]],["relUrl/231",[689,1.421,1463,2.991,1466,5.458]],["title/232",[2,2.038,77,289.409]],["content/232",[2,0.026,4,2.889,25,1.616,58,1.915,85,7.129,95,6.209,100,6.412,101,8.511,159,7.269]],["relUrl/232",[2,0.009,689,1.263,1463,2.658,1467,4.851]],["title/233",[251,464.569]],["content/233",[2,0.019,4,1.398,12,1.879,25,2.287,68,3.475,69,2.563,72,4.015,73,3.531,77,1.799,105,3.218,117,8.091,251,2.372,313,2.913,314,4.995,325,4.64,334,4.809,389,4.015,421,3.743,445,4.231,570,3.589,606,4.809,666,5.229,684,4.015,691,5.003,1037,3.918,1193,5.84,1284,7.999,1285,3.918,1286,5.5,1287,5.5,1468,6.294,1469,6.294,1470,5.84,1471,6.294]],["relUrl/233",[689,1.421,1463,2.991,1472,5.458]],["title/234",[684,645.755,865,589.32]],["content/234",[2,0.027,68,3.589,73,4.085,77,3.868,105,4.522,565,8.423,865,7.877]],["relUrl/234",[58,0.724,689,1.421,1463,2.991]],["title/235",[250,700.407,251,381.53]],["content/235",[2,0.022,3,1.825,4,1.936,12,0.956,13,1.213,16,4.573,20,0.595,25,2.272,31,3.623,54,1.162,58,0.815,74,1.863,98,1.253,105,1.07,106,2.094,117,3.83,124,2.06,178,2.978,182,1.992,197,2.041,203,2.214,248,2.446,251,2.757,252,3.293,253,1.903,254,2.283,267,2.544,270,4.081,271,2.446,272,4.599,273,2.283,275,2.359,276,2.659,278,2.086,287,3.367,313,1.481,314,1.66,326,2.041,329,1.754,359,2.359,379,2.283,389,2.041,410,1.722,425,1.789,503,1.903,511,2.214,515,2.214,520,2.283,521,2.283,528,1.992,565,1.992,570,1.825,674,3.973,675,3.73,678,3.949,692,5.061,695,3.623,723,2.359,724,2.359,728,2.152,729,2.283,850,2.359,857,4.4,1010,2.094,1011,1.946,1037,1.992,1176,2.446,1285,1.992,1296,2.969,1297,2.797,1298,2.544,1299,2.544,1300,2.544,1301,5.815,1302,2.544,1303,2.659,1304,2.659,1305,2.446,1306,4.599,1331,5.537,1399,3.201]],["relUrl/235",[251,1.647,689,1.263,1463,2.658,1473,4.851]],["title/236",[20,108.757,78,507.45]],["content/236",[12,2.096,13,1.164,25,2.194,68,1.862,73,2.119,77,2.006,79,5.579,80,5.579,81,5.579,82,5.579,83,5.579,92,3.922,95,5.964,226,5.83,299,4.593,351,5.006,474,5.006,482,5.579,771,6.133,865,4.085,1048,7.707,1256,9.931,1308,7.019,1318,10.456,1319,10.456,1320,10.456,1321,10.456,1322,9.136,1323,6.512,1474,7.789,1475,7.789,1476,7.789]],["relUrl/236",[78,2.191,689,1.263,1463,2.658,1477,4.371]],["title/237",[2,2.038,689,292.56]],["content/237",[2,0.03,13,2.06,25,1.831,73,3.132,77,1.986,88,4.043,165,4.324,205,9.154,209,5.12,220,5.307,287,4.224,293,6.946,307,6.069,309,5.307,314,3.603,316,6.444,324,5.12,338,5.521,425,3.882,532,6.946,537,6.444,548,6.946,549,10.375,550,6.946,578,6.444,731,6.069,915,6.444,1401,6.444,1478,11.513,1479,6.946,1480,7.708,1481,13.78,1482,7.708,1483,7.708,1484,7.708,1485,7.708,1486,7.708]],["relUrl/237",[2,0.009,689,1.263,1463,2.658,1487,4.851]],["title/238",[435,662.491,594,630.215]],["content/238",[20,0.738,25,2.264,35,2.17,50,7.036,51,6.408,52,5.992,58,1.012,70,4.181,71,4.385,73,2.075,156,4.089,393,5.711,421,4.089,435,6.736,493,4.622,503,4.089,594,6.408,596,8.995,597,12.342,598,12.342,599,12.342,600,12.342,601,6.875,602,6.875,603,6.875]],["relUrl/238",[594,2.721,689,1.263,1463,2.658,1488,4.851]],["title/239",[50,577.236,493,680.624]],["content/239",[4,2.947,50,9.181,58,1.953,73,4.004,338,10.543,493,8.917,596,11.591]],["relUrl/239",[58,0.724,689,1.421,1463,2.991]],["title/240",[251,381.53,683,746.359]],["content/240",[2,0.028,16,3.107,25,2.335,73,2.211,209,5.4,249,4.455,251,2.76,503,4.356,545,6.796,570,4.176,674,4.919,675,5.502,683,5.4,1037,4.56,1285,4.56,1301,10.183,1305,8.246,1489,11.976,1490,8.129,1491,8.129,1492,8.129]],["relUrl/240",[251,1.647,689,1.263,1463,2.658,1493,4.851]],["title/241",[2,2.038,331,841.026]],["content/241",[2,0.032,13,1.555,25,1.164,58,1.38,63,7.049,69,3.817,73,2.829,95,4.474,205,6.909,331,12.196,336,9.373,337,9.826,401,11.238,704,8.19,821,9.373,918,9.373,1188,9.373,1479,9.373,1494,10.401,1495,10.401,1496,10.401]],["relUrl/241",[2,0.009,689,1.263,1463,2.658,1497,4.851]],["title/242",[20,108.757,78,507.45]],["content/242",[25,1.789,1256,11.448,1284,11.965,1498,15.985]],["relUrl/242",[78,2.191,689,1.263,1463,2.658,1477,4.371]],["title/243",[35,319.567,36,246.91]],["content/243",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/243",[36,1.066,689,1.263,1463,2.658,1499,4.851]],["title/244",[13,167.935,58,149.088]],["content/244",[]],["relUrl/244",[58,0.724,689,1.421,1463,2.991]],["title/245",[2,1.729,49,248.196,910,682.673]],["content/245",[2,0.027,4,2.971,20,1.066,25,2.209,32,3.098,35,3.133,36,2.421,50,5.66,51,6.179,52,5.778,56,5.339,57,5.778,58,1.462,59,3.886,346,9.21,910,10.629]],["relUrl/245",[2,0.009,20,0.47,62,2.544,1500,4.851]],["title/246",[2,1.729,4,190.797,910,682.673]],["content/246",[0,4.822,2,0.03,4,2.173,7,3.83,13,1.623,49,3.826,54,3.552,55,4.822,58,1.95,63,5.362,64,6.576,67,6.978,68,2.595,69,3.984,70,5.949,71,6.239,73,2.953,74,5.694,75,6.978,76,4.903,77,2.796,910,7.775]],["relUrl/246",[2,0.009,20,0.47,1501,4.851,1502,4.851]],["title/247",[20,108.757,32,316.002]],["content/247",[2,0.01,4,1.15,13,1.371,16,2.196,25,2.006,32,1.616,58,0.762,68,3.124,72,3.302,73,1.563,77,1.48,78,2.595,100,4.074,101,3.387,102,8.265,103,4.803,104,3.956,105,3.936,106,3.387,107,5.177,109,5.177,114,4.803,115,4.803,116,7.222,117,5.718,118,3.013,119,4.115,120,3.148,121,4.3,122,3.387,123,3.302,124,1.927,125,5.177,126,4.115,128,3.013,129,6.005,132,5.177,134,5.177,135,5.177,136,5.177,423,8.57,583,6.569,951,3.693,1470,4.803,1503,5.745,1504,9.172,1505,9.172,1506,13.071,1507,5.745,1508,5.745,1509,5.745,1510,5.745,1511,5.745,1512,5.745,1513,5.745,1514,5.745]],["relUrl/247",[20,0.528,32,1.535,1515,5.458]],["title/248",[35,319.567,36,246.91]],["content/248",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/248",[20,0.528,36,1.199,1516,5.458]],["title/249",[910,979.838]],["content/249",[]],["relUrl/249",[20,0.604,1517,6.24]],["title/250",[2,1.729,8,479.992,49,248.196]],["content/250",[2,0.032,4,1.559,8,6.982,12,2.096,25,2.256,30,5.33,35,2.215,36,1.712,49,4.001,53,4.856,54,2.549,55,3.46,58,1.034,59,2.748,60,3.578,73,2.119,77,2.989,91,4.085,162,6.133,343,5.579,344,5.83,982,5.174,1048,5.174,1322,6.133,1518,7.019,1519,6.512]],["relUrl/250",[2,0.01,62,2.863,1520,5.458]],["title/251",[91,589.32,982,746.359]],["content/251",[2,0.03,8,6.511,25,2.139,30,5.94,49,3.367,73,3.518,77,4.246,406,11.652,419,6.643,982,8.589]],["relUrl/251",[982,4.145,1521,6.24]],["title/252",[60,628.488]],["content/252",[25,1.499,30,6.154,58,2.237,59,5.947,88,7.026,89,6.746,92,6.746,97,8.351,165,7.514,343,9.594,940,8.115]],["relUrl/252",[1522,7.282]],["title/253",[2,1.729,49,248.196,77,245.523]],["content/253",[2,0.022,4,0.977,8,2.457,12,2.162,13,0.729,20,0.472,25,2.276,30,2.241,54,1.596,58,1.066,68,2.838,69,1.79,76,2.204,77,2.069,98,1.721,105,2.419,106,4.737,117,6.384,124,2.694,159,2.457,178,3.894,182,2.737,197,2.804,203,3.041,248,3.359,253,2.615,254,3.136,273,3.136,278,1.657,313,2.034,314,2.281,325,3.241,326,2.804,329,2.41,359,3.241,379,3.136,389,2.804,503,2.615,515,3.041,520,3.136,521,3.136,528,2.737,565,4.506,570,2.507,691,3.494,728,2.956,729,3.136,850,3.241,865,2.559,956,4.079,1010,2.877,1011,2.674,1037,2.737,1176,3.359,1285,2.737,1286,3.842,1287,3.842,1297,3.842,1301,3.494,1302,3.494,1303,3.652,1304,3.652,1305,3.359,1523,4.879]],["relUrl/253",[2,0.01,62,2.863,1524,4.919]],["title/254",[68,268.54,261,700.407]],["content/254",[2,0.022,8,7.866,13,1.778,30,7.176,68,2.844,77,3.064,106,9.21,159,5.991,436,7.207,563,9.368,922,8.905,1525,11.897,1526,11.897,1527,11.897,1528,11.897,1529,11.897,1530,11.897]],["relUrl/254",[1531,6.562]],["title/255",[2,1.729,73,259.297,77,245.523]],["content/255",[2,0.012,4,1.795,8,2.042,12,1.091,13,1.34,16,4.039,20,0.393,25,2.249,30,1.863,31,4.058,58,0.538,68,0.969,73,2.874,98,1.431,105,1.221,106,4.058,117,4.29,182,2.275,197,2.331,203,2.528,248,2.792,251,2.337,252,3.688,253,2.173,254,2.606,273,2.606,278,1.377,287,3.772,307,3.193,313,3.739,314,3.217,326,2.331,329,2.003,410,1.965,421,2.173,503,2.173,511,2.528,515,2.528,520,2.606,521,2.606,528,2.275,565,2.275,570,2.083,606,2.792,674,3.683,675,4.119,678,4.424,684,2.331,692,5.589,695,4.058,723,2.694,724,2.694,728,2.456,729,2.606,850,2.694,857,4.929,865,2.127,956,3.39,1037,2.275,1176,2.792,1193,3.39,1285,2.275,1298,2.904,1299,2.904,1300,2.904,1301,6.422,1302,2.904,1303,3.035,1304,3.035,1305,2.792,1306,5.152,1468,3.654,1469,3.654,1470,3.39,1471,3.654]],["relUrl/255",[2,0.01,73,1.485,1524,4.919]],["title/256",[1518,1232.854]],["content/256",[8,7.131,30,6.505,36,3.112,39,5.816,69,5.196,146,6.29,147,5.196,410,6.863,968,10.6,1532,14.161]],["relUrl/256",[1533,7.282]],["title/257",[2,1.729,49,248.196,162,750.514]],["content/257",[2,0.03,13,1.9,49,3.309,56,6.16,76,5.74,77,3.274,162,10.007,217,9.103,236,8.751,246,8.443,522,9.103,553,7.923,1534,12.71,1535,12.71,1536,12.71]],["relUrl/257",[2,0.01,62,2.863,1537,5.458]],["title/258",[1048,746.359,1322,884.665]],["content/258",[2,0.023,63,6.277,77,3.274,92,6.4,143,7.494,299,9.613,402,10.007,463,11.453,474,8.169,482,9.103,579,11.453,1048,8.443,1323,10.626,1538,12.71,1539,12.71]],["relUrl/258",[1048,4.145,1540,6.24]],["title/259",[2,2.038,1519,939.317]],["content/259",[2,0.019,12,2.798,13,1.555,63,7.049,73,2.829,76,4.698,106,6.133,174,8.695,253,5.574,278,3.532,279,8.19,313,6.794,326,5.978,377,7.786,402,8.19,416,7.449,425,7.187,503,5.574,520,6.685,521,6.685,1519,8.695,1541,10.401,1542,10.401,1543,10.401,1544,10.401]],["relUrl/259",[2,0.011,1545,6.24]],["title/260",[35,319.567,36,246.91]],["content/260",[36,3.112,37,7.275,38,7.275,39,5.816,98,4.995,146,6.29,147,5.196,409,7.275,410,6.863,411,8.139]],["relUrl/260",[36,1.371,1546,6.24]],["title/261",[8,565.788,30,516.149]],["content/261",[]],["relUrl/261",[1531,6.562]]],"invertedIndex":[["",{"_index":25,"title":{"50":{"position":[[25,1]]}},"content":{"1":{"position":[[250,1]]},"2":{"position":[[4655,1]]},"3":{"position":[[135,1]]},"6":{"position":[[105,1],[107,1],[135,1],[160,1],[178,1],[191,1],[193,1]]},"7":{"position":[[0,1],[2,1],[120,1],[160,1],[221,1],[223,1],[306,1],[308,1],[381,1],[383,1]]},"8":{"position":[[289,1]]},"9":{"position":[[325,1],[341,1],[362,1],[391,1],[450,1],[501,3],[523,1],[542,1],[563,1],[681,1],[690,1],[692,1],[714,1],[830,1],[832,1],[847,2],[850,1],[863,1],[865,1],[867,2],[870,1],[892,1],[972,2],[1047,1],[1049,1],[1051,1],[1053,1]]},"13":{"position":[[0,1],[2,1],[16,1],[107,1],[129,1],[197,1],[199,1]]},"14":{"position":[[16,1]]},"15":{"position":[[19,1]]},"16":{"position":[[19,1]]},"17":{"position":[[16,1],[282,1],[321,1],[323,1]]},"18":{"position":[[16,1],[229,1],[254,1],[256,1]]},"19":{"position":[[15,1],[136,1],[168,1],[170,1]]},"20":{"position":[[15,1],[135,1],[178,1],[180,1]]},"21":{"position":[[14,1],[220,1],[253,1],[255,1]]},"22":{"position":[[14,1]]},"23":{"position":[[14,1]]},"24":{"position":[[13,1]]},"25":{"position":[[13,1]]},"26":{"position":[[14,1]]},"27":{"position":[[15,1]]},"28":{"position":[[18,1]]},"29":{"position":[[18,1]]},"30":{"position":[[18,1]]},"31":{"position":[[90,1],[92,1],[122,1],[133,1],[146,1],[148,1]]},"32":{"position":[[129,1],[346,1],[362,1],[406,2],[409,1]]},"33":{"position":[[67,1],[139,1],[141,1]]},"36":{"position":[[218,1],[335,1],[498,1],[500,1]]},"40":{"position":[[129,1]]},"41":{"position":[[248,1]]},"42":{"position":[[123,1],[217,1],[371,1],[373,1]]},"46":{"position":[[238,1]]},"47":{"position":[[212,1]]},"48":{"position":[[52,1],[141,1],[148,1],[178,1],[180,1],[416,1],[418,1]]},"51":{"position":[[117,1],[119,1],[144,1],[190,1],[216,1],[297,1],[335,1],[368,1],[411,1],[448,1],[483,1],[513,1],[544,1],[602,1],[634,1],[671,1],[703,1],[750,1],[790,1],[792,1]]},"59":{"position":[[84,1]]},"61":{"position":[[163,1]]},"71":{"position":[[172,1],[181,1],[191,1],[193,1],[195,1],[201,1],[269,1],[271,1],[273,1],[279,1],[347,1],[349,1],[351,1],[358,1],[427,1],[429,1]]},"72":{"position":[[82,1],[108,1],[124,1],[126,1],[266,1],[308,1],[310,1]]},"73":{"position":[[109,1],[111,1],[143,1],[172,1],[194,1],[207,1],[209,1]]},"74":{"position":[[0,1],[2,1],[120,1],[164,1],[225,1],[227,1],[310,1],[312,1],[385,1],[387,1]]},"75":{"position":[[297,1]]},"76":{"position":[[151,1],[219,1],[227,1],[236,1],[260,1],[277,1],[291,1],[298,2],[388,1],[432,3],[436,1],[451,2],[480,2],[487,1],[543,1],[554,2],[642,2],[649,1],[711,1],[753,2],[794,1],[810,2],[835,2],[842,1],[900,1],[936,2],[972,2],[979,1],[1041,1],[1069,2],[1144,1],[1146,1]]},"79":{"position":[[85,1],[87,1],[131,1],[146,1],[159,1],[161,1]]},"81":{"position":[[232,1],[234,1],[267,2],[282,1],[284,1],[295,1],[315,1],[326,2],[329,2],[414,1],[441,1],[443,1],[477,1],[479,3],[483,1],[553,1]]},"84":{"position":[[68,1],[70,1],[107,1],[109,1],[143,1],[145,1],[147,1],[170,1],[218,1],[256,1],[258,1],[269,1],[271,1],[273,1],[302,1],[304,1],[323,1],[347,1],[349,1],[351,1],[364,1],[366,1]]},"85":{"position":[[120,1],[206,1],[208,1]]},"86":{"position":[[135,1]]},"88":{"position":[[161,1]]},"89":{"position":[[174,1],[352,1],[467,1],[630,1],[632,1]]},"90":{"position":[[210,1],[254,1],[331,1],[443,1],[445,1]]},"91":{"position":[[105,1],[207,1],[302,1],[304,1]]},"92":{"position":[[11,1],[25,1]]},"93":{"position":[[108,1],[140,1],[160,1],[164,1],[173,1],[179,1],[245,1],[247,1]]},"94":{"position":[[83,1],[85,1],[99,1],[107,1],[111,1],[125,1],[140,1],[149,1],[153,1],[167,1],[169,1]]},"95":{"position":[[46,1],[60,1],[67,1],[71,1],[84,1],[99,1],[104,1],[108,1],[121,1],[123,1]]},"97":{"position":[[115,1]]},"98":{"position":[[337,1],[346,1],[365,2],[375,1],[430,2],[443,1],[484,2],[494,1],[503,1],[533,1],[535,2],[546,1],[608,2],[624,1],[634,1],[661,1],[687,2],[707,1],[709,2],[720,2],[811,2],[814,1],[902,2],[905,1],[1004,2],[1007,1],[1098,2],[1101,1],[1178,3],[1194,1],[1203,2],[1217,1],[1233,2],[1250,1],[1260,1],[1325,1],[1327,1],[1329,2],[1332,1],[1334,3],[1354,1]]},"101":{"position":[[83,1],[168,1],[204,1],[225,1],[260,1],[262,1]]},"102":{"position":[[957,1],[975,1]]},"103":{"position":[[57,1],[63,1],[76,1],[83,1],[92,1],[101,1],[106,1],[113,1],[122,1],[124,1]]},"107":{"position":[[0,1]]},"108":{"position":[[0,1]]},"113":{"position":[[214,1],[228,1]]},"114":{"position":[[110,1]]},"115":{"position":[[91,1]]},"116":{"position":[[104,1]]},"117":{"position":[[83,1]]},"118":{"position":[[99,1]]},"119":{"position":[[0,1]]},"120":{"position":[[61,1]]},"127":{"position":[[89,1],[411,1],[429,1]]},"130":{"position":[[128,1]]},"131":{"position":[[50,1],[82,1],[113,1],[128,1],[147,1],[149,1]]},"132":{"position":[[76,1],[97,1],[154,1],[213,1],[282,1],[284,1]]},"133":{"position":[[133,1]]},"136":{"position":[[113,1],[115,1],[151,1],[184,1],[210,1],[245,1],[282,1],[330,1],[343,1],[345,1]]},"137":{"position":[[0,1],[2,1],[120,1],[168,1],[229,1],[231,1],[314,1],[316,1],[389,1],[391,1]]},"138":{"position":[[305,1]]},"139":{"position":[[225,1],[246,2],[281,1],[283,1],[353,1],[420,3],[447,1],[449,2],[498,2],[702,1],[734,2],[737,2],[813,1]]},"141":{"position":[[190,1],[219,2],[254,1],[256,1],[326,1],[393,3],[420,1],[422,2],[471,2],[576,1],[675,1],[681,1],[683,1],[703,2],[779,1]]},"142":{"position":[[149,1],[179,1],[266,1],[333,3],[360,2],[363,2],[468,1],[497,1],[528,1],[530,1],[608,1],[670,1],[672,1],[691,1],[693,3],[697,1],[726,1],[728,1],[740,1],[777,1],[849,1],[863,1],[905,2],[908,2],[941,1],[964,2],[993,1]]},"143":{"position":[[0,1],[2,1],[62,1],[93,1],[164,1],[166,1],[179,1],[181,1],[254,1],[281,2],[284,2],[302,1],[330,1],[357,1],[359,1],[414,1],[476,1],[478,1],[494,1],[496,3],[500,1],[512,1],[514,1],[575,1],[589,1],[610,1],[617,1],[654,1],[656,2],[676,1],[678,2],[731,2],[772,1]]},"146":{"position":[[106,1],[108,1],[137,1],[163,1],[182,1],[216,1],[229,1],[231,1]]},"147":{"position":[[0,1],[2,1],[120,1],[161,1],[222,1],[224,1],[307,1],[309,1],[382,1],[384,1]]},"148":{"position":[[291,1]]},"149":{"position":[[140,1],[201,1],[226,1],[249,1],[316,1],[337,1],[355,1],[436,1],[653,2],[776,1],[778,3],[782,1],[805,1],[827,1],[936,1],[975,1],[991,1],[1010,1],[1035,1],[1082,2],[1153,1]]},"150":{"position":[[238,1],[291,1],[300,1],[344,3],[356,1],[382,2],[466,1],[524,1],[622,3],[651,2],[732,1]]},"153":{"position":[[60,1]]},"159":{"position":[[109,1],[111,1],[143,1],[172,1],[194,1],[207,1],[209,1]]},"160":{"position":[[0,1],[2,1],[120,1],[164,1],[225,1],[227,1],[310,1],[312,1],[385,1],[387,1]]},"161":{"position":[[297,1]]},"162":{"position":[[131,1],[189,1],[218,1],[294,1],[324,1],[346,1],[348,1],[423,1],[501,3],[530,1],[538,1],[558,1],[584,1],[682,1],[746,1]]},"166":{"position":[[356,2],[382,1]]},"172":{"position":[[221,2],[300,2],[313,1],[364,1],[366,1]]},"174":{"position":[[107,1],[109,1],[139,1],[159,1],[183,1],[220,1],[222,1],[247,1],[249,1],[251,1],[264,1],[266,1]]},"176":{"position":[[109,1],[136,1],[166,1],[193,1],[278,1],[339,1],[456,1],[477,1],[497,1],[505,1],[576,1],[622,3],[890,1]]},"177":{"position":[[117,1],[177,1],[179,1],[222,1],[229,1],[280,1],[289,1],[333,2],[342,1],[392,1],[415,2],[436,1],[520,1]]},"178":{"position":[[42,1],[102,1],[146,1],[319,1],[321,1],[413,1],[472,1],[550,1],[577,1],[755,1]]},"179":{"position":[[244,1],[401,1]]},"183":{"position":[[73,1],[75,1],[97,1],[99,1],[122,1],[140,1],[150,1],[152,1],[154,1],[176,1],[178,1],[191,1],[215,1],[235,1],[237,1],[239,1],[260,1],[262,1],[275,1],[299,1],[301,1],[303,1],[339,1],[341,1],[354,1],[356,1],[358,1],[383,1],[385,1],[405,1],[407,1],[409,1],[442,1],[444,1],[464,1],[466,1],[468,1],[481,1],[483,1]]},"186":{"position":[[0,1],[2,1],[85,1],[173,1],[244,1],[246,1]]},"187":{"position":[[42,1],[486,1],[488,1],[496,1],[866,1]]},"188":{"position":[[90,1]]},"189":{"position":[[100,1],[107,1],[114,1],[128,1],[130,1],[132,1],[140,1],[149,1],[277,1],[279,1],[281,1],[287,1],[296,1],[322,1],[324,1],[326,1],[333,1],[342,1],[397,1],[399,1],[401,1],[415,1],[424,1],[495,1],[497,1]]},"191":{"position":[[57,1],[64,1],[71,1],[85,1],[87,1],[89,1],[104,1],[113,1],[216,1],[218,1],[220,1],[231,1],[240,1],[386,1],[388,1],[390,1],[401,1],[411,1],[614,1],[616,1],[618,1],[633,1],[642,1],[717,1],[719,1],[721,1],[738,1],[748,1],[886,1],[888,1],[890,1],[908,1],[918,1],[1057,1],[1059,1]]},"192":{"position":[[20,1],[22,1],[115,1],[117,1],[143,1],[145,1],[220,1],[222,1],[254,1],[256,1],[362,1],[364,1]]},"194":{"position":[[170,1]]},"195":{"position":[[98,1],[105,1],[112,1],[126,1],[128,1],[130,1],[138,1],[147,1],[275,1],[277,1],[279,1],[285,1],[294,1],[320,1],[322,1],[324,1],[331,1],[340,1],[395,1],[397,1],[399,1],[413,1],[422,1],[493,1],[495,1]]},"197":{"position":[[57,1],[64,1],[71,1],[85,1],[87,1],[89,1],[104,1],[113,1],[216,1],[218,1],[220,1],[231,1],[240,1],[386,1],[388,1],[390,1],[401,1],[411,1],[614,1],[616,1],[618,1],[633,1],[642,1],[717,1],[719,1],[721,1],[741,1],[751,1],[879,1],[881,1],[883,1],[900,1],[910,1],[1048,1],[1050,1],[1052,1],[1070,1],[1080,1],[1219,1],[1221,1]]},"198":{"position":[[159,1]]},"199":{"position":[[278,1]]},"200":{"position":[[107,1],[176,1],[178,1],[180,1],[187,1],[194,1],[208,1],[210,1],[212,1],[231,1],[238,1],[314,1],[316,1]]},"201":{"position":[[118,1]]},"202":{"position":[[15,1],[17,1],[27,1],[29,1],[703,1],[705,2],[722,1],[748,1],[750,1],[752,1]]},"203":{"position":[[149,1]]},"204":{"position":[[15,1],[17,1],[27,1],[29,1],[703,1],[705,2],[722,1],[748,1],[750,1],[752,1]]},"207":{"position":[[117,1],[150,1],[152,1]]},"208":{"position":[[79,1]]},"213":{"position":[[90,1],[416,1],[475,1],[502,1],[519,1],[521,1]]},"216":{"position":[[77,1],[79,1],[110,1],[134,1],[156,1],[198,1],[214,1],[243,1],[245,1]]},"217":{"position":[[276,1]]},"218":{"position":[[94,1],[106,1],[110,1],[112,1],[114,1],[131,1],[187,1],[189,1],[191,1],[209,1],[265,1],[267,1],[269,1],[284,1],[354,1],[356,1],[358,1],[372,1],[457,1],[459,1],[461,1],[472,1],[742,1],[744,1],[746,1],[757,1],[903,1],[905,1]]},"224":{"position":[[154,1],[376,1],[418,1],[472,1],[474,1],[476,1]]},"226":{"position":[[143,1],[192,2],[378,1],[389,1],[424,1],[435,1],[656,1],[755,1],[769,1],[798,1],[803,1],[819,1],[823,1],[839,1],[846,1],[892,1],[899,1],[928,1],[930,1],[948,1]]},"230":{"position":[[60,1],[62,1],[79,1],[99,1],[101,1],[114,1],[138,1],[158,1],[160,1],[162,1],[181,1],[183,1],[198,1],[217,1],[219,1],[221,1],[241,1],[243,1],[262,1],[264,1],[266,1],[279,1],[281,1]]},"231":{"position":[[40,1],[218,1],[322,1],[324,1]]},"232":{"position":[[85,1]]},"233":{"position":[[97,1],[104,1],[111,1],[125,1],[127,1],[129,1],[137,1],[146,1],[274,1],[276,1],[278,1],[284,1],[293,1],[319,1],[321,1],[323,1],[330,1],[339,1],[511,1],[513,1]]},"235":{"position":[[57,1],[64,1],[71,1],[85,1],[87,1],[89,1],[104,1],[113,1],[216,1],[218,1],[220,1],[231,1],[240,1],[386,1],[388,1],[390,1],[401,1],[411,1],[614,1],[616,1],[618,1],[633,1],[642,1],[717,1],[719,1],[721,1],[741,1],[751,1],[879,1],[881,1],[883,1],[897,1],[907,1],[992,1],[994,1],[996,1],[1013,1],[1023,1],[1161,1],[1163,1],[1165,1],[1183,1],[1193,1],[1332,1],[1334,1]]},"236":{"position":[[20,1],[22,1],[95,1],[97,1],[123,1],[125,1],[200,1],[202,1],[234,1],[236,1],[405,1],[407,1]]},"237":{"position":[[160,1],[404,1],[486,1],[557,1],[559,1]]},"238":{"position":[[172,1],[181,1],[191,1],[193,1],[195,1],[201,1],[269,1],[271,1],[273,1],[279,1],[347,1],[349,1],[351,1],[358,1],[427,1],[429,1]]},"240":{"position":[[63,1],[70,1],[77,1],[91,1],[93,1],[95,1],[104,1],[114,1],[155,1],[157,1],[159,1],[167,1],[177,1],[217,1],[219,1],[221,1],[226,1],[236,1],[306,1],[308,1]]},"241":{"position":[[42,1]]},"242":{"position":[[21,1]]},"245":{"position":[[66,1],[93,1],[95,1],[127,1],[142,1],[155,1],[157,1]]},"247":{"position":[[273,1],[338,1],[389,2],[405,1],[440,1],[493,1],[595,1],[626,1],[628,1],[657,1],[827,1]]},"250":{"position":[[120,1],[122,1],[142,1],[159,1],[189,1],[216,1],[234,1],[236,1],[269,1],[281,1],[296,1],[298,1],[300,1],[313,1],[315,1]]},"251":{"position":[[45,1],[75,1],[102,1],[104,1]]},"252":{"position":[[133,1]]},"253":{"position":[[123,1],[181,1],[188,1],[195,1],[209,1],[211,1],[213,1],[221,1],[230,1],[358,1],[360,1],[362,1],[368,1],[377,1],[403,1],[405,1],[407,1],[422,1],[431,1],[534,1],[536,1],[538,1],[549,1],[559,1],[762,1],[764,1],[766,1],[781,1],[790,1],[865,1],[867,1]]},"255":{"position":[[130,1],[137,1],[144,1],[158,1],[160,1],[162,1],[169,1],[178,1],[350,1],[352,1],[354,1],[369,1],[378,1],[453,1],[455,1],[457,1],[468,1],[478,1],[681,1],[683,1],[685,1],[702,1],[712,1],[850,1],[852,1],[854,1],[872,1],[882,1],[1021,1],[1023,1],[1025,1],[1036,1],[1045,1],[1191,1],[1193,1]]}},"relUrl":{"101":{"position":[[0,1]]},"104":{"position":[[0,1]]}}}],["0",{"_index":1198,"title":{},"content":{"172":{"position":[[348,1],[356,1]]},"226":{"position":[[476,1],[486,1],[496,2],[499,2],[508,1],[519,1],[529,2],[532,2]]}},"relUrl":{}}],["0%,#f3f3f3",{"_index":1444,"title":{},"content":{"226":{"position":[[713,10]]}},"relUrl":{}}],["0.19",{"_index":1438,"title":{},"content":{"226":{"position":[[535,6]]}},"relUrl":{}}],["0.2",{"_index":1436,"title":{},"content":{"226":{"position":[[502,5]]}},"relUrl":{}}],["03b874",{"_index":1453,"title":{},"content":{"226":{"position":[[919,8]]}},"relUrl":{}}],["03b875",{"_index":1009,"title":{},"content":{"139":{"position":[[373,8]]},"141":{"position":[[346,8]]},"142":{"position":[[286,8]]},"149":{"position":[[269,8]]}},"relUrl":{}}],["0444b26dfd42",{"_index":655,"title":{},"content":{"76":{"position":[[1129,14]]}},"relUrl":{}}],["05em",{"_index":1199,"title":{},"content":{"172":{"position":[[350,5]]}},"relUrl":{}}],["07",{"_index":1345,"title":{},"content":{"202":{"position":[[64,2],[602,2]]},"204":{"position":[[64,2],[602,2]]}},"relUrl":{}}],["0f79b9",{"_index":1154,"title":{},"content":{"162":{"position":[[457,8]]}},"relUrl":{}}],["0px",{"_index":1450,"title":{},"content":{"226":{"position":[[814,4],[834,4]]}},"relUrl":{}}],["1",{"_index":197,"title":{},"content":{"149":{"position":[[551,3],[649,3]]},"191":{"position":[[702,2]]},"192":{"position":[[350,1]]},"193":{"position":[[22,1]]},"197":{"position":[[702,2]]},"218":{"position":[[340,2]]},"235":{"position":[[702,2]]},"253":{"position":[[850,2]]},"255":{"position":[[438,2]]}},"relUrl":{"15":{"position":[[40,1]]},"195":{"position":[[39,1]]},"197":{"position":[[50,1]]},"202":{"position":[[46,1]]}}}],["1,000",{"_index":1325,"title":{},"content":{"193":{"position":[[56,6]]}},"relUrl":{}}],["10",{"_index":200,"title":{},"content":{"16":{"position":[[10,3]]},"76":{"position":[[796,3]]}},"relUrl":{}}],["100",{"_index":1447,"title":{},"content":{"226":{"position":[[748,6]]}},"relUrl":{}}],["1024",{"_index":1293,"title":{},"content":{"189":{"position":[[490,4]]},"195":{"position":[[488,4]]}},"relUrl":{}}],["10px",{"_index":1155,"title":{},"content":{"162":{"position":[[475,5]]}},"relUrl":{}}],["11.69",{"_index":755,"title":{},"content":{"94":{"position":[[34,5],[142,6]]}},"relUrl":{}}],["11248",{"_index":842,"title":{},"content":{"98":{"position":[[1144,6]]}},"relUrl":{}}],["11744",{"_index":822,"title":{},"content":{"98":{"position":[[947,7]]}},"relUrl":{}}],["11816",{"_index":844,"title":{},"content":{"98":{"position":[[1157,6]]}},"relUrl":{}}],["119931",{"_index":808,"title":{},"content":{"98":{"position":[[787,7]]}},"relUrl":{}}],["12",{"_index":322,"title":{},"content":{"28":{"position":[[9,3]]},"29":{"position":[[9,3]]}},"relUrl":{}}],["12169",{"_index":834,"title":{},"content":{"98":{"position":[[1063,6]]}},"relUrl":{}}],["1240",{"_index":756,"title":{},"content":{"94":{"position":[[113,4]]}},"relUrl":{}}],["125px",{"_index":1440,"title":{},"content":{"226":{"position":[[600,6]]}},"relUrl":{}}],["12908",{"_index":839,"title":{},"content":{"98":{"position":[[1124,7]]}},"relUrl":{}}],["13/10",{"_index":886,"title":{},"content":{"102":{"position":[[266,5]]}},"relUrl":{}}],["1366",{"_index":1397,"title":{},"content":{"218":{"position":[[181,5]]}},"relUrl":{}}],["1366x768",{"_index":722,"title":{},"content":{"89":{"position":[[212,9]]}},"relUrl":{}}],["137133",{"_index":809,"title":{},"content":{"98":{"position":[[795,7]]}},"relUrl":{}}],["1500",{"_index":1364,"title":{},"content":{"202":{"position":[[535,5]]},"204":{"position":[[535,5]]},"212":{"position":[[173,5]]},"213":{"position":[[514,4]]}},"relUrl":{}}],["15112",{"_index":835,"title":{},"content":{"98":{"position":[[1070,6]]}},"relUrl":{}}],["154175",{"_index":810,"title":{},"content":{"98":{"position":[[803,7]]}},"relUrl":{}}],["1594409399761",{"_index":1317,"title":{},"content":{"192":{"position":[[101,13]]}},"relUrl":{}}],["1595179003987",{"_index":1366,"title":{},"content":{"202":{"position":[[640,14]]},"204":{"position":[[640,14]]}},"relUrl":{}}],["16",{"_index":233,"title":{},"content":{"18":{"position":[[7,3]]}},"relUrl":{}}],["16005",{"_index":824,"title":{},"content":{"98":{"position":[[962,6]]}},"relUrl":{}}],["17",{"_index":312,"title":{},"content":{"26":{"position":[[5,3]]}},"relUrl":{}}],["1754",{"_index":757,"title":{},"content":{"94":{"position":[[155,4]]}},"relUrl":{}}],["17722",{"_index":823,"title":{},"content":{"98":{"position":[[955,6]]}},"relUrl":{}}],["18111",{"_index":846,"title":{},"content":{"98":{"position":[[1171,6]]}},"relUrl":{}}],["18274",{"_index":845,"title":{},"content":{"98":{"position":[[1164,6]]}},"relUrl":{}}],["19771",{"_index":825,"title":{},"content":{"98":{"position":[[969,6]]}},"relUrl":{}}],["19t17:16:43.987+00:00",{"_index":1346,"title":{},"content":{"202":{"position":[[67,23],[605,23]]},"204":{"position":[[67,23],[605,23]]}},"relUrl":{}}],["1em",{"_index":1200,"title":{},"content":{"172":{"position":[[358,5]]}},"relUrl":{}}],["1f95",{"_index":652,"title":{},"content":{"76":{"position":[[1114,4]]}},"relUrl":{}}],["1px",{"_index":707,"title":{},"content":{"86":{"position":[[52,3]]},"88":{"position":[[66,3]]},"226":{"position":[[459,4]]}},"relUrl":{}}],["1x",{"_index":504,"title":{},"content":{"53":{"position":[[197,3]]}},"relUrl":{}}],["2",{"_index":169,"title":{},"content":{"14":{"position":[[8,2]]},"93":{"position":[[162,1]]},"94":{"position":[[109,1],[151,1]]},"95":{"position":[[35,1],[69,1],[101,2],[106,1]]},"102":{"position":[[304,1]]},"166":{"position":[[423,1]]},"187":{"position":[[638,1]]},"219":{"position":[[58,2]]}},"relUrl":{"200":{"position":[[39,1]]},"204":{"position":[[46,1]]}}}],["2\">",{"_index":896,"title":{},"content":{"102":{"position":[[473,6]]},"187":{"position":[[768,6]]}},"relUrl":{}}],["2.0",{"_index":1347,"title":{},"content":{"202":{"position":[[128,4]]},"204":{"position":[[128,4]]}},"relUrl":{}}],["200",{"_index":1342,"title":{},"content":{"202":{"position":[[8,3]]},"204":{"position":[[8,3]]}},"relUrl":{}}],["2000",{"_index":1174,"title":{},"content":{"166":{"position":[[359,6]]}},"relUrl":{}}],["200px",{"_index":698,"title":{},"content":{"85":{"position":[[194,5]]},"86":{"position":[[23,6],[188,6]]},"88":{"position":[[23,6]]}},"relUrl":{}}],["201",{"_index":1308,"title":{},"content":{"192":{"position":[[8,3]]},"236":{"position":[[8,3]]}},"relUrl":{}}],["2010",{"_index":785,"title":{},"content":{"98":{"position":[[419,4],[702,4]]}},"relUrl":{}}],["2016",{"_index":786,"title":{},"content":{"98":{"position":[[424,5]]}},"relUrl":{}}],["20185",{"_index":826,"title":{},"content":{"98":{"position":[[976,6]]}},"relUrl":{}}],["2019",{"_index":333,"title":{},"content":{"29":{"position":[[13,4]]},"30":{"position":[[13,4]]}},"relUrl":{}}],["202",{"_index":1498,"title":{},"content":{"242":{"position":[[8,3]]}},"relUrl":{}}],["2020",{"_index":170,"title":{},"content":{"14":{"position":[[11,4]]},"15":{"position":[[14,4]]},"16":{"position":[[14,4]]},"17":{"position":[[11,4]]},"18":{"position":[[11,4]]},"19":{"position":[[10,4]]},"20":{"position":[[10,4]]},"21":{"position":[[9,4]]},"22":{"position":[[9,4]]},"23":{"position":[[9,4]]},"24":{"position":[[8,4]]},"25":{"position":[[8,4]]},"26":{"position":[[9,4]]},"27":{"position":[[10,4]]},"28":{"position":[[13,4]]},"202":{"position":[[58,5],[596,5]]},"204":{"position":[[58,5],[596,5]]}},"relUrl":{}}],["2069942a186f",{"_index":1022,"title":{},"content":{"139":{"position":[[798,14]]},"141":{"position":[[764,14]]}},"relUrl":{}}],["20px",{"_index":123,"title":{},"content":{"9":{"position":[[469,5]]},"32":{"position":[[373,5]]},"76":{"position":[[399,5]]},"87":{"position":[[97,4]]},"88":{"position":[[52,5]]},"139":{"position":[[391,5]]},"141":{"position":[[364,5]]},"142":{"position":[[304,5]]},"149":{"position":[[287,5]]},"150":{"position":[[311,5]]},"177":{"position":[[300,5]]},"226":{"position":[[514,4],[636,5],[650,5]]},"247":{"position":[[357,5]]}},"relUrl":{}}],["22",{"_index":282,"title":{},"content":{"23":{"position":[[5,3]]}},"relUrl":{}}],["22452",{"_index":836,"title":{},"content":{"98":{"position":[[1077,6]]}},"relUrl":{}}],["24",{"_index":43,"title":{},"content":{"4":{"position":[[70,2]]},"34":{"position":[[70,2]]},"96":{"position":[[70,2]]},"134":{"position":[[70,2]]},"210":{"position":[[70,2]]}},"relUrl":{}}],["24064",{"_index":813,"title":{},"content":{"98":{"position":[[853,6]]}},"relUrl":{}}],["24377",{"_index":827,"title":{},"content":{"98":{"position":[[983,6]]}},"relUrl":{}}],["24916",{"_index":812,"title":{},"content":{"98":{"position":[[845,7]]}},"relUrl":{}}],["26",{"_index":266,"title":{},"content":{"22":{"position":[[5,3]]}},"relUrl":{}}],["27",{"_index":257,"title":{},"content":{"21":{"position":[[5,3]]},"27":{"position":[[6,3]]}},"relUrl":{}}],["29",{"_index":342,"title":{},"content":{"30":{"position":[[9,3]]}},"relUrl":{}}],["29742",{"_index":814,"title":{},"content":{"98":{"position":[[860,6]]}},"relUrl":{}}],["29851",{"_index":815,"title":{},"content":{"98":{"position":[[867,6]]}},"relUrl":{}}],["2b4a70a16388",{"_index":1315,"title":{},"content":{"192":{"position":[[66,14]]}},"relUrl":{}}],["2em",{"_index":1197,"title":{},"content":{"172":{"position":[[323,4],[335,4]]}},"relUrl":{}}],["2x",{"_index":498,"title":{},"content":{"53":{"position":[[74,4]]},"90":{"position":[[80,2],[143,2],[238,3]]}},"relUrl":{}}],["3",{"_index":248,"title":{},"content":{"20":{"position":[[7,2]]},"191":{"position":[[714,2]]},"197":{"position":[[714,2]]},"218":{"position":[[351,2]]},"235":{"position":[[714,2]]},"253":{"position":[[862,2]]},"255":{"position":[[450,2]]}},"relUrl":{}}],["3.5",{"_index":759,"title":{},"content":{"95":{"position":[[28,4],[62,4]]}},"relUrl":{}}],["30",{"_index":181,"title":{},"content":{"15":{"position":[[10,3]]},"16":{"position":[[119,4],[215,2]]}},"relUrl":{}}],["300",{"_index":752,"title":{},"content":{"93":{"position":[[236,3]]},"94":{"position":[[6,3],[94,4],[135,4]]},"95":{"position":[[6,3],[55,4],[94,4],[110,3]]}},"relUrl":{}}],["3000",{"_index":1476,"title":{},"content":{"236":{"position":[[326,4]]}},"relUrl":{}}],["300px",{"_index":1433,"title":{},"content":{"226":{"position":[[444,6]]}},"relUrl":{}}],["30282",{"_index":817,"title":{},"content":{"98":{"position":[[881,6]]}},"relUrl":{}}],["3055",{"_index":1475,"title":{},"content":{"236":{"position":[[313,4]]}},"relUrl":{}}],["31",{"_index":214,"title":{},"content":{"17":{"position":[[7,3]]}},"relUrl":{}}],["32147",{"_index":828,"title":{},"content":{"98":{"position":[[990,6]]}},"relUrl":{}}],["32490",{"_index":816,"title":{},"content":{"98":{"position":[[874,6]]}},"relUrl":{}}],["34227",{"_index":838,"title":{},"content":{"98":{"position":[[1091,6]]}},"relUrl":{}}],["34400",{"_index":837,"title":{},"content":{"98":{"position":[[1084,6]]}},"relUrl":{}}],["38121",{"_index":818,"title":{},"content":{"98":{"position":[[888,6]]}},"relUrl":{}}],["3823d7466ed6",{"_index":1127,"title":{},"content":{"150":{"position":[[711,14]]}},"relUrl":{}}],["39387",{"_index":829,"title":{},"content":{"98":{"position":[[997,6]]}},"relUrl":{}}],["3d9a",{"_index":1511,"title":{},"content":{"247":{"position":[[778,4]]}},"relUrl":{}}],["3x",{"_index":733,"title":{},"content":{"90":{"position":[[149,2]]}},"relUrl":{}}],["4",{"_index":869,"title":{},"content":{"102":{"position":[[78,1],[95,2],[422,2]]},"187":{"position":[[515,1],[532,2],[717,2]]}},"relUrl":{}}],["4\">",{"_index":876,"title":{},"content":{"102":{"position":[[153,6],[308,6]]},"187":{"position":[[590,6],[642,6]]}},"relUrl":{}}],["400",{"_index":1318,"title":{},"content":{"192":{"position":[[127,3],[185,4]]},"236":{"position":[[107,3],[165,4]]}},"relUrl":{}}],["400px",{"_index":696,"title":{},"content":{"85":{"position":[[179,5]]},"86":{"position":[[37,6],[202,6]]},"88":{"position":[[37,6]]},"90":{"position":[[349,5]]},"202":{"position":[[218,8]]},"204":{"position":[[218,8]]},"213":{"position":[[143,7]]}},"relUrl":{}}],["40434",{"_index":819,"title":{},"content":{"98":{"position":[[895,6]]}},"relUrl":{}}],["410",{"_index":339,"title":{},"content":{"29":{"position":[[173,4]]}},"relUrl":{}}],["4143",{"_index":1360,"title":{},"content":{"202":{"position":[[477,4]]},"204":{"position":[[477,4]]}},"relUrl":{}}],["419f",{"_index":1019,"title":{},"content":{"139":{"position":[[783,4]]},"141":{"position":[[749,4]]}},"relUrl":{}}],["41a1c3f3779e.jpg",{"_index":601,"title":{},"content":{"71":{"position":[[252,16]]},"238":{"position":[[330,16]]}},"relUrl":{}}],["41a1c3f3779e.png",{"_index":602,"title":{},"content":{"71":{"position":[[330,16]]},"238":{"position":[[252,16]]}},"relUrl":{}}],["41a1c3f3779e.webp",{"_index":603,"title":{},"content":{"71":{"position":[[409,17]]},"238":{"position":[[409,17]]}},"relUrl":{}}],["429",{"_index":1322,"title":{"258":{"position":[[0,3]]}},"content":{"192":{"position":[[232,3],[304,4]]},"236":{"position":[[212,3],[284,4]]},"250":{"position":[[271,3]]}},"relUrl":{}}],["431e",{"_index":1162,"title":{},"content":{"162":{"position":[[723,4]]}},"relUrl":{}}],["43934",{"_index":803,"title":{},"content":{"98":{"position":[[751,7]]}},"relUrl":{}}],["443",{"_index":1036,"title":{},"content":{"142":{"position":[[559,4]]}},"relUrl":{}}],["462b",{"_index":81,"title":{},"content":{"7":{"position":[[357,4]]},"74":{"position":[[361,4]]},"137":{"position":[[365,4]]},"147":{"position":[[358,4]]},"160":{"position":[[361,4]]},"236":{"position":[[71,4]]}},"relUrl":{}}],["46b3",{"_index":1512,"title":{},"content":{"247":{"position":[[783,4]]}},"relUrl":{}}],["4778",{"_index":139,"title":{},"content":{"9":{"position":[[1022,4]]}},"relUrl":{}}],["482e",{"_index":1111,"title":{},"content":{"149":{"position":[[1124,4]]}},"relUrl":{}}],["48cf72697a9d",{"_index":83,"title":{},"content":{"7":{"position":[[367,13]]},"74":{"position":[[371,13]]},"137":{"position":[[375,13]]},"147":{"position":[[368,13]]},"160":{"position":[[371,13]]},"236":{"position":[[81,13]]}},"relUrl":{}}],["49d9",{"_index":1232,"title":{},"content":{"177":{"position":[[495,4]]}},"relUrl":{}}],["49f1",{"_index":1020,"title":{},"content":{"139":{"position":[[788,4]]},"141":{"position":[[754,4]]}},"relUrl":{}}],["4b5c",{"_index":599,"title":{},"content":{"71":{"position":[[242,4],[320,4],[399,4]]},"238":{"position":[[242,4],[320,4],[399,4]]}},"relUrl":{}}],["4cc1",{"_index":1221,"title":{},"content":{"176":{"position":[[739,4],[782,4],[866,4]]}},"relUrl":{}}],["4cca",{"_index":1313,"title":{},"content":{"192":{"position":[[56,4]]}},"relUrl":{}}],["4db1",{"_index":364,"title":{},"content":{"33":{"position":[[115,4]]}},"relUrl":{}}],["4f56",{"_index":1125,"title":{},"content":{"150":{"position":[[701,4]]}},"relUrl":{}}],["4f99",{"_index":653,"title":{},"content":{"76":{"position":[[1119,4]]}},"relUrl":{}}],["4px",{"_index":1008,"title":{},"content":{"139":{"position":[[363,3]]},"141":{"position":[[336,3]]},"142":{"position":[[276,3]]},"149":{"position":[[259,3]]},"226":{"position":[[478,3]]}},"relUrl":{}}],["5",{"_index":306,"title":{},"content":{"25":{"position":[[5,2]]}},"relUrl":{}}],["50%,#eded",{"_index":1445,"title":{},"content":{"226":{"position":[[724,11]]}},"relUrl":{}}],["500",{"_index":850,"title":{},"content":{"98":{"position":[[1229,3]]},"191":{"position":[[561,4]]},"197":{"position":[[561,4]]},"218":{"position":[[670,4]]},"228":{"position":[[304,3]]},"235":{"position":[[561,4]]},"253":{"position":[[709,4]]},"255":{"position":[[628,4]]}},"relUrl":{}}],["5000",{"_index":1489,"title":{},"content":{"240":{"position":[[149,5],[211,5]]}},"relUrl":{}}],["500px\">",{"_index":872,"title":{},"content":{"102":{"position":[[112,10]]},"187":{"position":[[549,10]]}},"relUrl":{}}],["50m",{"_index":208,"title":{},"content":{"16":{"position":[[218,4]]}},"relUrl":{}}],["51%,#ffffff",{"_index":1446,"title":{},"content":{"226":{"position":[[736,11]]}},"relUrl":{}}],["525",{"_index":760,"title":{},"content":{"95":{"position":[[73,3]]}},"relUrl":{}}],["52503",{"_index":804,"title":{},"content":{"98":{"position":[[759,6]]}},"relUrl":{}}],["57177",{"_index":805,"title":{},"content":{"98":{"position":[[766,6]]}},"relUrl":{}}],["57a440e97a80",{"_index":1362,"title":{},"content":{"202":{"position":[[487,14]]},"204":{"position":[[487,14]]}},"relUrl":{}}],["5948",{"_index":840,"title":{},"content":{"98":{"position":[[1132,5]]}},"relUrl":{}}],["5efc",{"_index":1110,"title":{},"content":{"149":{"position":[[1119,4]]}},"relUrl":{}}],["5ff7b966",{"_index":1358,"title":{},"content":{"202":{"position":[[463,8]]},"204":{"position":[[463,8]]}},"relUrl":{}}],["64",{"_index":1291,"title":{},"content":{"189":{"position":[[394,2]]},"195":{"position":[[392,2]]}},"relUrl":{}}],["651e5955f9a2",{"_index":1514,"title":{},"content":{"247":{"position":[[793,14]]}},"relUrl":{}}],["69658",{"_index":806,"title":{},"content":{"98":{"position":[[773,6]]}},"relUrl":{}}],["6px",{"_index":1437,"title":{},"content":{"226":{"position":[[510,3]]}},"relUrl":{}}],["7",{"_index":243,"title":{},"content":{"19":{"position":[[7,2]]},"24":{"position":[[5,2]]}},"relUrl":{}}],["74e5512b8738",{"_index":1234,"title":{},"content":{"177":{"position":[[505,14]]}},"relUrl":{}}],["768",{"_index":1398,"title":{},"content":{"218":{"position":[[260,4]]}},"relUrl":{}}],["7988",{"_index":833,"title":{},"content":{"98":{"position":[[1057,5]]}},"relUrl":{}}],["7eedb9910b32",{"_index":1164,"title":{},"content":{"162":{"position":[[733,12]]}},"relUrl":{}}],["8\"></script>",{"_index":1389,"title":{},"content":{"213":{"position":[[394,21]]}},"relUrl":{}}],["8.27",{"_index":754,"title":{},"content":{"94":{"position":[[26,5],[101,5]]}},"relUrl":{}}],["800px",{"_index":736,"title":{},"content":{"90":{"position":[[397,5]]}},"relUrl":{}}],["8105",{"_index":841,"title":{},"content":{"98":{"position":[[1138,5]]}},"relUrl":{}}],["81c6",{"_index":1314,"title":{},"content":{"192":{"position":[[61,4]]}},"relUrl":{}}],["8282",{"_index":1163,"title":{},"content":{"162":{"position":[[728,4]]}},"relUrl":{}}],["8989",{"_index":843,"title":{},"content":{"98":{"position":[[1151,5]]}},"relUrl":{}}],["8\\\"></script>",{"_index":1357,"title":{},"content":{"202":{"position":[[429,24]]},"204":{"position":[[429,24]]}},"relUrl":{}}],["8f92",{"_index":1112,"title":{},"content":{"149":{"position":[[1129,4]]}},"relUrl":{}}],["8px",{"_index":1434,"title":{},"content":{"226":{"position":[[482,3]]}},"relUrl":{}}],["906e",{"_index":598,"title":{},"content":{"71":{"position":[[237,4],[315,4],[394,4]]},"238":{"position":[[237,4],[315,4],[394,4]]}},"relUrl":{}}],["926b",{"_index":1513,"title":{},"content":{"247":{"position":[[788,4]]}},"relUrl":{}}],["94ef",{"_index":1222,"title":{},"content":{"176":{"position":[[744,4],[787,4],[871,4]]}},"relUrl":{}}],["97031",{"_index":807,"title":{},"content":{"98":{"position":[[780,6]]}},"relUrl":{}}],["9ait2nrpc12uk9gs9badl411nqapfmc26ewaoh8wgzl5myyxffc+ncpb1dkgj7sk",{"_index":903,"title":{},"content":{"102":{"position":[[753,65]]}},"relUrl":{}}],["9be4",{"_index":140,"title":{},"content":{"9":{"position":[[1027,4]]}},"relUrl":{}}],["9db6",{"_index":365,"title":{},"content":{"33":{"position":[[120,4]]}},"relUrl":{}}],["9e6c",{"_index":1126,"title":{},"content":{"150":{"position":[[706,4]]}},"relUrl":{}}],["a4",{"_index":686,"title":{"94":{"position":[[0,2]]}},"content":{"84":{"position":[[306,2]]},"94":{"position":[[23,2]]}},"relUrl":{}}],["a49",{"_index":82,"title":{},"content":{"7":{"position":[[362,4]]},"74":{"position":[[366,4]]},"137":{"position":[[370,4]]},"147":{"position":[[363,4]]},"160":{"position":[[366,4]]},"236":{"position":[[76,4]]}},"relUrl":{}}],["a88d",{"_index":600,"title":{},"content":{"71":{"position":[[247,4],[325,4],[404,4]]},"238":{"position":[[247,4],[325,4],[404,4]]}},"relUrl":{}}],["aa4b3a6870a6",{"_index":1223,"title":{},"content":{"176":{"position":[[749,14],[876,13]]}},"relUrl":{}}],["aa4b3a6870a6\">",{"_index":1225,"title":{},"content":{"176":{"position":[[792,17]]}},"relUrl":{}}],["ab5d",{"_index":654,"title":{},"content":{"76":{"position":[[1124,4]]}},"relUrl":{}}],["abd3",{"_index":1124,"title":{},"content":{"150":{"position":[[696,4]]}},"relUrl":{}}],["abil",{"_index":319,"title":{},"content":{"27":{"position":[[33,7]]},"109":{"position":[[50,7]]}},"relUrl":{}}],["abov",{"_index":33,"title":{},"content":{"3":{"position":[[82,5]]}},"relUrl":{}}],["absolut",{"_index":507,"title":{},"content":{"54":{"position":[[0,11]]}},"relUrl":{}}],["abus",{"_index":387,"title":{},"content":{"36":{"position":[[310,5]]}},"relUrl":{}}],["accept",{"_index":1284,"title":{},"content":{"189":{"position":[[29,7],[63,8]]},"195":{"position":[[27,7],[61,8]]},"200":{"position":[[36,7],[70,8]]},"233":{"position":[[26,7],[60,8]]},"242":{"position":[[12,8]]}},"relUrl":{}}],["access",{"_index":464,"title":{},"content":{"48":{"position":[[387,6]]},"60":{"position":[[99,10]]}},"relUrl":{}}],["accident",{"_index":384,"title":{},"content":{"36":{"position":[[243,12]]}},"relUrl":{}}],["account",{"_index":165,"title":{"62":{"position":[[20,8]]}},"content":{"13":{"position":[[188,8]]},"51":{"position":[[535,8]]},"52":{"position":[[77,7]]},"55":{"position":[[199,7]]},"58":{"position":[[160,8]]},"60":{"position":[[30,7]]},"65":{"position":[[129,8]]},"90":{"position":[[406,7]]},"133":{"position":[[40,8]]},"231":{"position":[[313,8]]},"237":{"position":[[204,7]]},"252":{"position":[[40,8]]}},"relUrl":{"62":{"position":[[26,7]]}}}],["action",{"_index":982,"title":{"131":{"position":[[10,7]]},"251":{"position":[[10,7]]}},"content":{"131":{"position":[[41,8]]},"179":{"position":[[143,7]]},"250":{"position":[[134,7]]},"251":{"position":[[36,8]]}},"relUrl":{"131":{"position":[[36,7]]},"251":{"position":[[32,7]]}}}],["activ",{"_index":532,"title":{},"content":{"60":{"position":[[41,7]]},"237":{"position":[[215,7]]}},"relUrl":{}}],["ad",{"_index":249,"title":{"87":{"position":[[0,6]]}},"content":{"20":{"position":[[23,5]]},"22":{"position":[[24,5]]},"23":{"position":[[24,5]]},"27":{"position":[[23,5]]},"28":{"position":[[28,5]]},"29":{"position":[[28,5]]},"63":{"position":[[167,5]]},"84":{"position":[[111,6]]},"95":{"position":[[272,6]]},"110":{"position":[[57,3]]},"150":{"position":[[848,6]]},"166":{"position":[[81,5],[195,5]]},"172":{"position":[[29,5]]},"240":{"position":[[24,5]]}},"relUrl":{}}],["adapt",{"_index":665,"title":{},"content":{"81":{"position":[[143,5]]}},"relUrl":{}}],["add",{"_index":444,"title":{},"content":{"47":{"position":[[26,3]]},"58":{"position":[[88,3]]},"65":{"position":[[105,3]]},"80":{"position":[[39,3]]},"87":{"position":[[43,3],[85,3]]},"104":{"position":[[190,3]]},"109":{"position":[[42,3]]},"176":{"position":[[64,3]]},"177":{"position":[[74,3]]}},"relUrl":{}}],["addit",{"_index":250,"title":{"191":{"position":[[0,10]]},"197":{"position":[[0,10]]},"218":{"position":[[0,10]]},"235":{"position":[[0,10]]}},"content":{"20":{"position":[[29,10]]},"23":{"position":[[30,10]]},"176":{"position":[[899,10]]},"183":{"position":[[193,10],[277,10]]},"216":{"position":[[112,10]]},"230":{"position":[[116,10]]}},"relUrl":{}}],["address",{"_index":176,"title":{},"content":{"14":{"position":[[106,11]]}},"relUrl":{}}],["adjust",{"_index":503,"title":{},"content":{"53":{"position":[[177,6]]},"71":{"position":[[139,6]]},"89":{"position":[[380,9]]},"91":{"position":[[45,8]]},"113":{"position":[[48,6]]},"172":{"position":[[158,6]]},"191":{"position":[[649,7]]},"197":{"position":[[649,7]]},"218":{"position":[[291,7]]},"228":{"position":[[200,6]]},"235":{"position":[[649,7]]},"238":{"position":[[139,6]]},"240":{"position":[[44,6]]},"253":{"position":[[797,7]]},"255":{"position":[[385,7]]},"259":{"position":[[243,9]]}},"relUrl":{}}],["advantag",{"_index":1194,"title":{},"content":{"172":{"position":[[229,9]]},"218":{"position":[[46,9]]}},"relUrl":{}}],["ae",{"_index":291,"title":{},"content":{"24":{"position":[[150,2]]}},"relUrl":{}}],["afterward",{"_index":885,"title":{},"content":{"102":{"position":[[254,11]]}},"relUrl":{}}],["airtabl",{"_index":1528,"title":{},"content":{"254":{"position":[[124,9]]}},"relUrl":{}}],["align",{"_index":709,"title":{},"content":{"86":{"position":[[68,6]]},"88":{"position":[[82,6]]},"98":{"position":[[568,6],[1284,6]]},"226":{"position":[[612,6]]}},"relUrl":{}}],["allow",{"_index":246,"title":{},"content":{"19":{"position":[[81,6]]},"28":{"position":[[58,8]]},"48":{"position":[[402,5]]},"165":{"position":[[79,6]]},"168":{"position":[[308,6]]},"184":{"position":[[11,6]]},"185":{"position":[[45,6]]},"257":{"position":[[112,6]]}},"relUrl":{}}],["alreadi",{"_index":1327,"title":{},"content":{"194":{"position":[[26,7]]}},"relUrl":{}}],["altern",{"_index":529,"title":{},"content":{"59":{"position":[[86,14]]},"168":{"position":[[243,14]]},"176":{"position":[[341,14]]}},"relUrl":{}}],["alway",{"_index":40,"title":{},"content":{"4":{"position":[[48,6]]},"10":{"position":[[6,6]]},"12":{"position":[[0,6]]},"34":{"position":[[48,6]]},"43":{"position":[[6,6]]},"77":{"position":[[6,6]]},"82":{"position":[[6,6]]},"96":{"position":[[48,6]]},"134":{"position":[[48,6]]},"151":{"position":[[6,6]]},"205":{"position":[[6,6]]},"210":{"position":[[48,6]]}},"relUrl":{}}],["amount",{"_index":315,"title":{"55":{"position":[[27,6]]}},"content":{"26":{"position":[[149,7]]},"51":{"position":[[245,6]]},"168":{"position":[[337,6]]}},"relUrl":{"55":{"position":[[33,6]]}}}],["amp",{"_index":104,"title":{"45":{"position":[[25,5]]},"85":{"position":[[15,5]]}},"content":{"9":{"position":[[190,5]]},"25":{"position":[[99,5]]},"84":{"position":[[87,5]]},"98":{"position":[[920,5]]},"247":{"position":[[67,5]]}},"relUrl":{}}],["amp;http.client{timeout",{"_index":639,"title":{},"content":{"76":{"position":[[756,25]]}},"relUrl":{}}],["anim",{"_index":778,"title":{"99":{"position":[[10,10]]}},"content":{"98":{"position":[[348,10],[636,10]]},"99":{"position":[[19,9]]}},"relUrl":{}}],["answer",{"_index":470,"title":{},"content":{"51":{"position":[[17,6]]}},"relUrl":{}}],["anyon",{"_index":1025,"title":{},"content":{"140":{"position":[[156,7]]}},"relUrl":{}}],["anyth",{"_index":1542,"title":{},"content":{"259":{"position":[[143,9]]}},"relUrl":{}}],["anytim",{"_index":538,"title":{},"content":{"62":{"position":[[25,7]]}},"relUrl":{}}],["api",{"_index":58,"title":{"21":{"position":[[9,3]]},"65":{"position":[[14,3]]},"101":{"position":[[18,3]]},"114":{"position":[[7,3]]},"120":{"position":[[28,3]]},"143":{"position":[[42,3]]},"153":{"position":[[27,3]]},"230":{"position":[[28,3]]},"244":{"position":[[10,3]]}},"content":{"6":{"position":[[97,3]]},"7":{"position":[[8,3],[141,3],[292,3]]},"8":{"position":[[4,3],[96,3],[245,3],[274,3]]},"9":{"position":[[72,4],[217,4]]},"13":{"position":[[102,4],[124,4]]},"15":{"position":[[83,4]]},"16":{"position":[[84,4]]},"19":{"position":[[120,3]]},"21":{"position":[[29,3],[249,3]]},"24":{"position":[[56,3],[231,4]]},"31":{"position":[[82,3]]},"32":{"position":[[65,4]]},"33":{"position":[[4,3]]},"36":{"position":[[4,3],[40,3],[375,3]]},"40":{"position":[[121,3]]},"41":{"position":[[4,3]]},"42":{"position":[[43,4],[129,3],[311,3]]},"45":{"position":[[65,3]]},"51":{"position":[[650,3]]},"59":{"position":[[52,4],[131,4],[223,3]]},"61":{"position":[[65,3]]},"65":{"position":[[46,3]]},"66":{"position":[[187,4],[365,3]]},"67":{"position":[[151,4]]},"71":{"position":[[4,3]]},"73":{"position":[[101,3]]},"74":{"position":[[8,3],[145,3],[296,3]]},"75":{"position":[[4,3],[96,3],[249,3],[278,3]]},"76":{"position":[[76,4]]},"79":{"position":[[77,3]]},"80":{"position":[[177,4],[311,4]]},"81":{"position":[[44,3],[130,4],[390,3]]},"84":{"position":[[63,4]]},"85":{"position":[[36,3]]},"89":{"position":[[237,3]]},"91":{"position":[[29,3],[244,3]]},"93":{"position":[[24,3]]},"97":{"position":[[139,4]]},"98":{"position":[[9,3]]},"101":{"position":[[75,3],[89,3]]},"102":{"position":[[56,4]]},"105":{"position":[[133,3]]},"106":{"position":[[16,3]]},"111":{"position":[[36,3],[111,4]]},"113":{"position":[[145,3]]},"114":{"position":[[12,4],[38,3],[93,3],[101,3]]},"115":{"position":[[30,3],[83,3]]},"116":{"position":[[96,3]]},"117":{"position":[[53,4],[75,3]]},"118":{"position":[[91,3]]},"120":{"position":[[21,3]]},"125":{"position":[[21,3]]},"126":{"position":[[87,4]]},"130":{"position":[[120,3]]},"131":{"position":[[138,3],[210,4]]},"133":{"position":[[83,3],[125,3]]},"136":{"position":[[105,3],[326,3]]},"137":{"position":[[8,3],[149,3],[300,3]]},"138":{"position":[[4,3],[96,3],[253,3],[282,3]]},"139":{"position":[[80,4],[493,4]]},"140":{"position":[[28,3],[85,3]]},"141":{"position":[[466,4]]},"142":{"position":[[107,3],[476,3],[505,3]]},"143":{"position":[[18,3],[58,3],[151,3],[332,4]]},"146":{"position":[[98,3]]},"147":{"position":[[8,3],[142,3],[293,3]]},"148":{"position":[[4,3],[96,3],[246,3],[275,3]]},"149":{"position":[[73,4]]},"150":{"position":[[128,3]]},"153":{"position":[[21,3]]},"156":{"position":[[76,3]]},"159":{"position":[[101,3]]},"160":{"position":[[8,3],[145,3],[296,3]]},"161":{"position":[[4,3],[96,3],[249,3],[278,3]]},"162":{"position":[[76,4],[332,3]]},"165":{"position":[[118,3],[185,3]]},"166":{"position":[[236,3],[447,3]]},"168":{"position":[[167,3]]},"174":{"position":[[99,3]]},"175":{"position":[[4,3],[137,3]]},"176":{"position":[[59,4],[131,4],[155,3],[221,3],[328,4]]},"177":{"position":[[145,3]]},"179":{"position":[[92,4]]},"183":{"position":[[65,3]]},"188":{"position":[[52,4]]},"191":{"position":[[444,3]]},"194":{"position":[[68,3]]},"197":{"position":[[444,3]]},"198":{"position":[[59,3]]},"211":{"position":[[26,3]]},"212":{"position":[[74,4],[231,3]]},"216":{"position":[[31,3],[69,3]]},"217":{"position":[[9,4]]},"218":{"position":[[396,3],[505,3]]},"220":{"position":[[203,4]]},"222":{"position":[[170,4]]},"224":{"position":[[4,3],[317,3]]},"227":{"position":[[4,3]]},"228":{"position":[[220,3]]},"230":{"position":[[52,3]]},"231":{"position":[[4,3],[98,3],[231,3]]},"232":{"position":[[50,4]]},"235":{"position":[[444,3],[931,3]]},"238":{"position":[[4,3]]},"239":{"position":[[4,3]]},"241":{"position":[[73,4]]},"245":{"position":[[85,3]]},"246":{"position":[[4,3],[131,3]]},"247":{"position":[[94,4]]},"250":{"position":[[112,3]]},"252":{"position":[[83,3],[125,3]]},"253":{"position":[[67,4],[592,3]]},"255":{"position":[[511,3]]}},"relUrl":{"21":{"position":[[21,3]]},"65":{"position":[[20,3]]},"114":{"position":[[9,3]]},"120":{"position":[[44,3]]},"143":{"position":[[68,3]]},"153":{"position":[[42,3]]},"230":{"position":[[59,3]]},"234":{"position":[[27,4]]},"239":{"position":[[27,4]]},"244":{"position":[[27,4]]}}}],["api/#addit",{"_index":1473,"title":{},"content":{},"relUrl":{"235":{"position":[[27,15]]}}}],["api/#authent",{"_index":1466,"title":{},"content":{},"relUrl":{"231":{"position":[[27,19]]}}}],["api/#cr",{"_index":1467,"title":{},"content":{},"relUrl":{"232":{"position":[[27,13]]}}}],["api/#delet",{"_index":1497,"title":{},"content":{},"relUrl":{"241":{"position":[[27,13]]}}}],["api/#exampl",{"_index":1477,"title":{},"content":{},"relUrl":{"236":{"position":[[27,12]]},"242":{"position":[[27,12]]}}}],["api/#fil",{"_index":1488,"title":{},"content":{},"relUrl":{"238":{"position":[[27,9]]}}}],["api/#get",{"_index":1487,"title":{},"content":{},"relUrl":{"237":{"position":[[27,12]]}}}],["api/#ne",{"_index":1499,"title":{},"content":{},"relUrl":{"243":{"position":[[27,9]]}}}],["api/#paramet",{"_index":1472,"title":{},"content":{},"relUrl":{"233":{"position":[[27,15]]}}}],["api/#queri",{"_index":1493,"title":{},"content":{},"relUrl":{"240":{"position":[[27,10]]}}}],["api/#us",{"_index":1464,"title":{},"content":{},"relUrl":{"230":{"position":[[27,10]]}}}],["api_id",{"_index":950,"title":{},"content":{"122":{"position":[[64,6]]},"139":{"position":[[515,6]]},"141":{"position":[[488,6]]},"142":{"position":[[380,6]]}},"relUrl":{}}],["api_key",{"_index":951,"title":{},"content":{"122":{"position":[[75,7]]},"139":{"position":[[526,7],[666,8]]},"141":{"position":[[499,7],[660,8]]},"142":{"position":[[391,7]]},"149":{"position":[[682,7],[784,11]]},"150":{"position":[[411,7],[551,11]]},"176":{"position":[[319,8]]},"177":{"position":[[212,9]]},"247":{"position":[[475,10]]}},"relUrl":{}}],["apiid",{"_index":1034,"title":{},"content":{"142":{"position":[[462,5]]}},"relUrl":{}}],["apikey",{"_index":350,"title":{},"content":{"32":{"position":[[150,6]]},"76":{"position":[[253,6],[738,7]]},"142":{"position":[[490,6]]}},"relUrl":{}}],["apikey).tostring('base64",{"_index":1040,"title":{},"content":{"142":{"position":[[699,26]]}},"relUrl":{}}],["api’",{"_index":947,"title":{},"content":{"121":{"position":[[63,6]]},"154":{"position":[[57,6]]}},"relUrl":{}}],["app",{"_index":658,"title":{"79":{"position":[[7,4]]},"80":{"position":[[30,4]]},"83":{"position":[[7,4]]}},"content":{"79":{"position":[[47,4],[119,4]]},"80":{"position":[[12,4]]}},"relUrl":{"79":{"position":[[21,4],[41,4]]},"80":{"position":[[21,4],[64,4]]},"81":{"position":[[21,4]]},"82":{"position":[[21,4]]},"83":{"position":[[21,4]]}}}],["appear",{"_index":884,"title":{},"content":{"102":{"position":[[247,6]]}},"relUrl":{}}],["append",{"_index":1335,"title":{},"content":{"199":{"position":[[190,6]]}},"relUrl":{}}],["appli",{"_index":1192,"title":{},"content":{"172":{"position":[[122,5]]}},"relUrl":{}}],["applic",{"_index":1056,"title":{},"content":{"143":{"position":[[120,12]]}},"relUrl":{}}],["application/json",{"_index":1038,"title":{},"content":{"142":{"position":[[626,19]]},"143":{"position":[[432,19]]}},"relUrl":{}}],["application/x",{"_index":1098,"title":{},"content":{"149":{"position":[[844,13]]}},"relUrl":{}}],["application’",{"_index":1207,"title":{},"content":{"176":{"position":[[86,13]]}},"relUrl":{}}],["area",{"_index":721,"title":{},"content":{"89":{"position":[[144,4]]}},"relUrl":{}}],["around",{"_index":677,"title":{"87":{"position":[[15,6]]}},"content":{"84":{"position":[[126,6]]},"87":{"position":[[58,6]]}},"relUrl":{"87":{"position":[[58,6]]}}}],["array",{"_index":1097,"title":{},"content":{"149":{"position":[[807,8]]}},"relUrl":{}}],["array('html'=>$html",{"_index":1084,"title":{},"content":{"149":{"position":[[357,23]]}},"relUrl":{}}],["articl",{"_index":1409,"title":{},"content":{"221":{"position":[[48,8]]}},"relUrl":{}}],["ask",{"_index":468,"title":{"51":{"position":[[11,5]]},"68":{"position":[[33,4]]}},"content":{"51":{"position":[[785,4]]}},"relUrl":{"51":{"position":[[17,5]]},"68":{"position":[[38,3]]}}}],["aspect",{"_index":742,"title":{},"content":{"91":{"position":[[266,6]]},"113":{"position":[[167,6]]}},"relUrl":{}}],["asset",{"_index":327,"title":{},"content":{"28":{"position":[[176,6]]},"42":{"position":[[292,6]]},"45":{"position":[[30,6],[221,6]]},"97":{"position":[[30,6]]}},"relUrl":{}}],["async",{"_index":1354,"title":{},"content":{"202":{"position":[[361,5]]},"204":{"position":[[361,5]]},"213":{"position":[[329,5]]}},"relUrl":{}}],["async/await",{"_index":997,"title":{"141":{"position":[[21,11]]}},"content":{"136":{"position":[[233,11]]},"141":{"position":[[22,12]]}},"relUrl":{}}],["asyncawait",{"_index":1030,"title":{},"content":{},"relUrl":{"141":{"position":[[47,10]]}}}],["attach",{"_index":1492,"title":{},"content":{"240":{"position":[[294,11]]}},"relUrl":{}}],["august",{"_index":213,"title":{},"content":{"17":{"position":[[0,6]]},"18":{"position":[[0,6]]},"19":{"position":[[0,6]]},"20":{"position":[[0,6]]}},"relUrl":{}}],["auth",{"_index":1120,"title":{},"content":{"150":{"position":[[526,6]]},"156":{"position":[[43,5]]},"177":{"position":[[172,4],[430,5]]}},"relUrl":{}}],["auth(api_id",{"_index":1014,"title":{},"content":{"139":{"position":[[652,13]]},"141":{"position":[[646,13]]}},"relUrl":{}}],["auth=(hcti_api_user_id",{"_index":1157,"title":{},"content":{"162":{"position":[[592,23]]}},"relUrl":{}}],["authent",{"_index":60,"title":{"8":{"position":[[0,14]]},"75":{"position":[[0,14]]},"133":{"position":[[0,14]]},"138":{"position":[[0,14]]},"148":{"position":[[0,14]]},"161":{"position":[[0,14]]},"231":{"position":[[0,14]]},"252":{"position":[[0,14]]}},"content":{"6":{"position":[[137,14]]},"8":{"position":[[24,15],[192,12]]},"73":{"position":[[145,14]]},"75":{"position":[[24,15],[196,12]]},"81":{"position":[[22,12]]},"136":{"position":[[153,14]]},"138":{"position":[[24,15],[200,12]]},"146":{"position":[[139,14]]},"148":{"position":[[24,15],[193,12]]},"159":{"position":[[145,14]]},"161":{"position":[[24,15],[196,12]]},"201":{"position":[[58,14]]},"203":{"position":[[76,14]]},"230":{"position":[[64,14]]},"231":{"position":[[24,15],[191,12]]},"250":{"position":[[144,14]]}},"relUrl":{}}],["author",{"_index":669,"title":{"122":{"position":[[0,13]]},"156":{"position":[[0,13]]}},"content":{"81":{"position":[[416,17]]},"122":{"position":[[26,13]]},"142":{"position":[[646,16]]},"143":{"position":[[452,16]]},"156":{"position":[[10,13]]}},"relUrl":{}}],["auto",{"_index":569,"title":{"110":{"position":[[0,4]]}},"content":{"66":{"position":[[192,4]]},"85":{"position":[[48,4]]},"87":{"position":[[29,4]]}},"relUrl":{"110":{"position":[[0,6]]}}}],["autogener",{"_index":921,"title":{},"content":{"106":{"position":[[23,12]]}},"relUrl":{}}],["autom",{"_index":231,"title":{},"content":{"17":{"position":[[254,9]]},"105":{"position":[[140,8]]},"217":{"position":[[22,8]]}},"relUrl":{}}],["automat",{"_index":287,"title":{"72":{"position":[[0,9]]}},"content":{"24":{"position":[[81,13],[244,13]]},"36":{"position":[[13,13]]},"85":{"position":[[317,13]]},"89":{"position":[[586,9]]},"168":{"position":[[176,13]]},"170":{"position":[[40,13]]},"171":{"position":[[12,13]]},"176":{"position":[[434,14]]},"191":{"position":[[804,9],[975,9]]},"197":{"position":[[966,9],[1137,9]]},"199":{"position":[[54,13]]},"235":{"position":[[1079,9],[1250,9]]},"237":{"position":[[228,13]]},"255":{"position":[[768,9],[939,9]]}},"relUrl":{}}],["avail",{"_index":91,"title":{"131":{"position":[[0,9]]},"251":{"position":[[0,9]]}},"content":{"8":{"position":[[123,9]]},"15":{"position":[[66,9]]},"21":{"position":[[40,10]]},"30":{"position":[[54,10],[157,9]]},"75":{"position":[[123,9]]},"131":{"position":[[185,10]]},"138":{"position":[[123,9]]},"139":{"position":[[833,9]]},"143":{"position":[[694,9]]},"148":{"position":[[123,9]]},"156":{"position":[[84,10]]},"161":{"position":[[123,9]]},"176":{"position":[[918,9]]},"231":{"position":[[125,9]]},"250":{"position":[[124,9]]}},"relUrl":{}}],["avatar_url",{"_index":1276,"title":{},"content":{"187":{"position":[[125,13]]}},"relUrl":{}}],["averag",{"_index":207,"title":{},"content":{"16":{"position":[[204,7]]}},"relUrl":{}}],["avil",{"_index":1179,"title":{},"content":{"167":{"position":[[157,8]]}},"relUrl":{}}],["await",{"_index":1028,"title":{},"content":{"141":{"position":[[578,5]]}},"relUrl":{}}],["awesom",{"_index":479,"title":{"58":{"position":[[22,7]]}},"content":{"51":{"position":[[392,7]]},"58":{"position":[[46,7]]}},"relUrl":{"58":{"position":[[28,7]]}}}],["b0354248",{"_index":1311,"title":{},"content":{"192":{"position":[[42,8]]}},"relUrl":{}}],["b231",{"_index":1021,"title":{},"content":{"139":{"position":[[793,4]]},"141":{"position":[[759,4]]}},"relUrl":{}}],["b931",{"_index":1233,"title":{},"content":{"177":{"position":[[500,4]]}},"relUrl":{}}],["back",{"_index":71,"title":{},"content":{"7":{"position":[[173,4]]},"36":{"position":[[182,4]]},"53":{"position":[[189,4]]},"71":{"position":[[79,4]]},"74":{"position":[[177,4]]},"89":{"position":[[300,4]]},"137":{"position":[[181,4]]},"147":{"position":[[174,4]]},"158":{"position":[[26,4]]},"160":{"position":[[177,4]]},"175":{"position":[[167,4]]},"238":{"position":[[79,4]]},"246":{"position":[[161,4]]}},"relUrl":{}}],["background",{"_index":1060,"title":{"206":{"position":[[12,10]]}},"content":{"143":{"position":[[256,10]]},"162":{"position":[[439,10]]},"176":{"position":[[578,10]]},"206":{"position":[[44,12]]},"207":{"position":[[38,11],[119,10]]},"208":{"position":[[15,10]]},"209":{"position":[[147,10]]},"226":{"position":[[565,10],[669,11],[901,10]]}},"relUrl":{"206":{"position":[[20,11]]},"209":{"position":[[20,11]]}}}],["background/#exampl",{"_index":1374,"title":{},"content":{},"relUrl":{"208":{"position":[[20,19]]}}}],["background/#how",{"_index":1373,"title":{},"content":{},"relUrl":{"207":{"position":[[20,15]]}}}],["background/#ne",{"_index":1376,"title":{},"content":{},"relUrl":{"210":{"position":[[20,16]]}}}],["bad",{"_index":1319,"title":{},"content":{"192":{"position":[[131,3],[156,4]]},"236":{"position":[[111,3],[136,4]]}},"relUrl":{}}],["bandwidth",{"_index":486,"title":{"64":{"position":[[9,9]]}},"content":{"51":{"position":[[613,9]]},"64":{"position":[[100,9]]}},"relUrl":{"64":{"position":[[15,9]]}}}],["base",{"_index":290,"title":{},"content":{"24":{"position":[[131,5]]},"80":{"position":[[65,5]]}},"relUrl":{}}],["base64",{"_index":1,"title":{"0":{"position":[[8,6]]},"5":{"position":[[0,6]]}},"content":{"0":{"position":[[42,7]]},"1":{"position":[[10,6],[76,6],[106,6]]},"2":{"position":[[29,6]]},"3":{"position":[[99,6]]}},"relUrl":{"0":{"position":[[19,6],[44,6]]},"1":{"position":[[19,6]]},"2":{"position":[[19,6]]},"3":{"position":[[19,6]]},"4":{"position":[[19,6]]},"5":{"position":[[19,6]]}}}],["basic",{"_index":86,"title":{},"content":{"8":{"position":[[18,5]]},"9":{"position":[[683,6]]},"75":{"position":[[18,5]]},"81":{"position":[[434,6]]},"122":{"position":[[43,5]]},"138":{"position":[[18,5]]},"142":{"position":[[663,6]]},"143":{"position":[[469,6]]},"148":{"position":[[18,5]]},"156":{"position":[[36,6]]},"161":{"position":[[18,5]]},"231":{"position":[[18,5]]}},"relUrl":{}}],["basic_auth",{"_index":1229,"title":{},"content":{"177":{"position":[[418,11]]}},"relUrl":{}}],["bath",{"_index":880,"title":{},"content":{"102":{"position":[[194,5]]}},"relUrl":{}}],["bb51612c84cf",{"_index":1113,"title":{},"content":{"149":{"position":[[1134,12]]}},"relUrl":{}}],["bda3",{"_index":1361,"title":{},"content":{"202":{"position":[[482,4]]},"204":{"position":[[482,4]]}},"relUrl":{}}],["be",{"_index":177,"title":{},"content":{"14":{"position":[[122,5]]},"72":{"position":[[169,5]]},"228":{"position":[[96,5]]}},"relUrl":{}}],["bear",{"_index":878,"title":{},"content":{"102":{"position":[[175,5]]}},"relUrl":{}}],["becom",{"_index":221,"title":{},"content":{"17":{"position":[[145,6]]}},"relUrl":{}}],["befor",{"_index":326,"title":{},"content":{"28":{"position":[[121,6]]},"61":{"position":[[82,6]]},"67":{"position":[[130,6]]},"165":{"position":[[339,6]]},"168":{"position":[[352,6]]},"191":{"position":[[461,6]]},"197":{"position":[[461,6]]},"218":{"position":[[522,6]]},"228":{"position":[[111,6],[245,6]]},"235":{"position":[[461,6]]},"253":{"position":[[609,6]]},"255":{"position":[[528,6]]},"259":{"position":[[108,6]]}},"relUrl":{}}],["beta",{"_index":212,"title":{"17":{"position":[[28,5]]}},"content":{"17":{"position":[[78,5]]}},"relUrl":{"17":{"position":[[40,4]]}}}],["better",{"_index":725,"title":{},"content":{"89":{"position":[[567,6]]}},"relUrl":{}}],["between",{"_index":394,"title":{},"content":{"36":{"position":[[443,7]]}},"relUrl":{}}],["bit",{"_index":1129,"title":{},"content":{"150":{"position":[[761,3]]}},"relUrl":{}}],["blank",{"_index":1519,"title":{"259":{"position":[[0,5]]}},"content":{"250":{"position":[[283,5]]},"259":{"position":[[48,5]]}},"relUrl":{}}],["blog",{"_index":219,"title":{},"content":{"17":{"position":[[107,4]]}},"relUrl":{}}],["blurri",{"_index":867,"title":{},"content":{"101":{"position":[[246,6]]}},"relUrl":{}}],["bodi",{"_index":647,"title":{},"content":{"76":{"position":[[926,5],[1017,5]]},"143":{"position":[[377,5]]},"157":{"position":[[6,6]]},"177":{"position":[[386,5]]},"207":{"position":[[112,4]]},"208":{"position":[[57,5]]},"226":{"position":[[894,4]]}},"relUrl":{}}],["boolean",{"_index":1331,"title":{},"content":{"197":{"position":[[743,7]]},"235":{"position":[[743,7],[899,7]]}},"relUrl":{}}],["border",{"_index":706,"title":{},"content":{"86":{"position":[[44,7]]},"88":{"position":[[58,7]]},"102":{"position":[[412,6]]},"139":{"position":[[355,7]]},"141":{"position":[[328,7]]},"142":{"position":[[268,7]]},"149":{"position":[[251,7]]},"187":{"position":[[707,6]]},"226":{"position":[[451,7]]}},"relUrl":{}}],["both",{"_index":31,"title":{},"content":{"3":{"position":[[25,4]]},"8":{"position":[[105,4]]},"41":{"position":[[137,4]]},"75":{"position":[[105,4]]},"138":{"position":[[105,4]]},"148":{"position":[[105,4]]},"161":{"position":[[105,4]]},"191":{"position":[[824,4],[995,4]]},"197":{"position":[[986,4],[1157,4]]},"231":{"position":[[107,4]]},"235":{"position":[[1099,4],[1270,4]]},"255":{"position":[[788,4],[959,4]]}},"relUrl":{}}],["bottom",{"_index":854,"title":{},"content":{"98":{"position":[[1316,8]]}},"relUrl":{}}],["box",{"_index":454,"title":{},"content":{"48":{"position":[[143,4]]},"139":{"position":[[347,5]]},"141":{"position":[[320,5]]},"142":{"position":[[260,5]]},"149":{"position":[[244,4]]},"162":{"position":[[417,5]]},"226":{"position":[[430,4],[464,3]]}},"relUrl":{}}],["brand",{"_index":303,"title":{"25":{"position":[[0,5]]}},"content":{},"relUrl":{}}],["browser",{"_index":241,"title":{"140":{"position":[[22,8]]}},"content":{"18":{"position":[[220,8]]},"72":{"position":[[161,7],[209,7]]},"89":{"position":[[165,8]]},"126":{"position":[[166,8]]},"140":{"position":[[127,8]]},"143":{"position":[[84,8]]}},"relUrl":{}}],["btoa(usernam",{"_index":1064,"title":{},"content":{"143":{"position":[[480,13]]}},"relUrl":{}}],["buffer(apiid",{"_index":1039,"title":{},"content":{"142":{"position":[[678,12]]}},"relUrl":{}}],["bug",{"_index":375,"title":{},"content":{"35":{"position":[[61,5]]},"36":{"position":[[291,3]]}},"relUrl":{}}],["build",{"_index":510,"title":{},"content":{"54":{"position":[[108,5]]},"65":{"position":[[53,5]]},"80":{"position":[[33,5]]}},"relUrl":{}}],["built",{"_index":661,"title":{},"content":{"80":{"position":[[99,5],[262,5]]},"170":{"position":[[19,5]]},"172":{"position":[[246,5]]},"178":{"position":[[24,5]]}},"relUrl":{}}],["busi",{"_index":229,"title":{"95":{"position":[[0,8]]}},"content":{"17":{"position":[[235,10]]},"84":{"position":[[325,8]]},"95":{"position":[[14,8]]}},"relUrl":{}}],["button",{"_index":238,"title":{},"content":{"18":{"position":[[118,6]]}},"relUrl":{}}],["byte",{"_index":115,"title":{},"content":{"9":{"position":[[364,6]]},"76":{"position":[[153,7]]},"247":{"position":[[247,6]]}},"relUrl":{}}],["bytes.newreader(reqbodi",{"_index":637,"title":{},"content":{"76":{"position":[[609,25]]}},"relUrl":{}}],["c",{"_index":48,"title":{"6":{"position":[[0,3]]},"7":{"position":[[23,2]]},"8":{"position":[[20,2]]},"9":{"position":[[0,2]]},"11":{"position":[[0,2]]}},"content":{"6":{"position":[[40,3],[132,2],[157,2],[162,2]]},"7":{"position":[[126,2]]},"8":{"position":[[157,2],[286,2]]},"9":{"position":[[5,2],[119,3]]},"103":{"position":[[103,2]]}},"relUrl":{"7":{"position":[[40,1]]},"8":{"position":[[37,1]]}}}],["cach",{"_index":205,"title":{"178":{"position":[[27,7]]}},"content":{"16":{"position":[[154,7],[178,7]]},"64":{"position":[[44,6]]},"174":{"position":[[212,7]]},"178":{"position":[[33,8],[48,5],[274,6]]},"237":{"position":[[242,6],[495,6],[515,6]]},"241":{"position":[[186,7]]}},"relUrl":{"178":{"position":[[47,7]]}}}],["cache_expir",{"_index":1249,"title":{},"content":{"178":{"position":[[719,17]]}},"relUrl":{}}],["cache_key",{"_index":1240,"title":{},"content":{"178":{"position":[[403,9]]}},"relUrl":{}}],["cached_url",{"_index":1242,"title":{},"content":{"178":{"position":[[461,10],[509,10]]}},"relUrl":{}}],["cached_url.pres",{"_index":1244,"title":{},"content":{"178":{"position":[[523,19]]}},"relUrl":{}}],["call",{"_index":275,"title":{},"content":{"22":{"position":[[226,5]]},"27":{"position":[[76,7]]},"131":{"position":[[142,4]]},"165":{"position":[[292,4]]},"166":{"position":[[150,7],[394,4]]},"178":{"position":[[217,5]]},"197":{"position":[[805,4]]},"235":{"position":[[805,4]]}},"relUrl":{}}],["card",{"_index":688,"title":{"95":{"position":[[9,4]]},"107":{"position":[[27,5]]},"108":{"position":[[22,5]]}},"content":{"84":{"position":[[334,4]]},"95":{"position":[[23,4]]},"107":{"position":[[69,5]]},"180":{"position":[[91,6]]}},"relUrl":{"95":{"position":[[52,4]]},"107":{"position":[[29,5]]},"108":{"position":[[24,5]]}}}],["catch(err",{"_index":1072,"title":{},"content":{"143":{"position":[[734,10]]}},"relUrl":{}}],["cdn",{"_index":401,"title":{},"content":{"37":{"position":[[124,4]]},"58":{"position":[[54,3]]},"91":{"position":[[202,4]]},"241":{"position":[[215,4],[232,3]]}},"relUrl":{}}],["center",{"_index":853,"title":{},"content":{"98":{"position":[[1291,9]]},"102":{"position":[[85,6]]},"187":{"position":[[522,6]]},"226":{"position":[[619,7]]}},"relUrl":{}}],["center;\">",{"_index":710,"title":{},"content":{"86":{"position":[[75,12]]},"88":{"position":[[89,12]]}},"relUrl":{}}],["cf862c34a744",{"_index":366,"title":{},"content":{"33":{"position":[[125,13]]}},"relUrl":{}}],["ch",{"_index":1087,"title":{},"content":{"149":{"position":[[432,3],[1023,6]]}},"relUrl":{}}],["challeng",{"_index":1534,"title":{},"content":{"257":{"position":[[43,11]]}},"relUrl":{}}],["chang",{"_index":537,"title":{},"content":{"62":{"position":[[8,6]]},"178":{"position":[[161,7]]},"237":{"position":[[461,6]]}},"relUrl":{}}],["changelog",{"_index":151,"title":{"12":{"position":[[0,9]]}},"content":{},"relUrl":{"12":{"position":[[0,11]]}}}],["changelog/#brand",{"_index":311,"title":{},"content":{},"relUrl":{"25":{"position":[[0,17]]}}}],["changelog/#delet",{"_index":340,"title":{},"content":{},"relUrl":{"29":{"position":[[0,20]]}}}],["changelog/#font",{"_index":179,"title":{},"content":{},"relUrl":{"14":{"position":[[0,16]]},"15":{"position":[[0,16]]}}}],["changelog/#integromat",{"_index":255,"title":{},"content":{},"relUrl":{"20":{"position":[[0,22]]},"30":{"position":[[0,22]]}}}],["changelog/#introduc",{"_index":302,"title":{},"content":{},"relUrl":{"24":{"position":[[0,23]]}}}],["changelog/#ms_delay",{"_index":330,"title":{},"content":{},"relUrl":{"28":{"position":[[0,20]]}}}],["changelog/#new",{"_index":242,"title":{},"content":{},"relUrl":{"18":{"position":[[0,15]]},"23":{"position":[[0,15]]}}}],["changelog/#rend",{"_index":281,"title":{},"content":{},"relUrl":{"22":{"position":[[0,18]]}}}],["changelog/#rubi",{"_index":247,"title":{},"content":{},"relUrl":{"19":{"position":[[0,16]]}}}],["changelog/#templ",{"_index":264,"title":{},"content":{},"relUrl":{"21":{"position":[[0,20]]}}}],["changelog/#url",{"_index":317,"title":{},"content":{},"relUrl":{"26":{"position":[[0,15]]},"27":{"position":[[0,15]]}}}],["changelog/#vari",{"_index":210,"title":{},"content":{},"relUrl":{"16":{"position":[[0,19]]}}}],["changelog/#what",{"_index":167,"title":{},"content":{},"relUrl":{"13":{"position":[[0,16]]}}}],["changelog/#zapi",{"_index":232,"title":{},"content":{},"relUrl":{"17":{"position":[[0,18]]}}}],["charact",{"_index":185,"title":{"63":{"position":[[44,11]]}},"content":{"15":{"position":[[121,9],[202,10],[311,11]]},"36":{"position":[[422,9]]},"51":{"position":[[590,11]]},"224":{"position":[[420,10]]}},"relUrl":{"63":{"position":[[49,10]]}}}],["charset=\"utf",{"_index":1388,"title":{},"content":{"213":{"position":[[381,12]]}},"relUrl":{}}],["charset=\\\"utf",{"_index":1356,"title":{},"content":{"202":{"position":[[415,13]]},"204":{"position":[[415,13]]}},"relUrl":{}}],["chart",{"_index":767,"title":{"97":{"position":[[6,6]]}},"content":{"97":{"position":[[88,6]]},"98":{"position":[[339,6]]},"99":{"position":[[49,6],[103,6]]}},"relUrl":{"97":{"position":[[14,6]]},"98":{"position":[[14,6]]},"99":{"position":[[14,6]]},"100":{"position":[[14,6]]}}}],["chartopt",{"_index":851,"title":{},"content":{"98":{"position":[[1236,13]]}},"relUrl":{}}],["check",{"_index":463,"title":{},"content":{"48":{"position":[[326,5]]},"258":{"position":[[135,5]]}},"relUrl":{}}],["chines",{"_index":483,"title":{"63":{"position":[[15,8]]}},"content":{"51":{"position":[[561,8]]}},"relUrl":{"63":{"position":[[21,7]]}}}],["chrome",{"_index":55,"title":{"67":{"position":[[23,6]]}},"content":{"6":{"position":[[72,7]]},"7":{"position":[[77,6]]},"40":{"position":[[96,7]]},"41":{"position":[[73,6]]},"42":{"position":[[209,7]]},"51":{"position":[[728,6]]},"59":{"position":[[303,7]]},"67":{"position":[[61,7]]},"73":{"position":[[76,7]]},"74":{"position":[[77,6]]},"89":{"position":[[60,6],[101,7]]},"105":{"position":[[72,7]]},"130":{"position":[[82,7]]},"136":{"position":[[80,7]]},"137":{"position":[[77,6]]},"146":{"position":[[73,7]]},"147":{"position":[[77,6]]},"159":{"position":[[76,7]]},"160":{"position":[[77,6]]},"174":{"position":[[74,7]]},"175":{"position":[[73,6]]},"221":{"position":[[72,6]]},"246":{"position":[[65,6]]},"250":{"position":[[78,7]]}},"relUrl":{"67":{"position":[[29,6]]}}}],["chrome’",{"_index":1306,"title":{},"content":{"191":{"position":[[767,8],[938,8]]},"197":{"position":[[929,8],[1100,8]]},"218":{"position":[[150,8],[229,8]]},"235":{"position":[[1042,8],[1213,8]]},"255":{"position":[[731,8],[902,8]]}},"relUrl":{}}],["circl",{"_index":892,"title":{},"content":{"102":{"position":[[398,6]]},"187":{"position":[[693,6]]}},"relUrl":{}}],["cjk",{"_index":540,"title":{},"content":{"63":{"position":[[18,3]]}},"relUrl":{}}],["class",{"_index":110,"title":{"172":{"position":[[6,5]]}},"content":{"9":{"position":[[327,5]]},"172":{"position":[[263,5]]}},"relUrl":{"172":{"position":[[31,5]]}}}],["class=\"box",{"_index":1427,"title":{},"content":{"226":{"position":[[321,10]]}},"relUrl":{}}],["class=\"box\">",{"_index":1422,"title":{},"content":{"226":{"position":[[153,15]]}},"relUrl":{}}],["class=\"instagram",{"_index":973,"title":{},"content":{"127":{"position":[[210,16]]}},"relUrl":{}}],["class=\"mt",{"_index":888,"title":{},"content":{"102":{"position":[[294,9],[463,9]]},"187":{"position":[[628,9],[758,9]]}},"relUrl":{}}],["class=\"p",{"_index":868,"title":{},"content":{"102":{"position":[[69,8]]},"187":{"position":[[506,8]]}},"relUrl":{}}],["class=\"round",{"_index":891,"title":{},"content":{"102":{"position":[[383,14]]},"187":{"position":[[678,14]]}},"relUrl":{}}],["class=\"text",{"_index":899,"title":{},"content":{"102":{"position":[[512,11]]},"187":{"position":[[805,11]]}},"relUrl":{}}],["class=\"tweet",{"_index":874,"title":{},"content":{"102":{"position":[[132,12]]},"187":{"position":[[569,12]]}},"relUrl":{}}],["class=\"twitt",{"_index":1381,"title":{},"content":{"213":{"position":[[107,14]]}},"relUrl":{}}],["class='box'>",{"_index":1082,"title":{},"content":{"149":{"position":[[166,15]]}},"relUrl":{}}],["class='box'>hello",{"_index":1152,"title":{},"content":{"162":{"position":[[367,21]]}},"relUrl":{}}],["class='box'>javascript",{"_index":1007,"title":{},"content":{"139":{"position":[[300,25]]},"141":{"position":[[273,25]]},"142":{"position":[[213,25]]}},"relUrl":{}}],["class='ping'>pong",{"_index":119,"title":{},"content":{"9":{"position":[[402,20]]},"32":{"position":[[310,20]]},"76":{"position":[[337,20]]},"150":{"position":[[249,20]]},"177":{"position":[[240,20]]},"247":{"position":[[284,20]]}},"relUrl":{}}],["class='test'>hello",{"_index":1058,"title":{},"content":{"143":{"position":[[198,22]]}},"relUrl":{}}],["class=\\\"twitt",{"_index":1348,"title":{},"content":{"202":{"position":[[179,15]]},"204":{"position":[[179,15]]}},"relUrl":{}}],["clear",{"_index":1188,"title":{},"content":{"171":{"position":[[66,5]]},"241":{"position":[[176,5]]}},"relUrl":{}}],["click",{"_index":237,"title":{},"content":{"18":{"position":[[102,5]]},"126":{"position":[[175,8]]},"157":{"position":[[17,5]]}},"relUrl":{}}],["client",{"_index":128,"title":{"19":{"position":[[5,6]]},"124":{"position":[[14,6]]},"143":{"position":[[0,6]]}},"content":{"9":{"position":[[516,6]]},"14":{"position":[[75,7]]},"19":{"position":[[68,7],[161,6]]},"76":{"position":[[746,6]]},"121":{"position":[[20,6]]},"136":{"position":[[284,6]]},"139":{"position":[[169,7]]},"141":{"position":[[107,7]]},"150":{"position":[[348,7],[468,7]]},"154":{"position":[[19,6]]},"176":{"position":[[31,6],[159,6],[271,6],[449,6]]},"178":{"position":[[543,6]]},"247":{"position":[[398,6]]}},"relUrl":{"19":{"position":[[17,6]]}}}],["client.create_image(\"<div>hello",{"_index":1215,"title":{},"content":{"176":{"position":[[507,38]]}},"relUrl":{}}],["client.create_image(html",{"_index":1245,"title":{},"content":{"178":{"position":[[579,25]]}},"relUrl":{}}],["client.credenti",{"_index":1507,"title":{},"content":{"247":{"position":[[421,18]]}},"relUrl":{}}],["client.do(req",{"_index":642,"title":{},"content":{"76":{"position":[[813,14]]}},"relUrl":{}}],["client.headers[httprequestheader.author",{"_index":131,"title":{},"content":{"9":{"position":[[633,47]]}},"relUrl":{}}],["client.uploadvalu",{"_index":132,"title":{},"content":{"9":{"position":[[716,20]]},"247":{"position":[[495,20]]}},"relUrl":{}}],["cloudflare’",{"_index":548,"title":{},"content":{"64":{"position":[[54,12]]},"237":{"position":[[266,12]]}},"relUrl":{}}],["code",{"_index":32,"title":{"9":{"position":[[11,4]]},"76":{"position":[[15,4]]},"81":{"position":[[8,4]]},"103":{"position":[[20,4]]},"116":{"position":[[8,4]]},"127":{"position":[[8,4]]},"139":{"position":[[19,4]]},"149":{"position":[[12,4]]},"162":{"position":[[15,4]]},"176":{"position":[[13,4]]},"213":{"position":[[8,4]]},"247":{"position":[[8,4]]}},"content":{"3":{"position":[[77,4]]},"6":{"position":[[173,4]]},"8":{"position":[[160,4]]},"9":{"position":[[8,4],[128,4]]},"73":{"position":[[189,4]]},"75":{"position":[[164,4]]},"76":{"position":[[12,4]]},"79":{"position":[[141,4]]},"86":{"position":[[152,4]]},"95":{"position":[[351,5]]},"103":{"position":[[51,5]]},"104":{"position":[[207,4]]},"106":{"position":[[133,4]]},"107":{"position":[[99,4]]},"108":{"position":[[9,4]]},"109":{"position":[[89,4]]},"110":{"position":[[85,4]]},"116":{"position":[[51,4]]},"126":{"position":[[114,4]]},"136":{"position":[[205,4]]},"138":{"position":[[168,4]]},"139":{"position":[[16,4]]},"141":{"position":[[8,4]]},"146":{"position":[[177,4]]},"148":{"position":[[161,4]]},"149":{"position":[[9,4]]},"150":{"position":[[55,4],[738,4]]},"159":{"position":[[189,4]]},"161":{"position":[[164,4]]},"162":{"position":[[12,4]]},"174":{"position":[[154,4]]},"180":{"position":[[31,4],[98,4]]},"217":{"position":[[290,5]]},"226":{"position":[[841,4]]},"231":{"position":[[159,4]]},"245":{"position":[[137,4]]},"247":{"position":[[5,4]]}},"relUrl":{"9":{"position":[[27,4]]},"76":{"position":[[33,4]]},"81":{"position":[[42,4]]},"103":{"position":[[22,4]]},"116":{"position":[[9,5]]},"127":{"position":[[33,4]]},"139":{"position":[[45,4]]},"149":{"position":[[31,4]]},"162":{"position":[[37,4]]},"176":{"position":[[33,4]]},"213":{"position":[[36,4]]},"247":{"position":[[30,4]]}}}],["code/c",{"_index":150,"title":{},"content":{},"relUrl":{"11":{"position":[[9,7]]}}}],["code/c/#authent",{"_index":99,"title":{},"content":{},"relUrl":{"8":{"position":[[9,22]]}}}],["code/c/#c",{"_index":61,"title":{},"content":{},"relUrl":{"6":{"position":[[9,9]]},"9":{"position":[[9,9]]}}}],["code/c/#gener",{"_index":84,"title":{},"content":{},"relUrl":{"7":{"position":[[9,18]]}}}],["code/c/#ne",{"_index":149,"title":{},"content":{},"relUrl":{"10":{"position":[[9,12]]}}}],["code/curl",{"_index":347,"title":{},"content":{},"relUrl":{"31":{"position":[[9,10]]}}}],["code/curl/#gener",{"_index":360,"title":{},"content":{},"relUrl":{"32":{"position":[[9,19]]}}}],["code/curl/#ne",{"_index":368,"title":{},"content":{},"relUrl":{"34":{"position":[[9,15]]}}}],["code/curl/#respons",{"_index":367,"title":{},"content":{},"relUrl":{"33":{"position":[[9,19]]}}}],["code/go",{"_index":657,"title":{},"content":{},"relUrl":{"78":{"position":[[9,8]]}}}],["code/go/#authent",{"_index":614,"title":{},"content":{},"relUrl":{"75":{"position":[[9,23]]}}}],["code/go/#gener",{"_index":613,"title":{},"content":{},"relUrl":{"74":{"position":[[9,19]]}}}],["code/go/#golang",{"_index":612,"title":{},"content":{},"relUrl":{"73":{"position":[[9,15]]},"76":{"position":[[9,15]]}}}],["code/go/#ne",{"_index":656,"title":{},"content":{},"relUrl":{"77":{"position":[[9,13]]}}}],["code/googl",{"_index":659,"title":{},"content":{},"relUrl":{"79":{"position":[[9,11]]},"80":{"position":[[9,11]]},"81":{"position":[[9,11]]},"82":{"position":[[9,11]]},"83":{"position":[[9,11]]}}}],["code/javascript",{"_index":1026,"title":{},"content":{},"relUrl":{"140":{"position":[[9,16]]},"145":{"position":[[9,16]]}}}],["code/javascript/#authent",{"_index":1004,"title":{},"content":{},"relUrl":{"138":{"position":[[9,31]]}}}],["code/javascript/#cli",{"_index":1074,"title":{},"content":{},"relUrl":{"143":{"position":[[9,23]]}}}],["code/javascript/#gener",{"_index":1003,"title":{},"content":{},"relUrl":{"137":{"position":[[9,27]]}}}],["code/javascript/#javascript",{"_index":1002,"title":{},"content":{},"relUrl":{"136":{"position":[[9,27]]},"139":{"position":[[9,27]]},"141":{"position":[[9,27]]}}}],["code/javascript/#ne",{"_index":1075,"title":{},"content":{},"relUrl":{"144":{"position":[[9,21]]}}}],["code/javascript/#plain",{"_index":1052,"title":{},"content":{},"relUrl":{"142":{"position":[[9,22]]}}}],["code/php",{"_index":1133,"title":{},"content":{},"relUrl":{"152":{"position":[[9,9]]}}}],["code/php/#authent",{"_index":1079,"title":{},"content":{},"relUrl":{"148":{"position":[[9,24]]}}}],["code/php/#gener",{"_index":1078,"title":{},"content":{},"relUrl":{"147":{"position":[[9,20]]}}}],["code/php/#ne",{"_index":1132,"title":{},"content":{},"relUrl":{"151":{"position":[[9,14]]}}}],["code/php/#php",{"_index":1077,"title":{},"content":{},"relUrl":{"146":{"position":[[9,13]]},"149":{"position":[[9,13]]},"150":{"position":[[9,13]]}}}],["code/python",{"_index":1166,"title":{},"content":{},"relUrl":{"164":{"position":[[9,12]]}}}],["code/python/#authent",{"_index":1147,"title":{},"content":{},"relUrl":{"161":{"position":[[9,27]]}}}],["code/python/#gener",{"_index":1146,"title":{},"content":{},"relUrl":{"160":{"position":[[9,23]]}}}],["code/python/#ne",{"_index":1165,"title":{},"content":{},"relUrl":{"163":{"position":[[9,17]]}}}],["code/python/#python",{"_index":1145,"title":{},"content":{},"relUrl":{"159":{"position":[[9,19]]},"162":{"position":[[9,19]]}}}],["code/rubi",{"_index":1262,"title":{},"content":{},"relUrl":{"180":{"position":[[9,10]]},"182":{"position":[[9,10]]}}}],["code/ruby/#exampl",{"_index":1235,"title":{},"content":{},"relUrl":{"177":{"position":[[9,18]]}}}],["code/ruby/#gener",{"_index":1205,"title":{},"content":{},"relUrl":{"175":{"position":[[9,21]]}}}],["code/ruby/#ne",{"_index":1263,"title":{},"content":{},"relUrl":{"181":{"position":[[9,15]]}}}],["code/ruby/#rend",{"_index":1258,"title":{},"content":{},"relUrl":{"179":{"position":[[9,20]]}}}],["code/ruby/#rubi",{"_index":1204,"title":{},"content":{},"relUrl":{"174":{"position":[[9,15]]},"176":{"position":[[9,15]]},"178":{"position":[[9,15]]}}}],["code/vb.net",{"_index":1517,"title":{},"content":{},"relUrl":{"249":{"position":[[9,12]]}}}],["code/vb.net/#exampl",{"_index":1515,"title":{},"content":{},"relUrl":{"247":{"position":[[9,20]]}}}],["code/vb.net/#gener",{"_index":1501,"title":{},"content":{},"relUrl":{"246":{"position":[[9,21]]}}}],["code/vb.net/#ne",{"_index":1516,"title":{},"content":{},"relUrl":{"248":{"position":[[9,17]]}}}],["code/vb.net/#vbnet",{"_index":1500,"title":{},"content":{},"relUrl":{"245":{"position":[[9,18]]}}}],["codepen",{"_index":522,"title":{},"content":{"56":{"position":[[160,7]]},"107":{"position":[[124,8]]},"108":{"position":[[34,8]]},"109":{"position":[[114,8]]},"110":{"position":[[110,8]]},"257":{"position":[[100,8]]}},"relUrl":{}}],["color",{"_index":1061,"title":{},"content":{"143":{"position":[[267,6]]},"162":{"position":[[425,6],[450,6]]},"176":{"position":[[589,6]]},"207":{"position":[[130,6]]},"208":{"position":[[26,6]]},"226":{"position":[[576,6],[876,6],[912,6]]}},"relUrl":{}}],["command",{"_index":348,"title":{},"content":{"32":{"position":[[9,7]]}},"relUrl":{}}],["comment",{"_index":934,"title":{},"content":{"109":{"position":[[32,9]]}},"relUrl":{}}],["common",{"_index":1265,"title":{"186":{"position":[[0,6]]}},"content":{"183":{"position":[[124,6]]}},"relUrl":{}}],["complet",{"_index":335,"title":{},"content":{"29":{"position":[[98,10]]}},"relUrl":{}}],["complex",{"_index":279,"title":{},"content":{"22":{"position":[[314,7]]},"150":{"position":[[788,7]]},"168":{"position":[[46,7]]},"259":{"position":[[184,7]]}},"relUrl":{}}],["condit",{"_index":848,"title":{},"content":{"98":{"position":[[1206,10]]}},"relUrl":{}}],["connect",{"_index":343,"title":{},"content":{"30":{"position":[[96,7]]},"115":{"position":[[0,7]]},"130":{"position":[[130,7]]},"133":{"position":[[5,10]]},"250":{"position":[[317,7]]},"252":{"position":[[5,10]]}},"relUrl":{}}],["connectorallow",{"_index":801,"title":{},"content":{"98":{"position":[[663,17]]}},"relUrl":{}}],["consid",{"_index":395,"title":{},"content":{"36":{"position":[[474,10]]}},"relUrl":{}}],["consist",{"_index":1187,"title":{},"content":{"171":{"position":[[51,10]]}},"relUrl":{}}],["console.error(err",{"_index":1073,"title":{},"content":{"143":{"position":[[751,20]]}},"relUrl":{}}],["console.error(error",{"_index":1049,"title":{},"content":{"142":{"position":[[943,20]]}},"relUrl":{}}],["console.log(`statuscod",{"_index":1042,"title":{},"content":{"142":{"position":[[779,24]]}},"relUrl":{}}],["console.log(data.url",{"_index":1071,"title":{},"content":{"143":{"position":[[709,21]]}},"relUrl":{}}],["console.log(image[\"url",{"_index":1046,"title":{},"content":{"142":{"position":[[879,25]]}},"relUrl":{}}],["console.log(json.parse(data",{"_index":1017,"title":{},"content":{"139":{"position":[[704,29]]}},"relUrl":{}}],["console.writeline(resultstr",{"_index":136,"title":{},"content":{"9":{"position":[[939,32]]},"247":{"position":[[703,31]]}},"relUrl":{}}],["const",{"_index":621,"title":{},"content":{"76":{"position":[[221,5]]},"139":{"position":[[211,5],[270,5]]},"141":{"position":[[176,5],[243,5],[564,5],[669,5]]},"142":{"position":[[137,5],[168,5],[456,5],[484,5],[514,5],[730,5],[851,5]]},"143":{"position":[[168,5],[287,5],[315,5],[343,5]]}},"relUrl":{}}],["contact",{"_index":509,"title":{},"content":{"54":{"position":[[56,7]]}},"relUrl":{}}],["contain",{"_index":260,"title":{},"content":{"21":{"position":[[102,8]]}},"relUrl":{}}],["content",{"_index":309,"title":{},"content":{"25":{"position":[[148,8]]},"64":{"position":[[74,7]]},"66":{"position":[[234,7]]},"142":{"position":[[610,8]]},"143":{"position":[[416,8]]},"149":{"position":[[829,8]]},"237":{"position":[[286,7]]}},"relUrl":{}}],["content</div>",{"_index":1287,"title":{},"content":{"189":{"position":[[234,20]]},"195":{"position":[[232,20]]},"233":{"position":[[231,20]]},"253":{"position":[[315,20]]}},"relUrl":{}}],["control",{"_index":270,"title":{},"content":{"22":{"position":[[96,7],[338,7]]},"48":{"position":[[394,7]]},"165":{"position":[[0,7],[96,7]]},"167":{"position":[[210,7]]},"179":{"position":[[33,11],[132,10]]},"191":{"position":[[32,7]]},"197":{"position":[[32,7],[768,7]]},"235":{"position":[[32,7],[768,7]]}},"relUrl":{}}],["convert",{"_index":0,"title":{"0":{"position":[[0,7]]},"40":{"position":[[0,7]]},"44":{"position":[[0,7]]},"102":{"position":[[0,10]]},"125":{"position":[[0,7]]}},"content":{"2":{"position":[[19,7]]},"3":{"position":[[91,7]]},"7":{"position":[[87,7]]},"9":{"position":[[77,10]]},"18":{"position":[[135,9]]},"41":{"position":[[83,7]]},"70":{"position":[[0,7]]},"74":{"position":[[87,7]]},"76":{"position":[[81,10]]},"93":{"position":[[69,7]]},"101":{"position":[[170,8]]},"118":{"position":[[32,10]]},"137":{"position":[[87,7]]},"139":{"position":[[85,10]]},"147":{"position":[[87,7]]},"149":{"position":[[78,10]]},"160":{"position":[[87,7]]},"162":{"position":[[81,10]]},"175":{"position":[[83,7]]},"246":{"position":[[75,7]]}},"relUrl":{"102":{"position":[[0,12]]}}}],["convert.tobase64string(encoding.ascii.getbytes(\"user_id:api_key",{"_index":130,"title":{},"content":{"9":{"position":[[565,67]]}},"relUrl":{}}],["cool",{"_index":559,"title":{},"content":{"65":{"position":[[69,5]]}},"relUrl":{}}],["copi",{"_index":534,"title":{},"content":{"60":{"position":[[59,4]]},"127":{"position":[[0,4]]},"213":{"position":[[0,4]]}},"relUrl":{}}],["cor",{"_index":456,"title":{},"content":{"48":{"position":[[209,4]]}},"relUrl":{}}],["correct",{"_index":190,"title":{},"content":{"15":{"position":[[194,7]]}},"relUrl":{}}],["correctli",{"_index":543,"title":{},"content":{"63":{"position":[[115,10]]}},"relUrl":{}}],["cors.org",{"_index":460,"title":{},"content":{"48":{"position":[[267,8]]}},"relUrl":{}}],["courier",{"_index":1451,"title":{},"content":{"226":{"position":[[861,8]]}},"relUrl":{}}],["creat",{"_index":77,"title":{"36":{"position":[[18,6]]},"188":{"position":[[0,8]]},"198":{"position":[[0,8]]},"217":{"position":[[0,8]]},"232":{"position":[[0,8]]},"253":{"position":[[0,6]]},"255":{"position":[[0,6]]}},"content":{"7":{"position":[[265,8]]},"9":{"position":[[133,7]]},"21":{"position":[[75,6],[159,8]]},"22":{"position":[[384,8]]},"27":{"position":[[44,6]]},"32":{"position":[[110,8]]},"36":{"position":[[51,8],[157,7]]},"37":{"position":[[179,6]]},"38":{"position":[[52,7]]},"41":{"position":[[213,8]]},"52":{"position":[[39,6]]},"53":{"position":[[232,8]]},"61":{"position":[[89,8]]},"66":{"position":[[373,8]]},"74":{"position":[[269,8]]},"76":{"position":[[673,6]]},"89":{"position":[[446,8]]},"102":{"position":[[15,7]]},"127":{"position":[[44,6]]},"131":{"position":[[52,6],[84,6]]},"137":{"position":[[273,8]]},"139":{"position":[[452,6],[860,8]]},"141":{"position":[[425,6]]},"147":{"position":[[266,8]]},"155":{"position":[[4,8],[23,6]]},"160":{"position":[[269,8]]},"175":{"position":[[245,8]]},"176":{"position":[[479,8]]},"178":{"position":[[197,8],[297,8]]},"179":{"position":[[170,6]]},"183":{"position":[[0,6],[156,8],[305,8]]},"185":{"position":[[150,8]]},"186":{"position":[[87,6]]},"189":{"position":[[4,6]]},"190":{"position":[[4,8]]},"192":{"position":[[12,7]]},"193":{"position":[[15,6],[49,6]]},"194":{"position":[[107,6]]},"196":{"position":[[4,8]]},"198":{"position":[[99,6]]},"199":{"position":[[9,6],[133,6]]},"200":{"position":[[4,6]]},"206":{"position":[[13,6]]},"213":{"position":[[44,6],[455,8]]},"216":{"position":[[81,8]]},"224":{"position":[[133,8],[355,8]]},"228":{"position":[[252,8]]},"230":{"position":[[81,8]]},"231":{"position":[[288,6]]},"233":{"position":[[4,6]]},"234":{"position":[[4,8]]},"236":{"position":[[12,7]]},"237":{"position":[[6,8]]},"246":{"position":[[239,8]]},"247":{"position":[[10,7]]},"250":{"position":[[161,6],[191,6]]},"251":{"position":[[47,6],[77,6]]},"253":{"position":[[42,6],[77,8]]},"254":{"position":[[5,8]]},"257":{"position":[[0,8]]},"258":{"position":[[74,8]]}},"relUrl":{"36":{"position":[[53,6]]}}}],["created_at",{"_index":1344,"title":{},"content":{"202":{"position":[[44,13]]},"204":{"position":[[44,13]]}},"relUrl":{}}],["creation",{"_index":268,"title":{},"content":{"22":{"position":[[71,9]]},"37":{"position":[[54,8]]},"184":{"position":[[100,9]]}},"relUrl":{}}],["credenti",{"_index":103,"title":{},"content":{"9":{"position":[[159,11],[551,11],[694,12]]},"32":{"position":[[167,11]]},"247":{"position":[[36,11]]}},"relUrl":{}}],["credit",{"_index":517,"title":{},"content":{"55":{"position":[[187,6]]}},"relUrl":{}}],["crip/clear",{"_index":732,"title":{},"content":{"90":{"position":[[114,10]]}},"relUrl":{}}],["crop",{"_index":692,"title":{},"content":{"85":{"position":[[53,4],[331,5]]},"87":{"position":[[34,5]]},"89":{"position":[[596,8]]},"191":{"position":[[294,4],[814,9],[985,9]]},"197":{"position":[[294,4],[976,9],[1147,9]]},"212":{"position":[[244,4]]},"218":{"position":[[811,4]]},"220":{"position":[[211,4]]},"235":{"position":[[294,4],[1089,9],[1260,9]]},"255":{"position":[[778,9],[949,9],[1099,4]]}},"relUrl":{}}],["crossorigin",{"_index":442,"title":{},"content":{"46":{"position":[[146,11]]}},"relUrl":{}}],["crossorigin=\"anonymous\">",{"_index":904,"title":{},"content":{"102":{"position":[[819,27]]}},"relUrl":{}}],["css",{"_index":105,"title":{"45":{"position":[[9,4]]},"47":{"position":[[9,3]]},"50":{"position":[[9,4]]},"56":{"position":[[19,3]]},"221":{"position":[[0,3]]}},"content":{"9":{"position":[[196,3],[446,3],[852,6],[859,3]]},"45":{"position":[[92,3]]},"47":{"position":[[16,3],[100,3]]},"48":{"position":[[36,4]]},"51":{"position":[[318,3]]},"56":{"position":[[79,3]]},"76":{"position":[[374,6]]},"81":{"position":[[252,6]]},"89":{"position":[[625,4]]},"102":{"position":[[596,4]]},"139":{"position":[[342,4]]},"141":{"position":[[315,4]]},"142":{"position":[[255,4]]},"143":{"position":[[242,4]]},"149":{"position":[[221,4]]},"150":{"position":[[286,4],[604,5],[616,5]]},"162":{"position":[[410,6]]},"172":{"position":[[115,3],[191,3]]},"176":{"position":[[566,4]]},"177":{"position":[[276,3],[406,4],[411,3]]},"178":{"position":[[374,4],[611,4],[616,4]]},"189":{"position":[[283,3],[302,3]]},"190":{"position":[[48,3]]},"191":{"position":[[244,3]]},"195":{"position":[[281,3],[300,3]]},"196":{"position":[[48,3]]},"197":{"position":[[244,3]]},"202":{"position":[[31,6]]},"204":{"position":[[31,6]]},"207":{"position":[[80,3]]},"216":{"position":[[200,3]]},"218":{"position":[[761,3]]},"220":{"position":[[126,3]]},"221":{"position":[[15,3]]},"224":{"position":[[273,4]]},"226":{"position":[[133,4],[426,3]]},"230":{"position":[[30,4]]},"233":{"position":[[280,3],[299,3]]},"234":{"position":[[56,3]]},"235":{"position":[[244,3]]},"247":{"position":[[73,3],[324,3],[613,7],[621,4]]},"253":{"position":[[364,3],[383,3]]},"255":{"position":[[1049,3]]}},"relUrl":{"45":{"position":[[17,3],[44,3]]},"46":{"position":[[17,3]]},"47":{"position":[[17,3],[44,3]]},"48":{"position":[[17,3]]},"49":{"position":[[17,3]]},"50":{"position":[[17,3]]},"56":{"position":[[25,3]]}}}],["css'=>$css",{"_index":1085,"title":{},"content":{"149":{"position":[[381,15]]}},"relUrl":{}}],["css=\".ping",{"_index":357,"title":{},"content":{"32":{"position":[[351,10]]}},"relUrl":{}}],["curl",{"_index":345,"title":{"31":{"position":[[0,4]]},"32":{"position":[[23,4]]}},"content":{"31":{"position":[[59,5],[117,4]]},"32":{"position":[[235,4]]},"103":{"position":[[108,4]]},"104":{"position":[[94,4]]},"217":{"position":[[185,5],[191,4]]}},"relUrl":{"32":{"position":[[43,4]]}}}],["curl_clos",{"_index":1106,"title":{},"content":{"149":{"position":[[1012,10]]}},"relUrl":{}}],["curl_errno($ch",{"_index":1103,"title":{},"content":{"149":{"position":[[957,17]]}},"relUrl":{}}],["curl_error($ch",{"_index":1105,"title":{},"content":{"149":{"position":[[993,16]]}},"relUrl":{}}],["curl_exec($ch",{"_index":1102,"title":{},"content":{"149":{"position":[[938,15]]}},"relUrl":{}}],["curl_init",{"_index":1088,"title":{},"content":{"149":{"position":[[438,12]]}},"relUrl":{}}],["curl_setopt($ch",{"_index":1089,"title":{},"content":{"149":{"position":[[451,16],[510,16],[555,16],[618,16],[732,16],[880,16]]}},"relUrl":{}}],["curlopt_httphead",{"_index":1101,"title":{},"content":{"149":{"position":[[897,19]]}},"relUrl":{}}],["curlopt_post",{"_index":1094,"title":{},"content":{"149":{"position":[[635,13]]}},"relUrl":{}}],["curlopt_postfield",{"_index":1092,"title":{},"content":{"149":{"position":[[572,19]]}},"relUrl":{}}],["curlopt_returntransf",{"_index":1091,"title":{},"content":{"149":{"position":[[527,23]]}},"relUrl":{}}],["curlopt_url",{"_index":1090,"title":{},"content":{"149":{"position":[[468,12]]}},"relUrl":{}}],["curlopt_userpwd",{"_index":1096,"title":{},"content":{"149":{"position":[[749,16]]}},"relUrl":{}}],["current",{"_index":154,"title":{"13":{"position":[[11,9]]}},"content":{"66":{"position":[[75,9]]}},"relUrl":{"13":{"position":[[22,9]]}}}],["custom",{"_index":436,"title":{"72":{"position":[[51,9]]}},"content":{"45":{"position":[[121,6]]},"48":{"position":[[18,6]]},"54":{"position":[[116,6]]},"72":{"position":[[297,10]]},"89":{"position":[[362,9]]},"106":{"position":[[49,6]]},"218":{"position":[[3,9]]},"225":{"position":[[18,6]]},"254":{"position":[[213,10]]}},"relUrl":{"72":{"position":[[71,9]]}}}],["customfont",{"_index":451,"title":{},"content":{"48":{"position":[[69,13],[165,12]]}},"relUrl":{}}],["d",{"_index":355,"title":{},"content":{"32":{"position":[[294,1],[349,1]]},"142":{"position":[[839,3]]},"217":{"position":[[249,1]]}},"relUrl":{}}],["d32c",{"_index":1359,"title":{},"content":{"202":{"position":[[472,4]]},"204":{"position":[[472,4]]}},"relUrl":{}}],["d9534f",{"_index":1452,"title":{},"content":{"226":{"position":[[883,8]]}},"relUrl":{}}],["dashboard",{"_index":92,"title":{},"content":{"8":{"position":[[142,10]]},"13":{"position":[[145,9]]},"32":{"position":[[188,9]]},"62":{"position":[[49,10]]},"75":{"position":[[142,10]]},"122":{"position":[[92,10]]},"133":{"position":[[100,10]]},"138":{"position":[[142,10]]},"139":{"position":[[543,10]]},"141":{"position":[[516,10]]},"142":{"position":[[408,10]]},"148":{"position":[[142,10]]},"156":{"position":[[105,11]]},"161":{"position":[[142,10]]},"177":{"position":[[162,9]]},"231":{"position":[[144,10]]},"236":{"position":[[356,10]]},"252":{"position":[[100,10]]},"258":{"position":[[122,9]]}},"relUrl":{}}],["data",{"_index":625,"title":{},"content":{"76":{"position":[[293,4],[519,5]]},"98":{"position":[[745,5],[839,5],[941,5],[1038,5],[1118,5]]},"127":{"position":[[234,4]]},"139":{"position":[[276,4],[645,6]]},"141":{"position":[[249,4],[639,6]]},"142":{"position":[[174,4]]},"149":{"position":[[349,5]]},"157":{"position":[[29,6]]},"162":{"position":[[341,4],[579,4],[586,5]]},"202":{"position":[[19,7],[227,4]]},"204":{"position":[[19,7],[227,4]]},"213":{"position":[[151,4]]}},"relUrl":{}}],["date",{"_index":585,"title":{},"content":{"67":{"position":[[29,4]]}},"relUrl":{}}],["dcb9",{"_index":138,"title":{},"content":{"9":{"position":[[1017,4]]}},"relUrl":{}}],["dd82",{"_index":1220,"title":{},"content":{"176":{"position":[[734,4],[777,4],[861,4]]}},"relUrl":{}}],["debug",{"_index":472,"title":{},"content":{"51":{"position":[[99,5]]},"68":{"position":[[81,9]]}},"relUrl":{}}],["decemb",{"_index":332,"title":{},"content":{"29":{"position":[[0,8]]}},"relUrl":{}}],["def",{"_index":1238,"title":{},"content":{"178":{"position":[[348,3]]}},"relUrl":{}}],["default",{"_index":493,"title":{"239":{"position":[[9,7]]}},"content":{"53":{"position":[[3,7]]},"71":{"position":[[93,8]]},"89":{"position":[[179,8],[334,7]]},"90":{"position":[[245,8]]},"171":{"position":[[110,8]]},"172":{"position":[[107,7],[211,9]]},"209":{"position":[[58,8]]},"218":{"position":[[169,8],[248,8],[331,8]]},"238":{"position":[[93,8]]},"239":{"position":[[23,8]]}},"relUrl":{}}],["defer",{"_index":645,"title":{},"content":{"76":{"position":[[902,5]]}},"relUrl":{}}],["defin",{"_index":987,"title":{},"content":{"132":{"position":[[19,7]]},"139":{"position":[[249,6]]},"141":{"position":[[222,6]]},"184":{"position":[[25,6]]},"186":{"position":[[4,6]]}},"relUrl":{}}],["definit",{"_index":555,"title":{},"content":{"65":{"position":[[0,11]]}},"relUrl":{}}],["delay",{"_index":1176,"title":{},"content":{"166":{"position":[[434,8]]},"191":{"position":[[455,5]]},"197":{"position":[[455,5]]},"218":{"position":[[516,5]]},"235":{"position":[[455,5]]},"253":{"position":[[603,5]]},"255":{"position":[[522,5]]}},"relUrl":{}}],["delet",{"_index":331,"title":{"29":{"position":[[0,8]]},"241":{"position":[[0,8]]}},"content":{"29":{"position":[[38,6],[67,6]]},"230":{"position":[[223,8]]},"241":{"position":[[0,6],[47,6],[93,6]]}},"relUrl":{}}],["delimit",{"_index":1416,"title":{},"content":{"224":{"position":[[401,9]]}},"relUrl":{}}],["deliveri",{"_index":550,"title":{},"content":{"64":{"position":[[82,8]]},"237":{"position":[[294,8]]}},"relUrl":{}}],["demo",{"_index":57,"title":{},"content":{"6":{"position":[[85,4]]},"18":{"position":[[41,5],[249,4]]},"31":{"position":[[70,4]]},"40":{"position":[[109,4]]},"73":{"position":[[89,4]]},"79":{"position":[[65,4]]},"101":{"position":[[63,4]]},"115":{"position":[[71,4]]},"116":{"position":[[84,4]]},"117":{"position":[[63,4]]},"118":{"position":[[79,4]]},"136":{"position":[[93,4]]},"146":{"position":[[86,4]]},"159":{"position":[[89,4]]},"174":{"position":[[87,4]]},"230":{"position":[[40,4]]},"245":{"position":[[73,4]]}},"relUrl":{}}],["demonstr",{"_index":94,"title":{},"content":{"8":{"position":[[172,12]]},"75":{"position":[[176,12]]},"138":{"position":[[180,12]]},"148":{"position":[[173,12]]},"161":{"position":[[176,12]]},"231":{"position":[[172,11]]}},"relUrl":{}}],["depend",{"_index":404,"title":{},"content":{"37":{"position":[[161,10]]},"142":{"position":[[123,13]]}},"relUrl":{}}],["descript",{"_index":1285,"title":{},"content":{"189":{"position":[[116,11],[403,11],[426,11]]},"190":{"position":[[74,11]]},"191":{"position":[[73,11]]},"195":{"position":[[114,11],[401,11],[424,11]]},"196":{"position":[[74,11]]},"197":{"position":[[73,11]]},"200":{"position":[[196,11]]},"202":{"position":[[91,14]]},"204":{"position":[[91,14]]},"233":{"position":[[113,11]]},"235":{"position":[[73,11]]},"240":{"position":[[79,11]]},"253":{"position":[[197,11]]},"255":{"position":[[146,11]]}},"relUrl":{}}],["design",{"_index":162,"title":{"257":{"position":[[0,9]]}},"content":{"13":{"position":[[71,6]]},"250":{"position":[[238,9]]},"257":{"position":[[20,6]]}},"relUrl":{}}],["detail",{"_index":75,"title":{},"content":{"7":{"position":[[234,7]]},"32":{"position":[[79,7]]},"41":{"position":[[182,7]]},"74":{"position":[[238,7]]},"137":{"position":[[242,7]]},"147":{"position":[[235,7]]},"160":{"position":[[238,7]]},"175":{"position":[[214,7]]},"246":{"position":[[208,7]]}},"relUrl":{}}],["detect",{"_index":370,"title":{"35":{"position":[[16,9]]}},"content":{"36":{"position":[[27,6]]},"37":{"position":[[94,9],[264,6]]},"38":{"position":[[16,9]]},"72":{"position":[[150,6]]},"221":{"position":[[95,6]]}},"relUrl":{"35":{"position":[[24,10]]},"37":{"position":[[24,10]]}}}],["detection/#ne",{"_index":412,"title":{},"content":{},"relUrl":{"39":{"position":[[24,15]]}}}],["detection/#url",{"_index":408,"title":{},"content":{},"relUrl":{"38":{"position":[[24,14]]}}}],["detection/#what",{"_index":396,"title":{},"content":{},"relUrl":{"36":{"position":[[24,15]]}}}],["determin",{"_index":391,"title":{},"content":{"36":{"position":[[382,9]]},"95":{"position":[[139,10]]}},"relUrl":{}}],["dev.to",{"_index":920,"title":{"106":{"position":[[15,6]]}},"content":{"106":{"position":[[0,6]]}},"relUrl":{}}],["dev.to’",{"_index":1259,"title":{},"content":{"180":{"position":[[15,8]]}},"relUrl":{}}],["develop",{"_index":831,"title":{},"content":{"98":{"position":[[1024,13]]}},"relUrl":{}}],["devic",{"_index":500,"title":{},"content":{"53":{"position":[[118,7]]},"90":{"position":[[6,6],[23,7]]},"218":{"position":[[323,7]]},"219":{"position":[[38,6]]}},"relUrl":{}}],["device_scal",{"_index":254,"title":{},"content":{"20":{"position":[[121,13]]},"191":{"position":[[620,12]]},"197":{"position":[[620,12]]},"202":{"position":[[112,15]]},"204":{"position":[[112,15]]},"218":{"position":[[271,12]]},"235":{"position":[[620,12]]},"253":{"position":[[768,12]]},"255":{"position":[[356,12]]}},"relUrl":{}}],["device_scale:1",{"_index":505,"title":{},"content":{"53":{"position":[[212,14]]}},"relUrl":{}}],["devto",{"_index":925,"title":{},"content":{},"relUrl":{"106":{"position":[[16,5]]}}}],["differ",{"_index":393,"title":{},"content":{"36":{"position":[[432,10]]},"37":{"position":[[223,9]]},"71":{"position":[[116,9]]},"91":{"position":[[147,9]]},"238":{"position":[[116,9]]}},"relUrl":{}}],["differenti",{"_index":1295,"title":{},"content":{"190":{"position":[[130,13]]},"196":{"position":[[130,13]]}},"relUrl":{}}],["dim",{"_index":1506,"title":{},"content":{"247":{"position":[[233,3],[254,3],[320,3],[640,3]]}},"relUrl":{}}],["dir=\"ltr\"></p>",{"_index":1385,"title":{},"content":{"213":{"position":[[187,23]]}},"relUrl":{}}],["dir=\\\"ltr\\\"></p>\\n\\n<a",{"_index":1352,"title":{},"content":{"202":{"position":[[268,34]]},"204":{"position":[[268,34]]}},"relUrl":{}}],["directli",{"_index":1478,"title":{},"content":{"237":{"position":[[95,8],[327,8]]}},"relUrl":{}}],["disabl",{"_index":857,"title":{"99":{"position":[[2,7]]}},"content":{"99":{"position":[[11,7]]},"191":{"position":[[796,7],[967,7]]},"197":{"position":[[958,7],[1129,7]]},"235":{"position":[[1071,7],[1242,7]]},"255":{"position":[[760,7],[931,7]]}},"relUrl":{}}],["discord",{"_index":992,"title":{},"content":{"132":{"position":[[274,7]]}},"relUrl":{}}],["display",{"_index":427,"title":{},"content":{"42":{"position":[[189,9]]},"59":{"position":[[283,9]]},"91":{"position":[[126,10]]},"172":{"position":[[86,8],[283,7]]}},"relUrl":{}}],["distribut",{"_index":821,"title":{},"content":{"98":{"position":[[926,14]]},"241":{"position":[[248,11]]}},"relUrl":{}}],["div",{"_index":713,"title":{},"content":{"86":{"position":[[226,4]]},"176":{"position":[[571,4]]}},"relUrl":{}}],["dl",{"_index":1490,"title":{},"content":{"240":{"position":[[223,2]]}},"relUrl":{}}],["dl=1",{"_index":1491,"title":{},"content":{"240":{"position":[[242,4]]}},"relUrl":{}}],["dnt=\"true\">",{"_index":1382,"title":{},"content":{"213":{"position":[[156,14]]}},"relUrl":{}}],["dnt=\\\"true\\\">\\n<p",{"_index":1350,"title":{},"content":{"202":{"position":[[232,23]]},"204":{"position":[[232,23]]}},"relUrl":{}}],["do",{"_index":763,"title":{},"content":{"95":{"position":[[258,5]]}},"relUrl":{}}],["doc",{"_index":304,"title":{"25":{"position":[[10,4]]}},"content":{"114":{"position":[[105,4]]}},"relUrl":{"25":{"position":[[22,4]]}}}],["document",{"_index":145,"title":{},"content":{"10":{"position":[[37,14]]},"25":{"position":[[51,13]]},"43":{"position":[[37,14]]},"77":{"position":[[37,14]]},"80":{"position":[[186,10]]},"82":{"position":[[37,14]]},"151":{"position":[[37,14]]},"176":{"position":[[955,13]]},"205":{"position":[[37,14]]}},"relUrl":{}}],["domain",{"_index":547,"title":{},"content":{"64":{"position":[[33,6]]}},"relUrl":{}}],["done",{"_index":954,"title":{"158":{"position":[[0,4]]}},"content":{"123":{"position":[[80,5]]},"168":{"position":[[229,4]]}},"relUrl":{}}],["don’t",{"_index":914,"title":{},"content":{"104":{"position":[[33,5]]},"217":{"position":[[278,5],[296,5]]}},"relUrl":{}}],["dot",{"_index":748,"title":{},"content":{"93":{"position":[[91,5],[181,4]]}},"relUrl":{}}],["doubl",{"_index":1303,"title":{},"content":{"191":{"position":[[635,6]]},"197":{"position":[[635,6]]},"235":{"position":[[635,6]]},"253":{"position":[[783,6]]},"255":{"position":[[371,6]]}},"relUrl":{}}],["down",{"_index":521,"title":{},"content":{"56":{"position":[[125,4]]},"191":{"position":[[584,4]]},"197":{"position":[[584,4]]},"218":{"position":[[703,4]]},"225":{"position":[[40,4]]},"235":{"position":[[584,4]]},"253":{"position":[[732,4]]},"255":{"position":[[651,4]]},"259":{"position":[[280,4]]}},"relUrl":{}}],["download",{"_index":209,"title":{},"content":{"16":{"position":[[228,11]]},"42":{"position":[[326,8]]},"45":{"position":[[245,8]]},"72":{"position":[[183,8]]},"121":{"position":[[70,8]]},"154":{"position":[[64,8]]},"237":{"position":[[64,8]]},"240":{"position":[[281,12]]}},"relUrl":{}}],["dpi",{"_index":747,"title":{},"content":{"93":{"position":[[87,3],[175,3],[240,4]]},"94":{"position":[[10,3]]},"95":{"position":[[10,3]]}},"relUrl":{}}],["dpr",{"_index":727,"title":{},"content":{"90":{"position":[[19,3],[93,4]]}},"relUrl":{}}],["due",{"_index":385,"title":{},"content":{"36":{"position":[[282,3]]}},"relUrl":{}}],["duplic",{"_index":369,"title":{"35":{"position":[[0,9]]}},"content":{"36":{"position":[[392,11],[487,10]]},"37":{"position":[[66,9],[84,9]]},"38":{"position":[[0,9]]}},"relUrl":{}}],["dynam",{"_index":929,"title":{},"content":{"107":{"position":[[41,11]]}},"relUrl":{}}],["e2e5",{"_index":363,"title":{},"content":{"33":{"position":[[110,4]]}},"relUrl":{}}],["e7f6",{"_index":1312,"title":{},"content":{"192":{"position":[[51,4]]}},"relUrl":{}}],["each",{"_index":578,"title":{},"content":{"66":{"position":[[401,4]]},"172":{"position":[[0,4]]},"237":{"position":[[429,4]]}},"relUrl":{}}],["easi",{"_index":582,"title":{},"content":{"66":{"position":[[452,4]]},"172":{"position":[[66,4]]},"183":{"position":[[52,5]]}},"relUrl":{}}],["easier",{"_index":160,"title":{},"content":{"13":{"position":[[50,6]]},"18":{"position":[[179,6]]},"19":{"position":[[92,6]]}},"relUrl":{}}],["east",{"_index":284,"title":{"24":{"position":[[19,4]]}},"content":{"24":{"position":[[38,4],[126,4]]}},"relUrl":{"24":{"position":[[31,4]]}}}],["echo",{"_index":1104,"title":{},"content":{"149":{"position":[[977,4],[1064,4]]},"150":{"position":[[626,4]]}},"relUrl":{}}],["edg",{"_index":400,"title":{},"content":{"37":{"position":[[119,4]]},"72":{"position":[[132,4]]}},"relUrl":{}}],["edit",{"_index":236,"title":{"194":{"position":[[0,7]]}},"content":{"18":{"position":[[88,4]]},"183":{"position":[[241,7]]},"193":{"position":[[71,4]]},"194":{"position":[[3,4]]},"195":{"position":[[4,4]]},"257":{"position":[[148,4]]}},"relUrl":{}}],["editor",{"_index":158,"title":{"18":{"position":[[9,6]]}},"content":{"13":{"position":[[32,7]]}},"relUrl":{"18":{"position":[[21,6]]}}}],["effect",{"_index":1496,"title":{},"content":{"241":{"position":[[325,7]]}},"relUrl":{}}],["elabor",{"_index":1292,"title":{},"content":{"189":{"position":[[441,9]]},"195":{"position":[[439,9]]}},"relUrl":{}}],["element",{"_index":695,"title":{},"content":{"85":{"position":[[111,8]]},"87":{"position":[[119,8]]},"95":{"position":[[335,7]]},"165":{"position":[[243,7]]},"166":{"position":[[161,7]]},"167":{"position":[[82,7]]},"191":{"position":[[264,7],[326,8]]},"197":{"position":[[264,7],[326,8]]},"218":{"position":[[781,7],[843,8]]},"220":{"position":[[109,7],[224,7]]},"235":{"position":[[264,7],[326,8]]},"255":{"position":[[1069,7],[1131,8]]}},"relUrl":{}}],["email",{"_index":147,"title":{"40":{"position":[[13,6]]},"41":{"position":[[23,6]]},"44":{"position":[[8,5]]}},"content":{"10":{"position":[[70,6]]},"39":{"position":[[24,5]]},"40":{"position":[[37,6]]},"41":{"position":[[147,6]]},"42":{"position":[[17,5]]},"43":{"position":[[70,6]]},"49":{"position":[[24,5]]},"51":{"position":[[37,5]]},"55":{"position":[[60,5]]},"63":{"position":[[144,5]]},"65":{"position":[[75,5]]},"68":{"position":[[0,5]]},"77":{"position":[[70,6]]},"82":{"position":[[70,6]]},"100":{"position":[[24,5]]},"104":{"position":[[134,5]]},"110":{"position":[[49,7]]},"128":{"position":[[24,5]]},"144":{"position":[[24,5]]},"151":{"position":[[70,6]]},"163":{"position":[[24,5]]},"169":{"position":[[24,5]]},"181":{"position":[[24,5]]},"205":{"position":[[70,6]]},"214":{"position":[[24,5]]},"222":{"position":[[62,6]]},"229":{"position":[[24,5]]},"243":{"position":[[24,5]]},"248":{"position":[[24,5]]},"256":{"position":[[67,6]]},"260":{"position":[[24,5]]}},"relUrl":{"40":{"position":[[16,6],[44,6]]},"41":{"position":[[16,6],[54,6]]},"42":{"position":[[16,6]]},"43":{"position":[[16,6]]},"44":{"position":[[16,6]]}}}],["emb",{"_index":519,"title":{"129":{"position":[[10,5]]}},"content":{"56":{"position":[[5,5]]},"126":{"position":[[81,5],[223,8]]},"212":{"position":[[68,5],[194,5]]}},"relUrl":{"129":{"position":[[18,6]]}}}],["embe",{"_index":523,"title":{},"content":{"57":{"position":[[32,5]]}},"relUrl":{}}],["embed/#convert",{"_index":960,"title":{},"content":{},"relUrl":{"125":{"position":[[18,14]]}}}],["embed/#exampl",{"_index":979,"title":{},"content":{},"relUrl":{"127":{"position":[[18,14]]}}}],["embed/#how",{"_index":966,"title":{},"content":{},"relUrl":{"126":{"position":[[18,10]]}}}],["embed/#ne",{"_index":980,"title":{},"content":{},"relUrl":{"128":{"position":[[18,11]]}}}],["emoji",{"_index":1183,"title":{"170":{"position":[[10,5]]},"172":{"position":[[0,5]]},"173":{"position":[[10,5]]}},"content":{"170":{"position":[[0,5]]},"172":{"position":[[135,6],[255,7],[294,5]]},"226":{"position":[[391,5]]}},"relUrl":{"170":{"position":[[35,5]]},"173":{"position":[[18,6]]}}}],["emoji/#emoji",{"_index":1201,"title":{},"content":{},"relUrl":{"172":{"position":[[18,12]]}}}],["emoji/#how",{"_index":1189,"title":{},"content":{},"relUrl":{"171":{"position":[[18,10]]}}}],["emoji/#rend",{"_index":1185,"title":{},"content":{},"relUrl":{"170":{"position":[[18,16]]}}}],["emojiclass",{"_index":1190,"title":{},"content":{"172":{"position":[[18,10]]}},"relUrl":{}}],["emoji’",{"_index":1186,"title":{},"content":{"171":{"position":[[0,7]]}},"relUrl":{}}],["employ",{"_index":782,"title":{},"content":{"98":{"position":[[390,10]]}},"relUrl":{}}],["employe",{"_index":791,"title":{},"content":{"98":{"position":[[522,10]]}},"relUrl":{}}],["empti",{"_index":187,"title":{},"content":{"15":{"position":[[166,5]]}},"relUrl":{}}],["enabl",{"_index":286,"title":{"72":{"position":[[35,7]]}},"content":{"24":{"position":[[23,7]]},"38":{"position":[[33,7]]},"72":{"position":[[276,7]]},"171":{"position":[[91,7]]}},"relUrl":{"72":{"position":[[55,7]]}}}],["encod",{"_index":1338,"title":{},"content":{"200":{"position":[[167,8]]}},"relUrl":{}}],["encoding/json",{"_index":616,"title":{},"content":{"76":{"position":[[161,15]]}},"relUrl":{}}],["end",{"_index":423,"title":{},"content":{"42":{"position":[[88,6]]},"59":{"position":[[179,6]]},"101":{"position":[[47,4]]},"178":{"position":[[737,3],[751,3]]},"247":{"position":[[630,3],[808,3],[816,3]]}},"relUrl":{}}],["endless",{"_index":373,"title":{},"content":{"35":{"position":[[43,7]]}},"relUrl":{}}],["endpoint",{"_index":334,"title":{},"content":{"29":{"position":[[45,9]]},"81":{"position":[[208,10]]},"189":{"position":[[20,8]]},"195":{"position":[[18,8]]},"200":{"position":[[27,8]]},"217":{"position":[[110,9]]},"233":{"position":[[17,8]]}},"relUrl":{}}],["enjoy",{"_index":471,"title":{},"content":{"51":{"position":[[78,5]]}},"relUrl":{}}],["ensur",{"_index":499,"title":{},"content":{"53":{"position":[[84,7]]},"67":{"position":[[97,6]]}},"relUrl":{}}],["enter",{"_index":424,"title":{},"content":{"42":{"position":[[138,5]]},"59":{"position":[[232,5]]},"122":{"position":[[53,5]]},"123":{"position":[[6,5]]},"156":{"position":[[53,5]]},"157":{"position":[[41,5]]}},"relUrl":{}}],["enterpris",{"_index":508,"title":{},"content":{"54":{"position":[[23,10]]}},"relUrl":{}}],["entir",{"_index":389,"title":{"59":{"position":[[19,6]]}},"content":{"36":{"position":[[348,6]]},"42":{"position":[[174,6]]},"51":{"position":[[432,6]]},"59":{"position":[[268,6]]},"111":{"position":[[14,6]]},"189":{"position":[[261,6]]},"195":{"position":[[259,6]]},"218":{"position":[[430,6]]},"233":{"position":[[258,6]]},"235":{"position":[[965,6]]},"253":{"position":[[342,6]]}},"relUrl":{"59":{"position":[[25,6]]}}}],["env[\"hcti_api_key",{"_index":1213,"title":{},"content":{"176":{"position":[[392,20]]}},"relUrl":{}}],["env[\"hcti_user_id",{"_index":1212,"title":{},"content":{"176":{"position":[[368,19]]}},"relUrl":{}}],["eod",{"_index":1083,"title":{},"content":{"149":{"position":[[216,4],[318,4]]}},"relUrl":{}}],["err",{"_index":628,"title":{},"content":{"76":{"position":[[447,3],[476,3],[550,3],[638,3],[806,3],[831,3],[932,3],[968,3]]}},"relUrl":{}}],["err.error",{"_index":634,"title":{},"content":{"76":{"position":[[530,12],[698,12],[887,12],[1028,12]]}},"relUrl":{}}],["error",{"_index":1048,"title":{"258":{"position":[[4,5]]}},"content":{"142":{"position":[[927,7]]},"149":{"position":[[982,8]]},"192":{"position":[[147,8],[258,8]]},"236":{"position":[[127,8],[238,8]]},"250":{"position":[[275,5]]},"258":{"position":[[20,6]]}},"relUrl":{"258":{"position":[[26,5]]}}}],["eu",{"_index":300,"title":{},"content":{"24":{"position":[[333,2]]}},"relUrl":{}}],["even",{"_index":45,"title":{},"content":{"4":{"position":[[91,4]]},"21":{"position":[[189,4]]},"34":{"position":[[91,4]]},"96":{"position":[[91,4]]},"134":{"position":[[91,4]]},"150":{"position":[[60,4]]},"210":{"position":[[91,4]]}},"relUrl":{}}],["everyon",{"_index":568,"title":{},"content":{"66":{"position":[[165,8]]}},"relUrl":{}}],["exact",{"_index":762,"title":{},"content":{"95":{"position":[[224,5]]}},"relUrl":{}}],["exactli",{"_index":53,"title":{},"content":{"6":{"position":[[52,7]]},"40":{"position":[[76,7]]},"73":{"position":[[56,7]]},"130":{"position":[[62,7]]},"136":{"position":[[60,7]]},"146":{"position":[[53,7]]},"159":{"position":[[56,7]]},"165":{"position":[[8,7]]},"174":{"position":[[54,7]]},"250":{"position":[[58,7]]}},"relUrl":{}}],["exampl",{"_index":20,"title":{"2":{"position":[[0,7]]},"9":{"position":[[3,7]]},"46":{"position":[[20,7]]},"47":{"position":[[13,7]]},"48":{"position":[[14,7]]},"76":{"position":[[7,7]]},"81":{"position":[[0,7]]},"88":{"position":[[17,7]]},"92":{"position":[[0,8]]},"94":{"position":[[9,7]]},"95":{"position":[[14,7]]},"98":{"position":[[0,7]]},"103":{"position":[[12,7]]},"105":{"position":[[6,8]]},"116":{"position":[[0,7]]},"127":{"position":[[0,7]]},"132":{"position":[[0,7]]},"139":{"position":[[11,7]]},"141":{"position":[[11,7]]},"142":{"position":[[27,7]]},"143":{"position":[[23,7]]},"149":{"position":[[4,7]]},"150":{"position":[[4,7]]},"162":{"position":[[7,7]]},"176":{"position":[[5,7]]},"177":{"position":[[0,7]]},"178":{"position":[[14,7]]},"180":{"position":[[13,7]]},"187":{"position":[[0,7]]},"192":{"position":[[0,7]]},"202":{"position":[[0,7]]},"204":{"position":[[0,7]]},"208":{"position":[[0,7]]},"213":{"position":[[0,7]]},"219":{"position":[[11,8]]},"226":{"position":[[0,7]]},"236":{"position":[[0,7]]},"242":{"position":[[0,7]]},"247":{"position":[[0,7]]}},"content":{"1":{"position":[[134,7]]},"2":{"position":[[8,7]]},"3":{"position":[[69,7]]},"6":{"position":[[165,7]]},"7":{"position":[[284,7]]},"9":{"position":[[13,7]]},"56":{"position":[[175,8]]},"71":{"position":[[183,7]]},"73":{"position":[[181,7]]},"74":{"position":[[288,7]]},"76":{"position":[[17,7]]},"79":{"position":[[133,7]]},"80":{"position":[[208,8]]},"84":{"position":[[260,8],[315,7],[339,7]]},"85":{"position":[[136,7]]},"103":{"position":[[43,7]]},"104":{"position":[[99,7],[199,7]]},"105":{"position":[[95,8]]},"107":{"position":[[113,7]]},"108":{"position":[[23,7]]},"109":{"position":[[103,7]]},"110":{"position":[[99,7]]},"116":{"position":[[43,7]]},"127":{"position":[[10,8]]},"136":{"position":[[197,7],[223,7],[274,7],[307,7]]},"137":{"position":[[292,7]]},"139":{"position":[[21,7],[144,7]]},"141":{"position":[[74,7]]},"142":{"position":[[74,7]]},"146":{"position":[[169,7],[188,7]]},"147":{"position":[[285,7]]},"149":{"position":[[14,7]]},"150":{"position":[[84,7]]},"159":{"position":[[181,7]]},"160":{"position":[[288,7]]},"162":{"position":[[17,7]]},"174":{"position":[[146,7],[161,7],[199,7]]},"177":{"position":[[5,7]]},"178":{"position":[[5,7]]},"183":{"position":[[142,7],[217,7],[387,7],[446,7]]},"191":{"position":[[142,8],[339,8]]},"197":{"position":[[142,8],[339,8]]},"213":{"position":[[10,8]]},"216":{"position":[[147,8]]},"217":{"position":[[171,7]]},"218":{"position":[[856,8]]},"220":{"position":[[66,8]]},"230":{"position":[[140,7],[245,7]]},"235":{"position":[[142,8],[339,8]]},"238":{"position":[[183,7]]},"245":{"position":[[129,7]]},"253":{"position":[[460,8]]},"255":{"position":[[1144,8]]}},"relUrl":{"6":{"position":[[0,8]]},"7":{"position":[[0,8]]},"8":{"position":[[0,8]]},"9":{"position":[[0,8],[19,7]]},"10":{"position":[[0,8]]},"11":{"position":[[0,8]]},"31":{"position":[[0,8]]},"32":{"position":[[0,8]]},"33":{"position":[[0,8]]},"34":{"position":[[0,8]]},"46":{"position":[[55,7]]},"47":{"position":[[48,7]]},"48":{"position":[[49,7]]},"73":{"position":[[0,8]]},"74":{"position":[[0,8]]},"75":{"position":[[0,8]]},"76":{"position":[[0,8],[25,7]]},"77":{"position":[[0,8]]},"78":{"position":[[0,8]]},"79":{"position":[[0,8]]},"80":{"position":[[0,8]]},"81":{"position":[[0,8]]},"82":{"position":[[0,8]]},"83":{"position":[[0,8]]},"94":{"position":[[52,7]]},"95":{"position":[[57,7]]},"103":{"position":[[14,7]]},"105":{"position":[[8,8]]},"116":{"position":[[0,8]]},"136":{"position":[[0,8]]},"137":{"position":[[0,8]]},"138":{"position":[[0,8]]},"139":{"position":[[0,8],[37,7]]},"140":{"position":[[0,8]]},"141":{"position":[[0,8],[37,7]]},"142":{"position":[[0,8],[50,7]]},"143":{"position":[[0,8],[49,7]]},"144":{"position":[[0,8]]},"145":{"position":[[0,8]]},"146":{"position":[[0,8]]},"147":{"position":[[0,8]]},"148":{"position":[[0,8]]},"149":{"position":[[0,8],[23,7]]},"150":{"position":[[0,8],[23,7]]},"151":{"position":[[0,8]]},"152":{"position":[[0,8]]},"159":{"position":[[0,8]]},"160":{"position":[[0,8]]},"161":{"position":[[0,8]]},"162":{"position":[[0,8],[29,7]]},"163":{"position":[[0,8]]},"164":{"position":[[0,8]]},"174":{"position":[[0,8]]},"175":{"position":[[0,8]]},"176":{"position":[[0,8],[25,7]]},"177":{"position":[[0,8]]},"178":{"position":[[0,8],[34,7]]},"179":{"position":[[0,8]]},"180":{"position":[[0,8]]},"181":{"position":[[0,8]]},"182":{"position":[[0,8]]},"219":{"position":[[42,8]]},"245":{"position":[[0,8]]},"246":{"position":[[0,8]]},"247":{"position":[[0,8]]},"248":{"position":[[0,8]]},"249":{"position":[[0,8]]}}}],["example</h2>",{"_index":718,"title":{},"content":{"88":{"position":[[129,18]]}},"relUrl":{}}],["exceed",{"_index":1323,"title":{},"content":{"192":{"position":[[279,10]]},"236":{"position":[[259,10]]},"258":{"position":[[45,8]]}},"relUrl":{}}],["exist",{"_index":383,"title":{},"content":{"36":{"position":[[202,8]]},"55":{"position":[[6,8]]},"193":{"position":[[81,8]]}},"relUrl":{}}],["expect",{"_index":206,"title":{"53":{"position":[[34,9]]}},"content":{"16":{"position":[[194,6]]},"51":{"position":[[180,9]]},"67":{"position":[[121,8]]}},"relUrl":{"53":{"position":[[40,8]]}}}],["expert",{"_index":1413,"title":{},"content":{"222":{"position":[[103,7]]}},"relUrl":{}}],["expires_in",{"_index":1248,"title":{},"content":{"178":{"position":[[707,11]]}},"relUrl":{}}],["expos",{"_index":1024,"title":{},"content":{"140":{"position":[[108,6]]},"231":{"position":[[259,8]]}},"relUrl":{}}],["extens",{"_index":596,"title":{},"content":{"71":{"position":[[47,9],[150,9]]},"221":{"position":[[79,10]]},"238":{"position":[[47,9],[150,9]]},"239":{"position":[[38,9]]}},"relUrl":{}}],["extern",{"_index":434,"title":{"45":{"position":[[0,8]]},"46":{"position":[[0,8]]},"47":{"position":[[0,8]]},"48":{"position":[[0,8]]},"50":{"position":[[0,8]]},"56":{"position":[[10,8]]},"57":{"position":[[10,8]]},"61":{"position":[[11,8]]}},"content":{"45":{"position":[[21,8]]},"47":{"position":[[7,8]]},"51":{"position":[[309,8],[347,8],[496,8]]},"57":{"position":[[5,8]]},"61":{"position":[[45,8]]},"97":{"position":[[21,8]]},"102":{"position":[[587,8]]}},"relUrl":{"56":{"position":[[16,8]]},"57":{"position":[[16,8]]},"61":{"position":[[17,8]]}}}],["extra",{"_index":328,"title":{},"content":{"28":{"position":[[208,5]]},"212":{"position":[[200,5]]}},"relUrl":{}}],["f012",{"_index":1161,"title":{},"content":{"162":{"position":[[718,4]]}},"relUrl":{}}],["f1ffff",{"_index":1439,"title":{},"content":{"226":{"position":[[583,8]]}},"relUrl":{}}],["f7bb",{"_index":1231,"title":{},"content":{"177":{"position":[[490,4]]}},"relUrl":{}}],["face",{"_index":450,"title":{},"content":{"48":{"position":[[47,4]]}},"relUrl":{}}],["facebook",{"_index":923,"title":{},"content":{"106":{"position":[[79,9]]}},"relUrl":{}}],["fad912321d5b",{"_index":141,"title":{},"content":{"9":{"position":[[1032,14]]}},"relUrl":{}}],["fail",{"_index":296,"title":{},"content":{"24":{"position":[[258,4]]}},"relUrl":{}}],["fals",{"_index":779,"title":{},"content":{"98":{"position":[[359,5],[647,6],[681,5]]},"179":{"position":[[303,6]]}},"relUrl":{}}],["famili",{"_index":358,"title":{},"content":{"32":{"position":[[384,7]]},"48":{"position":[[61,7],[157,7]]},"76":{"position":[[410,7]]},"139":{"position":[[402,7]]},"141":{"position":[[375,7]]},"142":{"position":[[315,7]]},"149":{"position":[[298,7]]},"150":{"position":[[322,7]]},"162":{"position":[[486,7]]},"176":{"position":[[606,7]]},"177":{"position":[[311,7]]},"224":{"position":[[258,6],[283,7]]},"226":{"position":[[547,7],[776,7],[853,7]]}},"relUrl":{}}],["family:'san",{"_index":125,"title":{},"content":{"9":{"position":[[480,12]]},"247":{"position":[[368,12]]}},"relUrl":{}}],["fanci",{"_index":1428,"title":{},"content":{"226":{"position":[[332,5],[757,6]]}},"relUrl":{}}],["faq",{"_index":593,"title":{"69":{"position":[[0,3]]}},"content":{},"relUrl":{"69":{"position":[[0,5]]}}}],["faq/#can",{"_index":512,"title":{},"content":{},"relUrl":{"54":{"position":[[0,9]]},"56":{"position":[[0,9]]},"57":{"position":[[0,9]]},"58":{"position":[[0,9]]},"61":{"position":[[0,9]]},"65":{"position":[[0,9]]},"66":{"position":[[0,9]]}}}],["faq/#do",{"_index":544,"title":{},"content":{},"relUrl":{"63":{"position":[[0,8]]}}}],["faq/#frequ",{"_index":490,"title":{},"content":{},"relUrl":{"51":{"position":[[0,16]]}}}],["faq/#how",{"_index":530,"title":{},"content":{},"relUrl":{"59":{"position":[[0,9]]},"60":{"position":[[0,9]]},"62":{"position":[[0,9]]},"64":{"position":[[0,9]]}}}],["faq/#i",{"_index":492,"title":{},"content":{},"relUrl":{"52":{"position":[[0,8]]},"55":{"position":[[0,7]]},"68":{"position":[[0,7]]}}}],["faq/#what",{"_index":588,"title":{},"content":{},"relUrl":{"67":{"position":[[0,10]]}}}],["faq/#whi",{"_index":506,"title":{},"content":{},"relUrl":{"53":{"position":[[0,9]]}}}],["fast",{"_index":148,"title":{},"content":{"10":{"position":[[116,5]]},"43":{"position":[[116,5]]},"66":{"position":[[465,4]]},"77":{"position":[[116,5]]},"82":{"position":[[116,5]]},"151":{"position":[[116,5]]},"205":{"position":[[116,5]]}},"relUrl":{}}],["faster",{"_index":46,"title":{},"content":{"4":{"position":[[96,7]]},"16":{"position":[[124,7]]},"25":{"position":[[92,6]]},"34":{"position":[[96,7]]},"96":{"position":[[96,7]]},"134":{"position":[[96,7]]},"210":{"position":[[96,7]]}},"relUrl":{}}],["favorit",{"_index":913,"title":{},"content":{"104":{"position":[[5,8]]}},"relUrl":{}}],["fe19",{"_index":80,"title":{},"content":{"7":{"position":[[352,4]]},"74":{"position":[[356,4]]},"137":{"position":[[360,4]]},"147":{"position":[[353,4]]},"160":{"position":[[356,4]]},"236":{"position":[[66,4]]}},"relUrl":{}}],["featur",{"_index":166,"title":{},"content":{"13":{"position":[[213,7]]},"37":{"position":[[5,7]]}},"relUrl":{}}],["februari",{"_index":321,"title":{},"content":{"28":{"position":[[0,8]]}},"relUrl":{}}],["feedback",{"_index":310,"title":{},"content":{"25":{"position":[[176,9]]}},"relUrl":{}}],["fetch",{"_index":1001,"title":{"143":{"position":[[36,5]]}},"content":{"136":{"position":[[320,5]]},"143":{"position":[[12,5]]}},"relUrl":{"143":{"position":[[62,5]]}}}],["fetch('https://hcti.io/v1/imag",{"_index":1065,"title":{},"content":{"143":{"position":[[516,33]]}},"relUrl":{}}],["fetch_url(html",{"_index":1254,"title":{},"content":{"179":{"position":[[322,15]]}},"relUrl":{}}],["few",{"_index":918,"title":{},"content":{"105":{"position":[[91,3]]},"241":{"position":[[296,3]]}},"relUrl":{}}],["ffffff",{"_index":1443,"title":{},"content":{"226":{"position":[[705,7]]}},"relUrl":{}}],["file",{"_index":435,"title":{"70":{"position":[[0,4]]},"71":{"position":[[0,4]]},"238":{"position":[[0,4]]}},"content":{"45":{"position":[[96,5],[113,4]]},"46":{"position":[[129,5]]},"47":{"position":[[20,5],[104,5]]},"56":{"position":[[83,5],[110,5]]},"66":{"position":[[212,4]]},"71":{"position":[[42,4],[126,4]]},"209":{"position":[[42,4]]},"230":{"position":[[185,4]]},"238":{"position":[[42,4],[126,4]]}},"relUrl":{}}],["filenam",{"_index":488,"title":{"66":{"position":[[20,9]]}},"content":{"51":{"position":[[693,9]]},"66":{"position":[[4,8],[119,9]]}},"relUrl":{"66":{"position":[[26,8]]}}}],["find",{"_index":469,"title":{},"content":{"51":{"position":[[4,7]]},"63":{"position":[[62,4]]}},"relUrl":{}}],["first",{"_index":244,"title":{},"content":{"19":{"position":[[38,5]]},"114":{"position":[[24,5]]},"122":{"position":[[0,6]]}},"relUrl":{}}],["fit",{"_index":514,"title":{},"content":{"55":{"position":[[37,3]]}},"relUrl":{}}],["fix",{"_index":174,"title":{},"content":{"14":{"position":[[86,5]]},"228":{"position":[[152,3]]},"259":{"position":[[231,3]]}},"relUrl":{}}],["flash",{"_index":1456,"title":{"228":{"position":[[9,5]]}},"content":{},"relUrl":{"228":{"position":[[37,5]]}}}],["fli",{"_index":682,"title":{"91":{"position":[[14,3]]},"113":{"position":[[14,3]]}},"content":{"84":{"position":[[234,3]]},"91":{"position":[[61,3]]}},"relUrl":{"91":{"position":[[57,3]]},"113":{"position":[[16,3]]}}}],["floof",{"_index":883,"title":{},"content":{"102":{"position":[[236,5]]}},"relUrl":{}}],["fmt",{"_index":617,"title":{},"content":{"76":{"position":[[177,5]]}},"relUrl":{}}],["fmt.println(string(bodi",{"_index":650,"title":{},"content":{"76":{"position":[[1043,25]]}},"relUrl":{}}],["focu",{"_index":939,"title":{},"content":{"112":{"position":[[26,5]]}},"relUrl":{}}],["follow",{"_index":445,"title":{},"content":{"47":{"position":[[55,10]]},"48":{"position":[[350,9]]},"85":{"position":[[126,9]]},"94":{"position":[[72,10]]},"141":{"position":[[58,10]]},"189":{"position":[[41,9]]},"195":{"position":[[39,9]]},"200":{"position":[[48,9]]},"207":{"position":[[62,9]]},"218":{"position":[[63,9]]},"233":{"position":[[38,9]]}},"relUrl":{}}],["font",{"_index":124,"title":{"14":{"position":[[0,4]]},"15":{"position":[[0,4]]},"45":{"position":[[31,5]]},"48":{"position":[[9,4]]},"50":{"position":[[27,5]]},"58":{"position":[[17,4]]},"223":{"position":[[13,5]]},"225":{"position":[[2,5]]},"227":{"position":[[16,5]]}},"content":{"9":{"position":[[475,4]]},"15":{"position":[[60,5]]},"32":{"position":[[379,4]]},"45":{"position":[[128,5]]},"48":{"position":[[25,4],[41,5],[56,4],[152,4],[187,4],[294,4]]},"51":{"position":[[387,4]]},"58":{"position":[[41,4]]},"76":{"position":[[405,4]]},"101":{"position":[[236,6]]},"102":{"position":[[615,6]]},"139":{"position":[[397,4]]},"141":{"position":[[370,4]]},"142":{"position":[[310,4]]},"149":{"position":[[293,4]]},"150":{"position":[[317,4]]},"162":{"position":[[481,4]]},"176":{"position":[[601,4]]},"177":{"position":[[306,4]]},"178":{"position":[[95,6]]},"191":{"position":[[122,5],[168,5]]},"197":{"position":[[122,5],[168,5]]},"223":{"position":[[28,5]]},"224":{"position":[[28,6],[69,5],[173,5],[204,4],[253,4],[278,4],[335,4],[387,5]]},"225":{"position":[[25,5],[83,5]]},"226":{"position":[[46,6],[338,4],[373,4],[542,4],[764,4],[771,4],[848,4]]},"227":{"position":[[44,5],[84,4]]},"228":{"position":[[48,4],[122,4]]},"235":{"position":[[122,5],[168,5]]},"247":{"position":[[363,4]]},"253":{"position":[[440,5],[486,5]]}},"relUrl":{"45":{"position":[[60,5]]},"48":{"position":[[44,4]]},"50":{"position":[[28,6]]},"58":{"position":[[23,4]]},"223":{"position":[[21,6]]},"225":{"position":[[21,6]]},"227":{"position":[[44,5]]}}}],["font/fontnameregular.ttc",{"_index":453,"title":{},"content":{"48":{"position":[[114,26]]}},"relUrl":{}}],["fonts/#exampl",{"_index":1454,"title":{},"content":{},"relUrl":{"226":{"position":[[21,14]]}}}],["fonts/#extern",{"_index":439,"title":{},"content":{},"relUrl":{"45":{"position":[[28,15]]},"46":{"position":[[28,15]]},"47":{"position":[[28,15]]},"48":{"position":[[28,15]]}}}],["fonts/#handl",{"_index":1462,"title":{},"content":{},"relUrl":{"228":{"position":[[21,15]]}}}],["fonts/#how",{"_index":1419,"title":{},"content":{},"relUrl":{"224":{"position":[[21,10]]}}}],["fonts/#ne",{"_index":466,"title":{},"content":{},"relUrl":{"49":{"position":[[28,11]]},"229":{"position":[[21,11]]}}}],["fonts/#us",{"_index":1455,"title":{},"content":{},"relUrl":{"227":{"position":[[21,12]]}}}],["forev",{"_index":531,"title":{},"content":{"60":{"position":[[0,8]]}},"relUrl":{}}],["form",{"_index":1013,"title":{},"content":{"139":{"position":[[639,5]]},"141":{"position":[[633,5]]},"149":{"position":[[862,4]]},"157":{"position":[[23,5]]}},"relUrl":{}}],["form_param",{"_index":1121,"title":{},"content":{"150":{"position":[[563,13]]}},"relUrl":{}}],["format",{"_index":594,"title":{"70":{"position":[[5,7]]},"71":{"position":[[5,7]]},"72":{"position":[[19,6]]},"238":{"position":[[5,7]]}},"content":{"71":{"position":[[131,7],[174,6]]},"72":{"position":[[58,7]]},"179":{"position":[[279,8]]},"209":{"position":[[47,7]]},"230":{"position":[[190,7]]},"238":{"position":[[131,7],[174,6]]}},"relUrl":{"70":{"position":[[13,8]]},"71":{"position":[[13,8]]},"72":{"position":[[41,6]]},"238":{"position":[[37,7]]}}}],["formats/#automat",{"_index":610,"title":{},"content":{},"relUrl":{"72":{"position":[[13,18]]}}}],["formdata",{"_index":666,"title":{},"content":{"81":{"position":[[223,8],[317,8]]},"189":{"position":[[90,9]]},"195":{"position":[[88,9]]},"200":{"position":[[97,9],[120,9]]},"233":{"position":[[87,9]]}},"relUrl":{}}],["formula:(dpi",{"_index":751,"title":{},"content":{"93":{"position":[[127,12]]}},"relUrl":{}}],["found",{"_index":1257,"title":{},"content":{"179":{"position":[[394,6]]}},"relUrl":{}}],["four",{"_index":983,"title":{},"content":{"131":{"position":[[36,4]]}},"relUrl":{}}],["fout",{"_index":1458,"title":{"228":{"position":[[32,6]]}},"content":{},"relUrl":{"228":{"position":[[60,4]]}}}],["framework",{"_index":916,"title":{},"content":{"104":{"position":[[75,10]]}},"relUrl":{}}],["freddi",{"_index":1278,"title":{},"content":{"187":{"position":[[453,9],[475,10]]}},"relUrl":{}}],["free",{"_index":97,"title":{},"content":{"8":{"position":[[240,4],[269,4]]},"65":{"position":[[109,4]]},"75":{"position":[[244,4],[273,4]]},"114":{"position":[[88,4]]},"133":{"position":[[120,4]]},"138":{"position":[[248,4],[277,4]]},"148":{"position":[[241,4],[270,4]]},"161":{"position":[[244,4],[273,4]]},"193":{"position":[[0,4]]},"252":{"position":[[120,4]]}},"relUrl":{}}],["frequent",{"_index":467,"title":{"51":{"position":[[0,10]]}},"content":{},"relUrl":{}}],["full",{"_index":413,"title":{"42":{"position":[[8,4]]},"111":{"position":[[0,4]]}},"content":{"40":{"position":[[19,4]]},"41":{"position":[[158,4]]},"42":{"position":[[12,4],[57,4],[144,4],[236,4],[266,4]]},"45":{"position":[[205,4]]},"59":{"position":[[148,4],[238,4]]},"61":{"position":[[28,4]]},"67":{"position":[[78,4]]},"85":{"position":[[251,4]]},"89":{"position":[[271,4],[538,4]]},"111":{"position":[[54,4]]},"167":{"position":[[205,4]]},"219":{"position":[[2,4]]}},"relUrl":{"42":{"position":[[39,4]]},"111":{"position":[[0,6]]}}}],["full_screen",{"_index":1399,"title":{},"content":{"218":{"position":[[360,11]]},"235":{"position":[[885,11]]}},"relUrl":{}}],["fulli",{"_index":1468,"title":{},"content":{"233":{"position":[[345,5]]},"255":{"position":[[184,5]]}},"relUrl":{}}],["func",{"_index":624,"title":{},"content":{"76":{"position":[[279,4]]}},"relUrl":{}}],["function",{"_index":277,"title":{},"content":{"22":{"position":[[254,8]]},"80":{"position":[[108,9]]},"165":{"position":[[312,8]]},"166":{"position":[[96,8]]}},"relUrl":{}}],["function(data",{"_index":1016,"title":{},"content":{"139":{"position":[[687,14]]}},"relUrl":{}}],["further",{"_index":202,"title":{},"content":{"16":{"position":[[43,7]]},"150":{"position":[[65,8]]},"218":{"position":[[24,8]]}},"relUrl":{}}],["futur",{"_index":301,"title":{},"content":{"24":{"position":[[350,7]]},"190":{"position":[[166,7]]},"196":{"position":[[166,7]]}},"relUrl":{}}],["fyi",{"_index":397,"title":{"37":{"position":[[2,3]]}},"content":{},"relUrl":{}}],["ga",{"_index":662,"title":{},"content":{"80":{"position":[[233,4]]}},"relUrl":{}}],["gadget",{"_index":1410,"title":{},"content":{"221":{"position":[[140,7]]}},"relUrl":{}}],["gem",{"_index":1209,"title":{},"content":{"176":{"position":[[111,3],[942,4]]},"177":{"position":[[31,4],[49,3]]}},"relUrl":{}}],["gemfil",{"_index":1208,"title":{},"content":{"176":{"position":[[100,8]]},"177":{"position":[[89,8]]}},"relUrl":{}}],["gen",{"_index":605,"title":{"72":{"position":[[15,3]]}},"content":{"72":{"position":[[54,3]]}},"relUrl":{"72":{"position":[[37,3]]}}}],["gener",{"_index":4,"title":{"7":{"position":[[0,10]]},"32":{"position":[[0,8]]},"41":{"position":[[0,10]]},"55":{"position":[[10,8]]},"74":{"position":[[0,10]]},"80":{"position":[[0,8]]},"110":{"position":[[5,9]]},"137":{"position":[[0,10]]},"147":{"position":[[0,10]]},"160":{"position":[[0,10]]},"175":{"position":[[0,10]]},"246":{"position":[[0,8]]}},"content":{"0":{"position":[[13,8]]},"6":{"position":[[0,8],[109,10]]},"7":{"position":[[204,9]]},"9":{"position":[[268,9]]},"17":{"position":[[270,11]]},"21":{"position":[[208,11]]},"22":{"position":[[191,8]]},"28":{"position":[[128,10]]},"31":{"position":[[0,8],[94,8]]},"32":{"position":[[37,8]]},"38":{"position":[[97,9]]},"40":{"position":[[0,8]]},"45":{"position":[[42,10]]},"51":{"position":[[228,8]]},"55":{"position":[[138,9],[245,9]]},"60":{"position":[[72,9]]},"66":{"position":[[42,9],[197,10]]},"73":{"position":[[0,8],[113,10]]},"74":{"position":[[208,9]]},"79":{"position":[[0,8],[89,8]]},"80":{"position":[[286,8]]},"85":{"position":[[149,8]]},"91":{"position":[[12,9]]},"93":{"position":[[7,9]]},"97":{"position":[[42,10],[69,8]]},"101":{"position":[[36,10],[97,10]]},"105":{"position":[[161,11]]},"107":{"position":[[53,8]]},"109":{"position":[[0,8]]},"110":{"position":[[0,8]]},"111":{"position":[[43,8]]},"113":{"position":[[17,10]]},"116":{"position":[[60,10]]},"120":{"position":[[28,8]]},"125":{"position":[[28,8]]},"126":{"position":[[3,8],[100,8]]},"130":{"position":[[0,8]]},"132":{"position":[[156,8],[215,8]]},"136":{"position":[[0,8],[117,10]]},"137":{"position":[[212,9]]},"146":{"position":[[0,8],[110,10]]},"147":{"position":[[205,9]]},"149":{"position":[[182,9]]},"153":{"position":[[28,8]]},"158":{"position":[[47,9]]},"159":{"position":[[0,8],[113,10]]},"160":{"position":[[208,9]]},"165":{"position":[[122,9],[202,8],[349,9]]},"166":{"position":[[11,9],[243,8],[456,10]]},"168":{"position":[[88,9],[372,10]]},"174":{"position":[[0,8],[111,10]]},"175":{"position":[[188,9]]},"178":{"position":[[116,8]]},"180":{"position":[[73,10]]},"183":{"position":[[41,10]]},"186":{"position":[[61,8]]},"187":{"position":[[15,9]]},"188":{"position":[[3,8]]},"191":{"position":[[468,10]]},"197":{"position":[[468,10],[794,10],[847,8]]},"198":{"position":[[3,8]]},"207":{"position":[[89,10]]},"211":{"position":[[33,8]]},"212":{"position":[[3,8]]},"217":{"position":[[130,8]]},"218":{"position":[[405,8]]},"222":{"position":[[114,10]]},"228":{"position":[[349,9]]},"230":{"position":[[0,8]]},"232":{"position":[[3,8]]},"233":{"position":[[477,8]]},"235":{"position":[[468,10],[794,10],[847,8],[940,8]]},"239":{"position":[[77,10]]},"245":{"position":[[0,8],[97,8]]},"246":{"position":[[182,9]]},"247":{"position":[[145,9]]},"250":{"position":[[0,8]]},"253":{"position":[[616,10]]},"255":{"position":[[38,8],[316,8],[535,10]]}},"relUrl":{"55":{"position":[[16,8]]},"110":{"position":[[7,9]]}}}],["geograph",{"_index":403,"title":{},"content":{"37":{"position":[[146,14]]}},"relUrl":{}}],["get",{"_index":689,"title":{"117":{"position":[[0,7]]},"222":{"position":[[10,7]]},"237":{"position":[[0,7]]}},"content":{"104":{"position":[[160,7]]},"165":{"position":[[32,4]]},"216":{"position":[[226,7]]},"222":{"position":[[34,7]]},"226":{"position":[[217,7]]},"230":{"position":[[164,7]]}},"relUrl":{"84":{"position":[[0,8]]},"85":{"position":[[0,8]]},"86":{"position":[[0,8]]},"87":{"position":[[0,8]]},"88":{"position":[[0,8]]},"89":{"position":[[0,8]]},"90":{"position":[[0,8]]},"91":{"position":[[0,8]]},"92":{"position":[[0,8]]},"93":{"position":[[0,8]]},"94":{"position":[[0,8]]},"95":{"position":[[0,8]]},"96":{"position":[[0,8]]},"117":{"position":[[0,8]]},"183":{"position":[[0,8]]},"184":{"position":[[0,8]]},"185":{"position":[[0,8]]},"186":{"position":[[0,8]]},"187":{"position":[[0,8]]},"188":{"position":[[0,8]]},"189":{"position":[[0,8]]},"190":{"position":[[0,8]]},"191":{"position":[[0,8]]},"192":{"position":[[0,8]]},"193":{"position":[[0,8]]},"194":{"position":[[0,8]]},"195":{"position":[[0,8]]},"196":{"position":[[0,8]]},"197":{"position":[[0,8]]},"198":{"position":[[0,8]]},"199":{"position":[[0,8]]},"200":{"position":[[0,8]]},"201":{"position":[[0,8]]},"202":{"position":[[0,8]]},"203":{"position":[[0,8]]},"204":{"position":[[0,8]]},"205":{"position":[[0,8]]},"216":{"position":[[0,8]]},"217":{"position":[[0,8]]},"218":{"position":[[0,8]]},"219":{"position":[[0,8]]},"220":{"position":[[0,8]]},"221":{"position":[[0,8]]},"222":{"position":[[0,8],[41,7]]},"230":{"position":[[0,8]]},"231":{"position":[[0,8]]},"232":{"position":[[0,8]]},"233":{"position":[[0,8]]},"234":{"position":[[0,8]]},"235":{"position":[[0,8]]},"236":{"position":[[0,8]]},"237":{"position":[[0,8]]},"238":{"position":[[0,8]]},"239":{"position":[[0,8]]},"240":{"position":[[0,8]]},"241":{"position":[[0,8]]},"242":{"position":[[0,8]]},"243":{"position":[[0,8]]},"244":{"position":[[0,8]]}}}],["github",{"_index":1261,"title":{},"content":{"180":{"position":[[106,7]]}},"relUrl":{}}],["give",{"_index":269,"title":{},"content":{"22":{"position":[[86,5]]},"212":{"position":[[184,5]]}},"relUrl":{}}],["gladli",{"_index":411,"title":{},"content":{"39":{"position":[[89,6]]},"49":{"position":[[89,6]]},"100":{"position":[[89,6]]},"128":{"position":[[89,6]]},"144":{"position":[[89,6]]},"163":{"position":[[89,6]]},"169":{"position":[[89,6]]},"181":{"position":[[89,6]]},"214":{"position":[[89,6]]},"229":{"position":[[89,6]]},"243":{"position":[[89,6]]},"248":{"position":[[89,6]]},"260":{"position":[[89,6]]}},"relUrl":{}}],["global",{"_index":549,"title":{},"content":{"64":{"position":[[67,6]]},"237":{"position":[[279,6],[488,6]]}},"relUrl":{}}],["go",{"_index":1139,"title":{},"content":{"156":{"position":[[0,2]]},"157":{"position":[[0,2]]},"222":{"position":[[154,5]]}},"relUrl":{}}],["goal",{"_index":191,"title":{},"content":{"15":{"position":[[217,4]]},"107":{"position":[[85,6]]}},"relUrl":{}}],["golang",{"_index":611,"title":{"73":{"position":[[0,7]]},"74":{"position":[[23,6]]},"75":{"position":[[20,6]]},"76":{"position":[[0,6]]},"78":{"position":[[0,6]]}},"content":{"73":{"position":[[40,7],[136,6],[165,6],[174,6]]},"74":{"position":[[126,6]]},"75":{"position":[[157,6],[290,6]]},"76":{"position":[[5,6],[123,7]]},"103":{"position":[[94,6]]}},"relUrl":{"74":{"position":[[41,6]]},"75":{"position":[[38,6]]}}}],["googl",{"_index":54,"title":{"67":{"position":[[16,6]]},"79":{"position":[[0,6]]},"80":{"position":[[23,6]]},"83":{"position":[[0,6]]},"223":{"position":[[6,6]]}},"content":{"6":{"position":[[65,6]]},"7":{"position":[[70,6]]},"40":{"position":[[89,6]]},"41":{"position":[[66,6]]},"42":{"position":[[202,6]]},"51":{"position":[[721,6]]},"59":{"position":[[296,6]]},"72":{"position":[[18,6]]},"73":{"position":[[69,6]]},"74":{"position":[[70,6]]},"79":{"position":[[40,6],[112,6]]},"80":{"position":[[5,6],[51,7]]},"89":{"position":[[53,6]]},"105":{"position":[[65,6]]},"130":{"position":[[75,6]]},"132":{"position":[[194,6]]},"136":{"position":[[73,6]]},"137":{"position":[[70,6]]},"146":{"position":[[66,6]]},"147":{"position":[[70,6]]},"159":{"position":[[69,6]]},"160":{"position":[[70,6]]},"174":{"position":[[67,6]]},"175":{"position":[[66,6]]},"178":{"position":[[88,6]]},"191":{"position":[[115,6]]},"197":{"position":[[115,6]]},"223":{"position":[[21,6]]},"224":{"position":[[21,6]]},"226":{"position":[[39,6]]},"235":{"position":[[115,6]]},"246":{"position":[[58,6]]},"250":{"position":[[71,6]]},"253":{"position":[[433,6]]}},"relUrl":{"67":{"position":[[22,6]]},"80":{"position":[[57,6]]},"223":{"position":[[14,6]]},"224":{"position":[[14,6]]},"225":{"position":[[14,6]]},"226":{"position":[[14,6]]},"227":{"position":[[14,6]]},"228":{"position":[[14,6]]},"229":{"position":[[14,6]]}}}],["google_font",{"_index":1011,"title":{},"content":{"139":{"position":[[424,13]]},"141":{"position":[[397,13]]},"142":{"position":[[337,13]]},"149":{"position":[[323,13]]},"162":{"position":[[505,15]]},"176":{"position":[[626,13]]},"178":{"position":[[384,13],[621,13],[635,13]]},"179":{"position":[[344,13]]},"191":{"position":[[91,12]]},"197":{"position":[[91,12]]},"202":{"position":[[133,15]]},"204":{"position":[[133,15]]},"224":{"position":[[105,12]]},"235":{"position":[[91,12]]},"253":{"position":[[409,12]]}},"relUrl":{}}],["google_fonts'=>$google_font",{"_index":1086,"title":{},"content":{"149":{"position":[[397,34]]}},"relUrl":{}}],["google_fonts=montserrat|roboto",{"_index":1420,"title":{},"content":{"226":{"position":[[69,31]]}},"relUrl":{}}],["google_fonts=open",{"_index":1417,"title":{},"content":{"224":{"position":[[431,17]]}},"relUrl":{}}],["google_fonts=roboto",{"_index":1415,"title":{},"content":{"224":{"position":[[215,20]]}},"relUrl":{}}],["gradient",{"_index":1431,"title":{},"content":{"226":{"position":[[380,8],[658,10]]}},"relUrl":{}}],["gradient\">",{"_index":1429,"title":{},"content":{"226":{"position":[[343,13]]}},"relUrl":{}}],["gradient(135deg",{"_index":1442,"title":{},"content":{"226":{"position":[[688,16]]}},"relUrl":{}}],["graduat",{"_index":215,"title":{},"content":{"17":{"position":[[63,9]]}},"relUrl":{}}],["great",{"_index":415,"title":{},"content":{"41":{"position":[[127,5]]},"53":{"position":[[109,5]]},"68":{"position":[[72,5]]},"150":{"position":[[817,5]]}},"relUrl":{}}],["greater",{"_index":1296,"title":{},"content":{"191":{"position":[[24,7]]},"197":{"position":[[24,7]]},"235":{"position":[[24,7]]}},"relUrl":{}}],["green",{"_index":1062,"title":{},"content":{"143":{"position":[[274,6]]}},"relUrl":{}}],["growth",{"_index":783,"title":{},"content":{"98":{"position":[[401,6]]}},"relUrl":{}}],["gt",{"_index":21,"title":{},"content":{"1":{"position":[[144,4]]},"47":{"position":[[206,5]]},"61":{"position":[[157,5]]},"102":{"position":[[624,4]]},"127":{"position":[[259,4],[318,4]]},"142":{"position":[[771,5],[843,5],[935,5]]},"143":{"position":[[569,5],[670,5],[745,5]]},"149":{"position":[[1147,5]]},"150":{"position":[[533,5],[577,5],[591,5],[610,5],[726,5]]},"176":{"position":[[656,5],[820,5]]},"177":{"position":[[438,5]]}},"relUrl":{}}],["gt;getbodi",{"_index":1122,"title":{},"content":{"150":{"position":[[636,14]]}},"relUrl":{}}],["gt;request('post",{"_index":1119,"title":{},"content":{"150":{"position":[[476,19]]}},"relUrl":{}}],["guess",{"_index":573,"title":{},"content":{"66":{"position":[[263,7]]}},"relUrl":{}}],["guid",{"_index":942,"title":{"118":{"position":[[0,6]]},"119":{"position":[[0,6]]}},"content":{"118":{"position":[[10,6]]}},"relUrl":{"119":{"position":[[0,8]]}}}],["guides/#guid",{"_index":943,"title":{},"content":{},"relUrl":{"118":{"position":[[0,15]]}}}],["guides/convert",{"_index":10,"title":{},"content":{},"relUrl":{"0":{"position":[[0,18]]},"1":{"position":[[0,18]]},"2":{"position":[[0,18]]},"3":{"position":[[0,18]]},"4":{"position":[[0,18]]},"5":{"position":[[0,18]]},"40":{"position":[[0,15]]},"41":{"position":[[0,15]]},"42":{"position":[[0,15]]},"43":{"position":[[0,15]]},"44":{"position":[[0,15]]}}}],["guides/dupl",{"_index":376,"title":{},"content":{},"relUrl":{"35":{"position":[[0,17]]},"36":{"position":[[0,17]]},"37":{"position":[[0,17]]},"38":{"position":[[0,17]]},"39":{"position":[[0,17]]}}}],["guides/extern",{"_index":438,"title":{},"content":{},"relUrl":{"45":{"position":[[0,16]]},"46":{"position":[[0,16]]},"47":{"position":[[0,16]]},"48":{"position":[[0,16]]},"49":{"position":[[0,16]]},"50":{"position":[[0,16]]}}}],["guides/fil",{"_index":595,"title":{},"content":{},"relUrl":{"70":{"position":[[0,12]]},"71":{"position":[[0,12]]},"72":{"position":[[0,12]]}}}],["guides/imag",{"_index":769,"title":{},"content":{},"relUrl":{"97":{"position":[[0,13]]},"98":{"position":[[0,13]]},"99":{"position":[[0,13]]},"100":{"position":[[0,13]]}}}],["guides/insomnia",{"_index":957,"title":{},"content":{},"relUrl":{"124":{"position":[[0,17]]}}}],["guides/insomnia/#author",{"_index":952,"title":{},"content":{},"relUrl":{"122":{"position":[[0,31]]}}}],["guides/insomnia/#insomnia",{"_index":945,"title":{},"content":{},"relUrl":{"120":{"position":[[0,26]]},"121":{"position":[[0,26]]}}}],["guides/insomnia/#pass",{"_index":955,"title":{},"content":{},"relUrl":{"123":{"position":[[0,25]]}}}],["guides/instagram",{"_index":959,"title":{},"content":{},"relUrl":{"125":{"position":[[0,17]]},"126":{"position":[[0,17]]},"127":{"position":[[0,17]]},"128":{"position":[[0,17]]},"129":{"position":[[0,17]]}}}],["guides/postman",{"_index":1137,"title":{},"content":{},"relUrl":{"154":{"position":[[0,16]]}}}],["guides/postman/#author",{"_index":1142,"title":{},"content":{},"relUrl":{"156":{"position":[[0,30]]}}}],["guides/postman/#don",{"_index":1144,"title":{},"content":{},"relUrl":{"158":{"position":[[0,21]]}}}],["guides/postman/#postman",{"_index":1135,"title":{},"content":{},"relUrl":{"153":{"position":[[0,24]]}}}],["guides/postman/#set",{"_index":1143,"title":{},"content":{},"relUrl":{"157":{"position":[[0,20]]}}}],["guides/postman/#url",{"_index":1138,"title":{},"content":{},"relUrl":{"155":{"position":[[0,20]]}}}],["guides/rend",{"_index":1168,"title":{},"content":{},"relUrl":{"165":{"position":[[0,14]]},"166":{"position":[[0,14]]},"167":{"position":[[0,14]]},"168":{"position":[[0,14]]},"169":{"position":[[0,14]]},"170":{"position":[[0,17]]},"171":{"position":[[0,17]]},"172":{"position":[[0,17]]},"173":{"position":[[0,17]]}}}],["guides/transpar",{"_index":1372,"title":{},"content":{},"relUrl":{"206":{"position":[[0,19]]},"207":{"position":[[0,19]]},"208":{"position":[[0,19]]},"209":{"position":[[0,19]]},"210":{"position":[[0,19]]}}}],["guides/twitt",{"_index":1377,"title":{},"content":{},"relUrl":{"211":{"position":[[0,15]]},"212":{"position":[[0,15]]},"213":{"position":[[0,15]]},"214":{"position":[[0,15]]},"215":{"position":[[0,15]]}}}],["guides/us",{"_index":1414,"title":{},"content":{},"relUrl":{"223":{"position":[[0,13]]},"224":{"position":[[0,13]]},"225":{"position":[[0,13]]},"226":{"position":[[0,13]]},"227":{"position":[[0,13]]},"228":{"position":[[0,13]]},"229":{"position":[[0,13]]}}}],["guzzl",{"_index":1076,"title":{"150":{"position":[[17,6]]}},"content":{"146":{"position":[[201,6]]},"150":{"position":[[30,6],[137,7],[175,6],[807,7]]}},"relUrl":{"150":{"position":[[36,6]]}}}],["guzzlehttpcli",{"_index":1118,"title":{},"content":{"150":{"position":[[362,19]]}},"relUrl":{}}],["h1",{"_index":1449,"title":{},"content":{"226":{"position":[[800,2]]}},"relUrl":{}}],["h1>",{"_index":1424,"title":{},"content":{"226":{"position":[[195,7]]}},"relUrl":{}}],["hackathon",{"_index":487,"title":{"65":{"position":[[24,10]]}},"content":{"51":{"position":[[660,10]]}},"relUrl":{"65":{"position":[[30,9]]}}}],["hamburg",{"_index":964,"title":{},"content":{"126":{"position":[[198,9]]}},"relUrl":{}}],["handl",{"_index":1184,"title":{"228":{"position":[[0,8]]}},"content":{"170":{"position":[[32,7]]}},"relUrl":{}}],["handlebar",{"_index":1264,"title":{"185":{"position":[[0,10]]}},"content":{"183":{"position":[[101,10]]},"185":{"position":[[18,10]]}},"relUrl":{}}],["happen",{"_index":377,"title":{"36":{"position":[[5,7]]}},"content":{"36":{"position":[[124,8]]},"37":{"position":[[104,7]]},"259":{"position":[[172,6]]}},"relUrl":{"36":{"position":[[40,7]]}}}],["happi",{"_index":561,"title":{},"content":{"65":{"position":[[96,5]]},"222":{"position":[[8,5]]}},"relUrl":{}}],["hard",{"_index":572,"title":{},"content":{"66":{"position":[[254,5]]}},"relUrl":{}}],["have",{"_index":739,"title":{},"content":{"91":{"position":[[177,6]]}},"relUrl":{}}],["hcti",{"_index":489,"title":{"67":{"position":[[35,4]]}},"content":{"51":{"position":[[740,4]]},"59":{"position":[[218,4]]},"60":{"position":[[25,4]]},"67":{"position":[[18,4]]},"98":{"position":[[4,4]]},"102":{"position":[[51,4]]}},"relUrl":{"67":{"position":[[41,4]]}}}],["hcti.io",{"_index":546,"title":{},"content":{"64":{"position":[[25,7]]},"142":{"position":[[542,10]]}},"relUrl":{}}],["hcti.io/v1/imag",{"_index":1393,"title":{},"content":{"217":{"position":[[93,16]]}},"relUrl":{}}],["hcti.io/v1/image/:template_id/:template_vers",{"_index":1336,"title":{},"content":{"199":{"position":[[230,47]]}},"relUrl":{}}],["hcti_api_endpoint",{"_index":1149,"title":{},"content":{"162":{"position":[[171,17],[560,18]]}},"relUrl":{}}],["hcti_api_key",{"_index":1151,"title":{},"content":{"162":{"position":[[311,12],[616,14]]}},"relUrl":{}}],["hcti_api_user_id",{"_index":1150,"title":{},"content":{"162":{"position":[[277,16]]}},"relUrl":{}}],["hctireadynow",{"_index":1167,"title":{},"content":{"165":{"position":[[275,13]]},"166":{"position":[[174,12]]},"167":{"position":[[114,13]]}},"relUrl":{}}],["header",{"_index":457,"title":{},"content":{"48":{"position":[[214,7],[360,6]]},"142":{"position":[[599,8]]},"143":{"position":[[405,8]]},"149":{"position":[[796,8],[816,10],[917,10]]}},"relUrl":{}}],["hear",{"_index":590,"title":{},"content":{"68":{"position":[[51,4]]}},"relUrl":{}}],["height",{"_index":674,"title":{"84":{"position":[[8,6]]},"85":{"position":[[8,6]]},"88":{"position":[[0,6]]},"93":{"position":[[0,6]]}},"content":{"84":{"position":[[21,6],[80,6],[275,6]]},"86":{"position":[[180,7]]},"91":{"position":[[74,6]]},"94":{"position":[[127,7]]},"95":{"position":[[86,7],[155,6],[279,6]]},"113":{"position":[[95,6]]},"172":{"position":[[315,7]]},"191":{"position":[[829,6],[928,6],[1000,6]]},"197":{"position":[[991,6],[1090,6],[1162,6]]},"218":{"position":[[219,6],[437,6]]},"226":{"position":[[592,7]]},"235":{"position":[[972,6],[1104,6],[1203,6],[1275,6]]},"240":{"position":[[97,6],[120,6]]},"255":{"position":[[793,6],[892,6],[964,6]]}},"relUrl":{"84":{"position":[[25,6]]},"85":{"position":[[25,6],[51,6]]},"86":{"position":[[25,6]]},"87":{"position":[[25,6]]},"88":{"position":[[25,6]]},"89":{"position":[[25,6]]},"90":{"position":[[25,6]]},"91":{"position":[[25,6]]},"92":{"position":[[25,6]]},"93":{"position":[[25,6]]},"94":{"position":[[25,6]]},"95":{"position":[[25,6]]},"96":{"position":[[25,6]]}}}],["height/width",{"_index":693,"title":{},"content":{"85":{"position":[[76,12]]},"89":{"position":[[609,12]]}},"relUrl":{}}],["height=300",{"_index":745,"title":{},"content":{"92":{"position":[[13,11]]},"113":{"position":[[216,11]]}},"relUrl":{}}],["hello",{"_index":703,"title":{"86":{"position":[[0,6]]}},"content":{},"relUrl":{}}],["help",{"_index":36,"title":{"4":{"position":[[5,5]]},"10":{"position":[[5,5]]},"34":{"position":[[5,5]]},"39":{"position":[[5,5]]},"43":{"position":[[5,5]]},"49":{"position":[[5,5]]},"77":{"position":[[5,5]]},"82":{"position":[[5,5]]},"96":{"position":[[5,5]]},"100":{"position":[[5,5]]},"128":{"position":[[5,5]]},"134":{"position":[[5,5]]},"144":{"position":[[5,5]]},"151":{"position":[[5,5]]},"163":{"position":[[5,5]]},"169":{"position":[[5,5]]},"181":{"position":[[5,5]]},"205":{"position":[[5,5]]},"210":{"position":[[5,5]]},"214":{"position":[[5,5]]},"222":{"position":[[5,4]]},"229":{"position":[[5,5]]},"243":{"position":[[5,5]]},"248":{"position":[[5,5]]},"260":{"position":[[5,5]]}},"content":{"6":{"position":[[185,5]]},"31":{"position":[[140,5]]},"39":{"position":[[96,4]]},"49":{"position":[[96,4]]},"51":{"position":[[84,7]]},"66":{"position":[[346,5],[426,5]]},"73":{"position":[[201,5]]},"79":{"position":[[153,5]]},"84":{"position":[[358,5]]},"100":{"position":[[96,4]]},"104":{"position":[[155,4]]},"128":{"position":[[96,4]]},"136":{"position":[[337,5]]},"144":{"position":[[96,4]]},"146":{"position":[[223,5]]},"159":{"position":[[201,5]]},"163":{"position":[[96,4]]},"169":{"position":[[96,4]]},"174":{"position":[[258,5]]},"181":{"position":[[96,4]]},"183":{"position":[[475,5]]},"190":{"position":[[121,4]]},"196":{"position":[[121,4]]},"214":{"position":[[96,4]]},"216":{"position":[[221,4]]},"222":{"position":[[141,4]]},"229":{"position":[[96,4]]},"230":{"position":[[273,5]]},"243":{"position":[[96,4]]},"245":{"position":[[149,5]]},"248":{"position":[[96,4]]},"250":{"position":[[307,5]]},"256":{"position":[[111,4]]},"260":{"position":[[96,4]]}},"relUrl":{"4":{"position":[[41,4]]},"10":{"position":[[22,4]]},"34":{"position":[[25,4]]},"39":{"position":[[40,4]]},"43":{"position":[[36,4]]},"49":{"position":[[40,4]]},"77":{"position":[[23,4]]},"82":{"position":[[39,4]]},"96":{"position":[[48,4]]},"100":{"position":[[45,4]]},"128":{"position":[[30,4]]},"134":{"position":[[31,4]]},"144":{"position":[[31,4]]},"151":{"position":[[24,4]]},"163":{"position":[[27,4]]},"169":{"position":[[32,4]]},"181":{"position":[[25,4]]},"205":{"position":[[33,4]]},"210":{"position":[[37,4]]},"214":{"position":[[33,4]]},"222":{"position":[[36,4]]},"229":{"position":[[33,4]]},"243":{"position":[[37,4]]},"248":{"position":[[27,4]]},"260":{"position":[[27,4]]}}}],["helper",{"_index":1169,"title":{"166":{"position":[[11,6]]}},"content":{"166":{"position":[[89,6]]},"167":{"position":[[143,6]]}},"relUrl":{"166":{"position":[[38,6]]}}}],["here",{"_index":153,"title":{},"content":{"12":{"position":[[58,5]]},"23":{"position":[[95,5]]},"51":{"position":[[24,5]]},"52":{"position":[[15,5]]},"59":{"position":[[78,5]]},"101":{"position":[[52,5]]},"104":{"position":[[27,5],[212,5]]},"105":{"position":[[80,4]]},"111":{"position":[[76,4]]},"114":{"position":[[82,5]]},"117":{"position":[[6,4]]},"121":{"position":[[88,4]]},"143":{"position":[[704,4]]},"150":{"position":[[186,5]]},"172":{"position":[[95,4]]},"176":{"position":[[969,5]]},"226":{"position":[[53,4]]}},"relUrl":{}}],["here’",{"_index":1115,"title":{},"content":{"150":{"position":[[74,6]]},"217":{"position":[[161,6]]}},"relUrl":{}}],["high",{"_index":494,"title":{"90":{"position":[[14,4]]}},"content":{"53":{"position":[[32,4],[143,4]]},"84":{"position":[[186,4]]},"90":{"position":[[274,4],[418,4]]},"93":{"position":[[202,4]]},"101":{"position":[[108,4]]},"216":{"position":[[4,4]]},"219":{"position":[[73,4]]}},"relUrl":{"90":{"position":[[57,4]]}}}],["highcharts.chart('contain",{"_index":777,"title":{},"content":{"98":{"position":[[307,29]]}},"relUrl":{}}],["highcharts.j",{"_index":768,"title":{"97":{"position":[[18,13]]}},"content":{"97":{"position":[[101,13]]},"98":{"position":[[42,13]]}},"relUrl":{}}],["highchartsj",{"_index":770,"title":{},"content":{},"relUrl":{"97":{"position":[[26,13]]},"99":{"position":[[26,13]]}}}],["highchartsjs/#exampl",{"_index":856,"title":{},"content":{},"relUrl":{"98":{"position":[[26,21]]}}}],["highchartsjs/#ne",{"_index":860,"title":{},"content":{},"relUrl":{"100":{"position":[[26,18]]}}}],["higher",{"_index":730,"title":{},"content":{"90":{"position":[[45,6],[86,6]]}},"relUrl":{}}],["highlight",{"_index":932,"title":{"109":{"position":[[0,11]]}},"content":{"109":{"position":[[61,9]]}},"relUrl":{"109":{"position":[[0,13]]}}}],["homepag",{"_index":1408,"title":{},"content":{"220":{"position":[[87,9]]}},"relUrl":{}}],["horizont",{"_index":852,"title":{},"content":{"98":{"position":[[1270,13]]}},"relUrl":{}}],["hostnam",{"_index":526,"title":{},"content":{"58":{"position":[[110,8]]},"142":{"position":[[532,9]]}},"relUrl":{}}],["hour",{"_index":44,"title":{},"content":{"4":{"position":[[73,6]]},"34":{"position":[[73,6]]},"96":{"position":[[73,6]]},"134":{"position":[[73,6]]},"210":{"position":[[73,6]]}},"relUrl":{}}],["href",{"_index":446,"title":{},"content":{"47":{"position":[[74,4]]},"127":{"position":[[36,4],[285,4]]},"213":{"position":[[36,4]]}},"relUrl":{}}],["href=\"https://cdnjs.cloudflare.com/ajax/libs/primer/10.8.1/build.css",{"_index":449,"title":{},"content":{"47":{"position":[[136,69]]}},"relUrl":{}}],["href=\"https://fonts.googleapis.com/css2?family=cabin:wght@700&display=swap",{"_index":905,"title":{},"content":{"102":{"position":[[856,79]]}},"relUrl":{}}],["href=\"https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css",{"_index":901,"title":{},"content":{"102":{"position":[[638,79]]}},"relUrl":{}}],["href=\"https://twitter.com/fortnitegame/status/1253524351376330752\"></a>",{"_index":1386,"title":{},"content":{"213":{"position":[[217,80]]}},"relUrl":{}}],["href=\"https://www.instagram.com/p/b2ekgkalro6/\"></a>",{"_index":977,"title":{},"content":{"127":{"position":[[329,61]]}},"relUrl":{}}],["href=\\\"\\\"></a>\\n\\n</blockquote>",{"_index":1353,"title":{},"content":{"202":{"position":[[303,46]]},"204":{"position":[[303,46]]}},"relUrl":{}}],["htciexampl",{"_index":109,"title":{},"content":{"9":{"position":[[313,11]]},"247":{"position":[[210,11]]}},"relUrl":{}}],["html",{"_index":68,"title":{"40":{"position":[[8,4]]},"85":{"position":[[30,4]]},"98":{"position":[[8,4]]},"102":{"position":[[11,4]]},"254":{"position":[[20,4]]}},"content":{"7":{"position":[[100,4]]},"9":{"position":[[185,4],[386,4],[834,7],[842,4]]},"21":{"position":[[92,4]]},"22":{"position":[[221,4]]},"28":{"position":[[161,4]]},"38":{"position":[[116,4]]},"41":{"position":[[96,4],[142,4]]},"42":{"position":[[62,4]]},"46":{"position":[[79,5]]},"47":{"position":[[41,4]]},"51":{"position":[[111,5]]},"56":{"position":[[32,4]]},"57":{"position":[[59,4]]},"58":{"position":[[66,5]]},"59":{"position":[[119,4],[153,4]]},"70":{"position":[[20,4]]},"74":{"position":[[100,4]]},"76":{"position":[[320,7]]},"81":{"position":[[236,7]]},"84":{"position":[[102,4]]},"85":{"position":[[16,4],[106,4],[231,4],[256,4]]},"89":{"position":[[276,4],[549,4]]},"90":{"position":[[363,5]]},"95":{"position":[[205,4],[330,4]]},"98":{"position":[[81,5]]},"101":{"position":[[179,4]]},"127":{"position":[[84,4]]},"137":{"position":[[100,4]]},"139":{"position":[[285,5]]},"141":{"position":[[258,5]]},"142":{"position":[[198,5]]},"143":{"position":[[183,5]]},"147":{"position":[[100,4]]},"149":{"position":[[134,5]]},"150":{"position":[[232,5],[583,7],[597,6]]},"160":{"position":[[100,4]]},"162":{"position":[[350,7]]},"168":{"position":[[221,4]]},"175":{"position":[[96,4]]},"177":{"position":[[224,4],[394,5],[400,5]]},"178":{"position":[[156,4],[605,5]]},"179":{"position":[[239,4],[288,6],[338,5]]},"184":{"position":[[32,4]]},"185":{"position":[[88,5]]},"187":{"position":[[490,5]]},"189":{"position":[[134,5],[163,4],[204,4]]},"190":{"position":[[25,4]]},"192":{"position":[[201,5]]},"195":{"position":[[132,5],[161,4],[202,4]]},"196":{"position":[[25,4]]},"200":{"position":[[308,5]]},"202":{"position":[[155,7]]},"204":{"position":[[155,7]]},"213":{"position":[[85,4]]},"226":{"position":[[138,4]]},"227":{"position":[[97,4]]},"228":{"position":[[233,4]]},"230":{"position":[[21,4]]},"233":{"position":[[131,5],[160,4],[201,4],[457,4]]},"234":{"position":[[37,4]]},"236":{"position":[[181,5]]},"246":{"position":[[88,4]]},"247":{"position":[[62,4],[258,4],[597,8],[606,6]]},"253":{"position":[[125,4],[215,5],[244,4],[285,4]]},"254":{"position":[[19,5]]},"255":{"position":[[296,4]]}},"relUrl":{"40":{"position":[[39,4]]},"42":{"position":[[44,4]]},"85":{"position":[[68,4]]},"98":{"position":[[48,4]]},"102":{"position":[[13,4]]}}}],["html/css",{"_index":49,"title":{"6":{"position":[[4,8]]},"73":{"position":[[8,8]]},"79":{"position":[[20,8]]},"101":{"position":[[0,8]]},"120":{"position":[[10,8]]},"123":{"position":[[8,8]]},"130":{"position":[[12,8]]},"136":{"position":[[12,8]]},"146":{"position":[[5,8]]},"153":{"position":[[9,8]]},"157":{"position":[[4,8]]},"159":{"position":[[8,8]]},"174":{"position":[[6,8]]},"230":{"position":[[10,8]]},"245":{"position":[[8,8]]},"250":{"position":[[8,8]]},"253":{"position":[[19,8]]},"257":{"position":[[22,8]]}},"content":{"7":{"position":[[23,8],[150,9]]},"9":{"position":[[93,8]]},"12":{"position":[[29,8]]},"14":{"position":[[52,8]]},"17":{"position":[[22,8],[284,8]]},"18":{"position":[[72,8],[231,8]]},"19":{"position":[[138,8]]},"20":{"position":[[137,8]]},"21":{"position":[[222,8]]},"23":{"position":[[101,8]]},"30":{"position":[[104,8]]},"40":{"position":[[49,8]]},"41":{"position":[[19,8]]},"45":{"position":[[176,9]]},"74":{"position":[[23,8],[154,9]]},"76":{"position":[[97,8]]},"80":{"position":[[159,8]]},"81":{"position":[[103,8]]},"90":{"position":[[222,8]]},"97":{"position":[[121,8]]},"101":{"position":[[133,9]]},"102":{"position":[[34,8]]},"105":{"position":[[46,8]]},"107":{"position":[[20,8]]},"115":{"position":[[12,8]]},"117":{"position":[[35,8]]},"118":{"position":[[55,8]]},"123":{"position":[[17,8]]},"130":{"position":[[35,8],[138,8]]},"131":{"position":[[73,8]]},"132":{"position":[[78,8],[168,8],[249,8]]},"137":{"position":[[23,8],[158,9]]},"139":{"position":[[101,8],[261,8]]},"141":{"position":[[234,8]]},"147":{"position":[[23,8],[151,9]]},"149":{"position":[[94,8]]},"150":{"position":[[110,8]]},"157":{"position":[[52,9]]},"160":{"position":[[23,8],[154,9]]},"162":{"position":[[97,8]]},"166":{"position":[[26,8]]},"175":{"position":[[19,8],[146,9]]},"176":{"position":[[8,8]]},"178":{"position":[[75,8],[238,8]]},"211":{"position":[[8,8]]},"226":{"position":[[242,8]]},"246":{"position":[[19,8],[140,9]]},"250":{"position":[[31,8],[180,8],[260,8],[325,8]]},"251":{"position":[[66,8]]},"257":{"position":[[135,8]]}},"relUrl":{}}],["html=\"<div",{"_index":356,"title":{},"content":{"32":{"position":[[296,13]]}},"relUrl":{}}],["htmlcss",{"_index":62,"title":{},"content":{},"relUrl":{"6":{"position":[[19,7]]},"73":{"position":[[25,7]]},"79":{"position":[[53,7]]},"120":{"position":[[27,7]]},"123":{"position":[[26,7]]},"130":{"position":[[37,7]]},"136":{"position":[[37,7]]},"146":{"position":[[23,7]]},"153":{"position":[[25,7]]},"157":{"position":[[21,7]]},"159":{"position":[[29,7]]},"174":{"position":[[25,7]]},"230":{"position":[[42,7]]},"245":{"position":[[28,7]]},"250":{"position":[[29,7]]},"253":{"position":[[41,7]]},"257":{"position":[[44,7]]}}}],["htmlcssimage/#{html}/#{css}/#{google_font",{"_index":1241,"title":{},"content":{"178":{"position":[[415,45]]}},"relUrl":{}}],["htmlcsstoimag",{"_index":1210,"title":{},"content":{"176":{"position":[[115,15],[176,16]]},"178":{"position":[[331,16]]}},"relUrl":{}}],["htmlcsstoimage.new",{"_index":1214,"title":{},"content":{"176":{"position":[[458,18]]},"178":{"position":[[552,18]]}},"relUrl":{}}],["htmlcsstoimage.new(user_id",{"_index":1211,"title":{},"content":{"176":{"position":[[280,27]]}},"relUrl":{}}],["http",{"_index":85,"title":{},"content":{"8":{"position":[[13,4]]},"9":{"position":[[30,4]]},"75":{"position":[[13,4]]},"76":{"position":[[34,4]]},"121":{"position":[[15,4]]},"138":{"position":[[13,4]]},"139":{"position":[[38,4]]},"142":{"position":[[32,4],[143,5]]},"143":{"position":[[33,4]]},"148":{"position":[[13,4]]},"149":{"position":[[31,4]]},"150":{"position":[[9,4]]},"154":{"position":[[14,4]]},"161":{"position":[[13,4]]},"162":{"position":[[34,4]]},"188":{"position":[[32,4]]},"194":{"position":[[48,4]]},"198":{"position":[[39,4]]},"231":{"position":[[13,4]]},"232":{"position":[[30,4]]}},"relUrl":{}}],["http.newrequest(\"post",{"_index":636,"title":{},"content":{"76":{"position":[[557,23]]}},"relUrl":{}}],["http_build_query($data",{"_index":1093,"title":{},"content":{"149":{"position":[[592,25]]}},"relUrl":{}}],["httparti",{"_index":1202,"title":{"177":{"position":[[13,8]]}},"content":{"174":{"position":[[174,8]]},"177":{"position":[[22,8],[61,9],[106,10]]}},"relUrl":{"177":{"position":[[33,8]]}}}],["httparty.post(\"https://hcti.io/v1/imag",{"_index":1228,"title":{},"content":{"177":{"position":[[344,41]]}},"relUrl":{}}],["https.request(opt",{"_index":1041,"title":{},"content":{"142":{"position":[[742,22]]}},"relUrl":{}}],["https://avataaars.io/?avatarstyle=transparent&toptype=shorthairdreads01&accessoriestype=round&haircolor=browndark&facialhairtype=beardlight&facialhaircolor=browndark&clothetype=blazershirt&eyetype=happy&eyebrowtype=defaultnatural&mouthtype=eating&skincolor=brown",{"_index":1277,"title":{},"content":{"187":{"position":[[139,305]]}},"relUrl":{}}],["https://hcti.io/v1/imag",{"_index":101,"title":{},"content":{"9":{"position":[[47,24],[737,27]]},"32":{"position":[[248,24]]},"76":{"position":[[51,24],[581,27]]},"139":{"position":[[55,24],[611,27]]},"141":{"position":[[605,27]]},"149":{"position":[[48,24],[481,28]]},"150":{"position":[[496,27]]},"155":{"position":[[52,25]]},"162":{"position":[[51,24],[191,26]]},"217":{"position":[[204,24]]},"232":{"position":[[60,24]]},"247":{"position":[[516,27]]}},"relUrl":{}}],["https://hcti.io/v1/image/1113184",{"_index":1018,"title":{},"content":{"139":{"position":[[748,34]]},"141":{"position":[[714,34]]}},"relUrl":{}}],["https://hcti.io/v1/image/202dc04d",{"_index":1109,"title":{},"content":{"149":{"position":[[1085,33]]}},"relUrl":{}}],["https://hcti.io/v1/image/254b444c",{"_index":1227,"title":{},"content":{"176":{"position":[[826,34]]}},"relUrl":{}}],["https://hcti.io/v1/image/7ed741b8",{"_index":1160,"title":{},"content":{"162":{"position":[[684,33]]}},"relUrl":{}}],["https://hcti.io/v1/image/:image_id",{"_index":1479,"title":{},"content":{"237":{"position":[[125,34]]},"241":{"position":[[7,34]]}},"relUrl":{}}],["https://hcti.io/v1/image/:template_id",{"_index":1332,"title":{},"content":{"198":{"position":[[121,37]]}},"relUrl":{}}],["https://hcti.io/v1/image/a3ab2ab2",{"_index":597,"title":{},"content":{"71":{"position":[[203,33],[281,33],[360,33]]},"238":{"position":[[203,33],[281,33],[360,33]]}},"relUrl":{}}],["https://hcti.io/v1/image/be4c5118",{"_index":79,"title":{},"content":{"7":{"position":[[317,34]]},"74":{"position":[[321,34]]},"137":{"position":[[325,34]]},"147":{"position":[[318,34]]},"160":{"position":[[321,34]]},"236":{"position":[[31,34]]}},"relUrl":{}}],["https://hcti.io/v1/templ",{"_index":1282,"title":{},"content":{"188":{"position":[[62,27]]},"201":{"position":[[90,27]]}},"relUrl":{}}],["https://hcti.io/v1/template/:template_id",{"_index":1329,"title":{},"content":{"194":{"position":[[129,40]]},"203":{"position":[[108,40]]}},"relUrl":{}}],["https://htmlcsstoimage.com",{"_index":1471,"title":{},"content":{"233":{"position":[[394,27]]},"255":{"position":[[233,27]]}},"relUrl":{}}],["https://htmlcsstoimage.com/dashboard",{"_index":351,"title":{},"content":{"32":{"position":[[198,36]]},"139":{"position":[[554,36]]},"141":{"position":[[527,36]]},"142":{"position":[[419,36]]},"149":{"position":[[695,36]]},"150":{"position":[[424,36]]},"162":{"position":[[240,36]]},"176":{"position":[[234,36]]},"236":{"position":[[367,37]]}},"relUrl":{}}],["https://www.getpostman.com",{"_index":1136,"title":{},"content":{"154":{"position":[[86,28]]}},"relUrl":{}}],["human",{"_index":38,"title":{},"content":{"4":{"position":[[10,6]]},"34":{"position":[[10,6]]},"39":{"position":[[10,6]]},"49":{"position":[[10,6]]},"96":{"position":[[10,6]]},"100":{"position":[[10,6]]},"128":{"position":[[10,6]]},"134":{"position":[[10,6]]},"144":{"position":[[10,6]]},"163":{"position":[[10,6]]},"169":{"position":[[10,6]]},"181":{"position":[[10,6]]},"210":{"position":[[10,6]]},"214":{"position":[[10,6]]},"229":{"position":[[10,6]]},"243":{"position":[[10,6]]},"248":{"position":[[10,6]]},"260":{"position":[[10,6]]}},"relUrl":{}}],["hunt",{"_index":927,"title":{"107":{"position":[[8,4]]}},"content":{"107":{"position":[[10,4]]}},"relUrl":{"107":{"position":[[10,4]]}}}],["hurt",{"_index":1482,"title":{},"content":{"237":{"position":[[373,7]]}},"relUrl":{}}],["icon",{"_index":481,"title":{"58":{"position":[[34,6]]}},"content":{"51":{"position":[[404,6]]},"58":{"position":[[143,5]]}},"relUrl":{"58":{"position":[[40,5]]}}}],["id",{"_index":89,"title":{},"content":{"8":{"position":[[67,2]]},"75":{"position":[[67,2]]},"81":{"position":[[364,2]]},"133":{"position":[[76,2]]},"138":{"position":[[67,2]]},"142":{"position":[[480,3]]},"143":{"position":[[310,4]]},"148":{"position":[[67,2]]},"156":{"position":[[69,2]]},"161":{"position":[[67,2]]},"162":{"position":[[307,3]]},"165":{"position":[[272,2]]},"167":{"position":[[111,2]]},"176":{"position":[[214,2],[314,4]]},"177":{"position":[[138,2]]},"202":{"position":[[454,5]]},"204":{"position":[[454,5]]},"231":{"position":[[69,2]]},"252":{"position":[[76,2]]}},"relUrl":{}}],["id=\"254b444c",{"_index":1224,"title":{},"content":{"176":{"position":[[764,12]]}},"relUrl":{}}],["id=\"container\"></div>",{"_index":775,"title":{},"content":{"98":{"position":[[261,30]]}},"relUrl":{}}],["ident",{"_index":405,"title":{},"content":{"37":{"position":[[186,9]]}},"relUrl":{}}],["identifi",{"_index":1288,"title":{},"content":{"189":{"position":[[360,8]]},"195":{"position":[[358,8]]}},"relUrl":{}}],["imag",{"_index":2,"title":{"0":{"position":[[21,5]]},"5":{"position":[[10,5]]},"6":{"position":[[16,5]]},"7":{"position":[[11,6]]},"26":{"position":[[7,5]]},"27":{"position":[[7,5]]},"29":{"position":[[9,6]]},"32":{"position":[[12,5]]},"35":{"position":[[10,5]]},"36":{"position":[[34,5]]},"38":{"position":[[4,6]]},"40":{"position":[[23,6]]},"41":{"position":[[11,6]]},"44":{"position":[[17,6]]},"53":{"position":[[10,5]]},"55":{"position":[[37,6]]},"60":{"position":[[17,5]]},"61":{"position":[[20,7]]},"66":{"position":[[13,6]]},"73":{"position":[[20,5]]},"74":{"position":[[11,6]]},"79":{"position":[[32,5]]},"80":{"position":[[12,5]]},"87":{"position":[[26,5]]},"90":{"position":[[39,6]]},"97":{"position":[[0,5]]},"101":{"position":[[12,5]]},"105":{"position":[[0,5]]},"106":{"position":[[7,7]]},"120":{"position":[[22,5]]},"125":{"position":[[34,5]]},"130":{"position":[[24,5]]},"136":{"position":[[24,5]]},"137":{"position":[[11,6]]},"146":{"position":[[17,5]]},"147":{"position":[[11,6]]},"153":{"position":[[21,5]]},"159":{"position":[[20,5]]},"160":{"position":[[11,6]]},"167":{"position":[[18,5]]},"174":{"position":[[18,5]]},"175":{"position":[[11,6]]},"183":{"position":[[0,5]]},"198":{"position":[[12,5]]},"216":{"position":[[7,5]]},"217":{"position":[[12,5]]},"230":{"position":[[22,5]]},"232":{"position":[[12,5]]},"237":{"position":[[11,5]]},"241":{"position":[[12,5]]},"245":{"position":[[20,5]]},"246":{"position":[[12,5]]},"250":{"position":[[20,5]]},"253":{"position":[[7,6]]},"255":{"position":[[7,6]]},"257":{"position":[[10,6]]},"259":{"position":[[6,6]]}},"content":{"1":{"position":[[23,6],[91,6]]},"2":{"position":[[56,6]]},"3":{"position":[[109,7]]},"6":{"position":[[28,6],[120,6]]},"7":{"position":[[113,6],[214,6],[277,6]]},"9":{"position":[[108,5],[278,6]]},"12":{"position":[[41,5]]},"13":{"position":[[26,5],[78,6],[109,5]]},"14":{"position":[[64,5]]},"15":{"position":[[145,6],[342,5]]},"16":{"position":[[97,5],[165,7],[243,6]]},"17":{"position":[[34,5],[264,5],[296,5]]},"18":{"position":[[112,5],[153,6],[204,6],[243,5]]},"19":{"position":[[150,5]]},"20":{"position":[[149,5]]},"21":{"position":[[171,6],[202,5],[234,5]]},"22":{"position":[[65,5],[118,5],[204,5],[297,6],[378,5]]},"23":{"position":[[113,5]]},"26":{"position":[[75,6]]},"27":{"position":[[51,6],[96,6]]},"28":{"position":[[143,6]]},"29":{"position":[[77,5],[151,5]]},"30":{"position":[[116,5]]},"31":{"position":[[28,6],[106,5]]},"32":{"position":[[49,5],[122,6]]},"33":{"position":[[60,6]]},"35":{"position":[[26,5]]},"36":{"position":[[69,5],[139,5],[211,6],[270,5],[451,7]]},"37":{"position":[[76,7],[196,6]]},"38":{"position":[[10,5],[45,6],[90,6]]},"40":{"position":[[9,6],[61,6]]},"41":{"position":[[109,6],[225,6]]},"45":{"position":[[53,7]]},"51":{"position":[[156,5],[255,6],[467,5],[505,7],[686,6]]},"52":{"position":[[46,6]]},"53":{"position":[[21,6],[97,5],[246,6]]},"55":{"position":[[119,6],[226,6]]},"60":{"position":[[82,5],[120,5]]},"61":{"position":[[54,6],[102,6]]},"63":{"position":[[39,5]]},"64":{"position":[[4,6]]},"65":{"position":[[114,6]]},"66":{"position":[[22,5],[394,6]]},"67":{"position":[[104,6]]},"70":{"position":[[8,6]]},"72":{"position":[[39,6],[195,6],[236,5]]},"73":{"position":[[28,6],[124,6]]},"74":{"position":[[113,6],[218,6],[281,6]]},"76":{"position":[[112,5]]},"79":{"position":[[28,6],[101,5]]},"80":{"position":[[171,5],[295,6]]},"84":{"position":[[47,6],[137,5],[211,6]]},"85":{"position":[[63,5]]},"87":{"position":[[70,6]]},"89":{"position":[[20,6],[308,5],[460,6],[497,6]]},"90":{"position":[[125,7],[231,6],[287,5],[383,5]]},"91":{"position":[[6,5],[137,6],[295,6]]},"93":{"position":[[0,6]]},"97":{"position":[[53,7],[78,6],[133,5]]},"101":{"position":[[30,5],[121,6],[253,6]]},"102":{"position":[[5,5]]},"105":{"position":[[155,5]]},"106":{"position":[[56,6]]},"107":{"position":[[32,5]]},"109":{"position":[[9,6]]},"110":{"position":[[9,6]]},"113":{"position":[[8,5],[196,6]]},"115":{"position":[[24,5]]},"116":{"position":[[71,7]]},"117":{"position":[[47,5]]},"118":{"position":[[43,6],[67,6]]},"120":{"position":[[40,5]]},"125":{"position":[[40,5]]},"127":{"position":[[54,5]]},"130":{"position":[[9,6],[47,6],[150,5]]},"131":{"position":[[62,5],[122,5]]},"132":{"position":[[90,6],[227,5]]},"136":{"position":[[28,6],[128,6]]},"137":{"position":[[113,6],[222,6],[285,6]]},"139":{"position":[[116,5],[462,5],[872,6]]},"141":{"position":[[435,5],[570,5]]},"142":{"position":[[857,5]]},"143":{"position":[[681,5]]},"146":{"position":[[28,6],[121,6]]},"147":{"position":[[113,6],[215,6],[278,6]]},"149":{"position":[[109,5]]},"150":{"position":[[122,5]]},"153":{"position":[[40,5]]},"155":{"position":[[16,6]]},"158":{"position":[[57,6]]},"159":{"position":[[28,6],[124,6]]},"160":{"position":[[113,6],[218,6],[281,6]]},"162":{"position":[[112,5],[532,5],[643,5]]},"165":{"position":[[26,5],[136,5],[363,6]]},"166":{"position":[[4,6],[66,6],[256,6],[471,6]]},"167":{"position":[[18,6],[62,5],[177,6]]},"168":{"position":[[34,6],[82,5],[127,7],[199,5],[363,5]]},"171":{"position":[[40,6]]},"172":{"position":[[5,5]]},"174":{"position":[[28,6],[122,6]]},"175":{"position":[[109,6],[198,6],[257,6]]},"176":{"position":[[20,5],[491,5],[499,5],[650,5]]},"177":{"position":[[336,5]]},"178":{"position":[[134,5],[183,5],[312,6],[571,5]]},"179":{"position":[[180,5],[232,6]]},"183":{"position":[[35,5],[317,5]]},"184":{"position":[[94,5]]},"185":{"position":[[164,6]]},"186":{"position":[[77,7],[94,6],[201,7]]},"187":{"position":[[5,5],[116,8]]},"189":{"position":[[315,6]]},"191":{"position":[[50,6],[303,5],[483,6]]},"195":{"position":[[313,6]]},"197":{"position":[[50,6],[303,5],[483,6],[785,5],[860,6]]},"198":{"position":[[24,6]]},"199":{"position":[[19,5],[143,5]]},"200":{"position":[[21,5]]},"206":{"position":[[20,6]]},"207":{"position":[[13,5],[105,6]]},"208":{"position":[[5,5]]},"209":{"position":[[71,6],[119,5]]},"211":{"position":[[20,5],[42,6]]},"212":{"position":[[87,5]]},"213":{"position":[[54,5],[468,6]]},"216":{"position":[[93,5]]},"218":{"position":[[18,5],[417,5],[820,5]]},"219":{"position":[[89,6]]},"222":{"position":[[125,6]]},"223":{"position":[[55,7]]},"224":{"position":[[147,6],[369,6]]},"226":{"position":[[5,5],[254,5]]},"228":{"position":[[87,5],[265,6],[343,5]]},"230":{"position":[[9,6],[93,5],[175,5],[235,5]]},"231":{"position":[[295,6]]},"232":{"position":[[15,6]]},"233":{"position":[[11,5],[312,6]]},"234":{"position":[[16,6]]},"235":{"position":[[50,6],[303,5],[483,6],[785,5],[860,6],[952,5]]},"237":{"position":[[18,6],[78,6],[434,5],[471,5],[506,5]]},"240":{"position":[[56,6],[134,6],[196,6],[255,5]]},"241":{"position":[[57,5],[116,5],[149,5],[202,5]]},"245":{"position":[[28,6],[109,5]]},"246":{"position":[[101,6],[192,6],[251,6]]},"247":{"position":[[155,6]]},"250":{"position":[[9,6],[43,6],[168,6],[198,6],[248,6],[289,6],[337,5]]},"251":{"position":[[54,6],[84,6]]},"253":{"position":[[52,5],[89,5],[396,6],[631,6]]},"254":{"position":[[195,6]]},"255":{"position":[[550,6],[1108,5]]},"257":{"position":[[14,5],[88,5]]},"258":{"position":[[83,6]]},"259":{"position":[[54,6]]}},"relUrl":{"0":{"position":[[57,5]]},"5":{"position":[[29,6]]},"6":{"position":[[30,5]]},"7":{"position":[[28,6]]},"26":{"position":[[19,5]]},"27":{"position":[[19,5]]},"29":{"position":[[21,6]]},"32":{"position":[[32,5]]},"35":{"position":[[18,5]]},"36":{"position":[[18,5],[69,5]]},"37":{"position":[[18,5]]},"38":{"position":[[18,5],[39,6]]},"39":{"position":[[18,5]]},"40":{"position":[[54,6]]},"41":{"position":[[42,6]]},"44":{"position":[[23,7]]},"53":{"position":[[16,5]]},"55":{"position":[[43,6]]},"60":{"position":[[23,5]]},"61":{"position":[[26,6]]},"66":{"position":[[19,6]]},"73":{"position":[[36,5]]},"74":{"position":[[29,6]]},"79":{"position":[[64,5]]},"80":{"position":[[46,5]]},"87":{"position":[[69,5]]},"90":{"position":[[80,6]]},"105":{"position":[[0,7]]},"106":{"position":[[9,6]]},"120":{"position":[[38,5]]},"125":{"position":[[59,5]]},"130":{"position":[[48,5]]},"136":{"position":[[48,5]]},"137":{"position":[[37,6]]},"146":{"position":[[34,5]]},"147":{"position":[[30,6]]},"153":{"position":[[36,5]]},"159":{"position":[[40,5]]},"160":{"position":[[33,6]]},"167":{"position":[[45,5]]},"174":{"position":[[36,5]]},"175":{"position":[[31,6]]},"198":{"position":[[40,5]]},"216":{"position":[[24,6]]},"217":{"position":[[43,5]]},"230":{"position":[[53,5]]},"232":{"position":[[44,5]]},"237":{"position":[[43,5]]},"241":{"position":[[44,5]]},"245":{"position":[[39,5]]},"246":{"position":[[34,5]]},"250":{"position":[[40,5]]},"253":{"position":[[29,6]]},"255":{"position":[[29,6]]},"257":{"position":[[32,6]]},"259":{"position":[[28,6]]}}}],["image.success",{"_index":1246,"title":{},"content":{"178":{"position":[[652,14]]}},"relUrl":{}}],["image.url",{"_index":1226,"title":{},"content":{"176":{"position":[[810,9]]},"178":{"position":[[696,10],[741,9]]}},"relUrl":{}}],["image/#addit",{"_index":1402,"title":{},"content":{},"relUrl":{"218":{"position":[[24,17]]}}}],["image/#convert",{"_index":11,"title":{},"content":{},"relUrl":{"0":{"position":[[29,14]]}}}],["image/#cr",{"_index":1396,"title":{},"content":{},"relUrl":{"217":{"position":[[24,15]]}}}],["image/#css",{"_index":1411,"title":{},"content":{},"relUrl":{"221":{"position":[[24,10]]}}}],["image/#exampl",{"_index":29,"title":{},"content":{},"relUrl":{"2":{"position":[[29,14]]}}}],["image/#how",{"_index":26,"title":{},"content":{},"relUrl":{"1":{"position":[[29,10]]}}}],["image/#ne",{"_index":47,"title":{},"content":{},"relUrl":{"4":{"position":[[29,11]]},"222":{"position":[[24,11]]}}}],["image/#screenshot",{"_index":1405,"title":{},"content":{},"relUrl":{"219":{"position":[[24,17]]},"220":{"position":[[24,17]]}}}],["image/#us",{"_index":34,"title":{},"content":{},"relUrl":{"3":{"position":[[29,10]]}}}],["images/#convert",{"_index":414,"title":{},"content":{},"relUrl":{"40":{"position":[[23,15]]}}}],["images/#gener",{"_index":418,"title":{},"content":{},"relUrl":{"41":{"position":[[23,18]]}}}],["images/#includ",{"_index":432,"title":{},"content":{},"relUrl":{"42":{"position":[[23,15]]}}}],["images/#ne",{"_index":433,"title":{},"content":{},"relUrl":{"43":{"position":[[23,12]]}}}],["imagin",{"_index":917,"title":{},"content":{"105":{"position":[[5,11]]}},"relUrl":{}}],["img",{"_index":14,"title":{},"content":{"1":{"position":[[45,3]]}},"relUrl":{}}],["img.emoji",{"_index":1196,"title":{},"content":{"172":{"position":[[303,9]]}},"relUrl":{}}],["implement",{"_index":1260,"title":{},"content":{"180":{"position":[[52,11]]}},"relUrl":{}}],["import",{"_index":583,"title":{},"content":{"66":{"position":[[491,9]]},"76":{"position":[[144,6]]},"140":{"position":[[53,9]]},"162":{"position":[[155,6]]},"213":{"position":[[418,10]]},"247":{"position":[[162,7],[177,7]]}},"relUrl":{}}],["improv",{"_index":144,"title":{"14":{"position":[[15,12]]},"15":{"position":[[15,12]]},"16":{"position":[[20,12]]},"26":{"position":[[25,12]]}},"content":{"10":{"position":[[24,7]]},"12":{"position":[[7,10]]},"13":{"position":[[131,9]]},"16":{"position":[[51,9],[145,8]]},"17":{"position":[[219,9]]},"24":{"position":[[172,7]]},"25":{"position":[[111,8]]},"26":{"position":[[52,12],[88,8]]},"43":{"position":[[24,7]]},"72":{"position":[[84,8]]},"77":{"position":[[24,7]]},"82":{"position":[[24,7]]},"151":{"position":[[24,7]]},"205":{"position":[[24,7]]}},"relUrl":{"14":{"position":[[27,12]]},"15":{"position":[[27,12]]},"16":{"position":[[32,12]]},"26":{"position":[[37,12]]}}}],["inch",{"_index":750,"title":{},"content":{"93":{"position":[[101,6],[110,6],[151,8],[190,5]]},"94":{"position":[[40,7]]},"95":{"position":[[37,8]]}},"relUrl":{}}],["includ",{"_index":419,"title":{"42":{"position":[[0,7]]}},"content":{"42":{"position":[[258,7]]},"45":{"position":[[13,7],[78,9],[153,9]]},"46":{"position":[[3,7]]},"54":{"position":[[40,7]]},"58":{"position":[[5,7]]},"59":{"position":[[136,7]]},"61":{"position":[[16,7]]},"80":{"position":[[90,8]]},"97":{"position":[[13,7]]},"102":{"position":[[579,7]]},"131":{"position":[[27,8]]},"172":{"position":[[172,7]]},"184":{"position":[[42,8]]},"207":{"position":[[50,7]]},"225":{"position":[[71,7]]},"227":{"position":[[69,9]]},"251":{"position":[[23,8]]}},"relUrl":{}}],["increas",{"_index":608,"title":{},"content":{"72":{"position":[[110,9]]},"218":{"position":[[675,10]]},"228":{"position":[[312,8]]}},"relUrl":{}}],["inform",{"_index":164,"title":{},"content":{"13":{"position":[[165,11]]}},"relUrl":{}}],["infrastructur",{"_index":575,"title":{},"content":{"66":{"position":[[325,15]]}},"relUrl":{}}],["initi",{"_index":203,"title":{},"content":{"16":{"position":[[89,7]]},"56":{"position":[[130,7]]},"176":{"position":[[138,12]]},"191":{"position":[[593,7]]},"197":{"position":[[593,7]]},"218":{"position":[[726,7]]},"225":{"position":[[45,7]]},"235":{"position":[[593,7]]},"253":{"position":[[741,7]]},"255":{"position":[[660,7]]}},"relUrl":{}}],["insid",{"_index":65,"title":{},"content":{"7":{"position":[[44,6]]},"18":{"position":[[211,6]]},"41":{"position":[[40,6]]},"74":{"position":[[44,6]]},"89":{"position":[[323,6]]},"137":{"position":[[44,6]]},"147":{"position":[[44,6]]},"160":{"position":[[44,6]]},"175":{"position":[[40,6]]}},"relUrl":{}}],["insomnia",{"_index":944,"title":{"120":{"position":[[0,9]]},"121":{"position":[[0,8]]},"124":{"position":[[0,8]]}},"content":{"120":{"position":[[52,8]]},"121":{"position":[[0,8],[79,8]]}},"relUrl":{}}],["instagram",{"_index":958,"title":{"125":{"position":[[11,9]]},"129":{"position":[[0,9]]}},"content":{"125":{"position":[[54,9]]},"126":{"position":[[31,9],[71,9],[142,9]]}},"relUrl":{"125":{"position":[[36,9]]}}}],["instal",{"_index":541,"title":{},"content":{"63":{"position":[[22,9]]},"98":{"position":[[729,15]]},"139":{"position":[[177,7],[194,7]]},"141":{"position":[[115,7],[132,7]]},"142":{"position":[[21,7]]},"150":{"position":[[145,12]]},"162":{"position":[[138,7]]},"177":{"position":[[36,7],[53,7]]}},"relUrl":{}}],["instanc",{"_index":67,"title":{},"content":{"7":{"position":[[58,8]]},"41":{"position":[[54,8]]},"74":{"position":[[58,8]]},"89":{"position":[[41,8]]},"137":{"position":[[58,8]]},"147":{"position":[[58,8]]},"160":{"position":[[58,8]]},"175":{"position":[[54,8]]},"246":{"position":[[46,8]]}},"relUrl":{}}],["instead",{"_index":189,"title":{},"content":{"15":{"position":[[179,7]]}},"relUrl":{}}],["instgrm",{"_index":974,"title":{},"content":{"127":{"position":[[239,7]]}},"relUrl":{}}],["instruct",{"_index":1116,"title":{},"content":{"150":{"position":[[158,12]]}},"relUrl":{}}],["integ",{"_index":1301,"title":{},"content":{"191":{"position":[[403,7],[740,7],[910,7]]},"197":{"position":[[403,7],[902,7],[1072,7]]},"235":{"position":[[403,7],[1015,7],[1185,7]]},"240":{"position":[[106,7],[169,7],[228,7]]},"253":{"position":[[551,7]]},"255":{"position":[[470,7],[704,7],[874,7]]}},"relUrl":{}}],["integr",{"_index":30,"title":{"30":{"position":[[11,11]]},"115":{"position":[[0,12]]},"135":{"position":[[11,11]]},"261":{"position":[[7,11]]}},"content":{"3":{"position":[[8,12]]},"17":{"position":[[47,11],[127,12],[309,11]]},"19":{"position":[[99,11]]},"20":{"position":[[69,12],[166,11]]},"23":{"position":[[65,12]]},"30":{"position":[[35,11],[81,11],[144,12]]},"103":{"position":[[150,9]]},"130":{"position":[[101,11],[174,12]]},"131":{"position":[[15,11]]},"133":{"position":[[20,11]]},"217":{"position":[[346,12]]},"250":{"position":[[93,11],[361,12]]},"251":{"position":[[11,11]]},"252":{"position":[[20,11]]},"253":{"position":[[11,11]]},"254":{"position":[[90,9],[171,13]]},"255":{"position":[[17,12]]},"256":{"position":[[36,12]]}},"relUrl":{"30":{"position":[[23,11]]},"115":{"position":[[0,14]]}}}],["integrations/integromat",{"_index":996,"title":{},"content":{},"relUrl":{"135":{"position":[[0,25]]}}}],["integrations/integromat/#authent",{"_index":994,"title":{},"content":{},"relUrl":{"133":{"position":[[0,40]]}}}],["integrations/integromat/#avail",{"_index":984,"title":{},"content":{},"relUrl":{"131":{"position":[[0,35]]}}}],["integrations/integromat/#exampl",{"_index":993,"title":{},"content":{},"relUrl":{"132":{"position":[[0,33]]}}}],["integrations/integromat/#integromat",{"_index":981,"title":{},"content":{},"relUrl":{"130":{"position":[[0,36]]}}}],["integrations/integromat/#ne",{"_index":995,"title":{},"content":{},"relUrl":{"134":{"position":[[0,30]]}}}],["integrations/zapi",{"_index":1531,"title":{},"content":{},"relUrl":{"254":{"position":[[0,21]]},"261":{"position":[[0,21]]}}}],["integrations/zapier/#429",{"_index":1540,"title":{},"content":{},"relUrl":{"258":{"position":[[0,25]]}}}],["integrations/zapier/#authent",{"_index":1522,"title":{},"content":{},"relUrl":{"252":{"position":[[0,36]]}}}],["integrations/zapier/#avail",{"_index":1521,"title":{},"content":{},"relUrl":{"251":{"position":[[0,31]]}}}],["integrations/zapier/#blank",{"_index":1545,"title":{},"content":{},"relUrl":{"259":{"position":[[0,27]]}}}],["integrations/zapier/#cr",{"_index":1524,"title":{},"content":{},"relUrl":{"253":{"position":[[0,28]]},"255":{"position":[[0,28]]}}}],["integrations/zapier/#design",{"_index":1537,"title":{},"content":{},"relUrl":{"257":{"position":[[0,31]]}}}],["integrations/zapier/#ne",{"_index":1546,"title":{},"content":{},"relUrl":{"260":{"position":[[0,26]]}}}],["integrations/zapier/#troubleshoot",{"_index":1533,"title":{},"content":{},"relUrl":{"256":{"position":[[0,37]]}}}],["integrations/zapier/#zapi",{"_index":1520,"title":{},"content":{},"relUrl":{"250":{"position":[[0,28]]}}}],["integrity=\"sha384",{"_index":902,"title":{},"content":{"102":{"position":[[735,17]]}},"relUrl":{}}],["integromat",{"_index":9,"title":{"3":{"position":[[24,10]]},"20":{"position":[[0,10]]},"30":{"position":[[0,10]]},"130":{"position":[[0,11]]},"135":{"position":[[0,10]]}},"content":{"0":{"position":[[72,11]]},"3":{"position":[[41,11],[124,10]]},"20":{"position":[[58,10],[155,10]]},"30":{"position":[[24,10],[170,11]]},"103":{"position":[[176,11]]},"130":{"position":[[19,10],[90,10],[190,11]]},"131":{"position":[[4,10]]},"132":{"position":[[65,10]]}},"relUrl":{"3":{"position":[[60,10]]}}}],["interact",{"_index":946,"title":{},"content":{"121":{"position":[[46,11]]},"176":{"position":[[41,8]]}},"relUrl":{}}],["intermitt",{"_index":1459,"title":{},"content":{"228":{"position":[[18,12]]}},"relUrl":{}}],["intern",{"_index":1055,"title":{},"content":{"143":{"position":[[111,8]]}},"relUrl":{}}],["introduc",{"_index":283,"title":{"24":{"position":[[0,11]]}},"content":{"24":{"position":[[320,9]]}},"relUrl":{}}],["invent",{"_index":227,"title":{},"content":{"17":{"position":[[193,9]]}},"relUrl":{}}],["investig",{"_index":196,"title":{},"content":{"15":{"position":[[367,11]]}},"relUrl":{}}],["invoic",{"_index":516,"title":{},"content":{"55":{"position":[[175,7]]},"132":{"position":[[177,7]]}},"relUrl":{}}],["io/ioutil",{"_index":618,"title":{},"content":{"76":{"position":[[183,11]]}},"relUrl":{}}],["ioutil.readall(resp.bodi",{"_index":648,"title":{},"content":{"76":{"position":[[939,25]]}},"relUrl":{}}],["iphon",{"_index":501,"title":{},"content":{"53":{"position":[[131,7]]}},"relUrl":{}}],["issu",{"_index":175,"title":{},"content":{"14":{"position":[[95,5]]},"68":{"position":[[101,7]]},"228":{"position":[[31,6]]}},"relUrl":{}}],["it’",{"_index":220,"title":{},"content":{"17":{"position":[[140,4]]},"22":{"position":[[356,4]]},"25":{"position":[[74,4]]},"72":{"position":[[0,4]]},"106":{"position":[[138,5]]},"228":{"position":[[64,4]]},"237":{"position":[[223,4]]}},"relUrl":{}}],["janki",{"_index":866,"title":{},"content":{"101":{"position":[[230,5]]}},"relUrl":{}}],["japanes",{"_index":484,"title":{"63":{"position":[[24,8]]}},"content":{"51":{"position":[[570,8]]}},"relUrl":{"63":{"position":[[29,8]]}}}],["javascript",{"_index":278,"title":{"45":{"position":[[14,10]]},"46":{"position":[[9,10]]},"50":{"position":[[14,10]]},"57":{"position":[[19,11]]},"136":{"position":[[0,11]]},"137":{"position":[[23,10]]},"138":{"position":[[20,10]]},"139":{"position":[[0,10]]},"141":{"position":[[0,10]]},"142":{"position":[[6,10]]},"143":{"position":[[12,10]]},"145":{"position":[[0,10]]},"166":{"position":[[0,10]]}},"content":{"22":{"position":[[266,11]]},"26":{"position":[[181,11]]},"28":{"position":[[186,10]]},"45":{"position":[[102,10]]},"46":{"position":[[11,11],[118,10]]},"51":{"position":[[356,11]]},"57":{"position":[[14,10]]},"80":{"position":[[74,11],[197,10]]},"98":{"position":[[22,11]]},"102":{"position":[[601,10]]},"103":{"position":[[65,10]]},"136":{"position":[[40,11],[140,10],[173,10],[186,10],[212,10],[253,10],[296,10]]},"137":{"position":[[126,10]]},"138":{"position":[[157,10],[294,10]]},"139":{"position":[[5,10],[127,11]]},"165":{"position":[[301,10]]},"167":{"position":[[132,10]]},"168":{"position":[[54,10]]},"191":{"position":[[522,11]]},"197":{"position":[[522,11],[833,10]]},"218":{"position":[[584,11]]},"235":{"position":[[522,11],[833,10]]},"253":{"position":[[670,11]]},"255":{"position":[[589,11]]},"259":{"position":[[216,11]]}},"relUrl":{"45":{"position":[[48,10]]},"46":{"position":[[44,10]]},"57":{"position":[[25,10]]},"137":{"position":[[49,10]]},"138":{"position":[[46,10]]},"142":{"position":[[32,10]]},"143":{"position":[[38,10]]}}}],["job",{"_index":935,"title":{"110":{"position":[[15,3]]}},"content":{"110":{"position":[[21,3]]}},"relUrl":{"110":{"position":[[17,3]]}}}],["jpg",{"_index":51,"title":{},"content":{"6":{"position":[[16,3]]},"31":{"position":[[16,3]]},"70":{"position":[[28,4]]},"71":{"position":[[17,4],[197,3]]},"73":{"position":[[16,3]]},"79":{"position":[[16,3]]},"101":{"position":[[192,3]]},"136":{"position":[[16,3]]},"146":{"position":[[16,3]]},"159":{"position":[[16,3]]},"174":{"position":[[16,3]]},"209":{"position":[[130,3]]},"238":{"position":[[17,4],[275,3]]},"245":{"position":[[16,3]]}},"relUrl":{}}],["jpg’",{"_index":6,"title":{},"content":{"0":{"position":[[31,5]]}},"relUrl":{}}],["js",{"_index":280,"title":{},"content":{"22":{"position":[[322,2]]}},"relUrl":{"45":{"position":[[21,2]]},"46":{"position":[[21,2]]},"47":{"position":[[21,2]]},"48":{"position":[[21,2]]},"49":{"position":[[21,2]]},"50":{"position":[[21,2]]}}}],["json",{"_index":72,"title":{},"content":{"7":{"position":[[178,4]]},"9":{"position":[[243,4]]},"33":{"position":[[22,4]]},"74":{"position":[[182,4]]},"137":{"position":[[186,4]]},"143":{"position":[[174,4]]},"147":{"position":[[179,4]]},"160":{"position":[[182,4]]},"189":{"position":[[82,4]]},"195":{"position":[[80,4]]},"200":{"position":[[89,4],[162,4],[233,4]]},"233":{"position":[[79,4]]},"247":{"position":[[120,4]]}},"relUrl":{}}],["json.marshal(data",{"_index":629,"title":{},"content":{"76":{"position":[[454,18]]}},"relUrl":{}}],["json.parse(d",{"_index":1045,"title":{},"content":{"142":{"position":[[865,13]]}},"relUrl":{}}],["json.parse(imag",{"_index":1029,"title":{},"content":{"141":{"position":[[685,17]]}},"relUrl":{}}],["json.stringifi",{"_index":1033,"title":{},"content":{"142":{"position":[[181,16]]}},"relUrl":{}}],["json.stringify(json",{"_index":1063,"title":{},"content":{"143":{"position":[[383,21]]}},"relUrl":{}}],["json_decode($result,tru",{"_index":1107,"title":{},"content":{"149":{"position":[[1037,26]]}},"relUrl":{}}],["juli",{"_index":256,"title":{},"content":{"21":{"position":[[0,4]]},"22":{"position":[[0,4]]},"23":{"position":[[0,4]]},"24":{"position":[[0,4]]},"25":{"position":[[0,4]]},"26":{"position":[[0,4]]}},"relUrl":{}}],["keep",{"_index":533,"title":{},"content":{"60":{"position":[[52,4]]},"66":{"position":[[435,4]]},"67":{"position":[[13,4]]},"140":{"position":[[74,5]]},"143":{"position":[[141,4]]}},"relUrl":{}}],["key",{"_index":59,"title":{"114":{"position":[[11,3]]}},"content":{"6":{"position":[[101,3]]},"8":{"position":[[100,4],[249,3],[278,3]]},"31":{"position":[[86,3]]},"36":{"position":[[44,3]]},"40":{"position":[[125,3]]},"66":{"position":[[294,4],[312,4]]},"73":{"position":[[105,3]]},"75":{"position":[[100,4],[253,3],[282,3]]},"79":{"position":[[81,3]]},"81":{"position":[[394,3]]},"101":{"position":[[79,3]]},"114":{"position":[[42,4],[97,3]]},"115":{"position":[[87,3]]},"116":{"position":[[100,3]]},"117":{"position":[[79,3]]},"118":{"position":[[95,3]]},"130":{"position":[[124,3]]},"133":{"position":[[87,3],[129,3]]},"136":{"position":[[109,3]]},"138":{"position":[[100,4],[257,3],[286,3]]},"140":{"position":[[89,3]]},"142":{"position":[[509,4]]},"143":{"position":[[155,3],[337,5]]},"146":{"position":[[102,3]]},"148":{"position":[[100,4],[250,3],[279,3]]},"156":{"position":[[80,3]]},"159":{"position":[[105,3]]},"161":{"position":[[100,4],[253,3],[282,3]]},"162":{"position":[[336,4]]},"174":{"position":[[103,3]]},"176":{"position":[[225,3],[333,5]]},"177":{"position":[[149,3]]},"178":{"position":[[54,3]]},"183":{"position":[[69,3]]},"216":{"position":[[73,3]]},"230":{"position":[[56,3]]},"231":{"position":[[102,4],[235,3]]},"245":{"position":[[89,3]]},"250":{"position":[[116,3]]},"252":{"position":[[87,3],[129,3]]}},"relUrl":{"114":{"position":[[13,3]]}}}],["know",{"_index":881,"title":{},"content":{"102":{"position":[[211,5]]}},"relUrl":{}}],["known",{"_index":497,"title":{},"content":{"53":{"position":[[65,5]]}},"relUrl":{}}],["korean",{"_index":485,"title":{"63":{"position":[[37,6]]}},"content":{"51":{"position":[[583,6]]}},"relUrl":{"63":{"position":[[42,6]]}}}],["label",{"_index":800,"title":{},"content":{"98":{"position":[[654,6]]}},"relUrl":{}}],["label.js\"></script>",{"_index":774,"title":{},"content":{"98":{"position":[[224,28]]}},"relUrl":{}}],["lang=\"en",{"_index":1384,"title":{},"content":{"213":{"position":[[177,9]]}},"relUrl":{}}],["lang=\\\"en",{"_index":1351,"title":{},"content":{"202":{"position":[[256,11]]},"204":{"position":[[256,11]]}},"relUrl":{}}],["languag",{"_index":194,"title":{"104":{"position":[[17,8]]}},"content":{"15":{"position":[[270,9]]},"104":{"position":[[14,8],[63,8]]}},"relUrl":{}}],["language/charact",{"_index":542,"title":{},"content":{"63":{"position":[[71,18]]}},"relUrl":{}}],["larg",{"_index":182,"title":{"53":{"position":[[25,5]]},"55":{"position":[[21,5]]}},"content":{"15":{"position":[[40,5]]},"26":{"position":[[143,5]]},"51":{"position":[[171,5],[239,5]]},"56":{"position":[[104,5]]},"191":{"position":[[566,5]]},"197":{"position":[[566,5]]},"225":{"position":[[2,5]]},"235":{"position":[[566,5]]},"253":{"position":[[714,5]]},"255":{"position":[[633,5]]}},"relUrl":{"53":{"position":[[31,5]]},"55":{"position":[[27,5]]}}}],["latenc",{"_index":293,"title":{},"content":{"24":{"position":[[180,7]]},"237":{"position":[[548,8]]}},"relUrl":{}}],["latest",{"_index":586,"title":{},"content":{"67":{"position":[[43,6]]}},"relUrl":{}}],["layout",{"_index":793,"title":{},"content":{"98":{"position":[[548,7],[1262,7]]},"179":{"position":[[295,7]]}},"relUrl":{}}],["learn",{"_index":3,"title":{},"content":{"0":{"position":[[0,5]]},"27":{"position":[[103,5]]},"35":{"position":[[0,5]]},"45":{"position":[[0,5]]},"59":{"position":[[57,5]]},"84":{"position":[[0,5]]},"93":{"position":[[56,5]]},"97":{"position":[[0,5]]},"117":{"position":[[14,5]]},"120":{"position":[[0,5]]},"125":{"position":[[0,5]]},"131":{"position":[[154,5]]},"153":{"position":[[0,5]]},"197":{"position":[[867,5]]},"206":{"position":[[0,5]]},"221":{"position":[[3,5]]},"223":{"position":[[0,5]]},"235":{"position":[[867,5]]}},"relUrl":{}}],["legend",{"_index":792,"title":{},"content":{"98":{"position":[[538,7],[1252,7]]}},"relUrl":{}}],["length",{"_index":1290,"title":{},"content":{"189":{"position":[[387,6],[483,6]]},"195":{"position":[[385,6],[481,6]]}},"relUrl":{}}],["less",{"_index":1131,"title":{},"content":{"150":{"position":[[783,4]]}},"relUrl":{}}],["let",{"_index":1461,"title":{},"content":{"228":{"position":[[224,4]]}},"relUrl":{}}],["lg",{"_index":1300,"title":{},"content":{"191":{"position":[[383,2]]},"197":{"position":[[383,2]]},"218":{"position":[[900,2]]},"220":{"position":[[174,3]]},"235":{"position":[[383,2]]},"255":{"position":[[1188,2]]}},"relUrl":{}}],["librari",{"_index":1031,"title":{"150":{"position":[[24,7]]}},"content":{"142":{"position":[[37,7]]},"146":{"position":[[208,7]]},"150":{"position":[[14,7],[859,7]]}},"relUrl":{"150":{"position":[[43,7]]}}}],["limit",{"_index":474,"title":{"52":{"position":[[16,6]]},"193":{"position":[[7,6]]}},"content":{"51":{"position":[[137,6]]},"52":{"position":[[8,6],[85,6]]},"105":{"position":[[29,6]]},"192":{"position":[[273,5],[339,7]]},"236":{"position":[[253,5]]},"258":{"position":[[64,5]]}},"relUrl":{"52":{"position":[[22,5]]}}}],["line",{"_index":1206,"title":{},"content":{"176":{"position":[[73,4]]}},"relUrl":{}}],["linear",{"_index":1441,"title":{},"content":{"226":{"position":[[681,6]]}},"relUrl":{}}],["link",{"_index":462,"title":{},"content":{"48":{"position":[[299,5]]},"56":{"position":[[15,4]]},"57":{"position":[[42,4]]},"127":{"position":[[299,4]]},"227":{"position":[[116,4]]}},"relUrl":{}}],["list",{"_index":936,"title":{"110":{"position":[[19,7]]},"201":{"position":[[0,7]]},"203":{"position":[[0,7]]}},"content":{"110":{"position":[[25,8]]},"183":{"position":[[360,7],[411,7]]},"194":{"position":[[93,6]]},"198":{"position":[[85,6]]},"201":{"position":[[3,4]]},"203":{"position":[[3,4]]}},"relUrl":{"110":{"position":[[21,7]]}}}],["littl",{"_index":877,"title":{},"content":{"102":{"position":[[168,6]]}},"relUrl":{}}],["live",{"_index":56,"title":{"18":{"position":[[4,4]]}},"content":{"6":{"position":[[80,4]]},"18":{"position":[[36,4]]},"31":{"position":[[65,4]]},"40":{"position":[[104,4]]},"73":{"position":[[84,4]]},"79":{"position":[[60,4]]},"89":{"position":[[36,4]]},"101":{"position":[[58,4]]},"115":{"position":[[66,4]]},"116":{"position":[[79,4]]},"117":{"position":[[58,4]]},"118":{"position":[[74,4]]},"136":{"position":[[88,4]]},"146":{"position":[[81,4]]},"159":{"position":[[84,4]]},"174":{"position":[[82,4]]},"230":{"position":[[35,4]]},"245":{"position":[[68,4]]},"257":{"position":[[156,5]]}},"relUrl":{"18":{"position":[[16,4]]}}}],["load",{"_index":178,"title":{"61":{"position":[[6,4]]}},"content":{"14":{"position":[[128,7]]},"28":{"position":[[222,5]]},"46":{"position":[[31,4]]},"48":{"position":[[8,4]]},"51":{"position":[[491,4]]},"56":{"position":[[52,6]]},"57":{"position":[[79,6]]},"61":{"position":[[74,4]]},"98":{"position":[[34,4]]},"168":{"position":[[234,8]]},"176":{"position":[[427,6]]},"191":{"position":[[134,7],[181,6]]},"197":{"position":[[134,7],[181,6]]},"212":{"position":[[214,4]]},"223":{"position":[[13,4]]},"224":{"position":[[90,6],[159,4],[326,4]]},"227":{"position":[[17,7],[138,6]]},"235":{"position":[[134,7],[181,6]]},"253":{"position":[[452,7],[499,6]]}},"relUrl":{"61":{"position":[[12,4]]}}}],["localhost",{"_index":525,"title":{},"content":{"58":{"position":[[92,9]]}},"relUrl":{}}],["locat",{"_index":292,"title":{},"content":{"24":{"position":[[153,8]]},"37":{"position":[[233,10]]}},"relUrl":{}}],["log",{"_index":619,"title":{},"content":{"76":{"position":[[195,5]]}},"relUrl":{}}],["log.fatalf(\"request",{"_index":643,"title":{},"content":{"76":{"position":[[844,19]]}},"relUrl":{}}],["log.fatalf(\"un",{"_index":631,"title":{},"content":{"76":{"position":[[489,18],[651,18],[981,18]]}},"relUrl":{}}],["logo",{"_index":27,"title":{},"content":{"2":{"position":[[43,4]]}},"relUrl":{}}],["long",{"_index":324,"title":{"60":{"position":[[4,4]]}},"content":{"28":{"position":[[86,4]]},"51":{"position":[[454,4]]},"60":{"position":[[12,4]]},"66":{"position":[[289,4]]},"228":{"position":[[211,4]]},"237":{"position":[[191,4]]}},"relUrl":{"60":{"position":[[10,4]]}}}],["look",{"_index":143,"title":{},"content":{"10":{"position":[[13,7]]},"43":{"position":[[13,7]]},"53":{"position":[[103,5]]},"77":{"position":[[13,7]]},"82":{"position":[[13,7]]},"103":{"position":[[31,4]]},"106":{"position":[[119,4]]},"116":{"position":[[31,4]]},"151":{"position":[[13,7]]},"180":{"position":[[7,4]]},"205":{"position":[[13,7]]},"258":{"position":[[109,4]]}},"relUrl":{}}],["loop",{"_index":374,"title":{},"content":{"35":{"position":[[51,5]]}},"relUrl":{}}],["lossless",{"_index":1484,"title":{},"content":{"237":{"position":[[406,8]]}},"relUrl":{}}],["lot",{"_index":1544,"title":{},"content":{"259":{"position":[[209,3]]}},"relUrl":{}}],["love",{"_index":589,"title":{},"content":{"68":{"position":[[43,4]]},"104":{"position":[[182,4]]}},"relUrl":{}}],["low",{"_index":1400,"title":{},"content":{"218":{"position":[[650,3]]},"228":{"position":[[285,3]]}},"relUrl":{}}],["lower",{"_index":735,"title":{},"content":{"90":{"position":[[185,5]]}},"relUrl":{}}],["lt",{"_index":18,"title":{},"content":{"1":{"position":[[98,5]]},"102":{"position":[[571,5]]},"127":{"position":[[264,5]]}},"relUrl":{}}],["lt;<<eod",{"_index":1081,"title":{},"content":{"149":{"position":[[142,15],[228,15]]}},"relUrl":{}}],["lt;/blockquote>",{"_index":978,"title":{},"content":{"127":{"position":[[391,19]]},"213":{"position":[[298,19]]}},"relUrl":{}}],["lt;/div>",{"_index":120,"title":{},"content":{"9":{"position":[[423,15]]},"32":{"position":[[331,14]]},"76":{"position":[[358,15]]},"86":{"position":[[122,12]]},"88":{"position":[[148,12]]},"102":{"position":[[443,12],[558,12]]},"139":{"position":[[326,15]]},"141":{"position":[[299,15]]},"142":{"position":[[239,15]]},"149":{"position":[[203,12]]},"150":{"position":[[270,15]]},"177":{"position":[[261,14]]},"187":{"position":[[738,12],[853,12]]},"226":{"position":[[300,12],[411,12]]},"247":{"position":[[305,14]]}},"relUrl":{}}],["lt;/h1>",{"_index":1432,"title":{},"content":{"226":{"position":[[397,13]]}},"relUrl":{}}],["lt;/h4>",{"_index":898,"title":{},"content":{"102":{"position":[[491,11]]},"187":{"position":[[784,11]]}},"relUrl":{}}],["lt;/script>",{"_index":855,"title":{},"content":{"98":{"position":[[1338,15]]},"166":{"position":[[366,15]]}},"relUrl":{}}],["lt;/span>",{"_index":887,"title":{},"content":{"102":{"position":[[272,13]]},"187":{"position":[[606,13]]}},"relUrl":{}}],["lt;?php",{"_index":1080,"title":{},"content":{"149":{"position":[[125,8]]},"150":{"position":[[192,8]]}},"relUrl":{}}],["lt;a",{"_index":976,"title":{},"content":{"127":{"position":[[323,5]]},"213":{"position":[[211,5]]}},"relUrl":{}}],["lt;blockquot",{"_index":971,"title":{},"content":{"127":{"position":[[174,14]]},"202":{"position":[[163,15]]},"204":{"position":[[163,15]]},"213":{"position":[[92,14]]}},"relUrl":{}}],["lt;body>",{"_index":701,"title":{},"content":{"85":{"position":[[289,12]]}},"relUrl":{}}],["lt;code>api</code>.</p>",{"_index":1426,"title":{},"content":{"226":{"position":[[260,39]]}},"relUrl":{}}],["lt;div",{"_index":118,"title":{},"content":{"9":{"position":[[393,8]]},"76":{"position":[[328,8]]},"86":{"position":[[0,7]]},"88":{"position":[[0,7]]},"98":{"position":[[253,7]]},"102":{"position":[[61,7],[286,7]]},"139":{"position":[[291,8]]},"141":{"position":[[264,8]]},"142":{"position":[[204,8]]},"143":{"position":[[189,8]]},"149":{"position":[[158,7]]},"150":{"position":[[240,8]]},"162":{"position":[[358,8]]},"177":{"position":[[231,8]]},"187":{"position":[[498,7],[620,7]]},"226":{"position":[[145,7],[313,7]]},"247":{"position":[[275,8]]}},"relUrl":{}}],["lt;div>hello",{"_index":1171,"title":{},"content":{"166":{"position":[[263,17]]}},"relUrl":{}}],["lt;div>your",{"_index":1286,"title":{},"content":{"189":{"position":[[217,16]]},"195":{"position":[[215,16]]},"233":{"position":[[214,16]]},"253":{"position":[[298,16]]}},"relUrl":{}}],["lt;h1>fanci",{"_index":1430,"title":{},"content":{"226":{"position":[[357,15]]}},"relUrl":{}}],["lt;h1>hello",{"_index":1423,"title":{},"content":{"226":{"position":[[169,15]]}},"relUrl":{}}],["lt;h2>height",{"_index":717,"title":{},"content":{"88":{"position":[[102,16]]}},"relUrl":{}}],["lt;h2>hello",{"_index":711,"title":{},"content":{"86":{"position":[[88,16]]}},"relUrl":{}}],["lt;h4",{"_index":895,"title":{},"content":{"102":{"position":[[456,6]]},"187":{"position":[[751,6]]}},"relUrl":{}}],["lt;html>",{"_index":420,"title":{"42":{"position":[[13,12]]}},"content":{"42":{"position":[[104,12]]},"59":{"position":[[195,12]]},"85":{"position":[[272,12]]}},"relUrl":{}}],["lt;htmlcsstoimage::apirespons",{"_index":1218,"title":{},"content":{"176":{"position":[[662,32]]}},"relUrl":{}}],["lt;img",{"_index":22,"title":{},"content":{"1":{"position":[[149,7]]},"2":{"position":[[63,7]]},"61":{"position":[[109,7]]},"102":{"position":[[315,7]]},"187":{"position":[[649,7]]}},"relUrl":{}}],["lt;link",{"_index":447,"title":{},"content":{"47":{"position":[[110,8]]},"102":{"position":[[629,8],[847,8]]}},"relUrl":{}}],["lt;link>",{"_index":524,"title":{},"content":{"58":{"position":[[17,12]]}},"relUrl":{}}],["lt;p",{"_index":1383,"title":{},"content":{"213":{"position":[[171,5]]}},"relUrl":{}}],["lt;p>just",{"_index":1425,"title":{},"content":{"226":{"position":[[203,13]]}},"relUrl":{}}],["lt;script",{"_index":441,"title":{},"content":{"46":{"position":[[135,10]]},"98":{"position":[[87,10],[165,10]]},"127":{"position":[[91,10]]},"202":{"position":[[350,10]]},"204":{"position":[[350,10]]},"213":{"position":[[318,10]]}},"relUrl":{}}],["lt;script>",{"_index":776,"title":{},"content":{"98":{"position":[[292,14]]},"166":{"position":[[300,14]]}},"relUrl":{}}],["lt;span",{"_index":873,"title":{},"content":{"102":{"position":[[123,8],[503,8]]},"187":{"position":[[560,8],[796,8]]}},"relUrl":{}}],["mac",{"_index":948,"title":{},"content":{"121":{"position":[[93,4]]}},"relUrl":{}}],["made",{"_index":1328,"title":{},"content":{"194":{"position":[[34,5]]}},"relUrl":{}}],["main",{"_index":114,"title":{},"content":{"9":{"position":[[355,6]]},"76":{"position":[[139,4],[284,6]]},"247":{"position":[[226,6]]}},"relUrl":{}}],["maintain",{"_index":741,"title":{},"content":{"91":{"position":[[253,8]]},"113":{"position":[[154,8]]}},"relUrl":{}}],["make",{"_index":159,"title":{},"content":{"13":{"position":[[40,6]]},"18":{"position":[[165,5]]},"21":{"position":[[178,6]]},"66":{"position":[[223,5]]},"80":{"position":[[246,4]]},"104":{"position":[[118,4]]},"126":{"position":[[55,4]]},"131":{"position":[[130,4]]},"142":{"position":[[49,6]]},"143":{"position":[[25,4]]},"172":{"position":[[57,5],[145,4]]},"183":{"position":[[30,4]]},"188":{"position":[[24,4]]},"194":{"position":[[40,4]]},"198":{"position":[[31,4]]},"212":{"position":[[44,4],[102,4]]},"232":{"position":[[22,4]]},"253":{"position":[[23,5]]},"254":{"position":[[185,4]]}},"relUrl":{}}],["maker",{"_index":928,"title":{"107":{"position":[[13,6]]}},"content":{"107":{"position":[[79,5]]}},"relUrl":{"107":{"position":[[15,6]]}}}],["mani",{"_index":226,"title":{},"content":{"17":{"position":[[188,4]]},"28":{"position":[[171,4]]},"90":{"position":[[155,4]]},"192":{"position":[[240,4]]},"236":{"position":[[220,4]]}},"relUrl":{}}],["manufactur",{"_index":811,"title":{},"content":{"98":{"position":[[822,16]]}},"relUrl":{}}],["map[string]str",{"_index":626,"title":{},"content":{"76":{"position":[[301,18]]}},"relUrl":{}}],["march",{"_index":318,"title":{},"content":{"27":{"position":[[0,5]]}},"relUrl":{}}],["margin",{"_index":676,"title":{"87":{"position":[[7,7]]}},"content":{"84":{"position":[[118,7]]},"87":{"position":[[0,7],[89,7]]},"88":{"position":[[44,7]]},"172":{"position":[[340,7]]},"226":{"position":[[642,7]]}},"relUrl":{"87":{"position":[[50,7]]}}}],["markup",{"_index":422,"title":{},"content":{"42":{"position":[[67,7]]},"59":{"position":[[158,7]]}},"relUrl":{}}],["marshal",{"_index":632,"title":{},"content":{"76":{"position":[[511,7]]}},"relUrl":{}}],["max",{"_index":1289,"title":{},"content":{"189":{"position":[[383,3],[479,3]]},"195":{"position":[[381,3],[477,3]]}},"relUrl":{}}],["max_wait_m",{"_index":1363,"title":{},"content":{"202":{"position":[[502,14]]},"204":{"position":[[502,14]]}},"relUrl":{}}],["maximum",{"_index":1305,"title":{},"content":{"191":{"position":[[705,8]]},"197":{"position":[[705,8]]},"218":{"position":[[343,7]]},"235":{"position":[[705,8]]},"240":{"position":[[141,7],[203,7]]},"253":{"position":[[853,8]]},"255":{"position":[[441,8]]}},"relUrl":{}}],["maxwidth",{"_index":849,"title":{},"content":{"98":{"position":[[1219,9]]}},"relUrl":{}}],["mb",{"_index":875,"title":{},"content":{"102":{"position":[[150,2]]},"187":{"position":[[587,2]]}},"relUrl":{}}],["mean",{"_index":402,"title":{},"content":{"37":{"position":[[134,5]]},"90":{"position":[[103,6]]},"258":{"position":[[30,5]]},"259":{"position":[[72,5]]}},"relUrl":{}}],["media",{"_index":937,"title":{},"content":{"110":{"position":[[71,6]]},"127":{"position":[[227,6]]}},"relUrl":{}}],["menu",{"_index":965,"title":{},"content":{"126":{"position":[[208,5]]}},"relUrl":{}}],["messag",{"_index":1321,"title":{},"content":{"192":{"position":[[190,10],[309,10]]},"236":{"position":[[170,10],[289,10]]}},"relUrl":{}}],["method",{"_index":667,"title":{},"content":{"81":{"position":[[286,8]]},"142":{"position":[[583,7]]},"143":{"position":[[361,7]]},"176":{"position":[[910,7]]}},"relUrl":{}}],["middl",{"_index":797,"title":{},"content":{"98":{"position":[[599,8]]}},"relUrl":{}}],["million",{"_index":577,"title":{},"content":{"66":{"position":[[382,8]]}},"relUrl":{}}],["millisecond",{"_index":1302,"title":{},"content":{"191":{"position":[[427,12]]},"197":{"position":[[427,12]]},"218":{"position":[[488,12]]},"235":{"position":[[427,12]]},"253":{"position":[[575,12]]},"255":{"position":[[494,12]]}},"relUrl":{}}],["minimum",{"_index":1304,"title":{},"content":{"191":{"position":[[693,8]]},"197":{"position":[[693,8]]},"235":{"position":[[693,8]]},"253":{"position":[[841,8]]},"255":{"position":[[429,8]]}},"relUrl":{}}],["minut",{"_index":1495,"title":{},"content":{"241":{"position":[[300,7]]}},"relUrl":{}}],["miss",{"_index":184,"title":{},"content":{"15":{"position":[[108,7],[303,7]]}},"relUrl":{}}],["mock",{"_index":1536,"title":{},"content":{"257":{"position":[[72,7]]}},"relUrl":{}}],["mode",{"_index":426,"title":{},"content":{"42":{"position":[[154,4]]},"59":{"position":[[248,4]]}},"relUrl":{}}],["modern",{"_index":1054,"title":{},"content":{"143":{"position":[[77,6]]}},"relUrl":{}}],["modifi",{"_index":1195,"title":{},"content":{"172":{"position":[[272,6]]}},"relUrl":{}}],["modul",{"_index":1504,"title":{},"content":{"247":{"position":[[203,6],[820,6]]}},"relUrl":{}}],["monitor",{"_index":502,"title":{},"content":{"53":{"position":[[159,9]]},"90":{"position":[[322,8]]}},"relUrl":{}}],["month",{"_index":579,"title":{},"content":{"66":{"position":[[406,6]]},"258":{"position":[[95,6]]}},"relUrl":{}}],["monthli",{"_index":513,"title":{},"content":{"55":{"position":[[15,7]]}},"relUrl":{}}],["montserrat",{"_index":1448,"title":{},"content":{"226":{"position":[[784,13]]}},"relUrl":{}}],["more",{"_index":74,"title":{},"content":{"7":{"position":[[229,4]]},"13":{"position":[[160,4]]},"15":{"position":[[298,4]]},"27":{"position":[[109,5]]},"32":{"position":[[74,4]]},"41":{"position":[[177,4]]},"66":{"position":[[242,4]]},"74":{"position":[[233,4]]},"104":{"position":[[194,4]]},"137":{"position":[[237,4]]},"147":{"position":[[230,4]]},"150":{"position":[[765,4]]},"160":{"position":[[233,4]]},"175":{"position":[[209,4]]},"197":{"position":[[873,5]]},"235":{"position":[[873,5]]},"246":{"position":[[203,4]]}},"relUrl":{}}],["ms_delay",{"_index":253,"title":{"28":{"position":[[0,8]]}},"content":{"20":{"position":[[108,8]]},"28":{"position":[[38,8]]},"168":{"position":[[262,8]]},"191":{"position":[[392,8]]},"197":{"position":[[392,8]]},"202":{"position":[[523,11]]},"204":{"position":[[523,11]]},"212":{"position":[[161,8]]},"213":{"position":[[504,9]]},"218":{"position":[[463,8]]},"228":{"position":[[178,8]]},"235":{"position":[[392,8]]},"253":{"position":[[540,8]]},"255":{"position":[[459,8]]},"259":{"position":[[257,8]]}},"relUrl":{}}],["mt",{"_index":870,"title":{},"content":{"102":{"position":[[92,2],[419,2]]},"187":{"position":[[529,2],[714,2]]}},"relUrl":{}}],["much",{"_index":239,"title":{"64":{"position":[[4,4]]}},"content":{"18":{"position":[[174,4]]},"51":{"position":[[608,4]]}},"relUrl":{"64":{"position":[[10,4]]}}}],["multipl",{"_index":379,"title":{"36":{"position":[[40,8]]}},"content":{"56":{"position":[[70,8]]},"191":{"position":[[159,8]]},"197":{"position":[[159,8]]},"224":{"position":[[378,8]]},"226":{"position":[[30,8]]},"235":{"position":[[159,8]]},"253":{"position":[[477,8]]}},"relUrl":{"36":{"position":[[75,8]]}}}],["muted\">@dog_rates</span>",{"_index":900,"title":{},"content":{"102":{"position":[[524,33]]}},"relUrl":{}}],["muted\">{{username}}</span>",{"_index":1280,"title":{},"content":{"187":{"position":[[817,35]]}},"relUrl":{}}],["name",{"_index":570,"title":{},"content":{"66":{"position":[[217,5]]},"98":{"position":[[723,5],[816,5],[907,5],[1009,5],[1103,5]]},"187":{"position":[[445,7],[775,8]]},"189":{"position":[[102,4],[328,4],[352,4]]},"190":{"position":[[65,4]]},"191":{"position":[[59,4]]},"195":{"position":[[100,4],[326,4],[350,4]]},"196":{"position":[[65,4]]},"197":{"position":[[59,4]]},"200":{"position":[[182,4]]},"202":{"position":[[541,7]]},"204":{"position":[[541,7]]},"224":{"position":[[209,5]]},"233":{"position":[[99,4]]},"235":{"position":[[59,4]]},"240":{"position":[[65,4]]},"253":{"position":[[183,4]]},"255":{"position":[[132,4]]}},"relUrl":{}}],["namespac",{"_index":108,"title":{},"content":{"9":{"position":[[303,9]]},"66":{"position":[[142,9]]}},"relUrl":{}}],["near",{"_index":1485,"title":{},"content":{"237":{"position":[[522,4]]}},"relUrl":{}}],["need",{"_index":35,"title":{"4":{"position":[[0,4]]},"10":{"position":[[0,4]]},"34":{"position":[[0,4]]},"39":{"position":[[0,4]]},"43":{"position":[[0,4]]},"49":{"position":[[0,4]]},"55":{"position":[[2,4]]},"77":{"position":[[0,4]]},"82":{"position":[[0,4]]},"96":{"position":[[0,4]]},"100":{"position":[[0,4]]},"128":{"position":[[0,4]]},"134":{"position":[[0,4]]},"144":{"position":[[0,4]]},"151":{"position":[[0,4]]},"163":{"position":[[0,4]]},"169":{"position":[[0,4]]},"181":{"position":[[0,4]]},"205":{"position":[[0,4]]},"210":{"position":[[0,4]]},"214":{"position":[[0,4]]},"222":{"position":[[0,4]]},"229":{"position":[[0,4]]},"243":{"position":[[0,4]]},"248":{"position":[[0,4]]},"260":{"position":[[0,4]]}},"content":{"6":{"position":[[180,4]]},"22":{"position":[[333,4]]},"28":{"position":[[202,5]]},"31":{"position":[[135,4]]},"48":{"position":[[197,4]]},"51":{"position":[[220,4]]},"54":{"position":[[146,6]]},"55":{"position":[[46,6],[130,4],[237,4]]},"58":{"position":[[80,4]]},"71":{"position":[[109,4]]},"73":{"position":[[196,4]]},"79":{"position":[[148,4]]},"80":{"position":[[130,4]]},"84":{"position":[[353,4]]},"90":{"position":[[138,4]]},"95":{"position":[[239,5]]},"104":{"position":[[150,4]]},"113":{"position":[[71,4]]},"114":{"position":[[30,4]]},"136":{"position":[[332,4]]},"146":{"position":[[218,4]]},"159":{"position":[[196,4]]},"168":{"position":[[73,4],[152,6]]},"174":{"position":[[253,4]]},"183":{"position":[[470,4]]},"186":{"position":[[140,4]]},"200":{"position":[[151,4]]},"216":{"position":[[216,4]]},"218":{"position":[[603,4]]},"230":{"position":[[268,4]]},"238":{"position":[[109,4]]},"245":{"position":[[144,4]]},"250":{"position":[[302,4]]}},"relUrl":{"55":{"position":[[8,4]]}}}],["net/http",{"_index":620,"title":{},"content":{"76":{"position":[[201,10]]}},"relUrl":{}}],["network",{"_index":316,"title":{},"content":{"26":{"position":[[160,7]]},"64":{"position":[[91,8]]},"237":{"position":[[303,8]]}},"relUrl":{}}],["networkcredential(\"user_id",{"_index":1508,"title":{},"content":{"247":{"position":[[446,28]]}},"relUrl":{}}],["new",{"_index":129,"title":{"18":{"position":[[0,3]]},"23":{"position":[[0,3]]},"25":{"position":[[6,3]]}},"content":{"9":{"position":[[525,3],[773,3]]},"19":{"position":[[59,3]]},"25":{"position":[[32,3]]},"33":{"position":[[56,3]]},"36":{"position":[[135,3]]},"76":{"position":[[680,3]]},"132":{"position":[[190,3]]},"142":{"position":[[674,3]]},"150":{"position":[[358,3]]},"155":{"position":[[32,3]]},"178":{"position":[[179,3],[308,3]]},"226":{"position":[[870,5]]},"247":{"position":[[407,3],[442,3],[552,3]]}},"relUrl":{"25":{"position":[[18,3]]}}}],["next",{"_index":604,"title":{"72":{"position":[[10,4]]}},"content":{"72":{"position":[[49,4]]}},"relUrl":{"72":{"position":[[32,4]]}}}],["next_page_start",{"_index":1368,"title":{},"content":{"202":{"position":[[724,18]]},"204":{"position":[[724,18]]}},"relUrl":{}}],["nice",{"_index":218,"title":{},"content":{"17":{"position":[[102,4]]}},"relUrl":{}}],["nil",{"_index":630,"title":{},"content":{"76":{"position":[[483,3],[645,3],[838,3],[975,3]]},"178":{"position":[[379,4],[398,4]]}},"relUrl":{}}],["nocod",{"_index":912,"title":{},"content":{"103":{"position":[[133,8]]}},"relUrl":{}}],["node.j",{"_index":999,"title":{"142":{"position":[[17,9]]}},"content":{"136":{"position":[[264,9]]}},"relUrl":{}}],["nodej",{"_index":1053,"title":{},"content":{},"relUrl":{"142":{"position":[[43,6]]}}}],["normal",{"_index":440,"title":{},"content":{"46":{"position":[[53,6]]},"227":{"position":[[109,6],[165,6]]}},"relUrl":{}}],["note",{"_index":700,"title":{},"content":{"85":{"position":[[210,5]]}},"relUrl":{}}],["notic",{"_index":195,"title":{},"content":{"15":{"position":[[287,6]]}},"relUrl":{}}],["noto",{"_index":539,"title":{},"content":{"63":{"position":[[13,4]]}},"relUrl":{}}],["novemb",{"_index":341,"title":{},"content":{"30":{"position":[[0,8]]}},"relUrl":{}}],["now",{"_index":204,"title":{},"content":{"16":{"position":[[115,3]]},"18":{"position":[[47,3]]},"20":{"position":[[90,3]]},"21":{"position":[[36,3]]},"24":{"position":[[74,3]]},"25":{"position":[[79,3]]},"29":{"position":[[63,3]]},"30":{"position":[[50,3]]}},"relUrl":{}}],["npm",{"_index":1005,"title":{},"content":{"139":{"position":[[190,3]]},"141":{"position":[[128,3]]}},"relUrl":{}}],["null",{"_index":832,"title":{},"content":{"98":{"position":[[1044,6],[1051,5]]},"202":{"position":[[38,5],[106,5],[149,5],[517,5],[549,5],[576,5],[674,5],[698,4],[743,4]]},"204":{"position":[[38,5],[106,5],[149,5],[517,5],[549,5],[576,5],[674,5],[698,4],[743,4]]}},"relUrl":{}}],["number",{"_index":515,"title":{},"content":{"55":{"position":[[109,6],[216,6]]},"98":{"position":[[511,7]]},"191":{"position":[[417,6]]},"193":{"position":[[113,6]]},"197":{"position":[[417,6]]},"218":{"position":[[478,6],[654,7]]},"225":{"position":[[8,6]]},"235":{"position":[[417,6]]},"253":{"position":[[565,6]]},"255":{"position":[[484,6]]}},"relUrl":{}}],["octob",{"_index":168,"title":{},"content":{"14":{"position":[[0,7]]}},"relUrl":{}}],["og:imag",{"_index":1273,"title":{},"content":{"186":{"position":[[217,8]]}},"relUrl":{}}],["ok",{"_index":1343,"title":{},"content":{"202":{"position":[[12,2]]},"204":{"position":[[12,2]]}},"relUrl":{}}],["on",{"_index":297,"title":{"55":{"position":[[44,3]]}},"content":{"24":{"position":[[291,3]]},"51":{"position":[[262,3]]},"55":{"position":[[166,3]]},"80":{"position":[[43,3]]},"89":{"position":[[78,3]]},"91":{"position":[[219,3]]},"113":{"position":[[120,3]]},"114":{"position":[[64,3]]},"132":{"position":[[4,3]]}},"relUrl":{"55":{"position":[[50,3]]}}}],["on('data",{"_index":1015,"title":{},"content":{"139":{"position":[[675,11]]}},"relUrl":{}}],["onc",{"_index":761,"title":{},"content":{"95":{"position":[[125,4]]},"113":{"position":[[0,4]]},"166":{"position":[[124,4]]},"168":{"position":[[205,4]]},"178":{"position":[[140,5]]}},"relUrl":{}}],["open",{"_index":924,"title":{},"content":{"106":{"position":[[144,4]]},"150":{"position":[[840,4]]}},"relUrl":{}}],["optim",{"_index":1481,"title":{},"content":{"237":{"position":[[253,9],[415,13],[443,9]]}},"relUrl":{}}],["option",{"_index":565,"title":{},"content":{"66":{"position":[[101,6]]},"81":{"position":[[274,7],[543,9]]},"142":{"position":[[520,7]]},"143":{"position":[[349,7],[550,8]]},"150":{"position":[[823,6]]},"190":{"position":[[55,9],[90,9]]},"191":{"position":[[0,8]]},"196":{"position":[[55,9],[90,9]]},"197":{"position":[[0,8]]},"218":{"position":[[73,8]]},"234":{"position":[[63,9]]},"235":{"position":[[0,8]]},"253":{"position":[[114,8],[171,9]]},"255":{"position":[[120,9]]}},"relUrl":{}}],["options.head",{"_index":668,"title":{},"content":{"81":{"position":[[398,15]]}},"relUrl":{}}],["organ",{"_index":308,"title":{},"content":{"25":{"position":[[124,12]]}},"relUrl":{}}],["origin",{"_index":465,"title":{},"content":{"48":{"position":[[408,7]]},"91":{"position":[[286,8]]},"113":{"position":[[187,8]]}},"relUrl":{}}],["osx",{"_index":949,"title":{},"content":{"121":{"position":[[98,3]]}},"relUrl":{}}],["otherwis",{"_index":858,"title":{},"content":{"99":{"position":[[56,10]]}},"relUrl":{}}],["out",{"_index":968,"title":{},"content":{"127":{"position":[[28,3]]},"150":{"position":[[749,3]]},"154":{"position":[[53,3]]},"213":{"position":[[28,3]]},"256":{"position":[[120,4]]}},"relUrl":{}}],["outermost",{"_index":694,"title":{},"content":{"85":{"position":[[96,9]]},"86":{"position":[[216,9]]},"87":{"position":[[109,9]]},"95":{"position":[[320,9]]}},"relUrl":{}}],["outsid",{"_index":430,"title":{},"content":{"42":{"position":[[284,7]]}},"relUrl":{}}],["over",{"_index":271,"title":{},"content":{"22":{"position":[[104,4],[346,4]]},"24":{"position":[[263,4]]},"165":{"position":[[104,4]]},"167":{"position":[[218,4]]},"191":{"position":[[40,4]]},"197":{"position":[[40,4]]},"235":{"position":[[40,4]]}},"relUrl":{}}],["overrid",{"_index":1193,"title":{},"content":{"172":{"position":[[198,8]]},"233":{"position":[[444,8]]},"255":{"position":[[283,8]]}},"relUrl":{}}],["p",{"_index":889,"title":{},"content":{"102":{"position":[[306,1]]},"187":{"position":[[640,1]]},"226":{"position":[[821,1]]}},"relUrl":{}}],["packag",{"_index":615,"title":{},"content":{"76":{"position":[[131,7]]}},"relUrl":{}}],["pad",{"_index":122,"title":{},"content":{"9":{"position":[[459,9]]},"32":{"position":[[364,8]]},"76":{"position":[[390,8]]},"139":{"position":[[382,8]]},"141":{"position":[[355,8]]},"142":{"position":[[295,8]]},"149":{"position":[[278,8]]},"150":{"position":[[302,8]]},"162":{"position":[[466,8]]},"177":{"position":[[291,8]]},"226":{"position":[[627,8],[805,8],[825,8]]},"247":{"position":[[347,9]]}},"relUrl":{}}],["page",{"_index":425,"title":{"112":{"position":[[21,4]]},"220":{"position":[[21,4]]}},"content":{"42":{"position":[[149,4],[181,4],[241,5]]},"59":{"position":[[243,4],[275,4]]},"85":{"position":[[261,5]]},"89":{"position":[[281,5],[543,5]]},"111":{"position":[[59,4]]},"112":{"position":[[56,5]]},"165":{"position":[[258,4]]},"166":{"position":[[208,5]]},"167":{"position":[[97,4],[227,5]]},"216":{"position":[[179,4]]},"218":{"position":[[451,5]]},"220":{"position":[[56,5]]},"235":{"position":[[986,5]]},"237":{"position":[[386,4]]},"259":{"position":[[119,4],[192,5]]}},"relUrl":{"112":{"position":[[23,4]]},"220":{"position":[[52,4]]}}}],["pagespe",{"_index":607,"title":{},"content":{"72":{"position":[[98,9]]}},"relUrl":{}}],["pagin",{"_index":1367,"title":{},"content":{"202":{"position":[[708,13]]},"204":{"position":[[708,13]]}},"relUrl":{}}],["paid",{"_index":552,"title":{},"content":{"64":{"position":[[127,4]]},"72":{"position":[[292,4]]},"193":{"position":[[34,4]]}},"relUrl":{}}],["paper",{"_index":687,"title":{"94":{"position":[[3,5]]}},"content":{"84":{"position":[[309,5]]},"94":{"position":[[48,6]]}},"relUrl":{"94":{"position":[[46,5]]}}}],["param",{"_index":684,"title":{"91":{"position":[[29,6]]},"190":{"position":[[11,6]]},"196":{"position":[[11,6]]},"234":{"position":[[11,6]]}},"content":{"84":{"position":[[249,6]]},"91":{"position":[[97,7],[223,5]]},"112":{"position":[[17,5]]},"113":{"position":[[38,6],[102,7],[124,5]]},"212":{"position":[[133,5]]},"217":{"position":[[80,5]]},"233":{"position":[[462,5]]},"255":{"position":[[301,5]]}},"relUrl":{"91":{"position":[[72,6]]}}}],["paramet",{"_index":251,"title":{"28":{"position":[[9,9]]},"189":{"position":[[0,10]]},"191":{"position":[[11,10]]},"195":{"position":[[0,10]]},"197":{"position":[[11,10]]},"200":{"position":[[0,10]]},"218":{"position":[[11,10]]},"233":{"position":[[0,10]]},"235":{"position":[[11,10]]},"240":{"position":[[6,10]]}},"content":{"20":{"position":[[40,10]]},"22":{"position":[[52,9]]},"28":{"position":[[47,10]]},"38":{"position":[[121,10]]},"81":{"position":[[57,10],[112,10],[173,10]]},"89":{"position":[[429,10]]},"95":{"position":[[302,10]]},"123":{"position":[[29,10]]},"131":{"position":[[174,10]]},"139":{"position":[[843,11]]},"165":{"position":[[69,9],[159,9]]},"168":{"position":[[5,9],[271,9]]},"178":{"position":[[247,10]]},"183":{"position":[[180,10],[204,10],[264,10],[288,10],[343,10]]},"189":{"position":[[51,11]]},"191":{"position":[[9,10],[846,10],[1017,10]]},"195":{"position":[[49,11]]},"197":{"position":[[9,10],[1008,10],[1179,10]]},"200":{"position":[[58,11]]},"213":{"position":[[439,10]]},"216":{"position":[[123,10]]},"218":{"position":[[82,11],[96,9]]},"224":{"position":[[118,9],[187,9]]},"228":{"position":[[187,9]]},"230":{"position":[[103,10],[127,10],[206,10]]},"233":{"position":[[48,11]]},"235":{"position":[[9,10],[1121,10],[1292,10]]},"240":{"position":[[6,10]]},"255":{"position":[[810,10],[981,10]]}},"relUrl":{"28":{"position":[[21,9]]},"191":{"position":[[39,10]]},"197":{"position":[[39,10]]},"218":{"position":[[42,10]]},"235":{"position":[[43,10]]},"240":{"position":[[38,10]]}}}],["part",{"_index":553,"title":{"112":{"position":[[11,4]]},"220":{"position":[[11,4]]}},"content":{"64":{"position":[[141,4]]},"112":{"position":[[46,4]]},"187":{"position":[[102,5]]},"216":{"position":[[169,4]]},"220":{"position":[[44,4]]},"257":{"position":[[55,5]]}},"relUrl":{"112":{"position":[[13,4]]},"220":{"position":[[42,4]]}}}],["partial",{"_index":859,"title":{},"content":{"99":{"position":[[81,7]]}},"relUrl":{}}],["partit",{"_index":574,"title":{},"content":{"66":{"position":[[302,9]]}},"relUrl":{}}],["pass",{"_index":421,"title":{"123":{"position":[[0,7]]}},"content":{"42":{"position":[[48,4]]},"59":{"position":[[13,7],[106,7]]},"71":{"position":[[60,7]]},"81":{"position":[[52,4],[95,7],[164,4]]},"91":{"position":[[232,7]]},"111":{"position":[[0,4],[84,6]]},"113":{"position":[[133,7]]},"179":{"position":[[77,4]]},"186":{"position":[[37,4]]},"217":{"position":[[67,4]]},"220":{"position":[[183,7]]},"226":{"position":[[62,6]]},"233":{"position":[[427,6]]},"238":{"position":[[60,7]]},"255":{"position":[[266,6]]}},"relUrl":{}}],["password",{"_index":90,"title":{},"content":{"8":{"position":[[79,8]]},"75":{"position":[[79,8]]},"81":{"position":[[371,8],[485,11]]},"138":{"position":[[79,8]]},"143":{"position":[[321,8],[502,9]]},"148":{"position":[[79,8]]},"161":{"position":[[79,8]]},"177":{"position":[[202,9]]},"231":{"position":[[81,8],[246,9]]}},"relUrl":{}}],["past",{"_index":461,"title":{},"content":{"48":{"position":[[280,5]]}},"relUrl":{}}],["patch",{"_index":172,"title":{},"content":{"14":{"position":[[32,5]]}},"relUrl":{}}],["path",{"_index":429,"title":{},"content":{"42":{"position":[[271,5],[350,5]]},"142":{"position":[[564,5]]}},"relUrl":{}}],["payload",{"_index":361,"title":{},"content":{"33":{"position":[[27,7]]},"36":{"position":[[355,7]]},"81":{"position":[[305,9]]}},"relUrl":{}}],["pdf",{"_index":155,"title":{},"content":{"13":{"position":[[4,3]]}},"relUrl":{}}],["peopl",{"_index":161,"title":{},"content":{"13":{"position":[[61,6]]},"17":{"position":[[208,6]]},"51":{"position":[[92,6]]},"105":{"position":[[112,6]]}},"relUrl":{}}],["per",{"_index":749,"title":{},"content":{"93":{"position":[[97,3],[186,3]]}},"relUrl":{}}],["perfect",{"_index":862,"title":{},"content":{"101":{"position":[[22,7]]}},"relUrl":{}}],["perfectli",{"_index":192,"title":{},"content":{"15":{"position":[[239,9]]}},"relUrl":{}}],["perform",{"_index":199,"title":{"16":{"position":[[8,11]]},"26":{"position":[[13,11]]}},"content":{"16":{"position":[[65,11]]},"26":{"position":[[40,11]]}},"relUrl":{"16":{"position":[[20,11]]},"26":{"position":[[25,11]]}}}],["period",{"_index":382,"title":{},"content":{"36":{"position":[[106,7]]}},"relUrl":{}}],["perman",{"_index":1480,"title":{},"content":{"237":{"position":[[174,9]]}},"relUrl":{}}],["phenomen",{"_index":882,"title":{},"content":{"102":{"position":[[221,10]]}},"relUrl":{}}],["php",{"_index":908,"title":{"146":{"position":[[0,4]]},"147":{"position":[[23,3]]},"148":{"position":[[20,3]]},"149":{"position":[[0,3]]},"150":{"position":[[0,3]]},"152":{"position":[[0,3]]}},"content":{"103":{"position":[[59,3]]},"146":{"position":[[40,4],[133,3],[159,3],[165,3],[184,3]]},"147":{"position":[[126,3]]},"148":{"position":[[157,3],[287,3]]},"149":{"position":[[5,3],[120,4],[197,3]]}},"relUrl":{"147":{"position":[[42,3]]},"148":{"position":[[39,3]]}}}],["ping",{"_index":121,"title":{},"content":{"9":{"position":[[452,6]]},"76":{"position":[[381,6]]},"150":{"position":[[293,6]]},"177":{"position":[[282,6]]},"247":{"position":[[340,6]]}},"relUrl":{}}],["pip3",{"_index":1148,"title":{},"content":{"162":{"position":[[133,4]]}},"relUrl":{}}],["pixel",{"_index":728,"title":{},"content":{"90":{"position":[[31,5],[160,6]]},"93":{"position":[[77,6],[120,6],[166,6]]},"94":{"position":[[118,6],[160,6]]},"95":{"position":[[77,6],[114,6],[175,7]]},"101":{"position":[[16,5]]},"191":{"position":[[661,5]]},"197":{"position":[[661,5]]},"218":{"position":[[303,5]]},"235":{"position":[[661,5]]},"253":{"position":[[809,5]]},"255":{"position":[[397,5]]}},"relUrl":{}}],["place",{"_index":1178,"title":{},"content":{"167":{"position":[[71,7]]},"185":{"position":[[59,5]]}},"relUrl":{}}],["plain",{"_index":998,"title":{"142":{"position":[[0,5]]}},"content":{"136":{"position":[[247,5]]}},"relUrl":{}}],["plan",{"_index":299,"title":{"55":{"position":[[60,4]]},"193":{"position":[[2,4]]}},"content":{"24":{"position":[[312,4]]},"51":{"position":[[278,4]]},"54":{"position":[[34,5],[123,4]]},"55":{"position":[[23,4]]},"62":{"position":[[20,4]]},"192":{"position":[[267,5],[331,4]]},"193":{"position":[[5,5],[39,5]]},"236":{"position":[[247,5]]},"258":{"position":[[59,4],[169,5]]}},"relUrl":{"55":{"position":[[65,4]]}}}],["pleas",{"_index":146,"title":{},"content":{"10":{"position":[[52,6]]},"13":{"position":[[231,6]]},"15":{"position":[[323,6]]},"25":{"position":[[157,6]]},"39":{"position":[[17,6]]},"43":{"position":[[52,6]]},"49":{"position":[[17,6]]},"51":{"position":[[30,6]]},"55":{"position":[[53,6]]},"63":{"position":[[126,6]]},"77":{"position":[[52,6]]},"82":{"position":[[52,6]]},"100":{"position":[[17,6]]},"128":{"position":[[17,6]]},"144":{"position":[[17,6]]},"151":{"position":[[52,6]]},"163":{"position":[[17,6]]},"169":{"position":[[17,6]]},"181":{"position":[[17,6]]},"205":{"position":[[52,6]]},"214":{"position":[[17,6]]},"229":{"position":[[17,6]]},"243":{"position":[[17,6]]},"248":{"position":[[17,6]]},"256":{"position":[[49,6]]},"260":{"position":[[17,6]]}},"relUrl":{}}],["plotopt",{"_index":798,"title":{},"content":{"98":{"position":[[611,12]]}},"relUrl":{}}],["plugin",{"_index":211,"title":{"17":{"position":[[7,6]]}},"content":{},"relUrl":{"17":{"position":[[19,6]]}}}],["png",{"_index":50,"title":{"102":{"position":[[21,3]]},"239":{"position":[[2,3]]}},"content":{"6":{"position":[[11,4]]},"31":{"position":[[11,4]]},"70":{"position":[[33,3]]},"71":{"position":[[22,3],[86,3],[275,3]]},"73":{"position":[[11,4]]},"79":{"position":[[11,4]]},"101":{"position":[[187,4]]},"136":{"position":[[11,4]]},"146":{"position":[[11,4]]},"159":{"position":[[11,4]]},"174":{"position":[[11,4]]},"209":{"position":[[38,3]]},"238":{"position":[[22,3],[86,3],[197,3]]},"239":{"position":[[16,3],[65,3]]},"245":{"position":[[11,4]]}},"relUrl":{"102":{"position":[[23,3]]}}}],["png'",{"_index":1375,"title":{"209":{"position":[[13,5]]}},"content":{},"relUrl":{}}],["png’",{"_index":5,"title":{},"content":{"0":{"position":[[22,5]]},"209":{"position":[[94,6]]}},"relUrl":{}}],["pointstart",{"_index":802,"title":{},"content":{"98":{"position":[[690,11]]}},"relUrl":{}}],["popular",{"_index":223,"title":{},"content":{"17":{"position":[[157,7]]}},"relUrl":{}}],["port",{"_index":1035,"title":{},"content":{"142":{"position":[[553,5]]}},"relUrl":{}}],["possibl",{"_index":1460,"title":{},"content":{"228":{"position":[[69,8]]}},"relUrl":{}}],["post",{"_index":100,"title":{"125":{"position":[[21,4]]}},"content":{"9":{"position":[[35,4],[175,5],[765,7]]},"12":{"position":[[51,6]]},"17":{"position":[[112,4]]},"32":{"position":[[243,4]]},"76":{"position":[[39,4]]},"81":{"position":[[73,4],[297,7]]},"125":{"position":[[64,5]]},"126":{"position":[[41,5],[152,4]]},"127":{"position":[[67,4],[311,4]]},"139":{"position":[[43,4],[481,4]]},"141":{"position":[[454,4],[592,7]]},"142":{"position":[[591,7]]},"143":{"position":[[38,4],[369,7]]},"149":{"position":[[36,4]]},"155":{"position":[[36,4]]},"162":{"position":[[39,4]]},"186":{"position":[[148,4]]},"188":{"position":[[57,4]]},"194":{"position":[[124,4]]},"198":{"position":[[116,4]]},"199":{"position":[[224,5]]},"217":{"position":[[199,4]]},"232":{"position":[[55,4]]},"247":{"position":[[52,5],[544,7]]}},"relUrl":{"125":{"position":[[46,4]]}}}],["postman",{"_index":1134,"title":{"153":{"position":[[0,8]]},"154":{"position":[[0,7]]}},"content":{"153":{"position":[[52,7]]},"154":{"position":[[0,7],[73,7]]}},"relUrl":{}}],["power",{"_index":1525,"title":{},"content":{"254":{"position":[[29,5]]}},"relUrl":{}}],["pre",{"_index":986,"title":{},"content":{"132":{"position":[[15,3]]}},"relUrl":{}}],["prefer",{"_index":911,"title":{},"content":{"103":{"position":[[126,6]]},"142":{"position":[[7,6]]}},"relUrl":{}}],["press",{"_index":953,"title":{},"content":{"123":{"position":[[57,5]]},"158":{"position":[[0,5]]}},"relUrl":{}}],["preview",{"_index":235,"title":{},"content":{"18":{"position":[[59,7]]}},"relUrl":{}}],["previou",{"_index":1526,"title":{},"content":{"254":{"position":[[66,8]]}},"relUrl":{}}],["previous",{"_index":183,"title":{},"content":{"15":{"position":[[88,11]]}},"relUrl":{}}],["print",{"_index":685,"title":{"93":{"position":[[21,5]]}},"content":{"84":{"position":[[296,5]]},"93":{"position":[[49,6],[215,6]]},"94":{"position":[[14,5]]}},"relUrl":{"93":{"position":[[64,5]]}}}],["print(\"your",{"_index":1158,"title":{},"content":{"162":{"position":[[631,11]]}},"relUrl":{}}],["pro",{"_index":480,"title":{"58":{"position":[[30,3]]}},"content":{"51":{"position":[[400,3]]}},"relUrl":{"58":{"position":[[36,3]]}}}],["problem",{"_index":592,"title":{},"content":{"68":{"position":[[131,9]]}},"relUrl":{}}],["product",{"_index":926,"title":{"107":{"position":[[0,7]]}},"content":{"107":{"position":[[2,7]]}},"relUrl":{"107":{"position":[[0,9]]}}}],["program",{"_index":111,"title":{},"content":{"9":{"position":[[333,7]]}},"relUrl":{}}],["project",{"_index":830,"title":{},"content":{"98":{"position":[[1015,8]]},"150":{"position":[[875,8]]}},"relUrl":{}}],["promis",{"_index":1027,"title":{},"content":{"141":{"position":[[99,7],[148,8],[209,9]]}},"relUrl":{}}],["promise.reject(res.statu",{"_index":1069,"title":{},"content":{"143":{"position":[[626,27]]}},"relUrl":{}}],["proper",{"_index":455,"title":{},"content":{"48":{"position":[[202,6]]}},"relUrl":{}}],["properli",{"_index":1379,"title":{},"content":{"212":{"position":[[235,8]]}},"relUrl":{}}],["protect",{"_index":371,"title":{},"content":{"35":{"position":[[13,7]]},"36":{"position":[[225,8]]}},"relUrl":{}}],["prototyp",{"_index":240,"title":{},"content":{"18":{"position":[[189,9]]}},"relUrl":{}}],["provid",{"_index":476,"title":{"54":{"position":[[8,7]]}},"content":{"51":{"position":[[200,7]]}},"relUrl":{"54":{"position":[[14,7]]}}}],["public",{"_index":1470,"title":{},"content":{"233":{"position":[[370,6]]},"247":{"position":[[196,6]]},"255":{"position":[[209,6]]}},"relUrl":{}}],["python",{"_index":909,"title":{"159":{"position":[[0,7]]},"160":{"position":[[23,6]]},"161":{"position":[[20,6]]},"162":{"position":[[0,6]]},"164":{"position":[[0,6]]}},"content":{"103":{"position":[[85,6]]},"159":{"position":[[40,7],[136,6],[165,6],[174,6]]},"160":{"position":[[126,6]]},"161":{"position":[[157,6],[290,6]]},"162":{"position":[[5,6],[123,7]]}},"relUrl":{"160":{"position":[[45,6]]},"161":{"position":[[42,6]]}}}],["qualifi",{"_index":1469,"title":{},"content":{"233":{"position":[[351,9]]},"255":{"position":[[190,9]]}},"relUrl":{}}],["qualiti",{"_index":731,"title":{},"content":{"90":{"position":[[52,7],[279,7]]},"93":{"position":[[207,7]]},"101":{"position":[[113,7]]},"237":{"position":[[477,8]]}},"relUrl":{}}],["queri",{"_index":683,"title":{"91":{"position":[[23,5]]},"240":{"position":[[0,5]]}},"content":{"84":{"position":[[243,5]]},"91":{"position":[[91,5]]},"113":{"position":[[32,5]]},"230":{"position":[[200,5]]},"240":{"position":[[0,5]]}},"relUrl":{"91":{"position":[[66,5]]}}}],["question",{"_index":409,"title":{"51":{"position":[[17,9]]},"68":{"position":[[13,10]]}},"content":{"39":{"position":[[69,9]]},"49":{"position":[[69,9]]},"51":{"position":[[765,10]]},"100":{"position":[[69,9]]},"128":{"position":[[69,9]]},"144":{"position":[[69,9]]},"163":{"position":[[69,9]]},"169":{"position":[[69,9]]},"181":{"position":[[69,9]]},"214":{"position":[[69,9]]},"229":{"position":[[69,9]]},"243":{"position":[[69,9]]},"248":{"position":[[69,9]]},"260":{"position":[[69,9]]}},"relUrl":{"51":{"position":[[23,9]]},"68":{"position":[[19,9]]}}}],["quick",{"_index":907,"title":{"103":{"position":[[0,5]]}},"content":{},"relUrl":{"103":{"position":[[0,7]]}}}],["quickli",{"_index":224,"title":{},"content":{"17":{"position":[[165,7]]},"103":{"position":[[15,8]]},"116":{"position":[[15,8]]},"132":{"position":[[52,7]]}},"relUrl":{}}],["quota",{"_index":372,"title":{},"content":{"35":{"position":[[32,5]]},"36":{"position":[[276,5]]}},"relUrl":{}}],["rail",{"_index":1203,"title":{"178":{"position":[[8,5]]},"179":{"position":[[12,5]]}},"content":{"174":{"position":[[193,5],[236,5]]},"178":{"position":[[18,5]]},"179":{"position":[[67,5]]}},"relUrl":{"178":{"position":[[28,5]]},"179":{"position":[[32,5]]}}}],["rails.cache.read(cache_key",{"_index":1243,"title":{},"content":{"178":{"position":[[474,27]]}},"relUrl":{}}],["rails.cache.write(cache_key",{"_index":1247,"title":{},"content":{"178":{"position":[[667,28]]}},"relUrl":{}}],["randomli",{"_index":562,"title":{},"content":{"66":{"position":[[33,8]]}},"relUrl":{}}],["rate",{"_index":473,"title":{"52":{"position":[[11,4]]}},"content":{"51":{"position":[[132,4]]},"52":{"position":[[3,4]]}},"relUrl":{"52":{"position":[[17,4]]}}}],["ratio",{"_index":729,"title":{},"content":{"90":{"position":[[37,7]]},"91":{"position":[[273,5]]},"113":{"position":[[174,5]]},"191":{"position":[[667,5]]},"197":{"position":[[667,5]]},"218":{"position":[[309,5]]},"235":{"position":[[667,5]]},"253":{"position":[[815,5]]},"255":{"position":[[403,5]]}},"relUrl":{}}],["re",{"_index":258,"title":{},"content":{"21":{"position":[[82,2]]},"142":{"position":[[765,5]]},"149":{"position":[[1030,4]]},"150":{"position":[[461,4],[631,4]]},"183":{"position":[[7,2]]}},"relUrl":{}}],["reach",{"_index":491,"title":{},"content":{"52":{"position":[[66,5]]}},"relUrl":{}}],["read",{"_index":649,"title":{},"content":{"76":{"position":[[1003,4]]}},"relUrl":{}}],["readabl",{"_index":1130,"title":{},"content":{"150":{"position":[[770,8]]}},"relUrl":{}}],["readi",{"_index":265,"title":{"22":{"position":[[12,5]]},"165":{"position":[[12,5]]}},"content":{"22":{"position":[[361,5]]}},"relUrl":{"22":{"position":[[24,5]]},"165":{"position":[[20,6]]}}}],["ready/#javascript",{"_index":1177,"title":{},"content":{},"relUrl":{"166":{"position":[[20,17]]}}}],["ready/#ne",{"_index":1182,"title":{},"content":{},"relUrl":{"169":{"position":[[20,11]]}}}],["ready/#us",{"_index":1180,"title":{},"content":{},"relUrl":{"167":{"position":[[20,12]]}}}],["ready/#when",{"_index":1181,"title":{},"content":{},"relUrl":{"168":{"position":[[20,11]]}}}],["real",{"_index":66,"title":{"180":{"position":[[2,4]]}},"content":{"7":{"position":[[53,4]]},"41":{"position":[[49,4]]},"74":{"position":[[53,4]]},"137":{"position":[[53,4]]},"147":{"position":[[53,4]]},"160":{"position":[[53,4]]},"175":{"position":[[49,4]]}},"relUrl":{}}],["rebuilt",{"_index":234,"title":{},"content":{"18":{"position":[[24,7]]}},"relUrl":{}}],["receiv",{"_index":1538,"title":{},"content":{"258":{"position":[[7,7]]}},"relUrl":{}}],["recent",{"_index":1334,"title":{},"content":{"199":{"position":[[85,6]]}},"relUrl":{}}],["recommend",{"_index":528,"title":{},"content":{"59":{"position":[[3,9]]},"72":{"position":[[5,9]]},"89":{"position":[[472,9]]},"95":{"position":[[248,9]]},"140":{"position":[[3,9]]},"141":{"position":[[38,9]]},"143":{"position":[[95,11]]},"191":{"position":[[537,9]]},"197":{"position":[[537,9]]},"218":{"position":[[624,9]]},"221":{"position":[[33,9]]},"235":{"position":[[537,9]]},"253":{"position":[[685,9]]},"255":{"position":[[604,9]]}},"relUrl":{}}],["red",{"_index":1217,"title":{},"content":{"176":{"position":[[596,4]]}},"relUrl":{}}],["redirect",{"_index":1251,"title":{},"content":{"179":{"position":[[206,9]]}},"relUrl":{}}],["redirect_to",{"_index":1253,"title":{},"content":{"179":{"position":[[310,11]]}},"relUrl":{}}],["reduc",{"_index":1486,"title":{},"content":{"237":{"position":[[541,6]]}},"relUrl":{}}],["referenc",{"_index":1421,"title":{},"content":{"226":{"position":[[110,10]]}},"relUrl":{}}],["region",{"_index":285,"title":{"24":{"position":[[24,6]]}},"content":{"24":{"position":[[43,7],[281,6],[336,6]]}},"relUrl":{"24":{"position":[[36,6]]}}}],["regularli",{"_index":584,"title":{},"content":{"67":{"position":[[3,9]]}},"relUrl":{}}],["rel",{"_index":431,"title":{},"content":{"42":{"position":[[341,8]]},"45":{"position":[[254,8]]}},"relUrl":{}}],["rel=\"stylesheet",{"_index":448,"title":{},"content":{"47":{"position":[[119,16]]},"102":{"position":[[718,16]]}},"relUrl":{}}],["rel=\"stylesheet\">",{"_index":906,"title":{},"content":{"102":{"position":[[936,20]]}},"relUrl":{}}],["releas",{"_index":171,"title":{"16":{"position":[[33,8]]},"17":{"position":[[14,8]]},"19":{"position":[[12,8]]}},"content":{"14":{"position":[[21,8]]},"15":{"position":[[29,8]]},"19":{"position":[[25,8]]},"25":{"position":[[21,8]]}},"relUrl":{"16":{"position":[[45,8]]},"17":{"position":[[26,8]]},"19":{"position":[[24,8]]}}}],["reli",{"_index":398,"title":{},"content":{"37":{"position":[[27,6]]}},"relUrl":{}}],["reliabl",{"_index":295,"title":{},"content":{"24":{"position":[[212,11]]},"26":{"position":[[97,11]]},"228":{"position":[[359,9]]}},"relUrl":{}}],["remot",{"_index":930,"title":{"108":{"position":[[0,6]]}},"content":{},"relUrl":{"108":{"position":[[0,8]]}}}],["remov",{"_index":336,"title":{},"content":{"29":{"position":[[109,7]]},"241":{"position":[[137,6]]}},"relUrl":{}}],["render",{"_index":12,"title":{"14":{"position":[[5,9]]},"15":{"position":[[5,9]]},"22":{"position":[[0,6]]},"59":{"position":[[9,6]]},"165":{"position":[[0,6]]},"170":{"position":[[0,9]]},"173":{"position":[[0,9]]},"179":{"position":[[0,9]]},"225":{"position":[[12,9]]}},"content":{"1":{"position":[[3,6]]},"6":{"position":[[44,7]]},"15":{"position":[[249,6]]},"16":{"position":[[103,7]]},"22":{"position":[[127,9]]},"28":{"position":[[104,8]]},"40":{"position":[[68,7]]},"42":{"position":[[3,6],[163,6],[224,9]]},"51":{"position":[[422,6]]},"53":{"position":[[14,6]]},"56":{"position":[[62,7],[138,6]]},"57":{"position":[[89,7]]},"58":{"position":[[136,6]]},"59":{"position":[[257,6]]},"63":{"position":[[45,9],[108,6]]},"67":{"position":[[111,6]]},"68":{"position":[[91,9]]},"73":{"position":[[48,7]]},"89":{"position":[[5,9],[149,8],[314,8],[504,8]]},"90":{"position":[[215,6]]},"95":{"position":[[213,6]]},"99":{"position":[[34,9],[89,6]]},"105":{"position":[[39,6]]},"130":{"position":[[54,7]]},"136":{"position":[[52,7]]},"146":{"position":[[45,7]]},"159":{"position":[[48,7]]},"165":{"position":[[37,9]]},"167":{"position":[[45,9]]},"170":{"position":[[6,9]]},"171":{"position":[[72,10]]},"172":{"position":[[44,7]]},"174":{"position":[[46,7],[224,9]]},"179":{"position":[[48,6]]},"189":{"position":[[180,7]]},"191":{"position":[[601,6]]},"195":{"position":[[178,7]]},"197":{"position":[[601,6]]},"207":{"position":[[3,6]]},"209":{"position":[[82,8],[108,6]]},"218":{"position":[[734,7]]},"224":{"position":[[305,7]]},"225":{"position":[[53,6]]},"226":{"position":[[15,8]]},"227":{"position":[[151,6]]},"228":{"position":[[53,10],[102,8],[238,6]]},"233":{"position":[[177,7]]},"235":{"position":[[601,6]]},"236":{"position":[[331,8]]},"250":{"position":[[50,7]]},"253":{"position":[[261,7],[749,6]]},"255":{"position":[[668,6]]},"259":{"position":[[136,6]]}},"relUrl":{"14":{"position":[[17,9]]},"15":{"position":[[17,9]]},"59":{"position":[[15,6]]}}}],["render_to_str",{"_index":1250,"title":{},"content":{"179":{"position":[[101,16]]}},"relUrl":{}}],["render_to_string(\"path/to/view",{"_index":1252,"title":{},"content":{"179":{"position":[[246,32]]}},"relUrl":{}}],["render_when_readi",{"_index":267,"title":{},"content":{"22":{"position":[[34,17],[148,17]]},"165":{"position":[[51,17]]},"197":{"position":[[723,17]]},"202":{"position":[[555,20]]},"204":{"position":[[555,20]]},"235":{"position":[[723,17]]}},"relUrl":{}}],["repeatedli",{"_index":380,"title":{},"content":{"36":{"position":[[75,10]]}},"relUrl":{}}],["replac",{"_index":262,"title":{},"content":{"21":{"position":[[145,8]]},"32":{"position":[[131,7]]},"46":{"position":[[85,7]]},"47":{"position":[[66,7]]},"81":{"position":[[332,7]]},"127":{"position":[[272,7]]},"171":{"position":[[26,8]]},"185":{"position":[[109,8]]},"187":{"position":[[94,7]]}},"relUrl":{}}],["req",{"_index":635,"title":{},"content":{"76":{"position":[[545,4]]},"142":{"position":[[736,3]]}},"relUrl":{}}],["req.end",{"_index":1051,"title":{},"content":{"142":{"position":[[983,9]]}},"relUrl":{}}],["req.on('error",{"_index":1047,"title":{},"content":{"142":{"position":[[911,15]]}},"relUrl":{}}],["req.setbasicauth(userid",{"_index":638,"title":{},"content":{"76":{"position":[[713,24]]}},"relUrl":{}}],["req.write(data",{"_index":1050,"title":{},"content":{"142":{"position":[[967,15]]}},"relUrl":{}}],["reqbodi",{"_index":627,"title":{},"content":{"76":{"position":[[438,8]]}},"relUrl":{}}],["request",{"_index":95,"title":{},"content":{"8":{"position":[[210,8]]},"13":{"position":[[221,9]]},"24":{"position":[[60,8],[192,8]]},"26":{"position":[[168,8]]},"29":{"position":[[135,8]]},"75":{"position":[[214,8]]},"76":{"position":[[684,8]]},"81":{"position":[[78,8]]},"104":{"position":[[125,8]]},"123":{"position":[[48,8]]},"138":{"position":[[218,8]]},"139":{"position":[[161,7],[202,8],[217,7]]},"141":{"position":[[91,7],[140,7],[182,7],[584,7]]},"142":{"position":[[60,8]]},"143":{"position":[[43,7]]},"148":{"position":[[211,8]]},"155":{"position":[[41,7]]},"161":{"position":[[214,8]]},"162":{"position":[[146,8],[162,8]]},"186":{"position":[[128,7]]},"188":{"position":[[37,7]]},"192":{"position":[[135,7],[161,9],[245,8]]},"194":{"position":[[53,7]]},"198":{"position":[[44,7]]},"231":{"position":[[209,8]]},"232":{"position":[[35,7]]},"236":{"position":[[115,7],[141,9],[225,8]]},"241":{"position":[[100,7]]}},"relUrl":{}}],["request.post",{"_index":1012,"title":{},"content":{"139":{"position":[[591,14]]}},"relUrl":{}}],["requests.post(url",{"_index":1156,"title":{},"content":{"162":{"position":[[540,17]]}},"relUrl":{}}],["requir",{"_index":865,"title":{"190":{"position":[[2,8]]},"196":{"position":[[2,8]]},"234":{"position":[[2,8]]}},"content":{"101":{"position":[[158,9]]},"150":{"position":[[201,7]]},"176":{"position":[[168,7]]},"177":{"position":[[98,7]]},"178":{"position":[[323,7]]},"190":{"position":[[33,8]]},"192":{"position":[[210,9]]},"196":{"position":[[33,8]]},"201":{"position":[[76,9]]},"203":{"position":[[94,9]]},"234":{"position":[[46,9]]},"236":{"position":[[190,9]]},"253":{"position":[[142,8]]},"255":{"position":[[85,8]]}},"relUrl":{}}],["require('http",{"_index":1032,"title":{},"content":{"142":{"position":[[151,16]]}},"relUrl":{}}],["require('request",{"_index":1006,"title":{},"content":{"139":{"position":[[227,18]]},"141":{"position":[[157,18],[192,16]]}},"relUrl":{}}],["res.json",{"_index":1068,"title":{},"content":{"143":{"position":[[598,11]]}},"relUrl":{}}],["res.ok",{"_index":1067,"title":{},"content":{"143":{"position":[[580,8]]}},"relUrl":{}}],["res.on('data",{"_index":1044,"title":{},"content":{"142":{"position":[[824,14]]}},"relUrl":{}}],["res.statuscod",{"_index":1043,"title":{},"content":{"142":{"position":[[804,19]]}},"relUrl":{}}],["res['url",{"_index":1108,"title":{},"content":{"149":{"position":[[1069,12]]}},"relUrl":{}}],["resiz",{"_index":681,"title":{"91":{"position":[[0,6]]},"113":{"position":[[0,6]]}},"content":{"84":{"position":[[220,6]]}},"relUrl":{"113":{"position":[[0,8]]}}}],["resolut",{"_index":495,"title":{"90":{"position":[[19,10]]}},"content":{"53":{"position":[[37,10],[148,10]]},"84":{"position":[[191,10]]},"90":{"position":[[191,10],[423,10]]},"91":{"position":[[157,11]]},"216":{"position":[[9,10]]},"219":{"position":[[78,10]]}},"relUrl":{"90":{"position":[[62,10]]}}}],["resp",{"_index":641,"title":{},"content":{"76":{"position":[[800,5]]}},"relUrl":{}}],["resp.body.clos",{"_index":646,"title":{},"content":{"76":{"position":[[908,17]]}},"relUrl":{}}],["respect",{"_index":714,"title":{},"content":{"87":{"position":[[12,9]]}},"relUrl":{}}],["respond",{"_index":41,"title":{},"content":{"4":{"position":[[55,7]]},"10":{"position":[[108,7]]},"34":{"position":[[55,7]]},"43":{"position":[[108,7]]},"77":{"position":[[108,7]]},"82":{"position":[[108,7]]},"96":{"position":[[55,7]]},"134":{"position":[[55,7]]},"151":{"position":[[108,7]]},"205":{"position":[[108,7]]},"210":{"position":[[55,7]]}},"relUrl":{}}],["respons",{"_index":78,"title":{"33":{"position":[[0,8]]},"192":{"position":[[8,9]]},"202":{"position":[[8,9]]},"204":{"position":[[8,9]]},"236":{"position":[[8,9]]},"242":{"position":[[8,8]]}},"content":{"7":{"position":[[296,9]]},"9":{"position":[[226,8]]},"31":{"position":[[124,8]]},"74":{"position":[[300,9]]},"76":{"position":[[1008,8]]},"98":{"position":[[1182,11]]},"137":{"position":[[304,9]]},"147":{"position":[[297,9]]},"160":{"position":[[300,9]]},"183":{"position":[[225,9],[395,9],[454,9]]},"194":{"position":[[114,9]]},"198":{"position":[[106,9]]},"230":{"position":[[148,9],[253,8]]},"247":{"position":[[103,8]]}},"relUrl":{"192":{"position":[[36,9]]},"202":{"position":[[36,9]]},"204":{"position":[[36,9]]},"236":{"position":[[40,9]]},"242":{"position":[[40,8]]}}}],["rest",{"_index":956,"title":{"124":{"position":[[9,4]]}},"content":{"253":{"position":[[162,4]]},"255":{"position":[[111,4]]}},"relUrl":{}}],["result",{"_index":116,"title":{},"content":{"9":{"position":[[371,7],[707,6]]},"90":{"position":[[261,7],[373,9]]},"149":{"position":[[928,7]]},"247":{"position":[[237,6],[486,6]]}},"relUrl":{}}],["resultstr",{"_index":134,"title":{},"content":{"9":{"position":[[879,12]]},"247":{"position":[[644,12]]}},"relUrl":{}}],["retina",{"_index":680,"title":{"90":{"position":[[30,8]]}},"content":{"84":{"position":[[202,8]]}},"relUrl":{"90":{"position":[[73,6]]}}}],["retriev",{"_index":940,"title":{},"content":{"114":{"position":[[55,8]]},"133":{"position":[[57,8]]},"139":{"position":[[501,8]]},"141":{"position":[[474,8]]},"142":{"position":[[366,8]]},"149":{"position":[[656,8]]},"150":{"position":[[385,8]]},"162":{"position":[[220,8]]},"176":{"position":[[195,8]]},"177":{"position":[[119,8]]},"252":{"position":[[57,8]]}},"relUrl":{}}],["return",{"_index":338,"title":{},"content":{"29":{"position":[[166,6]]},"33":{"position":[[13,6]]},"143":{"position":[[591,6],[619,6]]},"178":{"position":[[263,6],[502,6]]},"237":{"position":[[41,8]]},"239":{"position":[[8,7]]}},"relUrl":{}}],["reusabl",{"_index":1272,"title":{},"content":{"186":{"position":[[13,8]]}},"relUrl":{}}],["rgba(0",{"_index":1435,"title":{},"content":{"226":{"position":[[488,7],[521,7]]}},"relUrl":{}}],["right",{"_index":795,"title":{},"content":{"98":{"position":[[575,8]]},"126":{"position":[[192,5]]}},"relUrl":{}}],["roboto",{"_index":1010,"title":{},"content":{"139":{"position":[[410,9],[438,8]]},"141":{"position":[[383,9],[411,8]]},"142":{"position":[[323,9],[351,8]]},"149":{"position":[[306,9],[339,9]]},"162":{"position":[[494,6],[521,8]]},"176":{"position":[[614,7],[640,9]]},"191":{"position":[[151,7]]},"197":{"position":[[151,7]]},"224":{"position":[[291,10]]},"226":{"position":[[555,9]]},"235":{"position":[[151,7]]},"253":{"position":[[469,7]]}},"relUrl":{}}],["roboto|open",{"_index":1297,"title":{},"content":{"191":{"position":[[199,11]]},"197":{"position":[[199,11]]},"235":{"position":[[199,11]]},"253":{"position":[[517,11]]}},"relUrl":{}}],["roboto|roboto+condens",{"_index":1255,"title":{},"content":{"179":{"position":[[358,27]]}},"relUrl":{}}],["rout",{"_index":288,"title":{},"content":{"24":{"position":[[95,6]]}},"relUrl":{}}],["row",{"_index":990,"title":{},"content":{"132":{"position":[[208,4]]}},"relUrl":{}}],["rubi",{"_index":173,"title":{"19":{"position":[[0,4]]},"174":{"position":[[0,5]]},"175":{"position":[[23,4]]},"176":{"position":[[0,4]]},"178":{"position":[[0,4]]},"182":{"position":[[0,4]]}},"content":{"14":{"position":[[70,4]]},"19":{"position":[[63,4],[130,5],[156,4]]},"103":{"position":[[78,4]]},"174":{"position":[[40,5],[134,4],[141,4],[185,4]]},"175":{"position":[[120,4]]},"176":{"position":[[26,4],[937,4]]}},"relUrl":{"175":{"position":[[43,4]]}}}],["rule",{"_index":847,"title":{},"content":{"98":{"position":[[1196,6]]}},"relUrl":{}}],["run",{"_index":64,"title":{},"content":{"7":{"position":[[36,4]]},"32":{"position":[[0,3]]},"41":{"position":[[32,4]]},"67":{"position":[[72,3]]},"74":{"position":[[36,4]]},"89":{"position":[[67,7]]},"137":{"position":[[36,4]]},"147":{"position":[[36,4]]},"160":{"position":[[36,4]]},"175":{"position":[[32,4]]},"246":{"position":[[32,4]]}},"relUrl":{}}],["s",{"_index":633,"title":{},"content":{"76":{"position":[[525,4],[693,4],[882,4],[1023,4]]}},"relUrl":{}}],["s\"%image.json()['url",{"_index":1159,"title":{},"content":{"162":{"position":[[657,24]]}},"relUrl":{}}],["safe",{"_index":1057,"title":{},"content":{"143":{"position":[[159,4]]}},"relUrl":{}}],["sale",{"_index":820,"title":{},"content":{"98":{"position":[[913,6]]}},"relUrl":{}}],["same",{"_index":378,"title":{"36":{"position":[[29,4]]}},"content":{"36":{"position":[[64,4]]},"37":{"position":[[289,5]]},"178":{"position":[[233,4]]}},"relUrl":{"36":{"position":[[64,4]]}}}],["sampl",{"_index":93,"title":{},"content":{"8":{"position":[[165,6]]},"75":{"position":[[169,6]]},"81":{"position":[[154,6]]},"86":{"position":[[157,6]]},"138":{"position":[[173,6]]},"148":{"position":[[166,6]]},"161":{"position":[[169,6]]},"231":{"position":[[164,7]]}},"relUrl":{}}],["san",{"_index":359,"title":{},"content":{"32":{"position":[[392,5]]},"76":{"position":[[418,5]]},"150":{"position":[[330,5]]},"177":{"position":[[319,5]]},"191":{"position":[[211,4]]},"197":{"position":[[211,4]]},"235":{"position":[[211,4]]},"253":{"position":[[529,4]]}},"relUrl":{}}],["sans|roboto|montserrat",{"_index":1418,"title":{},"content":{"224":{"position":[[449,22]]}},"relUrl":{}}],["scale",{"_index":576,"title":{},"content":{"66":{"position":[[355,5]]},"219":{"position":[[45,5]]}},"relUrl":{}}],["scenario",{"_index":985,"title":{"132":{"position":[[8,9]]}},"content":{"132":{"position":[[27,9]]}},"relUrl":{"132":{"position":[[34,9]]}}}],["score",{"_index":1483,"title":{},"content":{"237":{"position":[[397,6]]}},"relUrl":{}}],["screen",{"_index":496,"title":{},"content":{"53":{"position":[[48,8]]},"90":{"position":[[60,7],[202,7],[434,8]]}},"relUrl":{}}],["screenshot",{"_index":313,"title":{"111":{"position":[[13,11]]},"112":{"position":[[0,10]]},"211":{"position":[[0,10]]},"215":{"position":[[8,10]]},"219":{"position":[[0,10]]},"220":{"position":[[0,10]]}},"content":{"26":{"position":[[114,14]]},"85":{"position":[[160,10]]},"89":{"position":[[244,10]]},"101":{"position":[[206,10]]},"111":{"position":[[64,11]]},"126":{"position":[[14,10]]},"131":{"position":[[93,10]]},"132":{"position":[[106,10]]},"165":{"position":[[215,10]]},"191":{"position":[[681,11]]},"197":{"position":[[681,11]]},"212":{"position":[[14,10]]},"216":{"position":[[20,10],[136,10],[158,10]]},"217":{"position":[[40,10],[141,10]]},"218":{"position":[[540,11]]},"219":{"position":[[7,10]]},"233":{"position":[[488,10]]},"235":{"position":[[681,11]]},"253":{"position":[[829,11]]},"255":{"position":[[49,10],[327,10],[417,11]]},"259":{"position":[[14,10],[87,10],[296,11]]}},"relUrl":{"111":{"position":[[15,11]]},"112":{"position":[[0,12]]},"215":{"position":[[16,11]]}}}],["screenshot/#exampl",{"_index":1390,"title":{},"content":{},"relUrl":{"213":{"position":[[16,19]]}}}],["screenshot/#how",{"_index":1380,"title":{},"content":{},"relUrl":{"212":{"position":[[16,15]]}}}],["screenshot/#ne",{"_index":1391,"title":{},"content":{},"relUrl":{"214":{"position":[[16,16]]}}}],["screenshot/#screenshot",{"_index":1378,"title":{},"content":{},"relUrl":{"211":{"position":[[16,22]]}}}],["screenshotreadi",{"_index":276,"title":{},"content":{"22":{"position":[[236,17]]},"165":{"position":[[321,17]]},"166":{"position":[[105,18],[129,17],[338,17],[399,17]]},"197":{"position":[[810,17]]},"235":{"position":[[810,17]]}},"relUrl":{}}],["script",{"_index":386,"title":{"79":{"position":[[12,7]]},"80":{"position":[[35,6]]},"83":{"position":[[12,6]]}},"content":{"36":{"position":[[300,6]]},"46":{"position":[[60,6]]},"79":{"position":[[52,7],[124,6]]},"80":{"position":[[17,7]]},"98":{"position":[[62,6]]}},"relUrl":{"79":{"position":[[46,6]]},"80":{"position":[[69,6]]},"83":{"position":[[26,7]]}}}],["script/#exampl",{"_index":672,"title":{},"content":{},"relUrl":{"81":{"position":[[26,15]]}}}],["script/#gener",{"_index":664,"title":{},"content":{},"relUrl":{"80":{"position":[[26,16]]}}}],["script/#googl",{"_index":660,"title":{},"content":{},"relUrl":{"79":{"position":[[26,14]]}}}],["script/#ne",{"_index":673,"title":{},"content":{},"relUrl":{"82":{"position":[[26,12]]}}}],["search",{"_index":861,"title":{},"content":{"101":{"position":[[5,6]]},"216":{"position":[[47,9]]}},"relUrl":{}}],["second",{"_index":1175,"title":{},"content":{"166":{"position":[[425,8]]}},"relUrl":{}}],["secret",{"_index":1023,"title":{},"content":{"140":{"position":[[93,7]]}},"relUrl":{}}],["section#complet",{"_index":1298,"title":{},"content":{"191":{"position":[[348,16]]},"197":{"position":[[348,16]]},"218":{"position":[[865,16]]},"220":{"position":[[139,16]]},"235":{"position":[[348,16]]},"255":{"position":[[1153,16]]}},"relUrl":{}}],["sector",{"_index":784,"title":{},"content":{"98":{"position":[[411,7]]}},"relUrl":{}}],["secur",{"_index":571,"title":{},"content":{"66":{"position":[[247,6],[474,7]]}},"relUrl":{}}],["see",{"_index":76,"title":{},"content":{"7":{"position":[[261,3]]},"18":{"position":[[128,3]]},"23":{"position":[[86,3]]},"32":{"position":[[106,3]]},"41":{"position":[[209,3]]},"56":{"position":[[151,3]]},"74":{"position":[[265,3]]},"86":{"position":[[137,3]]},"99":{"position":[[75,3]]},"104":{"position":[[86,3]]},"106":{"position":[[92,3]]},"131":{"position":[[196,3]]},"137":{"position":[[269,3]]},"139":{"position":[[818,3],[855,4]]},"147":{"position":[[262,3]]},"160":{"position":[[265,3]]},"165":{"position":[[235,4]]},"175":{"position":[[241,3]]},"176":{"position":[[895,3],[947,3]]},"180":{"position":[[39,3]]},"228":{"position":[[11,6]]},"246":{"position":[[235,3]]},"253":{"position":[[104,3]]},"257":{"position":[[126,3]]},"259":{"position":[[42,3]]}},"relUrl":{}}],["seen",{"_index":225,"title":{},"content":{"17":{"position":[[183,4]]}},"relUrl":{}}],["select",{"_index":1141,"title":{},"content":{"156":{"position":[[29,6]]}},"relUrl":{}}],["selector",{"_index":252,"title":{"220":{"position":[[31,8]]},"221":{"position":[[4,9]]}},"content":{"20":{"position":[[98,9]]},"112":{"position":[[8,8]]},"191":{"position":[[222,8],[248,8]]},"197":{"position":[[222,8],[248,8]]},"212":{"position":[[124,8]]},"213":{"position":[[477,9]]},"216":{"position":[[189,8],[204,9]]},"218":{"position":[[748,8],[765,8]]},"220":{"position":[[14,8],[130,8]]},"221":{"position":[[19,10],[131,8]]},"235":{"position":[[222,8],[248,8]]},"255":{"position":[[1027,8],[1053,8]]}},"relUrl":{"220":{"position":[[62,8]]},"221":{"position":[[35,9]]}}}],["self.fetch_url(html",{"_index":1239,"title":{},"content":{"178":{"position":[[352,21]]}},"relUrl":{}}],["send",{"_index":69,"title":{},"content":{"7":{"position":[[132,4]]},"9":{"position":[[21,5]]},"10":{"position":[[59,4]]},"13":{"position":[[238,4]]},"15":{"position":[[330,4]]},"25":{"position":[[164,4]]},"43":{"position":[[59,4]]},"55":{"position":[[155,4]]},"63":{"position":[[133,4]]},"68":{"position":[[109,4]]},"74":{"position":[[136,4]]},"76":{"position":[[25,5]]},"77":{"position":[[59,4]]},"82":{"position":[[59,4]]},"85":{"position":[[5,7]]},"89":{"position":[[264,4],[528,7]]},"123":{"position":[[63,5]]},"132":{"position":[[134,4]]},"137":{"position":[[140,4]]},"139":{"position":[[29,5],[471,7]]},"141":{"position":[[444,7]]},"147":{"position":[[133,4]]},"149":{"position":[[22,5]]},"151":{"position":[[59,4]]},"158":{"position":[[6,4]]},"160":{"position":[[136,4]]},"162":{"position":[[25,5]]},"175":{"position":[[128,4]]},"189":{"position":[[196,4]]},"195":{"position":[[194,4]]},"201":{"position":[[31,4]]},"203":{"position":[[36,4]]},"205":{"position":[[59,4]]},"222":{"position":[[51,4]]},"233":{"position":[[193,4]]},"241":{"position":[[86,4]]},"246":{"position":[[122,4]]},"253":{"position":[[277,4]]},"256":{"position":[[56,4]]}},"relUrl":{}}],["sent",{"_index":390,"title":{},"content":{"36":{"position":[[363,4]]}},"relUrl":{}}],["seo",{"_index":609,"title":{},"content":{"72":{"position":[[120,3]]}},"relUrl":{}}],["septemb",{"_index":180,"title":{},"content":{"15":{"position":[[0,9]]},"16":{"position":[[0,9]]}},"relUrl":{}}],["seri",{"_index":799,"title":{},"content":{"98":{"position":[[626,7],[712,7]]}},"relUrl":{}}],["serif",{"_index":126,"title":{},"content":{"9":{"position":[[493,7]]},"32":{"position":[[398,7]]},"76":{"position":[[424,7]]},"150":{"position":[[336,7]]},"177":{"position":[[325,7]]},"247":{"position":[[381,7]]}},"relUrl":{}}],["serv",{"_index":545,"title":{},"content":{"64":{"position":[[11,6]]},"72":{"position":[[28,5],[250,6]]},"240":{"position":[[269,6]]}},"relUrl":{}}],["server",{"_index":337,"title":{},"content":{"29":{"position":[[126,8]]},"37":{"position":[[208,7]]},"48":{"position":[[379,7]]},"72":{"position":[[137,7]]},"89":{"position":[[89,8]]},"140":{"position":[[32,6]]},"241":{"position":[[164,7],[236,7]]}},"relUrl":{}}],["servic",{"_index":581,"title":{},"content":{"66":{"position":[[444,7]]},"115":{"position":[[56,9]]}},"relUrl":{}}],["set",{"_index":16,"title":{"66":{"position":[[6,3]]},"84":{"position":[[0,7]]},"85":{"position":[[0,7]]},"89":{"position":[[0,7]]},"157":{"position":[[0,3]]}},"content":{"1":{"position":[[57,3]]},"9":{"position":[[154,4]]},"15":{"position":[[131,4]]},"22":{"position":[[140,7]]},"48":{"position":[[222,3],[367,3]]},"51":{"position":[[679,3]]},"53":{"position":[[204,7]]},"63":{"position":[[90,3]]},"66":{"position":[[111,3]]},"84":{"position":[[13,3],[72,7],[149,7]]},"86":{"position":[[172,3]]},"89":{"position":[[204,3]]},"95":{"position":[[196,3]]},"122":{"position":[[22,3]]},"165":{"position":[[151,3]]},"168":{"position":[[322,3]]},"176":{"position":[[364,3]]},"191":{"position":[[750,3],[865,3],[920,3],[1036,3]]},"197":{"position":[[753,3],[912,3],[1027,3],[1082,3],[1198,3]]},"208":{"position":[[46,3]]},"212":{"position":[[116,3]]},"213":{"position":[[429,3]]},"218":{"position":[[133,3],[211,3],[379,3]]},"219":{"position":[[51,3]]},"220":{"position":[[8,3]]},"224":{"position":[[179,3],[245,3]]},"235":{"position":[[753,3],[914,3],[1025,3],[1140,3],[1195,3],[1311,3]]},"240":{"position":[[238,3]]},"247":{"position":[[31,4]]},"255":{"position":[[714,3],[829,3],[884,3],[1000,3]]}},"relUrl":{"66":{"position":[[12,3]]}}}],["settimeout(funct",{"_index":1173,"title":{},"content":{"166":{"position":[[315,22]]}},"relUrl":{}}],["setup",{"_index":740,"title":{},"content":{"91":{"position":[[187,5]]}},"relUrl":{}}],["sha",{"_index":1236,"title":{},"content":{"178":{"position":[[63,3]]}},"relUrl":{}}],["shadow",{"_index":893,"title":{},"content":{"102":{"position":[[405,6]]},"187":{"position":[[700,6]]},"226":{"position":[[468,7]]}},"relUrl":{}}],["share",{"_index":567,"title":{},"content":{"66":{"position":[[155,6]]},"109":{"position":[[75,6]]},"110":{"position":[[38,7]]},"132":{"position":[[262,5]]},"186":{"position":[[193,7]]}},"relUrl":{}}],["shave",{"_index":864,"title":{},"content":{"101":{"position":[[150,7]]}},"relUrl":{}}],["sheet",{"_index":989,"title":{},"content":{"132":{"position":[[201,6]]}},"relUrl":{}}],["short",{"_index":381,"title":{},"content":{"36":{"position":[[95,5]]},"189":{"position":[[346,5]]},"195":{"position":[[344,5]]}},"relUrl":{}}],["shot",{"_index":933,"title":{"109":{"position":[[17,5]]}},"content":{},"relUrl":{"109":{"position":[[19,5]]}}}],["show",{"_index":186,"title":{},"content":{"15":{"position":[[158,4]]},"81":{"position":[[5,5]]},"142":{"position":[[82,5]]}},"relUrl":{}}],["side",{"_index":1000,"title":{"143":{"position":[[7,4]]}},"content":{"136":{"position":[[291,4]]},"140":{"position":[[39,5]]}},"relUrl":{"143":{"position":[[33,4]]}}}],["sign",{"_index":941,"title":{},"content":{"114":{"position":[[71,7]]},"186":{"position":[[107,6]]}},"relUrl":{}}],["signup",{"_index":96,"title":{},"content":{"8":{"position":[[227,6]]},"75":{"position":[[231,6]]},"138":{"position":[[235,6]]},"148":{"position":[[228,6]]},"161":{"position":[[231,6]]}},"relUrl":{}}],["simpl",{"_index":1523,"title":{},"content":{"253":{"position":[[32,6]]}},"relUrl":{}}],["simpler",{"_index":263,"title":{},"content":{"21":{"position":[[194,7]]},"25":{"position":[[83,8]]}},"relUrl":{}}],["simplifi",{"_index":1114,"title":{},"content":{"150":{"position":[[41,8]]}},"relUrl":{}}],["singl",{"_index":392,"title":{},"content":{"36":{"position":[[415,6]]},"224":{"position":[[166,6]]}},"relUrl":{}}],["site",{"_index":305,"title":{"25":{"position":[[15,4]]}},"content":{},"relUrl":{"25":{"position":[[27,4]]}}}],["situat",{"_index":1530,"title":{},"content":{"254":{"position":[[232,10]]}},"relUrl":{}}],["size",{"_index":726,"title":{},"content":{"89":{"position":[[574,5]]},"93":{"position":[[142,5]]},"95":{"position":[[230,4]]},"113":{"position":[[62,4]]}},"relUrl":{}}],["sla",{"_index":477,"title":{"54":{"position":[[19,4]]}},"content":{"51":{"position":[[211,4]]},"54":{"position":[[51,4]]}},"relUrl":{"54":{"position":[[25,3]]}}}],["slow",{"_index":520,"title":{},"content":{"56":{"position":[[120,4]]},"191":{"position":[[579,4]]},"197":{"position":[[579,4]]},"218":{"position":[[697,5]]},"225":{"position":[[35,4]]},"235":{"position":[[579,4]]},"253":{"position":[[727,4]]},"255":{"position":[[646,4]]},"259":{"position":[[275,4]]}},"relUrl":{}}],["snippet",{"_index":691,"title":{},"content":{"85":{"position":[[21,7],[236,8]]},"89":{"position":[[554,8]]},"189":{"position":[[209,7]]},"195":{"position":[[207,7]]},"233":{"position":[[206,7]]},"253":{"position":[[290,7]]}},"relUrl":{}}],["social",{"_index":919,"title":{"106":{"position":[[0,6]]},"107":{"position":[[20,6]]},"108":{"position":[[15,6]]}},"content":{"107":{"position":[[62,6]]},"110":{"position":[[64,6]]},"180":{"position":[[84,6]]},"186":{"position":[[186,6]]}},"relUrl":{"106":{"position":[[0,8]]},"107":{"position":[[22,6]]},"108":{"position":[[17,6]]}}}],["solar",{"_index":781,"title":{},"content":{"98":{"position":[[383,6]]}},"relUrl":{}}],["solid",{"_index":708,"title":{},"content":{"86":{"position":[[56,6]]},"88":{"position":[[70,6]]},"139":{"position":[[367,5]]},"141":{"position":[[340,5]]},"142":{"position":[[280,5]]},"149":{"position":[[263,5]]}},"relUrl":{}}],["someth",{"_index":558,"title":{},"content":{"65":{"position":[[59,9]]}},"relUrl":{}}],["sometim",{"_index":1543,"title":{},"content":{"259":{"position":[[162,9]]}},"relUrl":{}}],["sourc",{"_index":788,"title":{},"content":{"98":{"position":[[451,8]]},"106":{"position":[[149,9]]},"107":{"position":[[92,6]]},"108":{"position":[[2,6]]},"109":{"position":[[82,6]]},"110":{"position":[[78,6]]},"180":{"position":[[24,6]]}},"relUrl":{}}],["space",{"_index":715,"title":{},"content":{"87":{"position":[[52,5]]}},"relUrl":{}}],["specialized.namevaluecollect",{"_index":1509,"title":{},"content":{"247":{"position":[[556,33]]}},"relUrl":{}}],["specif",{"_index":511,"title":{},"content":{"54":{"position":[[137,8]]},"112":{"position":[[37,8]]},"168":{"position":[[103,8],[328,8]]},"191":{"position":[[317,8]]},"197":{"position":[[317,8]]},"199":{"position":[[156,8]]},"218":{"position":[[834,8]]},"220":{"position":[[35,8]]},"235":{"position":[[317,8]]},"255":{"position":[[1122,8]]}},"relUrl":{}}],["specifi",{"_index":323,"title":{},"content":{"28":{"position":[[74,7]]},"90":{"position":[[338,10]]},"224":{"position":[[57,7]]}},"relUrl":{}}],["speed",{"_index":1401,"title":{"225":{"position":[[22,5]]}},"content":{"218":{"position":[[712,5]]},"237":{"position":[[391,5]]}},"relUrl":{}}],["squar",{"_index":188,"title":{},"content":{"15":{"position":[[172,6]]}},"relUrl":{}}],["src",{"_index":17,"title":{},"content":{"1":{"position":[[65,3]]},"46":{"position":[[93,3]]},"48":{"position":[[85,4]]}},"relUrl":{}}],["src=\"data:image/png;base64,ivborw0kggoaaaansuheugaaagaaaabgcamaaadvro",{"_index":23,"title":{},"content":{"1":{"position":[[157,73]]}},"relUrl":{}}],["src=\"data:image/png;base64,ivborw0kggoaaaansuheugaaagaaaabgcamaaadvrockaaaabgdbtueaalgpc/xhbqaaaafzukdcak7ohokaaaagy0hstqaaeiyaaiceaad6aaaagogaahuwaadqyaaaopgaabdwnlprpaaaatlqtfrfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa////mrsmiwaaapf0uk5tabfxq+d4j5zruf3++ljq5jzkxf0hcaqfawigfyujfqe5ipuzgixfj3oic0aswdxsvpbzgstanw1kkzpppxjaerql6o6illung8xth3zy3gj33vutnte49agt+fvs/lqqmphmpap9lqkpolzy4ncmz9ai8288s83axjy/nxrhzmcf77wgkdhsym70dbzcql3pibn2docz2y+35ybnhjko39smgysvlujz3hkfklgo0wkwu8rzomcqlunipcnuhoczxpd2mxedytuu0lkqrguenddjuufbzkn7uj2jsh+2ch6wualhjd7tu0lbv8zqrzegjqy38awaaaabykthrplbto54aaaacxbiwxmaaabiaaaasabgyws+aaag3kleqvro3u2acvdtrxsabwggeghp9mjjxkoiulrcsakwpueqcgoijxgbcghbgyiqolkykoskioslgijvrk0banwqtdqqduoltlprw7vqn3v/qect2zrjyk5yek6bezhm5t6z+tjz77yzermeehjwdoi4g5xfmepk6ibo6cv1sxbrjlhwe9htu7rzpn0an1dmcobs7rm8zyslj6aixafk7oe/ehp5+/havxy8vtxxwx7uyilq352prc58d4rghdj4v5fa+u0jjpdctxmqjk+ety3ar8ibh6mvushryxuadzw5aicvbqc+doadyaf8ewchscqssynj6is935l2ksazprdlrayi1fbr514pkpxtx+0/4o2b5kdbopubqun8hwa8ezhs+iihqsnhifhomvwutz8r3lecjbwxzgjgjw9+v2ik4d+bwuyi4jcj9ki3casmvxdk0eqxmagnrrfgy+l7chq5rz+nijyfkezfw4cy2a/kwz5x4by/dahpctxwtnrncpybyybzrslahiv6fagkl9czspglr7pneiagzsw1qknt06ab9ifqnliznj6bmue7gsccirj/naoyshdmzkoxqqfy+miuwlwkd2kelhpmxz5fadd0ffm54uplqh5+qaeztl6puiylukeyepzfslokpfalmbqlouice1ccjzjlyfupwqohauwt3sdmrtfahwiddcihat5lkfdowcoqnschuqaur0ezn8dgkgpqldfw4q0zh7cpbkufcrravbnkhfklwrs0gcmy3erqwubkjczhvzmaryq2jcu1ug6hapwism01sku3+mawapg27y3iaoau6dbasaoago0rimwibtazzwjaahsw5miasbm4tegvyqgga/smptjv0tiihbwbaohawemtqwmmwls2r6hilmltpmwkgjfmqcfeam5l223st5wngmyegnxijtuligvzuyj2vygqv30/he4rr4idsjj4abrckhho8be42kl1o3f7sq5qd2qpzj6eqigjek1vklz3drb4mwqcr04libofbwxmgzyxfhvhf6lswqsubzyvcplutibzfxcz9cmt62aac7ym4ztvnfnnwzsjz3atjaz5rkypwiiyokbbz56ju85ahnbkfmgg7fnql6kyf3sbfidqwswv9e/txfjtgirn+6urq8d8lxtcgdnls6inrntp7ph4e1mxd3ifpcu0b1yppqv/azwv+h5tzcrvawjtactyly8vf8gqmyftfturmq7xz78h9dfgkkscet6jifvsxlf+tvfknbed7aa7wa6wa2wkklffuhgjtraxmd1ghsvd6mktps510j1khbu3gtvlufklmadqkrdf5dlfydfbeu24c7czzvcwr7nhe19md0f+253fqrhhtnqr3aza6tldcpum60lghanzdxh7bhulzvzo+dvgvr0zgo+bdovvf+igytdlb1bp36o+bmyapzf2sqkzamn9fsmtuxr55q+6ntzkuxa8getosktemaccn4bi+jvw1y+di1lm1ageyuvawxwkgqc8+sirkghizgn0xndry38coliqfar5msvs8mblaxmci4xigie8x8ewsxezrwvtn/gzrme3qnlovc4f5y9lmc/xh+pxxqg1qh4buevnd1m8teuam5bfwvutheu9asirbmsmsxzqubcgl7p3jx0e6qkg3k5a8solaasfaohdjmpwgts+cu+a9g6aunqlafhsb13hekqpbeiumgjqrxbebdtkcbjtlfsmoi0hpw0ppn8adsvqq0dq40l+w1utzljzzbcyfkdclj6/jplixchriwguzhoagmdcznmvqosbtdjfck13xl6egof7liegafz457ajkkua2ssj6u+ec/ua5dywsf/pxd7duyvdfgpyo4doameygpi198fdfzlqgtsq8yaaatg4+g5gll0mim5bdza+wvoguouaxixwywvk+e/1zapgymzgcenfm1cbgupma5btszn46zw/ra88wviaz18n3a+jkcwhvqq/0oa2d7zhgvixlfzyuaaxasd20uuwnggyz0lnea7fqe9dk+azffrbydf2c9few7l8k8146jxj1era3y+odox/ebqlvmvmspaopaaosf5/6lyll45dldpcuu8ia7cvs9ewr2kwdoimdbmawv/aec0jqwj2vw2onns4p9a306fzqcqzmaj0s00aumvdohwsyeefvkaf3/wcyr0y2yminyxcyael+xg+fmvpf1iuo5pkv5+bpmwsej4wcvtqrm8xbipn9pzvp37f8l/e2dkbdsd/emdtn3vjbpuddzztf3k3+aubm197spnfdztfpbh95rkbx//5b5xjvkqsporpaaaajxrfwhrkyxrlomnyzwf0zqaymde4ltewlta4vdaxojayojq2kzawojaw67fvvgaaacv0rvh0zgf0ztptb2rpznkamjaxoc0xmc0wofqwmtowmjo0niswmdowmjrqvwiaaabgdevydhnvznr3yxjlaeltywdltwfnawnridyuny44ltkgmjaxnc0wns0xmibrmtygahr0cdovl3d3dy5pbwfnzw1hz2ljay5vcmfchu0aaaaaghrfwhruahvtyjo6rg9jdw1lbnq6olbhz2vzadgn/7svaaaaghrfwhruahvtyjo6sw1hz2u6omhlawdodaaxotipahkfaaaaf3rfwhruahvtyjo6sw1hz2u6oldpzhroade5mtosiqgaaaazdevydfrodw1iojpnaw1ldhlwzqbpbwfnzs9wbmc/slzoaaaaf3rfwhruahvtyjo6tvrpbwuamtuzodk2mdu2npdfbhiaaaapdevydfrodw1iojptaxpladbcqpsipuwaaabwdevydfrodw1iojpvukkazmlsztovly9tbnrsb2cvzmf2awnvbnmvmjaxoc0xmc0woc8yyzhhm2findnimzy1njq2zmjlmmvkowvmnjkymzdhms5py28ucg5nff1vugaaaabjru5erkjggg",{"_index":28,"title":{},"content":{"2":{"position":[[71,4564]]}},"relUrl":{}}],["src=\"https://code.highcharts.com/highcharts.js\"></script>",{"_index":772,"title":{},"content":{"98":{"position":[[98,66]]}},"relUrl":{}}],["src=\"https://code.highcharts.com/modules/seri",{"_index":773,"title":{},"content":{"98":{"position":[[176,47]]}},"relUrl":{}}],["src=\"https://docs.htmlcsstoimage.com/assets/images/dog.jpg",{"_index":890,"title":{},"content":{"102":{"position":[[323,59]]}},"relUrl":{}}],["src=\"https://example.com/yourimage.png",{"_index":536,"title":{},"content":{"61":{"position":[[117,39]]}},"relUrl":{}}],["src=\"https://platform.instagram.com/en_us/embeds.js\"></script>",{"_index":970,"title":{},"content":{"127":{"position":[[102,71]]}},"relUrl":{}}],["src=\"https://platform.twitter.com/widgets.j",{"_index":1387,"title":{},"content":{"213":{"position":[[335,45]]}},"relUrl":{}}],["src=\"https://unpkg.com/react@16/umd/react.production.min.js\"></script>",{"_index":443,"title":{},"content":{"46":{"position":[[158,79]]}},"relUrl":{}}],["src=\"{{avatar_url",{"_index":1279,"title":{},"content":{"187":{"position":[[657,20]]}},"relUrl":{}}],["src=\\\"https://platform.twitter.com/widgets.j",{"_index":1355,"title":{},"content":{"202":{"position":[[367,47]]},"204":{"position":[[367,47]]}},"relUrl":{}}],["start",{"_index":98,"title":{"103":{"position":[[6,5]]},"117":{"position":[[8,7]]},"222":{"position":[[18,8]]}},"content":{"8":{"position":[[260,8]]},"39":{"position":[[109,8]]},"42":{"position":[[75,8]]},"49":{"position":[[109,8]]},"59":{"position":[[166,8]]},"75":{"position":[[264,8]]},"100":{"position":[[109,8]]},"103":{"position":[[7,7]]},"104":{"position":[[168,8]]},"116":{"position":[[7,7]]},"117":{"position":[[0,5]]},"118":{"position":[[24,7]]},"128":{"position":[[109,8]]},"132":{"position":[[44,7]]},"138":{"position":[[268,8]]},"144":{"position":[[109,8]]},"148":{"position":[[261,8]]},"161":{"position":[[264,8]]},"163":{"position":[[109,8]]},"169":{"position":[[109,8]]},"181":{"position":[[109,8]]},"191":{"position":[[547,8]]},"197":{"position":[[547,8]]},"214":{"position":[[109,8]]},"216":{"position":[[234,8]]},"218":{"position":[[634,8]]},"222":{"position":[[42,8]]},"226":{"position":[[225,7]]},"228":{"position":[[272,5]]},"229":{"position":[[109,8]]},"235":{"position":[[547,8]]},"243":{"position":[[109,8]]},"248":{"position":[[109,8]]},"253":{"position":[[695,8]]},"255":{"position":[[614,8]]},"260":{"position":[[109,8]]}},"relUrl":{"103":{"position":[[8,5]]},"117":{"position":[[9,8]]},"222":{"position":[[49,7]]}}}],["started/set",{"_index":690,"title":{},"content":{},"relUrl":{"84":{"position":[[9,15]]},"85":{"position":[[9,15]]},"86":{"position":[[9,15]]},"87":{"position":[[9,15]]},"88":{"position":[[9,15]]},"89":{"position":[[9,15]]},"90":{"position":[[9,15]]},"91":{"position":[[9,15]]},"92":{"position":[[9,15]]},"93":{"position":[[9,15]]},"94":{"position":[[9,15]]},"95":{"position":[[9,15]]},"96":{"position":[[9,15]]}}}],["started/templ",{"_index":1267,"title":{},"content":{},"relUrl":{"183":{"position":[[9,18]]},"190":{"position":[[9,18]]},"193":{"position":[[9,18]]},"196":{"position":[[9,18]]},"199":{"position":[[9,18]]}}}],["started/templates/#addit",{"_index":1307,"title":{},"content":{},"relUrl":{"191":{"position":[[9,29]]},"197":{"position":[[9,29]]}}}],["started/templates/#common",{"_index":1275,"title":{},"content":{},"relUrl":{"186":{"position":[[9,25]]}}}],["started/templates/#cr",{"_index":1283,"title":{},"content":{},"relUrl":{"188":{"position":[[9,27]]},"198":{"position":[[9,27]]}}}],["started/templates/#edit",{"_index":1330,"title":{},"content":{},"relUrl":{"194":{"position":[[9,26]]}}}],["started/templates/#exampl",{"_index":1281,"title":{},"content":{},"relUrl":{"187":{"position":[[9,26]]},"192":{"position":[[9,26]]},"202":{"position":[[9,26]]},"204":{"position":[[9,26]]}}}],["started/templates/#handlebar",{"_index":1271,"title":{},"content":{},"relUrl":{"185":{"position":[[9,29]]}}}],["started/templates/#list",{"_index":1341,"title":{},"content":{},"relUrl":{"201":{"position":[[9,26]]},"203":{"position":[[9,26]]}}}],["started/templates/#ne",{"_index":1370,"title":{},"content":{},"relUrl":{"205":{"position":[[9,23]]}}}],["started/templates/#paramet",{"_index":1294,"title":{},"content":{},"relUrl":{"189":{"position":[[9,29]]},"195":{"position":[[9,29]]},"200":{"position":[[9,29]]}}}],["started/templates/#what",{"_index":1269,"title":{},"content":{},"relUrl":{"184":{"position":[[9,23]]}}}],["started/url",{"_index":1392,"title":{},"content":{},"relUrl":{"216":{"position":[[9,11]]},"217":{"position":[[9,11]]},"218":{"position":[[9,11]]},"219":{"position":[[9,11]]},"220":{"position":[[9,11]]},"221":{"position":[[9,11]]},"222":{"position":[[9,11]]}}}],["started/us",{"_index":1463,"title":{},"content":{},"relUrl":{"230":{"position":[[9,13]]},"231":{"position":[[9,13]]},"232":{"position":[[9,13]]},"233":{"position":[[9,13]]},"234":{"position":[[9,13]]},"235":{"position":[[9,13]]},"236":{"position":[[9,13]]},"237":{"position":[[9,13]]},"238":{"position":[[9,13]]},"239":{"position":[[9,13]]},"240":{"position":[[9,13]]},"241":{"position":[[9,13]]},"242":{"position":[[9,13]]},"243":{"position":[[9,13]]},"244":{"position":[[9,13]]}}}],["static",{"_index":112,"title":{},"content":{"9":{"position":[[343,6]]}},"relUrl":{}}],["statu",{"_index":1256,"title":{},"content":{"179":{"position":[[386,7]]},"192":{"position":[[0,7],[119,7],[224,7]]},"202":{"position":[[0,7]]},"204":{"position":[[0,7]]},"236":{"position":[[0,7],[99,7],[204,7]]},"242":{"position":[[0,7]]}},"relUrl":{}}],["statuscod",{"_index":1320,"title":{},"content":{"192":{"position":[[171,13],[290,13]]},"236":{"position":[[151,13],[270,13]]}},"relUrl":{}}],["step",{"_index":1527,"title":{},"content":{"254":{"position":[[75,6]]}},"relUrl":{}}],["stop",{"_index":399,"title":{},"content":{"37":{"position":[[41,8]]}},"relUrl":{}}],["store",{"_index":535,"title":{},"content":{"60":{"position":[[88,6]]},"186":{"position":[[157,5]]}},"relUrl":{}}],["stori",{"_index":931,"title":{"108":{"position":[[7,7]]}},"content":{},"relUrl":{"108":{"position":[[9,7]]}}}],["string",{"_index":117,"title":{},"content":{"9":{"position":[[379,6],[439,6],[544,6],[872,6]]},"189":{"position":[[142,6],[289,6],[335,6],[417,6]]},"191":{"position":[[106,6],[233,6]]},"195":{"position":[[140,6],[287,6],[333,6],[415,6]]},"197":{"position":[[106,6],[233,6]]},"233":{"position":[[139,6],[286,6],[332,6]]},"235":{"position":[[106,6],[233,6]]},"247":{"position":[[266,6],[331,6]]},"253":{"position":[[223,6],[370,6],[424,6]]},"255":{"position":[[171,6],[1038,6]]}},"relUrl":{}}],["stripe.com",{"_index":1403,"title":{},"content":{"219":{"position":[[21,11]]}},"relUrl":{}}],["stripe.com’",{"_index":938,"title":{},"content":{"111":{"position":[[91,12]]}},"relUrl":{}}],["stripe’",{"_index":1407,"title":{},"content":{"220":{"position":[[78,8]]}},"relUrl":{}}],["student",{"_index":557,"title":{},"content":{"65":{"position":[[24,7]]}},"relUrl":{}}],["style",{"_index":764,"title":{},"content":{"95":{"position":[[296,5]]}},"relUrl":{}}],["style=\"height",{"_index":705,"title":{},"content":{"86":{"position":[[8,14]]},"88":{"position":[[8,14]]}},"relUrl":{}}],["style=\"width",{"_index":871,"title":{},"content":{"102":{"position":[[98,13]]},"187":{"position":[[535,13]]},"213":{"position":[[129,13]]}},"relUrl":{}}],["style=\"width:600px",{"_index":972,"title":{},"content":{"127":{"position":[[189,20]]}},"relUrl":{}}],["style=\\\"width",{"_index":1349,"title":{},"content":{"202":{"position":[[203,14]]},"204":{"position":[[203,14]]}},"relUrl":{}}],["stylesheet",{"_index":478,"title":{"56":{"position":[[23,12]]}},"content":{"51":{"position":[[322,12]]}},"relUrl":{"56":{"position":[[29,11]]}}}],["sub",{"_index":1505,"title":{},"content":{"247":{"position":[[222,3],[812,3]]}},"relUrl":{}}],["subscript",{"_index":554,"title":{},"content":{"64":{"position":[[154,13]]}},"relUrl":{}}],["subsequ",{"_index":1237,"title":{},"content":{"178":{"position":[[206,10]]}},"relUrl":{}}],["substitut",{"_index":1268,"title":{},"content":{"184":{"position":[[67,11]]},"200":{"position":[[277,11]]}},"relUrl":{}}],["subtitl",{"_index":787,"title":{},"content":{"98":{"position":[[433,9]]}},"relUrl":{}}],["such",{"_index":606,"title":{},"content":{"72":{"position":[[66,5]]},"150":{"position":[[22,4]]},"186":{"position":[[209,4]]},"218":{"position":[[662,4]]},"228":{"position":[[296,4]]},"233":{"position":[[386,4]]},"255":{"position":[[225,4]]}},"relUrl":{}}],["suggest",{"_index":1535,"title":{},"content":{"257":{"position":[[64,7]]}},"relUrl":{}}],["suit",{"_index":587,"title":{},"content":{"67":{"position":[[88,5]]}},"relUrl":{}}],["super",{"_index":1404,"title":{},"content":{"219":{"position":[[67,5]]}},"relUrl":{}}],["support",{"_index":156,"title":{"63":{"position":[[7,7]]}},"content":{"13":{"position":[[8,7]]},"45":{"position":[[69,8]]},"51":{"position":[[553,7]]},"56":{"position":[[93,10]]},"71":{"position":[[8,8]]},"72":{"position":[[217,8]]},"98":{"position":[[13,8]]},"141":{"position":[[13,8]]},"143":{"position":[[64,9]]},"185":{"position":[[10,7]]},"209":{"position":[[21,9]]},"224":{"position":[[8,8]]},"227":{"position":[[8,8]]},"238":{"position":[[8,8]]}},"relUrl":{"63":{"position":[[13,7]]}}}],["support@htmlcsstoimage.com",{"_index":39,"title":{},"content":{"4":{"position":[[17,27]]},"10":{"position":[[77,27]]},"13":{"position":[[255,27]]},"34":{"position":[[17,27]]},"39":{"position":[[33,26]]},"43":{"position":[[77,27]]},"49":{"position":[[33,26]]},"51":{"position":[[47,27]]},"54":{"position":[[70,26]]},"55":{"position":[[73,26]]},"68":{"position":[[10,27]]},"77":{"position":[[77,27]]},"82":{"position":[[77,27]]},"96":{"position":[[17,27]]},"100":{"position":[[33,26]]},"128":{"position":[[33,26]]},"134":{"position":[[17,27]]},"144":{"position":[[33,26]]},"151":{"position":[[77,27]]},"163":{"position":[[33,26]]},"169":{"position":[[33,26]]},"181":{"position":[[33,26]]},"205":{"position":[[77,27]]},"210":{"position":[[17,27]]},"214":{"position":[[33,26]]},"222":{"position":[[69,27]]},"229":{"position":[[33,26]]},"243":{"position":[[33,26]]},"248":{"position":[[33,26]]},"256":{"position":[[74,26]]},"260":{"position":[[33,26]]}},"relUrl":{}}],["sure",{"_index":428,"title":{},"content":{"42":{"position":[[250,4]]},"45":{"position":[[189,4]]},"61":{"position":[[8,4]]},"99":{"position":[[3,4]]},"212":{"position":[[107,4]]}},"relUrl":{}}],["swap",{"_index":967,"title":{},"content":{"127":{"position":[[23,4]]},"213":{"position":[[23,4]]}},"relUrl":{}}],["system",{"_index":1503,"title":{},"content":{"247":{"position":[[170,6]]}},"relUrl":{}}],["system.collections.specialized.namevaluecollect",{"_index":133,"title":{},"content":{"9":{"position":[[777,52]]}},"relUrl":{}}],["system.net",{"_index":107,"title":{},"content":{"9":{"position":[[291,11]]},"247":{"position":[[185,10]]}},"relUrl":{}}],["system.text.encoding.utf8.getstring(result",{"_index":135,"title":{},"content":{"9":{"position":[[894,44]]},"247":{"position":[[659,43]]}},"relUrl":{}}],["t",{"_index":1310,"title":{},"content":{"192":{"position":[[39,2]]},"202":{"position":[[460,2]]},"204":{"position":[[460,2]]}},"relUrl":{}}],["tab",{"_index":1140,"title":{},"content":{"156":{"position":[[24,4]]}},"relUrl":{}}],["tag",{"_index":15,"title":{},"content":{"1":{"position":[[49,3]]},"42":{"position":[[117,5]]},"46":{"position":[[67,3]]},"56":{"position":[[20,3]]},"57":{"position":[[47,3]]},"58":{"position":[[30,3]]},"59":{"position":[[208,5]]},"85":{"position":[[302,5]]},"98":{"position":[[69,3]]},"227":{"position":[[121,4]]}},"relUrl":{}}],["take",{"_index":63,"title":{},"content":{"7":{"position":[[12,5]]},"41":{"position":[[8,5]]},"74":{"position":[[12,5]]},"103":{"position":[[24,4]]},"106":{"position":[[112,4]]},"116":{"position":[[24,4]]},"132":{"position":[[99,4]]},"137":{"position":[[12,5]]},"147":{"position":[[12,5]]},"160":{"position":[[12,5]]},"168":{"position":[[190,4]]},"172":{"position":[[224,4]]},"175":{"position":[[8,5]]},"180":{"position":[[0,4]]},"217":{"position":[[31,6]]},"218":{"position":[[41,4],[529,6]]},"241":{"position":[[289,4],[320,4]]},"246":{"position":[[8,5]]},"258":{"position":[[102,4]]},"259":{"position":[[5,6],[285,6]]}},"relUrl":{}}],["taken",{"_index":1541,"title":{},"content":{"259":{"position":[[102,5]]}},"relUrl":{}}],["talk",{"_index":37,"title":{},"content":{"4":{"position":[[0,4]]},"34":{"position":[[0,4]]},"39":{"position":[[0,4]]},"49":{"position":[[0,4]]},"96":{"position":[[0,4]]},"100":{"position":[[0,4]]},"128":{"position":[[0,4]]},"134":{"position":[[0,4]]},"144":{"position":[[0,4]]},"163":{"position":[[0,4]]},"169":{"position":[[0,4]]},"181":{"position":[[0,4]]},"210":{"position":[[0,4]]},"214":{"position":[[0,4]]},"229":{"position":[[0,4]]},"243":{"position":[[0,4]]},"248":{"position":[[0,4]]},"260":{"position":[[0,4]]}},"relUrl":{}}],["tall",{"_index":699,"title":{},"content":{"85":{"position":[[200,5]]}},"relUrl":{}}],["target",{"_index":1406,"title":{},"content":{"220":{"position":[[26,6]]}},"relUrl":{}}],["telegram",{"_index":988,"title":{},"content":{"132":{"position":[[145,8]]}},"relUrl":{}}],["templat",{"_index":163,"title":{"21":{"position":[[0,8]]},"23":{"position":[[11,9]]},"183":{"position":[[6,9]]},"184":{"position":[[9,10]]},"188":{"position":[[11,8]]},"194":{"position":[[10,8]]},"198":{"position":[[25,8]]},"199":{"position":[[2,8]]},"201":{"position":[[13,9]]},"203":{"position":[[13,8]]}},"content":{"13":{"position":[[115,8]]},"21":{"position":[[20,8],[56,10],[240,8]]},"23":{"position":[[48,9],[119,10]]},"179":{"position":[[193,8]]},"183":{"position":[[17,9],[86,10],[167,8],[251,8],[330,8],[373,9],[424,8]]},"184":{"position":[[2,8]]},"185":{"position":[[0,9]]},"186":{"position":[[22,9]]},"187":{"position":[[32,9],[58,10]]},"188":{"position":[[14,9]]},"189":{"position":[[11,8],[374,8],[470,8]]},"190":{"position":[[15,9],[149,9]]},"192":{"position":[[352,9]]},"193":{"position":[[24,9],[90,9]]},"194":{"position":[[10,8]]},"195":{"position":[[9,8],[372,8],[468,8]]},"196":{"position":[[15,9],[149,9]]},"198":{"position":[[14,9]]},"199":{"position":[[108,9]]},"200":{"position":[[11,9]]},"201":{"position":[[20,10]]},"203":{"position":[[26,9]]}},"relUrl":{"23":{"position":[[23,9]]},"184":{"position":[[37,9]]},"188":{"position":[[39,8]]},"194":{"position":[[38,8]]},"198":{"position":[[53,8]]},"201":{"position":[[41,9]]},"203":{"position":[[41,8]]}}}],["template_id",{"_index":1309,"title":{},"content":{"192":{"position":[[24,14]]},"194":{"position":[[81,11]]},"198":{"position":[[73,11]]},"199":{"position":[[33,12]]}},"relUrl":{}}],["template_valu",{"_index":1337,"title":{},"content":{"200":{"position":[[135,15],[214,16]]}},"relUrl":{}}],["template_vers",{"_index":1316,"title":{},"content":{"192":{"position":[[81,19]]},"199":{"position":[[165,16],[197,18]]}},"relUrl":{}}],["template’",{"_index":1339,"title":{},"content":{"200":{"position":[[297,10]]}},"relUrl":{}}],["termin",{"_index":346,"title":{},"content":{"31":{"position":[[45,8]]},"32":{"position":[[25,8]]},"245":{"position":[[45,8]]}},"relUrl":{}}],["test",{"_index":458,"title":{},"content":{"48":{"position":[[247,4],[262,4]]},"67":{"position":[[83,4]]},"81":{"position":[[244,7],[259,7]]},"143":{"position":[[247,6]]},"154":{"position":[[45,7]]}},"relUrl":{}}],["text",{"_index":193,"title":{"109":{"position":[[12,4]]},"228":{"position":[[27,4]]}},"content":{"15":{"position":[[256,4]]},"86":{"position":[[63,4]]},"88":{"position":[[77,4]]},"98":{"position":[[377,5],[445,5],[505,5]]},"102":{"position":[[80,4],[145,4]]},"187":{"position":[[44,7],[517,4],[582,4],[597,8]]},"226":{"position":[[607,4]]},"228":{"position":[[143,5]]}},"relUrl":{"109":{"position":[[14,4]]},"228":{"position":[[55,4]]}}}],["then(data",{"_index":1070,"title":{},"content":{"143":{"position":[[659,10]]}},"relUrl":{}}],["then(r",{"_index":1066,"title":{},"content":{"143":{"position":[[559,9]]}},"relUrl":{}}],["thesolarfoundation.com",{"_index":789,"title":{},"content":{"98":{"position":[[460,23]]}},"relUrl":{}}],["thousand",{"_index":344,"title":{},"content":{"30":{"position":[[131,9]]},"106":{"position":[[36,9]]},"115":{"position":[[37,9]]},"130":{"position":[[161,9]]},"250":{"position":[[348,9]]}},"relUrl":{}}],["through",{"_index":230,"title":{},"content":{"17":{"position":[[246,7]]},"222":{"position":[[26,7]]}},"relUrl":{}}],["throughout",{"_index":1494,"title":{},"content":{"241":{"position":[[260,10]]}},"relUrl":{}}],["time",{"_index":329,"title":{"36":{"position":[[49,6]]},"55":{"position":[[48,5]]}},"content":{"28":{"position":[[214,4]]},"36":{"position":[[101,4]]},"51":{"position":[[266,5]]},"55":{"position":[[170,4]]},"56":{"position":[[145,5]]},"76":{"position":[[212,6]]},"168":{"position":[[112,5],[347,4]]},"184":{"position":[[86,4]]},"191":{"position":[[608,5]]},"193":{"position":[[123,6]]},"197":{"position":[[608,5]]},"212":{"position":[[206,4]]},"225":{"position":[[60,5]]},"235":{"position":[[608,5]]},"253":{"position":[[756,5]]},"255":{"position":[[675,5]]}},"relUrl":{"36":{"position":[[84,5]]},"55":{"position":[[54,4]]}}}],["time.second",{"_index":640,"title":{},"content":{"76":{"position":[[782,11]]}},"relUrl":{}}],["titl",{"_index":780,"title":{},"content":{"98":{"position":[[368,6],[496,6]]}},"relUrl":{}}],["title_text",{"_index":1270,"title":{},"content":{"185":{"position":[[65,14]]}},"relUrl":{}}],["toler",{"_index":879,"title":{},"content":{"102":{"position":[[184,9]]}},"relUrl":{}}],["toolkit.contain",{"_index":1299,"title":{},"content":{"191":{"position":[[365,17]]},"197":{"position":[[365,17]]},"218":{"position":[[882,17]]},"220":{"position":[[156,17]]},"235":{"position":[[365,17]]},"255":{"position":[[1170,17]]}},"relUrl":{}}],["top",{"_index":963,"title":{},"content":{"126":{"position":[[188,3]]}},"relUrl":{}}],["total",{"_index":719,"title":{},"content":{"89":{"position":[[129,5]]},"165":{"position":[[90,5]]}},"relUrl":{}}],["toughest",{"_index":591,"title":{},"content":{"68":{"position":[[122,8]]}},"relUrl":{}}],["tradit",{"_index":734,"title":{},"content":{"90":{"position":[[172,12]]}},"relUrl":{}}],["transpar",{"_index":1371,"title":{"206":{"position":[[0,11]]}},"content":{"206":{"position":[[32,11]]},"207":{"position":[[26,11],[137,12]]},"208":{"position":[[33,12]]},"209":{"position":[[0,12]]}},"relUrl":{}}],["treat",{"_index":1465,"title":{},"content":{"231":{"position":[[220,5]]}},"relUrl":{}}],["tri",{"_index":416,"title":{},"content":{"41":{"position":[[232,3]]},"102":{"position":[[959,3]]},"127":{"position":[[413,3]]},"208":{"position":[[63,3]]},"226":{"position":[[932,3]]},"259":{"position":[[239,3]]}},"relUrl":{}}],["trigger",{"_index":1170,"title":{},"content":{"166":{"position":[[224,7]]},"167":{"position":[[33,7]]}},"relUrl":{}}],["troubl",{"_index":1532,"title":{},"content":{"256":{"position":[[12,7]]}},"relUrl":{}}],["troubleshoot",{"_index":1518,"title":{"256":{"position":[[0,15]]}},"content":{"250":{"position":[[218,15]]}},"relUrl":{}}],["true",{"_index":272,"title":{},"content":{"22":{"position":[[169,5]]},"165":{"position":[[172,4]]},"197":{"position":[[760,4]]},"218":{"position":[[386,5]]},"235":{"position":[[760,4],[921,5]]}},"relUrl":{}}],["truncat",{"_index":19,"title":{},"content":{"1":{"position":[[116,9]]}},"relUrl":{}}],["tryit",{"_index":1324,"title":{},"content":{"192":{"position":[[325,5]]}},"relUrl":{}}],["turn",{"_index":1128,"title":{},"content":{"150":{"position":[[743,5]]}},"relUrl":{}}],["tweak",{"_index":1191,"title":{},"content":{"172":{"position":[[74,5],[150,7]]}},"relUrl":{}}],["tweet",{"_index":991,"title":{"211":{"position":[[13,5]]}},"content":{"132":{"position":[[238,6]]},"202":{"position":[[195,7]]},"204":{"position":[[195,7]]},"211":{"position":[[52,7]]},"212":{"position":[[30,6],[151,5],[253,6]]},"213":{"position":[[67,5],[122,6],[496,5]]}},"relUrl":{"211":{"position":[[41,5]]}}}],["twice",{"_index":475,"title":{"53":{"position":[[16,5]]}},"content":{"51":{"position":[[162,5]]}},"relUrl":{"53":{"position":[[22,5]]}}}],["twitter",{"_index":922,"title":{"215":{"position":[[0,7]]}},"content":{"106":{"position":[[67,7]]},"212":{"position":[[60,7],[142,8]]},"213":{"position":[[487,8]]},"254":{"position":[[115,8]]}},"relUrl":{}}],["twitter:imag",{"_index":1274,"title":{},"content":{"186":{"position":[[229,14]]}},"relUrl":{}}],["two",{"_index":406,"title":{},"content":{"37":{"position":[[219,3]]},"251":{"position":[[32,3]]}},"relUrl":{}}],["type",{"_index":1037,"title":{},"content":{"142":{"position":[[619,6]]},"143":{"position":[[425,6]]},"149":{"position":[[838,5]]},"189":{"position":[[109,4]]},"191":{"position":[[66,4]]},"195":{"position":[[107,4]]},"197":{"position":[[66,4]]},"200":{"position":[[189,4]]},"227":{"position":[[32,4]]},"233":{"position":[[106,4]]},"235":{"position":[[66,4]]},"240":{"position":[[72,4]]},"253":{"position":[[190,4]]},"255":{"position":[[139,4]]}},"relUrl":{}}],["u",{"_index":353,"title":{},"content":{"32":{"position":[[274,1]]},"217":{"position":[[230,1]]}},"relUrl":{}}],["unabl",{"_index":437,"title":{},"content":{"45":{"position":[[235,6]]}},"relUrl":{}}],["understand",{"_index":679,"title":{"90":{"position":[[0,13]]}},"content":{"84":{"position":[[172,13]]}},"relUrl":{}}],["unhealthi",{"_index":298,"title":{},"content":{"24":{"position":[[298,10]]}},"relUrl":{}}],["uniqu",{"_index":563,"title":{},"content":{"66":{"position":[[57,8]]},"178":{"position":[[127,6]]},"186":{"position":[[70,6]]},"254":{"position":[[202,6]]}},"relUrl":{}}],["unlimit",{"_index":551,"title":{},"content":{"64":{"position":[[113,9]]},"193":{"position":[[103,9]]}},"relUrl":{}}],["unstyl",{"_index":1457,"title":{"228":{"position":[[18,8]]}},"content":{},"relUrl":{"228":{"position":[[46,8]]}}}],["unsuccess",{"_index":644,"title":{},"content":{"76":{"position":[[868,13]]}},"relUrl":{}}],["until",{"_index":274,"title":{},"content":{"22":{"position":[[210,5]]},"52":{"position":[[56,5]]},"165":{"position":[[226,5]]},"228":{"position":[[332,5]]}},"relUrl":{}}],["up",{"_index":217,"title":{},"content":{"17":{"position":[[97,2]]},"36":{"position":[[262,2]]},"52":{"position":[[53,2]]},"67":{"position":[[23,2]]},"114":{"position":[[79,2]]},"257":{"position":[[80,2]]}},"relUrl":{}}],["updat",{"_index":152,"title":{"20":{"position":[[11,7]]}},"content":{"12":{"position":[[18,7]]},"14":{"position":[[38,6]]},"15":{"position":[[46,6]]},"228":{"position":[[131,7]]}},"relUrl":{"20":{"position":[[23,7]]}}}],["updated_at",{"_index":1365,"title":{},"content":{"202":{"position":[[582,13]]},"204":{"position":[[582,13]]}},"relUrl":{}}],["upgrad",{"_index":482,"title":{"62":{"position":[[9,7]]}},"content":{"51":{"position":[[524,7]]},"67":{"position":[[137,9]]},"236":{"position":[[340,7]]},"258":{"position":[[156,7]]}},"relUrl":{"62":{"position":[[15,7]]}}}],["url",{"_index":73,"title":{"26":{"position":[[0,3]]},"27":{"position":[[0,3]]},"38":{"position":[[0,3]]},"60":{"position":[[23,3]]},"155":{"position":[[0,3]]},"167":{"position":[[11,3]]},"216":{"position":[[0,3]]},"217":{"position":[[25,3]]},"255":{"position":[[21,3]]}},"content":{"7":{"position":[[192,3],[310,6]]},"9":{"position":[[257,3]]},"15":{"position":[[348,3]]},"26":{"position":[[68,3]]},"27":{"position":[[89,3]]},"29":{"position":[[157,3]]},"33":{"position":[[44,3]]},"36":{"position":[[191,3]]},"38":{"position":[[67,4]]},"45":{"position":[[210,3],[263,5]]},"46":{"position":[[106,3]]},"47":{"position":[[88,3]]},"51":{"position":[[473,3]]},"59":{"position":[[25,3]]},"60":{"position":[[126,4]]},"61":{"position":[[33,3]]},"71":{"position":[[167,4]]},"74":{"position":[[196,3],[314,6]]},"89":{"position":[[257,3],[516,3]]},"101":{"position":[[221,3]]},"111":{"position":[[7,3]]},"131":{"position":[[109,3]]},"137":{"position":[[200,3],[318,6]]},"139":{"position":[[606,4],[740,7]]},"141":{"position":[[600,4],[677,3],[706,7]]},"143":{"position":[[687,3]]},"147":{"position":[[193,3],[311,6]]},"158":{"position":[[35,3]]},"160":{"position":[[196,3],[314,6]]},"162":{"position":[[649,3]]},"166":{"position":[[59,3]]},"167":{"position":[[11,3],[170,3]]},"175":{"position":[[176,3]]},"178":{"position":[[281,3]]},"186":{"position":[[114,4],[167,5]]},"216":{"position":[[106,3]]},"217":{"position":[[76,3]]},"233":{"position":[[325,4],[361,3],[506,4]]},"234":{"position":[[30,3]]},"236":{"position":[[24,6]]},"237":{"position":[[50,3],[167,3]]},"238":{"position":[[167,4]]},"239":{"position":[[58,4]]},"240":{"position":[[37,3]]},"241":{"position":[[122,4]]},"246":{"position":[[170,3]]},"247":{"position":[[134,3]]},"250":{"position":[[212,3]]},"251":{"position":[[98,3]]},"255":{"position":[[103,3],[164,4],[200,3],[345,4]]},"259":{"position":[[30,4]]}},"relUrl":{"60":{"position":[[29,3]]},"167":{"position":[[38,3]]},"217":{"position":[[56,3]]},"255":{"position":[[43,3]]}}}],["url\":\"https://hcti.io/v1/image/1eecf460",{"_index":362,"title":{},"content":{"33":{"position":[[69,40]]}},"relUrl":{}}],["url\":\"https://hcti.io/v1/image/404ed70d",{"_index":137,"title":{},"content":{"9":{"position":[[975,41]]}},"relUrl":{}}],["url\":\"https://hcti.io/v1/image/5803a3f0",{"_index":1123,"title":{},"content":{"150":{"position":[[654,41]]}},"relUrl":{}}],["url\":\"https://hcti.io/v1/image/9dce5b30",{"_index":1510,"title":{},"content":{"247":{"position":[[735,42]]}},"relUrl":{}}],["url\":\"https://hcti.io/v1/image/f1e2762b",{"_index":651,"title":{},"content":{"76":{"position":[[1072,41]]}},"relUrl":{}}],["url\"=>\"https://hcti.io/v1/image/bde7d5bf",{"_index":1230,"title":{},"content":{"177":{"position":[[444,45]]}},"relUrl":{}}],["url(https://url",{"_index":452,"title":{},"content":{"48":{"position":[[90,15]]}},"relUrl":{}}],["url=\"https://google.com",{"_index":1394,"title":{},"content":{"217":{"position":[[251,24]]}},"relUrl":{}}],["url=\"https://hcti.io/v1/image/254b444c",{"_index":1219,"title":{},"content":{"176":{"position":[[695,38]]}},"relUrl":{}}],["urlencod",{"_index":1100,"title":{},"content":{"149":{"position":[[867,12]]}},"relUrl":{}}],["urlfetchapp",{"_index":663,"title":{},"content":{"80":{"position":[[271,11]]}},"relUrl":{}}],["urlfetchapp.fetch(\"https://hcti.io/v1/imag",{"_index":671,"title":{},"content":{"81":{"position":[[497,45]]}},"relUrl":{}}],["url’",{"_index":320,"title":{},"content":{"27":{"position":[[63,6]]}},"relUrl":{}}],["us",{"_index":13,"title":{"3":{"position":[[0,3]]},"55":{"position":[[74,4]]},"56":{"position":[[6,3]]},"57":{"position":[[6,3]]},"58":{"position":[[6,3]]},"64":{"position":[[25,4]]},"65":{"position":[[6,3]]},"67":{"position":[[40,4]]},"140":{"position":[[8,3]]},"167":{"position":[[0,5]]},"168":{"position":[[8,3]]},"223":{"position":[[0,5]]},"227":{"position":[[0,5]]},"230":{"position":[[0,5]]},"244":{"position":[[0,5]]}},"content":{"1":{"position":[[38,3]]},"3":{"position":[[61,3]]},"7":{"position":[[122,3]]},"8":{"position":[[8,4]]},"9":{"position":[[285,5],[505,5]]},"13":{"position":[[89,3]]},"19":{"position":[[124,5]]},"20":{"position":[[94,3]]},"22":{"position":[[286,6]]},"28":{"position":[[150,6]]},"30":{"position":[[73,3]]},"32":{"position":[[55,5]]},"36":{"position":[[256,5],[340,3]]},"45":{"position":[[197,3]]},"46":{"position":[[45,5]]},"48":{"position":[[30,5]]},"51":{"position":[[292,4],[305,3],[343,3],[376,3],[629,4],[642,3],[745,4]]},"58":{"position":[[149,5]]},"65":{"position":[[36,5]]},"66":{"position":[[178,4],[279,3],[413,5],[460,4]]},"72":{"position":[[175,4]]},"74":{"position":[[122,3]]},"75":{"position":[[8,4]]},"80":{"position":[[138,3],[251,3]]},"89":{"position":[[30,3],[229,3],[482,5],[580,5]]},"91":{"position":[[115,6]]},"93":{"position":[[40,4]]},"97":{"position":[[95,5]]},"102":{"position":[[23,5]]},"105":{"position":[[124,4]]},"106":{"position":[[7,4]]},"107":{"position":[[15,4]]},"112":{"position":[[0,3]]},"113":{"position":[[28,3]]},"114":{"position":[[3,3]]},"117":{"position":[[27,3]]},"118":{"position":[[0,3]]},"120":{"position":[[13,3],[46,5]]},"121":{"position":[[35,6]]},"125":{"position":[[13,3]]},"126":{"position":[[60,3]]},"131":{"position":[[200,5]]},"132":{"position":[[0,3]]},"137":{"position":[[122,3]]},"138":{"position":[[8,4]]},"139":{"position":[[152,4]]},"140":{"position":[[18,5],[148,4]]},"141":{"position":[[48,5],[82,4]]},"142":{"position":[[99,3]]},"143":{"position":[[4,3]]},"147":{"position":[[122,3]]},"148":{"position":[[8,4]]},"150":{"position":[[0,5],[102,3],[801,5]]},"153":{"position":[[13,3],[46,5]]},"154":{"position":[[34,6]]},"160":{"position":[[122,3]]},"161":{"position":[[8,4]]},"167":{"position":[[5,5]]},"168":{"position":[[23,6],[290,6]]},"175":{"position":[[116,3]]},"176":{"position":[[0,3]]},"177":{"position":[[13,4]]},"178":{"position":[[13,4],[223,5]]},"179":{"position":[[12,6],[97,3]]},"186":{"position":[[101,5],[175,6]]},"187":{"position":[[77,3]]},"189":{"position":[[458,3]]},"190":{"position":[[111,6]]},"191":{"position":[[498,6],[872,5],[1043,5]]},"195":{"position":[[456,3]]},"196":{"position":[[111,6]]},"197":{"position":[[498,6],[1034,5],[1205,5]]},"198":{"position":[[63,5]]},"199":{"position":[[25,5]]},"200":{"position":[[116,3]]},"211":{"position":[[0,3]]},"212":{"position":[[49,3]]},"217":{"position":[[179,5]]},"218":{"position":[[560,6],[611,3]]},"221":{"position":[[124,6]]},"222":{"position":[[160,5]]},"223":{"position":[[38,3]]},"224":{"position":[[38,3],[344,3]]},"225":{"position":[[93,4]]},"226":{"position":[[24,5]]},"228":{"position":[[170,3]]},"231":{"position":[[8,4],[280,4],[302,5]]},"235":{"position":[[498,6],[1147,5],[1318,5]]},"236":{"position":[[308,4]]},"237":{"position":[[33,3],[88,3],[320,3]]},"241":{"position":[[63,5]]},"246":{"position":[[108,3]]},"247":{"position":[[392,5],[634,5]]},"253":{"position":[[646,6]]},"254":{"position":[[48,5]]},"255":{"position":[[565,6],[836,5],[1007,5]]},"257":{"position":[[94,5]]},"259":{"position":[[203,3]]}},"relUrl":{"55":{"position":[[79,3]]},"56":{"position":[[12,3]]},"57":{"position":[[12,3]]},"58":{"position":[[12,3]]},"64":{"position":[[31,3]]},"65":{"position":[[12,3]]},"67":{"position":[[46,3]]},"168":{"position":[[35,3]]}}}],["usabl",{"_index":259,"title":{},"content":{"21":{"position":[[85,6]]},"183":{"position":[[10,6]]}},"relUrl":{}}],["usag",{"_index":1539,"title":{},"content":{"258":{"position":[[146,5]]}},"relUrl":{}}],["usecas",{"_index":1266,"title":{"186":{"position":[[7,8]]}},"content":{"183":{"position":[[131,8]]}},"relUrl":{"186":{"position":[[35,8]]}}}],["user",{"_index":88,"title":{},"content":{"8":{"position":[[62,4]]},"75":{"position":[[62,4]]},"81":{"position":[[359,4]]},"109":{"position":[[26,5]]},"133":{"position":[[71,4]]},"138":{"position":[[62,4]]},"143":{"position":[[304,5]]},"148":{"position":[[62,4]]},"156":{"position":[[64,4]]},"161":{"position":[[62,4]]},"162":{"position":[[302,4]]},"176":{"position":[[209,4],[308,5]]},"177":{"position":[[133,4]]},"179":{"position":[[220,4]]},"231":{"position":[[64,4]]},"237":{"position":[[532,5]]},"252":{"position":[[71,4]]}},"relUrl":{}}],["user/robot",{"_index":388,"title":{},"content":{"36":{"position":[[323,11]]}},"relUrl":{}}],["user_id",{"_index":1095,"title":{},"content":{"149":{"position":[[670,7],[766,9]]},"150":{"position":[[399,7],[539,11]]},"177":{"position":[[191,10]]}},"relUrl":{}}],["userid",{"_index":349,"title":{},"content":{"32":{"position":[[139,6]]},"76":{"position":[[229,6]]}},"relUrl":{}}],["userid:apikey",{"_index":354,"title":{},"content":{"32":{"position":[[276,16]]},"217":{"position":[[232,15]]}},"relUrl":{}}],["usernam",{"_index":87,"title":{},"content":{"8":{"position":[[45,8]]},"75":{"position":[[45,8]]},"81":{"position":[[340,8]]},"138":{"position":[[45,8]]},"143":{"position":[[293,8]]},"148":{"position":[[45,8]]},"161":{"position":[[45,8]]},"177":{"position":[[181,9]]},"187":{"position":[[463,11]]},"231":{"position":[[47,8]]}},"relUrl":{}}],["util",{"_index":1333,"title":{},"content":{"199":{"position":[[68,7]]}},"relUrl":{}}],["utilities.base64encode(usernam",{"_index":670,"title":{},"content":{"81":{"position":[[445,31]]}},"relUrl":{}}],["uuid",{"_index":564,"title":{},"content":{"66":{"position":[[66,5]]}},"relUrl":{}}],["uuid’",{"_index":580,"title":{},"content":{"66":{"position":[[419,6]]}},"relUrl":{}}],["v1/imag",{"_index":566,"title":{},"content":{"66":{"position":[[133,8]]},"142":{"position":[[570,12]]}},"relUrl":{}}],["v1/templat",{"_index":1340,"title":{},"content":{"201":{"position":[[45,12]]}},"relUrl":{}}],["v1/template/:template_id",{"_index":1369,"title":{},"content":{"203":{"position":[[50,25]]}},"relUrl":{}}],["valu",{"_index":106,"title":{},"content":{"9":{"position":[[203,6]]},"185":{"position":[[127,5]]},"191":{"position":[[572,6]]},"197":{"position":[[572,6]]},"218":{"position":[[691,5]]},"228":{"position":[[289,6]]},"235":{"position":[[572,6]]},"247":{"position":[[80,6]]},"253":{"position":[[151,6],[720,6]]},"254":{"position":[[54,6],[103,6]]},"255":{"position":[[94,5],[639,6]]},"259":{"position":[[266,5]]}},"relUrl":{}}],["var",{"_index":127,"title":{},"content":{"9":{"position":[[511,4]]},"81":{"position":[[219,3],[270,3]]}},"relUrl":{}}],["variabl",{"_index":261,"title":{"185":{"position":[[11,9]]},"254":{"position":[[2,9]]}},"content":{"21":{"position":[[111,10],[128,9]]},"183":{"position":[[112,9]]},"184":{"position":[[51,9]]},"185":{"position":[[29,10]]},"186":{"position":[[42,9]]},"187":{"position":[[81,9]]},"200":{"position":[[254,9]]}},"relUrl":{"185":{"position":[[39,9]]}}}],["variou",{"_index":198,"title":{"16":{"position":[[0,7]]}},"content":{},"relUrl":{}}],["vb.net",{"_index":910,"title":{"245":{"position":[[0,7]]},"246":{"position":[[23,6]]},"249":{"position":[[0,6]]}},"content":{"103":{"position":[[115,6]]},"245":{"position":[[59,6],[120,6]]},"246":{"position":[[112,6]]}},"relUrl":{}}],["vbnet",{"_index":1502,"title":{},"content":{},"relUrl":{"246":{"position":[[45,5]]}}}],["vendor/autoload.php",{"_index":1117,"title":{},"content":{"150":{"position":[[209,22]]}},"relUrl":{}}],["veri",{"_index":222,"title":{},"content":{"17":{"position":[[152,4]]}},"relUrl":{}}],["version",{"_index":245,"title":{"67":{"position":[[5,7]]},"199":{"position":[[11,8]]},"203":{"position":[[22,8]]}},"content":{"19":{"position":[[44,7]]},"25":{"position":[[36,7]]},"51":{"position":[[710,7]]},"67":{"position":[[50,7]]},"183":{"position":[[433,8]]},"199":{"position":[[92,7]]},"202":{"position":[[629,10]]},"203":{"position":[[12,8]]},"204":{"position":[[629,10]]}},"relUrl":{"67":{"position":[[11,7]]},"203":{"position":[[50,8]]}}}],["version=\"7",{"_index":975,"title":{},"content":{"127":{"position":[[247,11]]}},"relUrl":{}}],["vertic",{"_index":794,"title":{},"content":{"98":{"position":[[556,11]]}},"relUrl":{}}],["verticalalign",{"_index":796,"title":{},"content":{"98":{"position":[[584,14],[1301,14]]}},"relUrl":{}}],["via",{"_index":771,"title":{},"content":{"98":{"position":[[56,3]]},"132":{"position":[[245,3]]},"224":{"position":[[97,3]]},"236":{"position":[[348,3]]}},"relUrl":{}}],["view",{"_index":961,"title":{"179":{"position":[[18,4]]}},"content":{"126":{"position":[[131,7]]},"174":{"position":[[242,4]]},"179":{"position":[[57,4]]}},"relUrl":{"179":{"position":[[38,4]]}}}],["viewabl",{"_index":720,"title":{},"content":{"89":{"position":[[135,8]]}},"relUrl":{}}],["viewport",{"_index":678,"title":{"89":{"position":[[12,8]]}},"content":{"84":{"position":[[161,8]]},"89":{"position":[[113,8],[192,8],[342,9]]},"191":{"position":[[776,9],[947,9]]},"197":{"position":[[938,9],[1109,9]]},"218":{"position":[[159,9],[238,9]]},"235":{"position":[[1051,9],[1222,9]]},"255":{"position":[[740,9],[911,9]]}},"relUrl":{"89":{"position":[[55,8]]}}}],["viewport_height",{"_index":723,"title":{},"content":{"89":{"position":[[394,15]]},"191":{"position":[[892,15]]},"197":{"position":[[1054,15]]},"202":{"position":[[655,18]]},"204":{"position":[[655,18]]},"218":{"position":[[193,15]]},"235":{"position":[[1167,15]]},"255":{"position":[[856,15]]}},"relUrl":{}}],["viewport_width",{"_index":724,"title":{},"content":{"89":{"position":[[414,14]]},"191":{"position":[[723,14]]},"197":{"position":[[885,14]]},"202":{"position":[[680,17]]},"204":{"position":[[680,17]]},"218":{"position":[[116,14]]},"235":{"position":[[998,14]]},"255":{"position":[[687,14]]}},"relUrl":{}}],["visit",{"_index":459,"title":{},"content":{"48":{"position":[[256,5]]},"62":{"position":[[36,8]]}},"relUrl":{}}],["void",{"_index":113,"title":{},"content":{"9":{"position":[[350,4]]}},"relUrl":{}}],["wait",{"_index":273,"title":{},"content":{"22":{"position":[[183,4]]},"28":{"position":[[116,4]]},"165":{"position":[[194,4]]},"191":{"position":[[510,7]]},"197":{"position":[[510,7]]},"218":{"position":[[572,7]]},"235":{"position":[[510,7]]},"253":{"position":[[658,7]]},"255":{"position":[[577,7]]}},"relUrl":{}}],["walk",{"_index":1412,"title":{},"content":{"222":{"position":[[17,4]]}},"relUrl":{}}],["want",{"_index":325,"title":{},"content":{"28":{"position":[[95,4]]},"93":{"position":[[231,4]]},"122":{"position":[[14,4]]},"189":{"position":[[172,4]]},"195":{"position":[[170,4]]},"199":{"position":[[125,4]]},"233":{"position":[[169,4]]},"253":{"position":[[253,4]]}},"relUrl":{}}],["way",{"_index":228,"title":{},"content":{"17":{"position":[[203,4]]},"105":{"position":[[107,4]]}},"relUrl":{}}],["web",{"_index":962,"title":{"227":{"position":[[12,3]]}},"content":{"126":{"position":[[162,3]]},"227":{"position":[[40,3]]}},"relUrl":{"227":{"position":[[40,3]]}}}],["webclient",{"_index":102,"title":{},"content":{"9":{"position":[[143,10],[529,12]]},"247":{"position":[[20,10],[411,9]]}},"relUrl":{}}],["webp",{"_index":52,"title":{"72":{"position":[[26,6]]}},"content":{"6":{"position":[[23,4]]},"31":{"position":[[23,4]]},"70":{"position":[[40,5]]},"71":{"position":[[30,5],[353,4]]},"72":{"position":[[75,6],[226,5],[260,5]]},"73":{"position":[[23,4]]},"79":{"position":[[23,4]]},"101":{"position":[[199,4]]},"136":{"position":[[23,4]]},"146":{"position":[[23,4]]},"159":{"position":[[23,4]]},"174":{"position":[[23,4]]},"209":{"position":[[137,5]]},"238":{"position":[[30,5],[353,4]]},"245":{"position":[[23,4]]}},"relUrl":{"72":{"position":[[48,4]]}}}],["webpag",{"_index":314,"title":{"59":{"position":[[26,8]]},"111":{"position":[[5,7]]}},"content":{"26":{"position":[[129,8]]},"40":{"position":[[24,8]]},"41":{"position":[[163,9]]},"42":{"position":[[26,7]]},"51":{"position":[[439,8]]},"59":{"position":[[37,7]]},"111":{"position":[[21,7]]},"132":{"position":[[122,7]]},"189":{"position":[[268,8]]},"191":{"position":[[279,8]]},"195":{"position":[[266,8]]},"197":{"position":[[279,8]]},"218":{"position":[[796,8]]},"227":{"position":[[172,8]]},"233":{"position":[[265,8],[377,8]]},"235":{"position":[[279,8]]},"237":{"position":[[344,8]]},"253":{"position":[[349,8]]},"255":{"position":[[216,8],[1084,8]]}},"relUrl":{"59":{"position":[[32,7]]},"111":{"position":[[7,7]]}}}],["websit",{"_index":307,"title":{},"content":{"25":{"position":[[65,8]]},"217":{"position":[[58,8]]},"237":{"position":[[112,8]]},"255":{"position":[[67,8]]}},"relUrl":{}}],["well",{"_index":294,"title":{},"content":{"24":{"position":[[204,4]]},"90":{"position":[[308,4]]}},"relUrl":{}}],["weratedog",{"_index":897,"title":{},"content":{"102":{"position":[[480,10]]}},"relUrl":{}}],["west",{"_index":289,"title":{},"content":{"24":{"position":[[115,4]]}},"relUrl":{}}],["we’d",{"_index":560,"title":{},"content":{"65":{"position":[[88,4]]},"68":{"position":[[38,4]]},"104":{"position":[[177,4]]},"222":{"position":[[0,4]]}},"relUrl":{}}],["we’ll",{"_index":410,"title":{},"content":{"39":{"position":[[83,5]]},"49":{"position":[[83,5]]},"63":{"position":[[154,5]]},"100":{"position":[[83,5]]},"128":{"position":[[83,5]]},"144":{"position":[[83,5]]},"163":{"position":[[83,5]]},"169":{"position":[[83,5]]},"181":{"position":[[83,5]]},"191":{"position":[[288,5]]},"197":{"position":[[288,5]]},"214":{"position":[[83,5]]},"217":{"position":[[124,5]]},"218":{"position":[[805,5]]},"229":{"position":[[83,5]]},"235":{"position":[[288,5]]},"243":{"position":[[83,5]]},"248":{"position":[[83,5]]},"255":{"position":[[1093,5]]},"256":{"position":[[105,5]]},"260":{"position":[[83,5]]}},"relUrl":{}}],["we’r",{"_index":142,"title":{"13":{"position":[[5,5]]}},"content":{"10":{"position":[[0,5]]},"27":{"position":[[70,5]]},"43":{"position":[[0,5]]},"68":{"position":[[66,5]]},"77":{"position":[[0,5]]},"82":{"position":[[0,5]]},"151":{"position":[[0,5]]},"205":{"position":[[0,5]]},"222":{"position":[[97,5]]}},"relUrl":{}}],["we’v",{"_index":201,"title":{},"content":{"16":{"position":[[21,5]]},"17":{"position":[[177,5]]},"18":{"position":[[18,5]]},"20":{"position":[[17,5]]},"25":{"position":[[15,5],[105,5]]},"26":{"position":[[82,5]]},"27":{"position":[[17,5]]}},"relUrl":{}}],["white",{"_index":1153,"title":{},"content":{"162":{"position":[[432,6]]},"209":{"position":[[166,6]]}},"relUrl":{}}],["whitelist",{"_index":527,"title":{},"content":{"58":{"position":[[119,9]]}},"relUrl":{}}],["wide",{"_index":697,"title":{},"content":{"85":{"position":[[185,4]]}},"relUrl":{}}],["width",{"_index":675,"title":{"84":{"position":[[19,5]]},"85":{"position":[[21,5]]},"88":{"position":[[11,5]]},"93":{"position":[[11,5]]}},"content":{"84":{"position":[[32,5],[93,5],[286,5]]},"86":{"position":[[30,6],[195,6]]},"88":{"position":[[30,6],[123,5]]},"91":{"position":[[85,5]]},"94":{"position":[[87,6]]},"95":{"position":[[48,6],[166,5],[290,5]]},"113":{"position":[[85,5]]},"172":{"position":[[328,6]]},"191":{"position":[[758,5],[840,5],[1011,5]]},"197":{"position":[[920,5],[1002,5],[1173,5]]},"218":{"position":[[141,5]]},"226":{"position":[[437,6]]},"235":{"position":[[1033,5],[1115,5],[1286,5]]},"240":{"position":[[161,5],[183,5]]},"255":{"position":[[722,5],[804,5],[975,5]]}},"relUrl":{"84":{"position":[[36,6]]},"85":{"position":[[59,5]]},"86":{"position":[[36,6]]},"88":{"position":[[36,6]]},"93":{"position":[[54,5]]}}}],["width/#a4",{"_index":758,"title":{},"content":{},"relUrl":{"94":{"position":[[36,9]]}}}],["width/#ad",{"_index":716,"title":{},"content":{},"relUrl":{"87":{"position":[[36,13]]}}}],["width/#busi",{"_index":765,"title":{},"content":{},"relUrl":{"95":{"position":[[36,15]]}}}],["width/#exampl",{"_index":746,"title":{},"content":{},"relUrl":{"92":{"position":[[36,15]]}}}],["width/#height",{"_index":753,"title":{},"content":{},"relUrl":{"93":{"position":[[36,13]]}}}],["width/#ne",{"_index":766,"title":{},"content":{},"relUrl":{"96":{"position":[[36,11]]}}}],["width/#res",{"_index":743,"title":{},"content":{},"relUrl":{"91":{"position":[[36,13]]}}}],["width/#set",{"_index":702,"title":{},"content":{},"relUrl":{"85":{"position":[[36,14]]},"89":{"position":[[36,14]]}}}],["width/#understand",{"_index":737,"title":{},"content":{},"relUrl":{"90":{"position":[[36,20]]}}}],["width=\"100px\">",{"_index":894,"title":{},"content":{"102":{"position":[[425,17]]},"187":{"position":[[720,17]]}},"relUrl":{}}],["width=\"100px\"/>",{"_index":24,"title":{},"content":{"1":{"position":[[231,18]]},"2":{"position":[[4636,18]]}},"relUrl":{}}],["width=400",{"_index":744,"title":{},"content":{"92":{"position":[[0,10]]},"113":{"position":[[203,10]]}},"relUrl":{}}],["within",{"_index":42,"title":{},"content":{"4":{"position":[[63,6]]},"34":{"position":[[63,6]]},"36":{"position":[[86,6]]},"96":{"position":[[63,6]]},"134":{"position":[[63,6]]},"179":{"position":[[24,6],[123,6]]},"210":{"position":[[63,6]]}},"relUrl":{}}],["without",{"_index":738,"title":{},"content":{"91":{"position":[[169,7]]},"142":{"position":[[111,7]]}},"relUrl":{}}],["won’t",{"_index":407,"title":{},"content":{"37":{"position":[[247,5]]},"80":{"position":[[217,5]]}},"relUrl":{}}],["wordpress",{"_index":1529,"title":{},"content":{"254":{"position":[[134,9]]}},"relUrl":{}}],["work",{"_index":7,"title":{"1":{"position":[[7,5]]},"13":{"position":[[21,7]]},"60":{"position":[[27,5]]},"104":{"position":[[2,5]]},"126":{"position":[[7,5]]},"171":{"position":[[7,5]]},"207":{"position":[[7,5]]},"209":{"position":[[2,5]]},"212":{"position":[[7,5]]},"224":{"position":[[7,5]]}},"content":{"0":{"position":[[50,5]]},"7":{"position":[[254,6]]},"16":{"position":[[32,7]]},"26":{"position":[[29,7]]},"32":{"position":[[99,6]]},"38":{"position":[[80,5]]},"41":{"position":[[121,5],[202,6]]},"42":{"position":[[365,5]]},"48":{"position":[[238,5],[320,5]]},"51":{"position":[[477,5]]},"57":{"position":[[25,6]]},"74":{"position":[[258,6]]},"80":{"position":[[145,4],[223,4]]},"81":{"position":[[187,4]]},"85":{"position":[[221,5]]},"90":{"position":[[303,4]]},"104":{"position":[[49,4]]},"137":{"position":[[262,6]]},"147":{"position":[[255,6]]},"160":{"position":[[258,6]]},"166":{"position":[[50,4]]},"175":{"position":[[234,6]]},"212":{"position":[[96,5]]},"246":{"position":[[228,6]]}},"relUrl":{"1":{"position":[[43,5]]},"13":{"position":[[32,7]]},"60":{"position":[[33,4]]},"126":{"position":[[32,5]]},"171":{"position":[[32,5]]},"207":{"position":[[39,5]]},"212":{"position":[[35,5]]},"224":{"position":[[35,5]]}}}],["world",{"_index":704,"title":{"86":{"position":[[7,5]]},"180":{"position":[[7,5]]}},"content":{"226":{"position":[[185,6]]},"241":{"position":[[275,6]]}},"relUrl":{}}],["world!</div>",{"_index":1059,"title":{},"content":{"143":{"position":[[221,20]]},"162":{"position":[[389,20]]}},"relUrl":{}}],["world</div>",{"_index":1216,"title":{},"content":{"176":{"position":[[546,19]]}},"relUrl":{}}],["world</h2>",{"_index":712,"title":{},"content":{"86":{"position":[[105,16]]}},"relUrl":{}}],["world.</div>",{"_index":1172,"title":{},"content":{"166":{"position":[[281,18]]}},"relUrl":{}}],["worri",{"_index":915,"title":{},"content":{"104":{"position":[[39,6]]},"217":{"position":[[302,6]]},"237":{"position":[[361,5]]}},"relUrl":{}}],["write",{"_index":1395,"title":{},"content":{"217":{"position":[[284,5]]}},"relUrl":{}}],["wrote",{"_index":216,"title":{},"content":{"17":{"position":[[91,5]]}},"relUrl":{}}],["www",{"_index":1099,"title":{},"content":{"149":{"position":[[858,3]]}},"relUrl":{}}],["wysiwyg",{"_index":157,"title":{},"content":{"13":{"position":[[18,7]]}},"relUrl":{}}],["x",{"_index":352,"title":{},"content":{"32":{"position":[[241,1]]},"94":{"position":[[32,1]]},"95":{"position":[[33,1]]},"217":{"position":[[197,1]]}},"relUrl":{}}],["yak",{"_index":863,"title":{},"content":{"101":{"position":[[146,3]]}},"relUrl":{}}],["yaxi",{"_index":790,"title":{},"content":{"98":{"position":[[487,6]]}},"relUrl":{}}],["ye",{"_index":518,"title":{},"content":{"56":{"position":[[0,4]]},"57":{"position":[[0,4]]},"58":{"position":[[0,4]]},"61":{"position":[[0,4]]},"63":{"position":[[0,4]]}},"relUrl":{}}],["you'v",{"_index":1474,"title":{},"content":{"236":{"position":[[300,7]]}},"relUrl":{}}],["your_api_key",{"_index":623,"title":{},"content":{"76":{"position":[[262,14]]}},"relUrl":{}}],["your_user_id",{"_index":622,"title":{},"content":{"76":{"position":[[238,14]]}},"relUrl":{}}],["yourself",{"_index":417,"title":{},"content":{"41":{"position":[[239,8]]},"102":{"position":[[966,8]]},"126":{"position":[[119,8]]},"127":{"position":[[420,8]]},"208":{"position":[[70,8]]},"226":{"position":[[939,8]]}},"relUrl":{}}],["you’d",{"_index":969,"title":{},"content":{"127":{"position":[[72,5]]},"185":{"position":[[133,5]]},"213":{"position":[[73,5]]}},"relUrl":{}}],["you’ll",{"_index":70,"title":{},"content":{"7":{"position":[[162,6]]},"52":{"position":[[21,6]]},"71":{"position":[[68,6]]},"74":{"position":[[166,6]]},"80":{"position":[[123,6]]},"114":{"position":[[17,6]]},"122":{"position":[[7,6]]},"137":{"position":[[170,6]]},"147":{"position":[[163,6]]},"158":{"position":[[15,6]]},"160":{"position":[[166,6]]},"175":{"position":[[156,6]]},"178":{"position":[[104,6]]},"238":{"position":[[68,6]]},"246":{"position":[[150,6]]}},"relUrl":{}}],["you’r",{"_index":556,"title":{},"content":{"65":{"position":[[15,6]]},"123":{"position":[[73,6]]},"150":{"position":[[833,6]]}},"relUrl":{}}],["you’v",{"_index":1326,"title":{},"content":{"194":{"position":[[19,6]]},"216":{"position":[[35,6]]}},"relUrl":{}}],["zapier",{"_index":8,"title":{"3":{"position":[[14,6]]},"17":{"position":[[0,6]]},"23":{"position":[[4,6]]},"250":{"position":[[0,7]]},"261":{"position":[[0,6]]}},"content":{"0":{"position":[[61,6]]},"3":{"position":[[30,6],[117,6]]},"17":{"position":[[40,6],[84,6],[302,6]]},"23":{"position":[[41,6]]},"103":{"position":[[165,6]]},"217":{"position":[[339,6]]},"250":{"position":[[19,6],[86,6],[377,7]]},"251":{"position":[[4,6]]},"253":{"position":[[4,6]]},"254":{"position":[[38,6],[164,6]]},"255":{"position":[[10,6]]},"256":{"position":[[29,6]]}},"relUrl":{"3":{"position":[[50,6]]},"23":{"position":[[16,6]]}}}]],"pipeline":["stemmer"]}} \ No newline at end of file diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..5ccc3ff --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,67 @@ +import { defineConfig, fontProviders } from 'astro/config'; +import starlight from '@astrojs/starlight'; +import tailwindcss from '@tailwindcss/vite'; +import navigation from './src/navigation.mjs'; +import markdownExports from './scripts/markdown-exports.mjs'; +import starlightImageZoom from 'starlight-image-zoom'; +import externalLinks from './scripts/external-links.mjs'; +import sitemap from './scripts/sitemap.mjs'; +import bundleAnalysis from './scripts/bundle-analysis.mjs'; + +export default defineConfig({ + site: process.env.DOCS_ORIGIN || 'http://localhost:4321', + output: 'static', + fonts: [ + { + provider: fontProviders.fontsource(), name: 'IBM Plex Sans', + cssVariable: '--font-ibm-plex-sans', weights: ['100 700'], + styles: ['normal', 'italic'], + subsets: ['latin', 'latin-ext', 'cyrillic', 'cyrillic-ext', 'greek', 'vietnamese'], + formats: ['woff2'], display: 'swap', + }, + { + provider: fontProviders.fontsource(), name: 'IBM Plex Mono', + cssVariable: '--font-ibm-plex-mono', weights: [400, 500, 600, 700], + styles: ['normal', 'italic'], + subsets: ['latin', 'latin-ext', 'cyrillic', 'cyrillic-ext', 'vietnamese'], + formats: ['woff2'], display: 'swap', fallbacks: ['monospace'], + }, + ], + // Our fetch-based prefetch matches ClientRouter's request and Vary: Accept. + // Native link-prefetch requests use a different browser cache variant. + prefetch: false, + trailingSlash: 'always', + integrations: [...(process.env.ANALYZE === 'true' ? [bundleAnalysis()] : []), sitemap({ + filter: page => !new URL(page).pathname.startsWith('/_og/'), + serialize: item => ({ ...item, priority: /^\/changelog\/[^/]+\/?$/.test(new URL(item.url).pathname) ? 0.2 : 0.8 }), + }), starlight({ + title: 'HTML/CSS to Image', + description: 'Generate images from HTML and CSS. Developer documentation for HTML/CSS to Image.', + favicon: '/favicon.ico', + sidebar: navigation, + plugins: [starlightImageZoom()], + customCss: ['./src/styles/global.css'], + components: { MobileTableOfContents: './src/components/MobileTableOfContents.astro', TwoColumnContent: './src/components/TwoColumnContent.astro', Sidebar: './src/components/Sidebar.astro', MobileMenuFooter: './src/components/MobileMenuFooter.astro', PageFrame: './src/components/PageFrame.astro', Header: './src/components/Header.astro', SiteTitle: './src/components/SiteTitle.astro', Footer: './src/components/Footer.astro', PageTitle: './src/components/PageTitle.astro', Head: './src/components/Head.astro' }, + editLink: { baseUrl: `https://github.com/htmlcsstoimage/docs/edit/${process.env.DOCS_BRANCH || 'docs-new'}/` }, + tableOfContents: { minHeadingLevel: 2, maxHeadingLevel: 3 }, + pagination: false, + credits: false, + head: process.env.DOCS_ENV === 'production' ? [] : [{ tag: 'meta', attrs: { name: 'robots', content: 'noindex, nofollow' } }], + }), externalLinks(), markdownExports()], + vite: { + plugins: [tailwindcss()], + build: { + rolldownOptions: { + onwarn(warning, warn) { + // Astro 7 emits this legacy marker in generated content modules. + // Asset propagation uses module IDs and __astroPropagation metadata, + // so the bundler dropping this directive does not affect our output. + if (warning.code === 'MODULE_LEVEL_DIRECTIVE' + && warning.message.includes('"use astro:head-inject"') + && warning.message.includes('?astroPropagatedAssets')) return; + warn(warning); + }, + }, + }, + }, +}); diff --git a/changelog.md b/changelog.md deleted file mode 100644 index 88164b1..0000000 --- a/changelog.md +++ /dev/null @@ -1,726 +0,0 @@ ---- -title: Changelog -layout: page -permalink: /changelog/ -description: Learn about what we're improving for the HTML/CSS to Image API. -nav_order: 1000 ---- - -# Changelog -{: .fs-9 } - -Always improving. Updates to HTML/CSS to Image are posted here. -{: .fs-6 .fw-300 } - -
    - -If you have feature requests, please send them to us: support@htmlcsstoimage.com. - -### Official Go client -September 15, 2026 -{: .text-delta} - -The official HTML/CSS to Image Go client is now available for Go 1.21+. It provides typed requests and responses for HTML/CSS images, URL screenshots, and templates, plus helpers for Google Fonts, PDF options, batches, image deletion, resizing and cropping, and signed URLs. - -Install it with `go get github.com/htmlcsstoimage/go-client`. See the [Go examples](/example-code/go/), [client repository](https://github.com/htmlcsstoimage/go-client), and [package documentation on pkg.go.dev](https://pkg.go.dev/github.com/htmlcsstoimage/go-client). - -
    - -### Management API and scoped permissions -September 14, 2026 -{: .text-delta} - -Manage API keys, proxies, storage destinations, and Open Graph configurations through the [Management API](/management-api/). Create application-specific credentials with explicit permissions, monitor [usage](/management-api/usage/), and automate resource configuration. - -MCP adds proxy, storage destination, and OG configuration management tools. Approve the access you need through [OAuth authorization](/integrations/mcp/permissions/); API key management remains available through REST and the dashboard. See the [complete tools reference](/integrations/mcp/tools/). - -Management resource operations have per-organization rate limits shared across REST and MCP: 100 reads and 20 writes per minute for each resource family. These limits are separate from image credits. See [rate limits](/getting-started/using-the-api/rate-limits/). - -
    - -### Official Python and PHP clients -September 3, 2026 -{: .text-delta} - -Official HTML/CSS to Image clients are now available for Python and PHP. Each package provides typed requests and responses, configurable HTTP transport, and helpers for templates, batches, render options, image deletion, and signed URLs. - -- Python: [`html-css-to-image` on PyPI](https://pypi.org/project/html-css-to-image/) and the [Python examples](/example-code/python/). -- PHP: [`html-css-to-image/client` on Packagist](https://packagist.org/packages/html-css-to-image/client) and the [PHP examples](/example-code/php/). - -The complete package documentation is maintained in the [Python](https://github.com/htmlcsstoimage/python-client) and [PHP](https://github.com/htmlcsstoimage/php-client) repositories. - -
    - -### HTML/CSS to Image is now verified by n8n -September 2, 2026 -{: .text-delta} - -The official HTML/CSS to Image integration is now verified by n8n. Instance owners and admins can find and install it directly from the n8n Nodes panel on n8n Cloud or a self-hosted instance. - -Use the integration to: - -- Create images and PDFs from HTML/CSS. -- Take screenshots of webpage URLs. -- Render saved templates with dynamic values. -- Generate signed render-on-demand URLs. -- Delete images by ID. -- Return image metadata, binary PNG/JPG/WebP/PDF files, or both. - -[View HTML/CSS to Image on n8n](https://n8n.io/integrations/htmlcss-to-image-api/) or [read the integration guide](/integrations/n8n/). - -
    - -### Choose the returned file format in image creation requests -August 27, 2026 -{: .text-delta} - -Image creation requests can now include `format` in the request body. This parameter selects the file extension included in the returned URL; it does not change the stored image definition. - -- Set `format` to `png`, `jpg`, `webp`, or `pdf` for an HTML/CSS image, URL screenshot, saved-template image, or image batch. -- Raster images are rendered and stored as PNGs. JPG and WebP URLs convert that stored PNG when requested. -- PDFs are rendered and saved separately when a PDF URL is requested. -- The same image ID can still be requested later with a different supported extension. -- Batch requests can set `format` in `default_options` or override it in an individual variation. -- When omitted, the API returns its default extensionless URL, which renders as PNG. - -The official clients now expose the body parameter and apply it to generated signed URL paths: - -- [.NET client v0.12.0](https://github.com/htmlcsstoimage/dotnet-client) with `RenderImageFormat.PDF` support. -- [TypeScript client v0.9.0](https://github.com/htmlcsstoimage/ts-client). -- [Ruby client v0.3.0](https://github.com/htmlcsstoimage/ruby-client). - -[Read the `format` parameter documentation](/parameters/format/) or compare output types in the [file formats guide](/guides/styling/file-formats/). - -
    - -### Ruby client v0.2.0 -August 21, 2026 -{: .text-delta} - -Version 0.2.0 of the official [HTML/CSS to Image Ruby client](https://github.com/htmlcsstoimage/ruby-client) is now available. - -- Generate signed create-and-render URLs for webpage screenshots and saved templates. -- Create and delete images in batches. -- Create images from saved templates, list template versions, and create new template versions. -- Use current parameters including `dedupe_duration_s`, `storage_destination_id`, transparent backgrounds, custom request headers, proxies, jumbo images, and consent-banner blocking. - -This release changes how signed template URL tokens are generated. Ruby client 0.1.x URL-decoded the query string before calculating its HMAC. Version 0.2.0 signs the exact encoded query string included after `?`, as required by the current API. - -Regenerating a template URL with the same inputs after upgrading therefore produces a different token. URLs previously generated by 0.1.x continue to work. - -[See the Ruby examples and upgrade notes](/example-code/ruby/). - -
    - -### Automatic Open Graph images for websites and CMSs -August 16, 2026 -{: .text-delta} - -OG Image Configs provide one path-based image URL pattern for every public page on a website, store, CMS, or static site. - -- Connect an exact website origin that you own or administer. -- Use **Page Screenshot** to capture the page or a selected element, or use **Template Values** to render page metadata in an HCTI template. -- Choose one universal image, adapt one render to platform-specific bounds, or render each platform size separately. -- Control how often HCTI refreshes page metadata and use `hcti:content_version` when content at the same path needs a new image identity. -- Add page-specific screenshot controls with supported `hcti:` metadata. -- Follow dedicated setup guides for Shopify, Squarespace, Webflow, Wix, WordPress, Jekyll, Astro, and Sitepress. - -[Set up automatic Open Graph images](/getting-started/og-images/) or choose a [platform and CMS guide](/guides/og-images/). - -
    - -### Control duplicate image detection with `dedupe_duration_s` -August 5, 2026 -{: .text-delta} - -You can now set `dedupe_duration_s` when creating an HTML/CSS image or URL screenshot. When an image with the same content and parameters was created within that lookback window, the API can return its existing image ID and URL without consuming another image credit. - -- URL screenshots default to a 0-second lookback. -- HTML/CSS images default to 30 days on Free and Basic plans, 180 days on Pro, and 365 days on Scale. -- Free and Basic plans support either `0` or the plan default. Pro and Scale plans support any value from `0` through their plan maximum. -- The option is available for standard single-image POST requests and MCP-created images. It does not apply to batches, templates, or signed create-and-render URLs. -- The official TypeScript client v0.8.0 and .NET client v0.11.0 now expose the option when creating images. It is not included in generated create-and-render URLs or batch requests. - -Read the [`dedupe_duration_s` parameter docs](/parameters/dedupe_duration_s/) or the [duplicate detection guide](/guides/advanced/duplicate-detection/). - -
    - -### Custom request headers for URL screenshots -July 31, 2026 -{: .text-delta} - -URL screenshots can now include custom HTTP headers for authenticated pages, preview environments, origin-specific behavior, and other controlled workflows. - -- Pass `headers` as a flat JSON object, or repeat `headers=name:value` in form and create-and-render requests. -- Custom headers are restricted to top-level navigations on the requested URL's origin by default. -- Set `include_headers_on_subrequests: true` when same-origin CSS, images, JavaScript, or API requests also require the headers. -- Use `additional_header_origins` to explicitly allow exact cross-origin schemes, hosts, and ports. Headers are never sent to origins outside this allowlist. -- Set `identify_as_hcti: true` to add `X-HCTI-SCREENSHOT: 1` when your application only needs to identify a screenshot request. This predictable value should not be used for authentication. -- Use the new options with the official .NET client v0.10.0 and TypeScript client v0.7.0, including signed create-and-render URLs. - -Avoid long-lived credentials and do not put secrets in signed URLs. [Read the custom headers documentation](/parameters/headers/) or see how to [allow authorized renders through Cloudflare](/guides/debugging/cloudflare-challenges/). - -
    - -### Store rendered images in your own bucket -July 27, 2026 -{: .text-delta} - -You can now configure storage destinations for Amazon S3, Cloudflare R2, Backblaze B2, DigitalOcean Spaces, Wasabi, Google Cloud Storage, and other S3-compatible services. - -- Add and test destinations from the dashboard, with credentials scoped to your bucket and optional key prefix. -- Select the default, EU, or FedRAMP data jurisdiction when connecting a Cloudflare R2 bucket. -- Pass `storage_destination_id` when creating an HTML/CSS image, URL screenshot, image batch, or template. -- Keep the normal HTML/CSS to Image copy while also writing to your bucket, or choose to **Disable HCTI Storage** for files that should live only in your storage. -- Authenticate `PUT /v1/store/...` requests with your user ID and API key, and use the structured response to see the outcome, object status, bucket, and key for the base image and any transformation. -- Use `storage_destination_id` in the official TypeScript client or `StorageDestinationId` in the .NET client. - -Storage destinations are available on the 10,000 images/month plan or higher. [Read the Storage Destinations guide](/guides/advanced/storage-destinations/). - -
    - -### Image deletion in .NET v0.8.0 and TypeScript v0.5.0 -July 21, 2026 -{: .text-delta} - -The official .NET and TypeScript clients now support deleting images through the API: - -- Delete one image with `DeleteImageAsync` in .NET or `deleteImage` in TypeScript. -- Delete multiple images in one request with `DeleteImageBatchAsync` in .NET or `deleteImageBatch` in TypeScript. - -The .NET client's `ApiResult` now implements `IDisposable` because it owns the raw `HttpResponseMessage`. The raw response remains available when you need headers, the originating request, or other transport details. C# callers should use `using` or `using var` when reading API results. - -[View the C# examples](/example-code/c/) or [TypeScript examples](/example-code/typescript/). - -
    - -### Transparent backgrounds with one parameter -July 20, 2026 -{: .text-delta} - -You can now render a transparent PNG by setting `transparent_background: true` on the create image request. It works with both HTML/CSS and URL-based images, as well as saved templates and image batches. - -The existing CSS-based transparent background method remains supported. The official clients expose the new option as `TransparentBackground` in .NET and `transparent_background` in TypeScript. - -[Read the transparent background guide](/guides/styling/transparent-background/). - -
    - -### HtmlCssToImage .NET Client v0.6.0 -July 19, 2026 -{: .text-delta} - -Our C#/.NET client was updated with improved performance for building urls and new `ImageRenderOptions` to support render-time: -- Resizing (`height` and `width`) -- DPI adjustments -- Full cropping support - -### n8n integration -July 16, 2026 -{: .text-delta} - -The HTML/CSS to Image integration for n8n is now available. It supports: - -- Creating images and PDFs from HTML/CSS -- Taking screenshots of webpage URLs -- Rendering saved templates with dynamic values -- Generating signed render-on-demand URLs -- Returning image metadata, binary PNG/JPG/WebP/PDF files, or both - -[Read the n8n integration guide](/integrations/n8n/). - -
    - -### Template Editor: Context Menu & Input Improvements -June 29, 2026 -{: .text-delta} - -- You can now right-click on blocks and have quick access to set a subset of their properties. -- The gradient input now has a more intuitive slider interface and interactive preview. -- The quick position popover now lets you adjust a block's X and Y position independently, so you can center it horizontally without changing its vertical position, or vice versa. - - -
    - -### Template Editor for visual template design -June 24, 2026 -{: .text-delta} - -We've introduced the Template Editor, a visual way to build saved image templates in the dashboard. - -Instead of writing every template by hand in HTML and CSS, you can build reusable image designs from blocks, style them visually, connect template variables, preview with test data, and render the saved template through the API. - -- **Visual blocks** for text, images, shapes, HTML, and layout panels. -- **Canvas controls** for image size, background, and render settings. -- **Template variables** for text, image URLs, colors, numbers, and other render-time values. -- **Preview and export tools** to test your template before using it in production. - -Templates built in the editor are saved alongside HTML/CSS templates and render through the existing Templates API. See the [Template Editor docs](/template-editor/) to get started. - -
    - -### Jumbo images — render up to 80,000px without quality loss -April 23, 2026 -{: .text-delta} - -You can now render images far beyond Chrome's usual ~8000px limit by setting `jumbo_max_width` and `jumbo_max_height`. The renderer splits the output into 8000 x 8000 tiles, renders each natively, and stitches them into a single image. Preserving your full `device_scale` so the result stays sharp at any size. - -- **Render up to 80,000px on each side** (subject to a 400,000,000-pixel total area cap). -- **Quality is preserved.** Each tile renders at full resolution and the final image keeps its `device_scale`. No more blurry downscaled output when your render naturally exceeds 8000px. -- **Both params required together.** Pass `jumbo_max_width` and `jumbo_max_height` on the create image request. Works with both `html`/`css` and `url` renders. -- **Billed per tile.** Each 8000 x 8000 tile consumes one image credit. - -Without jumbo, a render larger than ~8000px is automatically scaled down to fit, which usually produces a blurry image. If you're rendering big, set the jumbo params. - -[Read the full Jumbo Images guide](/guides/advanced/jumbo-images/). - -
    - -### Route renders through your own HTTP proxy -April 18, 2026 -{: .text-delta} - -You can now configure HTTP proxies in the dashboard and route image renders through them. All outbound traffic for a render will go through the proxy you select. This is useful for restricting access to internal content, controlling the egress IP, or getting past bot detection. - -- **Configure proxies** at [https://htmlcsstoimage.com/dashboard/proxies](https://htmlcsstoimage.com/dashboard/proxies). Set a URL, port, optional auth, and optional **Bypass Hosts** (hostnames that should skip the proxy). -- **Use a proxy** by passing `proxy_id` on the create image request. -- **Disable safely** — turning a proxy off does not affect images that have already been generated. Only new renders that try to use that `proxy_id` will be rejected. - -Available on the **10,000 images/month plan or higher**. [Read the full guide](/guides/advanced/proxies/). - -
    - -### Organizations, invites, and user permissions -February 28, 2026 -{: .text-delta} - -We've added **organizations**, **invites**, and **user permissions** so you can collaborate on an account with your team. - -- **Organizations** — Group API keys, usage, and billing under a single organization. You can create multiple organizations and switch between them. -- **Invites** — Owners and admins can invite people to join an organization by email. Invitees can accept or decline; accepted invites assign a role (Owner, Admin, or User). -- **User permissions** — Three roles control what members can do: - - **Owner** — Full control: manage billing, API keys, members, invites, and organization metadata. - - **Admin** — Manage billing, API keys, and users (invite members, change roles, remove members). Cannot assign or invite as Owner. - - **User** — View organization resources and create images. Cannot manage billing, API keys, or other members. - -**Organization settings** (members, invites, usage, billing): [https://htmlcsstoimage.com/dashboard/organization-settings](https://htmlcsstoimage.com/dashboard/organization-settings) - -**Account settings** (your email, organizations, switching orgs, pending invites): [https://htmlcsstoimage.com/account/settings](https://htmlcsstoimage.com/account/settings) - -For more detail, see [Organization settings](/guides/account/organization-settings/) and [Account settings](/guides/account/account-settings/) in the guides. - -
    - -### Official .NET / C# NuGet Packages -January 10, 2026 -{: .text-delta} - -We've released official NuGet packages for .NET developers! The new packages make it easy to integrate HTML/CSS to Image into your .NET applications with strongly-typed models and full async support. - -| Package | Description | -|:--------|:------------| -| [HtmlCssToImage](https://www.nuget.org/packages/HtmlCssToImage) | Core client library | -| [HtmlCssToImage.DependencyInjection](https://www.nuget.org/packages/HtmlCssToImage.DependencyInjection) | ASP.NET Core dependency injection | -| [HtmlCssToImage.Blazor](https://www.nuget.org/packages/HtmlCssToImage.Blazor) | Open Graph image tags for Blazor | -| [HtmlCssToImage.TagHelpers](https://www.nuget.org/packages/HtmlCssToImage.TagHelpers) | Razor tag helpers for MVC/Razor Pages | - -Key features: -- **Strongly-typed requests** for HTML/CSS, URL screenshots, and templates -- **Batch image creation** for generating multiple images in one call -- **Signed URL generation** for create-and-render workflows -- **Native AOT support** for .NET 9+ - -[View the C# documentation](/example-code/c/) or check out the [GitHub repository](https://github.com/htmlcsstoimage/dotnet-client). - -
    - -### MCP Server for AI Assistants -December 29, 2025 -{: .text-delta} - -We've launched an MCP (Model Context Protocol) server that lets you generate images directly from AI coding assistants. Simply describe what you want, and the AI will create it for you using the HTML/CSS to Image API. - -The MCP server supports: -- **Image creation** from HTML/CSS or URLs -- **Template management** for reusable image designs -- **Batch image generation** for creating multiple images at once -- **OAuth authentication** for seamless, secure access - -Works with Cursor, Claude Code, Claude Desktop, Windsurf, Cline, Zed, OpenCode, and automation platforms like Zapier and Pipedream. - -[Learn more about the MCP Server integration](/integrations/mcp/) - -
    - -### Automatic cookie consent banner blocking -June 18, 2025 -{: .text-delta} - -We've added a new `block_consent_banners` parameter that automatically blocks cookie consent popups and banners on websites. When set to `true`, the API will detect and hide common consent frameworks like OneTrust, Cookiebot, Quantcast Choice, TrustArc, and many others. - -This feature is especially useful for URL screenshots where cookie banners can interfere with the desired content. Instead of manually writing CSS to hide specific banners, you can now use this single parameter to handle most cases automatically. - -The automatic blocking is maintained and updated regularly to support new consent frameworks as they emerge. For custom implementations not covered by the automatic blocking, you can still use the existing CSS injection method. - -
    - -### Single-Request Image Generation endpoint -June 15, 2025 -{: .text-delta} - -We've released a powerful new endpoint that allows you to generate images from HTML/CSS in a single request using signed URLs. This new [create-and-render endpoint](/getting-started/create-and-render/) eliminates the need for the traditional two-step process of creating an image and then fetching it. - -Key benefits include: -- **Client-side friendly**: Generate image URLs without exposing your API key -- **No POST requests**: Skip the image creation step and go straight to rendering -- **HMAC authentication**: Secure signed URLs prevent unauthorized usage -- **Direct image response**: URLs return images immediately when accessed - -This endpoint is perfect for scenarios where you need to generate image URLs from client-side code or want to simplify your image generation workflow. The endpoint uses HMAC SHA256 authentication to ensure security while keeping your API key private. - -
    - -### DPI query param -December 18, 2024 -{: .text-delta} - -We've added a new query param `dpi` which allows you to set the DPI metadata tag on your generated image. For example `hcti.io/v1/image/123abc?dpi=300`. -This only sets the metadata tag, you must still create an image large enough for the needed DPI. - -
    - -### Learn how to make a downloadable image -December 20, 2023 -{: .text-delta} - -Did you know? You can make your image downloadable by adding `?dl=1` to the end of the URL. Learn more here: [dl param](/parameters/dl/) - -
    - -### New ms_delay and device_scale guides -November 19, 2023 -{: .text-delta} - -We've added new pages with detailed information on how to better use ms_delay and device_scale. - -1. [ms_delay](/parameters/ms_delay/) -2. [device_scale](/parameters/device_scale/) - -
    - -### Getting account usage -April 12, 2023 -{: .text-delta} - -We've added a new page explaining how to [grab your account usage](/management-api/usage/) via the API. - -
    - -### Invoice improvements -June 18, 2022 -{: .text-delta} - -The invoice page has been upgraded. You can now view all of your invoices, download a PDF, and make payments -on any overdue invoices. - -
    - -### Integromat integration is now called Make -June 1, 2022 -{: .text-delta} - -FYI - Integromat has rebranded to Make. We have updated all our links and documentation to now point to Make. - -
    -### ms_delay improvements -May 18, 2022 -{: .text-delta} - -This has been a much requested feature! - -We have increased the `ms_delay` limit to 20 seconds (20,000ms). Usage above 5000ms does cost an additional image credit. -For example, using `ms_delay` of 10000ms on an image will consume 2 image credits. - -This is useful for pages with very slow load times, such as metrics dashboards. We hope you find it useful! - -
    - -### Dashboard improvements -November 21, 2021 -{: .text-delta} - -We have added a `usage` endpoint to the API. This exposes the amount of images your account has created in hourly, daily and monthly rollups. [Learn more](/getting-started/using-the-api#checking-account-usage). - - -### Dashboard improvements -October 29, 2021 -{: .text-delta} - -We released several improvements to the dashboard and invoices based on your feedback. - -
    -### Large image performance improvements -July 23, 2021 -{: .text-delta} - -We made a handful of performance improvements for large image rendering speed. - - -
    -### Zapier integration updated -June 12, 2021 -{: .text-delta} - -Released a new version of the Zapier integration. Making security + performance improvements. - -
    -### Chrome version updated -May 15, 2021 -{: .text-delta} - -We updated the image renderer to use the newest build of Chrome. This means all of the latest features in Chrome will also render the same through the API. - -
    -### Hebrew character set updated -April 24, 2021 -{: .text-delta} - -We released an update to our default fonts to fix a bug where hebrew characters were not rendering properly. - -
    -### Image console on the dashboard -March 31, 2021 -{: .text-delta} - -We've made a bunch of improvements to the Dashboard. You can now create images in your own account using the Image Console tab. - -You can also create images using URL's from the console. Click the Options tab to see the new url field. - -
    -### Improvements to transparency rendering -February 16, 2021 -{: .text-delta} - -Background transparency now also works for images generated from URLs. To do it, pass the following code in your CSS param. - -``` -body { - background-color: transparent; -} -``` - -Note: this will only work for PNG's. Jpeg's do not support transparency. - -
    -### Demo and example pages now include an options tab -February 4, 2021 -{: .text-delta} - -We updated the live demo to be even more configurable. Now you can adjust all the options on an image when testing. - -We have also been releasing more examples which can be played with inside of the live demo. Give them a try here: HTML/CSS to Image Examples. - -
    -### Integromat integration updated -January 16, 2021 -{: .text-delta} - -We released new params to the Integromat integration. - -- CSS injection available for URLs. -- `selector` for specifying a CSS selector. - -
    -### New params added to Zapier -January 6, 2021 -{: .text-delta} - -A new version (1.0.10) of our Zapier plugin has been released. It includes some great new parameters for better control over your images. - -- viewport_height -- viewport_width -- ms_delay - -We also improved the error messages for when you run into a problem. - -
    - -### Inject custom CSS into a webpage -December 22, 2020 -{: .text-delta} - -When using [URL to Image](/getting-started/url-to-image), you can now inject CSS into the page. This is useful for cases where you want to customize your screenshot of the page. Allowing you to do things like hide specific elements on the page -(such as annoying popups or cookie banners). To get started with it, pass along the css param when using URL to image. This is now available on Zapier and soon will also be working for Integromat. - -### Zapier integration updated to 1.0.7 -December 20, 2020 -{: .text-delta} - -We've released a new version of the Zapier integration. It now gives you even more configuration options when creating images. For URL images, you'll now see a CSS field. This allows you to inject CSS into the webpage. -Making it easy to customize how the page looks. - -We have also added the `selector` field to the normal Create image action. This allows you to target a specific CSS selector in your HTML and we'll crop the image to that element. - -### Improvements to image deletion -December 13, 2020 -{: .text-delta} - -We've improved image deletion. Previously, images might take several minutes to be uncached and deleted everywhere. Now they are removed almost instantly. For more information, learn how to -[delete an image](/getting-started/using-the-api/#deleting-an-image). - - -
    -### Full screen parameter added to Integromat -November 13, 2020 -{: .text-delta} - -Integromat now has the full_screen parameter available. When set to true the entire height of the page will be included in the image. - - -
    -### Additional font rendering improvements -November 1, 2020 -{: .text-delta} - -We released another improvement to default font rendering. Fixing character widths when "Helvetica Neue" is specified as the default font family. - -
    -### Ruby client update -October 2, 2020 -{: .text-delta} - -We released a patch update to the [HTML/CSS to Image Ruby Client](https://github.com/htmlcsstoimage/ruby-client). It fixes an issue with -`addressable` not being loaded. - -
    -### Font rendering improvements -September 30, 2020 -{: .text-delta} - -We have released a large update to the fonts available to the API. Previously, we were missing some character sets and some images would show an -empty square instead of the correct character. Our goal is to be able to perfectly render text from any language. - -If you notice any more missing characters, please send us the image URL so that we can investigate it. - -
    -### Various performance improvements released -September 10, 2020 -{: .text-delta} - -We've been working on further improving the performance of the API. Initial image renders are now ~30% faster. We have also improved caching of images. -When cached, you can expect an average of 30-50ms when downloading an image. - -
    -### Zapier plugin released from beta! -August 31, 2020 -{: .text-delta} -The HTML/CSS to Image Zapier integration has graduated from beta. Zapier wrote up a [nice blog post about the integration](https://zapier.com/blog/updates/2370/new-integration-htmlcss-image). -It's become very popular quickly and we've seen many inventive ways people are improving their businesses through automated image generation. - -- [HTML/CSS to Image Zapier integration](https://docs.htmlcsstoimage.com/integrations/zapier) - -
    -### New Live Editor -August 16, 2020 -{: .text-delta} -We've rebuilt the live demo. Now you can preview your HTML/CSS as you edit it. Then click the *image* button to see it converted into an image. -This makes it much easier to prototype your images inside a browser. - -- [HTML/CSS to Image Demo](https://htmlcsstoimage.com/#demo) - -
    -### Ruby Client released -August 7, 2020 -{: .text-delta} -We have released the first version of our new ruby client. This allows for easier integration with the API using Ruby. - -- [HTML/CSS to Image Ruby Client](https://github.com/htmlcsstoimage/ruby-client) - - -### Integromat updates -August 3, 2020 -{: .text-delta} -We've added additional parameters to the Integromat integration. You can now use `selector`, `ms_delay` and `device_scale`. - -- [HTML/CSS to Image Integromat Integration](/integrations/make/) - -### Template API -July 27, 2020 -{: .text-delta} -The Template API is now available. With templates, you can create re-usable HTML that contains variables. -These variables can be replaced when creating an image, making for even simpler image generation. - -- [HTML/CSS to Image Template API](/getting-started/templates/) - -
    - -### Render when ready -July 26, 2020 -{: .text-delta} -We have added the [`render_when_ready` parameter to image creation](/parameters/render_when_ready/). This gives you control over when the image is rendered. - -By setting `render_when_ready` to `true`, we will wait to generate the image until your HTML calls the `ScreenshotReady()` function in JavaScript. - -This is useful for images that have complex JS and you need control over when it's ready to have an image created. - -
    - -### New Zapier templates -July 22, 2020 -{: .text-delta} -We have added additional Zapier templates to the integration. You can see them here: [HTML/CSS to Image Templates](https://zapier.com/apps/htmlcss-to-image/integrations#zap-template-list). - -
    - -### Introducing the US-EAST region -July 7, 2020 -{: .text-delta} -We have enabled our US-EAST region. Your API requests will now be automatically routed to either US-WEST or US-EAST based on where you ae located. -This will improve latency for requests as well as reliability of the API. We will automatically fail over to the other region is one is unhealthy. - -We plan to introduce an EU region in the future. - -
    - -### Brand new docs site -July 5, 2020 -{: .text-delta} -We've released a new version of our documentation website. It's now simpler, faster & we've improved the organization of all the content. -Please send us any feedback. - -
    - -### URL to Image performance improvements -July 17, 2020 -{: .text-delta} -We have been working on performance improvements to URL to Image. We've improved reliability when screenshotting webpages with large amounts of network requests and JavaScript. - -
    - -### URL to Image -March 27, 2020 -{: .text-delta} -We've added the ability to create images from URL's. We're calling this URL to Image. [Learn more](/getting-started/url-to-image). - -
    - -### ms_delay parameter -February 12, 2020 -{: .text-delta} -We have added the `ms_delay` parameter. Allowing you to specify how long you want the rendered to wait before generating the image. Useful for HTML with many assets or JavaScript that needs extra time to load. - -
    - -### Deleting images -December 12, 2019 -{: .text-delta} -We have added the [Delete endpoint](/getting-started/using-the-api/#deleting-an-image). You can now delete an image and it will be completely removed from our servers. Requests to the image URL will return 410. - -
    - -### Integromat integration -November 29, 2019 -{: .text-delta} -Our [Integromat integration](/integrations/make/) is now available. You can use the integration to connect HTML/CSS to Image with the thousands of integrations available on Integromat. - -
    diff --git a/dist/worker.js b/dist/worker.js deleted file mode 100644 index 3c38815..0000000 --- a/dist/worker.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){var i={};function p(t){if(i[t])return i[t].exports;var n=i[t]={i:t,l:!1,exports:{}};return a[t].call(n.exports,n,n.exports,p),n.l=!0,n.exports}p.m=a,p.c=i,p.d=function(a,i,t){p.o(a,i)||Object.defineProperty(a,i,{enumerable:!0,get:t})},p.r=function(a){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})},p.t=function(a,i){if(1&i&&(a=p(a)),8&i)return a;if(4&i&&"object"==typeof a&&a&&a.__esModule)return a;var t=Object.create(null);if(p.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:a}),2&i&&"string"!=typeof a)for(var n in a)p.d(t,n,function(i){return a[i]}.bind(null,n));return t},p.n=function(a){var i=a&&a.__esModule?function(){return a.default}:function(){return a};return p.d(i,"a",i),i},p.o=function(a,i){return Object.prototype.hasOwnProperty.call(a,i)},p.p="",p(p.s=1)}([function(a,i,p){"use strict";var t=this&&this.__awaiter||function(a,i,p,t){return new(p||(p=Promise))((function(n,e){function o(a){try{c(t.next(a))}catch(a){e(a)}}function l(a){try{c(t.throw(a))}catch(a){e(a)}}function c(a){var i;a.done?n(a.value):(i=a.value,i instanceof p?i:new p((function(a){a(i)}))).then(o,l)}c((t=t.apply(a,i||[])).next())}))},n=this&&this.__generator||function(a,i){var p,t,n,e,o={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]};return e={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(e[Symbol.iterator]=function(){return this}),e;function l(e){return function(l){return function(e){if(p)throw new TypeError("Generator is already executing.");for(;o;)try{if(p=1,t&&(n=2&e[0]?t.return:e[0]?t.throw||((n=t.return)&&n.call(t),0):t.next)&&!(n=n.call(t,e[1])).done)return n;switch(t=0,n&&(e=[2&e[0],n.value]),e[0]){case 0:case 1:n=e;break;case 4:return o.label++,{value:e[1],done:!1};case 5:o.label++,t=e[1],e=[0];continue;case 7:e=o.ops.pop(),o.trys.pop();continue;default:if(!(n=o.trys,(n=n.length>0&&n[n.length-1])||6!==e[0]&&2!==e[0])){o=0;continue}if(3===e[0]&&(!n||e[1]>n[0]&&e[1]{try{a.respondWith(async function(a){var i=new URL(a.request.url).pathname,p="https://docs.htmlcsstoimage.com";switch(i){case"/getting-started/creating-an-image":case"/getting-started/deleting-an-image":case"/getting-started/retrieving-an-image":case"/getting-started/authentication":return Response.redirect(p+"/getting-started/using-the-api/",301);case"/getting-started/full-page-images":return Response.redirect(p+"/getting-started/convert-emails-images/",301);case"/getting-started/duplicate-image-detection":return Response.redirect(p+"/guides/duplicate-image-detection/",301);case"/getting-started/faq":return Response.redirect(p+"/faq",301);case"/advanced-examples/using-google-fonts":return Response.redirect(p+"/guides/using-google-fonts",301);case"/advanced-examples/rendering-emoji":return Response.redirect(p+"/guides/rendering-emoji",301);case"/advanced-examples/image-charts-with-highcharts":return Response.redirect(p+"/guides/image-charts-with-highchartsjs",301);case"/advanced-examples/transparent-background":return Response.redirect(p+"/guides/transparent-background",301);case"/advanced-examples/external-css-and-fonts":return Response.redirect(p+"/guides/external-css-js-and-fonts/",301);case"/getting-started/lossless-image-optimization":return Response.redirect(p+"/getting-started/file-formats",301);case"/advanced-examples/instagram-embed":return Response.redirect(p+"/guides/instagram-embed/",301);case"/advanced-examples/twitter-embed":return Response.redirect(p+"/guides/twitter-embed/",301);default:return await async function(a){new URL(a.request.url);let i={},p={};p=a.request.url.match(/\.js$/)||a.request.url.match(/\.css$/)||a.request.url.match(/\.png$/)?{browserTTL:31536e3,edgeTTL:2592e3,bypassCache:!1}:{browserTTL:600,edgeTTL:60,bypassCache:!1};try{i.cacheControl=p;const n=await Object(t.getAssetFromKV)(a,i),e=new Response(n.body,n);return e.headers.set("X-XSS-Protection","1; mode=block"),e.headers.set("X-Content-Type-Options","nosniff"),e.headers.set("X-Frame-Options","DENY"),e.headers.set("Referrer-Policy","unsafe-url"),e.headers.set("Feature-Policy","none"),e}catch(i){try{let i=await Object(t.getAssetFromKV)(a,{mapRequestToAsset:a=>new Request(new URL(a.url).origin+"/404.html",a)});return new Response(i.body,{...i,status:404})}catch(a){}return new Response(i.message||i.toString(),{status:500})}}(a)}}(a))}catch(i){0,a.respondWith(new Response("Internal Error",{status:500}))}})},function(a,i,p){"use strict";var t=p(3);a.exports=new t(p(4),p(5))},function(a,i,p){"use strict";function t(){this._types=Object.create(null),this._extensions=Object.create(null);for(var a=0;a- - Add automatic Open Graph images and social cards to Shopify, Squarespace, Webflow, Wix, WordPress, Jekyll, Astro, and Sitepress sites. ---- -# OG Image platform guides -{: .no_toc } -{: .fs-9 } - -Add automatic Open Graph images to your CMS, store, site builder, or static site. -{: .fs-4 .fw-300 } - -Start with [Open Graph Images](/getting-started/og-images/) to create an OG Image Config and learn how page screenshots, templates, caching, and image sizing work. Then follow the setup guide for your platform: - -{% include og_image_platform_grid.html %} diff --git a/hmac-generator.md b/hmac-generator.md deleted file mode 100644 index 7860b9a..0000000 --- a/hmac-generator.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -layout: default -title: HMAC SHA-256 Generator -permalink: /hmac-generator/ -nav_exclude: true -description: >- - Generate an HMAC SHA-256 signature from any message and secret key with this private, client-side tool. Nothing is sent to our servers. ---- - -# HMAC SHA-256 Generator -{: .no_toc } -{: .fs-9 } - -Generate a token for an HTML/CSS to Image signed URL. -{: .fs-6 .fw-300 } - - - -
    -
    - Completely client-side. - Your API key and query string never leave this browser tab. This tool does not transmit, log, or store them. HMAC generation uses your browser's built-in Web Crypto API. -
    - -
    -
    - - -

    Enter the exact encoded query string that follows ?. A leading ? is ignored. Parameter order, encoding, whitespace, and repeated values matter.

    -
    - -
    - -
    - - -
    -
    - - -
    - - - -

    -
    - -Use the token in the path of your [create-and-render URL](/getting-started/create-and-render/#creating-an-image). Keep your API key secret; only the generated token belongs in the signed URL. - - - -The signing key must be enabled and grant [`images:create`](/getting-started/using-the-api/permissions/). See [API key management](/management-api/api-keys/) when replacing or disabling signing credentials. diff --git a/integrations/zapier.md b/integrations/zapier.md deleted file mode 100644 index 471e0e9..0000000 --- a/integrations/zapier.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -layout: page -title: Zapier integration -nav_title: Zapier -permalink: /integrations/zapier/ -parent: Integrations -nav_order: 1 -description: >- - Convert HTML/CSS to an image (jpg, png or webp) with Zapier. Renders images - exactly like Google Chrome. ---- -# Zapier: HTML/CSS to Image -{: .no_toc } -{: .fs-9 } - -Generate images on Zapier with HTML/CSS to Image. Renders exactly like Google Chrome. -{: .fs-4 .fw-300 } - -[Zapier integration](https://zapier.com/apps/htmlcss-to-image/integrations){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 target="_blank" } -[Get an API Key](https://htmlcsstoimage.com){: .btn .fs-5 .mb-4 .mb-md-0 target="_blank" } -
    - -Connect HTML/CSS to Image with thousands of integrations on Zapier. - - -{% cloudinary /assets/images/zapier.png alt="Connect html css to image with Zapier" %} - - -## Available Actions - -Our Zapier integration includes two actions. - -- Create images from HTML/CSS -- Create images from a URL - -## Authentication - -When connecting the integration to your account, you can retrieve your **User ID** and **API Key** from the dashboard. - - -[Get your free API Key](https://htmlcsstoimage.com/dashboard){: .btn .fs-5 .mb-4 .mb-md-0 .btn-blue target="_blank" } - -## Create images from HTML/CSS - -The Zapier integration makes it simple to create an image with the API. When creating an image you will see these options: - -HTML is the only required value. The rest are optional. - -| Name | Type | Description | -|:-------------|:------------------|:------| -| **html*** | `String` | This is the HTML you want to render. You can send an HTML snippet \(`
    Your content
    `\) or an entire webpage. | -| **css** | `String` | The CSS for your image. | -| **google_fonts** | `String` | [Google fonts](/guides/using-google-fonts/) to be loaded. Example: `Roboto`. Multiple fonts can be loaded like this: `Roboto|Open Sans` | -| **ms_delay** | `Integer` | The number of milliseconds the API should delay before generating the image. This is useful when waiting for JavaScript. We recommend starting with `500`. Large values slow down the initial render time.| -| **device_scale** | `Double` | This adjusts the pixel ratio for the screenshot. Minimum: `1`, Maximum: `3`. | - -{% include hint.md title="Variables in your HTML" text="When creating your HTML, the power of Zapier is using values from previous steps. You can integrate in values from Twitter, Airtable, Wordpress or any other of the Zapier integrations. Make your images unique and customized for the situation." %} - -## Create images from a URL -With this Zapier integration, you can generate a screenshot of any website. - -The only required value is `URL` the rest are optional. - - -| Name | Type | Description | -|:-------------|:------------------|:------| -| **url*** | `String` | The fully qualified URL to a public webpage. Such as `https://htmlcsstoimage.com`. When passed this will override the html param and will generate a screenshot of the url. | -| **device_scale** | `Double` | This adjusts the pixel ratio for the screenshot. Minimum: `1`, Maximum: `3`. | -| **ms_delay** | `Integer` | The number of milliseconds the API should delay before generating the image. This is useful when waiting for JavaScript. We recommend starting with `500`. Large values slow down the initial render time.| -| **viewport_width** | `Integer` | Set the width of Chrome's viewport. This will disable automatic cropping. Both height and width parameters must be set if using either. | -| **viewport_height** | `Integer` | Set the height of Chrome's viewport. This will disable automatic cropping. Both height and width parameters must be set if using either. | -| **selector** | `String` | A CSS selector for an element on the webpage. We'll crop the image to this specific element. For example: `section#complete-toolkit.container-lg` | - -## Troubleshooting - -If you have trouble with the Zapier integration, please send us an email: support@htmlcsstoimage.com and we'll help you out. - -### Designing images with HTML/CSS -Creating your image design can be the most challenging part. We suggest mocking up your image using [Codepen](https://pen.new). It allows you to see your HTML/CSS and edit it live. - -### 429 error -If you receive this error, it means you have exceeded your plan limit for creating images this month. Take a look at your [Dashboard](https://htmlcsstoimage.com/dashboard) to check your usage and upgrade your plan. - -### Blank images -When taking a screenshot of a URL, if you see a blank image, this often means that the screenshot was taken before the page was able to render anything. This can sometimes happen with complex pages that use a lot of JavaScript. To fix it, try adjusting the `ms_delay` value to slow down taking the screenshot. - - -{% include code_footer.md version=1 %} diff --git a/llms-full.txt b/llms-full.txt deleted file mode 100644 index 0e0c7f7..0000000 --- a/llms-full.txt +++ /dev/null @@ -1,529 +0,0 @@ -# HTML/CSS to Image API - Complete Documentation - -> API for converting HTML and CSS to high-quality images (PNG, JPG, WebP, PDF). Renders exactly like Google Chrome. - -Website: https://htmlcsstoimage.com -Documentation: https://docs.htmlcsstoimage.com -Dashboard: https://htmlcsstoimage.com/dashboard - ---- - -## Authentication - -The API uses HTTP Basic authentication. - -- Username: Your **API ID** (`api_id`) from the dashboard -- Password: Your **API Key** from the dashboard - -Get credentials at: https://htmlcsstoimage.com/dashboard - ---- - -## API Endpoints - -### Create Image - -``` -POST https://hcti.io/v1/image -``` - -Creates an image from HTML/CSS or screenshots a URL. - -**Required Parameters (one of):** - -| Parameter | Type | Description | -|-----------|------|-------------| -| `html` | String | HTML to render. Can be a snippet or full page. | -| `url` | String | URL to screenshot. Must be publicly accessible. | - -**Optional Parameters:** - -| Parameter | Type | Description | -|-----------|------|-------------| -| `css` | String | CSS styles for your HTML | -| `google_fonts` | String | Google Fonts to load. Multiple fonts: `Roboto|Open Sans` | -| `device_scale` | Double | Pixel ratio (0.1-3). Default: 2 (retina) | -| `viewport_width` | Integer | Browser viewport width in pixels | -| `viewport_height` | Integer | Browser viewport height in pixels | -| `viewport_mobile` | Boolean | Emulate a mobile viewport | -| `viewport_landscape` | Boolean | Render the viewport in landscape orientation | -| `viewport_touch` | Boolean | Enable touch support in the viewport | -| `media_type` | String | Emulate `screen` or `print` CSS media | -| `headers` | Object | Flat object of custom HTTP header names and values for URL screenshots. Up to 20 unique, case-insensitive names. | -| `additional_header_origins` | Array | Additional exact HTTP(S) origins allowed to receive custom headers. Up to 20 unique origins. | -| `include_headers_on_subrequests` | Boolean | Also send custom headers with subrequests to the requested URL's origin and any additional header origins. Default: false. | -| `identify_as_hcti` | Boolean | Add `X-HCTI-SCREENSHOT: 1` to the top-level URL request. | -| `selector` | String | CSS selector to capture specific element | -| `ms_delay` | Integer | Milliseconds to wait before capture (0-10000) | -| `max_wait_ms` | Integer | Maximum wait time cap (500-10000) | -| `render_when_ready` | Boolean | Wait for ScreenshotReady() JS call | -| `full_screen` | Boolean | Capture full scrollable page height | -| `block_consent_banners` | Boolean | Block cookie consent popups | -| `color_scheme` | String | `light` or `dark` mode | -| `timezone` | String | IANA timezone, e.g. `America/New_York` | -| `disable_twemoji` | Boolean | Use native emoji instead of Twemoji | -| `transparent_background` | Boolean | Render with a transparent background. Use PNG output. | -| `proxy_id` | String | Route the render's outbound traffic through one of your dashboard-configured HTTP proxies. Available on the 10k images/month plan or higher. See https://docs.htmlcsstoimage.com/guides/advanced/proxies/ | -| `storage_destination_id` | String | Save rendered files to one of your organization's configured storage destinations. Available on the 10,000 images/month plan or higher. See https://docs.htmlcsstoimage.com/guides/advanced/storage-destinations/ | - -**Example Request:** - -```bash -curl -X POST https://hcti.io/v1/image \ - -u 'your-user-id:your-api-key' \ - -H 'Content-Type: application/json' \ - -d '{ - "html": "
    Hello World
    ", - "google_fonts": "Roboto" - }' -``` - -**Response (200 OK):** - -```json -{ - "url": "https://hcti.io/v1/image/be4c5118-fe19-462b-a49e-48cf72697a9d", - "id": "be4c5118-fe19-462b-a49e-48cf72697a9d" -} -``` - ---- - -### Get Image - -``` -GET https://hcti.io/v1/image/:image_id -``` - -Returns the generated image. Append file extension for format: - -- `.png` (default) -- `.jpg` -- `.webp` -- `.pdf` - -**Query Parameters:** - -| Parameter | Type | Description | -|-----------|------|-------------| -| `width` | Integer | Resize width (max 5000) | -| `height` | Integer | Resize height (max 5000) | -| `dpi` | Integer | DPI metadata (30-600) | -| `dl` | Integer | Set to 1 for download attachment | - -**Cropping Parameters:** - -| Parameter | Description | -|-----------|-------------| -| `aspect_ratio` | Crop to ratio, e.g. `16_9`, `1_1` | -| `x_1`, `x_2` | X-axis crop coordinates | -| `y_1`, `y_2` | Y-axis crop coordinates | -| `crop_width` | Width of crop region | -| `crop_height` | Height of crop region | - ---- - -### Delete Image - -``` -DELETE https://hcti.io/v1/image/:image_id -``` - -Permanently deletes the image. Returns 202 Accepted. - ---- - -### Batch Create Images - -``` -POST https://hcti.io/v1/image/batch -``` - -Create up to 25 images in a single request. - -**Parameters:** - -| Parameter | Type | Description | -|-----------|------|-------------| -| `default_options` | Object | Default params for all images | -| `variations` | Array | Array of image objects (max 25) | - -**Example:** - -```json -{ - "default_options": { - "css": "body { font-family: sans-serif; }", - "device_scale": 2 - }, - "variations": [ - { "html": "
    Image 1
    " }, - { "html": "
    Image 2
    " }, - { "html": "
    Image 3
    " } - ] -} -``` - ---- - -### Batch Delete Images - -``` -DELETE https://hcti.io/v1/image/batch -``` - -```json -{ - "ids": ["abc123", "def456", "ghi789"] -} -``` - ---- - -### List Images - -``` -GET https://hcti.io/v1/images -``` - -**Query Parameters:** - -| Parameter | Type | Description | -|-----------|------|-------------| -| `count` | Integer | Number to return (max 50) | -| `page_token` | String | Pagination token | - ---- - -### Check Usage - -``` -GET https://hcti.io/v1/usage -``` - -Returns image creation counts by hour, day, month, and billing period. - ---- - -## Templates - -Templates allow reusable image designs with variable substitution. Templates can be created by sending HTML/CSS to the Templates API or by building visually in the dashboard with the Template Editor. - -Template Editor docs: -- Overview: https://docs.htmlcsstoimage.com/template-editor/ -- Quick Start: https://docs.htmlcsstoimage.com/template-editor/quick-start/ -- Canvas: https://docs.htmlcsstoimage.com/template-editor/canvas/ -- Variables: https://docs.htmlcsstoimage.com/template-editor/variables/ -- Blocks: https://docs.htmlcsstoimage.com/template-editor/blocks/ -- Advanced: https://docs.htmlcsstoimage.com/template-editor/advanced/ - -For editor templates, use the Variables guide to decide which values should be passed with `template_values`. Rich Text and HTML blocks can discover Handlebars variables from their content. Other supported properties can be connected to variables in the editor. - -### Create Template - -``` -POST https://hcti.io/v1/template -``` - -### Create Image from Template - -``` -POST https://hcti.io/v1/image -``` - -```json -{ - "template_id": "t-your-template-id", - "template_values": { - "title": "My Title", - "author": "John Doe" - } -} -``` - ---- - -## Automatic Open Graph Images - -OG Image Configs generate social cards for existing public websites, stores, CMSs, and static sites without requiring an API request or HMAC signature for every page. - -An exact website origin is connected to a domain ID. The path after that domain ID maps to the same path on the configured origin: - -| Public page | HCTI image URL | -|-------------|----------------| -| `https://example.com/` | `https://hcti.io/v1/og/DOMAIN_ID/` | -| `https://example.com/articles/hello` | `https://hcti.io/v1/og/DOMAIN_ID/articles/hello` | - -Rendering modes: -- **Page Screenshot:** Capture the page viewport or an element selected with `hcti:selector`. -- **Template Values:** Render an HCTI template using mapped page metadata or explicit `html:tv:VARIABLE_NAME` meta tags. - -Behavior: -- Dashboard defaults can be overridden with supported `hcti:` page metadata. Page metadata takes precedence. -- Refresh intervals control when HCTI checks the source page for new metadata. -- A numeric `hcti:content_version` gives changed content at the same page path a new image identity. -- Query strings are ignored for source-page selection and cache busting. -- Image sizing can use one universal image, adapt one render to platform-specific bounds, or render each platform size separately. - -Use an OG Image Config when images correspond to public page paths. Use the image API, templates, or signed image URLs when arbitrary values must be passed at request time. - -Documentation: -- Setup: https://docs.htmlcsstoimage.com/getting-started/og-images/ -- Supported page parameters: https://docs.htmlcsstoimage.com/getting-started/og-images/supported-parameters/ -- Platform and CMS guides: https://docs.htmlcsstoimage.com/guides/og-images/ -- Caching and refreshes: https://docs.htmlcsstoimage.com/guides/debugging/og-image-caching/ -- Signed Image URLs: https://docs.htmlcsstoimage.com/getting-started/create-and-render/ - ---- - -## HTTP Proxies - -Route a render's outbound traffic through your own HTTP proxy. Useful for restricting access to internal content, controlling the egress IP, or getting past bot detection. - -- Configure proxies in the dashboard at https://htmlcsstoimage.com/dashboard/proxies (URL, port, optional auth, optional bypass hosts). -- Use a proxy by passing `proxy_id` on the create image request. -- Disabling a proxy does not affect images that have already been generated. -- Available on the 10,000 images/month plan or higher. - -Full guide: https://docs.htmlcsstoimage.com/guides/advanced/proxies/ - ---- - -## Storage Destinations - -Save rendered files to an Amazon S3 or S3-compatible bucket owned by your organization. - -- Configure and test destinations at https://htmlcsstoimage.com/dashboard/storage-destinations -- Supported providers: Amazon S3, Cloudflare R2, Backblaze B2, DigitalOcean Spaces, Wasabi, Google Cloud Storage, and other S3-compatible services. -- Cloudflare R2 includes an optional **Data jurisdiction** setting. Choose **Default** for unrestricted and location-hint buckets, **European Union** for EU jurisdiction buckets, or **FedRAMP** for FedRAMP jurisdiction buckets. Changing it requires another connection test. -- Pass `storage_destination_id` on HTML/CSS, URL, batch, or template create requests. -- By default, HCTI retains its normal copy and also writes to your bucket. -- **Disable HCTI Storage** keeps rendered files out of HCTI storage and the HCTI CDN. -- When you choose to **Disable HCTI Storage**, the image create response contains a `/v1/store/...` URL. Send an authenticated `PUT` request to that URL using valid API credentials from the same organization as the image. Missing or invalid credentials return HTTP 401. -- HTTP 200 and 424 store responses return a JSON `StoreImageResult` with `outcome`, `baseResult`, `transformationResult`, `success`, `message`, and `statusCode`. Incomplete results also include `error` and `referenceId`; other failures use the standard API error format. -- `outcome` is `complete` (HTTP 200), `partial` (HTTP 424; base stored but transformation failed), or `failed` (HTTP 424; base not stored). -- Each object result reports `status` (`stored`, `already_stored`, `failed`, or `not_attempted`), `target` (`hcti_storage` or `storage_destination`), `bucket`, and `key`. -- Objects use the access settings configured on the destination bucket; HCTI does not make them public. Deleting an image or destination in HCTI does not delete rendered objects already written to the bucket. -- Available on the 10,000 images/month plan or higher. - -Full guide: https://docs.htmlcsstoimage.com/guides/advanced/storage-destinations/ - -Provider setup guides: - -- Amazon S3: https://docs.htmlcsstoimage.com/guides/advanced/storage-destinations/s3/ -- Cloudflare R2: https://docs.htmlcsstoimage.com/guides/advanced/storage-destinations/r2/ -- Backblaze B2: https://docs.htmlcsstoimage.com/guides/advanced/storage-destinations/backblaze-b2/ -- DigitalOcean Spaces: https://docs.htmlcsstoimage.com/guides/advanced/storage-destinations/digitalocean-spaces/ -- Wasabi: https://docs.htmlcsstoimage.com/guides/advanced/storage-destinations/wasabi/ -- Google Cloud Storage: https://docs.htmlcsstoimage.com/guides/advanced/storage-destinations/google-cloud-storage/ -- Other S3-compatible services: https://docs.htmlcsstoimage.com/guides/advanced/storage-destinations/s3-compatible/ - ---- - -## MCP Server Integration - -For AI assistants like Cursor, Claude Desktop, Windsurf, Cline, and Zed. - -**Server URL:** `https://mcp.hcti.io` - -**Available Tools:** -- `create_image` - Generate image from HTML/CSS -- `create_url_image` - Screenshot a URL -- `create_templated_image` - Use a template -- `create_batch_images` - Create multiple images -- `create_template` - Save a template -- `list_templates` - View templates - -**Cursor Setup:** - -```json -{ - "mcpServers": { - "hcti": { - "type": "http", - "url": "https://mcp.hcti.io" - } - } -} -``` - ---- - -## n8n Integration - -Use the HTML/CSS to Image integration to generate images, website screenshots, PDFs, and signed render-on-demand URLs in n8n workflows. - -**Package:** `@html-css-to-image/n8n-nodes-html-css-to-image` - -**Docs:** https://docs.htmlcsstoimage.com/integrations/n8n/ - -**npm:** https://www.npmjs.com/package/@html-css-to-image/n8n-nodes-html-css-to-image - -**Available operations:** -- Create an image or PDF from HTML and CSS -- Take a screenshot of a webpage URL -- Render a saved template with dynamic values -- Generate signed template or webpage URLs -- Return URL metadata, a binary PNG/JPG/WebP/PDF file, or both - ---- - -## Official TypeScript Client (npm) - -Use the official npm package for typed requests and helper methods in Node.js/TypeScript projects. - -**Package:** `@html-css-to-image/client` -**Install:** `npm install @html-css-to-image/client` -**Docs:** https://docs.htmlcsstoimage.com/example-code/typescript/ -**npm:** https://www.npmjs.com/package/@html-css-to-image/client - ---- - -## Official Python Client (PyPI) - -Use the official Python package for typed requests and responses, configurable HTTPX transport, and signed URL helpers. - -- **Package:** `html-css-to-image` -- **Install:** `pip install html-css-to-image` -- **Docs:** https://docs.htmlcsstoimage.com/example-code/python/ -- **PyPI:** https://pypi.org/project/html-css-to-image/ -- **GitHub:** https://github.com/htmlcsstoimage/python-client - ---- - -## Official PHP Client (Packagist) - -Use the official Composer package for typed requests and responses, injectable PSR-18 transport, and signed URL helpers. - -- **Package:** `html-css-to-image/client` -- **Install:** `composer require html-css-to-image/client` -- **Docs:** https://docs.htmlcsstoimage.com/example-code/php/ -- **Packagist:** https://packagist.org/packages/html-css-to-image/client -- **GitHub:** https://github.com/htmlcsstoimage/php-client - ---- - -## Code Examples - -### Python - -```python -import requests - -HCTI_API_ENDPOINT = "https://hcti.io/v1/image" -HCTI_API_USER_ID = 'your-user-id' -HCTI_API_KEY = 'your-api-key' - -data = { - 'html': "
    Hello, world!
    ", - 'css': ".box { color: white; background-color: #0f79b9; padding: 10px; }" -} - -image = requests.post( - url=HCTI_API_ENDPOINT, - data=data, - auth=(HCTI_API_USER_ID, HCTI_API_KEY) -) - -print(image.json()['url']) -``` - -### JavaScript (Node.js) - -```javascript -const fetch = require('node-fetch'); - -const data = { - html: "
    Hello, world!
    ", - css: ".box { color: white; background-color: #0f79b9; padding: 10px; }" -}; - -const response = await fetch('https://hcti.io/v1/image', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Basic ' + Buffer.from('user-id:api-key').toString('base64') - }, - body: JSON.stringify(data) -}); - -const result = await response.json(); -console.log(result.url); -``` - -### cURL - -```bash -curl -X POST https://hcti.io/v1/image \ - -u 'user-id:api-key' \ - -H 'Content-Type: application/json' \ - -d '{"html": "

    Hello World

    "}' -``` - ---- - -## Common Use Cases - -1. **Social Cards (OG Images)** - Use path-based OG Image Configs for public sites and CMSs, or templates and the image API for application data -2. **Website Screenshots** - Capture any public URL -3. **Dynamic Images** - Certificates, receipts, personalized graphics -4. **Email Images** - Generate images for email campaigns - ---- - -## FAQ - -**Is there a rate limit?** -Image creation has no per-second or per-minute rate limit and uses plan image credits. Management resources have separate limits of 100 reads and 20 writes per minute per resource family and organization, shared across REST and MCP. - -**How long do image URLs last?** -Forever, as long as your account is active. - -**What file formats are supported?** -PNG (default), JPG, WebP, and PDF. - -**Do you support custom fonts?** -Yes, via `google_fonts` parameter or embedding font links in HTML. - ---- - -## Support - -Email: support@htmlcsstoimage.com - -We're experts at debugging HTML rendering issues and love helping developers succeed. - -## Management API, credentials, and permissions - -Base URL: https://hcti.io/v1. Same Basic authentication as image generation: api_id is the username, api_key is the secret password. A key's resource id is used in management URLs, not authentication. - -- Management overview: https://docs.htmlcsstoimage.com/management-api/ -- Interactive API reference: https://htmlcsstoimage.com/api-docs -- API keys and authentication: https://docs.htmlcsstoimage.com/getting-started/using-the-api/api-keys/ -- Permission reference: https://docs.htmlcsstoimage.com/getting-started/using-the-api/permissions/ -- Rate limits: https://docs.htmlcsstoimage.com/getting-started/using-the-api/rate-limits/ -- Key management: https://docs.htmlcsstoimage.com/management-api/api-keys/ -- Usage: https://docs.htmlcsstoimage.com/management-api/usage/ -- Proxies: https://docs.htmlcsstoimage.com/management-api/proxies/ -- Storage destinations: https://docs.htmlcsstoimage.com/management-api/storage-destinations/ -- OG configurations: https://docs.htmlcsstoimage.com/management-api/og-configs/ -- Complete MCP tools: https://docs.htmlcsstoimage.com/integrations/mcp/tools/ -- MCP authorization: https://docs.htmlcsstoimage.com/integrations/mcp/permissions/ - -Resource endpoints: /api-keys, /proxies, /storage-destinations, /og-configs. Create with POST, list/get with GET, delete with DELETE. Updates replace configuration and use POST. Lists use count (1–100, default 10) and page_start; follow pagination.next_page_start until null. Lists include disabled resources except keys, which require include_disabled=true. - -API key creation returns the secret once; subsequent public API responses omit it. DELETE disables a key and can be reversed through update. The caller cannot grant permissions beyond its own authority, and must have authority over both existing and replacement grants when updating a key. Explicit current permissions do not grant future permissions; all_future_permissions is a separate opt-in unavailable to MCP. - -Permissions: images:create, images:read, images:delete, images:store; templates:read, templates:create_update, templates:delete; usage:read; and read/create_update/delete for proxies, storage_destinations, og_configs, and api_keys. Management permissions are separate from using existing resources in image creation. api_keys permissions are REST-only. - -REST historical usage at GET /v1/usage requires usage:read. Hour/day/month series are overlapping views, not additive. MCP check_usage returns current usage/allowance/overages/reset, and get_max_batch_size returns the batch limit (0 means no batching). Both require usage:read. - -Management limits: 100 reads/minute and 20 writes/minute per organization for each resource family, shared across all credentials and REST/MCP. Rate-limit groups are api-key:read/write, proxy:read/write, storage-destination:read/write, and og-config:read/write. GET /storage-destinations/aws-external-id and MCP get_aws_storage_external_id require storage_destinations:create_update but use the storage read bucket. REST responses include RateLimit-Policy, RateLimit when available, and Retry-After when available on rejection. Respect Retry-After or wait 60 seconds for management throttles. MCP returns a tool error instructing a 60-second wait. Image, template, and usage endpoints do not use these management buckets. Image-credit exhaustion is a different 429; waiting a minute does not restore credits. - -MCP management tools: create_proxy, update_proxy, get_proxy, list_proxies, delete_proxy; create_storage_destination, update_storage_destination, get_storage_destination, list_storage_destinations, delete_storage_destination, get_aws_storage_external_id; create_og_config, update_og_config, get_og_config, list_og_configs, delete_og_config. Create/update use content (plus id on update); get/delete use id; list uses count/page_start. Management results wrap the resource or list in item with success/error. Permission or throttle failures can be direct tool errors. - -MCP uses OAuth. Tool discovery is not a permission grant. Reconnect and complete new authorization to add permissions; refresh does not expand grants. Do not retry denied operations until access changes. Never ask users to paste API keys or OAuth tokens into chat. No MCP tools manage API keys, delete images/templates, or change billing/membership. - -Proxy responses return a top-level username (null means no authentication; an empty string is a valid username), never passwords. Proxy REST/MCP updates retain a password only with authentication.retain_password=true, an unchanged username, and an omitted/null password. Otherwise supply a password; an empty string replaces it with an empty password. Omitted/null authentication removes authentication. - -Access-key storage REST/MCP updates retain a secret only with connection_info.retain_secret_access_key=true, unchanged provider/access_key_id, and an omitted/null secret_access_key. Otherwise supply the secret, including when disabling. Creating resources or changing credential identity requires the secret. Neither retention flag can be true alongside a supplied secret. Retention flags are request-only; Amazon S3 uses IAM roles instead. diff --git a/llms.txt b/llms.txt deleted file mode 100644 index 7e97ffb..0000000 --- a/llms.txt +++ /dev/null @@ -1,154 +0,0 @@ -# HTML/CSS to Image API - -> API for converting HTML and CSS to high-quality images (PNG, JPG, WebP, PDF). Renders exactly like Google Chrome. - -## Quick Start - -- **Endpoint:** `POST https://hcti.io/v1/image` -- **Authentication:** HTTP Basic Auth (API ID + API Key) -- **Get credentials:** https://htmlcsstoimage.com/dashboard - -## Example Request - -```bash -curl -X POST https://hcti.io/v1/image \ - -u 'your-user-id:your-api-key' \ - -H 'Content-Type: application/json' \ - -d '{"html": "
    Hello World
    "}' -``` - -## Response - -```json -{ - "url": "https://hcti.io/v1/image/be4c5118-fe19-462b-a49e-48cf72697a9d", - "id": "be4c5118-fe19-462b-a49e-48cf72697a9d" -} -``` - -## Capabilities - -- Convert HTML/CSS to images (PNG, JPG, WebP, PDF) -- Screenshot any public URL -- Batch create up to 25 images in one request -- Reusable templates with variable substitution -- Visual Template Editor for building saved templates from blocks in the dashboard -- Automatic Open Graph images for public website and CMS pages with path-based image URLs -- MCP Server integration for AI assistants (Cursor, Claude, Windsurf) -- HTTP proxy support for routing render traffic through your own proxy -- Custom storage destinations for saving renders to your own S3-compatible bucket -- Global CDN delivery via Cloudflare - -## Key Parameters - -| Parameter | Description | -|-----------|-------------| -| `html` | HTML to render (required unless using `url`) | -| `css` | CSS styles for your HTML | -| `url` | URL to screenshot (required unless using `html`) | -| `google_fonts` | Google Fonts to load | -| `device_scale` | Pixel ratio (1-3) for retina images | -| `viewport_width` | Browser viewport width | -| `viewport_height` | Browser viewport height | -| `viewport_mobile` | Emulate a mobile viewport | -| `viewport_landscape` | Render the viewport in landscape orientation | -| `viewport_touch` | Enable touch support in the viewport | -| `media_type` | Apply `screen` or `print` CSS media styles | -| `headers` | Add custom HTTP headers to a URL screenshot | -| `additional_header_origins` | Additional exact HTTP(S) origins allowed to receive custom headers | -| `include_headers_on_subrequests` | Also send custom headers with subrequests to allowed origins | -| `identify_as_hcti` | Identify the top-level request with `X-HCTI-SCREENSHOT: 1` | -| `selector` | CSS selector to capture specific element | -| `ms_delay` | Milliseconds to wait before capture | -| `transparent_background` | Set to `true` to render a transparent PNG | -| `storage_destination_id` | Save rendered files to a configured storage destination | -| `jumbo_max_width` | Max output width for jumbo renders (up to 80,000px). Must be set with `jumbo_max_height`. | -| `jumbo_max_height` | Max output height for jumbo renders (up to 80,000px). Must be set with `jumbo_max_width`. | - -With **Disable HCTI Storage**, authenticate the returned `/v1/store/...` URL with an HTTP Basic `PUT` request using API credentials from the same organization as the image. Its HTTP 200 or 424 JSON response reports the overall outcome plus status, target, bucket, and key for the base image and any transformation. - -## Automatic Open Graph Images - -An OG Image Config connects an exact public website origin to a path-based HCTI image URL. For example, `/v1/og/DOMAIN_ID/articles/hello` renders the configured origin's `/articles/hello` page. - -- Use **Page Screenshot** to capture the page, viewport, or a selected element. -- Use **Template Values** to populate an HCTI template from page titles, descriptions, Open Graph metadata, mapped custom metadata, or explicit `html:tv:` values. -- Supported page-level screenshot overrides use `hcti:` metadata. -- Page metadata can be refreshed on an interval. A numeric `hcti:content_version` creates a new content identity for changes at the same path. -- Image sizing can use one universal render, resize one render for the requesting platform, or render platform-specific sizes. -- Query strings do not select a different source page or bust the OG image cache. - -Use OG Image Configs for social cards tied to existing public pages. Use the standard API or signed image URLs when arbitrary values must be supplied at request time. - -## Documentation - -- **API Reference:** https://docs.htmlcsstoimage.com/getting-started/using-the-api/ -- **Code Examples:** https://docs.htmlcsstoimage.com/example-code/ -- **Parameters:** https://docs.htmlcsstoimage.com/parameters/ -- **Templates API:** https://docs.htmlcsstoimage.com/getting-started/templates/ -- **Automatic Open Graph Images:** https://docs.htmlcsstoimage.com/getting-started/og-images/ -- **Supported OG Image Parameters:** https://docs.htmlcsstoimage.com/getting-started/og-images/supported-parameters/ -- **OG Image CMS Guides:** https://docs.htmlcsstoimage.com/guides/og-images/ -- **OG Image Caching:** https://docs.htmlcsstoimage.com/guides/debugging/og-image-caching/ -- **Signed Image URLs:** https://docs.htmlcsstoimage.com/getting-started/create-and-render/ -- **Template Editor:** https://docs.htmlcsstoimage.com/template-editor/ -- **Template Editor Variables:** https://docs.htmlcsstoimage.com/template-editor/variables/ -- **Template Editor Blocks:** https://docs.htmlcsstoimage.com/template-editor/blocks/ -- **MCP Server:** https://docs.htmlcsstoimage.com/integrations/mcp/ -- **n8n Integration:** https://docs.htmlcsstoimage.com/integrations/n8n/ -- **TypeScript Client (npm):** https://docs.htmlcsstoimage.com/example-code/typescript/ -- **Python Client (PyPI):** https://docs.htmlcsstoimage.com/example-code/python/ -- **PHP Client (Packagist):** https://docs.htmlcsstoimage.com/example-code/php/ -- **.NET Client (NuGet):** https://docs.htmlcsstoimage.com/example-code/c/ -- **HTTP Proxies:** https://docs.htmlcsstoimage.com/guides/advanced/proxies/ -- **Storage Destinations:** https://docs.htmlcsstoimage.com/guides/advanced/storage-destinations/ — Includes individual setup guides for Amazon S3, Cloudflare R2, Backblaze B2, DigitalOcean Spaces, Wasabi, Google Cloud Storage, and other S3-compatible services. -- **Jumbo Images:** https://docs.htmlcsstoimage.com/guides/advanced/jumbo-images/ -- **Viewport Parameters:** https://docs.htmlcsstoimage.com/parameters/viewport/ -- **CSS Media Type:** https://docs.htmlcsstoimage.com/parameters/media_type/ -- **Custom Request Headers:** https://docs.htmlcsstoimage.com/parameters/headers/ -- **Identify HCTI Requests:** https://docs.htmlcsstoimage.com/parameters/identify_as_hcti/ -- **Cloudflare Challenges:** https://docs.htmlcsstoimage.com/guides/debugging/cloudflare-challenges/ -- **Transparent Backgrounds:** https://docs.htmlcsstoimage.com/guides/styling/transparent-background/ -- **FAQ:** https://docs.htmlcsstoimage.com/faq/ - -## Integrations - -- **Zapier:** https://docs.htmlcsstoimage.com/integrations/zapier/ -- **Make:** https://docs.htmlcsstoimage.com/integrations/make/ -- **n8n:** https://docs.htmlcsstoimage.com/integrations/n8n/ -- **MCP Server:** https://docs.htmlcsstoimage.com/integrations/mcp/ -- **TypeScript Client (npm):** https://docs.htmlcsstoimage.com/example-code/typescript/ -- **Python Client (PyPI):** https://docs.htmlcsstoimage.com/example-code/python/ -- **PHP Client (Packagist):** https://docs.htmlcsstoimage.com/example-code/php/ -- **.NET Client (NuGet):** https://docs.htmlcsstoimage.com/example-code/c/ - -## Code Examples Available - -Python, PHP, JavaScript, TypeScript, Ruby, Go, C#, VB.NET, cURL, Google Apps Script - -## Support - -Email: support@htmlcsstoimage.com - -## Management API, credentials, and permissions - -Base URL: https://hcti.io/v1. Same Basic authentication as image generation: api_id is the username, api_key is the secret password. A key's resource id is used in management URLs, not authentication. - -- Management overview: https://docs.htmlcsstoimage.com/management-api/ -- Interactive API reference: https://htmlcsstoimage.com/api-docs -- API keys and authentication: https://docs.htmlcsstoimage.com/getting-started/using-the-api/api-keys/ -- Permission reference: https://docs.htmlcsstoimage.com/getting-started/using-the-api/permissions/ -- Rate limits: https://docs.htmlcsstoimage.com/getting-started/using-the-api/rate-limits/ -- Key management: https://docs.htmlcsstoimage.com/management-api/api-keys/ -- Usage: https://docs.htmlcsstoimage.com/management-api/usage/ -- Proxies: https://docs.htmlcsstoimage.com/management-api/proxies/ -- Storage destinations: https://docs.htmlcsstoimage.com/management-api/storage-destinations/ -- OG configurations: https://docs.htmlcsstoimage.com/management-api/og-configs/ -- Complete MCP tools: https://docs.htmlcsstoimage.com/integrations/mcp/tools/ -- MCP authorization: https://docs.htmlcsstoimage.com/integrations/mcp/permissions/ - -Create and update resources with POST, list/get with GET, and delete with DELETE. API key deletion disables the key. Management operations require the corresponding resource permission; rendering with an existing resource uses image permissions. - -Management reads allow 100 requests/minute and writes 20 requests/minute per resource family and organization, shared across REST and MCP. Image creation has no per-second or per-minute request limit; plan image credits still apply. Respect Retry-After or wait 60 seconds for management throttles. - -API keys use explicit permission lists; all_future_permissions opts into all current and future grants. MCP uses OAuth and requires new authorization to add permissions. MCP does not support API key management. See the references above for request schemas, permission rules, and tool arguments. diff --git a/migration/EDITORIAL.md b/migration/EDITORIAL.md new file mode 100644 index 0000000..32fcc6e --- /dev/null +++ b/migration/EDITORIAL.md @@ -0,0 +1,21 @@ +# Editorial review during migration + +Review every page individually for clarity and consistency as well as native +markup. Preserve facts, meaningful examples, URLs, and incoming heading links. + +For parameter reference pages: + +- Start with a short description, then **How it works** explaining behavior. +- Follow with values, defaults, requirements or limits where relevant, then + examples and practical guidance. Keep topic-specific sections when useful. +- Use sentence case in headings and callout titles, preserving proper names + and exact API identifiers. Use **Example usage** for a general examples section. +- Keep examples valid for their declared language, and ensure tables work in + both HTML and exported Markdown. +- Avoid repeated explanations or contradictory advice. Verify uncertain API + behavior against implementation rather than guessing during a visual rewrite. +- Preserve old anchors when renaming headings by adding explicit anchor aliases. + +The Parameters index is a directory, not an individual reference page; its +structure can differ. Guides, tutorials and API resources should follow a +consistent structure appropriate to their purpose rather than this exact outline. diff --git a/migration/legacy-anchors.json b/migration/legacy-anchors.json new file mode 100644 index 0000000..d6c8ca6 --- /dev/null +++ b/migration/legacy-anchors.json @@ -0,0 +1,10819 @@ +{ + "/": { + "ids": [ + "htmlcss-to-image-api", + "three-ways-to-generate-images", + "from-htmlcss", + "from-any-url", + "automatic-open-graph-images", + "quick-start", + "trusted-by-developers-worldwide", + "manage-organization-resources", + "get-an-api-key", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "htmlcss-to-image-api", + "text": "HTML/CSS to Image API", + "level": 1 + }, + { + "id": "three-ways-to-generate-images", + "text": "Three ways to generate images", + "level": 2 + }, + { + "id": "from-htmlcss", + "text": "From HTML/CSS", + "level": 3 + }, + { + "id": "from-any-url", + "text": "From any URL", + "level": 3 + }, + { + "id": "automatic-open-graph-images", + "text": "Automatic Open Graph images", + "level": 3 + }, + { + "id": "quick-start", + "text": "Quick start", + "level": 2 + }, + { + "id": null, + "text": "Works with any language", + "level": 3 + }, + { + "id": "trusted-by-developers-worldwide", + "text": "Trusted by developers worldwide", + "level": 2 + }, + { + "id": "manage-organization-resources", + "text": "Manage organization resources", + "level": 2 + }, + { + "id": "get-an-api-key", + "text": "Get an API key", + "level": 2 + } + ] + }, + "/changelog/": { + "ids": [ + "changelog", + "official-go-client", + "management-api-and-scoped-permissions", + "official-python-and-php-clients", + "htmlcss-to-image-is-now-verified-by-n8n", + "choose-the-returned-file-format-in-image-creation-requests", + "ruby-client-v020", + "automatic-open-graph-images-for-websites-and-cmss", + "control-duplicate-image-detection-with-dedupe_duration_s", + "custom-request-headers-for-url-screenshots", + "store-rendered-images-in-your-own-bucket", + "image-deletion-in-net-v080-and-typescript-v050", + "transparent-backgrounds-with-one-parameter", + "htmlcsstoimage-net-client-v060", + "n8n-integration", + "template-editor-context-menu--input-improvements", + "template-editor-for-visual-template-design", + "jumbo-images--render-up-to-80000px-without-quality-loss", + "route-renders-through-your-own-http-proxy", + "organizations-invites-and-user-permissions", + "official-net--c-nuget-packages", + "mcp-server-for-ai-assistants", + "automatic-cookie-consent-banner-blocking", + "single-request-image-generation-endpoint", + "dpi-query-param", + "learn-how-to-make-a-downloadable-image", + "new-ms_delay-and-device_scale-guides", + "getting-account-usage", + "invoice-improvements", + "integromat-integration-is-now-called-make", + "ms_delay-improvements", + "dashboard-improvements", + "dashboard-improvements-1", + "large-image-performance-improvements", + "zapier-integration-updated", + "chrome-version-updated", + "hebrew-character-set-updated", + "image-console-on-the-dashboard", + "improvements-to-transparency-rendering", + "demo-and-example-pages-now-include-an-options-tab", + "integromat-integration-updated", + "new-params-added-to-zapier", + "inject-custom-css-into-a-webpage", + "zapier-integration-updated-to-107", + "improvements-to-image-deletion", + "full-screen-parameter-added-to-integromat", + "additional-font-rendering-improvements", + "ruby-client-update", + "font-rendering-improvements", + "various-performance-improvements-released", + "zapier-plugin-released-from-beta", + "new-live-editor", + "ruby-client-released", + "integromat-updates", + "template-api", + "render-when-ready", + "new-zapier-templates", + "introducing-the-us-east-region", + "brand-new-docs-site", + "url-to-image-performance-improvements", + "url-to-image", + "ms_delay-parameter", + "deleting-images", + "integromat-integration", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "changelog", + "text": "Changelog", + "level": 1 + }, + { + "id": "official-go-client", + "text": "Official Go client", + "level": 3 + }, + { + "id": "management-api-and-scoped-permissions", + "text": "Management API and scoped permissions", + "level": 3 + }, + { + "id": "official-python-and-php-clients", + "text": "Official Python and PHP clients", + "level": 3 + }, + { + "id": "htmlcss-to-image-is-now-verified-by-n8n", + "text": "HTML/CSS to Image is now verified by n8n", + "level": 3 + }, + { + "id": "choose-the-returned-file-format-in-image-creation-requests", + "text": "Choose the returned file format in image creation requests", + "level": 3 + }, + { + "id": "ruby-client-v020", + "text": "Ruby client v0.2.0", + "level": 3 + }, + { + "id": "automatic-open-graph-images-for-websites-and-cmss", + "text": "Automatic Open Graph images for websites and CMSs", + "level": 3 + }, + { + "id": "control-duplicate-image-detection-with-dedupe_duration_s", + "text": "Control duplicate image detection with dedupe_duration_s", + "level": 3 + }, + { + "id": "custom-request-headers-for-url-screenshots", + "text": "Custom request headers for URL screenshots", + "level": 3 + }, + { + "id": "store-rendered-images-in-your-own-bucket", + "text": "Store rendered images in your own bucket", + "level": 3 + }, + { + "id": "image-deletion-in-net-v080-and-typescript-v050", + "text": "Image deletion in .NET v0.8.0 and TypeScript v0.5.0", + "level": 3 + }, + { + "id": "transparent-backgrounds-with-one-parameter", + "text": "Transparent backgrounds with one parameter", + "level": 3 + }, + { + "id": "htmlcsstoimage-net-client-v060", + "text": "HtmlCssToImage .NET Client v0.6.0", + "level": 3 + }, + { + "id": "n8n-integration", + "text": "n8n integration", + "level": 3 + }, + { + "id": "template-editor-context-menu--input-improvements", + "text": "Template Editor: Context Menu & Input Improvements", + "level": 3 + }, + { + "id": "template-editor-for-visual-template-design", + "text": "Template Editor for visual template design", + "level": 3 + }, + { + "id": "jumbo-images--render-up-to-80000px-without-quality-loss", + "text": "Jumbo images \u2014 render up to 80,000px without quality loss", + "level": 3 + }, + { + "id": "route-renders-through-your-own-http-proxy", + "text": "Route renders through your own HTTP proxy", + "level": 3 + }, + { + "id": "organizations-invites-and-user-permissions", + "text": "Organizations, invites, and user permissions", + "level": 3 + }, + { + "id": "official-net--c-nuget-packages", + "text": "Official .NET / C# NuGet Packages", + "level": 3 + }, + { + "id": "mcp-server-for-ai-assistants", + "text": "MCP Server for AI Assistants", + "level": 3 + }, + { + "id": "automatic-cookie-consent-banner-blocking", + "text": "Automatic cookie consent banner blocking", + "level": 3 + }, + { + "id": "single-request-image-generation-endpoint", + "text": "Single-Request Image Generation endpoint", + "level": 3 + }, + { + "id": "dpi-query-param", + "text": "DPI query param", + "level": 3 + }, + { + "id": "learn-how-to-make-a-downloadable-image", + "text": "Learn how to make a downloadable image", + "level": 3 + }, + { + "id": "new-ms_delay-and-device_scale-guides", + "text": "New ms_delay and device_scale guides", + "level": 3 + }, + { + "id": "getting-account-usage", + "text": "Getting account usage", + "level": 3 + }, + { + "id": "invoice-improvements", + "text": "Invoice improvements", + "level": 3 + }, + { + "id": "integromat-integration-is-now-called-make", + "text": "Integromat integration is now called Make", + "level": 3 + }, + { + "id": "ms_delay-improvements", + "text": "ms_delay improvements", + "level": 3 + }, + { + "id": "dashboard-improvements", + "text": "Dashboard improvements", + "level": 3 + }, + { + "id": "dashboard-improvements-1", + "text": "Dashboard improvements", + "level": 3 + }, + { + "id": "large-image-performance-improvements", + "text": "Large image performance improvements", + "level": 3 + }, + { + "id": "zapier-integration-updated", + "text": "Zapier integration updated", + "level": 3 + }, + { + "id": "chrome-version-updated", + "text": "Chrome version updated", + "level": 3 + }, + { + "id": "hebrew-character-set-updated", + "text": "Hebrew character set updated", + "level": 3 + }, + { + "id": "image-console-on-the-dashboard", + "text": "Image console on the dashboard", + "level": 3 + }, + { + "id": "improvements-to-transparency-rendering", + "text": "Improvements to transparency rendering", + "level": 3 + }, + { + "id": "demo-and-example-pages-now-include-an-options-tab", + "text": "Demo and example pages now include an options tab", + "level": 3 + }, + { + "id": "integromat-integration-updated", + "text": "Integromat integration updated", + "level": 3 + }, + { + "id": "new-params-added-to-zapier", + "text": "New params added to Zapier", + "level": 3 + }, + { + "id": "inject-custom-css-into-a-webpage", + "text": "Inject custom CSS into a webpage", + "level": 3 + }, + { + "id": "zapier-integration-updated-to-107", + "text": "Zapier integration updated to 1.0.7", + "level": 3 + }, + { + "id": "improvements-to-image-deletion", + "text": "Improvements to image deletion", + "level": 3 + }, + { + "id": "full-screen-parameter-added-to-integromat", + "text": "Full screen parameter added to Integromat", + "level": 3 + }, + { + "id": "additional-font-rendering-improvements", + "text": "Additional font rendering improvements", + "level": 3 + }, + { + "id": "ruby-client-update", + "text": "Ruby client update", + "level": 3 + }, + { + "id": "font-rendering-improvements", + "text": "Font rendering improvements", + "level": 3 + }, + { + "id": "various-performance-improvements-released", + "text": "Various performance improvements released", + "level": 3 + }, + { + "id": "zapier-plugin-released-from-beta", + "text": "Zapier plugin released from beta!", + "level": 3 + }, + { + "id": "new-live-editor", + "text": "New Live Editor", + "level": 3 + }, + { + "id": "ruby-client-released", + "text": "Ruby Client released", + "level": 3 + }, + { + "id": "integromat-updates", + "text": "Integromat updates", + "level": 3 + }, + { + "id": "template-api", + "text": "Template API", + "level": 3 + }, + { + "id": "render-when-ready", + "text": "Render when ready", + "level": 3 + }, + { + "id": "new-zapier-templates", + "text": "New Zapier templates", + "level": 3 + }, + { + "id": "introducing-the-us-east-region", + "text": "Introducing the US-EAST region", + "level": 3 + }, + { + "id": "brand-new-docs-site", + "text": "Brand new docs site", + "level": 3 + }, + { + "id": "url-to-image-performance-improvements", + "text": "URL to Image performance improvements", + "level": 3 + }, + { + "id": "url-to-image", + "text": "URL to Image", + "level": 3 + }, + { + "id": "ms_delay-parameter", + "text": "ms_delay parameter", + "level": 3 + }, + { + "id": "deleting-images", + "text": "Deleting images", + "level": 3 + }, + { + "id": "integromat-integration", + "text": "Integromat integration", + "level": 3 + } + ] + }, + "/faq/": { + "ids": [ + "frequently-asked-questions", + "getting-started", + "what-file-formats-are-supported", + "what-are-the-maximum-image-dimensions", + "how-fast-is-the-api", + "why-is-my-image-twice-as-large-as-expected", + "technical", + "can-i-use-external-css-stylesheets", + "can-i-use-external-javascript", + "how-do-i-wait-for-javascript-to-execute", + "can-i-load-external-images", + "can-i-use-custom-fonts", + "can-i-use-my-own-font-awesome-pro-icons", + "how-do-i-get-a-transparent-background", + "how-do-i-render-an-entire-webpage", + "can-i-take-full-page-screenshots", + "do-you-have-a-list-of-ip-addresses-i-can-allowlist", + "how-do-i-block-cookie-consent-banners", + "do-you-support-chinese-japanese-and-korean-characters", + "what-version-of-google-chrome-does-hcti-use", + "features", + "can-i-generate-pdfs", + "how-do-i-generate-social-media-images-og-images", + "can-i-create-reusable-templates", + "integrations", + "can-i-use-the-api-with-ai-coding-assistants", + "do-you-have-n8n-zapier-or-make-integrations", + "account--billing", + "can-i-manage-resources-with-scoped-credentials", + "is-there-a-rate-limit", + "what-happens-if-i-exceed-my-plan-limit", + "do-you-offer-a-free-trial", + "how-do-i-upgrade-my-account", + "i-need-to-generate-a-large-amount-of-images-one-time-which-plan-should-i-use", + "can-you-provide-an-sla", + "how-long-will-my-image-url-work", + "how-much-bandwidth-can-i-use", + "can-i-set-my-images-filename", + "can-i-use-the-api-for-a-hackathon", + "i-have-other-questions-who-do-i-ask", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "frequently-asked-questions", + "text": "Frequently Asked Questions", + "level": 1 + }, + { + "id": "getting-started", + "text": "Getting Started", + "level": 2 + }, + { + "id": "what-file-formats-are-supported", + "text": "What file formats are supported?", + "level": 3 + }, + { + "id": "what-are-the-maximum-image-dimensions", + "text": "What are the maximum image dimensions?", + "level": 3 + }, + { + "id": "how-fast-is-the-api", + "text": "How fast is the API?", + "level": 3 + }, + { + "id": "why-is-my-image-twice-as-large-as-expected", + "text": "Why is my image twice as large as expected?", + "level": 3 + }, + { + "id": "technical", + "text": "Technical", + "level": 2 + }, + { + "id": "can-i-use-external-css-stylesheets", + "text": "Can I use external CSS stylesheets?", + "level": 3 + }, + { + "id": "can-i-use-external-javascript", + "text": "Can I use external JavaScript?", + "level": 3 + }, + { + "id": "how-do-i-wait-for-javascript-to-execute", + "text": "How do I wait for JavaScript to execute?", + "level": 3 + }, + { + "id": "can-i-load-external-images", + "text": "Can I load external images?", + "level": 3 + }, + { + "id": "can-i-use-custom-fonts", + "text": "Can I use custom fonts?", + "level": 3 + }, + { + "id": "can-i-use-my-own-font-awesome-pro-icons", + "text": "Can I use my own Font Awesome Pro icons?", + "level": 3 + }, + { + "id": "how-do-i-get-a-transparent-background", + "text": "How do I get a transparent background?", + "level": 3 + }, + { + "id": "how-do-i-render-an-entire-webpage", + "text": "How do I render an entire webpage?", + "level": 3 + }, + { + "id": "can-i-take-full-page-screenshots", + "text": "Can I take full-page screenshots?", + "level": 3 + }, + { + "id": "do-you-have-a-list-of-ip-addresses-i-can-allowlist", + "text": "Do you have a list of IP addresses I can allowlist?", + "level": 3 + }, + { + "id": "how-do-i-block-cookie-consent-banners", + "text": "How do I block cookie consent banners?", + "level": 3 + }, + { + "id": "do-you-support-chinese-japanese-and-korean-characters", + "text": "Do you support Chinese, Japanese and Korean characters?", + "level": 3 + }, + { + "id": "what-version-of-google-chrome-does-hcti-use", + "text": "What version of Google Chrome does HCTI use?", + "level": 3 + }, + { + "id": "features", + "text": "Features", + "level": 2 + }, + { + "id": "can-i-generate-pdfs", + "text": "Can I generate PDFs?", + "level": 3 + }, + { + "id": "how-do-i-generate-social-media-images-og-images", + "text": "How do I generate social media images (OG images)?", + "level": 3 + }, + { + "id": "can-i-create-reusable-templates", + "text": "Can I create reusable templates?", + "level": 3 + }, + { + "id": "integrations", + "text": "Integrations", + "level": 2 + }, + { + "id": "can-i-use-the-api-with-ai-coding-assistants", + "text": "Can I use the API with AI coding assistants?", + "level": 3 + }, + { + "id": "do-you-have-n8n-zapier-or-make-integrations", + "text": "Do you have n8n, Zapier, or Make integrations?", + "level": 3 + }, + { + "id": "account--billing", + "text": "Account & Billing", + "level": 2 + }, + { + "id": "can-i-manage-resources-with-scoped-credentials", + "text": "Can I manage resources with scoped credentials?", + "level": 3 + }, + { + "id": "is-there-a-rate-limit", + "text": "Is there a rate limit?", + "level": 3 + }, + { + "id": "what-happens-if-i-exceed-my-plan-limit", + "text": "What happens if I exceed my plan limit?", + "level": 3 + }, + { + "id": "do-you-offer-a-free-trial", + "text": "Do you offer a free trial?", + "level": 3 + }, + { + "id": "how-do-i-upgrade-my-account", + "text": "How do I upgrade my account?", + "level": 3 + }, + { + "id": "i-need-to-generate-a-large-amount-of-images-one-time-which-plan-should-i-use", + "text": "I need to generate a large amount of images one time, which plan should I use?", + "level": 3 + }, + { + "id": "can-you-provide-an-sla", + "text": "Can you provide an SLA?", + "level": 3 + }, + { + "id": "how-long-will-my-image-url-work", + "text": "How long will my image URL work?", + "level": 3 + }, + { + "id": "how-much-bandwidth-can-i-use", + "text": "How much bandwidth can I use?", + "level": 3 + }, + { + "id": "can-i-set-my-images-filename", + "text": "Can I set my images filename?", + "level": 3 + }, + { + "id": "can-i-use-the-api-for-a-hackathon", + "text": "Can I use the API for a hackathon?", + "level": 3 + }, + { + "id": "i-have-other-questions-who-do-i-ask", + "text": "I have other questions, who do I ask?", + "level": 2 + } + ] + }, + "/management-api/": { + "ids": [ + "management-api", + "what-you-can-manage", + "infrastructure-as-code", + "make-your-first-request", + "authentication-and-permissions", + "resource-ids-and-pagination", + "creating-and-updating-resources", + "errors-and-retries", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "management-api", + "text": "Management API", + "level": 1 + }, + { + "id": "what-you-can-manage", + "text": "What you can manage", + "level": 2 + }, + { + "id": "infrastructure-as-code", + "text": "Infrastructure as code", + "level": 2 + }, + { + "id": "make-your-first-request", + "text": "Make your first request", + "level": 2 + }, + { + "id": "authentication-and-permissions", + "text": "Authentication and permissions", + "level": 2 + }, + { + "id": "resource-ids-and-pagination", + "text": "Resource IDs and pagination", + "level": 2 + }, + { + "id": "creating-and-updating-resources", + "text": "Creating and updating resources", + "level": 2 + }, + { + "id": "errors-and-retries", + "text": "Errors and retries", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/hmac-generator/": { + "ids": [ + "hmac-sha-256-generator", + "hmac-query-string", + "hmac-api-key", + "hmac-token", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "hmac-sha-256-generator", + "text": "HMAC SHA-256 Generator", + "level": 1 + } + ] + }, + "/integrations/": { + "ids": [ + "integrations", + "generate-images-without-writing-code", + "automation-platforms", + "what-you-can-automate", + "ai-assistants", + "how-it-works", + "need-a-custom-integration", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "integrations", + "text": "Integrations", + "level": 1 + }, + { + "id": "generate-images-without-writing-code", + "text": "Generate images without writing code", + "level": 2 + }, + { + "id": "automation-platforms", + "text": "Automation platforms", + "level": 2 + }, + { + "id": "what-you-can-automate", + "text": "What you can automate", + "level": 3 + }, + { + "id": "ai-assistants", + "text": "AI assistants", + "level": 2 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 3 + }, + { + "id": "need-a-custom-integration", + "text": "Need a custom integration?", + "level": 2 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/example-code/": { + "ids": [ + "example-code", + "works-with-any-programming-language", + "start-with-a-client-library", + "common-api-requests", + "create-an-image", + "request-body-json", + "response", + "render-a-reusable-template", + "quick-reference-with-curl", + "available-parameters", + "create-image-body-parameters", + "rendering-options", + "choose-your-language", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "example-code", + "text": "Example code", + "level": 1 + }, + { + "id": null, + "text": "Using an AI coding assistant?", + "level": 3 + }, + { + "id": "works-with-any-programming-language", + "text": "Works with any programming language", + "level": 2 + }, + { + "id": "start-with-a-client-library", + "text": "Start with a client library", + "level": 2 + }, + { + "id": "common-api-requests", + "text": "Common API requests", + "level": 2 + }, + { + "id": "create-an-image", + "text": "Create an image", + "level": 3 + }, + { + "id": "request-body-json", + "text": "Request body (JSON)", + "level": 3 + }, + { + "id": "response", + "text": "Response", + "level": 3 + }, + { + "id": "render-a-reusable-template", + "text": "Render a reusable template", + "level": 3 + }, + { + "id": "quick-reference-with-curl", + "text": "Quick reference with cURL", + "level": 2 + }, + { + "id": "available-parameters", + "text": "Available parameters", + "level": 2 + }, + { + "id": "create-image-body-parameters", + "text": "Create image body parameters", + "level": 3 + }, + { + "id": null, + "text": "Required params", + "level": 3 + }, + { + "id": "rendering-options", + "text": "Rendering options", + "level": 3 + }, + { + "id": "choose-your-language", + "text": "Choose your language", + "level": 2 + } + ] + }, + "/use-cases/": { + "ids": [ + "use-cases--examples", + "what-can-you-build", + "featured-examples", + "devto---social-cards-at-scale", + "product-hunt---maker-goals", + "remote-stories", + "more-inspiration", + "highlighted-text-shots", + "auto-generated-job-listings", + "full-webpage-screenshots", + "ready-to-build", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "use-cases--examples", + "text": "Use Cases & Examples", + "level": 1 + }, + { + "id": "what-can-you-build", + "text": "What can you build?", + "level": 2 + }, + { + "id": null, + "text": "Adding cards to an existing site?", + "level": 3 + }, + { + "id": "featured-examples", + "text": "Featured examples", + "level": 2 + }, + { + "id": "devto---social-cards-at-scale", + "text": "Dev.to - Social Cards at Scale", + "level": 3 + }, + { + "id": "product-hunt---maker-goals", + "text": "Product Hunt - Maker Goals", + "level": 3 + }, + { + "id": "remote-stories", + "text": "Remote Stories", + "level": 3 + }, + { + "id": "more-inspiration", + "text": "More inspiration", + "level": 2 + }, + { + "id": "highlighted-text-shots", + "text": "Highlighted Text Shots", + "level": 3 + }, + { + "id": "auto-generated-job-listings", + "text": "Auto-Generated Job Listings", + "level": 3 + }, + { + "id": "full-webpage-screenshots", + "text": "Full Webpage Screenshots", + "level": 3 + }, + { + "id": "ready-to-build", + "text": "Ready to build?", + "level": 2 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/getting-started/": { + "ids": [ + "getting-started", + "quick-start-in-3-steps", + "1-get-your-api-credentials", + "2-make-your-first-request", + "3-use-your-image", + "choose-your-path", + "example-code", + "automation-and-no-code-options", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "getting-started", + "text": "Getting started", + "level": 1 + }, + { + "id": "quick-start-in-3-steps", + "text": "Quick start in 3 steps", + "level": 2 + }, + { + "id": "1-get-your-api-credentials", + "text": "1. Get your API credentials", + "level": 3 + }, + { + "id": "2-make-your-first-request", + "text": "2. Make your first request", + "level": 3 + }, + { + "id": "3-use-your-image", + "text": "3. Use your image", + "level": 3 + }, + { + "id": "choose-your-path", + "text": "Choose your path", + "level": 2 + }, + { + "id": "example-code", + "text": "Example code", + "level": 2 + }, + { + "id": "automation-and-no-code-options", + "text": "Automation and no-code options", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/guides/": { + "ids": [ + "guides", + "account--organizations", + "social-media-screenshots", + "open-graph-images", + "debugging", + "styling--fonts", + "advanced-features", + "workflows--tools", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "guides", + "text": "Guides", + "level": 1 + }, + { + "id": "account--organizations", + "text": "Account & organizations", + "level": 2 + }, + { + "id": "social-media-screenshots", + "text": "Social Media Screenshots", + "level": 2 + }, + { + "id": "open-graph-images", + "text": "Open Graph Images", + "level": 2 + }, + { + "id": "debugging", + "text": "Debugging", + "level": 2 + }, + { + "id": "styling--fonts", + "text": "Styling & Fonts", + "level": 2 + }, + { + "id": "advanced-features", + "text": "Advanced Features", + "level": 2 + }, + { + "id": "workflows--tools", + "text": "Workflows & Tools", + "level": 2 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/parameters/": { + "ids": [ + "parameters-reference", + "parameters", + "additional-parameters", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "parameters-reference", + "text": "Parameters Reference", + "level": 1 + }, + { + "id": "parameters", + "text": "Parameters", + "level": 2 + }, + { + "id": null, + "text": "Required params", + "level": 3 + }, + { + "id": "additional-parameters", + "text": "Additional parameters", + "level": 2 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/template-editor/": { + "ids": [ + "template-editor", + "what-you-can-build", + "editor-areas", + "guides", + "how-it-fits-with-the-api", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "template-editor", + "text": "Template Editor", + "level": 1 + }, + { + "id": "what-you-can-build", + "text": "What you can build", + "level": 2 + }, + { + "id": "editor-areas", + "text": "Editor areas", + "level": 2 + }, + { + "id": "guides", + "text": "Guides", + "level": 2 + }, + { + "id": "how-it-fits-with-the-api", + "text": "How it fits with the API", + "level": 2 + } + ] + }, + "/template-editor/blocks/": { + "ids": [ + "blocks", + "block-types", + "common-properties", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "blocks", + "text": "Blocks", + "level": 1 + }, + { + "id": "block-types", + "text": "Block Types", + "level": 2 + }, + { + "id": "common-properties", + "text": "Common Properties", + "level": 2 + } + ] + }, + "/template-editor/advanced/": { + "ids": [ + "advanced", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "advanced", + "text": "Advanced", + "level": 1 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/template-editor/canvas/": { + "ids": [ + "canvas", + "rendered-image-properties", + "editor-settings", + "canvas-presets", + "image-settings", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "canvas", + "text": "Canvas", + "level": 1 + }, + { + "id": "rendered-image-properties", + "text": "Rendered Image Properties", + "level": 2 + }, + { + "id": "editor-settings", + "text": "Editor Settings", + "level": 2 + }, + { + "id": "canvas-presets", + "text": "Canvas Presets", + "level": 2 + }, + { + "id": "image-settings", + "text": "Image Settings", + "level": 2 + } + ] + }, + "/template-editor/variables/": { + "ids": [ + "variables", + "how-variables-are-added", + "variable-modes", + "template-keys", + "preview-data", + "rendering-with-variables", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "variables", + "text": "Variables", + "level": 1 + }, + { + "id": "how-variables-are-added", + "text": "How Variables Are Added", + "level": 2 + }, + { + "id": "variable-modes", + "text": "Variable Modes", + "level": 2 + }, + { + "id": null, + "text": "Handlebars Variable Mode", + "level": 3 + }, + { + "id": "template-keys", + "text": "Template Keys", + "level": 3 + }, + { + "id": "preview-data", + "text": "Preview Data", + "level": 2 + }, + { + "id": "rendering-with-variables", + "text": "Rendering with variables", + "level": 2 + } + ] + }, + "/template-editor/quick-start/": { + "ids": [ + "template-editor-quick-start", + "choose-a-starting-point", + "basic-workflow", + "preview-with-variables", + "rendering-the-saved-template", + "next-steps", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "template-editor-quick-start", + "text": "Template Editor Quick Start", + "level": 1 + }, + { + "id": "choose-a-starting-point", + "text": "Choose a starting point", + "level": 2 + }, + { + "id": "basic-workflow", + "text": "Basic workflow", + "level": 2 + }, + { + "id": "preview-with-variables", + "text": "Preview with variables", + "level": 2 + }, + { + "id": "rendering-the-saved-template", + "text": "Rendering the saved template", + "level": 2 + }, + { + "id": "next-steps", + "text": "Next steps", + "level": 2 + } + ] + }, + "/template-editor/advanced/panels/": { + "ids": [ + "panels", + "choosing-a-panel", + "common-panel-workflows", + "panel-notes", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "panels", + "text": "Panels", + "level": 1 + }, + { + "id": "choosing-a-panel", + "text": "Choosing a Panel", + "level": 2 + }, + { + "id": "common-panel-workflows", + "text": "Common Panel Workflows", + "level": 2 + }, + { + "id": "panel-notes", + "text": "Panel Notes", + "level": 2 + } + ] + }, + "/template-editor/advanced/sizing-positioning/": { + "ids": [ + "sizing-and-positioning", + "sizing", + "aspect-ratio", + "x-and-y-position", + "arrange-controls", + "inside-panels", + "practical-patterns", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "sizing-and-positioning", + "text": "Sizing and Positioning", + "level": 1 + }, + { + "id": "sizing", + "text": "Sizing", + "level": 2 + }, + { + "id": "aspect-ratio", + "text": "Aspect Ratio", + "level": 2 + }, + { + "id": "x-and-y-position", + "text": "X and Y Position", + "level": 2 + }, + { + "id": "arrange-controls", + "text": "Arrange Controls", + "level": 2 + }, + { + "id": "inside-panels", + "text": "Inside Panels", + "level": 2 + }, + { + "id": "practical-patterns", + "text": "Practical Patterns", + "level": 2 + } + ] + }, + "/template-editor/advanced/extra-css/": { + "ids": [ + "extra-css", + "modes", + "when-to-use-it", + "guardrails", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "extra-css", + "text": "Extra CSS", + "level": 1 + }, + { + "id": "modes", + "text": "Modes", + "level": 2 + }, + { + "id": "when-to-use-it", + "text": "When To Use It", + "level": 2 + }, + { + "id": "guardrails", + "text": "Guardrails", + "level": 2 + } + ] + }, + "/template-editor/blocks/table-panel/": { + "ids": [ + "table-panel", + "common-properties", + "block-specific-properties", + "child-properties", + "grid-tracks", + "templated-content", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "table-panel", + "text": "Table Panel", + "level": 1 + }, + { + "id": "common-properties", + "text": "Common Properties", + "level": 2 + }, + { + "id": null, + "text": "Auto size to grid cell", + "level": 3 + }, + { + "id": null, + "text": "Canvas backgrounds", + "level": 3 + }, + { + "id": "block-specific-properties", + "text": "Block Specific Properties", + "level": 2 + }, + { + "id": null, + "text": "Panel spacing", + "level": 3 + }, + { + "id": "child-properties", + "text": "Child Properties", + "level": 2 + }, + { + "id": "grid-tracks", + "text": "Grid Tracks", + "level": 2 + }, + { + "id": "templated-content", + "text": "Templated Content", + "level": 2 + } + ] + }, + "/template-editor/blocks/shape/": { + "ids": [ + "shape-block", + "common-properties", + "shape-types", + "block-specific-properties", + "templated-content", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "shape-block", + "text": "Shape Block", + "level": 1 + }, + { + "id": "common-properties", + "text": "Common Properties", + "level": 2 + }, + { + "id": null, + "text": "Canvas backgrounds", + "level": 3 + }, + { + "id": null, + "text": "Shape background", + "level": 3 + }, + { + "id": null, + "text": "Shape border", + "level": 3 + }, + { + "id": null, + "text": "Shape shadow", + "level": 3 + }, + { + "id": "shape-types", + "text": "Shape Types", + "level": 2 + }, + { + "id": "block-specific-properties", + "text": "Block Specific Properties", + "level": 2 + }, + { + "id": "templated-content", + "text": "Templated Content", + "level": 2 + } + ] + }, + "/template-editor/blocks/simple-text/": { + "ids": [ + "simple-text-block", + "common-properties", + "block-specific-properties", + "auto-font-size", + "templated-content", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "simple-text-block", + "text": "Simple Text Block", + "level": 1 + }, + { + "id": "common-properties", + "text": "Common Properties", + "level": 2 + }, + { + "id": null, + "text": "Canvas backgrounds", + "level": 3 + }, + { + "id": null, + "text": "Text block shadows", + "level": 3 + }, + { + "id": "block-specific-properties", + "text": "Block Specific Properties", + "level": 2 + }, + { + "id": "auto-font-size", + "text": "Auto Font Size", + "level": 2 + }, + { + "id": "templated-content", + "text": "Templated Content", + "level": 2 + } + ] + }, + "/template-editor/blocks/html/": { + "ids": [ + "html-block", + "common-properties", + "block-specific-properties", + "preview-notes", + "templated-content", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "html-block", + "text": "HTML Block", + "level": 1 + }, + { + "id": "common-properties", + "text": "Common Properties", + "level": 2 + }, + { + "id": null, + "text": "Canvas backgrounds", + "level": 3 + }, + { + "id": "block-specific-properties", + "text": "Block Specific Properties", + "level": 2 + }, + { + "id": "preview-notes", + "text": "Preview Notes", + "level": 2 + }, + { + "id": "templated-content", + "text": "Templated Content", + "level": 2 + } + ] + }, + "/template-editor/blocks/image/": { + "ids": [ + "image-block", + "common-properties", + "block-specific-properties", + "image-sources", + "media-library", + "url", + "stock-photos", + "fit-modes", + "templated-content", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "image-block", + "text": "Image Block", + "level": 1 + }, + { + "id": "common-properties", + "text": "Common Properties", + "level": 2 + }, + { + "id": null, + "text": "Canvas backgrounds", + "level": 3 + }, + { + "id": null, + "text": "Image borders", + "level": 3 + }, + { + "id": "block-specific-properties", + "text": "Block Specific Properties", + "level": 2 + }, + { + "id": "image-sources", + "text": "Image Sources", + "level": 2 + }, + { + "id": "media-library", + "text": "Media Library", + "level": 3 + }, + { + "id": "url", + "text": "URL", + "level": 3 + }, + { + "id": "stock-photos", + "text": "Stock Photos", + "level": 3 + }, + { + "id": "fit-modes", + "text": "Fit Modes", + "level": 2 + }, + { + "id": "templated-content", + "text": "Templated Content", + "level": 2 + } + ] + }, + "/template-editor/blocks/free-panel/": { + "ids": [ + "free-panel", + "common-properties", + "block-specific-properties", + "templated-content", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "free-panel", + "text": "Free Panel", + "level": 1 + }, + { + "id": "common-properties", + "text": "Common Properties", + "level": 2 + }, + { + "id": null, + "text": "Canvas backgrounds", + "level": 3 + }, + { + "id": "block-specific-properties", + "text": "Block Specific Properties", + "level": 2 + }, + { + "id": null, + "text": "Panel spacing", + "level": 3 + }, + { + "id": "templated-content", + "text": "Templated Content", + "level": 2 + } + ] + }, + "/template-editor/blocks/rich-text/": { + "ids": [ + "rich-text-block", + "common-properties", + "block-specific-properties", + "templated-content", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "rich-text-block", + "text": "Rich Text Block", + "level": 1 + }, + { + "id": "common-properties", + "text": "Common Properties", + "level": 2 + }, + { + "id": null, + "text": "Canvas backgrounds", + "level": 3 + }, + { + "id": null, + "text": "Text block shadows", + "level": 3 + }, + { + "id": "block-specific-properties", + "text": "Block Specific Properties", + "level": 2 + }, + { + "id": "templated-content", + "text": "Templated Content", + "level": 2 + } + ] + }, + "/template-editor/blocks/flex-panel/": { + "ids": [ + "flex-panel", + "common-properties", + "block-specific-properties", + "child-properties", + "templated-content", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "flex-panel", + "text": "Flex Panel", + "level": 1 + }, + { + "id": "common-properties", + "text": "Common Properties", + "level": 2 + }, + { + "id": null, + "text": "Canvas backgrounds", + "level": 3 + }, + { + "id": "block-specific-properties", + "text": "Block Specific Properties", + "level": 2 + }, + { + "id": null, + "text": "Panel spacing", + "level": 3 + }, + { + "id": "child-properties", + "text": "Child Properties", + "level": 2 + }, + { + "id": "templated-content", + "text": "Templated Content", + "level": 2 + } + ] + }, + "/template-editor/blocks/grid-panel/": { + "ids": [ + "grid-panel", + "common-properties", + "block-specific-properties", + "child-properties", + "grid-tracks", + "templated-content", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "grid-panel", + "text": "Grid Panel", + "level": 1 + }, + { + "id": "common-properties", + "text": "Common Properties", + "level": 2 + }, + { + "id": null, + "text": "Auto size to grid cell", + "level": 3 + }, + { + "id": null, + "text": "Canvas backgrounds", + "level": 3 + }, + { + "id": "block-specific-properties", + "text": "Block Specific Properties", + "level": 2 + }, + { + "id": null, + "text": "Panel spacing", + "level": 3 + }, + { + "id": "child-properties", + "text": "Child Properties", + "level": 2 + }, + { + "id": "grid-tracks", + "text": "Grid Tracks", + "level": 2 + }, + { + "id": "templated-content", + "text": "Templated Content", + "level": 2 + } + ] + }, + "/parameters/render_when_ready/": { + "ids": [ + "render-when-ready", + "javascript-helper", + "using-with-url-to-image", + "when-to-use-this", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "render-when-ready", + "text": "Render when ready", + "level": 1 + }, + { + "id": "javascript-helper", + "text": "JavaScript Helper", + "level": 2 + }, + { + "id": "using-with-url-to-image", + "text": "Using with URL to Image", + "level": 2 + }, + { + "id": "when-to-use-this", + "text": "When to use this", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/selector/": { + "ids": [ + "css-selector-parameter", + "overview", + "basic-usage", + "html-example", + "common-selector-types", + "class-selectors", + "id-selectors", + "nested-selectors", + "multiple-classes", + "advanced-selectors", + "best-practices", + "common-issues-and-solutions", + "element-not-found", + "wrong-element-selected", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "css-selector-parameter", + "text": "CSS Selector Parameter", + "level": 1 + }, + { + "id": "overview", + "text": "Overview", + "level": 2 + }, + { + "id": null, + "text": "Works Everywhere", + "level": 3 + }, + { + "id": "basic-usage", + "text": "Basic Usage", + "level": 2 + }, + { + "id": "html-example", + "text": "HTML Example", + "level": 3 + }, + { + "id": "common-selector-types", + "text": "Common Selector Types", + "level": 2 + }, + { + "id": "class-selectors", + "text": "Class Selectors", + "level": 3 + }, + { + "id": "id-selectors", + "text": "ID Selectors", + "level": 3 + }, + { + "id": "nested-selectors", + "text": "Nested Selectors", + "level": 3 + }, + { + "id": "multiple-classes", + "text": "Multiple Classes", + "level": 3 + }, + { + "id": "advanced-selectors", + "text": "Advanced Selectors", + "level": 2 + }, + { + "id": "best-practices", + "text": "Best Practices", + "level": 2 + }, + { + "id": null, + "text": "Performance Tip", + "level": 3 + }, + { + "id": "common-issues-and-solutions", + "text": "Common Issues and Solutions", + "level": 2 + }, + { + "id": "element-not-found", + "text": "Element Not Found", + "level": 3 + }, + { + "id": "wrong-element-selected", + "text": "Wrong Element Selected", + "level": 3 + } + ] + }, + "/parameters/max_wait_ms/": { + "ids": [ + "using-max_wait_ms", + "how-it-works", + "value-range", + "max_wait_ms-vs-ms_delay", + "when-to-use-each", + "example-usage", + "speed-up-slow-pages", + "combined-with-ms_delay", + "fast-screenshots", + "common-use-cases", + "news-websites", + "e-commerce-pages", + "batch-processing", + "best-practices", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-max_wait_ms", + "text": "Using max_wait_ms", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "value-range", + "text": "Value range", + "level": 2 + }, + { + "id": "max_wait_ms-vs-ms_delay", + "text": "max_wait_ms vs ms_delay", + "level": 2 + }, + { + "id": "when-to-use-each", + "text": "When to use each", + "level": 3 + }, + { + "id": "example-usage", + "text": "Example usage", + "level": 2 + }, + { + "id": "speed-up-slow-pages", + "text": "Speed up slow pages", + "level": 3 + }, + { + "id": "combined-with-ms_delay", + "text": "Combined with ms_delay", + "level": 3 + }, + { + "id": "fast-screenshots", + "text": "Fast screenshots", + "level": 3 + }, + { + "id": "common-use-cases", + "text": "Common use cases", + "level": 2 + }, + { + "id": "news-websites", + "text": "News websites", + "level": 3 + }, + { + "id": "e-commerce-pages", + "text": "E-commerce pages", + "level": 3 + }, + { + "id": "batch-processing", + "text": "Batch processing", + "level": 3 + }, + { + "id": "best-practices", + "text": "Best practices", + "level": 2 + }, + { + "id": null, + "text": "Note", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/proxy_id/": { + "ids": [ + "using-proxy_id", + "how-it-works", + "value", + "example-usage", + "json-request", + "curl", + "htmlcss-render", + "manage-proxy-configurations", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-proxy_id", + "text": "Using proxy_id", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "value", + "text": "Value", + "level": 2 + }, + { + "id": "example-usage", + "text": "Example usage", + "level": 2 + }, + { + "id": "json-request", + "text": "JSON request", + "level": 3 + }, + { + "id": "curl", + "text": "cURL", + "level": 3 + }, + { + "id": "htmlcss-render", + "text": "HTML/CSS render", + "level": 3 + }, + { + "id": null, + "text": "Plan availability", + "level": 3 + }, + { + "id": null, + "text": "Disabling a proxy", + "level": 3 + }, + { + "id": "manage-proxy-configurations", + "text": "Manage proxy configurations", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/viewport/": { + "ids": [ + "viewport-parameters", + "how-it-works", + "parameters", + "viewport-width-and-height", + "viewport-mobile", + "viewport-landscape", + "viewport-touch", + "interactions-with-other-parameters", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "viewport-parameters", + "text": "Viewport parameters", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "parameters", + "text": "Parameters", + "level": 2 + }, + { + "id": "viewport-width-and-height", + "text": "Setting viewport width and height", + "level": 2 + }, + { + "id": "viewport-mobile", + "text": "Emulating a mobile viewport", + "level": 2 + }, + { + "id": "viewport-landscape", + "text": "Using landscape orientation", + "level": 2 + }, + { + "id": "viewport-touch", + "text": "Enabling touch support", + "level": 2 + }, + { + "id": "interactions-with-other-parameters", + "text": "Interactions with other parameters", + "level": 2 + }, + { + "id": null, + "text": "Responsive layouts", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/timezone/": { + "ids": [ + "using-timezone", + "how-it-works", + "values", + "when-to-use-it", + "example-usage", + "screenshot-with-specific-timezone", + "json-request", + "html-with-javascript-dates", + "common-use-cases", + "regional-reports", + "calendar-screenshots", + "testing-localized-content", + "technical-details", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-timezone", + "text": "Using timezone", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "values", + "text": "Values", + "level": 2 + }, + { + "id": "when-to-use-it", + "text": "When to use it", + "level": 2 + }, + { + "id": "example-usage", + "text": "Example usage", + "level": 2 + }, + { + "id": "screenshot-with-specific-timezone", + "text": "Screenshot with specific timezone", + "level": 3 + }, + { + "id": "json-request", + "text": "JSON request", + "level": 3 + }, + { + "id": "html-with-javascript-dates", + "text": "HTML with JavaScript dates", + "level": 3 + }, + { + "id": "common-use-cases", + "text": "Common use cases", + "level": 2 + }, + { + "id": "regional-reports", + "text": "Regional reports", + "level": 3 + }, + { + "id": "calendar-screenshots", + "text": "Calendar screenshots", + "level": 3 + }, + { + "id": "testing-localized-content", + "text": "Testing localized content", + "level": 3 + }, + { + "id": "technical-details", + "text": "Technical details", + "level": 2 + }, + { + "id": null, + "text": "Tip", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/full_screen/": { + "ids": [ + "using-full_screen", + "how-it-works", + "when-to-use-it", + "default-behavior", + "example-usage", + "capturing-a-full-webpage", + "in-a-json-request", + "combined-with-other-parameters", + "considerations", + "file-size", + "rendering-time", + "lazy-loaded-content", + "common-use-cases", + "documentation-screenshots", + "email-newsletter-previews", + "landing-page-captures", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-full_screen", + "text": "Using full_screen", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "when-to-use-it", + "text": "When to use it", + "level": 2 + }, + { + "id": "default-behavior", + "text": "Default behavior", + "level": 2 + }, + { + "id": "example-usage", + "text": "Example usage", + "level": 2 + }, + { + "id": "capturing-a-full-webpage", + "text": "Capturing a full webpage", + "level": 3 + }, + { + "id": "in-a-json-request", + "text": "In a JSON request", + "level": 3 + }, + { + "id": "combined-with-other-parameters", + "text": "Combined with other parameters", + "level": 3 + }, + { + "id": "considerations", + "text": "Considerations", + "level": 2 + }, + { + "id": "file-size", + "text": "File size", + "level": 3 + }, + { + "id": "rendering-time", + "text": "Rendering time", + "level": 3 + }, + { + "id": "lazy-loaded-content", + "text": "Lazy-loaded content", + "level": 3 + }, + { + "id": "common-use-cases", + "text": "Common use cases", + "level": 2 + }, + { + "id": "documentation-screenshots", + "text": "Documentation screenshots", + "level": 3 + }, + { + "id": "email-newsletter-previews", + "text": "Email newsletter previews", + "level": 3 + }, + { + "id": "landing-page-captures", + "text": "Landing page captures", + "level": 3 + }, + { + "id": null, + "text": "Performance tip", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/color_scheme/": { + "ids": [ + "using-color_scheme", + "how-it-works", + "values", + "when-to-use-it", + "example-usage", + "screenshot-in-dark-mode", + "json-request", + "html-with-dark-mode-styles", + "common-use-cases", + "social-media-screenshots", + "documentation-screenshots", + "design-testing", + "technical-details", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-color_scheme", + "text": "Using color_scheme", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "values", + "text": "Values", + "level": 2 + }, + { + "id": "when-to-use-it", + "text": "When to use it", + "level": 2 + }, + { + "id": "example-usage", + "text": "Example usage", + "level": 2 + }, + { + "id": "screenshot-in-dark-mode", + "text": "Screenshot in dark mode", + "level": 3 + }, + { + "id": "json-request", + "text": "JSON request", + "level": 3 + }, + { + "id": "html-with-dark-mode-styles", + "text": "HTML with dark mode styles", + "level": 3 + }, + { + "id": "common-use-cases", + "text": "Common use cases", + "level": 2 + }, + { + "id": "social-media-screenshots", + "text": "Social media screenshots", + "level": 3 + }, + { + "id": "documentation-screenshots", + "text": "Documentation screenshots", + "level": 3 + }, + { + "id": "design-testing", + "text": "Design testing", + "level": 3 + }, + { + "id": "technical-details", + "text": "Technical details", + "level": 2 + }, + { + "id": null, + "text": "Note", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/ms_delay/": { + "ids": [ + "using-ms_delay", + "when-to-use-ms_delay", + "how-it-works", + "default-behavior", + "image-credits-and-billing", + "credit-usage", + "important-notes", + "examples", + "alternatives-to-high-ms_delay-values", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-ms_delay", + "text": "Using ms_delay", + "level": 1 + }, + { + "id": "when-to-use-ms_delay", + "text": "When to use ms_delay", + "level": 2 + }, + { + "id": null, + "text": "Important", + "level": 3 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "default-behavior", + "text": "Default behavior", + "level": 2 + }, + { + "id": "image-credits-and-billing", + "text": "Image credits and billing", + "level": 2 + }, + { + "id": "credit-usage", + "text": "Image credit usage", + "level": 3 + }, + { + "id": "important-notes", + "text": "Important notes", + "level": 3 + }, + { + "id": null, + "text": "Cost optimization", + "level": 3 + }, + { + "id": "examples", + "text": "Examples", + "level": 3 + }, + { + "id": "alternatives-to-high-ms_delay-values", + "text": "Alternatives to high ms_delay values", + "level": 3 + } + ] + }, + "/parameters/transparent_background/": { + "ids": [ + "using-transparent_background", + "how-it-works", + "values", + "htmlcss-example", + "url-screenshot-example", + "curl-example", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-transparent_background", + "text": "Using transparent_background", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": null, + "text": "PNG Format Required", + "level": 3 + }, + { + "id": "values", + "text": "Values", + "level": 2 + }, + { + "id": "htmlcss-example", + "text": "HTML/CSS example", + "level": 2 + }, + { + "id": "url-screenshot-example", + "text": "URL screenshot example", + "level": 2 + }, + { + "id": "curl-example", + "text": "cURL example", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/jumbo-images/": { + "ids": [ + "jumbo-images", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "jumbo-images", + "text": "Jumbo Images", + "level": 1 + } + ] + }, + "/parameters/pdf_options/": { + "ids": [ + "pdf-options", + "overview", + "parameters", + "common-page-sizes", + "example-usage", + "create-an-image-then-render-it-as-a-pdf", + "return-a-pdf-url-directly", + "letter-size-with-margins", + "a4-document", + "scaled-content", + "common-use-cases", + "invoices-and-receipts", + "certificates", + "reports", + "best-practices", + "units", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "pdf-options", + "text": "PDF Options", + "level": 1 + }, + { + "id": "overview", + "text": "Overview", + "level": 2 + }, + { + "id": "parameters", + "text": "Parameters", + "level": 2 + }, + { + "id": "common-page-sizes", + "text": "Common page sizes", + "level": 2 + }, + { + "id": "example-usage", + "text": "Example usage", + "level": 2 + }, + { + "id": "create-an-image-then-render-it-as-a-pdf", + "text": "Create an image, then render it as a PDF", + "level": 3 + }, + { + "id": "return-a-pdf-url-directly", + "text": "Return a PDF URL directly", + "level": 3 + }, + { + "id": "letter-size-with-margins", + "text": "Letter size with margins", + "level": 3 + }, + { + "id": "a4-document", + "text": "A4 document", + "level": 3 + }, + { + "id": "scaled-content", + "text": "Scaled content", + "level": 3 + }, + { + "id": "common-use-cases", + "text": "Common use cases", + "level": 2 + }, + { + "id": "invoices-and-receipts", + "text": "Invoices and receipts", + "level": 3 + }, + { + "id": "certificates", + "text": "Certificates", + "level": 3 + }, + { + "id": "reports", + "text": "Reports", + "level": 3 + }, + { + "id": "best-practices", + "text": "Best practices", + "level": 2 + }, + { + "id": "units", + "text": "Units", + "level": 2 + }, + { + "id": null, + "text": "Tip", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/headers/": { + "ids": [ + "using-headers", + "how-it-works", + "request-formats", + "json", + "form-submission", + "create-and-render-url", + "header-rules-and-limits", + "additional-header-origins", + "include-headers-on-subrequests", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-headers", + "text": "Using headers", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": null, + "text": "Protect secrets", + "level": 3 + }, + { + "id": null, + "text": "User-Agent behavior", + "level": 3 + }, + { + "id": "request-formats", + "text": "Request formats", + "level": 2 + }, + { + "id": "json", + "text": "JSON", + "level": 3 + }, + { + "id": "form-submission", + "text": "Form submission", + "level": 3 + }, + { + "id": "create-and-render-url", + "text": "Create-and-render URL", + "level": 3 + }, + { + "id": "header-rules-and-limits", + "text": "Header rules and limits", + "level": 2 + }, + { + "id": "additional-header-origins", + "text": "additional_header_origins", + "level": 2 + }, + { + "id": "include-headers-on-subrequests", + "text": "include_headers_on_subrequests", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/identify_as_hcti/": { + "ids": [ + "using-identify_as_hcti", + "how-it-works", + "json-example", + "form-example", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-identify_as_hcti", + "text": "Using identify_as_hcti", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": null, + "text": "Not an authentication mechanism", + "level": 3 + }, + { + "id": "json-example", + "text": "JSON example", + "level": 2 + }, + { + "id": "form-example", + "text": "Form example", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/dedupe_duration_s/": { + "ids": [ + "using-dedupe_duration_s", + "how-it-works", + "values-and-defaults", + "htmlcss-example", + "url-example", + "disable-deduplication", + "where-it-applies", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-dedupe_duration_s", + "text": "Using dedupe_duration_s", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": null, + "text": "Best effort, not an idempotency guarantee", + "level": 3 + }, + { + "id": "values-and-defaults", + "text": "Values and defaults", + "level": 2 + }, + { + "id": "htmlcss-example", + "text": "HTML/CSS example", + "level": 2 + }, + { + "id": "url-example", + "text": "URL example", + "level": 2 + }, + { + "id": "disable-deduplication", + "text": "Disable deduplication", + "level": 2 + }, + { + "id": "where-it-applies", + "text": "Where it applies", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/format/": { + "ids": [ + "using-format", + "how-it-works", + "how-files-are-handled", + "values", + "htmlcss-example", + "url-screenshot-with-a-pdf-url", + "saved-template-image", + "image-batch", + "signed-urls", + "official-clients", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-format", + "text": "Using format", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "how-files-are-handled", + "text": "How files are handled", + "level": 2 + }, + { + "id": "values", + "text": "Values", + "level": 2 + }, + { + "id": "htmlcss-example", + "text": "HTML/CSS example", + "level": 2 + }, + { + "id": "url-screenshot-with-a-pdf-url", + "text": "URL screenshot with a PDF URL", + "level": 2 + }, + { + "id": "saved-template-image", + "text": "Saved template image", + "level": 2 + }, + { + "id": "image-batch", + "text": "Image batch", + "level": 2 + }, + { + "id": "signed-urls", + "text": "Signed URLs", + "level": 2 + }, + { + "id": "official-clients", + "text": "Official clients", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/dl/": { + "ids": [ + "download-parameter-dl", + "overview", + "usage", + "implementation-examples", + "html-download-link", + "javascript-download-trigger", + "common-use-cases", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "download-parameter-dl", + "text": "Download Parameter (dl)", + "level": 1 + }, + { + "id": "overview", + "text": "Overview", + "level": 2 + }, + { + "id": "usage", + "text": "Usage", + "level": 2 + }, + { + "id": "implementation-examples", + "text": "Implementation Examples", + "level": 2 + }, + { + "id": "html-download-link", + "text": "HTML Download Link", + "level": 3 + }, + { + "id": "javascript-download-trigger", + "text": "JavaScript Download Trigger", + "level": 3 + }, + { + "id": "common-use-cases", + "text": "Common Use Cases", + "level": 2 + }, + { + "id": null, + "text": "File Format Tip", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/storage_destination_id/": { + "ids": [ + "using-storage_destination_id", + "how-it-works", + "value", + "example-usage", + "json-request", + "curl", + "template", + "manage-destination-configurations", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-storage_destination_id", + "text": "Using storage_destination_id", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "value", + "text": "Value", + "level": 2 + }, + { + "id": "example-usage", + "text": "Example usage", + "level": 2 + }, + { + "id": "json-request", + "text": "JSON request", + "level": 3 + }, + { + "id": "curl", + "text": "cURL", + "level": 3 + }, + { + "id": "template", + "text": "Template", + "level": 3 + }, + { + "id": null, + "text": "Plan availability", + "level": 3 + }, + { + "id": "manage-destination-configurations", + "text": "Manage destination configurations", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/device_scale/": { + "ids": [ + "using-device_scale", + "how-it-works", + "default-values", + "common-issues", + "blurry-images", + "oversized-images", + "blurry-url-images", + "why-is-my-image-double-the-size", + "what-is-pixel-ratio-and-why-it-matters", + "pixel-ratio-and-old-screens", + "pixel-ratio-and-new-screens-high-dpi-or-retina-displays", + "handling-pixel-ratio-in-web-development", + "using-device_scale-effectively", + "for-web-usage", + "for-print-usage", + "technical-details", + "pixel-ratio-explained", + "impact-on-file-size", + "best-practices", + "example-usage", + "in-api-requests", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-device_scale", + "text": "Using device_scale", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "default-values", + "text": "Default values", + "level": 2 + }, + { + "id": "common-issues", + "text": "Common issues", + "level": 2 + }, + { + "id": "blurry-images", + "text": "Blurry images", + "level": 3 + }, + { + "id": "oversized-images", + "text": "Oversized images", + "level": 3 + }, + { + "id": "blurry-url-images", + "text": "Blurry URL images", + "level": 2 + }, + { + "id": "why-is-my-image-double-the-size", + "text": "Why is my image double the size?", + "level": 2 + }, + { + "id": "what-is-pixel-ratio-and-why-it-matters", + "text": "What is pixel ratio and why it matters", + "level": 2 + }, + { + "id": "pixel-ratio-and-old-screens", + "text": "Pixel Ratio and Old Screens", + "level": 3 + }, + { + "id": "pixel-ratio-and-new-screens-high-dpi-or-retina-displays", + "text": "Pixel Ratio and New Screens (High-DPI or Retina Displays):", + "level": 3 + }, + { + "id": "handling-pixel-ratio-in-web-development", + "text": "Handling Pixel Ratio in Web Development", + "level": 3 + }, + { + "id": "using-device_scale-effectively", + "text": "Using device_scale effectively", + "level": 2 + }, + { + "id": "for-web-usage", + "text": "For web usage", + "level": 3 + }, + { + "id": "for-print-usage", + "text": "For print usage", + "level": 3 + }, + { + "id": "technical-details", + "text": "Technical details", + "level": 2 + }, + { + "id": "pixel-ratio-explained", + "text": "Pixel ratio explained", + "level": 3 + }, + { + "id": "impact-on-file-size", + "text": "Impact on file size", + "level": 3 + }, + { + "id": "best-practices", + "text": "Best practices", + "level": 3 + }, + { + "id": "example-usage", + "text": "Example usage", + "level": 2 + }, + { + "id": "in-api-requests", + "text": "In API requests", + "level": 3 + }, + { + "id": null, + "text": "Performance tip", + "level": 3 + } + ] + }, + "/parameters/media_type/": { + "ids": [ + "using-media_type", + "how-it-works", + "values", + "render-with-print-styles", + "example-with-different-screen-and-print-styles", + "common-use-cases", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-media_type", + "text": "Using media_type", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "values", + "text": "Values", + "level": 2 + }, + { + "id": "render-with-print-styles", + "text": "Render with print styles", + "level": 2 + }, + { + "id": "example-with-different-screen-and-print-styles", + "text": "Example with different screen and print styles", + "level": 2 + }, + { + "id": "common-use-cases", + "text": "Common use cases", + "level": 2 + }, + { + "id": null, + "text": "Output format", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/parameters/google_fonts/": { + "ids": [ + "google-fonts-parameter", + "parameter-details", + "usage-examples", + "single-font", + "multiple-fonts", + "font-weights-and-styles", + "specifying-font-weights", + "debugging-font-weights", + "troubleshooting", + "flash-of-unstyled-text-fout", + "common-issues", + "live-example", + "alternative-approaches", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "google-fonts-parameter", + "text": "Google Fonts Parameter", + "level": 1 + }, + { + "id": "parameter-details", + "text": "Parameter Details", + "level": 2 + }, + { + "id": "usage-examples", + "text": "Usage Examples", + "level": 2 + }, + { + "id": "single-font", + "text": "Single Font", + "level": 3 + }, + { + "id": "multiple-fonts", + "text": "Multiple Fonts", + "level": 3 + }, + { + "id": null, + "text": "Performance tip", + "level": 3 + }, + { + "id": "font-weights-and-styles", + "text": "Font Weights and Styles", + "level": 2 + }, + { + "id": "specifying-font-weights", + "text": "Specifying Font Weights", + "level": 3 + }, + { + "id": "debugging-font-weights", + "text": "Debugging Font Weights", + "level": 3 + }, + { + "id": null, + "text": "Font weight tip", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "flash-of-unstyled-text-fout", + "text": "Flash of Unstyled Text (FOUT)", + "level": 3 + }, + { + "id": "common-issues", + "text": "Common Issues", + "level": 3 + }, + { + "id": "live-example", + "text": "Live Example", + "level": 2 + }, + { + "id": "alternative-approaches", + "text": "Alternative Approaches", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/": { + "ids": [ + "advanced-features", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "advanced-features", + "text": "Advanced Features", + "level": 1 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/guides/social-media/": { + "ids": [ + "social-media-screenshots", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "social-media-screenshots", + "text": "Social Media Screenshots", + "level": 1 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/guides/debugging/": { + "ids": [ + "debugging", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "debugging", + "text": "Debugging", + "level": 1 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/guides/workflows/": { + "ids": [ + "workflows--tools", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "workflows--tools", + "text": "Workflows & Tools", + "level": 1 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/guides/styling/": { + "ids": [ + "styling--fonts", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "styling--fonts", + "text": "Styling & Fonts", + "level": 1 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/guides/og-images/": { + "ids": [ + "og-image-platform-guides", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "og-image-platform-guides", + "text": "OG Image platform guides", + "level": 1 + } + ] + }, + "/guides/account/": { + "ids": [ + "account--organizations", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "account--organizations", + "text": "Account & organizations", + "level": 1 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/guides/account/organization-settings/": { + "ids": [ + "organization-settings", + "what-is-an-organization", + "member-roles", + "resource-permissions", + "invites", + "managing-members-and-billing-emails", + "see-also", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "organization-settings", + "text": "Organization settings", + "level": 1 + }, + { + "id": "what-is-an-organization", + "text": "What is an organization?", + "level": 2 + }, + { + "id": "member-roles", + "text": "Member roles", + "level": 2 + }, + { + "id": "resource-permissions", + "text": "Resource permissions", + "level": 2 + }, + { + "id": "invites", + "text": "Invites", + "level": 2 + }, + { + "id": "managing-members-and-billing-emails", + "text": "Managing members and billing emails", + "level": 2 + }, + { + "id": "see-also", + "text": "See also", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/account/account-settings/": { + "ids": [ + "account-settings", + "what-youll-find-here", + "switching-organizations", + "accepting-or-declining-invites", + "organization-settings-vs-account-settings", + "api-keys-and-mcp-connections", + "see-also", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "account-settings", + "text": "Account settings", + "level": 1 + }, + { + "id": "what-youll-find-here", + "text": "What you\u2019ll find here", + "level": 2 + }, + { + "id": "switching-organizations", + "text": "Switching organizations", + "level": 2 + }, + { + "id": "accepting-or-declining-invites", + "text": "Accepting or declining invites", + "level": 2 + }, + { + "id": "organization-settings-vs-account-settings", + "text": "Organization settings vs account settings", + "level": 2 + }, + { + "id": "api-keys-and-mcp-connections", + "text": "API keys and MCP connections", + "level": 2 + }, + { + "id": "see-also", + "text": "See also", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/og-images/webflow/": { + "ids": [ + "generate-automatic-open-graph-images-for-your-webflow-site", + "before-you-begin", + "add-tags-to-a-static-page", + "add-tags-to-a-cms-collection-page", + "pass-webflow-cms-fields-to-a-template", + "customize-page-screenshot-mode", + "publish-and-verify", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "generate-automatic-open-graph-images-for-your-webflow-site", + "text": "Generate Automatic Open Graph Images for your Webflow Site", + "level": 1 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "add-tags-to-a-static-page", + "text": "Add tags to a static page", + "level": 2 + }, + { + "id": "add-tags-to-a-cms-collection-page", + "text": "Add tags to a CMS Collection page", + "level": 2 + }, + { + "id": "pass-webflow-cms-fields-to-a-template", + "text": "Pass Webflow CMS fields to a template", + "level": 2 + }, + { + "id": "customize-page-screenshot-mode", + "text": "Customize Page Screenshot mode", + "level": 2 + }, + { + "id": "publish-and-verify", + "text": "Publish and verify", + "level": 2 + } + ] + }, + "/guides/og-images/jekyll/": { + "ids": [ + "generate-automatic-open-graph-images-for-your-jekyll-site", + "before-you-begin", + "add-a-reusable-head-include", + "use-front-matter-for-per-page-controls", + "page-screenshot-mode", + "template-values-mode", + "build-and-verify", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "generate-automatic-open-graph-images-for-your-jekyll-site", + "text": "Generate Automatic Open Graph Images for your Jekyll Site", + "level": 1 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "add-a-reusable-head-include", + "text": "Add a reusable head include", + "level": 2 + }, + { + "id": "use-front-matter-for-per-page-controls", + "text": "Use front matter for per-page controls", + "level": 2 + }, + { + "id": "page-screenshot-mode", + "text": "Page Screenshot mode", + "level": 3 + }, + { + "id": "template-values-mode", + "text": "Template Values mode", + "level": 3 + }, + { + "id": "build-and-verify", + "text": "Build and verify", + "level": 2 + } + ] + }, + "/guides/og-images/squarespace/": { + "ids": [ + "generate-automatic-open-graph-images-for-your-squarespace-site", + "before-you-begin", + "add-tags-to-a-static-squarespace-page", + "customize-a-page-screenshot", + "send-values-to-an-hcti-template", + "understand-collection-page-limitations", + "verify-the-published-page", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "generate-automatic-open-graph-images-for-your-squarespace-site", + "text": "Generate Automatic Open Graph Images for your Squarespace Site", + "level": 1 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "add-tags-to-a-static-squarespace-page", + "text": "Add tags to a static Squarespace page", + "level": 2 + }, + { + "id": "customize-a-page-screenshot", + "text": "Customize a page screenshot", + "level": 2 + }, + { + "id": "send-values-to-an-hcti-template", + "text": "Send values to an HCTI template", + "level": 2 + }, + { + "id": "understand-collection-page-limitations", + "text": "Understand collection-page limitations", + "level": 2 + }, + { + "id": "verify-the-published-page", + "text": "Verify the published page", + "level": 2 + } + ] + }, + "/guides/og-images/wordpress/": { + "ids": [ + "generate-automatic-open-graph-images-for-your-wordpress-site", + "before-you-begin", + "build-the-hcti-image-url", + "option-a-a-site-without-an-seo-social-tag-plugin", + "option-b-yoast-seo-already-generates-the-tags", + "use-post-data-in-template-values-mode", + "configure-page-screenshot-mode", + "verify-the-output", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "generate-automatic-open-graph-images-for-your-wordpress-site", + "text": "Generate Automatic Open Graph Images for your WordPress Site", + "level": 1 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "build-the-hcti-image-url", + "text": "Build the HCTI image URL", + "level": 2 + }, + { + "id": "option-a-a-site-without-an-seo-social-tag-plugin", + "text": "Option A: a site without an SEO social-tag plugin", + "level": 2 + }, + { + "id": "option-b-yoast-seo-already-generates-the-tags", + "text": "Option B: Yoast SEO already generates the tags", + "level": 2 + }, + { + "id": "use-post-data-in-template-values-mode", + "text": "Use post data in Template Values mode", + "level": 2 + }, + { + "id": "configure-page-screenshot-mode", + "text": "Configure Page Screenshot mode", + "level": 2 + }, + { + "id": "verify-the-output", + "text": "Verify the output", + "level": 2 + } + ] + }, + "/guides/og-images/shopify/": { + "ids": [ + "generate-automatic-open-graph-images-for-your-shopify-store", + "before-you-begin", + "add-the-image-tags-to-your-theme", + "use-shopify-data-in-a-template", + "capture-a-storefront-element", + "verify-the-storefront-output", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "generate-automatic-open-graph-images-for-your-shopify-store", + "text": "Generate Automatic Open Graph Images for your Shopify Store", + "level": 1 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "add-the-image-tags-to-your-theme", + "text": "Add the image tags to your theme", + "level": 2 + }, + { + "id": "use-shopify-data-in-a-template", + "text": "Use Shopify data in a template", + "level": 2 + }, + { + "id": "capture-a-storefront-element", + "text": "Capture a storefront element", + "level": 2 + }, + { + "id": "verify-the-storefront-output", + "text": "Verify the storefront output", + "level": 2 + } + ] + }, + "/guides/og-images/sitepress/": { + "ids": [ + "generate-automatic-open-graph-images-for-your-sitepress-site", + "before-you-begin", + "add-the-tags-to-a-shared-erb-layout", + "use-sitepress-frontmatter-as-template-values", + "configure-page-screenshot-mode", + "compile-and-verify", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "generate-automatic-open-graph-images-for-your-sitepress-site", + "text": "Generate Automatic Open Graph Images for your Sitepress Site", + "level": 1 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "add-the-tags-to-a-shared-erb-layout", + "text": "Add the tags to a shared ERB layout", + "level": 2 + }, + { + "id": "use-sitepress-frontmatter-as-template-values", + "text": "Use Sitepress frontmatter as template values", + "level": 2 + }, + { + "id": "configure-page-screenshot-mode", + "text": "Configure Page Screenshot mode", + "level": 2 + }, + { + "id": "compile-and-verify", + "text": "Compile and verify", + "level": 2 + } + ] + }, + "/guides/og-images/wix/": { + "ids": [ + "generate-automatic-open-graph-images-for-your-wix-site", + "before-you-begin", + "add-the-tags-with-velo", + "use-wix-data-in-template-values-mode", + "configure-page-screenshot-mode", + "publish-and-verify", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "generate-automatic-open-graph-images-for-your-wix-site", + "text": "Generate Automatic Open Graph Images for your Wix Site", + "level": 1 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "add-the-tags-with-velo", + "text": "Add the tags with Velo", + "level": 2 + }, + { + "id": "use-wix-data-in-template-values-mode", + "text": "Use Wix data in Template Values mode", + "level": 2 + }, + { + "id": "configure-page-screenshot-mode", + "text": "Configure Page Screenshot mode", + "level": 2 + }, + { + "id": "publish-and-verify", + "text": "Publish and verify", + "level": 2 + } + ] + }, + "/guides/og-images/astro/": { + "ids": [ + "generate-automatic-open-graph-images-for-your-astro-site", + "before-you-begin", + "create-an-seo-component", + "render-it-from-a-shared-layout", + "adapt-a-page-screenshot", + "build-and-verify", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "generate-automatic-open-graph-images-for-your-astro-site", + "text": "Generate Automatic Open Graph Images for your Astro Site", + "level": 1 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "create-an-seo-component", + "text": "Create an SEO component", + "level": 2 + }, + { + "id": "render-it-from-a-shared-layout", + "text": "Render it from a shared layout", + "level": 2 + }, + { + "id": "adapt-a-page-screenshot", + "text": "Adapt a page screenshot", + "level": 2 + }, + { + "id": "build-and-verify", + "text": "Build and verify", + "level": 2 + } + ] + }, + "/guides/styling/file-formats/": { + "ids": [ + "image-file-formats", + "supported-formats", + "format-characteristics", + "png", + "jpg", + "webp", + "pdf", + "automatic-webp-optimization", + "best-practices", + "format-selection", + "browser-support", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "image-file-formats", + "text": "Image File Formats", + "level": 1 + }, + { + "id": "supported-formats", + "text": "Supported Formats", + "level": 2 + }, + { + "id": null, + "text": "Tip", + "level": 3 + }, + { + "id": null, + "text": "Default Format", + "level": 3 + }, + { + "id": "format-characteristics", + "text": "Format Characteristics", + "level": 2 + }, + { + "id": "png", + "text": "PNG", + "level": 3 + }, + { + "id": "jpg", + "text": "JPG", + "level": 3 + }, + { + "id": "webp", + "text": "WebP", + "level": 3 + }, + { + "id": "pdf", + "text": "PDF", + "level": 3 + }, + { + "id": "automatic-webp-optimization", + "text": "Automatic WebP Optimization", + "level": 2 + }, + { + "id": null, + "text": "Performance Tip", + "level": 3 + }, + { + "id": "best-practices", + "text": "Best Practices", + "level": 2 + }, + { + "id": "format-selection", + "text": "Format Selection", + "level": 3 + }, + { + "id": "browser-support", + "text": "Browser Support", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/styling/transparent-background/": { + "ids": [ + "transparent-backgrounds", + "simplified-method-recommended", + "implementation", + "examples", + "basic-example", + "code-example", + "common-use-cases", + "best-practices", + "dos", + "donts", + "url-based-screenshots", + "troubleshooting", + "common-issues", + "example-fix", + "browser-compatibility", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "transparent-backgrounds", + "text": "Transparent Backgrounds", + "level": 1 + }, + { + "id": "simplified-method-recommended", + "text": "Simplified method (recommended)", + "level": 2 + }, + { + "id": null, + "text": "Existing method still supported", + "level": 3 + }, + { + "id": "implementation", + "text": "Implementation", + "level": 2 + }, + { + "id": null, + "text": "Important", + "level": 3 + }, + { + "id": null, + "text": "PNG Format Required", + "level": 3 + }, + { + "id": "examples", + "text": "Examples", + "level": 2 + }, + { + "id": "basic-example", + "text": "Basic Example", + "level": 3 + }, + { + "id": "code-example", + "text": "Code Example", + "level": 3 + }, + { + "id": "common-use-cases", + "text": "Common Use Cases", + "level": 2 + }, + { + "id": "best-practices", + "text": "Best Practices", + "level": 2 + }, + { + "id": "dos", + "text": "Do\u2019s", + "level": 3 + }, + { + "id": "donts", + "text": "Don\u2019ts", + "level": 3 + }, + { + "id": "url-based-screenshots", + "text": "URL-based Screenshots", + "level": 2 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "common-issues", + "text": "Common Issues", + "level": 3 + }, + { + "id": "example-fix", + "text": "Example Fix", + "level": 3 + }, + { + "id": null, + "text": "Performance Tip", + "level": 3 + }, + { + "id": "browser-compatibility", + "text": "Browser Compatibility", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/styling/external-css-fonts/": { + "ids": [ + "external-css-javascript--fonts", + "external-javascript-example", + "external-css-example", + "external-font-example", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "external-css-javascript--fonts", + "text": "External CSS, JavaScript & Fonts", + "level": 1 + }, + { + "id": "external-javascript-example", + "text": "External JavaScript Example", + "level": 2 + }, + { + "id": "external-css-example", + "text": "External CSS Example", + "level": 2 + }, + { + "id": "external-font-example", + "text": "External Font Example", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/workflows/highcharts/": { + "ids": [ + "image-charts-with-highchartsjs", + "example-html", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "image-charts-with-highchartsjs", + "text": "Image charts with Highcharts.js", + "level": 1 + }, + { + "id": "example-html", + "text": "Example HTML", + "level": 3 + }, + { + "id": null, + "text": "Disable animations", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/workflows/insomnia/": { + "ids": [ + "insomnia-htmlcss-to-image-api", + "insomnia", + "authorization", + "passing-htmlcss", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "insomnia-htmlcss-to-image-api", + "text": "Insomnia: HTML/CSS to Image API", + "level": 1 + }, + { + "id": "insomnia", + "text": "Insomnia", + "level": 2 + }, + { + "id": "authorization", + "text": "Authorization", + "level": 3 + }, + { + "id": "passing-htmlcss", + "text": "Passing HTML/CSS", + "level": 3 + } + ] + }, + "/guides/workflows/postman/": { + "ids": [ + "postman-htmlcss-to-image-api", + "create-your-first-image", + "explore-examples-and-parameters", + "make-a-request-manually", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "postman-htmlcss-to-image-api", + "text": "Postman: HTML/CSS to Image API", + "level": 1 + }, + { + "id": "create-your-first-image", + "text": "Create your first image", + "level": 2 + }, + { + "id": "explore-examples-and-parameters", + "text": "Explore examples and parameters", + "level": 2 + }, + { + "id": "make-a-request-manually", + "text": "Make a request manually", + "level": 2 + } + ] + }, + "/guides/workflows/email-to-slack/": { + "ids": [ + "how-to-automatically-post-email-screenshots-to-slack-with-zapier", + "how-it-works", + "step-by-step-guide", + "thats-it", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "how-to-automatically-post-email-screenshots-to-slack-with-zapier", + "text": "How to automatically post email screenshots to Slack (with Zapier)", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "step-by-step-guide", + "text": "Step by step guide", + "level": 2 + }, + { + "id": null, + "text": "FYI", + "level": 3 + }, + { + "id": "thats-it", + "text": "That\u2019s it!", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/workflows/email-to-images/": { + "ids": [ + "convert-html-emails-to-images", + "generating-images-and-pdfs-from-emails", + "include-full-html", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "convert-html-emails-to-images", + "text": "Convert HTML emails to images", + "level": 1 + }, + { + "id": "generating-images-and-pdfs-from-emails", + "text": "Generating images and PDFs from emails", + "level": 2 + }, + { + "id": "include-full-html", + "text": "Include full ", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/debugging/white-images/": { + "ids": [ + "debugging-white-or-blank-images", + "why-is-my-image-white-or-blank", + "solution-ms_delay", + "solution-render_when_ready", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "debugging-white-or-blank-images", + "text": "Debugging white or blank images", + "level": 1 + }, + { + "id": "why-is-my-image-white-or-blank", + "text": "Why is my image white or blank?", + "level": 2 + }, + { + "id": "solution-ms_delay", + "text": "Solution: ms_delay", + "level": 2 + }, + { + "id": "solution-render_when_ready", + "text": "Solution: render_when_ready", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/debugging/emoji/": { + "ids": [ + "rendering-emoji", + "how-it-works", + "emoji-class", + "disabling-twemoji", + "when-to-disable-twemoji", + "example", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "rendering-emoji", + "text": "Rendering Emoji", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "emoji-class", + "text": "emoji class", + "level": 2 + }, + { + "id": "disabling-twemoji", + "text": "Disabling Twemoji", + "level": 2 + }, + { + "id": "when-to-disable-twemoji", + "text": "When to disable Twemoji", + "level": 3 + }, + { + "id": "example", + "text": "Example", + "level": 3 + }, + { + "id": null, + "text": "Note", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/debugging/blurry-images/": { + "ids": [ + "debugging-blurry-images", + "why-images-look-blurry", + "understanding-pixel-density", + "the-modern-display-challenge", + "the-2x-rule-explained", + "device-scale-settings", + "default-behavior", + "common-causes-of-blurry-images", + "1-insufficient-source-image-resolution", + "2-incorrect-device-scale-for-urls", + "3-mixed-resolution-assets", + "step-by-step-debugging", + "step-1-check-your-device-scale", + "step-2-audit-your-source-images", + "step-3-test-on-different-displays", + "real-world-examples", + "example-1-social-media-card", + "example-2-company-logo", + "advanced-techniques", + "responsive-images-with-srcset", + "css-media-queries-for-high-dpi", + "vector-graphics-for-perfect-scaling", + "performance-considerations", + "file-size-impact", + "optimization-strategies", + "troubleshooting-checklist", + "browser-testing", + "need-help", + "need-help-1", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "debugging-blurry-images", + "text": "Debugging Blurry Images", + "level": 1 + }, + { + "id": "why-images-look-blurry", + "text": "Why Images Look Blurry", + "level": 2 + }, + { + "id": null, + "text": "Default High Resolution", + "level": 3 + }, + { + "id": "understanding-pixel-density", + "text": "Understanding Pixel Density", + "level": 2 + }, + { + "id": "the-modern-display-challenge", + "text": "The Modern Display Challenge", + "level": 3 + }, + { + "id": "the-2x-rule-explained", + "text": "The 2x Rule Explained", + "level": 3 + }, + { + "id": "device-scale-settings", + "text": "Device Scale Settings", + "level": 2 + }, + { + "id": "default-behavior", + "text": "Default Behavior", + "level": 3 + }, + { + "id": "common-causes-of-blurry-images", + "text": "Common Causes of Blurry Images", + "level": 2 + }, + { + "id": "1-insufficient-source-image-resolution", + "text": "1. Insufficient Source Image Resolution", + "level": 3 + }, + { + "id": "2-incorrect-device-scale-for-urls", + "text": "2. Incorrect Device Scale for URLs", + "level": 3 + }, + { + "id": "3-mixed-resolution-assets", + "text": "3. Mixed Resolution Assets", + "level": 3 + }, + { + "id": "step-by-step-debugging", + "text": "Step-by-Step Debugging", + "level": 2 + }, + { + "id": "step-1-check-your-device-scale", + "text": "Step 1: Check Your Device Scale", + "level": 3 + }, + { + "id": "step-2-audit-your-source-images", + "text": "Step 2: Audit Your Source Images", + "level": 3 + }, + { + "id": "step-3-test-on-different-displays", + "text": "Step 3: Test on Different Displays", + "level": 3 + }, + { + "id": "real-world-examples", + "text": "Real-World Examples", + "level": 2 + }, + { + "id": "example-1-social-media-card", + "text": "Example 1: Social Media Card", + "level": 3 + }, + { + "id": "example-2-company-logo", + "text": "Example 2: Company Logo", + "level": 3 + }, + { + "id": "advanced-techniques", + "text": "Advanced Techniques", + "level": 2 + }, + { + "id": "responsive-images-with-srcset", + "text": "Responsive Images with srcset", + "level": 3 + }, + { + "id": "css-media-queries-for-high-dpi", + "text": "CSS Media Queries for High-DPI", + "level": 3 + }, + { + "id": "vector-graphics-for-perfect-scaling", + "text": "Vector Graphics for Perfect Scaling", + "level": 3 + }, + { + "id": "performance-considerations", + "text": "Performance Considerations", + "level": 2 + }, + { + "id": "file-size-impact", + "text": "File Size Impact", + "level": 3 + }, + { + "id": "optimization-strategies", + "text": "Optimization Strategies", + "level": 3 + }, + { + "id": null, + "text": "Performance Tip", + "level": 3 + }, + { + "id": "troubleshooting-checklist", + "text": "Troubleshooting Checklist", + "level": 2 + }, + { + "id": "browser-testing", + "text": "Browser Testing", + "level": 2 + }, + { + "id": "need-help", + "text": "Need Help?", + "level": 2 + }, + { + "id": "need-help-1", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/debugging/cropping-issues/": { + "ids": [ + "debugging-cropping-issues", + "table-of-contents", + "markdown-toc", + "markdown-toc-how-auto-cropping-works", + "markdown-toc-the-most-common-mistake", + "markdown-toc-what-happens-with-a-full-html-page", + "markdown-toc-the-solution-use-html-snippets", + "markdown-toc-setting-dimensions-on-the-outermost-element", + "markdown-toc-using-css-classes", + "markdown-toc-adding-margins-around-your-image", + "markdown-toc-without-margin", + "markdown-toc-with-margin", + "markdown-toc-when-you-need-full-html-pages", + "markdown-toc-quick-troubleshooting-checklist", + "markdown-toc-summary", + "markdown-toc-need-help", + "how-auto-cropping-works", + "the-most-common-mistake", + "what-happens-with-a-full-html-page", + "the-solution-use-html-snippets", + "setting-dimensions-on-the-outermost-element", + "using-css-classes", + "adding-margins-around-your-image", + "without-margin", + "with-margin", + "when-you-need-full-html-pages", + "quick-troubleshooting-checklist", + "summary", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "debugging-cropping-issues", + "text": "Debugging Cropping Issues", + "level": 1 + }, + { + "id": "table-of-contents", + "text": "Table of contents", + "level": 2 + }, + { + "id": "how-auto-cropping-works", + "text": "How Auto-Cropping Works", + "level": 2 + }, + { + "id": null, + "text": "Key Concept", + "level": 3 + }, + { + "id": "the-most-common-mistake", + "text": "The Most Common Mistake", + "level": 2 + }, + { + "id": "what-happens-with-a-full-html-page", + "text": "What Happens with a Full HTML Page", + "level": 3 + }, + { + "id": "the-solution-use-html-snippets", + "text": "The Solution: Use HTML Snippets", + "level": 2 + }, + { + "id": "setting-dimensions-on-the-outermost-element", + "text": "Setting Dimensions on the Outermost Element", + "level": 2 + }, + { + "id": "using-css-classes", + "text": "Using CSS Classes", + "level": 3 + }, + { + "id": "adding-margins-around-your-image", + "text": "Adding Margins Around Your Image", + "level": 2 + }, + { + "id": "without-margin", + "text": "Without Margin", + "level": 3 + }, + { + "id": "with-margin", + "text": "With Margin", + "level": 3 + }, + { + "id": "when-you-need-full-html-pages", + "text": "When You Need Full HTML Pages", + "level": 2 + }, + { + "id": "quick-troubleshooting-checklist", + "text": "Quick Troubleshooting Checklist", + "level": 2 + }, + { + "id": "summary", + "text": "Summary", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/debugging/cloudflare-challenges/": { + "ids": [ + "bypassing-cloudflare-challenges-for-sites-you-control", + "the-problem", + "the-approach", + "1-create-a-private-header", + "2-add-a-cloudflare-skip-rule", + "3-send-the-header-with-hcti", + "4-verify-and-troubleshoot", + "operational-checklist", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "bypassing-cloudflare-challenges-for-sites-you-control", + "text": "Bypassing Cloudflare challenges for sites you control", + "level": 1 + }, + { + "id": null, + "text": "Only for sites you control", + "level": 3 + }, + { + "id": "the-problem", + "text": "The problem", + "level": 2 + }, + { + "id": "the-approach", + "text": "The approach", + "level": 2 + }, + { + "id": "1-create-a-private-header", + "text": "1. Create a private header", + "level": 2 + }, + { + "id": "2-add-a-cloudflare-skip-rule", + "text": "2. Add a Cloudflare skip rule", + "level": 2 + }, + { + "id": "3-send-the-header-with-hcti", + "text": "3. Send the header with HCTI", + "level": 2 + }, + { + "id": "4-verify-and-troubleshoot", + "text": "4. Verify and troubleshoot", + "level": 2 + }, + { + "id": "operational-checklist", + "text": "Operational checklist", + "level": 2 + }, + { + "id": null, + "text": "Not a Cloudflare challenge?", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/debugging/og-image-caching/": { + "ids": [ + "og-image-caching-and-refreshes", + "the-three-caches-involved", + "what-the-refresh-interval-controls", + "source-cache-headers-can-extend-the-interval", + "why-a-metadata-refresh-may-reuse-the-same-image", + "force-a-new-content-identity", + "query-strings-do-not-bust-this-cache", + "use-refresh-metadata-in-the-dashboard", + "social-platforms-may-still-show-the-old-card", + "troubleshooting-checklist", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "og-image-caching-and-refreshes", + "text": "OG Image caching and refreshes", + "level": 1 + }, + { + "id": "the-three-caches-involved", + "text": "The three caches involved", + "level": 2 + }, + { + "id": "what-the-refresh-interval-controls", + "text": "What the refresh interval controls", + "level": 2 + }, + { + "id": "source-cache-headers-can-extend-the-interval", + "text": "Source cache headers can extend the interval", + "level": 3 + }, + { + "id": "why-a-metadata-refresh-may-reuse-the-same-image", + "text": "Why a metadata refresh may reuse the same image", + "level": 2 + }, + { + "id": "force-a-new-content-identity", + "text": "Force a new content identity", + "level": 2 + }, + { + "id": "query-strings-do-not-bust-this-cache", + "text": "Query strings do not bust this cache", + "level": 2 + }, + { + "id": "use-refresh-metadata-in-the-dashboard", + "text": "Use Refresh metadata in the dashboard", + "level": 2 + }, + { + "id": "social-platforms-may-still-show-the-old-card", + "text": "Social platforms may still show the old card", + "level": 2 + }, + { + "id": "troubleshooting-checklist", + "text": "Troubleshooting checklist", + "level": 2 + } + ] + }, + "/guides/social-media/twitter/": { + "ids": [ + "screenshot-a-tweetpost", + "method-1-url-screenshot-recommended", + "example", + "result", + "parameters", + "method-2-html-embed", + "result-1", + "parameters-for-html-embed", + "choosing-the-right-method", + "getting-the-tweet-url", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "screenshot-a-tweetpost", + "text": "Screenshot a Tweet/Post", + "level": 1 + }, + { + "id": "method-1-url-screenshot-recommended", + "text": "Method 1: URL Screenshot (Recommended)", + "level": 2 + }, + { + "id": "example", + "text": "Example", + "level": 3 + }, + { + "id": "result", + "text": "Result", + "level": 3 + }, + { + "id": "parameters", + "text": "Parameters", + "level": 3 + }, + { + "id": null, + "text": "Twitter vs X URLs", + "level": 3 + }, + { + "id": "method-2-html-embed", + "text": "Method 2: HTML Embed", + "level": 2 + }, + { + "id": "result-1", + "text": "Result", + "level": 3 + }, + { + "id": "parameters-for-html-embed", + "text": "Parameters for HTML Embed", + "level": 3 + }, + { + "id": "choosing-the-right-method", + "text": "Choosing the Right Method", + "level": 2 + }, + { + "id": "getting-the-tweet-url", + "text": "Getting the Tweet URL", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/social-media/facebook/": { + "ids": [ + "screenshot-a-facebook-post", + "how-it-works", + "example-code", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "screenshot-a-facebook-post", + "text": "Screenshot a Facebook post", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "example-code", + "text": "Example code", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/social-media/instagram/": { + "ids": [ + "convert-an-instagram-post-into-an-image", + "how-it-works", + "example-code", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "convert-an-instagram-post-into-an-image", + "text": "Convert an Instagram post into an image", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "example-code", + "text": "Example code", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/social-media/linkedin/": { + "ids": [ + "screenshot-a-linkedin-post", + "how-it-works", + "example-code", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "screenshot-a-linkedin-post", + "text": "Screenshot a LinkedIn Post", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "example-code", + "text": "Example code", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/blocking-cookie-banners/": { + "ids": [ + "blocking-cookie-banners", + "how-it-works", + "automatic-cookie-banner-blocking", + "manual-css-injection-advanced", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "blocking-cookie-banners", + "text": "Blocking cookie banners", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "automatic-cookie-banner-blocking", + "text": "Automatic Cookie Banner Blocking", + "level": 2 + }, + { + "id": null, + "text": "Recommended Method", + "level": 3 + }, + { + "id": "manual-css-injection-advanced", + "text": "Manual CSS Injection (Advanced)", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/base64/": { + "ids": [ + "convert-base64-to-an-image", + "how-it-works", + "example", + "use-this-with-zapier-or-make", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "convert-base64-to-an-image", + "text": "Convert base64 to an image", + "level": 1 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": "example", + "text": "Example", + "level": 2 + }, + { + "id": "use-this-with-zapier-or-make", + "text": "Use this with Zapier or Make", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/duplicate-detection/": { + "ids": [ + "duplicate-image-detection", + "how-deduplication-works", + "setting-the-lookback-window", + "defaults-and-plan-limits", + "where-it-applies", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "duplicate-image-detection", + "text": "Duplicate image detection", + "level": 1 + }, + { + "id": "how-deduplication-works", + "text": "How deduplication works", + "level": 2 + }, + { + "id": null, + "text": "Best effort, not an idempotency guarantee", + "level": 3 + }, + { + "id": "setting-the-lookback-window", + "text": "Setting the lookback window", + "level": 2 + }, + { + "id": "defaults-and-plan-limits", + "text": "Defaults and plan limits", + "level": 2 + }, + { + "id": "where-it-applies", + "text": "Where it applies", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/jumbo-images/": { + "ids": [ + "jumbo-images", + "markdown-toc", + "markdown-toc-what-are-jumbo-images", + "markdown-toc-why-jumbo-matters", + "markdown-toc-when-to-use-it", + "markdown-toc-parameters", + "markdown-toc-how-it-works", + "markdown-toc-limits", + "markdown-toc-billing", + "markdown-toc-examples", + "markdown-toc-examples-1", + "markdown-toc-html-render", + "markdown-toc-url-render", + "markdown-toc-render-a-specific-large-element", + "markdown-toc-curl", + "markdown-toc-troubleshooting", + "markdown-toc-jumbo_max_width-must-be-present-when-jumbo_max_height-is-specified", + "markdown-toc-jumbo_max_height-or-jumbo_max_width-should-be-greater-than-8000", + "markdown-toc-total-jumbo-pixel-area-cannot-be-greater-than-400000000", + "markdown-toc-cannot-set-pdf_options-and-jumbo-options-together", + "markdown-toc-my-image-came-back-smaller-than-jumbo_max_width-x-jumbo_max_height", + "markdown-toc-my-large-image-is-blurry-and-im-not-using-jumbo-parameters", + "markdown-toc-for-example", + "markdown-toc-why-did-this-cost-n-image-credits", + "markdown-toc-why-does-jumbo-cost-more", + "markdown-toc-need-help", + "what-are-jumbo-images", + "why-jumbo-matters", + "when-to-use-it", + "parameters", + "how-it-works", + "limits", + "billing", + "examples", + "examples-1", + "html-render", + "url-render", + "render-a-specific-large-element", + "curl", + "troubleshooting", + "jumbo_max_width-must-be-present-when-jumbo_max_height-is-specified", + "jumbo_max_height-or-jumbo_max_width-should-be-greater-than-8000", + "total-jumbo-pixel-area-cannot-be-greater-than-400000000", + "cannot-set-pdf_options-and-jumbo-options-together", + "my-image-came-back-smaller-than-jumbo_max_width-x-jumbo_max_height", + "my-large-image-is-blurry-and-im-not-using-jumbo-parameters", + "for-example", + "why-did-this-cost-n-image-credits", + "why-does-jumbo-cost-more", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "jumbo-images", + "text": "Jumbo Images", + "level": 1 + }, + { + "id": "what-are-jumbo-images", + "text": "What are jumbo images?", + "level": 2 + }, + { + "id": "why-jumbo-matters", + "text": "Why jumbo matters", + "level": 3 + }, + { + "id": null, + "text": "Without jumbo, large images get downscaled", + "level": 3 + }, + { + "id": "when-to-use-it", + "text": "When to use it", + "level": 3 + }, + { + "id": "parameters", + "text": "Parameters", + "level": 2 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": null, + "text": "Jumbo is measured after device_scale is applied.", + "level": 3 + }, + { + "id": "limits", + "text": "Limits", + "level": 2 + }, + { + "id": "billing", + "text": "Billing", + "level": 2 + }, + { + "id": "examples", + "text": "Examples", + "level": 3 + }, + { + "id": "examples-1", + "text": "Examples", + "level": 2 + }, + { + "id": "html-render", + "text": "HTML render", + "level": 3 + }, + { + "id": "url-render", + "text": "URL render", + "level": 3 + }, + { + "id": "render-a-specific-large-element", + "text": "Render a specific large element", + "level": 3 + }, + { + "id": "curl", + "text": "cURL", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "jumbo_max_width-must-be-present-when-jumbo_max_height-is-specified", + "text": "jumbo_max_width must be present when jumbo_max_height is specified.", + "level": 3 + }, + { + "id": "jumbo_max_height-or-jumbo_max_width-should-be-greater-than-8000", + "text": "jumbo_max_height or jumbo_max_width should be greater than 8000", + "level": 3 + }, + { + "id": "total-jumbo-pixel-area-cannot-be-greater-than-400000000", + "text": "total jumbo pixel area cannot be greater than 400,000,000.", + "level": 3 + }, + { + "id": "cannot-set-pdf_options-and-jumbo-options-together", + "text": "cannot set pdf_options and jumbo options together", + "level": 3 + }, + { + "id": "my-image-came-back-smaller-than-jumbo_max_width-x-jumbo_max_height", + "text": "My image came back smaller than jumbo_max_width x jumbo_max_height", + "level": 3 + }, + { + "id": "my-large-image-is-blurry-and-im-not-using-jumbo-parameters", + "text": "My large image is blurry (and I\u2019m not using jumbo parameters)", + "level": 3 + }, + { + "id": "for-example", + "text": "For example:", + "level": 4 + }, + { + "id": "why-did-this-cost-n-image-credits", + "text": "Why did this cost N image credits?", + "level": 3 + }, + { + "id": "why-does-jumbo-cost-more", + "text": "Why does jumbo cost more?", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/proxies/": { + "ids": [ + "http-proxies", + "why-use-a-proxy", + "recommended-proxy-providers", + "example-bright-data", + "example-zenrows", + "creating-a-proxy", + "using-a-proxy-when-generating-an-image", + "json-request", + "curl", + "htmlcss-with-a-proxy", + "how-it-works", + "troubleshooting", + "manage-proxies-through-api-or-mcp", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "http-proxies", + "text": "HTTP Proxies", + "level": 1 + }, + { + "id": "why-use-a-proxy", + "text": "Why use a proxy?", + "level": 2 + }, + { + "id": null, + "text": "Plan availability", + "level": 3 + }, + { + "id": "recommended-proxy-providers", + "text": "Recommended proxy providers", + "level": 2 + }, + { + "id": "example-bright-data", + "text": "Example: Bright Data", + "level": 3 + }, + { + "id": "example-zenrows", + "text": "Example: ZenRows", + "level": 3 + }, + { + "id": null, + "text": "Use bypass hosts to save credits", + "level": 3 + }, + { + "id": "creating-a-proxy", + "text": "Creating a proxy", + "level": 2 + }, + { + "id": "using-a-proxy-when-generating-an-image", + "text": "Using a proxy when generating an image", + "level": 2 + }, + { + "id": "json-request", + "text": "JSON request", + "level": 3 + }, + { + "id": "curl", + "text": "cURL", + "level": 3 + }, + { + "id": "htmlcss-with-a-proxy", + "text": "HTML/CSS with a proxy", + "level": 3 + }, + { + "id": "how-it-works", + "text": "How it works", + "level": 2 + }, + { + "id": null, + "text": "HTTPS only", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "manage-proxies-through-api-or-mcp", + "text": "Manage proxies through API or MCP", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/storage-destinations/": { + "ids": [ + "storage-destinations", + "why-use-a-storage-destination", + "supported-providers", + "creating-a-storage-destination", + "permissions-shared-by-every-provider", + "using-a-destination", + "json-request", + "curl", + "typescript-client", + "net-client", + "using-a-destination-with-templates", + "disable-hcti-storage", + "put-v1store", + "store-response", + "disabling-or-deleting-a-destination", + "troubleshooting", + "manage-destinations-through-api-or-mcp", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "storage-destinations", + "text": "Storage Destinations", + "level": 1 + }, + { + "id": "why-use-a-storage-destination", + "text": "Why use a storage destination?", + "level": 2 + }, + { + "id": null, + "text": "Plan availability", + "level": 3 + }, + { + "id": "supported-providers", + "text": "Supported providers", + "level": 2 + }, + { + "id": "creating-a-storage-destination", + "text": "Creating a storage destination", + "level": 2 + }, + { + "id": "permissions-shared-by-every-provider", + "text": "Permissions shared by every provider", + "level": 3 + }, + { + "id": "using-a-destination", + "text": "Using a destination", + "level": 2 + }, + { + "id": "json-request", + "text": "JSON request", + "level": 3 + }, + { + "id": "curl", + "text": "cURL", + "level": 3 + }, + { + "id": "typescript-client", + "text": "TypeScript client", + "level": 3 + }, + { + "id": "net-client", + "text": ".NET client", + "level": 3 + }, + { + "id": "using-a-destination-with-templates", + "text": "Using a destination with templates", + "level": 2 + }, + { + "id": "disable-hcti-storage", + "text": "Disable HCTI Storage", + "level": 2 + }, + { + "id": null, + "text": "This setting is captured per image", + "level": 3 + }, + { + "id": "put-v1store", + "text": "PUT /v1/store", + "level": 2 + }, + { + "id": "store-response", + "text": "Store response", + "level": 3 + }, + { + "id": "disabling-or-deleting-a-destination", + "text": "Disabling or deleting a destination", + "level": 2 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "manage-destinations-through-api-or-mcp", + "text": "Manage destinations through API or MCP", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/storage-destinations/s3-compatible/": { + "ids": [ + "upload-images-to-an-s3-compatible-service", + "before-you-begin", + "create-provider-credentials", + "choose-the-endpoint-and-addressing-style", + "add-the-service-to-hcti", + "upload-an-hcti-image-to-your-bucket", + "troubleshooting-s3-compatible-uploads", + "automate-destination-setup", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "upload-images-to-an-s3-compatible-service", + "text": "Upload images to an S3-compatible service", + "level": 1 + }, + { + "id": null, + "text": "Plan availability", + "level": 3 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "create-provider-credentials", + "text": "Create provider credentials", + "level": 2 + }, + { + "id": "choose-the-endpoint-and-addressing-style", + "text": "Choose the endpoint and addressing style", + "level": 2 + }, + { + "id": "add-the-service-to-hcti", + "text": "Add the service to HCTI", + "level": 2 + }, + { + "id": "upload-an-hcti-image-to-your-bucket", + "text": "Upload an HCTI image to your bucket", + "level": 2 + }, + { + "id": "troubleshooting-s3-compatible-uploads", + "text": "Troubleshooting S3-compatible uploads", + "level": 2 + }, + { + "id": null, + "text": "Next: use your storage destination", + "level": 3 + }, + { + "id": "automate-destination-setup", + "text": "Automate destination setup", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/storage-destinations/s3/": { + "ids": [ + "upload-images-to-amazon-s3", + "before-you-begin", + "create-the-iam-role", + "add-the-trust-policy", + "attach-the-permissions-policy", + "finish-the-destination-in-hcti", + "upload-an-hcti-image-to-s3", + "troubleshooting-amazon-s3-uploads", + "automate-destination-setup", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "upload-images-to-amazon-s3", + "text": "Upload images to Amazon S3", + "level": 1 + }, + { + "id": null, + "text": "Plan availability", + "level": 3 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "create-the-iam-role", + "text": "Create the IAM role", + "level": 2 + }, + { + "id": "add-the-trust-policy", + "text": "Add the trust policy", + "level": 3 + }, + { + "id": "attach-the-permissions-policy", + "text": "Attach the permissions policy", + "level": 3 + }, + { + "id": "finish-the-destination-in-hcti", + "text": "Finish the destination in HCTI", + "level": 2 + }, + { + "id": "upload-an-hcti-image-to-s3", + "text": "Upload an HCTI image to S3", + "level": 2 + }, + { + "id": "troubleshooting-amazon-s3-uploads", + "text": "Troubleshooting Amazon S3 uploads", + "level": 2 + }, + { + "id": null, + "text": "Next: use your storage destination", + "level": 3 + }, + { + "id": "automate-destination-setup", + "text": "Automate destination setup", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/storage-destinations/backblaze-b2/": { + "ids": [ + "upload-images-to-backblaze-b2", + "before-you-begin", + "create-a-backblaze-application-key", + "add-backblaze-b2-to-hcti", + "upload-an-hcti-image-to-b2", + "troubleshooting-backblaze-b2-uploads", + "automate-destination-setup", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "upload-images-to-backblaze-b2", + "text": "Upload images to Backblaze B2", + "level": 1 + }, + { + "id": null, + "text": "Plan availability", + "level": 3 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "create-a-backblaze-application-key", + "text": "Create a Backblaze application key", + "level": 2 + }, + { + "id": "add-backblaze-b2-to-hcti", + "text": "Add Backblaze B2 to HCTI", + "level": 2 + }, + { + "id": "upload-an-hcti-image-to-b2", + "text": "Upload an HCTI image to B2", + "level": 2 + }, + { + "id": "troubleshooting-backblaze-b2-uploads", + "text": "Troubleshooting Backblaze B2 uploads", + "level": 2 + }, + { + "id": null, + "text": "Next: use your storage destination", + "level": 3 + }, + { + "id": "automate-destination-setup", + "text": "Automate destination setup", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/storage-destinations/wasabi/": { + "ids": [ + "upload-images-to-wasabi", + "before-you-begin", + "create-wasabi-credentials", + "add-wasabi-to-hcti", + "upload-an-hcti-image-to-wasabi", + "troubleshooting-wasabi-uploads", + "automate-destination-setup", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "upload-images-to-wasabi", + "text": "Upload images to Wasabi", + "level": 1 + }, + { + "id": null, + "text": "Plan availability", + "level": 3 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "create-wasabi-credentials", + "text": "Create Wasabi credentials", + "level": 2 + }, + { + "id": "add-wasabi-to-hcti", + "text": "Add Wasabi to HCTI", + "level": 2 + }, + { + "id": "upload-an-hcti-image-to-wasabi", + "text": "Upload an HCTI image to Wasabi", + "level": 2 + }, + { + "id": "troubleshooting-wasabi-uploads", + "text": "Troubleshooting Wasabi uploads", + "level": 2 + }, + { + "id": null, + "text": "Next: use your storage destination", + "level": 3 + }, + { + "id": "automate-destination-setup", + "text": "Automate destination setup", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/storage-destinations/google-cloud-storage/": { + "ids": [ + "upload-images-to-google-cloud-storage", + "before-you-begin", + "grant-bucket-access", + "create-an-hmac-key", + "add-google-cloud-storage-to-hcti", + "upload-an-hcti-image-to-cloud-storage", + "troubleshooting-google-cloud-storage-uploads", + "automate-destination-setup", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "upload-images-to-google-cloud-storage", + "text": "Upload images to Google Cloud Storage", + "level": 1 + }, + { + "id": null, + "text": "Plan availability", + "level": 3 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "grant-bucket-access", + "text": "Grant bucket access", + "level": 2 + }, + { + "id": "create-an-hmac-key", + "text": "Create an HMAC key", + "level": 2 + }, + { + "id": "add-google-cloud-storage-to-hcti", + "text": "Add Google Cloud Storage to HCTI", + "level": 2 + }, + { + "id": "upload-an-hcti-image-to-cloud-storage", + "text": "Upload an HCTI image to Cloud Storage", + "level": 2 + }, + { + "id": "troubleshooting-google-cloud-storage-uploads", + "text": "Troubleshooting Google Cloud Storage uploads", + "level": 2 + }, + { + "id": null, + "text": "Next: use your storage destination", + "level": 3 + }, + { + "id": "automate-destination-setup", + "text": "Automate destination setup", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/storage-destinations/digitalocean-spaces/": { + "ids": [ + "upload-images-to-digitalocean-spaces", + "before-you-begin", + "create-a-spaces-access-key", + "add-digitalocean-spaces-to-hcti", + "upload-an-hcti-image-to-spaces", + "troubleshooting-digitalocean-spaces-uploads", + "automate-destination-setup", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "upload-images-to-digitalocean-spaces", + "text": "Upload images to DigitalOcean Spaces", + "level": 1 + }, + { + "id": null, + "text": "Plan availability", + "level": 3 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "create-a-spaces-access-key", + "text": "Create a Spaces access key", + "level": 2 + }, + { + "id": "add-digitalocean-spaces-to-hcti", + "text": "Add DigitalOcean Spaces to HCTI", + "level": 2 + }, + { + "id": "upload-an-hcti-image-to-spaces", + "text": "Upload an HCTI image to Spaces", + "level": 2 + }, + { + "id": "troubleshooting-digitalocean-spaces-uploads", + "text": "Troubleshooting DigitalOcean Spaces uploads", + "level": 2 + }, + { + "id": null, + "text": "Next: use your storage destination", + "level": 3 + }, + { + "id": "automate-destination-setup", + "text": "Automate destination setup", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/guides/advanced/storage-destinations/r2/": { + "ids": [ + "upload-images-to-cloudflare-r2", + "before-you-begin", + "create-r2-s3-credentials", + "add-cloudflare-r2-to-hcti", + "choose-the-r2-data-jurisdiction", + "test-and-save-the-destination", + "upload-an-hcti-image-to-r2", + "troubleshooting-cloudflare-r2-uploads", + "automate-destination-setup", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "upload-images-to-cloudflare-r2", + "text": "Upload images to Cloudflare R2", + "level": 1 + }, + { + "id": null, + "text": "Plan availability", + "level": 3 + }, + { + "id": "before-you-begin", + "text": "Before you begin", + "level": 2 + }, + { + "id": "create-r2-s3-credentials", + "text": "Create R2 S3 credentials", + "level": 2 + }, + { + "id": "add-cloudflare-r2-to-hcti", + "text": "Add Cloudflare R2 to HCTI", + "level": 2 + }, + { + "id": "choose-the-r2-data-jurisdiction", + "text": "Choose the R2 data jurisdiction", + "level": 3 + }, + { + "id": "test-and-save-the-destination", + "text": "Test and save the destination", + "level": 2 + }, + { + "id": "upload-an-hcti-image-to-r2", + "text": "Upload an HCTI image to R2", + "level": 2 + }, + { + "id": "troubleshooting-cloudflare-r2-uploads", + "text": "Troubleshooting Cloudflare R2 uploads", + "level": 2 + }, + { + "id": null, + "text": "Next: use your storage destination", + "level": 3 + }, + { + "id": "automate-destination-setup", + "text": "Automate destination setup", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/getting-started/using-the-api/": { + "ids": [ + "using-the-htmlcss-to-image-api", + "authentication", + "creating-an-image", + "parameters", + "additional-parameters", + "example-responses", + "getting-an-image", + "file-formats", + "query-parameters", + "cropping-parameters", + "cropping-examples", + "deleting-an-image", + "example-response", + "batch-image-creation", + "parameters-1", + "example-request", + "example-response-1", + "batch-deletion", + "listing-images", + "query-parameters-1", + "example-response-2", + "checking-account-usage", + "example-response-3", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "using-the-htmlcss-to-image-api", + "text": "Using the HTML/CSS to Image API", + "level": 1 + }, + { + "id": null, + "text": "Using Cursor, Claude, Codex or another AI tool?", + "level": 3 + }, + { + "id": "authentication", + "text": "Authentication", + "level": 2 + }, + { + "id": "creating-an-image", + "text": "Creating an image", + "level": 2 + }, + { + "id": "parameters", + "text": "Parameters", + "level": 3 + }, + { + "id": null, + "text": "Required params", + "level": 3 + }, + { + "id": "additional-parameters", + "text": "Additional parameters", + "level": 3 + }, + { + "id": "example-responses", + "text": "Example responses", + "level": 3 + }, + { + "id": "getting-an-image", + "text": "Getting an image", + "level": 2 + }, + { + "id": "file-formats", + "text": "File formats", + "level": 3 + }, + { + "id": null, + "text": "Tip", + "level": 3 + }, + { + "id": null, + "text": "PNG by default", + "level": 3 + }, + { + "id": "query-parameters", + "text": "Query parameters", + "level": 3 + }, + { + "id": "cropping-parameters", + "text": "Cropping parameters", + "level": 3 + }, + { + "id": "cropping-examples", + "text": "Cropping examples", + "level": 4 + }, + { + "id": "deleting-an-image", + "text": "Deleting an image", + "level": 2 + }, + { + "id": "example-response", + "text": "Example response", + "level": 3 + }, + { + "id": "batch-image-creation", + "text": "Batch image creation", + "level": 2 + }, + { + "id": "parameters-1", + "text": "Parameters", + "level": 3 + }, + { + "id": "example-request", + "text": "Example request", + "level": 3 + }, + { + "id": "example-response-1", + "text": "Example response", + "level": 3 + }, + { + "id": "batch-deletion", + "text": "Batch deletion", + "level": 3 + }, + { + "id": "listing-images", + "text": "Listing images", + "level": 2 + }, + { + "id": "query-parameters-1", + "text": "Query parameters", + "level": 3 + }, + { + "id": "example-response-2", + "text": "Example response", + "level": 3 + }, + { + "id": "checking-account-usage", + "text": "Checking account usage", + "level": 2 + }, + { + "id": "example-response-3", + "text": "Example response", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/getting-started/setting-height-and-width/": { + "ids": [ + "setting-height-and-width", + "setting-height--width-in-html", + "adding-margins-around-the-image", + "setting-the-viewport", + "understanding-high-resolution-retina-images", + "resize-on-the-fly-with-query-params", + "examples", + "advanced-cropping", + "height-and-width-for-print", + "a4-paper-example", + "business-card-example", + "dpi-metadata-tag", + "jumbo-images", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "setting-height-and-width", + "text": "Setting height and width", + "level": 1 + }, + { + "id": "setting-height--width-in-html", + "text": "Setting height & width in HTML", + "level": 2 + }, + { + "id": null, + "text": "Hello, world", + "level": 2 + }, + { + "id": "adding-margins-around-the-image", + "text": "Adding margins around the image", + "level": 3 + }, + { + "id": null, + "text": "Height and width example", + "level": 2 + }, + { + "id": "setting-the-viewport", + "text": "Setting the Viewport", + "level": 2 + }, + { + "id": "understanding-high-resolution-retina-images", + "text": "Understanding high resolution (retina) images", + "level": 2 + }, + { + "id": "resize-on-the-fly-with-query-params", + "text": "Resize on the fly with query params", + "level": 2 + }, + { + "id": "examples", + "text": "Examples", + "level": 3 + }, + { + "id": "advanced-cropping", + "text": "Advanced cropping", + "level": 3 + }, + { + "id": "height-and-width-for-print", + "text": "Height and width for print", + "level": 2 + }, + { + "id": "a4-paper-example", + "text": "A4 paper example", + "level": 3 + }, + { + "id": "business-card-example", + "text": "Business card example", + "level": 3 + }, + { + "id": "dpi-metadata-tag", + "text": "DPI metadata tag", + "level": 3 + }, + { + "id": "jumbo-images", + "text": "Jumbo Images", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/getting-started/url-to-image/": { + "ids": [ + "url-to-image", + "creating-an-image-from-a-url", + "additional-parameters", + "screenshot-examples", + "screenshot-part-of-a-page-with-selector", + "css-selectors", + "blocking-cookie-consent-banners", + "pages-requiring-login-or-sign-in", + "do-you-have-an-ip-allowlist", + "need-help-getting-started", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "url-to-image", + "text": "URL to Image", + "level": 1 + }, + { + "id": "creating-an-image-from-a-url", + "text": "Creating an image from a URL", + "level": 2 + }, + { + "id": null, + "text": "Need a social card for every page?", + "level": 3 + }, + { + "id": "additional-parameters", + "text": "Additional parameters", + "level": 2 + }, + { + "id": "screenshot-examples", + "text": "Screenshot examples", + "level": 2 + }, + { + "id": "screenshot-part-of-a-page-with-selector", + "text": "Screenshot part of a page with Selector", + "level": 2 + }, + { + "id": "css-selectors", + "text": "CSS Selectors", + "level": 2 + }, + { + "id": "blocking-cookie-consent-banners", + "text": "Blocking cookie consent banners", + "level": 2 + }, + { + "id": "pages-requiring-login-or-sign-in", + "text": "Pages requiring login or sign-in", + "level": 2 + }, + { + "id": "do-you-have-an-ip-allowlist", + "text": "Do you have an IP allowlist?", + "level": 2 + }, + { + "id": "need-help-getting-started", + "text": "Need help getting started?", + "level": 2 + } + ] + }, + "/getting-started/templates/": { + "ids": [ + "image-templates", + "what-are-templates", + "handlebars-variables", + "common-use-cases", + "example", + "creating-a-template", + "parameters", + "additional-parameters", + "example-responses", + "editing-a-template", + "parameters-1", + "additional-parameters-1", + "creating-an-image-with-a-template", + "parameters-2", + "listing-your-templates", + "example-responses-1", + "response-fields", + "listing-your-template-versions", + "example-responses-2", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "image-templates", + "text": "Image Templates", + "level": 1 + }, + { + "id": "what-are-templates", + "text": "What are Templates?", + "level": 2 + }, + { + "id": "handlebars-variables", + "text": "Handlebars variables", + "level": 3 + }, + { + "id": "common-use-cases", + "text": "Common use cases", + "level": 3 + }, + { + "id": "example", + "text": "Example", + "level": 3 + }, + { + "id": "creating-a-template", + "text": "Creating a Template", + "level": 2 + }, + { + "id": "parameters", + "text": "Parameters", + "level": 3 + }, + { + "id": null, + "text": "Required params", + "level": 3 + }, + { + "id": "additional-parameters", + "text": "Additional parameters", + "level": 3 + }, + { + "id": "example-responses", + "text": "Example responses", + "level": 3 + }, + { + "id": null, + "text": "Plan Limits", + "level": 3 + }, + { + "id": "editing-a-template", + "text": "Editing a Template", + "level": 2 + }, + { + "id": "parameters-1", + "text": "Parameters", + "level": 3 + }, + { + "id": null, + "text": "Required params", + "level": 3 + }, + { + "id": "additional-parameters-1", + "text": "Additional parameters", + "level": 3 + }, + { + "id": "creating-an-image-with-a-template", + "text": "Creating an image with a template", + "level": 2 + }, + { + "id": null, + "text": "Template Versions", + "level": 3 + }, + { + "id": "parameters-2", + "text": "Parameters", + "level": 3 + }, + { + "id": "listing-your-templates", + "text": "Listing your templates", + "level": 2 + }, + { + "id": "example-responses-1", + "text": "Example responses", + "level": 3 + }, + { + "id": "response-fields", + "text": "Response fields", + "level": 3 + }, + { + "id": "listing-your-template-versions", + "text": "Listing your template versions", + "level": 2 + }, + { + "id": "example-responses-2", + "text": "Example responses", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/getting-started/og-images/": { + "ids": [ + "automatic-open-graph-images-for-every-page", + "what-is-an-open-graph-image", + "how-dynamic-og-images-work", + "create-an-og-image-config", + "1-name-the-config-and-enter-your-website-origin", + "2-choose-how-often-hcti-refreshes-page-metadata", + "3-choose-what-to-render", + "page-screenshot", + "template-values", + "4-choose-image-size-optimization", + "5-add-the-generated-domain-id-to-your-pages", + "refresh-an-image-when-page-content-changes", + "platform-and-cms-setup-guides", + "verify-the-result", + "configure-og-images-through-api-or-mcp", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "automatic-open-graph-images-for-every-page", + "text": "Automatic Open Graph images for every page", + "level": 1 + }, + { + "id": "what-is-an-open-graph-image", + "text": "What is an Open Graph image?", + "level": 2 + }, + { + "id": "how-dynamic-og-images-work", + "text": "How dynamic OG images work", + "level": 2 + }, + { + "id": "create-an-og-image-config", + "text": "Create an OG Image Config", + "level": 2 + }, + { + "id": "1-name-the-config-and-enter-your-website-origin", + "text": "1. Name the config and enter your website origin", + "level": 3 + }, + { + "id": "2-choose-how-often-hcti-refreshes-page-metadata", + "text": "2. Choose how often HCTI refreshes page metadata", + "level": 3 + }, + { + "id": "3-choose-what-to-render", + "text": "3. Choose what to render", + "level": 3 + }, + { + "id": "page-screenshot", + "text": "Page Screenshot", + "level": 4 + }, + { + "id": null, + "text": "Parameter support", + "level": 3 + }, + { + "id": "template-values", + "text": "Template Values", + "level": 4 + }, + { + "id": "4-choose-image-size-optimization", + "text": "4. Choose image size optimization", + "level": 3 + }, + { + "id": "5-add-the-generated-domain-id-to-your-pages", + "text": "5. Add the generated domain ID to your pages", + "level": 3 + }, + { + "id": "refresh-an-image-when-page-content-changes", + "text": "Refresh an image when page content changes", + "level": 3 + }, + { + "id": "platform-and-cms-setup-guides", + "text": "Platform and CMS setup guides", + "level": 2 + }, + { + "id": "verify-the-result", + "text": "Verify the result", + "level": 2 + }, + { + "id": "configure-og-images-through-api-or-mcp", + "text": "Configure OG images through API or MCP", + "level": 2 + } + ] + }, + "/getting-started/create-and-render/": { + "ids": [ + "single-request-image-generation", + "key-benefits", + "creating-an-image", + "url-components", + "parameters", + "additional-parameters", + "creating-a-templated-image-url", + "url-components-1", + "parameters-1", + "understanding-hmac-authentication", + "testing-token-generation-online", + "examples", + "official-client-helpers", + "typescript-client", + "net-client", + "python-client", + "php-client", + "javascript-example", + "php-example", + "example-response", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "single-request-image-generation", + "text": "Single-Request Image Generation", + "level": 1 + }, + { + "id": null, + "text": "Recommendation", + "level": 3 + }, + { + "id": null, + "text": "Publishing social cards?", + "level": 3 + }, + { + "id": "key-benefits", + "text": "Key benefits", + "level": 2 + }, + { + "id": null, + "text": "Security note", + "level": 3 + }, + { + "id": "creating-an-image", + "text": "Creating an image", + "level": 2 + }, + { + "id": "url-components", + "text": "URL Components", + "level": 3 + }, + { + "id": "parameters", + "text": "Parameters", + "level": 3 + }, + { + "id": null, + "text": "Required params", + "level": 3 + }, + { + "id": "additional-parameters", + "text": "Additional parameters", + "level": 3 + }, + { + "id": "creating-a-templated-image-url", + "text": "Creating a templated image URL", + "level": 2 + }, + { + "id": "url-components-1", + "text": "URL Components", + "level": 3 + }, + { + "id": "parameters-1", + "text": "Parameters", + "level": 3 + }, + { + "id": null, + "text": "Use an official client", + "level": 3 + }, + { + "id": "understanding-hmac-authentication", + "text": "Understanding HMAC authentication", + "level": 2 + }, + { + "id": "testing-token-generation-online", + "text": "Testing token generation online", + "level": 3 + }, + { + "id": "examples", + "text": "Examples", + "level": 2 + }, + { + "id": "official-client-helpers", + "text": "Official client helpers", + "level": 3 + }, + { + "id": "typescript-client", + "text": "TypeScript Client", + "level": 4 + }, + { + "id": "net-client", + "text": ".Net Client", + "level": 4 + }, + { + "id": "python-client", + "text": "Python Client", + "level": 4 + }, + { + "id": "php-client", + "text": "PHP Client", + "level": 4 + }, + { + "id": "javascript-example", + "text": "JavaScript example", + "level": 3 + }, + { + "id": "php-example", + "text": "PHP example", + "level": 3 + }, + { + "id": "example-response", + "text": "Example response", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/getting-started/og-images/supported-parameters/": { + "ids": [ + "supported-og-image-parameters", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "supported-og-image-parameters", + "text": "Supported OG Image parameters", + "level": 1 + } + ] + }, + "/getting-started/using-the-api/rate-limits/": { + "ids": [ + "rate-limits-and-usage-limits", + "management-request-limits", + "rest-response-headers", + "mcp-rate-limit-errors", + "image-credits-and-plan-limits", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "rate-limits-and-usage-limits", + "text": "Rate limits and usage limits", + "level": 1 + }, + { + "id": "management-request-limits", + "text": "Management request limits", + "level": 2 + }, + { + "id": "rest-response-headers", + "text": "REST response headers", + "level": 2 + }, + { + "id": "mcp-rate-limit-errors", + "text": "MCP rate-limit errors", + "level": 2 + }, + { + "id": "image-credits-and-plan-limits", + "text": "Image credits and plan limits", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/getting-started/using-the-api/api-keys/": { + "ids": [ + "authentication-and-api-keys", + "create-a-key-in-the-dashboard", + "simple-view-read-and-write-by-area", + "permission-presets", + "advanced-mode-choose-individual-actions", + "see-what-each-permission-allows", + "automatically-grant-future-permissions", + "authenticate-a-request", + "edit-permissions-or-disable-a-key", + "replace-credentials", + "troubleshooting", + "existing-keys", + "legacy-api-keys", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "authentication-and-api-keys", + "text": "Authentication and API keys", + "level": 1 + }, + { + "id": "create-a-key-in-the-dashboard", + "text": "Create a key in the dashboard", + "level": 2 + }, + { + "id": "simple-view-read-and-write-by-area", + "text": "Simple view: read and write by area", + "level": 3 + }, + { + "id": "permission-presets", + "text": "Permission presets", + "level": 3 + }, + { + "id": "advanced-mode-choose-individual-actions", + "text": "Advanced mode: choose individual actions", + "level": 3 + }, + { + "id": "see-what-each-permission-allows", + "text": "See what each permission allows", + "level": 3 + }, + { + "id": "automatically-grant-future-permissions", + "text": "Automatically grant future permissions", + "level": 3 + }, + { + "id": "authenticate-a-request", + "text": "Authenticate a request", + "level": 2 + }, + { + "id": "edit-permissions-or-disable-a-key", + "text": "Edit permissions or disable a key", + "level": 2 + }, + { + "id": "replace-credentials", + "text": "Replace credentials", + "level": 2 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "legacy-api-keys", + "text": "Legacy API keys", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/getting-started/using-the-api/permissions/": { + "ids": [ + "api-permissions", + "how-access-is-determined", + "permission-reference", + "permission-images-create", + "permission-images-read", + "permission-images-delete", + "permission-images-store", + "permission-templates-read", + "permission-templates-create-update", + "permission-templates-delete", + "permission-proxies-read", + "permission-proxies-create-update", + "permission-proxies-delete", + "permission-storage-destinations-read", + "permission-storage-destinations-create-update", + "permission-storage-destinations-delete", + "permission-og-configs-read", + "permission-og-configs-create-update", + "permission-og-configs-delete", + "permission-usage-read", + "permission-api-keys-read", + "permission-api-keys-create-update", + "permission-api-keys-delete", + "using-resources-versus-managing-them", + "granting-permissions", + "current-and-future-permissions", + "organization-roles", + "existing-keys-and-connections", + "permission-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "api-permissions", + "text": "API permissions", + "level": 1 + }, + { + "id": "how-access-is-determined", + "text": "How access is determined", + "level": 2 + }, + { + "id": "permission-reference", + "text": "Permission reference", + "level": 2 + }, + { + "id": "using-resources-versus-managing-them", + "text": "Using resources versus managing them", + "level": 2 + }, + { + "id": "granting-permissions", + "text": "Granting permissions", + "level": 2 + }, + { + "id": "current-and-future-permissions", + "text": "Current and future permissions", + "level": 3 + }, + { + "id": "organization-roles", + "text": "Organization roles", + "level": 2 + }, + { + "id": "existing-keys-and-connections", + "text": "Existing keys and connections", + "level": 2 + }, + { + "id": "permission-errors", + "text": "Permission errors", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/use-cases/screenshots/": { + "ids": [ + "webpage-screenshots", + "overview", + "basic-usage", + "common-use-cases", + "website-archival", + "link-previews", + "competitive-monitoring", + "documentation", + "testing-and-qa", + "capture-specific-elements", + "full-page-screenshots", + "hide-cookie-banners", + "high-resolution-screenshots", + "control-the-viewport", + "wait-for-javascript", + "inject-custom-css", + "social-media-screenshots", + "limitations", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "webpage-screenshots", + "text": "Webpage Screenshots", + "level": 1 + }, + { + "id": "overview", + "text": "Overview", + "level": 2 + }, + { + "id": "basic-usage", + "text": "Basic usage", + "level": 2 + }, + { + "id": "common-use-cases", + "text": "Common use cases", + "level": 2 + }, + { + "id": "website-archival", + "text": "Website archival", + "level": 3 + }, + { + "id": "link-previews", + "text": "Link previews", + "level": 3 + }, + { + "id": "competitive-monitoring", + "text": "Competitive monitoring", + "level": 3 + }, + { + "id": "documentation", + "text": "Documentation", + "level": 3 + }, + { + "id": "testing-and-qa", + "text": "Testing and QA", + "level": 3 + }, + { + "id": "capture-specific-elements", + "text": "Capture specific elements", + "level": 2 + }, + { + "id": "full-page-screenshots", + "text": "Full-page screenshots", + "level": 2 + }, + { + "id": "hide-cookie-banners", + "text": "Hide cookie banners", + "level": 2 + }, + { + "id": "high-resolution-screenshots", + "text": "High-resolution screenshots", + "level": 2 + }, + { + "id": "control-the-viewport", + "text": "Control the viewport", + "level": 2 + }, + { + "id": "wait-for-javascript", + "text": "Wait for JavaScript", + "level": 2 + }, + { + "id": "inject-custom-css", + "text": "Inject custom CSS", + "level": 2 + }, + { + "id": "social-media-screenshots", + "text": "Social media screenshots", + "level": 2 + }, + { + "id": "limitations", + "text": "Limitations", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/use-cases/dynamic-images/": { + "ids": [ + "dynamic-images", + "overview", + "common-use-cases", + "certificates-and-awards", + "job-listings", + "quote-cards", + "personalized-invitations", + "stats-and-leaderboards", + "e-commerce", + "using-templates", + "create-a-template", + "generate-images-from-the-template", + "batch-generation", + "design-tips", + "examples", + "simple-quote-card", + "event-invitation", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "dynamic-images", + "text": "Dynamic Images", + "level": 1 + }, + { + "id": "overview", + "text": "Overview", + "level": 2 + }, + { + "id": "common-use-cases", + "text": "Common use cases", + "level": 2 + }, + { + "id": "certificates-and-awards", + "text": "Certificates and awards", + "level": 3 + }, + { + "id": "job-listings", + "text": "Job listings", + "level": 3 + }, + { + "id": "quote-cards", + "text": "Quote cards", + "level": 3 + }, + { + "id": "personalized-invitations", + "text": "Personalized invitations", + "level": 3 + }, + { + "id": "stats-and-leaderboards", + "text": "Stats and leaderboards", + "level": 3 + }, + { + "id": "e-commerce", + "text": "E-commerce", + "level": 3 + }, + { + "id": "using-templates", + "text": "Using templates", + "level": 2 + }, + { + "id": "create-a-template", + "text": "Create a template", + "level": 3 + }, + { + "id": "generate-images-from-the-template", + "text": "Generate images from the template", + "level": 3 + }, + { + "id": "batch-generation", + "text": "Batch generation", + "level": 2 + }, + { + "id": "design-tips", + "text": "Design tips", + "level": 2 + }, + { + "id": "examples", + "text": "Examples", + "level": 2 + }, + { + "id": "simple-quote-card", + "text": "Simple quote card", + "level": 3 + }, + { + "id": "event-invitation", + "text": "Event invitation", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/use-cases/social-cards/": { + "ids": [ + "social-cards-and-open-graph-images", + "what-are-social-cards", + "the-challenge", + "choose-an-og-image-workflow", + "automatic-og-images-for-an-existing-site", + "api-and-template-workflow", + "real-world-example-devto", + "example-template", + "api-request", + "recommended-dimensions", + "adding-to-your-html", + "using-templates", + "tips-for-great-social-cards", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "social-cards-and-open-graph-images", + "text": "Social Cards and Open Graph Images", + "level": 1 + }, + { + "id": "what-are-social-cards", + "text": "What are social cards?", + "level": 2 + }, + { + "id": "the-challenge", + "text": "The challenge", + "level": 2 + }, + { + "id": "choose-an-og-image-workflow", + "text": "Choose an OG image workflow", + "level": 2 + }, + { + "id": "automatic-og-images-for-an-existing-site", + "text": "Automatic OG images for an existing site", + "level": 3 + }, + { + "id": "api-and-template-workflow", + "text": "API and template workflow", + "level": 3 + }, + { + "id": "real-world-example-devto", + "text": "Real-world example: Dev.to", + "level": 2 + }, + { + "id": "example-template", + "text": "Example template", + "level": 2 + }, + { + "id": "api-request", + "text": "API request", + "level": 2 + }, + { + "id": "recommended-dimensions", + "text": "Recommended dimensions", + "level": 2 + }, + { + "id": "adding-to-your-html", + "text": "Adding to your HTML", + "level": 2 + }, + { + "id": "using-templates", + "text": "Using templates", + "level": 2 + }, + { + "id": "tips-for-great-social-cards", + "text": "Tips for great social cards", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/go/": { + "ids": [ + "go-htmlcss-to-image", + "generating-images-with-go", + "authentication-with-go", + "go-example-code", + "official-go-client", + "direct-http-example", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "go-htmlcss-to-image", + "text": "Go: HTML/CSS to Image", + "level": 1 + }, + { + "id": "generating-images-with-go", + "text": "Generating images with Go", + "level": 2 + }, + { + "id": "authentication-with-go", + "text": "Authentication with Go", + "level": 2 + }, + { + "id": "go-example-code", + "text": "Go example code", + "level": 2 + }, + { + "id": "official-go-client", + "text": "Official Go client", + "level": 2 + }, + { + "id": "direct-http-example", + "text": "Direct HTTP example", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/google-apps-script/": { + "ids": [ + "google-apps-script-htmlcss-to-image", + "generate-an-image-with-google-apps-script", + "example-code", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "google-apps-script-htmlcss-to-image", + "text": "Google Apps Script: HTML/CSS to Image", + "level": 1 + }, + { + "id": "generate-an-image-with-google-apps-script", + "text": "Generate an image with Google Apps Script", + "level": 2 + }, + { + "id": "example-code", + "text": "Example code", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/python/": { + "ids": [ + "python-htmlcss-to-image", + "generating-images-with-python", + "authentication-with-python", + "python-example-code", + "official-pypi-client", + "direct-http-example", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "python-htmlcss-to-image", + "text": "Python: HTML/CSS to Image", + "level": 1 + }, + { + "id": "generating-images-with-python", + "text": "Generating images with Python", + "level": 2 + }, + { + "id": "authentication-with-python", + "text": "Authentication with Python", + "level": 2 + }, + { + "id": "python-example-code", + "text": "Python example code", + "level": 2 + }, + { + "id": "official-pypi-client", + "text": "Official PyPI client", + "level": 2 + }, + { + "id": "direct-http-example", + "text": "Direct HTTP example", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/elixir/": { + "ids": [ + "elixir-htmlcss-to-image", + "generating-images-with-elixir", + "authentication-with-elixir", + "elixir-example-code", + "phoenix-example-with-req", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "elixir-htmlcss-to-image", + "text": "Elixir: HTML/CSS to Image", + "level": 1 + }, + { + "id": "generating-images-with-elixir", + "text": "Generating images with Elixir", + "level": 2 + }, + { + "id": "authentication-with-elixir", + "text": "Authentication with Elixir", + "level": 2 + }, + { + "id": "elixir-example-code", + "text": "Elixir example code", + "level": 2 + }, + { + "id": "phoenix-example-with-req", + "text": "Phoenix example with Req", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/typescript/": { + "ids": [ + "typescript-htmlcss-to-image", + "generating-images-with-typescript", + "authentication-with-typescript", + "typescript-example-code", + "official-npm-client", + "typescript-example-with-fetch-api", + "typescript-with-full-type-definitions", + "url-to-image-with-typescript", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "typescript-htmlcss-to-image", + "text": "TypeScript: HTML/CSS to Image", + "level": 1 + }, + { + "id": "generating-images-with-typescript", + "text": "Generating images with TypeScript", + "level": 2 + }, + { + "id": "authentication-with-typescript", + "text": "Authentication with TypeScript", + "level": 2 + }, + { + "id": "typescript-example-code", + "text": "TypeScript example code", + "level": 2 + }, + { + "id": "official-npm-client", + "text": "Official npm client", + "level": 2 + }, + { + "id": null, + "text": "Can I use this in a browser?", + "level": 3 + }, + { + "id": "typescript-example-with-fetch-api", + "text": "TypeScript example with Fetch API", + "level": 2 + }, + { + "id": "typescript-with-full-type-definitions", + "text": "TypeScript with full type definitions", + "level": 2 + }, + { + "id": "url-to-image-with-typescript", + "text": "URL to Image with TypeScript", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/rust/": { + "ids": [ + "rust-htmlcss-to-image", + "generating-images-with-rust", + "authentication-with-rust", + "rust-example-code", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "rust-htmlcss-to-image", + "text": "Rust: HTML/CSS to Image", + "level": 1 + }, + { + "id": "generating-images-with-rust", + "text": "Generating images with Rust", + "level": 2 + }, + { + "id": "authentication-with-rust", + "text": "Authentication with Rust", + "level": 2 + }, + { + "id": "rust-example-code", + "text": "Rust example code", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/java/": { + "ids": [ + "java-htmlcss-to-image", + "generating-images-with-java", + "authentication-with-java", + "java-example-code", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "java-htmlcss-to-image", + "text": "Java: HTML/CSS to Image", + "level": 1 + }, + { + "id": "generating-images-with-java", + "text": "Generating images with Java", + "level": 2 + }, + { + "id": "authentication-with-java", + "text": "Authentication with Java", + "level": 2 + }, + { + "id": "java-example-code", + "text": "Java example code", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/kotlin/": { + "ids": [ + "kotlin-htmlcss-to-image", + "generating-images-with-kotlin", + "authentication-with-kotlin", + "kotlin-example-code", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "kotlin-htmlcss-to-image", + "text": "Kotlin: HTML/CSS to Image", + "level": 1 + }, + { + "id": "generating-images-with-kotlin", + "text": "Generating images with Kotlin", + "level": 2 + }, + { + "id": "authentication-with-kotlin", + "text": "Authentication with Kotlin", + "level": 2 + }, + { + "id": "kotlin-example-code", + "text": "Kotlin example code", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/php/": { + "ids": [ + "php-htmlcss-to-image", + "generating-images-with-php", + "authentication-with-php", + "php-example-code", + "official-composer-client", + "direct-http-example", + "php-example-with-guzzle-library", + "debugging-errorssl-certificate-problem-unable-to-get-local-issuer-certificate", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "php-htmlcss-to-image", + "text": "PHP: HTML/CSS to Image", + "level": 1 + }, + { + "id": "generating-images-with-php", + "text": "Generating images with PHP", + "level": 2 + }, + { + "id": "authentication-with-php", + "text": "Authentication with PHP", + "level": 2 + }, + { + "id": "php-example-code", + "text": "PHP example code", + "level": 2 + }, + { + "id": "official-composer-client", + "text": "Official Composer client", + "level": 2 + }, + { + "id": "direct-http-example", + "text": "Direct HTTP example", + "level": 2 + }, + { + "id": "php-example-with-guzzle-library", + "text": "PHP example with Guzzle library", + "level": 2 + }, + { + "id": "debugging-errorssl-certificate-problem-unable-to-get-local-issuer-certificate", + "text": "Debugging Error:SSL certificate problem: unable to get local issuer certificate", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/curl/": { + "ids": [ + "curl", + "generate-an-image-with-curl", + "response", + "advanced-example", + "loading-in-contents-from-a-file", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "curl", + "text": "Curl", + "level": 1 + }, + { + "id": "generate-an-image-with-curl", + "text": "Generate an image with cURL", + "level": 2 + }, + { + "id": "response", + "text": "Response", + "level": 2 + }, + { + "id": "advanced-example", + "text": "Advanced example", + "level": 2 + }, + { + "id": "loading-in-contents-from-a-file", + "text": "Loading in contents from a file", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/vb.net/": { + "ids": [ + "vbnet-htmlcss-to-image", + "generate-an-image-with-vbnet", + "example-code", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "vbnet-htmlcss-to-image", + "text": "VB.NET: HTML/CSS to Image", + "level": 1 + }, + { + "id": "generate-an-image-with-vbnet", + "text": "Generate an image with VB.NET", + "level": 2 + }, + { + "id": "example-code", + "text": "Example code", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/javascript/": { + "ids": [ + "javascript-htmlcss-to-image", + "generating-images-with-javascript", + "authentication-with-javascript", + "javascript-example-code", + "javascript-example---asyncawait", + "plain-javascript-nodejs-example", + "client-side-javascript-example-with-fetch-api", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "javascript-htmlcss-to-image", + "text": "JavaScript: HTML/CSS to Image", + "level": 1 + }, + { + "id": "generating-images-with-javascript", + "text": "Generating images with JavaScript", + "level": 2 + }, + { + "id": "authentication-with-javascript", + "text": "Authentication with JavaScript", + "level": 2 + }, + { + "id": "javascript-example-code", + "text": "JavaScript example code", + "level": 2 + }, + { + "id": null, + "text": "Can I use this in a browser?", + "level": 3 + }, + { + "id": "javascript-example---asyncawait", + "text": "JavaScript example - async/await", + "level": 2 + }, + { + "id": "plain-javascript-nodejs-example", + "text": "Plain JavaScript (Node.js) example", + "level": 2 + }, + { + "id": "client-side-javascript-example-with-fetch-api", + "text": "Client side JavaScript example with Fetch API", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/c/": { + "ids": [ + "c--net-htmlcss-to-image", + "official-net-package", + "quick-start", + "1-install-the-nuget-package", + "2-create-a-client", + "3-generate-an-image", + "creating-images-from-a-url", + "using-templates", + "aspnet-core-integration", + "blazor-integration", + "razor-pages--mvc-tag-helpers", + "batch-image-creation", + "signed-urls-create-and-render", + "performance--native-aot", + "plain-http-example", + "legacy-webclient-example", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "c--net-htmlcss-to-image", + "text": "C# / .NET: HTML/CSS to Image", + "level": 1 + }, + { + "id": "official-net-package", + "text": "Official .NET Package", + "level": 2 + }, + { + "id": "quick-start", + "text": "Quick Start", + "level": 2 + }, + { + "id": "1-install-the-nuget-package", + "text": "1. Install the NuGet package", + "level": 3 + }, + { + "id": "2-create-a-client", + "text": "2. Create a client", + "level": 3 + }, + { + "id": "3-generate-an-image", + "text": "3. Generate an image", + "level": 3 + }, + { + "id": "creating-images-from-a-url", + "text": "Creating Images from a URL", + "level": 2 + }, + { + "id": "using-templates", + "text": "Using Templates", + "level": 2 + }, + { + "id": "aspnet-core-integration", + "text": "ASP.NET Core Integration", + "level": 2 + }, + { + "id": "blazor-integration", + "text": "Blazor Integration", + "level": 2 + }, + { + "id": "razor-pages--mvc-tag-helpers", + "text": "Razor Pages / MVC Tag Helpers", + "level": 2 + }, + { + "id": "batch-image-creation", + "text": "Batch Image Creation", + "level": 2 + }, + { + "id": "signed-urls-create-and-render", + "text": "Signed URLs (Create and Render)", + "level": 2 + }, + { + "id": "performance--native-aot", + "text": "Performance & Native AOT", + "level": 2 + }, + { + "id": "plain-http-example", + "text": "Plain HTTP Example", + "level": 2 + }, + { + "id": "legacy-webclient-example", + "text": "Legacy WebClient Example", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/example-code/ruby/": { + "ids": [ + "ruby-htmlcss-to-image", + "generating-images-with-ruby", + "ruby-example-code", + "creating-and-deleting-images-in-batches", + "generating-signed-image-urls", + "template-signature-change-in-020", + "example-with-httparty", + "ruby-on-rails-example-with-caching", + "rendering-a-rails-view", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "ruby-htmlcss-to-image", + "text": "Ruby: HTML/CSS to Image", + "level": 1 + }, + { + "id": "generating-images-with-ruby", + "text": "Generating images with Ruby", + "level": 2 + }, + { + "id": "ruby-example-code", + "text": "Ruby Example Code", + "level": 2 + }, + { + "id": "creating-and-deleting-images-in-batches", + "text": "Creating and deleting images in batches", + "level": 3 + }, + { + "id": "generating-signed-image-urls", + "text": "Generating signed image URLs", + "level": 3 + }, + { + "id": "template-signature-change-in-020", + "text": "Template signature change in 0.2.0", + "level": 4 + }, + { + "id": "example-with-httparty", + "text": "Example with HTTParty", + "level": 2 + }, + { + "id": "ruby-on-rails-example-with-caching", + "text": "Ruby on Rails example with caching", + "level": 2 + }, + { + "id": "rendering-a-rails-view", + "text": "Rendering a Rails view", + "level": 3 + }, + { + "id": null, + "text": "Real world example", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/zapier/": { + "ids": [ + "zapier-htmlcss-to-image", + "available-actions", + "authentication", + "create-images-from-htmlcss", + "create-images-from-a-url", + "troubleshooting", + "designing-images-with-htmlcss", + "429-error", + "blank-images", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "zapier-htmlcss-to-image", + "text": "Zapier: HTML/CSS to Image", + "level": 1 + }, + { + "id": "available-actions", + "text": "Available Actions", + "level": 2 + }, + { + "id": "authentication", + "text": "Authentication", + "level": 2 + }, + { + "id": "create-images-from-htmlcss", + "text": "Create images from HTML/CSS", + "level": 2 + }, + { + "id": null, + "text": "Variables in your HTML", + "level": 3 + }, + { + "id": "create-images-from-a-url", + "text": "Create images from a URL", + "level": 2 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "designing-images-with-htmlcss", + "text": "Designing images with HTML/CSS", + "level": 3 + }, + { + "id": "429-error", + "text": "429 error", + "level": 3 + }, + { + "id": "blank-images", + "text": "Blank images", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/": { + "ids": [ + "mcp-integration", + "introduction", + "choose-your-client", + "setup-for-chatgpt-codex", + "setup-for-claude-code", + "setup-for-claude-desktop", + "setup-for-cline-vs-code", + "setup-for-cursor", + "setup-for-grok", + "setup-for-opencode", + "setup-for-windsurf", + "setup-for-zed", + "what-is-mcp", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "authentication", + "example-prompts", + "how-to-take-a-website-screenshot", + "how-to-render-html-and-css-as-a-png", + "how-to-export-a-pdf", + "how-to-reuse-a-template-and-create-variations", + "how-to-inspect-organization-resources", + "image-parameters", + "additional-parameters", + "troubleshooting", + "authentication-errors", + "permission-errors", + "rate-limit-errors", + "connection-issues", + "image-generation-errors", + "automation-platforms", + "zapier", + "pipedream", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "mcp-integration", + "text": "MCP Integration", + "level": 1 + }, + { + "id": "introduction", + "text": "Introduction", + "level": 2 + }, + { + "id": "choose-your-client", + "text": "Choose your client", + "level": 2 + }, + { + "id": "what-is-mcp", + "text": "What is MCP?", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "authentication", + "text": "Authentication", + "level": 2 + }, + { + "id": "example-prompts", + "text": "Example prompts", + "level": 2 + }, + { + "id": "how-to-take-a-website-screenshot", + "text": "How to take a website screenshot", + "level": 3 + }, + { + "id": "how-to-render-html-and-css-as-a-png", + "text": "How to render HTML and CSS as a PNG", + "level": 3 + }, + { + "id": "how-to-export-a-pdf", + "text": "How to export a PDF", + "level": 3 + }, + { + "id": "how-to-reuse-a-template-and-create-variations", + "text": "How to reuse a template and create variations", + "level": 3 + }, + { + "id": "how-to-inspect-organization-resources", + "text": "How to inspect organization resources", + "level": 3 + }, + { + "id": "image-parameters", + "text": "Image parameters", + "level": 2 + }, + { + "id": "additional-parameters", + "text": "Additional parameters", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "authentication-errors", + "text": "Authentication Errors", + "level": 3 + }, + { + "id": "permission-errors", + "text": "Permission Errors", + "level": 3 + }, + { + "id": "rate-limit-errors", + "text": "Rate Limit Errors", + "level": 3 + }, + { + "id": "connection-issues", + "text": "Connection Issues", + "level": 3 + }, + { + "id": "image-generation-errors", + "text": "Image Generation Errors", + "level": 3 + }, + { + "id": "automation-platforms", + "text": "Automation Platforms", + "level": 2 + }, + { + "id": "zapier", + "text": "Zapier", + "level": 3 + }, + { + "id": "pipedream", + "text": "Pipedream", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/integrations/n8n/": { + "ids": [ + "n8n-htmlcss-to-image-api", + "install-the-integration", + "manual-installation-on-self-hosted-n8n", + "add-your-credentials", + "available-operations", + "choose-the-output", + "example-workflow", + "resources", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "n8n-htmlcss-to-image-api", + "text": "n8n: HTML/CSS to Image API", + "level": 1 + }, + { + "id": null, + "text": "Verified by n8n", + "level": 3 + }, + { + "id": "install-the-integration", + "text": "Install the integration", + "level": 2 + }, + { + "id": "manual-installation-on-self-hosted-n8n", + "text": "Manual installation on self-hosted n8n", + "level": 3 + }, + { + "id": "add-your-credentials", + "text": "Add your credentials", + "level": 2 + }, + { + "id": "available-operations", + "text": "Available operations", + "level": 2 + }, + { + "id": "choose-the-output", + "text": "Choose the output", + "level": 2 + }, + { + "id": "example-workflow", + "text": "Example workflow", + "level": 2 + }, + { + "id": "resources", + "text": "Resources", + "level": 2 + } + ] + }, + "/integrations/make/": { + "ids": [ + "make-htmlcss-to-image", + "available-actions", + "example-scenarios", + "authentication", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "make-htmlcss-to-image", + "text": "Make: HTML/CSS to Image", + "level": 1 + }, + { + "id": "available-actions", + "text": "Available Actions", + "level": 2 + }, + { + "id": "example-scenarios", + "text": "Example scenarios", + "level": 2 + }, + { + "id": "authentication", + "text": "Authentication", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/cline/": { + "ids": [ + "cline-mcp-integration", + "1-connect-a-remote-server-in-cline", + "2-take-a-screenshot", + "3-render-htmlcss", + "how-to-export-a-table-as-an-image", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "troubleshooting", + "missing-tools-or-connection-errors", + "rendering-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "cline-mcp-integration", + "text": "Cline MCP Integration", + "level": 1 + }, + { + "id": "1-connect-a-remote-server-in-cline", + "text": "1. Connect a remote server in Cline", + "level": 2 + }, + { + "id": "2-take-a-screenshot", + "text": "2. Take a screenshot", + "level": 2 + }, + { + "id": "3-render-htmlcss", + "text": "3. Render HTML/CSS", + "level": 2 + }, + { + "id": "how-to-export-a-table-as-an-image", + "text": "How to export a table as an image", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "missing-tools-or-connection-errors", + "text": "Missing tools or connection errors", + "level": 3 + }, + { + "id": "rendering-errors", + "text": "Rendering errors", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/zed/": { + "ids": [ + "zed-mcp-integration", + "1-add-a-remote-mcp-server-in-zed", + "2-take-a-screenshot", + "3-render-htmlcss", + "how-to-render-htmlcss-from-your-editor", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "troubleshooting", + "missing-tools-or-connection-errors", + "rendering-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "zed-mcp-integration", + "text": "Zed MCP Integration", + "level": 1 + }, + { + "id": "1-add-a-remote-mcp-server-in-zed", + "text": "1. Add a remote MCP server in Zed", + "level": 2 + }, + { + "id": "2-take-a-screenshot", + "text": "2. Take a screenshot", + "level": 2 + }, + { + "id": "3-render-htmlcss", + "text": "3. Render HTML/CSS", + "level": 2 + }, + { + "id": "how-to-render-htmlcss-from-your-editor", + "text": "How to render HTML/CSS from your editor", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "missing-tools-or-connection-errors", + "text": "Missing tools or connection errors", + "level": 3 + }, + { + "id": "rendering-errors", + "text": "Rendering errors", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/tools/": { + "ids": [ + "mcp-tools-reference", + "screenshots-and-rendering", + "template-management", + "usage-and-limits", + "proxies", + "storage-destinations", + "og-configurations", + "management-results-and-pagination", + "permissions-and-rate-limits", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "mcp-tools-reference", + "text": "MCP tools reference", + "level": 1 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 2 + }, + { + "id": "template-management", + "text": "Template management", + "level": 2 + }, + { + "id": "usage-and-limits", + "text": "Usage and limits", + "level": 2 + }, + { + "id": "proxies", + "text": "Proxies", + "level": 2 + }, + { + "id": "storage-destinations", + "text": "Storage destinations", + "level": 2 + }, + { + "id": "og-configurations", + "text": "OG configurations", + "level": 2 + }, + { + "id": "management-results-and-pagination", + "text": "Management results and pagination", + "level": 2 + }, + { + "id": "permissions-and-rate-limits", + "text": "Permissions and rate limits", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/gemini/": { + "ids": [ + "gemini-cli-mcp-integration", + "1-connect-gemini-cli", + "2-take-a-screenshot", + "3-render-htmlcss", + "create-an-open-graph-card", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "troubleshooting", + "missing-tools-or-connection-errors", + "rendering-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "gemini-cli-mcp-integration", + "text": "Gemini CLI MCP Integration", + "level": 1 + }, + { + "id": "1-connect-gemini-cli", + "text": "1. Connect Gemini CLI", + "level": 2 + }, + { + "id": "2-take-a-screenshot", + "text": "2. Take a screenshot", + "level": 2 + }, + { + "id": "3-render-htmlcss", + "text": "3. Render HTML/CSS", + "level": 2 + }, + { + "id": "create-an-open-graph-card", + "text": "Create an Open Graph card", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "missing-tools-or-connection-errors", + "text": "Missing tools or connection errors", + "level": 3 + }, + { + "id": "rendering-errors", + "text": "Rendering errors", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/cursor/": { + "ids": [ + "cursor-mcp-integration", + "1-install-the-cursor-plugin", + "connect-the-mcp-server-manually", + "2-take-a-screenshot", + "3-render-htmlcss", + "how-to-export-a-card-from-your-codebase", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "troubleshooting", + "missing-tools-or-connection-errors", + "rendering-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "cursor-mcp-integration", + "text": "Cursor MCP Integration", + "level": 1 + }, + { + "id": "1-install-the-cursor-plugin", + "text": "1. Install the Cursor plugin", + "level": 2 + }, + { + "id": "connect-the-mcp-server-manually", + "text": "Connect the MCP server manually", + "level": 3 + }, + { + "id": "2-take-a-screenshot", + "text": "2. Take a screenshot", + "level": 2 + }, + { + "id": "3-render-htmlcss", + "text": "3. Render HTML/CSS", + "level": 2 + }, + { + "id": "how-to-export-a-card-from-your-codebase", + "text": "How to export a card from your codebase", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "missing-tools-or-connection-errors", + "text": "Missing tools or connection errors", + "level": 3 + }, + { + "id": "rendering-errors", + "text": "Rendering errors", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/claude/": { + "ids": [ + "claude--claude-code-mcp-integration", + "1-connect-claude-or-claude-code-to-hcti", + "claude-web-or-desktop", + "how-to-set-up-claude-code", + "2-take-a-screenshot", + "3-render-htmlcss", + "how-to-turn-a-report-into-a-pdf", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "troubleshooting", + "missing-tools-or-connection-errors", + "rendering-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "claude--claude-code-mcp-integration", + "text": "Claude & Claude Code MCP Integration", + "level": 1 + }, + { + "id": "1-connect-claude-or-claude-code-to-hcti", + "text": "1. Connect Claude or Claude Code to HCTI", + "level": 2 + }, + { + "id": "claude-web-or-desktop", + "text": "Claude web or desktop", + "level": 3 + }, + { + "id": "how-to-set-up-claude-code", + "text": "How to set up Claude Code", + "level": 3 + }, + { + "id": "2-take-a-screenshot", + "text": "2. Take a screenshot", + "level": 2 + }, + { + "id": "3-render-htmlcss", + "text": "3. Render HTML/CSS", + "level": 2 + }, + { + "id": "how-to-turn-a-report-into-a-pdf", + "text": "How to turn a report into a PDF", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "missing-tools-or-connection-errors", + "text": "Missing tools or connection errors", + "level": 3 + }, + { + "id": "rendering-errors", + "text": "Rendering errors", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/chatgpt-codex/": { + "ids": [ + "chatgpt--codex-mcp-integration", + "1-connect-chatgpt-or-codex-to-hcti", + "how-to-set-up-chatgpt", + "how-to-set-up-codex", + "2-take-a-screenshot", + "3-render-htmlcss", + "how-to-create-an-open-graph-card-from-your-project", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "troubleshooting", + "missing-tools-or-connection-errors", + "rendering-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "chatgpt--codex-mcp-integration", + "text": "ChatGPT & Codex MCP Integration", + "level": 1 + }, + { + "id": "1-connect-chatgpt-or-codex-to-hcti", + "text": "1. Connect ChatGPT or Codex to HCTI", + "level": 2 + }, + { + "id": "how-to-set-up-chatgpt", + "text": "How to set up ChatGPT", + "level": 3 + }, + { + "id": "how-to-set-up-codex", + "text": "How to set up Codex", + "level": 3 + }, + { + "id": "2-take-a-screenshot", + "text": "2. Take a screenshot", + "level": 2 + }, + { + "id": "3-render-htmlcss", + "text": "3. Render HTML/CSS", + "level": 2 + }, + { + "id": "how-to-create-an-open-graph-card-from-your-project", + "text": "How to create an Open Graph card from your project", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "missing-tools-or-connection-errors", + "text": "Missing tools or connection errors", + "level": 3 + }, + { + "id": "rendering-errors", + "text": "Rendering errors", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/github-copilot/": { + "ids": [ + "github-copilot-mcp-integration", + "1-connect-copilot-cli", + "2-take-a-screenshot", + "3-render-htmlcss", + "create-an-open-graph-card", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "troubleshooting", + "missing-tools-or-connection-errors", + "rendering-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "github-copilot-mcp-integration", + "text": "GitHub Copilot MCP Integration", + "level": 1 + }, + { + "id": "1-connect-copilot-cli", + "text": "1. Connect Copilot CLI", + "level": 2 + }, + { + "id": "2-take-a-screenshot", + "text": "2. Take a screenshot", + "level": 2 + }, + { + "id": "3-render-htmlcss", + "text": "3. Render HTML/CSS", + "level": 2 + }, + { + "id": "create-an-open-graph-card", + "text": "Create an Open Graph card", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "missing-tools-or-connection-errors", + "text": "Missing tools or connection errors", + "level": 3 + }, + { + "id": "rendering-errors", + "text": "Rendering errors", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/permissions/": { + "ids": [ + "mcp-permissions-and-authorization", + "authorize-a-connection", + "choose-permissions-for-the-task", + "add-permissions-to-an-existing-connection", + "review-and-revoke-sessions", + "troubleshooting", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "mcp-permissions-and-authorization", + "text": "MCP permissions and authorization", + "level": 1 + }, + { + "id": "authorize-a-connection", + "text": "Authorize a connection", + "level": 2 + }, + { + "id": "choose-permissions-for-the-task", + "text": "Choose permissions for the task", + "level": 2 + }, + { + "id": "add-permissions-to-an-existing-connection", + "text": "Add permissions to an existing connection", + "level": 2 + }, + { + "id": "review-and-revoke-sessions", + "text": "Review and revoke sessions", + "level": 2 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/grok/": { + "ids": [ + "grok-mcp-integration", + "1-connect-hcti-in-grok-build", + "install-through-the-plugin-marketplace", + "add-the-mcp-server-directly", + "2-take-a-screenshot", + "3-render-htmlcss", + "how-to-capture-a-pricing-table", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "troubleshooting", + "missing-tools-or-connection-errors", + "rendering-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "grok-mcp-integration", + "text": "Grok MCP Integration", + "level": 1 + }, + { + "id": "1-connect-hcti-in-grok-build", + "text": "1. Connect HCTI in Grok Build", + "level": 2 + }, + { + "id": "install-through-the-plugin-marketplace", + "text": "Install through the plugin marketplace", + "level": 3 + }, + { + "id": "add-the-mcp-server-directly", + "text": "Add the MCP server directly", + "level": 3 + }, + { + "id": "2-take-a-screenshot", + "text": "2. Take a screenshot", + "level": 2 + }, + { + "id": "3-render-htmlcss", + "text": "3. Render HTML/CSS", + "level": 2 + }, + { + "id": "how-to-capture-a-pricing-table", + "text": "How to capture a pricing table", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "missing-tools-or-connection-errors", + "text": "Missing tools or connection errors", + "level": 3 + }, + { + "id": "rendering-errors", + "text": "Rendering errors", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/jetbrains/": { + "ids": [ + "jetbrains-ides-mcp-integration", + "1-connect-hcti-to-jetbrains-ai-assistant", + "2-take-a-screenshot", + "3-render-htmlcss", + "how-to-export-a-report-template-from-your-project", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "troubleshooting", + "missing-tools-or-connection-errors", + "rendering-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "jetbrains-ides-mcp-integration", + "text": "JetBrains IDEs MCP Integration", + "level": 1 + }, + { + "id": "1-connect-hcti-to-jetbrains-ai-assistant", + "text": "1. Connect HCTI to JetBrains AI Assistant", + "level": 2 + }, + { + "id": "2-take-a-screenshot", + "text": "2. Take a screenshot", + "level": 2 + }, + { + "id": "3-render-htmlcss", + "text": "3. Render HTML/CSS", + "level": 2 + }, + { + "id": "how-to-export-a-report-template-from-your-project", + "text": "How to export a report template from your project", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "missing-tools-or-connection-errors", + "text": "Missing tools or connection errors", + "level": 3 + }, + { + "id": "rendering-errors", + "text": "Rendering errors", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/windsurf/": { + "ids": [ + "windsurf-mcp-integration", + "1-connect-hcti-to-cascade", + "2-take-a-screenshot", + "3-render-htmlcss", + "how-to-create-card-variations-with-cascade", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "troubleshooting", + "missing-tools-or-connection-errors", + "rendering-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "windsurf-mcp-integration", + "text": "Windsurf MCP Integration", + "level": 1 + }, + { + "id": "1-connect-hcti-to-cascade", + "text": "1. Connect HCTI to Cascade", + "level": 2 + }, + { + "id": "2-take-a-screenshot", + "text": "2. Take a screenshot", + "level": 2 + }, + { + "id": "3-render-htmlcss", + "text": "3. Render HTML/CSS", + "level": 2 + }, + { + "id": "how-to-create-card-variations-with-cascade", + "text": "How to create card variations with Cascade", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "missing-tools-or-connection-errors", + "text": "Missing tools or connection errors", + "level": 3 + }, + { + "id": "rendering-errors", + "text": "Rendering errors", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/vscode/": { + "ids": [ + "vs-code-mcp-integration", + "1-connect-copilot", + "2-take-a-screenshot", + "3-render-htmlcss", + "create-an-open-graph-card", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "troubleshooting", + "missing-tools-or-connection-errors", + "rendering-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "vs-code-mcp-integration", + "text": "VS Code MCP Integration", + "level": 1 + }, + { + "id": "1-connect-copilot", + "text": "1. Connect Copilot", + "level": 2 + }, + { + "id": "2-take-a-screenshot", + "text": "2. Take a screenshot", + "level": 2 + }, + { + "id": "3-render-htmlcss", + "text": "3. Render HTML/CSS", + "level": 2 + }, + { + "id": "create-an-open-graph-card", + "text": "Create an Open Graph card", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "missing-tools-or-connection-errors", + "text": "Missing tools or connection errors", + "level": 3 + }, + { + "id": "rendering-errors", + "text": "Rendering errors", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/integrations/mcp/opencode/": { + "ids": [ + "opencode-mcp-integration", + "1-add-the-remote-mcp-server-to-opencode", + "2-take-a-screenshot", + "3-render-htmlcss", + "how-to-reuse-a-saved-template", + "available-tools", + "account-usage", + "screenshots-and-rendering", + "template-management", + "troubleshooting", + "missing-tools-or-connection-errors", + "rendering-errors", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "opencode-mcp-integration", + "text": "OpenCode MCP Integration", + "level": 1 + }, + { + "id": "1-add-the-remote-mcp-server-to-opencode", + "text": "1. Add the remote MCP server to OpenCode", + "level": 2 + }, + { + "id": "2-take-a-screenshot", + "text": "2. Take a screenshot", + "level": 2 + }, + { + "id": "3-render-htmlcss", + "text": "3. Render HTML/CSS", + "level": 2 + }, + { + "id": "how-to-reuse-a-saved-template", + "text": "How to reuse a saved template", + "level": 2 + }, + { + "id": "available-tools", + "text": "Available tools", + "level": 2 + }, + { + "id": "account-usage", + "text": "Account usage", + "level": 3 + }, + { + "id": "screenshots-and-rendering", + "text": "Screenshots and rendering", + "level": 3 + }, + { + "id": "template-management", + "text": "Template management", + "level": 3 + }, + { + "id": "troubleshooting", + "text": "Troubleshooting", + "level": 2 + }, + { + "id": "missing-tools-or-connection-errors", + "text": "Missing tools or connection errors", + "level": 3 + }, + { + "id": "rendering-errors", + "text": "Rendering errors", + "level": 3 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/management-api/terraform/": { + "ids": [ + "terraform", + "install-and-configure", + "render-after-creation", + "keep-images-after-replacement-or-deletion", + "htmlcss-images", + "url-images", + "templates", + "templated-images", + "api-keys", + "proxies", + "storage-destinations", + "og-configurations", + "look-up-existing-resources", + "more-examples", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "terraform", + "text": "Terraform", + "level": 1 + }, + { + "id": "install-and-configure", + "text": "Install and configure", + "level": 2 + }, + { + "id": "render-after-creation", + "text": "Render after creation", + "level": 2 + }, + { + "id": "keep-images-after-replacement-or-deletion", + "text": "Keep images after replacement or deletion", + "level": 2 + }, + { + "id": "htmlcss-images", + "text": "HTML/CSS images", + "level": 2 + }, + { + "id": "url-images", + "text": "URL images", + "level": 2 + }, + { + "id": "templates", + "text": "Templates", + "level": 2 + }, + { + "id": "templated-images", + "text": "Templated images", + "level": 2 + }, + { + "id": "api-keys", + "text": "API keys", + "level": 2 + }, + { + "id": "proxies", + "text": "Proxies", + "level": 2 + }, + { + "id": "storage-destinations", + "text": "Storage destinations", + "level": 2 + }, + { + "id": "og-configurations", + "text": "OG configurations", + "level": 2 + }, + { + "id": "look-up-existing-resources", + "text": "Look up existing resources", + "level": 2 + }, + { + "id": "more-examples", + "text": "More examples", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/management-api/og-configs/": { + "ids": [ + "og-configurations-api", + "infrastructure-as-code", + "operations", + "operation-create-a-new-og-configuration", + "operation-list-og-configurations", + "operation-retrieve-an-og-configuration", + "operation-update-an-og-configuration", + "operation-delete-an-og-configuration", + "create-a-screenshot-configuration", + "shared-fields", + "htmlcss-fields", + "create-a-templated-configuration", + "read-the-response-and-use-the-configuration", + "list-update-and-delete", + "mcp", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "og-configurations-api", + "text": "OG configurations API", + "level": 1 + }, + { + "id": "infrastructure-as-code", + "text": "Infrastructure as code", + "level": 2 + }, + { + "id": "operations", + "text": "Operations", + "level": 2 + }, + { + "id": "operation-create-a-new-og-configuration", + "text": "Create a new OG configuration", + "level": 3 + }, + { + "id": "operation-list-og-configurations", + "text": "List OG configurations", + "level": 3 + }, + { + "id": "operation-retrieve-an-og-configuration", + "text": "Retrieve an OG configuration", + "level": 3 + }, + { + "id": "operation-update-an-og-configuration", + "text": "Update an OG configuration", + "level": 3 + }, + { + "id": "operation-delete-an-og-configuration", + "text": "Delete an OG configuration", + "level": 3 + }, + { + "id": "create-a-screenshot-configuration", + "text": "Create a screenshot configuration", + "level": 2 + }, + { + "id": "shared-fields", + "text": "Shared fields", + "level": 3 + }, + { + "id": "htmlcss-fields", + "text": "HTML/CSS fields", + "level": 3 + }, + { + "id": "create-a-templated-configuration", + "text": "Create a templated configuration", + "level": 2 + }, + { + "id": "read-the-response-and-use-the-configuration", + "text": "Read the response and use the configuration", + "level": 2 + }, + { + "id": "list-update-and-delete", + "text": "List, update, and delete", + "level": 2 + }, + { + "id": "mcp", + "text": "MCP", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/management-api/api-keys/": { + "ids": [ + "api-key-management", + "infrastructure-as-code", + "operations", + "operation-create-a-new-api-key", + "operation-list-api-keys", + "operation-retrieve-an-api-key", + "operation-update-an-api-key", + "operation-disable-an-api-key", + "create-a-key", + "request-fields", + "list-and-retrieve-keys", + "update-a-key", + "disable-a-key", + "rotate-a-key", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "api-key-management", + "text": "API key management", + "level": 1 + }, + { + "id": "infrastructure-as-code", + "text": "Infrastructure as code", + "level": 2 + }, + { + "id": "operations", + "text": "Operations", + "level": 2 + }, + { + "id": "operation-create-a-new-api-key", + "text": "Create a new API key", + "level": 3 + }, + { + "id": "operation-list-api-keys", + "text": "List API keys", + "level": 3 + }, + { + "id": "operation-retrieve-an-api-key", + "text": "Retrieve an API key", + "level": 3 + }, + { + "id": "operation-update-an-api-key", + "text": "Update an API key", + "level": 3 + }, + { + "id": "operation-disable-an-api-key", + "text": "Disable an API key", + "level": 3 + }, + { + "id": "create-a-key", + "text": "Create a key", + "level": 2 + }, + { + "id": "request-fields", + "text": "Request fields", + "level": 3 + }, + { + "id": "list-and-retrieve-keys", + "text": "List and retrieve keys", + "level": 2 + }, + { + "id": "update-a-key", + "text": "Update a key", + "level": 2 + }, + { + "id": "disable-a-key", + "text": "Disable a key", + "level": 2 + }, + { + "id": "rotate-a-key", + "text": "Rotate a key", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/management-api/usage/": { + "ids": [ + "monitoring-api-usage", + "automated-usage-alerts", + "response-headers", + "usage-api-endpoint", + "retrieve-image-usage-history", + "example-request", + "response-format", + "interpreting-usage-history", + "check-current-usage-with-mcp", + "usage-limits-versus-request-limits", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "monitoring-api-usage", + "text": "Monitoring API Usage", + "level": 1 + }, + { + "id": "automated-usage-alerts", + "text": "Automated Usage Alerts", + "level": 2 + }, + { + "id": "response-headers", + "text": "Response Headers", + "level": 2 + }, + { + "id": null, + "text": "Monitoring Tip", + "level": 3 + }, + { + "id": "usage-api-endpoint", + "text": "Usage API Endpoint", + "level": 2 + }, + { + "id": "retrieve-image-usage-history", + "text": "Retrieve image usage history", + "level": 3 + }, + { + "id": "example-request", + "text": "Example Request", + "level": 3 + }, + { + "id": "response-format", + "text": "Response Format", + "level": 3 + }, + { + "id": null, + "text": "Usage Tracking", + "level": 3 + }, + { + "id": "interpreting-usage-history", + "text": "Interpreting usage history", + "level": 2 + }, + { + "id": "check-current-usage-with-mcp", + "text": "Check current usage with MCP", + "level": 2 + }, + { + "id": "usage-limits-versus-request-limits", + "text": "Usage limits versus request limits", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/management-api/iac/": { + "ids": [ + "infrastructure-as-code", + "what-you-can-build", + "choose-a-provider", + "resources", + "credentials-and-state", + "image-lifecycle", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "infrastructure-as-code", + "text": "Infrastructure as code", + "level": 1 + }, + { + "id": "what-you-can-build", + "text": "What you can build", + "level": 2 + }, + { + "id": "choose-a-provider", + "text": "Choose a provider", + "level": 2 + }, + { + "id": "resources", + "text": "Resources", + "level": 2 + }, + { + "id": "credentials-and-state", + "text": "Credentials and state", + "level": 2 + }, + { + "id": "image-lifecycle", + "text": "Image lifecycle", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + }, + { + "id": null, + "text": "Table of contents", + "level": 2 + } + ] + }, + "/management-api/proxies/": { + "ids": [ + "proxies-api", + "infrastructure-as-code", + "operations", + "operation-create-a-new-proxy", + "operation-list-proxies", + "operation-retrieve-a-proxy", + "operation-update-a-proxy", + "operation-delete-a-proxy", + "create-a-proxy", + "authentication-fields", + "response-fields", + "list-and-retrieve-proxies", + "update-a-proxy", + "delete-a-proxy", + "use-the-proxy", + "mcp", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "proxies-api", + "text": "Proxies API", + "level": 1 + }, + { + "id": "infrastructure-as-code", + "text": "Infrastructure as code", + "level": 2 + }, + { + "id": "operations", + "text": "Operations", + "level": 2 + }, + { + "id": "operation-create-a-new-proxy", + "text": "Create a new proxy", + "level": 3 + }, + { + "id": "operation-list-proxies", + "text": "List proxies", + "level": 3 + }, + { + "id": "operation-retrieve-a-proxy", + "text": "Retrieve a proxy", + "level": 3 + }, + { + "id": "operation-update-a-proxy", + "text": "Update a proxy", + "level": 3 + }, + { + "id": "operation-delete-a-proxy", + "text": "Delete a proxy", + "level": 3 + }, + { + "id": "create-a-proxy", + "text": "Create a proxy", + "level": 2 + }, + { + "id": "authentication-fields", + "text": "Authentication fields", + "level": 3 + }, + { + "id": "response-fields", + "text": "Response fields", + "level": 3 + }, + { + "id": "list-and-retrieve-proxies", + "text": "List and retrieve proxies", + "level": 2 + }, + { + "id": "update-a-proxy", + "text": "Update a proxy", + "level": 2 + }, + { + "id": "delete-a-proxy", + "text": "Delete a proxy", + "level": 2 + }, + { + "id": "use-the-proxy", + "text": "Use the proxy", + "level": 2 + }, + { + "id": "mcp", + "text": "MCP", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/management-api/pulumi/": { + "ids": [ + "pulumi", + "install-and-configure", + "render-after-creation", + "keep-images-after-replacement-or-deletion", + "htmlcss-images", + "url-images", + "templates", + "templated-images", + "api-keys", + "proxies", + "storage-destinations", + "og-configurations", + "look-up-existing-resources", + "more-examples", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "pulumi", + "text": "Pulumi", + "level": 1 + }, + { + "id": "install-and-configure", + "text": "Install and configure", + "level": 2 + }, + { + "id": "render-after-creation", + "text": "Render after creation", + "level": 2 + }, + { + "id": "keep-images-after-replacement-or-deletion", + "text": "Keep images after replacement or deletion", + "level": 2 + }, + { + "id": "htmlcss-images", + "text": "HTML/CSS images", + "level": 2 + }, + { + "id": "url-images", + "text": "URL images", + "level": 2 + }, + { + "id": "templates", + "text": "Templates", + "level": 2 + }, + { + "id": "templated-images", + "text": "Templated images", + "level": 2 + }, + { + "id": "api-keys", + "text": "API keys", + "level": 2 + }, + { + "id": "proxies", + "text": "Proxies", + "level": 2 + }, + { + "id": "storage-destinations", + "text": "Storage destinations", + "level": 2 + }, + { + "id": "og-configurations", + "text": "OG configurations", + "level": 2 + }, + { + "id": "look-up-existing-resources", + "text": "Look up existing resources", + "level": 2 + }, + { + "id": "more-examples", + "text": "More examples", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + }, + "/management-api/storage-destinations/": { + "ids": [ + "storage-destinations-api", + "infrastructure-as-code", + "operations", + "create-a-new-storage-destination", + "list-storage-destinations", + "retrieve-a-storage-destination", + "update-a-storage-destination", + "delete-a-storage-destination", + "get-the-aws-storage-external-id", + "configure-amazon-s3", + "request-fields", + "provider-settings", + "responses-listing-and-retrieval", + "updates-and-connection-tests", + "connection-tests", + "delete-a-destination", + "use-the-destination-for-images", + "mcp", + "need-help", + "back-to-top", + "edit-this-page" + ], + "headings": [ + { + "id": "storage-destinations-api", + "text": "Storage destinations API", + "level": 1 + }, + { + "id": "infrastructure-as-code", + "text": "Infrastructure as code", + "level": 2 + }, + { + "id": "operations", + "text": "Operations", + "level": 2 + }, + { + "id": "create-a-new-storage-destination", + "text": "Create a new storage destination", + "level": 3 + }, + { + "id": "list-storage-destinations", + "text": "List storage destinations", + "level": 3 + }, + { + "id": "retrieve-a-storage-destination", + "text": "Retrieve a storage destination", + "level": 3 + }, + { + "id": "update-a-storage-destination", + "text": "Update a storage destination", + "level": 3 + }, + { + "id": "delete-a-storage-destination", + "text": "Delete a storage destination", + "level": 3 + }, + { + "id": "get-the-aws-storage-external-id", + "text": "Get the AWS storage external ID", + "level": 3 + }, + { + "id": "configure-amazon-s3", + "text": "Configure Amazon S3", + "level": 2 + }, + { + "id": "request-fields", + "text": "Request fields", + "level": 2 + }, + { + "id": "provider-settings", + "text": "Provider settings", + "level": 3 + }, + { + "id": "responses-listing-and-retrieval", + "text": "Responses, listing, and retrieval", + "level": 2 + }, + { + "id": "updates-and-connection-tests", + "text": "Updates and connection tests", + "level": 2 + }, + { + "id": "connection-tests", + "text": "Connection tests", + "level": 3 + }, + { + "id": "delete-a-destination", + "text": "Delete a destination", + "level": 2 + }, + { + "id": "use-the-destination-for-images", + "text": "Use the destination for images", + "level": 2 + }, + { + "id": "mcp", + "text": "MCP", + "level": 2 + }, + { + "id": "need-help", + "text": "Need help?", + "level": 2 + } + ] + } +} diff --git a/migration/redirects.json b/migration/redirects.json new file mode 100644 index 0000000..8d8fabb --- /dev/null +++ b/migration/redirects.json @@ -0,0 +1,66 @@ +{ + "/getting-started/creating-an-image": "/getting-started/using-the-api/", + "/getting-started/deleting-an-image": "/getting-started/using-the-api/", + "/getting-started/retrieving-an-image": "/getting-started/using-the-api/", + "/getting-started/authentication": "/getting-started/using-the-api/", + "/getting-started/api-reference": "/getting-started/using-the-api/", + "/getting-started/take-a-screenshot-of-a-url": "/getting-started/url-to-image/", + "/getting-started/mcp-server": "/integrations/mcp/", + "/getting-started/using-fonts": "/parameters/google_fonts/", + "/getting-started/full-page-images": "/guides/workflows/email-to-images/", + "/getting-started/duplicate-image-detection": "/guides/advanced/duplicate-detection/", + "/getting-started/faq": "/faq", + "/getting-started/integromat-integration": "/integrations/make/", + "/getting-started/zapier-integration": "/integrations/zapier/", + "/getting-started/convert-emails-images": "/guides/workflows/email-to-images/", + "/getting-started/file-formats": "/guides/styling/file-formats/", + "/getting-started/lossless-image-optimization": "/guides/styling/file-formats/", + "/guides/twitter-screenshot": "/guides/social-media/twitter/", + "/guides/twitter-embed": "/guides/social-media/twitter/", + "/guides/facebook-screenshot": "/guides/social-media/facebook/", + "/guides/instagram-embed": "/guides/social-media/instagram/", + "/guides/linkedin-screenshot": "/guides/social-media/linkedin/", + "/guides/debugging-cropping-issues": "/guides/debugging/cropping-issues/", + "/guides/debugging-blurry-images": "/guides/debugging/blurry-images/", + "/guides/debugging-white-images": "/guides/debugging/white-images/", + "/guides/debugging-white-or-blank-images": "/guides/debugging/white-images/", + "/guides/troubleshooting/debugging": "/guides/debugging/", + "/guides/rendering-emoji": "/guides/debugging/emoji/", + "/guides/external-css-and-fonts": "/guides/styling/external-css-fonts/", + "/guides/external-css-js-and-fonts": "/guides/styling/external-css-fonts/", + "/guides/custom-fonts": "/guides/styling/external-css-fonts/", + "/guides/using-custom-fonts": "/guides/styling/external-css-fonts/", + "/guides/using-fonts": "/parameters/google_fonts/", + "/guides/transparent-background": "/guides/styling/transparent-background/", + "/guides/file-formats": "/guides/styling/file-formats/", + "/guides/blocking-cookie-banners": "/guides/advanced/blocking-cookie-banners/", + "/guides/duplicate-image-detection": "/guides/advanced/duplicate-detection/", + "/guides/account-usage": "/management-api/usage/", + "/guides/advanced/account-usage": "/management-api/usage/", + "/guides/converting-base64-to-image": "/guides/advanced/base64/", + "/guides/base64-to-image": "/guides/advanced/base64/", + "/guides/postman": "/guides/workflows/postman/", + "/guides/insomnia": "/guides/workflows/insomnia/", + "/guides/convert-emails-images": "/guides/workflows/email-to-images/", + "/guides/email-to-images": "/guides/workflows/email-to-images/", + "/guides/email-screenshot-slack": "/guides/workflows/email-to-slack/", + "/guides/email-to-slack": "/guides/workflows/email-to-slack/", + "/guides/image-charts-with-highchartsjs": "/guides/workflows/highcharts/", + "/guides/image-charts-with-highcharts": "/guides/workflows/highcharts/", + "/example-code/postman": "/guides/workflows/postman/", + "/guides/templates": "/getting-started/templates/", + "/guides/render-when-ready": "/parameters/render_when_ready/", + "/guides/using-google-fonts": "/parameters/google_fonts/", + "/guides/selector": "/parameters/selector/", + "/parameters/jumbo-images": "/guides/advanced/jumbo-images/", + "/advanced-examples/using-google-fonts": "/parameters/google_fonts/", + "/advanced-examples/rendering-emoji": "/guides/debugging/emoji/", + "/advanced-examples/image-charts-with-highcharts": "/guides/workflows/highcharts/", + "/advanced-examples/transparent-background": "/guides/styling/transparent-background/", + "/advanced-examples/external-css-and-fonts": "/guides/styling/external-css-fonts/", + "/advanced-examples/instagram-embed": "/guides/social-media/instagram/", + "/advanced-examples/twitter-embed": "/guides/social-media/twitter/", + "/integrations/integromat": "/integrations/make/", + "/integrations/mcp-server": "/integrations/mcp/", + "/sitemap-index.xml": "/sitemap.xml" +} diff --git a/migration/routes.json b/migration/routes.json new file mode 100644 index 0000000..c89e3bf --- /dev/null +++ b/migration/routes.json @@ -0,0 +1,594 @@ +[ + { + "route": "/", + "source": "index.md" + }, + { + "route": "/faq/", + "source": "faq.md" + }, + { + "route": "/changelog/", + "source": "changelog.md" + }, + { + "route": "/hmac-generator/", + "source": "hmac-generator.md" + }, + { + "route": "/getting-started/create-and-render/", + "source": "getting-started/create-and-render.md" + }, + { + "route": "/getting-started/setting-height-and-width/", + "source": "getting-started/height-and-width.md" + }, + { + "route": "/getting-started/", + "source": "getting-started/index.md" + }, + { + "route": "/getting-started/og-images/", + "source": "getting-started/og-images/index.md" + }, + { + "route": "/getting-started/og-images/supported-parameters/", + "source": "getting-started/og-images/supported-parameters.md" + }, + { + "route": "/getting-started/templates/", + "source": "getting-started/templates.md" + }, + { + "route": "/getting-started/url-to-image/", + "source": "getting-started/url-to-image.md" + }, + { + "route": "/getting-started/using-the-api/api-keys/", + "source": "getting-started/using-the-api/api-keys.md" + }, + { + "route": "/getting-started/using-the-api/", + "source": "getting-started/using-the-api/index.md" + }, + { + "route": "/getting-started/using-the-api/permissions/", + "source": "getting-started/using-the-api/permissions.md" + }, + { + "route": "/getting-started/using-the-api/rate-limits/", + "source": "getting-started/using-the-api/rate-limits.md" + }, + { + "route": "/parameters/color_scheme/", + "source": "parameters/color_scheme.md" + }, + { + "route": "/parameters/dedupe_duration_s/", + "source": "parameters/dedupe_duration_s.md" + }, + { + "route": "/parameters/device_scale/", + "source": "parameters/device_scale.md" + }, + { + "route": "/parameters/dl/", + "source": "parameters/dl.md" + }, + { + "route": "/parameters/format/", + "source": "parameters/format.md" + }, + { + "route": "/parameters/full_screen/", + "source": "parameters/full_screen.md" + }, + { + "route": "/parameters/google_fonts/", + "source": "parameters/google_fonts.md" + }, + { + "route": "/parameters/headers/", + "source": "parameters/headers.md" + }, + { + "route": "/parameters/identify_as_hcti/", + "source": "parameters/identify_as_hcti.md" + }, + { + "route": "/parameters/", + "source": "parameters/index.md" + }, + { + "route": "/parameters/jumbo-images/", + "source": "parameters/jumbo_images.md" + }, + { + "route": "/parameters/max_wait_ms/", + "source": "parameters/max_wait_ms.md" + }, + { + "route": "/parameters/media_type/", + "source": "parameters/media_type.md" + }, + { + "route": "/parameters/ms_delay/", + "source": "parameters/ms_delay.md" + }, + { + "route": "/parameters/pdf_options/", + "source": "parameters/pdf_options.md" + }, + { + "route": "/parameters/proxy_id/", + "source": "parameters/proxy_id.md" + }, + { + "route": "/parameters/render_when_ready/", + "source": "parameters/render_when_ready.md" + }, + { + "route": "/parameters/selector/", + "source": "parameters/selector.md" + }, + { + "route": "/parameters/storage_destination_id/", + "source": "parameters/storage_destination_id.md" + }, + { + "route": "/parameters/timezone/", + "source": "parameters/timezone.md" + }, + { + "route": "/parameters/transparent_background/", + "source": "parameters/transparent_background.md" + }, + { + "route": "/parameters/viewport/", + "source": "parameters/viewport.md" + }, + { + "route": "/example-code/c/", + "source": "example-code/c.md" + }, + { + "route": "/example-code/curl/", + "source": "example-code/curl.md" + }, + { + "route": "/example-code/elixir/", + "source": "example-code/elixir.md" + }, + { + "route": "/example-code/go/", + "source": "example-code/go.md" + }, + { + "route": "/example-code/google-apps-script/", + "source": "example-code/google-apps-script.md" + }, + { + "route": "/example-code/", + "source": "example-code/index.md" + }, + { + "route": "/example-code/java/", + "source": "example-code/java.md" + }, + { + "route": "/example-code/javascript/", + "source": "example-code/javascript.md" + }, + { + "route": "/example-code/kotlin/", + "source": "example-code/kotlin.md" + }, + { + "route": "/example-code/php/", + "source": "example-code/php.md" + }, + { + "route": "/example-code/python/", + "source": "example-code/python.md" + }, + { + "route": "/example-code/ruby/", + "source": "example-code/ruby.md" + }, + { + "route": "/example-code/rust/", + "source": "example-code/rust.md" + }, + { + "route": "/example-code/typescript/", + "source": "example-code/typescript.md" + }, + { + "route": "/example-code/vb.net/", + "source": "example-code/vb.net.md" + }, + { + "route": "/guides/account/account-settings/", + "source": "guides/account/account-settings.md" + }, + { + "route": "/guides/account/", + "source": "guides/account/index.md" + }, + { + "route": "/guides/account/organization-settings/", + "source": "guides/account/organization-settings.md" + }, + { + "route": "/guides/advanced/base64/", + "source": "guides/advanced/base64.md" + }, + { + "route": "/guides/advanced/blocking-cookie-banners/", + "source": "guides/advanced/blocking-cookie-banners.md" + }, + { + "route": "/guides/advanced/duplicate-detection/", + "source": "guides/advanced/duplicate-detection.md" + }, + { + "route": "/guides/advanced/", + "source": "guides/advanced/index.md" + }, + { + "route": "/guides/advanced/jumbo-images/", + "source": "guides/advanced/jumbo-images.md" + }, + { + "route": "/guides/advanced/proxies/", + "source": "guides/advanced/proxies.md" + }, + { + "route": "/guides/advanced/storage-destinations/backblaze-b2/", + "source": "guides/advanced/storage-destinations/backblaze-b2.md" + }, + { + "route": "/guides/advanced/storage-destinations/digitalocean-spaces/", + "source": "guides/advanced/storage-destinations/digitalocean-spaces.md" + }, + { + "route": "/guides/advanced/storage-destinations/google-cloud-storage/", + "source": "guides/advanced/storage-destinations/google-cloud-storage.md" + }, + { + "route": "/guides/advanced/storage-destinations/", + "source": "guides/advanced/storage-destinations/index.md" + }, + { + "route": "/guides/advanced/storage-destinations/r2/", + "source": "guides/advanced/storage-destinations/r2.md" + }, + { + "route": "/guides/advanced/storage-destinations/s3-compatible/", + "source": "guides/advanced/storage-destinations/s3-compatible.md" + }, + { + "route": "/guides/advanced/storage-destinations/s3/", + "source": "guides/advanced/storage-destinations/s3.md" + }, + { + "route": "/guides/advanced/storage-destinations/wasabi/", + "source": "guides/advanced/storage-destinations/wasabi.md" + }, + { + "route": "/guides/debugging/blurry-images/", + "source": "guides/debugging/blurry-images.md" + }, + { + "route": "/guides/debugging/cloudflare-challenges/", + "source": "guides/debugging/cloudflare-challenges.md" + }, + { + "route": "/guides/debugging/cropping-issues/", + "source": "guides/debugging/cropping-issues.md" + }, + { + "route": "/guides/debugging/emoji/", + "source": "guides/debugging/emoji.md" + }, + { + "route": "/guides/debugging/", + "source": "guides/debugging/index.md" + }, + { + "route": "/guides/debugging/og-image-caching/", + "source": "guides/debugging/og-image-caching.md" + }, + { + "route": "/guides/debugging/white-images/", + "source": "guides/debugging/white-images.md" + }, + { + "route": "/guides/", + "source": "guides/index.md" + }, + { + "route": "/guides/og-images/astro/", + "source": "guides/og-images/astro.md" + }, + { + "route": "/guides/og-images/", + "source": "guides/og-images/index.md" + }, + { + "route": "/guides/og-images/jekyll/", + "source": "guides/og-images/jekyll.md" + }, + { + "route": "/guides/og-images/shopify/", + "source": "guides/og-images/shopify.md" + }, + { + "route": "/guides/og-images/sitepress/", + "source": "guides/og-images/sitepress.md" + }, + { + "route": "/guides/og-images/squarespace/", + "source": "guides/og-images/squarespace.md" + }, + { + "route": "/guides/og-images/webflow/", + "source": "guides/og-images/webflow.md" + }, + { + "route": "/guides/og-images/wix/", + "source": "guides/og-images/wix.md" + }, + { + "route": "/guides/og-images/wordpress/", + "source": "guides/og-images/wordpress.md" + }, + { + "route": "/guides/social-media/facebook/", + "source": "guides/social-media/facebook.md" + }, + { + "route": "/guides/social-media/", + "source": "guides/social-media/index.md" + }, + { + "route": "/guides/social-media/instagram/", + "source": "guides/social-media/instagram.md" + }, + { + "route": "/guides/social-media/linkedin/", + "source": "guides/social-media/linkedin.md" + }, + { + "route": "/guides/social-media/twitter/", + "source": "guides/social-media/twitter.md" + }, + { + "route": "/guides/styling/external-css-fonts/", + "source": "guides/styling/external-css-fonts.md" + }, + { + "route": "/guides/styling/file-formats/", + "source": "guides/styling/file-formats.md" + }, + { + "route": "/guides/styling/", + "source": "guides/styling/index.md" + }, + { + "route": "/guides/styling/transparent-background/", + "source": "guides/styling/transparent-background.md" + }, + { + "route": "/guides/workflows/email-to-images/", + "source": "guides/workflows/email-to-images.md" + }, + { + "route": "/guides/workflows/email-to-slack/", + "source": "guides/workflows/email-to-slack.md" + }, + { + "route": "/guides/workflows/highcharts/", + "source": "guides/workflows/highcharts.md" + }, + { + "route": "/guides/workflows/", + "source": "guides/workflows/index.md" + }, + { + "route": "/guides/workflows/insomnia/", + "source": "guides/workflows/insomnia.md" + }, + { + "route": "/guides/workflows/postman/", + "source": "guides/workflows/postman.md" + }, + { + "route": "/integrations/", + "source": "integrations/index.md" + }, + { + "route": "/integrations/make/", + "source": "integrations/make.md" + }, + { + "route": "/integrations/mcp/chatgpt-codex/", + "source": "integrations/mcp/chatgpt-codex.md" + }, + { + "route": "/integrations/mcp/claude/", + "source": "integrations/mcp/claude.md" + }, + { + "route": "/integrations/mcp/cline/", + "source": "integrations/mcp/cline.md" + }, + { + "route": "/integrations/mcp/cursor/", + "source": "integrations/mcp/cursor.md" + }, + { + "route": "/integrations/mcp/gemini/", + "source": "integrations/mcp/gemini.md" + }, + { + "route": "/integrations/mcp/github-copilot/", + "source": "integrations/mcp/github-copilot.md" + }, + { + "route": "/integrations/mcp/grok/", + "source": "integrations/mcp/grok.md" + }, + { + "route": "/integrations/mcp/", + "source": "integrations/mcp/index.md" + }, + { + "route": "/integrations/mcp/jetbrains/", + "source": "integrations/mcp/jetbrains.md" + }, + { + "route": "/integrations/mcp/opencode/", + "source": "integrations/mcp/opencode.md" + }, + { + "route": "/integrations/mcp/permissions/", + "source": "integrations/mcp/permissions.md" + }, + { + "route": "/integrations/mcp/tools/", + "source": "integrations/mcp/tools.md" + }, + { + "route": "/integrations/mcp/vscode/", + "source": "integrations/mcp/vscode.md" + }, + { + "route": "/integrations/mcp/windsurf/", + "source": "integrations/mcp/windsurf.md" + }, + { + "route": "/integrations/mcp/zed/", + "source": "integrations/mcp/zed.md" + }, + { + "route": "/integrations/n8n/", + "source": "integrations/n8n.md" + }, + { + "route": "/integrations/zapier/", + "source": "integrations/zapier.md" + }, + { + "route": "/management-api/api-keys/", + "source": "management-api/api-keys.md" + }, + { + "route": "/management-api/", + "source": "management-api/index.md" + }, + { + "route": "/management-api/og-configs/", + "source": "management-api/og-configs.md" + }, + { + "route": "/management-api/proxies/", + "source": "management-api/proxies.md" + }, + { + "route": "/management-api/storage-destinations/", + "source": "management-api/storage-destinations.md" + }, + { + "route": "/management-api/usage/", + "source": "management-api/usage.md" + }, + { + "route": "/template-editor/advanced/extra-css/", + "source": "template-editor/advanced/extra-css.md" + }, + { + "route": "/template-editor/advanced/", + "source": "template-editor/advanced/index.md" + }, + { + "route": "/template-editor/advanced/panels/", + "source": "template-editor/advanced/panels.md" + }, + { + "route": "/template-editor/advanced/sizing-positioning/", + "source": "template-editor/advanced/sizing-positioning.md" + }, + { + "route": "/template-editor/blocks/flex-panel/", + "source": "template-editor/blocks/flex-panel.md" + }, + { + "route": "/template-editor/blocks/free-panel/", + "source": "template-editor/blocks/free-panel.md" + }, + { + "route": "/template-editor/blocks/grid-panel/", + "source": "template-editor/blocks/grid-panel.md" + }, + { + "route": "/template-editor/blocks/html/", + "source": "template-editor/blocks/html.md" + }, + { + "route": "/template-editor/blocks/image/", + "source": "template-editor/blocks/image.md" + }, + { + "route": "/template-editor/blocks/", + "source": "template-editor/blocks/index.md" + }, + { + "route": "/template-editor/blocks/rich-text/", + "source": "template-editor/blocks/rich-text.md" + }, + { + "route": "/template-editor/blocks/shape/", + "source": "template-editor/blocks/shape.md" + }, + { + "route": "/template-editor/blocks/simple-text/", + "source": "template-editor/blocks/simple-text.md" + }, + { + "route": "/template-editor/blocks/table-panel/", + "source": "template-editor/blocks/table-panel.md" + }, + { + "route": "/template-editor/canvas/", + "source": "template-editor/canvas.md" + }, + { + "route": "/template-editor/", + "source": "template-editor/index.md" + }, + { + "route": "/template-editor/quick-start/", + "source": "template-editor/quick-start.md" + }, + { + "route": "/template-editor/variables/", + "source": "template-editor/variables.md" + }, + { + "route": "/use-cases/dynamic-images/", + "source": "use-cases/dynamic-images.md" + }, + { + "route": "/use-cases/", + "source": "use-cases/index.md" + }, + { + "route": "/use-cases/screenshots/", + "source": "use-cases/screenshots.md" + }, + { + "route": "/use-cases/social-cards/", + "source": "use-cases/social-cards.md" + } +] diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..48496b1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8007 @@ +{ + "name": "hcti-docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hcti-docs", + "dependencies": { + "@astrojs/sitemap": "^3.7.4", + "@astrojs/starlight": "^0.42.2", + "@astrojs/starlight-tailwind": "^5.0.0", + "@html-css-to-image/client": "^0.9.0", + "@pagefind/component-ui": "^1.5.2", + "@tailwindcss/vite": "^4.3.3", + "astro": "^7.3.3", + "cheerio": "^1.2.0", + "gray-matter": "^4.0.3", + "marked": "^18.0.13", + "sharp": "^0.35.4", + "starlight-image-zoom": "^0.16.0", + "tailwindcss": "^4.3.3", + "turndown": "^7.2.4", + "turndown-plugin-gfm": "^1.0.2", + "wrangler": "^4.135.0" + }, + "devDependencies": { + "rollup-plugin-visualizer": "^7.1.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding/-/compiler-binding-0.4.1.tgz", + "integrity": "sha512-ZYVDW1P58OXyxqZbOMp+/2U9KA7y2esIx9r4pWdpZ/l6fCZhaw4ul+D7EgpRVxYLkyTWqzANbTTUFGPFP8zDHA==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@astrojs/compiler-binding-android-arm64": "0.4.1", + "@astrojs/compiler-binding-darwin-arm64": "0.4.1", + "@astrojs/compiler-binding-darwin-x64": "0.4.1", + "@astrojs/compiler-binding-linux-arm64-gnu": "0.4.1", + "@astrojs/compiler-binding-linux-arm64-musl": "0.4.1", + "@astrojs/compiler-binding-linux-x64-gnu": "0.4.1", + "@astrojs/compiler-binding-linux-x64-musl": "0.4.1", + "@astrojs/compiler-binding-wasm32-wasi": "0.4.1", + "@astrojs/compiler-binding-win32-arm64-msvc": "0.4.1", + "@astrojs/compiler-binding-win32-x64-msvc": "0.4.1" + } + }, + "node_modules/@astrojs/compiler-binding-android-arm64": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-android-arm64/-/compiler-binding-android-arm64-0.4.1.tgz", + "integrity": "sha512-Wtx2DZORuNTLASLLZ8hlrjFaJe1LUloatcCn9EPq7knBhRpjMGXeJANIJMeBZG4igvz7x+3nyAJM2iwCSW9xog==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-darwin-arm64": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-arm64/-/compiler-binding-darwin-arm64-0.4.1.tgz", + "integrity": "sha512-7iwXcU+hB60Y1SvOfnWHNioT72gDsDQKaDipXh2Onwp/TvQMozhbvhy13wJR8Af940a0h6PbddCeJFpj791UDA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-darwin-x64": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-x64/-/compiler-binding-darwin-x64-0.4.1.tgz", + "integrity": "sha512-pifjICos49RXhSVKSDu5gDB0/8j0O7DmxSp1DaWW2PyLG5ekwSkcrfOZto5JqhdI7QYMZB3XOiXpsdOXpS4npA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-arm64-gnu": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-gnu/-/compiler-binding-linux-arm64-gnu-0.4.1.tgz", + "integrity": "sha512-hsZMlNWc6LqWHh9LlSwTq1/XCY7pxA5rkkKIdZRV8mgbOz9OwLvjEoe5Jry13eIZjMUQO8XnQyzk8o/Pjw2YFA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-arm64-musl": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-musl/-/compiler-binding-linux-arm64-musl-0.4.1.tgz", + "integrity": "sha512-a3EW27f+Z9uf57vYmpLgUriA1y9wDhKz57PT8D8XlFZt2HZEWhUxKuxI1jvKVI9p8okYee11WXEm/FHY1G9yoQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-x64-gnu": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-gnu/-/compiler-binding-linux-x64-gnu-0.4.1.tgz", + "integrity": "sha512-XruPTKB/SS4DFzeAjQ1ZyM0ieHDjapHkOSnnzRApZ4FXY2YAI7UY3mETjfJiIS/acyZyrnPH5jObv1gATTdUJQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-linux-x64-musl": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-musl/-/compiler-binding-linux-x64-musl-0.4.1.tgz", + "integrity": "sha512-E8j7lGanqNpudtkUbsFaOLJhmwFe4Ecqux7K9hkj4wULIPNZRM2bYZNcMSj8r1oWvaUiwZl8LaaNwv3+14jqhw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-wasm32-wasi": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-wasm32-wasi/-/compiler-binding-wasm32-wasi-0.4.1.tgz", + "integrity": "sha512-vNLxIv41ZE+nmPFtw24cRW5ZXG+ZPcAGtgigtjCP8lvcxKI7u2GrXoMsCgEH5fMw8WCEJpwLvsVBg15rJKAkyA==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.2.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@astrojs/compiler-binding-win32-arm64-msvc": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-arm64-msvc/-/compiler-binding-win32-arm64-msvc-0.4.1.tgz", + "integrity": "sha512-/xTDgRsFDoTh0/+KFXJ74DY4Jqn8CoSHwa8UP5RAblHfnRHkenwfSl4zYDET61O9vXKLk09UzHjjq09yP20/AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-binding-win32-x64-msvc": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-x64-msvc/-/compiler-binding-win32-x64-msvc-0.4.1.tgz", + "integrity": "sha512-0x5J6iHZO0Fjo/CVzoIbXKzWnGESftDbEUQ/oXQ61HhUAFoR7+T1jfToZSNAS+gYyBXHSTpMWYC7lzarbhClcg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@astrojs/compiler-rs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-rs/-/compiler-rs-0.4.1.tgz", + "integrity": "sha512-//NmAuRhy7eU9iP0ceI5Pymy55M+nUZ//kS6XeOyhBWdDib2KbJOyFaVJ52k7sDkJwTKVox7oPu3SpYiVnGm5A==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler-binding": "0.4.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz", + "integrity": "sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.3.0", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, + "node_modules/@astrojs/markdown-satteri": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.4.1.tgz", + "integrity": "sha512-EniHbFNa6SQHDih7JnpPos3NWXO6hdt4raBcOosfGmlfc3gP9CI/sESA3VOf1PgJZ7SFfewlZW9Livn0JugEZg==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.11.0", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "satteri": "^0.10.3" + } + }, + "node_modules/@astrojs/mdx": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-8.0.1.tgz", + "integrity": "sha512-VKodp/f3+XE6L0950K+ZOAolY47vdt0R78Ao+L2RdJ1hfAdYffL7IEjc/MsoyuS7CPVvCsd5/I3RP0ZyAIewdQ==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.11.0", + "@astrojs/markdown-satteri": "0.4.1", + "es-module-lexer": "^2.0.0" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "^7.3.0", + "@astrojs/markdown-satteri": "^0.4.0", + "astro": "^7.2.6" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } + } + }, + "node_modules/@astrojs/prism": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", + "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.4.tgz", + "integrity": "sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==", + "license": "MIT", + "dependencies": { + "sitemap": "^9.0.0", + "zod": "^4.3.6" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.42.2", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.42.2.tgz", + "integrity": "sha512-rDAgv3QCJOo0F4EoWeuFG31OdhQOrcipATl9+gCkOqpQiO7u7FR8uVam+HHNJO8Sl21TOAQKUSUEvCXv8jEgJA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-satteri": "^0.4.0", + "@astrojs/mdx": "^8.0.0", + "@astrojs/sitemap": "^3.7.3", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.5", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.44.0", + "bcp-47": "^2.1.0", + "hast-util-format": "^1.1.0", + "hast-util-select": "^6.0.4", + "hast-util-to-html": "^9.0.5", + "hast-util-to-string": "^3.0.1", + "hastscript": "^9.0.1", + "i18next": "^26.0.7", + "js-yaml": "^4.1.1", + "klona": "^2.0.6", + "magic-string": "^1.2.3", + "mdast-util-directive": "^3.1.0", + "mdast-util-to-markdown": "^2.1.2", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.5.2", + "remark-directive": "^4.0.0", + "satteri": "^0.10.3", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "^7.3.0", + "astro": "^7.2.10" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } + } + }, + "node_modules/@astrojs/starlight-tailwind": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@astrojs/starlight-tailwind/-/starlight-tailwind-5.0.0.tgz", + "integrity": "sha512-VivF+bWg++4ma/ffr5sgHsd/ONtGdVJIKAaRZ6jmL4yqxy7bviu59MGNi5aW3nd8psP9i/aivBTrpwGxRM1XyA==", + "license": "MIT", + "peerDependencies": { + "@astrojs/starlight": ">=0.38.0", + "tailwindcss": "^4.0.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.3.tgz", + "integrity": "sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.4.0", + "dset": "^3.1.4", + "is-docker": "^4.0.0", + "package-manager-detector": "^1.6.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bruits/satteri-darwin-arm64": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.10.5.tgz", + "integrity": "sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@bruits/satteri-darwin-x64": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.10.5.tgz", + "integrity": "sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@bruits/satteri-linux-arm64-gnu": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.10.5.tgz", + "integrity": "sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-linux-arm64-musl": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.10.5.tgz", + "integrity": "sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-linux-x64-gnu": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.10.5.tgz", + "integrity": "sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-linux-x64-musl": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.10.5.tgz", + "integrity": "sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-wasm32-wasi": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.10.5.tgz", + "integrity": "sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@bruits/satteri-win32-arm64-msvc": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.10.5.tgz", + "integrity": "sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@bruits/satteri-win32-x64-msvc": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.10.5.tgz", + "integrity": "sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", + "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@clack/core": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.5.1.tgz", + "integrity": "sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==", + "license": "MIT", + "dependencies": { + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@clack/prompts": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.8.1.tgz", + "integrity": "sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==", + "license": "MIT", + "dependencies": { + "@clack/core": "1.5.1", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz", + "integrity": "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==", + "license": "MIT OR Apache-2.0", + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.1.tgz", + "integrity": "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==", + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": ">1.20260305.0 <2.0.0-0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20260918.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260918.1.tgz", + "integrity": "sha512-H5Em6Wd0jjxaloYh2rp+WLBl2eWbkk7nSP1svGt6K1RSv/rNVqmKdpjZPJTBSavOmeYGa88qvtOWwS+33OHTqQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20260918.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260918.1.tgz", + "integrity": "sha512-CR9JRZEQo93fNgBVF4Df2H2/VYO4n7rxSseSwCVv3bJQEb0huADUSCj2FK4ipxar8ToOEB4wawyw0vJo5U/rQQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20260918.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260918.1.tgz", + "integrity": "sha512-UQ2nnY3qpXLzQ80frmWO+8HvtqyWaQILe8QYZwpemdjT+sqwCz4Dz+0/WVkFco0v/04kIIqikVeLTY/7gEhmkw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20260918.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260918.1.tgz", + "integrity": "sha512-4rib51MaLNWweUIUxM/Xj558M5QmyZoBSf0ffv+lYah5VTrvwnez3XGxX72pElnBKHROvAPOi5msQ5Ts8JSI0A==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20260918.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260918.1.tgz", + "integrity": "sha512-sATrMx5ShYYgmgUGrcTmvsFSJBFuN95NEkX3xwb1qk8w1A6h5N11sea7yN2IeibwPyPmXKjWNjXOno0hZAM71Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.1.tgz", + "integrity": "sha512-Vh5uy9Y1JBMId6J1f68TMXnZrTCvNdo9Fu2k0d1YnJngR+sM5kWTKl441c/3TFs+cG0NWOjRWgQ/iaWhbYx+7A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@expressive-code/core": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.44.2.tgz", + "integrity": "sha512-Yw5KonQCD1HoOO2P89y4wifqS9qrJcGVY0LkVMUsVZjhi++bhz4WwQ37inenKFNOEVo50P7cjoVsCdaVnUbq8w==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.44.2.tgz", + "integrity": "sha512-gVLm6TQMNIRWIaM7o+mCtxkGNjLZY5/2faSTLoXeo9wv/Pkj/0QAtZyXPVPrRsPARqiipATNFmfvQFLJudxPHQ==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.44.2" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.44.2.tgz", + "integrity": "sha512-ebWIvCDzXvjyD8rH6T6DfytYJw1GoArLR4nusIAE4VxXrCQf3d+owytiv010KU/dUg+SRLZskDn0N+HaFXeuSg==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.44.2", + "shiki": "^4.0.2" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.44.2.tgz", + "integrity": "sha512-SNI7EgUSiADqbqUzzMbj1ZeC/r2pa5eg3KyFOGAd3a7EsIA4qzjXQLp+ODWQtHVDKFCdGs4J3ovSJUqvKIK96g==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.44.2" + } + }, + "node_modules/@html-css-to-image/client": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@html-css-to-image/client/-/client-0.9.0.tgz", + "integrity": "sha512-f3SqtfBEdFBO5Ho5aeNEtUxMSkU0hf5F3H9k2npt9annJQz8V9gkcbQtid1LTN9o2EpeL7/WreU1keIfvA4vow==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz", + "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.3" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz", + "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.3" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz", + "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.4" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz", + "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz", + "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz", + "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz", + "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz", + "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz", + "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz", + "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz", + "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz", + "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz", + "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz", + "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.3" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz", + "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.3" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz", + "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.3" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz", + "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.3" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz", + "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.3" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz", + "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.3" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz", + "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.3" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz", + "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.3" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz", + "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz", + "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.4" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz", + "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz", + "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz", + "integrity": "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mixmark-io/domino": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", + "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", + "license": "BSD-2-Clause" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz", + "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "node_modules/@oxc-project/types": { + "version": "0.150.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.150.0.tgz", + "integrity": "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@pagefind/component-ui": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/component-ui/-/component-ui-1.5.2.tgz", + "integrity": "sha512-t8/aE0tan4JiKa6cyhhSt/5qrEVwAK/qlYBHFpnRoq+qaFFVrhmXFFMY+r6n4GJtVIFCN2A5nUpeLN68cYjEjw==", + "license": "MIT", + "dependencies": { + "adequate-little-templates": "^1.0.2", + "bcp-47": "^2.1.0" + } + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.5.2.tgz", + "integrity": "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.5.2.tgz", + "integrity": "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.5.2.tgz", + "integrity": "sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==", + "license": "MIT" + }, + "node_modules/@pagefind/freebsd-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.5.2.tgz", + "integrity": "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.5.2.tgz", + "integrity": "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.5.2.tgz", + "integrity": "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/windows-arm64/-/windows-arm64-1.5.2.tgz", + "integrity": "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.5.2.tgz", + "integrity": "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.9.tgz", + "integrity": "sha512-tNISae1QEf/vkb3xkRcjV5SEdzPE97We5IVaa2Z8jSszQPZ8U60B/YCYpw4QI7VidYsBtKavczXf+DyDs9WGxw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.9.tgz", + "integrity": "sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.9.tgz", + "integrity": "sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.9.tgz", + "integrity": "sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.9.tgz", + "integrity": "sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.9.tgz", + "integrity": "sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.9.tgz", + "integrity": "sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.9.tgz", + "integrity": "sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.9.tgz", + "integrity": "sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.9.tgz", + "integrity": "sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.9.tgz", + "integrity": "sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.9.tgz", + "integrity": "sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.9.tgz", + "integrity": "sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.9.tgz", + "integrity": "sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.9.tgz", + "integrity": "sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" + }, + "node_modules/@shikijs/core": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", + "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", + "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", + "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", + "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", + "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", + "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.4.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", + "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.24", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.24.tgz", + "integrity": "sha512-qeW2e1l78afw8VhRPfPQ1Gjj+KU5XFQ/OFV5ti6eTa9bruO7mJyZtA4vw0ofqmA3tKCkROE9xLk3VZoeRc98nw==", + "license": "CC0-1.0" + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/node/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", + "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "24.13.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.6.tgz", + "integrity": "sha512-SGrw/h3KPFshy3OE6ZL53LMBG5vGQQ8/gIpiqz/kRZhPJ7HgwCEs8LBuNtWLa8dvGZVpSF7+Bf+c11HUrCb/yg==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "license": "ISC" + }, + "node_modules/adequate-little-templates": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/adequate-little-templates/-/adequate-little-templates-1.0.2.tgz", + "integrity": "sha512-d0tFFG538l3Y4CElRKtticzrMr/OGohs32/nf3Ewn8rbTMBYwkVNe8mPdXWrDnMlz+ZVUFQjsTmsBD5zCtU4wg==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/am-i-vibing": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", + "integrity": "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==", + "license": "MIT", + "dependencies": { + "process-ancestry": "^0.1.0" + }, + "bin": { + "am-i-vibing": "dist/cli.mjs" + } + }, + "node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/astro": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/astro/-/astro-7.3.3.tgz", + "integrity": "sha512-NF08hk3edFkVmr9avf9HW/rQyf6NrpbVDyYj2cVN3JfijDhfJYh1ivWVTY5PUd5+rRZn/Vtu4iaeyNlP0Iv6mg==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler-rs": "^0.4.0", + "@astrojs/internal-helpers": "0.11.0", + "@astrojs/markdown-satteri": "0.4.1", + "@astrojs/telemetry": "3.3.3", + "@capsizecss/unpack": "^4.0.0", + "@clack/prompts": "^1.1.0", + "@oslojs/encoding": "^1.1.0", + "am-i-vibing": "^0.4.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "ci-info": "^4.4.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^2.0.0", + "cookie": "^2.0.1", + "devalue": "^5.8.1", + "diff": "^9.0.0", + "dset": "^3.1.4", + "es-module-lexer": "^2.0.0", + "esbuild": "^0.28.0", + "find-proc": "0.2.0", + "flattie": "^1.1.1", + "fontace": "~0.4.1", + "get-tsconfig": "5.0.0-beta.4", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "js-yaml": "^4.3.0", + "jsonc-parser": "^3.3.1", + "magic-string": "^1.0.0", + "magicast": "^0.5.2", + "mrmime": "^2.0.1", + "neotraverse": "^1.0.1", + "obug": "^2.1.1", + "p-limit": "^7.3.0", + "p-queue": "^9.1.0", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.4", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "svgo": "^4.0.2", + "tinyclip": "^0.1.12", + "tinyexec": "^1.0.4", + "tinyglobby": "^0.2.15", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.5", + "unstorage": "^1.17.5", + "verkit": "^0.4.0", + "vite": "^8.0.13", + "vitefu": "^1.1.2", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^22.0.0", + "zod": "^4.5.4" + }, + "bin": { + "astro": "bin/astro.mjs" + }, + "engines": { + "node": ">=22.12.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.35.4" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "^7.3.0" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } + } + }, + "node_modules/astro-expressive-code": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.44.2.tgz", + "integrity": "sha512-avop7nZcRwC7quvIxVguhwEZ9Tp6IoTzKUCLwP30Fb7+er+pWQgcysP01dcuzRIJo81kLGg30q/YAI2Yb1Sdzg==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.44.2", + "url-extras": "^0.1.0" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.1.tgz", + "integrity": "sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/common-ancestor-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz", + "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } + }, + "node_modules/cookie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==", + "license": "MIT", + "engines": { + "node": ">=22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", + "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", + "license": "MIT" + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/default-browser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.4.tgz", + "integrity": "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz", + "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.25.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", + "integrity": "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/expressive-code": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.44.2.tgz", + "integrity": "sha512-MLNghkvhyFgVW4oCD5DxBuYnnTXIf0PygzGmfT6OZeOOYWh/D4sH1j931biElkA5RG/J9wY/iuSMGAPF5vzHOg==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.44.2", + "@expressive-code/plugin-frames": "^0.44.2", + "@expressive-code/plugin-shiki": "^0.44.2", + "@expressive-code/plugin-text-markers": "^0.44.2" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/find-proc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/find-proc/-/find-proc-0.2.0.tgz", + "integrity": "sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" + } + }, + "node_modules/fontkitten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", + "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", + "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "5.0.0-beta.4", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", + "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", + "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/h3": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", + "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.3", + "crossws": "^0.3.5", + "defu": "^6.1.6", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/i18next": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.4.2.tgz", + "integrity": "sha512-RX+R0VLg13IbvRuJSxnqykUFS9vQZTl8wYpWPCIUDWVrSGjsQywB5Y+pjzrkboxGAuYfJZVH1InFTdgBdxq6ug==", + "funding": [ + { + "type": "individual", + "url": "https://www.locize.com/i18next" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + }, + { + "type": "individual", + "url": "https://www.locize.com" + } + ], + "license": "MIT", + "peerDependencies": { + "typescript": "^5 || ^6 || ^7" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz", + "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", + "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0" + } + }, + "node_modules/magicast": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.5.tgz", + "integrity": "sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "source-map-js": "^1.2.1" + } + }, + "node_modules/marked": { + "version": "18.0.13", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.13.tgz", + "integrity": "sha512-xTxVzZsBFwunP6HDmtBkabUQEYArnP7/rMDGmPj9SlrKlQ4i8MdYVow+nJL0eOqwpUqhzBoTBRADGN6uYwPyOw==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/miniflare": { + "version": "5.20260918.0-alpha", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-5.20260918.0-alpha.tgz", + "integrity": "sha512-vyIes7yW/OTzHtz4GhcBCTohZfqk2eQNiIkngZ07VRA5Qu24aNgW/TrFwlPkMLMjWDQ8R4JJBBHR/KX+liSDtg==", + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "sharp": "0.35.4", + "undici": "7.29.0", + "workerd": "1.20260918.1", + "ws": "8.21.0", + "youch": "4.1.0-beta.10" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/miniflare/node_modules/undici": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-1.0.1.tgz", + "integrity": "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.5.tgz", + "integrity": "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/obug": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", + "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz", + "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==", + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/open": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.4.tgz", + "integrity": "sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.5.1", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.2.1", + "wsl-utils": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.3.tgz", + "integrity": "sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.2.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz", + "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.4", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.2.tgz", + "integrity": "sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", + "license": "MIT" + }, + "node_modules/pagefind": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz", + "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==", + "license": "MIT", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.5.2", + "@pagefind/darwin-x64": "1.5.2", + "@pagefind/freebsd-x64": "1.5.2", + "@pagefind/linux-arm64": "1.5.2", + "@pagefind/linux-x64": "1.5.2", + "@pagefind/windows-arm64": "1.5.2", + "@pagefind/windows-x64": "1.5.2" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/powershell-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.1.tgz", + "integrity": "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-ancestry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/process-ancestry/-/process-ancestry-0.1.0.tgz", + "integrity": "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype-expressive-code": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.44.2.tgz", + "integrity": "sha512-jvjQpsfWKBquDrEl5YQA3CJybRRIuDOYsui1BJTs5oKDUK8pPkJSSxY8FjxNlIFIdtgrTjC1zuahuY4Cc1j9SQ==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.44.2" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", + "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rolldown": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.9.tgz", + "integrity": "sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.150.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.9", + "@rolldown/binding-android-arm64": "1.2.9", + "@rolldown/binding-darwin-arm64": "1.2.9", + "@rolldown/binding-darwin-x64": "1.2.9", + "@rolldown/binding-freebsd-x64": "1.2.9", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.9", + "@rolldown/binding-linux-arm64-gnu": "1.2.9", + "@rolldown/binding-linux-arm64-musl": "1.2.9", + "@rolldown/binding-linux-ppc64-gnu": "1.2.9", + "@rolldown/binding-linux-s390x-gnu": "1.2.9", + "@rolldown/binding-linux-x64-gnu": "1.2.9", + "@rolldown/binding-linux-x64-musl": "1.2.9", + "@rolldown/binding-openharmony-arm64": "1.2.9", + "@rolldown/binding-win32-arm64-msvc": "1.2.9", + "@rolldown/binding-win32-x64-msvc": "1.2.9" + } + }, + "node_modules/rollup-plugin-visualizer": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-7.1.1.tgz", + "integrity": "sha512-ThaGiHTU8XW02OkK80TrTHATraJmM9OAduU4otal+7gyXLpYEtmGBLfx5kW+EHvvLwn03YGW2NnwKUIqsYlJAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "open": "^11.0.0", + "picomatch": "^4.0.5", + "source-map": "^0.8.0", + "yargs": "^18.1.0" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc", + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/satteri": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.10.5.tgz", + "integrity": "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.5", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" + }, + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.10.5", + "@bruits/satteri-darwin-x64": "0.10.5", + "@bruits/satteri-linux-arm64-gnu": "0.10.5", + "@bruits/satteri-linux-arm64-musl": "0.10.5", + "@bruits/satteri-linux-x64-gnu": "0.10.5", + "@bruits/satteri-linux-x64-musl": "0.10.5", + "@bruits/satteri-wasm32-wasi": "0.10.5", + "@bruits/satteri-win32-arm64-msvc": "0.10.5", + "@bruits/satteri-win32-x64-msvc": "0.10.5" + } + }, + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.4.tgz", + "integrity": "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==", + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.4", + "@img/sharp-darwin-x64": "0.35.4", + "@img/sharp-freebsd-wasm32": "0.35.4", + "@img/sharp-libvips-darwin-arm64": "1.3.3", + "@img/sharp-libvips-darwin-x64": "1.3.3", + "@img/sharp-libvips-linux-arm": "1.3.3", + "@img/sharp-libvips-linux-arm64": "1.3.3", + "@img/sharp-libvips-linux-ppc64": "1.3.3", + "@img/sharp-libvips-linux-riscv64": "1.3.3", + "@img/sharp-libvips-linux-s390x": "1.3.3", + "@img/sharp-libvips-linux-x64": "1.3.3", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.3", + "@img/sharp-libvips-linuxmusl-x64": "1.3.3", + "@img/sharp-linux-arm": "0.35.4", + "@img/sharp-linux-arm64": "0.35.4", + "@img/sharp-linux-ppc64": "0.35.4", + "@img/sharp-linux-riscv64": "0.35.4", + "@img/sharp-linux-s390x": "0.35.4", + "@img/sharp-linux-x64": "0.35.4", + "@img/sharp-linuxmusl-arm64": "0.35.4", + "@img/sharp-linuxmusl-x64": "0.35.4", + "@img/sharp-webcontainers-wasm32": "0.35.4", + "@img/sharp-win32-arm64": "0.35.4", + "@img/sharp-win32-ia32": "0.35.4", + "@img/sharp-win32-x64": "0.35.4" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/shiki": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", + "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.4.3", + "@shikijs/engine-javascript": "4.4.3", + "@shikijs/engine-oniguruma": "4.4.3", + "@shikijs/langs": "4.4.3", + "@shikijs/themes": "4.4.3", + "@shikijs/types": "4.4.3", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz", + "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==", + "license": "MIT", + "dependencies": { + "@types/node": "^24.9.2", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.4.1" + }, + "bin": { + "sitemap": "dist/esm/cli.js" + }, + "engines": { + "node": ">=20.19.5", + "npm": ">=10.8.2" + } + }, + "node_modules/smol-toml": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", + "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0.tgz", + "integrity": "sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/starlight-image-zoom": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/starlight-image-zoom/-/starlight-image-zoom-0.16.0.tgz", + "integrity": "sha512-N/mZ1Jwu+1JRQ9MqJjdj69UXiVpfDd3k6i78ZIuht1aZGceVC0wOcqCPASZ6VNmUoELlMXLz9n0xtAyBIfmA8A==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx-jsx": "^3.2.0", + "rehype-raw": "^7.0.0", + "satteri": "^0.10.3", + "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.42.0" + } + }, + "node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/svgo": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz", + "integrity": "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^6.0.0", + "css-tree": "^3.0.1", + "css-what": "^7.0.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "1.6.1" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tinyclip": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz", + "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==", + "license": "MIT", + "engines": { + "node": "^16.14.0 || >= 17.3.0" + } + }, + "node_modules/tinyexec": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/turndown": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.4.tgz", + "integrity": "sha512-I8yFsfRzmzK0WV1pNNOA4A7y4RDfFxPRxb3t+e3ui14qSGOxGtiSP6GjeX+Y6CHb7HYaFj7ECUD7VE5kQMZWGQ==", + "license": "MIT", + "dependencies": { + "@mixmark-io/domino": "^2.2.0" + }, + "engines": { + "node": ">=18", + "npm": ">=9" + } + }, + "node_modules/turndown-plugin-gfm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz", + "integrity": "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz", + "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.1.tgz", + "integrity": "sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/unenv": { + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.5.tgz", + "integrity": "sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ohash": "^2.0.11", + "undici": "^8.0.0" + } + }, + "node_modules/unifont/node_modules/undici": { + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.2.tgz", + "integrity": "sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ==", + "license": "MIT", + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz", + "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.10", + "lru-cache": "^11.2.7", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/url-extras": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/url-extras/-/url-extras-0.1.0.tgz", + "integrity": "sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/verkit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.4.1.tgz", + "integrity": "sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ==", + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.0.tgz", + "integrity": "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==", + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.28", + "rolldown": "~1.2.6", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.7.1", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/workerd": { + "version": "1.20260918.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260918.1.tgz", + "integrity": "sha512-NsjfQlBNQ0iEniv/STOy4zbp8s5k60PzL1Ter02Eg44arbDhHtf6UOs03E31XDRmmBFxSIkAZuCyld3RKH1wqA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20260918.1", + "@cloudflare/workerd-darwin-arm64": "1.20260918.1", + "@cloudflare/workerd-linux-64": "1.20260918.1", + "@cloudflare/workerd-linux-arm64": "1.20260918.1", + "@cloudflare/workerd-windows-64": "1.20260918.1" + } + }, + "node_modules/wrangler": { + "version": "4.135.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.135.0.tgz", + "integrity": "sha512-WrNBQSfIG6YcILJcodYr5ty8vgkzGsV8YX+kfd+uZ5/Bd8cUW0GnUIRKAVfn5kYKqh1m/BPcji9h1d7mE8euFw==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@cloudflare/kv-asset-handler": "0.5.0", + "@cloudflare/unenv-preset": "2.16.1", + "blake3-wasm": "2.1.5", + "esbuild": "0.28.1", + "miniflare": "5.20260918.0-alpha", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.24", + "workerd": "1.20260918.1" + }, + "bin": { + "cf-wrangler": "bin/cf-wrangler.js", + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=22.0.0" + }, + "optionalDependencies": { + "fsevents": "2.3.3" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^5.20260918.1" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/wrangler/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.0.tgz", + "integrity": "sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^8.2.1", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/youch": { + "version": "4.1.0-beta.10", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", + "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@poppinss/dumper": "^0.6.4", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.3" + } + }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" + } + }, + "node_modules/youch/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/zod": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", + "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..dc25b49 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "hcti-docs", + "private": true, + "type": "module", + "engines": { + "node": ">=22.12.0" + }, + "scripts": { + "dev": "npm run prepare:images && npm run prepare:og && astro dev", + "build": "npm run prepare:images && npm run prepare:og && astro build", + "check": "node scripts/check-site.mjs", + "test": "npm run prepare:og && node --test tests/*.test.mjs", + "preview": "wrangler dev", + "upload:preview": "wrangler versions upload --preview-alias docs-new", + "prepare:og": "node scripts/prepare-og.mjs", + "check:migration": "node scripts/check-site.mjs --complete", + "prepare:images": "node scripts/prepare-images.mjs", + "analyze": "ANALYZE=true npm run build" + }, + "dependencies": { + "@astrojs/sitemap": "^3.7.4", + "@astrojs/starlight": "^0.42.2", + "@astrojs/starlight-tailwind": "^5.0.0", + "@html-css-to-image/client": "^0.9.0", + "@pagefind/component-ui": "^1.5.2", + "@tailwindcss/vite": "^4.3.3", + "astro": "^7.3.3", + "cheerio": "^1.2.0", + "gray-matter": "^4.0.3", + "marked": "^18.0.13", + "sharp": "^0.35.4", + "starlight-image-zoom": "^0.16.0", + "tailwindcss": "^4.3.3", + "turndown": "^7.2.4", + "turndown-plugin-gfm": "^1.0.2", + "wrangler": "^4.135.0" + }, + "devDependencies": { + "rollup-plugin-visualizer": "^7.1.1" + } +} diff --git a/parameters/index.md b/parameters/index.md deleted file mode 100644 index ccbdb06..0000000 --- a/parameters/index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -layout: default -title: Parameters -permalink: /parameters/ -nav_order: 4 -expanded: false -has_children: true -description: >- - Full parameter reference for the HTML/CSS to Image API. Control viewport, device scale, fonts, delays, selectors, and more. ---- -# Parameters Reference -{: .no_toc } -{: .fs-9 } - -Detailed information on all the available parameters for the API. -{: .fs-4 .fw-300 } - -## Parameters - -The create image endpoint accepts the following parameters. Accepted as either `json` or `formdata`. - -| Name | Type | Description | -|:-------------|:------------------|:------| -| **html**† | `String` | This is the HTML you want to render. You can send an HTML snippet \(`
    Your content
    `\) or an entire webpage. | -| **css** | `String` | The CSS for your image. When using with `url` it will be injected into the page. | -| **url**† | `String` | The fully qualified URL to a public webpage. Such as `https://htmlcsstoimage.com`. When passed this will override the html param and will generate a screenshot of the url. | - -{% include hint.md title="Required params" text="† Either `url` OR `html` is required, but not both. `css` is optional." %} - -
    - -## Additional parameters - -Optional parameters for greater control over your image. - -{% include additional_parameters.md %} - -
    - -[Live demo](https://htmlcsstoimage.com/#demo){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 } -[Get an API Key](https://htmlcsstoimage.com){: .btn .fs-5 .mb-4 .mb-md-0 } diff --git a/parameters/jumbo_images.md b/parameters/jumbo_images.md deleted file mode 100644 index 71b59cb..0000000 --- a/parameters/jumbo_images.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: page -title: Jumbo Images -permalink: /parameters/jumbo-images/ -parent: Parameters -nav_order: 170 -sitemap: false -description: >- - Redirect to the Jumbo Images parameter guide. ---- - -# Jumbo Images -{: .no_toc } -{: .fs-9 } - -The Jumbo Images parameter documentation is available in the [Jumbo Images guide](/guides/advanced/jumbo-images/). diff --git a/public/_headers b/public/_headers new file mode 100644 index 0000000..25de180 --- /dev/null +++ b/public/_headers @@ -0,0 +1,19 @@ +/* + X-Content-Type-Options: nosniff + Referrer-Policy: strict-origin-when-cross-origin + +# Worker aliases, e.g. docs-new-docs.mike.workers.dev. +https://:worker.:account.workers.dev/* + X-Robots-Tag: noindex, nofollow + +# Version previews, e.g. .docs.mike.workers.dev. +https://:version.:worker.:account.workers.dev/* + X-Robots-Tag: noindex, nofollow + +# Generated OG rendering pages are never indexed, including in production. +/_og/* + X-Robots-Tag: noindex, nofollow + +# Astro fingerprints these font files; changed fonts receive new URLs. +/_astro/fonts/* + Cache-Control: public, max-age=31536000, immutable diff --git a/public/assets/fonts/OFL.txt b/public/assets/fonts/OFL.txt new file mode 100644 index 0000000..c35c4c6 --- /dev/null +++ b/public/assets/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright © 2017 IBM Corp. with Reserved Font Name "Plex" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/images/7e2da2be-7328-4746-ae69-418b295360ae.jpeg b/public/assets/images/7e2da2be-7328-4746-ae69-418b295360ae.jpeg similarity index 100% rename from assets/images/7e2da2be-7328-4746-ae69-418b295360ae.jpeg rename to public/assets/images/7e2da2be-7328-4746-ae69-418b295360ae.jpeg diff --git a/assets/images/8e8c1093-d205-4994-845c-67419598d081.jpeg b/public/assets/images/8e8c1093-d205-4994-845c-67419598d081.jpeg similarity index 100% rename from assets/images/8e8c1093-d205-4994-845c-67419598d081.jpeg rename to public/assets/images/8e8c1093-d205-4994-845c-67419598d081.jpeg diff --git a/assets/images/HCTI.png b/public/assets/images/HCTI.png similarity index 100% rename from assets/images/HCTI.png rename to public/assets/images/HCTI.png diff --git a/assets/images/api-keys/create-key-advanced.png b/public/assets/images/api-keys/create-key-advanced.png similarity index 100% rename from assets/images/api-keys/create-key-advanced.png rename to public/assets/images/api-keys/create-key-advanced.png diff --git a/assets/images/api-keys/create-key-simple.png b/public/assets/images/api-keys/create-key-simple.png similarity index 100% rename from assets/images/api-keys/create-key-simple.png rename to public/assets/images/api-keys/create-key-simple.png diff --git a/assets/images/api-keys/permission-details.png b/public/assets/images/api-keys/permission-details.png similarity index 100% rename from assets/images/api-keys/permission-details.png rename to public/assets/images/api-keys/permission-details.png diff --git a/assets/images/base64-logo.png b/public/assets/images/base64-logo.png similarity index 100% rename from assets/images/base64-logo.png rename to public/assets/images/base64-logo.png diff --git a/assets/images/cat.png b/public/assets/images/cat.png similarity index 100% rename from assets/images/cat.png rename to public/assets/images/cat.png diff --git a/assets/images/chart.jpeg b/public/assets/images/chart.jpeg similarity index 100% rename from assets/images/chart.jpeg rename to public/assets/images/chart.jpeg diff --git a/assets/images/cms_logos/astro.svg b/public/assets/images/cms_logos/astro.svg similarity index 100% rename from assets/images/cms_logos/astro.svg rename to public/assets/images/cms_logos/astro.svg diff --git a/assets/images/cms_logos/jekyll.svg b/public/assets/images/cms_logos/jekyll.svg similarity index 100% rename from assets/images/cms_logos/jekyll.svg rename to public/assets/images/cms_logos/jekyll.svg diff --git a/assets/images/cms_logos/shopify.svg b/public/assets/images/cms_logos/shopify.svg similarity index 100% rename from assets/images/cms_logos/shopify.svg rename to public/assets/images/cms_logos/shopify.svg diff --git a/assets/images/cms_logos/sitepress.png b/public/assets/images/cms_logos/sitepress.png similarity index 100% rename from assets/images/cms_logos/sitepress.png rename to public/assets/images/cms_logos/sitepress.png diff --git a/assets/images/cms_logos/squarespace.svg b/public/assets/images/cms_logos/squarespace.svg similarity index 100% rename from assets/images/cms_logos/squarespace.svg rename to public/assets/images/cms_logos/squarespace.svg diff --git a/assets/images/cms_logos/webflow.svg b/public/assets/images/cms_logos/webflow.svg similarity index 100% rename from assets/images/cms_logos/webflow.svg rename to public/assets/images/cms_logos/webflow.svg diff --git a/assets/images/cms_logos/wix.svg b/public/assets/images/cms_logos/wix.svg similarity index 100% rename from assets/images/cms_logos/wix.svg rename to public/assets/images/cms_logos/wix.svg diff --git a/assets/images/cms_logos/wordpress.svg b/public/assets/images/cms_logos/wordpress.svg similarity index 100% rename from assets/images/cms_logos/wordpress.svg rename to public/assets/images/cms_logos/wordpress.svg diff --git a/assets/images/dbd3b3f1-a266-42bb-808c-c565bb752af4-1.jpeg b/public/assets/images/dbd3b3f1-a266-42bb-808c-c565bb752af4-1.jpeg similarity index 100% rename from assets/images/dbd3b3f1-a266-42bb-808c-c565bb752af4-1.jpeg rename to public/assets/images/dbd3b3f1-a266-42bb-808c-c565bb752af4-1.jpeg diff --git a/assets/images/dbd3b3f1-a266-42bb-808c-c565bb752af4.jpeg b/public/assets/images/dbd3b3f1-a266-42bb-808c-c565bb752af4.jpeg similarity index 100% rename from assets/images/dbd3b3f1-a266-42bb-808c-c565bb752af4.jpeg rename to public/assets/images/dbd3b3f1-a266-42bb-808c-c565bb752af4.jpeg diff --git a/assets/images/dog-rates-example.png b/public/assets/images/dog-rates-example.png similarity index 100% rename from assets/images/dog-rates-example.png rename to public/assets/images/dog-rates-example.png diff --git a/assets/images/dog.jpg b/public/assets/images/dog.jpg similarity index 100% rename from assets/images/dog.jpg rename to public/assets/images/dog.jpg diff --git a/assets/images/email.png b/public/assets/images/email.png similarity index 100% rename from assets/images/email.png rename to public/assets/images/email.png diff --git a/assets/images/emoji.jpeg b/public/assets/images/emoji.jpeg similarity index 100% rename from assets/images/emoji.jpeg rename to public/assets/images/emoji.jpeg diff --git a/assets/images/f356dffe-d99f-487e-bb16-74dc076c0657.jpeg b/public/assets/images/f356dffe-d99f-487e-bb16-74dc076c0657.jpeg similarity index 100% rename from assets/images/f356dffe-d99f-487e-bb16-74dc076c0657.jpeg rename to public/assets/images/f356dffe-d99f-487e-bb16-74dc076c0657.jpeg diff --git a/assets/images/facebook.png b/public/assets/images/facebook.png similarity index 100% rename from assets/images/facebook.png rename to public/assets/images/facebook.png diff --git a/assets/images/favicon-16x16.png b/public/assets/images/favicon-16x16.png similarity index 100% rename from assets/images/favicon-16x16.png rename to public/assets/images/favicon-16x16.png diff --git a/assets/images/favicon-32x32.png b/public/assets/images/favicon-32x32.png similarity index 100% rename from assets/images/favicon-32x32.png rename to public/assets/images/favicon-32x32.png diff --git a/assets/images/favicon-96x96.png b/public/assets/images/favicon-96x96.png similarity index 100% rename from assets/images/favicon-96x96.png rename to public/assets/images/favicon-96x96.png diff --git a/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w1080.avif b/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w1080.avif new file mode 100644 index 0000000..b6eea31 Binary files /dev/null and b/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w1080.avif differ diff --git a/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w1080.webp b/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w1080.webp new file mode 100644 index 0000000..7aac71b Binary files /dev/null and b/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w1080.webp differ diff --git a/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w384.avif b/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w384.avif new file mode 100644 index 0000000..9ac2af8 Binary files /dev/null and b/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w384.avif differ diff --git a/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w384.webp b/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w384.webp new file mode 100644 index 0000000..5c3cd95 Binary files /dev/null and b/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w384.webp differ diff --git a/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w768.avif b/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w768.avif new file mode 100644 index 0000000..2b35bfa Binary files /dev/null and b/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w768.avif differ diff --git a/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w768.webp b/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w768.webp new file mode 100644 index 0000000..caed717 Binary files /dev/null and b/public/assets/images/g/7e2da2be-7328-4746-ae69-418b295360ae/59e05265239480e8c58f.w768.webp differ diff --git a/public/assets/images/g/8e8c1093-d205-4994-845c-67419598d081/53ead0dae6050fdae761.w384.avif b/public/assets/images/g/8e8c1093-d205-4994-845c-67419598d081/53ead0dae6050fdae761.w384.avif new file mode 100644 index 0000000..49eaf5b Binary files /dev/null and b/public/assets/images/g/8e8c1093-d205-4994-845c-67419598d081/53ead0dae6050fdae761.w384.avif differ diff --git a/public/assets/images/g/8e8c1093-d205-4994-845c-67419598d081/53ead0dae6050fdae761.w384.webp b/public/assets/images/g/8e8c1093-d205-4994-845c-67419598d081/53ead0dae6050fdae761.w384.webp new file mode 100644 index 0000000..fb72e65 Binary files /dev/null and b/public/assets/images/g/8e8c1093-d205-4994-845c-67419598d081/53ead0dae6050fdae761.w384.webp differ diff --git a/public/assets/images/g/8e8c1093-d205-4994-845c-67419598d081/53ead0dae6050fdae761.w760.avif b/public/assets/images/g/8e8c1093-d205-4994-845c-67419598d081/53ead0dae6050fdae761.w760.avif new file mode 100644 index 0000000..fab629a Binary files /dev/null and b/public/assets/images/g/8e8c1093-d205-4994-845c-67419598d081/53ead0dae6050fdae761.w760.avif differ diff --git a/public/assets/images/g/8e8c1093-d205-4994-845c-67419598d081/53ead0dae6050fdae761.w760.webp b/public/assets/images/g/8e8c1093-d205-4994-845c-67419598d081/53ead0dae6050fdae761.w760.webp new file mode 100644 index 0000000..c517a2c Binary files /dev/null and b/public/assets/images/g/8e8c1093-d205-4994-845c-67419598d081/53ead0dae6050fdae761.w760.webp differ diff --git a/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w1269.avif b/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w1269.avif new file mode 100644 index 0000000..515b537 Binary files /dev/null and b/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w1269.avif differ diff --git a/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w1269.webp b/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w1269.webp new file mode 100644 index 0000000..eaa53e9 Binary files /dev/null and b/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w1269.webp differ diff --git a/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w384.avif b/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w384.avif new file mode 100644 index 0000000..a3bfeef Binary files /dev/null and b/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w384.avif differ diff --git a/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w384.webp b/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w384.webp new file mode 100644 index 0000000..97e031c Binary files /dev/null and b/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w384.webp differ diff --git a/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w768.avif b/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w768.avif new file mode 100644 index 0000000..2f21aae Binary files /dev/null and b/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w768.avif differ diff --git a/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w768.webp b/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w768.webp new file mode 100644 index 0000000..815aabc Binary files /dev/null and b/public/assets/images/g/api-keys/create-key-advanced/33572280db545fec3508.w768.webp differ diff --git a/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w1272.avif b/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w1272.avif new file mode 100644 index 0000000..2de812b Binary files /dev/null and b/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w1272.avif differ diff --git a/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w1272.webp b/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w1272.webp new file mode 100644 index 0000000..b0b1574 Binary files /dev/null and b/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w1272.webp differ diff --git a/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w384.avif b/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w384.avif new file mode 100644 index 0000000..0b89aa5 Binary files /dev/null and b/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w384.avif differ diff --git a/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w384.webp b/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w384.webp new file mode 100644 index 0000000..5c33008 Binary files /dev/null and b/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w384.webp differ diff --git a/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w768.avif b/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w768.avif new file mode 100644 index 0000000..3b6b24d Binary files /dev/null and b/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w768.avif differ diff --git a/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w768.webp b/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w768.webp new file mode 100644 index 0000000..c40c435 Binary files /dev/null and b/public/assets/images/g/api-keys/create-key-simple/b2366fa7d8abc3eebbe9.w768.webp differ diff --git a/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w384.avif b/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w384.avif new file mode 100644 index 0000000..25d1e27 Binary files /dev/null and b/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w384.avif differ diff --git a/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w384.webp b/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w384.webp new file mode 100644 index 0000000..a031b80 Binary files /dev/null and b/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w384.webp differ diff --git a/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w768.avif b/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w768.avif new file mode 100644 index 0000000..537cb4e Binary files /dev/null and b/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w768.avif differ diff --git a/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w768.webp b/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w768.webp new file mode 100644 index 0000000..31ea53f Binary files /dev/null and b/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w768.webp differ diff --git a/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w997.avif b/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w997.avif new file mode 100644 index 0000000..c0942c5 Binary files /dev/null and b/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w997.avif differ diff --git a/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w997.webp b/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w997.webp new file mode 100644 index 0000000..f2d82ba Binary files /dev/null and b/public/assets/images/g/api-keys/permission-details/d424fa70732fab745c40.w997.webp differ diff --git a/public/assets/images/g/base64-logo/a842087fd2b845948048.w200.avif b/public/assets/images/g/base64-logo/a842087fd2b845948048.w200.avif new file mode 100644 index 0000000..a4cd315 Binary files /dev/null and b/public/assets/images/g/base64-logo/a842087fd2b845948048.w200.avif differ diff --git a/public/assets/images/g/base64-logo/a842087fd2b845948048.w200.webp b/public/assets/images/g/base64-logo/a842087fd2b845948048.w200.webp new file mode 100644 index 0000000..1c3072b Binary files /dev/null and b/public/assets/images/g/base64-logo/a842087fd2b845948048.w200.webp differ diff --git a/public/assets/images/g/cat/50a499450ad589f254f3.w1200.avif b/public/assets/images/g/cat/50a499450ad589f254f3.w1200.avif new file mode 100644 index 0000000..7b7c79d Binary files /dev/null and b/public/assets/images/g/cat/50a499450ad589f254f3.w1200.avif differ diff --git a/public/assets/images/g/cat/50a499450ad589f254f3.w1200.webp b/public/assets/images/g/cat/50a499450ad589f254f3.w1200.webp new file mode 100644 index 0000000..8bcfb5e Binary files /dev/null and b/public/assets/images/g/cat/50a499450ad589f254f3.w1200.webp differ diff --git a/public/assets/images/g/cat/50a499450ad589f254f3.w384.avif b/public/assets/images/g/cat/50a499450ad589f254f3.w384.avif new file mode 100644 index 0000000..af2c3ff Binary files /dev/null and b/public/assets/images/g/cat/50a499450ad589f254f3.w384.avif differ diff --git a/public/assets/images/g/cat/50a499450ad589f254f3.w384.webp b/public/assets/images/g/cat/50a499450ad589f254f3.w384.webp new file mode 100644 index 0000000..21db56d Binary files /dev/null and b/public/assets/images/g/cat/50a499450ad589f254f3.w384.webp differ diff --git a/public/assets/images/g/cat/50a499450ad589f254f3.w768.avif b/public/assets/images/g/cat/50a499450ad589f254f3.w768.avif new file mode 100644 index 0000000..23ad522 Binary files /dev/null and b/public/assets/images/g/cat/50a499450ad589f254f3.w768.avif differ diff --git a/public/assets/images/g/cat/50a499450ad589f254f3.w768.webp b/public/assets/images/g/cat/50a499450ad589f254f3.w768.webp new file mode 100644 index 0000000..1ee9b0c Binary files /dev/null and b/public/assets/images/g/cat/50a499450ad589f254f3.w768.webp differ diff --git a/public/assets/images/g/chart/b40c9ada09e58217ed63.w1200.avif b/public/assets/images/g/chart/b40c9ada09e58217ed63.w1200.avif new file mode 100644 index 0000000..08d0830 Binary files /dev/null and b/public/assets/images/g/chart/b40c9ada09e58217ed63.w1200.avif differ diff --git a/public/assets/images/g/chart/b40c9ada09e58217ed63.w1200.webp b/public/assets/images/g/chart/b40c9ada09e58217ed63.w1200.webp new file mode 100644 index 0000000..05336c4 Binary files /dev/null and b/public/assets/images/g/chart/b40c9ada09e58217ed63.w1200.webp differ diff --git a/public/assets/images/g/chart/b40c9ada09e58217ed63.w384.avif b/public/assets/images/g/chart/b40c9ada09e58217ed63.w384.avif new file mode 100644 index 0000000..fb31e97 Binary files /dev/null and b/public/assets/images/g/chart/b40c9ada09e58217ed63.w384.avif differ diff --git a/public/assets/images/g/chart/b40c9ada09e58217ed63.w384.webp b/public/assets/images/g/chart/b40c9ada09e58217ed63.w384.webp new file mode 100644 index 0000000..847a26a Binary files /dev/null and b/public/assets/images/g/chart/b40c9ada09e58217ed63.w384.webp differ diff --git a/public/assets/images/g/chart/b40c9ada09e58217ed63.w768.avif b/public/assets/images/g/chart/b40c9ada09e58217ed63.w768.avif new file mode 100644 index 0000000..96d0673 Binary files /dev/null and b/public/assets/images/g/chart/b40c9ada09e58217ed63.w768.avif differ diff --git a/public/assets/images/g/chart/b40c9ada09e58217ed63.w768.webp b/public/assets/images/g/chart/b40c9ada09e58217ed63.w768.webp new file mode 100644 index 0000000..90cd281 Binary files /dev/null and b/public/assets/images/g/chart/b40c9ada09e58217ed63.w768.webp differ diff --git a/public/assets/images/g/email/67d0242a906ecd47f245.w1088.avif b/public/assets/images/g/email/67d0242a906ecd47f245.w1088.avif new file mode 100644 index 0000000..d15e139 Binary files /dev/null and b/public/assets/images/g/email/67d0242a906ecd47f245.w1088.avif differ diff --git a/public/assets/images/g/email/67d0242a906ecd47f245.w1088.webp b/public/assets/images/g/email/67d0242a906ecd47f245.w1088.webp new file mode 100644 index 0000000..13312a1 Binary files /dev/null and b/public/assets/images/g/email/67d0242a906ecd47f245.w1088.webp differ diff --git a/public/assets/images/g/email/67d0242a906ecd47f245.w384.avif b/public/assets/images/g/email/67d0242a906ecd47f245.w384.avif new file mode 100644 index 0000000..1ea14f7 Binary files /dev/null and b/public/assets/images/g/email/67d0242a906ecd47f245.w384.avif differ diff --git a/public/assets/images/g/email/67d0242a906ecd47f245.w384.webp b/public/assets/images/g/email/67d0242a906ecd47f245.w384.webp new file mode 100644 index 0000000..2a665ae Binary files /dev/null and b/public/assets/images/g/email/67d0242a906ecd47f245.w384.webp differ diff --git a/public/assets/images/g/email/67d0242a906ecd47f245.w768.avif b/public/assets/images/g/email/67d0242a906ecd47f245.w768.avif new file mode 100644 index 0000000..7b8a810 Binary files /dev/null and b/public/assets/images/g/email/67d0242a906ecd47f245.w768.avif differ diff --git a/public/assets/images/g/email/67d0242a906ecd47f245.w768.webp b/public/assets/images/g/email/67d0242a906ecd47f245.w768.webp new file mode 100644 index 0000000..d48adb5 Binary files /dev/null and b/public/assets/images/g/email/67d0242a906ecd47f245.w768.webp differ diff --git a/public/assets/images/g/emoji/eba1f19841e36e080b98.w384.avif b/public/assets/images/g/emoji/eba1f19841e36e080b98.w384.avif new file mode 100644 index 0000000..78965f0 Binary files /dev/null and b/public/assets/images/g/emoji/eba1f19841e36e080b98.w384.avif differ diff --git a/public/assets/images/g/emoji/eba1f19841e36e080b98.w384.webp b/public/assets/images/g/emoji/eba1f19841e36e080b98.w384.webp new file mode 100644 index 0000000..72eef36 Binary files /dev/null and b/public/assets/images/g/emoji/eba1f19841e36e080b98.w384.webp differ diff --git a/public/assets/images/g/emoji/eba1f19841e36e080b98.w760.avif b/public/assets/images/g/emoji/eba1f19841e36e080b98.w760.avif new file mode 100644 index 0000000..9438c7b Binary files /dev/null and b/public/assets/images/g/emoji/eba1f19841e36e080b98.w760.avif differ diff --git a/public/assets/images/g/emoji/eba1f19841e36e080b98.w760.webp b/public/assets/images/g/emoji/eba1f19841e36e080b98.w760.webp new file mode 100644 index 0000000..7bee05c Binary files /dev/null and b/public/assets/images/g/emoji/eba1f19841e36e080b98.w760.webp differ diff --git a/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w1080.avif b/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w1080.avif new file mode 100644 index 0000000..9db9e81 Binary files /dev/null and b/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w1080.avif differ diff --git a/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w1080.webp b/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w1080.webp new file mode 100644 index 0000000..08a884c Binary files /dev/null and b/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w1080.webp differ diff --git a/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w384.avif b/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w384.avif new file mode 100644 index 0000000..7ae2590 Binary files /dev/null and b/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w384.avif differ diff --git a/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w384.webp b/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w384.webp new file mode 100644 index 0000000..f0ef30b Binary files /dev/null and b/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w384.webp differ diff --git a/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w768.avif b/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w768.avif new file mode 100644 index 0000000..7582f72 Binary files /dev/null and b/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w768.avif differ diff --git a/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w768.webp b/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w768.webp new file mode 100644 index 0000000..4a3700f Binary files /dev/null and b/public/assets/images/g/f356dffe-d99f-487e-bb16-74dc076c0657/3d43762e1baef43e5302.w768.webp differ diff --git a/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w1104.avif b/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w1104.avif new file mode 100644 index 0000000..f1afcf3 Binary files /dev/null and b/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w1104.avif differ diff --git a/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w1104.webp b/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w1104.webp new file mode 100644 index 0000000..46c6fdf Binary files /dev/null and b/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w1104.webp differ diff --git a/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w384.avif b/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w384.avif new file mode 100644 index 0000000..f5e06e8 Binary files /dev/null and b/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w384.avif differ diff --git a/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w384.webp b/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w384.webp new file mode 100644 index 0000000..307fdc5 Binary files /dev/null and b/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w384.webp differ diff --git a/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w768.avif b/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w768.avif new file mode 100644 index 0000000..30116cd Binary files /dev/null and b/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w768.avif differ diff --git a/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w768.webp b/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w768.webp new file mode 100644 index 0000000..e4df59d Binary files /dev/null and b/public/assets/images/g/facebook/bb5ad85b0e06888d4c2b.w768.webp differ diff --git a/public/assets/images/g/google/189ff53725b34ada600a.w384.avif b/public/assets/images/g/google/189ff53725b34ada600a.w384.avif new file mode 100644 index 0000000..b0f3de0 Binary files /dev/null and b/public/assets/images/g/google/189ff53725b34ada600a.w384.avif differ diff --git a/public/assets/images/g/google/189ff53725b34ada600a.w384.webp b/public/assets/images/g/google/189ff53725b34ada600a.w384.webp new file mode 100644 index 0000000..69b2d44 Binary files /dev/null and b/public/assets/images/g/google/189ff53725b34ada600a.w384.webp differ diff --git a/public/assets/images/g/google/189ff53725b34ada600a.w768.avif b/public/assets/images/g/google/189ff53725b34ada600a.w768.avif new file mode 100644 index 0000000..1cda980 Binary files /dev/null and b/public/assets/images/g/google/189ff53725b34ada600a.w768.avif differ diff --git a/public/assets/images/g/google/189ff53725b34ada600a.w768.webp b/public/assets/images/g/google/189ff53725b34ada600a.w768.webp new file mode 100644 index 0000000..8e92946 Binary files /dev/null and b/public/assets/images/g/google/189ff53725b34ada600a.w768.webp differ diff --git a/public/assets/images/g/google/189ff53725b34ada600a.w956.avif b/public/assets/images/g/google/189ff53725b34ada600a.w956.avif new file mode 100644 index 0000000..534df12 Binary files /dev/null and b/public/assets/images/g/google/189ff53725b34ada600a.w956.avif differ diff --git a/public/assets/images/g/google/189ff53725b34ada600a.w956.webp b/public/assets/images/g/google/189ff53725b34ada600a.w956.webp new file mode 100644 index 0000000..77afa71 Binary files /dev/null and b/public/assets/images/g/google/189ff53725b34ada600a.w956.webp differ diff --git a/public/assets/images/g/h300/d5e3df0f28e663934056.w384.avif b/public/assets/images/g/h300/d5e3df0f28e663934056.w384.avif new file mode 100644 index 0000000..5abf9be Binary files /dev/null and b/public/assets/images/g/h300/d5e3df0f28e663934056.w384.avif differ diff --git a/public/assets/images/g/h300/d5e3df0f28e663934056.w384.webp b/public/assets/images/g/h300/d5e3df0f28e663934056.w384.webp new file mode 100644 index 0000000..34edf3a Binary files /dev/null and b/public/assets/images/g/h300/d5e3df0f28e663934056.w384.webp differ diff --git a/public/assets/images/g/h300/d5e3df0f28e663934056.w478.avif b/public/assets/images/g/h300/d5e3df0f28e663934056.w478.avif new file mode 100644 index 0000000..b7abcad Binary files /dev/null and b/public/assets/images/g/h300/d5e3df0f28e663934056.w478.avif differ diff --git a/public/assets/images/g/h300/d5e3df0f28e663934056.w478.webp b/public/assets/images/g/h300/d5e3df0f28e663934056.w478.webp new file mode 100644 index 0000000..232a4fe Binary files /dev/null and b/public/assets/images/g/h300/d5e3df0f28e663934056.w478.webp differ diff --git a/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w1280.avif b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w1280.avif new file mode 100644 index 0000000..14de618 Binary files /dev/null and b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w1280.avif differ diff --git a/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w1280.webp b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w1280.webp new file mode 100644 index 0000000..c99eb28 Binary files /dev/null and b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w1280.webp differ diff --git a/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w1438.avif b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w1438.avif new file mode 100644 index 0000000..c5fef91 Binary files /dev/null and b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w1438.avif differ diff --git a/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w1438.webp b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w1438.webp new file mode 100644 index 0000000..42d8cda Binary files /dev/null and b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w1438.webp differ diff --git a/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w384.avif b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w384.avif new file mode 100644 index 0000000..7544cd8 Binary files /dev/null and b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w384.avif differ diff --git a/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w384.webp b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w384.webp new file mode 100644 index 0000000..316485f Binary files /dev/null and b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w384.webp differ diff --git a/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w768.avif b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w768.avif new file mode 100644 index 0000000..87e84f3 Binary files /dev/null and b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w768.avif differ diff --git a/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w768.webp b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w768.webp new file mode 100644 index 0000000..5ac8d77 Binary files /dev/null and b/public/assets/images/g/insomnia1/e52a52d5fe0591600bf8.w768.webp differ diff --git a/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w1280.avif b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w1280.avif new file mode 100644 index 0000000..3a3463d Binary files /dev/null and b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w1280.avif differ diff --git a/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w1280.webp b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w1280.webp new file mode 100644 index 0000000..f46c940 Binary files /dev/null and b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w1280.webp differ diff --git a/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w1407.avif b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w1407.avif new file mode 100644 index 0000000..997001d Binary files /dev/null and b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w1407.avif differ diff --git a/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w1407.webp b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w1407.webp new file mode 100644 index 0000000..5ab0f70 Binary files /dev/null and b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w1407.webp differ diff --git a/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w384.avif b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w384.avif new file mode 100644 index 0000000..10f1ba0 Binary files /dev/null and b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w384.avif differ diff --git a/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w384.webp b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w384.webp new file mode 100644 index 0000000..0c60fd8 Binary files /dev/null and b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w384.webp differ diff --git a/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w768.avif b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w768.avif new file mode 100644 index 0000000..e6f4a11 Binary files /dev/null and b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w768.avif differ diff --git a/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w768.webp b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w768.webp new file mode 100644 index 0000000..4008fff Binary files /dev/null and b/public/assets/images/g/insomnia2/77d9cc3c4ff3c9eea8fd.w768.webp differ diff --git a/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w384.avif b/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w384.avif new file mode 100644 index 0000000..dc06f70 Binary files /dev/null and b/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w384.avif differ diff --git a/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w384.webp b/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w384.webp new file mode 100644 index 0000000..84bd013 Binary files /dev/null and b/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w384.webp differ diff --git a/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w768.avif b/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w768.avif new file mode 100644 index 0000000..b400f13 Binary files /dev/null and b/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w768.avif differ diff --git a/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w768.webp b/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w768.webp new file mode 100644 index 0000000..5af872f Binary files /dev/null and b/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w768.webp differ diff --git a/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w932.avif b/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w932.avif new file mode 100644 index 0000000..e6d7b64 Binary files /dev/null and b/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w932.avif differ diff --git a/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w932.webp b/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w932.webp new file mode 100644 index 0000000..bf0d615 Binary files /dev/null and b/public/assets/images/g/insta-embed/7e6fac398ce53b981b8e.w932.webp differ diff --git a/public/assets/images/g/instagram/3666898c9aa84eccbe74.w384.avif b/public/assets/images/g/instagram/3666898c9aa84eccbe74.w384.avif new file mode 100644 index 0000000..30c56f5 Binary files /dev/null and b/public/assets/images/g/instagram/3666898c9aa84eccbe74.w384.avif differ diff --git a/public/assets/images/g/instagram/3666898c9aa84eccbe74.w384.webp b/public/assets/images/g/instagram/3666898c9aa84eccbe74.w384.webp new file mode 100644 index 0000000..c9ede5f Binary files /dev/null and b/public/assets/images/g/instagram/3666898c9aa84eccbe74.w384.webp differ diff --git a/public/assets/images/g/instagram/3666898c9aa84eccbe74.w768.avif b/public/assets/images/g/instagram/3666898c9aa84eccbe74.w768.avif new file mode 100644 index 0000000..5e17354 Binary files /dev/null and b/public/assets/images/g/instagram/3666898c9aa84eccbe74.w768.avif differ diff --git a/public/assets/images/g/instagram/3666898c9aa84eccbe74.w768.webp b/public/assets/images/g/instagram/3666898c9aa84eccbe74.w768.webp new file mode 100644 index 0000000..d9d5f40 Binary files /dev/null and b/public/assets/images/g/instagram/3666898c9aa84eccbe74.w768.webp differ diff --git a/public/assets/images/g/instagram/3666898c9aa84eccbe74.w843.avif b/public/assets/images/g/instagram/3666898c9aa84eccbe74.w843.avif new file mode 100644 index 0000000..15ea2e1 Binary files /dev/null and b/public/assets/images/g/instagram/3666898c9aa84eccbe74.w843.avif differ diff --git a/public/assets/images/g/instagram/3666898c9aa84eccbe74.w843.webp b/public/assets/images/g/instagram/3666898c9aa84eccbe74.w843.webp new file mode 100644 index 0000000..d1eae6b Binary files /dev/null and b/public/assets/images/g/instagram/3666898c9aa84eccbe74.w843.webp differ diff --git a/public/assets/images/g/jobad/cd5f62d9376b29d506d3.w384.avif b/public/assets/images/g/jobad/cd5f62d9376b29d506d3.w384.avif new file mode 100644 index 0000000..7aba28f Binary files /dev/null and b/public/assets/images/g/jobad/cd5f62d9376b29d506d3.w384.avif differ diff --git a/public/assets/images/g/jobad/cd5f62d9376b29d506d3.w384.webp b/public/assets/images/g/jobad/cd5f62d9376b29d506d3.w384.webp new file mode 100644 index 0000000..59082cf Binary files /dev/null and b/public/assets/images/g/jobad/cd5f62d9376b29d506d3.w384.webp differ diff --git a/public/assets/images/g/jobad/cd5f62d9376b29d506d3.w600.avif b/public/assets/images/g/jobad/cd5f62d9376b29d506d3.w600.avif new file mode 100644 index 0000000..bcf3e49 Binary files /dev/null and b/public/assets/images/g/jobad/cd5f62d9376b29d506d3.w600.avif differ diff --git a/public/assets/images/g/jobad/cd5f62d9376b29d506d3.w600.webp b/public/assets/images/g/jobad/cd5f62d9376b29d506d3.w600.webp new file mode 100644 index 0000000..c502ca7 Binary files /dev/null and b/public/assets/images/g/jobad/cd5f62d9376b29d506d3.w600.webp differ diff --git a/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w1008.avif b/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w1008.avif new file mode 100644 index 0000000..23ce2e8 Binary files /dev/null and b/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w1008.avif differ diff --git a/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w1008.webp b/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w1008.webp new file mode 100644 index 0000000..7f81e2c Binary files /dev/null and b/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w1008.webp differ diff --git a/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w384.avif b/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w384.avif new file mode 100644 index 0000000..c508cf7 Binary files /dev/null and b/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w384.avif differ diff --git a/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w384.webp b/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w384.webp new file mode 100644 index 0000000..57ba6b8 Binary files /dev/null and b/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w384.webp differ diff --git a/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w768.avif b/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w768.avif new file mode 100644 index 0000000..bd705e7 Binary files /dev/null and b/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w768.avif differ diff --git a/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w768.webp b/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w768.webp new file mode 100644 index 0000000..33b11d4 Binary files /dev/null and b/public/assets/images/g/linkedin/bd77d94a79c7b76e69b8.w768.webp differ diff --git a/public/assets/images/g/make/4ccebac7b2973160c8bf.w1280.avif b/public/assets/images/g/make/4ccebac7b2973160c8bf.w1280.avif new file mode 100644 index 0000000..957315d Binary files /dev/null and b/public/assets/images/g/make/4ccebac7b2973160c8bf.w1280.avif differ diff --git a/public/assets/images/g/make/4ccebac7b2973160c8bf.w1280.webp b/public/assets/images/g/make/4ccebac7b2973160c8bf.w1280.webp new file mode 100644 index 0000000..bcbfe56 Binary files /dev/null and b/public/assets/images/g/make/4ccebac7b2973160c8bf.w1280.webp differ diff --git a/public/assets/images/g/make/4ccebac7b2973160c8bf.w1600.avif b/public/assets/images/g/make/4ccebac7b2973160c8bf.w1600.avif new file mode 100644 index 0000000..9432f76 Binary files /dev/null and b/public/assets/images/g/make/4ccebac7b2973160c8bf.w1600.avif differ diff --git a/public/assets/images/g/make/4ccebac7b2973160c8bf.w1600.webp b/public/assets/images/g/make/4ccebac7b2973160c8bf.w1600.webp new file mode 100644 index 0000000..5ec0196 Binary files /dev/null and b/public/assets/images/g/make/4ccebac7b2973160c8bf.w1600.webp differ diff --git a/public/assets/images/g/make/4ccebac7b2973160c8bf.w384.avif b/public/assets/images/g/make/4ccebac7b2973160c8bf.w384.avif new file mode 100644 index 0000000..d69a4f9 Binary files /dev/null and b/public/assets/images/g/make/4ccebac7b2973160c8bf.w384.avif differ diff --git a/public/assets/images/g/make/4ccebac7b2973160c8bf.w384.webp b/public/assets/images/g/make/4ccebac7b2973160c8bf.w384.webp new file mode 100644 index 0000000..d185b7a Binary files /dev/null and b/public/assets/images/g/make/4ccebac7b2973160c8bf.w384.webp differ diff --git a/public/assets/images/g/make/4ccebac7b2973160c8bf.w768.avif b/public/assets/images/g/make/4ccebac7b2973160c8bf.w768.avif new file mode 100644 index 0000000..863976a Binary files /dev/null and b/public/assets/images/g/make/4ccebac7b2973160c8bf.w768.avif differ diff --git a/public/assets/images/g/make/4ccebac7b2973160c8bf.w768.webp b/public/assets/images/g/make/4ccebac7b2973160c8bf.w768.webp new file mode 100644 index 0000000..99e7b2e Binary files /dev/null and b/public/assets/images/g/make/4ccebac7b2973160c8bf.w768.webp differ diff --git a/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w1024.avif b/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w1024.avif new file mode 100644 index 0000000..c472bf9 Binary files /dev/null and b/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w1024.avif differ diff --git a/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w1024.webp b/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w1024.webp new file mode 100644 index 0000000..2339b1a Binary files /dev/null and b/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w1024.webp differ diff --git a/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w384.avif b/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w384.avif new file mode 100644 index 0000000..a84ade0 Binary files /dev/null and b/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w384.avif differ diff --git a/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w384.webp b/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w384.webp new file mode 100644 index 0000000..20bec3b Binary files /dev/null and b/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w384.webp differ diff --git a/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w768.avif b/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w768.avif new file mode 100644 index 0000000..6cd2d40 Binary files /dev/null and b/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w768.avif differ diff --git a/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w768.webp b/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w768.webp new file mode 100644 index 0000000..9447d54 Binary files /dev/null and b/public/assets/images/g/proxies-dashboard/09172ac94504bb093a2d.w768.webp differ diff --git a/public/assets/images/g/selector-example/1d7cdc0f4278bad1c616.w384.avif b/public/assets/images/g/selector-example/1d7cdc0f4278bad1c616.w384.avif new file mode 100644 index 0000000..c420b59 Binary files /dev/null and b/public/assets/images/g/selector-example/1d7cdc0f4278bad1c616.w384.avif differ diff --git a/public/assets/images/g/selector-example/1d7cdc0f4278bad1c616.w384.webp b/public/assets/images/g/selector-example/1d7cdc0f4278bad1c616.w384.webp new file mode 100644 index 0000000..be4f488 Binary files /dev/null and b/public/assets/images/g/selector-example/1d7cdc0f4278bad1c616.w384.webp differ diff --git a/public/assets/images/g/selector-example/1d7cdc0f4278bad1c616.w470.avif b/public/assets/images/g/selector-example/1d7cdc0f4278bad1c616.w470.avif new file mode 100644 index 0000000..43a5a29 Binary files /dev/null and b/public/assets/images/g/selector-example/1d7cdc0f4278bad1c616.w470.avif differ diff --git a/public/assets/images/g/selector-example/1d7cdc0f4278bad1c616.w470.webp b/public/assets/images/g/selector-example/1d7cdc0f4278bad1c616.w470.webp new file mode 100644 index 0000000..30c7c88 Binary files /dev/null and b/public/assets/images/g/selector-example/1d7cdc0f4278bad1c616.w470.webp differ diff --git a/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w384.avif b/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w384.avif new file mode 100644 index 0000000..940bf2c Binary files /dev/null and b/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w384.avif differ diff --git a/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w384.webp b/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w384.webp new file mode 100644 index 0000000..7438c23 Binary files /dev/null and b/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w384.webp differ diff --git a/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w768.avif b/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w768.avif new file mode 100644 index 0000000..7d7fbc6 Binary files /dev/null and b/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w768.avif differ diff --git a/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w768.webp b/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w768.webp new file mode 100644 index 0000000..4a396a2 Binary files /dev/null and b/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w768.webp differ diff --git a/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w884.avif b/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w884.avif new file mode 100644 index 0000000..44bcbc4 Binary files /dev/null and b/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w884.avif differ diff --git a/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w884.webp b/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w884.webp new file mode 100644 index 0000000..ab7f463 Binary files /dev/null and b/public/assets/images/g/slack-email-1/10f21f2d49dcf6c6d26a.w884.webp differ diff --git a/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w1280.avif b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w1280.avif new file mode 100644 index 0000000..a965341 Binary files /dev/null and b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w1280.avif differ diff --git a/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w1280.webp b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w1280.webp new file mode 100644 index 0000000..35bd9bf Binary files /dev/null and b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w1280.webp differ diff --git a/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w1600.avif b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w1600.avif new file mode 100644 index 0000000..ac3c3e8 Binary files /dev/null and b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w1600.avif differ diff --git a/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w1600.webp b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w1600.webp new file mode 100644 index 0000000..9399612 Binary files /dev/null and b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w1600.webp differ diff --git a/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w384.avif b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w384.avif new file mode 100644 index 0000000..7643057 Binary files /dev/null and b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w384.avif differ diff --git a/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w384.webp b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w384.webp new file mode 100644 index 0000000..bdf3dc9 Binary files /dev/null and b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w384.webp differ diff --git a/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w768.avif b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w768.avif new file mode 100644 index 0000000..12171d2 Binary files /dev/null and b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w768.avif differ diff --git a/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w768.webp b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w768.webp new file mode 100644 index 0000000..7ba03fa Binary files /dev/null and b/public/assets/images/g/slack-email-2/ff6a31eab25518882a7e.w768.webp differ diff --git a/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w1280.avif b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w1280.avif new file mode 100644 index 0000000..3cdb642 Binary files /dev/null and b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w1280.avif differ diff --git a/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w1280.webp b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w1280.webp new file mode 100644 index 0000000..eefa927 Binary files /dev/null and b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w1280.webp differ diff --git a/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w1600.avif b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w1600.avif new file mode 100644 index 0000000..00ea2ce Binary files /dev/null and b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w1600.avif differ diff --git a/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w1600.webp b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w1600.webp new file mode 100644 index 0000000..bb6b10c Binary files /dev/null and b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w1600.webp differ diff --git a/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w384.avif b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w384.avif new file mode 100644 index 0000000..e0f2231 Binary files /dev/null and b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w384.avif differ diff --git a/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w384.webp b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w384.webp new file mode 100644 index 0000000..c1abe3f Binary files /dev/null and b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w384.webp differ diff --git a/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w768.avif b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w768.avif new file mode 100644 index 0000000..1a99ff5 Binary files /dev/null and b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w768.avif differ diff --git a/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w768.webp b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w768.webp new file mode 100644 index 0000000..d2dd315 Binary files /dev/null and b/public/assets/images/g/slack-email-3/25ff98c2a05dfc905289.w768.webp differ diff --git a/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w1280.avif b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w1280.avif new file mode 100644 index 0000000..137c8a9 Binary files /dev/null and b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w1280.avif differ diff --git a/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w1280.webp b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w1280.webp new file mode 100644 index 0000000..e26657f Binary files /dev/null and b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w1280.webp differ diff --git a/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w1600.avif b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w1600.avif new file mode 100644 index 0000000..5e9d300 Binary files /dev/null and b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w1600.avif differ diff --git a/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w1600.webp b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w1600.webp new file mode 100644 index 0000000..448f168 Binary files /dev/null and b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w1600.webp differ diff --git a/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w384.avif b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w384.avif new file mode 100644 index 0000000..4b1d5c4 Binary files /dev/null and b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w384.avif differ diff --git a/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w384.webp b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w384.webp new file mode 100644 index 0000000..5a57f74 Binary files /dev/null and b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w384.webp differ diff --git a/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w768.avif b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w768.avif new file mode 100644 index 0000000..1baab30 Binary files /dev/null and b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w768.avif differ diff --git a/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w768.webp b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w768.webp new file mode 100644 index 0000000..99ba0b3 Binary files /dev/null and b/public/assets/images/g/slack-email-4/734a21ae775140c5f39a.w768.webp differ diff --git a/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w1280.avif b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w1280.avif new file mode 100644 index 0000000..db1c079 Binary files /dev/null and b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w1280.avif differ diff --git a/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w1280.webp b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w1280.webp new file mode 100644 index 0000000..be7b8c1 Binary files /dev/null and b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w1280.webp differ diff --git a/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w1600.avif b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w1600.avif new file mode 100644 index 0000000..fbdeaf5 Binary files /dev/null and b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w1600.avif differ diff --git a/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w1600.webp b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w1600.webp new file mode 100644 index 0000000..b5cddbc Binary files /dev/null and b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w1600.webp differ diff --git a/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w384.avif b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w384.avif new file mode 100644 index 0000000..a407d5c Binary files /dev/null and b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w384.avif differ diff --git a/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w384.webp b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w384.webp new file mode 100644 index 0000000..fa5b56d Binary files /dev/null and b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w384.webp differ diff --git a/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w768.avif b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w768.avif new file mode 100644 index 0000000..c1cac30 Binary files /dev/null and b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w768.avif differ diff --git a/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w768.webp b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w768.webp new file mode 100644 index 0000000..17fa165 Binary files /dev/null and b/public/assets/images/g/slack-email-5/93119a4c9f95979bd48d.w768.webp differ diff --git a/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w1280.avif b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w1280.avif new file mode 100644 index 0000000..1993d19 Binary files /dev/null and b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w1280.avif differ diff --git a/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w1280.webp b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w1280.webp new file mode 100644 index 0000000..658d7af Binary files /dev/null and b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w1280.webp differ diff --git a/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w1600.avif b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w1600.avif new file mode 100644 index 0000000..b587a3a Binary files /dev/null and b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w1600.avif differ diff --git a/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w1600.webp b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w1600.webp new file mode 100644 index 0000000..1ddf615 Binary files /dev/null and b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w1600.webp differ diff --git a/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w384.avif b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w384.avif new file mode 100644 index 0000000..6a3fa7e Binary files /dev/null and b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w384.avif differ diff --git a/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w384.webp b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w384.webp new file mode 100644 index 0000000..ce3c7de Binary files /dev/null and b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w384.webp differ diff --git a/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w768.avif b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w768.avif new file mode 100644 index 0000000..f1733a1 Binary files /dev/null and b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w768.avif differ diff --git a/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w768.webp b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w768.webp new file mode 100644 index 0000000..a2daeee Binary files /dev/null and b/public/assets/images/g/slack-email-6/5a40f0c8ce71f26c1e34.w768.webp differ diff --git a/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w1280.avif b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w1280.avif new file mode 100644 index 0000000..ae33649 Binary files /dev/null and b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w1280.avif differ diff --git a/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w1280.webp b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w1280.webp new file mode 100644 index 0000000..4418f2f Binary files /dev/null and b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w1280.webp differ diff --git a/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w1600.avif b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w1600.avif new file mode 100644 index 0000000..9c4f87c Binary files /dev/null and b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w1600.avif differ diff --git a/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w1600.webp b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w1600.webp new file mode 100644 index 0000000..40d61cf Binary files /dev/null and b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w1600.webp differ diff --git a/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w384.avif b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w384.avif new file mode 100644 index 0000000..b848039 Binary files /dev/null and b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w384.avif differ diff --git a/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w384.webp b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w384.webp new file mode 100644 index 0000000..5b05c22 Binary files /dev/null and b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w384.webp differ diff --git a/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w768.avif b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w768.avif new file mode 100644 index 0000000..903f2ca Binary files /dev/null and b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w768.avif differ diff --git a/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w768.webp b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w768.webp new file mode 100644 index 0000000..398b8c4 Binary files /dev/null and b/public/assets/images/g/slack-email-7/39ba3e4b04442faa6a9b.w768.webp differ diff --git a/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w1280.avif b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w1280.avif new file mode 100644 index 0000000..985035c Binary files /dev/null and b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w1280.avif differ diff --git a/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w1280.webp b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w1280.webp new file mode 100644 index 0000000..77bd80a Binary files /dev/null and b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w1280.webp differ diff --git a/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w1427.avif b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w1427.avif new file mode 100644 index 0000000..56dfaf5 Binary files /dev/null and b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w1427.avif differ diff --git a/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w1427.webp b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w1427.webp new file mode 100644 index 0000000..44534cc Binary files /dev/null and b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w1427.webp differ diff --git a/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w384.avif b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w384.avif new file mode 100644 index 0000000..babc037 Binary files /dev/null and b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w384.avif differ diff --git a/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w384.webp b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w384.webp new file mode 100644 index 0000000..714e2e7 Binary files /dev/null and b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w384.webp differ diff --git a/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w768.avif b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w768.avif new file mode 100644 index 0000000..ca34140 Binary files /dev/null and b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w768.avif differ diff --git a/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w768.webp b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w768.webp new file mode 100644 index 0000000..47e4ff9 Binary files /dev/null and b/public/assets/images/g/slack-email/53a6919ebe5d66f81ad6.w768.webp differ diff --git a/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w1026.avif b/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w1026.avif new file mode 100644 index 0000000..c806812 Binary files /dev/null and b/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w1026.avif differ diff --git a/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w1026.webp b/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w1026.webp new file mode 100644 index 0000000..7e69d49 Binary files /dev/null and b/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w1026.webp differ diff --git a/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w384.avif b/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w384.avif new file mode 100644 index 0000000..bf35ac3 Binary files /dev/null and b/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w384.avif differ diff --git a/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w384.webp b/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w384.webp new file mode 100644 index 0000000..2320ad1 Binary files /dev/null and b/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w384.webp differ diff --git a/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w768.avif b/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w768.avif new file mode 100644 index 0000000..586035b Binary files /dev/null and b/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w768.avif differ diff --git a/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w768.webp b/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w768.webp new file mode 100644 index 0000000..6e95d96 Binary files /dev/null and b/public/assets/images/g/stripe/0034b8a16c2ab4b9f34a.w768.webp differ diff --git a/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w1280.avif b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w1280.avif new file mode 100644 index 0000000..8daa5c1 Binary files /dev/null and b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w1280.avif differ diff --git a/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w1280.webp b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w1280.webp new file mode 100644 index 0000000..9395d1c Binary files /dev/null and b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w1280.webp differ diff --git a/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w1600.avif b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w1600.avif new file mode 100644 index 0000000..9c61144 Binary files /dev/null and b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w1600.avif differ diff --git a/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w1600.webp b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w1600.webp new file mode 100644 index 0000000..453b13e Binary files /dev/null and b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w1600.webp differ diff --git a/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w384.avif b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w384.avif new file mode 100644 index 0000000..736f82c Binary files /dev/null and b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w384.avif differ diff --git a/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w384.webp b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w384.webp new file mode 100644 index 0000000..5985c51 Binary files /dev/null and b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w384.webp differ diff --git a/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w768.avif b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w768.avif new file mode 100644 index 0000000..538a760 Binary files /dev/null and b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w768.avif differ diff --git a/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w768.webp b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w768.webp new file mode 100644 index 0000000..911a861 Binary files /dev/null and b/public/assets/images/g/template-editor/te-empty-editor/8babe23df3d20dff3157.w768.webp differ diff --git a/public/assets/images/g/template-editor/te-image-add-flow/96f384ffc465e98a0054.w384.avif b/public/assets/images/g/template-editor/te-image-add-flow/96f384ffc465e98a0054.w384.avif new file mode 100644 index 0000000..a75894b Binary files /dev/null and b/public/assets/images/g/template-editor/te-image-add-flow/96f384ffc465e98a0054.w384.avif differ diff --git a/public/assets/images/g/template-editor/te-image-add-flow/96f384ffc465e98a0054.w384.webp b/public/assets/images/g/template-editor/te-image-add-flow/96f384ffc465e98a0054.w384.webp new file mode 100644 index 0000000..d1c9518 Binary files /dev/null and b/public/assets/images/g/template-editor/te-image-add-flow/96f384ffc465e98a0054.w384.webp differ diff --git a/public/assets/images/g/template-editor/te-image-add-flow/96f384ffc465e98a0054.w560.avif b/public/assets/images/g/template-editor/te-image-add-flow/96f384ffc465e98a0054.w560.avif new file mode 100644 index 0000000..6c9a5c3 Binary files /dev/null and b/public/assets/images/g/template-editor/te-image-add-flow/96f384ffc465e98a0054.w560.avif differ diff --git a/public/assets/images/g/template-editor/te-image-add-flow/96f384ffc465e98a0054.w560.webp b/public/assets/images/g/template-editor/te-image-add-flow/96f384ffc465e98a0054.w560.webp new file mode 100644 index 0000000..95fefe7 Binary files /dev/null and b/public/assets/images/g/template-editor/te-image-add-flow/96f384ffc465e98a0054.w560.webp differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w1280.avif b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w1280.avif new file mode 100644 index 0000000..897173d Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w1280.avif differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w1280.webp b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w1280.webp new file mode 100644 index 0000000..3142343 Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w1280.webp differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w1600.avif b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w1600.avif new file mode 100644 index 0000000..501290a Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w1600.avif differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w1600.webp b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w1600.webp new file mode 100644 index 0000000..de39e54 Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w1600.webp differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w384.avif b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w384.avif new file mode 100644 index 0000000..342841d Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w384.avif differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w384.webp b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w384.webp new file mode 100644 index 0000000..93b1a7f Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w384.webp differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w768.avif b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w768.avif new file mode 100644 index 0000000..620e753 Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w768.avif differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w768.webp b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w768.webp new file mode 100644 index 0000000..36c66b7 Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-editor/938f1952e40503d33104.w768.webp differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w384.avif b/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w384.avif new file mode 100644 index 0000000..638bc06 Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w384.avif differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w384.webp b/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w384.webp new file mode 100644 index 0000000..d866a8c Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w384.webp differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w768.avif b/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w768.avif new file mode 100644 index 0000000..091097d Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w768.avif differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w768.webp b/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w768.webp new file mode 100644 index 0000000..a113135 Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w768.webp differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w830.avif b/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w830.avif new file mode 100644 index 0000000..4ae545f Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w830.avif differ diff --git a/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w830.webp b/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w830.webp new file mode 100644 index 0000000..870d6ca Binary files /dev/null and b/public/assets/images/g/template-editor/te-quote-preset-variables-preview-sidebar/5a846cd1981045d02b30.w830.webp differ diff --git a/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w1280.avif b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w1280.avif new file mode 100644 index 0000000..8d7b7da Binary files /dev/null and b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w1280.avif differ diff --git a/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w1280.webp b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w1280.webp new file mode 100644 index 0000000..1fbc0d1 Binary files /dev/null and b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w1280.webp differ diff --git a/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w1600.avif b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w1600.avif new file mode 100644 index 0000000..6f94c87 Binary files /dev/null and b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w1600.avif differ diff --git a/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w1600.webp b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w1600.webp new file mode 100644 index 0000000..0f558bc Binary files /dev/null and b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w1600.webp differ diff --git a/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w384.avif b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w384.avif new file mode 100644 index 0000000..bd3feb3 Binary files /dev/null and b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w384.avif differ diff --git a/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w384.webp b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w384.webp new file mode 100644 index 0000000..59187f0 Binary files /dev/null and b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w384.webp differ diff --git a/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w768.avif b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w768.avif new file mode 100644 index 0000000..d7ddd2f Binary files /dev/null and b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w768.avif differ diff --git a/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w768.webp b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w768.webp new file mode 100644 index 0000000..a396d75 Binary files /dev/null and b/public/assets/images/g/template-editor/te-rich-text-typography-editor/0b335257e37fdbdac048.w768.webp differ diff --git a/public/assets/images/g/template/c967a03ead5a4f46f299.w1000.avif b/public/assets/images/g/template/c967a03ead5a4f46f299.w1000.avif new file mode 100644 index 0000000..fab8d48 Binary files /dev/null and b/public/assets/images/g/template/c967a03ead5a4f46f299.w1000.avif differ diff --git a/public/assets/images/g/template/c967a03ead5a4f46f299.w1000.webp b/public/assets/images/g/template/c967a03ead5a4f46f299.w1000.webp new file mode 100644 index 0000000..dbae08a Binary files /dev/null and b/public/assets/images/g/template/c967a03ead5a4f46f299.w1000.webp differ diff --git a/public/assets/images/g/template/c967a03ead5a4f46f299.w384.avif b/public/assets/images/g/template/c967a03ead5a4f46f299.w384.avif new file mode 100644 index 0000000..f2ea9be Binary files /dev/null and b/public/assets/images/g/template/c967a03ead5a4f46f299.w384.avif differ diff --git a/public/assets/images/g/template/c967a03ead5a4f46f299.w384.webp b/public/assets/images/g/template/c967a03ead5a4f46f299.w384.webp new file mode 100644 index 0000000..0422da3 Binary files /dev/null and b/public/assets/images/g/template/c967a03ead5a4f46f299.w384.webp differ diff --git a/public/assets/images/g/template/c967a03ead5a4f46f299.w768.avif b/public/assets/images/g/template/c967a03ead5a4f46f299.w768.avif new file mode 100644 index 0000000..852df0e Binary files /dev/null and b/public/assets/images/g/template/c967a03ead5a4f46f299.w768.avif differ diff --git a/public/assets/images/g/template/c967a03ead5a4f46f299.w768.webp b/public/assets/images/g/template/c967a03ead5a4f46f299.w768.webp new file mode 100644 index 0000000..15273b4 Binary files /dev/null and b/public/assets/images/g/template/c967a03ead5a4f46f299.w768.webp differ diff --git a/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w1030.avif b/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w1030.avif new file mode 100644 index 0000000..b86a59b Binary files /dev/null and b/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w1030.avif differ diff --git a/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w1030.webp b/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w1030.webp new file mode 100644 index 0000000..aa83e51 Binary files /dev/null and b/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w1030.webp differ diff --git a/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w384.avif b/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w384.avif new file mode 100644 index 0000000..f99f5e6 Binary files /dev/null and b/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w384.avif differ diff --git a/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w384.webp b/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w384.webp new file mode 100644 index 0000000..7b4dbd2 Binary files /dev/null and b/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w384.webp differ diff --git a/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w768.avif b/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w768.avif new file mode 100644 index 0000000..582f795 Binary files /dev/null and b/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w768.avif differ diff --git a/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w768.webp b/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w768.webp new file mode 100644 index 0000000..b6f3cf6 Binary files /dev/null and b/public/assets/images/g/textshot2/90d4a0a78917f68f2fe6.w768.webp differ diff --git a/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w1280.avif b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w1280.avif new file mode 100644 index 0000000..9303ade Binary files /dev/null and b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w1280.avif differ diff --git a/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w1280.webp b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w1280.webp new file mode 100644 index 0000000..25399f4 Binary files /dev/null and b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w1280.webp differ diff --git a/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w1456.avif b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w1456.avif new file mode 100644 index 0000000..b7ee3e7 Binary files /dev/null and b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w1456.avif differ diff --git a/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w1456.webp b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w1456.webp new file mode 100644 index 0000000..dd04914 Binary files /dev/null and b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w1456.webp differ diff --git a/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w384.avif b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w384.avif new file mode 100644 index 0000000..db44492 Binary files /dev/null and b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w384.avif differ diff --git a/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w384.webp b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w384.webp new file mode 100644 index 0000000..e3aaaab Binary files /dev/null and b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w384.webp differ diff --git a/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w768.avif b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w768.avif new file mode 100644 index 0000000..df26dd0 Binary files /dev/null and b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w768.avif differ diff --git a/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w768.webp b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w768.webp new file mode 100644 index 0000000..079e833 Binary files /dev/null and b/public/assets/images/g/url-selector-example/20658bfa0444d6e5e10a.w768.webp differ diff --git a/public/assets/images/g/w400/e2871676506cb9e73176.w384.avif b/public/assets/images/g/w400/e2871676506cb9e73176.w384.avif new file mode 100644 index 0000000..65e704d Binary files /dev/null and b/public/assets/images/g/w400/e2871676506cb9e73176.w384.avif differ diff --git a/public/assets/images/g/w400/e2871676506cb9e73176.w384.webp b/public/assets/images/g/w400/e2871676506cb9e73176.w384.webp new file mode 100644 index 0000000..f827399 Binary files /dev/null and b/public/assets/images/g/w400/e2871676506cb9e73176.w384.webp differ diff --git a/public/assets/images/g/w400/e2871676506cb9e73176.w400.avif b/public/assets/images/g/w400/e2871676506cb9e73176.w400.avif new file mode 100644 index 0000000..49d28e2 Binary files /dev/null and b/public/assets/images/g/w400/e2871676506cb9e73176.w400.avif differ diff --git a/public/assets/images/g/w400/e2871676506cb9e73176.w400.webp b/public/assets/images/g/w400/e2871676506cb9e73176.w400.webp new file mode 100644 index 0000000..0bb7e95 Binary files /dev/null and b/public/assets/images/g/w400/e2871676506cb9e73176.w400.webp differ diff --git a/public/assets/images/g/zapier/527775b56448b333c6d5.w1280.avif b/public/assets/images/g/zapier/527775b56448b333c6d5.w1280.avif new file mode 100644 index 0000000..9281986 Binary files /dev/null and b/public/assets/images/g/zapier/527775b56448b333c6d5.w1280.avif differ diff --git a/public/assets/images/g/zapier/527775b56448b333c6d5.w1280.webp b/public/assets/images/g/zapier/527775b56448b333c6d5.w1280.webp new file mode 100644 index 0000000..658fee4 Binary files /dev/null and b/public/assets/images/g/zapier/527775b56448b333c6d5.w1280.webp differ diff --git a/public/assets/images/g/zapier/527775b56448b333c6d5.w1600.avif b/public/assets/images/g/zapier/527775b56448b333c6d5.w1600.avif new file mode 100644 index 0000000..19865ee Binary files /dev/null and b/public/assets/images/g/zapier/527775b56448b333c6d5.w1600.avif differ diff --git a/public/assets/images/g/zapier/527775b56448b333c6d5.w1600.webp b/public/assets/images/g/zapier/527775b56448b333c6d5.w1600.webp new file mode 100644 index 0000000..27a8955 Binary files /dev/null and b/public/assets/images/g/zapier/527775b56448b333c6d5.w1600.webp differ diff --git a/public/assets/images/g/zapier/527775b56448b333c6d5.w384.avif b/public/assets/images/g/zapier/527775b56448b333c6d5.w384.avif new file mode 100644 index 0000000..ce1630e Binary files /dev/null and b/public/assets/images/g/zapier/527775b56448b333c6d5.w384.avif differ diff --git a/public/assets/images/g/zapier/527775b56448b333c6d5.w384.webp b/public/assets/images/g/zapier/527775b56448b333c6d5.w384.webp new file mode 100644 index 0000000..95df9d8 Binary files /dev/null and b/public/assets/images/g/zapier/527775b56448b333c6d5.w384.webp differ diff --git a/public/assets/images/g/zapier/527775b56448b333c6d5.w768.avif b/public/assets/images/g/zapier/527775b56448b333c6d5.w768.avif new file mode 100644 index 0000000..28c7dfe Binary files /dev/null and b/public/assets/images/g/zapier/527775b56448b333c6d5.w768.avif differ diff --git a/public/assets/images/g/zapier/527775b56448b333c6d5.w768.webp b/public/assets/images/g/zapier/527775b56448b333c6d5.w768.webp new file mode 100644 index 0000000..6bba772 Binary files /dev/null and b/public/assets/images/g/zapier/527775b56448b333c6d5.w768.webp differ diff --git a/assets/images/generated-with-code.png b/public/assets/images/generated-with-code.png similarity index 100% rename from assets/images/generated-with-code.png rename to public/assets/images/generated-with-code.png diff --git a/assets/images/google.jpg b/public/assets/images/google.jpg similarity index 100% rename from assets/images/google.jpg rename to public/assets/images/google.jpg diff --git a/assets/images/h300.jpeg b/public/assets/images/h300.jpeg similarity index 100% rename from assets/images/h300.jpeg rename to public/assets/images/h300.jpeg diff --git a/public/assets/images/hcti-logo.svg b/public/assets/images/hcti-logo.svg new file mode 100644 index 0000000..219c2e7 --- /dev/null +++ b/public/assets/images/hcti-logo.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/hero/demo.png b/public/assets/images/hero/demo.png similarity index 100% rename from assets/images/hero/demo.png rename to public/assets/images/hero/demo.png diff --git a/assets/images/hero/templateeditor.png b/public/assets/images/hero/templateeditor.png similarity index 100% rename from assets/images/hero/templateeditor.png rename to public/assets/images/hero/templateeditor.png diff --git a/assets/images/hero/url-reader.png b/public/assets/images/hero/url-reader.png similarity index 100% rename from assets/images/hero/url-reader.png rename to public/assets/images/hero/url-reader.png diff --git a/assets/images/hero/urls.png b/public/assets/images/hero/urls.png similarity index 100% rename from assets/images/hero/urls.png rename to public/assets/images/hero/urls.png diff --git a/assets/images/html-css-to-image.png b/public/assets/images/html-css-to-image.png similarity index 100% rename from assets/images/html-css-to-image.png rename to public/assets/images/html-css-to-image.png diff --git a/assets/images/image (1).png b/public/assets/images/image (1).png similarity index 100% rename from assets/images/image (1).png rename to public/assets/images/image (1).png diff --git a/assets/images/image (10).png b/public/assets/images/image (10).png similarity index 100% rename from assets/images/image (10).png rename to public/assets/images/image (10).png diff --git a/assets/images/image (11).png b/public/assets/images/image (11).png similarity index 100% rename from assets/images/image (11).png rename to public/assets/images/image (11).png diff --git a/assets/images/image (12).png b/public/assets/images/image (12).png similarity index 100% rename from assets/images/image (12).png rename to public/assets/images/image (12).png diff --git a/assets/images/image (13).png b/public/assets/images/image (13).png similarity index 100% rename from assets/images/image (13).png rename to public/assets/images/image (13).png diff --git a/assets/images/image (14).png b/public/assets/images/image (14).png similarity index 100% rename from assets/images/image (14).png rename to public/assets/images/image (14).png diff --git a/assets/images/image (15).png b/public/assets/images/image (15).png similarity index 100% rename from assets/images/image (15).png rename to public/assets/images/image (15).png diff --git a/assets/images/image (16).png b/public/assets/images/image (16).png similarity index 100% rename from assets/images/image (16).png rename to public/assets/images/image (16).png diff --git a/assets/images/image (17).png b/public/assets/images/image (17).png similarity index 100% rename from assets/images/image (17).png rename to public/assets/images/image (17).png diff --git a/assets/images/image (18).png b/public/assets/images/image (18).png similarity index 100% rename from assets/images/image (18).png rename to public/assets/images/image (18).png diff --git a/assets/images/image (19).png b/public/assets/images/image (19).png similarity index 100% rename from assets/images/image (19).png rename to public/assets/images/image (19).png diff --git a/assets/images/image (2).png b/public/assets/images/image (2).png similarity index 100% rename from assets/images/image (2).png rename to public/assets/images/image (2).png diff --git a/assets/images/image (20).png b/public/assets/images/image (20).png similarity index 100% rename from assets/images/image (20).png rename to public/assets/images/image (20).png diff --git a/assets/images/image (21).png b/public/assets/images/image (21).png similarity index 100% rename from assets/images/image (21).png rename to public/assets/images/image (21).png diff --git a/assets/images/image (23).png b/public/assets/images/image (23).png similarity index 100% rename from assets/images/image (23).png rename to public/assets/images/image (23).png diff --git a/assets/images/image (3).png b/public/assets/images/image (3).png similarity index 100% rename from assets/images/image (3).png rename to public/assets/images/image (3).png diff --git a/assets/images/image (4).png b/public/assets/images/image (4).png similarity index 100% rename from assets/images/image (4).png rename to public/assets/images/image (4).png diff --git a/assets/images/image (5).png b/public/assets/images/image (5).png similarity index 100% rename from assets/images/image (5).png rename to public/assets/images/image (5).png diff --git a/assets/images/image (6).png b/public/assets/images/image (6).png similarity index 100% rename from assets/images/image (6).png rename to public/assets/images/image (6).png diff --git a/assets/images/image (7).png b/public/assets/images/image (7).png similarity index 100% rename from assets/images/image (7).png rename to public/assets/images/image (7).png diff --git a/assets/images/image (8).png b/public/assets/images/image (8).png similarity index 100% rename from assets/images/image (8).png rename to public/assets/images/image (8).png diff --git a/assets/images/image (9).png b/public/assets/images/image (9).png similarity index 100% rename from assets/images/image (9).png rename to public/assets/images/image (9).png diff --git a/assets/images/image-2018-11-01-at-9.09.44-am.png b/public/assets/images/image-2018-11-01-at-9.09.44-am.png similarity index 100% rename from assets/images/image-2018-11-01-at-9.09.44-am.png rename to public/assets/images/image-2018-11-01-at-9.09.44-am.png diff --git a/assets/images/image-2018-11-01-at-9.10.03-am.png b/public/assets/images/image-2018-11-01-at-9.10.03-am.png similarity index 100% rename from assets/images/image-2018-11-01-at-9.10.03-am.png rename to public/assets/images/image-2018-11-01-at-9.10.03-am.png diff --git a/assets/images/image-2018-11-21-at-10.54.37-am.png b/public/assets/images/image-2018-11-21-at-10.54.37-am.png similarity index 100% rename from assets/images/image-2018-11-21-at-10.54.37-am.png rename to public/assets/images/image-2018-11-21-at-10.54.37-am.png diff --git a/assets/images/image-2019-01-27-at-5.57.52-pm.png b/public/assets/images/image-2019-01-27-at-5.57.52-pm.png similarity index 100% rename from assets/images/image-2019-01-27-at-5.57.52-pm.png rename to public/assets/images/image-2019-01-27-at-5.57.52-pm.png diff --git a/assets/images/image.png b/public/assets/images/image.png similarity index 100% rename from assets/images/image.png rename to public/assets/images/image.png diff --git a/assets/images/insomnia1.png b/public/assets/images/insomnia1.png similarity index 100% rename from assets/images/insomnia1.png rename to public/assets/images/insomnia1.png diff --git a/assets/images/insomnia2.png b/public/assets/images/insomnia2.png similarity index 100% rename from assets/images/insomnia2.png rename to public/assets/images/insomnia2.png diff --git a/assets/images/insta-embed.png b/public/assets/images/insta-embed.png similarity index 100% rename from assets/images/insta-embed.png rename to public/assets/images/insta-embed.png diff --git a/assets/images/instagram.png b/public/assets/images/instagram.png similarity index 100% rename from assets/images/instagram.png rename to public/assets/images/instagram.png diff --git a/assets/images/integromat.png b/public/assets/images/integromat.png similarity index 100% rename from assets/images/integromat.png rename to public/assets/images/integromat.png diff --git a/assets/images/javascript.jpeg b/public/assets/images/javascript.jpeg similarity index 100% rename from assets/images/javascript.jpeg rename to public/assets/images/javascript.jpeg diff --git a/assets/images/jobad.jpeg b/public/assets/images/jobad.jpeg similarity index 100% rename from assets/images/jobad.jpeg rename to public/assets/images/jobad.jpeg diff --git a/assets/images/linkedin.png b/public/assets/images/linkedin.png similarity index 100% rename from assets/images/linkedin.png rename to public/assets/images/linkedin.png diff --git a/public/assets/images/logos/airtable_logo.svg b/public/assets/images/logos/airtable_logo.svg new file mode 100644 index 0000000..7f206f9 --- /dev/null +++ b/public/assets/images/logos/airtable_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/logos/coldwell_banker_logo.svg b/public/assets/images/logos/coldwell_banker_logo.svg new file mode 100644 index 0000000..dead77a --- /dev/null +++ b/public/assets/images/logos/coldwell_banker_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/logos/expensify_logo.svg b/public/assets/images/logos/expensify_logo.svg new file mode 100644 index 0000000..57e8bbf --- /dev/null +++ b/public/assets/images/logos/expensify_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/logos/hubspot_logo.svg b/public/assets/images/logos/hubspot_logo.svg new file mode 100644 index 0000000..dab5353 --- /dev/null +++ b/public/assets/images/logos/hubspot_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/logos/monday_logo.svg b/public/assets/images/logos/monday_logo.svg new file mode 100644 index 0000000..884b660 --- /dev/null +++ b/public/assets/images/logos/monday_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/logos/planetscale_logo.svg b/public/assets/images/logos/planetscale_logo.svg new file mode 100644 index 0000000..880d76e --- /dev/null +++ b/public/assets/images/logos/planetscale_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/logos/uber_logo.svg b/public/assets/images/logos/uber_logo.svg new file mode 100644 index 0000000..934ae08 --- /dev/null +++ b/public/assets/images/logos/uber_logo.svg @@ -0,0 +1 @@ + diff --git a/public/assets/images/logos/wayfair_logo.svg b/public/assets/images/logos/wayfair_logo.svg new file mode 100644 index 0000000..bc8a176 --- /dev/null +++ b/public/assets/images/logos/wayfair_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/images/logos/yamaha_logo.svg b/public/assets/images/logos/yamaha_logo.svg new file mode 100644 index 0000000..e309535 --- /dev/null +++ b/public/assets/images/logos/yamaha_logo.svg @@ -0,0 +1 @@ + diff --git a/assets/images/make.png b/public/assets/images/make.png similarity index 100% rename from assets/images/make.png rename to public/assets/images/make.png diff --git a/assets/images/migration b/public/assets/images/migration similarity index 100% rename from assets/images/migration rename to public/assets/images/migration diff --git a/assets/images/postman1.png b/public/assets/images/postman1.png similarity index 100% rename from assets/images/postman1.png rename to public/assets/images/postman1.png diff --git a/assets/images/postman2.png b/public/assets/images/postman2.png similarity index 100% rename from assets/images/postman2.png rename to public/assets/images/postman2.png diff --git a/assets/images/postman3.png b/public/assets/images/postman3.png similarity index 100% rename from assets/images/postman3.png rename to public/assets/images/postman3.png diff --git a/assets/images/proxies-dashboard.png b/public/assets/images/proxies-dashboard.png similarity index 100% rename from assets/images/proxies-dashboard.png rename to public/assets/images/proxies-dashboard.png diff --git a/assets/images/react.png b/public/assets/images/react.png similarity index 100% rename from assets/images/react.png rename to public/assets/images/react.png diff --git a/assets/images/selector-example.png b/public/assets/images/selector-example.png similarity index 100% rename from assets/images/selector-example.png rename to public/assets/images/selector-example.png diff --git a/assets/images/slack-email-1.png b/public/assets/images/slack-email-1.png similarity index 100% rename from assets/images/slack-email-1.png rename to public/assets/images/slack-email-1.png diff --git a/assets/images/slack-email-2.png b/public/assets/images/slack-email-2.png similarity index 100% rename from assets/images/slack-email-2.png rename to public/assets/images/slack-email-2.png diff --git a/assets/images/slack-email-3.png b/public/assets/images/slack-email-3.png similarity index 100% rename from assets/images/slack-email-3.png rename to public/assets/images/slack-email-3.png diff --git a/assets/images/slack-email-4.png b/public/assets/images/slack-email-4.png similarity index 100% rename from assets/images/slack-email-4.png rename to public/assets/images/slack-email-4.png diff --git a/assets/images/slack-email-5.png b/public/assets/images/slack-email-5.png similarity index 100% rename from assets/images/slack-email-5.png rename to public/assets/images/slack-email-5.png diff --git a/assets/images/slack-email-6.png b/public/assets/images/slack-email-6.png similarity index 100% rename from assets/images/slack-email-6.png rename to public/assets/images/slack-email-6.png diff --git a/assets/images/slack-email-7.png b/public/assets/images/slack-email-7.png similarity index 100% rename from assets/images/slack-email-7.png rename to public/assets/images/slack-email-7.png diff --git a/assets/images/slack-email-8.gif b/public/assets/images/slack-email-8.gif similarity index 100% rename from assets/images/slack-email-8.gif rename to public/assets/images/slack-email-8.gif diff --git a/assets/images/slack-email.png b/public/assets/images/slack-email.png similarity index 100% rename from assets/images/slack-email.png rename to public/assets/images/slack-email.png diff --git a/assets/images/stripe.png b/public/assets/images/stripe.png similarity index 100% rename from assets/images/stripe.png rename to public/assets/images/stripe.png diff --git a/assets/images/template-editor-hard-hat-solid.svg b/public/assets/images/template-editor-hard-hat-solid.svg similarity index 100% rename from assets/images/template-editor-hard-hat-solid.svg rename to public/assets/images/template-editor-hard-hat-solid.svg diff --git a/assets/images/template-editor-hard-hat.svg b/public/assets/images/template-editor-hard-hat.svg similarity index 100% rename from assets/images/template-editor-hard-hat.svg rename to public/assets/images/template-editor-hard-hat.svg diff --git a/assets/images/template-editor/original_screenshots/add_grid.png b/public/assets/images/template-editor/original_screenshots/add_grid.png similarity index 100% rename from assets/images/template-editor/original_screenshots/add_grid.png rename to public/assets/images/template-editor/original_screenshots/add_grid.png diff --git a/assets/images/template-editor/original_screenshots/add_image.png b/public/assets/images/template-editor/original_screenshots/add_image.png similarity index 100% rename from assets/images/template-editor/original_screenshots/add_image.png rename to public/assets/images/template-editor/original_screenshots/add_image.png diff --git a/assets/images/template-editor/original_screenshots/add_shape.png b/public/assets/images/template-editor/original_screenshots/add_shape.png similarity index 100% rename from assets/images/template-editor/original_screenshots/add_shape.png rename to public/assets/images/template-editor/original_screenshots/add_shape.png diff --git a/assets/images/template-editor/original_screenshots/add_table.png b/public/assets/images/template-editor/original_screenshots/add_table.png similarity index 100% rename from assets/images/template-editor/original_screenshots/add_table.png rename to public/assets/images/template-editor/original_screenshots/add_table.png diff --git a/assets/images/template-editor/original_screenshots/arrange_align.png b/public/assets/images/template-editor/original_screenshots/arrange_align.png similarity index 100% rename from assets/images/template-editor/original_screenshots/arrange_align.png rename to public/assets/images/template-editor/original_screenshots/arrange_align.png diff --git a/assets/images/template-editor/original_screenshots/arrange_layer_order.png b/public/assets/images/template-editor/original_screenshots/arrange_layer_order.png similarity index 100% rename from assets/images/template-editor/original_screenshots/arrange_layer_order.png rename to public/assets/images/template-editor/original_screenshots/arrange_layer_order.png diff --git a/assets/images/template-editor/original_screenshots/background.png b/public/assets/images/template-editor/original_screenshots/background.png similarity index 100% rename from assets/images/template-editor/original_screenshots/background.png rename to public/assets/images/template-editor/original_screenshots/background.png diff --git a/assets/images/template-editor/original_screenshots/bg_gradient.png b/public/assets/images/template-editor/original_screenshots/bg_gradient.png similarity index 100% rename from assets/images/template-editor/original_screenshots/bg_gradient.png rename to public/assets/images/template-editor/original_screenshots/bg_gradient.png diff --git a/assets/images/template-editor/original_screenshots/bg_pattern.png b/public/assets/images/template-editor/original_screenshots/bg_pattern.png similarity index 100% rename from assets/images/template-editor/original_screenshots/bg_pattern.png rename to public/assets/images/template-editor/original_screenshots/bg_pattern.png diff --git a/assets/images/template-editor/original_screenshots/border_adv1.png b/public/assets/images/template-editor/original_screenshots/border_adv1.png similarity index 100% rename from assets/images/template-editor/original_screenshots/border_adv1.png rename to public/assets/images/template-editor/original_screenshots/border_adv1.png diff --git a/assets/images/template-editor/original_screenshots/empty.png b/public/assets/images/template-editor/original_screenshots/empty.png similarity index 100% rename from assets/images/template-editor/original_screenshots/empty.png rename to public/assets/images/template-editor/original_screenshots/empty.png diff --git a/assets/images/template-editor/original_screenshots/quote_full.png b/public/assets/images/template-editor/original_screenshots/quote_full.png similarity index 100% rename from assets/images/template-editor/original_screenshots/quote_full.png rename to public/assets/images/template-editor/original_screenshots/quote_full.png diff --git a/assets/images/template-editor/original_screenshots/quote_var_empty.png b/public/assets/images/template-editor/original_screenshots/quote_var_empty.png similarity index 100% rename from assets/images/template-editor/original_screenshots/quote_var_empty.png rename to public/assets/images/template-editor/original_screenshots/quote_var_empty.png diff --git a/assets/images/template-editor/original_screenshots/rich_text_typography.png b/public/assets/images/template-editor/original_screenshots/rich_text_typography.png similarity index 100% rename from assets/images/template-editor/original_screenshots/rich_text_typography.png rename to public/assets/images/template-editor/original_screenshots/rich_text_typography.png diff --git a/assets/images/template-editor/original_screenshots/simple_text_auto_size.gif b/public/assets/images/template-editor/original_screenshots/simple_text_auto_size.gif similarity index 100% rename from assets/images/template-editor/original_screenshots/simple_text_auto_size.gif rename to public/assets/images/template-editor/original_screenshots/simple_text_auto_size.gif diff --git a/assets/images/template-editor/te-background-gradient-sidebar.png b/public/assets/images/template-editor/te-background-gradient-sidebar.png similarity index 100% rename from assets/images/template-editor/te-background-gradient-sidebar.png rename to public/assets/images/template-editor/te-background-gradient-sidebar.png diff --git a/assets/images/template-editor/te-background-pattern-sidebar.png b/public/assets/images/template-editor/te-background-pattern-sidebar.png similarity index 100% rename from assets/images/template-editor/te-background-pattern-sidebar.png rename to public/assets/images/template-editor/te-background-pattern-sidebar.png diff --git a/assets/images/template-editor/te-background-solid-sidebar.png b/public/assets/images/template-editor/te-background-solid-sidebar.png similarity index 100% rename from assets/images/template-editor/te-background-solid-sidebar.png rename to public/assets/images/template-editor/te-background-solid-sidebar.png diff --git a/assets/images/template-editor/te-border-advanced-sidebar.png b/public/assets/images/template-editor/te-border-advanced-sidebar.png similarity index 100% rename from assets/images/template-editor/te-border-advanced-sidebar.png rename to public/assets/images/template-editor/te-border-advanced-sidebar.png diff --git a/assets/images/template-editor/te-empty-editor.png b/public/assets/images/template-editor/te-empty-editor.png similarity index 100% rename from assets/images/template-editor/te-empty-editor.png rename to public/assets/images/template-editor/te-empty-editor.png diff --git a/assets/images/template-editor/te-grid-add-flow.png b/public/assets/images/template-editor/te-grid-add-flow.png similarity index 100% rename from assets/images/template-editor/te-grid-add-flow.png rename to public/assets/images/template-editor/te-grid-add-flow.png diff --git a/assets/images/template-editor/te-image-add-flow.png b/public/assets/images/template-editor/te-image-add-flow.png similarity index 100% rename from assets/images/template-editor/te-image-add-flow.png rename to public/assets/images/template-editor/te-image-add-flow.png diff --git a/assets/images/template-editor/te-quote-preset-editor.png b/public/assets/images/template-editor/te-quote-preset-editor.png similarity index 100% rename from assets/images/template-editor/te-quote-preset-editor.png rename to public/assets/images/template-editor/te-quote-preset-editor.png diff --git a/assets/images/template-editor/te-quote-preset-variables-preview-sidebar.png b/public/assets/images/template-editor/te-quote-preset-variables-preview-sidebar.png similarity index 100% rename from assets/images/template-editor/te-quote-preset-variables-preview-sidebar.png rename to public/assets/images/template-editor/te-quote-preset-variables-preview-sidebar.png diff --git a/assets/images/template-editor/te-rich-text-typography-editor.png b/public/assets/images/template-editor/te-rich-text-typography-editor.png similarity index 100% rename from assets/images/template-editor/te-rich-text-typography-editor.png rename to public/assets/images/template-editor/te-rich-text-typography-editor.png diff --git a/assets/images/template-editor/te-shape-add-flow.png b/public/assets/images/template-editor/te-shape-add-flow.png similarity index 100% rename from assets/images/template-editor/te-shape-add-flow.png rename to public/assets/images/template-editor/te-shape-add-flow.png diff --git a/assets/images/template-editor/te-simple-text-auto-size.gif b/public/assets/images/template-editor/te-simple-text-auto-size.gif similarity index 100% rename from assets/images/template-editor/te-simple-text-auto-size.gif rename to public/assets/images/template-editor/te-simple-text-auto-size.gif diff --git a/assets/images/template-editor/te-table-add-flow.png b/public/assets/images/template-editor/te-table-add-flow.png similarity index 100% rename from assets/images/template-editor/te-table-add-flow.png rename to public/assets/images/template-editor/te-table-add-flow.png diff --git a/assets/images/template-editor/te-table-panel-properties-sidebar.png b/public/assets/images/template-editor/te-table-panel-properties-sidebar.png similarity index 100% rename from assets/images/template-editor/te-table-panel-properties-sidebar.png rename to public/assets/images/template-editor/te-table-panel-properties-sidebar.png diff --git a/assets/images/template-editor/te-text-typography-sidebar.png b/public/assets/images/template-editor/te-text-typography-sidebar.png similarity index 100% rename from assets/images/template-editor/te-text-typography-sidebar.png rename to public/assets/images/template-editor/te-text-typography-sidebar.png diff --git a/assets/images/template.png b/public/assets/images/template.png similarity index 100% rename from assets/images/template.png rename to public/assets/images/template.png diff --git a/assets/images/template_example.png b/public/assets/images/template_example.png similarity index 100% rename from assets/images/template_example.png rename to public/assets/images/template_example.png diff --git a/assets/images/textshot2.png b/public/assets/images/textshot2.png similarity index 100% rename from assets/images/textshot2.png rename to public/assets/images/textshot2.png diff --git a/assets/images/tweet.png b/public/assets/images/tweet.png similarity index 100% rename from assets/images/tweet.png rename to public/assets/images/tweet.png diff --git a/assets/images/url-selector-example.png b/public/assets/images/url-selector-example.png similarity index 100% rename from assets/images/url-selector-example.png rename to public/assets/images/url-selector-example.png diff --git a/assets/images/w400.jpeg b/public/assets/images/w400.jpeg similarity index 100% rename from assets/images/w400.jpeg rename to public/assets/images/w400.jpeg diff --git a/assets/images/w400h400.jpeg b/public/assets/images/w400h400.jpeg similarity index 100% rename from assets/images/w400h400.jpeg rename to public/assets/images/w400h400.jpeg diff --git a/assets/images/zap2.png b/public/assets/images/zap2.png similarity index 100% rename from assets/images/zap2.png rename to public/assets/images/zap2.png diff --git a/assets/images/zapier.png b/public/assets/images/zapier.png similarity index 100% rename from assets/images/zapier.png rename to public/assets/images/zapier.png diff --git a/public/context7.json b/public/context7.json new file mode 100644 index 0000000..f2bcb7d --- /dev/null +++ b/public/context7.json @@ -0,0 +1,4 @@ +{ + "url": "https://context7.com/websites/htmlcsstoimage", + "public_key": "pk_5RtBQ3GyczgUgrH2T8pj7" +} \ No newline at end of file diff --git a/favicon.ico b/public/favicon.ico similarity index 100% rename from favicon.ico rename to public/favicon.ico diff --git a/public/search/pagefind.js b/public/search/pagefind.js new file mode 100644 index 0000000..f67356e --- /dev/null +++ b/public/search/pagefind.js @@ -0,0 +1,19 @@ +// Keep Pagefind's relevance order within each group, with release history last. +// Filtering in the index avoids fetching every result's data just to sort it. +export * from '../pagefind/pagefind.js'; +import { createInstance as createIndex } from '../pagefind/pagefind.js'; + +export function createInstance(instanceOptions) { + const index = createIndex(instanceOptions); + return { ...index, search: (term, options = {}) => searchGroups(index, term, options) }; +} + +async function searchGroups(index, term, options) { + const [docs, changelog] = await Promise.all( + ['docs', 'changelog'].map(kind => index.search(term, { + ...options, + filters: { ...options.filters, kind }, + })), + ); + return { ...docs, results: [...docs.results, ...changelog.results] }; +} diff --git a/snippets/plain_javascript.js b/public/snippets/plain_javascript.js similarity index 100% rename from snippets/plain_javascript.js rename to public/snippets/plain_javascript.js diff --git a/snippets/plain_php.php b/public/snippets/plain_php.php similarity index 100% rename from snippets/plain_php.php rename to public/snippets/plain_php.php diff --git a/scripts/MARKDOWN.md b/scripts/MARKDOWN.md new file mode 100644 index 0000000..cb0e3a6 --- /dev/null +++ b/scripts/MARKDOWN.md @@ -0,0 +1,53 @@ +# Agent-friendly component output + +The native Astro pages are the source of truth. After Astro renders them, +`markdown-exports.mjs` extracts the article and serializes it as Markdown. +This exports native components; it does not process or migrate Jekyll sources. + +Every documentation component must have a readable static representation: + +- Use semantic headings, paragraphs, lists and links for ordinary content. +- `DocImage` becomes `![alt text](original-image-url)`, followed by its caption. + Responsive variants, styling and the full-size link wrapper are omitted. +- `ParameterTable` generates its own GFM Markdown from the same filtered data + used for its HTML table, preserving parameter links, types, descriptions and inline code. + Pipes in cell content are escaped to avoid creating extra columns. +- `Endpoint` exports its method and URL together as inline code. +- Starlight `LinkCard` exports a linked title followed by its description. +- Code examples retain their fences and newlines. Navigation, copy buttons, + heading-link icons and scripts are excluded. +- For an interactive component, include useful static instructions/content; + do not make browser interaction the only way to access its meaning. + +Component Markdown serializers run only in the build exporter. `ParameterTable` +uses `src/lib/parameter-markdown.mjs` to select and serialize the same data as +its HTML view. During production builds, the table carries a small +`data-build-parameter-table` props marker. The exporter uses it to generate +Markdown, then strips it from the final HTML. Development HTML omits it too. +Never embed Markdown payloads in HTML attributes or ship build markers to clients. + +Test component exports in `tests/markdown.test.mjs`. +Keep the content in the component rather than maintaining a second Markdown copy. +Inspect the built `.md` file when migrating each page. + +The Worker serves the same export for either request: + +```sh +curl -H 'Accept: text/markdown' http://localhost:4321/parameters/ +curl http://localhost:4321/parameters.md +``` + +The root page's direct export is `/index.md`. Negotiation requires an explicit +`text/markdown` preference and respects quality weights; wildcard-only requests +and ordinary browser requests get HTML. An explicit Markdown preference wins +equal quality weights. Page responses advertise `Vary: Accept` and a Markdown +alternate link. Negotiated Markdown uses `Content-Type: text/markdown` and +`Content-Location` pointing to its direct export. Existing redirects run first. +Static Assets receives a distinct `.md` path, keeping its HTML and Markdown +cache entries separate. No HTML-to-Markdown work happens at request time. + +Run `npm test`, `npm run build`, then `node scripts/check-preview.mjs +http://localhost:4321` against `npm run preview`. The preview check covers both +representations and HEAD requests for every native page. The complete migration +gate is `npm run check:migration`; all original routes must exist or redirect. +The same exports also produce `llms.txt` and `llms-full.txt` during each build. diff --git a/scripts/bundle-analysis.mjs b/scripts/bundle-analysis.mjs new file mode 100644 index 0000000..f3e37a3 --- /dev/null +++ b/scripts/bundle-analysis.mjs @@ -0,0 +1,28 @@ +import { visualizer } from 'rollup-plugin-visualizer'; + +// Astro builds multiple Vite environments. Give each a separate report so +// build-time modules cannot overwrite or inflate the browser bundle report. +// Keep reports outside dist so they can never become public assets. +export default function bundleAnalysis() { + return { + name: 'hcti-bundle-analysis', + hooks: { + 'astro:build:setup': ({ updateConfig }) => { + updateConfig({ + plugins: ['client', 'ssr', 'prerender'].flatMap((environment) => + ['html', 'json'].map((format) => ({ + ...visualizer({ + filename: `reports/bundle-${environment}.${format}`, + template: format === 'json' ? 'raw-data' : 'treemap', + gzipSize: true, + brotliSize: true, + open: false, + }), + applyToEnvironment: (env) => env.name === environment, + })), + ), + }); + }, + }, + }; +} diff --git a/scripts/check-preview.mjs b/scripts/check-preview.mjs new file mode 100644 index 0000000..43beb61 --- /dev/null +++ b/scripts/check-preview.mjs @@ -0,0 +1,68 @@ +import assert from 'node:assert/strict'; +import redirects from '../migration/redirects.json' with { type: 'json' }; +import pages from '../src/generated/pages.json' with { type: 'json' }; +import images from '../src/data/images.json' with { type: 'json' }; +const origin = process.argv[2]; +if (!origin || new URL(origin).hostname === 'docs.htmlcsstoimage.com') throw new Error('Pass a preview origin, not production.'); +// Wrangler can present the configured production route as the request host locally. +// Hosted preview checks must always enforce noindex. +const local = ['localhost', '127.0.0.1', '[::1]'].includes(new URL(origin).hostname); +for (const route of [...pages.map(page => page.route), '/llms.txt', '/getting-started/using-the-api.md']) { + const response = await fetch(new URL(route, origin)); + if (response.status !== 200) { + const excerpt = (await response.text()).replace(/\s+/g, ' ').slice(0, 500); + throw new Error(`Preview request failed: ${response.url}\nExpected HTTP 200, received ${response.status}.\nContent-Type: ${response.headers.get('content-type')}\nX-Robots-Tag: ${response.headers.get('x-robots-tag')}\nResponse: ${excerpt}\nConfirm the preview URL printed by Wrangler and that Preview URLs are enabled for the Worker before diagnosing this as a missing page.`); + } + if (!local) assert.match(response.headers.get('x-robots-tag') || '', /noindex/, route); +} +for (const page of pages) { + const url = new URL(page.route, origin); + const html = await fetch(url); + assert.match(html.headers.get('content-type') || '', /text\/html/, page.route); + assert.match(html.headers.get('vary') || '', /Accept/i, page.route); + const markdown = await fetch(url, { headers: { Accept: 'text/markdown' } }); + assert.equal(markdown.status, 200, page.route); + assert.match(markdown.headers.get('content-type') || '', /text\/markdown/, page.route); + assert.match(markdown.headers.get('vary') || '', /Accept/i, page.route); + const body = await markdown.text(); + assert.ok(body.startsWith(`# ${page.title}\n`), page.route); + assert.equal(body, await (await fetch(new URL(page.markdownPath, origin))).text(), page.route); + const head = await fetch(url, { method: 'HEAD', headers: { Accept: 'text/markdown' } }); + assert.equal(head.status, 200, page.route); + assert.match(head.headers.get('content-type') || '', /text\/markdown/, page.route); + assert.equal(await head.text(), '', page.route); +} +for (const [route, target] of Object.entries(redirects)) { + for (const suffix of ['', '/']) { + const response = await fetch(new URL(route + suffix, origin), { redirect: 'manual' }); + assert.equal(response.status, 301, route); + assert.equal(response.headers.get('location'), new URL(target, origin).href, route); + } +} +assert.equal((await fetch(new URL('/this-page-must-not-exist/', origin))).status, 404); +// Exercise each asset bypass route as well as the Worker-backed pages above. +const home = await (await fetch(new URL('/', origin))).text(); +const bundle = home.match(/(?:src|href)="(\/_astro\/[^" ]+\.js)"/); +assert.ok(bundle, 'Expected a bundled script on the homepage'); +for (const path of [bundle[1], '/pagefind/pagefind.js', '/search/pagefind.js', '/favicon.ico', Object.keys(images)[0]]) { + const response = await fetch(new URL(path, origin), { method: 'HEAD' }); + assert.equal(response.status, 200, path); + assert.equal(response.headers.get('x-content-type-options'), 'nosniff', path); + assert.equal(response.headers.get('referrer-policy'), 'strict-origin-when-cross-origin', path); + if (!local) assert.match(response.headers.get('x-robots-tag') || '', /noindex/, path); +} +const og = await fetch(new URL(`/_og/${pages[0].og.hash}/`, origin)); +assert.equal(og.status, 200); +assert.match(og.headers.get('content-type') || '', /text\/html/); +assert.match(og.headers.get('x-robots-tag') || '', /noindex/); +for (const [original, image] of Object.entries(images)) { + assert.equal((await fetch(new URL(original, origin), { method: 'HEAD' })).status, 200, original); + for (const [format, variants] of Object.entries(image.sources)) { + // One size per format checks static serving without repeatedly downloading images. + const response = await fetch(new URL(variants[0].src, origin), { method: 'HEAD' }); + assert.equal(response.status, 200, variants[0].src); + assert.match(response.headers.get('content-type') || '', new RegExp(`image/${format}`)); + } +} +console.log('Original images and static AVIF/WebP variants verified.'); +console.log(`Preview pages, Markdown negotiation and direct exports, HEAD, all legacy redirects, and 404 verified.${local ? ' Hosted noindex checks skipped locally.' : ' Preview noindex headers verified.'}`); diff --git a/scripts/check-production.mjs b/scripts/check-production.mjs new file mode 100644 index 0000000..ce0b27b --- /dev/null +++ b/scripts/check-production.mjs @@ -0,0 +1,29 @@ +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import { load } from 'cheerio'; +import pages from '../src/generated/pages.json' with { type:'json' }; +const origin = 'https://docs.htmlcsstoimage.com'; +for (const page of pages) { + const $ = load(await fs.readFile(`dist${page.route}index.html`, 'utf8')); + assert.equal($('link[rel="canonical"]').attr('href'), new URL(page.route, origin).href, page.route); + assert.doesNotMatch($('meta[name="robots"]').attr('content') || '', /noindex/i, page.route); + const image = new URL($('meta[property="og:image"]').attr('content')); + assert.equal(image.origin, 'https://hcti.io', page.route); + assert.equal(image.searchParams.get('url'), `${origin}/_og/${page.og.hash}/`, page.route); +} +const robots = await fs.readFile('dist/robots.txt', 'utf8'); +assert.ok(robots.includes(`Sitemap: ${origin}/sitemap.xml`)); +const sitemap = load(await fs.readFile('dist/sitemap.xml', 'utf8'), { xml:true }); +assert.equal(sitemap('urlset').length, 1, 'Expected a single sitemap for the current site'); +const entries = new Map(); +for (const entry of sitemap('url').toArray()) { + const loc = new URL(sitemap(entry).find('loc').text()); + assert.equal(loc.origin, origin); + assert.ok(!loc.pathname.startsWith('/_og/')); + assert.ok(!entries.has(loc.pathname), `Duplicate sitemap URL: ${loc.pathname}`); + entries.set(loc.pathname, Number(sitemap(entry).find('priority').text())); +} +for (const page of pages) assert.equal(entries.get(page.route), /^\/changelog\/[^/]+\/$/.test(page.route) ? 0.2 : 0.8, page.route); +await assert.rejects(fs.access('dist/sitemap-index.xml')); +await assert.rejects(fs.access('dist/sitemap-0.xml')); +console.log(`Production metadata, signed OG sources, robots.txt, and sitemap priorities verified for ${pages.length} pages.`); diff --git a/scripts/check-site.mjs b/scripts/check-site.mjs new file mode 100644 index 0000000..2d58af3 --- /dev/null +++ b/scripts/check-site.mjs @@ -0,0 +1,77 @@ +import fs from 'node:fs/promises'; +import { load } from 'cheerio'; +import pages from '../src/generated/pages.json' with { type: 'json' }; +import routes from '../migration/routes.json' with { type: 'json' }; +import baseline from '../migration/legacy-anchors.json' with { type: 'json' }; +import redirects from '../migration/redirects.json' with { type: 'json' }; +import { isExternalLink } from './external-links.mjs'; + +const errors = []; +// Explicitly removed editorial sections; all other legacy anchors remain required. +const retiredAnchors = new Set(['/#manage-organization-resources']); +const normalize = path => path === '/' ? path : `${path.replace(/\/$/, '')}/`; +const planned = new Set(routes.map(page => page.route)); +const built = new Map(); +for (const page of pages) { + const html = await fs.readFile(`dist${page.route}index.html`, 'utf8'); + const $ = load(html); + if ($('[data-doc-markdown],[data-build-parameter-table]').length) errors.push(`${page.route}: build-only Markdown metadata leaked into HTML`); + $('a[href]').each((_, element) => { + const link = $(element); + if (!isExternalLink(link.attr('href'), process.env.DOCS_ORIGIN || 'http://localhost:4321')) return; + const rel = (link.attr('rel') || '').split(/\s+/); + if (link.attr('target') !== '_blank' || !rel.includes('noopener') || rel.includes('noreferrer')) { + errors.push(`${page.route}: external link must open safely and retain referral attribution: ${link.attr('href')}`); + } + }); + const ids = $('[id]').map((_, el) => $(el).attr('id')).get(); + if (ids.length !== new Set(ids).size) errors.push(`${page.route}: duplicate IDs`); + built.set(page.route, { $, ids: new Set(ids) }); + // Full fidelity requires both heading anchors and manually assigned targets. + for (const id of baseline[page.route]?.ids || []) { + if (retiredAnchors.has(`${page.route}#${id}`)) continue; + if (!ids.includes(id)) errors.push(`${page.route}: missing previous #${id}`); + } + const source = await fs.readFile(page.file, 'utf8'); + // Fenced examples may legitimately document Liquid; executable content may not. + const prose = source.replace(/```[\s\S]*?```/g, '').replace(/`[^`\n]+`/g, ''); + if (/{%|\{:\s|class="(?:fs-|te-doc|http-method)| errors.push(`${page.route}: missing generated OG card`)); + await fs.access(`dist${page.markdownPath}`).catch(() => errors.push(`${page.route}: missing Markdown export`)); +} +const pendingLinks = new Set(); +for (const [route, { $ }] of built) { + for (const element of $('source[srcset],img[srcset]').toArray()) { + for (const candidate of $(element).attr('srcset').split(',')) { + const value = candidate.trim().split(/\s+/)[0]; + if (!value.startsWith('/assets/images/g/')) continue; + await fs.access(`dist${decodeURIComponent(value)}`).catch(() => errors.push(`${route}: missing responsive image ${value}`)); + } + } + for (const element of $('a[href],img[src]').toArray()) { + const value = $(element).attr('href') || $(element).attr('src'); + if (!value || /^(mailto:|tel:|data:|javascript:)/.test(value)) continue; + const url = new URL(value, `https://docs.htmlcsstoimage.com${route}`); + if (url.hostname !== 'docs.htmlcsstoimage.com') continue; + let path = decodeURIComponent(url.pathname); + const redirect = redirects[path.replace(/\/$/, '')]; + if (redirect) path = redirect; + const target = normalize(path); + if (built.has(target)) { + if (url.hash && !built.get(target).ids.has(decodeURIComponent(url.hash.slice(1)))) errors.push(`${route}: broken ${value}`); + } else if (planned.has(target)) pendingLinks.add(target); + else await fs.access(`dist${path}`).catch(() => errors.push(`${route}: missing target ${value}`)); + } +} +const migratedRedirects = routes.filter(page => !built.has(page.route) && built.has(normalize(redirects[page.route.replace(/\/$/, '')] || '/__unresolved__'))); +const resolvedRedirects = new Set(migratedRedirects.map(page => page.route)); +const pending = routes.filter(page => !built.has(page.route) && !resolvedRedirects.has(page.route)); +if (process.argv.includes('--complete') && pending.length) errors.push(`${pending.length} source pages still require individual migration`); +const report = { migrated: pages.length, migratedRedirects: [...resolvedRedirects], total: routes.length, pending: pending.map(page => page.source), pendingLinkTargets: [...pendingLinks], errors }; +await fs.writeFile('migration-report.json', JSON.stringify(report, null, 2)); +console.log(`${pages.length} native pages and ${resolvedRedirects.size} redirect routes migrated out of ${routes.length}; ${pending.length} pending. ${pendingLinks.size} link targets await migration.`); +if (errors.length) { console.error(errors.join('\n')); process.exitCode = 1; } +else console.log('Migrated pages: URLs, old anchors, assets, Markdown exports, and links verified.'); diff --git a/scripts/external-links.mjs b/scripts/external-links.mjs new file mode 100644 index 0000000..8d23c81 --- /dev/null +++ b/scripts/external-links.mjs @@ -0,0 +1,48 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { load } from 'cheerio'; + +export function isExternalLink(href, origin) { + try { + const url = new URL(href, origin); + return ['http:', 'https:'].includes(url.protocol) + && url.origin !== new URL(origin).origin + && url.hostname !== 'docs.htmlcsstoimage.com'; + } catch { return false; } +} + +export function externalLinksHtml(html, origin) { + const $ = load(html); + $('a[href]').each((_, element) => { + const link = $(element); + if (!isExternalLink(link.attr('href'), origin)) return; + const rel = new Set((link.attr('rel') || '').toLowerCase().split(/\s+/).filter(Boolean)); + rel.delete('opener'); + rel.add('noopener'); + rel.delete('noreferrer'); + link.attr('target', '_blank').attr('rel', [...rel].join(' ')); + }); + return $.html(); +} + +// Process complete rendered documents so Astro components and Markdown obey the +// same policy. This does not alter code examples or the Markdown representation. +export default function externalLinks() { + let origin; + return { name: 'hcti-external-links', hooks: { + 'astro:config:done': ({ config }) => { origin = config.site; }, + 'astro:build:done': async ({ dir }) => { + async function visit(directory) { + for (const entry of await fs.readdir(directory, { withFileTypes: true })) { + const file = path.join(directory, entry.name); + if (entry.isDirectory()) await visit(file); + else if (entry.name.endsWith('.html')) { + await fs.writeFile(file, externalLinksHtml(await fs.readFile(file, 'utf8'), origin)); + } + } + } + await visit(fileURLToPath(dir)); + }, + } }; +} diff --git a/scripts/image-variants.mjs b/scripts/image-variants.mjs new file mode 100644 index 0000000..cf06891 --- /dev/null +++ b/scripts/image-variants.mjs @@ -0,0 +1,31 @@ +import fs from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import sharp from 'sharp'; + +const widths = [384, 768, 1280, 1600]; +const formats = { avif: { quality: 60, effort: 2 }, webp: { quality: 85 } }; + +export async function imageVariants(input, outputDir, source = '/assets/images/image.png') { + const metadata = await sharp(input).metadata(); + // Preserve animation and unsupported originals unchanged. + if ((metadata.pages || 1) > 1 || !metadata.width || !metadata.height) return null; + const { width, height } = metadata.autoOrient || metadata; + const hash = createHash('sha256').update(input).update(JSON.stringify({ widths, formats, sharp: sharp.versions.sharp, version: 1 })).digest('hex').slice(0, 20); + const folder = decodeURIComponent(source).replace(/^\/assets\/images\//, '').replace(/\.[^.]+$/, ''); + if (folder.startsWith('/') || folder.split('/').some(part => !part || part === '..')) throw new Error(`Invalid image path: ${source}`); + const urlFolder = folder.split('/').map(encodeURIComponent).join('/'); + const sizes = [...new Set([...widths.filter(w => w < width), Math.min(width, 1600)])]; + const sources = {}; + await fs.mkdir(`${outputDir}/${folder}`, { recursive: true }); + for (const [format, options] of Object.entries(formats)) { + sources[format] = []; + for (const size of sizes) { + const filename = `${hash}.w${size}.${format}`; + const target = `${outputDir}/${folder}/${filename}`; + try { await fs.access(target); } + catch { await sharp(input).autoOrient().resize({ width: size, withoutEnlargement: true }).toFormat(format, options).toFile(target); } + sources[format].push({ src: `/assets/images/g/${urlFolder}/${filename}`, width: size }); + } + } + return { width, height, sources }; +} diff --git a/scripts/markdown-exports.mjs b/scripts/markdown-exports.mjs new file mode 100644 index 0000000..69d8fd5 --- /dev/null +++ b/scripts/markdown-exports.mjs @@ -0,0 +1,93 @@ +import fs from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; +import { load } from 'cheerio'; +import Turndown from 'turndown'; +import { gfm } from 'turndown-plugin-gfm'; +import { parameterMarkdown, selectParameters } from '../src/lib/parameter-markdown.mjs'; + +export const stripBuildMetadata = html => html.replace(/\sdata-build-parameter-table="[^"]*"/g, ''); + +export function renderMarkdown(html, title) { + const $ = load(html); + $('[data-pagefind-ignore]:not([data-changelog-navigation]),.copy,.frame .header,.sl-anchor-link').remove(); + const content = $('.sl-markdown-content'); + content.find('.expressive-code pre').each((_, element) => { + const pre = $(element); + pre.find('.ec-line, .line').append('\n'); + const language = pre.attr('data-language'); + if (language) pre.children('code').addClass(`language-${language}`); + }); + const td = new Turndown({ codeBlockStyle: 'fenced', headingStyle: 'atx' }); + td.use(gfm); + td.remove(['script', 'style', 'button']); + td.addRule('link-card', { + filter: node => node.classList?.contains('sl-link-card'), + replacement: (_content, node) => { + const link = node.querySelector('a'); + const description = node.querySelector('.description'); + return `\n\n${td.turndown(link.outerHTML)}${description ? ` — ${td.turndown(description.innerHTML)}` : ''}\n\n`; + }, + }); + // The full-size link is a visual affordance; agents need the image and caption. + td.addRule('doc-image', { + filter: node => node.nodeName === 'FIGURE' && node.hasAttribute('data-doc-image'), + replacement: (_content, node) => { + const img = node.querySelector('img'); + const alt = (img.getAttribute('alt') || '').replace(/[\\[\]]/g, '\\$&'); + const src = img.getAttribute('src').replace(/ /g, '%20').replace(/\(/g, '%28').replace(/\)/g, '%29'); + const caption = node.querySelector('figcaption'); + return `\n\n![${alt}](${src})${caption ? `\n\n${td.turndown(caption.innerHTML)}` : ''}\n\n`; + }, + }); + td.addRule('endpoint', { + filter: node => node.hasAttribute?.('data-endpoint'), + replacement: (_content, node) => `\n\n\`${node.querySelector('strong').textContent} ${node.getAttribute('data-endpoint-url') || node.querySelector('code').textContent}\`\n\n`, + }); + td.addRule('table-cell', { + filter: ['th', 'td'], + replacement: (content, node) => { + const first = Array.from(node.parentNode.children).indexOf(node) === 0; + return `${first ? '| ' : ' '}${content.replace(/\|/g, '\\|').replace(/\n+/g, ' ')} |`; + }, + }); + // Render from component data, not from its HTML. The small props marker is + // build-only and stripped from the final HTML before deployment. + td.addRule('component-markdown', { + filter: node => node.hasAttribute?.('data-build-parameter-table'), + replacement: (_content, node) => { + const props = JSON.parse(node.getAttribute('data-build-parameter-table')); + return `\n\n${parameterMarkdown(selectParameters(props), props)}\n\n`; + }, + }); + const published = $('time[data-changelog-date]').first().text(); + const navigation = $('[data-changelog-navigation] a').map((_, element) => { + const link = $(element); + const direction = link.attr('rel') === 'prev' ? 'Previous' : 'Next'; + return `${direction}: [${link.find('strong').text().replace(/[\[\]]/g, '\\$&')}](${link.attr('href')}) — ${link.find('time').text()}`; + }).get().join('\n\n'); + return `# ${title}\n\n${published ? `${published}\n\n` : ''}${td.turndown(content.html() || '')}${navigation ? `\n\n${navigation}` : ''}\n`; +} + +// Public Markdown views are generated from the native Astro output so component +// content (e.g. parameter tables) is available to readers and AI tools as prose. +export default function markdownExports() { + return { name: 'hcti-markdown-exports', hooks: { 'astro:build:done': async ({ dir }) => { + const root = fileURLToPath(dir); + const pages = JSON.parse(await fs.readFile('src/generated/pages.json', 'utf8')); + const articles = []; + for (const page of pages) { + const htmlPath = `${root}${page.route.slice(1)}index.html`; + const html = await fs.readFile(htmlPath, 'utf8'); + const markdown = renderMarkdown(html, page.title); + const cleanHtml = stripBuildMetadata(html); + if (cleanHtml !== html) await fs.writeFile(htmlPath, cleanHtml); + const target = `${root}${page.markdownPath.slice(1)}`; + await fs.mkdir(target.slice(0, target.lastIndexOf('/')), { recursive: true }); + await fs.writeFile(target, markdown); + articles.push(`\n\n${markdown}`); + } + const origin = process.env.DOCS_ORIGIN || 'http://localhost:4321'; + await fs.writeFile(`${root}llms.txt`, '# HTML/CSS to Image documentation\n\n> Render images, screenshots, and PDFs from HTML/CSS, URLs, or saved templates.\n\nEach page supports Accept: text/markdown and a direct .md URL.\n\n## Documentation\n\n' + pages.map(page => `- [${page.title}](${new URL(page.markdownPath, origin).href}): ${page.og.description}`).join('\n') + '\n'); + await fs.writeFile(`${root}llms-full.txt`, articles.join('\n\n---\n\n')); + } } }; +} diff --git a/scripts/og.mjs b/scripts/og.mjs new file mode 100644 index 0000000..1b545fc --- /dev/null +++ b/scripts/og.mjs @@ -0,0 +1,22 @@ +import { createHash } from 'node:crypto'; +import { HtmlCssToImageClient, CreateUrlImageRequest } from '@html-css-to-image/client'; + +export const dimensions = { width: 1200, height: 630 }; +export const digest = value => createHash('sha256').update(value).digest('hex'); +export function stableJson(value) { + if (Array.isArray(value)) return `[${value.map(stableJson).join(',')}]`; + if (value !== null && typeof value === 'object') { + return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${stableJson(value[key])}`).join(',')}}`; + } + return JSON.stringify(value); +} +export function cardHash(data, designFingerprint) { + return digest(stableJson({ data, designFingerprint, version: 1 })).slice(0, 24); +} +export function signedImageUrl(pageUrl, apiId, apiKey) { + const client = new HtmlCssToImageClient(apiId, apiKey); + return client.generateCreateAndRenderUrl(new CreateUrlImageRequest({ + url: pageUrl, format: 'png', viewport_width: dimensions.width, + viewport_height: dimensions.height, device_scale: 1, selector: '#og-card', + })); +} diff --git a/scripts/prepare-images.mjs b/scripts/prepare-images.mjs new file mode 100644 index 0000000..9b8b636 --- /dev/null +++ b/scripts/prepare-images.mjs @@ -0,0 +1,42 @@ +import fs from 'node:fs/promises'; +import { imageVariants } from './image-variants.mjs'; + +const originals = new Set(); +async function collect(dir) { + for (const entry of await fs.readdir(dir, { withFileTypes: true })) { + const file = `${dir}/${entry.name}`; + if (entry.isDirectory()) await collect(file); + else if (/\.mdx?$/.test(file)) { + const content = await fs.readFile(file, 'utf8'); + for (const match of content.matchAll(/]*\bsrc="(\/assets\/images\/[^"\n]+\.(?:png|jpe?g|webp|avif))"/gi)) originals.add(match[1]); + } + } +} +await collect('src/content/docs'); +const manifest = {}; +const pending = [...originals].sort(); +await Promise.all(Array.from({ length: 2 }, async () => { + while (pending.length) { + const src = pending.shift(); + const variants = await imageVariants(await fs.readFile(`public${decodeURIComponent(src)}`), 'public/assets/images/g', src); + if (variants) manifest[src] = variants; + } +})); +// Remove only obsolete files owned by this generator; unchanged variants are cached. +const used = new Set(Object.values(manifest).flatMap(image => Object.values(image.sources).flatMap(sources => sources.map(source => `public${decodeURIComponent(source.src)}`)))); +await fs.mkdir('public/assets/images/g', { recursive: true }); +async function prune(dir) { + for (const entry of await fs.readdir(dir, { withFileTypes: true })) { + const file = `${dir}/${entry.name}`; + if (entry.isDirectory()) { + await prune(file); + if (!(await fs.readdir(file)).length) await fs.rmdir(file); + } else if (/^[a-f0-9]{20}(?:\.w|-)\d+\.(avif|webp)$/.test(entry.name) && !used.has(file)) { + await fs.unlink(file); + } + } +} +await prune('public/assets/images/g'); +await fs.mkdir('src/data', { recursive: true }); +await fs.writeFile('src/data/images.json', JSON.stringify(Object.fromEntries(Object.entries(manifest).sort()), null, 2) + '\n'); +console.log(`Prepared ${used.size} static variants for ${Object.keys(manifest).length} documentation images. Originals preserved.`); diff --git a/scripts/prepare-og.mjs b/scripts/prepare-og.mjs new file mode 100644 index 0000000..92a8fa2 --- /dev/null +++ b/scripts/prepare-og.mjs @@ -0,0 +1,32 @@ +import fs from 'node:fs/promises'; +import matter from 'gray-matter'; +import { cardHash, digest, signedImageUrl } from './og.mjs'; + +try { process.loadEnvFile(); } catch (error) { if (error.code !== 'ENOENT') throw error; } +const apiId = process.env.HCTI_API_ID, apiKey = process.env.HCTI_API_KEY; +if (Boolean(apiId) !== Boolean(apiKey)) throw new Error('Set both HCTI_API_ID and HCTI_API_KEY.'); +if (!apiId && process.env.REQUIRE_OG_SIGNING === 'true') throw new Error('Deployment requires V2_HCTI_API_ID and V2_HCTI_API_KEY Actions secrets.'); +const origin = process.env.DOCS_ORIGIN || 'http://localhost:4321'; +if (process.env.REQUIRE_OG_SIGNING === 'true' && !origin.startsWith('https://')) throw new Error('Deployment requires an HTTPS DOCS_ORIGIN.'); +const designFingerprint = digest(await fs.readFile('src/pages/[...og].astro')); +const pages = []; +async function walk(dir) { + for (const entry of await fs.readdir(dir, { withFileTypes: true })) { + const file = `${dir}/${entry.name}`; + if (entry.isDirectory()) { await walk(file); continue; } + if (!/\.mdx?$/.test(file)) continue; + // Starlight's error page is not an article or an OG/Markdown export. + if (file === 'src/content/docs/404.mdx') continue; + const { data } = matter(await fs.readFile(file, 'utf8')); + if (typeof data.slug !== 'string') throw new Error(`Explicit slug required: ${file}`); + const route = data.slug ? `/${data.slug}/` : '/'; + const og = { title: data.og_title ?? data.title, description: data.description || 'Generate images from HTML and CSS.', section: data.section || 'Developer documentation' }; + const hash = cardHash(og, designFingerprint); + pages.push({ file, route, title: data.page_title ?? data.title, markdownPath: route === '/' ? '/index.md' : `${route.slice(0, -1)}.md`, og: { ...og, hash, image: apiId ? signedImageUrl(new URL(`/_og/${hash}/`, origin).href, apiId, apiKey) : null } }); + } +} +await walk('src/content/docs'); +if (new Set(pages.map(page => page.route)).size !== pages.length) throw new Error('Duplicate page slugs'); +await fs.mkdir('src/generated', { recursive: true }); +await fs.writeFile('src/generated/pages.json', JSON.stringify(pages)); +console.log(`Prepared ${pages.length} OG cards${apiId ? ' with signed HCTI URLs' : ' (unsigned for local development)'}. No image API requests made.`); diff --git a/scripts/sitemap.mjs b/scripts/sitemap.mjs new file mode 100644 index 0000000..fa51bbe --- /dev/null +++ b/scripts/sitemap.mjs @@ -0,0 +1,25 @@ +import fs from 'node:fs/promises'; +import { load } from 'cheerio'; +import sitemap from '@astrojs/sitemap'; + +// Keep Astro's route discovery and serialization, but publish one sitemap +// directly until the integration actually needs to split it into chunks. +export default function docsSitemap(options) { + const integration = sitemap(options); + const generate = integration.hooks['astro:build:done']; + integration.hooks['astro:build:done'] = async (context) => { + await generate(context); + const indexPath = new URL('sitemap-index.xml', context.dir); + const index = load(await fs.readFile(indexPath, 'utf8'), { xml: true }); + const locations = index('sitemap > loc').toArray(); + const output = new URL('sitemap.xml', context.dir); + if (locations.length === 1 && new URL(index(locations[0]).text()).pathname === '/sitemap-0.xml') { + await fs.rename(new URL('sitemap-0.xml', context.dir), output); + await fs.unlink(indexPath); + } else { + // /sitemap.xml can become an index later without changing robots.txt. + await fs.rename(indexPath, output); + } + }; + return integration; +} diff --git a/searchIndex.js b/searchIndex.js deleted file mode 100644 index 9e758f3..0000000 --- a/searchIndex.js +++ /dev/null @@ -1,29 +0,0 @@ -// Pregenerates the search index. Improving performance. -// node searchIndex.js -const lunr = require('./assets/js/lunr.js') - -const fs = require('fs'); -let rawdata = fs.readFileSync('_site/assets/js/search-data.json'); - -var documents = JSON.parse(rawdata) - -var idx = lunr(function () { - this.ref('id'); - this.field('title', { boost: 200 }); - this.field('content', { boost: 2 }); - this.field('relUrl'); - this.metadataWhitelist = ['position'] - - Object.keys(documents).forEach(function (key) { - this.add({id: key, title: documents[key].title, content: documents[key].content, relUrl: documents[key].relUrl}) - }, this) -}) - - -callback = function(err){ - if(err) throw err; -} - -var output = { docs: documents, index: idx } - -fs.writeFile('assets/js/search-index.json', JSON.stringify(output), 'utf8', callback); diff --git a/src/components/Breadcrumbs.astro b/src/components/Breadcrumbs.astro new file mode 100644 index 0000000..3024031 --- /dev/null +++ b/src/components/Breadcrumbs.astro @@ -0,0 +1,21 @@ +--- +import { breadcrumbs } from '../lib/breadcrumbs.mjs'; +const { entry } = Astro.locals.starlightRoute; +const route = Astro.url.pathname; +const crumbs = breadcrumbs(route, entry.data.page_title ?? entry.data.title, Boolean(entry.data.changelog)).slice(0, -1); +--- +{route !== '/' && } + diff --git a/src/components/ChangelogList.astro b/src/components/ChangelogList.astro new file mode 100644 index 0000000..faf983b --- /dev/null +++ b/src/components/ChangelogList.astro @@ -0,0 +1,42 @@ +--- +import { getChangelogEntries, changelogDate } from '../lib/changelog'; +interface Props { limit?: number } +const { limit } = Astro.props; +const entries = await getChangelogEntries(); +const visible = limit ? entries.slice(0, limit) : entries; +const years = [...new Set(visible.map(entry => entry.data.changelog!.date.slice(0, 4)))]; +--- +{!limit && } +
    + {visible.map((entry, index) => { + const { date, anchor } = entry.data.changelog!; + const year = date.slice(0, 4); + return <> + {!limit && (index === 0 || visible[index - 1].data.changelog!.date.slice(0, 4) !== year) &&

    {year}

    } + + ; + })} +
    +{limit &&

    All updates →

    } + diff --git a/src/components/ChangelogNavigation.astro b/src/components/ChangelogNavigation.astro new file mode 100644 index 0000000..2a1bcc4 --- /dev/null +++ b/src/components/ChangelogNavigation.astro @@ -0,0 +1,29 @@ +--- +import { getChangelogEntries, changelogDate } from '../lib/changelog'; +const entries = await getChangelogEntries(); +const index = entries.findIndex(entry => entry.id === Astro.locals.starlightRoute.entry.id); +const previous = index >= 0 ? entries[index + 1] : undefined; +const next = index > 0 ? entries[index - 1] : undefined; +--- + + diff --git a/src/components/CodeIntro.astro b/src/components/CodeIntro.astro new file mode 100644 index 0000000..d4648a8 --- /dev/null +++ b/src/components/CodeIntro.astro @@ -0,0 +1,15 @@ +--- +import DocImage from './DocImage.astro'; +interface Props { language: string; anchor: string } +const { language, anchor } = Astro.props; +--- + +

    Generate PNG, JPG, WebP, and PDF output with {language}, using HTML/CSS or reusable templates rendered in Google Chrome.

    +

    Generating images with {language}

    +
    1. Send your HTML/CSS to the API.
    2. The API renders it in Google Chrome.
    3. Read the generated image URL from the JSON response.
    +

    See Creating an image for request parameters. A response includes the image's url and id.

    + +

    Authentication with {language}

    +

    Use HTTP Basic authentication with your API ID as the username and API key as the password. Find both in the dashboard. Keep credentials in server-side configuration or environment variables.

    +

    {language} example code

    +

    The example sends a POST request to https://hcti.io/v1/image. Image creation requires images:create. See authentication and API keys for scoped credentials and access errors.

    diff --git a/src/components/CommonBlockOptions.astro b/src/components/CommonBlockOptions.astro new file mode 100644 index 0000000..edb3650 --- /dev/null +++ b/src/components/CommonBlockOptions.astro @@ -0,0 +1,21 @@ +--- +interface Props { kind?: 'standard' | 'text' | 'image' | 'shape'; cell?: boolean } +const { kind = 'standard', cell = false } = Astro.props; +--- +

    Common properties

    +

    Most blocks share these controls in the right sidebar. Selecting a child also shows controls for its parent layout.

    + + + + + + + + + +
    PropertyDetails
    SizeWidth can be fixed, percentage-based, or automatic. Height can be fixed, flexible, or constrained by minimum and maximum values. Lock the aspect ratio to preserve proportions. Size values support variables.
    ArrangeX and Y position blocks on the canvas or inside Free Panels, using fixed values or percentage anchors. Alignment controls place blocks at common positions. Rotate, flip, lock, or change the layer order.
    BackgroundChoose a solid color, a linear, radial, or conic gradient, or a pattern. Colors support variables. Gradient stops have colors and positions and are sorted by position; linear and conic gradients also have an angle. Pattern colors and size support variables, with controls varying by pattern.
    BorderSimple mode shares color, thickness, style, and radius across all sides. Advanced mode sets each side's color, thickness, and style and each corner's radius independently.
    ShadowAdd layers of regular shadow, inner shadow, or glow, subject to the block-specific limits below.
    +

    Canvas and block backgrounds are separate: transparent areas reveal the parent or canvas. Patterns are based on CSS Pattern. See Sizing and positioning for sizing modes and position anchors.

    +{cell &&

    Auto size to grid cell makes a child fill its assigned area. Disable it when the child should keep its own width or height.

    } +{kind === 'text' &&

    Text blocks support drop shadows and glow, without inner shadows or spread.

    } +{kind === 'image' &&

    With Contain or Scale Down, the border and shadow follow the rendered image.

    } +{kind === 'shape' &&

    Rectangles and circles support solid, gradient, and pattern backgrounds and advanced borders. Stars and triangles support solid colors and linear or radial gradients, simple borders, and drop shadows or glow; they do not support patterns, conic gradients, inner shadows, or shadow spread.

    } diff --git a/src/components/DocImage.astro b/src/components/DocImage.astro new file mode 100644 index 0000000..aa6e956 --- /dev/null +++ b/src/components/DocImage.astro @@ -0,0 +1,66 @@ +--- +import { Zoom } from 'starlight-image-zoom/components'; +import images from '../data/images.json'; +interface Props { src: string; alt: string; width?: number; height?: number; caption?: string; } +const { src, alt, width, height, caption } = Astro.props; +const optimized = (images as Record }>)[src]; +const displayWidth = width ?? optimized?.width; +const displayHeight = height ?? (optimized && displayWidth ? Math.round(displayWidth * optimized.height / optimized.width) : undefined); +--- +
    + + + {optimized && Object.entries(optimized.sources).map(([format, variants]) => `${v.src} ${v.width}w`).join(', ')} sizes="(max-width: 50rem) 100vw, 48rem" />)} + {alt} + + + {caption &&
    {caption}
    } +
    + + diff --git a/src/components/Endpoint.astro b/src/components/Endpoint.astro new file mode 100644 index 0000000..82f275c --- /dev/null +++ b/src/components/Endpoint.astro @@ -0,0 +1,11 @@ +--- +interface Props { method: 'GET' | 'POST' | 'PUT' | 'DELETE'; path: string; compact?: boolean; } +const { method, path, compact = false } = Astro.props; +--- +
    {method}{compact ? path : `https://hcti.io${path}`}
    + diff --git a/src/components/ExampleCard.astro b/src/components/ExampleCard.astro new file mode 100644 index 0000000..e6199b3 --- /dev/null +++ b/src/components/ExampleCard.astro @@ -0,0 +1,18 @@ +--- +interface Props { + id: string; + title: string; + description: string; + href: string; +} +const { id, title, description, href } = Astro.props; +--- + + diff --git a/src/components/Footer.astro b/src/components/Footer.astro new file mode 100644 index 0000000..a623541 --- /dev/null +++ b/src/components/Footer.astro @@ -0,0 +1,10 @@ +--- +import EditLink from '@astrojs/starlight/components/EditLink.astro'; +import ChangelogNavigation from './ChangelogNavigation.astro'; +--- +{Astro.locals.starlightRoute.entry.data.changelog && } + + diff --git a/src/components/GridTracks.astro b/src/components/GridTracks.astro new file mode 100644 index 0000000..2e4c14d --- /dev/null +++ b/src/components/GridTracks.astro @@ -0,0 +1,12 @@ +

    Grid tracks

    +

    Each column and row has its own size and background. Select a track using its hover selector or the collapsible Rows and Columns sections in the panel sidebar.

    + + + + + + + + +
    Size modeBehavior
    DefinedUse fr, %, or px.
    AutoSize to the content.
    Min ContentUse the smallest intrinsic size.
    Max ContentUse the largest intrinsic size.
    +

    Track backgrounds create bands or highlights. Child backgrounds appear above them; transparent children let the track background show through.

    diff --git a/src/components/Head.astro b/src/components/Head.astro new file mode 100644 index 0000000..2190fba --- /dev/null +++ b/src/components/Head.astro @@ -0,0 +1,49 @@ +--- +import pages from '../generated/pages.json'; +import { Font } from 'astro:assets'; +import { ClientRouter } from 'astro:transitions'; +import NavigationLifecycle from './NavigationLifecycle.astro'; +import { structuredData, serializeStructuredData } from '../lib/structured-data.mjs'; +const page = pages.find(page => page.route === Astro.url.pathname); +const { head, entry } = Astro.locals.starlightRoute; +const jsonLd = page && structuredData({ + origin: Astro.site?.href ?? Astro.url.origin, + route: page.route, + title: entry.data.page_title ?? entry.data.title, + description: entry.data.description, + image: page.og.image, + datePublished: entry.data.changelog?.date, + overview: page.route === '/' || page.route === '/changelog/' || /\/index\.mdx?$/.test(page.file), +}); +const siteTitle = 'HTML/CSS to Image API Docs'; +const brandedTitle = (title: string) => title === siteTitle || title.endsWith(` | ${siteTitle}`) + ? title : `${title} | ${siteTitle}`; +const tags = head.filter(tag => tag.tag !== 'title' && + !(tag.tag === 'meta' && tag.attrs?.charset) && + !(tag.tag === 'meta' && tag.attrs?.name === 'generator')) + .map(tag => tag.tag === 'meta' && + (tag.attrs?.property === 'og:title' || tag.attrs?.name === 'twitter:title') + ? { ...tag, attrs: { ...tag.attrs, content: brandedTitle(entry.data.og_title ?? entry.data.title) } } + : tag); +--- + +{brandedTitle(entry.data.title)} + + +{jsonLd && + diff --git a/src/components/McpTools.astro b/src/components/McpTools.astro new file mode 100644 index 0000000..0ad45b0 --- /dev/null +++ b/src/components/McpTools.astro @@ -0,0 +1,22 @@ +

    Available tools

    +

    These core tools work across MCP clients. Access depends on the permissions approved for your connection. Ask your assistant to use HCTI by name.

    +

    Account usage

    + + +
    ToolWhat it does
    check_usageCheck images used, image allowance, next reset, and overage settings without rendering an image.
    +

    Screenshots and rendering

    + + + + + + +
    ToolWhat it does
    create_imageRender HTML/CSS as PNG, JPG, WebP, or PDF. Supports device_scale, viewport_width, viewport_height, and ms_delay.
    create_url_imageCapture a public page or CSS selector, with viewport settings and cookie-banner blocking.
    create_templated_imageRender a saved template with template_id and template_values.
    create_batch_imagesRender variations with shared default_options and per-image variations.
    get_max_batch_sizeCheck the account's batch limit before preparing a batch.
    +

    Template management

    + + + + + +
    ToolWhat it does
    create_templateSave HTML/CSS as a reusable template with variables.
    update_templateUpdate an existing template by ID.
    list_templatesFind templates in the connected account.
    list_template_versionsInspect a template's version history.
    +

    See rendering parameters and the Template Editor for image options and reusable designs. The complete tools reference also covers proxies, storage destinations, Open Graph configurations, and required permissions.

    diff --git a/src/components/MobileMenuFooter.astro b/src/components/MobileMenuFooter.astro new file mode 100644 index 0000000..c59c64c --- /dev/null +++ b/src/components/MobileMenuFooter.astro @@ -0,0 +1,6 @@ + + diff --git a/src/components/MobileTableOfContents.astro b/src/components/MobileTableOfContents.astro new file mode 100644 index 0000000..5879901 --- /dev/null +++ b/src/components/MobileTableOfContents.astro @@ -0,0 +1,39 @@ +--- +import DefaultMobileTableOfContents from '@astrojs/starlight/components/MobileTableOfContents.astro'; +import PageActions from './PageActions.astro'; +const { entry, toc } = Astro.locals.starlightRoute; +const route = Astro.url.pathname; +const markdownPath = route === '/' ? '/index.md' : `${route.replace(/\/$/, '')}.md`; +--- +
    + + {toc && entry.id !== '404' &&
    + +
    } +
    + + diff --git a/src/components/MobileThemePicker.astro b/src/components/MobileThemePicker.astro new file mode 100644 index 0000000..7dd45fd --- /dev/null +++ b/src/components/MobileThemePicker.astro @@ -0,0 +1,41 @@ +--- +import ThemeSelect from '@astrojs/starlight/components/ThemeSelect.astro'; +import { Icon } from '@astrojs/starlight/components'; +const themes = [ + { value: 'light', label: 'Light', icon: 'sun' }, + { value: 'dark', label: 'Dark', icon: 'moon' }, + { value: 'auto', label: 'System', icon: 'laptop' }, +] as const; +--- +
    +
    + {themes.map(theme => )} +
    + +
    + diff --git a/src/components/NavigationLifecycle.astro b/src/components/NavigationLifecycle.astro new file mode 100644 index 0000000..deb729f --- /dev/null +++ b/src/components/NavigationLifecycle.astro @@ -0,0 +1,47 @@ + diff --git a/src/components/OgPlatformGuides.astro b/src/components/OgPlatformGuides.astro new file mode 100644 index 0000000..34c7583 --- /dev/null +++ b/src/components/OgPlatformGuides.astro @@ -0,0 +1,13 @@ +--- +import { CardGrid, LinkCard } from '@astrojs/starlight/components'; +--- + + + + + + + + + + diff --git a/src/components/Operations.astro b/src/components/Operations.astro new file mode 100644 index 0000000..8ec2f9d --- /dev/null +++ b/src/components/Operations.astro @@ -0,0 +1,25 @@ +--- +import data from '../data/operations.json'; +import Endpoint from './Endpoint.astro'; +interface Props { resource: keyof typeof data; } +const operations = data[Astro.props.resource].map(operation => ({ + ...operation, + anchor: 'id' in operation ? operation.id : operation.title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, ''), +})); +--- +
    + {operations.map(operation =>
    +

    {operation.title}

    + +

    Permission required: {operation.permission}

    +

    MCP tool: {operation.mcp_tool + ? {operation.mcp_tool} + : 'Not available'}

    +
    )} +
    + diff --git a/src/components/PageActions.astro b/src/components/PageActions.astro new file mode 100644 index 0000000..f7d0ccc --- /dev/null +++ b/src/components/PageActions.astro @@ -0,0 +1,55 @@ +--- +const { markdownPath } = Astro.props; +const pageUrl = new URL(Astro.url.pathname, Astro.site || Astro.url.origin).href; +const prompt = `Read from ${pageUrl} so I can ask questions about it.`; +--- +
    + Copy page + +
    + + diff --git a/src/components/PageFrame.astro b/src/components/PageFrame.astro new file mode 100644 index 0000000..b404ae8 --- /dev/null +++ b/src/components/PageFrame.astro @@ -0,0 +1,10 @@ +--- +import DefaultPageFrame from '@astrojs/starlight/components/PageFrame.astro'; +import SiteFooter from './SiteFooter.astro'; +--- + + + + + + diff --git a/src/components/PageTitle.astro b/src/components/PageTitle.astro new file mode 100644 index 0000000..e830700 --- /dev/null +++ b/src/components/PageTitle.astro @@ -0,0 +1,24 @@ +--- +import DefaultPageTitle from '@astrojs/starlight/components/PageTitle.astro'; +import PageActions from './PageActions.astro'; +import Breadcrumbs from './Breadcrumbs.astro'; +const { entry, toc } = Astro.locals.starlightRoute; +const pageTitle = entry.data.page_title ?? entry.data.title; +const route = Astro.url.pathname; +const markdownPath = route === '/' ? '/index.md' : `${route.replace(/\/$/, '')}.md`; +--- +
    + {route !== '/' &&
    } +
    + {entry.data.page_title ?

    {pageTitle}

    : } +
    + {entry.id !== '404' &&
    } +
    +{entry.data.changelog &&

    } + diff --git a/src/components/ParameterTable.astro b/src/components/ParameterTable.astro new file mode 100644 index 0000000..eb16cd7 --- /dev/null +++ b/src/components/ParameterTable.astro @@ -0,0 +1,17 @@ +--- +import { marked } from 'marked'; +import data from '../data/parameters.json'; +import { selectParameters } from '../lib/parameter-markdown.mjs'; +interface Props { context?: keyof typeof data.contexts | 'api'; includePrimary?: boolean; namePrefix?: string; nameHeading?: string; } +const { context = 'api', includePrimary = false, namePrefix = '', nameHeading = 'Name' } = Astro.props; +const props = { context, includePrimary, namePrefix, nameHeading }; +const parameters = selectParameters(props); +--- + + + {parameters.map(parameter => + + + )} +
    {nameHeading}TypeDescription
    {namePrefix}{parameter.name}{parameter.type} +
    diff --git a/src/components/Search.astro b/src/components/Search.astro new file mode 100644 index 0000000..3ff877c --- /dev/null +++ b/src/components/Search.astro @@ -0,0 +1,56 @@ +--- +import '../styles/search.css'; +const shortcuts = [ + ['Getting started', 'Make your first API request', '/getting-started/'], + ['API keys', 'Authentication and permissions', '/getting-started/using-the-api/api-keys/'], + ['Parameters', 'Control how your images render', '/parameters/'], + ['Template Editor', 'Build reusable image templates', '/template-editor/'], + ['MCP setup', 'Connect your AI assistant', '/integrations/mcp/'], +]; +--- + + diff --git a/src/components/Sidebar.astro b/src/components/Sidebar.astro new file mode 100644 index 0000000..8350c56 --- /dev/null +++ b/src/components/Sidebar.astro @@ -0,0 +1,42 @@ +--- +import SidebarPersister from './SidebarPersister.astro'; +import SidebarSublist from './SidebarSublist.astro'; +import MobileMenuFooter from './MobileMenuFooter.astro'; +import MobileThemePicker from './MobileThemePicker.astro'; +--- + + + + + +
    + + diff --git a/src/components/SidebarPersister.astro b/src/components/SidebarPersister.astro new file mode 100644 index 0000000..1a1c203 --- /dev/null +++ b/src/components/SidebarPersister.astro @@ -0,0 +1,44 @@ +--- +import { createHash } from 'node:crypto'; +import navigation from '../navigation.mjs'; +// Keep Starlight's storage contract, but never restore a collapsed active group. +const hash = createHash('sha256').update('explicit-toggles-v2:').update(JSON.stringify(navigation)).digest('hex'); +--- + + + + + + diff --git a/src/components/SidebarSublist.astro b/src/components/SidebarSublist.astro new file mode 100644 index 0000000..352d55c --- /dev/null +++ b/src/components/SidebarSublist.astro @@ -0,0 +1,172 @@ +--- +// Adapted from Starlight's sidebar list to link group labels to their overview. +import { Icon, Badge } from '@astrojs/starlight/components'; +import SidebarRestorePoint from '@astrojs/starlight/components/SidebarRestorePoint.astro'; + +type SidebarEntry = (typeof Astro.locals.starlightRoute.sidebar)[number]; +const isCurrent = (entry: SidebarEntry): boolean => + entry.type === 'link' ? entry.isCurrent : entry.entries.some(isCurrent); +const overviewHref = (entry: SidebarEntry): string | undefined => { + if (entry.type !== 'group') return; + const overview = entry.entries.find((child) => child.type === 'link' && child.label === 'Overview'); + return overview?.type === 'link' ? overview.href : undefined; +}; + +interface Props { + sublist: SidebarEntry[]; + nested?: boolean; +} + +const { sublist, nested } = Astro.props; +--- + + + + diff --git a/src/components/SiteFooter.astro b/src/components/SiteFooter.astro new file mode 100644 index 0000000..ab24824 --- /dev/null +++ b/src/components/SiteFooter.astro @@ -0,0 +1,21 @@ +--- +const main = 'https://htmlcsstoimage.com'; +const groups = [ + {title:'Information', links:[['Documentation','/'],['API Reference',main+'/api-docs/'],['Pricing',main+'/pricing'],['Status','https://status.htmlcsstoimage.com'],['Blog',main+'/blog'],['Twitter','https://twitter.com/htmlcsstoimage'],['GitHub','https://github.com/htmlcsstoimage/docs'],['Changelog','/changelog/'],['llms.txt','/llms.txt']]}, + {title:'Integrations', links:[['Zapier','/integrations/zapier/'],['Make','/integrations/make/'],['n8n','/integrations/n8n/'],['GitHub Actions','https://github.com/marketplace/actions/html-css-to-image'],['AI/MCP','/integrations/mcp/'],['API Guides','/guides/']]}, + {title:'Examples', links:[['Sample Code','/example-code/'],['Image Examples',main+'/examples'],['Template Presets',main+'/templates'],['Templates Demo',main+'/templates/playground']]}, + {title:'Company', links:[['About',main+'/about'],['Contact us',main+'/contact'],['LinkedIn','https://www.linkedin.com/company/html-css-to-image']]}, + {title:'Tools', links:[['Social Card Preview',main+'/tools/social-card-previewer'],['URL Screenshot Tester',main+'/features/url-screenshots#try-the-url-screenshot-api']]}, + {title:'Legal', links:[['Terms of Use',main+'/terms'],['Privacy Policy',main+'/privacy']]}, +]; +--- +
    +
    + {groups.map(group =>

    {group.title}

      {group.links.map(([label,href]) =>
    • {label}
    • )}
    )} +
    +
    + HTML/CSS to Image +

    © 2018 – {new Date().getFullYear()} Code Happy, LLC

    Made with an extensive amount of integration tests and serious care for developer happiness.

    + support@htmlcsstoimage.com +
    +
    diff --git a/src/components/SiteTitle.astro b/src/components/SiteTitle.astro new file mode 100644 index 0000000..0a91c4f --- /dev/null +++ b/src/components/SiteTitle.astro @@ -0,0 +1,9 @@ + + HTML/CSS to Image + Docs + + diff --git a/src/components/SizingExample.astro b/src/components/SizingExample.astro new file mode 100644 index 0000000..3300432 --- /dev/null +++ b/src/components/SizingExample.astro @@ -0,0 +1,19 @@ +--- +interface Props { margin?: boolean; label: string; anchor: string; } +const { margin = false, label, anchor } = Astro.props; +--- +
    + + +
    A 400 × 200 CSS pixel element{margin ? ' with a 20px margin on each side' : ''}. At the default device scale of 2, the output is {margin ? '880 × 480' : '800 × 400'} image pixels.
    +
    + diff --git a/src/components/TemplatedContent.astro b/src/components/TemplatedContent.astro new file mode 100644 index 0000000..87697b7 --- /dev/null +++ b/src/components/TemplatedContent.astro @@ -0,0 +1,3 @@ +

    Templated content

    + +

    Many properties can use variables to assign their value when each image is created. Variables can be required, ignored, or given a fallback value. Pass values in template_values when rendering the template.

    diff --git a/src/components/TrustProof.astro b/src/components/TrustProof.astro new file mode 100644 index 0000000..3ee3d86 --- /dev/null +++ b/src/components/TrustProof.astro @@ -0,0 +1,36 @@ +--- +const logos = [ + ['Uber', 'uber'], ['HubSpot', 'hubspot'], ['Airtable', 'airtable'], + ['monday.com', 'monday'], ['Yamaha', 'yamaha'], ['Wayfair', 'wayfair'], + ['PlanetScale', 'planetscale'], ['Expensify', 'expensify'], + ['Coldwell Banker', 'coldwell_banker'], +]; +--- +
    +
    + {logos.map(([name, file]) => {name})} +
    +
    +

    100M+{' '}images generated

    +

    Since 2018{' '}running in production

    +

    System status →{' '}Uptime and incident history

    +
    +
    + diff --git a/src/components/TwoColumnContent.astro b/src/components/TwoColumnContent.astro new file mode 100644 index 0000000..22ab0f4 --- /dev/null +++ b/src/components/TwoColumnContent.astro @@ -0,0 +1,30 @@ +--- +import DefaultTwoColumnContent from '@astrojs/starlight/components/TwoColumnContent.astro'; +--- +
    + + + + +
    + diff --git a/src/content.config.ts b/src/content.config.ts new file mode 100644 index 0000000..5286771 --- /dev/null +++ b/src/content.config.ts @@ -0,0 +1,19 @@ +import { defineCollection, z } from 'astro:content'; +import { docsLoader, i18nLoader } from '@astrojs/starlight/loaders'; +import { docsSchema, i18nSchema } from '@astrojs/starlight/schema'; + +// Native Markdown/MDX only. Jekyll sources are never loaded by Astro. +export const collections = { docs: defineCollection({ + loader: docsLoader(), + schema: docsSchema({ extend: z.object({ + page_title: z.string().trim().min(1).optional(), + og_title: z.string().trim().min(1).optional(), + changelog: z.object({ + date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).refine(value => { + const parsed = new Date(`${value}T00:00:00Z`); + return !Number.isNaN(parsed.valueOf()) && parsed.toISOString().slice(0, 10) === value; + }, 'Use a valid YYYY-MM-DD date'), + anchor: z.string().regex(/^[a-z0-9_-]+$/), + }).optional(), + }) }), +}), i18n: defineCollection({ loader: i18nLoader(), schema: i18nSchema() }) }; diff --git a/src/content/docs/404.mdx b/src/content/docs/404.mdx new file mode 100644 index 0000000..3b0d225 --- /dev/null +++ b/src/content/docs/404.mdx @@ -0,0 +1,19 @@ +--- +title: Page not found +description: Find your way back to the HTML/CSS to Image documentation. +# Starlight reads this entry directly for /404.html; don't also publish /404/. +draft: true +editUrl: false +tableOfContents: false +sidebar: + hidden: true +head: + - tag: meta + attrs: + name: robots + content: noindex, nofollow +--- + +We couldn't find that page. It may have moved, or the link may be incorrect. + +Try searching the docs, or head back to the [documentation homepage](/). diff --git a/src/content/docs/changelog.mdx b/src/content/docs/changelog.mdx new file mode 100644 index 0000000..9c5261f --- /dev/null +++ b/src/content/docs/changelog.mdx @@ -0,0 +1,14 @@ +--- +title: Changelog +slug: changelog +description: The latest improvements to HTML/CSS to Image, with release notes and product updates. +tableOfContents: false +--- + +import ChangelogList from '../../components/ChangelogList.astro'; + + + +Product updates, new features, and improvements. Have a request? [Tell us](https://htmlcsstoimage.com/contact). + + diff --git a/src/content/docs/changelog/2019_11_29__integromat-integration.md b/src/content/docs/changelog/2019_11_29__integromat-integration.md new file mode 100644 index 0000000..ee8ef55 --- /dev/null +++ b/src/content/docs/changelog/2019_11_29__integromat-integration.md @@ -0,0 +1,16 @@ +--- +title: "Integromat integration" +slug: changelog/2019-11-29-integromat-integration +description: "Connect image generation to other apps through Integromat." +section: Changelog +tableOfContents: false +changelog: + date: '2019-11-29' + anchor: integromat-integration +sidebar: + hidden: true +--- + +Our [Integromat integration](/integrations/make/) is now available. You can use the integration to connect HTML/CSS to Image with the thousands of integrations available on Integromat. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2019_12_12__deleting-images.md b/src/content/docs/changelog/2019_12_12__deleting-images.md new file mode 100644 index 0000000..083804e --- /dev/null +++ b/src/content/docs/changelog/2019_12_12__deleting-images.md @@ -0,0 +1,16 @@ +--- +title: "Deleting images" +slug: changelog/2019-12-12-deleting-images +description: "Delete an image through the API; subsequent requests return HTTP 410." +section: Changelog +tableOfContents: false +changelog: + date: '2019-12-12' + anchor: deleting-images +sidebar: + hidden: true +--- + +We have added the [Delete endpoint](/getting-started/using-the-api/#deleting-an-image). You can now delete an image and it will be completely removed from our servers. Requests to the image URL will return 410. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_02_12__ms_delay-parameter.md b/src/content/docs/changelog/2020_02_12__ms_delay-parameter.md new file mode 100644 index 0000000..7e38209 --- /dev/null +++ b/src/content/docs/changelog/2020_02_12__ms_delay-parameter.md @@ -0,0 +1,16 @@ +--- +title: "ms_delay parameter" +slug: changelog/2020-02-12-ms_delay-parameter +description: "Add a rendering delay for HTML with assets or JavaScript that need more time." +section: Changelog +tableOfContents: false +changelog: + date: '2020-02-12' + anchor: ms_delay-parameter +sidebar: + hidden: true +--- + +We have added the `ms_delay` parameter. Allowing you to specify how long you want the rendered to wait before generating the image. Useful for HTML with many assets or JavaScript that needs extra time to load. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_03_27__url-to-image.md b/src/content/docs/changelog/2020_03_27__url-to-image.md new file mode 100644 index 0000000..6d5f7ff --- /dev/null +++ b/src/content/docs/changelog/2020_03_27__url-to-image.md @@ -0,0 +1,16 @@ +--- +title: "URL to Image" +slug: changelog/2020-03-27-url-to-image +description: "Generate an image from a webpage URL." +section: Changelog +tableOfContents: false +changelog: + date: '2020-03-27' + anchor: url-to-image +sidebar: + hidden: true +--- + +We've added the ability to create images from URL's. We're calling this URL to Image. [Learn more](/getting-started/url-to-image). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_07_05__brand-new-docs-site.md b/src/content/docs/changelog/2020_07_05__brand-new-docs-site.md new file mode 100644 index 0000000..bcc7f4b --- /dev/null +++ b/src/content/docs/changelog/2020_07_05__brand-new-docs-site.md @@ -0,0 +1,17 @@ +--- +title: "Brand new docs site" +slug: changelog/2020-07-05-brand-new-docs-site +description: "A reorganized documentation site makes guides easier to find." +section: Changelog +tableOfContents: false +changelog: + date: '2020-07-05' + anchor: brand-new-docs-site +sidebar: + hidden: true +--- + +We've released a new version of our documentation website. It's now simpler, faster & we've improved the organization of all the content. +Please send us any feedback. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_07_07__introducing-the-us-east-region.md b/src/content/docs/changelog/2020_07_07__introducing-the-us-east-region.md new file mode 100644 index 0000000..0943af6 --- /dev/null +++ b/src/content/docs/changelog/2020_07_07__introducing-the-us-east-region.md @@ -0,0 +1,19 @@ +--- +title: "Introducing the US-EAST region" +slug: changelog/2020-07-07-introducing-the-us-east-region +description: "US-EAST rendering improves regional latency and failover." +section: Changelog +tableOfContents: false +changelog: + date: '2020-07-07' + anchor: introducing-the-us-east-region +sidebar: + hidden: true +--- + +We have enabled our US-EAST region. Your API requests will now be automatically routed to either US-WEST or US-EAST based on where you ae located. +This will improve latency for requests as well as reliability of the API. We will automatically fail over to the other region is one is unhealthy. + +We plan to introduce an EU region in the future. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_07_17__url-to-image-performance-improvements.md b/src/content/docs/changelog/2020_07_17__url-to-image-performance-improvements.md new file mode 100644 index 0000000..663af5b --- /dev/null +++ b/src/content/docs/changelog/2020_07_17__url-to-image-performance-improvements.md @@ -0,0 +1,16 @@ +--- +title: "URL to Image performance improvements" +slug: changelog/2020-07-17-url-to-image-performance-improvements +description: "More reliable screenshots of pages with many requests and scripts." +section: Changelog +tableOfContents: false +changelog: + date: '2020-07-17' + anchor: url-to-image-performance-improvements +sidebar: + hidden: true +--- + +We have been working on performance improvements to URL to Image. We've improved reliability when screenshotting webpages with large amounts of network requests and JavaScript. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_07_22__new-zapier-templates.md b/src/content/docs/changelog/2020_07_22__new-zapier-templates.md new file mode 100644 index 0000000..f12564c --- /dev/null +++ b/src/content/docs/changelog/2020_07_22__new-zapier-templates.md @@ -0,0 +1,16 @@ +--- +title: "New Zapier templates" +slug: changelog/2020-07-22-new-zapier-templates +description: "New ready-made workflows for the Zapier integration." +section: Changelog +tableOfContents: false +changelog: + date: '2020-07-22' + anchor: new-zapier-templates +sidebar: + hidden: true +--- + +We have added additional Zapier templates to the integration. You can see them here: [HTML/CSS to Image Templates](https://zapier.com/apps/htmlcss-to-image/integrations#zap-template-list). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_07_26__render-when-ready.md b/src/content/docs/changelog/2020_07_26__render-when-ready.md new file mode 100644 index 0000000..d1e8f4c --- /dev/null +++ b/src/content/docs/changelog/2020_07_26__render-when-ready.md @@ -0,0 +1,20 @@ +--- +title: "Render when ready" +slug: changelog/2020-07-26-render-when-ready +description: "Control capture timing with render_when_ready and ScreenshotReady()." +section: Changelog +tableOfContents: false +changelog: + date: '2020-07-26' + anchor: render-when-ready +sidebar: + hidden: true +--- + +We have added the [`render_when_ready` parameter to image creation](/parameters/render_when_ready/). This gives you control over when the image is rendered. + +By setting `render_when_ready` to `true`, we will wait to generate the image until your HTML calls the `ScreenshotReady()` function in JavaScript. + +This is useful for images that have complex JS and you need control over when it's ready to have an image created. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_07_27__template-api.md b/src/content/docs/changelog/2020_07_27__template-api.md new file mode 100644 index 0000000..aed508c --- /dev/null +++ b/src/content/docs/changelog/2020_07_27__template-api.md @@ -0,0 +1,19 @@ +--- +title: "Template API" +slug: changelog/2020-07-27-template-api +description: "Create reusable HTML templates with values supplied at render time." +section: Changelog +tableOfContents: false +changelog: + date: '2020-07-27' + anchor: template-api +sidebar: + hidden: true +--- + +The Template API is now available. With templates, you can create re-usable HTML that contains variables. +These variables can be replaced when creating an image, making for even simpler image generation. + +- [HTML/CSS to Image Template API](/getting-started/templates/) + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_08_03__integromat-updates.md b/src/content/docs/changelog/2020_08_03__integromat-updates.md new file mode 100644 index 0000000..21d1ce7 --- /dev/null +++ b/src/content/docs/changelog/2020_08_03__integromat-updates.md @@ -0,0 +1,18 @@ +--- +title: "Integromat updates" +slug: changelog/2020-08-03-integromat-updates +description: "Integromat adds selector, ms_delay, and device_scale options." +section: Changelog +tableOfContents: false +changelog: + date: '2020-08-03' + anchor: integromat-updates +sidebar: + hidden: true +--- + +We've added additional parameters to the Integromat integration. You can now use `selector`, `ms_delay` and `device_scale`. + +- [HTML/CSS to Image Integromat Integration](/integrations/make/) + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_08_07__ruby-client-released.md b/src/content/docs/changelog/2020_08_07__ruby-client-released.md new file mode 100644 index 0000000..ffb2b16 --- /dev/null +++ b/src/content/docs/changelog/2020_08_07__ruby-client-released.md @@ -0,0 +1,18 @@ +--- +title: "Ruby Client released" +slug: changelog/2020-08-07-ruby-client-released +description: "The first official Ruby client is available." +section: Changelog +tableOfContents: false +changelog: + date: '2020-08-07' + anchor: ruby-client-released +sidebar: + hidden: true +--- + +We have released the first version of our new ruby client. This allows for easier integration with the API using Ruby. + +- [HTML/CSS to Image Ruby Client](https://github.com/htmlcsstoimage/ruby-client) + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_08_16__new-live-editor.md b/src/content/docs/changelog/2020_08_16__new-live-editor.md new file mode 100644 index 0000000..830e0cc --- /dev/null +++ b/src/content/docs/changelog/2020_08_16__new-live-editor.md @@ -0,0 +1,19 @@ +--- +title: "New Live Editor" +slug: changelog/2020-08-16-new-live-editor +description: "Preview HTML/CSS changes live before generating an image." +section: Changelog +tableOfContents: false +changelog: + date: '2020-08-16' + anchor: new-live-editor +sidebar: + hidden: true +--- + +We've rebuilt the live demo. Now you can preview your HTML/CSS as you edit it. Then click the *image* button to see it converted into an image. +This makes it much easier to prototype your images inside a browser. + +- [HTML/CSS to Image Demo](https://htmlcsstoimage.com/#demo) + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_08_31__zapier-plugin-released-from-beta.md b/src/content/docs/changelog/2020_08_31__zapier-plugin-released-from-beta.md new file mode 100644 index 0000000..d253ac8 --- /dev/null +++ b/src/content/docs/changelog/2020_08_31__zapier-plugin-released-from-beta.md @@ -0,0 +1,19 @@ +--- +title: "Zapier plugin released from beta!" +slug: changelog/2020-08-31-zapier-plugin-released-from-beta +description: "The Zapier integration graduates from beta." +section: Changelog +tableOfContents: false +changelog: + date: '2020-08-31' + anchor: zapier-plugin-released-from-beta +sidebar: + hidden: true +--- + +The HTML/CSS to Image Zapier integration has graduated from beta. Zapier wrote up a [nice blog post about the integration](https://zapier.com/blog/updates/2370/new-integration-htmlcss-image). +It's become very popular quickly and we've seen many inventive ways people are improving their businesses through automated image generation. + +- [HTML/CSS to Image Zapier integration](https://docs.htmlcsstoimage.com/integrations/zapier) + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_09_10__various-performance-improvements-released.md b/src/content/docs/changelog/2020_09_10__various-performance-improvements-released.md new file mode 100644 index 0000000..83fb7cc --- /dev/null +++ b/src/content/docs/changelog/2020_09_10__various-performance-improvements-released.md @@ -0,0 +1,17 @@ +--- +title: "Various performance improvements released" +slug: changelog/2020-09-10-various-performance-improvements-released +description: "Faster initial rendering and improved image caching." +section: Changelog +tableOfContents: false +changelog: + date: '2020-09-10' + anchor: various-performance-improvements-released +sidebar: + hidden: true +--- + +We've been working on further improving the performance of the API. Initial image renders are now ~30% faster. We have also improved caching of images. +When cached, you can expect an average of 30-50ms when downloading an image. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_09_30__font-rendering-improvements.md b/src/content/docs/changelog/2020_09_30__font-rendering-improvements.md new file mode 100644 index 0000000..464cbc7 --- /dev/null +++ b/src/content/docs/changelog/2020_09_30__font-rendering-improvements.md @@ -0,0 +1,19 @@ +--- +title: "Font rendering improvements" +slug: changelog/2020-09-30-font-rendering-improvements +description: "Additional character sets improve rendering across languages." +section: Changelog +tableOfContents: false +changelog: + date: '2020-09-30' + anchor: font-rendering-improvements +sidebar: + hidden: true +--- + +We have released a large update to the fonts available to the API. Previously, we were missing some character sets and some images would show an +empty square instead of the correct character. Our goal is to be able to perfectly render text from any language. + +If you notice any more missing characters, please send us the image URL so that we can investigate it. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_10_02__ruby-client-update.md b/src/content/docs/changelog/2020_10_02__ruby-client-update.md new file mode 100644 index 0000000..499f61c --- /dev/null +++ b/src/content/docs/changelog/2020_10_02__ruby-client-update.md @@ -0,0 +1,17 @@ +--- +title: "Ruby client update" +slug: changelog/2020-10-02-ruby-client-update +description: "A Ruby client patch fixes loading of the addressable dependency." +section: Changelog +tableOfContents: false +changelog: + date: '2020-10-02' + anchor: ruby-client-update +sidebar: + hidden: true +--- + +We released a patch update to the [HTML/CSS to Image Ruby Client](https://github.com/htmlcsstoimage/ruby-client). It fixes an issue with +`addressable` not being loaded. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_11_01__additional-font-rendering-improvements.md b/src/content/docs/changelog/2020_11_01__additional-font-rendering-improvements.md new file mode 100644 index 0000000..8c7be0c --- /dev/null +++ b/src/content/docs/changelog/2020_11_01__additional-font-rendering-improvements.md @@ -0,0 +1,16 @@ +--- +title: "Additional font rendering improvements" +slug: changelog/2020-11-01-additional-font-rendering-improvements +description: "Improved character widths when using Helvetica Neue." +section: Changelog +tableOfContents: false +changelog: + date: '2020-11-01' + anchor: additional-font-rendering-improvements +sidebar: + hidden: true +--- + +We released another improvement to default font rendering. Fixing character widths when "Helvetica Neue" is specified as the default font family. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_11_13__full-screen-parameter-added-to-integromat.md b/src/content/docs/changelog/2020_11_13__full-screen-parameter-added-to-integromat.md new file mode 100644 index 0000000..3fa2cf5 --- /dev/null +++ b/src/content/docs/changelog/2020_11_13__full-screen-parameter-added-to-integromat.md @@ -0,0 +1,16 @@ +--- +title: "Full screen parameter added to Integromat" +slug: changelog/2020-11-13-full-screen-parameter-added-to-integromat +description: "Capture a page’s full scrollable height through Integromat." +section: Changelog +tableOfContents: false +changelog: + date: '2020-11-13' + anchor: full-screen-parameter-added-to-integromat +sidebar: + hidden: true +--- + +Integromat now has the full_screen parameter available. When set to true the entire height of the page will be included in the image. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_12_13__improvements-to-image-deletion.md b/src/content/docs/changelog/2020_12_13__improvements-to-image-deletion.md new file mode 100644 index 0000000..8c75bfc --- /dev/null +++ b/src/content/docs/changelog/2020_12_13__improvements-to-image-deletion.md @@ -0,0 +1,17 @@ +--- +title: "Improvements to image deletion" +slug: changelog/2020-12-13-improvements-to-image-deletion +description: "Deleted images are removed from caches more quickly." +section: Changelog +tableOfContents: false +changelog: + date: '2020-12-13' + anchor: improvements-to-image-deletion +sidebar: + hidden: true +--- + +We've improved image deletion. Previously, images might take several minutes to be uncached and deleted everywhere. Now they are removed almost instantly. For more information, learn how to +[delete an image](/getting-started/using-the-api/#deleting-an-image). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_12_20__zapier-integration-updated-to-107.md b/src/content/docs/changelog/2020_12_20__zapier-integration-updated-to-107.md new file mode 100644 index 0000000..fa8a6e0 --- /dev/null +++ b/src/content/docs/changelog/2020_12_20__zapier-integration-updated-to-107.md @@ -0,0 +1,19 @@ +--- +title: "Zapier integration updated to 1.0.7" +slug: changelog/2020-12-20-zapier-integration-updated-to-107 +description: "Zapier adds CSS for URL screenshots and selector-based cropping." +section: Changelog +tableOfContents: false +changelog: + date: '2020-12-20' + anchor: zapier-integration-updated-to-107 +sidebar: + hidden: true +--- + +We've released a new version of the Zapier integration. It now gives you even more configuration options when creating images. For URL images, you'll now see a CSS field. This allows you to inject CSS into the webpage. +Making it easy to customize how the page looks. + +We have also added the `selector` field to the normal Create image action. This allows you to target a specific CSS selector in your HTML and we'll crop the image to that element. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2020_12_22__inject-custom-css-into-a-webpage.md b/src/content/docs/changelog/2020_12_22__inject-custom-css-into-a-webpage.md new file mode 100644 index 0000000..259e2fe --- /dev/null +++ b/src/content/docs/changelog/2020_12_22__inject-custom-css-into-a-webpage.md @@ -0,0 +1,17 @@ +--- +title: "Inject custom CSS into a webpage" +slug: changelog/2020-12-22-inject-custom-css-into-a-webpage +description: "Inject CSS before capturing a webpage to customize its appearance." +section: Changelog +tableOfContents: false +changelog: + date: '2020-12-22' + anchor: inject-custom-css-into-a-webpage +sidebar: + hidden: true +--- + +When using [URL to Image](/getting-started/url-to-image), you can now inject CSS into the page. This is useful for cases where you want to customize your screenshot of the page. Allowing you to do things like hide specific elements on the page +(such as annoying popups or cookie banners). To get started with it, pass along the css param when using URL to image. This is now available on Zapier and soon will also be working for Integromat. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2021_01_06__new-params-added-to-zapier.md b/src/content/docs/changelog/2021_01_06__new-params-added-to-zapier.md new file mode 100644 index 0000000..79f20ed --- /dev/null +++ b/src/content/docs/changelog/2021_01_06__new-params-added-to-zapier.md @@ -0,0 +1,22 @@ +--- +title: "New params added to Zapier" +slug: changelog/2021-01-06-new-params-added-to-zapier +description: "Zapier adds viewport dimensions, rendering delays, and improved errors." +section: Changelog +tableOfContents: false +changelog: + date: '2021-01-06' + anchor: new-params-added-to-zapier +sidebar: + hidden: true +--- + +A new version (1.0.10) of our Zapier plugin has been released. It includes some great new parameters for better control over your images. + +- viewport_height +- viewport_width +- ms_delay + +We also improved the error messages for when you run into a problem. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2021_01_16__integromat-integration-updated.md b/src/content/docs/changelog/2021_01_16__integromat-integration-updated.md new file mode 100644 index 0000000..ea6d8f1 --- /dev/null +++ b/src/content/docs/changelog/2021_01_16__integromat-integration-updated.md @@ -0,0 +1,19 @@ +--- +title: "Integromat integration updated" +slug: changelog/2021-01-16-integromat-integration-updated +description: "Integromat adds CSS injection and CSS selector support." +section: Changelog +tableOfContents: false +changelog: + date: '2021-01-16' + anchor: integromat-integration-updated +sidebar: + hidden: true +--- + +We released new params to the Integromat integration. + +- CSS injection available for URLs. +- `selector` for specifying a CSS selector. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2021_02_04__demo-and-example-pages-now-include-an-options-tab.md b/src/content/docs/changelog/2021_02_04__demo-and-example-pages-now-include-an-options-tab.md new file mode 100644 index 0000000..35ab10b --- /dev/null +++ b/src/content/docs/changelog/2021_02_04__demo-and-example-pages-now-include-an-options-tab.md @@ -0,0 +1,18 @@ +--- +title: "Demo and example pages now include an options tab" +slug: changelog/2021-02-04-demo-and-example-pages-now-include-an-options-tab +description: "Configure rendering options while trying the live demo and examples." +section: Changelog +tableOfContents: false +changelog: + date: '2021-02-04' + anchor: demo-and-example-pages-now-include-an-options-tab +sidebar: + hidden: true +--- + +We updated the live demo to be even more configurable. Now you can adjust all the options on an image when testing. + +We have also been releasing more examples which can be played with inside of the live demo. Give them a try here: HTML/CSS to Image Examples. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2021_02_16__improvements-to-transparency-rendering.md b/src/content/docs/changelog/2021_02_16__improvements-to-transparency-rendering.md new file mode 100644 index 0000000..e801d6a --- /dev/null +++ b/src/content/docs/changelog/2021_02_16__improvements-to-transparency-rendering.md @@ -0,0 +1,24 @@ +--- +title: "Improvements to transparency rendering" +slug: changelog/2021-02-16-improvements-to-transparency-rendering +description: "Transparent backgrounds are now supported for URL screenshots." +section: Changelog +tableOfContents: false +changelog: + date: '2021-02-16' + anchor: improvements-to-transparency-rendering +sidebar: + hidden: true +--- + +Background transparency now also works for images generated from URLs. To do it, pass the following code in your CSS param. + +``` +body { + background-color: transparent; +} +``` + +Note: this will only work for PNG's. Jpeg's do not support transparency. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2021_03_31__image-console-on-the-dashboard.md b/src/content/docs/changelog/2021_03_31__image-console-on-the-dashboard.md new file mode 100644 index 0000000..9a1b6d6 --- /dev/null +++ b/src/content/docs/changelog/2021_03_31__image-console-on-the-dashboard.md @@ -0,0 +1,18 @@ +--- +title: "Image console on the dashboard" +slug: changelog/2021-03-31-image-console-on-the-dashboard +description: "Create HTML/CSS images and URL screenshots from the dashboard console." +section: Changelog +tableOfContents: false +changelog: + date: '2021-03-31' + anchor: image-console-on-the-dashboard +sidebar: + hidden: true +--- + +We've made a bunch of improvements to the Dashboard. You can now create images in your own account using the Image Console tab. + +You can also create images using URL's from the console. Click the Options tab to see the new url field. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2021_04_24__hebrew-character-set-updated.md b/src/content/docs/changelog/2021_04_24__hebrew-character-set-updated.md new file mode 100644 index 0000000..48b7eb3 --- /dev/null +++ b/src/content/docs/changelog/2021_04_24__hebrew-character-set-updated.md @@ -0,0 +1,16 @@ +--- +title: "Hebrew character set updated" +slug: changelog/2021-04-24-hebrew-character-set-updated +description: "Updated default fonts fix Hebrew character rendering." +section: Changelog +tableOfContents: false +changelog: + date: '2021-04-24' + anchor: hebrew-character-set-updated +sidebar: + hidden: true +--- + +We released an update to our default fonts to fix a bug where hebrew characters were not rendering properly. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2021_05_15__chrome-version-updated.md b/src/content/docs/changelog/2021_05_15__chrome-version-updated.md new file mode 100644 index 0000000..aab08f0 --- /dev/null +++ b/src/content/docs/changelog/2021_05_15__chrome-version-updated.md @@ -0,0 +1,16 @@ +--- +title: "Chrome version updated" +slug: changelog/2021-05-15-chrome-version-updated +description: "The renderer receives an updated Chrome version." +section: Changelog +tableOfContents: false +changelog: + date: '2021-05-15' + anchor: chrome-version-updated +sidebar: + hidden: true +--- + +We updated the image renderer to use the newest build of Chrome. This means all of the latest features in Chrome will also render the same through the API. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2021_06_12__zapier-integration-updated.md b/src/content/docs/changelog/2021_06_12__zapier-integration-updated.md new file mode 100644 index 0000000..37e3df2 --- /dev/null +++ b/src/content/docs/changelog/2021_06_12__zapier-integration-updated.md @@ -0,0 +1,16 @@ +--- +title: "Zapier integration updated" +slug: changelog/2021-06-12-zapier-integration-updated +description: "Security and performance improvements for the Zapier integration." +section: Changelog +tableOfContents: false +changelog: + date: '2021-06-12' + anchor: zapier-integration-updated +sidebar: + hidden: true +--- + +Released a new version of the Zapier integration. Making security + performance improvements. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2021_07_23__large-image-performance-improvements.md b/src/content/docs/changelog/2021_07_23__large-image-performance-improvements.md new file mode 100644 index 0000000..14e88aa --- /dev/null +++ b/src/content/docs/changelog/2021_07_23__large-image-performance-improvements.md @@ -0,0 +1,16 @@ +--- +title: "Large image performance improvements" +slug: changelog/2021-07-23-large-image-performance-improvements +description: "Faster rendering for large images." +section: Changelog +tableOfContents: false +changelog: + date: '2021-07-23' + anchor: large-image-performance-improvements +sidebar: + hidden: true +--- + +We made a handful of performance improvements for large image rendering speed. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2021_10_29__dashboard-improvements-1.md b/src/content/docs/changelog/2021_10_29__dashboard-improvements-1.md new file mode 100644 index 0000000..d1b51f7 --- /dev/null +++ b/src/content/docs/changelog/2021_10_29__dashboard-improvements-1.md @@ -0,0 +1,16 @@ +--- +title: "Dashboard improvements" +slug: changelog/2021-10-29-dashboard-improvements-1 +description: "Dashboard and invoice improvements based on customer feedback." +section: Changelog +tableOfContents: false +changelog: + date: '2021-10-29' + anchor: dashboard-improvements-1 +sidebar: + hidden: true +--- + +We released several improvements to the dashboard and invoices based on your feedback. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2021_11_21__dashboard-improvements.md b/src/content/docs/changelog/2021_11_21__dashboard-improvements.md new file mode 100644 index 0000000..7a2bc7d --- /dev/null +++ b/src/content/docs/changelog/2021_11_21__dashboard-improvements.md @@ -0,0 +1,16 @@ +--- +title: "Dashboard improvements" +slug: changelog/2021-11-21-dashboard-improvements +description: "Inspect hourly, daily, and monthly image-usage rollups." +section: Changelog +tableOfContents: false +changelog: + date: '2021-11-21' + anchor: dashboard-improvements +sidebar: + hidden: true +--- + +We have added a `usage` endpoint to the API. This exposes the amount of images your account has created in hourly, daily and monthly rollups. [Learn more](/getting-started/using-the-api#checking-account-usage). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2022_05_18__ms_delay-improvements.md b/src/content/docs/changelog/2022_05_18__ms_delay-improvements.md new file mode 100644 index 0000000..2c520be --- /dev/null +++ b/src/content/docs/changelog/2022_05_18__ms_delay-improvements.md @@ -0,0 +1,21 @@ +--- +title: "ms_delay improvements" +slug: changelog/2022-05-18-ms_delay-improvements +description: "Rendering delays now support up to 20 seconds, with additional credits above five seconds." +section: Changelog +tableOfContents: false +changelog: + date: '2022-05-18' + anchor: ms_delay-improvements +sidebar: + hidden: true +--- + +This has been a much requested feature! + +We have increased the `ms_delay` limit to 20 seconds (20,000ms). Usage above 5000ms does cost an additional image credit. +For example, using `ms_delay` of 10000ms on an image will consume 2 image credits. + +This is useful for pages with very slow load times, such as metrics dashboards. We hope you find it useful! + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2022_06_01__integromat-integration-is-now-called-make.md b/src/content/docs/changelog/2022_06_01__integromat-integration-is-now-called-make.md new file mode 100644 index 0000000..5becd6d --- /dev/null +++ b/src/content/docs/changelog/2022_06_01__integromat-integration-is-now-called-make.md @@ -0,0 +1,16 @@ +--- +title: "Integromat integration is now called Make" +slug: changelog/2022-06-01-integromat-integration-is-now-called-make +description: "The Integromat integration is now named Make." +section: Changelog +tableOfContents: false +changelog: + date: '2022-06-01' + anchor: integromat-integration-is-now-called-make +sidebar: + hidden: true +--- + +FYI - Integromat has rebranded to Make. We have updated all our links and documentation to now point to Make. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2022_06_18__invoice-improvements.md b/src/content/docs/changelog/2022_06_18__invoice-improvements.md new file mode 100644 index 0000000..f760663 --- /dev/null +++ b/src/content/docs/changelog/2022_06_18__invoice-improvements.md @@ -0,0 +1,17 @@ +--- +title: "Invoice improvements" +slug: changelog/2022-06-18-invoice-improvements +description: "View invoices, download PDFs, and pay overdue invoices from the dashboard." +section: Changelog +tableOfContents: false +changelog: + date: '2022-06-18' + anchor: invoice-improvements +sidebar: + hidden: true +--- + +The invoice page has been upgraded. You can now view all of your invoices, download a PDF, and make payments +on any overdue invoices. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2023_04_12__getting-account-usage.md b/src/content/docs/changelog/2023_04_12__getting-account-usage.md new file mode 100644 index 0000000..57560f5 --- /dev/null +++ b/src/content/docs/changelog/2023_04_12__getting-account-usage.md @@ -0,0 +1,16 @@ +--- +title: "Getting account usage" +slug: changelog/2023-04-12-getting-account-usage +description: "Read account usage through the usage endpoint." +section: Changelog +tableOfContents: false +changelog: + date: '2023-04-12' + anchor: getting-account-usage +sidebar: + hidden: true +--- + +We've added a new page explaining how to [grab your account usage](/management-api/usage/) via the API. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2023_11_19__new-ms_delay-and-device_scale-guides.md b/src/content/docs/changelog/2023_11_19__new-ms_delay-and-device_scale-guides.md new file mode 100644 index 0000000..d6531d3 --- /dev/null +++ b/src/content/docs/changelog/2023_11_19__new-ms_delay-and-device_scale-guides.md @@ -0,0 +1,19 @@ +--- +title: "New ms_delay and device_scale guides" +slug: changelog/2023-11-19-new-ms_delay-and-device_scale-guides +description: "New guides explain rendering delays and device scale." +section: Changelog +tableOfContents: false +changelog: + date: '2023-11-19' + anchor: new-ms_delay-and-device_scale-guides +sidebar: + hidden: true +--- + +We've added new pages with detailed information on how to better use ms_delay and device_scale. + +1. [ms_delay](/parameters/ms_delay/) +2. [device_scale](/parameters/device_scale/) + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2023_12_20__learn-how-to-make-a-downloadable-image.md b/src/content/docs/changelog/2023_12_20__learn-how-to-make-a-downloadable-image.md new file mode 100644 index 0000000..deef721 --- /dev/null +++ b/src/content/docs/changelog/2023_12_20__learn-how-to-make-a-downloadable-image.md @@ -0,0 +1,16 @@ +--- +title: "Learn how to make a downloadable image" +slug: changelog/2023-12-20-learn-how-to-make-a-downloadable-image +description: "Use the dl parameter to make an image URL download its file." +section: Changelog +tableOfContents: false +changelog: + date: '2023-12-20' + anchor: learn-how-to-make-a-downloadable-image +sidebar: + hidden: true +--- + +Did you know? You can make your image downloadable by adding `?dl=1` to the end of the URL. Learn more here: [dl param](/parameters/dl/) + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2024_12_18__dpi-query-param.md b/src/content/docs/changelog/2024_12_18__dpi-query-param.md new file mode 100644 index 0000000..bf611ca --- /dev/null +++ b/src/content/docs/changelog/2024_12_18__dpi-query-param.md @@ -0,0 +1,17 @@ +--- +title: "DPI query param" +slug: changelog/2024-12-18-dpi-query-param +description: "Set an image’s DPI metadata with the dpi query parameter." +section: Changelog +tableOfContents: false +changelog: + date: '2024-12-18' + anchor: dpi-query-param +sidebar: + hidden: true +--- + +We've added a new query param `dpi` which allows you to set the DPI metadata tag on your generated image. For example `hcti.io/v1/image/123abc?dpi=300`. +This only sets the metadata tag, you must still create an image large enough for the needed DPI. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2025_06_15__single-request-image-generation-endpoint.md b/src/content/docs/changelog/2025_06_15__single-request-image-generation-endpoint.md new file mode 100644 index 0000000..226d1f6 --- /dev/null +++ b/src/content/docs/changelog/2025_06_15__single-request-image-generation-endpoint.md @@ -0,0 +1,24 @@ +--- +title: "Single-Request Image Generation endpoint" +slug: changelog/2025-06-15-single-request-image-generation-endpoint +description: "Render images on demand through signed create-and-render URLs." +section: Changelog +tableOfContents: false +changelog: + date: '2025-06-15' + anchor: single-request-image-generation-endpoint +sidebar: + hidden: true +--- + +We've released a powerful new endpoint that allows you to generate images from HTML/CSS in a single request using signed URLs. This new [create-and-render endpoint](/getting-started/create-and-render/) eliminates the need for the traditional two-step process of creating an image and then fetching it. + +Key benefits include: +- **Client-side friendly**: Generate image URLs without exposing your API key +- **No POST requests**: Skip the image creation step and go straight to rendering +- **HMAC authentication**: Secure signed URLs prevent unauthorized usage +- **Direct image response**: URLs return images immediately when accessed + +This endpoint is perfect for scenarios where you need to generate image URLs from client-side code or want to simplify your image generation workflow. The endpoint uses HMAC SHA256 authentication to ensure security while keeping your API key private. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2025_06_18__automatic-cookie-consent-banner-blocking.md b/src/content/docs/changelog/2025_06_18__automatic-cookie-consent-banner-blocking.md new file mode 100644 index 0000000..7296f1e --- /dev/null +++ b/src/content/docs/changelog/2025_06_18__automatic-cookie-consent-banner-blocking.md @@ -0,0 +1,20 @@ +--- +title: "Automatic cookie consent banner blocking" +slug: changelog/2025-06-18-automatic-cookie-consent-banner-blocking +description: "Automatically hide common cookie-consent banners in URL screenshots." +section: Changelog +tableOfContents: false +changelog: + date: '2025-06-18' + anchor: automatic-cookie-consent-banner-blocking +sidebar: + hidden: true +--- + +We've added a new `block_consent_banners` parameter that automatically blocks cookie consent popups and banners on websites. When set to `true`, the API will detect and hide common consent frameworks like OneTrust, Cookiebot, Quantcast Choice, TrustArc, and many others. + +This feature is especially useful for URL screenshots where cookie banners can interfere with the desired content. Instead of manually writing CSS to hide specific banners, you can now use this single parameter to handle most cases automatically. + +The automatic blocking is maintained and updated regularly to support new consent frameworks as they emerge. For custom implementations not covered by the automatic blocking, you can still use the existing CSS injection method. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2025_12_29__mcp-server-for-ai-assistants.md b/src/content/docs/changelog/2025_12_29__mcp-server-for-ai-assistants.md new file mode 100644 index 0000000..03c2afc --- /dev/null +++ b/src/content/docs/changelog/2025_12_29__mcp-server-for-ai-assistants.md @@ -0,0 +1,26 @@ +--- +title: "MCP Server for AI Assistants" +slug: changelog/2025-12-29-mcp-server-for-ai-assistants +description: "Create images and manage templates directly from compatible AI assistants." +section: Changelog +tableOfContents: false +changelog: + date: '2025-12-29' + anchor: mcp-server-for-ai-assistants +sidebar: + hidden: true +--- + +We've launched an MCP (Model Context Protocol) server that lets you generate images directly from AI coding assistants. Simply describe what you want, and the AI will create it for you using the HTML/CSS to Image API. + +The MCP server supports: +- **Image creation** from HTML/CSS or URLs +- **Template management** for reusable image designs +- **Batch image generation** for creating multiple images at once +- **OAuth authentication** for seamless, secure access + +Works with Cursor, Claude Code, Claude Desktop, Windsurf, Cline, Zed, OpenCode, and automation platforms like Zapier and Pipedream. + +[Learn more about the MCP Server integration](/integrations/mcp/) + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_01_10__official-net--c-nuget-packages.md b/src/content/docs/changelog/2026_01_10__official-net--c-nuget-packages.md new file mode 100644 index 0000000..9237be5 --- /dev/null +++ b/src/content/docs/changelog/2026_01_10__official-net--c-nuget-packages.md @@ -0,0 +1,31 @@ +--- +title: "Official .NET / C# NuGet Packages" +slug: changelog/2026-01-10-official-net--c-nuget-packages +description: "Official .NET packages for API access, dependency injection, Blazor, and Razor." +section: Changelog +tableOfContents: false +changelog: + date: '2026-01-10' + anchor: official-net--c-nuget-packages +sidebar: + hidden: true +--- + +We've released official NuGet packages for .NET developers! The new packages make it easy to integrate HTML/CSS to Image into your .NET applications with strongly-typed models and full async support. + +| Package | Description | +|:--------|:------------| +| [HtmlCssToImage](https://www.nuget.org/packages/HtmlCssToImage) | Core client library | +| [HtmlCssToImage.DependencyInjection](https://www.nuget.org/packages/HtmlCssToImage.DependencyInjection) | ASP.NET Core dependency injection | +| [HtmlCssToImage.Blazor](https://www.nuget.org/packages/HtmlCssToImage.Blazor) | Open Graph image tags for Blazor | +| [HtmlCssToImage.TagHelpers](https://www.nuget.org/packages/HtmlCssToImage.TagHelpers) | Razor tag helpers for MVC/Razor Pages | + +Key features: +- **Strongly-typed requests** for HTML/CSS, URL screenshots, and templates +- **Batch image creation** for generating multiple images in one call +- **Signed URL generation** for create-and-render workflows +- **Native AOT support** for .NET 9+ + +[View the C# documentation](/example-code/c/) or check out the [GitHub repository](https://github.com/htmlcsstoimage/dotnet-client). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_02_28__organizations-invites-and-user-permissions.md b/src/content/docs/changelog/2026_02_28__organizations-invites-and-user-permissions.md new file mode 100644 index 0000000..5c90ca7 --- /dev/null +++ b/src/content/docs/changelog/2026_02_28__organizations-invites-and-user-permissions.md @@ -0,0 +1,29 @@ +--- +title: "Organizations, invites, and user permissions" +slug: changelog/2026-02-28-organizations-invites-and-user-permissions +description: "Collaborate through organizations, invitations, and member roles." +section: Changelog +tableOfContents: false +changelog: + date: '2026-02-28' + anchor: organizations-invites-and-user-permissions +sidebar: + hidden: true +--- + +We've added **organizations**, **invites**, and **user permissions** so you can collaborate on an account with your team. + +- **Organizations** — Group API keys, usage, and billing under a single organization. You can create multiple organizations and switch between them. +- **Invites** — Owners and admins can invite people to join an organization by email. Invitees can accept or decline; accepted invites assign a role (Owner, Admin, or User). +- **User permissions** — Three roles control what members can do: + - **Owner** — Full control: manage billing, API keys, members, invites, and organization metadata. + - **Admin** — Manage billing, API keys, and users (invite members, change roles, remove members). Cannot assign or invite as Owner. + - **User** — View organization resources and create images. Cannot manage billing, API keys, or other members. + +**Organization settings** (members, invites, usage, billing): [https://htmlcsstoimage.com/dashboard/organization-settings](https://htmlcsstoimage.com/dashboard/organization-settings) + +**Account settings** (your email, organizations, switching orgs, pending invites): [https://htmlcsstoimage.com/account/settings](https://htmlcsstoimage.com/account/settings) + +For more detail, see [Organization settings](/guides/account/organization-settings/) and [Account settings](/guides/account/account-settings/) in the guides. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_04_18__route-renders-through-your-own-http-proxy.md b/src/content/docs/changelog/2026_04_18__route-renders-through-your-own-http-proxy.md new file mode 100644 index 0000000..6f0e6bd --- /dev/null +++ b/src/content/docs/changelog/2026_04_18__route-renders-through-your-own-http-proxy.md @@ -0,0 +1,22 @@ +--- +title: "Route renders through your own HTTP proxy" +slug: changelog/2026-04-18-route-renders-through-your-own-http-proxy +description: "Configure your own HTTP proxies and select them for image rendering." +section: Changelog +tableOfContents: false +changelog: + date: '2026-04-18' + anchor: route-renders-through-your-own-http-proxy +sidebar: + hidden: true +--- + +You can now configure HTTP proxies in the dashboard and route image renders through them. All outbound traffic for a render will go through the proxy you select. This is useful for restricting access to internal content, controlling the egress IP, or getting past bot detection. + +- **Configure proxies** at [https://htmlcsstoimage.com/dashboard/proxies](https://htmlcsstoimage.com/dashboard/proxies). Set a URL, port, optional auth, and optional **Bypass Hosts** (hostnames that should skip the proxy). +- **Use a proxy** by passing `proxy_id` on the create image request. +- **Disable safely** — turning a proxy off does not affect images that have already been generated. Only new renders that try to use that `proxy_id` will be rejected. + +Available on the **10,000 images/month plan or higher**. [Read the full guide](/guides/advanced/proxies/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_04_23__jumbo-images--render-up-to-80000px-without-quality-loss.md b/src/content/docs/changelog/2026_04_23__jumbo-images--render-up-to-80000px-without-quality-loss.md new file mode 100644 index 0000000..d76aae1 --- /dev/null +++ b/src/content/docs/changelog/2026_04_23__jumbo-images--render-up-to-80000px-without-quality-loss.md @@ -0,0 +1,25 @@ +--- +title: "Jumbo images — render up to 80,000px without quality loss" +slug: changelog/2026-04-23-jumbo-images--render-up-to-80000px-without-quality-loss +description: "Render large images at full resolution with tiled rendering and jumbo dimensions." +section: Changelog +tableOfContents: false +changelog: + date: '2026-04-23' + anchor: jumbo-images--render-up-to-80000px-without-quality-loss +sidebar: + hidden: true +--- + +You can now render images far beyond Chrome's usual ~8000px limit by setting `jumbo_max_width` and `jumbo_max_height`. The renderer splits the output into 8000 x 8000 tiles, renders each natively, and stitches them into a single image. Preserving your full `device_scale` so the result stays sharp at any size. + +- **Render up to 80,000px on each side** (subject to a 400,000,000-pixel total area cap). +- **Quality is preserved.** Each tile renders at full resolution and the final image keeps its `device_scale`. No more blurry downscaled output when your render naturally exceeds 8000px. +- **Both params required together.** Pass `jumbo_max_width` and `jumbo_max_height` on the create image request. Works with both `html`/`css` and `url` renders. +- **Billed per tile.** Each 8000 x 8000 tile consumes one image credit. + +Without jumbo, a render larger than ~8000px is automatically scaled down to fit, which usually produces a blurry image. If you're rendering big, set the jumbo params. + +[Read the full Jumbo Images guide](/guides/advanced/jumbo-images/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_06_24__template-editor-for-visual-template-design.md b/src/content/docs/changelog/2026_06_24__template-editor-for-visual-template-design.md new file mode 100644 index 0000000..55b5f3f --- /dev/null +++ b/src/content/docs/changelog/2026_06_24__template-editor-for-visual-template-design.md @@ -0,0 +1,25 @@ +--- +title: "Template Editor for visual template design" +slug: changelog/2026-06-24-template-editor-for-visual-template-design +description: "Build reusable image templates visually with blocks, variables, and previews." +section: Changelog +tableOfContents: false +changelog: + date: '2026-06-24' + anchor: template-editor-for-visual-template-design +sidebar: + hidden: true +--- + +We've introduced the Template Editor, a visual way to build saved image templates in the dashboard. + +Instead of writing every template by hand in HTML and CSS, you can build reusable image designs from blocks, style them visually, connect template variables, preview with test data, and render the saved template through the API. + +- **Visual blocks** for text, images, shapes, HTML, and layout panels. +- **Canvas controls** for image size, background, and render settings. +- **Template variables** for text, image URLs, colors, numbers, and other render-time values. +- **Preview and export tools** to test your template before using it in production. + +Templates built in the editor are saved alongside HTML/CSS templates and render through the existing Templates API. See the [Template Editor docs](/template-editor/) to get started. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_06_29__template-editor-context-menu--input-improvements.md b/src/content/docs/changelog/2026_06_29__template-editor-context-menu--input-improvements.md new file mode 100644 index 0000000..90e3ab8 --- /dev/null +++ b/src/content/docs/changelog/2026_06_29__template-editor-context-menu--input-improvements.md @@ -0,0 +1,18 @@ +--- +title: "Template Editor: Context Menu & Input Improvements" +slug: changelog/2026-06-29-template-editor-context-menu--input-improvements +description: "New context-menu actions, gradient controls, and independent X/Y positioning." +section: Changelog +tableOfContents: false +changelog: + date: '2026-06-29' + anchor: template-editor-context-menu--input-improvements +sidebar: + hidden: true +--- + +- You can now right-click on blocks and have quick access to set a subset of their properties. +- The gradient input now has a more intuitive slider interface and interactive preview. +- The quick position popover now lets you adjust a block's X and Y position independently, so you can center it horizontally without changing its vertical position, or vice versa. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_07_16__n8n-integration.md b/src/content/docs/changelog/2026_07_16__n8n-integration.md new file mode 100644 index 0000000..dfafb24 --- /dev/null +++ b/src/content/docs/changelog/2026_07_16__n8n-integration.md @@ -0,0 +1,24 @@ +--- +title: "n8n integration" +slug: changelog/2026-07-16-n8n-integration +description: "Generate images, PDFs, screenshots, and signed URLs in n8n workflows." +section: Changelog +tableOfContents: false +changelog: + date: '2026-07-16' + anchor: n8n-integration +sidebar: + hidden: true +--- + +The HTML/CSS to Image integration for n8n is now available. It supports: + +- Creating images and PDFs from HTML/CSS +- Taking screenshots of webpage URLs +- Rendering saved templates with dynamic values +- Generating signed render-on-demand URLs +- Returning image metadata, binary PNG/JPG/WebP/PDF files, or both + +[Read the n8n integration guide](/integrations/n8n/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_07_19__htmlcsstoimage-net-client-v060.md b/src/content/docs/changelog/2026_07_19__htmlcsstoimage-net-client-v060.md new file mode 100644 index 0000000..278d3be --- /dev/null +++ b/src/content/docs/changelog/2026_07_19__htmlcsstoimage-net-client-v060.md @@ -0,0 +1,19 @@ +--- +title: "HtmlCssToImage .NET Client v0.6.0" +slug: changelog/2026-07-19-htmlcsstoimage-net-client-v060 +description: "The .NET client adds render-time resizing, DPI adjustments, and cropping." +section: Changelog +tableOfContents: false +changelog: + date: '2026-07-19' + anchor: htmlcsstoimage-net-client-v060 +sidebar: + hidden: true +--- + +Our C#/.NET client was updated with improved performance for building urls and new `ImageRenderOptions` to support render-time: +- Resizing (`height` and `width`) +- DPI adjustments +- Full cropping support + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_07_20__transparent-backgrounds-with-one-parameter.md b/src/content/docs/changelog/2026_07_20__transparent-backgrounds-with-one-parameter.md new file mode 100644 index 0000000..9e83418 --- /dev/null +++ b/src/content/docs/changelog/2026_07_20__transparent-backgrounds-with-one-parameter.md @@ -0,0 +1,20 @@ +--- +title: "Transparent backgrounds with one parameter" +slug: changelog/2026-07-20-transparent-backgrounds-with-one-parameter +description: "Set transparent_background to render a transparent PNG with one option." +section: Changelog +tableOfContents: false +changelog: + date: '2026-07-20' + anchor: transparent-backgrounds-with-one-parameter +sidebar: + hidden: true +--- + +You can now render a transparent PNG by setting `transparent_background: true` on the create image request. It works with both HTML/CSS and URL-based images, as well as saved templates and image batches. + +The existing CSS-based transparent background method remains supported. The official clients expose the new option as `TransparentBackground` in .NET and `transparent_background` in TypeScript. + +[Read the transparent background guide](/guides/styling/transparent-background/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_07_21__image-deletion-in-net-v080-and-typescript-v050.md b/src/content/docs/changelog/2026_07_21__image-deletion-in-net-v080-and-typescript-v050.md new file mode 100644 index 0000000..43418ce --- /dev/null +++ b/src/content/docs/changelog/2026_07_21__image-deletion-in-net-v080-and-typescript-v050.md @@ -0,0 +1,23 @@ +--- +title: "Image deletion in .NET v0.8.0 and TypeScript v0.5.0" +slug: changelog/2026-07-21-image-deletion-in-net-v080-and-typescript-v050 +description: "Delete individual images or batches with the official .NET and TypeScript clients." +section: Changelog +tableOfContents: false +changelog: + date: '2026-07-21' + anchor: image-deletion-in-net-v080-and-typescript-v050 +sidebar: + hidden: true +--- + +The official .NET and TypeScript clients now support deleting images through the API: + +- Delete one image with `DeleteImageAsync` in .NET or `deleteImage` in TypeScript. +- Delete multiple images in one request with `DeleteImageBatchAsync` in .NET or `deleteImageBatch` in TypeScript. + +The .NET client's `ApiResult` now implements `IDisposable` because it owns the raw `HttpResponseMessage`. The raw response remains available when you need headers, the originating request, or other transport details. C# callers should use `using` or `using var` when reading API results. + +[View the C# examples](/example-code/c/) or [TypeScript examples](/example-code/typescript/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_07_27__store-rendered-images-in-your-own-bucket.md b/src/content/docs/changelog/2026_07_27__store-rendered-images-in-your-own-bucket.md new file mode 100644 index 0000000..a373a08 --- /dev/null +++ b/src/content/docs/changelog/2026_07_27__store-rendered-images-in-your-own-bucket.md @@ -0,0 +1,25 @@ +--- +title: "Store rendered images in your own bucket" +slug: changelog/2026-07-27-store-rendered-images-in-your-own-bucket +description: "Write rendered images to S3, R2, and other supported storage destinations." +section: Changelog +tableOfContents: false +changelog: + date: '2026-07-27' + anchor: store-rendered-images-in-your-own-bucket +sidebar: + hidden: true +--- + +You can now configure storage destinations for Amazon S3, Cloudflare R2, Backblaze B2, DigitalOcean Spaces, Wasabi, Google Cloud Storage, and other S3-compatible services. + +- Add and test destinations from the dashboard, with credentials scoped to your bucket and optional key prefix. +- Select the default, EU, or FedRAMP data jurisdiction when connecting a Cloudflare R2 bucket. +- Pass `storage_destination_id` when creating an HTML/CSS image, URL screenshot, image batch, or template. +- Keep the normal HTML/CSS to Image copy while also writing to your bucket, or choose to **Disable HCTI Storage** for files that should live only in your storage. +- Authenticate `PUT /v1/store/...` requests with your user ID and API key, and use the structured response to see the outcome, object status, bucket, and key for the base image and any transformation. +- Use `storage_destination_id` in the official TypeScript client or `StorageDestinationId` in the .NET client. + +Storage destinations are available on the 10,000 images/month plan or higher. [Read the Storage Destinations guide](/guides/advanced/storage-destinations/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_07_31__custom-request-headers-for-url-screenshots.md b/src/content/docs/changelog/2026_07_31__custom-request-headers-for-url-screenshots.md new file mode 100644 index 0000000..e42f9ec --- /dev/null +++ b/src/content/docs/changelog/2026_07_31__custom-request-headers-for-url-screenshots.md @@ -0,0 +1,25 @@ +--- +title: "Custom request headers for URL screenshots" +slug: changelog/2026-07-31-custom-request-headers-for-url-screenshots +description: "Send custom headers when capturing authenticated pages and preview environments." +section: Changelog +tableOfContents: false +changelog: + date: '2026-07-31' + anchor: custom-request-headers-for-url-screenshots +sidebar: + hidden: true +--- + +URL screenshots can now include custom HTTP headers for authenticated pages, preview environments, origin-specific behavior, and other controlled workflows. + +- Pass `headers` as a flat JSON object, or repeat `headers=name:value` in form and create-and-render requests. +- Custom headers are restricted to top-level navigations on the requested URL's origin by default. +- Set `include_headers_on_subrequests: true` when same-origin CSS, images, JavaScript, or API requests also require the headers. +- Use `additional_header_origins` to explicitly allow exact cross-origin schemes, hosts, and ports. Headers are never sent to origins outside this allowlist. +- Set `identify_as_hcti: true` to add `X-HCTI-SCREENSHOT: 1` when your application only needs to identify a screenshot request. This predictable value should not be used for authentication. +- Use the new options with the official .NET client v0.10.0 and TypeScript client v0.7.0, including signed create-and-render URLs. + +Avoid long-lived credentials and do not put secrets in signed URLs. [Read the custom headers documentation](/parameters/headers/) or see how to [allow authorized renders through Cloudflare](/guides/debugging/cloudflare-challenges/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_08_05__control-duplicate-image-detection-with-dedupe_duration_s.md b/src/content/docs/changelog/2026_08_05__control-duplicate-image-detection-with-dedupe_duration_s.md new file mode 100644 index 0000000..0e7986d --- /dev/null +++ b/src/content/docs/changelog/2026_08_05__control-duplicate-image-detection-with-dedupe_duration_s.md @@ -0,0 +1,24 @@ +--- +title: "Control duplicate image detection with dedupe_duration_s" +slug: changelog/2026-08-05-control-duplicate-image-detection-with-dedupe_duration_s +description: "Control how long matching image requests can reuse an existing image." +section: Changelog +tableOfContents: false +changelog: + date: '2026-08-05' + anchor: control-duplicate-image-detection-with-dedupe_duration_s +sidebar: + hidden: true +--- + +You can now set `dedupe_duration_s` when creating an HTML/CSS image or URL screenshot. When an image with the same content and parameters was created within that lookback window, the API can return its existing image ID and URL without consuming another image credit. + +- URL screenshots default to a 0-second lookback. +- HTML/CSS images default to 30 days on Free and Basic plans, 180 days on Pro, and 365 days on Scale. +- Free and Basic plans support either `0` or the plan default. Pro and Scale plans support any value from `0` through their plan maximum. +- The option is available for standard single-image POST requests and MCP-created images. It does not apply to batches, templates, or signed create-and-render URLs. +- The official TypeScript client v0.8.0 and .NET client v0.11.0 now expose the option when creating images. It is not included in generated create-and-render URLs or batch requests. + +Read the [`dedupe_duration_s` parameter docs](/parameters/dedupe_duration_s/) or the [duplicate detection guide](/guides/advanced/duplicate-detection/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_08_16__automatic-open-graph-images-for-websites-and-cmss.md b/src/content/docs/changelog/2026_08_16__automatic-open-graph-images-for-websites-and-cmss.md new file mode 100644 index 0000000..73615fa --- /dev/null +++ b/src/content/docs/changelog/2026_08_16__automatic-open-graph-images-for-websites-and-cmss.md @@ -0,0 +1,25 @@ +--- +title: "Automatic Open Graph images for websites and CMSs" +slug: changelog/2026-08-16-automatic-open-graph-images-for-websites-and-cmss +description: "Give every public page a matching social image with one OG Image Config." +section: Changelog +tableOfContents: false +changelog: + date: '2026-08-16' + anchor: automatic-open-graph-images-for-websites-and-cmss +sidebar: + hidden: true +--- + +OG Image Configs provide one path-based image URL pattern for every public page on a website, store, CMS, or static site. + +- Connect an exact website origin that you own or administer. +- Use **Page Screenshot** to capture the page or a selected element, or use **Template Values** to render page metadata in an HCTI template. +- Choose one universal image, adapt one render to platform-specific bounds, or render each platform size separately. +- Control how often HCTI refreshes page metadata and use `hcti:content_version` when content at the same path needs a new image identity. +- Add page-specific screenshot controls with supported `hcti:` metadata. +- Follow dedicated setup guides for Shopify, Squarespace, Webflow, Wix, WordPress, Jekyll, Astro, and Sitepress. + +[Set up automatic Open Graph images](/getting-started/og-images/) or choose a [platform and CMS guide](/guides/og-images/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_08_21__ruby-client-v020.md b/src/content/docs/changelog/2026_08_21__ruby-client-v020.md new file mode 100644 index 0000000..672e8ea --- /dev/null +++ b/src/content/docs/changelog/2026_08_21__ruby-client-v020.md @@ -0,0 +1,27 @@ +--- +title: "Ruby client v0.2.0" +slug: changelog/2026-08-21-ruby-client-v020 +description: "Ruby gains signed URLs, batch operations, and support for additional rendering options." +section: Changelog +tableOfContents: false +changelog: + date: '2026-08-21' + anchor: ruby-client-v020 +sidebar: + hidden: true +--- + +Version 0.2.0 of the official [HTML/CSS to Image Ruby client](https://github.com/htmlcsstoimage/ruby-client) is now available. + +- Generate signed create-and-render URLs for webpage screenshots and saved templates. +- Create and delete images in batches. +- Create images from saved templates, list template versions, and create new template versions. +- Use current parameters including `dedupe_duration_s`, `storage_destination_id`, transparent backgrounds, custom request headers, proxies, jumbo images, and consent-banner blocking. + +This release changes how signed template URL tokens are generated. Ruby client 0.1.x URL-decoded the query string before calculating its HMAC. Version 0.2.0 signs the exact encoded query string included after `?`, as required by the current API. + +Regenerating a template URL with the same inputs after upgrading therefore produces a different token. URLs previously generated by 0.1.x continue to work. + +[See the Ruby examples and upgrade notes](/example-code/ruby/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_08_27__choose-the-returned-file-format-in-image-creation-requests.md b/src/content/docs/changelog/2026_08_27__choose-the-returned-file-format-in-image-creation-requests.md new file mode 100644 index 0000000..ff1c010 --- /dev/null +++ b/src/content/docs/changelog/2026_08_27__choose-the-returned-file-format-in-image-creation-requests.md @@ -0,0 +1,31 @@ +--- +title: "Choose the returned file format in image creation requests" +slug: changelog/2026-08-27-choose-the-returned-file-format-in-image-creation-requests +description: "Choose PNG, JPG, WebP, or PDF in image creation requests." +section: Changelog +tableOfContents: false +changelog: + date: '2026-08-27' + anchor: choose-the-returned-file-format-in-image-creation-requests +sidebar: + hidden: true +--- + +Image creation requests can now include `format` in the request body. This parameter selects the file extension included in the returned URL; it does not change the stored image definition. + +- Set `format` to `png`, `jpg`, `webp`, or `pdf` for an HTML/CSS image, URL screenshot, saved-template image, or image batch. +- Raster images are rendered and stored as PNGs. JPG and WebP URLs convert that stored PNG when requested. +- PDFs are rendered and saved separately when a PDF URL is requested. +- The same image ID can still be requested later with a different supported extension. +- Batch requests can set `format` in `default_options` or override it in an individual variation. +- When omitted, the API returns its default extensionless URL, which renders as PNG. + +The official clients now expose the body parameter and apply it to generated signed URL paths: + +- [.NET client v0.12.0](https://github.com/htmlcsstoimage/dotnet-client) with `RenderImageFormat.PDF` support. +- [TypeScript client v0.9.0](https://github.com/htmlcsstoimage/ts-client). +- [Ruby client v0.3.0](https://github.com/htmlcsstoimage/ruby-client). + +[Read the `format` parameter documentation](/parameters/format/) or compare output types in the [file formats guide](/guides/styling/file-formats/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_09_02__htmlcss-to-image-is-now-verified-by-n8n.md b/src/content/docs/changelog/2026_09_02__htmlcss-to-image-is-now-verified-by-n8n.md new file mode 100644 index 0000000..897ac93 --- /dev/null +++ b/src/content/docs/changelog/2026_09_02__htmlcss-to-image-is-now-verified-by-n8n.md @@ -0,0 +1,27 @@ +--- +title: "HTML/CSS to Image is now verified by n8n" +slug: changelog/2026-09-02-htmlcss-to-image-is-now-verified-by-n8n +description: "Install the verified HCTI integration directly from the n8n Nodes panel." +section: Changelog +tableOfContents: false +changelog: + date: '2026-09-02' + anchor: htmlcss-to-image-is-now-verified-by-n8n +sidebar: + hidden: true +--- + +The official HTML/CSS to Image integration is now verified by n8n. Instance owners and admins can find and install it directly from the n8n Nodes panel on n8n Cloud or a self-hosted instance. + +Use the integration to: + +- Create images and PDFs from HTML/CSS. +- Take screenshots of webpage URLs. +- Render saved templates with dynamic values. +- Generate signed render-on-demand URLs. +- Delete images by ID. +- Return image metadata, binary PNG/JPG/WebP/PDF files, or both. + +[View HTML/CSS to Image on n8n](https://n8n.io/integrations/htmlcss-to-image-api/) or [read the integration guide](/integrations/n8n/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_09_03__official-python-and-php-clients.md b/src/content/docs/changelog/2026_09_03__official-python-and-php-clients.md new file mode 100644 index 0000000..b4df00d --- /dev/null +++ b/src/content/docs/changelog/2026_09_03__official-python-and-php-clients.md @@ -0,0 +1,21 @@ +--- +title: "Official Python and PHP clients" +slug: changelog/2026-09-03-official-python-and-php-clients +description: "Official Python and PHP packages with typed requests and signed URL helpers." +section: Changelog +tableOfContents: false +changelog: + date: '2026-09-03' + anchor: official-python-and-php-clients +sidebar: + hidden: true +--- + +Official HTML/CSS to Image clients are now available for Python and PHP. Each package provides typed requests and responses, configurable HTTP transport, and helpers for templates, batches, render options, image deletion, and signed URLs. + +- Python: [`html-css-to-image` on PyPI](https://pypi.org/project/html-css-to-image/) and the [Python examples](/example-code/python/). +- PHP: [`html-css-to-image/client` on Packagist](https://packagist.org/packages/html-css-to-image/client) and the [PHP examples](/example-code/php/). + +The complete package documentation is maintained in the [Python](https://github.com/htmlcsstoimage/python-client) and [PHP](https://github.com/htmlcsstoimage/php-client) repositories. + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_09_14__management-api-and-scoped-permissions.md b/src/content/docs/changelog/2026_09_14__management-api-and-scoped-permissions.md new file mode 100644 index 0000000..6bb7213 --- /dev/null +++ b/src/content/docs/changelog/2026_09_14__management-api-and-scoped-permissions.md @@ -0,0 +1,20 @@ +--- +title: "Management API and scoped permissions" +slug: changelog/2026-09-14-management-api-and-scoped-permissions +description: "Manage organization resources through REST and MCP with scoped permissions." +section: Changelog +tableOfContents: false +changelog: + date: '2026-09-14' + anchor: management-api-and-scoped-permissions +sidebar: + hidden: true +--- + +Manage API keys, proxies, storage destinations, and Open Graph configurations through the [Management API](/management-api/). Create application-specific credentials with explicit permissions, monitor [usage](/management-api/usage/), and automate resource configuration. + +MCP adds proxy, storage destination, and OG configuration management tools. Approve the access you need through [OAuth authorization](/integrations/mcp/permissions/); API key management remains available through REST and the dashboard. See the [complete tools reference](/integrations/mcp/tools/). + +Management resource operations have per-organization rate limits shared across REST and MCP: 100 reads and 20 writes per minute for each resource family. These limits are separate from image credits. See [rate limits](/getting-started/using-the-api/rate-limits/). + +[All updates](/changelog/) diff --git a/src/content/docs/changelog/2026_09_15__official-go-client.md b/src/content/docs/changelog/2026_09_15__official-go-client.md new file mode 100644 index 0000000..7f384af --- /dev/null +++ b/src/content/docs/changelog/2026_09_15__official-go-client.md @@ -0,0 +1,18 @@ +--- +title: "Official Go client" +slug: changelog/2026-09-15-official-go-client +description: "Typed Go requests, responses, and helpers for images, templates, batches, and signed URLs." +section: Changelog +tableOfContents: false +changelog: + date: '2026-09-15' + anchor: official-go-client +sidebar: + hidden: true +--- + +The official HTML/CSS to Image Go client is now available for Go 1.21+. It provides typed requests and responses for HTML/CSS images, URL screenshots, and templates, plus helpers for Google Fonts, PDF options, batches, image deletion, resizing and cropping, and signed URLs. + +Install it with `go get github.com/htmlcsstoimage/go-client`. See the [Go examples](/example-code/go/), [client repository](https://github.com/htmlcsstoimage/go-client), and [package documentation on pkg.go.dev](https://pkg.go.dev/github.com/htmlcsstoimage/go-client). + +[All updates](/changelog/) diff --git a/example-code/c.md b/src/content/docs/example-code/c.mdx similarity index 93% rename from example-code/c.md rename to src/content/docs/example-code/c.mdx index 214921a..af90655 100644 --- a/example-code/c.md +++ b/src/content/docs/example-code/c.mdx @@ -1,22 +1,19 @@ --- -layout: page title: C# / .NET -parent: Example code -permalink: /example-code/c/ +slug: example-code/c description: >- Convert HTML to an image (png, jpg or webp) with C# / .NET + the HTML/CSS to Image API. Official NuGet package for .NET 6+. --- -# C# / .NET: HTML/CSS to Image -{: .no_toc } -{: .fs-9 } +import Help from '../../../components/Help.astro'; +import { LinkButton } from '@astrojs/starlight/components'; -Generate png, jpg or webp images with C# and .NET. Renders exactly like Google Chrome. -{: .fs-6 .fw-300 } + -[Live demo](https://htmlcsstoimage.com/#demo){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 target="_blank" } -[Get an API Key](https://htmlcsstoimage.com){: .btn .fs-5 .mb-4 .mb-md-0 target="_blank" } -
    +Generate PNG, JPG, or WebP images with C# and .NET, rendered in Google Chrome. + +Live demo +Get an API key ## Official .NET Package @@ -31,7 +28,6 @@ We provide an official NuGet package for .NET that makes it easy to generate ima For full documentation, see the [GitHub repository](https://github.com/htmlcsstoimage/dotnet-client). -
    ## Quick Start @@ -77,7 +73,6 @@ if (result.Success) API calls return an `ApiResult` that owns the raw `HttpResponseMessage`. The raw response lets you inspect headers, the originating request, and other HTTP details when needed. Use `using` or `using var` so it is disposed after you finish reading the result. -
    ## Creating Images from a URL @@ -98,7 +93,6 @@ if (result.Success) } ``` -
    ## Using Templates @@ -118,7 +112,6 @@ var request = new CreateTemplatedImageRequest using var result = await client.CreateImageAsync(request); ``` -
    ## ASP.NET Core Integration @@ -159,7 +152,6 @@ public class ImageService } ``` -
    ## Blazor Integration @@ -169,7 +161,6 @@ For Blazor applications, use the `HtmlCssToImage.Blazor` package to easily gener dotnet add package HtmlCssToImage.Blazor ``` -
    ## Razor Pages / MVC Tag Helpers @@ -179,7 +170,6 @@ For ASP.NET Core Razor Pages and MVC applications, use the `HtmlCssToImage.TagHe dotnet add package HtmlCssToImage.TagHelpers ``` -
    ## Batch Image Creation @@ -204,7 +194,6 @@ if (result.Success) } ``` -
    ## Signed URLs (Create and Render) @@ -224,13 +213,11 @@ Console.WriteLine($"Signed URL: {url}"); This is useful when you have content that may never be viewed, allowing you to generate images on-demand without using image credits upfront. -
    ## Performance & Native AOT The official .NET client is built with performance in mind and fully supports Native AOT (Ahead-of-Time) compilation in .NET 9+. The client uses source-generated JSON serialization internally. -
    ## Plain HTTP Example @@ -267,7 +254,6 @@ Console.WriteLine(json); // {"url":"https://hcti.io/v1/image/be4c5118-fe19-462b-a49e-48cf72697a9d"} ``` -
    ## Legacy WebClient Example @@ -300,4 +286,4 @@ Console.WriteLine(resultString); // {"url":"https://hcti.io/v1/image/404ed70d-dcb9-4778-9be4-fad912321d5b"} ``` -{% include code_footer.md version=2 %} + diff --git a/example-code/curl.md b/src/content/docs/example-code/curl.mdx similarity index 70% rename from example-code/curl.md rename to src/content/docs/example-code/curl.mdx index 6a03a05..ae5d404 100644 --- a/example-code/curl.md +++ b/src/content/docs/example-code/curl.mdx @@ -1,22 +1,19 @@ --- -layout: page title: Curl -parent: Example code -permalink: /example-code/curl/ +slug: example-code/curl description: >- Convert HTML to an image (png, jpg or webp) with Curl + the HTML/CSS to Image API. Renders exactly like Google Chrome. --- -# Curl -{: .no_toc } -{: .fs-9 } +import Help from '../../../components/Help.astro'; +import { LinkButton } from '@astrojs/starlight/components'; -Generate a png, jpg or webp images from your terminal with cURL. -{: .fs-4 .fw-300 } +
    -[Live demo](https://htmlcsstoimage.com/#demo){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 target="_blank" } -[Get an API Key](https://htmlcsstoimage.com){: .btn .fs-5 .mb-4 .mb-md-0 target="_blank" } -
    +Generate PNG, JPG, or WebP images from your terminal with cURL. + +Live demo +Get an API key ## Generate an image with cURL @@ -24,7 +21,7 @@ Run this command in your terminal to generate an image using the API. For more details on how this works, see [Creating an image](/getting-started/using-the-api#creating-an-image). -```ruby +```bash # Replace UserID and APIKey with your credentials from the dashboard https://htmlcsstoimage.com/dashboard curl -X POST https://hcti.io/v1/image -u 'UserID:APIKey'\ -d html="
    Pong ✅
    " \ @@ -35,14 +32,14 @@ curl -X POST https://hcti.io/v1/image -u 'UserID:APIKey'\ The API will return a json payload with the URL to your new image. -```javascript +```json { "url":"https://hcti.io/v1/image/1eecf460-e2e5-4db1-9db6-cf862c34a744" } ``` ## Advanced example Here we use additional parameters. Note that each line ends with a `\`. -```ruby +```bash # Replace UserID and APIKey with your credentials from the dashboard https://htmlcsstoimage.com/dashboard curl -X POST https://hcti.io/v1/image -u 'UserID:APIKey'\ -d html="
    Pong ✅
    " \ @@ -55,13 +52,13 @@ curl -X POST https://hcti.io/v1/image -u 'UserID:APIKey'\ In this example, we grab the contents of a local HTML file and pass them in to the `html` param. -The `cat` command outputs the content of the file. By wrapping this in `$()` we are able to get the HTMl included in the payload. +Use `--data-urlencode html@path/to/file.html` to read and encode the HTML file directly. -```ruby +```bash curl -X POST https://hcti.io/v1/image -u 'UserID:APIKey'\ - -d html="$(cat path/to/file.html)" \ + --data-urlencode html@path/to/file.html \ -d css=".ping { padding: 20px; font-family: 'sans-serif'; }" ``` -{% include code_footer.md version=3 %} + diff --git a/example-code/elixir.md b/src/content/docs/example-code/elixir.mdx similarity index 92% rename from example-code/elixir.md rename to src/content/docs/example-code/elixir.mdx index dd8962c..1fa9a21 100644 --- a/example-code/elixir.md +++ b/src/content/docs/example-code/elixir.mdx @@ -1,14 +1,14 @@ --- -layout: page title: Elixir - HTML to Image Example -nav_title: Elixir -parent: Example code -permalink: /example-code/elixir/ +slug: example-code/elixir description: >- Convert HTML to an image (png, jpg or webp) with Elixir + the HTML/CSS to Image API. Renders exactly like Google Chrome. --- -{% include intro.md language="Elixir" %} +import CodeIntro from '../../../components/CodeIntro.astro'; +import Help from '../../../components/Help.astro'; + + This example sends JSON using [`Jason`](https://hexdocs.pm/jason/) for encoding and Erlang/OTP's built-in `:httpc` client for the HTTP request. @@ -22,7 +22,6 @@ defp deps do end ``` -{% raw %} ```elixir :inets.start() :ssl.start() @@ -65,9 +64,6 @@ end # {"url":"https://hcti.io/v1/image/1113184e-419f-49f1-b231-2069942a186f"} ``` -{% endraw %} - -
    ## Phoenix example with Req @@ -86,7 +82,6 @@ end Store your credentials in config or environment variables, then call the API from a context or service module. -{% raw %} ```elixir defmodule MyApp.Images.HtmlCssToImage do @endpoint "https://hcti.io/v1/image" @@ -114,6 +109,5 @@ defmodule MyApp.Images.HtmlCssToImage do end end ``` -{% endraw %} -{% include code_footer.md version=1 %} + diff --git a/example-code/go.md b/src/content/docs/example-code/go.mdx similarity index 94% rename from example-code/go.md rename to src/content/docs/example-code/go.mdx index f31e6a2..32702f7 100644 --- a/example-code/go.md +++ b/src/content/docs/example-code/go.mdx @@ -1,14 +1,14 @@ --- -layout: page title: Go - HTML to Image Example -nav_title: Go -parent: Example code -permalink: /example-code/go/ +slug: example-code/go description: >- Convert HTML to an image (png, jpg or webp) with Go + the HTML/CSS to Image API. Official Go client for Go 1.21+. --- -{% include intro.md language="Go" %} +import CodeIntro from '../../../components/CodeIntro.astro'; +import Help from '../../../components/Help.astro'; + + ## Official Go client @@ -48,7 +48,6 @@ The module's package name is `hcti`. Alternatively, use `hcti.NewClientFromEnv() The client also supports URL screenshots, PDF options, templates, batches, image deletion, resizing and cropping, and signed URLs. See the [Go client repository](https://github.com/htmlcsstoimage/go-client) for usage and runnable examples, and the [package documentation on pkg.go.dev](https://pkg.go.dev/github.com/htmlcsstoimage/go-client) for the API reference. -
    ## Direct HTTP example @@ -106,4 +105,4 @@ func main() { } ``` -{% include code_footer.md version=2 %} + diff --git a/example-code/google-apps-script.md b/src/content/docs/example-code/google-apps-script.mdx similarity index 71% rename from example-code/google-apps-script.md rename to src/content/docs/example-code/google-apps-script.mdx index 16a616d..b155a92 100644 --- a/example-code/google-apps-script.md +++ b/src/content/docs/example-code/google-apps-script.mdx @@ -1,22 +1,19 @@ --- -layout: page title: Google Apps Script -parent: Example code -permalink: /example-code/google-apps-script/ +slug: example-code/google-apps-script description: >- Convert HTML to an image (png, jpg or webp) with Google Apps Script + the HTML/CSS to Image API. Renders exactly like Google Chrome. --- -# Google Apps Script: HTML/CSS to Image -{: .no_toc } -{: .fs-9 } +import Help from '../../../components/Help.astro'; +import { LinkButton } from '@astrojs/starlight/components'; -Generate a png, jpg or webp images with Google Apps Script. -{: .fs-4 .fw-300 } +
    -[Live demo](https://htmlcsstoimage.com/#demo){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 target="_blank" } -[Get an API Key](https://htmlcsstoimage.com){: .btn .fs-5 .mb-4 .mb-md-0 target="_blank" } -
    +Generate PNG, JPG, or WebP images with Google Apps Script. + +Live demo +Get an API key ## Generate an image with Google Apps Script With [Google Apps Script](https://developers.google.com/apps-script), you can build add-ons for Google. It is based on JavaScript, but includes built in functions that you'll need to use to work with the HTML/CSS to Image API. @@ -29,6 +26,10 @@ This shows you how to authenticate with the API and pass parameters in a POST re ```javascript function createImage(html, css) { + const properties = PropertiesService.getScriptProperties(); + const username = properties.getProperty('HCTI_API_ID'); + const password = properties.getProperty('HCTI_API_KEY'); + if (!username || !password) throw new Error('Set HCTI_API_ID and HCTI_API_KEY in Script Properties'); let formData = { 'html': html, 'css': css, @@ -42,7 +43,7 @@ function createImage(html, css) { // Replace username with your User ID and password with your API Key options.headers = {"Authorization": "Basic " + Utilities.base64Encode(username + ":" + password)} - JSON.parse(UrlFetchApp.fetch("https://hcti.io/v1/image", options)).url + return JSON.parse(UrlFetchApp.fetch("https://hcti.io/v1/image", options).getContentText()).url } function testCreateImage() { @@ -73,4 +74,4 @@ var css = "div { color: red; }" google.script.run.withSuccessHandler(onSuccess).withFailureHandler(onFailure).createImage(html, css); ``` -{% include code_footer.md version=2 %} + diff --git a/example-code/index.md b/src/content/docs/example-code/index.mdx similarity index 83% rename from example-code/index.md rename to src/content/docs/example-code/index.mdx index 5f33937..61edce5 100644 --- a/example-code/index.md +++ b/src/content/docs/example-code/index.mdx @@ -1,26 +1,20 @@ --- -layout: default title: Example code -permalink: /example-code/ -nav_order: 10 -has_children: true -has_toc: false +slug: example-code description: >- HTML to Image and PDF code examples for Python, PHP, JavaScript, TypeScript, Ruby, Go, C#/.NET, Java, Rust, Kotlin, Elixir, and more. Copy-paste ready API integration code. --- -# Example code -{: .no_toc } -{: .fs-9 } +import ParameterTable from '../../../components/ParameterTable.astro'; +import { Aside, LinkButton } from '@astrojs/starlight/components'; -Use these examples to render HTML/CSS, webpage screenshots, PDFs, and reusable templates from your application. -{: .fs-4 .fw-300 } +
    -[Live demo](https://htmlcsstoimage.com/#demo){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 } -[Get an API Key](https://htmlcsstoimage.com){: .btn .fs-5 .mb-4 .mb-md-0 } +Use these examples to render HTML/CSS, webpage screenshots, PDFs, and reusable templates from your application. -{% include hint.md title="Using an AI coding assistant?" text="Skip writing code entirely. Connect our [MCP Server](/integrations/mcp/) to generate images directly from Cursor or Claude Code." %} +Live demo +Get an API key -
    + ## Works with any programming language @@ -128,15 +122,15 @@ The examples send JSON. The API also accepts form data; when using form data, ne | Name | Type | Description | |:-----|:-----|:------------| -| **html**† | `String` | HTML to render. Send a snippet or a full HTML document. | -| **css** | `String` | CSS for your HTML. When used with `url`, the CSS is injected into the page. | -| **url**† | `String` | Fully qualified public URL to screenshot. When passed, it overrides `html`. | +| `html`† | `String` | HTML to render. Send a snippet or a full HTML document. | +| `css` | `String` | CSS for your HTML. When used with `url`, the CSS is injected into the page. | +| `url`† | `String` | Fully qualified public URL to screenshot. When passed, it overrides `html`. | -{% include hint.md title="Required params" text="† Either `html` OR `url` is required, but not both. `css` is optional." %} + ### Rendering options -{% include additional_parameters.md %} + When rendering templated images, send a `POST` request to `https://hcti.io/v1/image/:template_id` with `template_values` as JSON: diff --git a/example-code/java.md b/src/content/docs/example-code/java.mdx similarity index 92% rename from example-code/java.md rename to src/content/docs/example-code/java.mdx index 3aac726..2f3506d 100644 --- a/example-code/java.md +++ b/src/content/docs/example-code/java.mdx @@ -1,14 +1,14 @@ --- -layout: page title: Java - HTML to Image Example -nav_title: Java -parent: Example code -permalink: /example-code/java/ +slug: example-code/java description: >- Convert HTML to an image (png, jpg or webp) with Java + the HTML/CSS to Image API. Renders exactly like Google Chrome. --- -{% include intro.md language="Java" %} +import CodeIntro from '../../../components/CodeIntro.astro'; +import Help from '../../../components/Help.astro'; + + Java includes an HTTP client in the standard library, but not a JSON encoder. This example uses the built-in Java 11+ `HttpClient` with [`Jackson`](https://github.com/FasterXML/jackson) to encode the JSON request body. @@ -69,4 +69,4 @@ public class HctiExample { } ``` -{% include code_footer.md version=1 %} + diff --git a/example-code/javascript.md b/src/content/docs/example-code/javascript.mdx similarity index 60% rename from example-code/javascript.md rename to src/content/docs/example-code/javascript.mdx index cb58118..ffeb885 100644 --- a/example-code/javascript.md +++ b/src/content/docs/example-code/javascript.mdx @@ -1,21 +1,24 @@ --- -layout: default title: JavaScript - HTML to Image Example -nav_title: JavaScript -parent: Example code -permalink: /example-code/javascript/ +slug: example-code/javascript description: >- Convert HTML to an image (png, jpg or webp) with JavaScript + the HTML/CSS to Image API. Renders exactly like Google Chrome. --- -{% include intro.md language="JavaScript" %} +import CodeIntro from '../../../components/CodeIntro.astro'; +import Help from '../../../components/Help.astro'; +import { Aside } from '@astrojs/starlight/components'; + + Looking for the official npm client? See the **Official npm client** section on the [TypeScript example page](/example-code/typescript/). -This example uses the [Request client](https://github.com/request/request-promise). Install with `npm install request`. +This example uses Node.js's built-in `fetch`. Run it as an ES module on Node.js 18 or newer. ```javascript -const request = require('request') +const API_ID = process.env.HCTI_API_ID; +const API_KEY = process.env.HCTI_API_KEY; +if (!API_ID || !API_KEY) throw new Error('Set HCTI_API_ID and HCTI_API_KEY'); // Define your HTML/CSS const data = { @@ -26,20 +29,23 @@ const data = { // Create an image by sending a POST to the API. // Retrieve your api_id and api_key from the Dashboard. https://htmlcsstoimage.com/dashboard -request.post({ url: 'https://hcti.io/v1/image', form: data}) - .auth(API_ID, API_KEY) - .on('data', function(data) { - console.log(JSON.parse(data)) - }) +const response = await fetch('https://hcti.io/v1/image', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Basic ' + Buffer.from(`${API_ID}:${API_KEY}`).toString('base64'), + }, + body: JSON.stringify(data), +}); +if (!response.ok) throw new Error(`API request failed: ${response.status}`); +console.log(await response.json()); // {"url": "https://hcti.io/v1/image/1113184e-419f-49f1-b231-2069942a186f"} ``` To see all of the available parameters, see: [Creating an image](/getting-started/using-the-api/#creating-an-image). -{% include hint.md title="Can I use this in a browser?" text="We recommend only using the API server-side. This is important because it keeps your API key secret. If you expose them in the browser, they can be used by anyone." %} - -
    + ## JavaScript example - async/await @@ -73,7 +79,6 @@ async function createImage() { createImage(); ``` -
    ## Plain JavaScript \(Node.js\) example @@ -99,16 +104,23 @@ const options = { method: 'POST', headers: { 'Content-Type': 'application/json', - 'Authorization': 'Basic ' + new Buffer(apiId + ':' + apiKey).toString('base64') + 'Authorization': 'Basic ' + Buffer.from(apiId + ':' + apiKey).toString('base64') } } const req = https.request(options, (res) => { console.log(`statusCode: ${res.statusCode}`) - res.on('data', (d) => { - const image = JSON.parse(d) - console.log(image["url"]) + let body = ''; + res.setEncoding('utf8'); + res.on('data', (chunk) => { body += chunk; }); + res.on('end', () => { + if (res.statusCode < 200 || res.statusCode >= 300) { + console.error(`API request failed: ${res.statusCode}`, body); + return; + } + try { console.log(JSON.parse(body).url); } + catch (error) { console.error('Invalid JSON response', error); } }) }) @@ -120,10 +132,11 @@ req.write(data) req.end() ``` -## Client side JavaScript example with Fetch API -- Use the [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) to make an HTTP POST request to the API -- Supported by modern browsers -- Recommended for internal applications only to keep your API key safe +
    + +## Browser integration with Fetch + +Use the [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) to call your own backend. The backend validates the request and calls HCTI with server-side credentials using the example above. This keeps your API key out of browser code, including internal applications. ```javascript const json = { @@ -131,19 +144,16 @@ const json = { css: ".test { background-color: green; }" }; -const username = "user-id"; -const password = "api-key"; - const options = { method: 'POST', body: JSON.stringify(json), headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Basic ' + btoa(username + ":" + password) + 'Content-Type': 'application/json' } } -fetch('https://hcti.io/v1/image', options) +// Implement this route in your backend and return the HCTI JSON response. +fetch('/api/create-image', options) .then(res => { if (res.ok) { return res.json(); @@ -158,4 +168,4 @@ fetch('https://hcti.io/v1/image', options) .catch(err => console.error(err)); ``` -{% include code_footer.md version=1 %} + diff --git a/example-code/kotlin.md b/src/content/docs/example-code/kotlin.mdx similarity index 90% rename from example-code/kotlin.md rename to src/content/docs/example-code/kotlin.mdx index f7de592..4d4c9c9 100644 --- a/example-code/kotlin.md +++ b/src/content/docs/example-code/kotlin.mdx @@ -1,14 +1,14 @@ --- -layout: page title: Kotlin - HTML to Image Example -nav_title: Kotlin -parent: Example code -permalink: /example-code/kotlin/ +slug: example-code/kotlin description: >- Convert HTML to an image (png, jpg or webp) with Kotlin + the HTML/CSS to Image API. Renders exactly like Google Chrome. --- -{% include intro.md language="Kotlin" %} +import CodeIntro from '../../../components/CodeIntro.astro'; +import Help from '../../../components/Help.astro'; + + This example uses the built-in Java 11+ `HttpClient` from Kotlin and [`kotlinx.serialization`](https://github.com/Kotlin/kotlinx.serialization) to encode the JSON request body. @@ -64,4 +64,4 @@ fun main() { } ``` -{% include code_footer.md version=1 %} + diff --git a/example-code/php.md b/src/content/docs/example-code/php.mdx similarity index 73% rename from example-code/php.md rename to src/content/docs/example-code/php.mdx index 4fc4995..8d6d7da 100644 --- a/example-code/php.md +++ b/src/content/docs/example-code/php.mdx @@ -1,14 +1,14 @@ --- -layout: page title: PHP - HTML to Image Example -nav_title: PHP -parent: Example code -permalink: /example-code/php/ +slug: example-code/php description: >- Convert HTML to an image (png, jpg or webp) with PHP + the HTML/CSS to Image API. Official Composer package for PHP 8.2+. --- -{% include intro.md language="PHP" %} +import CodeIntro from '../../../components/CodeIntro.astro'; +import Help from '../../../components/Help.astro'; + + ## Official Composer client @@ -48,12 +48,31 @@ if ($result instanceof CreateImageSuccessResponse) { The client also supports URL screenshots, templates, batches, image deletion, render options, and signed URLs. See the [PHP client repository](https://github.com/htmlcsstoimage/php-client) for complete usage and API documentation. -
    ## Direct HTTP example ```php -{% include_snippet everything from snippets/plain_php.php %} + true, + CURLOPT_POST => true, + CURLOPT_USERPWD => 'your-api-id:your-api-key', + CURLOPT_POSTFIELDS => http_build_query([ + 'html' => "
    Pong ✅
    ", + 'css' => '.ping { padding: 20px; font-family: sans-serif; }', + ]), +]); +$body = curl_exec($ch); +if ($body === false) { + throw new RuntimeException(curl_error($ch)); +} +$status = curl_getinfo($ch, CURLINFO_HTTP_CODE); +curl_close($ch); +if ($status < 200 || $status >= 300) { + throw new RuntimeException("API request failed ($status): $body"); +} +echo json_decode($body, true, 512, JSON_THROW_ON_ERROR)['url']; ``` ## PHP example with Guzzle library @@ -69,7 +88,7 @@ require 'vendor/autoload.php'; $html = "
    Pong ✅
    "; $css = ".ping { padding: 20px; font-family: 'sans-serif'; }"; -$client = new GuzzleHttpClient(); +$client = new \GuzzleHttp\Client(); // Retrieve your user_id and api_key from https://htmlcsstoimage.com/dashboard $res = $client->request('POST', 'https://hcti.io/v1/image', [ 'auth' => ['user_id', 'api_key'], @@ -87,4 +106,4 @@ The code turns out to be a bit more readable and less complex when using Guzzle. When running this script on a Windows machine, it's possible you'll get an SSL error. The fix for this [is here](https://stackoverflow.com/questions/28858351/php-ssl-certificate-error-unable-to-get-local-issuer-certificate/32095378#32095378). -{% include code_footer.md version=2 %} + diff --git a/example-code/python.md b/src/content/docs/example-code/python.mdx similarity index 83% rename from example-code/python.md rename to src/content/docs/example-code/python.mdx index 8fe7d26..d7fdc41 100644 --- a/example-code/python.md +++ b/src/content/docs/example-code/python.mdx @@ -1,14 +1,14 @@ --- -layout: page title: Python - HTML to Image Example -nav_title: Python -parent: Example code -permalink: /example-code/python/ +slug: example-code/python description: >- Convert HTML to an image (png, jpg or webp) with Python + the HTML/CSS to Image API. Official PyPI package for Python 3.10+. --- -{% include intro.md language="Python" %} +import CodeIntro from '../../../components/CodeIntro.astro'; +import Help from '../../../components/Help.astro'; + + ## Official PyPI client @@ -37,7 +37,6 @@ else: The client also supports URL screenshots, templates, batches, image deletion, render options, and signed URLs. See the [Python client repository](https://github.com/htmlcsstoimage/python-client) for complete usage and API documentation. -
    ## Direct HTTP example @@ -54,10 +53,11 @@ data = { 'html': "
    Hello, world!
    ", 'css': ".box { color: white; background-color: #0f79b9; padding: 10px; font-family: Roboto }", 'google_fonts': "Roboto" } -image = requests.post(url = HCTI_API_ENDPOINT, data = data, auth=(HCTI_API_USER_ID, HCTI_API_KEY)) +image = requests.post(url=HCTI_API_ENDPOINT, data=data, auth=(HCTI_API_USER_ID, HCTI_API_KEY), timeout=60) +image.raise_for_status() print("Your image URL is: %s"%image.json()['url']) # https://hcti.io/v1/image/7ed741b8-f012-431e-8282-7eedb9910b32 ``` -{% include code_footer.md version=1 %} + diff --git a/example-code/ruby.md b/src/content/docs/example-code/ruby.mdx similarity index 84% rename from example-code/ruby.md rename to src/content/docs/example-code/ruby.mdx index aeb40a6..9906a88 100644 --- a/example-code/ruby.md +++ b/src/content/docs/example-code/ruby.mdx @@ -1,23 +1,19 @@ --- -layout: page title: Ruby - HTML to Image Example -nav_title: Ruby -parent: Example code -permalink: /example-code/ruby/ +slug: example-code/ruby description: >- Convert HTML to an image (png, jpg or webp) with Ruby + the HTML/CSS to Image API. Renders exactly like Google Chrome. --- -# Ruby: HTML/CSS to Image -{: .no_toc } -{: .fs-9 } +import Help from '../../../components/Help.astro'; +import { Aside, LinkButton } from '@astrojs/starlight/components'; -Generate a png, jpg or webp images with Ruby. Renders exactly like Google Chrome. -{: .fs-6 .fw-300 } +
    -[Live demo](https://htmlcsstoimage.com/#demo){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 target="_blank" } -[Get an API Key](https://htmlcsstoimage.com){: .btn .fs-5 .mb-4 .mb-md-0 target="_blank" } -
    +Generate PNG, JPG, or WebP images with Ruby, rendered in Google Chrome. + +Live demo +Get an API key ## Generating images with Ruby The API takes your HTML/CSS and runs it inside a real instance of Google Chrome to convert your html into an image. @@ -159,7 +155,7 @@ This example uses Rails built in caching. require "htmlcsstoimage" def self.fetch_url(html:, css: nil, google_fonts: nil) - cache_key = "htmlcssimage/#{html}/#{css}/#{google_fonts}" + cache_key = "htmlcssimage/#{Digest::SHA256.hexdigest([html, css, google_fonts].to_json)}" cached_url = Rails.cache.read(cache_key) return cached_url if cached_url.present? @@ -168,7 +164,7 @@ def self.fetch_url(html:, css: nil, google_fonts: nil) image = client.create_image(html, css: css, google_fonts: google_fonts) if image.url - Rails.cache.write(cache_key, image.url, expires_in: CACHE_EXPIRATION) + Rails.cache.write(cache_key, image.url, expires_in: 24.hours) end image.url @@ -187,7 +183,7 @@ html = render_to_string("path/to/view", formats: :html, layout: false) redirect_to fetch_url(html: html, google_fonts: "Roboto|Roboto+Condensed"), status: :found ``` -{% include hint.md title="Real world example" text="Take a look at [dev.to](https://dev.to)'s source code to see how they implemented this for generating social cards. [Code on GitHub.](https://github.com/thepracticaldev/dev.to/blob/9442fde9e799e0eaf82723550f29e0a677a0db2b/app/controllers/social_previews_controller.rb#L61)" %} + -{% include code_footer.md version=1 %} + diff --git a/example-code/rust.md b/src/content/docs/example-code/rust.mdx similarity index 87% rename from example-code/rust.md rename to src/content/docs/example-code/rust.mdx index 482c819..5022700 100644 --- a/example-code/rust.md +++ b/src/content/docs/example-code/rust.mdx @@ -1,14 +1,14 @@ --- -layout: page title: Rust - HTML to Image Example -nav_title: Rust -parent: Example code -permalink: /example-code/rust/ +slug: example-code/rust description: >- Convert HTML to an image (png, jpg or webp) with Rust + the HTML/CSS to Image API. Renders exactly like Google Chrome. --- -{% include intro.md language="Rust" %} +import CodeIntro from '../../../components/CodeIntro.astro'; +import Help from '../../../components/Help.astro'; + + Rust's standard library does not include an HTTP client. This example uses [`reqwest`](https://docs.rs/reqwest/) for HTTP and [`serde_json`](https://docs.rs/serde_json/) to build the JSON request body. @@ -50,4 +50,4 @@ fn main() -> Result<(), Box> { } ``` -{% include code_footer.md version=1 %} + diff --git a/example-code/typescript.md b/src/content/docs/example-code/typescript.mdx similarity index 90% rename from example-code/typescript.md rename to src/content/docs/example-code/typescript.mdx index ae06362..93c30f4 100644 --- a/example-code/typescript.md +++ b/src/content/docs/example-code/typescript.mdx @@ -1,14 +1,15 @@ --- -layout: default title: TypeScript - HTML to Image Example -nav_title: TypeScript -parent: Example code -permalink: /example-code/typescript/ +slug: example-code/typescript description: >- Convert HTML to an image (png, jpg or webp) with TypeScript + the HTML/CSS to Image API. Renders exactly like Google Chrome. --- -{% include intro.md language="TypeScript" %} +import CodeIntro from '../../../components/CodeIntro.astro'; +import Help from '../../../components/Help.astro'; +import { Aside } from '@astrojs/starlight/components'; + + ## Official npm client @@ -39,7 +40,7 @@ if (result.success) { You can also generate signed URLs, render templates, and create image batches. See the [TypeScript client repository](https://github.com/htmlcsstoimage/ts-client) for full usage details. -
    +## Axios example This example uses the [axios package](https://www.npmjs.com/package/axios). Install with `npm install axios`. @@ -90,13 +91,11 @@ createImage() To see all of the available parameters, see: [Creating an image](/getting-started/using-the-api/#creating-an-image). -{% include hint.md title="Can I use this in a browser?" text="We recommend only using the API server-side. This is important because it keeps your API key secret. If you expose them in the browser, they can be used by anyone." %} - -
    + ## TypeScript example with Fetch API -Using the built-in Fetch API (available in Node.js 18+ and modern browsers). +Use the built-in Fetch API in server-side Node.js 18 or newer. ```typescript interface ImageRequest { @@ -138,7 +137,6 @@ createImage({ html, css }) .catch(error => console.error(error)); ``` -
    ## TypeScript with full type definitions @@ -153,11 +151,11 @@ export interface HtmlCssToImageRequest { css?: string; /** The URL of a webpage to screenshot */ url?: string; - /** Google fonts to load (comma separated) */ + /** Google fonts to load (pipe separated) */ google_fonts?: string; /** Delay in milliseconds before capturing */ ms_delay?: number; - /** Device scale factor (1-3) */ + /** Device scale factor */ device_scale?: number; /** Whether to render the full page */ full_screen?: boolean; @@ -219,7 +217,6 @@ const image = await client.createImage({ console.log(image.url); ``` -
    ## URL to Image with TypeScript @@ -242,6 +239,7 @@ async function screenshotUrl(request: ScreenshotRequest): Promise { } }); + if (!response.ok) throw new Error(`API request failed: ${response.status}`); const data = await response.json(); return data.url; } @@ -256,4 +254,4 @@ const imageUrl = await screenshotUrl({ console.log(imageUrl); ``` -{% include code_footer.md version=1 %} + diff --git a/example-code/vb.net.md b/src/content/docs/example-code/vb.net.mdx similarity index 78% rename from example-code/vb.net.md rename to src/content/docs/example-code/vb.net.mdx index 45c00b8..0410731 100644 --- a/example-code/vb.net.md +++ b/src/content/docs/example-code/vb.net.mdx @@ -1,22 +1,19 @@ --- -layout: page title: VB.NET -parent: Example code -permalink: /example-code/vb.net/ +slug: example-code/vb.net description: >- Convert HTML to an image (png, jpg or webp) with VB.NET + the HTML/CSS to Image API. Renders exactly like Google Chrome. --- -# VB.NET: HTML/CSS to Image -{: .no_toc } -{: .fs-9 } +import Help from '../../../components/Help.astro'; +import { LinkButton } from '@astrojs/starlight/components'; -Generate a png, jpg or webp images from your terminal with VB.NET -{: .fs-4 .fw-300 } +
    -[Live demo](https://htmlcsstoimage.com/#demo){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 target="_blank" } -[Get an API Key](https://htmlcsstoimage.com){: .btn .fs-5 .mb-4 .mb-md-0 target="_blank" } -
    +Generate PNG, JPG, or WebP images with VB.NET. + +Live demo +Get an API key ## Generate an image with VB.NET The API takes your HTML/CSS and runs it in an instance of Google Chrome to convert your html into an image. @@ -57,4 +54,4 @@ End Module ``` -{% include code_footer.md version=1 %} + diff --git a/faq.md b/src/content/docs/faq.md similarity index 93% rename from faq.md rename to src/content/docs/faq.md index 6924941..4d1ae96 100644 --- a/faq.md +++ b/src/content/docs/faq.md @@ -1,16 +1,11 @@ --- -layout: page title: FAQ -permalink: /faq/ -nav_order: 50 +slug: faq description: Frequently asked questions about the HTML/CSS to Image API - file formats, pricing, rate limits, and more. --- -# Frequently Asked Questions -{: .no_toc } -{: .fs-9 } +
    Not finding your answer here? Please email us: support@htmlcsstoimage.com. We enjoy helping people debug their HTML. -{: .fs-4 .fw-300 }
    @@ -22,7 +17,7 @@ PNG (default), JPG, WebP, and PDF. Simply change the file extension on your imag ### What are the maximum image dimensions? -There's no strict maximum size. The [`viewport_width`](/parameters/viewport/#viewport-width-and-height) limit is 6000 pixels. For height, there's no set limit—`full_screen` screenshots can reach ~10,000 pixels tall. +Standard renders that exceed the renderer's normal size limit can be downscaled. For larger output, use [Jumbo Images](/guides/advanced/jumbo-images/), which support up to 80,000 pixels per side within a 400,000,000-pixel total area limit. Viewport settings and final output dimensions are different; see [viewport](/parameters/viewport/) and [device scale](/parameters/device_scale/). Keep in mind images render at 2x by default, so the actual output resolution is double the viewport size. Smaller images will render faster and perform better. @@ -112,7 +107,7 @@ Yes, set `full_screen: true` to capture the entire scrollable height of a page, No. Our rendering servers scale dynamically on AWS, so we are unable provide a static IP allowlist. -If you're taking screenshots of protected URLs, we recommend adding a custom query parameter to the URL (for example `?hcti=1`). Then create a firewall rule (such as in Cloudflare) that allows requests when that query parameter is present. +For protected URLs you control, use [custom request headers](/parameters/headers/) or a [configured proxy](/guides/advanced/proxies/). A predictable query parameter such as `?hcti=1` is not authentication. See [Cloudflare access guidance](/guides/debugging/cloudflare-challenges/). ### How do I block cookie consent banners? @@ -136,7 +131,7 @@ Yes! Change the file extension to `.pdf` on any image URL. You can also customiz ### How do I generate social media images (OG images)? -Create a 1200x630px template with your branding, then generate unique images for each page by passing dynamic content. Many companies like Dev.to use this for automated social cards. +Create a 1200x630px template with your branding, then generate unique images for each page by passing dynamic content. [See our social cards guide](/use-cases/social-cards/). @@ -250,7 +245,7 @@ Email us! **support@htmlcsstoimage.com**. We'd love to hear from you. We're expe "name": "What are the maximum image dimensions?", "acceptedAnswer": { "@type": "Answer", - "text": "There's no strict maximum size. The viewport_width limit is 6000 pixels. For height, there's no set limit—full_screen screenshots can reach ~10,000 pixels tall. Images render at 2x by default, so actual output resolution is double the viewport size." + "text": "Standard renders can be downscaled when they exceed the renderer's size limit. Jumbo Images support up to 80,000 pixels per side within a 400,000,000-pixel total area limit. Viewport size and final output dimensions are different." } }, { @@ -322,7 +317,7 @@ Email us! **support@htmlcsstoimage.com**. We'd love to hear from you. We're expe "name": "Do you have a list of IP addresses I can allowlist?", "acceptedAnswer": { "@type": "Answer", - "text": "No. Our rendering servers scale dynamically on AWS, so we don't provide a static IP allowlist. If you're taking screenshots of protected URLs, add a custom query parameter to the URL (for example ?hcti=1) and create a firewall rule (such as in Cloudflare) that allows requests when that query parameter is present." + "text": "No. Our rendering servers scale dynamically, so we do not provide a static IP allowlist. For protected URLs you control, use custom request headers or a configured proxy. A predictable query parameter is not authentication." } }, { diff --git a/getting-started/create-and-render.md b/src/content/docs/getting-started/create-and-render.mdx similarity index 71% rename from getting-started/create-and-render.md rename to src/content/docs/getting-started/create-and-render.mdx index ab5a672..04e6f77 100644 --- a/getting-started/create-and-render.md +++ b/src/content/docs/getting-started/create-and-render.mdx @@ -1,55 +1,50 @@ --- -layout: page -title: Signed Image URLs -permalink: /getting-started/create-and-render/ -parent: Getting started -nav_order: 6 +title: Signed image URLs +slug: getting-started/create-and-render description: >- Generate signed image URLs from HTML, public webpages, or template values with a single authenticated GET request. --- -# Single-Request Image Generation -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Endpoint from '../../../components/Endpoint.astro'; +import ParameterTable from '../../../components/ParameterTable.astro'; +import Help from '../../../components/Help.astro'; -Generate images from HTML/CSS, URLs, or templates in a single request with signed URLs. -{: .fs-6 .fw-300 } + -
    +Generate images from HTML/CSS, URLs, or templates in a single request with signed URLs. -{% include hint.md title="Recommendation" text="We recommend using the [standard API endpoint](/getting-started/using-the-api/) for most use cases. Only use this endpoint if you specifically need to generate image URLs from client-side code or need to avoid the two-step create-then-fetch process." %} + -{% include hint.md title="Publishing social cards?" text="If each image corresponds to a public page on your website or CMS, an [OG Image Config](/getting-started/og-images/) is usually simpler. It maps page paths to stable image URLs and does not require an HMAC token for every page." %} + ## Key benefits This endpoint allows you to generate image URLs that directly render images when accessed: -- **No POST request needed**: Generate image URLs client-side without making API calls -- **Client-side friendly**: Use signed URLs to keep your API Key secure -- **Simplified workflow**: Skip the image creation step and go straight to image rendering +- **No POST request needed**: Generate signed URLs locally on your server or during a build, without an API call +- **Browser-ready URLs**: Embed the finished URL without exposing your API Key +- **On-demand rendering**: The first image request triggers generation - **Template ready**: Create reusable signed image URLs from template values Unlike the standard endpoint that requires a POST request followed by using the returned URL, this endpoint lets you construct a signed URL that will generate and return the image when accessed. Each API key has an associated API ID (public) and API Key (secret). The token is generated by creating an HMAC SHA256 hash of the query string (without the `?`) using your API Key as the secret. For HTML/CSS and URL renders, the signed URL includes your API ID. For templated image URLs, the signed URL uses the `template_id` instead. -{% include hint.md title="Security note" text="Never expose your API Key in client-side code. The API ID and generated token are safe to use client-side." %} + ## Creating an image To generate an image with a signed URL, construct a URL with your API ID and token: -
    -  get https://hcti.io/v1/image/create-and-render/:api_id/:token/:format
    -
    + -### URL Components +### URL components | Component | Description | |:-------------|:------------------| -| **api_id** | Your public API ID from the dashboard | -| **token** | HMAC SHA256 hash of the query string using your API Key (see below for how to generate) | -| **format** | Optional file format: `png` (default), `jpg`, `webp`, or `pdf` | +| `api_id` | Your public API ID from the dashboard | +| `token` | HMAC SHA256 hash of the query string using your API Key (see below for how to generate) | +| `format` | Optional file format: `png` (default), `jpg`, `webp`, or `pdf` | ### Parameters @@ -57,37 +52,31 @@ The parameters are the same as the [standard API endpoint](/getting-started/usin | Name | Type | Description | |:-------------|:------------------|:------| -| **html**† | `String` | This is the HTML you want to render. You can send an HTML snippet \(`
    Your content
    `\) or an entire webpage. | -| **css** | `String` | The CSS for your image. When using with `url` it will be injected into the page. | -| **url**† | `String` | The fully qualified URL to a public webpage. When passed this will override the html param and will generate a screenshot of the url. | - -{% include hint.md title="Required params" text="† Either `url` OR `html` is required, but not both. `css` is optional." %} +| `html`† | `String` | This is the HTML you want to render. You can send an HTML snippet \(`
    Your content
    `\) or an entire webpage. | +| `css` | `String` | The CSS for your image. When using with `url` it will be injected into the page. | +| `url`† | `String` | The fully qualified URL to a public webpage. When passed this will override the html param and will generate a screenshot of the url. | -
    + ### Additional parameters Optional parameters for greater control over your image. -{% include additional_parameters.md create_and_render=true %} - -
    + ## Creating a templated image URL To generate an image from a template with a signed URL, construct a URL with your `template_id` and token. You do not need to include your API ID in the path. -
    -  get https://hcti.io/v1/image/:template_id/:token/:format?
    -
    + -### URL Components +### URL components | Component | Description | |:-------------|:------------------| -| **template_id** | The template ID returned by the [template API](/getting-started/templates/#creating-a-template) | -| **token** | HMAC SHA256 hash of the query string using your API Key | -| **format** | Optional file format: `png` (default), `jpg`, `webp`, or `pdf`. | +| `template_id` | The template ID returned by the [template API](/getting-started/templates/#creating-a-template) | +| `token` | HMAC SHA256 hash of the query string using your API Key | +| `format` | Optional file format: `png` (default), `jpg`, `webp`, or `pdf`. | ### Parameters @@ -95,14 +84,14 @@ Template values are passed as query string parameters. Each query parameter name | Name | Type | Description | |:-------------|:------------------|:------| -| **template values** | `String`, `Number`, `Boolean`, or `JSON` | Values for the variables in your template. For editor templates, see the [Variables guide](/template-editor/variables/). | -| **template_version** | `Integer` | Optional. Render a specific version of the template. Include this in the query string before generating the token. | +| `template values` | `String`, `Number`, `Boolean`, or `JSON` | Values for the variables in your template. For editor templates, see the [Variables guide](/template-editor/variables/). | +| `template_version` | `Integer` | Optional. Render a specific version of the template. Include this in the query string before generating the token. | Nested objects and arrays should be serialized as JSON and URL encoded. The token must be generated from the exact encoded query string you put after `?`. For example, these template values: -```javascript +```json { "title": "Launch", "author": { @@ -119,9 +108,7 @@ author=%7B%22name%22%3A%22Jeff%22%7D&title=%22Launch%22 The `author` value decodes to `{"name":"Jeff"}`. The `title` value decodes to `"Launch"`. -{% include hint.md title="Use an official client" text="The [TypeScript](/example-code/typescript/), [.NET](/example-code/c/), [Python](/example-code/python/), and [PHP](/example-code/php/) clients include signed URL helpers so you do not need to hand-build the query string or HMAC token." %} - -
    + ## Understanding HMAC authentication @@ -153,15 +140,13 @@ Your final URL would be: https://hcti.io/v1/image/create-and-render/your-api-id-here/ac5553c5a9031e09f4580101080045e7e4cbd1734aa1b53a94f1006c3496ca21/png?html=%3Cdiv%3EHello%3C%2Fdiv%3E ``` -
    - ## Examples ### Official client helpers The official clients generate the signed URL for you and keep the API Key on your server. -#### [TypeScript Client](/example-code/typescript/#official-npm-client) +#### [TypeScript client](/example-code/typescript/#official-npm-client) ```typescript import { HtmlCssToImageClient } from '@html-css-to-image/client'; @@ -174,7 +159,7 @@ const imageUrl = client.generateTemplatedImageUrl('t-b0354248-e7f6-4cca-81c6-2b4 }); ``` -#### [.Net Client](/example-code/c/#official-net-package) +#### [.NET client](/example-code/c/#official-net-package) ```csharp using HtmlCssToImage; @@ -197,7 +182,7 @@ var imageUrl = client.CreateTemplatedImageUrl( }); ``` -#### [Python Client](/example-code/python/#official-pypi-client) +#### [Python client](/example-code/python/#official-pypi-client) ```python from html_css_to_image import HtmlCssToImageClient @@ -212,7 +197,7 @@ with HtmlCssToImageClient.from_env() as client: ) ``` -#### [PHP Client](/example-code/php/#official-composer-client) +#### [PHP client](/example-code/php/#official-composer-client) ```php use HtmlCssToImage\HtmlCssToImageClient; @@ -346,11 +331,9 @@ echo "Templated image URL: $templatedImageUrl\n"; // echo 'Generated image'; ``` -
    - ### Example response -When you access a valid signed URL, the API will return the generated image directly with the appropriate content type header (`image/png`, `image/jpeg`, or `image/webp` depending on the format). +When you access a valid signed URL, the API returns the generated file directly with the appropriate content type: `image/png`, `image/jpeg`, `image/webp`, or `application/pdf`. If there's an error, you'll receive a JSON response: @@ -358,7 +341,7 @@ If there's an error, you'll receive a JSON response: STATUS: 400 BAD REQUEST ``` -```javascript +```json { "error": "Bad Request", "statusCode": 400, @@ -370,7 +353,7 @@ STATUS: 400 BAD REQUEST STATUS: 401 UNAUTHORIZED ``` -```javascript +```json { "error": "Unauthorized", "statusCode": 401, @@ -380,4 +363,4 @@ STATUS: 401 UNAUTHORIZED The signing key must be enabled and grant [`images:create`](/getting-started/using-the-api/permissions/). See [API key management](/management-api/api-keys/) when replacing or disabling signing credentials. -{% include code_footer.md version=1 %} + diff --git a/getting-started/height-and-width.md b/src/content/docs/getting-started/height-and-width.mdx similarity index 76% rename from getting-started/height-and-width.md rename to src/content/docs/getting-started/height-and-width.mdx index f112cf9..924ccee 100644 --- a/getting-started/height-and-width.md +++ b/src/content/docs/getting-started/height-and-width.mdx @@ -1,40 +1,29 @@ --- -layout: page title: Setting height and width -permalink: /getting-started/setting-height-and-width/ -parent: Getting started -nav_order: 5 +slug: getting-started/setting-height-and-width description: >- For height and width you have two options. Setting it in your HTML or using the API to crop your images on the fly. --- -# Setting height and width -{: .no_toc } -{: .fs-9 } +import DocImage from '../../../components/DocImage.astro'; +import SizingExample from '../../../components/SizingExample.astro'; +import Help from '../../../components/Help.astro'; -Learn how to set the height and width for your images with the API. -{: .fs-6 .fw-300 } +
    -
    +Learn how to set the height and width for your images with the API. ## Setting height & width in HTML When sending an HTML snippet to the API it will auto crop your image to the height/width of the **outermost HTML element**. -- The following example will generate a screenshot that is 400px wide and 200px tall. +- The following example uses an element that is 400 CSS pixels wide and 200 CSS pixels tall. At the default `device_scale: 2`, the output is 800 × 400 image pixels. **Note**: _This works for HTML snippets only. Full HTML pages (has `` and `` tags) will not automatically crop._ -
    -
    -
    -

    Hello, world

    -
    -
    - -
    + ```html -
    +

    Hello, world

    ``` @@ -45,22 +34,14 @@ See how in the code sample we have set the `height: 200px; width: 400px;` in the Margins are respected by the auto crop. To add some space around your image, you can add `margin: 20px` to the outermost element. -
    - -
    -
    -

    Height and width example

    -
    -
    - -
    + ```html -
    +

    Height and width example

    ``` -## Setting the Viewport +## Setting the viewport When rendering your image, we use a live instance of Google Chrome running on one of our servers. In Chrome, the viewport is the total viewable area rendered by the browser. @@ -93,11 +74,11 @@ Every image generated by the API can also be adjusted on the fly with the `heigh **?width=400** -{% cloudinary /assets/images/w400.jpeg sizes="200px" alt="Auto adjust the width of your image" %} + **?height=300** -{% cloudinary /assets/images/h300.jpeg sizes="300px" alt="Auto adjust the height of your image" %} + ### Advanced cropping @@ -107,7 +88,7 @@ For more precise control over your images, you can use advanced cropping paramet Images generated by the API can also be used for print. Learn how to convert pixels to DPI (dots per inch). -- **Inches to pixels Formula:**`(DPI * (size in inches)) / 2 = pixels` +- **Inches to CSS pixels, at `device_scale: 2`:** `(DPI * size in inches) / 2 = CSS pixels`. For a different device scale, divide by that scale instead. - DPI = Dots Per Inch. For a high quality print, you will want 300 DPI. ### A4 paper example @@ -131,8 +112,8 @@ Once you have determined your height and width in pixels, you can then set your If you need the DPI metadata tag set on your image, you can do this by adding the query param to your image url. For example `hcti.io/v1/image/123abc?dpi=300`. Please note, you will still need to use the calculations above to create an image large enough to have the correct DPI when printed. -### Jumbo Images +### Jumbo images If you need to render really large images without sacrificing quality, you'll want to set the `jumbo_max_width` and `jumbo_max_height` parameters. [Learn more](/guides/advanced/jumbo-images). -{% include code_footer.md version=3 %} + diff --git a/getting-started/index.md b/src/content/docs/getting-started/index.mdx similarity index 90% rename from getting-started/index.md rename to src/content/docs/getting-started/index.mdx index 13289d2..51f58f5 100644 --- a/getting-started/index.md +++ b/src/content/docs/getting-started/index.mdx @@ -1,24 +1,18 @@ --- -layout: default title: Getting started -permalink: /getting-started/ -nav_order: 2 -expanded: true -has_children: true +slug: getting-started description: >- Get started with the HTML/CSS to Image API. Quick start guide with examples for Python, PHP, JavaScript, Ruby, Go, C#, Rust, TypeScript and more. --- -# Getting started -{: .no_toc } -{: .fs-9 } +import { LinkButton } from '@astrojs/starlight/components'; + +
    Start here to learn how to use the HTML/CSS to Image API. -{: .fs-6 .fw-300 } -[Live demo](https://htmlcsstoimage.com/#demo){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 } -[Get an API Key](https://htmlcsstoimage.com){: .btn .fs-5 .mb-4 .mb-md-0 } +Live demo +Get an API Key -
    ## Quick start in 3 steps @@ -53,7 +47,6 @@ The API returns a URL to your generated image. Use it anywhere - in emails, soci } ``` -
    ## Choose your path @@ -69,7 +62,6 @@ The API returns a URL to your generated image. Use it anywhere - in emails, soci | Manage API keys and organization resources | [Management API](/management-api/) | | Set up API credentials and permissions | [Authentication and API keys](/getting-started/using-the-api/api-keys/) | -
    ## Example code @@ -89,7 +81,6 @@ Get started quickly with code samples in your language: - [Elixir](/example-code/elixir) - [Google Apps Script](/example-code/google-apps-script) -
    ## Automation and no-code options @@ -100,7 +91,6 @@ Don't want to write code? We've got you covered: - **[Make](/integrations/make/)** - Build powerful automation workflows - **[MCP Server](/integrations/mcp/)** - Generate images from AI assistants like Cursor, Claude, and more -
    ## Need help? diff --git a/getting-started/og-images/index.md b/src/content/docs/getting-started/og-images/index.mdx similarity index 93% rename from getting-started/og-images/index.md rename to src/content/docs/getting-started/og-images/index.mdx index cb6e265..29a1ca7 100644 --- a/getting-started/og-images/index.md +++ b/src/content/docs/getting-started/og-images/index.mdx @@ -1,23 +1,18 @@ --- -layout: page title: Open Graph Images -permalink: /getting-started/og-images/ -parent: Getting started -nav_order: 3 +slug: getting-started/og-images description: >- Automatically generate Open Graph images and social cards for every page on a website, CMS, store, or static site with one URL pattern. --- -# Automatic Open Graph images for every page -{: .no_toc } -{: .fs-9 } +import { Aside, LinkButton } from '@astrojs/starlight/components'; +import OgPlatformGuides from '../../../../components/OgPlatformGuides.astro'; -Give every page on your site an up-to-date social card with one stable image URL pattern. -{: .fs-6 .fw-300 } +
    -[Create an OG Image Config](https://htmlcsstoimage.com/dashboard/og-configs/new){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 } -[Preview a page](https://htmlcsstoimage.com/tools/social-card-previewer){: .btn .fs-5 .mb-4 .mb-md-0 } +Give every page on your site an up-to-date social card with one stable image URL pattern. -
    +Create an OG Image Config +Preview a page ## What is an Open Graph image? @@ -87,7 +82,7 @@ See [OG Image caching and refreshes](/guides/debugging/og-image-caching/) for th ### 3. Choose what to render -#### Page Screenshot +#### Page screenshot Use **Page Screenshot** to capture the source page itself. You can capture the viewport or target one element with a CSS selector. This works well when the page already contains a social-card component or when the page itself is the desired preview. @@ -111,13 +106,13 @@ Common page-level controls include: | [`hcti:transparent_background`](/parameters/transparent_background/) | Preserve a transparent page background | | [`hcti:content_version`](/guides/debugging/og-image-caching/#force-a-new-content-identity) | Change the image identity when content at the same path changes | -{% include og_config_parameter_support.md %} + You can use either the `property` or `name` attribute for `hcti:` meta tags. Keep **Parse meta tags for each path** enabled for page-level controls. -#### Template Values +#### Template values Use **Template Values** when every image should follow a reusable design. Select an HCTI template and either use its latest version or pin a specific version. @@ -147,6 +142,8 @@ Different apps prefer different aspect ratios. The optimization setting decides HCTI currently recognizes these platform targets: +
    + | Size | Platforms | |:-----|:----------| | `1200 × 630` | Facebook, WhatsApp, Slack, TikTok, Snapchat, Telegram, Reddit, Threads, Google Chat, Discord, and the generic fallback | @@ -157,6 +154,8 @@ HCTI currently recognizes these platform targets: | `1000 × 1500` | Pinterest | | `1200 × 675` | Mastodon | +
    + Most platforms use Open Graph metadata. Twitter prefers `twitter:image` and falls back to `og:image`; Slack and Snapchat can also fall back between Open Graph and Twitter metadata. For reliable coverage, point both tags at the same HCTI URL: ```html @@ -196,7 +195,7 @@ Incrementing this integer gives the render a new content identity without changi Each guide shows where to put the tags and how to use that platform's page variables: -{% include og_image_platform_grid.html %} + ## Verify the result diff --git a/getting-started/og-images/supported-parameters.md b/src/content/docs/getting-started/og-images/supported-parameters.mdx similarity index 71% rename from getting-started/og-images/supported-parameters.md rename to src/content/docs/getting-started/og-images/supported-parameters.mdx index 938f6d3..1898acc 100644 --- a/getting-started/og-images/supported-parameters.md +++ b/src/content/docs/getting-started/og-images/supported-parameters.mdx @@ -1,18 +1,14 @@ --- -layout: page title: Supported OG Image parameters -permalink: /getting-started/og-images/supported-parameters/ -parent: Open Graph Images -nav_exclude: true +slug: getting-started/og-images/supported-parameters description: >- The complete list of hcti: page metadata supported by HTML/CSS to Image OG Image Configs. --- -# Supported OG Image parameters -{: .no_toc } -{: .fs-9 } +import ParameterTable from '../../../../components/ParameterTable.astro'; + +
    Control how an individual page is rendered by adding `hcti:` metadata to its HTML. -{: .fs-6 .fw-300 } The most common screenshot controls are provided in the dashboard when you create or edit an OG Image Config. Use page-level metadata when a particular page needs to override those defaults. @@ -28,12 +24,6 @@ Add a supported parameter to the page's `` using either the `property` or Page metadata takes precedence over the corresponding defaults in the dashboard. Keep **Parse meta tags for each path** enabled for these overrides to be read. -| Metadata | Type | Description | -|:---------|:-----|:------------| -{% for parameter in site.data.parameters.parameters -%} - {% if parameter.support.og_config -%} -| [`hcti:{{ parameter.name }}`]({{ parameter.link }}) | `{{ parameter.type }}` | {{ parameter.description }} | - {% endif -%} -{% endfor %} + For parameters used outside OG Image Configs, see the [complete API parameter reference](/parameters/). diff --git a/getting-started/templates.md b/src/content/docs/getting-started/templates.mdx similarity index 58% rename from getting-started/templates.md rename to src/content/docs/getting-started/templates.mdx index 0638dac..a60d931 100644 --- a/getting-started/templates.md +++ b/src/content/docs/getting-started/templates.mdx @@ -1,24 +1,22 @@ --- -layout: page -title: Image Templates -permalink: /getting-started/templates/ +title: Image templates +slug: getting-started/templates description: >- Create reusable templates for your HTML & CSS to make image generation easy. -parent: Getting started -nav_order: 4 --- -# Image Templates -{: .no_toc } -{: .fs-9 } +import { Aside, LinkButton } from '@astrojs/starlight/components'; +import DocImage from '../../../components/DocImage.astro'; +import Endpoint from '../../../components/Endpoint.astro'; +import ParameterTable from '../../../components/ParameterTable.astro'; +import Help from '../../../components/Help.astro'; -Create reusable templates to make image generation easy. -{: .fs-6 .fw-300 } + -[Get an API Key](https://htmlcsstoimage.com){: .btn .btn-blue .fs-5 .mb-4 .mb-md-0 } +Create reusable templates to make image generation easy. -
    +Open Dashboard -## What are Templates? +## What are templates? A template defines reusable image markup with **variables** that are replaced when an image is created. @@ -27,7 +25,7 @@ You can create templates by sending HTML and CSS to the API, or by building a te If you are building templates visually, start with the [Template Editor Quick Start](/template-editor/quick-start/). For API-only templates, continue below. ### Handlebars variables -Templates support [Handlebars](https://handlebarsjs.com/) variables. Add {% raw %}`{{title_text}}`{% endraw %} to your HTML, then pass a value for `title_text` when creating the image. +Templates support [Handlebars](https://handlebarsjs.com/) variables. Add `{{title_text}}` to your HTML, then pass a value for `title_text` when creating the image. ### Common use cases - Define a reusable template, then pass variables to it to generate unique images. @@ -37,23 +35,19 @@ Templates support [Handlebars](https://handlebarsjs.com/) variables. Add {% raw ### Example This image was generated with a template. -```javascript +```json { "text": "With templates, you can use variables to replace parts of your image.", "avatar_url": "https://avataaars.io/?avatarStyle=Transparent&topType=ShortHairDreads01&accessoriesType=Round&hairColor=BrownDark&facialHairType=BeardLight&facialHairColor=BrownDark&clotheType=BlazerShirt&eyeType=Happy&eyebrowType=DefaultNatural&mouthType=Eating&skinColor=Brown", "name": "Freddy", - "username": "@freddy", + "username": "@freddy" } ``` -
    -
    - {% cloudinary /assets/images/template.png alt="Example of an image template use for converting html to an image" %} -
    -
    -HTML: -{: .text-delta } + + +The HTML below uses Bootstrap utility classes; include the corresponding stylesheet in your template to reproduce the styling. + ```html -{% raw %}
    {{text}} @@ -66,47 +60,41 @@ HTML:

    {{username}} -{% endraw %} ``` -## Creating a Template +## Creating a template Requires [`templates:create_update`](/getting-started/using-the-api/permissions/). To generate a template, make an HTTP request to the API. -
    -  post https://hcti.io/v1/template
    -
    + ### Parameters -The create template endpoint accepts the following parameters. Accepted as either `json` or `formdata`. +Send the following parameters as JSON or form data. | Name | Type | Description | |:-------------|:------------------|:------| -| **html***| `String` | This is the HTML you want to render. You can send an HTML snippet \(`
    Your content
    `\) or an entire webpage. | -| **css** | `String` | The CSS for your image. | -|**name**| `String` | A short name to identify your template `max length 64`| -|**description**| `String` | Description to elaborate on the use of your template `max length 1024` | +| `html` (required) | `String` | HTML to render: a snippet (`
    Your content
    `) or an entire webpage. | +| `css` | `String` | The CSS for your image. | +| `name` | `String` | A short name to identify your template `max length 64`| +| `description` | `String` | Description to elaborate on the use of your template `max length 1024` | -{% include hint.md title="Required params" text="For creating a template, `html` is required while `css` is optional. -
    `name` and `description` are optional, but may be useful to help you differentiate your templates in the future." %} + ### Additional parameters Optional parameters for greater control over your image. -{% include template_additional_parameters.md %} - -
    + ### Example responses ``` STATUS: 201 CREATED ``` -```javascript +```json { "template_id": "t-b0354248-e7f6-4cca-81c6-2b4a70a16388", "template_version": 1594409399761 @@ -117,7 +105,7 @@ STATUS: 201 CREATED STATUS: 400 BAD REQUEST ``` -```javascript +```json { "error": "Bad Request", "statusCode": 400, @@ -129,92 +117,80 @@ STATUS: 400 BAD REQUEST STATUS: 429 TOO MANY REQUESTS ``` -```javascript +```json { "error": "Plan limit exceeded", "statusCode": 429, "message": "The tryit plan is limited to 5 templates" } ``` -{% include hint.md title="Plan Limits" text="Free plans can create 5 templates. Paid plans can create 1,000. You can edit your existing templates an unlimited number of times." %} -
    + -## Editing a Template +## Editing a template Requires [`templates:create_update`](/getting-started/using-the-api/permissions/). -To edit a template you've already made, make an HTTP request to the API with the template_id listed in the CREATE response. +To edit an existing template, send a request with the `template_id` returned when you created it. -
    -  post https://hcti.io/v1/template/:template_id
    -
    + ### Parameters -The edit template endpoint accepts the following parameters. Accepted as either `json` or `formdata`. +Send the following parameters as JSON or form data. | Name | Type | Description | |:-------------|:------------------|:------| -| **html***| `String` | This is the HTML you want to render. You can send an HTML snippet \(`
    Your content
    `\) or an entire webpage. | -| **css** | `String` | The CSS for your image. | -|**name**| `String` | A short name to identify your template `max length 64`| -|**description**| `String` | Description to elaborate on the use of your template `max length 1024` | +| `html` (required) | `String` | HTML to render: a snippet (`
    Your content
    `) or an entire webpage. | +| `css` | `String` | The CSS for your image. | +| `name` | `String` | A short name to identify your template `max length 64`| +| `description` | `String` | Description to elaborate on the use of your template `max length 1024` | -{% include hint.md title="Required params" text="For creating a template, `html` is required while `css` is optional. -
    `name` and `description` are optional, but may be useful to help you differentiate your templates in the future." %} + ### Additional parameters Optional parameters for greater control over your image. -{% include template_additional_parameters.md %} - -
    + ## Creating an image with a template Requires [`images:create`](/getting-started/using-the-api/permissions/). -To generate a templated image, make an HTTP request to the API using the template_id listed in the [CREATE response](#example-responses). +To generate a templated image, send a request using the `template_id` from the [create response](#example-responses). -
    -  post https://hcti.io/v1/image/:template_id
    -
    + You can also generate a templated image with a signed `GET` URL that renders on demand. See [Creating a templated image URL](/getting-started/create-and-render/#creating-a-templated-image-url). To use one template for automatic social cards across an existing site, select it in an [OG Image Config](/getting-started/og-images/#template-values). HCTI can map page titles, descriptions, Open Graph metadata, and explicit `html:tv:` values to its variables. -{% include hint.md title="Template Versions" text="When you create an image using a `template_id`, it will automatically use the most recent version of that template. If you want to create an image from a specific template_version you can append `/:template_version` to your POST: `hcti.io/v1/image/:template_id/:template_version`" %} + ### Parameters -The create templated image endpoint accepts the following parameters, accepted as either `json` or `formdata`. -- If you use `formdata`, your `template_values` need to be JSON encoded. +Send the following parameters as JSON or form data. When using form data, JSON-encode `template_values` as a string. | Name | Type | Description | |:-------------|:------------------|:------| -| **template_values*** | `JSON` | Values for the variables in your template. For editor templates, see the [Variables guide](/template-editor/variables/). | +| `template_values` (required) | `JSON` | Values for the variables in your template. For editor templates, see the [Variables guide](/template-editor/variables/). | -
    ## Listing your templates Requires [`templates:read`](/getting-started/using-the-api/permissions/). -To list all of your templates, send a get to `v1/template`. Authentication is required. +List your templates with an authenticated GET request. -
    -  get https://hcti.io/v1/template
    -
    + ### Example responses ``` STATUS: 200 OK ``` -```javascript +```json { "data": [ { @@ -249,20 +225,18 @@ STATUS: 200 OK | Field | Type | Description | |:------|:-----|:------------| -| **render_count** | `Integer` | Number of times this template has been used to generate images. | -| **storage_destination_id** | `String` or `null` | Storage destination inherited by images created from this template. | -| **color_scheme** | `String` | Light or dark mode setting, if configured. | -| **timezone** | `String` | Timezone setting, if configured. | +| `render_count` | `Integer` | Number of times this template has been used to generate images. | +| `storage_destination_id` | `String` or `null` | Storage destination inherited by images created from this template. | +| `color_scheme` | `String` | Light or dark mode setting, if configured. | +| `timezone` | `String` | Timezone setting, if configured. | ## Listing your template versions Requires [`templates:read`](/getting-started/using-the-api/permissions/). -To list all versions of a template, send a get to `v1/template/:template_id`. Authentication is required. +List a template's versions with an authenticated GET request. -
    -  get https://hcti.io/v1/template/:template_id
    -
    + ### Example responses @@ -270,7 +244,7 @@ To list all versions of a template, send a get to `v1/template/:template_id`. Au STATUS: 200 OK ``` -```javascript +```json { "data": [ { @@ -292,7 +266,7 @@ STATUS: 200 OK "updated_at": "2020-07-19T17:16:43.987+00:00", "version": 1595179003987, "viewport_height": null, - "viewport_width": null, + "viewport_width": null } ], "pagination": { @@ -303,4 +277,4 @@ STATUS: 200 OK Deleting a template through the API requires `templates:delete`. See the [interactive API reference](https://htmlcsstoimage.com/api-docs) for endpoint schemas. Rendering a known template ID uses `images:create`; discovering templates first requires `templates:read`. -{% include code_footer.md version=2 %} + diff --git a/getting-started/url-to-image.md b/src/content/docs/getting-started/url-to-image.mdx similarity index 56% rename from getting-started/url-to-image.md rename to src/content/docs/getting-started/url-to-image.mdx index a4c0fad..26813ab 100644 --- a/getting-started/url-to-image.md +++ b/src/content/docs/getting-started/url-to-image.mdx @@ -1,58 +1,52 @@ --- -layout: page title: URL to Image -permalink: /getting-started/url-to-image/ +slug: getting-started/url-to-image description: >- Take a screenshot of any URL using the API. Screenshot generated in a real instance of Google Chrome. -parent: Getting started -nav_order: 2 --- -# URL to Image -{: .no_toc } -{: .fs-9 } +import { Aside, LinkButton } from '@astrojs/starlight/components'; +import DocImage from '../../../components/DocImage.astro'; +import ParameterTable from '../../../components/ParameterTable.astro'; -The high resolution screenshot API you've been searching for. -{: .fs-6 .fw-300 } +
    -[Get an API Key](https://htmlcsstoimage.com){: .btn .fs-5 .mb-4 .mb-md-0 } +The high resolution screenshot API you've been searching for. -
    +Get an API key ## Creating an image from a URL With the API, you can automate taking a screenshot of any website. -{% include hint.md title="Need a social card for every page?" text="Use an [OG Image Config](/getting-started/og-images/) to map every public page path on a website or CMS to a screenshot or template—without making a separate API request for each page." %} + Pass the `url` param to the `hcti.io/v1/image` endpoint, and we'll generate a screenshot for you. Here's an example using cURL. ```bash -curl -X POST https://hcti.io/v1/image -u 'UserID:APIKey' +curl -X POST https://hcti.io/v1/image -u 'UserID:APIKey' \ --data-urlencode url="https://google.com" ``` Don't write code? Don't worry, you can also do this with our [Zapier integration](https://docs.htmlcsstoimage.com/integrations/zapier/). -{% cloudinary /assets/images/google.jpg sizes="600px" alt="Screenshot of google.com" %} + ## Additional parameters To customize your image further, you can take advantage of the following optional parameters. -{% include additional_parameters.md context="url" %} - -
    + ## Screenshot examples A full screenshot of `stripe.com`. With device scale set to 2, for a super high resolution image. -{% cloudinary /assets/images/stripe.png sizes="600px" alt="Screenshot of stripe.com auto generated with the API" %} + -
    - -## Screenshot part of a page with Selector +## Screenshot part of a page with selector You can set a `selector` to target a specific part of the page. @@ -60,16 +54,12 @@ For example, on Stripe's homepage, there is an element with the CSS selector `se When passing that to the API, we crop to that element only. -{% cloudinary /assets/images/url-selector-example.png sizes="600px" alt="Use a CSS selector to crop an image" %} - -
    + -## CSS Selectors +## CSS selectors To learn about CSS Selectors, we recommend [this article](https://www.w3schools.com/cssref/css_selectors.asp). There are also Chrome extensions that detect them for you, we like using: [Selector Gadget](https://chrome.google.com/webstore/detail/selectorgadget/mhjhnkcfbdhnjickkkdbjoemdmbfginb?hl=en). -
    - ## Blocking cookie consent banners Many websites display cookie consent popups that can interfere with your screenshots. Use the `block_consent_banners` parameter to automatically hide these: @@ -82,23 +72,18 @@ curl -X POST https://hcti.io/v1/image -u 'UserID:APIKey' \ This automatically detects and blocks common consent frameworks like OneTrust, Cookiebot, and others. For more advanced cases, see our [complete guide to blocking cookie banners](/guides/advanced/blocking-cookie-banners/). -
    - ## Pages requiring login or sign-in -Our API does not support pages that require login. The URL must be publicly accessible for us to generate an image of it. -Supporting login is a common request, but we have chosen not to support it due to the risk of storing and transmitting credentials. +The API does not automate an interactive login flow. For a page you are authorized to access, you can send a short-lived session cookie or authorization token using the [`headers` parameter](/parameters/headers/). Custom headers are restricted by origin; review those rules before including credentials. Some sites have the option of creating an "embed" of a page. This is the best option if it's available to you. You can then use the embed's HTML to generate a screenshot without login. -
    ## Do you have an IP allowlist? We don't provide a static IP list. Our rendering servers scale dynamically on AWS, so the source IPs can change. -If you are screenshotting protected URLs, we recommend adding a custom query parameter to the URL (for example `?hcti=1`) and creating a firewall rule (such as in Cloudflare) that allows requests when that query parameter is present. +For a stable egress IP, configure an [HTTP proxy](/guides/advanced/proxies/) and pass its [`proxy_id`](/parameters/proxy_id/). For sites you control, see [handling Cloudflare challenges](/guides/debugging/cloudflare-challenges/) and [custom request headers](/parameters/headers/). A public query flag such as `?hcti=1` does not authenticate a request and should not grant access to private content. -
    ## Need help getting started? -We'd be happy to walk you through getting started. Send us an email: **support@htmlcsstoimage.com**. We're experts at generating images and will help you get going using the API. +We'd be happy to walk you through getting started. Send us an email: [support@htmlcsstoimage.com](mailto:support@htmlcsstoimage.com). We're experts at generating images and will help you get going using the API. diff --git a/getting-started/using-the-api/api-keys.md b/src/content/docs/getting-started/using-the-api/api-keys.mdx similarity index 83% rename from getting-started/using-the-api/api-keys.md rename to src/content/docs/getting-started/using-the-api/api-keys.mdx index 6b56bc8..175379b 100644 --- a/getting-started/using-the-api/api-keys.md +++ b/src/content/docs/getting-started/using-the-api/api-keys.mdx @@ -1,16 +1,15 @@ --- -layout: page title: Authentication and API keys -permalink: /getting-started/using-the-api/api-keys/ -nav_title: Auth & API Keys -parent: Using the API -grand_parent: Getting started -nav_order: 1 +slug: getting-started/using-the-api/api-keys +sidebar: + label: Auth & API Keys description: >- Create scoped API keys, authenticate requests, choose permission presets, and replace or disable HTML/CSS to Image credentials. --- -# Authentication and API keys -{: .no_toc } +import DocImage from '../../../../components/DocImage.astro'; +import Help from '../../../../components/Help.astro'; + +
    Every new HCTI organization automatically includes an API key, so you can start using the API without creating one yourself. You'll find its API ID and secret API key in the [API keys dashboard](https://htmlcsstoimage.com/dashboard/api-keys). @@ -34,10 +33,7 @@ By default, the form groups permissions into **Read** and **Write** for each are **Write includes deletion** where the area supports it. For example, selecting Write for Proxies grants both create/update and delete permissions. Usage has only a Read permission. -
    - Create an API key in the default simple view, with Read and Write permission groups for each resource area and the Basics preset selected. -
    The default view groups permissions by area. Click the screenshot to view it full size.
    -
    + ### Permission presets @@ -55,19 +51,13 @@ Turn on **Advanced mode** to see the granular permissions within each area. Read Simple and advanced mode are two views of the same permission selection. Advanced mode lets you choose exactly which actions a key can perform. -
    - Advanced mode in the API key form, showing separate Read, Create/Update, and Delete permissions, with Create and Store separated for Images. -
    Advanced mode exposes individual actions instead of grouping all writes together.
    -
    + ### See what each permission allows Expand an area's details using the arrow next to its name. The details explain its read and write permissions. Expand **Endpoints and required permissions** to see which API endpoints use each permission, including the exact names to use in API requests. -
    - Expanded OG Configs permission details showing read and write descriptions and the permissions required for each Open Graph configuration endpoint. -
    Each area includes descriptions and an endpoint-to-permission reference.
    -
    + See the [permission reference](/getting-started/using-the-api/permissions/) for the complete list. Plan and authentication requirements still apply to each endpoint. @@ -139,4 +129,4 @@ These eight permissions match the **Basics** preset and preserve the original im To use management operations, edit the key's permissions in the dashboard or create a separate key with the required grants. -{% include code_footer.md version=1 %} + diff --git a/getting-started/using-the-api/index.md b/src/content/docs/getting-started/using-the-api/index.mdx similarity index 72% rename from getting-started/using-the-api/index.md rename to src/content/docs/getting-started/using-the-api/index.mdx index dd2dce7..4e70e3a 100644 --- a/getting-started/using-the-api/index.md +++ b/src/content/docs/getting-started/using-the-api/index.mdx @@ -1,26 +1,24 @@ --- -layout: page title: Using the API -permalink: /getting-started/using-the-api/ -parent: Getting started -has_children: true -nav_order: 1 +slug: getting-started/using-the-api description: >- Complete API reference for HTML/CSS to Image. Authentication, endpoints, parameters, batch creation, and response formats. --- -# Using the HTML/CSS to Image API -{: .no_toc } -{: .fs-9 } +import { Aside, LinkButton } from '@astrojs/starlight/components'; +import ParameterTable from '../../../../components/ParameterTable.astro'; +import Endpoint from '../../../../components/Endpoint.astro'; +import DocImage from '../../../../components/DocImage.astro'; +import Help from '../../../../components/Help.astro'; + + Generate images from HTML and CSS. -{: .fs-6 .fw-300 } -[Live demo](https://htmlcsstoimage.com/#demo){: .btn .btn-primary .fs-5 .mb-4 .mb-md-0 .mr-2 } -[Get an API Key](https://htmlcsstoimage.com){: .btn .fs-5 .mb-4 .mb-md-0 } +Live demo +Get an API Key -{% include hint.md title="Using Cursor, Claude, Codex or another AI tool?" text="Generate images without writing code using our [MCP Server integration](/integrations/mcp/)." %} + -
    Browse the [interactive API reference](https://htmlcsstoimage.com/api-docs) for endpoint schemas, try the [Postman collection](https://www.postman.com/htmlcsstoimage/html-css-to-image/collection/zgfamed/html-css-to-image-api), or use the [Management API](/management-api/) to configure organization resources. For credentials and access, see [API keys](/getting-started/using-the-api/api-keys/), [permissions](/getting-started/using-the-api/permissions/), and [rate limits](/getting-started/using-the-api/rate-limits/). @@ -36,9 +34,7 @@ Requires [`images:create`](/getting-started/using-the-api/permissions/). To generate an image, make an HTTP request to the API. -
    -  post https://hcti.io/v1/image
    -
    + ### Parameters @@ -46,21 +42,19 @@ The create image endpoint accepts the following parameters. Accepted as either ` | Name | Type | Description | |:-------------|:------------------|:------| -| **html**† | `String` | This is the HTML you want to render. You can send an HTML snippet \(`
    Your content
    `\) or an entire webpage. | -| **css** | `String` | The CSS for your image. When using with `url` it will be injected into the page. | -| **url**† | `String` | The fully qualified URL to a public webpage. Such as `https://htmlcsstoimage.com`. When passed this will override the html param and will generate a screenshot of the url. | +| `html`† | `String` | This is the HTML you want to render. You can send an HTML snippet \(`
    Your content
    `\) or an entire webpage. | +| `css` | `String` | The CSS for your image. When using with `url` it will be injected into the page. | +| `url`† | `String` | The fully qualified URL to a public webpage. Such as `https://htmlcsstoimage.com`. When passed this will override the html param and will generate a screenshot of the url. | -{% include hint.md title="Required params" text="† Either `url` OR `html` is required, but not both. `css` is optional." %} + -
    ### Additional parameters Optional parameters for greater control over your image. -{% include additional_parameters.md %} + -
    ### Example responses ``` @@ -100,15 +94,12 @@ STATUS: 429 TOO MANY REQUESTS The `429` example above is an image-credit limit. Management operations can return a separate `429` for per-minute throttling; see [rate limits and retry guidance](/getting-started/using-the-api/rate-limits/). Missing or invalid credentials return `401`; insufficient permissions return `403` with the required permission in the message. -
    ## Getting an image After creating an image, you can use the returned URL to either download your image, or use it directly in your website. -
    -  get https://hcti.io/v1/image/:image_id
    -
    + This URL is permanent for as long as your account is active. It's automatically cached and optimized by Cloudflare's global content delivery network. You can use it directly on your webpages and not worry about hurting your page speed score. @@ -126,9 +117,9 @@ The API supports `jpg`, `png`, `webp`, and `pdf`. If no file extension is passed | webp | `https://hcti.io/v1/image/a3ab2ab2-906e-4b5c-a88d-41a1c3f3779e.webp` | | pdf | `https://hcti.io/v1/image/a3ab2ab2-906e-4b5c-a88d-41a1c3f3779e.pdf` | -{% include hint.md title="Tip" text="You can include the desired format as a parameter when creating your image. See [here](/parameters/format/) for more details." %} + -{% include hint.md title="PNG by default" text="The API returns `png` by default. If no extension is on the URL, a png will be generated." %} + ### Query parameters @@ -136,10 +127,10 @@ Query parameters can be added to the URL to adjust your image. | Name | Type | Description | |:-------------|:------------------|:------| -| **height** | `Integer` | The height of the image. Maximum `5000`. | -| **width** | `Integer` | The width of the image. Maximum `5000`. | -| **dpi** | `Integer` | Sets the DPI metadata tag on the image. Minimum `30`, maximum `600`. | -| **dl** | `Integer` | Set `dl=1` and the image will be served as a downloadable attachment. | +| `height` | `Integer` | The height of the image. Maximum `5000`. | +| `width` | `Integer` | The width of the image. Maximum `5000`. | +| `dpi` | `Integer` | Sets the DPI metadata tag on the image. Minimum `30`, maximum `600`. | +| `dl` | `Integer` | Set `dl=1` and the image will be served as a downloadable attachment. | ### Cropping parameters @@ -147,15 +138,15 @@ Advanced cropping options for precise control over the rendered image region. | Name | Type | Description | |:-------------|:------------------|:------| -| **aspect_ratio** | `String` | Crop to a specific aspect ratio. Format: `width_height` (e.g., `16_9`, `1_1`). | -| **x_origin** | `String` | Horizontal alignment for a crop whose width is supplied by `crop_width` or derived from `aspect_ratio`. Accepts `start`, `center`, or `end`. Cannot be combined with `x_1` or `x_2`. | -| **y_origin** | `String` | Vertical alignment for a crop whose height is supplied by `crop_height` or derived from `aspect_ratio`. Accepts `start`, `center`, or `end`. Cannot be combined with `y_1` or `y_2`. | -| **x_1** | `String` | Starting x coordinate for crop region. Use with `x_2` or `crop_width`. | -| **x_2** | `String` | Ending x coordinate for crop region. Must be used with `x_1`. | -| **y_1** | `String` | Starting y coordinate for crop region. Use with `y_2` or `crop_height`. | -| **y_2** | `String` | Ending y coordinate for crop region. Must be used with `y_1`. | -| **crop_width** | `String` | Width of the crop region. Use with `x_1` or alone with `aspect_ratio`. | -| **crop_height** | `String` | Height of the crop region. Use with `y_1` or alone with `aspect_ratio`. | +| `aspect_ratio` | `String` | Crop to a specific aspect ratio. Format: `width_height` (e.g., `16_9`, `1_1`). | +| `x_origin` | `String` | Horizontal alignment for a crop whose width is supplied by `crop_width` or derived from `aspect_ratio`. Accepts `start`, `center`, or `end`. Cannot be combined with `x_1` or `x_2`. | +| `y_origin` | `String` | Vertical alignment for a crop whose height is supplied by `crop_height` or derived from `aspect_ratio`. Accepts `start`, `center`, or `end`. Cannot be combined with `y_1` or `y_2`. | +| `x_1` | `String` | Starting x coordinate for crop region. Use with `x_2` or `crop_width`. | +| `x_2` | `String` | Ending x coordinate for crop region. Must be used with `x_1`. | +| `y_1` | `String` | Starting y coordinate for crop region. Use with `y_2` or `crop_height`. | +| `y_2` | `String` | Ending y coordinate for crop region. Must be used with `y_1`. | +| `crop_width` | `String` | Width of the crop region. Use with `x_1` or alone with `aspect_ratio`. | +| `crop_height` | `String` | Height of the crop region. Use with `y_1` or alone with `aspect_ratio`. | #### Cropping examples @@ -163,11 +154,11 @@ Here's a base image (600x400 pixels) and how different cropping parameters affec **Original image:** -Original 600x400 image + **Crop to 1:1 square from center** (`aspect_ratio=1_1&crop_height=100%`): -1:1 aspect ratio crop + ``` ?aspect_ratio=1_1&crop_height=100% @@ -175,7 +166,7 @@ Here's a base image (600x400 pixels) and how different cropping parameters affec **Crop left third** (`x_1=0&crop_width=33%`): -Left third crop + ``` ?x_1=0&crop_width=33% @@ -183,7 +174,7 @@ Here's a base image (600x400 pixels) and how different cropping parameters affec **Crop center section** (`x_1=33%&x_2=66%`): -Center third crop + ``` ?x_1=33%&x_2=66% @@ -191,7 +182,7 @@ Here's a base image (600x400 pixels) and how different cropping parameters affec **Crop right third** (`x_1=67%&crop_width=33%`): -Right third crop + ``` ?x_1=67%&crop_width=33% @@ -199,21 +190,18 @@ Here's a base image (600x400 pixels) and how different cropping parameters affec **Crop to 16:9 aspect ratio** (`aspect_ratio=16_9&crop_width=100%`): -16:9 aspect ratio crop + ``` ?aspect_ratio=16_9&crop_width=100% ``` -
    ## Deleting an image Requires [`images:delete`](/getting-started/using-the-api/permissions/). -
    -  delete https://hcti.io/v1/image/:image_id
    -
    + To delete an image using the API, you can send a **DELETE** request to your image URL. This will remove your image from our servers and clear the caching for the image in our CDN. @@ -230,16 +218,14 @@ Requires [`images:create`](/getting-started/using-the-api/permissions/). Create up to 25 images in a single API request. This is more efficient than making multiple individual requests. -
    -  post https://hcti.io/v1/image/batch
    -
    + ### Parameters | Name | Type | Description | |:-------------|:------------------|:------| -| **default_options** | `Object` | Default parameters applied to all images in the batch. Accepts all standard image creation parameters. | -| **variations** | `Array` | Array of image objects. Each can override `default_options`. Maximum 25 items. | +| `default_options` | `Object` | Default parameters applied to all images in the batch. Accepts all standard image creation parameters. | +| `variations` | `Array` | Array of image objects. Each can override `default_options`. Maximum 25 items. | ### Example request @@ -279,9 +265,7 @@ Requires [`images:delete`](/getting-started/using-the-api/permissions/). Delete multiple images at once by sending their IDs. -
    -  delete https://hcti.io/v1/image/batch
    -
    + ```javascript { @@ -293,7 +277,6 @@ Delete multiple images at once by sending their IDs. STATUS: 202 ACCEPTED ``` -
    ## Listing images @@ -301,16 +284,14 @@ Requires [`images:read`](/getting-started/using-the-api/permissions/). Retrieve a list of all images created by your account with pagination support. -
    -  get https://hcti.io/v1/images
    -
    + ### Query parameters | Name | Type | Description | |:-------------|:------------------|:------| -| **count** | `Integer` | Number of images to return. Default `50`, maximum `50`. | -| **page_token** | `String` | Token for pagination. Use `next_page_token` from the previous response. | +| `count` | `Integer` | Number of images to return. Default `50`, maximum `50`. | +| `page_token` | `String` | Token for pagination. Use `next_page_token` from the previous response. | ### Example response @@ -337,15 +318,12 @@ STATUS: 200 OK } ``` -
    ## Checking account usage Requires [`usage:read`](/getting-started/using-the-api/permissions/). See [Usage and limits](/management-api/usage/) for monitoring headers, billing-period semantics, and MCP usage tools. -
    -  get https://hcti.io/v1/usage
    -
    + To check your account usage, you can make a request to the `usage` endpoint. It will return the total images created for your account rolled up into different time periods. @@ -538,4 +516,4 @@ STATUS: 200 OK } ``` -{% include code_footer.md version=1 %} + diff --git a/getting-started/using-the-api/permissions.md b/src/content/docs/getting-started/using-the-api/permissions.mdx similarity index 97% rename from getting-started/using-the-api/permissions.md rename to src/content/docs/getting-started/using-the-api/permissions.mdx index 1218119..baa37b5 100644 --- a/getting-started/using-the-api/permissions.md +++ b/src/content/docs/getting-started/using-the-api/permissions.mdx @@ -1,16 +1,14 @@ --- -layout: page title: API permissions -nav_title: Permissions -permalink: /getting-started/using-the-api/permissions/ -parent: Using the API -grand_parent: Getting started -nav_order: 2 +slug: getting-started/using-the-api/permissions +sidebar: + label: Permissions description: >- Reference for HCTI API key permissions, organization roles, and MCP OAuth grants across image and management operations. --- -# API permissions -{: .no_toc } +import Help from '../../../../components/Help.astro'; + +
    Permissions control what an API key or MCP connection can do within its organization. Choose only the operations your application or assistant needs. @@ -91,4 +89,4 @@ The original MCP defaults include image creation/read/store, template read/creat A REST request with valid credentials but insufficient permissions returns `403` with a message identifying the required permission. MCP returns a tool error and does not execute the denied operation. Add the appropriate key grant or reauthorize the MCP connection before retrying. If the message identifies a plan restriction, changing permissions alone will not resolve it. -{% include code_footer.md version=1 %} + diff --git a/getting-started/using-the-api/rate-limits.md b/src/content/docs/getting-started/using-the-api/rate-limits.mdx similarity index 91% rename from getting-started/using-the-api/rate-limits.md rename to src/content/docs/getting-started/using-the-api/rate-limits.mdx index c7ef0a5..6183d49 100644 --- a/getting-started/using-the-api/rate-limits.md +++ b/src/content/docs/getting-started/using-the-api/rate-limits.mdx @@ -1,19 +1,15 @@ --- -layout: page title: Rate limits and usage limits -permalink: /getting-started/using-the-api/rate-limits/ -parent: Using the API -grand_parent: Getting started -nav_order: 3 +slug: getting-started/using-the-api/rate-limits description: >- Image generation has no per-second or per-minute rate limit. Learn Management API and MCP request limits, retry headers, and image credit limits. --- -# Rate limits and usage limits -{: .no_toc } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../components/Help.astro'; -
    -

    THERE IS NO RATE LIMIT FOR CREATING OR RENDERING IMAGES

    -
    +
    + + Management operations have per-minute request limits. Image generation uses your plan's image credits. These are separate limits with different recovery steps. @@ -73,4 +69,4 @@ Image creation consumes image credits. Exceeding the allowance can also return ` Use the [usage guide](/management-api/usage/) to monitor `x-renders-*` response headers, REST usage history, and MCP current usage. Batch size, template counts, and access to features such as proxies or storage destinations are separate plan restrictions. -{% include code_footer.md version=1 %} + diff --git a/guides/account/account-settings.md b/src/content/docs/guides/account/account-settings.mdx similarity index 93% rename from guides/account/account-settings.md rename to src/content/docs/guides/account/account-settings.mdx index 768598f..48a2bee 100644 --- a/guides/account/account-settings.md +++ b/src/content/docs/guides/account/account-settings.mdx @@ -1,22 +1,15 @@ --- -layout: page title: Account settings -permalink: /guides/account/account-settings/ -parent: Account & organizations -grand_parent: Guides -nav_order: 1 +slug: guides/account/account-settings description: >- Your personal account: email, organizations, switching orgs, and accepting invites. --- -# Account settings -{: .no_toc } -{: .fs-9 } +import Help from '../../../../components/Help.astro'; -Manage your login, organizations, and pending invites in one place. -{: .fs-6 .fw-300 } + -
    +Manage your login, organizations, and pending invites in one place. Account settings are available at [https://htmlcsstoimage.com/account/settings](https://htmlcsstoimage.com/account/settings). This page is about **you** — your email, which organizations you belong to, and how you switch between them — not about managing a single organization's members or billing (that's [organization settings](/guides/account/organization-settings/)). @@ -60,4 +53,4 @@ API keys and MCP authorizations stay associated with their organization when you - [Organization settings](/guides/account/organization-settings/) — Roles, inviting members, and managing an organization. - [Account usage](/management-api/usage/) — Monitoring API usage. -{% include code_footer.md version=1 %} + diff --git a/guides/account/index.md b/src/content/docs/guides/account/index.mdx similarity index 80% rename from guides/account/index.md rename to src/content/docs/guides/account/index.mdx index ef442c1..aa60c6e 100644 --- a/guides/account/index.md +++ b/src/content/docs/guides/account/index.mdx @@ -1,21 +1,12 @@ --- -layout: default title: Account & organizations -permalink: /guides/account/ -parent: Guides -has_children: true -nav_order: 1 +slug: guides/account description: >- Manage your account, organizations, members, invites, and roles in the dashboard. --- -# Account & organizations -{: .no_toc } -{: .fs-9 } +
    Manage your account and team access in the dashboard. -{: .fs-4 .fw-300 } - -
    | Guide | Description | |:------|:------------| diff --git a/guides/account/organization-settings.md b/src/content/docs/guides/account/organization-settings.mdx similarity index 94% rename from guides/account/organization-settings.md rename to src/content/docs/guides/account/organization-settings.mdx index 284a933..2e2dd4b 100644 --- a/guides/account/organization-settings.md +++ b/src/content/docs/guides/account/organization-settings.mdx @@ -1,22 +1,15 @@ --- -layout: page title: Organization settings -permalink: /guides/account/organization-settings/ -parent: Account & organizations -grand_parent: Guides -nav_order: 2 +slug: guides/account/organization-settings description: >- Manage your organization, members, invites, and roles. Learn about Owner, Admin, and User permissions. --- -# Organization settings -{: .no_toc } -{: .fs-9 } +import Help from '../../../../components/Help.astro'; -Manage members, invites, usage, and billing for your organization. -{: .fs-6 .fw-300 } +
    -
    +Manage members, invites, usage, and billing for your organization. Organization settings are available at [https://htmlcsstoimage.com/dashboard/organization-settings](https://htmlcsstoimage.com/dashboard/organization-settings). What you can do there depends on your role in the organization. @@ -71,4 +64,4 @@ Usage and current period information for the organization are also shown on the - [Account settings](/guides/account/account-settings/) — Your personal account, switching organizations, and pending invites. - [Account usage](/management-api/usage/) — Monitoring API usage for your organization. -{% include code_footer.md version=1 %} + diff --git a/guides/advanced/base64.md b/src/content/docs/guides/advanced/base64.mdx similarity index 90% rename from guides/advanced/base64.md rename to src/content/docs/guides/advanced/base64.mdx index 9f50af3..a86f99e 100644 --- a/guides/advanced/base64.md +++ b/src/content/docs/guides/advanced/base64.mdx @@ -1,21 +1,17 @@ --- -layout: page title: Base64 to image -permalink: /guides/advanced/base64/ -parent: Advanced -grand_parent: Guides -nav_order: 4 +slug: guides/advanced/base64 description: >- Convert base64 to PNG, JPG, or PDF with HTML/CSS to Image using the API, Zapier, or AI assistants via MCP. --- -# Convert base64 to an image -{: .no_toc } -{: .fs-9 } +import { LinkButton } from '@astrojs/starlight/components'; +import DocImage from '../../../../components/DocImage.astro'; +import Help from '../../../../components/Help.astro'; + +
    Learn how to generate PNGs, JPGs, or PDFs from base64. Works with Zapier and Make. -{: .fs-6 .fw-300 } -
    ## How it works @@ -34,24 +30,19 @@ The rendered result is available as PNG or JPG. To generate a PDF, append `.pdf` In this example we convert a base64 of our logo into an image. -
    -
    - {% cloudinary /assets/images/base64-logo.png sizes="100px" alt="Convert base64 to an image" %} -
    -
    + ```html ``` -
    ## Use this with Zapier or Make We have integrations for both Zapier and Make. You can use the example code above to convert base64 to images without writing any code yourself. -[Zapier](/integrations/zapier/){: .btn .btn-green .fs-5 .mb-4 .mb-md-0 .mr-2 } -[Make](/integrations/make/){: .btn .fs-5 .mb-4 .mb-md-0 .mr-2 } +Zapier +Make -{% include code_footer.md version=3 %} + diff --git a/guides/advanced/blocking-cookie-banners.md b/src/content/docs/guides/advanced/blocking-cookie-banners.mdx similarity index 69% rename from guides/advanced/blocking-cookie-banners.md rename to src/content/docs/guides/advanced/blocking-cookie-banners.mdx index 1a0bf77..6071fb3 100644 --- a/guides/advanced/blocking-cookie-banners.md +++ b/src/content/docs/guides/advanced/blocking-cookie-banners.mdx @@ -1,21 +1,15 @@ --- -layout: page title: Blocking cookie banners -permalink: /guides/advanced/blocking-cookie-banners/ -parent: Advanced -grand_parent: Guides -nav_order: 1 +slug: guides/advanced/blocking-cookie-banners description: >- Learn how to hide cookie banners when taking screenshots --- -# Blocking cookie banners -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../components/Help.astro'; -Learn how to block cookie banners with taking screenshots -{: .fs-6 .fw-300 } +
    -
    +Hide cookie banners when taking screenshots. ## How it works @@ -23,7 +17,7 @@ The easiest way to hide cookie banners in your screenshots is by using the `bloc When set to `true`, the API will automatically detect and block common cookie consent banners and popups on websites. This is the recommended approach for most use cases. -## Automatic Cookie Banner Blocking +## Automatic cookie banner blocking Simply add `block_consent_banners: true` to your API request: @@ -42,9 +36,9 @@ This automatically handles the most common cookie consent frameworks including: - Osano - And many others -{% include hint.md title="Recommended Method" text="Using block_consent_banners is the easiest and most reliable way to hide cookie popups. It's maintained and updated regularly to handle new consent frameworks." %} + -## Manual CSS Injection (Advanced) +## Manual CSS injection (advanced) For custom cookie banners not covered by the automatic blocking, you can still use CSS injection. @@ -55,7 +49,7 @@ Use the developer tools inspector to find the ID or CSS class of the cookie bann Then use this information to override the visibility of the cookie banner. -Here is an example that hides some common cookie banner.s +Here is an example that hides two common cookie banners. ```css #onetrust-consent-sdk { @@ -70,6 +64,5 @@ Here is an example that hides some common cookie banner.s To learn about CSS Selectors, we recommend [this article](https://www.w3schools.com/cssref/css_selectors.asp). -{% include code_footer.md version=1 %} - + diff --git a/guides/advanced/duplicate-detection.md b/src/content/docs/guides/advanced/duplicate-detection.mdx similarity index 78% rename from guides/advanced/duplicate-detection.md rename to src/content/docs/guides/advanced/duplicate-detection.mdx index 4e6eef5..63d1da4 100644 --- a/guides/advanced/duplicate-detection.md +++ b/src/content/docs/guides/advanced/duplicate-detection.mdx @@ -1,21 +1,15 @@ --- -layout: page title: Duplicate detection -permalink: /guides/advanced/duplicate-detection/ -parent: Advanced -grand_parent: Guides -nav_order: 2 +slug: guides/advanced/duplicate-detection description: >- Reuse identical recent images without consuming additional image credits. --- -# Duplicate image detection -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../components/Help.astro'; -Control how far back the API looks for an identical image before rendering a new one. -{: .fs-6 .fw-300 } +
    -
    +Control how far back the API looks for an identical image before rendering a new one. ## How deduplication works @@ -25,7 +19,7 @@ If a matching image is found in your organization, the response returns its exis The rendered content and image parameters must match exactly. A different character or parameter value creates a different image. The `dedupe_duration_s` value itself is excluded from this comparison, so you can change the lookback window without changing what counts as an identical image. -{% include hint.md title="Best effort, not an idempotency guarantee" text="Deduplication is best effort and eventually consistent. A new image can take a few seconds to become available for matching, so identical requests sent during that short delay—especially concurrent requests—may create separate images and consume separate image credits. This does not shorten the configured lookback window. Do not rely on this feature when your application requires strict idempotency." %} + ## Setting the lookback window @@ -66,4 +60,4 @@ It does not apply to: See the [`dedupe_duration_s` parameter reference](/parameters/dedupe_duration_s/) for request examples. -{% include code_footer.md version=1 %} + diff --git a/guides/advanced/index.md b/src/content/docs/guides/advanced/index.mdx similarity index 84% rename from guides/advanced/index.md rename to src/content/docs/guides/advanced/index.mdx index 30514fc..7690420 100644 --- a/guides/advanced/index.md +++ b/src/content/docs/guides/advanced/index.mdx @@ -1,21 +1,12 @@ --- -layout: default -title: Advanced -permalink: /guides/advanced/ -parent: Guides -has_children: true -nav_order: 4 +title: Advanced features +slug: guides/advanced description: >- Advanced API features including cookie banner blocking, duplicate detection, account usage, and Base64 encoding. --- -# Advanced Features -{: .no_toc } -{: .fs-9 } +
    Get more from the API. -{: .fs-4 .fw-300 } - -
    | Guide | Description | |:------|:------------| diff --git a/guides/advanced/jumbo-images.md b/src/content/docs/guides/advanced/jumbo-images.mdx similarity index 77% rename from guides/advanced/jumbo-images.md rename to src/content/docs/guides/advanced/jumbo-images.mdx index 856cb15..a9e817c 100644 --- a/guides/advanced/jumbo-images.md +++ b/src/content/docs/guides/advanced/jumbo-images.mdx @@ -1,27 +1,19 @@ --- -layout: page title: Jumbo Images -permalink: /guides/advanced/jumbo-images/ -parent: Advanced -grand_parent: Guides -nav_order: 6 +slug: guides/advanced/jumbo-images description: >- Render large images without reducing quality by splitting into tiles and stitching them together. --- -# Jumbo Images -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../components/Help.astro'; -Render large screenshots without reducing quality by splitting and stitching tiles. -{: .fs-6 .fw-300 } - -
    +
    + -1. TOC -{:toc} +Render large screenshots without reducing quality by splitting and stitching tiles. -
    +
    ## What are jumbo images? @@ -29,6 +21,8 @@ Rendering really tall or wide html (~ 8,000px) causes quality to degrade. Most i Jumbo images allow you to scale beyond this without sacrificing quality. When you set `jumbo_max_width` and `jumbo_max_height`, the API lets you generate images up to **80,000 pixels** on a side. + + ### Why jumbo matters The big win is **quality**. Jumbo lets you produce huge images **without losing sharpness**: @@ -37,7 +31,15 @@ The big win is **quality**. Jumbo lets you produce huge images **without losing - Each tile is rendered natively in Chrome at full resolution, then stitched. There's no resampling or post-render shrinking. - Crisp text, vector edges, and 1px borders that would normally turn fuzzy on huge canvases stay clean. -{% include hint.md title="Without jumbo, large images get downscaled" text="If your output would naturally exceed ~8000px and you **don't** set the jumbo params, the API automatically scales the image down to fit Chrome's limit and avoid duplication issues.
    This manifests as a **blurry, lower-resolution image** — text gets soft, fine lines smear, and high `device_scale` values stop helping.
    If your render is anywhere near 8000px on either side, set `jumbo_max_width` and `jumbo_max_height` to keep it sharp." %} + + +
    ### When to use it @@ -49,7 +51,7 @@ The big win is **quality**. Jumbo lets you produce huge images **without losing Jumbo works with both `html`/`css` and `url` requests. You can apply jumbo params on [Templates](/getting-started/templates) as well. -
    +
    ## Parameters @@ -62,7 +64,7 @@ Both parameters must be set together. Setting one without the other returns a `4 These are **maximums**, not exact dimensions. If your content is smaller than the max, you get a smaller image. If it's larger, the renderer scales down to fit (see [How it works](#how-it-works)). -
    +
    ## How it works @@ -77,9 +79,11 @@ When you pass `jumbo_max_width` and `jumbo_max_height`, the renderer: The result is a single large screenshot. -{% include hint.md title="Jumbo is measured after device_scale is applied." text="If you expect your final image to be `5,000` x `2,000` and you want a crisp retina image, you should set your jumbo max to at least `10,000` x `4,000`." %} + -
    +
    ## Limits @@ -100,7 +104,7 @@ The 400-million-pixel area cap means you can't max out both dimensions at once. - `20,000 x 20,000` - `12,500 x 32,000` -
    +
    ## Billing @@ -110,6 +114,8 @@ The number of tiles is calculated from the **maximum specified size**. When used with `ms_delay`, the [standard `ms_delay` multiple](/parameters/ms_delay#credit-usage) is applied only to the base image, not to the image credits for additional tiles. + + ### Examples | Jumbo size | `ms_delay` | Total Tiles | Image credits billed | @@ -123,10 +129,12 @@ When used with `ms_delay`, the [standard `ms_delay` multiple](/parameters/ms_del -
    +
    ## Examples + + ### HTML render ```json @@ -138,6 +146,8 @@ When used with `ms_delay`, the [standard `ms_delay` multiple](/parameters/ms_del } ``` + + ### URL render ```json @@ -149,6 +159,8 @@ When used with `ms_delay`, the [standard `ms_delay` multiple](/parameters/ms_del } ``` + + ### Render a specific large element Combine `selector` with jumbo to capture one giant element on a page. @@ -163,6 +175,8 @@ Combine `selector` with jumbo to capture one giant element on a page. } ``` + + ### cURL ```bash @@ -177,46 +191,70 @@ curl -X POST https://hcti.io/v1/image \ }' ``` -
    +
    ## Troubleshooting +
    + + + ### `jumbo_max_width must be present when jumbo_max_height is specified.` Both params are required together. Add the missing one. + + ### `jumbo_max_height or jumbo_max_width should be greater than 8000` At least one dimension must be `> 8000`. If both are `<= 8000`, drop the jumbo params and use a normal render — it will be cheaper and faster. + + ### `total jumbo pixel area cannot be greater than 400,000,000.` `jumbo_max_width * jumbo_max_height` exceeds the 400M area cap. Reduce one or both dimensions. + + ### `cannot set pdf_options and jumbo options together` Jumbo is image-only (PNG / JPG / WebP). Remove `pdf_options` if you want a jumbo render. + + ### My image came back smaller than `jumbo_max_width` x `jumbo_max_height` Those parameters are **maximums**. If your content is naturally smaller, the output will be smaller too. If your content is larger, the renderer downscales to fit while preserving aspect ratio — so the output matches one dimension exactly and is shorter on the other axis. + + ### My large image is blurry (and I'm not using jumbo parameters) When a render naturally exceeds ~8000px and `jumbo_max_width` / `jumbo_max_height` are not set, the API scales the image down to fit Chrome's limit. The result is a single-resolution image that no longer matches your `device_scale`, which usually looks blurry — especially text and thin lines. Fix: set `jumbo_max_width` and `jumbo_max_height` to the size you actually want. The renderer will tile and stitch instead of downscaling, and your `device_scale` will be preserved. + + #### For example: If your final image is 10,000 px tall, the effective device_scale will be 0.8 to fit it within the 8000px boundary. If you're expecting a readable, sharp image - you need jumbo. + + ### Why did this cost N image credits? See [Billing](#billing). The image credit count is `1 + ceil(width / 8000) * ceil(height / 8000)` based on the **maximum output size**, plus any [`ms_delay` image credit cost](/parameters/ms_delay#credit-usage). The dashboard usage view shows the image credit count for each image. + + ### Why does jumbo cost more? Jumbo images require significantly more resources than a standard image to render, stitch and store. -{% include code_footer.md version=1 %} +
    + + + + diff --git a/guides/advanced/proxies.md b/src/content/docs/guides/advanced/proxies.mdx similarity index 83% rename from guides/advanced/proxies.md rename to src/content/docs/guides/advanced/proxies.mdx index 1693900..2677484 100644 --- a/guides/advanced/proxies.md +++ b/src/content/docs/guides/advanced/proxies.mdx @@ -1,33 +1,28 @@ --- -layout: page -title: HTTP Proxies -permalink: /guides/advanced/proxies/ -parent: Advanced -grand_parent: Guides -nav_order: 5 +title: HTTP proxies +slug: guides/advanced/proxies description: >- Route image renders through your own HTTP proxy. Restrict access to internal content, control egress IPs, or get past bot detection. --- -# HTTP Proxies -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../components/Help.astro'; +import DocImage from '../../../../components/DocImage.astro'; + + Route outbound traffic from your renders through an HTTP proxy you control. -{: .fs-6 .fw-300 } -
    ## Why use a proxy? When you configure a proxy, **all outbound HTTP requests made while rendering your image** are routed through it. This is useful when you want to: -- **Restrict access to internal content** by allowlisting our proxy's IP address on your origin (instead of opening it to the public internet). +- **Restrict access to internal content** by allowlisting your proxy's IP address on your origin. - **Control the egress IP** so requests appear to come from a known location. - **Get past bot detection** that rate-limits or blocks our shared infrastructure IPs. -{% include hint.md title="Plan availability" text="Proxies are available on the **10,000 images/month plan or higher**. If you'd like to try this out on a different plan, email **support@htmlcsstoimage.com**." %} + -
    ## Recommended proxy providers @@ -58,9 +53,8 @@ ZenRows exposes a single proxy endpoint and uses your API key as the password. - **Port**: `1338` - **Authentication**: enabled, with your ZenRows username and API key as the password. -{% include hint.md title="Use bypass hosts to save credits" text="Most paid proxies bill per request or per GB. Add hosts that don't need proxying — like Google Fonts, your own CDN, or analytics — to **Bypass Hosts** so they go out direct and don't burn through your proxy quota." %} + -
    ## Creating a proxy @@ -68,7 +62,7 @@ Proxies are managed in the dashboard at [https://htmlcsstoimage.com/dashboard/pr Click **Add New Proxy** and fill out the form: -{% cloudinary /assets/images/proxies-dashboard.png alt="Create a new HTTP proxy in the HTML/CSS to Image dashboard" %} + | Field | Description | |:------|:------------| @@ -81,7 +75,6 @@ Click **Add New Proxy** and fill out the form: After saving, the dashboard will show the proxy's `id`. You'll pass this `id` on each request to use the proxy. -
    ## Using a proxy when generating an image @@ -119,7 +112,6 @@ curl -X POST https://hcti.io/v1/image \ } ``` -
    ## How it works @@ -128,9 +120,8 @@ curl -X POST https://hcti.io/v1/image \ - **Bypass Hosts skip the proxy.** Listed hostnames go out direct, which is helpful for high-volume third-party assets that don't need to be routed through your infrastructure. - The proxy must be reachable over the public internet from our render servers. -{% include hint.md title="HTTPS only" text="The proxy URL must use `https://`. We do not support plain `http://` proxies." %} + -
    ## Troubleshooting @@ -143,4 +134,4 @@ curl -X POST https://hcti.io/v1/image \ Use the [Proxies API](/management-api/proxies/) or [MCP tools](/integrations/mcp/tools/#proxies) to create, list, inspect, update, and delete proxy configurations. Management uses `proxies:read`, `proxies:create_update`, or `proxies:delete`; rendering with an existing `proxy_id` uses image permissions. API updates replace the complete configuration. To keep an existing password, include the unchanged username and `authentication.retain_password: true`; omitting authentication removes it. -{% include code_footer.md version=1 %} + diff --git a/guides/advanced/storage-destinations/backblaze-b2.md b/src/content/docs/guides/advanced/storage-destinations/backblaze-b2.mdx similarity index 85% rename from guides/advanced/storage-destinations/backblaze-b2.md rename to src/content/docs/guides/advanced/storage-destinations/backblaze-b2.mdx index bbeb28c..f803441 100644 --- a/guides/advanced/storage-destinations/backblaze-b2.md +++ b/src/content/docs/guides/advanced/storage-destinations/backblaze-b2.mdx @@ -1,28 +1,21 @@ --- -layout: page title: Upload to Backblaze B2 -nav_title: Backblaze B2 -permalink: /guides/advanced/storage-destinations/backblaze-b2/ -parent: Storage Destinations -grand_parent: Advanced -great_grand_parent: Guides -nav_order: 3 +slug: guides/advanced/storage-destinations/backblaze-b2 description: >- Upload images generated from HTML/CSS, URL screenshots, and PDFs directly to Backblaze B2 using its S3-compatible API and HTML/CSS to Image. --- -# Upload images to Backblaze B2 -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../../components/Help.astro'; + +
    Send every rendered image or PDF to a Backblaze B2 bucket you control. -{: .fs-6 .fw-300 } -
    HTML/CSS to Image connects to Backblaze B2 through its S3-compatible API. A scoped B2 application key supplies the access key ID and secret used by HCTI. -{% include hint.md title="Plan availability" text="Storage destinations are available on the **10,000 images/month plan or higher**. If you'd like to try this on a different plan, email **support@htmlcsstoimage.com**." %} + ## Before you begin @@ -100,10 +93,10 @@ The base object is stored as `/.png`, or `.pdf` when the r Backblaze documents [creating scoped application keys](https://www.backblaze.com/docs/en/cloud-storage-get-started-with-a-backblaze-integration) and [calling the B2 S3-compatible API](https://www.backblaze.com/docs/en/cloud-storage-call-the-s3-compatible-api). -{% include hint.md title="Next: use your storage destination" text="[Continue to the Storage Destinations guide](/guides/advanced/storage-destinations/) for templates, batches, object storage behavior, and the complete `PUT /v1/store` response." %} + ## Automate destination setup You can also automate configuration through the [Storage destinations API](/management-api/storage-destinations/) or [MCP tools](/integrations/mcp/tools/#storage-destinations). -{% include code_footer.md version=1 %} + diff --git a/guides/advanced/storage-destinations/digitalocean-spaces.md b/src/content/docs/guides/advanced/storage-destinations/digitalocean-spaces.mdx similarity index 83% rename from guides/advanced/storage-destinations/digitalocean-spaces.md rename to src/content/docs/guides/advanced/storage-destinations/digitalocean-spaces.mdx index 588d537..ac68687 100644 --- a/guides/advanced/storage-destinations/digitalocean-spaces.md +++ b/src/content/docs/guides/advanced/storage-destinations/digitalocean-spaces.mdx @@ -1,28 +1,21 @@ --- -layout: page title: Upload to DigitalOcean Spaces -nav_title: DigitalOcean Spaces -permalink: /guides/advanced/storage-destinations/digitalocean-spaces/ -parent: Storage Destinations -grand_parent: Advanced -great_grand_parent: Guides -nav_order: 4 +slug: guides/advanced/storage-destinations/digitalocean-spaces description: >- Upload images generated from HTML/CSS, URL screenshots, and PDFs directly to DigitalOcean Spaces with a scoped Spaces key and HTML/CSS to Image. --- -# Upload images to DigitalOcean Spaces -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../../components/Help.astro'; + +
    Send every rendered image or PDF to a DigitalOcean Space you control. -{: .fs-6 .fw-300 } -
    HTML/CSS to Image connects to DigitalOcean Spaces through its S3-compatible API. HCTI derives the service endpoint from the Space's region and authenticates with a Spaces access key and secret. -{% include hint.md title="Plan availability" text="Storage destinations are available on the **10,000 images/month plan or higher**. If you'd like to try this on a different plan, email **support@htmlcsstoimage.com**." %} + ## Before you begin @@ -92,10 +85,10 @@ The base object is stored as `/.png`, or `.pdf` when the r DigitalOcean documents the [Spaces S3-compatible API, endpoints, and permission levels](https://docs.digitalocean.com/reference/api/spaces/). -{% include hint.md title="Next: use your storage destination" text="[Continue to the Storage Destinations guide](/guides/advanced/storage-destinations/) for templates, batches, object storage behavior, and the complete `PUT /v1/store` response." %} + ## Automate destination setup You can also automate configuration through the [Storage destinations API](/management-api/storage-destinations/) or [MCP tools](/integrations/mcp/tools/#storage-destinations). -{% include code_footer.md version=1 %} + diff --git a/guides/advanced/storage-destinations/google-cloud-storage.md b/src/content/docs/guides/advanced/storage-destinations/google-cloud-storage.mdx similarity index 85% rename from guides/advanced/storage-destinations/google-cloud-storage.md rename to src/content/docs/guides/advanced/storage-destinations/google-cloud-storage.mdx index 7751858..8a720fc 100644 --- a/guides/advanced/storage-destinations/google-cloud-storage.md +++ b/src/content/docs/guides/advanced/storage-destinations/google-cloud-storage.mdx @@ -1,28 +1,21 @@ --- -layout: page title: Upload to Google Cloud Storage -nav_title: Google Cloud Storage -permalink: /guides/advanced/storage-destinations/google-cloud-storage/ -parent: Storage Destinations -grand_parent: Advanced -great_grand_parent: Guides -nav_order: 6 +slug: guides/advanced/storage-destinations/google-cloud-storage description: >- Upload images generated from HTML/CSS, URL screenshots, and PDFs directly to Google Cloud Storage with HMAC credentials and HTML/CSS to Image. --- -# Upload images to Google Cloud Storage -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../../components/Help.astro'; + +
    Send every rendered image or PDF to a Google Cloud Storage bucket you control. -{: .fs-6 .fw-300 } -
    HTML/CSS to Image connects to Google Cloud Storage through its S3-compatible XML API. A Google Cloud service account supplies bucket permissions, and an HMAC access ID and secret authenticate HCTI requests. -{% include hint.md title="Plan availability" text="Storage destinations are available on the **10,000 images/month plan or higher**. If you'd like to try this on a different plan, email **support@htmlcsstoimage.com**." %} + ## Before you begin @@ -103,10 +96,10 @@ The base object is stored as `/.png`, or `.pdf` when the r Google Cloud documents [creating service account HMAC keys](https://cloud.google.com/storage/docs/authentication/managing-hmackeys) and [Cloud Storage IAM roles](https://cloud.google.com/storage/docs/access-control/iam-roles). -{% include hint.md title="Next: use your storage destination" text="[Continue to the Storage Destinations guide](/guides/advanced/storage-destinations/) for templates, batches, object storage behavior, and the complete `PUT /v1/store` response." %} + ## Automate destination setup You can also automate configuration through the [Storage destinations API](/management-api/storage-destinations/) or [MCP tools](/integrations/mcp/tools/#storage-destinations). -{% include code_footer.md version=1 %} + diff --git a/guides/advanced/storage-destinations/index.md b/src/content/docs/guides/advanced/storage-destinations/index.mdx similarity index 95% rename from guides/advanced/storage-destinations/index.md rename to src/content/docs/guides/advanced/storage-destinations/index.mdx index 179c0bd..f84517a 100644 --- a/guides/advanced/storage-destinations/index.md +++ b/src/content/docs/guides/advanced/storage-destinations/index.mdx @@ -1,24 +1,17 @@ --- -layout: page -title: Storage Destinations -permalink: /guides/advanced/storage-destinations/ -parent: Advanced -grand_parent: Guides -has_children: true -has_toc: false -nav_order: 7 +title: Storage destinations +slug: guides/advanced/storage-destinations description: >- Use Storage Destinations to automate rendering HTML/CSS images, URL screenshots or dynamic templated images to your Amazon S3 or S3-compatible bucket. --- -# Storage Destinations -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../../components/Help.astro'; + +
    Store rendered images in an Amazon S3 or S3-compatible bucket you control. -{: .fs-6 .fw-300 } -
    ## Why use a storage destination? @@ -31,9 +24,8 @@ A storage destination tells HTML/CSS to Image where to write a copy of each rend By default, HTML/CSS to Image keeps its normal copy and also writes a copy to your destination. If you choose **Disable HCTI Storage**, your bucket becomes the only location where the rendered file is stored. -{% include hint.md title="Plan availability" text="Storage destinations are available on the **10,000 images/month plan or higher**. If you'd like to try this on a different plan, email **support@htmlcsstoimage.com**." %} + -
    ## Supported providers @@ -51,7 +43,6 @@ Choose your provider for credentials, permissions, dashboard fields, connection The bucket must already exist. HTML/CSS to Image does not create buckets for you. -
    ## Creating a storage destination @@ -81,7 +72,6 @@ The connection test verifies that HCTI can write a small text object. Deleting t Credentials are encrypted before being stored. Saved secret access keys are not displayed again. -
    ## Using a destination @@ -145,7 +135,6 @@ Creating an image records which destination to use, but rendering remains lazy. The base object key is `/.png`, or `.pdf` for an image with `pdf_options` defined. Resized, cropped, or reformatted variants use separate object keys so they do not replace the base image (but will begin with the same `/`). -
    ## Using a destination with templates @@ -161,7 +150,6 @@ You can set `storage_destination_id` when creating or updating a template. Each The destination and its **Disable HCTI Storage** behavior are captured when an image is created. Updating the template later, or changing that setting on the destination, does not change images that have already been created, even if they have not been rendered or stored. -
    ## Disable HCTI Storage @@ -173,7 +161,7 @@ When you choose to **Disable HCTI Storage**, images assigned to that destination HTML/CSS to Image still retains the image settings and metadata needed to process the render, but it does not store a final rendered image. Your application is responsible for reading or serving the resulting object from your bucket. -{% include hint.md title="This setting is captured per image" text="Changing **Disable HCTI Storage** affects only images created afterward. Existing images keep the storage behavior selected when they were created." %} + ## `PUT /v1/store` @@ -276,7 +264,6 @@ Inspect the object results when handling a `424` response. A `partial` outcome m After a complete store request, read or serve the object from the bucket and key returned in the response. Objects use the access settings configured on your bucket; HCTI does not make them public or add a public-read ACL. Configure your bucket, application, or CDN to provide whatever access your use case requires. -
    ## Disabling or deleting a destination @@ -285,7 +272,6 @@ After a complete store request, read or serve the object from the bucket and key - Deleting a destination removes its stored credentials, but does not delete files already written to your bucket. Deleting the image from HCTI also does not delete those files. - Existing images keep their destination reference. -
    ## Troubleshooting @@ -299,4 +285,4 @@ After a complete store request, read or serve the object from the bucket and key Use the [Storage destinations API](/management-api/storage-destinations/) or [MCP tools](/integrations/mcp/tools/#storage-destinations) for configuration management and AWS external-ID discovery. Configuration permissions are separate from `images:store`, which is required for authenticated `PUT /v1/store/{id}` requests. The API reference explains replacement updates, credential preservation, and automatic connection testing. -{% include code_footer.md version=1 %} + diff --git a/guides/advanced/storage-destinations/r2.md b/src/content/docs/guides/advanced/storage-destinations/r2.mdx similarity index 86% rename from guides/advanced/storage-destinations/r2.md rename to src/content/docs/guides/advanced/storage-destinations/r2.mdx index b1dd9ef..2cae357 100644 --- a/guides/advanced/storage-destinations/r2.md +++ b/src/content/docs/guides/advanced/storage-destinations/r2.mdx @@ -1,28 +1,21 @@ --- -layout: page title: Upload to Cloudflare R2 -nav_title: Cloudflare R2 -permalink: /guides/advanced/storage-destinations/r2/ -parent: Storage Destinations -grand_parent: Advanced -great_grand_parent: Guides -nav_order: 2 +slug: guides/advanced/storage-destinations/r2 description: >- Upload images generated from HTML/CSS, URL screenshots, and PDFs directly to Cloudflare R2 with S3 API credentials and HTML/CSS to Image. --- -# Upload images to Cloudflare R2 -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../../components/Help.astro'; + +
    Send every rendered image or PDF to a Cloudflare R2 bucket you control. -{: .fs-6 .fw-300 } -
    HTML/CSS to Image connects to Cloudflare R2 through its S3-compatible API. You provide an R2 access key, secret, Cloudflare account ID, and the bucket's data jurisdiction. -{% include hint.md title="Plan availability" text="Storage destinations are available on the **10,000 images/month plan or higher**. If you'd like to try this on a different plan, email **support@htmlcsstoimage.com**." %} + ## Before you begin @@ -106,10 +99,10 @@ The base object is stored as `/.png`, or `.pdf` when the r Cloudflare documents [creating R2 S3 API credentials](https://developers.cloudflare.com/r2/get-started/s3/) and [jurisdiction-specific R2 endpoints](https://developers.cloudflare.com/r2/reference/data-location/). -{% include hint.md title="Next: use your storage destination" text="[Continue to the Storage Destinations guide](/guides/advanced/storage-destinations/) for templates, batches, object storage behavior, and the complete `PUT /v1/store` response." %} + ## Automate destination setup You can also automate configuration through the [Storage destinations API](/management-api/storage-destinations/) or [MCP tools](/integrations/mcp/tools/#storage-destinations). -{% include code_footer.md version=1 %} + diff --git a/guides/advanced/storage-destinations/s3-compatible.md b/src/content/docs/guides/advanced/storage-destinations/s3-compatible.mdx similarity index 88% rename from guides/advanced/storage-destinations/s3-compatible.md rename to src/content/docs/guides/advanced/storage-destinations/s3-compatible.mdx index b9bfd53..525808c 100644 --- a/guides/advanced/storage-destinations/s3-compatible.md +++ b/src/content/docs/guides/advanced/storage-destinations/s3-compatible.mdx @@ -1,28 +1,21 @@ --- -layout: page title: Upload to an S3-compatible service -nav_title: S3-compatible -permalink: /guides/advanced/storage-destinations/s3-compatible/ -parent: Storage Destinations -grand_parent: Advanced -great_grand_parent: Guides -nav_order: 7 +slug: guides/advanced/storage-destinations/s3-compatible description: >- Upload images generated from HTML/CSS, URL screenshots, and PDFs directly to an S3-compatible object storage service with HTML/CSS to Image. --- -# Upload images to an S3-compatible service -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../../components/Help.astro'; + +
    Connect HTML/CSS to Image to an S3-compatible provider that is not listed separately in the dashboard. -{: .fs-6 .fw-300 } -
    Use the **Other S3-compatible** provider when your object storage service supports the S3 API but does not have a dedicated HCTI option. You supply the service endpoint, signing region, addressing style, and access keys. -{% include hint.md title="Plan availability" text="Storage destinations are available on the **10,000 images/month plan or higher**. If you'd like to try this on a different plan, email **support@htmlcsstoimage.com**." %} + ## Before you begin @@ -118,10 +111,10 @@ The base object is stored as `/.png`, or `.pdf` when the r If the provider has a dedicated option in HCTI, use that option instead; it preconfigures the endpoint and addressing behavior. See the [Amazon S3](/guides/advanced/storage-destinations/s3/), [Cloudflare R2](/guides/advanced/storage-destinations/r2/), [Backblaze B2](/guides/advanced/storage-destinations/backblaze-b2/), [DigitalOcean Spaces](/guides/advanced/storage-destinations/digitalocean-spaces/), [Wasabi](/guides/advanced/storage-destinations/wasabi/), and [Google Cloud Storage](/guides/advanced/storage-destinations/google-cloud-storage/) guides. -{% include hint.md title="Next: use your storage destination" text="[Continue to the Storage Destinations guide](/guides/advanced/storage-destinations/) for templates, batches, object storage behavior, and the complete `PUT /v1/store` response." %} + ## Automate destination setup You can also automate configuration through the [Storage destinations API](/management-api/storage-destinations/) or [MCP tools](/integrations/mcp/tools/#storage-destinations). -{% include code_footer.md version=1 %} + diff --git a/guides/advanced/storage-destinations/s3.md b/src/content/docs/guides/advanced/storage-destinations/s3.mdx similarity index 89% rename from guides/advanced/storage-destinations/s3.md rename to src/content/docs/guides/advanced/storage-destinations/s3.mdx index f0d8fbc..3e0aa38 100644 --- a/guides/advanced/storage-destinations/s3.md +++ b/src/content/docs/guides/advanced/storage-destinations/s3.mdx @@ -1,28 +1,21 @@ --- -layout: page title: Upload to Amazon S3 -nav_title: Amazon S3 -permalink: /guides/advanced/storage-destinations/s3/ -parent: Storage Destinations -grand_parent: Advanced -great_grand_parent: Guides -nav_order: 1 +slug: guides/advanced/storage-destinations/s3 description: >- Upload images generated from HTML/CSS, URL screenshots, and PDFs directly to Amazon S3 using an IAM role and HTML/CSS to Image. --- -# Upload images to Amazon S3 -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../../components/Help.astro'; + +
    Send every rendered image or PDF to an Amazon S3 bucket you control. -{: .fs-6 .fw-300 } -
    HTML/CSS to Image connects to Amazon S3 by assuming an IAM role in your AWS account. HCTI receives temporary credentials when it needs to write an object, so you do not need to create or share a long-lived AWS access key. -{% include hint.md title="Plan availability" text="Storage destinations are available on the **10,000 images/month plan or higher**. If you'd like to try this on a different plan, email **support@htmlcsstoimage.com**." %} + ## Before you begin @@ -103,7 +96,7 @@ The base object is stored as `/.png`, or `.pdf` when the r AWS documents [creating a role with a custom trust policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-custom.html) and [using external IDs for third-party access](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html). -{% include hint.md title="Next: use your storage destination" text="[Continue to the Storage Destinations guide](/guides/advanced/storage-destinations/) for templates, batches, object storage behavior, and the complete `PUT /v1/store` response." %} + ## Automate destination setup @@ -111,4 +104,4 @@ You can also automate configuration through the [Storage destinations API](/mana Use `writer_role_arn` as `Principal.AWS` and `external_id` in a `StringEquals` condition on `sts:ExternalId` when creating your role's trust policy. This supplies both values programmatically, without copying the principal from the dashboard. Attach the bucket permissions described above, then pass **your role's ARN** as the destination's `connection_info.role_arn`. The returned `writer_role_arn` identifies HCTI's existing role, which assumes your role; it is not the destination's role ARN. -{% include code_footer.md version=1 %} + diff --git a/guides/advanced/storage-destinations/wasabi.md b/src/content/docs/guides/advanced/storage-destinations/wasabi.mdx similarity index 84% rename from guides/advanced/storage-destinations/wasabi.md rename to src/content/docs/guides/advanced/storage-destinations/wasabi.mdx index 198f1ef..b5c45bc 100644 --- a/guides/advanced/storage-destinations/wasabi.md +++ b/src/content/docs/guides/advanced/storage-destinations/wasabi.mdx @@ -1,28 +1,21 @@ --- -layout: page title: Upload to Wasabi -nav_title: Wasabi -permalink: /guides/advanced/storage-destinations/wasabi/ -parent: Storage Destinations -grand_parent: Advanced -great_grand_parent: Guides -nav_order: 5 +slug: guides/advanced/storage-destinations/wasabi description: >- Upload images generated from HTML/CSS, URL screenshots, and PDFs directly to Wasabi using S3-compatible access keys and HTML/CSS to Image. --- -# Upload images to Wasabi -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../../components/Help.astro'; + +
    Send every rendered image or PDF to a Wasabi bucket you control. -{: .fs-6 .fw-300 } -
    HTML/CSS to Image connects to Wasabi through its S3-compatible API. HCTI derives the service endpoint from the bucket's Wasabi region and authenticates with an access key and secret. -{% include hint.md title="Plan availability" text="Storage destinations are available on the **10,000 images/month plan or higher**. If you'd like to try this on a different plan, email **support@htmlcsstoimage.com**." %} + ## Before you begin @@ -93,10 +86,10 @@ The base object is stored as `/.png`, or `.pdf` when the r Wasabi documents [creating access keys](https://docs.wasabi.com/docs/creating-a-new-access-key) and its [regional S3 service endpoints](https://docs.wasabi.com/docs/service-url-endpoints). -{% include hint.md title="Next: use your storage destination" text="[Continue to the Storage Destinations guide](/guides/advanced/storage-destinations/) for templates, batches, object storage behavior, and the complete `PUT /v1/store` response." %} + ## Automate destination setup You can also automate configuration through the [Storage destinations API](/management-api/storage-destinations/) or [MCP tools](/integrations/mcp/tools/#storage-destinations). -{% include code_footer.md version=1 %} + diff --git a/guides/debugging/blurry-images.md b/src/content/docs/guides/debugging/blurry-images.mdx similarity index 88% rename from guides/debugging/blurry-images.md rename to src/content/docs/guides/debugging/blurry-images.mdx index 6b8de4f..521d168 100644 --- a/guides/debugging/blurry-images.md +++ b/src/content/docs/guides/debugging/blurry-images.mdx @@ -1,22 +1,15 @@ --- -layout: page title: Blurry images -permalink: /guides/debugging/blurry-images/ -parent: Debugging -grand_parent: Guides -nav_order: 2 +slug: guides/debugging/blurry-images description: >- Complete guide to understanding and fixing blurry images with pixel density, resolution, and device scaling --- -# Debugging Blurry Images -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; -The complete guide to crystal-clear, high-resolution images -{: .fs-6 .fw-300 } +
    -
    +Understand pixel density and choose the right resolution for your images. ## Why Images Look Blurry @@ -24,7 +17,7 @@ Blurry images are almost always caused by **insufficient pixel density** for the The HTML/CSS to Image API automatically generates **high-resolution images by default** to ensure your images look crisp on all devices. Here's everything you need to know about creating pixel-perfect images. -{% include hint.md title="Default High Resolution" text="The HCTI API defaults to 2x resolution (device_scale: 2) for HTML images to prioritize image quality. This ensures your images look sharp on both standard and high-DPI displays." %} + ## Understanding Pixel Density @@ -113,7 +106,7 @@ For HTML images, verify your API request: ```json { "html": "
    Your content
    ", - "device_scale": 2 // Ensure this is set to 2 + "device_scale": 2 } ``` @@ -121,7 +114,7 @@ For URL images, always specify device scale: ```json { "url": "https://your-site.com", - "device_scale": 2 // Add this for sharp screenshots + "device_scale": 2 } ``` @@ -225,10 +218,10 @@ Use SVG for logos and icons that scale perfectly at any resolution: ### File Size Impact -Higher resolution means larger files: -- `device_scale: 1` → Base file size -- `device_scale: 2` → ~4x larger files -- `device_scale: 3` → ~9x larger files +Higher resolution increases pixel count; compressed file size also depends on content and format: +- `device_scale: 1` → Base pixel count +- `device_scale: 2` → 4x as many pixels +- `device_scale: 3` → 9x as many pixels ### Optimization Strategies @@ -239,7 +232,7 @@ Higher resolution means larger files: - WebP for modern browsers (when supported) 3. **Consider bandwidth**: Higher resolution may impact load times -{% include hint.md title="Performance Tip" text="Use device_scale: 2 as the sweet spot for web usage. It provides excellent quality on all displays while keeping file sizes reasonable." %} + ## Troubleshooting Checklist @@ -290,6 +283,5 @@ Include: We love solving tricky rendering problems and helping you achieve pixel-perfect results. -{% include code_footer.md version=2 %} - +
    diff --git a/guides/debugging/cloudflare-challenges.md b/src/content/docs/guides/debugging/cloudflare-challenges.mdx similarity index 86% rename from guides/debugging/cloudflare-challenges.md rename to src/content/docs/guides/debugging/cloudflare-challenges.mdx index 7d23771..0818992 100644 --- a/guides/debugging/cloudflare-challenges.md +++ b/src/content/docs/guides/debugging/cloudflare-challenges.mdx @@ -1,25 +1,18 @@ --- -layout: page -title: Avoiding Cloudflare Challenges in Screenshots -nav_title: Cloudflare Challenges -permalink: /guides/debugging/cloudflare-challenges/ -parent: Debugging -grand_parent: Guides -nav_order: 5 +title: Cloudflare challenges in screenshots +slug: guides/debugging/cloudflare-challenges description: >- Allow authorized HTML/CSS to Image renders through a Cloudflare challenge on a site you control. --- -# Bypassing Cloudflare challenges for sites you control -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import Help from '../../../../components/Help.astro'; -Diagnose screenshots that capture a Cloudflare challenge instead of your page, then create a safe exception for authorized renders. -{: .fs-6 .fw-300 } + -
    +Diagnose screenshots that capture a Cloudflare challenge instead of your page, then create a safe exception for authorized renders. -{% include hint.md title="Only for sites you control" text="Use this approach only for a domain and Cloudflare account you own or administer. It is not a way to bypass another site's access controls." %} + ## The problem @@ -127,6 +120,6 @@ Custom headers are never sent to an origin outside the requested URL's origin an - Skip only the feature that blocks the authorized render. - Rotate the value periodically and immediately after suspected exposure. -{% include hint.md title="Not a Cloudflare challenge?" text="If the site is not protected by Cloudflare, or the problem is related to the render's source IP, network access, or region, an [HTTP proxy](/guides/advanced/proxies/) may be a better fit. Proxies can provide a stable allowlisted IP, access to private content, or different outbound routing." %} + -{% include code_footer.md version=2 %} + diff --git a/guides/debugging/cropping-issues.md b/src/content/docs/guides/debugging/cropping-issues.mdx similarity index 73% rename from guides/debugging/cropping-issues.md rename to src/content/docs/guides/debugging/cropping-issues.mdx index a207007..c77db41 100644 --- a/guides/debugging/cropping-issues.md +++ b/src/content/docs/guides/debugging/cropping-issues.mdx @@ -1,46 +1,41 @@ --- -layout: page title: Cropping issues -permalink: /guides/debugging/cropping-issues/ -parent: Debugging -grand_parent: Guides -nav_order: 1 +slug: guides/debugging/cropping-issues description: >- Fix images that aren't cropping correctly. Learn why full HTML pages don't auto-crop and how to use HTML snippets instead. --- -# Debugging Cropping Issues -{: .no_toc } -{: .fs-9 } +import { Aside } from '@astrojs/starlight/components'; +import DocImage from '../../../../components/DocImage.astro'; +import Help from '../../../../components/Help.astro'; -Why your image isn't cropping to the size you expect -{: .fs-6 .fw-300 } - -
    +
    -## Table of contents -{: .no_toc .text-delta } +Why your image isn't cropping to the size you expect -1. TOC -{:toc} + + --- ## How Auto-Cropping Works + The HTML/CSS to Image API has a powerful **auto-cropping** feature that automatically sizes your image to match your HTML content. When you send an HTML snippet, the API crops the resulting image to the dimensions of the **outermost HTML element**. However, this only works for **HTML snippets**—not full HTML pages. -{% include hint.md title="Key Concept" text="Auto-cropping works by detecting the outermost element in your HTML and cropping to its dimensions. If you send a full HTML page with <html> and <body> tags, the API renders the entire viewport instead." %} + --- ## The Most Common Mistake + The most frequent cropping issue we see: **sending a full HTML page when you meant to send an HTML snippet**. ### What Happens with a Full HTML Page + When you include ``, ``, ``, or `` tags, the API treats your content as a **full webpage** and renders it inside the default viewport (1920x1080 pixels). @@ -65,13 +60,14 @@ When you include ``, ``, ``, or `` tags, the AP **Result:** Instead of a 400x200 image, you get a 1920x1080 image with your content in the corner: -Full HTML page renders the entire viewport, not cropped to element size + Notice how the image includes the entire viewport with a gray background, not just your 400x200 card. --- ## The Solution: Use HTML Snippets + Remove the ``, ``, ``, and `` tags. Send only the HTML elements you want in your image. @@ -86,13 +82,14 @@ Remove the ``, ``, ``, and `` tags. Send only the HT ``` -**Result:** The image is automatically cropped to exactly 400x200 (or 800x400 at 2x resolution): +**Result:** The image is cropped to the element's border box. With default `content-box` sizing, a 2px border adds 4px to each dimension. Add `box-sizing: border-box` for exactly 400×200 CSS pixels, or 800×400 output pixels at 2x resolution. -HTML snippet correctly auto-crops to element dimensions + --- ## Setting Dimensions on the Outermost Element + For auto-cropping to work correctly, set explicit `width` and `height` on your **outermost** HTML element: @@ -105,6 +102,7 @@ For auto-cropping to work correctly, set explicit `width` and `height` on your * The API will crop the image to match these dimensions (doubled for retina displays by default). ### Using CSS Classes + You can also use a ` diff --git a/src/pages/robots.txt.ts b/src/pages/robots.txt.ts new file mode 100644 index 0000000..39539ab --- /dev/null +++ b/src/pages/robots.txt.ts @@ -0,0 +1,6 @@ +import type { APIRoute } from 'astro'; + +export const GET: APIRoute = ({ site }) => new Response( + `User-agent: *\nAllow: /\n\nSitemap: ${new URL('/sitemap.xml', site)}\n`, + { headers: { 'Content-Type': 'text/plain; charset=utf-8' } }, +); diff --git a/assets/js/hmac-generator.js b/src/scripts/hmac-generator.js similarity index 86% rename from assets/js/hmac-generator.js rename to src/scripts/hmac-generator.js index 9a7c215..978b06e 100644 --- a/assets/js/hmac-generator.js +++ b/src/scripts/hmac-generator.js @@ -1,8 +1,9 @@ -(function () { +function initializeHmacGenerator() { 'use strict'; var generator = document.querySelector('[data-hmac-generator]'); - if (!generator) return; + if (!generator || generator.dataset.initialized) return; + generator.dataset.initialized = "true"; var form = generator.querySelector('[data-hmac-form]'); var queryInput = generator.querySelector('[data-hmac-query]'); @@ -102,8 +103,12 @@ } }); - window.addEventListener('pagehide', function () { - secretInput.value = ''; - tokenInput.value = ''; - }); -})(); + const clearSecrets = () => { secretInput.value = ''; tokenInput.value = ''; }; + window.addEventListener('pagehide', clearSecrets, { once: true }); + document.addEventListener('astro:before-swap', () => { + clearSecrets(); + window.removeEventListener('pagehide', clearSecrets); + }, { once: true }); +} +initializeHmacGenerator(); +document.addEventListener('astro:page-load', initializeHmacGenerator); diff --git a/src/scripts/prefetch.ts b/src/scripts/prefetch.ts new file mode 100644 index 0000000..fbcb3c5 --- /dev/null +++ b/src/scripts/prefetch.ts @@ -0,0 +1,71 @@ +import type { TransitionBeforePreparationEvent } from 'astro:transitions/client'; + +// Match ClientRouter's ordinary fetch, including its default Accept header. +// The Worker allows 60 seconds of private browser caching with Vary: Accept. +const requests = new Map }>(); +const lifetime = 60_000; +let timer: ReturnType | undefined; + +function candidate(target: EventTarget | null): string | undefined { + const anchor = target instanceof Element ? target.closest('a[href]') : null; + if (!anchor || anchor.hasAttribute('download') || anchor.hasAttribute('data-astro-reload') + || anchor.dataset.astroPrefetch === 'false' || (anchor.target && anchor.target !== '_self')) return; + const url = new URL(anchor.href); + // Docs use trailing-slash routes. Don't prefetch files, external links, or OG render pages. + if (url.origin !== location.origin || !url.pathname.endsWith('/') || url.pathname.startsWith('/_og/') + || (url.pathname === location.pathname && url.search === location.search)) return; + url.hash = ''; + return url.href; +} + +function prefetch(href: string) { + const connection = (navigator as Navigator & { + connection?: { saveData?: boolean; effectiveType?: string }; + }).connection; + if (!navigator.onLine || connection?.saveData || /(^|-)2g$/.test(connection?.effectiveType || '')) return; + const now = Date.now(); + for (const [key, entry] of requests) if (now - entry.started >= lifetime) requests.delete(key); + if (requests.has(href)) return; + if (requests.size >= 40) requests.delete(requests.keys().next().value!); + const entry = { + started: now, + done: fetch(href, { priority: 'low', signal: AbortSignal.timeout(5_000) }) + .then(async (response) => { + await response.arrayBuffer(); // Finish caching before navigation reuses it. + if (!response.ok) requests.delete(href); + }) + .catch(() => { requests.delete(href); }), + }; + requests.set(href, entry); +} + +function cancelHover() { clearTimeout(timer); } +function schedule(event: Event) { + cancelHover(); + const href = candidate(event.target); + if (href) timer = setTimeout(() => prefetch(href), 80); +} +document.addEventListener('pointerover', schedule, { passive: true }); +document.addEventListener('focusin', schedule); +document.addEventListener('pointerout', cancelHover, { passive: true }); +document.addEventListener('focusout', cancelHover); +document.addEventListener('pointerdown', (event) => { + if (event.button !== 0) return; + cancelHover(); + const href = candidate(event.target); + if (href) prefetch(href); +}, { passive: true }); +document.addEventListener('astro:before-preparation', (event) => { + cancelHover(); + const navigation = event as TransitionBeforePreparationEvent; + if (navigation.formData) return; + const url = new URL(navigation.to); + url.hash = ''; + const pending = requests.get(url.href); + if (!pending || Date.now() - pending.started >= lifetime) return; + const loader = navigation.loader; + navigation.loader = async () => { + await pending.done; + if (!navigation.signal.aborted) await loader(); + }; +}); diff --git a/src/scripts/search-loader.ts b/src/scripts/search-loader.ts new file mode 100644 index 0000000..1f8800f --- /dev/null +++ b/src/scripts/search-loader.ts @@ -0,0 +1,106 @@ +import type { PagefindModal } from '@pagefind/component-ui'; + +type SearchUI = typeof import('./search-ui'); +let ui: SearchUI | undefined; +let uiPromise: Promise | undefined; +const initialized = new WeakSet(); +let toggleSearch: (() => void) | undefined; + +function loadUI() { + return uiPromise ??= import('./search-ui').then(module => ui = module).catch(error => { + uiPromise = undefined; + throw error; + }); +} + +function initializePage() { + const root = document.querySelector('.docs-search'); + if (!root || initialized.has(root)) return; + initialized.add(root); + const trigger = root.querySelector('[data-search-trigger]')!; + const pending = root.querySelector('[data-search-loading]')!; + const field = pending.querySelector('input')!; + const status = pending.querySelector('[data-search-status]')!; + const retry = pending.querySelector('[data-search-retry]')!; + const template = root.querySelector('[data-search-template]')!; + const shortcut = root.querySelector('[data-search-shortcut]')!; + shortcut.textContent = /Mac|iPhone|iPad/.test(navigator.platform) ? '⌘' : 'Ctrl'; + let modal: PagefindModal | undefined; + let mounting: Promise | undefined; + let switching = false; + const mount = () => mounting ??= loadUI().then(module => { + if (!root.isConnected) return; + root.append(template.content.cloneNode(true)); + modal = module.initializeSearch(root); + modal.dialogEl?.addEventListener('close', () => { + trigger.setAttribute('aria-expanded', 'false'); + if (root.isConnected) trigger.focus(); + }); + trigger.setAttribute('aria-controls', modal.dialogEl!.id); + return modal; + }).catch(error => { + mounting = undefined; + throw error; + }); + const warm = () => { mount().catch(() => {}); }; + const open = async () => { + trigger.setAttribute('aria-expanded', 'true'); + if (modal) { modal.open(); return; } + status.textContent = 'Loading search…'; + retry.hidden = true; + if (!pending.open) pending.showModal(); + field.focus(); + try { + const ready = await mount(); + // Escape, backdrop clicks, and navigation cancel the pending open. + if (!ready || !root.isConnected || !pending.open) return; + const query = field.value; + switching = true; + pending.close(); + ready.open(); + const input = ready.querySelector('input'); + if (input && query) { + input.value = query; + input.dispatchEvent(new Event('input', { bubbles:true })); + } + } catch { + if (!pending.open) return; + status.textContent = 'Search could not load. Check your connection and try again.'; + retry.hidden = false; + } + }; + toggleSearch = () => { + if (pending.open) pending.close(); + else if (modal?.isOpen) modal.close(); + else void open(); + }; + trigger.addEventListener('pointerenter', warm, { once:true }); + trigger.addEventListener('focus', warm, { once:true }); + trigger.addEventListener('click', () => void open()); + retry.addEventListener('click', () => void open()); + pending.querySelector('[data-search-cancel]')!.addEventListener('click', () => pending.close()); + pending.addEventListener('click', event => { if (event.target === pending) pending.close(); }); + pending.addEventListener('close', () => { + if (switching) { switching = false; return; } + trigger.setAttribute('aria-expanded', 'false'); + // Avoid focus-triggered loading after a cancelled or failed request. + trigger.removeEventListener('focus', warm); + if (root.isConnected) trigger.focus(); + }); +} + +export function initializeLazySearch() { + initializePage(); + document.addEventListener('astro:page-load', initializePage); + document.addEventListener('keydown', event => { + if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') { + event.preventDefault(); + toggleSearch?.(); + } + }); + document.addEventListener('astro:before-swap', () => { + toggleSearch = undefined; + document.querySelector('[data-search-loading][open]')?.close(); + ui?.disposeSearch(); + }); +} diff --git a/src/scripts/search-ui.ts b/src/scripts/search-ui.ts new file mode 100644 index 0000000..62e1beb --- /dev/null +++ b/src/scripts/search-ui.ts @@ -0,0 +1,40 @@ +import { getInstanceManager, type PagefindModal } from '@pagefind/component-ui'; + +export function disposeSearch() { + getInstanceManager().removeInstance('default'); +} + +export function initializeSearch(root: HTMLElement) { + const instance = getInstanceManager().getInstance('default'); + const modal = root.querySelector('pagefind-modal')!; + const start = root.querySelector('.search-start')!; + const noResults = root.querySelector('.search-no-results')!; + const input = () => root.querySelector('pagefind-input input'); + const updateEmpty = () => { + start.hidden = Boolean(input()?.value.trim()); + noResults.hidden = true; + }; + root.addEventListener('input', updateEmpty); + instance.on('search', updateEmpty, root); + instance.on('results', (result) => { + updateEmpty(); + noResults.hidden = !instance.searchTerm.trim() || Boolean((result as { results: unknown[] }).results.length); + }, root); + // Quick links participate in arrow-key navigation before a query is entered. + root.addEventListener('keydown', (event) => { + if (start.hidden || !['ArrowDown', 'ArrowUp'].includes(event.key)) return; + const links = [...start.querySelectorAll('a')]; + const current = links.indexOf(document.activeElement as HTMLAnchorElement); + if (document.activeElement !== input() && current === -1) return; + event.preventDefault(); + event.stopImmediatePropagation(); + const next = current + (event.key === 'ArrowDown' ? 1 : -1); + if (next < 0) input()?.focus(); + else links[Math.min(next, links.length - 1)]?.focus(); + }, true); + // Native links retain normal navigation and modifier-key behavior. + root.addEventListener('click', (event) => { + if ((event.target as Element).closest('pagefind-modal a')) modal.close(); + }); + return modal; +} diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 0000000..86637bf --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1,90 @@ +@layer base, starlight, theme, components, utilities; +@import '@astrojs/starlight-tailwind'; +@import 'tailwindcss/theme.css' layer(theme); +@import 'tailwindcss/utilities.css' layer(utilities); + +@theme inline { + --font-sans: var(--font-ibm-plex-sans); + --font-mono: var(--font-ibm-plex-mono); +} +:root { --sl-color-accent-low:#103c2d; --sl-color-accent:#02b875; --sl-color-accent-high:#8fe4b9; --sl-content-width:56rem; --sl-text-h1:2.5rem; --sl-color-bg:#151b19; --sl-color-bg-nav:#151b19; --sl-color-bg-sidebar:#212529; } +:root[data-theme='light'] { --sl-color-accent-low:#e4f6eb; --sl-color-accent:#007a4e; --sl-color-accent-high:#075836; --sl-color-white:#171b22; --sl-color-gray-1:#28332d; --sl-color-gray-2:#435148; --sl-color-gray-3:#617067; --sl-color-gray-4:#87988d; --sl-color-gray-5:#dce5dd; --sl-color-gray-6:#f7f9f6; --sl-color-bg:#ffffff; --sl-color-bg-nav:#ffffff; --sl-color-bg-sidebar:#f7f9f6; --sl-color-hairline:#e3e9e3; } +html { scroll-padding-top:6rem; } +/* Swap content immediately without fading the site navigation. */ +::view-transition-old(root), ::view-transition-new(root) { animation:none; } +h1,h2,h3 { letter-spacing:-.025em; } +strong, b { font-weight:600; } +main > .content-panel { padding-block:1rem; } +/* Image zoom inserts a hidden element before the article. */ +.sl-container > .sl-markdown-content { margin-top:0; } +.sl-markdown-content > a[id]:first-child + p { margin-top:0; } + +.platform-sizes td:first-child, .platform-sizes td:first-child code { white-space:nowrap; } + +/* Troubleshooting entries are compact reference items within a section. */ +.sl-markdown-content .troubleshooting { --sl-text-h3:1.125rem; --sl-text-h4:1rem; } +.sl-markdown-content .troubleshooting .sl-heading-wrapper { margin-top:1.5rem; } +.sl-markdown-content .troubleshooting h3 { line-height:1.5; letter-spacing:normal; } +.sl-markdown-content .troubleshooting h3 code { font-size:.9em; } + +/* Match the main website's fixed 74px charcoal navigation in either theme. */ +:root, :root[data-theme='light'] { --sl-nav-height:74px; --sl-color-bg-nav:#212529; --sl-nav-pad-y:12px; } +header.header { border-bottom-color:#ffffff20; } +.sl-markdown-content .sl-link-button { border-radius:.35rem; padding:.5rem .85rem; min-height:0; font-size:.875rem; gap:.4rem; transition:background-color .15s ease, border-color .15s ease, color .15s ease; } +.sl-markdown-content .sl-link-button.primary { background:#007a4e; border-color:#007a4e; color:#fff; } +.sl-markdown-content .sl-link-button.primary:hover { background:#005f3d; border-color:#005f3d; color:#fff; } +.sl-markdown-content .sl-link-button.primary:active { background:#004b30; border-color:#004b30; } +.sl-markdown-content .sl-link-button.secondary { background:#2b3531; border-color:#3a4840; color:#e5eee9; } +.sl-markdown-content .sl-link-button.secondary:hover { background:#3b4d43; border-color:#617b6b; color:#fff; } +.sl-markdown-content .sl-link-button.secondary:active { background:#233229; } +:root[data-theme='light'] .sl-markdown-content .sl-link-button.secondary { background:#edf2ee; border-color:#dde6df; color:#283d31; } +:root[data-theme='light'] .sl-markdown-content .sl-link-button.secondary:hover { background:#dce9df; border-color:#a9c3b0; color:#153e27; } +:root[data-theme='light'] .sl-markdown-content .sl-link-button.secondary:active { background:#cedfd2; } +.sl-markdown-content .sl-link-button:focus-visible { outline:2px solid var(--sl-color-text-accent); outline-offset:3px; } +@media(prefers-reduced-motion:reduce) { .sl-markdown-content .sl-link-button { transition:none; } } +.sl-markdown-content .sl-link-button + .sl-link-button { margin-inline-start:.6rem; } +@media(min-width:72rem) { .right-sidebar { position:sticky; top:var(--sl-nav-height); padding-top:0; height:calc(100vh - var(--sl-nav-height)); } } +/* Zoom UI uses document colors, independent of the always-dark site header. */ +starlight-image-zoom { --sl-color-bg-nav:var(--sl-color-bg); } +.starlight-image-zoom-control { color:var(--sl-color-white); } +@media(max-width:49.99rem) { + :root { --sl-menu-button-size:2.5rem; } + button.sl-menu-button, .docs-search .pf-trigger-btn { + height:2.5rem; + background:#ffffff0a; color:#d1d5db; border:1px solid #ffffff35; + border-radius:.35rem; box-shadow:none; + } + button.sl-menu-button:hover, .docs-search .pf-trigger-btn:hover { + background:#ffffff12; border-color:#8fe4b980; + } + button.sl-menu-button { width:2.5rem; padding:0; align-items:center; justify-content:center; } + button.sl-menu-button svg { width:1rem; height:1rem; } +} +mobile-starlight-toc { --sl-color-bg-nav:var(--sl-color-bg); } + +:root[data-theme='dark'] .sidebar-pane { background-color:#212529; } + + +/* Subtle scrollbars for the page, navigation, search, tables, and code. */ +:root { --docs-scrollbar-thumb:rgb(120 137 128 / 28%); --docs-scrollbar-hover:rgb(120 137 128 / 50%); } +:root[data-theme='light'] { --docs-scrollbar-thumb:rgb(67 81 72 / 22%); --docs-scrollbar-hover:rgb(67 81 72 / 42%); } +:root, :root * { scrollbar-width:thin; scrollbar-color:var(--docs-scrollbar-thumb) transparent; } +:root:hover, :root *:hover { scrollbar-color:var(--docs-scrollbar-hover) transparent; } +/* Fallback for browsers without the standard scrollbar properties. */ +@supports not (scrollbar-width:thin) { + ::-webkit-scrollbar { width:6px; height:6px; } + ::-webkit-scrollbar-track, ::-webkit-scrollbar-corner { background:transparent; } + ::-webkit-scrollbar-thumb { background:var(--docs-scrollbar-thumb); border-radius:999px; } + ::-webkit-scrollbar-thumb:hover { background:var(--docs-scrollbar-hover); } +} +@media (forced-colors:active) { + :root, :root *, :root:hover, :root *:hover { scrollbar-color:auto; } +} + +/* Give the compact header and toolbar a second row before controls collide. */ +@media(max-width:15rem) { + :root, :root[data-theme='light'] { --sl-nav-height:124px; } + button.sl-menu-button { top:70px; inset-inline-start:4rem; inset-inline-end:auto; } +} +@media(max-width:39.999rem) { :root { --sl-mobile-toc-height:57px; } } +@media(max-width:294px) { :root { --sl-mobile-toc-height:105px; } } diff --git a/src/styles/search.css b/src/styles/search.css new file mode 100644 index 0000000..7868502 --- /dev/null +++ b/src/styles/search.css @@ -0,0 +1,56 @@ +@import '@pagefind/component-ui/css' layer(pagefind); + +.docs-search { + --pf-text:var(--sl-color-white); + --pf-text-secondary:var(--sl-color-gray-2); + --pf-text-muted:var(--sl-color-gray-3); + --pf-background:var(--sl-color-bg); + --pf-border:var(--sl-color-hairline); + --pf-border-focus:var(--sl-color-accent); + --pf-outline-focus:var(--sl-color-accent); + --pf-hover:var(--sl-color-accent-low); + --pf-mark:var(--sl-color-text-accent); + --pf-skeleton:var(--sl-color-gray-6); + --pf-skeleton-shine:var(--sl-color-gray-5); + --pf-font:var(--font-sans); + --pf-modal-max-width:42rem; + --pf-modal-max-height:min(78dvh, 46rem); + --pf-modal-top:6rem; + --pf-input-height:46px; + --pf-result-title-font-size:15px; + --pf-result-excerpt-font-size:13px; + color:var(--pf-text); +} +.docs-search pagefind-modal:not(:defined) { display:none; } +.docs-search pagefind-modal-trigger { display:block; } +.docs-search .pf-trigger-btn { width:100%; height:40px; background:#ffffff0a; color:#d1d5db; border:1px solid #ffffff35; border-radius:.35rem; } +.docs-search .pf-trigger-btn:hover { background:#ffffff12; border-color:#8fe4b980; } +.docs-search .pf-trigger-key { background:#ffffff10; color:#d1d5db; border-color:#ffffff25; } +.docs-search dialog { box-shadow:0 24px 80px #0007; } +.docs-search dialog::backdrop { backdrop-filter:blur(4px); } +.docs-search .pf-modal-body { padding:1rem; } +.docs-search .pf-result { border-radius:.4rem; } +.docs-search .pf-result:focus-within { background:transparent; } +.docs-search .pf-result-card:has(.pf-result-link:focus-visible) { background:var(--pf-hover); border-color:var(--pf-border-focus); box-shadow:inset 0 0 0 1px var(--pf-border-focus); } +.docs-search .pf-result-excerpt { line-height:1.55; } +.docs-search .pf-heading-excerpt { display:none; } +.docs-search .pf-heading-chips { padding-top:.35rem; } +.docs-search .pf-modal-footer { display:flex; justify-content:space-between; gap:1rem; padding:.65rem 1rem; } +.search-start[hidden], .search-no-results[hidden] { display:none; } +.search-eyebrow { margin:0 0 .5rem; color:var(--pf-text-muted); font-size:.75rem; font-weight:600; } +.search-start nav { display:grid; gap:.25rem; } +.search-start a { display:flex; align-items:center; justify-content:space-between; gap:1rem; padding:.65rem .75rem; color:var(--pf-text); text-decoration:none; border-radius:.35rem; } +.search-start a:hover, .search-start a:focus-visible { background:var(--pf-hover); outline:2px solid var(--sl-color-accent); outline-offset:-2px; } +.search-start strong { display:block; font-size:.9rem; font-weight:600; } +.search-start small { display:block; color:var(--pf-text-secondary); font-size:.8rem; } +.search-tip, .search-no-results { font-size:.8rem; color:var(--pf-text-secondary); margin:.9rem .75rem .3rem; } +.search-tip code { font-size:.8rem; color:var(--pf-text); } +.search-no-results a { color:var(--sl-color-text-accent); } +.search-key-help { display:flex; align-items:center; gap:.35rem; font-size:.7rem; color:var(--pf-text-muted); } +.search-key-help kbd { padding:0 .3rem; border:1px solid var(--pf-border); border-radius:.2rem; font:inherit; } +.search-footer-label { font-size:.7rem; color:var(--pf-text-muted); } +@media(max-width:449px) { + .docs-search .pf-trigger-btn { width:40px; padding:0; justify-content:center; } + .docs-search .pf-trigger-text, .docs-search .pf-trigger-shortcut { display:none; } + .search-footer-label { display:none; } +} diff --git a/src/worker.mjs b/src/worker.mjs new file mode 100644 index 0000000..b14c8bd --- /dev/null +++ b/src/worker.mjs @@ -0,0 +1,64 @@ +import redirects from '../migration/redirects.json' with { type: 'json' }; +import pages from './generated/pages.json' with { type: 'json' }; + +const markdownRoutes = new Map(pages.map(page => [page.route, page.markdownPath])); +const markdownPaths = new Set(markdownRoutes.values()); +export function prefersMarkdown(accept) { + const ranges = accept.toLowerCase().split(',').map(value => { + const [type, ...parameters] = value.trim().split(';'); + const qParam = parameters.find(parameter => parameter.trim().startsWith('q=')); + const q = qParam === undefined ? 1 : Number(qParam.trim().slice(2)); + return { type: type.trim(), q: Number.isFinite(q) && q >= 0 && q <= 1 ? q : 0 }; + }); + // Wildcard-only clients (including browsers and curl) keep receiving HTML. + const markdown = ranges.find(range => range.type === 'text/markdown'); + if (!markdown || markdown.q === 0) return false; + const html = ranges.find(range => range.type === 'text/html') + || ranges.find(range => range.type === 'text/*') + || ranges.find(range => range.type === '*/*'); + return markdown.q >= (html?.q || 0); +} + +const productionHost = 'docs.htmlcsstoimage.com'; +export default { + async fetch(request, env) { + const url = new URL(request.url); + const isPreview = url.hostname !== productionHost; + const canonicalPath = url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`; + const markdownPath = markdownRoutes.get(canonicalPath); + let servedMarkdown = markdownPaths.has(url.pathname); + let response; + const redirect = redirects[url.pathname.replace(/\/$/, '')]; + if (redirect) response = Response.redirect(new URL(redirect, url.origin).href, 301); + else if (!['GET', 'HEAD'].includes(request.method)) response = new Response('Method not allowed', { status: 405, headers: { Allow: 'GET, HEAD' } }); + else { + if (markdownPath && prefersMarkdown(request.headers.get('Accept') || '')) { + const markdownUrl = new URL(url); markdownUrl.pathname = markdownPath; + const headers = new Headers(request.headers); + headers.set('Accept', 'text/markdown'); + response = await env.ASSETS.fetch(new Request(markdownUrl, { method: request.method, headers })); + servedMarkdown = true; + } else response = await env.ASSETS.fetch(request); + } + const headers = new Headers(response.headers); + if (markdownPath) { + // Let hover-prefetched HTML be reused by ClientRouter's fetch. Keep + // variants private to the browser and separated by Vary: Accept. + if (response.status === 200 || response.status === 304) { + headers.set('Cache-Control', 'private, max-age=60'); + } + const vary = new Set((headers.get('Vary') || '').split(',').map(value => value.trim()).filter(Boolean)); + if (![...vary].some(value => value.toLowerCase() === 'accept' || value === '*')) vary.add('Accept'); + headers.set('Vary', [...vary].join(', ')); + headers.append('Link', `<${markdownPath}>; rel="alternate"; type="text/markdown"`); + } + if (servedMarkdown && (response.ok || response.status === 304)) { + headers.set('Content-Type', 'text/markdown; charset=utf-8'); + if (markdownPath) headers.set('Content-Location', markdownPath); + } + headers.set('X-Content-Type-Options', 'nosniff'); + headers.set('Referrer-Policy', 'strict-origin-when-cross-origin'); + if (isPreview || url.pathname.startsWith('/_og/')) headers.set('X-Robots-Tag', 'noindex, nofollow'); + return new Response(request.method === 'HEAD' ? null : response.body, { status: response.status, statusText: response.statusText, headers }); + }, +}; diff --git a/template-editor/blocks/flex-panel.md b/template-editor/blocks/flex-panel.md deleted file mode 100644 index d1aa841..0000000 --- a/template-editor/blocks/flex-panel.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -layout: template-editor-block -title: Flex Panel -permalink: /template-editor/blocks/flex-panel/ -parent: Blocks -grand_parent: Template Editor -nav_order: 7 -description: >- - Use the Flex Panel block for rows, columns, and dynamic stacks. ---- -# Flex Panel -{: .no_toc } -{: .fs-9 } - -Use Flex Panels for one-direction layouts: rows, columns, stacks, and bars. -{: .fs-4 .fw-300 } - -
    - -Add a Flex Panel from the left sidebar. Children flow in one direction and can respond when content changes. - -{% include template-editor/common-block-options.md %} - -{% include template-editor/block-specific-options-intro.md %} - -{% capture align_items_details %} -Alignment on the panel is the default. Children can override the default alignment when one item needs to sit differently from the rest. -{% endcapture %} - -{% capture flex_basis_details %} -Basis can stay automatic or use a specific size in the panel's flow direction. -{% endcapture %} - -
    -
    PropertyDetails
    - {% include template-editor/Property_Padding.md details="Space between the panel edge and its children" panel=true %} - {% include template-editor/property.md name="Direction" details="Row or column layout" %} - {% include template-editor/property.md name="Wrap" details="Whether children stay on one line or wrap" %} - {% include template-editor/property.md name="Gap" details="Space between child blocks" %} - {% include template-editor/property.md name="Justify content" details="Distribution along the main direction" %} - {% include template-editor/property.md name="Align items" details="Default alignment across the panel" more=align_items_details %} -
    - -## Child Properties - -{% include template-editor/child-properties-intro.md type="Flex" %} - -
    -
    PropertyDetails
    - {% include template-editor/property.md name="Grow" details="How much the child expands when extra space is available" %} - {% include template-editor/property.md name="Shrink" details="How much the child can contract when space is tight" %} - {% include template-editor/property.md name="Align" details="Alignment override for this child" %} - {% include template-editor/property.md name="Basis" details="Auto sizing or a specific starting size" more=flex_basis_details %} - {% include template-editor/property.md name="Margin" details="Extra space around this child" %} -
    - -See the [Advanced Panels guide](/template-editor/advanced/panels/) for help choosing and combining panel types. diff --git a/template-editor/blocks/free-panel.md b/template-editor/blocks/free-panel.md deleted file mode 100644 index 25762aa..0000000 --- a/template-editor/blocks/free-panel.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -layout: template-editor-block -title: Free Panel -permalink: /template-editor/blocks/free-panel/ -parent: Blocks -grand_parent: Template Editor -nav_order: 6 -description: >- - Use the Free Panel block for grouped free-positioned content. ---- -# Free Panel -{: .no_toc } -{: .fs-9 } - -Use a Free Panel when a group of blocks should move together while its children keep normal canvas-style positioning inside the panel. -{: .fs-4 .fw-300 } - -
    - -Add a Free Panel from the left sidebar. Put blocks inside it by dragging them in or using the reparent control. - -{% include template-editor/common-block-options.md %} - -{% include template-editor/block-specific-options-intro.md %} - -
    -
    PropertyDetails
    - {% include template-editor/Property_Padding.md details="Space between the panel edge and its children" panel=true %} - {% include template-editor/property.md name="Overflow" details="Content can be clipped or allowed to show outside the panel" %} - {% include template-editor/property.md name="Child positioning" details="Children use X/Y position inside the panel area" %} - {% include template-editor/property.md name="Reparenting" details="Move existing blocks into or out of the panel" %} -
    - -See the [Advanced Panels guide](/template-editor/advanced/panels/) for help choosing and combining panel types. diff --git a/template-editor/blocks/grid-panel.md b/template-editor/blocks/grid-panel.md deleted file mode 100644 index 90e0449..0000000 --- a/template-editor/blocks/grid-panel.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -layout: template-editor-block -title: Grid Panel -permalink: /template-editor/blocks/grid-panel/ -parent: Blocks -grand_parent: Template Editor -nav_order: 8 -description: >- - Use the Grid Panel block for two-dimensional layouts. ---- -# Grid Panel -{: .no_toc } -{: .fs-9 } - -Use Grid Panels for two-dimensional layouts where rows and columns guide the flow. -{: .fs-4 .fw-300 } - -
    - -Add a Grid Panel from the left sidebar. Children flow through the grid in order. Dragging or moving children changes their place in that flow. - -{% capture grid_size_details %} -{% include hint.md title="Auto size to grid cell" text="Blocks inside a Grid Panel can use Auto size to grid cell. When enabled, the child sizes to the grid area it receives. Turn it off when the child should keep its own width or height." heading=false %} -{% endcapture %} - -{% include template-editor/common-block-options.md extra_size=grid_size_details %} - -{% include template-editor/block-specific-options-intro.md %} - -{% capture grid_flow_details %} -Unlike a Table Panel, Grid Panel children are not assigned to specific cells. They flow in order through the available grid space. -{% endcapture %} - -
    -
    PropertyDetails
    - {% include template-editor/Property_Padding.md details="Space between the panel edge and its children" panel=true %} - {% include template-editor/property.md name="Columns" details="Number and sizing of columns" more=grid_flow_details %} - {% include template-editor/property.md name="Rows" details="Number and sizing of rows" %} - {% include template-editor/property.md name="Column gap" details="Space between columns" %} - {% include template-editor/property.md name="Row gap" details="Space between rows" %} - {% include template-editor/property.md name="Justify items" details="Default horizontal alignment of children" %} - {% include template-editor/property.md name="Align items" details="Default vertical alignment of children" %} -
    - -## Child Properties - -{% include template-editor/child-properties-intro.md type="Grid" %} - -
    -
    PropertyDetails
    - {% include template-editor/property.md name="Columns" details="How many grid columns the child covers" %} - {% include template-editor/property.md name="Rows" details="How many grid rows the child covers" %} - {% include template-editor/property.md name="Horizontal align" details="Horizontal alignment override for this child" %} - {% include template-editor/property.md name="Vertical align" details="Vertical alignment override for this child" %} - {% include template-editor/property.md name="Margin" details="Extra space around this child" %} - {% include template-editor/property.md name="Auto size to grid cell" details="Whether the child sizes to its grid area" %} -
    - -{% include template-editor/grid-tracks.md %} - -See the [Advanced Panels guide](/template-editor/advanced/panels/) for help choosing and combining panel types. diff --git a/template-editor/blocks/html.md b/template-editor/blocks/html.md deleted file mode 100644 index cc05f25..0000000 --- a/template-editor/blocks/html.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -layout: template-editor-block -title: HTML -permalink: /template-editor/blocks/html/ -parent: Blocks -grand_parent: Template Editor -nav_order: 5 -description: >- - Use the HTML block for custom markup inside a template editor design. -templated_content: >- - HTML blocks can use Handlebars-style placeholders inside their markup. ---- -# HTML Block -{: .no_toc } -{: .fs-9 } - -Use HTML blocks when a design needs custom markup inside the editor canvas. -{: .fs-4 .fw-300 } - -
    - -Add an HTML block from the left sidebar. Use the right sidebar for block properties, or double-click the block on the canvas to edit its markup inline. - -{% include template-editor/common-block-options.md %} - -{% include template-editor/block-specific-options-intro.md %} - -
    -
    PropertyDetails
    - {% include template-editor/property.md name="Markup" details="The HTML rendered inside the block" %} - {% include template-editor/Property_Padding.md details="Space between the block edge and the HTML content" %} - {% include template-editor/property.md name="Text color" details="Default text color inside the block" templated=true %} -
    - -## Preview Notes - -HTML blocks are previewed in an iframe while you work in the editor. That keeps custom markup isolated from the editor UI, but it can make some preview behavior look slightly different from the exported HTML. - -If something looks off in the editor preview, use the HTML/export button in the top toolbar to inspect the generated HTML. diff --git a/template-editor/blocks/image.md b/template-editor/blocks/image.md deleted file mode 100644 index 5a4d171..0000000 --- a/template-editor/blocks/image.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -layout: template-editor-block -title: Image -permalink: /template-editor/blocks/image/ -parent: Blocks -grand_parent: Template Editor -nav_order: 3 -description: >- - Use the Image block for media, image URLs, and stock photos. -templated_content: >- - URL sources can be assigned to a template variable, enabling each image generated to use a different URL. ---- -# Image Block -{: .no_toc } -{: .fs-9 } - -Use Image blocks for photos, logos, avatars, product images, media library assets, and remote image URLs. -{: .fs-4 .fw-300 } - -
    - -Add an Image block from the left sidebar. You can start from your media library, a URL, or a stock photo, then change the source later from the block controls. - -
    - Image block source menu with Library Image, URL Image, and Stock Photo options -
    - -{% capture image_border_details %} -{% include hint.md title="Image borders" text="When an image uses `Contain` or `Scale Down`, the visible image may not fill the whole block. Borders and shadows can follow the rendered image more closely than the full block area." heading=false %} -{% endcapture %} - -{% include template-editor/common-block-options.md extra_border=image_border_details %} - -{% include template-editor/block-specific-options-intro.md %} - -{% capture media_source_details %} -Choose from your organization's media library, paste an external URL, or select a stock photo from [Pexels](https://www.pexels.com/). -{% endcapture %} - -{% capture fit_details %} -Fit controls how the image is sized inside the block, including whether it fills, stretches, crops, or stays at its natural size. -{% endcapture %} - -
    -
    PropertyDetails
    - {% include template-editor/property.md name="Media source" details="Media library, external URL, or stock photo" more=media_source_details templated=true %} - {% include template-editor/property.md name="Fit" details="How the image fits inside the block" more=fit_details %} - {% include template-editor/Property_Opacity.md %} - {% include template-editor/property.md name="Object position" details="Which part of the image stays visible when using cover-style cropping" templated=true %} -
    - -## Image Sources - -The source control decides where the block gets its image. - -### Media Library - -Use the Media Library for assets you expect to reuse, such as logos, product photos, brand images, background images, and icons. - -You can upload assets from the media browser when your plan supports uploads. Uploaded assets are shared across your organization's templates, so the same image can be reused without uploading it again for each template. - -### URL - -Use a URL source when the image already exists at an absolute URL, or when the image should come from render-time data through a template variable. - -### Stock Photos - -Use Stock Photos to choose an image provided by [Pexels](https://www.pexels.com/). - -## Fit Modes - -| Mode | Details | -|:-----|:--------| -| Cover | Fills the block and may crop the image | -| Contain | Keeps the whole image visible inside the block | -| Fill | Stretches the image to the block size | -| Scale Down | Keeps the image natural size unless it needs to shrink | -| None | Keeps the image at its natural size | diff --git a/template-editor/blocks/rich-text.md b/template-editor/blocks/rich-text.md deleted file mode 100644 index 731c432..0000000 --- a/template-editor/blocks/rich-text.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -layout: template-editor-block -title: Rich Text -permalink: /template-editor/blocks/rich-text/ -parent: Blocks -grand_parent: Template Editor -nav_order: 1 -description: >- - Use the Rich Text block for styled and templated text in the template editor. -templated_content: >- - Rich Text supports Handlebars inside the text content. Use it for variables, loops, conditionals, and repeated content inside one text block. ---- -# Rich Text Block -{: .no_toc } -{: .fs-9 } - -Use Rich Text when one text block needs varied typography, inline styling, or Handlebars composition. -{: .fs-4 .fw-300 } - -
    - -Add a Rich Text block from the left sidebar by choosing **Rich Text Box**. Double-click the block on the canvas to edit the text directly. - -
    - Rich Text block selected in the template editor with typography controls open -
    - -Select a word, line, letter, or any range of text and use the inline toolbar to change font size, color, underline, and other text styling for only that selection. - -Use the right sidebar when you want one value across the whole block. Changing a text styling property there applies that value across the block for that property, replacing per-selection differences. - -Some inline toolbar controls can show `mixed` when the current selection already contains more than one value. Choosing a new value applies it to the current selection. - -{% capture text_shadow_details %} -{% include hint.md title="Text block shadows" text="Rich Text blocks support drop shadows and glows. Inner shadows and spread are not available for text blocks." heading=false %} -{% endcapture %} - -{% include template-editor/common-block-options.md extra_shadow=text_shadow_details %} - -{% include template-editor/block-specific-options-intro.md %} - -{% capture selected_text_details %} -Select text on the canvas to apply this property to only that selection. Use the right sidebar to set one value across the whole block for this property. -{% endcapture %} - -
    -
    PropertyDetails
    - {% include template-editor/Property_Opacity.md %} - {% include template-editor/property.md name="Font" details="Font family, weight, and italic style" %} - {% include template-editor/property.md name="Font size" details="Text size for the selected text or block" more=selected_text_details templated=true %} - {% include template-editor/property.md name="Font color" details="Text color" more=selected_text_details templated=true %} - {% include template-editor/property.md name="Line height" details="Space between lines" templated=true %} - {% include template-editor/property.md name="Letter spacing" details="Space between letters" templated=true %} - {% include template-editor/property.md name="Horizontal align" details="How lines align inside the block" %} - {% include template-editor/property.md name="Vertical align" details="How text sits inside the block" %} - {% include template-editor/property.md name="Wrap" details="How text wraps across lines" %} - {% include template-editor/property.md name="Overflow" details="What happens when text is larger than the block" %} - {% include template-editor/property.md name="Underline" details="Underline style and color" more=selected_text_details templated=true %} - {% include template-editor/property.md name="Text outline" details="Stroke around text" templated=true %} - {% include template-editor/property.md name="Transform" details="Text casing" %} - {% include template-editor/Property_Padding.md details="Space between the block edge and the text" %} -
    diff --git a/template-editor/blocks/shape.md b/template-editor/blocks/shape.md deleted file mode 100644 index f4752a8..0000000 --- a/template-editor/blocks/shape.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -layout: template-editor-block -title: Shape -permalink: /template-editor/blocks/shape/ -parent: Blocks -grand_parent: Template Editor -nav_order: 4 -description: >- - Use the Shape block for simple graphic elements. ---- -# Shape Block -{: .no_toc } -{: .fs-9 } - -Use Shape blocks for simple marks, backgrounds, accents, and decorative structure. -{: .fs-4 .fw-300 } - -
    - -Add a Shape block from the left sidebar. Choose the shape when you add the block. - -{% capture shape_background_details %} -{% include hint.md title="Shape background" text="Rectangles and circles support solid, gradient, and pattern backgrounds. Stars and triangles support solid backgrounds plus linear and radial gradients. Pattern backgrounds and conic gradients are not available for stars or triangles." heading=false %} -{% endcapture %} - -{% capture shape_shadow_details %} -{% include hint.md title="Shape shadow" text="Stars and triangles support drop shadows and glows. Inner shadows and spread are not available for those shapes." heading=false %} -{% endcapture %} - -{% capture shape_border_details %} -{% include hint.md title="Shape border" text="Rectangles and circles support advanced borders. Stars and triangles use simple border controls." heading=false %} -{% endcapture %} - -{% include template-editor/common-block-options.md extra_background=shape_background_details extra_border=shape_border_details extra_shadow=shape_shadow_details %} - -## Shape Types - -Available shapes: - -- Rectangle -- Circle -- Triangle -- Star - -The shape type is set when the block is added and cannot be changed later. If you need a different shape, add a new Shape block. - -## Block Specific Properties - -
    -
    PropertyDetails
    - {% include template-editor/Property_Opacity.md %} -
    diff --git a/template-editor/blocks/simple-text.md b/template-editor/blocks/simple-text.md deleted file mode 100644 index 8117620..0000000 --- a/template-editor/blocks/simple-text.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -layout: template-editor-block -title: Simple Text -permalink: /template-editor/blocks/simple-text/ -parent: Blocks -grand_parent: Template Editor -nav_order: 2 -description: >- - Use the Simple Text block for direct templating and auto font sizing. -templated_content: >- - Simple Text can source its Content property directly from a template variable. Do not use Handlebars syntax in the text itself. ---- -# Simple Text Block -{: .no_toc } -{: .fs-9 } - -Use Simple Text when one block should render one text value with a shared style. -{: .fs-4 .fw-300 } - -
    - -Add a Simple Text block from the left sidebar by choosing **Simple Text Box**. Its content and text properties are available in the right sidebar. - -{% capture text_shadow_details %} -{% include hint.md title="Text block shadows" text="Simple Text blocks support drop shadows and glows. Inner shadows and spread are not available for text blocks." heading=false %} -{% endcapture %} - -{% include template-editor/common-block-options.md extra_shadow=text_shadow_details %} - -{% include template-editor/block-specific-options-intro.md %} - -{% capture auto_font_size_details %} -
    -
    -
    Auto Font Size
    -

    When enabled, the text can scale to fit the block instead of staying at one fixed size.

    -
    - -
    -
    Minimum Font Size
    -

    Available when auto font size is enabled. This is the smallest size the text can use while fitting the block.

    -
    - -
    -
    Maximum Font Size
    -

    Available when auto font size is enabled. This is the largest size the text can use while fitting the block.

    -
    -
    - -{% include template-editor/templatable-properties.md items="Auto font size|Minimum font size|Maximum font size" %} -{% endcapture %} - -
    -
    PropertyDetails
    - {% include template-editor/property.md name="Content" details="The text value rendered by the block" templated=true %} - {% include template-editor/property.md name="Auto font size" details="Scales text within a defined font-size range" more=auto_font_size_details templated=true %} - {% include template-editor/Property_Padding.md details="Space between the block edge and the text" %} - {% include template-editor/Property_Opacity.md %} - {% include template-editor/property.md name="Font" details="Font family, weight, and italic style" %} - {% include template-editor/property.md name="Font color" details="The text color" templated=true %} - {% include template-editor/property.md name="Line height" details="Space between lines" templated=true %} - {% include template-editor/property.md name="Letter spacing" details="Space between letters" templated=true %} - {% include template-editor/property.md name="Horizontal align" details="Left, center, or right alignment" %} - {% include template-editor/property.md name="Vertical align" details="Top, middle, or bottom alignment inside the block" %} - {% include template-editor/property.md name="Underline" details="Underline style and color" templated=true %} - {% include template-editor/property.md name="Text outline" details="Stroke around text" templated=true %} - {% include template-editor/property.md name="Transform" details="Text casing" %} -
    - -## Auto Font Size - -Auto font size lets the text scale to fit the block while staying inside the range you set. When it is enabled, Minimum font size and Maximum font size controls become available. - -
    - Simple Text block resizing text automatically as the block size changes -
    - -Turn auto font size off when the block should keep one specific font size. diff --git a/template-editor/blocks/table-panel.md b/template-editor/blocks/table-panel.md deleted file mode 100644 index 60ba3d1..0000000 --- a/template-editor/blocks/table-panel.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -layout: template-editor-block -title: Table Panel -permalink: /template-editor/blocks/table-panel/ -parent: Blocks -grand_parent: Template Editor -nav_order: 9 -description: >- - Use the Table Panel block for explicit cell layouts. ---- -# Table Panel -{: .no_toc } -{: .fs-9 } - -Use Table Panels when each child block belongs in a specific cell. -{: .fs-4 .fw-300 } - -
    - -Add a Table Panel from the left sidebar. Children are assigned to table positions, which makes the layout explicit instead of flow-based. - -{% capture table_size_details %} -{% include hint.md title="Auto size to grid cell" text="Blocks inside a Table Panel can use Auto size to grid cell. When enabled, the child sizes to the cell area. Turn it off when the child should keep its own width or height." heading=false %} -{% endcapture %} - -{% include template-editor/common-block-options.md extra_size=table_size_details %} - -{% include template-editor/block-specific-options-intro.md %} - -{% capture table_position_details %} -In a Table Panel, individual children have assigned table positions and can cover more than one row or column. In a Grid Panel, children flow in order instead of being assigned to exact cells. -{% endcapture %} - -
    -
    PropertyDetails
    - {% include template-editor/Property_Padding.md details="Space between the panel edge and its children" panel=true %} - {% include template-editor/property.md name="Columns" details="Number and sizing of columns" more=table_position_details %} - {% include template-editor/property.md name="Rows" details="Number and sizing of rows" %} - {% include template-editor/property.md name="Column gap" details="Space between columns" %} - {% include template-editor/property.md name="Row gap" details="Space between rows" %} - {% include template-editor/property.md name="Cell alignment" details="Default alignment for blocks inside cells" %} -
    - -## Child Properties - -{% include template-editor/child-properties-intro.md type="Table" %} - -
    -
    PropertyDetails
    - {% include template-editor/property.md name="Position" details="Assigned column and row for the child" %} - {% include template-editor/property.md name="Columns" details="How many table columns the child covers" %} - {% include template-editor/property.md name="Rows" details="How many table rows the child covers" %} - {% include template-editor/property.md name="Horizontal align" details="Horizontal alignment override for this child" %} - {% include template-editor/property.md name="Vertical align" details="Vertical alignment override for this child" %} - {% include template-editor/property.md name="Margin" details="Extra space around this child inside the table cell" %} - {% include template-editor/property.md name="Auto size to grid cell" details="Whether the child sizes to the cell area" %} -
    - -Blocks inside table cells can use margin to create spacing within the cell without changing the whole table. - -{% include template-editor/grid-tracks.md %} - -See the [Advanced Panels guide](/template-editor/advanced/panels/) for help choosing and combining panel types. diff --git a/tests/external-links.test.mjs b/tests/external-links.test.mjs new file mode 100644 index 0000000..d5b8fa5 --- /dev/null +++ b/tests/external-links.test.mjs @@ -0,0 +1,23 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { load } from 'cheerio'; +import { externalLinksHtml, isExternalLink } from '../scripts/external-links.mjs'; + +test('external HTTP links open in a new tab, retaining existing rel values', () => { + const $ = load(externalLinksHtml('
    Home
    Fonts
    <a href="https://example.com">
    ', 'https://docs.test')); + for (const link of $('a').toArray()) { + assert.equal($(link).attr('target'), '_blank'); + assert.match($(link).attr('rel'), /noopener/); + assert.doesNotMatch($(link).attr('rel'), /noreferrer/); + } + assert.equal($('main a').attr('rel'), 'nofollow noopener'); + assert.equal($('code').text(), ''); +}); + +test('internal, fragment, email and other non-HTTP links are left alone', () => { + for (const href of ['/parameters/', '#how-it-works', '../selector/', 'https://docs.test/parameters/', 'https://docs.htmlcsstoimage.com/parameters/', 'mailto:support@htmlcsstoimage.com', 'tel:+12345']) { + assert.equal(isExternalLink(href, 'https://docs.test'), false, href); + const $ = load(externalLinksHtml(`Link`, 'https://docs.test')); + assert.equal($('a').attr('target'), undefined, href); + } +}); diff --git a/tests/images.test.mjs b/tests/images.test.mjs new file mode 100644 index 0000000..71feedc --- /dev/null +++ b/tests/images.test.mjs @@ -0,0 +1,51 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import sharp from 'sharp'; +import { imageVariants } from '../scripts/image-variants.mjs'; + +test('static variants have correct dimensions, formats, alpha, and reuse unchanged output', async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'docs-image-test-')); + try { + const input = await sharp({ create: { width: 500, height: 250, channels: 4, background: '#007a4e80' } }).png().toBuffer(); + const result = await imageVariants(input, dir, '/assets/images/nested/example%20image.png'); + assert.equal(result.width, 500); + assert.equal(result.height, 250); + for (const [format, sources] of Object.entries(result.sources)) { + assert.deepEqual(sources.map(source => source.width), [384, 500]); + for (const source of sources) { + assert.match(source.src, /^\/assets\/images\/g\/nested\/example%20image\/[a-f0-9]{20}\.w\d+\.(avif|webp)$/); + const meta = await sharp(path.join(dir, decodeURIComponent(source.src.slice('/assets/images/g/'.length)))).metadata(); + assert.equal(meta.width, source.width); + assert.equal(meta.height, source.width / 2); + assert.equal(meta.format, format === 'avif' ? 'heif' : format); + assert.equal(meta.hasAlpha, true); + } + } + const file = path.join(dir, decodeURIComponent(result.sources.webp[0].src.slice('/assets/images/g/'.length))); + const before = (await fs.stat(file)).mtimeMs; + assert.deepEqual(await imageVariants(input, dir, '/assets/images/nested/example%20image.png'), result); + assert.equal((await fs.stat(file)).mtimeMs, before); + await fs.unlink(file); + assert.deepEqual(await imageVariants(input, dir, '/assets/images/nested/example%20image.png'), result); + assert.equal((await sharp(file).metadata()).width, 384); + const changed = await sharp(input).negate().png().toBuffer(); + assert.notEqual((await imageVariants(changed, dir, '/assets/images/nested/example%20image.png')).sources.webp[0].src, result.sources.webp[0].src); + } finally { + await fs.rm(dir, { recursive: true, force: true }); + } +}); + +test('small images produce one variant at their natural width', async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'docs-image-small-')); + try { + const input = await sharp({ create: { width: 32, height: 16, channels: 3, background: '#ffffff' } }).png().toBuffer(); + const result = await imageVariants(input, dir); + assert.deepEqual(result.sources.webp.map(source => source.width), [32]); + assert.deepEqual(result.sources.avif.map(source => source.width), [32]); + } finally { + await fs.rm(dir, { recursive: true, force: true }); + } +}); diff --git a/tests/markdown.test.mjs b/tests/markdown.test.mjs new file mode 100644 index 0000000..3643550 --- /dev/null +++ b/tests/markdown.test.mjs @@ -0,0 +1,66 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { marked } from 'marked'; +import { load } from 'cheerio'; +import { renderMarkdown } from '../scripts/markdown-exports.mjs'; + +test('changelog publication dates remain separate from article text', () => { + const markdown = renderMarkdown('

    New Go client.

    ', 'Go client'); + assert.equal(markdown, '# Go client\n\nSeptember 15, 2026\n\nNew Go client.\n'); +}); + +test('changelog Markdown includes neighboring entries even though search ignores navigation', () => { + const markdown = renderMarkdown('

    Release notes.

    ', 'Update'); + assert.match(markdown, /Previous: \[Older update\]\(\/changelog\/older\/\) — Sep 14, 2026/); + assert.match(markdown, /Next: \[Newer update\]\(\/changelog\/newer\/\) — Sep 16, 2026/); +}); + +test('link cards separate the linked title from the description', () => { + const markdown = renderMarkdown('
    ', 'Guides'); + assert.equal(markdown, '# Guides\n\n[Astro](/guides/og-images/astro/) — Static and **server-rendered** routes.\n'); +}); + +test('images retain alt text, original URL and caption without visual wrappers', () => { + const markdown = renderMarkdown(`
    API keys
    Create a restricted key.
    `, 'Keys'); + assert.equal(markdown, '# Keys\n\n![API keys](/assets/images/a.png)\n\nCreate a **restricted** key.\n'); +}); + +test('parameter tables round-trip as ordinary GFM with links, inline code and pipe values', () => { + const markdown = renderMarkdown(`
    NameTypeDescription
    google_fontsStringLoad Roboto|Open Sans.
    Optional.
    `, 'Parameters'); + assert.match(markdown, /\| Name \| Type \| Description \|/); + const $ = load(marked.parse(markdown)); + assert.equal($('tbody td').length, 3); + assert.equal($('td a').attr('href'), '/parameters/google_fonts/'); + assert.equal($('td code').last().text(), 'Roboto|Open Sans'); + assert.match($('td').last().text(), /Optional/); +}); + +test('headings, code examples and endpoints retain meaning without UI controls', () => { + const markdown = renderMarkdown(`

    Example#

    POSThttps://hcti.io/v1/image
    const a = 1;console.log(a);
    `, 'API'); + assert.match(markdown, /## Example\n/); + assert.match(markdown, /`POST https:\/\/hcti.io\/v1\/image`/); + assert.match(markdown, /```js\nconst a = 1;\nconsole.log\(a\);\n```/); + assert.doesNotMatch(markdown, /Copy|\[\]\(/); +}); + +test('Expressive Code output retains its language, line breaks and indentation', () => { + const markdown = renderMarkdown('
    <div>
    <h2>Hello</h2>
    </div>
    ', 'Sizing'); + assert.match(markdown, /```html\n
    \n

    Hello<\/h2>\n<\/div>\n```/); +}); + +test('component Markdown uses build props and strips all metadata from served HTML', async () => { + const { parameterMarkdown, selectParameters } = await import('../src/lib/parameter-markdown.mjs'); + const { stripBuildMetadata } = await import('../scripts/markdown-exports.mjs'); + const props = { context: 'og_config', namePrefix: 'hcti:', nameHeading: 'Parameter' }; + const expected = parameterMarkdown(selectParameters(props), props); + const dom = load('
    Visual-only table text
    '); + dom('table').attr('data-build-parameter-table', JSON.stringify(props)); + const markdown = renderMarkdown(dom.html(), 'Parameters'); + assert.equal(markdown, `# Parameters\n\n${expected}\n`); + assert.doesNotMatch(markdown, /Visual-only/); + assert.ok(markdown.includes('`hcti:viewport_width`')); + assert.ok(!markdown.includes('viewport\\_width')); + const cleaned = stripBuildMetadata(dom.html()); + assert.doesNotMatch(cleaned, /data-build-|data-doc-markdown/); + assert.match(cleaned, /Visual-only table text<\/td>/); +}); diff --git a/tests/og.test.mjs b/tests/og.test.mjs new file mode 100644 index 0000000..072bc63 --- /dev/null +++ b/tests/og.test.mjs @@ -0,0 +1,15 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { cardHash, signedImageUrl } from '../scripts/og.mjs'; +test('OG URLs stay stable for equivalent content and change with content or design', () => { + assert.equal(cardHash({ title: 'API', section: 'Docs' }, 'a'), cardHash({ section: 'Docs', title: 'API' }, 'a')); + assert.notEqual(cardHash({ title: 'API' }, 'a'), cardHash({ title: 'API' }, 'b')); + assert.notEqual(cardHash({ title: 'API' }, 'a'), cardHash({ title: 'New API' }, 'a')); +}); +test('signing is deterministic and never exposes the API key in the public URL', () => { + const key = 'test-only-secret-not-a-real-credential'; + const url = signedImageUrl('https://docs-new-docs.mike.workers.dev/_og/example/', 'test-id', key); + assert.equal(url, signedImageUrl('https://docs-new-docs.mike.workers.dev/_og/example/', 'test-id', key)); + assert.ok(!url.includes(key)); + assert.equal(new URL(url).protocol, 'https:'); +}); diff --git a/tests/structured-data.test.mjs b/tests/structured-data.test.mjs new file mode 100644 index 0000000..650fc99 --- /dev/null +++ b/tests/structured-data.test.mjs @@ -0,0 +1,38 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { structuredData, serializeStructuredData } from '../src/lib/structured-data.mjs'; +import { breadcrumbs } from '../src/lib/breadcrumbs.mjs'; +const base = { origin: 'https://docs.htmlcsstoimage.com', route: '/parameters/viewport/', title: 'Viewport', description: 'Control viewport dimensions.' }; + +test('structured breadcrumbs match visible navigation and all local graph references resolve', () => { + const data = structuredData(base); + const graph = data['@graph']; + const ids = new Set(graph.map(node => node['@id'])); + const crumbs = graph.find(node => node['@type'] === 'BreadcrumbList'); + assert.deepEqual(crumbs.itemListElement.map(node => node.name), breadcrumbs(base.route, base.title).map(node => node.label)); + for (const node of graph) { + for (const key of ['publisher', 'isPartOf', 'breadcrumb', 'mainEntityOfPage']) { + if (node[key]) assert.ok(ids.has(node[key]['@id'])); + } + } + assert.equal(graph.at(-1)['@type'], 'TechArticle'); + assert.equal('dateModified' in graph.at(-1), false); + assert.equal('datePublished' in graph.at(-1), false); +}); + +test('changelog entries carry their real dates; collection pages do not become articles', () => { + const graph = structuredData({ ...base, route: '/changelog/2026-09-15-update/', datePublished: '2026-09-15' })['@graph']; + assert.equal(graph.at(-1)['@type'], 'BlogPosting'); + assert.equal(graph.at(-1).datePublished, '2026-09-15'); + assert.equal(graph.find(n => n['@type'] === 'BreadcrumbList').itemListElement[1].name, 'Changelog'); + const home = structuredData({ ...base, route: '/', overview: true })['@graph']; + assert.equal(home.length, 3); + assert.equal(home.at(-1)['@type'], 'CollectionPage'); +}); + +test('JSON-LD safely preserves titles containing script delimiters', () => { + const data = structuredData({ ...base, title: '' }); + const serialized = serializeStructuredData(data); + assert.ok(!serialized.includes('')); + assert.deepEqual(JSON.parse(serialized), data); +}); diff --git a/tests/worker.test.mjs b/tests/worker.test.mjs new file mode 100644 index 0000000..fbbf912 --- /dev/null +++ b/tests/worker.test.mjs @@ -0,0 +1,89 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import worker, { prefersMarkdown } from '../src/worker.mjs'; +import redirects from '../migration/redirects.json' with { type: 'json' }; +const ctx = { waitUntil() {} }; + +test('Markdown negotiation respects explicit types, quality weights and HTML defaults', () => { + for (const accept of ['text/markdown', 'text/markdown, text/html', 'text/html;q=0.5,text/markdown;q=0.9', 'TEXT/MARKDOWN; charset=utf-8', 'text/markdown;q=0.5,text/html;q=0,*/*;q=1']) assert.equal(prefersMarkdown(accept), true, accept); + for (const accept of ['', '*/*', 'text/*', 'text/html,application/xhtml+xml,*/*;q=0.8', 'text/markdown;q=0', 'text/html,text/markdown;q=0.5', 'text/markdown;q=bogus']) assert.equal(prefersMarkdown(accept), false, accept); +}); + +test('same page URL serves Markdown or HTML, including HEAD and conditional requests', async () => { + const calls = []; + const env = { ASSETS: { fetch: async request => { + calls.push(request); + return new Response(request.headers.has('If-None-Match') ? null : new URL(request.url).pathname, { + status: request.headers.has('If-None-Match') ? 304 : 200, + headers: { 'Content-Type': 'text/html', Vary: 'Accept-Encoding', ETag: '"markdown-v1"' }, + }); + } } }; + for (const path of ['/parameters/', '/parameters']) { + const response = await worker.fetch(new Request(`https://docs.test${path}?ref=agent`, { headers: { Accept: 'text/markdown' } }), env, ctx); + assert.equal(await response.text(), '/parameters.md'); + assert.equal(response.headers.get('content-type'), 'text/markdown; charset=utf-8'); + assert.equal(response.headers.get('content-location'), '/parameters.md'); + assert.equal(response.headers.get('cache-control'), 'private, max-age=60'); + assert.equal(response.headers.get('vary'), 'Accept-Encoding, Accept'); + assert.equal(new URL(calls.at(-1).url).search, '?ref=agent'); + } + const html = await worker.fetch(new Request('https://docs.test/parameters/'), env, ctx); + assert.equal(await html.text(), '/parameters/'); + assert.equal(html.headers.get('vary'), 'Accept-Encoding, Accept'); + assert.equal(html.headers.get('cache-control'), 'private, max-age=60'); + const head = await worker.fetch(new Request('https://docs.test/parameters/', { method: 'HEAD', headers: { Accept: 'text/markdown' } }), env, ctx); + assert.equal(calls.at(-1).method, 'HEAD'); + assert.equal(await head.text(), ''); + const conditional = await worker.fetch(new Request('https://docs.test/parameters/', { headers: { Accept: 'text/markdown', 'If-None-Match': '"markdown-v1"' } }), env, ctx); + assert.equal(conditional.status, 304); + assert.equal(calls.at(-1).headers.get('if-none-match'), '"markdown-v1"'); + assert.equal(conditional.headers.get('vary'), 'Accept-Encoding, Accept'); +}); + +test('direct Markdown gets its media type, while assets and missing routes are not rewritten', async () => { + const env = { ASSETS: { fetch: async request => new Response(new URL(request.url).pathname) } }; + const direct = await worker.fetch(new Request('https://docs.test/parameters.md'), env, ctx); + assert.equal(direct.headers.get('content-type'), 'text/markdown; charset=utf-8'); + for (const path of ['/missing/', '/assets/images/a.png', '/_og/hash/']) { + const response = await worker.fetch(new Request(`https://docs.test${path}`, { headers: { Accept: 'text/markdown' } }), env, ctx); + assert.equal(await response.text(), path); + } +}); + +test('every legacy redirect preserves the preview host, with or without trailing slash', async () => { + for (const [path, target] of Object.entries(redirects)) { + for (const suffix of ['', '/']) { + const response = await worker.fetch(new Request(`https://docs-new-docs.mike.workers.dev${path}${suffix}`), {}, ctx); + assert.equal(response.status, 301); + assert.equal(response.headers.get('location'), `https://docs-new-docs.mike.workers.dev${target}`); + assert.match(response.headers.get('x-robots-tag'), /noindex/); + } + } +}); +test('production pages remain indexable, preview pages and OG cards are noindex', async () => { + const env = { ASSETS: { fetch: async () => new Response('page') } }; + for (const [url, noindex] of [['https://docs.htmlcsstoimage.com/parameters/', false], ['https://docs.htmlcsstoimage.com/_og/hash/', true], ['https://docs-new-docs.mike.workers.dev/', true]]) { + const response = await worker.fetch(new Request(url), env, ctx); + assert.equal(response.headers.has('x-robots-tag'), noindex); + } +}); +test('image assets pass through unchanged, including old query URLs and HEAD', async () => { + const calls = []; + const env = { ASSETS: { fetch: async request => { + calls.push(request); + return new Response('static image', { headers: { 'Content-Type': 'image/webp', ETag: 'image-v1' } }); + } } }; + for (const path of ['/assets/images/a.png?w=768', '/assets/images/g/hash-768.webp']) { + const request = new Request(`https://docs.test${path}`); + const response = await worker.fetch(request, env); + assert.equal(calls.at(-1).url, request.url); + assert.equal(await response.text(), 'static image'); + assert.equal(response.headers.get('etag'), 'image-v1'); + assert.equal(await (await worker.fetch(new Request(request, { method: 'HEAD' }), env)).text(), ''); + } +}); +test('missing assets preserve 404 and write requests are rejected', async () => { + const env = { ASSETS: { fetch: async () => new Response('missing', { status: 404 }) } }; + assert.equal((await worker.fetch(new Request('https://docs.test/missing'), env, ctx)).status, 404); + assert.equal((await worker.fetch(new Request('https://docs.test/', { method: 'POST' }), env, ctx)).status, 405); +}); diff --git a/workers-site/.gitignore b/workers-site/.gitignore deleted file mode 100644 index 7915249..0000000 --- a/workers-site/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -dist -worker diff --git a/workers-site/index.js b/workers-site/index.js deleted file mode 100644 index 83a9522..0000000 --- a/workers-site/index.js +++ /dev/null @@ -1,255 +0,0 @@ -import { getAssetFromKV, mapRequestToAsset } from '@cloudflare/kv-asset-handler' - -/** - * The DEBUG flag will do two things that help during development: - * 1. we will skip caching on the edge, which makes it easier to - * debug. - * 2. we will return an error message on exception in your Response rather - * than the default 404.html page. - */ -const DEBUG = false - -addEventListener('fetch', event => { - try { - event.respondWith(redirectOrHandleEvent(event)) - } catch (e) { - if (DEBUG) { - return event.respondWith( - new Response(e.message || e.toString(), { - status: 500, - }), - ) - } - event.respondWith(new Response('Internal Error', { status: 500 })) - } -}) - -async function redirectOrHandleEvent(event) { - var url = new URL(event.request.url); - var path = url.pathname.replace(/\/$/, ""); - var site = "https://docs.htmlcsstoimage.com"; - - switch (path) { - // Getting Started redirects - case "/getting-started/creating-an-image": - case "/getting-started/deleting-an-image": - case "/getting-started/retrieving-an-image": - case "/getting-started/authentication": - case "/getting-started/api-reference": - return Response.redirect(site + '/getting-started/using-the-api/', 301); - case "/getting-started/take-a-screenshot-of-a-url": - return Response.redirect(site + '/getting-started/url-to-image/', 301); - case "/getting-started/mcp-server": - return Response.redirect(site + '/integrations/mcp/', 301); - case "/getting-started/using-fonts": - return Response.redirect(site + '/parameters/google_fonts/', 301); - case "/getting-started/full-page-images": - return Response.redirect(site + '/guides/workflows/email-to-images/', 301); - case "/getting-started/duplicate-image-detection": - return Response.redirect(site + '/guides/advanced/duplicate-detection/', 301); - case "/getting-started/faq": - return Response.redirect(site + '/faq', 301); - case "/getting-started/integromat-integration": - return Response.redirect(site + '/integrations/make/', 301); - case "/getting-started/zapier-integration": - return Response.redirect(site + '/integrations/zapier/', 301); - case "/getting-started/convert-emails-images": - return Response.redirect(site + '/guides/workflows/email-to-images/', 301); - case "/getting-started/file-formats": - case "/getting-started/lossless-image-optimization": - return Response.redirect(site + '/guides/styling/file-formats/', 301); - - // Social Media Guides - case "/guides/twitter-screenshot": - case "/guides/twitter-embed": - return Response.redirect(site + '/guides/social-media/twitter/', 301); - case "/guides/facebook-screenshot": - return Response.redirect(site + '/guides/social-media/facebook/', 301); - case "/guides/instagram-embed": - return Response.redirect(site + '/guides/social-media/instagram/', 301); - case "/guides/linkedin-screenshot": - return Response.redirect(site + '/guides/social-media/linkedin/', 301); - - // Debugging Guides - case "/guides/debugging-cropping-issues": - return Response.redirect(site + '/guides/debugging/cropping-issues/', 301); - case "/guides/debugging-blurry-images": - return Response.redirect(site + '/guides/debugging/blurry-images/', 301); - case "/guides/debugging-white-images": - case "/guides/debugging-white-or-blank-images": - return Response.redirect(site + '/guides/debugging/white-images/', 301); - case "/guides/troubleshooting/debugging": - return Response.redirect(site + '/guides/debugging/', 301); - case "/guides/rendering-emoji": - return Response.redirect(site + '/guides/debugging/emoji/', 301); - - // Styling Guides - case "/guides/external-css-and-fonts": - case "/guides/external-css-js-and-fonts": - case "/guides/custom-fonts": - case "/guides/using-custom-fonts": - return Response.redirect(site + '/guides/styling/external-css-fonts/', 301); - case "/guides/using-fonts": - return Response.redirect(site + '/parameters/google_fonts/', 301); - case "/guides/transparent-background": - return Response.redirect(site + '/guides/styling/transparent-background/', 301); - case "/guides/file-formats": - return Response.redirect(site + '/guides/styling/file-formats/', 301); - - // Advanced Guides - case "/guides/blocking-cookie-banners": - return Response.redirect(site + '/guides/advanced/blocking-cookie-banners/', 301); - case "/guides/duplicate-image-detection": - return Response.redirect(site + '/guides/advanced/duplicate-detection/', 301); - case "/guides/account-usage": - case "/guides/advanced/account-usage": - return Response.redirect(site + '/management-api/usage/', 301); - case "/guides/converting-base64-to-image": - case "/guides/base64-to-image": - return Response.redirect(site + '/guides/advanced/base64/', 301); - - // Workflow Guides - case "/guides/postman": - return Response.redirect(site + '/guides/workflows/postman/', 301); - case "/guides/insomnia": - return Response.redirect(site + '/guides/workflows/insomnia/', 301); - case "/guides/convert-emails-images": - case "/guides/email-to-images": - return Response.redirect(site + '/guides/workflows/email-to-images/', 301); - case "/guides/email-screenshot-slack": - case "/guides/email-to-slack": - return Response.redirect(site + '/guides/workflows/email-to-slack/', 301); - case "/guides/image-charts-with-highchartsjs": - case "/guides/image-charts-with-highcharts": - return Response.redirect(site + '/guides/workflows/highcharts/', 301); - case "/example-code/postman": - return Response.redirect(site + '/guides/workflows/postman/', 301); - - // Template redirects - case "/guides/templates": - return Response.redirect(site + '/getting-started/templates/', 301); - - // Parameter redirects - case "/guides/render-when-ready": - return Response.redirect(site + '/parameters/render_when_ready/', 301); - case "/guides/using-google-fonts": - return Response.redirect(site + '/parameters/google_fonts/', 301); - case "/guides/selector": - return Response.redirect(site + '/parameters/selector/', 301); - case "/parameters/jumbo-images": - return Response.redirect(site + '/guides/advanced/jumbo-images/', 301); - - // Advanced Examples redirects (legacy paths) - case "/advanced-examples/using-google-fonts": - return Response.redirect(site + '/parameters/google_fonts/', 301); - case "/advanced-examples/rendering-emoji": - return Response.redirect(site + '/guides/debugging/emoji/', 301); - case "/advanced-examples/image-charts-with-highcharts": - return Response.redirect(site + '/guides/workflows/highcharts/', 301); - case "/advanced-examples/transparent-background": - return Response.redirect(site + '/guides/styling/transparent-background/', 301); - case "/advanced-examples/external-css-and-fonts": - return Response.redirect(site + '/guides/styling/external-css-fonts/', 301); - case "/advanced-examples/instagram-embed": - return Response.redirect(site + '/guides/social-media/instagram/', 301); - case "/advanced-examples/twitter-embed": - return Response.redirect(site + '/guides/social-media/twitter/', 301); - - // Integrations - case "/integrations/integromat": - return Response.redirect(site + '/integrations/make/', 301); - case "/integrations/mcp-server": - return Response.redirect(site + '/integrations/mcp/', 301); - - default: - return await handleEvent(event); - } -} - -async function handleEvent(event) { - const url = new URL(event.request.url) - let options = {} - let cacheControl = {} - - if (event.request.url.match(/\.js($|\?)/) || event.request.url.match(/\.css($|\?)/) || event.request.url.match(/\.png($|\?)/)) { - cacheControl = { - browserTTL: 365 * 60 * 60 * 24, - edgeTTL: 30 * 60 * 60 * 24, - bypassCache: false, // do not bypass Cloudflare's cache - } - } else { - cacheControl = { - browserTTL: 600, - edgeTTL: 60, - bypassCache: false, // do not bypass Cloudflare's cache - } - } - /** - * You can add custom logic to how we fetch your assets - * by configuring the function `mapRequestToAsset` - */ - // options.mapRequestToAsset = handlePrefix(/^\/docs/) - - try { - if (DEBUG) { - // customize caching - options.cacheControl = { - bypassCache: true, - } - } else { - options.cacheControl = cacheControl - } - - const page = await getAssetFromKV(event, options) - - // allow headers to be altered - const response = new Response(page.body, page) - - response.headers.set('X-XSS-Protection', '1; mode=block') - response.headers.set('X-Content-Type-Options', 'nosniff') - response.headers.set('X-Frame-Options', 'DENY') - response.headers.set('Referrer-Policy', 'unsafe-url') - response.headers.set('Feature-Policy', 'none') - - return response - - } catch (e) { - // if an error is thrown try to serve the asset at 404.html - if (!DEBUG) { - try { - let notFoundResponse = await getAssetFromKV(event, { - mapRequestToAsset: req => new Request(`${new URL(req.url).origin}/404.html`, req), - }) - - return new Response(notFoundResponse.body, { - status: 404, - statusText: 'Not Found', - headers: notFoundResponse.headers - }) - } catch (e) { } - } - - return new Response(e.message || e.toString(), { status: 500 }) - } -} - -/** - * Here's one example of how to modify a request to - * remove a specific prefix, in this case `/docs` from - * the url. This can be useful if you are deploying to a - * route on a zone, or if you only want your static content - * to exist at a specific path. - */ -function handlePrefix(prefix) { - return request => { - // compute the default (e.g. / -> index.html) - let defaultAssetKey = mapRequestToAsset(request) - let url = new URL(defaultAssetKey.url) - - // strip the prefix from the path for lookup - url.pathname = url.pathname.replace(prefix, '/') - - // inherit all other props from the default request - return new Request(url.toString(), defaultAssetKey) - } -} diff --git a/workers-site/package-lock.json b/workers-site/package-lock.json deleted file mode 100644 index 8c92b1e..0000000 --- a/workers-site/package-lock.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@cloudflare/kv-asset-handler": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.0.11.tgz", - "integrity": "sha512-D2kGr8NF2Er//Mx0c4+8FtOHuLrnwOlpC48TbtyxRSegG/Js15OKoqxxlG9BMUj3V/YSqtN8bUU6pjaRlsoSqg==", - "requires": { - "@cloudflare/workers-types": "^2.0.0", - "@types/mime": "^2.0.2", - "mime": "^2.4.6" - } - }, - "@cloudflare/workers-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-2.0.0.tgz", - "integrity": "sha512-SFUPQzR5aV2TBLP4Re+xNX5KfAGArcRGA44OLulBDnfblEf3J+6kFvdJAQwFhFpqru3wImwT1cX0wahk6EeWTw==" - }, - "@types/mime": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.2.tgz", - "integrity": "sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q==" - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" - } - } -} diff --git a/workers-site/package.json b/workers-site/package.json deleted file mode 100644 index 777b625..0000000 --- a/workers-site/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "private": true, - "version": "1.0.0", - "description": "A template for kick starting a Cloudflare Workers project", - "main": "index.js", - "license": "MIT", - "dependencies": { - "@cloudflare/kv-asset-handler": "~0.0.11" - } -} diff --git a/wrangler.toml b/wrangler.toml index 4fe074a..e7f556e 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -1,10 +1,16 @@ name = "docs" account_id = "fadc7c4786d4e9b9ef650985a9282c82" -type = "webpack" -# workers_dev = true -route = "docs.htmlcsstoimage.com/*" -zone_id = "afe7c7febba92b591f139226a076a193" -compatibility_date = "2024-12-18" +main = "src/worker.mjs" +compatibility_date = "2026-09-19" +preview_urls = true +workers_dev = false +# versions upload does not change production routing or deploy the version. +routes = [{ pattern = "docs.htmlcsstoimage.com/*", zone_id = "afe7c7febba92b591f139226a076a193" }] -[site] -bucket = "./_site" +[assets] +directory = "./dist" +binding = "ASSETS" +# Pages need Markdown negotiation and redirects; static assets bypass the Worker. +run_worker_first = ["/*", "!/_astro/*", "!/_og/*", "!/assets/*", "!/pagefind/*", "!/search/*", "!/favicon.ico"] +html_handling = "force-trailing-slash" +not_found_handling = "404-page"