diff --git a/.env-dev b/.env-dev index 31ca32b6..386c19ea 100644 --- a/.env-dev +++ b/.env-dev @@ -8,3 +8,9 @@ DOCS_DIRECTORY="/var/www/html/docs/" TEMPLATE_DIRECTORY="/var/www/html/templates/" CACHE_DIRECTORY="/var/www/html/cache" UPDATE_SECRET="Generate secret: openssl rand -hex 38" + +DB_HOST="mysql" +DB_PORT="3306" +DB_NAME="modxdocs" +DB_USER="modxdocs" +DB_PASSWORD="secret" diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index 8c0a1afe..0618f6b4 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -7,17 +7,17 @@ jobs: strategy: matrix: - node-version: [15.x] + node-version: [20.x] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Setting up node ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - name: Cache npm modules - uses: actions/cache@v2 + uses: actions/cache@v4 with: # npm cache files are stored in `~/.npm` on Linux/macOS path: ~/.npm diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 0039d63b..8b8a045d 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -4,9 +4,10 @@ on: [push, pull_request] jobs: validate-json: + name: 'validate json' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Validate language file uses: docker://orrosenblatt/validate-json-action:latest env: @@ -17,3 +18,26 @@ jobs: env: INPUT_SCHEMA: ./sources.schema.json INPUT_JSONS: ./sources.dist.json + phpcs: + name: 'phpcs + compat checker' + runs-on: ubuntu-latest + continue-on-error: true + + strategy: + matrix: + php-version: ['8.3', '8.4'] + + steps: + - uses: actions/checkout@v4 + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + extensions: pdo, pdo_mysql, zip, mysqli, gd + + - name: Install dependencies + run: composer install --no-progress --prefer-dist --optimize-autoloader + + - name: phpcs + run: composer run phpcs -- --runtime-set testVersion ${{ matrix.php-version }} diff --git a/.gitignore b/.gitignore index c1834f67..7218f5a7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,10 @@ .DS_Store cache/* !cache/.gitkeep +.phpunit.cache/ public/.htaccess +public/sitemap.xml +public/sitemaps/ node_modules/ .env sources.json diff --git a/Dockerfile b/Dockerfile index f0e5fac8..b6b6c734 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ FROM node:16 AS node -FROM php:7.4-rc-apache +FROM php:8.3-apache ENV APACHE_DOCUMENT_ROOT=/var/www/html/public RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf @@ -25,14 +25,17 @@ RUN a2enmod rewrite \ && a2dissite 000-default \ && a2ensite docs -# Install Git -RUN apt-get update && apt-get install -y --force-yes git zlib1g-dev libicu-dev g++ \ +# Install Git and PHP extensions +RUN apt-get update && apt-get install -y --no-install-recommends git zlib1g-dev libicu-dev g++ \ libzip-dev \ + libpng-dev \ + libjpeg62-turbo-dev \ + libfreetype6-dev \ zip \ && docker-php-ext-configure intl \ - && docker-php-ext-install intl \ - && docker-php-ext-configure zip --with-libzip \ - && docker-php-ext-install zip + && docker-php-ext-configure gd --with-freetype --with-jpeg \ + && docker-php-ext-install intl pdo_mysql zip gd \ + && rm -rf /var/lib/apt/lists/* #Set final permissions RUN mkdir /var/www/.npm && chown -R www-data:www-data /var/www/.npm @@ -47,4 +50,3 @@ USER www-data ENTRYPOINT ["/entrypoint.sh"] CMD ["apache2-foreground"] - diff --git a/README.md b/README.md index 390281e4..43b29c50 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DocsApp for MODX -The DocsApp is a Slim application that serves up the [MODX documentation](https://github.com/modxorg/Docs) from markdown format into a fully functional site. +The DocsApp is a Slim application that serves up the [MODX documentation](https://github.com/modxorg/Docs) from markdown format into a fully functional site. It uses a light MySQL Database for indexing purposes. Version-specific copies [of the markdown documentation](https://github.com/modxorg/Docs) go into the `/docs` directory. Then point a webserver at the `/public` directory to browse the documentation. @@ -13,9 +13,9 @@ Version-specific copies [of the markdown documentation](https://github.com/modxo 1. Run a [composer install](https://getcomposer.org) in the root: `composer install` 2. Copy the default settings: `cp .env-dev .env` -3. Edit `.env` in your favorite file editor to fix the paths. +3. Edit `.env` in your favorite file editor to fix the paths and configure your MySQL database. 4. To run the latest version of the documentation (i.e. the version published on the modxorg/Docs repository), initialise the default documentation sources with `php docs.php sources:init`. To run a local clone of the documentation source, allowing you to immediately see your local changes inside the app, see custom sources below. -5. Point a webserver, running at least PHP 7.1, to the `/public` directory. +5. Point a webserver, running at least PHP 8.3, to the `/public` directory. 6. If you use apache, `cp public/ht.access public/.htaccess` and tweak (RewriteBase) as required. For nginx, set up the equivalent rewrites in your configuration. ### Custom Sources @@ -39,7 +39,7 @@ For example, create it like this to have a local source for `2.x` and a separate } ``` -(Note that app treats "2.x" the same as "current", so to allow easy switching between versions in a local mirror, you'll want to call it something different. That's why in this example we called it "upstream") +(Note that the app treats "3.x" the same as "current", so to allow easy switching between versions in a local mirror, you'll want to call it something different. That's why in this example we called it "upstream") Once you've done that, run `php docs.php sources:init` from the root of the project. (If you've run this previously, deleted the directories in the `/docs/` directory first.) You should see output like this: @@ -118,12 +118,29 @@ git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" ### Searching / Indexing -To run the **search** locally, you'll first need to create the search index. Run `php docs.php index:init` to create the empty SQLite database, and then `php docs.php index:all` to populate the index. This may take a while (for 2.x + 3.x official documentation, 20-40 minutes depending on computer speed) as that will scan all files in the documentation to index possible search terms, as well as historic contributors (if the source is a git repo) for each file. +To run the **search** locally, you'll first need a MySQL database and the search index. Configure the `DB_*` environment variables in your `.env` file (see `.env-dev` for defaults), then run `php docs.php index:init` to create the database tables, and `php docs.php index:all` to populate the index. This may take a while (for 2.x + 3.x official documentation, 20-40 minutes depending on computer speed) as that will scan all files in the documentation to index possible search terms, as well as historic contributors (if the source is a git repo) for each file. For the language switch to work, you also need to index the translations with `php docs.php index:translations`. **These index actions are done automatically for changed files only (much faster!) as part of `php docs.php sources:update`.** Typically you'd only need to run the full indexing the first time setting up a mirror or clone. +When migrating from the previous SQLite setup, create a fresh MySQL database, run `index:init`, then rebuild the index with `index:all` and `index:translations`. Search analytics (`Searches`, `PageNotFound`) will start fresh. + +### Analytics cleanup + +Search queries and 404 hits are logged in the `Searches` and `PageNotFound` tables. To keep those tables from growing indefinitely, run `php docs.php stats:cleanup` on a schedule (for example daily via cron). By default this deletes records whose `last_seen` is older than 90 days; override with `--days`: + +```bash +php docs.php stats:cleanup +php docs.php stats:cleanup --days=30 +``` + +Example crontab entry (daily at 03:00): + +```cron +0 3 * * * cd /path/to/app && php docs.php stats:cleanup +``` + ## Building assets From the `public/template/` directory, first load the dependencies with `npm install`. @@ -136,4 +153,4 @@ When preparing a patch for production, use `npm run release` which will build st ## Running in a Docker Container -Run `make` and `make install` or use the provided Dockerfile/docker-compose.yml. (see #3) +Run `make` and `make install` or use the provided Dockerfile/docker-compose.yml. Docker Compose includes a MySQL 8 service; the `docs` container waits for MySQL to be healthy before starting. (see #3) diff --git a/composer.json b/composer.json index df397fe5..e8e7598f 100644 --- a/composer.json +++ b/composer.json @@ -12,40 +12,55 @@ } ], "require": { - "php": ">=7.4.0", + "php": ">=8.3.0", "ext-json": "*", "ext-pdo": "*", - "ext-sqlite3": "*", + "ext-pdo_mysql": "*", "ext-fileinfo": "*", "ext-mbstring": "*", - "slim/slim": "^3.1", - "slim/php-view": "^2.0", - "slim/twig-view": "^2.3", + "slim/slim": "^4.0", + "slim/psr7": "^1.6", + "php-di/php-di": "^7.0", + "monolog/monolog": "^3.0", + "slim/php-view": "^3.0", + "slim/twig-view": "^3.0", "spatie/yaml-front-matter": "^2.0", - "league/commonmark": "^1.5", + "league/commonmark": "^2.6", "caseyamcl/toc": "^3.0", - "vlucas/phpdotenv": "^3.3", - "symfony/console": "^5.2", - "symfony/process": "^5.2", - "voku/stop-words": "^2.0" + "vlucas/phpdotenv": "^5.6", + "symfony/console": "^7.0", + "symfony/process": "^7.0", + "voku/stop-words": "^2.0", + "embed/embed": "^4.4", + "ext-dom": "*", + "ext-gd": "*" }, "require-dev": { - "ext-intl": "*" + "ext-intl": "*", + "squizlabs/php_codesniffer": "3.*", + "phpcompatibility/php-compatibility": "^9.3", + "yoast/phpunit-polyfills": "^4.0" }, "autoload": { "psr-4": { - "Tests\\": "tests/", "MODXDocs\\": "src/" } }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, "config": { "process-timeout" : 0, "platform": { - "php": "7.4.0" + "php": "8.3.0" } }, "scripts": { "start": "php -S localhost:8080 -t public index.php", - "test": "phpunit" + "test": "@php vendor/bin/phpunit", + "phpcs": "vendor/bin/phpcs --standard=phpcs.xml", + "phpcbf": "vendor/bin/phpcbf --standard=phpcs.xml" } } diff --git a/composer.lock b/composer.lock index 5d0a67fd..3f436c00 100644 --- a/composer.lock +++ b/composer.lock @@ -4,24 +4,24 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "309a5cc08a51d2a8c2e9b29f9e585805", + "content-hash": "220ded7bba9e59c0fe5ac74b73daf95f", "packages": [ { "name": "caseyamcl/toc", - "version": "v3.1", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/caseyamcl/toc.git", - "reference": "1aa7d6b446e151b4c11d18b11c199e61d00c5182" + "reference": "5ecaad1e1c36bab5caa278e2b9dfc8bc420e6d51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/caseyamcl/toc/zipball/1aa7d6b446e151b4c11d18b11c199e61d00c5182", - "reference": "1aa7d6b446e151b4c11d18b11c199e61d00c5182", + "url": "https://api.github.com/repos/caseyamcl/toc/zipball/5ecaad1e1c36bab5caa278e2b9dfc8bc420e6d51", + "reference": "5ecaad1e1c36bab5caa278e2b9dfc8bc420e6d51", "shasum": "" }, "require": { - "cocur/slugify": "^3.0|^4.0", + "cocur/slugify": "^3.0|~4.4.0|^4.6", "ext-dom": "*", "knplabs/knp-menu": "^3.2", "masterminds/html5": "^2.1", @@ -63,27 +63,27 @@ ], "support": { "issues": "https://github.com/caseyamcl/toc/issues", - "source": "https://github.com/caseyamcl/toc/tree/v3.1" + "source": "https://github.com/caseyamcl/toc/tree/v3.2.0" }, - "time": "2022-03-16T15:46:12+00:00" + "time": "2024-12-08T16:12:05+00:00" }, { "name": "cocur/slugify", - "version": "v4.3.0", + "version": "v4.7.1", "source": { "type": "git", "url": "https://github.com/cocur/slugify.git", - "reference": "652234ef5f1be844a2ae1c36ad1b4c88b05160f9" + "reference": "a860dab2b9f5f37775fc6414d4f049434848165f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cocur/slugify/zipball/652234ef5f1be844a2ae1c36ad1b4c88b05160f9", - "reference": "652234ef5f1be844a2ae1c36ad1b4c88b05160f9", + "url": "https://api.github.com/repos/cocur/slugify/zipball/a860dab2b9f5f37775fc6414d4f049434848165f", + "reference": "a860dab2b9f5f37775fc6414d4f049434848165f", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^7.1 || ~8.0.0 || ~8.1.0 || ~8.2.0" + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "conflict": { "symfony/config": "<3.4 || >=4,<4.3", @@ -137,50 +137,44 @@ ], "support": { "issues": "https://github.com/cocur/slugify/issues", - "source": "https://github.com/cocur/slugify/tree/v4.3.0" + "source": "https://github.com/cocur/slugify/tree/v4.7.1" }, - "time": "2022-12-07T19:48:48+00:00" + "time": "2025-11-27T18:57:36+00:00" }, { - "name": "knplabs/knp-menu", - "version": "v3.3.0", + "name": "composer/ca-bundle", + "version": "1.5.13", "source": { "type": "git", - "url": "https://github.com/KnpLabs/KnpMenu.git", - "reference": "8bd3dc2afa22c65617c563c5e25e62d6e23e98c7" + "url": "https://github.com/composer/ca-bundle.git", + "reference": "c008272789979f709f7fcb32c2ecf1d2db5e84e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/KnpLabs/KnpMenu/zipball/8bd3dc2afa22c65617c563c5e25e62d6e23e98c7", - "reference": "8bd3dc2afa22c65617c563c5e25e62d6e23e98c7", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/c008272789979f709f7fcb32c2ecf1d2db5e84e5", + "reference": "c008272789979f709f7fcb32c2ecf1d2db5e84e5", "shasum": "" }, "require": { - "php": "^7.3 || ^8.0" - }, - "conflict": { - "twig/twig": "<1.40 || >=2,<2.9" + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^9.5", - "psr/container": "^1.0", - "symfony/http-foundation": "^4.4 || ^5.0 || ^6.0", - "symfony/phpunit-bridge": "^5.3", - "symfony/routing": "^4.4 || ^5.0 || ^6.0", - "twig/twig": "^1.40 || ^2.9 || ^3.0" - }, - "suggest": { - "twig/twig": "for the TwigRenderer and the integration with your templates" + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.3-dev" + "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { - "Knp\\Menu\\": "src/Knp/Menu" + "Composer\\CaBundle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -189,155 +183,158 @@ ], "authors": [ { - "name": "KnpLabs", - "homepage": "https://knplabs.com" - }, - { - "name": "Christophe Coevoet", - "email": "stof@notk.org" - }, - { - "name": "The Community", - "homepage": "https://github.com/KnpLabs/KnpMenu/contributors" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "An object oriented menu library", - "homepage": "https://knplabs.com", + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", "keywords": [ - "menu", - "tree" + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" ], "support": { - "issues": "https://github.com/KnpLabs/KnpMenu/issues", - "source": "https://github.com/KnpLabs/KnpMenu/tree/v3.3.0" + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.5.13" }, - "time": "2021-10-23T15:01:04+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2026-07-18T12:35:13+00:00" }, { - "name": "league/commonmark", - "version": "1.6.7", + "name": "dflydev/dot-access-data", + "version": "v3.0.3", "source": { "type": "git", - "url": "https://github.com/thephpleague/commonmark.git", - "reference": "2b8185c13bc9578367a5bf901881d1c1b5bbd09b" + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/2b8185c13bc9578367a5bf901881d1c1b5bbd09b", - "reference": "2b8185c13bc9578367a5bf901881d1c1b5bbd09b", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", "shasum": "" }, "require": { - "ext-mbstring": "*", "php": "^7.1 || ^8.0" }, - "conflict": { - "scrutinizer/ocular": "1.7.*" - }, "require-dev": { - "cebe/markdown": "~1.0", - "commonmark/commonmark.js": "0.29.2", - "erusev/parsedown": "~1.0", - "ext-json": "*", - "github/gfm": "0.29.0", - "michelf/php-markdown": "~1.4", - "mikehaertl/php-shellcommand": "^1.4", - "phpstan/phpstan": "^0.12.90", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2", - "scrutinizer/ocular": "^1.5", - "symfony/finder": "^4.2" + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" }, - "bin": [ - "bin/commonmark" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { "psr-4": { - "League\\CommonMark\\": "src" + "Dflydev\\DotAccessData\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } - ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", - "homepage": "https://commonmark.thephpleague.com", - "keywords": [ - "commonmark", - "flavored", - "gfm", - "github", - "github-flavored", - "markdown", - "md", - "parser" - ], - "support": { - "docs": "https://commonmark.thephpleague.com/", - "issues": "https://github.com/thephpleague/commonmark/issues", - "rss": "https://github.com/thephpleague/commonmark/releases.atom", - "source": "https://github.com/thephpleague/commonmark" - }, - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" }, { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" }, { - "url": "https://github.com/colinodell", - "type": "github" + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" }, { - "url": "https://tidelift.com/funding/github/packagist/league/commonmark", - "type": "tidelift" + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" } ], - "time": "2022-01-13T17:18:13+00:00" + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" }, { - "name": "masterminds/html5", - "version": "2.7.6", + "name": "embed/embed", + "version": "v4.4.19", "source": { "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "897eb517a343a2281f11bc5556d6548db7d93947" + "url": "https://github.com/php-embed/Embed.git", + "reference": "c45a9007285524350499f3fa70e7e2f0967af470" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/897eb517a343a2281f11bc5556d6548db7d93947", - "reference": "897eb517a343a2281f11bc5556d6548db7d93947", + "url": "https://api.github.com/repos/php-embed/Embed/zipball/c45a9007285524350499f3fa70e7e2f0967af470", + "reference": "c45a9007285524350499f3fa70e7e2f0967af470", "shasum": "" }, "require": { - "ext-ctype": "*", + "composer/ca-bundle": "^1.0", + "ext-curl": "*", "ext-dom": "*", - "ext-libxml": "*", - "php": ">=5.3.0" + "ext-json": "*", + "ext-mbstring": "*", + "ml/json-ld": "^1.1", + "oscarotero/html-parser": "^0.1.4", + "php": "^7.4|^8", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0|^2.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7" + "brick/varexporter": "^0.3.1", + "friendsofphp/php-cs-fixer": "^2.0", + "nyholm/psr7": "^1.2", + "oscarotero/php-cs-fixer-config": "^1.0", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.0", + "symfony/css-selector": "^5.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } + "suggest": { + "symfony/css-selector": "If you want to get elements using css selectors" }, + "type": "library", "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Masterminds\\": "src" + "Embed\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -346,147 +343,147 @@ ], "authors": [ { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" + "name": "Oscar Otero", + "email": "oom@oscarotero.com", + "homepage": "http://oscarotero.com", + "role": "Developer" } ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", + "description": "PHP library to retrieve page info using oembed, opengraph, etc", + "homepage": "https://github.com/oscarotero/Embed", "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" + "embed", + "embedly", + "oembed", + "opengraph", + "twitter cards" ], "support": { - "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.7.6" + "email": "oom@oscarotero.com", + "issues": "https://github.com/oscarotero/Embed/issues", + "source": "https://github.com/php-embed/Embed/tree/v4.4.19" }, - "time": "2022-08-18T16:18:26+00:00" + "funding": [ + { + "url": "https://paypal.me/oscarotero", + "type": "custom" + }, + { + "url": "https://github.com/oscarotero", + "type": "github" + }, + { + "url": "https://www.patreon.com/misteroom", + "type": "patreon" + } + ], + "time": "2026-07-08T19:24:10+00:00" }, { - "name": "nikic/fast-route", - "version": "v1.3.0", + "name": "fig/http-message-util", + "version": "1.1.5", "source": { "type": "git", - "url": "https://github.com/nikic/FastRoute.git", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + "url": "https://github.com/php-fig/http-message-util.git", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": "^5.3 || ^7.0 || ^8.0" }, - "require-dev": { - "phpunit/phpunit": "^4.8.35|~5.7" + "suggest": { + "psr/http-message": "The package containing the PSR-7 interfaces" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "FastRoute\\": "src/" + "Fig\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nikita Popov", - "email": "nikic@php.net" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Fast request router for PHP", + "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", "keywords": [ - "router", - "routing" + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/nikic/FastRoute/issues", - "source": "https://github.com/nikic/FastRoute/tree/master" + "issues": "https://github.com/php-fig/http-message-util/issues", + "source": "https://github.com/php-fig/http-message-util/tree/1.1.5" }, - "time": "2018-02-13T20:26:39+00:00" + "time": "2020-11-24T22:02:12+00:00" }, { - "name": "phpoption/phpoption", - "version": "1.9.0", + "name": "graham-campbell/result-type", + "version": "v1.1.4", "source": { "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab" + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", - "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8", - "phpunit/phpunit": "^8.5.28 || ^9.5.21" + "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": true - }, - "branch-alias": { - "dev-master": "1.9-dev" - } - }, "autoload": { "psr-4": { - "PhpOption\\": "src/PhpOption/" + "GrahamCampbell\\ResultType\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" ], "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh" - }, { "name": "Graham Campbell", "email": "hello@gjcampbell.co.uk", "homepage": "https://github.com/GrahamCampbell" } ], - "description": "Option Type for PHP", + "description": "An Implementation Of The Result Type", "keywords": [ - "language", - "option", - "php", - "type" + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" ], "support": { - "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.0" + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4" }, "funding": [ { @@ -494,42 +491,54 @@ "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", "type": "tidelift" } ], - "time": "2022-07-30T15:51:26+00:00" + "time": "2025-12-27T19:43:20+00:00" }, { - "name": "pimple/pimple", - "version": "v3.5.0", + "name": "knplabs/knp-menu", + "version": "v3.8.0", "source": { "type": "git", - "url": "https://github.com/silexphp/Pimple.git", - "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" + "url": "https://github.com/KnpLabs/KnpMenu.git", + "reference": "79d325909a1d428a93f1a0f55e90177830e283bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", - "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "url": "https://api.github.com/repos/KnpLabs/KnpMenu/zipball/79d325909a1d428a93f1a0f55e90177830e283bb", + "reference": "79d325909a1d428a93f1a0f55e90177830e283bb", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1 || ^2.0" + "php": "^8.1" + }, + "conflict": { + "symfony/http-foundation": "<5.4", + "twig/twig": "<2.16" }, "require-dev": { - "symfony/phpunit-bridge": "^5.4@dev" + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^9.6", + "psr/container": "^1.0 || ^2.0", + "symfony/http-foundation": "^5.4 || ^6.0 || ^7.0", + "symfony/phpunit-bridge": "^7.0", + "symfony/routing": "^5.4 || ^6.0 || ^7.0", + "twig/twig": "^2.16 || ^3.0" + }, + "suggest": { + "twig/twig": "for the TwigRenderer and the integration with your templates" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { - "psr-0": { - "Pimple": "src/" + "psr-4": { + "Knp\\Menu\\": "src/Knp/Menu" } }, "notification-url": "https://packagist.org/downloads/", @@ -538,42 +547,63 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "KnpLabs", + "homepage": "https://knplabs.com" + }, + { + "name": "Christophe Coevoet", + "email": "stof@notk.org" + }, + { + "name": "The Community", + "homepage": "https://github.com/KnpLabs/KnpMenu/contributors" } ], - "description": "Pimple, a simple Dependency Injection Container", - "homepage": "https://pimple.symfony.com", + "description": "An object oriented menu library", + "homepage": "https://knplabs.com", "keywords": [ - "container", - "dependency injection" + "menu", + "tree" ], "support": { - "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" + "issues": "https://github.com/KnpLabs/KnpMenu/issues", + "source": "https://github.com/KnpLabs/KnpMenu/tree/v3.8.0" }, - "time": "2021-10-28T11:13:42+00:00" + "time": "2025-06-13T15:03:33+00:00" }, { - "name": "psr/container", - "version": "1.1.2", + "name": "laravel/serializable-closure", + "version": "v2.0.15", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/dccd8bcb851bb03fcc005df650b708b57cc52661", + "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661", "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0|^4.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Laravel\\SerializableClosure\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -582,166 +612,245 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "closure", + "laravel", + "serializable" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2026-07-21T16:49:22+00:00" }, { - "name": "psr/http-message", - "version": "1.0.1", + "name": "league/commonmark", + "version": "2.8.3", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "1902f60f984235023acbe03db6ad614a37b3c3e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/1902f60f984235023acbe03db6ad614a37b3c3e7", + "reference": "1902f60f984235023acbe03db6ad614a37b3c3e7", "shasum": "" }, "require": { - "php": ">=5.3.0" + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^2.0.0", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0 || ^12.0.0 || ^13.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-main": "2.9-dev" } }, "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" + "League\\CommonMark\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" } ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" }, - "time": "2016-08-06T14:39:51+00:00" + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2026-07-12T15:29:16+00:00" }, { - "name": "slim/php-view", - "version": "2.2.1", + "name": "league/config", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/slimphp/PHP-View.git", - "reference": "a13ada9d7962ca1b48799c0d9ffbca4c33245aed" + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slimphp/PHP-View/zipball/a13ada9d7962ca1b48799c0d9ffbca4c33245aed", - "reference": "a13ada9d7962ca1b48799c0d9ffbca4c33245aed", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", "shasum": "" }, "require": { - "psr/http-message": "^1.0" + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8", - "slim/slim": "^3.0" + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, "autoload": { "psr-4": { - "Slim\\Views\\": "src" + "League\\Config\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Glenn Eggleton", - "email": "geggleto@gmail.com" + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" } ], - "description": "Render PHP view scripts into a PSR-7 Response object.", + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", "keywords": [ - "framework", - "php", - "phtml", - "renderer", - "slim", - "template", - "view" + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" ], "support": { - "issues": "https://github.com/slimphp/PHP-View/issues", - "source": "https://github.com/slimphp/PHP-View/tree/2.2.1" + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" }, - "time": "2019-04-15T20:43:28+00:00" + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" }, { - "name": "slim/slim", - "version": "3.12.4", + "name": "masterminds/html5", + "version": "2.10.1", "source": { "type": "git", - "url": "https://github.com/slimphp/Slim.git", - "reference": "ce3cb65a06325fc9fe3d0223f2ae23113a767304" + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "fd5018f6815fff903946d0564977b44ce8010e29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slimphp/Slim/zipball/ce3cb65a06325fc9fe3d0223f2ae23113a767304", - "reference": "ce3cb65a06325fc9fe3d0223f2ae23113a767304", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fd5018f6815fff903946d0564977b44ce8010e29", + "reference": "fd5018f6815fff903946d0564977b44ce8010e29", "shasum": "" }, "require": { - "ext-json": "*", - "ext-libxml": "*", - "ext-simplexml": "*", - "nikic/fast-route": "^1.0", - "php": ">=5.5.0", - "pimple/pimple": "^3.0", - "psr/container": "^1.0", - "psr/http-message": "^1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" + "ext-dom": "*", + "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^4.0", - "squizlabs/php_codesniffer": "^3.6.0" + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9 || ^10" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, "autoload": { "psr-4": { - "Slim\\": "Slim" + "Masterminds\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -750,77 +859,58 @@ ], "authors": [ { - "name": "Josh Lockhart", - "email": "hello@joshlockhart.com", - "homepage": "https://joshlockhart.com" - }, - { - "name": "Andrew Smith", - "email": "a.smith@silentworks.co.uk", - "homepage": "http://silentworks.co.uk" + "name": "Matt Butcher", + "email": "technosophos@gmail.com" }, { - "name": "Rob Allen", - "email": "rob@akrabat.com", - "homepage": "http://akrabat.com" + "name": "Matt Farina", + "email": "matt@mattfarina.com" }, { - "name": "Gabriel Manricks", - "email": "gmanricks@me.com", - "homepage": "http://gabrielmanricks.com" + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" } ], - "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", - "homepage": "https://slimframework.com", + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", "keywords": [ - "api", - "framework", - "micro", - "router" + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" ], "support": { - "issues": "https://github.com/slimphp/Slim/issues", - "source": "https://github.com/slimphp/Slim/tree/3.12.4" + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.10.1" }, - "funding": [ - { - "url": "https://opencollective.com/slimphp", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/slim/slim", - "type": "tidelift" - } - ], - "time": "2021-10-02T19:38:22+00:00" + "time": "2026-06-23T18:43:15+00:00" }, { - "name": "slim/twig-view", - "version": "2.5.1", + "name": "ml/iri", + "version": "1.1.4", + "target-dir": "ML/IRI", "source": { "type": "git", - "url": "https://github.com/slimphp/Twig-View.git", - "reference": "47bd5cc1cbbdf5196d0873ece0ee97c6c7b352e9" + "url": "https://github.com/lanthaler/IRI.git", + "reference": "cbd44fa913e00ea624241b38cefaa99da8d71341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slimphp/Twig-View/zipball/47bd5cc1cbbdf5196d0873ece0ee97c6c7b352e9", - "reference": "47bd5cc1cbbdf5196d0873ece0ee97c6c7b352e9", + "url": "https://api.github.com/repos/lanthaler/IRI/zipball/cbd44fa913e00ea624241b38cefaa99da8d71341", + "reference": "cbd44fa913e00ea624241b38cefaa99da8d71341", "shasum": "" }, "require": { - "php": ">=5.5.0", - "psr/http-message": "^1.0", - "twig/twig": "^1.38|^2.7|^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8|^5.7", - "slim/slim": "^3.10" + "lib-pcre": ">=4.0", + "php": ">=5.3.0" }, "type": "library", "autoload": { - "psr-4": { - "Slim\\Views\\": "src" + "psr-0": { + "ML\\IRI": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -829,51 +919,53 @@ ], "authors": [ { - "name": "Josh Lockhart", - "email": "hello@joshlockhart.com", - "homepage": "http://joshlockhart.com" + "name": "Markus Lanthaler", + "email": "mail@markus-lanthaler.com", + "homepage": "http://www.markus-lanthaler.com", + "role": "Developer" } ], - "description": "Slim Framework 3 view helper built on top of the Twig 2 templating component", - "homepage": "http://slimframework.com", + "description": "IRI handling for PHP", + "homepage": "http://www.markus-lanthaler.com", "keywords": [ - "framework", - "slim", - "template", - "twig", - "view" + "URN", + "iri", + "uri", + "url" ], "support": { - "issues": "https://github.com/slimphp/Twig-View/issues", - "source": "https://github.com/slimphp/Twig-View/tree/master" + "issues": "https://github.com/lanthaler/IRI/issues", + "source": "https://github.com/lanthaler/IRI/tree/master" }, - "time": "2019-11-28T18:03:50+00:00" + "time": "2014-01-21T13:43:39+00:00" }, { - "name": "spatie/yaml-front-matter", - "version": "2.0.7", + "name": "ml/json-ld", + "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/spatie/yaml-front-matter.git", - "reference": "f49f228994de70827ca857efffdd3bd7703aea34" + "url": "https://github.com/lanthaler/JsonLD.git", + "reference": "537e68e87a6bce23e57c575cd5dcac1f67ce25d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/yaml-front-matter/zipball/f49f228994de70827ca857efffdd3bd7703aea34", - "reference": "f49f228994de70827ca857efffdd3bd7703aea34", + "url": "https://api.github.com/repos/lanthaler/JsonLD/zipball/537e68e87a6bce23e57c575cd5dcac1f67ce25d8", + "reference": "537e68e87a6bce23e57c575cd5dcac1f67ce25d8", "shasum": "" }, "require": { - "php": "^7.0|^8.0", - "symfony/yaml": "^3.0|^4.0|^5.0|^6.0" + "ext-json": "*", + "ml/iri": "^1.1.1", + "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^9.0" + "json-ld/tests": "1.0", + "phpunit/phpunit": "^4" }, "type": "library", "autoload": { "psr-4": { - "Spatie\\YamlFrontMatter\\": "src" + "ML\\JsonLD\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -882,92 +974,92 @@ ], "authors": [ { - "name": "Sebastian De Deyne", - "email": "sebastian@spatie.be", - "homepage": "https://spatie.be", + "name": "Markus Lanthaler", + "email": "mail@markus-lanthaler.com", + "homepage": "http://www.markus-lanthaler.com", "role": "Developer" } ], - "description": "A to the point yaml front matter parser", - "homepage": "https://github.com/sebastiandedeyne/yaml-front-matter", + "description": "JSON-LD Processor for PHP", + "homepage": "http://www.markus-lanthaler.com", "keywords": [ - "front matter", - "jekyll", - "spatie", - "yaml" + "JSON-LD", + "jsonld" ], "support": { - "source": "https://github.com/spatie/yaml-front-matter/tree/2.0.7" + "issues": "https://github.com/lanthaler/JsonLD/issues", + "source": "https://github.com/lanthaler/JsonLD/tree/1.2.1" }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - }, - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2022-04-06T12:03:55+00:00" + "time": "2022-09-29T08:45:17+00:00" }, { - "name": "symfony/console", - "version": "v5.4.19", + "name": "monolog/monolog", + "version": "3.10.0", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "dccb8d251a9017d5994c988b034d3e18aaabf740" + "url": "https://github.com/Seldaek/monolog.git", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/dccb8d251a9017d5994c988b034d3e18aaabf740", - "reference": "dccb8d251a9017d5994c988b034d3e18aaabf740", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0|2.0" + "psr/log-implementation": "3.0.0" }, "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8 || ^2.0", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" }, "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Monolog\\": "src/Monolog" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -975,1020 +1067,4343 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", "keywords": [ - "cli", - "command line", - "console", - "terminal" + "log", + "logging", + "psr-3" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.19" + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.10.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/Seldaek", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2026-01-02T08:56:05+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "name": "nette/schema", + "version": "v1.3.5", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "url": "https://github.com/nette/schema.git", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", "shasum": "" }, "require": { - "php": ">=7.1" + "nette/utils": "^4.0", + "php": "8.1 - 8.5" + }, + "require-dev": { + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.6", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1.39@stable", + "tracy/tracy": "^2.8" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "dev-master": "1.3-dev" } }, "autoload": { - "files": [ - "function.php" + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "David Grudl", + "homepage": "https://davidgrudl.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.5" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { + "time": "2026-02-23T03:47:12+00:00" + }, + { + "name": "nette/utils", + "version": "v4.1.5", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/b043439dbdf954e6c28b5ea7e34b0100f83165e0", + "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0", + "shasum": "" + }, + "require": { + "php": "8.2 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.5", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::chr(), ord() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.1.5" + }, + "time": "2026-07-17T23:02:45+00:00" + }, + { + "name": "nikic/fast-route", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "7476684f39bb9124b3be69ed3d84b66723920298" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/7476684f39bb9124b3be69ed3d84b66723920298", + "reference": "7476684f39bb9124b3be69ed3d84b66723920298", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "FastRoute\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "support": { + "issues": "https://github.com/nikic/FastRoute/issues", + "source": "https://github.com/nikic/FastRoute/tree/1.3.1" + }, + "time": "2026-07-09T19:38:47+00:00" + }, + { + "name": "oscarotero/html-parser", + "version": "v0.1.8", + "source": { + "type": "git", + "url": "https://github.com/oscarotero/html-parser.git", + "reference": "10f3219267a365d9433f2f7d1694209c9d436c8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/oscarotero/html-parser/zipball/10f3219267a365d9433f2f7d1694209c9d436c8d", + "reference": "10f3219267a365d9433f2f7d1694209c9d436c8d", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.11", + "phpunit/phpunit": "^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "HtmlParser\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oscar Otero", + "email": "oom@oscarotero.com", + "homepage": "http://oscarotero.com", + "role": "Developer" + } + ], + "description": "Parse html strings to DOMDocument", + "homepage": "https://github.com/oscarotero/html-parser", + "keywords": [ + "dom", + "html", + "parser" + ], + "support": { + "email": "oom@oscarotero.com", + "issues": "https://github.com/oscarotero/html-parser/issues", + "source": "https://github.com/oscarotero/html-parser/tree/v0.1.8" + }, + "time": "2023-11-29T20:28:41+00:00" + }, + { + "name": "php-di/invoker", + "version": "2.3.7", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/Invoker.git", + "reference": "3c1ddfdef181431fbc4be83378f6d036d59e81e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/3c1ddfdef181431fbc4be83378f6d036d59e81e1", + "reference": "3c1ddfdef181431fbc4be83378f6d036d59e81e1", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "psr/container": "^1.0|^2.0" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^9.0 || ^10 || ^11 || ^12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Invoker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Generic and extensible callable invoker", + "homepage": "https://github.com/PHP-DI/Invoker", + "keywords": [ + "callable", + "dependency", + "dependency-injection", + "injection", + "invoke", + "invoker" + ], + "support": { + "issues": "https://github.com/PHP-DI/Invoker/issues", + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.7" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + } + ], + "time": "2025-08-30T10:22:22+00:00" + }, + { + "name": "php-di/php-di", + "version": "7.1.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/PHP-DI.git", + "reference": "f88054cc052e40dbe7b383c8817c19442d480352" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/f88054cc052e40dbe7b383c8817c19442d480352", + "reference": "f88054cc052e40dbe7b383c8817c19442d480352", + "shasum": "" + }, + "require": { + "laravel/serializable-closure": "^1.0 || ^2.0", + "php": ">=8.0", + "php-di/invoker": "^2.0", + "psr/container": "^1.1 || ^2.0" + }, + "provide": { + "psr/container-implementation": "^1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3", + "friendsofphp/proxy-manager-lts": "^1", + "mnapoli/phpunit-easymock": "^1.3", + "phpunit/phpunit": "^9.6 || ^10 || ^11", + "vimeo/psalm": "^5|^6" + }, + "suggest": { + "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "DI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The dependency injection container for humans", + "homepage": "https://php-di.org/", + "keywords": [ + "PSR-11", + "container", + "container-interop", + "dependency injection", + "di", + "ioc", + "psr11" + ], + "support": { + "issues": "https://github.com/PHP-DI/PHP-DI/issues", + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.1.1" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", + "type": "tidelift" + } + ], + "time": "2025-08-16T11:10:48+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.5", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:41:33+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "slim/php-view", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/slimphp/PHP-View.git", + "reference": "ef1821663a6a028b9e446e8c6818fd257bf70313" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slimphp/PHP-View/zipball/ef1821663a6a028b9e446e8c6818fd257bf70313", + "reference": "ef1821663a6a028b9e446e8c6818fd257bf70313", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpunit/phpunit": "^9 || ^10", + "slim/psr7": "^1.6", + "squizlabs/php_codesniffer": "^3.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Slim\\Views\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Glenn Eggleton", + "email": "geggleto@gmail.com" + } + ], + "description": "Render PHP view scripts into a PSR-7 Response object.", + "keywords": [ + "framework", + "php", + "phtml", + "renderer", + "slim", + "template", + "view" + ], + "support": { + "issues": "https://github.com/slimphp/PHP-View/issues", + "source": "https://github.com/slimphp/PHP-View/tree/3.4.0" + }, + "time": "2024-07-19T18:54:54+00:00" + }, + { + "name": "slim/psr7", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/slimphp/Slim-Psr7.git", + "reference": "76e7e3b1cdfd583e9035c4c966c08e01e45ce959" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slimphp/Slim-Psr7/zipball/76e7e3b1cdfd583e9035c4c966c08e01e45ce959", + "reference": "76e7e3b1cdfd583e9035c4c966c08e01e45ce959", + "shasum": "" + }, + "require": { + "fig/http-message-util": "^1.1.5", + "php": "^8.0", + "psr/http-factory": "^1.1", + "psr/http-message": "^1.0 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "^1.0", + "psr/http-message-implementation": "^1.0 || ^2.0" + }, + "require-dev": { + "adriansuter/php-autoload-override": "^1.5|| ^2.0", + "ext-json": "*", + "http-interop/http-factory-tests": "^1.0 || ^2.0", + "php-http/psr7-integration-tests": "^1.5", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^9.6 || ^10", + "squizlabs/php_codesniffer": "^3.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "Slim\\Psr7\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Josh Lockhart", + "email": "hello@joshlockhart.com", + "homepage": "https://joshlockhart.com" + }, + { + "name": "Andrew Smith", + "email": "a.smith@silentworks.co.uk", + "homepage": "https://silentworks.co.uk" + }, + { + "name": "Rob Allen", + "email": "rob@akrabat.com", + "homepage": "https://akrabat.com" + }, + { + "name": "Pierre Berube", + "email": "pierre@lgse.com", + "homepage": "https://www.lgse.com" + } + ], + "description": "Strict PSR-7 implementation", + "homepage": "https://www.slimframework.com", + "keywords": [ + "http", + "psr-7", + "psr7" + ], + "support": { + "issues": "https://github.com/slimphp/Slim-Psr7/issues", + "source": "https://github.com/slimphp/Slim-Psr7/tree/1.8.0" + }, + "time": "2025-11-02T17:51:19+00:00" + }, + { + "name": "slim/slim", + "version": "4.15.2", + "source": { + "type": "git", + "url": "https://github.com/slimphp/Slim.git", + "reference": "e12cb05ca2a14e8f459d019e87a31dc915b80470" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slimphp/Slim/zipball/e12cb05ca2a14e8f459d019e87a31dc915b80470", + "reference": "e12cb05ca2a14e8f459d019e87a31dc915b80470", + "shasum": "" + }, + "require": { + "ext-json": "*", + "nikic/fast-route": "^1.3", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/container": "^1.0 || ^2.0", + "psr/http-factory": "^1.1", + "psr/http-message": "^1.1 || ^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "adriansuter/php-autoload-override": "^1.4 || ^2", + "ext-simplexml": "*", + "guzzlehttp/psr7": "^2.6", + "httpsoft/http-message": "^1.1", + "httpsoft/http-server-request": "^1.1", + "laminas/laminas-diactoros": "^2.17 || ^3", + "nyholm/psr7": "^1.8", + "nyholm/psr7-server": "^1.1", + "phpspec/prophecy": "^1.19", + "phpspec/prophecy-phpunit": "^2.1", + "phpstan/phpstan": "^1 || ^2", + "phpunit/phpunit": "^9.6 || ^10 || ^11 || ^12", + "slim/http": "^1.3", + "slim/psr7": "^1.6", + "squizlabs/php_codesniffer": "^3.10", + "vimeo/psalm": "^5 || ^6" + }, + "suggest": { + "ext-simplexml": "Needed to support XML format in BodyParsingMiddleware", + "ext-xml": "Needed to support XML format in BodyParsingMiddleware", + "php-di/php-di": "PHP-DI is the recommended container library to be used with Slim", + "slim/psr7": "Slim PSR-7 implementation. See https://www.slimframework.com/docs/v4/start/installation.html for more information." + }, + "type": "library", + "autoload": { + "psr-4": { + "Slim\\": "Slim" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Josh Lockhart", + "email": "hello@joshlockhart.com", + "homepage": "https://joshlockhart.com" + }, + { + "name": "Andrew Smith", + "email": "a.smith@silentworks.co.uk", + "homepage": "https://silentworks.co.uk" + }, + { + "name": "Rob Allen", + "email": "rob@akrabat.com", + "homepage": "https://akrabat.com" + }, + { + "name": "Pierre Berube", + "email": "pierre@lgse.com", + "homepage": "https://www.lgse.com" + }, + { + "name": "Gabriel Manricks", + "email": "gmanricks@me.com", + "homepage": "http://gabrielmanricks.com" + } + ], + "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", + "homepage": "https://www.slimframework.com", + "keywords": [ + "api", + "framework", + "micro", + "router" + ], + "support": { + "docs": "https://www.slimframework.com/docs/v4/", + "forum": "https://discourse.slimframework.com/", + "irc": "irc://irc.freenode.net:6667/slimphp", + "issues": "https://github.com/slimphp/Slim/issues", + "rss": "https://www.slimframework.com/blog/feed.rss", + "slack": "https://slimphp.slack.com/", + "source": "https://github.com/slimphp/Slim", + "wiki": "https://github.com/slimphp/Slim/wiki" + }, + "funding": [ + { + "url": "https://opencollective.com/slimphp", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slim/slim", + "type": "tidelift" + } + ], + "time": "2026-05-22T08:00:12+00:00" + }, + { + "name": "slim/twig-view", + "version": "3.4.1", + "source": { + "type": "git", + "url": "https://github.com/slimphp/Twig-View.git", + "reference": "b4268d87d0e327feba5f88d32031e9123655b909" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slimphp/Twig-View/zipball/b4268d87d0e327feba5f88d32031e9123655b909", + "reference": "b4268d87d0e327feba5f88d32031e9123655b909", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/http-message": "^1.1 || ^2.0", + "slim/slim": "^4.12", + "symfony/polyfill-php81": "^1.29", + "twig/twig": "^3.11" + }, + "require-dev": { + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/phpstan": "^1.10.59", + "phpunit/phpunit": "^9.6 || ^10", + "psr/http-factory": "^1.0", + "squizlabs/php_codesniffer": "^3.9" + }, + "type": "library", + "autoload": { + "psr-4": { + "Slim\\Views\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Josh Lockhart", + "email": "hello@joshlockhart.com", + "homepage": "http://joshlockhart.com" + }, + { + "name": "Pierre Berube", + "email": "pierre@lgse.com", + "homepage": "http://www.lgse.com" + } + ], + "description": "Slim Framework 4 view helper built on top of the Twig 3 templating component", + "homepage": "https://www.slimframework.com", + "keywords": [ + "framework", + "slim", + "template", + "twig", + "view" + ], + "support": { + "issues": "https://github.com/slimphp/Twig-View/issues", + "source": "https://github.com/slimphp/Twig-View/tree/3.4.1" + }, + "time": "2024-09-26T05:42:02+00:00" + }, + { + "name": "spatie/yaml-front-matter", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/yaml-front-matter.git", + "reference": "3066996d0e4ed74bcc22c261084a9df727bf7e36" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/yaml-front-matter/zipball/3066996d0e4ed74bcc22c261084a9df727bf7e36", + "reference": "3066996d0e4ed74bcc22c261084a9df727bf7e36", + "shasum": "" + }, + "require": { + "php": "^8.0", + "symfony/yaml": "^6.0|^7.0|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\YamlFrontMatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A to the point yaml front matter parser", + "homepage": "https://github.com/sebastiandedeyne/yaml-front-matter", + "keywords": [ + "front matter", + "jekyll", + "spatie", + "yaml" + ], + "support": { + "source": "https://github.com/spatie/yaml-front-matter/tree/2.1.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2025-11-24T16:17:28+00:00" + }, + { + "name": "symfony/console", + "version": "v7.4.15", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "088ec6fe0ef6819cbc301174093b6bfa4ad26930" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/088ec6fe0ef6819cbc301174093b6bfa4ad26930", + "reference": "088ec6fe0ef6819cbc301174093b6bfa4ad26930", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.4.15" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-27T13:51:00+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-05T06:23:12+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.41.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.41.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-28T08:25:59+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.38.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-25T13:48:31+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.38.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-27T06:59:30+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/6bfb9c766cacffbc8e118cb87217d08ed84e5cd7", + "reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-26T12:45:58+00:00" + }, + { + "name": "symfony/process", + "version": "v7.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "f5804be144caceb570f6747519999636b664f24c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/f5804be144caceb570f6747519999636b664f24c", + "reference": "f5804be144caceb570f6747519999636b664f24c", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-23T16:05:06+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/c0a284bab1ed8aa0417e3d69250ab437739563a0", + "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-16T09:55:08+00:00" + }, + { + "name": "symfony/string", + "version": "v7.4.15", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "e394af32256bf9e7bf80849d95e589167c10097b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/e394af32256bf9e7bf80849d95e589167c10097b", + "reference": "e394af32256bf9e7bf80849d95e589167c10097b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.4.15" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-28T07:33:02+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.4.15", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e101850ded5d2c0d44bf32abb8996404afec2dec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e101850ded5d2c0d44bf32abb8996404afec2dec", + "reference": "e101850ded5d2c0d44bf32abb8996404afec2dec", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.4.15" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2026-07-21T15:13:06+00:00" + }, + { + "name": "twig/twig", + "version": "v3.28.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "597c12ed286fb9d1701a36684ce6e0cbe28ebc8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/597c12ed286fb9d1701a36684ce6e0cbe28ebc8b", + "reference": "597c12ed286fb9d1701a36684ce6e0cbe28ebc8b", + "shasum": "" + }, + "require": { + "php": ">=8.1.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" + }, + "require-dev": { + "php-cs-fixer/shim": "^3.0@stable", + "phpstan/phpstan": "^2.0@stable", + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.28.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2026-07-03T20:44:34+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.4", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/416df702837983f8d5ff48c9c3fee4f5f57b980b", + "reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.4", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5", + "symfony/polyfill-ctype": "^1.26", + "symfony/polyfill-mbstring": "^1.26", + "symfony/polyfill-php80": "^1.26" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2026-07-06T19:11:50+00:00" + }, + { + "name": "voku/stop-words", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/stop-words.git", + "reference": "8e63c0af20f800b1600783764e0ce19e53969f71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/stop-words/zipball/8e63c0af20f800b1600783764e0ce19e53969f71", + "reference": "8e63c0af20f800b1600783764e0ce19e53969f71", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Stop-Words via PHP", + "keywords": [ + "stop words", + "stop-words" + ], + "support": { + "issues": "https://github.com/voku/stop-words/issues", + "source": "https://github.com/voku/stop-words/tree/master" + }, + "time": "2018-11-23T01:37:27+00:00" + } + ], + "packages-dev": [ + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.8.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.8.0" + }, + "time": "2026-07-04T14:30:18+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpcompatibility/php-compatibility", + "version": "9.3.5", + "source": { + "type": "git", + "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" + }, + "conflict": { + "squizlabs/php_codesniffer": "2.6.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "homepage": "https://github.com/wimg", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" + } + ], + "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", + "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", + "keywords": [ + "compatibility", + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibility" + }, + "time": "2019-12-27T09:44:58+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "12.5.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "186dab580576598076de6818596d12b61801880e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/186dab580576598076de6818596d12b61801880e", + "reference": "186dab580576598076de6818596d12b61801880e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.7.0", + "php": ">=8.3", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.1.2", + "sebastian/lines-of-code": "^4.0.1", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^2.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.28" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "12.5.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2026-06-01T13:24:19+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" + } + ], + "time": "2026-02-02T14:04:18+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^12.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:58+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:16+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "8.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:38+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "12.5.33", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "b98e028a26c5c5ba7e4a54be96ccf35f2914d184" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b98e028a26c5c5ba7e4a54be96ccf35f2914d184", + "reference": "b98e028a26c5c5ba7e4a54be96ccf35f2914d184", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-filter": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.5.7", + "phpunit/php-file-iterator": "^6.0.1", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.1", + "sebastian/comparator": "^7.1.8", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.1.2", + "sebastian/exporter": "^7.0.3", + "sebastian/global-state": "^8.0.3", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", + "sebastian/type": "^6.0.4", + "sebastian/version": "^6.0.0", + "staabm/side-effects-detector": "^1.0.5" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "12.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.33" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsoring.html", + "type": "other" + } + ], + "time": "2026-07-28T13:58:09+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "4.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "7d05781b13f7dec9043a629a21d086ed74582a15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/7d05781b13f7dec9043a629a21d086ed74582a15", + "reference": "7d05781b13f7dec9043a629a21d086ed74582a15", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" + } + ], + "time": "2026-05-17T05:29:34+00:00" + }, + { + "name": "sebastian/comparator", + "version": "7.1.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "7c65c1e79836812819705b473a90c12399542485" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/7c65c1e79836812819705b473a90c12399542485", + "reference": "7c65c1e79836812819705b473a90c12399542485", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.25" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2026-05-21T04:45:25+00:00" + }, + { + "name": "sebastian/complexity", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:46+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "name": "sebastian/environment", + "version": "8.1.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/9d32c685773823b1983e256ae4ecd48a10d6e439", + "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.3" }, - "provide": { - "ext-ctype": "*" + "require-dev": { + "phpunit/phpunit": "^12.5.26" }, "suggest": { - "ext-ctype": "For best performance" + "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-main": "8.1-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" + "Xdebug", + "environment", + "hhvm" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/8.1.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2026-05-25T13:40:20+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "name": "sebastian/exporter", + "version": "7.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", + "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/recursion-context": "^7.0.1" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-main": "7.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" + "export", + "exporter" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2026-05-20T04:37:17+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "name": "sebastian/global-state", + "version": "8.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b164d3274d6537ab462591c5755f76a8f5b1aae9", + "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0.1" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^12.5.28" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-main": "8.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" + "global state" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2026-06-01T15:10:33+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "name": "sebastian/lines-of-code", + "version": "4.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d543b8ef219dcd8da262cbb958639a96bedba10e", + "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" + "nikic/php-parser": "^5.7.0", + "php": ">=8.3" }, - "suggest": { - "ext-mbstring": "For best performance" + "require-dev": { + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-main": "4.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/lines-of-code", "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2026-05-19T16:22:07+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "v1.27.0", + "name": "sebastian/object-enumerator", + "version": "7.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-main": "7.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2025-02-07T04:57:48+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "name": "sebastian/object-reflector", + "version": "5.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-main": "5.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2025-02-07T04:58:17+00:00" }, { - "name": "symfony/process", - "version": "v5.4.19", + "name": "sebastian/recursion-context", + "version": "7.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "c5ba874c9b636dbccf761e22ce750e88ec3f55e1" + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c5ba874c9b636dbccf761e22ce750e88ec3f55e1", - "reference": "c5ba874c9b636dbccf761e22ce750e88ec3f55e1", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" } ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.19" + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2025-08-13T04:44:59+00:00" }, { - "name": "symfony/service-contracts", - "version": "v2.5.2", + "name": "sebastian/type", + "version": "6.0.4", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "82ff822c2edc46724be9f7411d3163021f602773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/82ff822c2edc46724be9f7411d3163021f602773", + "reference": "82ff822c2edc46724be9f7411d3163021f602773", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" + "php": ">=8.3" }, - "suggest": { - "symfony/service-implementation": "" + "require-dev": { + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "dev-main": "6.0-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/6.0.4" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2026-05-20T06:45:45+00:00" }, { - "name": "symfony/string", - "version": "v5.4.19", + "name": "sebastian/version", + "version": "6.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "0a01071610fd861cc160dfb7e2682ceec66064cb" + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/0a01071610fd861cc160dfb7e2682ceec66064cb", - "reference": "0a01071610fd861cc160dfb7e2682ceec66064cb", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "conflict": { - "symfony/translation-contracts": ">=3.0" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" + "php": ">=8.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", "support": { - "source": "https://github.com/symfony/string/tree/v5.4.19" + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2025-02-07T05:00:38+00:00" }, { - "name": "symfony/yaml", - "version": "v5.4.19", + "name": "squizlabs/php_codesniffer", + "version": "3.13.5", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "71c05db20cb9b54d381a28255f17580e2b7e36a5" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/71c05db20cb9b54d381a28255f17580e2b7e36a5", - "reference": "71c05db20cb9b54d381a28255f17580e2b7e36a5", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<5.3" + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" }, "require-dev": { - "symfony/console": "^5.3|^6.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, "bin": [ - "Resources/bin/yaml-lint" + "bin/phpcbf", + "bin/phpcs" ], "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Greg Sherwood", + "role": "Former lead" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.19" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/PHPCSStandards", + "type": "github" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/jrfnl", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2023-01-10T18:51:14+00:00" + "time": "2025-11-04T16:30:35+00:00" }, { - "name": "twig/twig", - "version": "v3.5.1", + "name": "staabm/side-effects-detector", + "version": "1.0.5", "source": { "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "a6e0510cc793912b451fd40ab983a1d28f611c15" + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/a6e0510cc793912b451fd40ab983a1d28f611c15", - "reference": "a6e0510cc793912b451fd40ab983a1d28f611c15", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" }, "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.5-dev" - } - }, "autoload": { - "psr-4": { - "Twig\\": "src/" - } + "classmap": [ + "lib/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } + "MIT" ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", + "description": "A static analysis tool to detect side effects in PHP code", "keywords": [ - "templating" + "static analysis" ], "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.5.1" + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" }, "funding": [ { - "url": "https://github.com/fabpot", + "url": "https://github.com/staabm", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" } ], - "time": "2023-02-08T07:49:20+00:00" + "time": "2024-10-20T05:08:20+00:00" }, { - "name": "vlucas/phpdotenv", - "version": "v3.6.10", + "name": "theseer/tokenizer", + "version": "2.0.1", "source": { "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "5b547cdb25825f10251370f57ba5d9d924e6f68e" + "url": "https://github.com/theseer/tokenizer.git", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/5b547cdb25825f10251370f57ba5d9d924e6f68e", - "reference": "5b547cdb25825f10251370f57ba5d9d924e6f68e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", "shasum": "" }, "require": { - "php": "^5.4 || ^7.0 || ^8.0", - "phpoption/phpoption": "^1.5.2", - "symfony/polyfill-ctype": "^1.17" - }, - "require-dev": { - "ext-filter": "*", - "ext-pcre": "*", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.21" - }, - "suggest": { - "ext-filter": "Required to use the boolean validator.", - "ext-pcre": "Required to use most of the library." + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^8.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.6-dev" - } - }, "autoload": { - "psr-4": { - "Dotenv\\": "src/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1996,105 +5411,108 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "https://github.com/vlucas" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" } ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", - "keywords": [ - "dotenv", - "env", - "environment" - ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { - "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v3.6.10" + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", + "url": "https://github.com/theseer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", - "type": "tidelift" } ], - "time": "2021-12-12T23:02:06+00:00" + "time": "2025-12-08T11:19:18+00:00" }, { - "name": "voku/stop-words", - "version": "2.0.1", + "name": "yoast/phpunit-polyfills", + "version": "4.0.0", "source": { "type": "git", - "url": "https://github.com/voku/stop-words.git", - "reference": "8e63c0af20f800b1600783764e0ce19e53969f71" + "url": "https://github.com/Yoast/PHPUnit-Polyfills.git", + "reference": "134921bfca9b02d8f374c48381451da1d98402f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/stop-words/zipball/8e63c0af20f800b1600783764e0ce19e53969f71", - "reference": "8e63c0af20f800b1600783764e0ce19e53969f71", + "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/134921bfca9b02d8f374c48381451da1d98402f9", + "reference": "134921bfca9b02d8f374c48381451da1d98402f9", "shasum": "" }, "require": { - "php": ">=7.0.0" + "php": ">=7.1", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.0 || ^11.0 || ^12.0" }, "require-dev": { - "phpunit/phpunit": "~6.0" + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "yoast/yoastcs": "^3.1.0" }, "type": "library", - "autoload": { - "psr-4": { - "voku\\": "src/voku/" + "extra": { + "branch-alias": { + "dev-main": "4.x-dev" } }, + "autoload": { + "files": [ + "phpunitpolyfills-autoload.php" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" + "name": "Team Yoast", + "email": "support@yoast.com", + "homepage": "https://yoast.com" + }, + { + "name": "Contributors", + "homepage": "https://github.com/Yoast/PHPUnit-Polyfills/graphs/contributors" } ], - "description": "Stop-Words via PHP", + "description": "Set of polyfills for changed PHPUnit functionality to allow for creating PHPUnit cross-version compatible tests", + "homepage": "https://github.com/Yoast/PHPUnit-Polyfills", "keywords": [ - "stop words", - "stop-words" + "phpunit", + "polyfill", + "testing" ], "support": { - "issues": "https://github.com/voku/stop-words/issues", - "source": "https://github.com/voku/stop-words/tree/master" + "issues": "https://github.com/Yoast/PHPUnit-Polyfills/issues", + "security": "https://github.com/Yoast/PHPUnit-Polyfills/security/policy", + "source": "https://github.com/Yoast/PHPUnit-Polyfills" }, - "time": "2018-11-23T01:37:27+00:00" + "time": "2025-02-09T18:58:54+00:00" } ], - "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.4.0", + "php": ">=8.3.0", "ext-json": "*", "ext-pdo": "*", - "ext-sqlite3": "*", + "ext-pdo_mysql": "*", "ext-fileinfo": "*", - "ext-mbstring": "*" + "ext-mbstring": "*", + "ext-dom": "*", + "ext-gd": "*" }, "platform-dev": { "ext-intl": "*" }, "platform-overrides": { - "php": "7.4.0" + "php": "8.3.0" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/docker-compose.yml b/docker-compose.yml index 7a35c85c..5d2c3ac4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,14 +1,40 @@ version: '3' services: + mysql: + image: mysql:8.0 + environment: + MYSQL_DATABASE: modxdocs + MYSQL_USER: modxdocs + MYSQL_PASSWORD: secret + MYSQL_ROOT_PASSWORD: rootsecret + volumes: + - modxdocs_db:/var/lib/mysql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] + interval: 5s + timeout: 5s + retries: 10 + docs: build: context: . dockerfile: Dockerfile ports: - "8000:80" + depends_on: + mysql: + condition: service_healthy environment: - docker=1 - COMPOSER_ALLOW_SUPERUSER=1 + - DB_HOST=mysql + - DB_PORT=3306 + - DB_NAME=modxdocs + - DB_USER=modxdocs + - DB_PASSWORD=secret volumes: - .:/var/www/html + +volumes: + modxdocs_db: diff --git a/lang.json b/lang.json index 16ed5fa2..d2a56869 100644 --- a/lang.json +++ b/lang.json @@ -13,7 +13,14 @@ "note": "Note:", "community_forum": "Community Forums", "slack": "Slack", - "credit": "Designed, built and written with all the love in the world by the MODX Community." + "credit": "Designed, built and written with all the love in the world by the MODX Community.", + "not_found_title": "Oops, page not found.", + "not_found_heading": "Page not found", + "not_found_intro": "Uh oh, you've reached a page that does not exist.", + "not_found_body": "It may have gotten lost on the new documentation platform or it was removed because it was no longer relevant. It could also be a really old link from two (or more) documentation systems ago, which is not part of the 2000+ automatic redirects currently in place.", + "not_found_suggestions": "Based on your request, this may be what you're looking for:", + "not_found_more_results": "More results for \"%s\"", + "not_found_use_search": "Please use the search at the top to find what you're looking for." }, "ru": { "title": "MODX документация", @@ -29,7 +36,14 @@ "note": "Заметка:", "community_forum": "Community Forums", "slack": "Slack", - "credit": "Разработано, построено и написано со всей любовью в мире от сообщества MODX." + "credit": "Разработано, построено и написано со всей любовью в мире от сообщества MODX.", + "not_found_title": "Упс, страница не найдена.", + "not_found_heading": "Страница не найдена", + "not_found_intro": "К сожалению, вы попали на страницу, которой не существует.", + "not_found_body": "Возможно, она потерялась на новой платформе документации или была удалена, так как больше не актуальна. Это также может быть очень старая ссылка из двух (или более) предыдущих систем документации, которая не входит в число 2000+ автоматических перенаправлений.", + "not_found_suggestions": "Исходя из вашего запроса, возможно, вы ищете следующее:", + "not_found_more_results": "Больше результатов по запросу «%s»", + "not_found_use_search": "Воспользуйтесь поиском вверху страницы, чтобы найти нужную информацию." }, "nl": { "title": "MODX Documentatie", @@ -45,7 +59,14 @@ "note": "Opmerking:", "community_forum": "Community Forums", "slack": "Slack", - "credit": "Ontworpen, gebouwd en geschreven met alle liefde in de wereld door de MODX Community." + "credit": "Ontworpen, gebouwd en geschreven met alle liefde in de wereld door de MODX Community.", + "not_found_title": "Oeps, pagina niet gevonden.", + "not_found_heading": "Pagina niet gevonden", + "not_found_intro": "Helaas, je hebt een pagina bereikt die niet bestaat.", + "not_found_body": "Hij is mogelijk zoekgeraakt op het nieuwe documentatieplatform of verwijderd omdat hij niet langer relevant was. Het kan ook een heel oude link zijn van twee (of meer) documentatiesystemen geleden, die niet tot de 2000+ automatische redirects behoort die momenteel actief zijn.", + "not_found_suggestions": "Op basis van je verzoek zou dit kunnen zijn wat je zoekt:", + "not_found_more_results": "Meer resultaten voor \"%s\"", + "not_found_use_search": "Gebruik de zoekfunctie bovenaan om te vinden wat je zoekt." }, "es": { "title": "MODX Documentation", @@ -61,6 +82,13 @@ "note": "Nota:", "community_forum": "Community Forums", "slack": "Slack", - "credit": "Designed, built and written with all the love in the world by the MODX Community." + "credit": "Designed, built and written with all the love in the world by the MODX Community.", + "not_found_title": "Vaya, página no encontrada.", + "not_found_heading": "Página no encontrada", + "not_found_intro": "Oh no, has llegado a una página que no existe.", + "not_found_body": "Puede que se haya perdido en la nueva plataforma de documentación o que se haya eliminado porque ya no era relevante. También podría ser un enlace muy antiguo de hace dos (o más) sistemas de documentación, que no forma parte de las más de 2000 redirecciones automáticas actuales.", + "not_found_suggestions": "Según tu solicitud, esto podría ser lo que buscas:", + "not_found_more_results": "Más resultados para \"%s\"", + "not_found_use_search": "Usa la búsqueda de arriba para encontrar lo que buscas." } } diff --git a/phpcs.xml b/phpcs.xml new file mode 100644 index 00000000..4290af21 --- /dev/null +++ b/phpcs.xml @@ -0,0 +1,41 @@ + + + docs.modx.com ruleset + + + + + + + + + src + + + */vendor/* + + + + + + + + + + public/index.php + + + + + + + + + + + + + + + + diff --git a/phpunit.xml b/phpunit.xml index ec1fd4f3..d5ddbaad 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,7 +1,19 @@ - + + tests + + + src + + diff --git a/public/.well-known/traffic-advice b/public/.well-known/traffic-advice new file mode 100644 index 00000000..d616d010 --- /dev/null +++ b/public/.well-known/traffic-advice @@ -0,0 +1,6 @@ +[ + { + "user_agent": "prefetch-proxy", + "fraction": 1.0 + } +] diff --git a/public/ads.txt b/public/ads.txt new file mode 100644 index 00000000..3cec0626 --- /dev/null +++ b/public/ads.txt @@ -0,0 +1 @@ +# This site does not sell advertising inventory. diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png new file mode 100644 index 00000000..dd7fca58 Binary files /dev/null and b/public/apple-touch-icon-precomposed.png differ diff --git a/public/fonts/Inter_24pt-Bold.ttf b/public/fonts/Inter_24pt-Bold.ttf new file mode 100644 index 00000000..46b3583c Binary files /dev/null and b/public/fonts/Inter_24pt-Bold.ttf differ diff --git a/public/fonts/Inter_24pt-Regular.ttf b/public/fonts/Inter_24pt-Regular.ttf new file mode 100644 index 00000000..6b088a71 Binary files /dev/null and b/public/fonts/Inter_24pt-Regular.ttf differ diff --git a/public/ht.access b/public/ht.access index f5d19695..7732f427 100644 --- a/public/ht.access +++ b/public/ht.access @@ -1,3 +1,16 @@ +# Chrome Private Prefetch Proxy requires this exact media type. + + + ForceType application/trafficadvice+json + + + + + + Header set Cache-Control "public, max-age=86400" + + + RewriteEngine On diff --git a/public/images/logo-dark.svg b/public/images/logo-dark.svg new file mode 100644 index 00000000..2536ce3a --- /dev/null +++ b/public/images/logo-dark.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/social/.background.png b/public/images/social/.background.png new file mode 100644 index 00000000..8fd79683 Binary files /dev/null and b/public/images/social/.background.png differ diff --git a/public/index.php b/public/index.php index 342030de..2a64340e 100644 --- a/public/index.php +++ b/public/index.php @@ -1,4 +1,5 @@ code{padding:0}code[class*=language-],pre[class*=language-]{border-radius:.5rem;font-size:.775rem !important;line-height:1.5 !important}blockquote{display:block;margin:0 0 .9375rem;padding:.9375rem 1.25rem;background-color:#f9fbfe;border-left:.1875rem solid #5b99ea;color:#4a5568}blockquote a{color:#1c6fdc}blockquote>:last-child{margin-bottom:0}iframe,object,video{max-width:100%}html,body{height:100%;width:100%;background:#fff;scroll-behavior:smooth}.l-app{display:flex;min-height:100vh;flex-direction:column;padding-top:3.75rem;background:#fff}@media print,screen and (min-width: 62.5em){.l-app--has-sidebar{padding-left:20rem}}.l-header{z-index:2;position:fixed;top:0;right:0;left:0;display:flex;align-items:center;justify-content:space-between;height:3.75rem;background:#fff;border-bottom:1px solid #c5d3df;box-shadow:0 1px 4px 0 rgba(0,0,0,.1)}.l-header__logo{flex:auto 0 0;position:relative}@media screen and (min-width: 76.25em){.l-header__logo{flex:20rem 0 0;flex:calc(20rem - 1.875rem) 0 0}}.l-header__search{flex-basis:50%;flex-grow:0;flex-shrink:1;position:relative}@media screen and (min-width: 76.25em){.l-header__search{margin:0 3.125rem 0 4.6875rem}}@media screen and (max-width: 43.74875em){.l-header__search{position:fixed;width:100%;margin:0 !important;top:3.75rem;background:#fff;height:calc(100vh - 2.25rem);padding:0 1rem 1rem 1rem;transform:translateY(100%);transition:transform .4s ease-in-out}}.l-header__versionswitch{margin:0 .9375rem}@media screen and (max-width: 43.74875em){#searchform:target{transform:translateY(0)}}.l-sidebar{outline:none;display:block;position:fixed;top:3.75rem;bottom:0;left:0;width:100%;transform:translateX(-100%);z-index:1;padding:1.875rem 1.25rem .9375rem;background:#f5f7f9;border-right:1px solid #e6ecf1;overflow-y:scroll;-webkit-overflow-scrolling:touch;overflow-x:auto;transition:transform .4s ease-in-out}@media print,screen and (min-width: 62.5em){.l-sidebar{display:block;position:fixed;top:3.75rem;bottom:0;left:0;width:20rem;transform:translateX(0);transition:none}}#nav:target{transform:translateX(0)}.l-main{position:relative;margin:1.875rem 1.25rem .9375rem;flex:1}@media print,screen and (min-width: 43.75em){.l-main{margin:1.875rem 3.125rem .9375rem 4.6875rem}}.l-main__title{max-width:62.5rem}@media screen and (min-width: 76.25em){.l-main__contentwrapper{display:flex;justify-content:flex-start;flex-direction:row}}@media print,screen and (min-width: 43.75em){.l-main__content{padding-right:1.5625rem}}@media screen and (min-width: 76.25em){.l-main__content{flex-basis:80%;flex-grow:0;flex-shrink:1;order:1;min-width:0}}.l-main__content>:first-child{margin-top:0}@media screen and (min-width: 76.25em){.l-main__toc{flex-basis:20%;flex-grow:1;flex-shrink:0;align-self:flex-start;order:2;padding:0 0 0 1.5625rem;top:4.6875rem;position:sticky}}.l-footer{flex-basis:100%;flex-shrink:0;order:3;padding:1.875rem .9375rem .9375rem;margin:2.8125rem 0 0;border-top:1px solid #e6ecf1}@media print,screen and (min-width: 43.75em){.l-footer{padding:1.875rem 4.6875rem .9375rem}}@media(max-width: 768px){.o-openmenu{order:4;padding:0 .9375rem 0 .9375rem !important}.o-search,.l-header__search{order:3;margin:0 .475rem 0 auto}.l-header__versionswitch{order:2}.l-header__logo{order:1;max-width:25%}}@media(max-width: 425px){.l-footer{font-size:14px;line-height:1;padding:.9375rem .9375rem}.l-footer .c-footer__nav{display:flex;justify-content:center}.l-footer .c-footer__navlink{padding:.425rem}.l-footer .c-footer__copyright{font-size:14px;line-height:1;padding:.3rem .9375rem 0;text-align:center}}.o-logo{margin:0 .9375rem;padding:0}.o-logo__image{display:block;width:10.625rem;max-width:100%;height:3.75rem;fill:#4a5568}@media print,screen and (min-width: 43.75em){.o-logo__image{width:12.5rem}}.o-docmeta{margin:-0.9375rem 0 1.875rem}.o-sidebar-heading{display:block;margin:0 0 .9375rem;font-size:1.25rem;font-weight:700}.o-openmenu,.o-search{display:block;margin:0;padding:0 .9375rem 0 1.875rem}.o-openmenu__icon,.o-search__icon{display:block;width:1.8125rem;height:3.75rem;fill:#4a5568}@media print,screen and (min-width: 62.5em){.o-openmenu{display:none}}@media print,screen and (min-width: 43.75em){.o-search{display:none}}@media screen and (max-width: 43.74875em){.o-logo{margin:0 .4375rem}.o-search{padding:0 .4375rem}}.o-closemenu{z-index:1;position:absolute;top:.625rem;right:.625rem;display:block;padding:.9375rem .9375rem}@media print,screen and (min-width: 62.5em){.o-closemenu{display:none}}.o-closemenu__icon{display:block;width:1.875rem;height:1.875rem;fill:#3b68af}.c-breadcrumb{margin:0 0 .9375rem}.c-breadcrumb__list{display:flex;flex-direction:row;flex-wrap:wrap;margin:0 -0.3125rem;padding:0;list-style:none}.c-breadcrumb__item{display:block;flex:auto 0 0}.c-breadcrumb__link{display:inline-block;padding:.25rem .3125rem;line-height:1.4;font-size:.875rem;color:#4a5568}.c-breadcrumb__item+.c-breadcrumb__item:before{content:"";display:inline-block;width:.625rem;height:.6875rem;margin-left:.3125rem;margin-right:-0.0625rem;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 62'%3E%3Cpath fill='%234a5568' fill-rule='nonzero' d='M7.5938.39064L.6562 7.60939l24.25 23.40623-24.25 23.375 6.9376 7.2187 28-26.9999 3.75-3.5938-3.75-3.62498z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-size:100% 100%;background-position:center center;opacity:.25}.c-callout{color:#4a5568;display:block;margin:0 0 .9375rem;padding:.9375rem 1.25rem;background-color:#f9fbfe;border-left:.1875rem solid #5b99ea}.c-callout a{color:#1c6fdc}.c-callout__title{display:block;margin:0 0 .3125rem;text-transform:uppercase;letter-spacing:1.1}.c-callout a:hover{color:#5a99ea}.c-callout--info{background-color:#f9fbfe;border-color:#5b99ea}.c-callout--info a{color:#1c6fdc}.c-callout--warning{background-color:#fdf6e5;border-color:#eebf41}.c-callout--warning a{color:#d09c13}.c-callout--alert{background-color:#f5f5f5;border-color:#d26d69}.c-callout--alert a{color:#d26d69}.c-callout--success{background-color:#e7f4eb;border-color:#5cb377}.c-callout--success a{color:#3e8554}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.command-line-prompt{border-right:1px solid #999;display:block;float:left;font-size:100%;letter-spacing:-1px;margin-right:1em;pointer-events:none;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none}.command-line-prompt>span:before{opacity:.7;content:" ";display:block;padding-right:.8em}.command-line-prompt>span[data-user]:before{content:"[" attr(data-user) "@" attr(data-host) "] $"}.command-line-prompt>span[data-user=root]:before{content:"[" attr(data-user) "@" attr(data-host) "] #"}.command-line-prompt>span[data-prompt]:before{content:attr(data-prompt)}.command-line-prompt>span[data-continuation-prompt]:before{content:attr(data-continuation-prompt)}.command-line span.token.output{opacity:.7}pre[data-line]{position:relative;padding:1em 0 1em 3em}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:hsla(24, 20%, 50%, 0.08);background:linear-gradient(to right, hsla(24, 20%, 50%, 0.1) 70%, hsla(24, 20%, 50%, 0));pointer-events:none;line-height:inherit;white-space:pre}@media print{.line-highlight{-webkit-print-color-adjust:exact;color-adjust:exact}}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:hsla(24, 20%, 50%, 0.4);color:hsl(24, 20%, 95%);font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px white}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:before,.line-numbers .line-highlight:after{content:none}pre[id].linkable-line-numbers span.line-numbers-rows{pointer-events:all}pre[id].linkable-line-numbers span.line-numbers-rows>span:before{cursor:pointer}pre[id].linkable-line-numbers span.line-numbers-rows>span:hover:before{background-color:rgba(128, 128, 128, 0.2)}pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224, 224, 224, 0.2);box-shadow:0 2px 0 0 rgba(0, 0, 0, 0.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus{color:inherit;text-decoration:none}.token.operator{background:none}.c-history{display:flex;align-items:center;margin:-0.9375rem 0 1.875rem}.c-contributors{display:flex}.c-contributor{width:30px;height:30px;margin-left:-10px;border:2px solid #fff;border-radius:15px}.c-contributor:first-child{margin-left:0}.c-last-edit{max-width:100%;margin-bottom:0;padding-left:.5em;font-size:.9em;font-weight:500;color:#555;flex:1}.c-footer__grid{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.c-footer__cell{width:100%}@media print,screen and (min-width: 62.5em){.c-footer__cell{width:auto}}.c-footer__copyright{color:#4a5568}.c-footer__nav{margin:0 -0.625rem;padding:0;list-style:none}.c-footer__navitem{display:inline-block}.c-footer__navlink{display:block;font-weight:700;padding:.625rem;color:#4a5568}.c-footer__navlink:hover{color:#3b68af}.heading-link{display:inline-block;margin-left:.67em;transition:opacity .25s ease-in-out;opacity:0;font-size:.8em;bottom:.2em}h1:hover .heading-link,h2:hover .heading-link,h3:hover .heading-link,h4:hover .heading-link,h5:hover .heading-link,h6:hover .heading-link{opacity:1}@media screen and (min-width: 43.75em){h1,h2,h3,h4,h5,h6{position:relative;margin-left:-3rem;padding-left:3rem}h1:target .heading-link,h2:target .heading-link,h3:target .heading-link,h4:target .heading-link,h5:target .heading-link,h6:target .heading-link{opacity:1}.heading-link{left:0;position:absolute}}.c-nav{margin:0 0 0 -1.25rem;padding:0;list-style:none}.c-nav__item{margin:0;padding:0;list-style:none;font-size:.9375rem;line-height:1.4}.c-nav__item a{position:relative;display:block;margin-bottom:.625rem;padding:0 0 0 1.25rem;text-decoration:none;font-weight:500;color:#475365;transition:all .2s ease}.c-nav__item a:hover{color:#5a99ea;transform:translateX(2px)}.c-nav__item--activepage .c-nav__chevron{top:.35rem}.c-nav__item--activepage>a{position:relative;color:#247978;padding:.35rem 0 .35rem 3.5rem;transition:all .2s ease}.c-nav__item--activepage>a:after,.c-nav__item--activepage>a:before{border:0 solid #e2e8f0}.c-nav__item--activepage>a:hover{transform:translateX(0)}.c-nav__item--activepage>a .inset{top:0;right:0;bottom:0;left:0;position:absolute;border-radius:.25rem;opacity:.25;background-color:#b2f5ea}.c-nav__item--level1>a{font-size:1rem;font-weight:700;padding-left:1.875rem}.c-nav__item--level2>a{padding-left:3.125rem}.c-nav__item--level3>a{padding-left:3.75rem}.c-nav__item--level4>a{padding-left:5rem}.c-nav__item--level5>a{padding-left:6.25rem}.c-nav__item--level6>a{padding-left:7.5rem}.c-nav__item--level7>a{padding-left:8.75rem}.c-nav__item--collapsed>ul{display:none}.c-nav__item--collapsed>a>.c-nav__chevron{top:.0625rem;transform:rotate(90deg)}.c-nav__chevron{display:inline-block;position:absolute;top:0;height:1.3125rem;width:1.3125rem;padding:.3125rem;margin:0 0 0 -1.4375rem;fill:rgba(74,85,104,.6);transform:rotate(-90deg);vertical-align:middle}.c-nav__sublist{margin:0 0 1.875rem;padding:0}::-webkit-scrollbar,::-webkit-scrollbar-thumb{width:1rem;height:1rem;border:.25rem solid rgba(0,0,0,0);border-radius:.5rem;background-color:rgba(0,0,0,0)}::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem rgba(85,108,136,.1)}::-webkit-scrollbar-thumb:hover{box-shadow:inset 0 0 0 1rem rgba(85,108,136,.2)}::-webkit-resizer,::-webkit-scrollbar-corner{background-color:rgba(0,0,0,0)}.l-main__oc,.c-oc__more{display:none}@media screen and (min-width: 76.25em){.l-main__oc,.c-oc__more{display:block}}.l-main__oc--below,.c-oc__more--below{display:block}@media screen and (min-width: 76.25em){.l-main__oc--below,.c-oc__more--below{display:none}}.l-main__oc{margin-top:5em;background:#f5f7f9;color:#303942;padding:1em;border-radius:1em;border:1px solid rgba(0,0,0,0);transition:background-color .5s ease-in-out;text-decoration:none !important;max-width:25rem}@media screen and (min-width: 76.25em){.l-main__oc{margin-left:-1.5625rem}}.l-main__oc .c-oc__member_image{transition:border .5s ease-in-out}.l-main__oc:hover{color:#303942;background:#e3efff}.l-main__oc:hover .c-oc__member_image{border-color:#e3efff}.c-oc__logo{max-width:100%;max-height:60px}.c-oc__text{font-size:.8125rem;font-weight:500}.c-oc__subtitle{font-size:.8125rem;font-weight:700;text-transform:uppercase}.c-oc__members{padding-left:0;list-style:none;margin-bottom:25px;padding-right:25px;margin-left:-28px;margin-right:-35px;text-align:center}.c-oc__member{display:inline-block;margin-right:-20px;margin-bottom:-15px}.c-oc__member_image{width:60px;height:60px;border-radius:50%;border:5px solid #f5f7f9;background:#00b5de}.c-oc__total span{height:60px;background:#00b5de;border-radius:30px;border:5px solid #f5f7f9;color:#fff;padding:.7em 1em;font-weight:600;display:block}.c-oc__more{text-align:center;font-size:.8125rem;font-weight:500;text-decoration:underline;margin-top:1em;margin-left:-1em;max-width:25rem}.c-optionswitch__current{display:block;padding:.4375rem .625rem;color:#4a5568;white-space:nowrap;background:#fff;transition:background-color .2s ease-in-out;border-radius:.1875rem}.c-optionswitch__current:hover{color:#4a5568;background:#fff}.c-optionswitch__currentchevron{display:inline-block;width:.625rem;height:.625rem;fill:#4a5568;vertical-align:middle;margin:-0.0625rem 0 0 .1875rem;transform:rotate(90deg)}.c-optionswitch__listwrapper{position:absolute;top:3.6875rem;display:none;background:#edf2f7;box-shadow:0 .1875rem .5rem 0 rgba(116,129,141,.1)}@media screen and (min-width: 81.25em){.c-optionswitch__listwrapper{right:0}}@media screen and (max-width: 90em){.c-optionswitch__listwrapper{right:0}}@media screen and (max-width: 48em){.c-optionswitch__listwrapper{right:0}}.c-optionswitch__listwrapper:target{display:block}@media screen and (min-width: 43.75em){.c-optionswitch__listwrapper:target{display:flex}}.c-optionswitch__listwrapper:target:before{content:none}.c-optionswitch__list{margin:0;padding:0;list-style:none}.c-optionswitch__item{position:relative;display:block}.c-optionswitch__link{display:block;padding:.25rem .625rem;color:#4a5568;transition-duration:.2s;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-property:background-color,border-color,color}.c-optionswitch__link:hover{color:#4a5568;background:#fff}.c-optionswitch__item--active .c-optionswitch__link{background:#fff}.c-optionswitch__translation{color:#2a303b}.c-optionswitch__translation:before{content:"("}.c-optionswitch__translation:after{content:")"}.c-optionswitch__note{padding:0 .625rem .625rem;color:#2a303b}.l-main-search__container{list-style:none;padding:0;margin-bottom:2rem}.l-main-search__result,.l-live-search__result{border-top:1px solid #fff;padding-top:1rem;margin-top:1rem}.l-main-search__result .c-breadcrumb,.l-live-search__result .c-breadcrumb{margin-bottom:0}.l-main-search__result h4,.l-live-search__result h4{margin-top:0;margin-bottom:0}@media screen and (max-width: 43.74875em){.l-main-search__result:first-child,.l-live-search__result:first-child{border-top:none}}.l-main-search__match summary,.l-live-search__match summary{float:right;color:#777}.l-search__pagination-holder{list-style:none;padding:0;text-align:center}.l-search-page{display:inline-block}.l-search-page__link{display:block;cursor:pointer;padding:.5rem 1rem;line-height:initial;background:#e2e8f0;color:#1a202c;border-radius:.25rem;border:1px solid #e2e8f0}.l-search-page__link:hover,.l-search-page__link:focus{background:#475365;border:1px solid #475365;color:#ededed}.l-search-page__link--active{background:#314a97;border:1px solid #314a97;color:#ededed}.c-searchform--resultspage{margin-bottom:1rem}.c-searchform--resultspage .c-searchform__input{border:1px solid #fff}.l-search__meta{color:#4a5568}.l-search__ignored{border-left:.5rem solid #eebf41;padding:.9375rem 1.25rem;background-color:rgba(238,191,65,.3);color:#2c2104}.l-search__tip{border-left:.5rem solid #3b68af;padding:.9375rem 1.25rem;background-color:rgba(59,104,175,.3);color:#000}.l-search__no_results{border-left:.25rem solid #d26d69;padding:.9375rem 1.25rem;background-color:rgba(210,109,105,.3);color:#2e0f0e;max-width:100%}.l-search__no_results--live{margin:0}.c-searchform--header{z-index:5}.l-live-search__container{position:absolute;background:#fff;width:100%;display:none;border-radius:0 0 5px 5px;margin-top:-3px;z-index:4;box-shadow:0 2px 7px 2px rgba(0,0,0,.5)}.l-live-search__container--visible{display:block}.l-live-search__container--loading::before{content:"Loading...";width:100%;display:block;padding:.5em .5em .5em 1em;border-radius:5px 5px 0 0;color:#4a5568;background:#fff}.l-live-search__container--loading:empty::before{border-radius:5px}@media screen and (max-width: 43.74875em){.l-live-search__container{position:initial;margin-top:1em;border-radius:7px;box-shadow:none;border:1px solid #3b68af}}.l-live-search__results{list-style:none;padding:0;margin:0;max-height:70vh;overflow-y:scroll}@media screen and (max-width: 43.74875em){.l-live-search__results{max-height:calc(100vh - 15rem)}}.l-live-search__result,.l-main-search__result{padding:0;margin:0;position:relative}.c-live-search__result-crumbs,.l-main-search__crumbs{position:absolute;top:.7rem;white-space:nowrap;text-overflow:ellipsis;padding:0 1rem;height:1.6em;overflow:hidden;font-weight:500}.c-live-search__result-link,.l-main-search__link{color:#314a97;display:block;padding:2.2rem 1rem .7rem;font-weight:500}.c-live-search__result-link:hover,.c-live-search__result-link:focus,.l-live-search__result--selected .c-live-search__result-link,.l-main-search__link:hover,.l-main-search__link:focus,.l-live-search__result--selected .l-main-search__link{background:#f0f6ff}.l-live-search__search{margin:0}.l-live-search__search a{font-weight:500;display:block;padding:.7rem 1rem;width:100%;color:#4a5568;background:#fff;border-radius:0 0 5px 5px}.l-main-search__result{max-width:80ch}.l-main-search__title{color:#314a97}.l-main-search__link{text-decoration:none !important}.l-main-search__link:hover .l-main-search__title,.l-main-search__link:focus .l-main-search__title{color:#5a99ea}.l-main-search__snippet{color:#4a5568}.size_code{font-size:1em}.c-searchform{position:relative;width:100%}@media screen and (max-width: 43.74875em){.c-searchform{margin-top:1rem}}.c-searchform__input{display:block;width:100%;border:none;border-radius:.5rem;padding:.625rem 2.1875rem .625rem 1.25rem;line-height:1.5 !important;font-family:inherit;font-size:100%;transition:all .1s ease-in;background-color:#edf2f7}.c-searchform__input:focus{border-color:#e2e8f0;background-color:#fff}@media screen and (max-width: 43.74875em){.c-searchform__input{border:1px solid #fff}}.c-searchform__button{position:absolute;top:0;right:.625rem;bottom:0;margin:0;padding:0;background:rgba(0,0,0,0);border:none}.c-searchform__icon{width:1.5rem;height:1.25rem;fill:#717171;vertical-align:middle}#searchform:target:before{content:"";height:0;margin:0}table{display:block;width:-moz-fit-content;width:fit-content;max-width:100%;max-width:calc(100% + 1.25rem);margin:1.875rem 0;border-collapse:collapse;overflow-x:auto}@media print,screen and (min-width: 43.75em){table{display:table;table-layout:fixed;width:100%;max-width:100%}table td{word-wrap:break-word}}table tr:nth-child(2n){background:#f5f7f9}table td,table th{border:1px solid #c5d3df;padding:.5625rem 1rem}table th{font-weight:700;text-align:center}table td{min-width:10.625rem}@media print,screen and (min-width: 43.75em){table td{min-width:0}}table::-webkit-scrollbar,table::-webkit-scrollbar-thumb{width:1rem;height:1rem;border:.25rem solid rgba(0,0,0,0);border-radius:.5rem;background-color:rgba(0,0,0,0)}table::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem rgba(85,108,136,.1)}table::-webkit-scrollbar-thumb:hover{box-shadow:inset 0 0 0 1rem rgba(85,108,136,.2)}table::-webkit-resizer,table::-webkit-scrollbar-corner{background-color:rgba(0,0,0,0)}.c-toc{position:relative;margin:0 0 1.875rem}.c-toc__title{display:block;margin:0 0 .3125rem;font-size:.75rem;font-weight:700;color:#a0aec0;text-transform:uppercase}.c-toc ul{margin:0;padding:0;list-style:none}.c-toc__wrapper>ul>li{margin:0 0 .4375rem}.c-toc__wrapper>ul>li:last-child{margin-bottom:0}.c-toc__wrapper>ul>li>a{font-weight:700}.c-toc a{display:block;margin:0 0 .1875rem;font-size:.8125rem;font-weight:500;color:#475365;line-height:1.4;transition:all .2s ease}.c-toc a:hover{color:#1a202c;transform:translateX(2px)}.c-toc li li{padding-left:.9375rem}.u-show-for-sr,html.js .u-hide-with-js-sr,.u-show-on-focus{position:absolute !important;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}:target:before{content:"";display:block;height:5.625rem;margin:-5.625rem 0 0}.is-brokenlink{color:#d26d69;text-decoration:line-through}.is-brokenlink:after{content:" (link broken)";text-decoration:none}.is-externallink:after{content:"";display:inline-block;width:.625rem;height:.625rem;margin:-0.0625rem .125rem 0 .25rem;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 76 76'%3E%3Cg fill='%234a5568' fill-rule='nonzero'%3E%3Cpath d='M27.37215 46.13316994L72.34371002 1.16160993l2.61627 2.61627L29.98842 48.74943995z'/%3E%3Cpath d='M75.6 28.7h-3.8V4.4H47.4V.6h28.2zM68.1 75.6H.6V8.1h33.7v3.8h-30v60h60v-30h3.8z'/%3E%3C/g%3E%3C/svg%3E");background-size:100% 100%;background-repeat:no-repeat;background-position:center center}.u-no-margin{margin:0 !important}.u-no-margin--top{margin-top:0 !important}.u-no-margin--bottom{margin-bottom:0 !important}.u-no-padding{padding:0 !important}.u-no-padding--top{padding-top:0 !important}.u-no-padding--bottom{padding-bottom:0 !important}html.no-js .u-show-with-js{display:none !important}html.js .u-hide-with-js{display:none !important}@media print{.l-app>*{display:none}.l-app .l-main{display:block}} +/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */*,::before,::after{box-sizing:border-box}html{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}body{font-family:system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Consolas,"Liberation Mono",Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}:root,[data-theme=light]{color-scheme:light;--color-cadetBlue: #a0aec0;--color-primary: #3b68af;--color-sapphire: #314a97;--color-perano: #b2c9f5;--color-light: #ededed;--color-gray: #4a5568;--color-slateGray: #475365;--color-mirage: #1a202c;--color-alert: #d26d69;--color-success: #2d8b01;--color-warning: #EEBF41;--color-dark: #252930;--color-callout-info-border: #5b99ea;--color-callout-alert-border: #d26d69;--color-callout-success-border: #5cb377;--color-callout-warning-border: #EEBF41;--color-callout-info-bg: #f9fbfe;--color-callout-alert-bg: #f5f5f5;--color-callout-success-bg: #e7f4eb;--color-callout-warning-bg: #fdf6e5;--color-callout-warning-link: #d09c13;--color-callout-alert-link: #d26d69;--color-callout-success-link: #3e8554;--color-header-bg: #fff;--color-header-text: #4a5568;--color-header-hover-bg: #f7fafc;--color-header-active-bg: #edf2f7;--color-header-text-muted: #718096;--color-sidebar-bg: #F5F7F9;--color-sidebar-text: #303942;--color-nav-active: #247978;--color-nav-active-bg: #b2f5ea;--color-nav-active-border: #e2e8f0;--color-body-bg: #fff;--color-body-text: #4a5568;--color-body-text-muted: #718096;--color-border: #E6ECF1;--color-border-strong: #d3dce4;--color-link-broken: #d26d69;--color-link-color: #1c6fdc;--color-link-hover: #1557b0;--color-inline-code: #ebf1ff;--color-inline-code-text: #314a97;--color-optionswitch-bg: #edf2f7;--color-search-input-bg: #edf2f7;--color-search-input-focus-bg: #fff;--color-search-icon: #717171;--color-search-result-hover: #f0f6ff;--color-live-search-bg: #fff;--color-live-search-border: #3b68af;--color-pagination-bg: #e2e8f0;--color-video-embed-bg: #f5f5f5;--color-code-block-bg: #2d2d2d;--color-code-block-text: #ccc;--color-theme-color: #102c53;--color-scrollbar: rgba(85, 108, 136, 0.1);--color-scrollbar-hover: rgba(85, 108, 136, 0.2)}[data-theme=dark]{color-scheme:dark;--color-cadetBlue: #718096;--color-primary: #68a2ff;--color-sapphire: #a5b4fc;--color-perano: #4c6cb3;--color-light: #2d3748;--color-gray: #a0aec0;--color-slateGray: #cbd5e1;--color-mirage: #f1f5f9;--color-alert: #fc8181;--color-success: #68d391;--color-warning: #f6e05e;--color-dark: #f1f5f9;--color-callout-info-border: #63b3ed;--color-callout-alert-border: #fc8181;--color-callout-success-border: #68d391;--color-callout-warning-border: #f6e05e;--color-callout-info-bg: #1a2332;--color-callout-alert-bg: #2d1f1f;--color-callout-success-bg: #1a2e22;--color-callout-warning-bg: #2d2a1a;--color-callout-warning-link: #f6e05e;--color-callout-alert-link: #fc8181;--color-callout-success-link: #68d391;--color-header-bg: #0f172a;--color-header-text: #e2e8f0;--color-header-hover-bg: #1e293b;--color-header-active-bg: #243447;--color-header-text-muted: #94a3b8;--color-sidebar-bg: #141b24;--color-sidebar-text: #e2e8f0;--color-nav-active: #5eead4;--color-nav-active-bg: #134e4a;--color-nav-active-border: #2d3748;--color-body-bg: #0b1120;--color-body-text: #cbd5e1;--color-body-text-muted: #94a3b8;--color-border: #2d3748;--color-border-strong: #3d4a5c;--color-link-broken: #fc8181;--color-link-color: #68a2ff;--color-link-hover: #93c5fd;--color-inline-code: #1e293b;--color-inline-code-text: #a5b4fc;--color-optionswitch-bg: #1e293b;--color-search-input-bg: #1e293b;--color-search-input-focus-bg: #0f172a;--color-search-icon: #94a3b8;--color-search-result-hover: #1e293b;--color-live-search-bg: #0f172a;--color-live-search-border: #68a2ff;--color-pagination-bg: #1e293b;--color-video-embed-bg: #1e293b;--color-code-block-bg: #1a1a1a;--color-code-block-text: #ccc;--color-theme-color: #0f172a;--color-scrollbar: rgba(148, 163, 184, 0.15);--color-scrollbar-hover: rgba(148, 163, 184, 0.3)}body{background:var(--color-body-bg);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-weight:400;line-height:1.6;color:var(--color-body-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{color:var(--color-dark);line-height:1.3;margin-bottom:2rem}h1{margin-top:1.875rem}h1{font-size:1.875rem}@media screen and (min-width: 32.5625rem){h1{font-size:calc(1.875rem + 1.25*(100vw - 32.5625rem)/73.6875)}}@media screen and (min-width: 106.25rem){h1{font-size:3.125rem}}h2{font-size:1.375rem}@media screen and (min-width: 32.5625rem){h2{font-size:calc(1.375rem + 0.8125*(100vw - 32.5625rem)/73.6875)}}@media screen and (min-width: 106.25rem){h2{font-size:2.1875rem}}h3{font-size:1.25rem}@media screen and (min-width: 32.5625rem){h3{font-size:calc(1.25rem + 0.6875*(100vw - 32.5625rem)/73.6875)}}@media screen and (min-width: 106.25rem){h3{font-size:1.9375rem}}h4{font-size:1.125rem}@media screen and (min-width: 32.5625rem){h4{font-size:calc(1.125rem + 0.5625*(100vw - 32.5625rem)/73.6875)}}@media screen and (min-width: 106.25rem){h4{font-size:1.6875rem}}h5{font-size:1rem}@media screen and (min-width: 32.5625rem){h5{font-size:calc(1rem + 0.5625*(100vw - 32.5625rem)/73.6875)}}@media screen and (min-width: 106.25rem){h5{font-size:1.5625rem}}h6{font-size:1rem}@media screen and (min-width: 32.5625rem){h6{font-size:calc(1rem + 0.4375*(100vw - 32.5625rem)/73.6875)}}@media screen and (min-width: 106.25rem){h6{font-size:1.4375rem}}a{text-decoration:none;color:var(--color-link-color);transition:color .2s ease-in-out}a:hover{color:var(--color-link-hover)}.l-main__content a,.c-callout a{text-decoration:underline}img{display:inline-block;vertical-align:middle;max-width:100%;height:auto;-ms-interpolation-mode:bicubic}p{margin:0 0 .9375rem;line-height:1.6;max-width:80ch}li{max-width:80ch}code,kbd,samp{background-color:var(--color-inline-code);padding:.1rem .25rem;font-size:.775rem;border-radius:.125rem;padding-left:.25rem;padding-right:.25rem;color:var(--color-inline-code-text);font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace !important}pre{background-color:var(--color-code-block-bg);color:var(--color-code-block-text);padding:.1rem .25rem;font-size:.775rem;border-radius:.5rem;padding-left:.25rem;padding-right:.25rem;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace !important}pre>code{padding:0;background:rgba(0,0,0,0);color:inherit}code[class*=language-],pre[class*=language-]{border-radius:.5rem;font-size:.775rem !important;line-height:1.5 !important}blockquote{display:block;margin:0 0 .9375rem;padding:.9375rem 1.25rem;background-color:var(--color-callout-info-bg);border-left:.1875rem solid var(--color-callout-info-border);color:var(--color-gray)}blockquote a{color:var(--color-link-color)}blockquote>:last-child{margin-bottom:0}iframe,object,video{max-width:100%}.video-embed{position:relative;width:100%;padding-bottom:56.25%;margin:2rem 0;background:var(--color-video-embed-bg);border-radius:4px;overflow:hidden}.video-embed iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:0}.video-embed--local{padding-bottom:0}.video-embed--local video{display:block;width:100%;height:auto;vertical-align:top}html,body{height:100%;width:100%;background:var(--color-body-bg);scroll-behavior:smooth}.l-app{display:flex;min-height:100vh;flex-direction:column;padding-top:3.75rem;background:var(--color-body-bg)}@media print,screen and (min-width: 62.5em){.l-app--has-sidebar{padding-left:20rem}}.l-header{z-index:2;position:fixed;top:0;right:0;left:0;display:flex;align-items:center;justify-content:space-between;height:3.75rem;background:var(--color-header-bg);border-bottom:1px solid var(--color-border-strong);box-shadow:0 1px 4px 0 rgba(0,0,0,.1)}.l-header__logo{flex:auto 0 0;position:relative}@media screen and (min-width: 76.25em){.l-header__logo{flex:20rem 0 0;flex:calc(20rem - 1.875rem) 0 0}}.l-header__search{flex-basis:50%;flex-grow:0;flex-shrink:1;position:relative}@media screen and (min-width: 76.25em){.l-header__search{margin:0 3.125rem 0 4.6875rem}}@media screen and (max-width: 43.74875em){.l-header__search{position:fixed;width:100%;margin:0 !important;top:3.75rem;background:var(--color-body-bg);height:calc(100vh - 2.25rem);padding:0 1rem 1rem 1rem;transform:translateY(100%);transition:transform .4s ease-in-out}}.l-header__versionswitch{display:flex;align-items:center;gap:.25rem;margin:0 .9375rem}@media screen and (max-width: 43.74875em){#searchform:target{transform:translateY(0)}}.l-sidebar{outline:none;display:block;position:fixed;top:3.75rem;bottom:0;left:0;width:100%;transform:translateX(-100%);z-index:1;padding:1.875rem 1.25rem .9375rem;background:var(--color-sidebar-bg);border-right:1px solid var(--color-border);overflow-y:scroll;-webkit-overflow-scrolling:touch;overflow-x:auto;transition:transform .4s ease-in-out}@media print,screen and (min-width: 62.5em){.l-sidebar{display:block;position:fixed;top:3.75rem;bottom:0;left:0;width:20rem;transform:translateX(0);transition:none}}#nav:target{transform:translateX(0)}.l-main{position:relative;margin:1.875rem 1.25rem .9375rem;flex:1}@media print,screen and (min-width: 43.75em){.l-main{margin:1.875rem 3.125rem .9375rem 4.6875rem}}.l-main__title{max-width:62.5rem}@media screen and (min-width: 76.25em){.l-main__contentwrapper{display:flex;justify-content:flex-start;flex-direction:row}}@media print,screen and (min-width: 43.75em){.l-main__content{padding-right:1.5625rem}}@media screen and (min-width: 76.25em){.l-main__content{flex-basis:80%;flex-grow:0;flex-shrink:1;order:1;min-width:0}}.l-main__content>:first-child{margin-top:0}@media screen and (min-width: 76.25em){.l-main__toc{flex-basis:20%;flex-grow:1;flex-shrink:0;align-self:flex-start;order:2;padding:0 0 0 1.5625rem;top:4.6875rem;position:sticky}}.l-footer{flex-basis:100%;flex-shrink:0;order:3;padding:1.875rem .9375rem .9375rem;margin:2.8125rem 0 0;border-top:1px solid var(--color-border)}@media print,screen and (min-width: 43.75em){.l-footer{padding:1.875rem 4.6875rem .9375rem}}@media(max-width: 768px){.o-openmenu{order:4;padding:0 .9375rem 0 .9375rem !important}.o-search,.l-header__search{order:3;margin:0 .475rem 0 auto}.l-header__versionswitch{order:2}.l-header__logo{order:1;max-width:25%}}@media(max-width: 425px){.l-footer{font-size:14px;line-height:1;padding:.9375rem .9375rem}.l-footer .c-footer__nav{display:flex;justify-content:center}.l-footer .c-footer__navlink{padding:.425rem}.l-footer .c-footer__copyright{font-size:14px;line-height:1;padding:.3rem .9375rem 0;text-align:center}}.o-logo{margin:0 .9375rem;padding:0}.o-logo__image{display:block;width:10.625rem;max-width:100%;height:3.75rem;fill:var(--color-header-text)}@media print,screen and (min-width: 43.75em){.o-logo__image{width:12.5rem}}.o-logo__image--dark{display:none}[data-theme=dark] .o-logo__image--light{display:none}[data-theme=dark] .o-logo__image--dark{display:block}.o-docmeta{margin:-0.9375rem 0 1.875rem}.o-sidebar-heading{display:block;margin:0 0 .9375rem;font-size:1.25rem;font-weight:700}.o-openmenu,.o-search{display:block;margin:0;padding:0 .9375rem 0 1.875rem}.o-openmenu__icon,.o-search__icon{display:block;width:1.8125rem;height:3.75rem;fill:var(--color-header-text)}@media print,screen and (min-width: 62.5em){.o-openmenu{display:none}}@media print,screen and (min-width: 43.75em){.o-search{display:none}}@media screen and (max-width: 43.74875em){.o-logo{margin:0 .4375rem}.o-search{padding:0 .4375rem}}.o-closemenu{z-index:1;position:absolute;top:.625rem;right:.625rem;display:block;padding:.9375rem .9375rem}@media print,screen and (min-width: 62.5em){.o-closemenu{display:none}}.o-closemenu__icon{display:block;width:1.875rem;height:1.875rem;fill:var(--color-primary)}.c-breadcrumb{margin:0 0 .9375rem}.c-breadcrumb__list{display:flex;flex-direction:row;flex-wrap:wrap;margin:0 -0.3125rem;padding:0;list-style:none}.c-breadcrumb__item{display:block;flex:auto 0 0}.c-breadcrumb__link{display:inline-block;padding:.25rem .3125rem;line-height:1.4;font-size:.875rem;color:var(--color-gray)}.c-breadcrumb__item+.c-breadcrumb__item:before{content:"";display:inline-block;width:.625rem;height:.6875rem;margin-left:.3125rem;margin-right:-0.0625rem;background-color:var(--color-body-text);opacity:.25;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 62'%3E%3Cpath fill='%23000' fill-rule='nonzero' d='M7.5938.39064L.6562 7.60939l24.25 23.40623-24.25 23.375 6.9376 7.2187 28-26.9999 3.75-3.5938-3.75-3.62498z'/%3E%3C/svg%3E") center/100% 100% no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 62'%3E%3Cpath fill='%23000' fill-rule='nonzero' d='M7.5938.39064L.6562 7.60939l24.25 23.40623-24.25 23.375 6.9376 7.2187 28-26.9999 3.75-3.5938-3.75-3.62498z'/%3E%3C/svg%3E") center/100% 100% no-repeat}.c-callout{color:var(--color-gray);display:block;margin:0 0 .9375rem;padding:.9375rem 1.25rem;background-color:var(--color-callout-info-bg);border-left:.1875rem solid var(--color-callout-info-border)}.c-callout a{color:var(--color-link-color)}.c-callout__title{display:block;margin:0 0 .3125rem;text-transform:uppercase;letter-spacing:1.1}.c-callout a:hover{color:var(--color-link-hover)}.c-callout--info{background-color:var(--color-callout-info-bg);border-color:var(--color-callout-info-border)}.c-callout--info a{color:var(--color-link-color)}.c-callout--warning{background-color:var(--color-callout-warning-bg);border-color:var(--color-callout-warning-border)}.c-callout--warning a{color:var(--color-callout-warning-link)}.c-callout--alert{background-color:var(--color-callout-alert-bg);border-color:var(--color-callout-alert-border)}.c-callout--alert a{color:var(--color-callout-alert-link)}.c-callout--success{background-color:var(--color-callout-success-bg);border-color:var(--color-callout-success-border)}.c-callout--success a{color:var(--color-callout-success-link)}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.command-line-prompt{border-right:1px solid #999;display:block;float:left;font-size:100%;letter-spacing:-1px;margin-right:1em;pointer-events:none;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none}.command-line-prompt>span:before{opacity:.7;content:" ";display:block;padding-right:.8em}.command-line-prompt>span[data-user]:before{content:"[" attr(data-user) "@" attr(data-host) "] $"}.command-line-prompt>span[data-user=root]:before{content:"[" attr(data-user) "@" attr(data-host) "] #"}.command-line-prompt>span[data-prompt]:before{content:attr(data-prompt)}.command-line-prompt>span[data-continuation-prompt]:before{content:attr(data-continuation-prompt)}.command-line span.token.output{opacity:.7}pre[data-line]{position:relative;padding:1em 0 1em 3em}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:hsla(24, 20%, 50%, 0.08);background:linear-gradient(to right, hsla(24, 20%, 50%, 0.1) 70%, hsla(24, 20%, 50%, 0));pointer-events:none;line-height:inherit;white-space:pre}@media print{.line-highlight{-webkit-print-color-adjust:exact;color-adjust:exact}}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:hsla(24, 20%, 50%, 0.4);color:hsl(24, 20%, 95%);font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px white}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:before,.line-numbers .line-highlight:after{content:none}pre[id].linkable-line-numbers span.line-numbers-rows{pointer-events:all}pre[id].linkable-line-numbers span.line-numbers-rows>span:before{cursor:pointer}pre[id].linkable-line-numbers span.line-numbers-rows>span:hover:before{background-color:rgba(128, 128, 128, 0.2)}pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224, 224, 224, 0.2);box-shadow:0 2px 0 0 rgba(0, 0, 0, 0.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus{color:inherit;text-decoration:none}.token.operator{background:none}:not(pre)>code[class*=language-],pre[class*=language-]{background:var(--color-code-block-bg);color:var(--color-code-block-text)}[data-theme=light] :not(pre)>code[class*=language-],[data-theme=light] pre[class*=language-]{background:#2d2d2d;color:#ccc}div.code-toolbar>.toolbar{opacity:1}div.code-toolbar>.toolbar .toolbar-item>button,div.code-toolbar>.toolbar .toolbar-item>a,div.code-toolbar>.toolbar .toolbar-item>span{background:var(--color-optionswitch-bg);color:var(--color-body-text);border:1px solid var(--color-border);box-shadow:none;transition:background-color .15s ease,color .15s ease}div.code-toolbar>.toolbar .toolbar-item>button:hover,div.code-toolbar>.toolbar .toolbar-item>a:hover,div.code-toolbar>.toolbar .toolbar-item>span:hover{background:var(--color-header-hover-bg);color:var(--color-dark)}.line-numbers .line-numbers-rows{border-right-color:var(--color-border-strong)}.line-numbers-rows>span:before{color:var(--color-body-text-muted)}.c-history{display:flex;align-items:center;margin:-0.9375rem 0 1.875rem}.c-contributors{display:flex}.c-contributor{width:30px;height:30px;margin-left:-10px;border:2px solid var(--color-body-bg);border-radius:15px}.c-contributor:first-child{margin-left:0}.c-last-edit{max-width:100%;margin-bottom:0;padding-left:.5em;font-size:.9em;font-weight:500;color:var(--color-body-text-muted);flex:1}.c-footer__grid{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start}.c-footer__cell{width:100%}@media print,screen and (min-width: 62.5em){.c-footer__cell{width:auto}}.c-footer__copyright{color:var(--color-gray)}.c-footer__nav{margin:0 -0.625rem;padding:0;list-style:none}.c-footer__navitem{display:inline-block}.c-footer__navlink{display:block;font-weight:700;padding:.625rem;color:var(--color-gray)}.c-footer__navlink:hover{color:var(--color-primary)}.heading-link{display:inline-block;margin-left:.67em;transition:opacity .25s ease-in-out;opacity:0;font-size:.8em;bottom:.2em}h1:hover .heading-link,h2:hover .heading-link,h3:hover .heading-link,h4:hover .heading-link,h5:hover .heading-link,h6:hover .heading-link{opacity:1}@media screen and (min-width: 43.75em){h1,h2,h3,h4,h5,h6{position:relative;margin-left:-3rem;padding-left:3rem}h1:target .heading-link,h2:target .heading-link,h3:target .heading-link,h4:target .heading-link,h5:target .heading-link,h6:target .heading-link{opacity:1}.heading-link{left:0;position:absolute}}.c-nav{margin:0 0 0 -1.25rem;padding:0;list-style:none}.c-nav__item{margin:0;padding:0;list-style:none;font-size:.9375rem;line-height:1.4}.c-nav__item a{position:relative;display:block;margin-bottom:.625rem;padding:0 0 0 1.25rem;text-decoration:none;font-weight:500;color:var(--color-slateGray);transition:all .2s ease}.c-nav__item a:hover{color:var(--color-link-hover);transform:translateX(2px)}.c-nav__item--activepage .c-nav__chevron{top:.35rem}.c-nav__item--activepage>a{position:relative;color:var(--color-nav-active);padding:.35rem 0 .35rem 3.5rem;transition:all .2s ease}.c-nav__item--activepage>a:after,.c-nav__item--activepage>a:before{border:0 solid var(--color-nav-active-border)}.c-nav__item--activepage>a:hover{transform:translateX(0)}.c-nav__item--activepage>a .inset{top:0;right:0;bottom:0;left:0;position:absolute;border-radius:.25rem;opacity:.25;background-color:var(--color-nav-active-bg)}.c-nav__item--level1>a{font-size:1rem;font-weight:700;padding-left:1.875rem}.c-nav__item--level2>a{padding-left:3.125rem}.c-nav__item--level3>a{padding-left:3.75rem}.c-nav__item--level4>a{padding-left:5rem}.c-nav__item--level5>a{padding-left:6.25rem}.c-nav__item--level6>a{padding-left:7.5rem}.c-nav__item--level7>a{padding-left:8.75rem}.c-nav__item--collapsed>ul{display:none}.c-nav__item--collapsed>a>.c-nav__chevron{top:.0625rem;transform:rotate(90deg)}.c-nav__chevron{display:inline-block;position:absolute;top:0;height:1.3125rem;width:1.3125rem;padding:.3125rem;margin:0 0 0 -1.4375rem;fill:var(--color-body-text-muted);transform:rotate(-90deg);vertical-align:middle}.c-nav__sublist{margin:0 0 1.875rem;padding:0}::-webkit-scrollbar,::-webkit-scrollbar-thumb{width:1rem;height:1rem;border:.25rem solid rgba(0,0,0,0);border-radius:.5rem;background-color:rgba(0,0,0,0)}::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem var(--color-scrollbar)}::-webkit-scrollbar-thumb:hover{box-shadow:inset 0 0 0 1rem var(--color-scrollbar-hover)}::-webkit-resizer,::-webkit-scrollbar-corner{background-color:rgba(0,0,0,0)}.l-main__oc,.c-oc__more{display:none}@media screen and (min-width: 76.25em){.l-main__oc,.c-oc__more{display:block}}.l-main__oc--below,.c-oc__more--below{display:block}@media screen and (min-width: 76.25em){.l-main__oc--below,.c-oc__more--below{display:none}}.l-main__oc{margin-top:5em;background:var(--color-sidebar-bg);color:var(--color-sidebar-text);padding:1em;border-radius:1em;border:1px solid var(--color-border);transition:background-color .5s ease-in-out;text-decoration:none !important;max-width:25rem}@media screen and (min-width: 76.25em){.l-main__oc{margin-left:-1.5625rem}}.l-main__oc .c-oc__member_image{transition:border .5s ease-in-out}.l-main__oc:hover{color:var(--color-sidebar-text);background:var(--color-search-result-hover)}.l-main__oc:hover .c-oc__member_image{border-color:var(--color-search-result-hover)}.c-oc__logo{max-width:100%;max-height:60px}.c-oc__text{font-size:.8125rem;font-weight:500}.c-oc__subtitle{font-size:.8125rem;font-weight:700;text-transform:uppercase}.c-oc__members{padding-left:0;list-style:none;margin-bottom:25px;padding-right:25px;margin-left:-28px;margin-right:-35px;text-align:center}.c-oc__member{display:inline-block;margin-right:-20px;margin-bottom:-15px}.c-oc__member_image{width:60px;height:60px;border-radius:50%;border:5px solid var(--color-sidebar-bg);background:#00b5de}.c-oc__total span{height:60px;background:#00b5de;border-radius:30px;border:5px solid var(--color-sidebar-bg);color:#fff;padding:.7em 1em;font-weight:600;display:block}.c-oc__more{text-align:center;font-size:.8125rem;font-weight:500;text-decoration:underline;margin-top:1em;margin-left:-1em;max-width:25rem}.c-optionswitch__current{display:block;padding:.4375rem .625rem;color:var(--color-header-text);white-space:nowrap;background:var(--color-header-bg);transition:background-color .2s ease-in-out;border-radius:.1875rem}.c-optionswitch__current:hover{color:var(--color-header-text);background:var(--color-header-hover-bg)}.c-optionswitch__currentchevron{display:inline-block;width:.625rem;height:.625rem;fill:var(--color-header-text);vertical-align:middle;margin:-0.0625rem 0 0 .1875rem;transform:rotate(90deg)}.c-optionswitch__listwrapper{position:absolute;top:3.6875rem;display:none;background:var(--color-optionswitch-bg);box-shadow:0 .1875rem .5rem 0 rgba(116,129,141,.1)}@media screen and (min-width: 81.25em){.c-optionswitch__listwrapper{right:0}}@media screen and (max-width: 90em){.c-optionswitch__listwrapper{right:0}}@media screen and (max-width: 48em){.c-optionswitch__listwrapper{right:0}}.c-optionswitch__listwrapper:target{display:block}@media screen and (min-width: 43.75em){.c-optionswitch__listwrapper:target{display:flex}}.c-optionswitch__listwrapper:target:before{content:none}.c-optionswitch__list{margin:0;padding:0;list-style:none}.c-optionswitch__item{position:relative;display:block}.c-optionswitch__link{display:block;padding:.25rem .625rem;color:var(--color-header-text);transition-duration:.2s;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-property:background-color,border-color,color}.c-optionswitch__link:hover{color:var(--color-header-text);background:var(--color-header-hover-bg)}.c-optionswitch__item--active .c-optionswitch__link{background:var(--color-header-active-bg)}.c-optionswitch__translation{color:var(--color-header-text-muted)}.c-optionswitch__translation:before{content:"("}.c-optionswitch__translation:after{content:")"}.c-optionswitch__note{padding:0 .625rem .625rem;color:var(--color-header-text-muted)}.l-main-search__container{list-style:none;padding:0;margin-bottom:2rem}.l-main-search__result,.l-live-search__result{border-top:1px solid var(--color-border);padding-top:1rem;margin-top:1rem}.l-main-search__result .c-breadcrumb,.l-live-search__result .c-breadcrumb{margin-bottom:0}.l-main-search__result h4,.l-live-search__result h4{margin-top:0;margin-bottom:0}@media screen and (max-width: 43.74875em){.l-main-search__result:first-child,.l-live-search__result:first-child{border-top:none}}.l-main-search__match summary,.l-live-search__match summary{float:right;color:var(--color-body-text-muted)}.l-search__pagination-holder{list-style:none;padding:0;text-align:center}.l-search-page{display:inline-block}.l-search-page__link{display:block;cursor:pointer;padding:.5rem 1rem;line-height:initial;background:var(--color-pagination-bg);color:var(--color-mirage);border-radius:.25rem;border:1px solid var(--color-pagination-bg)}.l-search-page__link:hover,.l-search-page__link:focus{background:var(--color-slateGray);border:1px solid var(--color-slateGray);color:var(--color-light)}.l-search-page__link--active{background:var(--color-sapphire);border:1px solid var(--color-sapphire);color:var(--color-light)}.c-searchform--resultspage{margin-bottom:1rem}.c-searchform--resultspage .c-searchform__input{border:1px solid var(--color-border)}.l-search__meta{color:var(--color-gray)}.l-search__ignored{border-left:.5rem solid var(--color-warning);padding:.9375rem 1.25rem;background-color:var(--color-callout-warning-bg);color:var(--color-callout-warning-link)}.l-search__tip{border-left:.5rem solid var(--color-primary);padding:.9375rem 1.25rem;background-color:var(--color-callout-info-bg);color:var(--color-link-color)}.l-search__no_results{border-left:.25rem solid var(--color-alert);padding:.9375rem 1.25rem;background-color:var(--color-callout-alert-bg);color:var(--color-callout-alert-link);max-width:100%}.l-search__no_results--live{margin:0}.c-searchform--header{z-index:5}.l-live-search__container{position:absolute;background:var(--color-live-search-bg);width:100%;display:none;border-radius:0 0 5px 5px;margin-top:-3px;z-index:4;box-shadow:0 2px 7px 2px rgba(0,0,0,.5);border:1px solid var(--color-border);border-top:none}.l-live-search__container--visible{display:block}.l-live-search__container--loading::before{content:"Loading...";width:100%;display:block;padding:.5em .5em .5em 1em;border-radius:5px 5px 0 0;color:var(--color-header-text);background:var(--color-header-bg)}.l-live-search__container--loading:empty::before{border-radius:5px}@media screen and (max-width: 43.74875em){.l-live-search__container{position:initial;margin-top:1em;border-radius:7px;box-shadow:none;border:1px solid var(--color-live-search-border)}}.l-live-search__results{list-style:none;padding:0;margin:0;max-height:70vh;overflow-y:scroll}@media screen and (max-width: 43.74875em){.l-live-search__results{max-height:calc(100vh - 15rem)}}.l-live-search__result,.l-main-search__result{padding:0;margin:0;position:relative}.c-live-search__result-crumbs,.l-main-search__crumbs{position:absolute;top:.7rem;white-space:nowrap;text-overflow:ellipsis;padding:0 1rem;height:1.6em;overflow:hidden;font-weight:500;color:var(--color-body-text-muted)}.c-live-search__result-link,.l-main-search__link{color:var(--color-sapphire);display:block;padding:2.2rem 1rem .7rem;font-weight:500}.c-live-search__result-link:hover,.c-live-search__result-link:focus,.l-live-search__result--selected .c-live-search__result-link,.l-main-search__link:hover,.l-main-search__link:focus,.l-live-search__result--selected .l-main-search__link{background:var(--color-search-result-hover)}.l-live-search__search{margin:0}.l-live-search__search a{font-weight:500;display:block;padding:.7rem 1rem;width:100%;color:var(--color-header-text);background:var(--color-header-bg);border-radius:0 0 5px 5px}.l-main-search__result{max-width:80ch}.l-main-search__title{color:var(--color-sapphire)}.l-main-search__link{text-decoration:none !important}.l-main-search__link:hover .l-main-search__title,.l-main-search__link:focus .l-main-search__title{color:var(--color-link-hover)}.l-main-search__snippet{color:var(--color-body-text)}.size_code{font-size:1em}.c-searchform{position:relative;width:100%}@media screen and (max-width: 43.74875em){.c-searchform{margin-top:1rem}}.c-searchform__input{display:block;width:100%;border:none;border-radius:.5rem;padding:.625rem 2.1875rem .625rem 1.25rem;line-height:1.5 !important;font-family:inherit;font-size:100%;color:var(--color-body-text);transition:all .1s ease-in;background-color:var(--color-search-input-bg)}.c-searchform__input::-moz-placeholder{color:var(--color-body-text-muted)}.c-searchform__input::placeholder{color:var(--color-body-text-muted)}.c-searchform__input:focus{border-color:var(--color-border);background-color:var(--color-search-input-focus-bg);outline:2px solid var(--color-link-color);outline-offset:1px}@media screen and (max-width: 43.74875em){.c-searchform__input{border:1px solid var(--color-header-bg)}}.c-searchform__button{position:absolute;top:0;right:.625rem;bottom:0;margin:0;padding:0;background:rgba(0,0,0,0);border:none}.c-searchform__icon{width:1.5rem;height:1.25rem;fill:var(--color-search-icon);vertical-align:middle}#searchform:target:before{content:"";height:0;margin:0}table{display:block;width:-moz-fit-content;width:fit-content;max-width:100%;max-width:calc(100% + 1.25rem);margin:1.875rem 0;border-collapse:collapse;overflow-x:auto}@media print,screen and (min-width: 43.75em){table{display:table;table-layout:fixed;width:100%;max-width:100%}table td{word-wrap:break-word}}table tr:nth-child(2n){background:var(--color-sidebar-bg)}table td,table th{border:1px solid var(--color-border-strong);padding:.5625rem 1rem}table th{font-weight:700;text-align:center}table td{min-width:10.625rem}@media print,screen and (min-width: 43.75em){table td{min-width:0}}table::-webkit-scrollbar,table::-webkit-scrollbar-thumb{width:1rem;height:1rem;border:.25rem solid rgba(0,0,0,0);border-radius:.5rem;background-color:rgba(0,0,0,0)}table::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem var(--color-scrollbar)}table::-webkit-scrollbar-thumb:hover{box-shadow:inset 0 0 0 1rem var(--color-scrollbar-hover)}table::-webkit-resizer,table::-webkit-scrollbar-corner{background-color:rgba(0,0,0,0)}.c-themetoggle{display:inline-flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;margin:0;padding:0;border:none;border-radius:.1875rem;background:rgba(0,0,0,0);color:var(--color-header-text);cursor:pointer;transition:background-color .2s ease-in-out}.c-themetoggle:hover,.c-themetoggle:focus{background:var(--color-header-hover-bg);outline:none}.c-themetoggle:focus-visible{outline:2px solid var(--color-link-color);outline-offset:2px}.c-themetoggle__icon{display:none;width:1.25rem;height:1.25rem;fill:currentColor}[data-theme-preference=system] .c-themetoggle__icon--system,[data-theme-preference=light] .c-themetoggle__icon--light,[data-theme-preference=dark] .c-themetoggle__icon--dark{display:block}.c-toc{position:relative;margin:0 0 1.875rem}.c-toc__title{display:block;margin:0 0 .3125rem;font-size:.75rem;font-weight:700;color:var(--color-cadetBlue);text-transform:uppercase}.c-toc ul{margin:0;padding:0;list-style:none}.c-toc__wrapper>ul>li{margin:0 0 .4375rem}.c-toc__wrapper>ul>li:last-child{margin-bottom:0}.c-toc__wrapper>ul>li>a{font-weight:700}.c-toc a{display:block;margin:0 0 .1875rem;font-size:.8125rem;font-weight:500;color:var(--color-slateGray);line-height:1.4;transition:all .2s ease}.c-toc a:hover{color:var(--color-mirage);transform:translateX(2px)}.c-toc li li{padding-left:.9375rem}.u-show-for-sr,html.js .u-hide-with-js-sr,.u-show-on-focus{position:absolute !important;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}:target:before{content:"";display:block;height:5.625rem;margin:-5.625rem 0 0}.is-brokenlink{color:var(--color-link-broken);text-decoration:line-through}.is-brokenlink:after{content:" (link broken)";text-decoration:none}.is-externallink:after{content:"";display:inline-block;width:.625rem;height:.625rem;margin:-0.0625rem .125rem 0 .25rem;background-color:var(--color-body-text);-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 76 76'%3E%3Cg fill='%23000' fill-rule='nonzero'%3E%3Cpath d='M27.37215 46.13316994L72.34371002 1.16160993l2.61627 2.61627L29.98842 48.74943995z'/%3E%3Cpath d='M75.6 28.7h-3.8V4.4H47.4V.6h28.2zM68.1 75.6H.6V8.1h33.7v3.8h-30v60h60v-30h3.8z'/%3E%3C/g%3E%3C/svg%3E") center/100% 100% no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 76 76'%3E%3Cg fill='%23000' fill-rule='nonzero'%3E%3Cpath d='M27.37215 46.13316994L72.34371002 1.16160993l2.61627 2.61627L29.98842 48.74943995z'/%3E%3Cpath d='M75.6 28.7h-3.8V4.4H47.4V.6h28.2zM68.1 75.6H.6V8.1h33.7v3.8h-30v60h60v-30h3.8z'/%3E%3C/g%3E%3C/svg%3E") center/100% 100% no-repeat}.u-no-margin{margin:0 !important}.u-no-margin--top{margin-top:0 !important}.u-no-margin--bottom{margin-bottom:0 !important}.u-no-padding{padding:0 !important}.u-no-padding--top{padding-top:0 !important}.u-no-padding--bottom{padding-bottom:0 !important}html.no-js .u-show-with-js{display:none !important}html.js .u-hide-with-js{display:none !important}@media print{:root,[data-theme=dark],[data-theme=light]{color-scheme:light;--color-cadetBlue: #a0aec0;--color-primary: #3b68af;--color-sapphire: #314a97;--color-perano: #b2c9f5;--color-light: #ededed;--color-gray: #4a5568;--color-slateGray: #475365;--color-mirage: #1a202c;--color-alert: #d26d69;--color-success: #2d8b01;--color-warning: #EEBF41;--color-dark: #252930;--color-callout-info-border: #5b99ea;--color-callout-alert-border: #d26d69;--color-callout-success-border: #5cb377;--color-callout-warning-border: #EEBF41;--color-callout-info-bg: #f9fbfe;--color-callout-alert-bg: #f5f5f5;--color-callout-success-bg: #e7f4eb;--color-callout-warning-bg: #fdf6e5;--color-callout-warning-link: #d09c13;--color-callout-alert-link: #d26d69;--color-callout-success-link: #3e8554;--color-header-bg: #fff;--color-header-text: #4a5568;--color-header-hover-bg: #f7fafc;--color-header-active-bg: #edf2f7;--color-header-text-muted: #718096;--color-sidebar-bg: #F5F7F9;--color-sidebar-text: #303942;--color-nav-active: #247978;--color-nav-active-bg: #b2f5ea;--color-nav-active-border: #e2e8f0;--color-body-bg: #fff;--color-body-text: #4a5568;--color-body-text-muted: #718096;--color-border: #E6ECF1;--color-border-strong: #d3dce4;--color-link-broken: #d26d69;--color-link-color: #1c6fdc;--color-link-hover: #1557b0;--color-inline-code: #ebf1ff;--color-inline-code-text: #314a97;--color-optionswitch-bg: #edf2f7;--color-search-input-bg: #edf2f7;--color-search-input-focus-bg: #fff;--color-search-icon: #717171;--color-search-result-hover: #f0f6ff;--color-live-search-bg: #fff;--color-live-search-border: #3b68af;--color-pagination-bg: #e2e8f0;--color-video-embed-bg: #f5f5f5;--color-code-block-bg: #2d2d2d;--color-code-block-text: #ccc;--color-theme-color: #102c53;--color-scrollbar: rgba(85, 108, 136, 0.1);--color-scrollbar-hover: rgba(85, 108, 136, 0.2)}.l-app>*{display:none}.l-app .l-main{display:block}} /*# sourceMappingURL=app.css.map */ \ No newline at end of file diff --git a/public/template/dist/app.css.map b/public/template/dist/app.css.map index 162beaa6..a9614b06 100644 --- a/public/template/dist/app.css.map +++ b/public/template/dist/app.css.map @@ -1 +1 @@ -{"version":3,"sources":["../node_modules/modern-normalize/modern-normalize.css","../src/scss/_typography.scss","../src/scss/_settings.scss","../src/scss/_functions.scss","../src/scss/_layout.scss","../src/scss/_breakpoints.scss","../src/scss/_objects.scss","../src/scss/components/_breadcrumb.scss","../src/scss/components/_callout.scss","../node_modules/prismjs/themes/prism-tomorrow.css","../node_modules/prismjs/plugins/command-line/prism-command-line.css","../node_modules/prismjs/plugins/line-highlight/prism-line-highlight.css","../node_modules/prismjs/plugins/line-numbers/prism-line-numbers.css","../node_modules/prismjs/plugins/toolbar/prism-toolbar.css","../src/scss/components/_code.scss","../src/scss/components/_contributors.scss","../src/scss/components/_footer.scss","../src/scss/components/_heading_links.scss","../src/scss/components/_nav.scss","../src/scss/components/_opencollective.scss","../src/scss/components/_optionswitch.scss","../src/scss/components/_search.scss","../src/scss/components/_searchform.scss","../src/scss/components/_table.scss","../src/scss/components/_toc.scss","../src/scss/_helpers.scss","../src/scss/_print.scss"],"names":[],"mappings":"AAAA,8FAAA,CAWA,mBAGC,qBAAA,CAOD,KACC,eAAA,CACA,aAAA,CAAA,UAAA,CAQD,KACC,gBAAA,CACA,6BAAA,CAYD,KACC,QAAA,CAOD,KACC,qHACC,CAqBF,GACC,QAAA,CACA,aAAA,CAYD,YACC,wCAAA,CAAA,gCAAA,CAOD,SAEC,kBAAA,CAQD,kBAIC,kFACC,CAMD,aAAA,CAOD,MACC,aAAA,CAOD,QAEC,aAAA,CACA,aAAA,CACA,iBAAA,CACA,uBAAA,CAGD,IACC,cAAA,CAGD,IACC,UAAA,CAaD,MACC,aAAA,CACA,oBAAA,CAaD,sCAKC,mBAAA,CACA,cAAA,CACA,gBAAA,CACA,QAAA,CAQD,cAEC,mBAAA,CAOD,gDAIC,yBAAA,CAOD,mBACC,iBAAA,CACA,SAAA,CAOD,gBACC,6BAAA,CAQD,iBACC,eAAA,CAOD,OACC,SAAA,CAOD,SACC,uBAAA,CAOD,wDAEC,WAAA,CAQD,cACC,4BAAA,CACA,mBAAA,CAOD,4BACC,uBAAA,CAQD,6BACC,yBAAA,CACA,YAAA,CAYD,QACC,iBAAA,CCxSD,KACI,eAAA,CAEA,gJCiEe,CDhEf,eAAA,CACA,eCyDiB,CDxDjB,aAAA,CACA,kCAAA,CACA,iCAAA,CAGJ,kBACI,aAAA,CACA,eAAA,CACA,kBAAA,CAMJ,GACI,mBAAA,CEiKA,GACE,kBAAA,CACA,0CAFF,GAGI,kEAAA,CAAA,CAEF,yCALF,GAMI,kBAAA,CAAA,CANJ,GACE,kBAAA,CACA,0CAFF,GAGI,oEAAA,CAAA,CAEF,yCALF,GAMI,mBAAA,CAAA,CANJ,GACE,iBAAA,CACA,0CAFF,GAGI,mEAAA,CAAA,CAEF,yCALF,GAMI,mBAAA,CAAA,CANJ,GACE,kBAAA,CACA,0CAFF,GAGI,oEAAA,CAAA,CAEF,yCALF,GAMI,mBAAA,CAAA,CANJ,GACE,cAAA,CACA,0CAFF,GAGI,gEAAA,CAAA,CAEF,yCALF,GAMI,mBAAA,CAAA,CANJ,GACE,cAAA,CACA,0CAFF,GAGI,gEAAA,CAAA,CAEF,yCALF,GAMI,mBAAA,CAAA,CFxIR,EACI,oBAAA,CACA,aAAA,CACA,gCAAA,CAEA,QACI,aAAA,CAIJ,gCACI,yBAAA,CAIR,IAEI,oBAAA,CACA,qBAAA,CAGA,cAAA,CACA,WAAA,CACA,8BAAA,CAGJ,EACI,mBAAA,CACA,eClBiB,CDmBjB,cCfkB,CDkBtB,GACI,cCnBkB,CDsBtB,kBACI,wBAAA,CACA,oBAAA,CACA,iBAAA,CACA,qBAAA,CACA,mBAAA,CACA,oBAAA,CACA,aAAA,CACA,qGAAA,CAEJ,SACI,SAAA,CAGJ,6CACI,mBAAA,CACA,4BAAA,CACA,0BAAA,CAGJ,WACI,aAAA,CACA,mBAAA,CACA,wBAAA,CACA,wBAAA,CACA,kCAAA,CACA,aAAA,CACA,aACI,aAAA,CAGJ,uBACI,eAAA,CAIR,oBACI,cAAA,CG7HJ,UACI,WAAA,CACA,UAAA,CACA,eAAA,CACA,sBAAA,CAGJ,OACI,YAAA,CACA,gBAAA,CACA,qBAAA,CAEA,mBF0DY,CEzDZ,eAAA,CC4LE,4CDzLF,oBAEQ,kBFwDI,CAAA,CEnDhB,UACI,SAAA,CACA,cAAA,CACA,KAAA,CACA,OAAA,CACA,MAAA,CACA,YAAA,CACA,kBAAA,CACA,6BAAA,CACA,cFsCY,CErCZ,eAAA,CACA,+BAAA,CACA,qCAAA,CAEA,gBACI,aAAA,CACA,iBAAA,CCuKF,uCDzKF,gBAKQ,cAAA,CACA,+BAAA,CAAA,CAIR,kBACI,cAAA,CACA,WAAA,CACA,aAAA,CACA,iBAAA,CC2JF,uCD/JF,kBAOQ,6BAAA,CAAA,CCwJN,0CD/JF,kBAWQ,cAAA,CACA,UAAA,CACA,mBAAA,CACA,WAAA,CACA,eAAA,CACA,4BAAA,CACA,wBAAA,CACA,0BAAA,CACA,oCAAA,CAAA,CAGR,yBACI,iBAAA,CCwIF,0CDpIF,mBACI,uBAAA,CAAA,CAIR,WACI,YAAA,CACA,aAAA,CACA,cAAA,CACA,WFbY,CEcZ,QAAA,CACA,MAAA,CACA,UAAA,CACA,2BAAA,CACA,SAAA,CACA,iCAAA,CACA,kBAAA,CACA,8BAAA,CACA,iBAAA,CACA,gCAAA,CACA,eAAA,CACA,oCAAA,CC0GE,4CD1HN,WAmBQ,aAAA,CACA,cAAA,CACA,WF9BQ,CE+BR,QAAA,CACA,MAAA,CACA,WF7BQ,CE8BR,uBAAA,CACA,eAAA,CAAA,CAIR,YACI,uBAAA,CAIJ,QACI,iBAAA,CACA,gCAAA,CAEA,MAAA,CCmFE,6CDvFN,QAOQ,2CAAA,CAAA,CAGJ,eACI,iBAAA,CCiFF,uCD9EF,wBAEQ,YAAA,CACA,0BAAA,CACA,kBAAA,CAAA,CCqEN,6CDjEF,iBAEQ,uBAAA,CAAA,CCoEN,uCDtEF,iBAMQ,cAAA,CACA,WAAA,CACA,aAAA,CACA,OAAA,CACA,WAAA,CAAA,CAGJ,8BACI,YAAA,CCwDN,uCDpDF,aAEQ,cAAA,CACA,WAAA,CACA,aAAA,CACA,qBAAA,CACA,OAAA,CACA,uBAAA,CACA,aAAA,CACA,eAAA,CAAA,CAMZ,UACI,eAAA,CACA,aAAA,CACA,OAAA,CACA,kCAAA,CACA,oBAAA,CACA,4BAAA,CC0BE,6CDhCN,UASQ,mCAAA,CAAA,CAIR,yBACI,YACI,OAAA,CACA,wCAAA,CAEJ,4BACI,OAAA,CACA,uBAAA,CAEJ,yBACI,OAAA,CAEJ,gBACI,OAAA,CACA,aAAA,CAAA,CAGR,yBACI,UACI,cAAA,CACA,aAAA,CACA,yBAAA,CACA,yBACI,YAAA,CACA,sBAAA,CACA,6BACI,eAAA,CAGR,+BACI,cAAA,CACA,aAAA,CACA,wBAAA,CACA,iBAAA,CAAA,CEvNZ,QACI,iBAAA,CACA,SAAA,CACA,eACI,aAAA,CACA,eAAA,CACA,cAAA,CACA,cJ+DQ,CI9DR,YAAA,CDiMF,6CCtMF,eAQQ,aAAA,CAAA,CAKZ,WACI,4BAAA,CAGJ,mBACI,aAAA,CACA,mBAAA,CACA,iBAAA,CACA,eAAA,CAIJ,sBACI,aAAA,CACA,QAAA,CACA,6BAAA,CAEA,kCACI,aAAA,CACA,eAAA,CACA,cJkCQ,CIjCR,YAAA,CDoKF,4CCxJF,YACI,YAAA,CAAA,CDuJF,6CCnJF,UACI,YAAA,CAAA,CDuJF,0CCnJF,QACI,iBAAA,CAEJ,UACI,kBAAA,CAAA,CAGR,aACI,SAAA,CACA,iBAAA,CACA,WAAA,CACA,aAAA,CACA,aAAA,CACA,yBAAA,CDiIE,4CCvIN,aASQ,YAAA,CAAA,CAGJ,mBACI,aAAA,CACA,cAAA,CACA,eAAA,CACA,YAAA,CChFR,cACI,mBAAA,CAEA,oBACI,YAAA,CACA,kBAAA,CACA,cAAA,CACA,mBAAA,CACA,SAAA,CACA,eAAA,CAGJ,oBACI,aAAA,CACA,aAAA,CAGJ,oBACI,oBAAA,CACA,uBAAA,CACA,eAAA,CACA,iBAAA,CACA,aAAA,CAGJ,+CACI,UAAA,CACA,oBAAA,CACA,aAAA,CACA,eAAA,CACA,oBAAA,CACA,uBAAA,CACA,8QAAA,CACA,2BAAA,CACA,yBAAA,CACA,iCAAA,CACA,WAAA,CCtCR,WACI,aAAA,CACA,aAAA,CACA,mBAAA,CACA,wBAAA,CACA,wBAAA,CACA,kCAAA,CACA,aACI,aAAA,CAGJ,kBACI,aAAA,CACA,mBAAA,CACA,wBAAA,CACA,kBAAA,CAEJ,mBACI,aAAA,CAGJ,iBACI,wBAAA,CACA,oBAAA,CACA,mBACI,aAAA,CAIR,oBACI,wBAAA,CACA,oBAAA,CACA,sBACI,aAAA,CAIR,kBACI,wBAAA,CACA,oBAAA,CACA,oBACI,aAAA,CAIR,oBACI,wBAAA,CACA,oBAAA,CACA,sBACI,aAAA,CC3CZ,6CAEC,UAAA,CACA,eAAA,CACA,iEAAA,CACA,aAAA,CACA,eAAA,CACA,eAAA,CACA,mBAAA,CACA,iBAAA,CACA,gBAAA,CACA,eAAA,CAEA,eAAA,CACA,aAAA,CACA,UAAA,CAEA,oBAAA,CAGA,YAAA,CAKD,sBACC,WAAA,CACA,aAAA,CACA,aAAA,CAGD,uDAEC,kBAAA,CAID,iCACC,YAAA,CACA,kBAAA,CACA,kBAAA,CAGD,8EAKC,UAAA,CAGD,mBACC,UAAA,CAGD,4DAIC,aAAA,CAGD,qBACC,aAAA,CAGD,6CAGC,aAAA,CAGD,gEAIC,aAAA,CAGD,6EAKC,aAAA,CAGD,yEAKC,aAAA,CAGD,yCAGC,aAAA,CAGD,6BAEC,gBAAA,CAED,cACC,iBAAA,CAGD,cACC,WAAA,CAGD,gBACC,WAAA,CCxHD,qBACC,2BAAA,CACA,aAAA,CACA,UAAA,CACA,cAAA,CACA,mBAAA,CACA,gBAAA,CACA,mBAAA,CACA,gBAAA,CAEA,wBAAA,CACA,qBAAA,CAEA,gBAAA,CAGD,iCACC,UAAA,CACA,WAAA,CACA,aAAA,CACA,kBAAA,CAGD,4CACC,qDAAA,CAGD,iDACC,qDAAA,CAGD,8CACC,yBAAA,CAGD,2DACC,sCAAA,CAGD,gCAEC,UAAA,CCzCD,eACC,iBAAA,CACA,qBAAA,CAGD,gBACC,iBAAA,CACA,MAAA,CACA,OAAA,CACA,iBAAA,CACA,cAAA,CAEA,mCAAA,CACA,wFAAA,CAEA,mBAAA,CAEA,mBAAA,CACA,eAAA,CAGD,aACC,gBAKC,gCAAA,CACA,kBAAA,CAAA,CAID,uDAEC,wBAAA,CACA,iBAAA,CACA,QAAA,CACA,SAAA,CACA,aAAA,CACA,cAAA,CACA,wCAAA,CACA,uBAAA,CACA,4BAAA,CACA,iBAAA,CACA,mBAAA,CACA,mBAAA,CACA,gBAAA,CACA,sBAAA,CAGD,gCACC,sBAAA,CACA,QAAA,CACA,WAAA,CAGF,yEAEC,YAAA,CAGD,qDACC,kBAAA,CAED,iEACC,cAAA,CAED,uEACC,yCAAA,CCpED,mCACC,iBAAA,CACA,kBAAA,CACA,wBAAA,CAGD,wCACC,iBAAA,CACA,mBAAA,CAGD,iCACC,iBAAA,CACA,mBAAA,CACA,KAAA,CACA,cAAA,CACA,WAAA,CACA,SAAA,CACA,mBAAA,CACA,2BAAA,CAEA,wBAAA,CACA,qBAAA,CAEA,gBAAA,CAIA,wBACC,aAAA,CACA,4BAAA,CAGA,+BACC,2BAAA,CACA,UAAA,CACA,aAAA,CACA,kBAAA,CACA,gBAAA,CCtCH,iBACC,iBAAA,CAGD,0BACC,iBAAA,CACA,UAAA,CACA,QAAA,CACA,UAAA,CACA,kCAAA,CACA,SAAA,CAGD,gCACC,SAAA,CAKD,uCACC,SAAA,CAGD,wCACC,oBAAA,CAGD,0CACC,cAAA,CAGD,+CACC,eAAA,CACA,QAAA,CACA,aAAA,CACA,YAAA,CACA,kBAAA,CACA,gBAAA,CACA,SAAA,CACA,wBAAA,CACA,qBAAA,CACA,oBAAA,CAGD,sIAGC,UAAA,CACA,cAAA,CACA,cAAA,CACA,kBAAA,CACA,mCAAA,CACA,uCAAA,CACA,kBAAA,CAGD,gTAMC,aAAA,CACA,oBAAA,CCnDD,gBACI,eAAA,CCbJ,WACI,YAAA,CACA,kBAAA,CACA,4BAAA,CAEJ,gBACI,YAAA,CAEJ,eACI,UAAA,CACA,WAAA,CACA,iBAAA,CACA,qBAAA,CACA,kBAAA,CAEA,2BACI,aAAA,CAGR,aACI,cAAA,CACA,eAAA,CACA,iBAAA,CACA,cAAA,CACA,eAAA,CACA,UAAA,CACA,MAAA,CCxBA,gBACI,YAAA,CACA,cAAA,CACA,6BAAA,CACA,sBAAA,CAGJ,gBACI,UAAA,CX+LF,4CWhMF,gBAIQ,UAAA,CAAA,CAIR,qBACI,aAAA,CAGJ,eACI,kBAAA,CACA,SAAA,CACA,eAAA,CAGJ,mBACI,oBAAA,CAGJ,mBACI,aAAA,CACA,eAAA,CACA,eAAA,CACA,aAAA,CAEA,yBACI,aAAA,CCrCZ,cACI,oBAAA,CACA,iBAAA,CACA,mCAAA,CACA,SAAA,CACA,cAAA,CACA,WAAA,CAIA,0IACI,SAAA,CZkMF,uCY7LF,kBACI,iBAAA,CACA,iBAAA,CACA,iBAAA,CAEA,gJACI,SAAA,CAGR,cACI,MAAA,CACA,iBAAA,CAAA,CC5BR,OACI,qBAAA,CACA,SAAA,CACA,eAAA,CAEA,aACI,QAAA,CACA,SAAA,CACA,eAAA,CACA,kBAAA,CACA,eAAA,CAEA,eACI,iBAAA,CACA,aAAA,CACA,qBAAA,CACA,qBAAA,CACA,oBAAA,CACA,eAAA,CACA,aAAA,CACA,uBAAA,CAEA,qBACI,aAAA,CACA,yBAAA,CAKJ,yCACI,UAAA,CAEJ,2BACI,iBAAA,CACA,aAAA,CACA,8BAAA,CACA,uBAAA,CAEA,mEACI,sBAAA,CAGJ,iCACI,uBAAA,CAGJ,kCACI,KAAA,CACA,OAAA,CACA,QAAA,CACA,MAAA,CACA,iBAAA,CACA,oBAAA,CACA,WAAA,CACA,wBAAA,CAMZ,uBACI,cAAA,CACA,eAAA,CACA,qBAAA,CAGJ,uBACI,qBAAA,CAGJ,uBACI,oBAAA,CAGJ,uBACI,iBAAA,CAGJ,uBACI,oBAAA,CAGJ,uBACI,mBAAA,CAGJ,uBACI,oBAAA,CAwBA,2BACI,YAAA,CAEJ,0CACI,YAAA,CACA,uBAAA,CAMZ,gBACI,oBAAA,CACA,iBAAA,CACA,KAAA,CACA,gBAAA,CACA,eAAA,CACA,gBAAA,CACA,uBAAA,CACA,uBAAA,CACA,wBAAA,CACA,qBAAA,CAIJ,gBACI,mBAAA,CACA,SAAA,CAIR,8CACI,UAAA,CACA,WAAA,CACA,iCAAA,CACA,mBAAA,CACA,8BAAA,CAGJ,0BACI,+CAAA,CAGJ,gCACI,+CAAA,CAGJ,6CACI,8BAAA,CC/JJ,wBACI,YAAA,Cd6ME,uCc9MN,wBAGQ,aAAA,CAAA,CAGR,sCACI,aAAA,CduME,uCcxMN,sCAGQ,YAAA,CAAA,CAIR,YACI,cAAA,CAEA,kBAAA,CACA,aAAA,CACA,WAAA,CACA,iBAAA,CACA,8BAAA,CACA,2CAAA,CACA,+BAAA,CACA,eAAA,CduLE,uCcjMN,YAaQ,sBAAA,CAAA,CAGJ,gCACI,iCAAA,CAEJ,kBACI,aAAA,CACA,kBAAA,CAEA,sCACI,oBAAA,CAMZ,YACI,cAAA,CACA,eAAA,CAGJ,YACI,kBAAA,CACA,eAAA,CAGJ,gBACI,kBAAA,CACA,eAAA,CACA,wBAAA,CAGJ,eACI,cAAA,CACA,eAAA,CACA,kBAAA,CACA,kBAAA,CACA,iBAAA,CACA,kBAAA,CACA,iBAAA,CAEJ,cACI,oBAAA,CACA,kBAAA,CACA,mBAAA,CAGJ,oBACI,UAAA,CACA,WAAA,CACA,iBAAA,CACA,wBAAA,CACA,kBAAA,CAKA,kBACI,WAAA,CACA,kBAAA,CACA,kBAAA,CACA,wBAAA,CACA,UAAA,CACA,gBAAA,CACA,eAAA,CACA,aAAA,CAIR,YACI,iBAAA,CACA,kBAAA,CACA,eAAA,CACA,yBAAA,CACA,cAAA,CACA,gBAAA,CACA,eAAA,CCrGA,yBACI,aAAA,CACA,wBAAA,CACA,aAAA,CACA,kBAAA,CACA,eAAA,CACA,2CAAA,CACA,sBlBwDQ,CkBtDR,+BACI,aAAA,CACA,eAAA,CAIR,gCACI,oBAAA,CACA,aAAA,CACA,cAAA,CACA,YAAA,CACA,qBAAA,CACA,8BAAA,CACA,uBAAA,CAGJ,6BACI,iBAAA,CACA,aAAA,CACA,YAAA,CACA,kBAAA,CACA,kDAAA,Cf8KF,uCenLF,6BAQQ,OAAA,CAAA,Cf2KN,oCenLF,6BAWQ,OAAA,CAAA,CfwKN,oCenLF,6BAcQ,OAAA,CAAA,CAGJ,oCACI,aAAA,CfiKN,uCelKE,oCAIQ,YAAA,CAAA,CAGJ,2CACI,YAAA,CAKZ,sBACI,QAAA,CACA,SAAA,CACA,eAAA,CAGJ,sBACI,iBAAA,CACA,aAAA,CAGJ,sBACI,aAAA,CACA,sBAAA,CACA,aAAA,CACA,uBAAA,CACA,uDAAA,CACA,uDAAA,CAEA,4BACI,aAAA,CACA,eAAA,CAIR,oDACI,eAAA,CAGJ,6BACI,aAAA,CAEA,oCACI,WAAA,CAEJ,mCACI,WAAA,CAIR,sBACI,yBAAA,CACA,aAAA,CCnGR,0BACI,eAAA,CACA,SAAA,CACA,kBAAA,CAGJ,8CACI,yBAAA,CACA,gBAAA,CACA,eAAA,CAEA,0EACI,eAAA,CAGJ,oDACI,YAAA,CACA,eAAA,ChB6LF,0CgBzLE,sEACI,eAAA,CAAA,CAMR,4DACI,WAAA,CACA,UAAA,CAIR,6BACI,eAAA,CACA,SAAA,CACA,iBAAA,CAEJ,eACI,oBAAA,CAEJ,qBACI,aAAA,CACA,cAAA,CACA,kBAAA,CACA,mBAAA,CACA,kBAAA,CACA,aAAA,CACA,oBAAA,CACA,wBAAA,CAEA,sDACI,kBAAA,CACA,wBAAA,CACA,aAAA,CAGJ,6BACI,kBAAA,CACA,wBAAA,CACA,aAAA,CAIR,2BACI,kBAAA,CACA,gDACI,qBAAA,CAGR,gBACI,aAAA,CAKJ,mBACI,+BAAA,CACA,wBAAA,CACA,oCAAA,CACA,aAAA,CAGJ,eACI,+BAAA,CACA,wBAAA,CACA,oCAAA,CACA,UAAA,CAIJ,sBACI,gCAAA,CACA,wBAAA,CACA,qCAAA,CACA,aAAA,CACA,cAAA,CAEA,4BACI,QAAA,CAIR,sBACI,SAAA,CAEJ,0BACI,iBAAA,CACA,eAAA,CACA,UAAA,CACA,YAAA,CACA,yBAAA,CACA,eAAA,CACA,SAAA,CACA,uCAAA,CAEA,mCACI,aAAA,CAIA,2CACI,oBAAA,CACA,UAAA,CACA,aAAA,CACA,0BAAA,CACA,yBAAA,CACA,aAAA,CACA,eAAA,CAGJ,iDACI,iBAAA,ChByEN,0CgBnGN,0BA+BQ,gBAAA,CACA,cAAA,CACA,iBAAA,CACA,eAAA,CACA,wBAAA,CAAA,CAGR,wBACI,eAAA,CACA,SAAA,CACA,QAAA,CACA,eAAA,CACA,iBAAA,ChBwDE,0CgB7DN,wBAQQ,8BAAA,CAAA,CAGR,8CACI,SAAA,CACA,QAAA,CACA,iBAAA,CAEJ,qDACI,iBAAA,CACA,SAAA,CACA,kBAAA,CACA,sBAAA,CACA,cAAA,CACA,YAAA,CACA,eAAA,CACA,eAAA,CAEJ,iDACI,aAAA,CACA,aAAA,CACA,yBAAA,CACA,eAAA,CACA,6OACI,kBAAA,CAGR,uBACI,QAAA,CACA,yBACI,eAAA,CACA,aAAA,CACA,kBAAA,CACA,UAAA,CACA,aAAA,CACA,eAAA,CACA,yBAAA,CAGR,uBACI,cnB/HkB,CmBiItB,sBACI,aAAA,CAEJ,qBACI,+BAAA,CAEI,kGACI,aAAA,CAIZ,wBACI,aAAA,CAEJ,WACI,aAAA,CClNJ,cACI,iBAAA,CACA,UAAA,CjB4ME,0CiB9MN,cAKQ,eAAA,CAAA,CAGJ,qBACI,aAAA,CACA,UAAA,CACA,WAAA,CACA,mBAAA,CACA,yCAAA,CACA,0BAAA,CACA,mBAAA,CACA,cAAA,CACA,0BAAA,CACA,wBAAA,CAEA,2BACI,oBAAA,CACA,qBAAA,CjBwLN,0CiBtMF,qBAkBQ,qBAAA,CAAA,CAIR,sBACI,iBAAA,CACA,KAAA,CACA,aAAA,CACA,QAAA,CACA,QAAA,CACA,SAAA,CACA,wBAAA,CACA,WAAA,CAGJ,oBACI,YAAA,CACA,cAAA,CACA,YAAA,CACA,qBAAA,CAKR,0BACI,UAAA,CACA,QAAA,CACA,QAAA,CCrDJ,MACI,aAAA,CACA,sBAAA,CAAA,iBAAA,CAEA,cAAA,CACA,8BAAA,CACA,iBAAA,CACA,wBAAA,CACA,eAAA,ClBiME,6CkBzMN,MAWQ,aAAA,CACA,kBAAA,CACA,UAAA,CACA,cAAA,CAEA,SACI,oBAAA,CAAA,CAIR,uBACI,kBAAA,CAGJ,kBACI,wBAAA,CACA,qBAAA,CAGJ,SACI,eAAA,CACA,iBAAA,CAGJ,SACI,mBAAA,ClBqKF,6CkBtKF,SAIQ,WAAA,CAAA,CAIR,wDACI,UAAA,CACA,WAAA,CACA,iCAAA,CACA,mBAAA,CACA,8BAAA,CAGJ,+BACI,+CAAA,CAGJ,qCACI,+CAAA,CAGJ,uDACI,8BAAA,CC5DR,OACI,iBAAA,CACA,mBAAA,CAYA,cACI,aAAA,CACA,mBAAA,CACA,gBAAA,CACA,eAAA,CACA,aAAA,CACA,wBAAA,CAGJ,UACI,QAAA,CACA,SAAA,CACA,eAAA,CAOJ,sBACI,mBAAA,CAEA,iCACI,eAAA,CAGJ,wBACI,eAAA,CAIR,SACI,aAAA,CACA,mBAAA,CACA,kBAAA,CACA,eAAA,CACA,aAAA,CACA,eAAA,CACA,uBAAA,CAEA,eACI,aAAA,CACA,yBAAA,CAIR,aACI,qBAAA,CC7DR,2DACI,4BAAA,CACA,SAAA,CACA,UAAA,CACA,SAAA,CACA,eAAA,CACA,qBAAA,CACA,kBAAA,CACA,QAAA,CAIJ,eACI,UAAA,CACA,aAAA,CACA,eAAA,CACA,oBAAA,CAGJ,eACI,aAAA,CACA,4BAAA,CAEA,qBACI,wBAAA,CACA,oBAAA,CAOJ,uBACI,UAAA,CACA,oBAAA,CACA,aAAA,CACA,cAAA,CACA,kCAAA,CAEA,mWAAA,CACA,yBAAA,CACA,2BAAA,CACA,iCAAA,CAIR,aACI,mBAAA,CAEJ,kBACI,uBAAA,CAEJ,qBACI,0BAAA,CAGJ,cACI,oBAAA,CAEJ,mBACI,wBAAA,CAEJ,sBACI,2BAAA,CAIA,2BACI,uBAAA,CAIJ,wBACI,uBAAA,CCzER,aACI,SACI,YAAA,CAGJ,eACI,aAAA,CAAA","file":"app.css","sourcesContent":["/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n::before,\n::after {\n\tbox-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\nhtml {\n\t-moz-tab-size: 4;\n\ttab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n\tline-height: 1.15; /* 1 */\n\t-webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n\tmargin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n\tfont-family:\n\t\tsystem-ui,\n\t\t-apple-system, /* Firefox supports this but not yet `system-ui` */\n\t\t'Segoe UI',\n\t\tRoboto,\n\t\tHelvetica,\n\t\tArial,\n\t\tsans-serif,\n\t\t'Apple Color Emoji',\n\t\t'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n\theight: 0; /* 1 */\n\tcolor: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n\ttext-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n\tfont-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n\tfont-family:\n\t\tui-monospace,\n\t\tSFMono-Regular,\n\t\tConsolas,\n\t\t'Liberation Mono',\n\t\tMenlo,\n\t\tmonospace; /* 1 */\n\tfont-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n\tfont-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n\tfont-size: 75%;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsub {\n\tbottom: -0.25em;\n}\n\nsup {\n\ttop: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n\ttext-indent: 0; /* 1 */\n\tborder-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n\tfont-family: inherit; /* 1 */\n\tfont-size: 100%; /* 1 */\n\tline-height: 1.15; /* 1 */\n\tmargin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n\ttext-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n\t-webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n\tborder-style: none;\n\tpadding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n\toutline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n\tbox-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n\tpadding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n\tvertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n\theight: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n\t-webkit-appearance: textfield; /* 1 */\n\toutline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n\t-webkit-appearance: button; /* 1 */\n\tfont: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n\tdisplay: list-item;\n}\n","body {\n background:map-get($colors, 'body-bg');\n color: map-get($colors, 'gray');\n font-family: $body-font-family;\n font-weight: 400;\n line-height: $global-line-height;\n color: map-get($colors, 'body-text');\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\nh1, h2, h3, h4, h5, h6 {\n color: map-get($colors, dark);\n line-height: 1.3;\n margin-bottom: 2rem;\n}\n\n$min_width: rem(521);\n$max_width: rem(1700);\n\nh1 {\n margin-top: rem(30);\n //font-size: rem(45);\n @include fluid-type($min_width, $max_width, rem(30), rem(50));\n}\n\nh2 {\n //font-size: rem(30);\n @include fluid-type($min_width, $max_width, rem(22), rem(35));\n}\n\nh3 {\n //font-size: rem(26);\n @include fluid-type($min_width, $max_width, rem(20), rem(31));\n}\n\nh4 {\n //font-size: rem(22);\n @include fluid-type($min_width, $max_width, rem(18), rem(27));\n}\n\nh5 {\n //font-size: rem(20);\n @include fluid-type($min_width, $max_width, rem(16), rem(25));\n}\n\nh6 {\n //font-size: rem(18);\n @include fluid-type($min_width, $max_width, rem(16), rem(23));\n}\n\n\na {\n text-decoration: none;\n color: map-get($colors, 'link-color');\n transition: color .2s ease-in-out;\n\n &:hover {\n color: lightendarken(map-get($colors, 'link-color'), 15%);\n }\n\n // Links should look like links\n .l-main__content &, .c-callout & {\n text-decoration: underline;\n }\n}\n\nimg {\n // Get rid of gap under images by making them display: inline-block; by default\n display: inline-block;\n vertical-align: middle;\n\n // Grid defaults to get images and embeds to work properly\n max-width: 100%;\n height: auto;\n -ms-interpolation-mode: bicubic;\n}\n\np {\n margin: 0 0 $global-margin;\n line-height: $global-line-height;\n max-width: $paragraph-max-width;\n}\n\nli {\n max-width: $paragraph-max-width;\n}\n\ncode, kbd, samp, pre {\n background-color: map-get($colors, 'inline-code');\n padding: 0.1rem 0.25rem;\n font-size: .775rem;\n border-radius: .125rem;\n padding-left: .25rem;\n padding-right: .25rem;\n color: map-get($colors, sapphire);\n font-family: SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace !important;\n}\npre > code {\n padding: 0;\n}\n\ncode[class*=\"language-\"], pre[class*=\"language-\"] {\n border-radius: .5rem;\n font-size: .775rem !important;\n line-height: 1.5 !important;\n}\n\nblockquote {\n display: block;\n margin: 0 0 $global-margin;\n padding: rem(15 20);\n background-color: map-get($colors, 'callout-info-bg');\n border-left: rem(3) solid map-get($colors, 'callout-info-border');\n color: map-get($colors, gray);\n a{\n color: map-get($colors, 'link-color');\n }\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\niframe, object, video {\n max-width: 100%;\n}\n","$colors: (\n cadetBlue: #a0aec0,\n primary: #3b68af, // AA compatible\n sapphire: #314a97,\n perano: #b2c9f5,\n light: #ededed,\n gray:#4a5568, // AA compatible\n slateGray: #475365, // AAA compatible\n mirage: #1a202c,\n alert: #d26d69,\n success: #2d8b01,\n warning: #EEBF41,\n dark: #252930,\n 'callout-info-border': #5b99ea,\n 'callout-alert-border': #d26d69,\n 'callout-success-border': #5cb377,\n 'callout-warning-border': #EEBF41,\n 'callout-info-bg':#f9fbfe,\n 'callout-alert-bg': #f5f5f5,\n 'callout-success-bg': #e7f4eb,\n 'callout-warning-bg': #fdf6e5,\n 'header-bg': #fff,\n 'header-text': #4a5568, //#4a4a4a,\n 'sidebar-bg': #F5F7F9,\n 'sidebar-text': #303942,\n 'nav-active': #247978,\n 'nav-active-bg': #b2f5ea,\n 'body-bg': #fff,\n 'body-text': #4a5568,\n 'border': #E6ECF1,\n 'link-broken': #d26d69,\n 'link-color': #1c6fdc,\n 'inline-code': #ebf1ff,\n 'optionswitch-bg': #edf2f7,\n);\n\n/*\n$dark-colors: (\n primary: #68a2ff, // AA compatible\n light: #ededed,\n gray: #757575, // AA compatible\n alert: #c70000,\n success: #2d8b01,\n warning: #ffae00,\n 'header-bg': #052a67,\n 'header-text': #fff, //#4a4a4a,\n 'sidebar-bg': #141f31,\n 'body-bg': #111,\n 'body-text': #fff,\n border: #E6ECF1,\n);\n*/\n\n$breakpoints: (\n small: 0,\n medium: 700px,\n large: 1000px,\n xlarge: 1220px,\n xxlarge: 1300px\n);\n\n$global-font-size: 100%;\n$global-line-height: 1.6;\n$global-width: rem(1200);\n$global-margin: rem(15);\n$global-radius: rem(3);\n$paragraph-max-width: 80ch; // approx 60 actual flex-width font characters\n\n$body-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n\n$header-height: rem(60);\n\n$main-margin-top: rem(30);\n\n$sidebar-width: rem(320);\n$sidebar-breakpoint: 'large';\n","@use \"sass:math\";\n\n/// Removes the unit (e.g. px, em, rem) from a value, returning the number only.\n///\n/// @param {Number} $num - Number to strip unit from.\n///\n/// @returns {Number} The same number, sans unit.\n@function strip-unit($num) {\n @return math.div($num, $num * 0 + 1);\n}\n\n/// Converts one or more pixel values into matching rem values.\n///\n/// @param {Number|List} $values - One or more values to convert. Be sure to separate them with spaces and not commas. If you need to convert a comma-separated list, wrap the list in parentheses.\n/// @param {Number} $base [null] - The base value to use when calculating the `rem`. If you're using Foundation out of the box, this is 16px. If this parameter is `null`, the function will reference the `$global-font-size` variable as the base.\n///\n/// @returns {List} A list of converted values.\n@function rem($values, $base: null) {\n $rem-values: ();\n $count: length($values);\n\n // If no base is defined, defer to the global font size\n @if $base == null {\n $base: $global-font-size;\n }\n\n // If the base font size is a %, then multiply it by 16px\n // This is because 100% font size = 16px in most all browsers\n @if unit($base) == '%' {\n $base: math.div($base, 100%) * 16px;\n }\n\n // Using rem as base allows correct scaling\n @if unit($base) == 'rem' {\n $base: strip-unit($base) * 16px;\n }\n\n @if $count == 1 {\n @return -zf-to-rem($values, $base);\n }\n\n @for $i from 1 through $count {\n $rem-values: append($rem-values, -zf-to-rem(nth($values, $i), $base));\n }\n\n @return $rem-values;\n}\n@function rem-calc($values, $base: null) {\n @return rem($values, $base);\n}\n\n// Converts a unitless, pixel, or rem value to em, for use in breakpoints.\n@function -zf-bp-to-em($value) {\n // Pixel and unitless values are converted to rems\n @if unit($value) == 'px' or unitless($value) {\n $value: rem-calc($value, $base: 16px);\n }\n\n // Then the value is converted to ems\n @return strip-unit($value) * 1em;\n}\n\n/// Converts a pixel value to matching rem value. *Any* value passed, regardless of unit, is assumed to be a pixel value. By default, the base pixel value used to calculate the rem value is taken from the `$global-font-size` variable.\n/// @access private\n///\n/// @param {Number} $value - Pixel value to convert.\n/// @param {Number} $base [null] - Base for pixel conversion.\n///\n/// @returns {Number} A number in rems, calculated based on the given value and the base pixel value. rem values are passed through as is.\n@function -zf-to-rem($value, $base: null) {\n // Check if the value is a number\n @if type-of($value) != 'number' {\n @warn inspect($value) + ' was passed to rem-calc(), which is not a number.';\n @return $value;\n }\n\n // Transform em into rem if someone hands over 'em's\n @if unit($value) == 'em' {\n $value: strip-unit($value) * 1rem;\n }\n\n // Calculate rem if units for $value is not rem or em\n @if unit($value) != 'rem' {\n $value: math.div(strip-unit($value), strip-unit($base)) * 1rem;\n }\n\n // Turn 0rem into 0\n @if $value == 0rem {\n $value: 0;\n }\n\n @return $value;\n}\n\n//\n// Function to create an optimized svg url https://codepen.io/jakob-e/pen/doMoML\n//\n@function svg-url($svg){\n //\n // Add missing namespace\n //\n @if not str-index($svg,xmlns) {\n $svg: str-replace($svg, '', '%3E');\n\n //\n // The maybe list\n //\n // Keep size and compile time down\n // ... only add on documented fail\n //\n // $chunk: str-replace($chunk, '|', '%7C');\n // $chunk: str-replace($chunk, '[', '%5B');\n // $chunk: str-replace($chunk, ']', '%5D');\n // $chunk: str-replace($chunk, '^', '%5E');\n // $chunk: str-replace($chunk, '`', '%60');\n // $chunk: str-replace($chunk, ';', '%3B');\n // $chunk: str-replace($chunk, '?', '%3F');\n // $chunk: str-replace($chunk, ':', '%3A');\n // $chunk: str-replace($chunk, '@', '%40');\n // $chunk: str-replace($chunk, '=', '%3D');\n\n $encoded: #{$encoded}#{$chunk};\n $index: $index + $slice;\n }\n @return url(\"data:image/svg+xml,#{$encoded}\");\n}\n\n\n// Helper function to replace characters in a string\n@function str-replace($string, $search, $replace: '') {\n $index: str-index($string, $search);\n @return if($index,\n str-slice($string, 1, $index - 1) + $replace +\n str-replace(str-slice($string, $index +\n str-length($search)), $search, $replace),\n $string);\n}\n\n\n@function rgba-to-rgb($rgba, $background: #fff) {\n @return mix(rgb(red($rgba), green($rgba), blue($rgba)), $background, alpha($rgba) * 100%)\n}\n\n// lightens or darkens a color based on the existing lightness of a color (for easier switchig light/dark theme)\n@function lightendarken($color, $percent) {\n @if (lightness($color) > 50) {\n @return darken($color, $percent);\n } @else {\n @return lighten($color, $percent);\n }\n}\n\n\n@mixin fluid-type($min-vw, $max-vw, $min-font-size, $max-font-size) {\n $u1: unit($min-vw);\n $u2: unit($max-vw);\n $u3: unit($min-font-size);\n $u4: unit($max-font-size);\n\n @if $u1 == $u2 and $u1 == $u3 and $u1 == $u4 {\n & {\n font-size: rem($min-font-size);\n @media screen and (min-width: $min-vw) {\n font-size: calc(#{rem($min-font-size)} + #{strip-unit($max-font-size - $min-font-size)} * ((100vw - #{$min-vw}) / #{strip-unit($max-vw - $min-vw)}));\n }\n @media screen and (min-width: $max-vw) {\n font-size: rem($max-font-size);\n }\n }\n }\n}\n","html, body {\n height: 100%;\n width: 100%;\n background: map-get($colors, 'body-bg');\n scroll-behavior: smooth;\n}\n\n.l-app {\n display: flex;\n min-height: 100vh;\n flex-direction: column;\n\n padding-top: $header-height;\n background: map-get($colors, 'body-bg');\n //filter: invert(100%);\n\n &--has-sidebar {\n @include breakpoint(large) {\n padding-left: $sidebar-width;\n }\n }\n}\n\n.l-header {\n z-index: 2;\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: $header-height;\n background: map-get($colors, 'header-bg');\n border-bottom: 1px solid lightendarken(map-get($colors, border), 10%);\n box-shadow: 0 1px 4px 0 rgba(0,0,0,0.1);\n\n &__logo {\n flex: auto 0 0;\n position: relative;\n\n @include breakpoint(xlarge) {\n flex: $sidebar-width 0 0;\n flex: calc(#{$sidebar-width} - #{rem(30)}) 0 0;\n }\n }\n\n &__search {\n flex-basis: 50%;\n flex-grow: 0;\n flex-shrink: 1;\n position: relative;\n\n @include breakpoint(xlarge) {\n margin: rem(0 50 0 75);\n }\n\n @include breakpoint(small only) {\n position: fixed;\n width: 100%;\n margin: 0 !important;\n top: 3.75rem;\n background: map-get($colors, 'body-bg');\n height: calc(100vh - 2.25rem);\n padding: 0 1rem 1rem 1rem;\n transform: translateY(100%);\n transition: transform .4s ease-in-out, -webkit-transform .4s ease-in-out;\n }\n }\n &__versionswitch{\n margin: rem(0 15);\n }\n}\n@include breakpoint(small only) {\n #searchform:target {\n transform: translateY(0);\n }\n}\n\n.l-sidebar {\n outline: none;\n display: block;\n position: fixed;\n top: $header-height;\n bottom: 0;\n left: 0;\n width: 100%;\n transform: translateX(-100%);\n z-index: 1;\n padding: $main-margin-top rem(20) $global-margin;\n background: map-get($colors, 'sidebar-bg');\n border-right: 1px solid map-get($colors, border);\n overflow-y: scroll;\n -webkit-overflow-scrolling: touch;\n overflow-x: auto;\n transition: transform .4s ease-in-out;\n\n @include breakpoint($sidebar-breakpoint) {\n display: block;\n position: fixed;\n top: $header-height;\n bottom: 0;\n left: 0;\n width: $sidebar-width;\n transform: translateX(0);\n transition: none;\n }\n}\n\n#nav:target {\n transform: translateX(0);\n}\n\n\n.l-main {\n position: relative;\n margin: $main-margin-top rem(20) $global-margin;\n\n flex: 1;\n\n @include breakpoint(medium) {\n margin: $main-margin-top rem(50) $global-margin rem(75);\n }\n\n &__title {\n max-width: rem(1000);\n }\n\n &__contentwrapper {\n @include breakpoint(xlarge) {\n display: flex;\n justify-content: flex-start;\n flex-direction: row;\n }\n }\n\n &__content {\n @include breakpoint(medium) {\n padding-right: rem(25);\n }\n\n @include breakpoint(xlarge) {\n flex-basis: 80%;\n flex-grow: 0;\n flex-shrink: 1;\n order: 1;\n min-width: 0;\n }\n\n > :first-child {\n margin-top: 0;\n }\n }\n\n &__toc {\n @include breakpoint(xlarge) {\n flex-basis: 20%;\n flex-grow: 1;\n flex-shrink: 0;\n align-self: flex-start;\n order: 2;\n padding: rem(0 0 0 25);\n top: rem(75);\n position: sticky;\n }\n }\n\n}\n\n.l-footer {\n flex-basis: 100%;\n flex-shrink: 0;\n order: 3;\n padding: rem(30 15 15);\n margin: rem(45 0 0);\n border-top: 1px solid map-get($colors, border);\n\n @include breakpoint(medium) {\n padding: rem(30 75 15);\n }\n}\n\n@media (max-width: 768px) {\n .o-openmenu {\n order: 4;\n padding: 0 .9375rem 0 .9375rem !important;\n }\n .o-search, .l-header__search {\n order: 3;\n margin: 0 0.475rem 0 auto;\n }\n .l-header__versionswitch {\n order: 2;\n }\n .l-header__logo {\n order: 1;\n max-width: 25%;\n }\n}\n@media (max-width: 425px) {\n .l-footer {\n font-size: 14px;\n line-height: 1;\n padding: .9375rem .9375rem;\n .c-footer__nav{\n display: flex;\n justify-content: center;\n &link {\n padding: .425rem;\n }\n }\n .c-footer__copyright{\n font-size: 14px;\n line-height: 1;\n padding: .3rem .9375rem 0;\n text-align: center;\n }\n }\n}\n","// Foundation for Sites by ZURB\n// foundation.zurb.com\n// Licensed under MIT Open Source\n\n\n/// Casts a map into a list.\n/// @link http://hugogiraudel.com/2014/04/28/casting-map-into-list/\n///\n/// @param {Map} $map - Map to pull a value from.\n///\n/// @returns {List} Depending on the flag, returns either $keys or $values or both.\n@function map-to-list($map, $keep: 'both') {\n $keep: if(index('keys' 'values', $keep), $keep, 'both');\n\n @if type-of($map) == 'map' {\n $keys: ();\n $values: ();\n\n @each $key, $val in $map {\n $keys: append($keys, $key);\n $values: append($values, $val);\n }\n\n @if $keep == 'keys' {\n @return $keys;\n }\n @else if $keep == 'values' {\n @return $values;\n }\n @else {\n @return zip($keys, $values);\n }\n }\n\n @return if(type-of($map) != 'list', ($value,), $map);\n\n}\n\n\n////\n/// @group breakpoints\n////\n\n/// A list of named breakpoints. You can use these with the `breakpoint()` mixin to quickly create media queries.\n/// @type Map\n$breakpoints: (\n small: 0,\n medium: 640px,\n large: 1024px,\n xlarge: 1200px,\n xxlarge: 1440px,\n) !default;\n\n/// The largest named breakpoint in which to include print as a media type\n/// @type Keyword\n$print-breakpoint: large !default;\n\n$-zf-zero-breakpoint: small !default;\n\n$-zf-breakpoints-keys: map-to-list($breakpoints, 'keys');\n\n@if nth(map-values($breakpoints), 1) != 0 {\n @error 'The first key in the $breakpoints map must have a value of \"0\".';\n}\n@else {\n $-zf-zero-breakpoint: nth(map-keys($breakpoints), 1);\n}\n\n/// All of the names in this list will be output as classes in your CSS, like `.small-12`, `.medium-6`, and so on. Each value in this list must also be in the `$breakpoints` map.\n/// @type List\n$breakpoint-classes: (small medium large) !default;\n\n/// Generates a media query string matching the input value. Refer to the documentation for the `breakpoint()` mixin to see what the possible inputs are.\n///\n/// @param {Keyword|Number} $val [small] - Breakpoint name, or px, rem, or em value to process.\n@function breakpoint($val: $-zf-zero-breakpoint) {\n // Size or keyword\n $bp: nth($val, 1);\n // Value for max-width media queries\n $bp-max: 0;\n // Direction of media query (up, down, or only)\n $dir: if(length($val) > 1, nth($val, 2), up);\n // Eventual output\n $str: '';\n // Is it a named media query?\n $named: false;\n\n // Orientation media queries have a unique syntax\n @if $bp == 'landscape' or $bp == 'portrait' {\n @return '(orientation: #{$bp})';\n }\n @else if $bp == 'retina' {\n @return '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)';\n }\n\n // Try to pull a named breakpoint out of the $breakpoints map\n @if type-of($bp) == 'string' {\n @if map-has-key($breakpoints, $bp) {\n @if $dir == 'only' or $dir == 'down' {\n $bp-max: -zf-map-next($breakpoints, $bp);\n }\n\n $bp: map-get($breakpoints, $bp);\n $named: true;\n }\n @else {\n $bp: 0;\n @warn 'breakpoint(): \"#{$val}\" is not defined in your $breakpoints setting.';\n }\n }\n\n // Convert any pixel, rem, or unitless value to em\n $bp: -zf-bp-to-em($bp);\n // Max value is 0.2px under the next breakpoint (0.02 / 16 = 0.00125).\n // Use a precision under 1px to support browser zoom, but not to low to avoid rounding.\n // See https://github.com/zurb/foundation-sites/issues/11313\n @if $bp-max {\n $bp-max: -zf-bp-to-em($bp-max) - .00125;\n }\n\n // Conditions to skip media query creation\n // - It's a named breakpoint that resolved to \"0 down\" or \"0 up\"\n // - It's a numeric breakpoint that resolved to \"0 \" + anything\n @if $bp > 0em or $dir == 'only' or $dir == 'down' {\n // `only` ranges use the format `(min-width: n) and (max-width: n)`\n @if $dir == 'only' {\n // Only named media queries can have an \"only\" range\n @if $named == true {\n // Only use \"min-width\" if the floor is greater than 0\n @if $bp > 0em {\n $str: $str + '(min-width: #{$bp})';\n\n // Only add \"and\" to the media query if there's a ceiling\n @if $bp-max != null {\n $str: $str + ' and ';\n }\n }\n\n // Only use \"max-width\" if there's a ceiling\n @if $bp-max != null {\n $str: $str + '(max-width: #{$bp-max})';\n }\n }\n @else {\n @warn 'breakpoint(): Only named media queries can have an `only` range.';\n }\n }\n\n // `down` ranges use the format `(max-width: n)`\n @else if $dir == 'down' {\n $max: if($named, $bp-max, $bp);\n\n // Skip media query creation if input value is exactly \"0 down\",\n // unless the function was called as \"small down\", in which case it's just \"small only\"\n @if $named or $bp > 0em {\n @if $max != null {\n $str: $str + '(max-width: #{$max})';\n }\n }\n }\n\n // `up` ranges use the format `(min-width: n)`\n @else if $bp > 0em {\n $str: $str + '(min-width: #{$bp})';\n }\n }\n\n @return $str;\n}\n\n/// Wraps a media query around the content you put inside the mixin. This mixin accepts a number of values:\n/// - If a string is passed, the mixin will look for it in the `$breakpoints` map, and use a media query there.\n/// - If a pixel value is passed, it will be converted to an em value using `$global-font-size` as the base.\n/// - If a rem value is passed, the unit will be changed to em.\n/// - If an em value is passed, the value will be used as-is.\n///\n/// @param {Keyword|Number} $value - Breakpoint name, or px, rem, or em value to process.\n///\n/// @output If the breakpoint is \"0px and larger\", outputs the content as-is. Otherwise, outputs the content wrapped in a media query.\n@mixin breakpoint($value) {\n $str: breakpoint($value);\n $bp: index($-zf-breakpoints-keys, $value);\n $pbp: index($-zf-breakpoints-keys, $print-breakpoint);\n\n $old-zf-size: null;\n\n // Make breakpoint size available as a variable\n @if global-variable-exists(-zf-size) {\n $old-zf-size: $-zf-size;\n }\n $-zf-size: nth($value, 1) !global; // get the first value to account for `only` and `down` keywords\n\n // If $str is still an empty string, no media query is needed\n @if $str == '' {\n @content;\n }\n\n // Otherwise, wrap the content in a media query\n @else {\n // For named breakpoints less than or equal to $print-breakpoint, add print to the media types\n @if $bp != null and $bp <= $pbp {\n @media print, screen and #{$str} {\n @content;\n }\n }\n @else {\n @media screen and #{$str} {\n @content;\n }\n }\n }\n\n $-zf-size: $old-zf-size !global;\n}\n\n/// Convers the breakpoints map to a URL-encoded string, like this: `key1=value1&key2=value2`. The value is then dropped into the CSS for a special `` tag, which is read by the Foundation JavaScript. This is how we transfer values from Sass to JavaScript, so they can be defined in one place.\n/// @access private\n///\n/// @param {Map} $map - Map to convert.\n///\n/// @returns {String} A string containing the map's contents.\n@function -zf-bp-serialize($map) {\n $str: '';\n @each $key, $value in $map {\n $str: $str + $key + '=' + -zf-bp-to-em($value) + '&';\n }\n $str: str-slice($str, 1, -2);\n\n @return $str;\n}\n\n/// Find the next key in a map.\n/// @access private\n///\n/// @param {Map} $map - Map to traverse.\n/// @param {Mixed} $key - Key to use as a starting point.\n///\n/// @returns {Mixed} The value for the key after `$key`, if `$key` was found. If `$key` was not found, or `$key` was the last value in the map, returns `null`.\n@function -zf-map-next($map, $key) {\n\n // Store the keys of the map as a list\n $values: map-keys($map);\n\n $i: 0;\n\n // If the Key Exists, Get the index of the key within the map and add 1 to it for the next breakpoint in the map\n @if (map-has-key($map, $key)) {\n $i: index($values, $key) + 1;\n }\n\n // If the key doesn't exist, or it's the last key in the map, return null\n @if ($i > length($map) or $i == 0) {\n @return null;\n }\n // Otherwise, return the value\n @else {\n @return map-get($map, nth($values, $i));\n }\n\n}\n\n/// Return a list of our named breakpoints less than $key. Useful for dealing with\n/// responsive gutters for the grid.\n/// @access private\n///\n/// @param {String} $key - Key to use as last breakpoint.\n///\n/// @returns {Array} The list of breakpoints up to and. If $key is auto, returns breakpoints above the zero\n@function -zf-breakpoints-less-than($key) {\n $list: ();\n $found_key: false;\n\n @each $name in $-zf-breakpoints-keys {\n @if ($name == $key) {\n $found_key: true;\n }\n @if not $found_key {\n $list: append($list, $name);\n }\n }\n @return $list;\n}\n\n/// Return a list of our named breakpoints less than $key. Useful for dealing with\n/// responsive gutters for the grid.\n/// @access private\n///\n/// @param {String} $breakpoint - a named or non-named breakpoint.\n///\n/// @returns {Array} The list of breakpoints up to and. If $key is auto, returns breakpoints above the zero\n@function -zf-closest-named-breakpoint($breakpoint) {\n $last: $-zf-zero-breakpoint;\n $found: false;\n\n $value: unitless-calc($breakpoint, 1px);\n @each $key, $val in $breakpoints {\n @if not $found {\n @if unitless-calc($val) > $value {\n $found: true;\n } @else {\n $last: $key;\n }\n }\n }\n\n @return $last;\n}\n\n/// Get a value for a breakpoint from a responsive config map or single value.\n/// - If the config is a single value, return it regardless of `$value`.\n/// - If the config is a map and has the key `$value`, the exact breakpoint value is returned.\n/// - If the config is a map and does *not* have the breakpoint, the value matching the next lowest breakpoint in the config map is returned.\n/// @access private\n///\n/// @param {Number|Map} $map - Responsive config map or single value.\n/// @param {Keyword} $value - Breakpoint name to use.\n///\n/// @return {Mixed} The corresponding breakpoint value.\n@function -zf-get-bp-val($map, $value) {\n // If the given map is a single value, return it\n @if type-of($map) == 'number' {\n @return $map;\n }\n\n\n // Check if the breakpoint name exists globally\n @if not map-has-key($breakpoints, $value) {\n @if type-of($value) == 'number' {\n $value: -zf-closest-named-breakpoint($value);\n } @else {\n @return null;\n }\n }\n // Check if the breakpoint name exists in the local config map\n @else if map-has-key($map, $value) {\n // If it does, just return the value\n @return map-get($map, $value);\n }\n // Otherwise, find the next lowest breakpoint and return that value\n @else {\n $anchor: null;\n $found: false;\n\n @each $key, $val in $breakpoints {\n @if not $found {\n @if map-has-key($map, $key) {\n $anchor: $key;\n }\n @if $key == $value {\n $found: true;\n }\n }\n }\n\n @return map-get($map, $anchor);\n }\n}\n\n$small-up: '';\n$small-only: '';\n\n@if map-has-key($breakpoints, small) {\n $small-up: screen;\n $small-only: unquote('screen and #{breakpoint(small only)}');\n}\n\n$medium-up: '';\n$medium-only: '';\n\n@if map-has-key($breakpoints, medium) {\n $medium-up: unquote('screen and #{breakpoint(medium)}');\n $medium-only: unquote('screen and #{breakpoint(medium only)}');\n}\n\n$large-up: '';\n$large-only: '';\n\n@if map-has-key($breakpoints, large) {\n $large-up: unquote('screen and #{breakpoint(large)}');\n $large-only: unquote('screen and #{breakpoint(large only)}');\n}\n\n$xlarge-up: '';\n$xlarge-only: '';\n\n@if map-has-key($breakpoints, xlarge) {\n $xlarge-up: unquote('screen and #{breakpoint(xlarge)}');\n $xlarge-only: unquote('screen and #{breakpoint(xlarge only)}');\n}\n\n$xxlarge-up: '';\n\n@if map-has-key($breakpoints, xxlarge) {\n $xxlarge-up: unquote('screen and #{breakpoint(xxlarge)}');\n}\n",".o-logo {\n margin: rem(0 15);\n padding: rem(0);\n &__image {\n display: block;\n width: rem(170);\n max-width: 100%;\n height: $header-height;\n fill: map-get($colors, 'header-text');\n\n @include breakpoint(medium) {\n width: rem(200);\n }\n }\n}\n\n.o-docmeta {\n margin: rem(-15) 0 $global-margin*2;\n}\n\n.o-sidebar-heading {\n display: block;\n margin: 0 0 $global-margin;\n font-size: rem(20);\n font-weight: 700;\n}\n\n\n.o-openmenu, .o-search {\n display: block;\n margin: rem(0);\n padding: rem(0 15 0 30);\n\n &__icon {\n display: block;\n width: rem(29);\n height: $header-height;\n fill: map-get($colors, 'header-text');\n }\n\n /*\n &--opened {\n .o-openmenu__icon {\n fill: transparent;\n }\n }\n */\n}\n@include breakpoint($sidebar-breakpoint) {\n .o-openmenu {\n display: none;\n }\n}\n@include breakpoint(medium) {\n .o-search {\n display: none;\n }\n}\n@include breakpoint(small only) {\n .o-logo{\n margin: rem(0 7);\n }\n .o-search {\n padding: rem(0 7);\n }\n}\n.o-closemenu {\n z-index: 1;\n position: absolute;\n top: rem(10);\n right: rem(10);\n display: block;\n padding: rem(15 15);\n\n @include breakpoint($sidebar-breakpoint) {\n display: none;\n }\n\n &__icon {\n display: block;\n width: rem(30);\n height: rem(30);\n fill: map-get($colors, 'primary');\n }\n}\n","$breadcrum-item-spacing: rem(5);\n\n.c-breadcrumb {\n margin: 0 0 $global-margin;\n\n &__list {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n margin: 0 $breadcrum-item-spacing*-1;\n padding: 0;\n list-style: none;\n }\n\n &__item {\n display: block;\n flex: auto 0 0;\n }\n\n &__link {\n display: inline-block;\n padding: rem(4) $breadcrum-item-spacing;\n line-height: 1.4;\n font-size: rem(14);\n color: map-get($colors, gray);\n }\n\n &__item + &__item:before {\n content: \"\";\n display: inline-block;\n width: rem(10);\n height: rem(11);\n margin-left: rem(5);\n margin-right: rem(-1);\n background: svg-url('');\n background-repeat: no-repeat;\n background-size: 100% 100%;\n background-position: center center;\n opacity: 0.25;\n }\n}\n",".c-callout {\n color: map-get($colors, gray);\n display: block;\n margin: 0 0 $global-margin;\n padding: rem(15 20);\n background-color: map-get($colors, 'callout-info-bg');\n border-left: rem(3) solid map-get($colors, 'callout-info-border');\n a{\n color: map-get($colors, 'link-color');\n }\n\n &__title {\n display: block;\n margin: rem(0 0 5);\n text-transform: uppercase;\n letter-spacing: 1.1;\n }\n a:hover{\n color: lightendarken(map-get($colors, 'link-color'), 15%);\n }\n\n &--info{\n background-color: map-get($colors, 'callout-info-bg');\n border-color: map-get($colors, 'callout-info-border');\n a{\n color: map-get($colors, 'link-color');\n }\n }\n\n &--warning {\n background-color: map-get($colors, 'callout-warning-bg');\n border-color: map-get($colors, 'callout-warning-border');\n a{\n color: #d09c13;\n }\n }\n\n &--alert {\n background-color: map-get($colors, 'callout-alert-bg');\n border-color: map-get($colors, 'callout-alert-border');\n a{\n color: #d26d69;\n }\n }\n\n &--success {\n background-color: map-get($colors, 'callout-success-bg');\n border-color: map-get($colors, 'callout-success-border');\n a{\n color:#3e8554;\n }\n }\n}\n","/**\n * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML\n * Based on https://github.com/chriskempson/tomorrow-theme\n * @author Rose Pritchard\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #ccc;\n\tbackground: none;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #2d2d2d;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.block-comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #999;\n}\n\n.token.punctuation {\n\tcolor: #ccc;\n}\n\n.token.tag,\n.token.attr-name,\n.token.namespace,\n.token.deleted {\n\tcolor: #e2777a;\n}\n\n.token.function-name {\n\tcolor: #6196cc;\n}\n\n.token.boolean,\n.token.number,\n.token.function {\n\tcolor: #f08d49;\n}\n\n.token.property,\n.token.class-name,\n.token.constant,\n.token.symbol {\n\tcolor: #f8c555;\n}\n\n.token.selector,\n.token.important,\n.token.atrule,\n.token.keyword,\n.token.builtin {\n\tcolor: #cc99cd;\n}\n\n.token.string,\n.token.char,\n.token.attr-value,\n.token.regex,\n.token.variable {\n\tcolor: #7ec699;\n}\n\n.token.operator,\n.token.entity,\n.token.url {\n\tcolor: #67cdcc;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.token.inserted {\n\tcolor: green;\n}\n",".command-line-prompt {\n\tborder-right: 1px solid #999;\n\tdisplay: block;\n\tfloat: left;\n\tfont-size: 100%;\n\tletter-spacing: -1px;\n\tmargin-right: 1em;\n\tpointer-events: none;\n\ttext-align: right;\n\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.command-line-prompt > span:before {\n\topacity: 0.7;\n\tcontent: ' ';\n\tdisplay: block;\n\tpadding-right: 0.8em;\n}\n\n.command-line-prompt > span[data-user]:before {\n\tcontent: \"[\" attr(data-user) \"@\" attr(data-host) \"] $\";\n}\n\n.command-line-prompt > span[data-user=\"root\"]:before {\n\tcontent: \"[\" attr(data-user) \"@\" attr(data-host) \"] #\";\n}\n\n.command-line-prompt > span[data-prompt]:before {\n\tcontent: attr(data-prompt);\n}\n\n.command-line-prompt > span[data-continuation-prompt]:before {\n\tcontent: attr(data-continuation-prompt);\n}\n\n.command-line span.token.output {\n\t/* Make shell output lines a bit lighter to distinguish them from shell commands */\n\topacity: 0.7;\n}\n","pre[data-line] {\n\tposition: relative;\n\tpadding: 1em 0 1em 3em;\n}\n\n.line-highlight {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\tpadding: inherit 0;\n\tmargin-top: 1em; /* Same as .prism’s padding-top */\n\n\tbackground: hsla(24, 20%, 50%,.08);\n\tbackground: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));\n\n\tpointer-events: none;\n\n\tline-height: inherit;\n\twhite-space: pre;\n}\n\n@media print {\n\t.line-highlight {\n\t\t/*\n\t\t * This will prevent browsers from replacing the background color with white.\n\t\t * It's necessary because the element is layered on top of the displayed code.\n\t\t */\n\t\t-webkit-print-color-adjust: exact;\n\t\tcolor-adjust: exact;\n\t}\n}\n\n\t.line-highlight:before,\n\t.line-highlight[data-end]:after {\n\t\tcontent: attr(data-start);\n\t\tposition: absolute;\n\t\ttop: .4em;\n\t\tleft: .6em;\n\t\tmin-width: 1em;\n\t\tpadding: 0 .5em;\n\t\tbackground-color: hsla(24, 20%, 50%,.4);\n\t\tcolor: hsl(24, 20%, 95%);\n\t\tfont: bold 65%/1.5 sans-serif;\n\t\ttext-align: center;\n\t\tvertical-align: .3em;\n\t\tborder-radius: 999px;\n\t\ttext-shadow: none;\n\t\tbox-shadow: 0 1px white;\n\t}\n\n\t.line-highlight[data-end]:after {\n\t\tcontent: attr(data-end);\n\t\ttop: auto;\n\t\tbottom: .4em;\n\t}\n\n.line-numbers .line-highlight:before,\n.line-numbers .line-highlight:after {\n\tcontent: none;\n}\n\npre[id].linkable-line-numbers span.line-numbers-rows {\n\tpointer-events: all;\n}\npre[id].linkable-line-numbers span.line-numbers-rows > span:before {\n\tcursor: pointer;\n}\npre[id].linkable-line-numbers span.line-numbers-rows > span:hover:before {\n\tbackground-color: rgba(128, 128, 128, .2);\n}\n","pre[class*=\"language-\"].line-numbers {\n\tposition: relative;\n\tpadding-left: 3.8em;\n\tcounter-reset: linenumber;\n}\n\npre[class*=\"language-\"].line-numbers > code {\n\tposition: relative;\n\twhite-space: inherit;\n}\n\n.line-numbers .line-numbers-rows {\n\tposition: absolute;\n\tpointer-events: none;\n\ttop: 0;\n\tfont-size: 100%;\n\tleft: -3.8em;\n\twidth: 3em; /* works for line-numbers below 1000 lines */\n\tletter-spacing: -1px;\n\tborder-right: 1px solid #999;\n\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\n}\n\n\t.line-numbers-rows > span {\n\t\tdisplay: block;\n\t\tcounter-increment: linenumber;\n\t}\n\n\t\t.line-numbers-rows > span:before {\n\t\t\tcontent: counter(linenumber);\n\t\t\tcolor: #999;\n\t\t\tdisplay: block;\n\t\t\tpadding-right: 0.8em;\n\t\t\ttext-align: right;\n\t\t}\n","div.code-toolbar {\n\tposition: relative;\n}\n\ndiv.code-toolbar > .toolbar {\n\tposition: absolute;\n\tz-index: 10;\n\ttop: .3em;\n\tright: .2em;\n\ttransition: opacity 0.3s ease-in-out;\n\topacity: 0;\n}\n\ndiv.code-toolbar:hover > .toolbar {\n\topacity: 1;\n}\n\n/* Separate line b/c rules are thrown out if selector is invalid.\n IE11 and old Edge versions don't support :focus-within. */\ndiv.code-toolbar:focus-within > .toolbar {\n\topacity: 1;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item {\n\tdisplay: inline-block;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a {\n\tcursor: pointer;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > button {\n\tbackground: none;\n\tborder: 0;\n\tcolor: inherit;\n\tfont: inherit;\n\tline-height: normal;\n\toverflow: visible;\n\tpadding: 0;\n\t-webkit-user-select: none; /* for button */\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a,\ndiv.code-toolbar > .toolbar > .toolbar-item > button,\ndiv.code-toolbar > .toolbar > .toolbar-item > span {\n\tcolor: #bbb;\n\tfont-size: .8em;\n\tpadding: 0 .5em;\n\tbackground: #f5f2f0;\n\tbackground: rgba(224, 224, 224, 0.2);\n\tbox-shadow: 0 2px 0 0 rgba(0,0,0,0.2);\n\tborder-radius: .5em;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > a:focus,\ndiv.code-toolbar > .toolbar > .toolbar-item > button:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > button:focus,\ndiv.code-toolbar > .toolbar > .toolbar-item > span:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > span:focus {\n\tcolor: inherit;\n\ttext-decoration: none;\n}\n","// include prisimjs styles\n@import '../../../node_modules/prismjs/themes/prism-tomorrow';\n@import '../../../node_modules/prismjs/plugins/command-line/prism-command-line';\n@import '../../../node_modules/prismjs/plugins/line-highlight/prism-line-highlight';\n@import '../../../node_modules/prismjs/plugins/line-numbers/prism-line-numbers';\n@import '../../../node_modules/prismjs/plugins/toolbar/prism-toolbar';\n\n// override background color\n// :not(pre)>code[class*=\"language-\"], pre[class*=\"language-\"] {\n// background: map-get($colors, 'sidebar-bg');\n// }\n\n.token.operator {\n background: none;\n}\n",".c-history {\n display: flex;\n align-items: center;\n margin: -.9375rem 0 1.875rem;\n}\n.c-contributors {\n display: flex;\n}\n.c-contributor {\n width: 30px;\n height: 30px;\n margin-left: -10px;\n border: 2px solid #fff;\n border-radius: 15px;\n\n &:first-child {\n margin-left: 0;\n }\n}\n.c-last-edit {\n max-width: 100%;\n margin-bottom: 0;\n padding-left: 0.5em;\n font-size: 0.9em;\n font-weight: 500;\n color: #555;\n flex: 1; // fixes mobile rendering\n}\n",".c-footer {\n\n &__grid {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n }\n\n &__cell {\n width: 100%;\n\n @include breakpoint(large) {\n width: auto;\n }\n }\n\n &__copyright {\n color: map-get($colors, gray);\n }\n\n &__nav {\n margin: rem(0 -10);\n padding: 0;\n list-style: none;\n }\n\n &__navitem {\n display: inline-block;\n }\n\n &__navlink {\n display: block;\n font-weight: 700;\n padding: rem(10);\n color: map-get($colors, gray);\n\n &:hover {\n color: map-get($colors, primary);\n }\n }\n}","\n.heading-link {\n display: inline-block;\n margin-left: 0.67em;\n transition: opacity 0.25s ease-in-out;\n opacity: 0;\n font-size: 0.8em;\n bottom: 0.2em;\n}\n\nh1, h2, h3, h4, h5, h6 {\n &:hover .heading-link {\n opacity: 1;\n }\n}\n\n@include breakpoint(medium up) {\n h1, h2, h3, h4, h5, h6 {\n position: relative;\n margin-left: -3rem;\n padding-left: 3rem;\n\n &:target .heading-link{\n opacity: 1;\n }\n }\n .heading-link {\n left: 0;\n position: absolute;\n }\n}\n",".c-nav {\n margin: rem(0 0 0 -20);\n padding: 0;\n list-style: none;\n\n &__item {\n margin: 0;\n padding: 0;\n list-style: none;\n font-size: rem(15);\n line-height: 1.4;\n\n a {\n position: relative;\n display: block;\n margin-bottom: rem(10);\n padding: rem(0 0 0 20);\n text-decoration: none;\n font-weight: 500;\n color: map-get($colors, slateGray);\n transition: all .2s ease;\n\n &:hover {\n color: lightendarken(map-get($colors, 'link-color'), 15%);\n transform: translateX(2px);\n }\n }\n\n &--activepage {\n .c-nav__chevron {\n top: 0.35rem;\n }\n > a {\n position: relative;\n color: map-get($colors, 'nav-active');\n padding: 0.35rem 0 0.35rem 3.5rem;\n transition: all .2s ease;\n\n &:after, &:before {\n border: 0 solid #e2e8f0;\n }\n\n &:hover{\n transform: translateX(0);\n }\n\n .inset{\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n position: absolute;\n border-radius: .25rem;\n opacity: .25;\n background-color:map-get($colors, 'nav-active-bg');\n }\n }\n\n }\n\n &--level1 > a {\n font-size: rem(16);\n font-weight: 700;\n padding-left: rem(30);\n }\n\n &--level2 > a {\n padding-left: rem(50);\n }\n\n &--level3 > a {\n padding-left: rem(60);\n }\n\n &--level4 > a {\n padding-left: rem(80);\n }\n\n &--level5 > a {\n padding-left: rem(100);\n }\n\n &--level6 > a {\n padding-left: rem(120);\n }\n\n &--level7> a {\n padding-left: rem(140);\n }\n\n /*\n &--has-children > a {\n position: relative;\n &:before {\n content: \"\";\n display: inline-block;\n position: absolute;\n top: rem(1);\n height: rem(20);\n width: rem(20);\n margin: rem(0 0 0 -23);\n background: svg-url('');\n background-repeat: no-repeat;\n background-size: rem(7);\n background-position: center center;\n opacity: 0.6;\n transform: rotate(-90deg);\n }\n }*/\n\n &--collapsed {\n > ul {\n display: none;\n }\n > a > .c-nav__chevron {\n top: rem(1);\n transform: rotate(90deg);\n }\n }\n\n }\n\n &__chevron {\n display: inline-block;\n position: absolute;\n top: 0;\n height: rem(21);\n width: rem(21);\n padding: rem(5);\n margin: rem(0 0 0 -23);\n fill: rgba(map-get($colors, 'body-text'), 0.6);\n transform: rotate(-90deg);\n vertical-align: middle;\n }\n\n\n &__sublist {\n margin: 0 0 $global-margin*2;\n padding: 0;\n }\n}\n\n::-webkit-scrollbar, ::-webkit-scrollbar-thumb {\n width: 1rem;\n height: 1rem;\n border: .25rem solid transparent;\n border-radius: .5rem;\n background-color: transparent;\n}\n\n::-webkit-scrollbar-thumb {\n box-shadow: inset 0 0 0 1rem rgba(85,108,136,.1);\n}\n\n::-webkit-scrollbar-thumb:hover {\n box-shadow: inset 0 0 0 1rem rgba(85,108,136,.2);\n}\n\n::-webkit-resizer, ::-webkit-scrollbar-corner {\n background-color: transparent;\n}\n",".l-main__oc, .c-oc__more {\n display: none;\n @include breakpoint(xlarge) {\n display: block;\n }\n}\n.l-main__oc--below, .c-oc__more--below {\n display: block;\n @include breakpoint(xlarge) {\n display: none;\n }\n}\n\n.l-main__oc {\n margin-top: 5em;\n\n background: map-get($colors, 'sidebar-bg');\n color: map-get($colors, 'sidebar-text');\n padding: 1em;\n border-radius: 1em;\n border: 1px solid transparent;\n transition: background-color .5s ease-in-out;\n text-decoration: none !important;\n max-width: rem(400);\n\n @include breakpoint(xlarge) {\n margin-left: rem(-25);\n }\n\n .c-oc__member_image {\n transition: border .5s ease-in-out;\n }\n &:hover {\n color: map-get($colors, 'sidebar-text');\n background: #e3efff;\n\n .c-oc__member_image {\n border-color: #e3efff;\n }\n\n }\n}\n\n.c-oc__logo {\n max-width: 100%;\n max-height: 60px;\n}\n\n.c-oc__text {\n font-size: rem(13);\n font-weight: 500;\n}\n\n.c-oc__subtitle {\n font-size: rem(13);\n font-weight: 700;\n text-transform: uppercase;\n}\n\n.c-oc__members {\n padding-left: 0;\n list-style: none;\n margin-bottom: 25px;\n padding-right: 25px;\n margin-left: -28px;\n margin-right: -35px;\n text-align: center;\n}\n.c-oc__member {\n display: inline-block;\n margin-right: -20px;\n margin-bottom: -15px;\n}\n\n.c-oc__member_image {\n width: 60px;\n height: 60px;\n border-radius: 50%;\n border: 5px solid map-get($colors, 'sidebar-bg');\n background: #00B5DE;\n}\n\n.c-oc__total {\n\n span {\n height: 60px;\n background: #00B5DE;\n border-radius: 30px;\n border: 5px solid map-get($colors, 'sidebar-bg');\n color: #fff;\n padding: 0.7em 1em;\n font-weight: 600;\n display: block;\n }\n}\n\n.c-oc__more {\n text-align: center;\n font-size: rem(13);\n font-weight: 500;\n text-decoration: underline;\n margin-top: 1em;\n margin-left: -1em;\n max-width: rem(400);\n}\n",".c-optionswitch {\n\n &__current {\n display: block;\n padding: rem(7 10);\n color: map-get($colors, 'header-text');\n white-space: nowrap;\n background: map-get($colors, 'header-bg');\n transition: background-color .2s ease-in-out;\n border-radius: $global-radius;\n\n &:hover {\n color: map-get($colors, 'header-text');\n background: lighten(map-get($colors, 'header-bg'), 5%);\n }\n }\n\n &__currentchevron {\n display: inline-block;\n width: rem(10);\n height: rem(10);\n fill: map-get($colors, 'header-text');\n vertical-align: middle;\n margin: rem(-1 0 0 3);\n transform: rotate(90deg);\n }\n\n &__listwrapper {\n position: absolute;\n top: $header-height - rem(1);\n display: none;\n background: map-get($colors, 'optionswitch-bg');\n box-shadow: rem(0 3 8 0) rgba(116, 129, 141, 0.1);\n\n @include breakpoint(xxlarge) {\n right: 0;\n }\n @include breakpoint(1440 down) {\n right: 0;\n }\n @include breakpoint(768 down) {\n right: 0;\n }\n\n &:target {\n display: block;\n\n @include breakpoint(medium up) {\n display: flex;\n }\n\n &:before {\n content: none;\n }\n }\n }\n\n &__list {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n &__item {\n position: relative;\n display: block;\n }\n\n &__link {\n display: block;\n padding: rem(4 10);\n color: map-get($colors, 'header-text');\n transition-duration: .2s;\n transition-timing-function: cubic-bezier(.4,0,.2,1);\n transition-property: background-color,border-color,color;\n\n &:hover {\n color: map-get($colors, 'header-text');\n background: lighten(map-get($colors, 'header-bg'), 5%);\n }\n }\n\n &__item--active &__link {\n background: lighten(map-get($colors, 'header-bg'), 7%);\n }\n\n &__translation {\n color: darken(map-get($colors, 'header-text'), 15%);\n\n &:before {\n content: \"(\";\n }\n &:after {\n content: \")\";\n }\n }\n\n &__note {\n padding: rem(0 10 10);\n color: darken(map-get($colors, 'header-text'), 15%);\n }\n}\n",".l-main-search__container {\n list-style: none;\n padding: 0;\n margin-bottom: 2rem;\n}\n\n.l-main-search__result, .l-live-search__result {\n border-top: 1px solid map_get($colors, 'header-bg');\n padding-top: 1rem;\n margin-top: 1rem;\n\n .c-breadcrumb {\n margin-bottom: 0;\n }\n\n h4 {\n margin-top: 0;\n margin-bottom: 0;\n }\n\n @include breakpoint(small only) {\n &:first-child {\n border-top: none;\n }\n }\n}\n\n.l-main-search__match, .l-live-search__match {\n summary {\n float: right;\n color: #777;\n }\n}\n\n.l-search__pagination-holder {\n list-style: none;\n padding: 0;\n text-align: center;\n}\n.l-search-page {\n display: inline-block;\n}\n.l-search-page__link {\n display: block;\n cursor: pointer;\n padding: .5rem 1rem;\n line-height: initial;\n background: #e2e8f0;\n color: map-get($colors, mirage);\n border-radius: 0.25rem;\n border: 1px solid #e2e8f0;\n\n &:hover, &:focus{\n background: map_get($colors, slateGray);\n border: 1px solid map_get($colors, #708090);\n color: map_get($colors, light);\n }\n\n &--active {\n background: map_get($colors, sapphire);\n border: 1px solid map_get($colors, sapphire);\n color: map_get($colors, light);\n }\n}\n\n.c-searchform--resultspage {\n margin-bottom: 1rem;\n .c-searchform__input {\n border: 1px solid map_get($colors, 'header-bg');\n }\n}\n.l-search__meta {\n color: map_get($colors, gray);\n}\n\n\n$ignoredColor: map_get($colors, warning);\n.l-search__ignored {\n border-left: rem(8) solid $ignoredColor;\n padding: rem(15 20);\n background-color: rgba($ignoredColor, 0.3);\n color: darken($ignoredColor, 50%);\n}\n$tipColor: map_get($colors, primary);\n.l-search__tip {\n border-left: rem(8) solid $tipColor;\n padding: rem(15 20);\n background-color: rgba($tipColor, 0.3);\n color: darken($tipColor, 50%);\n}\n\n$errorColor: map_get($colors, alert);\n.l-search__no_results {\n border-left: rem(4) solid $errorColor;\n padding: rem(15 20);\n background-color: rgba($errorColor, 0.3);\n color: darken($errorColor, 50%);\n max-width: 100%;\n\n &--live {\n margin: 0;\n }\n}\n\n.c-searchform--header {\n z-index: 5;\n}\n.l-live-search__container {\n position: absolute;\n background: #fff;\n width: 100%;\n display: none;\n border-radius: 0 0 5px 5px;\n margin-top: -3px;\n z-index: 4;\n box-shadow: 0 2px 7px 2px rgba(0,0,0,0.5);\n\n &--visible {\n display: block;\n }\n\n &--loading {\n &::before {\n content: \"Loading...\";\n width: 100%;\n display: block;\n padding: 0.5em 0.5em 0.5em 1em;\n border-radius: 5px 5px 0 0;\n color: map_get($colors, 'header-text');\n background: map_get($colors, 'header-bg');\n\n }\n &:empty::before {\n border-radius: 5px;\n }\n }\n\n @include breakpoint(small only) {\n position: initial;\n margin-top: 1em;\n border-radius: 7px;\n box-shadow: none;\n border: 1px solid #3b68af;\n }\n}\n.l-live-search__results {\n list-style: none;\n padding: 0;\n margin: 0;\n max-height: 70vh;\n overflow-y: scroll;\n\n @include breakpoint(small only) {\n max-height: calc(100vh - 15rem);\n }\n}\n.l-live-search__result, .l-main-search__result {\n padding: 0;\n margin: 0;\n position: relative;\n}\n.c-live-search__result-crumbs, .l-main-search__crumbs {\n position: absolute;\n top: 0.7rem;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 0 1rem;\n height: 1.6em; // = line-height\n overflow: hidden;\n font-weight: 500;\n}\n.c-live-search__result-link, .l-main-search__link {\n color: map-get($colors, sapphire);\n display: block;\n padding: 2.2rem 1rem 0.7rem;\n font-weight: 500;\n &:hover, &:focus, .l-live-search__result--selected & {\n background: #f0f6ff;\n }\n}\n.l-live-search__search {\n margin: 0;\n a {\n font-weight: 500;\n display: block;\n padding: 0.7rem 1rem;\n width: 100%;\n color: map_get($colors, 'header-text');\n background: map_get($colors, 'header-bg');\n border-radius: 0 0 5px 5px;\n }\n}\n.l-main-search__result {\n max-width: $paragraph-max-width;\n}\n.l-main-search__title {\n color: map-get($colors, sapphire);\n}\n.l-main-search__link {\n text-decoration: none !important;\n &:hover, &:focus {\n .l-main-search__title {\n color: lightendarken(map-get($colors, 'link-color'), 15%);\n }\n }\n}\n.l-main-search__snippet {\n color: map-get($colors, 'body-text');\n}\n.size_code{\n font-size: 1em;\n}\n",".c-searchform {\n position: relative;\n width: 100%;\n\n @include breakpoint(small only) {\n margin-top: 1rem;\n }\n\n &__input {\n display: block;\n width: 100%;\n border: none;\n border-radius: .5rem;\n padding: rem(10 35 10 20);\n line-height: 1.5!important;\n font-family: inherit;\n font-size: 100%;\n transition: all .1s ease-in;\n background-color: #edf2f7;\n\n &:focus{\n border-color: #e2e8f0;\n background-color: #fff;\n }\n\n @include breakpoint(small only) {\n border: 1px solid map_get($colors, 'header-bg');\n }\n }\n\n &__button {\n position: absolute;\n top: rem(0);\n right: rem(10);\n bottom: rem(0);\n margin: 0;\n padding: 0;\n background: transparent;\n border: none;\n }\n\n &__icon {\n width: rem(24);\n height: rem(20);\n fill: #717171;\n vertical-align: middle;\n }\n}\n\n// Undo helpers.scss:14 for the searchform target; without this there's an unclickable area before the search.\n#searchform:target:before {\n content: \"\";\n height: 0;\n margin: 0;\n}\n","table {\n display: block;\n width: fit-content;\n //min-width: 100%;\n max-width: 100%;\n max-width: calc(100% + #{rem(20)});\n margin: $global-margin*2 0;\n border-collapse: collapse;\n overflow-x: auto;\n\n @include breakpoint(medium) {\n display: table;\n table-layout:fixed;\n width: 100%;\n max-width: 100%;\n\n td {\n word-wrap: break-word;\n }\n }\n\n tr:nth-child(2n) {\n background: map-get($colors, 'sidebar-bg');\n }\n\n td, th {\n border: 1px solid lightendarken(map-get($colors, 'border'), 10%);\n padding: rem(9 16);\n }\n\n th {\n font-weight: 700;\n text-align: center;\n }\n\n td {\n min-width: rem(170);\n\n @include breakpoint(medium) {\n min-width: 0;\n }\n }\n\n &::-webkit-scrollbar, &::-webkit-scrollbar-thumb {\n width: 1rem;\n height: 1rem;\n border: .25rem solid transparent;\n border-radius: .5rem;\n background-color: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n box-shadow: inset 0 0 0 1rem rgba(85,108,136,.1);\n }\n\n &::-webkit-scrollbar-thumb:hover {\n box-shadow: inset 0 0 0 1rem rgba(85,108,136,.2);\n }\n\n &::-webkit-resizer, &::-webkit-scrollbar-corner {\n background-color: transparent;\n }\n}\n",".c-toc {\n position: relative;\n margin: 0 0 $global-margin*2;\n/*\n &__wrapper {\n @include breakpoint(xlarge) {\n position: absolute;\n top: rem(15);\n left: 100%;\n left: calc(100% + #{rem(50)});\n width: rem(250);\n }\n }\n*/\n &__title {\n display: block;\n margin: 0 0 rem(5);\n font-size: rem(12);\n font-weight: 700;\n color: map-get($colors, cadetBlue);\n text-transform: uppercase;\n }\n\n ul {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n &__wrapper > ul {\n //padding-left: rem(15);\n }\n\n &__wrapper > ul > li {\n margin: 0 0 rem(7);\n\n &:last-child {\n margin-bottom: 0;\n }\n\n > a {\n font-weight: 700;\n }\n }\n\n a {\n display: block;\n margin: rem(0 0 3);\n font-size: rem(13);\n font-weight: 500;\n color: map-get($colors, slateGray);\n line-height: 1.4;\n transition: all .2s ease;\n\n &:hover {\n color: map-get($colors, mirage);\n transform: translateX(2px);\n }\n }\n\n li li {\n padding-left: rem(15);\n }\n}\n",".u-show-for-sr, .u-show-on-focus {\n position: absolute !important;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n// make anchor tags work with fixed header\n:target:before {\n content:\"\";\n display:block;\n height: ($header-height+$main-margin-top); /* fixed header height*/\n margin: (($header-height+$main-margin-top)*-1) 0 0; /* negative fixed header height */\n}\n\n.is-brokenlink {\n color: map-get($colors, 'link-broken');\n text-decoration: line-through;\n\n &:after {\n content: \" (link broken)\";\n text-decoration: none;\n }\n}\n\n// style external links\n//.o-content a[href*=\"//\"]:not([href*=\"docs.modx.org\"]),\n.is-externallink {\n &:after {\n content: \"\";\n display: inline-block;\n width: rem(10);\n height: rem(10);\n margin: rem(-1 2 0 4);\n\n background: svg-url('');\n background-size: 100% 100%;\n background-repeat: no-repeat;\n background-position: center center;\n }\n}\n\n.u-no-margin {\n margin: 0 !important;\n}\n.u-no-margin--top {\n margin-top: 0 !important;\n}\n.u-no-margin--bottom {\n margin-bottom: 0 !important;\n}\n\n.u-no-padding {\n padding: 0 !important;\n}\n.u-no-padding--top {\n padding-top: 0 !important;\n}\n.u-no-padding--bottom {\n padding-bottom: 0 !important;\n}\n\nhtml.no-js {\n .u-show-with-js {\n display: none !important;\n }\n}\nhtml.js {\n .u-hide-with-js {\n display: none !important;\n }\n .u-hide-with-js-sr {\n @extend .u-show-for-sr;\n }\n}\n","@media print {\n .l-app > * {\n display: none;\n }\n\n .l-app .l-main {\n display: block;\n }\n}"]} \ No newline at end of file +{"version":3,"sources":["../node_modules/modern-normalize/modern-normalize.css","../src/scss/_settings.scss","../src/scss/_typography.scss","../src/scss/_functions.scss","../src/scss/_layout.scss","../src/scss/_breakpoints.scss","../src/scss/_objects.scss","../src/scss/components/_breadcrumb.scss","../src/scss/components/_callout.scss","../node_modules/prismjs/themes/prism-tomorrow.css","../node_modules/prismjs/plugins/command-line/prism-command-line.css","../node_modules/prismjs/plugins/line-highlight/prism-line-highlight.css","../node_modules/prismjs/plugins/line-numbers/prism-line-numbers.css","../node_modules/prismjs/plugins/toolbar/prism-toolbar.css","../src/scss/components/_code.scss","../src/scss/components/_contributors.scss","../src/scss/components/_footer.scss","../src/scss/components/_heading_links.scss","../src/scss/components/_nav.scss","../src/scss/components/_opencollective.scss","../src/scss/components/_optionswitch.scss","../src/scss/components/_search.scss","../src/scss/components/_searchform.scss","../src/scss/components/_table.scss","../src/scss/components/_themetoggle.scss","../src/scss/components/_toc.scss","../src/scss/_helpers.scss","../src/scss/_print.scss"],"names":[],"mappings":"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","file":"app.css","sourcesContent":["/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n::before,\n::after {\n\tbox-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\nhtml {\n\t-moz-tab-size: 4;\n\ttab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n\tline-height: 1.15; /* 1 */\n\t-webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n\tmargin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n\tfont-family:\n\t\tsystem-ui,\n\t\t-apple-system, /* Firefox supports this but not yet `system-ui` */\n\t\t'Segoe UI',\n\t\tRoboto,\n\t\tHelvetica,\n\t\tArial,\n\t\tsans-serif,\n\t\t'Apple Color Emoji',\n\t\t'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n\theight: 0; /* 1 */\n\tcolor: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n\ttext-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n\tfont-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n\tfont-family:\n\t\tui-monospace,\n\t\tSFMono-Regular,\n\t\tConsolas,\n\t\t'Liberation Mono',\n\t\tMenlo,\n\t\tmonospace; /* 1 */\n\tfont-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n\tfont-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n\tfont-size: 75%;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsub {\n\tbottom: -0.25em;\n}\n\nsup {\n\ttop: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n\ttext-indent: 0; /* 1 */\n\tborder-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n\tfont-family: inherit; /* 1 */\n\tfont-size: 100%; /* 1 */\n\tline-height: 1.15; /* 1 */\n\tmargin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n\ttext-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n\t-webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n\tborder-style: none;\n\tpadding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n\toutline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n\tbox-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n\tpadding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n\tvertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n\theight: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n\t-webkit-appearance: textfield; /* 1 */\n\toutline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n\t-webkit-appearance: button; /* 1 */\n\tfont: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n\tdisplay: list-item;\n}\n","// Light theme (default)\n$light-colors: (\n 'cadetBlue': #a0aec0,\n 'primary': #3b68af, // AA compatible\n 'sapphire': #314a97,\n 'perano': #b2c9f5,\n 'light': #ededed,\n 'gray': #4a5568, // AA compatible\n 'slateGray': #475365, // AAA compatible\n 'mirage': #1a202c,\n 'alert': #d26d69,\n 'success': #2d8b01,\n 'warning': #EEBF41,\n 'dark': #252930,\n 'callout-info-border': #5b99ea,\n 'callout-alert-border': #d26d69,\n 'callout-success-border': #5cb377,\n 'callout-warning-border': #EEBF41,\n 'callout-info-bg': #f9fbfe,\n 'callout-alert-bg': #f5f5f5,\n 'callout-success-bg': #e7f4eb,\n 'callout-warning-bg': #fdf6e5,\n 'callout-warning-link': #d09c13,\n 'callout-alert-link': #d26d69,\n 'callout-success-link': #3e8554,\n 'header-bg': #fff,\n 'header-text': #4a5568,\n 'header-hover-bg': #f7fafc,\n 'header-active-bg': #edf2f7,\n 'header-text-muted': #718096,\n 'sidebar-bg': #F5F7F9,\n 'sidebar-text': #303942,\n 'nav-active': #247978,\n 'nav-active-bg': #b2f5ea,\n 'nav-active-border': #e2e8f0,\n 'body-bg': #fff,\n 'body-text': #4a5568,\n 'body-text-muted': #718096,\n 'border': #E6ECF1,\n 'border-strong': #d3dce4,\n 'link-broken': #d26d69,\n 'link-color': #1c6fdc,\n 'link-hover': #1557b0,\n 'inline-code': #ebf1ff,\n 'inline-code-text': #314a97,\n 'optionswitch-bg': #edf2f7,\n 'search-input-bg': #edf2f7,\n 'search-input-focus-bg': #fff,\n 'search-icon': #717171,\n 'search-result-hover': #f0f6ff,\n 'live-search-bg': #fff,\n 'live-search-border': #3b68af,\n 'pagination-bg': #e2e8f0,\n 'video-embed-bg': #f5f5f5,\n 'code-block-bg': #2d2d2d,\n 'code-block-text': #ccc,\n 'theme-color': #102c53,\n 'scrollbar': rgba(85, 108, 136, 0.1),\n 'scrollbar-hover': rgba(85, 108, 136, 0.2),\n);\n\n// Dark theme\n$dark-colors: (\n 'cadetBlue': #718096,\n 'primary': #68a2ff, // AA compatible\n 'sapphire': #a5b4fc,\n 'perano': #4c6cb3,\n 'light': #2d3748,\n 'gray': #a0aec0, // AA compatible on dark\n 'slateGray': #cbd5e1,\n 'mirage': #f1f5f9,\n 'alert': #fc8181,\n 'success': #68d391,\n 'warning': #f6e05e,\n 'dark': #f1f5f9,\n 'callout-info-border': #63b3ed,\n 'callout-alert-border': #fc8181,\n 'callout-success-border': #68d391,\n 'callout-warning-border': #f6e05e,\n 'callout-info-bg': #1a2332,\n 'callout-alert-bg': #2d1f1f,\n 'callout-success-bg': #1a2e22,\n 'callout-warning-bg': #2d2a1a,\n 'callout-warning-link': #f6e05e,\n 'callout-alert-link': #fc8181,\n 'callout-success-link': #68d391,\n 'header-bg': #0f172a,\n 'header-text': #e2e8f0,\n 'header-hover-bg': #1e293b,\n 'header-active-bg': #243447,\n 'header-text-muted': #94a3b8,\n 'sidebar-bg': #141b24,\n 'sidebar-text': #e2e8f0,\n 'nav-active': #5eead4,\n 'nav-active-bg': #134e4a,\n 'nav-active-border': #2d3748,\n 'body-bg': #0b1120,\n 'body-text': #cbd5e1,\n 'body-text-muted': #94a3b8,\n 'border': #2d3748,\n 'border-strong': #3d4a5c,\n 'link-broken': #fc8181,\n 'link-color': #68a2ff,\n 'link-hover': #93c5fd,\n 'inline-code': #1e293b,\n 'inline-code-text': #a5b4fc,\n 'optionswitch-bg': #1e293b,\n 'search-input-bg': #1e293b,\n 'search-input-focus-bg': #0f172a,\n 'search-icon': #94a3b8,\n 'search-result-hover': #1e293b,\n 'live-search-bg': #0f172a,\n 'live-search-border': #68a2ff,\n 'pagination-bg': #1e293b,\n 'video-embed-bg': #1e293b,\n 'code-block-bg': #1a1a1a,\n 'code-block-text': #ccc,\n 'theme-color': #0f172a,\n 'scrollbar': rgba(148, 163, 184, 0.15),\n 'scrollbar-hover': rgba(148, 163, 184, 0.3),\n);\n\n// Backwards-compatible alias used by any remaining map-get() calls\n$colors: $light-colors;\n\n@mixin theme-properties($palette) {\n @each $key, $value in $palette {\n --color-#{\"\" + $key}: #{$value};\n }\n}\n\n:root,\n[data-theme=\"light\"] {\n color-scheme: light;\n @include theme-properties($light-colors);\n}\n\n[data-theme=\"dark\"] {\n color-scheme: dark;\n @include theme-properties($dark-colors);\n}\n\n$breakpoints: (\n small: 0,\n medium: 700px,\n large: 1000px,\n xlarge: 1220px,\n xxlarge: 1300px\n);\n\n$global-font-size: 100%;\n$global-line-height: 1.6;\n$global-width: rem(1200);\n$global-margin: rem(15);\n$global-radius: rem(3);\n$paragraph-max-width: 80ch; // approx 60 actual flex-width font characters\n\n$body-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n\n$header-height: rem(60);\n\n$main-margin-top: rem(30);\n\n$sidebar-width: rem(320);\n$sidebar-breakpoint: 'large';\n","body {\n background: color(body-bg);\n font-family: $body-font-family;\n font-weight: 400;\n line-height: $global-line-height;\n color: color(body-text);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\nh1, h2, h3, h4, h5, h6 {\n color: color(dark);\n line-height: 1.3;\n margin-bottom: 2rem;\n}\n\n$min_width: rem(521);\n$max_width: rem(1700);\n\nh1 {\n margin-top: rem(30);\n //font-size: rem(45);\n @include fluid-type($min_width, $max_width, rem(30), rem(50));\n}\n\nh2 {\n //font-size: rem(30);\n @include fluid-type($min_width, $max_width, rem(22), rem(35));\n}\n\nh3 {\n //font-size: rem(26);\n @include fluid-type($min_width, $max_width, rem(20), rem(31));\n}\n\nh4 {\n //font-size: rem(22);\n @include fluid-type($min_width, $max_width, rem(18), rem(27));\n}\n\nh5 {\n //font-size: rem(20);\n @include fluid-type($min_width, $max_width, rem(16), rem(25));\n}\n\nh6 {\n //font-size: rem(18);\n @include fluid-type($min_width, $max_width, rem(16), rem(23));\n}\n\n\na {\n text-decoration: none;\n color: color(link-color);\n transition: color .2s ease-in-out;\n\n &:hover {\n color: color(link-hover);\n }\n\n // Links should look like links\n .l-main__content &, .c-callout & {\n text-decoration: underline;\n }\n}\n\nimg {\n // Get rid of gap under images by making them display: inline-block; by default\n display: inline-block;\n vertical-align: middle;\n\n // Grid defaults to get images and embeds to work properly\n max-width: 100%;\n height: auto;\n -ms-interpolation-mode: bicubic;\n}\n\np {\n margin: 0 0 $global-margin;\n line-height: $global-line-height;\n max-width: $paragraph-max-width;\n}\n\nli {\n max-width: $paragraph-max-width;\n}\n\ncode, kbd, samp {\n background-color: color(inline-code);\n padding: 0.1rem 0.25rem;\n font-size: .775rem;\n border-radius: .125rem;\n padding-left: .25rem;\n padding-right: .25rem;\n color: color(inline-code-text);\n font-family: SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace !important;\n}\n\npre {\n background-color: color(code-block-bg);\n color: color(code-block-text);\n padding: 0.1rem 0.25rem;\n font-size: .775rem;\n border-radius: .5rem;\n padding-left: .25rem;\n padding-right: .25rem;\n font-family: SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace !important;\n}\n\npre > code {\n padding: 0;\n background: transparent;\n color: inherit;\n}\n\ncode[class*=\"language-\"], pre[class*=\"language-\"] {\n border-radius: .5rem;\n font-size: .775rem !important;\n line-height: 1.5 !important;\n}\n\nblockquote {\n display: block;\n margin: 0 0 $global-margin;\n padding: rem(15 20);\n background-color: color(callout-info-bg);\n border-left: rem(3) solid color(callout-info-border);\n color: color(gray);\n a{\n color: color(link-color);\n }\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\niframe, object, video {\n max-width: 100%;\n}\n\n// Video embeds\n.video-embed {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%; // 16:9 aspect ratio\n margin: 2rem 0;\n background: color(video-embed-bg);\n border-radius: 4px;\n overflow: hidden;\n\n iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n\n &--local {\n padding-bottom: 0;\n\n video {\n display: block;\n width: 100%;\n height: auto;\n vertical-align: top;\n }\n }\n}\n","@use \"sass:math\";\n\n/// Removes the unit (e.g. px, em, rem) from a value, returning the number only.\n///\n/// @param {Number} $num - Number to strip unit from.\n///\n/// @returns {Number} The same number, sans unit.\n@function strip-unit($num) {\n @return math.div($num, $num * 0 + 1);\n}\n\n/// Converts one or more pixel values into matching rem values.\n///\n/// @param {Number|List} $values - One or more values to convert. Be sure to separate them with spaces and not commas. If you need to convert a comma-separated list, wrap the list in parentheses.\n/// @param {Number} $base [null] - The base value to use when calculating the `rem`. If you're using Foundation out of the box, this is 16px. If this parameter is `null`, the function will reference the `$global-font-size` variable as the base.\n///\n/// @returns {List} A list of converted values.\n@function rem($values, $base: null) {\n $rem-values: ();\n $count: length($values);\n\n // If no base is defined, defer to the global font size\n @if $base == null {\n $base: $global-font-size;\n }\n\n // If the base font size is a %, then multiply it by 16px\n // This is because 100% font size = 16px in most all browsers\n @if unit($base) == '%' {\n $base: math.div($base, 100%) * 16px;\n }\n\n // Using rem as base allows correct scaling\n @if unit($base) == 'rem' {\n $base: strip-unit($base) * 16px;\n }\n\n @if $count == 1 {\n @return -zf-to-rem($values, $base);\n }\n\n @for $i from 1 through $count {\n $rem-values: append($rem-values, -zf-to-rem(nth($values, $i), $base));\n }\n\n @return $rem-values;\n}\n@function rem-calc($values, $base: null) {\n @return rem($values, $base);\n}\n\n// Converts a unitless, pixel, or rem value to em, for use in breakpoints.\n@function -zf-bp-to-em($value) {\n // Pixel and unitless values are converted to rems\n @if unit($value) == 'px' or unitless($value) {\n $value: rem-calc($value, $base: 16px);\n }\n\n // Then the value is converted to ems\n @return strip-unit($value) * 1em;\n}\n\n/// Converts a pixel value to matching rem value. *Any* value passed, regardless of unit, is assumed to be a pixel value. By default, the base pixel value used to calculate the rem value is taken from the `$global-font-size` variable.\n/// @access private\n///\n/// @param {Number} $value - Pixel value to convert.\n/// @param {Number} $base [null] - Base for pixel conversion.\n///\n/// @returns {Number} A number in rems, calculated based on the given value and the base pixel value. rem values are passed through as is.\n@function -zf-to-rem($value, $base: null) {\n // Check if the value is a number\n @if type-of($value) != 'number' {\n @warn inspect($value) + ' was passed to rem-calc(), which is not a number.';\n @return $value;\n }\n\n // Transform em into rem if someone hands over 'em's\n @if unit($value) == 'em' {\n $value: strip-unit($value) * 1rem;\n }\n\n // Calculate rem if units for $value is not rem or em\n @if unit($value) != 'rem' {\n $value: math.div(strip-unit($value), strip-unit($base)) * 1rem;\n }\n\n // Turn 0rem into 0\n @if $value == 0rem {\n $value: 0;\n }\n\n @return $value;\n}\n\n//\n// Function to create an optimized svg url https://codepen.io/jakob-e/pen/doMoML\n//\n@function svg-url($svg){\n //\n // Add missing namespace\n //\n @if not str-index($svg,xmlns) {\n $svg: str-replace($svg, '', '%3E');\n\n //\n // The maybe list\n //\n // Keep size and compile time down\n // ... only add on documented fail\n //\n // $chunk: str-replace($chunk, '|', '%7C');\n // $chunk: str-replace($chunk, '[', '%5B');\n // $chunk: str-replace($chunk, ']', '%5D');\n // $chunk: str-replace($chunk, '^', '%5E');\n // $chunk: str-replace($chunk, '`', '%60');\n // $chunk: str-replace($chunk, ';', '%3B');\n // $chunk: str-replace($chunk, '?', '%3F');\n // $chunk: str-replace($chunk, ':', '%3A');\n // $chunk: str-replace($chunk, '@', '%40');\n // $chunk: str-replace($chunk, '=', '%3D');\n\n $encoded: #{$encoded}#{$chunk};\n $index: $index + $slice;\n }\n @return url(\"data:image/svg+xml,#{$encoded}\");\n}\n\n\n// Helper function to replace characters in a string\n@function str-replace($string, $search, $replace: '') {\n $index: str-index($string, $search);\n @return if($index,\n str-slice($string, 1, $index - 1) + $replace +\n str-replace(str-slice($string, $index +\n str-length($search)), $search, $replace),\n $string);\n}\n\n\n@function rgba-to-rgb($rgba, $background: #fff) {\n @return mix(rgb(red($rgba), green($rgba), blue($rgba)), $background, alpha($rgba) * 100%)\n}\n\n// lightens or darkens a color based on the existing lightness of a color (for easier switchig light/dark theme)\n@function lightendarken($color, $percent) {\n @if (lightness($color) > 50) {\n @return darken($color, $percent);\n } @else {\n @return lighten($color, $percent);\n }\n}\n\n/// Returns a CSS custom property for a theme color token.\n@function color($key) {\n @return var(--color-#{\"\" + $key});\n}\n\n\n@mixin fluid-type($min-vw, $max-vw, $min-font-size, $max-font-size) {\n $u1: unit($min-vw);\n $u2: unit($max-vw);\n $u3: unit($min-font-size);\n $u4: unit($max-font-size);\n\n @if $u1 == $u2 and $u1 == $u3 and $u1 == $u4 {\n & {\n font-size: rem($min-font-size);\n @media screen and (min-width: $min-vw) {\n font-size: calc(#{rem($min-font-size)} + #{strip-unit($max-font-size - $min-font-size)} * ((100vw - #{$min-vw}) / #{strip-unit($max-vw - $min-vw)}));\n }\n @media screen and (min-width: $max-vw) {\n font-size: rem($max-font-size);\n }\n }\n }\n}\n","html, body {\n height: 100%;\n width: 100%;\n background: color(body-bg);\n scroll-behavior: smooth;\n}\n\n.l-app {\n display: flex;\n min-height: 100vh;\n flex-direction: column;\n\n padding-top: $header-height;\n background: color(body-bg);\n\n &--has-sidebar {\n @include breakpoint(large) {\n padding-left: $sidebar-width;\n }\n }\n}\n\n.l-header {\n z-index: 2;\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: $header-height;\n background: color(header-bg);\n border-bottom: 1px solid color(border-strong);\n box-shadow: 0 1px 4px 0 rgba(0,0,0,0.1);\n\n &__logo {\n flex: auto 0 0;\n position: relative;\n\n @include breakpoint(xlarge) {\n flex: $sidebar-width 0 0;\n flex: calc(#{$sidebar-width} - #{rem(30)}) 0 0;\n }\n }\n\n &__search {\n flex-basis: 50%;\n flex-grow: 0;\n flex-shrink: 1;\n position: relative;\n\n @include breakpoint(xlarge) {\n margin: rem(0 50 0 75);\n }\n\n @include breakpoint(small only) {\n position: fixed;\n width: 100%;\n margin: 0 !important;\n top: 3.75rem;\n background: color(body-bg);\n height: calc(100vh - 2.25rem);\n padding: 0 1rem 1rem 1rem;\n transform: translateY(100%);\n transition: transform .4s ease-in-out, -webkit-transform .4s ease-in-out;\n }\n }\n &__versionswitch{\n display: flex;\n align-items: center;\n gap: rem(4);\n margin: rem(0 15);\n }\n}\n@include breakpoint(small only) {\n #searchform:target {\n transform: translateY(0);\n }\n}\n\n.l-sidebar {\n outline: none;\n display: block;\n position: fixed;\n top: $header-height;\n bottom: 0;\n left: 0;\n width: 100%;\n transform: translateX(-100%);\n z-index: 1;\n padding: $main-margin-top rem(20) $global-margin;\n background: color(sidebar-bg);\n border-right: 1px solid color(border);\n overflow-y: scroll;\n -webkit-overflow-scrolling: touch;\n overflow-x: auto;\n transition: transform .4s ease-in-out;\n\n @include breakpoint($sidebar-breakpoint) {\n display: block;\n position: fixed;\n top: $header-height;\n bottom: 0;\n left: 0;\n width: $sidebar-width;\n transform: translateX(0);\n transition: none;\n }\n}\n\n#nav:target {\n transform: translateX(0);\n}\n\n\n.l-main {\n position: relative;\n margin: $main-margin-top rem(20) $global-margin;\n\n flex: 1;\n\n @include breakpoint(medium) {\n margin: $main-margin-top rem(50) $global-margin rem(75);\n }\n\n &__title {\n max-width: rem(1000);\n }\n\n &__contentwrapper {\n @include breakpoint(xlarge) {\n display: flex;\n justify-content: flex-start;\n flex-direction: row;\n }\n }\n\n &__content {\n @include breakpoint(medium) {\n padding-right: rem(25);\n }\n\n @include breakpoint(xlarge) {\n flex-basis: 80%;\n flex-grow: 0;\n flex-shrink: 1;\n order: 1;\n min-width: 0;\n }\n\n > :first-child {\n margin-top: 0;\n }\n }\n\n &__toc {\n @include breakpoint(xlarge) {\n flex-basis: 20%;\n flex-grow: 1;\n flex-shrink: 0;\n align-self: flex-start;\n order: 2;\n padding: rem(0 0 0 25);\n top: rem(75);\n position: sticky;\n }\n }\n\n}\n\n.l-footer {\n flex-basis: 100%;\n flex-shrink: 0;\n order: 3;\n padding: rem(30 15 15);\n margin: rem(45 0 0);\n border-top: 1px solid color(border);\n\n @include breakpoint(medium) {\n padding: rem(30 75 15);\n }\n}\n\n@media (max-width: 768px) {\n .o-openmenu {\n order: 4;\n padding: 0 .9375rem 0 .9375rem !important;\n }\n .o-search, .l-header__search {\n order: 3;\n margin: 0 0.475rem 0 auto;\n }\n .l-header__versionswitch {\n order: 2;\n }\n .l-header__logo {\n order: 1;\n max-width: 25%;\n }\n}\n@media (max-width: 425px) {\n .l-footer {\n font-size: 14px;\n line-height: 1;\n padding: .9375rem .9375rem;\n .c-footer__nav{\n display: flex;\n justify-content: center;\n &link {\n padding: .425rem;\n }\n }\n .c-footer__copyright{\n font-size: 14px;\n line-height: 1;\n padding: .3rem .9375rem 0;\n text-align: center;\n }\n }\n}\n","// Foundation for Sites by ZURB\n// foundation.zurb.com\n// Licensed under MIT Open Source\n\n\n/// Casts a map into a list.\n/// @link http://hugogiraudel.com/2014/04/28/casting-map-into-list/\n///\n/// @param {Map} $map - Map to pull a value from.\n///\n/// @returns {List} Depending on the flag, returns either $keys or $values or both.\n@function map-to-list($map, $keep: 'both') {\n $keep: if(index('keys' 'values', $keep), $keep, 'both');\n\n @if type-of($map) == 'map' {\n $keys: ();\n $values: ();\n\n @each $key, $val in $map {\n $keys: append($keys, $key);\n $values: append($values, $val);\n }\n\n @if $keep == 'keys' {\n @return $keys;\n }\n @else if $keep == 'values' {\n @return $values;\n }\n @else {\n @return zip($keys, $values);\n }\n }\n\n @return if(type-of($map) != 'list', ($value,), $map);\n\n}\n\n\n////\n/// @group breakpoints\n////\n\n/// A list of named breakpoints. You can use these with the `breakpoint()` mixin to quickly create media queries.\n/// @type Map\n$breakpoints: (\n small: 0,\n medium: 640px,\n large: 1024px,\n xlarge: 1200px,\n xxlarge: 1440px,\n) !default;\n\n/// The largest named breakpoint in which to include print as a media type\n/// @type Keyword\n$print-breakpoint: large !default;\n\n$-zf-zero-breakpoint: small !default;\n\n$-zf-breakpoints-keys: map-to-list($breakpoints, 'keys');\n\n@if nth(map-values($breakpoints), 1) != 0 {\n @error 'The first key in the $breakpoints map must have a value of \"0\".';\n}\n@else {\n $-zf-zero-breakpoint: nth(map-keys($breakpoints), 1);\n}\n\n/// All of the names in this list will be output as classes in your CSS, like `.small-12`, `.medium-6`, and so on. Each value in this list must also be in the `$breakpoints` map.\n/// @type List\n$breakpoint-classes: (small medium large) !default;\n\n/// Generates a media query string matching the input value. Refer to the documentation for the `breakpoint()` mixin to see what the possible inputs are.\n///\n/// @param {Keyword|Number} $val [small] - Breakpoint name, or px, rem, or em value to process.\n@function breakpoint($val: $-zf-zero-breakpoint) {\n // Size or keyword\n $bp: nth($val, 1);\n // Value for max-width media queries\n $bp-max: 0;\n // Direction of media query (up, down, or only)\n $dir: if(length($val) > 1, nth($val, 2), up);\n // Eventual output\n $str: '';\n // Is it a named media query?\n $named: false;\n\n // Orientation media queries have a unique syntax\n @if $bp == 'landscape' or $bp == 'portrait' {\n @return '(orientation: #{$bp})';\n }\n @else if $bp == 'retina' {\n @return '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)';\n }\n\n // Try to pull a named breakpoint out of the $breakpoints map\n @if type-of($bp) == 'string' {\n @if map-has-key($breakpoints, $bp) {\n @if $dir == 'only' or $dir == 'down' {\n $bp-max: -zf-map-next($breakpoints, $bp);\n }\n\n $bp: map-get($breakpoints, $bp);\n $named: true;\n }\n @else {\n $bp: 0;\n @warn 'breakpoint(): \"#{$val}\" is not defined in your $breakpoints setting.';\n }\n }\n\n // Convert any pixel, rem, or unitless value to em\n $bp: -zf-bp-to-em($bp);\n // Max value is 0.2px under the next breakpoint (0.02 / 16 = 0.00125).\n // Use a precision under 1px to support browser zoom, but not to low to avoid rounding.\n // See https://github.com/zurb/foundation-sites/issues/11313\n @if $bp-max {\n $bp-max: -zf-bp-to-em($bp-max) - .00125;\n }\n\n // Conditions to skip media query creation\n // - It's a named breakpoint that resolved to \"0 down\" or \"0 up\"\n // - It's a numeric breakpoint that resolved to \"0 \" + anything\n @if $bp > 0em or $dir == 'only' or $dir == 'down' {\n // `only` ranges use the format `(min-width: n) and (max-width: n)`\n @if $dir == 'only' {\n // Only named media queries can have an \"only\" range\n @if $named == true {\n // Only use \"min-width\" if the floor is greater than 0\n @if $bp > 0em {\n $str: $str + '(min-width: #{$bp})';\n\n // Only add \"and\" to the media query if there's a ceiling\n @if $bp-max != null {\n $str: $str + ' and ';\n }\n }\n\n // Only use \"max-width\" if there's a ceiling\n @if $bp-max != null {\n $str: $str + '(max-width: #{$bp-max})';\n }\n }\n @else {\n @warn 'breakpoint(): Only named media queries can have an `only` range.';\n }\n }\n\n // `down` ranges use the format `(max-width: n)`\n @else if $dir == 'down' {\n $max: if($named, $bp-max, $bp);\n\n // Skip media query creation if input value is exactly \"0 down\",\n // unless the function was called as \"small down\", in which case it's just \"small only\"\n @if $named or $bp > 0em {\n @if $max != null {\n $str: $str + '(max-width: #{$max})';\n }\n }\n }\n\n // `up` ranges use the format `(min-width: n)`\n @else if $bp > 0em {\n $str: $str + '(min-width: #{$bp})';\n }\n }\n\n @return $str;\n}\n\n/// Wraps a media query around the content you put inside the mixin. This mixin accepts a number of values:\n/// - If a string is passed, the mixin will look for it in the `$breakpoints` map, and use a media query there.\n/// - If a pixel value is passed, it will be converted to an em value using `$global-font-size` as the base.\n/// - If a rem value is passed, the unit will be changed to em.\n/// - If an em value is passed, the value will be used as-is.\n///\n/// @param {Keyword|Number} $value - Breakpoint name, or px, rem, or em value to process.\n///\n/// @output If the breakpoint is \"0px and larger\", outputs the content as-is. Otherwise, outputs the content wrapped in a media query.\n@mixin breakpoint($value) {\n $str: breakpoint($value);\n $bp: index($-zf-breakpoints-keys, $value);\n $pbp: index($-zf-breakpoints-keys, $print-breakpoint);\n\n $old-zf-size: null;\n\n // Make breakpoint size available as a variable\n @if global-variable-exists(-zf-size) {\n $old-zf-size: $-zf-size;\n }\n $-zf-size: nth($value, 1) !global; // get the first value to account for `only` and `down` keywords\n\n // If $str is still an empty string, no media query is needed\n @if $str == '' {\n @content;\n }\n\n // Otherwise, wrap the content in a media query\n @else {\n // For named breakpoints less than or equal to $print-breakpoint, add print to the media types\n @if $bp != null and $bp <= $pbp {\n @media print, screen and #{$str} {\n @content;\n }\n }\n @else {\n @media screen and #{$str} {\n @content;\n }\n }\n }\n\n $-zf-size: $old-zf-size !global;\n}\n\n/// Convers the breakpoints map to a URL-encoded string, like this: `key1=value1&key2=value2`. The value is then dropped into the CSS for a special `` tag, which is read by the Foundation JavaScript. This is how we transfer values from Sass to JavaScript, so they can be defined in one place.\n/// @access private\n///\n/// @param {Map} $map - Map to convert.\n///\n/// @returns {String} A string containing the map's contents.\n@function -zf-bp-serialize($map) {\n $str: '';\n @each $key, $value in $map {\n $str: $str + $key + '=' + -zf-bp-to-em($value) + '&';\n }\n $str: str-slice($str, 1, -2);\n\n @return $str;\n}\n\n/// Find the next key in a map.\n/// @access private\n///\n/// @param {Map} $map - Map to traverse.\n/// @param {Mixed} $key - Key to use as a starting point.\n///\n/// @returns {Mixed} The value for the key after `$key`, if `$key` was found. If `$key` was not found, or `$key` was the last value in the map, returns `null`.\n@function -zf-map-next($map, $key) {\n\n // Store the keys of the map as a list\n $values: map-keys($map);\n\n $i: 0;\n\n // If the Key Exists, Get the index of the key within the map and add 1 to it for the next breakpoint in the map\n @if (map-has-key($map, $key)) {\n $i: index($values, $key) + 1;\n }\n\n // If the key doesn't exist, or it's the last key in the map, return null\n @if ($i > length($map) or $i == 0) {\n @return null;\n }\n // Otherwise, return the value\n @else {\n @return map-get($map, nth($values, $i));\n }\n\n}\n\n/// Return a list of our named breakpoints less than $key. Useful for dealing with\n/// responsive gutters for the grid.\n/// @access private\n///\n/// @param {String} $key - Key to use as last breakpoint.\n///\n/// @returns {Array} The list of breakpoints up to and. If $key is auto, returns breakpoints above the zero\n@function -zf-breakpoints-less-than($key) {\n $list: ();\n $found_key: false;\n\n @each $name in $-zf-breakpoints-keys {\n @if ($name == $key) {\n $found_key: true;\n }\n @if not $found_key {\n $list: append($list, $name);\n }\n }\n @return $list;\n}\n\n/// Return a list of our named breakpoints less than $key. Useful for dealing with\n/// responsive gutters for the grid.\n/// @access private\n///\n/// @param {String} $breakpoint - a named or non-named breakpoint.\n///\n/// @returns {Array} The list of breakpoints up to and. If $key is auto, returns breakpoints above the zero\n@function -zf-closest-named-breakpoint($breakpoint) {\n $last: $-zf-zero-breakpoint;\n $found: false;\n\n $value: unitless-calc($breakpoint, 1px);\n @each $key, $val in $breakpoints {\n @if not $found {\n @if unitless-calc($val) > $value {\n $found: true;\n } @else {\n $last: $key;\n }\n }\n }\n\n @return $last;\n}\n\n/// Get a value for a breakpoint from a responsive config map or single value.\n/// - If the config is a single value, return it regardless of `$value`.\n/// - If the config is a map and has the key `$value`, the exact breakpoint value is returned.\n/// - If the config is a map and does *not* have the breakpoint, the value matching the next lowest breakpoint in the config map is returned.\n/// @access private\n///\n/// @param {Number|Map} $map - Responsive config map or single value.\n/// @param {Keyword} $value - Breakpoint name to use.\n///\n/// @return {Mixed} The corresponding breakpoint value.\n@function -zf-get-bp-val($map, $value) {\n // If the given map is a single value, return it\n @if type-of($map) == 'number' {\n @return $map;\n }\n\n\n // Check if the breakpoint name exists globally\n @if not map-has-key($breakpoints, $value) {\n @if type-of($value) == 'number' {\n $value: -zf-closest-named-breakpoint($value);\n } @else {\n @return null;\n }\n }\n // Check if the breakpoint name exists in the local config map\n @else if map-has-key($map, $value) {\n // If it does, just return the value\n @return map-get($map, $value);\n }\n // Otherwise, find the next lowest breakpoint and return that value\n @else {\n $anchor: null;\n $found: false;\n\n @each $key, $val in $breakpoints {\n @if not $found {\n @if map-has-key($map, $key) {\n $anchor: $key;\n }\n @if $key == $value {\n $found: true;\n }\n }\n }\n\n @return map-get($map, $anchor);\n }\n}\n\n$small-up: '';\n$small-only: '';\n\n@if map-has-key($breakpoints, small) {\n $small-up: screen;\n $small-only: unquote('screen and #{breakpoint(small only)}');\n}\n\n$medium-up: '';\n$medium-only: '';\n\n@if map-has-key($breakpoints, medium) {\n $medium-up: unquote('screen and #{breakpoint(medium)}');\n $medium-only: unquote('screen and #{breakpoint(medium only)}');\n}\n\n$large-up: '';\n$large-only: '';\n\n@if map-has-key($breakpoints, large) {\n $large-up: unquote('screen and #{breakpoint(large)}');\n $large-only: unquote('screen and #{breakpoint(large only)}');\n}\n\n$xlarge-up: '';\n$xlarge-only: '';\n\n@if map-has-key($breakpoints, xlarge) {\n $xlarge-up: unquote('screen and #{breakpoint(xlarge)}');\n $xlarge-only: unquote('screen and #{breakpoint(xlarge only)}');\n}\n\n$xxlarge-up: '';\n\n@if map-has-key($breakpoints, xxlarge) {\n $xxlarge-up: unquote('screen and #{breakpoint(xxlarge)}');\n}\n",".o-logo {\n margin: rem(0 15);\n padding: rem(0);\n &__image {\n display: block;\n width: rem(170);\n max-width: 100%;\n height: $header-height;\n fill: color(header-text);\n\n @include breakpoint(medium) {\n width: rem(200);\n }\n\n &--dark {\n display: none;\n }\n }\n}\n\n[data-theme=\"dark\"] {\n .o-logo__image--light {\n display: none;\n }\n .o-logo__image--dark {\n display: block;\n }\n}\n\n.o-docmeta {\n margin: rem(-15) 0 $global-margin*2;\n}\n\n.o-sidebar-heading {\n display: block;\n margin: 0 0 $global-margin;\n font-size: rem(20);\n font-weight: 700;\n}\n\n\n.o-openmenu, .o-search {\n display: block;\n margin: rem(0);\n padding: rem(0 15 0 30);\n\n &__icon {\n display: block;\n width: rem(29);\n height: $header-height;\n fill: color(header-text);\n }\n}\n@include breakpoint($sidebar-breakpoint) {\n .o-openmenu {\n display: none;\n }\n}\n@include breakpoint(medium) {\n .o-search {\n display: none;\n }\n}\n@include breakpoint(small only) {\n .o-logo{\n margin: rem(0 7);\n }\n .o-search {\n padding: rem(0 7);\n }\n}\n.o-closemenu {\n z-index: 1;\n position: absolute;\n top: rem(10);\n right: rem(10);\n display: block;\n padding: rem(15 15);\n\n @include breakpoint($sidebar-breakpoint) {\n display: none;\n }\n\n &__icon {\n display: block;\n width: rem(30);\n height: rem(30);\n fill: color(primary);\n }\n}\n","$breadcrum-item-spacing: rem(5);\n\n.c-breadcrumb {\n margin: 0 0 $global-margin;\n\n &__list {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n margin: 0 $breadcrum-item-spacing*-1;\n padding: 0;\n list-style: none;\n }\n\n &__item {\n display: block;\n flex: auto 0 0;\n }\n\n &__link {\n display: inline-block;\n padding: rem(4) $breadcrum-item-spacing;\n line-height: 1.4;\n font-size: rem(14);\n color: color(gray);\n }\n\n &__item + &__item:before {\n content: \"\";\n display: inline-block;\n width: rem(10);\n height: rem(11);\n margin-left: rem(5);\n margin-right: rem(-1);\n background-color: color(body-text);\n opacity: 0.25;\n -webkit-mask: svg-url('') center / 100% 100% no-repeat;\n mask: svg-url('') center / 100% 100% no-repeat;\n }\n}\n",".c-callout {\n color: color(gray);\n display: block;\n margin: 0 0 $global-margin;\n padding: rem(15 20);\n background-color: color(callout-info-bg);\n border-left: rem(3) solid color(callout-info-border);\n a{\n color: color(link-color);\n }\n\n &__title {\n display: block;\n margin: rem(0 0 5);\n text-transform: uppercase;\n letter-spacing: 1.1;\n }\n a:hover{\n color: color(link-hover);\n }\n\n &--info{\n background-color: color(callout-info-bg);\n border-color: color(callout-info-border);\n a{\n color: color(link-color);\n }\n }\n\n &--warning {\n background-color: color(callout-warning-bg);\n border-color: color(callout-warning-border);\n a{\n color: color(callout-warning-link);\n }\n }\n\n &--alert {\n background-color: color(callout-alert-bg);\n border-color: color(callout-alert-border);\n a{\n color: color(callout-alert-link);\n }\n }\n\n &--success {\n background-color: color(callout-success-bg);\n border-color: color(callout-success-border);\n a{\n color: color(callout-success-link);\n }\n }\n}\n","/**\n * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML\n * Based on https://github.com/chriskempson/tomorrow-theme\n * @author Rose Pritchard\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #ccc;\n\tbackground: none;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #2d2d2d;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.block-comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #999;\n}\n\n.token.punctuation {\n\tcolor: #ccc;\n}\n\n.token.tag,\n.token.attr-name,\n.token.namespace,\n.token.deleted {\n\tcolor: #e2777a;\n}\n\n.token.function-name {\n\tcolor: #6196cc;\n}\n\n.token.boolean,\n.token.number,\n.token.function {\n\tcolor: #f08d49;\n}\n\n.token.property,\n.token.class-name,\n.token.constant,\n.token.symbol {\n\tcolor: #f8c555;\n}\n\n.token.selector,\n.token.important,\n.token.atrule,\n.token.keyword,\n.token.builtin {\n\tcolor: #cc99cd;\n}\n\n.token.string,\n.token.char,\n.token.attr-value,\n.token.regex,\n.token.variable {\n\tcolor: #7ec699;\n}\n\n.token.operator,\n.token.entity,\n.token.url {\n\tcolor: #67cdcc;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.token.inserted {\n\tcolor: green;\n}\n",".command-line-prompt {\n\tborder-right: 1px solid #999;\n\tdisplay: block;\n\tfloat: left;\n\tfont-size: 100%;\n\tletter-spacing: -1px;\n\tmargin-right: 1em;\n\tpointer-events: none;\n\ttext-align: right;\n\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.command-line-prompt > span:before {\n\topacity: 0.7;\n\tcontent: ' ';\n\tdisplay: block;\n\tpadding-right: 0.8em;\n}\n\n.command-line-prompt > span[data-user]:before {\n\tcontent: \"[\" attr(data-user) \"@\" attr(data-host) \"] $\";\n}\n\n.command-line-prompt > span[data-user=\"root\"]:before {\n\tcontent: \"[\" attr(data-user) \"@\" attr(data-host) \"] #\";\n}\n\n.command-line-prompt > span[data-prompt]:before {\n\tcontent: attr(data-prompt);\n}\n\n.command-line-prompt > span[data-continuation-prompt]:before {\n\tcontent: attr(data-continuation-prompt);\n}\n\n.command-line span.token.output {\n\t/* Make shell output lines a bit lighter to distinguish them from shell commands */\n\topacity: 0.7;\n}\n","pre[data-line] {\n\tposition: relative;\n\tpadding: 1em 0 1em 3em;\n}\n\n.line-highlight {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\tpadding: inherit 0;\n\tmargin-top: 1em; /* Same as .prism’s padding-top */\n\n\tbackground: hsla(24, 20%, 50%,.08);\n\tbackground: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));\n\n\tpointer-events: none;\n\n\tline-height: inherit;\n\twhite-space: pre;\n}\n\n@media print {\n\t.line-highlight {\n\t\t/*\n\t\t * This will prevent browsers from replacing the background color with white.\n\t\t * It's necessary because the element is layered on top of the displayed code.\n\t\t */\n\t\t-webkit-print-color-adjust: exact;\n\t\tcolor-adjust: exact;\n\t}\n}\n\n\t.line-highlight:before,\n\t.line-highlight[data-end]:after {\n\t\tcontent: attr(data-start);\n\t\tposition: absolute;\n\t\ttop: .4em;\n\t\tleft: .6em;\n\t\tmin-width: 1em;\n\t\tpadding: 0 .5em;\n\t\tbackground-color: hsla(24, 20%, 50%,.4);\n\t\tcolor: hsl(24, 20%, 95%);\n\t\tfont: bold 65%/1.5 sans-serif;\n\t\ttext-align: center;\n\t\tvertical-align: .3em;\n\t\tborder-radius: 999px;\n\t\ttext-shadow: none;\n\t\tbox-shadow: 0 1px white;\n\t}\n\n\t.line-highlight[data-end]:after {\n\t\tcontent: attr(data-end);\n\t\ttop: auto;\n\t\tbottom: .4em;\n\t}\n\n.line-numbers .line-highlight:before,\n.line-numbers .line-highlight:after {\n\tcontent: none;\n}\n\npre[id].linkable-line-numbers span.line-numbers-rows {\n\tpointer-events: all;\n}\npre[id].linkable-line-numbers span.line-numbers-rows > span:before {\n\tcursor: pointer;\n}\npre[id].linkable-line-numbers span.line-numbers-rows > span:hover:before {\n\tbackground-color: rgba(128, 128, 128, .2);\n}\n","pre[class*=\"language-\"].line-numbers {\n\tposition: relative;\n\tpadding-left: 3.8em;\n\tcounter-reset: linenumber;\n}\n\npre[class*=\"language-\"].line-numbers > code {\n\tposition: relative;\n\twhite-space: inherit;\n}\n\n.line-numbers .line-numbers-rows {\n\tposition: absolute;\n\tpointer-events: none;\n\ttop: 0;\n\tfont-size: 100%;\n\tleft: -3.8em;\n\twidth: 3em; /* works for line-numbers below 1000 lines */\n\tletter-spacing: -1px;\n\tborder-right: 1px solid #999;\n\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\n}\n\n\t.line-numbers-rows > span {\n\t\tdisplay: block;\n\t\tcounter-increment: linenumber;\n\t}\n\n\t\t.line-numbers-rows > span:before {\n\t\t\tcontent: counter(linenumber);\n\t\t\tcolor: #999;\n\t\t\tdisplay: block;\n\t\t\tpadding-right: 0.8em;\n\t\t\ttext-align: right;\n\t\t}\n","div.code-toolbar {\n\tposition: relative;\n}\n\ndiv.code-toolbar > .toolbar {\n\tposition: absolute;\n\tz-index: 10;\n\ttop: .3em;\n\tright: .2em;\n\ttransition: opacity 0.3s ease-in-out;\n\topacity: 0;\n}\n\ndiv.code-toolbar:hover > .toolbar {\n\topacity: 1;\n}\n\n/* Separate line b/c rules are thrown out if selector is invalid.\n IE11 and old Edge versions don't support :focus-within. */\ndiv.code-toolbar:focus-within > .toolbar {\n\topacity: 1;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item {\n\tdisplay: inline-block;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a {\n\tcursor: pointer;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > button {\n\tbackground: none;\n\tborder: 0;\n\tcolor: inherit;\n\tfont: inherit;\n\tline-height: normal;\n\toverflow: visible;\n\tpadding: 0;\n\t-webkit-user-select: none; /* for button */\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a,\ndiv.code-toolbar > .toolbar > .toolbar-item > button,\ndiv.code-toolbar > .toolbar > .toolbar-item > span {\n\tcolor: #bbb;\n\tfont-size: .8em;\n\tpadding: 0 .5em;\n\tbackground: #f5f2f0;\n\tbackground: rgba(224, 224, 224, 0.2);\n\tbox-shadow: 0 2px 0 0 rgba(0,0,0,0.2);\n\tborder-radius: .5em;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > a:focus,\ndiv.code-toolbar > .toolbar > .toolbar-item > button:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > button:focus,\ndiv.code-toolbar > .toolbar > .toolbar-item > span:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > span:focus {\n\tcolor: inherit;\n\ttext-decoration: none;\n}\n","// Prism tomorrow (dark) — used for fenced code in both themes so blocks stay readable\n@import '../../../node_modules/prismjs/themes/prism-tomorrow';\n@import '../../../node_modules/prismjs/plugins/command-line/prism-command-line';\n@import '../../../node_modules/prismjs/plugins/line-highlight/prism-line-highlight';\n@import '../../../node_modules/prismjs/plugins/line-numbers/prism-line-numbers';\n@import '../../../node_modules/prismjs/plugins/toolbar/prism-toolbar';\n\n.token.operator {\n background: none;\n}\n\n// Theme-aware code block surfaces\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n background: color(code-block-bg);\n color: color(code-block-text);\n}\n\n// Light-mode Prism token overrides for slightly better contrast on themed surfaces\n[data-theme=\"light\"] {\n :not(pre) > code[class*=\"language-\"],\n pre[class*=\"language-\"] {\n background: #2d2d2d;\n color: #ccc;\n }\n}\n\n// Prism toolbar / copy button\ndiv.code-toolbar > .toolbar {\n opacity: 1;\n\n .toolbar-item > button,\n .toolbar-item > a,\n .toolbar-item > span {\n background: color(optionswitch-bg);\n color: color(body-text);\n border: 1px solid color(border);\n box-shadow: none;\n transition: background-color .15s ease, color .15s ease;\n\n &:hover {\n background: color(header-hover-bg);\n color: color(dark);\n }\n }\n}\n\n// Line numbers gutter\n.line-numbers .line-numbers-rows {\n border-right-color: color(border-strong);\n}\n\n.line-numbers-rows > span:before {\n color: color(body-text-muted);\n}\n",".c-history {\n display: flex;\n align-items: center;\n margin: -.9375rem 0 1.875rem;\n}\n.c-contributors {\n display: flex;\n}\n.c-contributor {\n width: 30px;\n height: 30px;\n margin-left: -10px;\n border: 2px solid color(body-bg);\n border-radius: 15px;\n\n &:first-child {\n margin-left: 0;\n }\n}\n.c-last-edit {\n max-width: 100%;\n margin-bottom: 0;\n padding-left: 0.5em;\n font-size: 0.9em;\n font-weight: 500;\n color: color(body-text-muted);\n flex: 1; // fixes mobile rendering\n}\n",".c-footer {\n\n &__grid {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: flex-start;\n }\n\n &__cell {\n width: 100%;\n\n @include breakpoint(large) {\n width: auto;\n }\n }\n\n &__copyright {\n color: color(gray);\n }\n\n &__nav {\n margin: rem(0 -10);\n padding: 0;\n list-style: none;\n }\n\n &__navitem {\n display: inline-block;\n }\n\n &__navlink {\n display: block;\n font-weight: 700;\n padding: rem(10);\n color: color(gray);\n\n &:hover {\n color: color(primary);\n }\n }\n}\n","\n.heading-link {\n display: inline-block;\n margin-left: 0.67em;\n transition: opacity 0.25s ease-in-out;\n opacity: 0;\n font-size: 0.8em;\n bottom: 0.2em;\n}\n\nh1, h2, h3, h4, h5, h6 {\n &:hover .heading-link {\n opacity: 1;\n }\n}\n\n@include breakpoint(medium up) {\n h1, h2, h3, h4, h5, h6 {\n position: relative;\n margin-left: -3rem;\n padding-left: 3rem;\n\n &:target .heading-link{\n opacity: 1;\n }\n }\n .heading-link {\n left: 0;\n position: absolute;\n }\n}\n",".c-nav {\n margin: rem(0 0 0 -20);\n padding: 0;\n list-style: none;\n\n &__item {\n margin: 0;\n padding: 0;\n list-style: none;\n font-size: rem(15);\n line-height: 1.4;\n\n a {\n position: relative;\n display: block;\n margin-bottom: rem(10);\n padding: rem(0 0 0 20);\n text-decoration: none;\n font-weight: 500;\n color: color(slateGray);\n transition: all .2s ease;\n\n &:hover {\n color: color(link-hover);\n transform: translateX(2px);\n }\n }\n\n &--activepage {\n .c-nav__chevron {\n top: 0.35rem;\n }\n > a {\n position: relative;\n color: color(nav-active);\n padding: 0.35rem 0 0.35rem 3.5rem;\n transition: all .2s ease;\n\n &:after, &:before {\n border: 0 solid color(nav-active-border);\n }\n\n &:hover{\n transform: translateX(0);\n }\n\n .inset{\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n position: absolute;\n border-radius: .25rem;\n opacity: .25;\n background-color: color(nav-active-bg);\n }\n }\n\n }\n\n &--level1 > a {\n font-size: rem(16);\n font-weight: 700;\n padding-left: rem(30);\n }\n\n &--level2 > a {\n padding-left: rem(50);\n }\n\n &--level3 > a {\n padding-left: rem(60);\n }\n\n &--level4 > a {\n padding-left: rem(80);\n }\n\n &--level5 > a {\n padding-left: rem(100);\n }\n\n &--level6 > a {\n padding-left: rem(120);\n }\n\n &--level7> a {\n padding-left: rem(140);\n }\n\n &--collapsed {\n > ul {\n display: none;\n }\n > a > .c-nav__chevron {\n top: rem(1);\n transform: rotate(90deg);\n }\n }\n\n }\n\n &__chevron {\n display: inline-block;\n position: absolute;\n top: 0;\n height: rem(21);\n width: rem(21);\n padding: rem(5);\n margin: rem(0 0 0 -23);\n fill: color(body-text-muted);\n transform: rotate(-90deg);\n vertical-align: middle;\n }\n\n\n &__sublist {\n margin: 0 0 $global-margin*2;\n padding: 0;\n }\n}\n\n::-webkit-scrollbar, ::-webkit-scrollbar-thumb {\n width: 1rem;\n height: 1rem;\n border: .25rem solid transparent;\n border-radius: .5rem;\n background-color: transparent;\n}\n\n::-webkit-scrollbar-thumb {\n box-shadow: inset 0 0 0 1rem color(scrollbar);\n}\n\n::-webkit-scrollbar-thumb:hover {\n box-shadow: inset 0 0 0 1rem color(scrollbar-hover);\n}\n\n::-webkit-resizer, ::-webkit-scrollbar-corner {\n background-color: transparent;\n}\n",".l-main__oc, .c-oc__more {\n display: none;\n @include breakpoint(xlarge) {\n display: block;\n }\n}\n.l-main__oc--below, .c-oc__more--below {\n display: block;\n @include breakpoint(xlarge) {\n display: none;\n }\n}\n\n.l-main__oc {\n margin-top: 5em;\n\n background: color(sidebar-bg);\n color: color(sidebar-text);\n padding: 1em;\n border-radius: 1em;\n border: 1px solid color(border);\n transition: background-color .5s ease-in-out;\n text-decoration: none !important;\n max-width: rem(400);\n\n @include breakpoint(xlarge) {\n margin-left: rem(-25);\n }\n\n .c-oc__member_image {\n transition: border .5s ease-in-out;\n }\n &:hover {\n color: color(sidebar-text);\n background: color(search-result-hover);\n\n .c-oc__member_image {\n border-color: color(search-result-hover);\n }\n\n }\n}\n\n.c-oc__logo {\n max-width: 100%;\n max-height: 60px;\n}\n\n.c-oc__text {\n font-size: rem(13);\n font-weight: 500;\n}\n\n.c-oc__subtitle {\n font-size: rem(13);\n font-weight: 700;\n text-transform: uppercase;\n}\n\n.c-oc__members {\n padding-left: 0;\n list-style: none;\n margin-bottom: 25px;\n padding-right: 25px;\n margin-left: -28px;\n margin-right: -35px;\n text-align: center;\n}\n.c-oc__member {\n display: inline-block;\n margin-right: -20px;\n margin-bottom: -15px;\n}\n\n.c-oc__member_image {\n width: 60px;\n height: 60px;\n border-radius: 50%;\n border: 5px solid color(sidebar-bg);\n background: #00B5DE;\n}\n\n.c-oc__total {\n\n span {\n height: 60px;\n background: #00B5DE;\n border-radius: 30px;\n border: 5px solid color(sidebar-bg);\n color: #fff;\n padding: 0.7em 1em;\n font-weight: 600;\n display: block;\n }\n}\n\n.c-oc__more {\n text-align: center;\n font-size: rem(13);\n font-weight: 500;\n text-decoration: underline;\n margin-top: 1em;\n margin-left: -1em;\n max-width: rem(400);\n}\n",".c-optionswitch {\n\n &__current {\n display: block;\n padding: rem(7 10);\n color: color(header-text);\n white-space: nowrap;\n background: color(header-bg);\n transition: background-color .2s ease-in-out;\n border-radius: $global-radius;\n\n &:hover {\n color: color(header-text);\n background: color(header-hover-bg);\n }\n }\n\n &__currentchevron {\n display: inline-block;\n width: rem(10);\n height: rem(10);\n fill: color(header-text);\n vertical-align: middle;\n margin: rem(-1 0 0 3);\n transform: rotate(90deg);\n }\n\n &__listwrapper {\n position: absolute;\n top: $header-height - rem(1);\n display: none;\n background: color(optionswitch-bg);\n box-shadow: rem(0 3 8 0) rgba(116, 129, 141, 0.1);\n\n @include breakpoint(xxlarge) {\n right: 0;\n }\n @include breakpoint(1440 down) {\n right: 0;\n }\n @include breakpoint(768 down) {\n right: 0;\n }\n\n &:target {\n display: block;\n\n @include breakpoint(medium up) {\n display: flex;\n }\n\n &:before {\n content: none;\n }\n }\n }\n\n &__list {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n &__item {\n position: relative;\n display: block;\n }\n\n &__link {\n display: block;\n padding: rem(4 10);\n color: color(header-text);\n transition-duration: .2s;\n transition-timing-function: cubic-bezier(.4,0,.2,1);\n transition-property: background-color,border-color,color;\n\n &:hover {\n color: color(header-text);\n background: color(header-hover-bg);\n }\n }\n\n &__item--active &__link {\n background: color(header-active-bg);\n }\n\n &__translation {\n color: color(header-text-muted);\n\n &:before {\n content: \"(\";\n }\n &:after {\n content: \")\";\n }\n }\n\n &__note {\n padding: rem(0 10 10);\n color: color(header-text-muted);\n }\n}\n",".l-main-search__container {\n list-style: none;\n padding: 0;\n margin-bottom: 2rem;\n}\n\n.l-main-search__result, .l-live-search__result {\n border-top: 1px solid color(border);\n padding-top: 1rem;\n margin-top: 1rem;\n\n .c-breadcrumb {\n margin-bottom: 0;\n }\n\n h4 {\n margin-top: 0;\n margin-bottom: 0;\n }\n\n @include breakpoint(small only) {\n &:first-child {\n border-top: none;\n }\n }\n}\n\n.l-main-search__match, .l-live-search__match {\n summary {\n float: right;\n color: color(body-text-muted);\n }\n}\n\n.l-search__pagination-holder {\n list-style: none;\n padding: 0;\n text-align: center;\n}\n.l-search-page {\n display: inline-block;\n}\n.l-search-page__link {\n display: block;\n cursor: pointer;\n padding: .5rem 1rem;\n line-height: initial;\n background: color(pagination-bg);\n color: color(mirage);\n border-radius: 0.25rem;\n border: 1px solid color(pagination-bg);\n\n &:hover, &:focus{\n background: color(slateGray);\n border: 1px solid color(slateGray);\n color: color(light);\n }\n\n &--active {\n background: color(sapphire);\n border: 1px solid color(sapphire);\n color: color(light);\n }\n}\n\n.c-searchform--resultspage {\n margin-bottom: 1rem;\n .c-searchform__input {\n border: 1px solid color(border);\n }\n}\n.l-search__meta {\n color: color(gray);\n}\n\n\n.l-search__ignored {\n border-left: rem(8) solid color(warning);\n padding: rem(15 20);\n background-color: color(callout-warning-bg);\n color: color(callout-warning-link);\n}\n.l-search__tip {\n border-left: rem(8) solid color(primary);\n padding: rem(15 20);\n background-color: color(callout-info-bg);\n color: color(link-color);\n}\n\n.l-search__no_results {\n border-left: rem(4) solid color(alert);\n padding: rem(15 20);\n background-color: color(callout-alert-bg);\n color: color(callout-alert-link);\n max-width: 100%;\n\n &--live {\n margin: 0;\n }\n}\n\n.c-searchform--header {\n z-index: 5;\n}\n.l-live-search__container {\n position: absolute;\n background: color(live-search-bg);\n width: 100%;\n display: none;\n border-radius: 0 0 5px 5px;\n margin-top: -3px;\n z-index: 4;\n box-shadow: 0 2px 7px 2px rgba(0,0,0,0.5);\n border: 1px solid color(border);\n border-top: none;\n\n &--visible {\n display: block;\n }\n\n &--loading {\n &::before {\n content: \"Loading...\";\n width: 100%;\n display: block;\n padding: 0.5em 0.5em 0.5em 1em;\n border-radius: 5px 5px 0 0;\n color: color(header-text);\n background: color(header-bg);\n\n }\n &:empty::before {\n border-radius: 5px;\n }\n }\n\n @include breakpoint(small only) {\n position: initial;\n margin-top: 1em;\n border-radius: 7px;\n box-shadow: none;\n border: 1px solid color(live-search-border);\n }\n}\n.l-live-search__results {\n list-style: none;\n padding: 0;\n margin: 0;\n max-height: 70vh;\n overflow-y: scroll;\n\n @include breakpoint(small only) {\n max-height: calc(100vh - 15rem);\n }\n}\n.l-live-search__result, .l-main-search__result {\n padding: 0;\n margin: 0;\n position: relative;\n}\n.c-live-search__result-crumbs, .l-main-search__crumbs {\n position: absolute;\n top: 0.7rem;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 0 1rem;\n height: 1.6em; // = line-height\n overflow: hidden;\n font-weight: 500;\n color: color(body-text-muted);\n}\n.c-live-search__result-link, .l-main-search__link {\n color: color(sapphire);\n display: block;\n padding: 2.2rem 1rem 0.7rem;\n font-weight: 500;\n &:hover, &:focus, .l-live-search__result--selected & {\n background: color(search-result-hover);\n }\n}\n.l-live-search__search {\n margin: 0;\n a {\n font-weight: 500;\n display: block;\n padding: 0.7rem 1rem;\n width: 100%;\n color: color(header-text);\n background: color(header-bg);\n border-radius: 0 0 5px 5px;\n }\n}\n.l-main-search__result {\n max-width: $paragraph-max-width;\n}\n.l-main-search__title {\n color: color(sapphire);\n}\n.l-main-search__link {\n text-decoration: none !important;\n &:hover, &:focus {\n .l-main-search__title {\n color: color(link-hover);\n }\n }\n}\n.l-main-search__snippet {\n color: color(body-text);\n}\n.size_code{\n font-size: 1em;\n}\n",".c-searchform {\n position: relative;\n width: 100%;\n\n @include breakpoint(small only) {\n margin-top: 1rem;\n }\n\n &__input {\n display: block;\n width: 100%;\n border: none;\n border-radius: .5rem;\n padding: rem(10 35 10 20);\n line-height: 1.5!important;\n font-family: inherit;\n font-size: 100%;\n color: color(body-text);\n transition: all .1s ease-in;\n background-color: color(search-input-bg);\n\n &::placeholder {\n color: color(body-text-muted);\n }\n\n &:focus{\n border-color: color(border);\n background-color: color(search-input-focus-bg);\n outline: 2px solid color(link-color);\n outline-offset: 1px;\n }\n\n @include breakpoint(small only) {\n border: 1px solid color(header-bg);\n }\n }\n\n &__button {\n position: absolute;\n top: rem(0);\n right: rem(10);\n bottom: rem(0);\n margin: 0;\n padding: 0;\n background: transparent;\n border: none;\n }\n\n &__icon {\n width: rem(24);\n height: rem(20);\n fill: color(search-icon);\n vertical-align: middle;\n }\n}\n\n// Undo helpers.scss:14 for the searchform target; without this there's an unclickable area before the search.\n#searchform:target:before {\n content: \"\";\n height: 0;\n margin: 0;\n}\n","table {\n display: block;\n width: fit-content;\n //min-width: 100%;\n max-width: 100%;\n max-width: calc(100% + #{rem(20)});\n margin: $global-margin*2 0;\n border-collapse: collapse;\n overflow-x: auto;\n\n @include breakpoint(medium) {\n display: table;\n table-layout:fixed;\n width: 100%;\n max-width: 100%;\n\n td {\n word-wrap: break-word;\n }\n }\n\n tr:nth-child(2n) {\n background: color(sidebar-bg);\n }\n\n td, th {\n border: 1px solid color(border-strong);\n padding: rem(9 16);\n }\n\n th {\n font-weight: 700;\n text-align: center;\n }\n\n td {\n min-width: rem(170);\n\n @include breakpoint(medium) {\n min-width: 0;\n }\n }\n\n &::-webkit-scrollbar, &::-webkit-scrollbar-thumb {\n width: 1rem;\n height: 1rem;\n border: .25rem solid transparent;\n border-radius: .5rem;\n background-color: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n box-shadow: inset 0 0 0 1rem color(scrollbar);\n }\n\n &::-webkit-scrollbar-thumb:hover {\n box-shadow: inset 0 0 0 1rem color(scrollbar-hover);\n }\n\n &::-webkit-resizer, &::-webkit-scrollbar-corner {\n background-color: transparent;\n }\n}\n",".c-themetoggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: rem(36);\n height: rem(36);\n margin: 0;\n padding: 0;\n border: none;\n border-radius: $global-radius;\n background: transparent;\n color: color(header-text);\n cursor: pointer;\n transition: background-color .2s ease-in-out;\n\n &:hover,\n &:focus {\n background: color(header-hover-bg);\n outline: none;\n }\n\n &:focus-visible {\n outline: 2px solid color(link-color);\n outline-offset: 2px;\n }\n\n &__icon {\n display: none;\n width: rem(20);\n height: rem(20);\n fill: currentColor;\n }\n}\n\n// Show icon for the *next* action / current preference\n[data-theme-preference=\"system\"] .c-themetoggle__icon--system,\n[data-theme-preference=\"light\"] .c-themetoggle__icon--light,\n[data-theme-preference=\"dark\"] .c-themetoggle__icon--dark {\n display: block;\n}\n",".c-toc {\n position: relative;\n margin: 0 0 $global-margin*2;\n\n &__title {\n display: block;\n margin: 0 0 rem(5);\n font-size: rem(12);\n font-weight: 700;\n color: color(cadetBlue);\n text-transform: uppercase;\n }\n\n ul {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n &__wrapper > ul > li {\n margin: 0 0 rem(7);\n\n &:last-child {\n margin-bottom: 0;\n }\n\n > a {\n font-weight: 700;\n }\n }\n\n a {\n display: block;\n margin: rem(0 0 3);\n font-size: rem(13);\n font-weight: 500;\n color: color(slateGray);\n line-height: 1.4;\n transition: all .2s ease;\n\n &:hover {\n color: color(mirage);\n transform: translateX(2px);\n }\n }\n\n li li {\n padding-left: rem(15);\n }\n}\n",".u-show-for-sr, .u-show-on-focus {\n position: absolute !important;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n// make anchor tags work with fixed header\n:target:before {\n content:\"\";\n display:block;\n height: ($header-height+$main-margin-top); /* fixed header height*/\n margin: (($header-height+$main-margin-top)*-1) 0 0; /* negative fixed header height */\n}\n\n.is-brokenlink {\n color: color(link-broken);\n text-decoration: line-through;\n\n &:after {\n content: \" (link broken)\";\n text-decoration: none;\n }\n}\n\n// style external links\n.is-externallink {\n &:after {\n content: \"\";\n display: inline-block;\n width: rem(10);\n height: rem(10);\n margin: rem(-1 2 0 4);\n background-color: color(body-text);\n -webkit-mask: svg-url('') center / 100% 100% no-repeat;\n mask: svg-url('') center / 100% 100% no-repeat;\n }\n}\n\n.u-no-margin {\n margin: 0 !important;\n}\n.u-no-margin--top {\n margin-top: 0 !important;\n}\n.u-no-margin--bottom {\n margin-bottom: 0 !important;\n}\n\n.u-no-padding {\n padding: 0 !important;\n}\n.u-no-padding--top {\n padding-top: 0 !important;\n}\n.u-no-padding--bottom {\n padding-bottom: 0 !important;\n}\n\nhtml.no-js {\n .u-show-with-js {\n display: none !important;\n }\n}\nhtml.js {\n .u-hide-with-js {\n display: none !important;\n }\n .u-hide-with-js-sr {\n @extend .u-show-for-sr;\n }\n}\n","@media print {\n :root,\n [data-theme=\"dark\"],\n [data-theme=\"light\"] {\n color-scheme: light;\n @include theme-properties($light-colors);\n }\n\n .l-app > * {\n display: none;\n }\n\n .l-app .l-main {\n display: block;\n }\n}\n"]} \ No newline at end of file diff --git a/public/template/dist/main-legacy.js b/public/template/dist/main-legacy.js index 81b9ca28..b98e6396 100644 --- a/public/template/dist/main-legacy.js +++ b/public/template/dist/main-legacy.js @@ -1,2 +1,2 @@ /*! For license information please see main-legacy.js.LICENSE.txt */ -!function(){var e={4963:function(e){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},7722:function(e,t,n){var r=n(6314)("unscopables"),i=Array.prototype;null==i[r]&&n(7728)(i,r,{}),e.exports=function(e){i[r][e]=!0}},6793:function(e,t,n){"use strict";var r=n(4496)(!0);e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},7007:function(e,t,n){var r=n(5286);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},9315:function(e,t,n){var r=n(2110),i=n(875),a=n(2337);e.exports=function(e){return function(t,n,o){var s,l=r(t),u=i(l.length),c=a(o,u);if(e&&n!=n){for(;u>c;)if((s=l[c++])!=s)return!0}else for(;u>c;c++)if((e||c in l)&&l[c]===n)return e||c||0;return!e&&-1}}},1488:function(e,t,n){var r=n(2032),i=n(6314)("toStringTag"),a="Arguments"==r(function(){return arguments}());e.exports=function(e){var t,n,o;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),i))?n:a?r(t):"Object"==(o=r(t))&&"function"==typeof t.callee?"Arguments":o}},2032:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},5645:function(e){var t=e.exports={version:"2.6.12"};"number"==typeof __e&&(__e=t)},741:function(e,t,n){var r=n(4963);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},1355:function(e){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},7057:function(e,t,n){e.exports=!n(4253)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},2457:function(e,t,n){var r=n(5286),i=n(3816).document,a=r(i)&&r(i.createElement);e.exports=function(e){return a?i.createElement(e):{}}},4430:function(e){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},5541:function(e,t,n){var r=n(7184),i=n(4548),a=n(4682);e.exports=function(e){var t=r(e),n=i.f;if(n)for(var o,s=n(e),l=a.f,u=0;s.length>u;)l.call(e,o=s[u++])&&t.push(o);return t}},2985:function(e,t,n){var r=n(3816),i=n(5645),a=n(7728),o=n(7234),s=n(741),l="prototype",u=function(e,t,n){var c,d,p,f,g=e&u.F,m=e&u.G,h=e&u.S,b=e&u.P,v=e&u.B,y=m?r:h?r[t]||(r[t]={}):(r[t]||{})[l],E=m?i:i[t]||(i[t]={}),S=E[l]||(E[l]={});for(c in m&&(n=t),n)p=((d=!g&&y&&void 0!==y[c])?y:n)[c],f=v&&d?s(p,r):b&&"function"==typeof p?s(Function.call,p):p,y&&o(y,c,p,e&u.U),E[c]!=p&&a(E,c,f),b&&S[c]!=p&&(S[c]=p)};r.core=i,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},4253:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},8082:function(e,t,n){"use strict";n(8269);var r=n(7234),i=n(7728),a=n(4253),o=n(1355),s=n(6314),l=n(1165),u=s("species"),c=!a((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})),d=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();e.exports=function(e,t,n){var p=s(e),f=!a((function(){var t={};return t[p]=function(){return 7},7!=""[e](t)})),g=f?!a((function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[u]=function(){return n}),n[p](""),!t})):void 0;if(!f||!g||"replace"===e&&!c||"split"===e&&!d){var m=/./[p],h=n(o,p,""[e],(function(e,t,n,r,i){return t.exec===l?f&&!i?{done:!0,value:m.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}})),b=h[0],v=h[1];r(String.prototype,e,b),i(RegExp.prototype,p,2==t?function(e,t){return v.call(e,this,t)}:function(e){return v.call(e,this)})}}},3218:function(e,t,n){"use strict";var r=n(7007);e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},18:function(e,t,n){e.exports=n(3825)("native-function-to-string",Function.toString)},3816:function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)},9181:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},7728:function(e,t,n){var r=n(9275),i=n(681);e.exports=n(7057)?function(e,t,n){return r.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},639:function(e,t,n){var r=n(3816).document;e.exports=r&&r.documentElement},1734:function(e,t,n){e.exports=!n(7057)&&!n(4253)((function(){return 7!=Object.defineProperty(n(2457)("div"),"a",{get:function(){return 7}}).a}))},266:function(e,t,n){var r=n(5286),i=n(7375).set;e.exports=function(e,t,n){var a,o=t.constructor;return o!==n&&"function"==typeof o&&(a=o.prototype)!==n.prototype&&r(a)&&i&&i(e,a),e}},9797:function(e,t,n){var r=n(2032);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},4302:function(e,t,n){var r=n(2032);e.exports=Array.isArray||function(e){return"Array"==r(e)}},5286:function(e){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},9988:function(e,t,n){"use strict";var r=n(2503),i=n(681),a=n(2943),o={};n(7728)(o,n(6314)("iterator"),(function(){return this})),e.exports=function(e,t,n){e.prototype=r(o,{next:i(1,n)}),a(e,t+" Iterator")}},2923:function(e,t,n){"use strict";var r=n(4461),i=n(2985),a=n(7234),o=n(7728),s=n(2803),l=n(9988),u=n(2943),c=n(468),d=n(6314)("iterator"),p=!([].keys&&"next"in[].keys()),f="keys",g="values",m=function(){return this};e.exports=function(e,t,n,h,b,v,y){l(n,t,h);var E,S,k,w=function(e){if(!p&&e in O)return O[e];switch(e){case f:case g:return function(){return new n(this,e)}}return function(){return new n(this,e)}},A=t+" Iterator",T=b==g,_=!1,O=e.prototype,N=O[d]||O["@@iterator"]||b&&O[b],L=N||w(b),I=b?T?w("entries"):L:void 0,x="Array"==t&&O.entries||N;if(x&&(k=c(x.call(new e)))!==Object.prototype&&k.next&&(u(k,A,!0),r||"function"==typeof k[d]||o(k,d,m)),T&&N&&N.name!==g&&(_=!0,L=function(){return N.call(this)}),r&&!y||!p&&!_&&O[d]||o(O,d,L),s[t]=L,s[A]=m,b)if(E={values:T?L:w(g),keys:v?L:w(f),entries:I},y)for(S in E)S in O||a(O,S,E[S]);else i(i.P+i.F*(p||_),t,E);return E}},5436:function(e){e.exports=function(e,t){return{value:t,done:!!e}}},2803:function(e){e.exports={}},4461:function(e){e.exports=!1},4728:function(e,t,n){var r=n(3953)("meta"),i=n(5286),a=n(9181),o=n(9275).f,s=0,l=Object.isExtensible||function(){return!0},u=!n(4253)((function(){return l(Object.preventExtensions({}))})),c=function(e){o(e,r,{value:{i:"O"+ ++s,w:{}}})},d=e.exports={KEY:r,NEED:!1,fastKey:function(e,t){if(!i(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,r)){if(!l(e))return"F";if(!t)return"E";c(e)}return e[r].i},getWeak:function(e,t){if(!a(e,r)){if(!l(e))return!0;if(!t)return!1;c(e)}return e[r].w},onFreeze:function(e){return u&&d.NEED&&l(e)&&!a(e,r)&&c(e),e}}},2503:function(e,t,n){var r=n(7007),i=n(5588),a=n(4430),o=n(9335)("IE_PROTO"),s=function(){},l="prototype",u=function(){var e,t=n(2457)("iframe"),r=a.length;for(t.style.display="none",n(639).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" {% block title %}{{ lang.home }}{% endblock %} | {{ lang.title }} @@ -31,13 +48,20 @@ - + {% if social_image %} + + + + + + {% endif %} + {% block stylesheets %}{% endblock %} @@ -72,14 +96,14 @@ {{ icon('search', 'Search', 'o-search__icon', null, 'aria-hidden="true"') }}
+

{{ result.title }}

-

{{ result.snippet|raw }}

+

{{ result.snippet }}

diff --git a/templates/search.twig b/templates/search.twig index b99ecc22..e9fab011 100644 --- a/templates/search.twig +++ b/templates/search.twig @@ -34,7 +34,7 @@ {% if versions %} Search in other versions: {% for version in versions %} - {{ version.title }} + {{ version.title }} {% endfor %} — {% endif %} diff --git a/templates/search_ajax.twig b/templates/search_ajax.twig index d8bbbc96..e2e4822a 100644 --- a/templates/search_ajax.twig +++ b/templates/search_ajax.twig @@ -23,7 +23,7 @@ @@ -31,7 +31,7 @@

No results found for your search. :( - + View search details »

diff --git a/tests/BaseTestCase.php b/tests/BaseTestCase.php index c0dc4932..6d946cf4 100644 --- a/tests/BaseTestCase.php +++ b/tests/BaseTestCase.php @@ -1,62 +1,41 @@ $requestMethod, - 'REQUEST_URI' => $requestUri - ] - ); + $request = (new ServerRequestFactory())->createServerRequest($requestMethod, $requestUri); - // Set up a request object based on the environment - $request = Request::createFromEnvironment($environment); - - // Add request data, if it exists if ($requestData !== null) { - $request = $request->withParsedBody($requestData); + $stream = (new StreamFactory())->createStream(http_build_query((array) $requestData)); + $request = $request + ->withHeader('Content-Type', 'application/x-www-form-urlencoded') + ->withBody($stream) + ->withParsedBody($requestData); } - // Set up a response object - $response = new Response(); - // Process the application - $response = $app->process($request, $response); - - // Return the response - return $response; + return self::$app->getApp()->handle($request); } } diff --git a/tests/Functional/DocTest.php b/tests/Functional/DocTest.php index 7eeced98..cfce53df 100644 --- a/tests/Functional/DocTest.php +++ b/tests/Functional/DocTest.php @@ -1,4 +1,5 @@ runApp('GET', '/2.x/en/getting-started'); - $this->assertEquals(200, $response->getStatusCode()); - $this->assertContains('Welcome to MODX Revolution', (string)$response->getBody()); - $this->assertNotContains('WordPress', (string)$response->getBody()); + $this->assertSame(200, $response->getStatusCode()); + $this->assertStringContainsString('Getting Started', (string) $response->getBody()); + $this->assertStringNotContainsString('WordPress', (string) $response->getBody()); + } + + public function testServesImagesFromDocsTree(): void + { + $response = $this->runApp( + 'GET', + '/3.x/en/getting-started/installation/setup-opt1.png' + ); + + $this->assertSame(200, $response->getStatusCode()); + $this->assertStringStartsWith('image/', $response->getHeaderLine('Content-Type')); + $this->assertNotSame('', (string) $response->getBody()); + } + + public function testServesMp4VideosFromDocsTree(): void + { + $response = $this->runApp( + 'GET', + '/3.x/en/extras/fred/themer/basic-use.mp4' + ); + + $this->assertSame(200, $response->getStatusCode()); + $this->assertSame('video/mp4', $response->getHeaderLine('Content-Type')); + $this->assertNotSame('', (string) $response->getBody()); + } + + public function testPathTraversalDoesNotServeAppReadmeOutsideDocsTree(): void + { + $response = $this->runApp('GET', '/2.x/en/../../../README'); + + $this->assertSame(404, $response->getStatusCode()); + $body = (string) $response->getBody(); + $this->assertStringNotContainsString('DocsApp for MODX', $body); + $this->assertStringNotContainsString('Slim application that serves up', $body); + } + + public function testDoubleEncodedPathTraversalDoesNotServeAppReadme(): void + { + $response = $this->runApp( + 'GET', + '/2.x/en/%252e%252e/%252e%252e/%252e%252e/README' + ); + + $this->assertSame(404, $response->getStatusCode()); + $body = (string) $response->getBody(); + $this->assertStringNotContainsString('DocsApp for MODX', $body); + $this->assertStringNotContainsString('Slim application that serves up', $body); } } diff --git a/tests/Functional/HomepageTest.php b/tests/Functional/HomepageTest.php index fb87989e..16b6ae86 100644 --- a/tests/Functional/HomepageTest.php +++ b/tests/Functional/HomepageTest.php @@ -1,4 +1,5 @@ runApp('GET', '/'); - $this->assertEquals(200, $response->getStatusCode()); - $this->assertContains('Creative Freedom', (string)$response->getBody()); - $this->assertNotContains('Hello', (string)$response->getBody()); + $this->assertSame(301, $response->getStatusCode()); + $this->assertStringContainsString('/current/en/', $response->getHeaderLine('Location')); + } + + public function testGetDocsHomepage(): void + { + $response = $this->runApp('GET', '/2.x/en/index'); + + $this->assertSame(200, $response->getStatusCode()); + $this->assertStringContainsString('Creative Freedom', (string) $response->getBody()); + $this->assertStringNotContainsString('Hello', (string) $response->getBody()); } - /** - * Test that the index route won't accept a post request - */ - public function testPostHomepageNotAllowed() : void + public function testPostHomepageNotAllowed(): void { $response = $this->runApp('POST', '/', ['test']); - $this->assertEquals(405, $response->getStatusCode()); - $this->assertContains('Method not allowed', (string)$response->getBody()); + $this->assertSame(405, $response->getStatusCode()); } } diff --git a/tests/Functional/NoiseRequestTest.php b/tests/Functional/NoiseRequestTest.php new file mode 100644 index 00000000..e23b7b31 --- /dev/null +++ b/tests/Functional/NoiseRequestTest.php @@ -0,0 +1,45 @@ +runApp('GET', 'http://localhost' . $path); + + $this->assertSame(404, $response->getStatusCode()); + $this->assertSame('', (string) $response->getBody()); + } + + public static function noisePathsProvider(): array + { + return [ + 'sbbi' => ['/sbbi'], + 'wp-login' => ['/wp-login.php'], + 'xmlrpc' => ['/xmlrpc.php'], + 'double-slash xmlrpc' => ['//xmlrpc.php'], + 'wlwmanifest nested' => ['//blog/wp-includes/wlwmanifest.xml'], + 'env' => ['/.env'], + 'manager probe' => ['/manager/html'], + 'login probe' => ['/login'], + 'confluence viewinfo' => ['/pages/viewinfo.action'], + 'confluence viewpage' => ['/pages/viewpage.action'], + 'wp-admin ajax' => ['/wp-admin/admin-ajax.php'], + ]; + } + + public function testLegitimateDocsStillWork(): void + { + $response = $this->runApp('GET', '/2.x/en/getting-started'); + + $this->assertSame(200, $response->getStatusCode()); + $this->assertNotSame('', (string) $response->getBody()); + } +} diff --git a/tests/Functional/SitemapTest.php b/tests/Functional/SitemapTest.php new file mode 100644 index 00000000..2b206cfe --- /dev/null +++ b/tests/Functional/SitemapTest.php @@ -0,0 +1,174 @@ +tempDir = sys_get_temp_dir() . '/modxdocs-sitemap-' . uniqid('', true); + mkdir($this->tempDir . '/sitemaps', 0755, true); + } + + protected function tearDown(): void + { + $this->removeDir($this->tempDir); + parent::tearDown(); + } + + public function testGenerateWritesIndexAndSplitSitemaps(): void + { + $service = new SitemapService( + 'https://docs.modx.org/', + $this->tempDir, + $_ENV['DOCS_DIRECTORY'] + ); + + $result = $service->generate(); + + $this->assertGreaterThan(0, $result['urls']); + $this->assertFileExists($this->tempDir . '/sitemap.xml'); + + $index = simplexml_load_file($this->tempDir . '/sitemap.xml'); + $this->assertNotFalse($index); + $this->assertSame('sitemapindex', $index->getName()); + $this->assertGreaterThan(0, count($index->sitemap)); + + $childLoc = (string) $index->sitemap[0]->loc; + $this->assertStringStartsWith('https://docs.modx.org/sitemaps/', $childLoc); + $this->assertStringEndsWith('.xml', $childLoc); + + $childFile = $this->tempDir . '/sitemaps/' . basename($childLoc); + $this->assertFileExists($childFile); + + $urlset = simplexml_load_file($childFile); + $this->assertNotFalse($urlset); + $this->assertSame('urlset', $urlset->getName()); + $this->assertGreaterThan(0, count($urlset->url)); + + $firstLoc = (string) $urlset->url[0]->loc; + $this->assertStringStartsWith('https://docs.modx.org/', $firstLoc); + + // Current branch must be published under /current/, never the raw branch name + $currentBranch = VersionsService::getCurrentVersionBranch(); + $currentEn = $this->tempDir . '/sitemaps/current-en.xml'; + $this->assertFileExists($currentEn); + $currentXml = file_get_contents($currentEn); + $this->assertIsString($currentXml); + $this->assertStringNotContainsString('/' . $currentBranch . '/', $currentXml); + + // Index lastmod should be the newest lastmod among that child sitemap's URLs + $newestInChild = null; + foreach ($urlset->url as $url) { + if (!isset($url->lastmod)) { + continue; + } + $lastmod = (string) $url->lastmod; + if ($newestInChild === null || $lastmod > $newestInChild) { + $newestInChild = $lastmod; + } + } + $this->assertNotNull($newestInChild); + $this->assertSame($newestInChild, (string) $index->sitemap[0]->lastmod); + } + + public function testCanonicalUsesCurrentForCurrentBranch(): void + { + $service = new SitemapService( + 'https://docs.modx.org/', + $this->tempDir, + $_ENV['DOCS_DIRECTORY'] + ); + $service->generate(); + + $currentEn = $this->tempDir . '/sitemaps/current-en.xml'; + $this->assertFileExists($currentEn); + + $xml = file_get_contents($currentEn); + $this->assertIsString($xml); + $this->assertStringContainsString( + 'https://docs.modx.org/current/en/index', + $xml + ); + $this->assertStringNotContainsString('/3.x/', $xml); + + // Legacy branch alias file must not be generated + $this->assertFileDoesNotExist($this->tempDir . '/sitemaps/3.x-en.xml'); + $this->assertFileExists($this->tempDir . '/sitemaps/2.x-en.xml'); + } + + public function testHreflangAlternatesOnTranslatedPages(): void + { + $service = new SitemapService( + 'https://docs.modx.org/', + $this->tempDir, + $_ENV['DOCS_DIRECTORY'] + ); + $service->generate(); + + $currentEn = $this->tempDir . '/sitemaps/current-en.xml'; + $this->assertFileExists($currentEn); + + $xml = file_get_contents($currentEn); + $this->assertIsString($xml); + $this->assertStringContainsString('xmlns:xhtml="http://www.w3.org/1999/xhtml"', $xml); + + // Language home: self + other languages + x-default → English + $this->assertMatchesRegularExpression( + '#https://docs\.modx\.org/current/en/index\s*' + . '[^<]+\s*' + . '\s*' + . '\s*' + . '\s*' + . '\s*' + . '#', + $xml + ); + + // Reciprocal: Russian home lists English + x-default + $currentRu = $this->tempDir . '/sitemaps/current-ru.xml'; + $this->assertFileExists($currentRu); + $ruXml = file_get_contents($currentRu); + $this->assertIsString($ruXml); + $this->assertStringContainsString( + 'hreflang="en" href="https://docs.modx.org/current/en/index"', + $ruXml + ); + $this->assertStringContainsString( + 'hreflang="x-default" href="https://docs.modx.org/current/en/index"', + $ruXml + ); + } + + public function testLanguagesConstantMatchesApp(): void + { + $this->assertSame(['en', 'ru', 'nl', 'es'], SitemapService::LANGUAGES); + $this->assertSame(VersionsService::getCurrentVersion(), 'current'); + $this->assertSame(VersionsService::getCurrentVersionBranch(), '3.x'); + } + + private function removeDir(string $dir): void + { + if (!is_dir($dir)) { + return; + } + + $items = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS), + \RecursiveIteratorIterator::CHILD_FIRST + ); + foreach ($items as $item) { + $item->isDir() ? rmdir($item->getPathname()) : unlink($item->getPathname()); + } + rmdir($dir); + } +} diff --git a/tests/Unit/CacheServiceTest.php b/tests/Unit/CacheServiceTest.php new file mode 100644 index 00000000..ef560ab7 --- /dev/null +++ b/tests/Unit/CacheServiceTest.php @@ -0,0 +1,101 @@ +cacheDir = sys_get_temp_dir() . '/modxdocs-cache-test-' . uniqid('', true); + mkdir($this->cacheDir, 0777, true); + + $this->previousCacheDir = $_ENV['CACHE_DIRECTORY'] ?? null; + $this->previousCacheEnabled = $_ENV['CACHE_ENABLED'] ?? null; + $_ENV['CACHE_DIRECTORY'] = $this->cacheDir; + $_ENV['CACHE_ENABLED'] = '1'; + } + + protected function tear_down(): void + { + if ($this->previousCacheDir === null) { + unset($_ENV['CACHE_DIRECTORY']); + } else { + $_ENV['CACHE_DIRECTORY'] = $this->previousCacheDir; + } + + if ($this->previousCacheEnabled === null) { + unset($_ENV['CACHE_ENABLED']); + } else { + $_ENV['CACHE_ENABLED'] = $this->previousCacheEnabled; + } + + $this->removeDirectory($this->cacheDir); + + parent::tear_down(); + } + + public function testSetAndGetLegitimateKey(): void + { + $cache = new CacheService(); + + $this->assertTrue($cache->set('rendered/2.x/en/getting-started', 'body')); + $this->assertSame('body', $cache->get('rendered/2.x/en/getting-started')); + $this->assertFileExists($this->cacheDir . '/rendered/2.x/en/getting-started.json'); + } + + public function testSetRejectsTraversalKey(): void + { + $cache = new CacheService(); + $outsideTarget = dirname($this->cacheDir) . '/outside.json'; + + $this->assertFalse($cache->set('rendered/2.x/en/../../../outside', 'pwned')); + $this->assertFalse($cache->get('rendered/2.x/en/../../../outside')); + $this->assertFileDoesNotExist($outsideTarget); + $this->assertFileDoesNotExist($this->cacheDir . '/outside.json'); + } + + public function testSetRejectsBackslashTraversalKey(): void + { + $cache = new CacheService(); + + $this->assertFalse($cache->set('rendered\\2.x\\en\\..\\..\\..\\outside', 'pwned')); + $this->assertFileDoesNotExist(dirname($this->cacheDir) . '/outside.json'); + } + + private function removeDirectory(string $directory): void + { + if (!is_dir($directory)) { + return; + } + + $items = scandir($directory); + if ($items === false) { + return; + } + + foreach ($items as $item) { + if ($item === '.' || $item === '..') { + continue; + } + $path = $directory . DIRECTORY_SEPARATOR . $item; + if (is_dir($path)) { + $this->removeDirectory($path); + } else { + unlink($path); + } + } + + rmdir($directory); + } +} diff --git a/tests/Unit/FilePathServiceTest.php b/tests/Unit/FilePathServiceTest.php new file mode 100644 index 00000000..d0dd130e --- /dev/null +++ b/tests/Unit/FilePathServiceTest.php @@ -0,0 +1,55 @@ +getDocsRoot()); + $this->assertNotFalse($docsRoot, 'DOCS_DIRECTORY must resolve'); + + $innocentReadme = realpath($docsRoot . '/../README.md'); + $this->assertNotFalse($innocentReadme, 'Expected app README.md next to docs/'); + $this->assertStringContainsString( + 'DocsApp for MODX', + (string) file_get_contents($innocentReadme) + ); + + $request = new PageRequest('2.x', 'en', '../../../README'); + $resolved = $service->getFilePath($request); + + $this->assertNull($resolved); + } + + public function testGetFilePathResolvesMarkdownInsideDocsRoot(): void + { + $service = new FilePathService(); + $docsRoot = realpath($service->getDocsRoot()); + $this->assertNotFalse($docsRoot); + + $request = new PageRequest('2.x', 'en', 'getting-started'); + $resolved = $service->getFilePath($request); + + $this->assertNotNull($resolved); + $resolvedReal = realpath($resolved); + $this->assertNotFalse($resolvedReal); + $this->assertStringStartsWith($docsRoot . DIRECTORY_SEPARATOR, $resolvedReal); + $this->assertStringEndsWith('.md', $resolvedReal); + } + + public function testGetStaticFilePathRejectsTraversalOutsideDocsRoot(): void + { + $service = new FilePathService(); + $request = new PageRequest('2.x', 'en', '../../../README.md'); + + $this->assertNull($service->getStaticFilePath($request)); + } +} diff --git a/tests/Unit/RelativeImageRendererTest.php b/tests/Unit/RelativeImageRendererTest.php new file mode 100644 index 00000000..b74762d5 --- /dev/null +++ b/tests/Unit/RelativeImageRendererTest.php @@ -0,0 +1,63 @@ +render( + new Image('basic-use.mp4', 'Basic use demo'), + $this->childRenderer('Basic use demo') + ); + + $this->assertStringContainsString('class="video-embed video-embed--local"', $html); + $this->assertStringContainsString('