Commit 361ec1e968bc34c335f1209dad001a6ad7a970b3

Authored by Terry
0 parents

init

Too many changes to show.

To preserve performance only 35 of 148 files are displayed.

  1 +tests:
  2 + 'The homepage should be fast':
  3 + path:
  4 + - '/'
  5 + assertions:
  6 + - 'main.wall_time <= 250ms'
  7 + 'Some Composer dependencies have known security issues and should be upgraded':
  8 + path:
  9 + - '/.*'
  10 + assertions:
  11 + - { expression: 'not has_vulnerable_dependencies()' }
  12 + '"assert.active" is a dev_only feature and should be disabled in production':
  13 + path:
  14 + - '/.*'
  15 + assertions:
  16 + - { expression: 'runtime.configuration.assert_active === false' }
  17 + '"display_errors" should be disabled':
  18 + path:
  19 + - '/.*'
  20 + assertions:
  21 + - { expression: 'not is_configuration_enabled("display_errors")' }
  22 + '"display_startup_errors" should not be enabled':
  23 + path:
  24 + - '/.*'
  25 + assertions:
  26 + - { expression: 'not is_configuration_enabled("display_startup_errors")' }
  27 + '"max_execution_time" should be less than 30 seconds for Web requests':
  28 + path:
  29 + - '/.*'
  30 + assertions:
  31 + - { expression: 'runtime.configuration.max_execution_time <= 30' }
  32 + '"session.use_strict_mode" should be enabled':
  33 + path:
  34 + - '/.*'
  35 + assertions:
  36 + - { expression: 'runtime.configuration.session_use_strict_mode === true' }
  37 + '"zend.detect_unicode" should be disabled as BOMs are not portable':
  38 + path:
  39 + - '/.*'
  40 + assertions:
  41 + - { expression: 'runtime.configuration.zend_detect_unicode === false' }
  42 + 'The realpath cache ttl should be more than one hour in production':
  43 + path:
  44 + - '/.*'
  45 + assertions:
  46 + - { expression: 'runtime.configuration.realpath_cache_ttl >= 3600' }
  47 + 'The session garbage collector should be disabled in production':
  48 + path:
  49 + - '/.*'
  50 + assertions:
  51 + - { expression: 'runtime.configuration.session_gc_probability === 0' }
  52 +
  53 +scenarios: |
  54 + #!blackfire-player
  55 +
  56 + name "Drupal Scenarios"
  57 +
  58 + group homepages
  59 + visit url("/")
  60 + name "Homepage (English)"
  61 + expect status_code() == 200
  62 + visit url("/es")
  63 + name "Homepage (Español)"
  64 + expect status_code() == 200
  65 +
  66 + group articles
  67 + visit url("/en/articles")
  68 + name "Articles"
  69 + expect status_code() == 200
  70 +
  71 + group admin_anonymous
  72 + visit url("/en/admin/content")
  73 + expect status_code() == 403
  74 + visit url("/en/admin/structure")
  75 + expect status_code() == 403
  76 +
  77 + scenario
  78 + name "Anonymous Visit"
  79 + include homepages
  80 + include articles
  81 + include admin_anonymous
... ...
  1 +# You can remove the above line if you want to edit and maintain this file yourself.
  2 +
  3 +/**/*.example
  4 +/.dbimageBuild
  5 +/.dbimageExtra
  6 +/.ddev-docker-*.yaml
  7 +/.*downloads
  8 +/.global_commands
  9 +/.homeadditions
  10 +/.importdb*
  11 +/.sshimageBuild
  12 +/.venv
  13 +/.webimageBuild
  14 +/.webimageExtra
  15 +/apache/apache-site.conf
  16 +/commands/.gitattributes
  17 +/commands/db/mysql
  18 +/commands/host/launch
  19 +/commands/web/xdebug
  20 +/commands/web/live
  21 +/config.local.y*ml
  22 +/db_dumps/*
  23 +/db_snapshots
  24 +/file_dumps/*
  25 +/import-db
  26 +/import.yaml
  27 +/mutagen/mutagen.yml
  28 +/mutagen/.start-synced
  29 +/nginx_full/nginx-site.conf
  30 +/postgres/postgresql.conf
  31 +/providers/platform.yaml
  32 +/sequelpro.spf
  33 +/settings/settings.ddev.py
  34 +/traefik/config/*.yaml
  35 +/traefik/certs/*.crt
  36 +/traefik/certs/*.key
  37 +/xhprof/xhprof_prepend.php
  38 +/**/README.*
... ...
  1 +#!/usr/bin/env bash
  2 +
  3 +# Disable commands dynamic path.
  4 +# shellcheck disable=SC2154
  5 +
  6 +# Prepare some colors.
  7 +red=$(tput -T xterm-256color setaf 1)
  8 +aqua=$(tput -T xterm-256color setaf 14)
  9 +lime=$(tput -T xterm-256color setaf 10)
  10 +yellow=$(tput -T xterm-256color setaf 11)
  11 +no_color=$(tput -T xterm-256color sgr0)
  12 +
  13 +# Declare composer update function.
  14 +composer_update() {
  15 + # Print debug command
  16 + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev composer update $1${no_color}"
  17 +
  18 + # Run ddev composer update on all available updates.
  19 + (ddev composer update $1 | tee composer_update_result.txt) > /dev/null 2>&1
  20 +
  21 + # Get update result.
  22 + composer_update_result=$(cat composer_update_result.txt) && rm composer_update_result.txt
  23 +
  24 + # Check if we see problem string inside our logs.
  25 + if [[ ${composer_update_result} == *"Problem"* ]]; then
  26 + # Print message about errors.
  27 + echo "${aqua}[Auto update] ${red}Composer update failed due to dependencies problems. Fix all listed problems and try again.${no_color}"
  28 + exit
  29 + fi
  30 +
  31 + # Check if we see permission denied string inside our logs.
  32 + if [[ ${composer_update_result} == *"Permission denied (publickey)"* ]]; then
  33 + # Print message about errors.
  34 + echo "${aqua}[Auto update] ${red}Composer update failed due to permission denied. Fix all listed problems and try again.${no_color}"
  35 + exit
  36 + fi
  37 +}
  38 +
  39 +# Declare auto update function.
  40 +auto_update() {
  41 + # Prepare declaration.
  42 + declare -A packages_to_update=()
  43 +
  44 + # Prepare some variables.
  45 + app_path="web"
  46 + updates_check_script_path=".ddev/commands/host/auto_update/updates_check.php"
  47 +
  48 + # Check if target script does actually exists.
  49 + if [[ ! -f ${updates_check_script_path} ]]; then
  50 + # If not print proper message.
  51 + echo "${aqua}[Auto update] ${red}Updates check failed. File 'updates_check.php' not found.${no_color}"
  52 + exit 1;
  53 + fi
  54 +
  55 + # Loop through each given site.
  56 + for site in "$@"; do
  57 + # Print what we are doing on which site.
  58 + echo "${aqua}[Auto update] ${no_color}Running auto-update on site \"${yellow}${site}${no_color}\"."
  59 + echo "${aqua}[Auto update] ${no_color}Enabling update module on target site..."
  60 + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev drush en update -y -l \"${site}\"${no_color}"
  61 +
  62 + # Enable update module.
  63 + ddev drush en update -y -l "${site}" > /dev/null 2>&1
  64 +
  65 + # Print what we gonna do.
  66 + echo "${aqua}[Auto update] ${no_color}Clearing cache after enabling module..."
  67 + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev drush cr -y -l \"${site}\"${no_color}"
  68 +
  69 + # Clear cache after those actions
  70 + ddev drush cr -y -l "${site}" > /dev/null 2>&1
  71 +
  72 + # Print what we gonna do.
  73 + echo "${aqua}[Auto update] ${no_color}Gather info about packages that need to be updated..."
  74 + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev php \"${updates_check_script_path}\" \"${site}\" \"${app_path}\"${no_color}"
  75 +
  76 + # Run update test on given site.
  77 + updates_check_result=$(ddev php "${updates_check_script_path}" "${site}" "${app_path}" | tail -n1)
  78 +
  79 + # Check if results does actually contain anything.
  80 + if [[ ${updates_check_result} =~ (<<)(.*)(>>) ]]; then
  81 + # Get our packages which need to be updates.
  82 + if [[ -n ${BASH_REMATCH[2]} ]]; then
  83 + # Loop through each package to update.
  84 + for package in ${BASH_REMATCH[2]}; do
  85 + # Save that package to array.
  86 + packages_to_update[${package}]=${package}
  87 + done
  88 + fi
  89 + else
  90 + # In case of any other case, print error.
  91 + echo "${aqua}[Auto update] ${red}Updates check failed. Reason: ${no_color}${updates_check_result}"
  92 + exit 1;
  93 + fi
  94 + done
  95 +
  96 + # Check if we successfully get some requirements.
  97 + if [[ -n "${packages_to_update[*]}" ]]; then
  98 + # Print them.
  99 + echo "${aqua}[Auto update] ${no_color}Required update for following packages: ${lime}${packages_to_update[*]}${no_color}"
  100 +
  101 + # If drupal/core needs to be updated, we need to check if drupal/core-recommended is used.
  102 + if [[ "${packages_to_update[*]}" == *"drupal/core"* ]]; then
  103 + # Print debug command.
  104 + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev composer show drupal/core-recommended${no_color}"
  105 +
  106 + # Show all core-recommended packages.
  107 + ddev composer show drupal/core-recommended | tee drupal_core_recommended.txt > /dev/null 2>&1
  108 +
  109 + # Save them to variable.
  110 + drupal_core_recommended=$(cat drupal_core_recommended.txt) && rm drupal_core_recommended.txt
  111 +
  112 + # Check if core-recommend was found.
  113 + if [[ ${drupal_core_recommended} != *"Package drupal/core-recommended not found"* ]]; then
  114 + # If so then run all core-* updates.
  115 + composer_update "drupal/core-* --with-all-dependencies --no-interaction --no-dev"
  116 +
  117 + # Remove drupal/core from the list, since the update for it was already executed.
  118 + unset packages_to_update["drupal/core"]
  119 + fi
  120 + fi
  121 +
  122 + # Update all other packages for which update is needed.
  123 + if [[ -n "${packages_to_update[*]}" ]]; then
  124 + # Run the same command as for drupal/core.
  125 + composer_update "${packages_to_update[*]} --with-dependencies --no-interaction"
  126 + fi
  127 +
  128 + # Print debug command.
  129 + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}git status${no_color}"
  130 +
  131 + # Check if composer.lock was changed and grab full path to it from git status output.
  132 + git status | tee git_status_result.txt > /dev/null 2>&1
  133 + git_status_result=$(cat git_status_result.txt) && rm git_status_result.txt
  134 +
  135 + # Check if we have changes inside composer.lock
  136 + if [[ ${git_status_result} =~ ([ ]+)(([a-zA-Z0-9_ \/\.\-]+\/)*composer\.lock) ]]; then
  137 + # Get lock file changes for variables.
  138 + composer_lock_file=${BASH_REMATCH[2]}
  139 + date=$(date '+%Y-%m-%d_%H-%M-%S')
  140 + update_branch_name="update/${date}"
  141 +
  142 + # Try to run extra commands after update.
  143 + for site in ${1//,/ }; do
  144 + # Print debug command.
  145 + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev drush updb -y -l \"${site}\"${no_color}"
  146 +
  147 + # Run database update on current site.
  148 + (ddev drush updb -y -l "${site}" 2>&1 | tee drush_update_db_result.txt) > /dev/null 2>&1
  149 + drush_update_db_result=$(cat drush_update_db_result.txt)
  150 +
  151 + # Check if we have success.
  152 + if
  153 + [[ ${drush_update_db_result} != *"[success] No pending updates."* ]] &&
  154 + [[ ${drush_update_db_result} != *"[success] Finished performing updates."* ]] &&
  155 + [ "${#drush_update_db_result}" -gt 0 ]
  156 + then
  157 + # If not print that and quit.
  158 + echo "${aqua}[Auto update] ${red}Database updates failed.${no_color}"
  159 + exit 1;
  160 + fi
  161 +
  162 + # Remove logs from drush update db.
  163 + rm drush_update_db_result.txt
  164 +
  165 + # Print debug command.
  166 + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev drush cr -y -l \"${site}\"${no_color}"
  167 +
  168 + # Final step, clear cache.
  169 + ddev drush cr -y -l "${site}" > /dev/null 2>&1
  170 +
  171 + # Print debug command.
  172 + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}ddev drush cex -y -l \"${site}\"${no_color}"
  173 +
  174 + # Final step, clear cache.
  175 + ddev drush cex -y -l "${site}" > /dev/null 2>&1
  176 + done
  177 +
  178 + # Print debug command.
  179 + echo "${aqua}[Auto update] ${no_color}Running: ${yellow}git checkout && git add && git commit${no_color}"
  180 +
  181 + # Create new branch, add updates files and commit them.
  182 + git checkout -B "${update_branch_name}" > /dev/null 2>&1
  183 + git add "*.yml" > /dev/null 2>&1
  184 + git add "composer.json" > /dev/null 2>&1
  185 + git add "${composer_lock_file}" > /dev/null 2>&1
  186 + git commit -m "${DDEV_SITENAME^}: Update ${date}" > /dev/null 2>&1
  187 + git push --set-upstream origin "${update_branch_name}"
  188 +
  189 + # Print success message.
  190 + echo "${aqua}[Auto update] ${lime}Auto update finished successfully.${no_color}"
  191 + else
  192 + # If we do not have any changes inside composer.lock print message.
  193 + echo "${aqua}[Auto update] ${red}Branch not created, because composer.lock file was not modified.${no_color}"
  194 + fi
  195 + else
  196 + # Print proper message if we do not have security updates.
  197 + echo "${aqua}[Auto update] ${lime}No security updates available.${no_color}"
  198 + fi
  199 +}
  200 +
  201 +# Get all sites that user requested.
  202 +sites_to_update=${@:1}
  203 +
  204 +# Check if we actually have any site.
  205 +if [[ -z ${sites_to_update+x} || -z ${sites_to_update} ]]; then
  206 + # If not make default one as required.
  207 + sites_to_update="default"
  208 +fi
  209 +
  210 +# Print proper message if we do not have security updates.
  211 +echo "${aqua}[Auto update] ${lime}Running auto-update${no_color} script on those sites: ${yellow}${sites_to_update}${no_color}."
  212 +
  213 +# Run auto_update function with all given sites.
  214 +auto_update ${sites_to_update}
... ...
  1 +#!/usr/bin/env bash
  2 +# Composer install with styles.
  3 +ddev composer install
  4 +
  5 +# Restore database and import files.
  6 +ddev db-restore
  7 +ddev files-import
  8 +
  9 +# Run all necessary drush commands.
  10 +ddev drush deploy
  11 +ddev drush uli
... ...
  1 +#!/usr/bin/env bash
  2 +
  3 +# Composer install with styles.
  4 +ddev composer install
  5 +ddev drush sql-drop -y
  6 +ddev drush site-install droopler install_configure_form.enable_update_status_module=TRUE install_configure_form.enable_update_status_emails=NULL --db-url='{{ DDEV_DATABASE_FAMILY }}://db:db@db/db' --account-name=admin --account-pass=123 --site-name=droopler -y --locale=en droopler_additional_modules_form.module_d_blog=1 droopler_additional_modules_form.module_d_product=1 droopler_additional_modules_form.init_content=1 droopler_additional_modules_form.documentation=1
  7 +ddev theme
  8 +ddev drush cr
  9 +ddev drush uli
... ...
  1 +#!/usr/bin/env bash
  2 +
  3 +# Disable commands dynamic path.
  4 +# shellcheck disable=SC2154
  5 +
  6 +helpFunction()
  7 +{
  8 + echo ""
  9 + echo "Usage: ddev compatibility <php version> <directories>"
  10 + echo -e "\tExample: ddev compatibility 8.2 web/modules/custom web/themes/custom"
  11 + exit 1
  12 +}
  13 +
  14 +if [ "$#" -lt 2 ]; then
  15 + echo "Illegal number of parameters"
  16 + helpFunction
  17 +fi
  18 +
  19 +PHPVER="$1"
  20 +shift
  21 +DIRECTORY="$@"
  22 +
  23 +# Begin script in case all parameters are correct
  24 +FIND="find $DIRECTORY -name '*.php' -or -name '*.module' -or -name '*.install' -or -name '*.theme' -or -name '*.inc' -or -name '*.profile'"
  25 +docker run --rm -ti -w "/opt/project" -v `pwd`:/opt/project php:$PHPVER bash -c "$FIND | xargs -n1 /usr/local/bin/php --syntax-check" || true
  26 +docker run --rm -ti -w "/opt/project" -v `pwd`:/opt/project droptica/compatibility:latest phpcs --ignore=*.js,*.css -p $DIRECTORY --standard=PHPCompatibility --runtime-set testVersion $PHPVER --report=code || true
... ...
  1 +#!/usr/bin/env bash
  2 +
  3 +# Check if database snpashot exists.
  4 +if [ -f ".ddev/db_dumps/db.sql.gz" ]; then
  5 + # Add info about page restoring.
  6 + printf "[%s] Restoring the database...\n" "${DDEV_SITENAME}"
  7 +
  8 + # Restore db from local dump.
  9 + ddev import-db --target-db=db --src=.ddev/db_dumps/db.sql.gz
  10 +fi
... ...
  1 +#!/usr/bin/env bash
  2 +
  3 +
  4 +# Check if files dir exists.
  5 +if [ -f "${DDEV_APPROOT}/.ddev/file_dumps/files.tar.gz" ]; then
  6 + # Add info about page restoring.
  7 + printf "[%s] Importing the files...\n" "${DDEV_SITENAME}"
  8 +
  9 + # Remove all current files.
  10 + rm -rf ${DDEV_APPROOT}/app/web/sites/default/files/*
  11 +
  12 + # Extra new ones.
  13 + tar -xf ${DDEV_APPROOT}/.ddev/file_dumps/files.tar.gz -C ${DDEV_APPROOT}/app/web/sites/default
  14 +
  15 + # Check if drush is successfully installed (if not this should be first build).
  16 + if [ -f " ${DDEV_APPROOT}/app/vendor/bin/drush" ]; then
  17 + # Clear drupal cache after our little modification.
  18 + ddev drush cr
  19 + fi
  20 +fi
... ...
  1 +#!/usr/bin/env bash
  2 +
  3 +PHPCS_CONFIG_PATH="./phpcs.xml"
  4 +
  5 +if [[ "$#" -gt 0 && "$1" == "--droopler" ]]; then
  6 + PHPCS_DIRECTORIES="/app/web/profiles/contrib/droopler/modules/custom /app/web/profiles/contrib/droopler/themes/custom"
  7 + docker run --rm -t -v `pwd`:/app droptica/phpcs:latest phpcbf --standard=${PHPCS_CONFIG_PATH} ${PHPCS_DIRECTORIES}
  8 +else
  9 + docker run --rm -t -v `pwd`:/app droptica/phpcs:latest phpcbf --standard=${PHPCS_CONFIG_PATH}
  10 +fi
... ...
  1 +#!/usr/bin/env bash
  2 +
  3 +PHPCS_CONFIG_PATH="./phpcs.xml"
  4 +
  5 +if [[ "$#" -gt 0 && "$1" == "--droopler" ]]; then
  6 + PHPCS_DIRECTORIES="/app/web/profiles/contrib/droopler"
  7 + docker run --rm -t -v `pwd`:/app droptica/phpcs:latest phpcs --standard=${PHPCS_CONFIG_PATH} ${PHPCS_DIRECTORIES}
  8 +else
  9 + docker run --rm -t -v `pwd`:/app droptica/phpcs:latest phpcs --standard=${PHPCS_CONFIG_PATH}
  10 +fi
... ...
  1 +#!/usr/bin/env bash
  2 +
  3 +PHPSTAN_CONFIG_PATH="/opt/project/phpstan.neon"
  4 +
  5 +if [[ "$#" -gt 0 && "$1" == "--droopler" ]]; then
  6 + PHPSTAN_DIRECTORIES="/opt/project/web/profiles/contrib/droopler"
  7 + docker run --rm -t -v `pwd`:/opt/project droptica/phpstan:latest analyse -c ${PHPSTAN_CONFIG_PATH} ${PHPSTAN_DIRECTORIES}
  8 +else
  9 + docker run --rm -t -v `pwd`:/opt/project droptica/phpstan:latest analyse -c ${PHPSTAN_CONFIG_PATH}
  10 +fi
... ...
  1 +#!/usr/bin/env bash
  2 +
  3 +THEME_DIR="/var/www/html/web/profiles/contrib/droopler/themes/custom/droopler_theme"
  4 +SUBTHEME_DIR="/var/www/html/web/themes/custom/droopler_subtheme"
  5 +
  6 +# Install droopler_theme npm packages.
  7 +cd ${THEME_DIR}
  8 +npm install
  9 +
  10 +# Install droopler_subtheme npm packages.
  11 +cd ${SUBTHEME_DIR}
  12 +npm install
  13 +
  14 +# Check if user wants instant-update.
  15 +if [ "$1" == "watch" ]; then
  16 + npm run watch
  17 +elif [ "$1" == "dev" ]; then
  18 + echo "Compiling DEV version."
  19 + npm run dev
  20 +else
  21 + echo "Compiling PRODUCTION, minified version."
  22 + npm run production
  23 +fi
... ...
  1 +#!/usr/bin/env bash
  2 +
  3 +THEME_DIR="/var/www/html/web/profiles/contrib/droopler/themes/custom/droopler_theme"
  4 +
  5 +# Install droopler_theme npm packages.
  6 +cd ${THEME_DIR}
  7 +npm install
  8 +
  9 +# Check if user wants instant-update.
  10 +if [ "$1" == "watch" ]; then
  11 + npm run watch
  12 +elif [ "$1" == "dev" ]; then
  13 + echo "Compiling DEV version."
  14 + npm run dev
  15 +else
  16 + echo "Compiling PRODUCTION, minified version."
  17 + npm run production
  18 +fi
... ...
  1 +name: DDEVAppName
  2 +type: drupal10
  3 +docroot: web
  4 +php_version: "8.1"
  5 +webserver_type: nginx-fpm
  6 +router_http_port: "80"
  7 +router_https_port: "443"
  8 +xdebug_enabled: false
  9 +additional_hostnames: []
  10 +additional_fqdns: []
  11 +database:
  12 + type: mariadb
  13 + version: "10.11"
  14 +use_dns_when_possible: true
  15 +composer_version: "2.6"
  16 +web_environment: []
  17 +nodejs_version: "20"
  18 +
  19 +# Key features of DDEV's config.yaml:
  20 +
  21 +# name: <projectname> # Name of the project, automatically provides
  22 +# http://projectname.ddev.site and https://projectname.ddev.site
  23 +
  24 +# type: <projecttype> # drupal6/7/8/9/10, backdrop, typo3, wordpress, php
  25 +
  26 +# docroot: <relative_path> # Relative path to the directory containing index.php.
  27 +
  28 +# php_version: "8.1" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3"
  29 +
  30 +# You can explicitly specify the webimage but this
  31 +# is not recommended, as the images are often closely tied to DDEV's' behavior,
  32 +# so this can break upgrades.
  33 +
  34 +# webimage: <docker_image> # nginx/php docker image.
  35 +
  36 +# database:
  37 +# type: <dbtype> # mysql, mariadb, postgres
  38 +# version: <version> # database version, like "10.4" or "8.0"
  39 +# MariaDB versions can be 5.5-10.8 and 10.11, MySQL versions can be 5.5-8.0
  40 +# PostgreSQL versions can be 9-16.
  41 +
  42 +# router_http_port: <port> # Port to be used for http (defaults to global configuration, usually 80)
  43 +# router_https_port: <port> # Port for https (defaults to global configuration, usually 443)
  44 +
  45 +# xdebug_enabled: false # Set to true to enable Xdebug and "ddev start" or "ddev restart"
  46 +# Note that for most people the commands
  47 +# "ddev xdebug" to enable Xdebug and "ddev xdebug off" to disable it work better,
  48 +# as leaving Xdebug enabled all the time is a big performance hit.
  49 +
  50 +# xhprof_enabled: false # Set to true to enable Xhprof and "ddev start" or "ddev restart"
  51 +# Note that for most people the commands
  52 +# "ddev xhprof" to enable Xhprof and "ddev xhprof off" to disable it work better,
  53 +# as leaving Xhprof enabled all the time is a big performance hit.
  54 +
  55 +# webserver_type: nginx-fpm, apache-fpm, or nginx-gunicorn
  56 +
  57 +# timezone: Europe/Berlin
  58 +# This is the timezone used in the containers and by PHP;
  59 +# it can be set to any valid timezone,
  60 +# see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  61 +# For example Europe/Dublin or MST7MDT
  62 +
  63 +# composer_root: <relative_path>
  64 +# Relative path to the Composer root directory from the project root. This is
  65 +# the directory which contains the composer.json and where all Composer related
  66 +# commands are executed.
  67 +
  68 +# composer_version: "2"
  69 +# You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1
  70 +# to use the latest major version available at the time your container is built.
  71 +# It is also possible to use each other Composer version channel. This includes:
  72 +# - 2.2 (latest Composer LTS version)
  73 +# - stable
  74 +# - preview
  75 +# - snapshot
  76 +# Alternatively, an explicit Composer version may be specified, for example "2.2.18".
  77 +# To reinstall Composer after the image was built, run "ddev debug refresh".
  78 +
  79 +# nodejs_version: "18"
  80 +# change from the default system Node.js version to another supported version, like 16, 18, 20.
  81 +# Note that you can use 'ddev nvm' or nvm inside the web container to provide nearly any
  82 +# Node.js version, including v6, etc.
  83 +# You only need to configure this if you are not using nvm and you want to use a major
  84 +# version that is not the default.
  85 +
  86 +# additional_hostnames:
  87 +# - somename
  88 +# - someothername
  89 +# would provide http and https URLs for "somename.ddev.site"
  90 +# and "someothername.ddev.site".
  91 +
  92 +# additional_fqdns:
  93 +# - example.com
  94 +# - sub1.example.com
  95 +# would provide http and https URLs for "example.com" and "sub1.example.com"
  96 +# Please take care with this because it can cause great confusion.
  97 +
  98 +# upload_dirs: "custom/upload/dir"
  99 +#
  100 +# upload_dirs:
  101 +# - custom/upload/dir
  102 +# - ../private
  103 +#
  104 +# would set the destination paths for ddev import-files to <docroot>/custom/upload/dir
  105 +# When Mutagen is enabled this path is bind-mounted so that all the files
  106 +# in the upload_dirs don't have to be synced into Mutagen.
  107 +
  108 +# disable_upload_dirs_warning: false
  109 +# If true, turns off the normal warning that says
  110 +# "You have Mutagen enabled and your 'php' project type doesn't have upload_dirs set"
  111 +
  112 +# ddev_version_constraint: ""
  113 +# Example:
  114 +# ddev_version_constraint: ">= 1.22.4"
  115 +# This will enforce that the running ddev version is within this constraint.
  116 +# See https://github.com/Masterminds/semver#checking-version-constraints for
  117 +# supported constraint formats
  118 +
  119 +# working_dir:
  120 +# web: /var/www/html
  121 +# db: /home
  122 +# would set the default working directory for the web and db services.
  123 +# These values specify the destination directory for ddev ssh and the
  124 +# directory in which commands passed into ddev exec are run.
  125 +
  126 +# omit_containers: [db, ddev-ssh-agent]
  127 +# Currently only these containers are supported. Some containers can also be
  128 +# omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit
  129 +# the "db" container, several standard features of DDEV that access the
  130 +# database container will be unusable. In the global configuration it is also
  131 +# possible to omit ddev-router, but not here.
  132 +
  133 +# performance_mode: "global"
  134 +# DDEV offers performance optimization strategies to improve the filesystem
  135 +# performance depending on your host system. Should be configured globally.
  136 +#
  137 +# If set, will override the global config. Possible values are:
  138 +# - "global": uses the value from the global config.
  139 +# - "none": disables performance optimization for this project.
  140 +# - "mutagen": enables Mutagen for this project.
  141 +# - "nfs": enables NFS for this project.
  142 +#
  143 +# See https://ddev.readthedocs.io/en/latest/users/install/performance/#nfs
  144 +# See https://ddev.readthedocs.io/en/latest/users/install/performance/#mutagen
  145 +
  146 +# fail_on_hook_fail: False
  147 +# Decide whether 'ddev start' should be interrupted by a failing hook
  148 +
  149 +# host_https_port: "59002"
  150 +# The host port binding for https can be explicitly specified. It is
  151 +# dynamic unless otherwise specified.
  152 +# This is not used by most people, most people use the *router* instead
  153 +# of the localhost port.
  154 +
  155 +# host_webserver_port: "59001"
  156 +# The host port binding for the ddev-webserver can be explicitly specified. It is
  157 +# dynamic unless otherwise specified.
  158 +# This is not used by most people, most people use the *router* instead
  159 +# of the localhost port.
  160 +
  161 +# host_db_port: "59002"
  162 +# The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic
  163 +# unless explicitly specified.
  164 +
  165 +# mailpit_http_port: "8025"
  166 +# mailpit_https_port: "8026"
  167 +# The Mailpit ports can be changed from the default 8025 and 8026
  168 +
  169 +# host_mailpit_port: "8025"
  170 +# The mailpit port is not normally bound on the host at all, instead being routed
  171 +# through ddev-router, but it can be bound directly to localhost if specified here.
  172 +
  173 +# webimage_extra_packages: [php7.4-tidy, php-bcmath]
  174 +# Extra Debian packages that are needed in the webimage can be added here
  175 +
  176 +# dbimage_extra_packages: [telnet,netcat]
  177 +# Extra Debian packages that are needed in the dbimage can be added here
  178 +
  179 +# use_dns_when_possible: true
  180 +# If the host has internet access and the domain configured can
  181 +# successfully be looked up, DNS will be used for hostname resolution
  182 +# instead of editing /etc/hosts
  183 +# Defaults to true
  184 +
  185 +# project_tld: ddev.site
  186 +# The top-level domain used for project URLs
  187 +# The default "ddev.site" allows DNS lookup via a wildcard
  188 +# If you prefer you can change this to "ddev.local" to preserve
  189 +# pre-v1.9 behavior.
  190 +
  191 +# ngrok_args: --basic-auth username:pass1234
  192 +# Provide extra flags to the "ngrok http" command, see
  193 +# https://ngrok.com/docs/ngrok-agent/config or run "ngrok http -h"
  194 +
  195 +# disable_settings_management: false
  196 +# If true, DDEV will not create CMS-specific settings files like
  197 +# Drupal's settings.php/settings.ddev.php or TYPO3's AdditionalConfiguration.php
  198 +# In this case the user must provide all such settings.
  199 +
  200 +# You can inject environment variables into the web container with:
  201 +# web_environment:
  202 +# - SOMEENV=somevalue
  203 +# - SOMEOTHERENV=someothervalue
  204 +
  205 +# no_project_mount: false
  206 +# (Experimental) If true, DDEV will not mount the project into the web container;
  207 +# the user is responsible for mounting it manually or via a script.
  208 +# This is to enable experimentation with alternate file mounting strategies.
  209 +# For advanced users only!
  210 +
  211 +# bind_all_interfaces: false
  212 +# If true, host ports will be bound on all network interfaces,
  213 +# not the localhost interface only. This means that ports
  214 +# will be available on the local network if the host firewall
  215 +# allows it.
  216 +
  217 +# default_container_timeout: 120
  218 +# The default time that DDEV waits for all containers to become ready can be increased from
  219 +# the default 120. This helps in importing huge databases, for example.
  220 +
  221 +#web_extra_exposed_ports:
  222 +#- name: nodejs
  223 +# container_port: 3000
  224 +# http_port: 2999
  225 +# https_port: 3000
  226 +#- name: something
  227 +# container_port: 4000
  228 +# https_port: 4000
  229 +# http_port: 3999
  230 +# Allows a set of extra ports to be exposed via ddev-router
  231 +# Fill in all three fields even if you don’t intend to use the https_port!
  232 +# If you don’t add https_port, then it defaults to 0 and ddev-router will fail to start.
  233 +#
  234 +# The port behavior on the ddev-webserver must be arranged separately, for example
  235 +# using web_extra_daemons.
  236 +# For example, with a web app on port 3000 inside the container, this config would
  237 +# expose that web app on https://<project>.ddev.site:9999 and http://<project>.ddev.site:9998
  238 +# web_extra_exposed_ports:
  239 +# - name: myapp
  240 +# container_port: 3000
  241 +# http_port: 9998
  242 +# https_port: 9999
  243 +
  244 +#web_extra_daemons:
  245 +#- name: "http-1"
  246 +# command: "/var/www/html/node_modules/.bin/http-server -p 3000"
  247 +# directory: /var/www/html
  248 +#- name: "http-2"
  249 +# command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000"
  250 +# directory: /var/www/html
  251 +
  252 +# override_config: false
  253 +# By default, config.*.yaml files are *merged* into the configuration
  254 +# But this means that some things can't be overridden
  255 +# For example, if you have 'use_dns_when_possible: true'' you can't override it with a merge
  256 +# and you can't erase existing hooks or all environment variables.
  257 +# However, with "override_config: true" in a particular config.*.yaml file,
  258 +# 'use_dns_when_possible: false' can override the existing values, and
  259 +# hooks:
  260 +# post-start: []
  261 +# or
  262 +# web_environment: []
  263 +# or
  264 +# additional_hostnames: []
  265 +# can have their intended affect. 'override_config' affects only behavior of the
  266 +# config.*.yaml file it exists in.
  267 +
  268 +# Many DDEV commands can be extended to run tasks before or after the
  269 +# DDEV command is executed, for example "post-start", "post-import-db",
  270 +# "pre-composer", "post-composer"
  271 +# See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more
  272 +# information on the commands that can be extended and the tasks you can define
  273 +# for them. Example:
  274 +#hooks:
  275 +# post-import-db:
  276 +# - exec: drush cr
  277 +# - exec: drush updb
... ...
  1 +#ddev-generated
  2 +# Acquia provider configuration.
  3 +
  4 +# To use this configuration,
  5 +
  6 +# 1. Get your Acquia API token from your Account Settings->API Tokens.
  7 +# 2. Make sure your ssh key is authorized on your Acquia account at Account Settings->SSH Keys
  8 +# 3. `ddev auth ssh` (this typically needs only be done once per ddev session, not every pull).
  9 +# 4. Add / update the web_environment section in ~/.ddev/global_config.yaml
  10 +# or your project config.yamlwith the API keys:
  11 +# ```yaml
  12 +# web_environment:
  13 +# - ACQUIA_API_KEY=xxxxxxxx
  14 +# - ACQUIA_API_SECRET=xxxxx
  15 +# ```
  16 +# 5. Add the ACQUIA_ENVIRONMENT_ID environment variable to your project config.yaml, for example:
  17 +# ```yaml
  18 +# web_environment:
  19 +# - ACQUIA_ENVIRONMENT_ID=project1.dev
  20 +# - On the Acquia Cloud Platform you can find this out by navigating to the environments page,
  21 +# clicking on the header and look for the "SSH URL" line.
  22 +# Eg. `project1.dev@cool-projects.acquia-sites.com` would have a project ID of `project1.dev`
  23 +# 6. `ddev restart`
  24 +# 7. Use `ddev pull acquia` to pull the project database and files.
  25 +# 8. Optionally use `ddev push acquia` to push local files and database to Acquia. Note that `ddev push` is a command that can potentially damage your production site, so this is not recommended.
  26 +
  27 +# Debugging: Use `ddev exec acli command` and `ddev exec acli auth:login`
  28 +
  29 +# Instead of setting the environment variables in configuration files, you can use
  30 +# `ddev pull acquia --environment=ACQUIA_ENVIRONMENT_ID=yourproject.dev` for example
  31 +
  32 +auth_command:
  33 + command: |
  34 + set -eu -o pipefail
  35 + if [ -z "${ACQUIA_API_KEY:-}" ] || [ -z "${ACQUIA_API_SECRET:-}" ]; then echo "Please make sure you have set ACQUIA_API_KEY and ACQUIA_API_SECRET in ~/.ddev/global_config.yaml" && exit 1; fi
  36 + if [ -z "${ACQUIA_ENVIRONMENT_ID:-}" ] ; then echo "Please set ACQUIA_ENVIRONMENT_ID via config.yaml or with '--environment=ACQUIA_ENVIRONMENT_ID=xxx'" && exit 1; fi
  37 + ssh-add -l >/dev/null || ( echo "Please 'ddev auth ssh' before running this command." && exit 1 )
  38 + acli -n auth:login -n --key="${ACQUIA_API_KEY}" --secret="${ACQUIA_API_SECRET}"
  39 +
  40 +db_pull_command:
  41 + command: |
  42 + set -eu -o pipefail
  43 + # xargs here just trims whitespace
  44 + # We could use an easier technique when https://github.com/acquia/cli/issues/1629 is resolved
  45 + # just using `acli pull:db ${ACQUIA_ENVIRONMENT_ID}`
  46 + echo "Using ACQUIA_ENVIRONMENT_ID=${ACQUIA_ENVIRONMENT_ID}"
  47 + set -x # You can enable bash debugging output by uncommenting
  48 + db_dump=$(acli pull:db ${ACQUIA_ENVIRONMENT_ID} --no-interaction --no-import | tail -2l | xargs | sed 's/^.* //')
  49 + ls /var/www/html/.ddev >/dev/null # This just refreshes stale NFS if possible
  50 + cp ${db_dump} /var/www/html/.ddev/.downloads/db.sql.gz
  51 +
  52 +files_import_command:
  53 + command: |
  54 + # set -x # You can enable bash debugging output by uncommenting
  55 + set -eu -o pipefail
  56 + acli -n pull:files ${ACQUIA_ENVIRONMENT_ID}
  57 +
  58 +# push is a dangerous command. If not absolutely needed it's better to delete these lines.
  59 +db_push_command:
  60 + command: |
  61 + set -eu -o pipefail
  62 + export ACLI_DB_HOST=db ACLI_DB_NAME=db ACLI_DB_USER=db ACLI_DB_PASSWORD=db
  63 + set -x # You can enable bash debugging output by uncommenting
  64 + acli push:db ${ACQUIA_ENVIRONMENT_ID} --no-interaction
  65 +
  66 +# push is a dangerous command. If not absolutely needed it's better to delete these lines.
  67 +files_push_command:
  68 + command: |
  69 + # set -x # You can enable bash debugging output by uncommenting
  70 + set -eu -o pipefail
  71 + acli push:files ${ACQUIA_ENVIRONMENT_ID} --no-interaction
... ...
  1 +#ddev-generated
  2 +# Lagoon provider configuration.
  3 +
  4 +# To use this configuration,
  5 +
  6 +# 1. Check out the project and then configure it with 'ddev config'. You'll want to use 'ddev start' and make sure the basic functionality is working. Your project must have a .lagoon.yml properly configured.
  7 +# 2. Configure an SSH key for your Lagoon user https://docs.lagoon.sh/using-lagoon-advanced/ssh/
  8 +# 3. `ddev auth ssh`.
  9 +# 4. Add LAGOON_PROJECT and LAGOON_ENVIRONMENT variables to your project in 'web_environment' or a '.ddev/.env'
  10 +# 5. `ddev restart`
  11 +#
  12 +# 'ddev pull lagoon'
  13 +
  14 +auth_command:
  15 + command: |
  16 + set -eu -o pipefail
  17 + ssh-add -l >/dev/null || ( echo "Please 'ddev auth ssh' before running this command." && exit 1 )
  18 + if [ -z "${LAGOON_PROJECT:-}" ]; then echo "Please make sure you have set the LAGOON_PROJECT environment variable in your 'web_environment' or .ddev/.env." && exit 1; fi
  19 + if [ -z "${LAGOON_ENVIRONMENT}" ]; then echo "Please make sure you have set the LAGOON_ENVIRONMENT environment variable in your 'web_environment' or .ddev/.env." && exit 1; fi
  20 +
  21 +
  22 +db_import_command:
  23 + command: |
  24 + # set -x # You can enable bash debugging output by uncommenting
  25 + set -eu -o pipefail
  26 + export MARIADB_HOST=db MARIADB_USERNAME=db MARIADB_PASSWORD=db MARIADB_DATABASE=db
  27 + lagoon-sync sync mariadb -p ${LAGOON_PROJECT} -e ${LAGOON_ENVIRONMENT} --no-interaction
  28 +
  29 +files_import_command:
  30 + command: |
  31 + #set -x # You can enable bash debugging output by uncommenting
  32 + set -eu -o pipefail
  33 + lagoon-sync sync files -p ${LAGOON_PROJECT} -e ${LAGOON_ENVIRONMENT} --no-interaction
  34 +
  35 +# push is a dangerous command. If not absolutely needed it's better to delete these lines.
  36 +db_push_command:
  37 + command: |
  38 + set -eu -o pipefail
  39 + #set -x # You can enable bash debugging output by uncommenting
  40 + export MARIADB_HOST=db MARIADB_USERNAME=db MARIADB_PASSWORD=db MARIADB_DATABASE=db
  41 + lagoon-sync sync mariadb -p ${LAGOON_PROJECT} -t ${LAGOON_ENVIRONMENT} -e local --no-interaction
  42 +
  43 +# push is a dangerous command. If not absolutely needed it's better to delete these lines.
  44 +files_push_command:
  45 + command: |
  46 + set -eu -o pipefail
  47 + #set -x # You can enable bash debugging output by uncommenting
  48 + lagoon-sync sync files -p ${LAGOON_PROJECT} -e local -t ${LAGOON_ENVIRONMENT} --no-interaction
  49 +
... ...
  1 +#ddev-generated
  2 +# Upsun provider configuration. This works out of the box, but can be edited to add
  3 +# your own preferences. If you edit it, remove the `ddev-generated` line from the top so
  4 +# that it won't be overwritten.
  5 +
  6 +# To use this configuration,
  7 +
  8 +# 1. Check out the site from Upsun and then configure it with `ddev config`. You'll want to use `ddev start` and make sure the basic functionality is working.
  9 +# 2. Obtain and configure an API token.
  10 +# a. Login to the Upsun Dashboard and go to My Profile->API Tokens to create an API token for DDEV to use.
  11 +# b. Add the API token to the `web_environment` section in your global ddev configuration at ~/.ddev/global_config.yaml:
  12 +# ```yaml
  13 +# web_environment:
  14 +# - UPSUN_CLI_TOKEN=abcdeyourtoken
  15 +# ```
  16 +# 3. Add UPSUN_PROJECT and UPSUN_ENVIRONMENT variables to your project `.ddev/config.yaml` or a `.ddev/config.upsun.yaml`
  17 +# ```yaml
  18 +# web_environment:
  19 +# - UPSUN_PROJECT=nf4amudfn23biyourproject
  20 +# - UPSUN_ENVIRONMENT=main
  21 +# 4. `ddev restart`
  22 +# 5. Run `ddev pull upsun`. After you agree to the prompt, the current upstream database and files will be downloaded.
  23 +# 6. Optionally use `ddev push upsun` to push local files and database to Upsun. Note that `ddev push` is a command that can potentially damage your production site, so this is not recommended.
  24 +
  25 +# Debugging: Use `ddev exec upsun` to see what Upsun knows about
  26 +# your configuration and whether it's working correctly.
  27 +
  28 +auth_command:
  29 + command: |
  30 + set -eu -o pipefail
  31 + if [ -z "${UPSUN_CLI_TOKEN:-}" ]; then echo "Please make sure you have set UPSUN_CLI_TOKEN." && exit 1; fi
  32 + if [ -z "${UPSUN_PROJECT:-}" ]; then echo "Please make sure you have set UPSUN_PROJECT." && exit 1; fi
  33 + if [ -z "${UPSUN_ENVIRONMENT:-}" ]; then echo "Please make sure you have set UPSUN_ENVIRONMENT." && exit 1; fi
  34 +
  35 +db_pull_command:
  36 + command: |
  37 + # set -x # You can enable bash debugging output by uncommenting
  38 + set -eu -o pipefail
  39 + export UPSUN_CLI_NO_INTERACTION=1
  40 + ls /var/www/html/.ddev >/dev/null # This just refreshes stale NFS if possible
  41 + upsun db:dump --yes --gzip --file=/var/www/html/.ddev/.downloads/db.sql.gz --project="${UPSUN_PROJECT}" --environment="${UPSUN_ENVIRONMENT}"
  42 +
  43 +files_import_command:
  44 + command: |
  45 + # set -x # You can enable bash debugging output by uncommenting
  46 + set -eu -o pipefail
  47 + export UPSUN_CLI_NO_INTERACTION=1
  48 + # Use $UPSUN_MOUNTS if it exists to get list of mounts to download, otherwise just web/sites/default/files (drupal)
  49 + declare -a mounts=(${UPSUN_MOUNTS:-/web/sites/default/files})
  50 + upsun mount:download --all --yes --quiet --project="${UPSUN_PROJECT}" --environment="${UPSUN_ENVIRONMENT}" --target=/var/www/html
  51 +
  52 +
  53 +# push is a dangerous command. If not absolutely needed it's better to delete these lines.
  54 +db_push_command:
  55 + command: |
  56 + # set -x # You can enable bash debugging output by uncommenting
  57 + set -eu -o pipefail
  58 + export UPSUN_CLI_NO_INTERACTION=1
  59 + ls /var/www/html/.ddev >/dev/null # This just refreshes stale NFS if possible
  60 + pushd /var/www/html/.ddev/.downloads >/dev/null
  61 + gzip -dc db.sql.gz | upsun db:sql --project="${UPSUN_PROJECT}" --environment="${UPSUN_ENVIRONMENT}"
  62 +
  63 +# push is a dangerous command. If not absolutely needed it's better to delete these lines.
  64 +# TODO: This is a naive, Drupal-centric push, which needs adjustment for the mount to be pushed.
  65 +files_push_command:
  66 + command: |
  67 + # set -x # You can enable bash debugging output by uncommenting
  68 + set -eu -o pipefail
  69 + export UPSUN_CLI_NO_INTERACTION=1
  70 + ls "${DDEV_FILES_DIR}" >/dev/null # This just refreshes stale NFS if possible
  71 + upsun mount:upload --yes --quiet --project="${UPSUN_PROJECT}" --environment="${UPSUN_ENVIRONMENT}" --source="${DDEV_FILES_DIR}" --mount=web/sites/default/files
... ...
  1 +# Statements in this file will be executed (sourced) by the shell in SSH
  2 +# sessions, in deploy hooks, in cron jobs, and in the application's runtime
  3 +# environment. This file must be placed in the root of the application, not
  4 +# necessarily the git repository's root. In case of multiple applications,
  5 +# each application can have its own .environment file.
  6 +
  7 +# Allow executable app dependencies from Composer to be run from the path.
  8 +if [ -n "$PLATFORM_APP_DIR" -a -f "$PLATFORM_APP_DIR"/composer.json ] ; then
  9 + bin=$(composer config bin-dir --working-dir="$PLATFORM_APP_DIR" --no-interaction 2>/dev/null)
  10 + export PATH="${PLATFORM_APP_DIR}/${bin:-vendor/bin}:${PATH}"
  11 +fi
... ...
  1 +#!/bin/bash
  2 +
  3 +# Run the quality tools and make sure they pass before allowing a commit.
  4 +./.githooks/precommit/phpcs.sh &&
  5 +./.githooks/precommit/phpstan.sh &&
  6 +./.githooks/precommit/build-css.sh
... ...
  1 +#!/bin/bash
  2 +
  3 +dist_folder="web/themes/custom/droopler_subtheme/build"
  4 +rebuild_command="ddev theme"
  5 +
  6 +# Colors
  7 +default=$(tput sgr0)
  8 +yellow=$(tput setaf 3)
  9 +green=$(tput setaf 2)
  10 +
  11 +changed_files=$(git diff --cached --name-only | grep "^$dist_folder")
  12 +
  13 +if [ -n "$changed_files" ]; then
  14 + echo
  15 + echo "${yellow}dist css files changed. Building for production${default}"
  16 + echo
  17 + $rebuild_command
  18 + git add $dist_folder
  19 +else
  20 + echo
  21 + echo "${green}No dist css files changed. Skipping build.${default}"
  22 + echo
  23 +fi
... ...
  1 +#!/bin/bash
  2 +
  3 +# Run PHP CodeSniffer
  4 +ddev phpcs
  5 +
  6 +# Capture the exit code of the last command
  7 +exit_code=$?
  8 +
  9 +# Check if PHP CodeSniffer had errors
  10 +if [ $exit_code -ne 0 ]; then
  11 + echo "PHP CodeSniffer check failed. Please fix the issues before committing."
  12 + exit 1 # Prevent the commit
  13 +fi
  14 +
  15 +exit 0 # Allow the commit
... ...
  1 +#!/bin/bash
  2 +
  3 +# Run PHP Static analysis
  4 +ddev phpstan
  5 +
  6 +# Capture the exit code of the last command
  7 +exit_code=$?
  8 +
  9 +# Check if PHP Static analysis had errors
  10 +if [ $exit_code -ne 0 ]; then
  11 + echo "PHP Static analysis check failed. Please fix the issues before committing."
  12 + exit 1 # Prevent the commit
  13 +fi
  14 +
  15 +exit 0 # Allow the commit
... ...
  1 +# Ignore directories generated by Composer
  2 +/drush/contrib/
  3 +/vendor/
  4 +/web/core/
  5 +/web/modules/*
  6 +!/web/modules/custom
  7 +/web/themes/*
  8 +!/web/themes/custom
  9 +/web/profiles/*
  10 +!/web/profiles/custom
  11 +/web/libraries/
  12 +console/
  13 +
  14 +# Ignore sensitive information
  15 +/web/sites/*/settings.local.php
  16 +
  17 +# Ignore Drupal's file directory
  18 +/web/sites/files
  19 +
  20 +# Ignore SimpleTest multi-site environment.
  21 +/web/sites/simpletest
  22 +
  23 +# Ignore files generated by PhpStorm
  24 +/.idea/
  25 +/.vscode/
  26 +
  27 +# Ignore .env files as they are personal
  28 +/.env
  29 +
  30 +# Ignore mounts
  31 +web/sites/default/files
  32 +tmp
  33 +private
  34 +.drush
  35 +drush-backups
  36 +.console
  37 +/.editorconfig
  38 +/.gitattributes
  39 +
  40 +# Comment these lines if you don't use Composer.
  41 +/web/.*
  42 +/web/*.php
  43 +/web/web.config
  44 +/web/robots.txt
... ...
  1 +name: droopler
  2 +recipe: drupal10
  3 +config:
  4 + # Droopler project webroot.
  5 + webroot: ./web
  6 + drush: 12
  7 +
  8 +services:
  9 + node:
  10 + type: node:18
  11 +
  12 +tooling:
  13 + # Theme.
  14 + theme-production:
  15 + service: node
  16 + description: Compiles the theme in PROD mode.
  17 + cmd:
  18 + - npm install
  19 + - npm run production
  20 + dir: /app/web/profiles/contrib/droopler/themes/custom/droopler_theme
  21 + theme-dev:
  22 + service: node
  23 + description: Compiles the theme in DEV mode.
  24 + cmd:
  25 + - npm install
  26 + - npm run dev
  27 + dir: /app/web/profiles/contrib/droopler/themes/custom/droopler_theme
  28 + theme-watch:
  29 + service: node
  30 + description: Watches the theme for changes.
  31 + cmd:
  32 + - npm install
  33 + - npm run watch
  34 + dir: /app/web/profiles/contrib/droopler/themes/custom/droopler_theme
  35 +
  36 + # Subtheme.
  37 + subtheme-production:
  38 + service: node
  39 + description: Compiles the subtheme in PROD mode.
  40 + cmd:
  41 + - npm install
  42 + - npm run production
  43 + dir: /app/web/themes/custom/droopler_subtheme
  44 + subtheme-dev:
  45 + service: node
  46 + description: Compiles the subtheme in DEV mode.
  47 + cmd:
  48 + - npm install
  49 + - npm run dev
  50 + dir: /app/web/themes/custom/droopler_subtheme
  51 + subtheme-watch:
  52 + service: node
  53 + description: Watches the subtheme for changes.
  54 + cmd:
  55 + - npm install
  56 + - npm run watch
  57 + dir: /app/web/themes/custom/droopler_subtheme
  58 +
  59 + # Build profile.
  60 + build-full-profile:
  61 + description: Builds the full profile (all modules + demo content) from the scratch.
  62 + cmd:
  63 + - appserver: drush site-install droopler install_configure_form.enable_update_status_module=TRUE install_configure_form.enable_update_status_emails=NULL --db-url='mysql://drupal10:drupal10@database/drupal10' --account-name=admin --account-pass=123 --site-name=droopler -y --locale=en droopler_additional_modules_form.module_d_blog=1 droopler_additional_modules_form.module_d_product=1 droopler_additional_modules_form.init_content=1 droopler_additional_modules_form.documentation=1
  64 + build-bare-profile:
  65 + description: Builds the bare profile (without demo content) from the scratch.
  66 + cmd:
  67 + - appserver: drush site-install droopler install_configure_form.enable_update_status_module=TRUE install_configure_form.enable_update_status_emails=NULL --db-url='mysql://drupal10:drupal10@database/drupal10' --account-name=admin --account-pass=123 --site-name=droopler -y --locale=en
  68 + prepare:
  69 + description: Prepares the codebase by downloading all vendors and compiling assets.
  70 + cmd:
  71 + - appserver: composer install
  72 + - node: cd /app/web/profiles/contrib/droopler/themes/custom/droopler_theme && npm install
  73 + - node: cd /app/web/themes/custom/droopler_subtheme && npm install
  74 + - node: cd /app/web/profiles/contrib/droopler/themes/custom/droopler_theme && npm run production
  75 + - node: cd /app/web/themes/custom/droopler_subtheme && npm run production
  76 +
... ...
  1 +20.9.0
... ...
  1 +# This file describes an application. You can have multiple applications
  2 +# in the same project.
  3 +#
  4 +# See https://docs.platform.sh/configuration/app.html
  5 +
  6 +# The name of this app. Must be unique within a project.
  7 +# Must be lowercase alphanumeric characters. Changing the name destroys data associated with the app.
  8 +name: 'platform-app-name'
  9 +
  10 +# The runtime the application uses.
  11 +type: 'php:8.1'
  12 +
  13 +dependencies:
  14 + php:
  15 + composer/composer: '^2.1'
  16 + drush/drush: '^12'
  17 + nodejs:
  18 + n: "*"
  19 +
  20 +runtime:
  21 + # Enable the redis extension so Drupal can communicate with the Redis cache.
  22 + extensions:
  23 + - redis
  24 + - sodium
  25 + - apcu
  26 + - blackfire
  27 +
  28 +# The relationships of the application with services or other applications.
  29 +#
  30 +# The left-hand side is the name of the relationship as it will be exposed
  31 +# to the application in the PLATFORM_RELATIONSHIPS variable. The right-hand
  32 +# side is in the form `<service name>:<endpoint name>`.
  33 +relationships:
  34 + database: 'db:mysql'
  35 + redis: 'cache:redis'
  36 +
  37 +# The size of the persistent disk of the application (in MB).
  38 +disk: 2048
  39 +
  40 +# The 'mounts' describe writable, persistent filesystem mounts in the application.
  41 +mounts:
  42 + # The default Drupal files directory.
  43 + '/web/sites/default/files':
  44 + source: local
  45 + source_path: 'files'
  46 + # Drupal gets its own dedicated tmp directory. The settings.platformsh.php
  47 + # file will automatically configure Drupal to use this directory.
  48 + '/tmp':
  49 + source: local
  50 + source_path: 'tmp'
  51 + # Private file uploads are stored outside the web root. The settings.platformsh.php
  52 + # file will automatically configure Drupal to use this directory.
  53 + '/private':
  54 + source: local
  55 + source_path: 'private'
  56 + # Drush needs a scratch space for its own caches.
  57 + '/.drush':
  58 + source: local
  59 + source_path: 'drush'
  60 + # Drush will try to save backups to this directory, so it must be
  61 + # writeable even though you will almost never need to use it.
  62 + '/drush-backups':
  63 + source: local
  64 + source_path: 'drush-backups'
  65 + # Drupal Console will try to save backups to this directory, so it must be
  66 + # writeable even though you will almost never need to use it.
  67 + '/.console':
  68 + source: local
  69 + source_path: 'console'
  70 +
  71 +# Configuration of the build of this application.
  72 +build:
  73 + flavor: composer
  74 +
  75 +variables:
  76 + env:
  77 + N_PREFIX: /app/.global
  78 +
  79 +# The hooks executed at various points in the lifecycle of the application.
  80 +hooks:
  81 + # The build hook runs after Composer to finish preparing up your code.
  82 + # No services are available but the disk is writeable.
  83 + build: |
  84 + set -e
  85 +
  86 + if [ "$PLATFORM_ENVIRONMENT_TYPE" != production ]; then
  87 + curl -fsS https://platform.sh/cli/installer | php
  88 +
  89 + # Install the version specified in the .nvmrc file
  90 + n auto
  91 +
  92 + # Reset the location hash to recognize the newly installed version
  93 + hash -r
  94 +
  95 + # Install npm packages for droopler_theme, compile sass, and compile js
  96 + echo "Install npm packages for droopler_subtheme, compile sass, and compile js"
  97 +
  98 + cd web/profiles/contrib/droopler/themes/custom/droopler_theme/
  99 + npm install
  100 + cd -
  101 +
  102 + # Install npm packages for droopler_subtheme, compile sass, and compile js
  103 + echo "Install npm packages for droopler_subtheme, compile sass, and compile js"
  104 +
  105 + cd web/themes/custom/droopler_subtheme/
  106 + npm install
  107 + npm run production
  108 + fi
  109 +
  110 + # The deploy hook runs after your application has been deployed and started.
  111 + # Code cannot be modified at this point but the database is available.
  112 + # The site is not accepting requests while this script runs so keep it
  113 + # fast.
  114 + deploy: |
  115 + set -e
  116 + php ./drush/platformsh_generate_drush_yml.php
  117 + # if drupal is installed, will call the following drush commands:
  118 + # - `cache-rebuild`
  119 + # - `updatedb`
  120 + # - and if config files are present, `config-import`
  121 + cd web
  122 + bash $PLATFORM_APP_DIR/drush/platformsh_deploy_drupal.sh
  123 +
  124 +# The configuration of app when it is exposed to the web.
  125 +web:
  126 + locations:
  127 + # All requests not otherwise specified follow these rules.
  128 + '/':
  129 + # The folder from which to serve static assets, for this location.
  130 + #
  131 + # This is a filesystem path, relative to the application root.
  132 + root: 'web'
  133 +
  134 + # How long to allow static assets from this location to be cached.
  135 + #
  136 + # Can be a time in seconds, or -1 for no caching. Times can be
  137 + # suffixed with "s" (seconds), "m" (minutes), "h" (hours), "d"
  138 + # (days), "w" (weeks), "M" (months, as 30 days) or "y" (years, as
  139 + # 365 days).
  140 + expires: 5m
  141 +
  142 + # Redirect any incoming request to Drupal's front controller.
  143 + passthru: '/index.php'
  144 +
  145 + # Deny access to all static files, except those specifically allowed below.
  146 + allow: false
  147 +
  148 + # Rules for specific URI patterns.
  149 + rules:
  150 + # Allow access to common static files.
  151 + '\.(jpe?g|png|gif|svgz?|css|js|map|ico|bmp|eot|woff2?|otf|ttf)$':
  152 + allow: true
  153 + '^/robots\.txt$':
  154 + allow: true
  155 + '^/sitemap\.xml$':
  156 + allow: true
  157 +
  158 + # Deny direct access to configuration files.
  159 + '^/sites/sites\.php$':
  160 + scripts: false
  161 + '^/sites/[^/]+/settings.*?\.php$':
  162 + scripts: false
  163 +
  164 + # The files directory has its own special configuration rules.
  165 + '/sites/default/files':
  166 + # Allow access to all files in the public files directory.
  167 + allow: true
  168 + expires: 5m
  169 + passthru: '/index.php'
  170 + root: 'web/sites/default/files'
  171 +
  172 + # Do not execute PHP scripts from the writeable mount.
  173 + scripts: false
  174 +
  175 + rules:
  176 + # Provide a longer TTL (2 weeks) for aggregated CSS and JS files.
  177 + '^/sites/default/files/(css|js)':
  178 + expires: 2w
  179 +
  180 +crons:
  181 + # Run Drupal's cron tasks every 19 minutes.
  182 + drupal:
  183 + spec: '*/19 * * * *'
  184 + commands:
  185 + start: 'cd web ; drush core-cron'
  186 +
  187 +source:
  188 + operations:
  189 + auto-update:
  190 + command: |
  191 + curl -fsS https://raw.githubusercontent.com/platformsh/source-operations/main/setup.sh | { bash /dev/fd/3 sop-autoupdate; } 3<&0
... ...
  1 +version: 1
  2 +
  3 +info:
  4 + id: platformsh/droopler
  5 + name: Droopler 4 (Drupal 10)
  6 + description: |
  7 + <p>This template builds Droopler 4, the Drupal 10 distribution using the "Drupal Recommended" composer project. It is pre-configured to use MariaDB and Redis for caching. The Drupal installer will skip asking for database credentials as they are already provided.</p>
  8 + <p>Droopler is a Drupal distribution to build beautiful corporate websites on Drupal fast. It is a pre-built complete website easy to customise and manage.</p>
  9 + tags:
  10 + - PHP
  11 + - Droopler
  12 + - Drupal
  13 + - CMS
  14 + - Symfony
  15 + image: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMwNCA3OC4xNzE2NzciIGhlaWdodD0iNzguMTcxNjc3IiB3aWR0aD0iMzA0IiB4bWw6c3BhY2U9InByZXNlcnZlIiBpZD0ic3ZnMiIgdmVyc2lvbj0iMS4xIj48bWV0YWRhdGEgaWQ9Im1ldGFkYXRhOCI+PHJkZjpSREY+PGNjOldvcmsgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz48ZGM6dGl0bGUvPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcyBpZD0iZGVmczYiPjxjbGlwUGF0aCBpZD0iY2xpcFBhdGgxOCIgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGlkPSJwYXRoMTYiIGQ9Ik0gMCw1MS45IEggMTk3LjggViAwIEggMCBaIi8+PC9jbGlwUGF0aD48L2RlZnM+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzMzMzLDAsMCwtMS4zMzMzMzMzLC0xLjA2NjQsNzguODAzODA3KSIgaWQ9ImcxMCI+PGcgaWQ9ImcxMiI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4xNjI2NjkyLDAsMCwxLjE2MjY2OTIsLTAuMTMwMTAyOCwtMC4wNzcxMjE0NSkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDE4KSIgaWQ9ImcxNCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjIuNzk5OCwzMy4xOTk4KSIgaWQ9ImcyMCI+PHBhdGggaWQ9InBhdGgyMiIgc3R5bGU9ImZpbGw6IzE5NmRiYTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0iTSAwLDAgMy41LC02LjUgMy42LC02LjYgQyA0LC03LjMgNC4zLC04LjIgNC4zLC05IGMgMCwtMi4zOTkgLTIsLTQuMzk5IC00LjQsLTQuMzk5IC0yLjQsMCAtNC40LDIgLTQuNCw0LjM5OSAwLDAuOSAwLjIsMS43IDAuNywyLjQgeiBtIC02LjQsMTEuNyB2IDAgbCAzLjEsLTUuNiAtNS42LC05LjYgYyAtMSwtMS43IC0xLjYsLTMuNiAtMS42LC01LjUgMCwtNS43IDQuNywtMTAuMzk5IDEwLjQsLTEwLjM5OSA1LjcsMCAxMC40LDQuNjk5IDEwLjQsMTAuMzk5IDAsMiAtMC41LDMuOSAtMS42LDUuNSBMIC0yLjgsMTcuNyBIIC0yMiBaIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2Ljg5OTksNTAuNTAwMSkiIGlkPSJnMjQiPjxwYXRoIGlkPSJwYXRoMjYiIHN0eWxlPSJmaWxsOiMxNWE2ZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGggLTAuNyBsIDMuOSwtNy4yIGMgNywtMi45IDExLjMsLTkuMyAxMS4zLC0xNy40IDAsLTExIC04LjQsLTE5IC0xOS45LC0xOSBoIC0xNC43IHYgMzggaCA5LjYgbCAtMTUuNiw2IHYgLTQ5LjkgaCAyMC44IGMgNi45LC0wLjEgMTMuNSwyLjQgMTguNSw3LjEgNC44LDQuNyA3LjUsMTEuMiA3LjQsMTcuOSBDIDIwLjgsLTEyLjMgMTIsLTEuOSAwLDAiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjUuMjIyMiw1LjkxMTcpIiBpZD0iZzI4Ij48cGF0aCBpZD0icGF0aDMwIiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJNIDAsMCBDIDAsMC40MDggLTAuMDU0LDAuNzczIC0wLjE2MiwxLjA5OCAtMC4yNywxLjQyMiAtMC40MjYsMS42OTUgLTAuNjMsMS45MiAtMC44MzMsMi4xNDUgLTEuMDgxLDIuMzE2IC0xLjM3LDIuNDM2IC0xLjY2LDIuNTU3IC0xLjk4NiwyLjYxNSAtMi4zNDksMi42MTUgaCAtMS40NDQgdiAtNS4yMzIgaCAxLjQ0NCBjIDAuMzYzLDAgMC42ODksMC4wNiAwLjk3OSwwLjE4MSAwLjI4OSwwLjEyIDAuNTM3LDAuMjkxIDAuNzQsMC41MTYgMC4yMDQsMC4yMjUgMC4zNiwwLjQ5OCAwLjQ2OCwwLjgyMiBDIC0wLjA1NCwtMC43NzMgMCwtMC40MDggMCwwIG0gMS40MTgsMCBjIDAsLTAuNTQ1IC0wLjA5LC0xLjA0NSAtMC4yNzIsLTEuNSBDIDAuOTY0LC0xLjk1NyAwLjcwOSwtMi4zNSAwLjM4LC0yLjY3OCAwLjA1MSwtMy4wMDggLTAuMzQ1LC0zLjI2MiAtMC44MDcsLTMuNDQzIC0xLjI3LC0zLjYyNSAtMS43ODQsLTMuNzE3IC0yLjM0OSwtMy43MTcgaCAtMi44MzIgdiA3LjQzNCBoIDIuODMyIGMgMC41NjUsMCAxLjA3OSwtMC4wOTIgMS41NDIsLTAuMjc2IEMgLTAuMzQ1LDMuMjU4IDAuMDUxLDMuMDAyIDAuMzgsMi42NzYgMC43MDksMi4zNDggMC45NjQsMS45NTcgMS4xNDYsMS41IDEuMzI4LDEuMDQ1IDEuNDE4LDAuNTQ1IDEuNDE4LDAiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjguNzU3OCw2LjU1NDMpIiBpZD0iZzMyIj48cGF0aCBpZD0icGF0aDM0IiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJtIDAsMCBjIDAuMTY1LDAuMzE0IDAuMzYsMC41NjIgMC41ODYsMC43NDIgMC4yMjYsMC4xOCAwLjQ5NCwwLjI3IDAuODAyLDAuMjcgMC4yNDMsMCAwLjQzOCwtMC4wNTMgMC41ODYsLTAuMTU4IEwgMS44OTIsLTAuMDk4IEMgMS44NzUsLTAuMTYgMS44NSwtMC4yMDMgMS44MTcsLTAuMjI5IDEuNzg0LC0wLjI1NCAxLjc0MSwtMC4yNjggMS42ODYsLTAuMjY4IGMgLTAuMDUyLDAgLTAuMTI4LDAuMDA4IC0wLjIyOSwwLjAyNiAtMC4xMDEsMC4wMTcgLTAuMiwwLjAyNSAtMC4yOTUsMC4wMjUgLTAuMTQxLDAgLTAuMjY2LC0wLjAxOSAtMC4zNzUsLTAuMDYgQyAwLjY3NywtMC4zMTggMC41NzgsLTAuMzc5IDAuNDkxLC0wLjQ1NSAwLjQwMywtMC41MzEgMC4zMjYsLTAuNjI1IDAuMjYsLTAuNzM0IDAuMTkzLC0wLjg0NiAwLjEzLC0wLjk3MSAwLjA3MiwtMS4xMTEgdiAtMy4yNDggaCAtMS4yNyB2IDUuMjczIGggMC43NDYgYyAwLjEzLDAgMC4yMjEsLTAuMDIxIDAuMjcyLC0wLjA2OCAwLjA1MiwtMC4wNDcgMC4wODYsLTAuMTI5IDAuMTAzLC0wLjI1IHoiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzUuOTM4NSw3LjQ2ODQpIiBpZD0iZzM2Ij48cGF0aCBpZD0icGF0aDM4IiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJtIDAsMCB2IC01LjI3MyBoIC0wLjc3NiBjIC0wLjE2OCwwIC0wLjI3NCwwLjA3OCAtMC4zMTksMC4yMzIgbCAtMC4wODcsMC40MiBjIC0wLjIxNiwtMC4yMTkgLTAuNDU0LC0wLjM5NyAtMC43MTQsLTAuNTMxIC0wLjI2MSwtMC4xMzUgLTAuNTY4LC0wLjIwMyAtMC45MjEsLTAuMjAzIC0wLjI4NywwIC0wLjU0MiwwLjA0OCAtMC43NjMsMC4xNDYgLTAuMjIxLDAuMDk4IC0wLjQwNywwLjIzNiAtMC41NTgsMC40MTQgLTAuMTUxLDAuMTc4IC0wLjI2NCwwLjM5MSAtMC4zNDEsMC42MzUgLTAuMDc4LDAuMjQ0IC0wLjExNiwwLjUxNSAtMC4xMTYsMC44MDggViAwIGggMS4yNjkgdiAtMy4zNTIgYyAwLC0wLjMyIDAuMDc1LC0wLjU3IDAuMjI0LC0wLjc0NiAwLjE0OSwtMC4xNzcgMC4zNzMsLTAuMjY1IDAuNjcxLC0wLjI2NSAwLjIxOSwwIDAuNDI1LDAuMDQ5IDAuNjE3LDAuMTQ2IDAuMTkxLDAuMDk4IDAuMzczLDAuMjMzIDAuNTQ0LDAuNDA0IFYgMCBaIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc4LjQ2MTksMy41NjIxKSIgaWQ9Imc0MCI+PHBhdGggaWQ9InBhdGg0MiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAwLjE0NCwtMC4xNzQgMC4zMDEsLTAuMjk3IDAuNDcxLC0wLjM2OSAwLjE2OSwtMC4wNzIgMC4zNTMsLTAuMTA4IDAuNTUyLC0wLjEwOCAwLjE5MiwwIDAuMzY1LDAuMDM2IDAuNTE5LDAuMTA4IDAuMTU0LDAuMDcyIDAuMjg2LDAuMTgyIDAuMzk0LDAuMzI4IDAuMTA3LDAuMTQ4IDAuMTksMC4zMzQgMC4yNDksMC41NTkgMC4wNTgsMC4yMjQgMC4wODcsMC40ODggMC4wODcsMC43OTMgMCwwLjMwOCAtMC4wMjUsMC41NyAtMC4wNzQsMC43ODUgQyAyLjE0OCwyLjMwOSAyLjA3NywyLjQ4MiAxLjk4NCwyLjYxNyAxLjg5MiwyLjc1IDEuNzc5LDIuODQ4IDEuNjQ3LDIuOTEgMS41MTYsMi45NzEgMS4zNjYsMy4wMDIgMS4xOTgsMy4wMDIgMC45MzQsMy4wMDIgMC43MDksMi45NDcgMC41MjQsMi44MzYgMC4zMzksMi43MjUgMC4xNjUsMi41NjYgMCwyLjM2NSBaIE0gLTAuMDY2LDMuMTg4IEMgMC4xNDksMy40MyAwLjM5NCwzLjYyNyAwLjY2OCwzLjc3OSAwLjk0MiwzLjkzIDEuMjY1LDQuMDA0IDEuNjM1LDQuMDA0IDEuOTIyLDQuMDA0IDIuMTg2LDMuOTQ1IDIuNDI0LDMuODI0IDIuNjYyLDMuNzA1IDIuODY3LDMuNTMxIDMuMDQxLDMuMzAzIDMuMjEzLDMuMDc0IDMuMzQ3LDIuNzk1IDMuNDQxLDIuNDYxIDMuNTM2LDIuMTI1IDMuNTgzLDEuNzQyIDMuNTgzLDEuMzExIDMuNTgzLDAuOTE4IDMuNTMsMC41NTMgMy40MjMsMC4yMTcgMy4zMTcsLTAuMTE5IDMuMTY2LC0wLjQxIDIuOTY5LC0wLjY1OCAyLjc3MSwtMC45MDQgMi41MzMsLTEuMDk4IDIuMjU0LC0xLjIzNiAxLjk3NSwtMS4zNzUgMS42NjIsLTEuNDQzIDEuMzE2LC0xLjQ0MyAxLjAyMSwtMS40NDMgMC43NywtMS4zOTggMC41NjEsLTEuMzA3IDAuMzUyLC0xLjIxNyAwLjE2NSwtMS4wOTIgMCwtMC45MyB2IC0yLjE1OCBoIC0xLjI3IHYgNi45OTQgaCAwLjc3NyBjIDAuMTY0LDAgMC4yNzIsLTAuMDc2IDAuMzI0LC0wLjIzIHoiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODUuODE3NCw0LjQ0NjkpIiBpZD0iZzQ0Ij48cGF0aCBpZD0icGF0aDQ2IiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJtIDAsMCBjIC0wLjM2NywtMC4wMTggLTAuNjc1LC0wLjA0OSAtMC45MjUsLTAuMDk2IC0wLjI1LC0wLjA0NSAtMC40NTEsLTAuMTA1IC0wLjYwMiwtMC4xNzcgLTAuMTUxLC0wLjA3MSAtMC4yNTksLTAuMTU1IC0wLjMyNCwtMC4yNTIgLTAuMDY1LC0wLjA5NiAtMC4wOTcsLTAuMiAtMC4wOTcsLTAuMzEzIDAsLTAuMjIzIDAuMDY2LC0wLjM4MyAwLjE5OCwtMC40NzggMC4xMzEsLTAuMDk2IDAuMzA0LC0wLjE0MyAwLjUxNiwtMC4xNDMgMC4yNjEsMCAwLjQ4NiwwLjA0NyAwLjY3NiwwLjE0MSAwLjE5LDAuMDkzIDAuMzc2LDAuMjM2IDAuNTU4LDAuNDI5IHogbSAtMi45MDksMi4yODcgYyAwLjYwNiwwLjU1NSAxLjMzNiwwLjgzMiAyLjE4OSwwLjgzMiAwLjMwOSwwIDAuNTg0LC0wLjA1MSAwLjgyOCwtMC4xNSBDIDAuMzUxLDIuODY3IDAuNTU3LDIuNzI3IDAuNzI1LDIuNTQ3IDAuODkzLDIuMzY3IDEuMDIsMi4xNTIgMS4xMDcsMS45MDIgMS4xOTUsMS42NTIgMS4yMzksMS4zNzcgMS4yMzksMS4wOCBWIC0yLjI1MiBIIDAuNjYzIGMgLTAuMTIsMCAtMC4yMTMsMC4wMTggLTAuMjc4LDAuMDU1IC0wLjA2NSwwLjAzNSAtMC4xMTYsMC4xMDkgLTAuMTU0LDAuMjE4IEwgMC4xMTgsLTEuNiBjIC0wLjEzNCwtMC4xMTkgLTAuMjY0LC0wLjIyNCAtMC4zOSwtMC4zMTQgLTAuMTI3LC0wLjA5MiAtMC4yNTksLTAuMTY4IC0wLjM5NiwtMC4yMjkgLTAuMTM3LC0wLjA2MiAtMC4yODQsLTAuMTA5IC0wLjQ0LC0wLjE0MiAtMC4xNTYsLTAuMDMzIC0wLjMyOCwtMC4wNDkgLTAuNTE3LC0wLjA0OSAtMC4yMjIsMCAtMC40MjgsMC4wMzEgLTAuNjE2LDAuMDkgLTAuMTg5LDAuMDYgLTAuMzUxLDAuMTUgLTAuNDg4LDAuMjY5IC0wLjEzOCwwLjEyMSAtMC4yNDQsMC4yNyAtMC4zMTksMC40NDggLTAuMDc2LDAuMTc5IC0wLjExMywwLjM4NiAtMC4xMTMsMC42MjMgMCwwLjEzMyAwLjAyMiwwLjI2NSAwLjA2NywwLjM5OCAwLjA0NCwwLjEzMSAwLjExNywwLjI1OCAwLjIxOCwwLjM3NyAwLjEwMSwwLjEyMSAwLjIzMiwwLjIzMyAwLjM5MywwLjM0IDAuMTYxLDAuMTA1IDAuMzU5LDAuMTk5IDAuNTk0LDAuMjc3IDAuMjM1LDAuMDc4IDAuNTA4LDAuMTQzIDAuODIsMC4xOTQgQyAtMC43NTcsMC43MyAtMC40MDEsMC43NiAwLDAuNzcxIFYgMS4wOCBjIDAsMC4zNTIgLTAuMDc2LDAuNjEzIC0wLjIyNiwwLjc4MyAtMC4xNTEsMC4xNyAtMC4zNjksMC4yNTQgLTAuNjUzLDAuMjU0IC0wLjIwNSwwIC0wLjM3NiwtMC4wMjMgLTAuNTEyLC0wLjA3MiBDIC0xLjUyNiwxLjk5OCAtMS42NDUsMS45NDMgLTEuNzQ4LDEuODgzIC0xLjg1MSwxLjgyNCAtMS45NDQsMS43NyAtMi4wMjgsMS43MjMgLTIuMTEyLDEuNjc0IC0yLjIwNSwxLjY1IC0yLjMwOCwxLjY1IGMgLTAuMDg5LDAgLTAuMTY1LDAuMDI0IC0wLjIyNiwwLjA2OSAtMC4wNjIsMC4wNDcgLTAuMTEyLDAuMTAxIC0wLjE0OSwwLjE2MiB6Ii8+PC9nPjxwYXRoIGlkPSJwYXRoNDgiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gODkuNTMzLDIuMTk1IGggLTEuMjcgdiA3LjYzOSBoIDEuMjcgeiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkzLjY3MDQsMi4xOTQ5KSIgaWQ9Imc1MCI+PHBhdGggaWQ9InBhdGg1MiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgdiA0LjMxOCBsIC0wLjQ1OCwwLjA3MyBjIC0wLjA5OSwwLjAxOSAtMC4xNzgsMC4wNTQgLTAuMjM4LDAuMTA1IC0wLjA2LDAuMDQ5IC0wLjA5LDAuMTE5IC0wLjA5LDAuMjEzIHYgMC41MiBIIDAgdiAwLjM5IGMgMCwwLjMwMSAwLjA0NSwwLjU3MiAwLjEzNiwwLjgxMSAwLjA5MSwwLjI0IDAuMjIxLDAuNDQ1IDAuMzkxLDAuNjEzIDAuMTcsMC4xNjggMC4zNzYsMC4yOTUgMC42MTksMC4zODUgMC4yNDQsMC4wOSAwLjUxOCwwLjEzMyAwLjgyMywwLjEzMyAwLjI0MywwIDAuNDY5LC0wLjAzMiAwLjY3OCwtMC4wOTggTCAyLjYyMiw2LjgyNiBDIDIuNjE4LDYuNzc5IDIuNjA0LDYuNzQgMi41ODEsNi43MTEgMi41NTYsNi42ODIgMi41MjQsNi42NiAyLjQ4NSw2LjY0NSAyLjQ0Niw2LjYyOSAyLjQsNi42MTkgMi4zNDksNi42MTMgMi4yOTgsNi42MDcgMi4yNDMsNi42MDUgMi4xODUsNi42MDUgMi4wMzQsNi42MDUgMS44OTksNi41OSAxLjc4MSw2LjU1NyAxLjY2Myw2LjUyMyAxLjU2Miw2LjQ2NyAxLjQ4LDYuMzg3IDEuMzk4LDYuMzA3IDEuMzM1LDYuMTk5IDEuMjkzLDYuMDY4IDEuMjUsNS45MzYgMS4yMjksNS43NzMgMS4yMjksNS41NzggViA1LjIyOSBIIDIuNjAxIFYgNC4zMjIgSCAxLjI3IFYgMCBaIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDk5LjE4MzYsMy4wOTUzKSIgaWQ9Imc1NCI+PHBhdGggaWQ9InBhdGg1NiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0iTSAwLDAgQyAwLjQzOSwwIDAuNzY0LDAuMTQ2IDAuOTc1LDAuNDQxIDEuMTg2LDAuNzM2IDEuMjkxLDEuMTY4IDEuMjkxLDEuNzM2IDEuMjkxLDIuMzA3IDEuMTg2LDIuNzM4IDAuOTc1LDMuMDM3IDAuNzY0LDMuMzM2IDAuNDM5LDMuNDg0IDAsMy40ODQgLTAuNDQ1LDMuNDg0IC0wLjc3NSwzLjMzNCAtMC45ODksMy4wMzUgLTEuMjA0LDIuNzM0IC0xLjMxMSwyLjMwMyAtMS4zMTEsMS43MzYgLTEuMzExLDEuMTcyIC0xLjIwNCwwLjc0IC0wLjk4OSwwLjQ0MyAtMC43NzUsMC4xNDggLTAuNDQ1LDAgMCwwIE0gMCw0LjQ1NSBDIDAuMzkxLDQuNDU1IDAuNzQ2LDQuMzkzIDEuMDY3LDQuMjY2IDEuMzg4LDQuMTM5IDEuNjYxLDMuOTU5IDEuODksMy43MjcgMi4xMTcsMy40OTIgMi4yOTMsMy4yMDkgMi40MTYsMi44NzMgMi41NCwyLjUzNyAyLjYwMiwyLjE2MiAyLjYwMiwxLjc0OCAyLjYwMiwxLjMyOCAyLjU0LDAuOTUzIDIuNDE2LDAuNjE3IDIuMjkzLDAuMjgxIDIuMTE3LC0wLjAwNiAxLjg5LC0wLjI0MiAxLjY2MSwtMC40NzkgMS4zODgsLTAuNjYgMS4wNjcsLTAuNzg3IDAuNzQ2LC0wLjkxNCAwLjM5MSwtMC45NzcgMCwtMC45NzcgYyAtMC4zOTQsMCAtMC43NTIsMC4wNjMgLTEuMDc0LDAuMTkgLTAuMzIyLDAuMTI3IC0wLjU5NywwLjMwOCAtMC44MjUsMC41NDUgLTAuMjI4LDAuMjM2IC0wLjQwNCwwLjUyMyAtMC41MjksMC44NTkgLTAuMTI2LDAuMzM2IC0wLjE4OCwwLjcxMSAtMC4xODgsMS4xMzEgMCwwLjQxNCAwLjA2MiwwLjc4OSAwLjE4OCwxLjEyNSAwLjEyNSwwLjMzNiAwLjMwMSwwLjYxOSAwLjUyOSwwLjg1NCAwLjIyOCwwLjIzMiAwLjUwMywwLjQxMiAwLjgyNSwwLjUzOSAwLjMyMiwwLjEyNyAwLjY4LDAuMTg5IDEuMDc0LDAuMTg5Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwMy45NDgyLDYuNTU0MykiIGlkPSJnNTgiPjxwYXRoIGlkPSJwYXRoNjAiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGMgMC4xNjQsMC4zMTQgMC4zNTksMC41NjIgMC41ODYsMC43NDIgMC4yMjYsMC4xOCAwLjQ5MywwLjI3IDAuODAyLDAuMjcgMC4yNDMsMCAwLjQzOCwtMC4wNTMgMC41ODYsLTAuMTU4IEwgMS44OTIsLTAuMDk4IEMgMS44NzQsLTAuMTYgMS44NSwtMC4yMDMgMS44MTYsLTAuMjI5IDEuNzg0LC0wLjI1NCAxLjc0LC0wLjI2OCAxLjY4NiwtMC4yNjggYyAtMC4wNTIsMCAtMC4xMjgsMC4wMDggLTAuMjI5LDAuMDI2IC0wLjEwMiwwLjAxNyAtMC4yLDAuMDI1IC0wLjI5NiwwLjAyNSAtMC4xNCwwIC0wLjI2NSwtMC4wMTkgLTAuMzc1LC0wLjA2IEMgMC42NzcsLTAuMzE4IDAuNTc4LC0wLjM3OSAwLjQ5LC0wLjQ1NSAwLjQwMywtMC41MzEgMC4zMjYsLTAuNjI1IDAuMjYsLTAuNzM0IDAuMTkyLC0wLjg0NiAwLjEzLC0wLjk3MSAwLjA3MSwtMS4xMTEgdiAtMy4yNDggaCAtMS4yNjkgdiA1LjI3MyBoIDAuNzQ2IGMgMC4xMywwIDAuMjIxLC0wLjAyMSAwLjI3MiwtMC4wNjggMC4wNTEsLTAuMDQ3IDAuMDg1LC0wLjEyOSAwLjEwMywtMC4yNSB6Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDExMi42NDg0LDYuMzUzMSkiIGlkPSJnNjIiPjxwYXRoIGlkPSJwYXRoNjQiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGMgLTAuMDM4LC0wLjA0NyAtMC4wNzQsLTAuMDg2IC0wLjExLC0wLjExMyAtMC4wMzYsLTAuMDI4IC0wLjA4OSwtMC4wNDEgLTAuMTU4LC0wLjA0MSAtMC4wNjQsMCAtMC4xMjgsMC4wMTkgLTAuMTg5LDAuMDYgLTAuMDYzLDAuMDM5IC0wLjEzNiwwLjA4NCAtMC4yMjIsMC4xMzMgLTAuMDg2LDAuMDQ5IC0wLjE4NywwLjA5NCAtMC4zMDUsMC4xMzMgLTAuMTE5LDAuMDQxIC0wLjI2NSwwLjA2IC0wLjQ0LDAuMDYgLTAuMjIyLDAgLTAuNDE4LC0wLjA0MSAtMC41ODYsLTAuMTIxIEMgLTIuMTc4LDAuMDMxIC0yLjMxNywtMC4wODYgLTIuNDI5LC0wLjIzNiAtMi41NCwtMC4zODcgLTIuNjIzLC0wLjU2OCAtMi42NzgsLTAuNzgzIC0yLjczMiwtMC45OTggLTIuNzYsLTEuMjQgLTIuNzYsLTEuNTEgYyAwLC0wLjI4MSAwLjAzLC0wLjUzMSAwLjA5LC0wLjc1MiAwLjA2LC0wLjIxOCAwLjE0NywtMC40MDIgMC4yNTksLTAuNTUyIDAuMTEzLC0wLjE0OSAwLjI1MSwtMC4yNjIgMC40MTIsLTAuMzM4IDAuMTYsLTAuMDc4IDAuMzQyLC0wLjExNiAwLjU0NCwtMC4xMTYgMC4yMDIsMCAwLjM2NiwwLjAyNCAwLjQ5MSwwLjA3NSAwLjEyNSwwLjA0OCAwLjIzMSwwLjEwMyAwLjMxNywwLjE2NCAwLjA4NSwwLjA2IDAuMTYsMC4xMTUgMC4yMjMsMC4xNjQgMC4wNjQsMC4wNTEgMC4xMzQsMC4wNzQgMC4yMTMsMC4wNzQgMC4xMDMsMCAwLjE4LC0wLjAzOSAwLjIzMiwtMC4xMTcgbCAwLjM2NSwtMC40NjMgYyAtMC4xNDEsLTAuMTY0IC0wLjI5MywtMC4zMDMgLTAuNDU4LC0wLjQxNCAtMC4xNjQsLTAuMTExIC0wLjMzNSwtMC4yMDEgLTAuNTExLC0wLjI2OCAtMC4xNzcsLTAuMDY2IC0wLjM1OCwtMC4xMTMgLTAuNTQ1LC0wLjE0IC0wLjE4NywtMC4wMjggLTAuMzczLC0wLjA0MSAtMC41NTgsLTAuMDQxIC0wLjMyNiwwIC0wLjYzMiwwLjA2IC0wLjkyLDAuMTgxIC0wLjI4OCwwLjEyMSAtMC41NCwwLjI5OSAtMC43NTUsMC41MzMgLTAuMjE2LDAuMjMzIC0wLjM4NywwLjUxOCAtMC41MTIsMC44NTYgLTAuMTI1LDAuMzM4IC0wLjE4OCwwLjcyMyAtMC4xODgsMS4xNTQgMCwwLjM4NyAwLjA1NiwwLjc0NiAwLjE2NywxLjA3NiAwLjExMiwwLjMzIDAuMjc2LDAuNjE4IDAuNDkyLDAuODU4IDAuMjE1LDAuMjQyIDAuNDgyLDAuNDMxIDAuODAxLDAuNTY4IDAuMzE5LDAuMTM3IDAuNjg1LDAuMjA1IDEuMSwwLjIwNSAwLjM5NSwwIDAuNzM5LC0wLjA2MiAxLjAzNiwtMC4xODkgMC4yOTYsLTAuMTI3IDAuNTYzLC0wLjMwOSAwLjc5OSwtMC41NDUgeiIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMTYuMDYzNSwzLjA5NTMpIiBpZD0iZzY2Ij48cGF0aCBpZD0icGF0aDY4IiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJNIDAsMCBDIDAuNDM5LDAgMC43NjQsMC4xNDYgMC45NzUsMC40NDEgMS4xODYsMC43MzYgMS4yOTEsMS4xNjggMS4yOTEsMS43MzYgMS4yOTEsMi4zMDcgMS4xODYsMi43MzggMC45NzUsMy4wMzcgMC43NjQsMy4zMzYgMC40MzksMy40ODQgMCwzLjQ4NCAtMC40NDUsMy40ODQgLTAuNzc0LDMuMzM0IC0wLjk4OSwzLjAzNSAtMS4yMDMsMi43MzQgLTEuMzExLDIuMzAzIC0xLjMxMSwxLjczNiAtMS4zMTEsMS4xNzIgLTEuMjAzLDAuNzQgLTAuOTg5LDAuNDQzIC0wLjc3NCwwLjE0OCAtMC40NDUsMCAwLDAgTSAwLDQuNDU1IEMgMC4zOTEsNC40NTUgMC43NDYsNC4zOTMgMS4wNjcsNC4yNjYgMS4zODgsNC4xMzkgMS42NjEsMy45NTkgMS44OSwzLjcyNyAyLjExNywzLjQ5MiAyLjI5MywzLjIwOSAyLjQxNiwyLjg3MyAyLjU0LDIuNTM3IDIuNjAyLDIuMTYyIDIuNjAyLDEuNzQ4IDIuNjAyLDEuMzI4IDIuNTQsMC45NTMgMi40MTYsMC42MTcgMi4yOTMsMC4yODEgMi4xMTcsLTAuMDA2IDEuODksLTAuMjQyIDEuNjYxLC0wLjQ3OSAxLjM4OCwtMC42NiAxLjA2NywtMC43ODcgMC43NDYsLTAuOTE0IDAuMzkxLC0wLjk3NyAwLC0wLjk3NyBjIC0wLjM5NCwwIC0wLjc1MiwwLjA2MyAtMS4wNzQsMC4xOSAtMC4zMjIsMC4xMjcgLTAuNTk3LDAuMzA4IC0wLjgyNCwwLjU0NSAtMC4yMjksMC4yMzYgLTAuNDA1LDAuNTIzIC0wLjUzLDAuODU5IC0wLjEyNiwwLjMzNiAtMC4xODgsMC43MTEgLTAuMTg4LDEuMTMxIDAsMC40MTQgMC4wNjIsMC43ODkgMC4xODgsMS4xMjUgMC4xMjUsMC4zMzYgMC4zMDEsMC42MTkgMC41MywwLjg1NCAwLjIyNywwLjIzMiAwLjUwMiwwLjQxMiAwLjgyNCwwLjUzOSAwLjMyMiwwLjEyNyAwLjY4LDAuMTg5IDEuMDc0LDAuMTg5Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMC44MzQsNi41NTQzKSIgaWQ9Imc3MCI+PHBhdGggaWQ9InBhdGg3MiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAwLjE2NCwwLjMxNCAwLjM1OSwwLjU2MiAwLjU4NiwwLjc0MiAwLjIyNiwwLjE4IDAuNDkzLDAuMjcgMC44MDIsMC4yNyAwLjI0MywwIDAuNDM4LC0wLjA1MyAwLjU4NiwtMC4xNTggTCAxLjg5MiwtMC4wOTggQyAxLjg3NCwtMC4xNiAxLjg1LC0wLjIwMyAxLjgxNiwtMC4yMjkgMS43ODQsLTAuMjU0IDEuNzQsLTAuMjY4IDEuNjg2LC0wLjI2OCBjIC0wLjA1MiwwIC0wLjEyOCwwLjAwOCAtMC4yMjksMC4wMjYgLTAuMTAyLDAuMDE3IC0wLjIsMC4wMjUgLTAuMjk2LDAuMDI1IC0wLjE0LDAgLTAuMjY1LC0wLjAxOSAtMC4zNzUsLTAuMDYgQyAwLjY3NywtMC4zMTggMC41NzgsLTAuMzc5IDAuNDksLTAuNDU1IDAuNDAzLC0wLjUzMSAwLjMyNiwtMC42MjUgMC4yNiwtMC43MzQgMC4xOTIsLTAuODQ2IDAuMTMsLTAuOTcxIDAuMDcxLC0xLjExMSB2IC0zLjI0OCBoIC0xLjI2OSB2IDUuMjczIGggMC43NDYgYyAwLjEzLDAgMC4yMjEsLTAuMDIxIDAuMjcyLC0wLjA2OCAwLjA1MSwtMC4wNDcgMC4wODUsLTAuMTI5IDAuMTAzLC0wLjI1IHoiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTI0Ljc0MDIsMy41NjIxKSIgaWQ9Imc3NCI+PHBhdGggaWQ9InBhdGg3NiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAwLjE0NCwtMC4xNzQgMC4zMDEsLTAuMjk3IDAuNDcxLC0wLjM2OSAwLjE2OSwtMC4wNzIgMC4zNTMsLTAuMTA4IDAuNTUxLC0wLjEwOCAwLjE5MywwIDAuMzY2LDAuMDM2IDAuNTIsMC4xMDggMC4xNTQsMC4wNzIgMC4yODUsMC4xODIgMC4zOTQsMC4zMjggMC4xMDcsMC4xNDggMC4xOSwwLjMzNCAwLjI0OSwwLjU1OSAwLjA1NywwLjIyNCAwLjA4NiwwLjQ4OCAwLjA4NiwwLjc5MyAwLDAuMzA4IC0wLjAyNCwwLjU3IC0wLjA3NCwwLjc4NSBDIDIuMTQ3LDIuMzA5IDIuMDc2LDIuNDgyIDEuOTg0LDIuNjE3IDEuODkyLDIuNzUgMS43NzksMi44NDggMS42NDcsMi45MSAxLjUxNiwyLjk3MSAxLjM2NSwzLjAwMiAxLjE5NywzLjAwMiAwLjkzNCwzLjAwMiAwLjcwOSwyLjk0NyAwLjUyNCwyLjgzNiAwLjMzOSwyLjcyNSAwLjE2NCwyLjU2NiAwLDIuMzY1IFogTSAtMC4wNjYsMy4xODggQyAwLjE0OSwzLjQzIDAuMzk0LDMuNjI3IDAuNjY4LDMuNzc5IDAuOTQyLDMuOTMgMS4yNjUsNC4wMDQgMS42MzUsNC4wMDQgMS45MjIsNC4wMDQgMi4xODYsMy45NDUgMi40MjQsMy44MjQgMi42NjEsMy43MDUgMi44NjcsMy41MzEgMy4wNCwzLjMwMyAzLjIxMywzLjA3NCAzLjM0NywyLjc5NSAzLjQ0MSwyLjQ2MSAzLjUzNSwyLjEyNSAzLjU4MiwxLjc0MiAzLjU4MiwxLjMxMSAzLjU4MiwwLjkxOCAzLjUyOSwwLjU1MyAzLjQyMywwLjIxNyAzLjMxNywtMC4xMTkgMy4xNjUsLTAuNDEgMi45NjksLTAuNjU4IDIuNzcxLC0wLjkwNCAyLjUzMywtMS4wOTggMi4yNTQsLTEuMjM2IDEuOTc1LC0xLjM3NSAxLjY2MiwtMS40NDMgMS4zMTUsLTEuNDQzIDEuMDIxLC0xLjQ0MyAwLjc3LC0xLjM5OCAwLjU2MSwtMS4zMDcgMC4zNTIsLTEuMjE3IDAuMTY0LC0xLjA5MiAwLC0wLjkzIHYgLTIuMTU4IGggLTEuMjcgdiA2Ljk5NCBoIDAuNzc3IGMgMC4xNjQsMCAwLjI3MiwtMC4wNzYgMC4zMjMsLTAuMjMgeiIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMzEuNjQyNiwzLjA5NTMpIiBpZD0iZzc4Ij48cGF0aCBpZD0icGF0aDgwIiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJNIDAsMCBDIDAuNDM5LDAgMC43NjQsMC4xNDYgMC45NzUsMC40NDEgMS4xODYsMC43MzYgMS4yOTEsMS4xNjggMS4yOTEsMS43MzYgMS4yOTEsMi4zMDcgMS4xODYsMi43MzggMC45NzUsMy4wMzcgMC43NjQsMy4zMzYgMC40MzksMy40ODQgMCwzLjQ4NCAtMC40NDUsMy40ODQgLTAuNzc0LDMuMzM0IC0wLjk4OSwzLjAzNSAtMS4yMDMsMi43MzQgLTEuMzExLDIuMzAzIC0xLjMxMSwxLjczNiAtMS4zMTEsMS4xNzIgLTEuMjAzLDAuNzQgLTAuOTg5LDAuNDQzIC0wLjc3NCwwLjE0OCAtMC40NDUsMCAwLDAgTSAwLDQuNDU1IEMgMC4zOTEsNC40NTUgMC43NDYsNC4zOTMgMS4wNjcsNC4yNjYgMS4zODgsNC4xMzkgMS42NjEsMy45NTkgMS44OSwzLjcyNyAyLjExNywzLjQ5MiAyLjI5MywzLjIwOSAyLjQxNiwyLjg3MyAyLjU0LDIuNTM3IDIuNjAyLDIuMTYyIDIuNjAyLDEuNzQ4IDIuNjAyLDEuMzI4IDIuNTQsMC45NTMgMi40MTYsMC42MTcgMi4yOTMsMC4yODEgMi4xMTcsLTAuMDA2IDEuODksLTAuMjQyIDEuNjYxLC0wLjQ3OSAxLjM4OCwtMC42NiAxLjA2NywtMC43ODcgMC43NDYsLTAuOTE0IDAuMzkxLC0wLjk3NyAwLC0wLjk3NyBjIC0wLjM5NCwwIC0wLjc1MiwwLjA2MyAtMS4wNzQsMC4xOSAtMC4zMjIsMC4xMjcgLTAuNTk3LDAuMzA4IC0wLjgyNCwwLjU0NSAtMC4yMjksMC4yMzYgLTAuNDA1LDAuNTIzIC0wLjUzLDAuODU5IC0wLjEyNiwwLjMzNiAtMC4xODgsMC43MTEgLTAuMTg4LDEuMTMxIDAsMC40MTQgMC4wNjIsMC43ODkgMC4xODgsMS4xMjUgMC4xMjUsMC4zMzYgMC4zMDEsMC42MTkgMC41MywwLjg1NCAwLjIyNywwLjIzMiAwLjUwMiwwLjQxMiAwLjgyNCwwLjUzOSAwLjMyMiwwLjEyNyAwLjY4LDAuMTg5IDEuMDc0LDAuMTg5Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzNi40MDgyLDYuNTU0MykiIGlkPSJnODIiPjxwYXRoIGlkPSJwYXRoODQiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGMgMC4xNjQsMC4zMTQgMC4zNTksMC41NjIgMC41ODYsMC43NDIgMC4yMjYsMC4xOCAwLjQ5MywwLjI3IDAuODAyLDAuMjcgMC4yNDMsMCAwLjQzOCwtMC4wNTMgMC41ODYsLTAuMTU4IEwgMS44OTIsLTAuMDk4IEMgMS44NzQsLTAuMTYgMS44NSwtMC4yMDMgMS44MTYsLTAuMjI5IDEuNzg0LC0wLjI1NCAxLjc0LC0wLjI2OCAxLjY4NiwtMC4yNjggYyAtMC4wNTIsMCAtMC4xMjgsMC4wMDggLTAuMjI5LDAuMDI2IC0wLjEwMiwwLjAxNyAtMC4yLDAuMDI1IC0wLjI5NiwwLjAyNSAtMC4xNCwwIC0wLjI2NSwtMC4wMTkgLTAuMzc1LC0wLjA2IEMgMC42NzcsLTAuMzE4IDAuNTc4LC0wLjM3OSAwLjQ5LC0wLjQ1NSAwLjQwMywtMC41MzEgMC4zMjYsLTAuNjI1IDAuMjYsLTAuNzM0IDAuMTkyLC0wLjg0NiAwLjEzLC0wLjk3MSAwLjA3MSwtMS4xMTEgdiAtMy4yNDggaCAtMS4yNjkgdiA1LjI3MyBoIDAuNzQ2IGMgMC4xMywwIDAuMjIxLC0wLjAyMSAwLjI3MiwtMC4wNjggMC4wNTEsLTAuMDQ3IDAuMDg1LC0wLjEyOSAwLjEwMywtMC4yNSB6Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE0MS43NjM3LDQuNDQ2OSkiIGlkPSJnODYiPjxwYXRoIGlkPSJwYXRoODgiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGMgLTAuMzY2LC0wLjAxOCAtMC42NzUsLTAuMDQ5IC0wLjkyNSwtMC4wOTYgLTAuMjUsLTAuMDQ1IC0wLjQ1MSwtMC4xMDUgLTAuNjAxLC0wLjE3NyAtMC4xNTIsLTAuMDcxIC0wLjI1OSwtMC4xNTUgLTAuMzI1LC0wLjI1MiAtMC4wNjQsLTAuMDk2IC0wLjA5NywtMC4yIC0wLjA5NywtMC4zMTMgMCwtMC4yMjMgMC4wNjYsLTAuMzgzIDAuMTk4LC0wLjQ3OCAwLjEzMiwtMC4wOTYgMC4zMDQsLTAuMTQzIDAuNTE3LC0wLjE0MyAwLjI2LDAgMC40ODUsMC4wNDcgMC42NzUsMC4xNDEgMC4xOTEsMC4wOTMgMC4zNzYsMC4yMzYgMC41NTgsMC40MjkgeiBtIC0yLjkwOSwyLjI4NyBjIDAuNjA2LDAuNTU1IDEuMzM3LDAuODMyIDIuMTg5LDAuODMyIDAuMzA5LDAgMC41ODQsLTAuMDUxIDAuODI4LC0wLjE1IEMgMC4zNTIsMi44NjcgMC41NTcsMi43MjcgMC43MjUsMi41NDcgMC44OTMsMi4zNjcgMS4wMjEsMi4xNTIgMS4xMDcsMS45MDIgMS4xOTUsMS42NTIgMS4yMzksMS4zNzcgMS4yMzksMS4wOCBWIC0yLjI1MiBIIDAuNjYzIGMgLTAuMTIsMCAtMC4yMTMsMC4wMTggLTAuMjc3LDAuMDU1IEMgMC4zMiwtMi4xNjIgMC4yNywtMi4wODggMC4yMzEsLTEuOTc5IEwgMC4xMTgsLTEuNiBjIC0wLjEzNCwtMC4xMTkgLTAuMjY0LC0wLjIyNCAtMC4zOSwtMC4zMTQgLTAuMTI3LC0wLjA5MiAtMC4yNTksLTAuMTY4IC0wLjM5NiwtMC4yMjkgLTAuMTM3LC0wLjA2MiAtMC4yODQsLTAuMTA5IC0wLjQzOSwtMC4xNDIgLTAuMTU3LC0wLjAzMyAtMC4zMjksLTAuMDQ5IC0wLjUxNywtMC4wNDkgLTAuMjIzLDAgLTAuNDI5LDAuMDMxIC0wLjYxNywwLjA5IC0wLjE4OSwwLjA2IC0wLjM1MSwwLjE1IC0wLjQ4OCwwLjI2OSAtMC4xMzcsMC4xMjEgLTAuMjQ0LDAuMjcgLTAuMzE5LDAuNDQ4IC0wLjA3NSwwLjE3OSAtMC4xMTMsMC4zODYgLTAuMTEzLDAuNjIzIDAsMC4xMzMgMC4wMjIsMC4yNjUgMC4wNjcsMC4zOTggMC4wNDQsMC4xMzEgMC4xMTcsMC4yNTggMC4yMTgsMC4zNzcgMC4xMDIsMC4xMjEgMC4yMzIsMC4yMzMgMC4zOTQsMC4zNCAwLjE2MSwwLjEwNSAwLjM1OCwwLjE5OSAwLjU5MywwLjI3NyAwLjIzNSwwLjA3OCAwLjUwOCwwLjE0MyAwLjgyLDAuMTk0IEMgLTAuNzU3LDAuNzMgLTAuNCwwLjc2IDAsMC43NzEgViAxLjA4IGMgMCwwLjM1MiAtMC4wNzUsMC42MTMgLTAuMjI2LDAuNzgzIC0wLjE1MSwwLjE3IC0wLjM2OSwwLjI1NCAtMC42NTMsMC4yNTQgLTAuMjA1LDAgLTAuMzc2LC0wLjAyMyAtMC41MTIsLTAuMDcyIEMgLTEuNTI1LDEuOTk4IC0xLjY0NSwxLjk0MyAtMS43NDcsMS44ODMgLTEuODUxLDEuODI0IC0xLjk0MywxLjc3IC0yLjAyNywxLjcyMyAtMi4xMTEsMS42NzQgLTIuMjA1LDEuNjUgLTIuMzA4LDEuNjUgYyAtMC4wODgsMCAtMC4xNjUsMC4wMjQgLTAuMjI2LDAuMDY5IC0wLjA2MiwwLjA0NyAtMC4xMTIsMC4xMDEgLTAuMTQ5LDAuMTYyIHoiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQ1Ljg3NzksMi4xMTI5KSIgaWQ9Imc5MCI+PHBhdGggaWQ9InBhdGg5MiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAtMC40NTksMCAtMC44MTEsMC4xMjkgLTEuMDU2LDAuMzg5IC0wLjI0NSwwLjI1NyAtMC4zNjgsMC42MTUgLTAuMzY4LDEuMDcyIHYgMi45NDMgaCAtMC41MzkgYyAtMC4wNjgsMCAtMC4xMjcsMC4wMjQgLTAuMTc1LDAuMDY5IC0wLjA0OCwwLjA0MyAtMC4wNzIsMC4xMTEgLTAuMDcyLDAuMTk5IHYgMC41MDQgbCAwLjg0OSwwLjEzOCAwLjI2NiwxLjQ0IGMgMC4wMTgsMC4wNjggMC4wNSwwLjEyMSAwLjA5OCwwLjE2IDAuMDQ4LDAuMDM3IDAuMTEsMC4wNTcgMC4xODUsMC4wNTcgaCAwLjY1OSBWIDUuMzExIEggMS4yNTUgViA0LjQwNCBIIC0wLjE1MyBWIDEuNTQ3IGMgMCwtMC4xNjQgMC4wNCwtMC4yOTMgMC4xMiwtMC4zODUgMC4wODEsLTAuMDkyIDAuMTkxLC0wLjEzOSAwLjMzMiwtMC4xMzkgMC4wNzgsMCAwLjE0NCwwLjAxIDAuMTk3LDAuMDI4IEMgMC41NSwxLjA3IDAuNTk2LDEuMDkgMC42MzUsMS4xMTEgMC42NzUsMS4xMzEgMC43MSwxLjE1IDAuNzQsMS4xNyAwLjc3MSwxLjE4NyAwLjgwMywxLjE5NyAwLjgzMywxLjE5NyAwLjg3MSwxLjE5NyAwLjkwMSwxLjE4NyAwLjkyNiwxLjE3IDAuOTQ5LDEuMTUgMC45NzYsMS4xMjMgMS4wMDMsMS4wODQgTCAxLjM4MywwLjQ2OSBDIDEuMTk4LDAuMzE0IDAuOTg1LDAuMTk3IDAuNzQ2LDAuMTE5IDAuNTA2LDAuMDM5IDAuMjU4LDAgMCwwIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1MS4yOTc5LDUuNDM5MSkiIGlkPSJnOTQiPjxwYXRoIGlkPSJwYXRoOTYiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Ik0gMCwwIEMgMCwwLjE2NCAtMC4wMjMsMC4zMTggLTAuMDY5LDAuNDY1IC0wLjExNSwwLjYxMSAtMC4xODYsMC43MzggLTAuMjc3LDAuODQ4IC0wLjM3LDAuOTU3IC0wLjQ4NywxLjA0MyAtMC42MywxLjEwNyAtMC43NzEsMS4xNyAtMC45MzcsMS4yMDMgLTEuMTI2LDEuMjAzIC0xLjQ5MiwxLjIwMyAtMS43ODEsMS4wOTggLTEuOTkyLDAuODg5IC0yLjIwMiwwLjY4IC0yLjMzNywwLjM4MyAtMi4zOTYsMCBaIG0gLTIuNDIxLC0wLjc2NiBjIDAuMDIxLC0wLjI3MSAwLjA2OCwtMC41MDUgMC4xNDQsLTAuNzAzIDAuMDc1LC0wLjE5NSAwLjE3NCwtMC4zNTkgMC4yOTgsLTAuNDg4IDAuMTI0LC0wLjEyNyAwLjI3LC0wLjIyMyAwLjQ0LC0wLjI4NyAwLjE2OSwtMC4wNjMgMC4zNTYsLTAuMDk2IDAuNTYyLC0wLjA5NiAwLjIwNiwwIDAuMzgzLDAuMDI2IDAuNTMzLDAuMDcyIDAuMTQ4LDAuMDQ5IDAuMjc5LDAuMTAyIDAuMzksMC4xNjEgMC4xMTIsMC4wNTggMC4yMDksMC4xMTEgMC4yOTMsMC4xNTggMC4wODQsMC4wNDkgMC4xNjUsMC4wNzIgMC4yNDQsMC4wNzIgMC4xMDYsMCAwLjE4NSwtMC4wMzkgMC4yMzcsLTAuMTE3IEwgMS4wODUsLTIuNDU3IEMgMC45NDQsLTIuNjIxIDAuNzg2LC0yLjc2IDAuNjExLC0yLjg3MSAwLjQzNywtMi45ODIgMC4yNTQsLTMuMDcyIDAuMDY0LC0zLjEzOSAtMC4xMjYsLTMuMjA1IC0wLjMxOSwtMy4yNTIgLTAuNTE3LC0zLjI3OSAtMC43MTQsLTMuMzA3IC0wLjkwNCwtMy4zMiAtMS4wOSwtMy4zMiBjIC0wLjM2NiwwIC0wLjcwNywwLjA2IC0xLjAyMiwwLjE4MSAtMC4zMTYsMC4xMjEgLTAuNTksMC4zMDMgLTAuODIzLDAuNTQxIC0wLjIzMywwLjIzNyAtMC40MTcsMC41MzIgLTAuNTUsMC44ODMgLTAuMTMzLDAuMzUyIC0wLjIwMSwwLjc1OCAtMC4yMDEsMS4yMjEgMCwwLjM1OSAwLjA1OSwwLjY5OSAwLjE3NSwxLjAxNSAwLjExNiwwLjMxNyAwLjI4MywwLjU5MiAwLjUwMSwwLjgyOSAwLjIxOCwwLjIzNCAwLjQ4NCwwLjQyIDAuNzk3LDAuNTU2IDAuMzE0LDAuMTM3IDAuNjY3LDAuMjA1IDEuMDYyLDAuMjA1IDAuMzMyLDAgMC42MzgsLTAuMDUyIDAuOTIsLTAuMTU4IEMgMC4wNSwxLjg0NiAwLjI5MSwxLjY5MSAwLjQ5MywxLjQ4OCAwLjY5NSwxLjI4MyAwLjg1NCwxLjAzMyAwLjk2OSwwLjczNiAxLjA4NCwwLjQ0MSAxLjE0MSwwLjEwMiAxLjE0MSwtMC4yNzcgMS4xNDEsLTAuNDcxIDEuMTIsLTAuNiAxLjA3OSwtMC42NjYgYyAtMC4wNDEsLTAuMDY2IC0wLjEyLC0wLjEgLTAuMjM2LC0wLjEgeiIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjMuMjEwOSw3LjQ2ODQpIiBpZD0iZzk4Ij48cGF0aCBpZD0icGF0aDEwMCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgLTEuNjc2LC01LjI3MyBoIC0xLjAxNyBjIC0wLjExOCwwIC0wLjE5OCwwLjA3NiAtMC4yNDMsMC4yMjYgbCAtMC45NDUsMy4wNDkgYyAtMC4wMzEsMC4xMDIgLTAuMDU5LDAuMjAzIC0wLjA4NSwwLjMwNSAtMC4wMjUsMC4xMDEgLTAuMDQ3LDAuMjAzIC0wLjA2NCwwLjMwNiAtMC4wMjEsLTAuMTAzIC0wLjA0NCwtMC4yMDcgLTAuMDcsLTAuMzEgLTAuMDI1LC0wLjEwNiAtMC4wNTMsLTAuMjA5IC0wLjA4NSwtMC4zMTMgbCAtMC45NjEsLTMuMDM3IGMgLTAuMDQxLC0wLjE1IC0wLjEzMSwtMC4yMjYgLTAuMjcyLC0wLjIyNiBIIC02LjM5NSBMIC04LjA2NSwwIGggMS4wMTIgYyAwLjA5MywwIDAuMTcyLC0wLjAyMSAwLjIzNywtMC4wNjYgMC4wNjUsLTAuMDQ1IDAuMTA4LC0wLjEwMiAwLjEyOSwtMC4xNyBsIDAuNzU1LC0yLjgxNyBjIDAuMDM3LC0wLjE1NCAwLjA3MiwtMC4zMDQgMC4xLC0wLjQ1MSAwLjAyOSwtMC4xNDggMC4wNTUsLTAuMjk1IDAuMDc1LC0wLjQ0MyAwLjAzNywwLjE0OCAwLjA3OCwwLjI5NSAwLjEyLDAuNDQzIDAuMDQzLDAuMTQ3IDAuMDg5LDAuMjk3IDAuMTM3LDAuNDUxIGwgMC44NzQsMi44MjggYyAwLjAyMSwwLjA2OSAwLjA2MSwwLjEyNSAwLjEyLDAuMTY4IDAuMDYxLDAuMDQ1IDAuMTMzLDAuMDY5IDAuMjE5LDAuMDY5IGggMC41NiBjIDAuMDg5LDAgMC4xNjUsLTAuMDI0IDAuMjI5LC0wLjA2OSAwLjA2MywtMC4wNDMgMC4xMDUsLTAuMDk5IDAuMTI2LC0wLjE2OCBsIDAuODQ4LC0yLjgyOCBjIDAuMDQ1LC0wLjE1NCAwLjA4NiwtMC4zMDQgMC4xMjYsLTAuNDU1IDAuMDQsLTAuMTQ4IDAuMDc4LC0wLjI5NyAwLjExNiwtMC40NDMgMC4wNDQsMC4yOTEgMC4xMDcsMC41OSAwLjE5LDAuODk4IGwgMC43NzYsMi44MTcgYyAwLjAyNCwwLjA2OCAwLjA2NywwLjEyNSAwLjEyOSwwLjE3IEMgLTEuMTI2LC0wLjAyMSAtMS4wNTMsMCAtMC45NjcsMCBaIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2Ny4yMzczLDUuNDM5MSkiIGlkPSJnMTAyIj48cGF0aCBpZD0icGF0aDEwNCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0iTSAwLDAgQyAwLDAuMTY0IC0wLjAyMiwwLjMxOCAtMC4wNjksMC40NjUgLTAuMTE1LDAuNjExIC0wLjE4NSwwLjczOCAtMC4yNzcsMC44NDggLTAuMzcsMC45NTcgLTAuNDg3LDEuMDQzIC0wLjYyOSwxLjEwNyAtMC43NzEsMS4xNyAtMC45MzcsMS4yMDMgLTEuMTI1LDEuMjAzIC0xLjQ5MiwxLjIwMyAtMS43OCwxLjA5OCAtMS45OTEsMC44ODkgLTIuMjAyLDAuNjggLTIuMzM3LDAuMzgzIC0yLjM5NSwwIFogbSAtMi40MjEsLTAuNzY2IGMgMC4wMjEsLTAuMjcxIDAuMDY5LC0wLjUwNSAwLjE0NSwtMC43MDMgMC4wNzUsLTAuMTk1IDAuMTc0LC0wLjM1OSAwLjI5NywtMC40ODggMC4xMjQsLTAuMTI3IDAuMjcsLTAuMjIzIDAuNDQsLTAuMjg3IDAuMTcsLTAuMDYzIDAuMzU3LC0wLjA5NiAwLjU2MiwtMC4wOTYgMC4yMDYsMCAwLjM4NCwwLjAyNiAwLjUzMywwLjA3MiAwLjE0OSwwLjA0OSAwLjI3OSwwLjEwMiAwLjM5LDAuMTYxIDAuMTEyLDAuMDU4IDAuMjA5LDAuMTExIDAuMjkzLDAuMTU4IDAuMDg0LDAuMDQ5IDAuMTY1LDAuMDcyIDAuMjQ0LDAuMDcyIDAuMTA3LDAgMC4xODYsLTAuMDM5IDAuMjM3LC0wLjExNyBMIDEuMDg1LC0yLjQ1NyBDIDAuOTQ0LC0yLjYyMSAwLjc4NywtMi43NiAwLjYxMiwtMi44NzEgMC40MzcsLTIuOTgyIDAuMjU1LC0zLjA3MiAwLjA2NCwtMy4xMzkgLTAuMTI1LC0zLjIwNSAtMC4zMTksLTMuMjUyIC0wLjUxNywtMy4yNzkgLTAuNzEzLC0zLjMwNyAtMC45MDQsLTMuMzIgLTEuMDg5LC0zLjMyIGMgLTAuMzY3LDAgLTAuNzA4LDAuMDYgLTEuMDIzLDAuMTgxIC0wLjMxNiwwLjEyMSAtMC41ODksMC4zMDMgLTAuODIzLDAuNTQxIC0wLjIzMywwLjIzNyAtMC40MTYsMC41MzIgLTAuNTQ5LDAuODgzIC0wLjEzNCwwLjM1MiAtMC4yMDEsMC43NTggLTAuMjAxLDEuMjIxIDAsMC4zNTkgMC4wNTgsMC42OTkgMC4xNzUsMS4wMTUgMC4xMTYsMC4zMTcgMC4yODMsMC41OTIgMC41MDEsMC44MjkgMC4yMTgsMC4yMzQgMC40ODQsMC40MiAwLjc5NywwLjU1NiAwLjMxNCwwLjEzNyAwLjY2NywwLjIwNSAxLjA2MSwwLjIwNSAwLjMzMywwIDAuNjM5LC0wLjA1MiAwLjkyMSwtMC4xNTggQyAwLjA1LDEuODQ2IDAuMjkyLDEuNjkxIDAuNDk0LDEuNDg4IDAuNjk2LDEuMjgzIDAuODU0LDEuMDMzIDAuOTcsMC43MzYgMS4wODQsMC40NDEgMS4xNDIsMC4xMDIgMS4xNDIsLTAuMjc3IDEuMTQyLC0wLjQ3MSAxLjEyMSwtMC42IDEuMDgsLTAuNjY2IDEuMDM5LC0wLjczMiAwLjk2LC0wLjc2NiAwLjg0NCwtMC43NjYgWiIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNzAuNTk4NiwzLjU2MjEpIiBpZD0iZzEwNiI+PHBhdGggaWQ9InBhdGgxMDgiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGMgMC4xNDUsLTAuMTc0IDAuMzAxLC0wLjI5NyAwLjQ3MSwtMC4zNjkgMC4xNywtMC4wNzIgMC4zNDgsLTAuMTA4IDAuNTM3LC0wLjEwOCAwLjE5NSwwIDAuMzcxLDAuMDM2IDAuNTI3LDAuMTA0IDAuMTU1LDAuMDcgMC4yODgsMC4xODIgMC4zOTgsMC4zMyAwLjExLDAuMTQ4IDAuMTk0LDAuMzQgMC4yNTIsMC41NyAwLjA1OCwwLjIzMSAwLjA4NywwLjUwOCAwLjA4NywwLjgzIDAsMC41OCAtMC4wOTUsMC45OTggLTAuMjg4LDEuMjU2IEMgMS43OTMsMi44NzMgMS41MTcsMy4wMDIgMS4xNTcsMy4wMDIgMC45MTMsMy4wMDIgMC43MDEsMi45NDcgMC41MiwyLjgzNiAwLjMzOCwyLjcyNSAwLjE2NSwyLjU2NiAwLDIuMzY1IFogbSAwLDMuMjYgYyAwLjIxMywwLjIyMiAwLjQ0OCwwLjQgMC43MDcsMC41MzEgMC4yNTksMC4xMzMgMC41NTUsMC4xOTcgMC44ODcsMC4xOTcgMC4zMDQsMCAwLjU4LC0wLjA1OCAwLjgyNSwtMC4xNzkgQyAyLjY2NCwzLjY4OSAyLjg3MywzLjUxOCAzLjA0NiwzLjI5MyAzLjIxOSwzLjA2OCAzLjM1MiwyLjc5NyAzLjQ0NCwyLjQ3OSAzLjUzNywyLjE2IDMuNTgzLDEuODAxIDMuNTgzLDEuNDA0IDMuNTgzLDAuOTc1IDMuNTMsMC41ODYgMy40MjQsMC4yMzYgMy4zMTcsLTAuMTEzIDMuMTY2LC0wLjQxMiAyLjk2OSwtMC42NiAyLjc3MSwtMC45MDggMi41MzQsLTEuMTAyIDIuMjU3LC0xLjIzOCAxLjk3OSwtMS4zNzUgMS42NzEsLTEuNDQzIDEuMzMyLC0xLjQ0MyBjIC0wLjE2NSwwIC0wLjMxMywwLjAxNSAtMC40NDcsMC4wNDggLTAuMTM0LDAuMDMyIC0wLjI1NywwLjA3OSAtMC4zNywwLjEzNyAtMC4xMTQsMC4wNTcgLTAuMjE3LDAuMTI5IC0wLjMxMiwwLjIxMyAtMC4wOTQsMC4wODQgLTAuMTgzLDAuMTc4IC0wLjI2OSwwLjI3OSBsIC0wLjA1NywtMC4zNTMgYyAtMC4wMjEsLTAuMDkgLTAuMDU2LC0wLjE1NCAtMC4xMDYsLTAuMTkyIC0wLjA0OSwtMC4wMzcgLTAuMTE3LC0wLjA1NiAtMC4yMDMsLTAuMDU2IEggLTEuMjcgViA2LjI3MSBIIDAgWiIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNzguMzgwOSw2LjQ0MSkiIGlkPSJnMTEwIj48cGF0aCBpZD0icGF0aDExMiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAtMC4wMzQsLTAuMDU1IC0wLjA3LC0wLjA5NCAtMC4xMDcsLTAuMTE1IC0wLjAzOSwtMC4wMjQgLTAuMDg2LC0wLjAzMyAtMC4xNDUsLTAuMDMzIC0wLjA2MSwwIC0wLjEyNywwLjAxNSAtMC4xOTcsMC4wNSAtMC4wNzEsMC4wMzYgLTAuMTUzLDAuMDczIC0wLjI0NCwwLjExNiAtMC4wOTMsMC4wNDMgLTAuMTk5LDAuMDgyIC0wLjMxNywwLjExNSAtMC4xMTgsMC4wMzUgLTAuMjU4LDAuMDUzIC0wLjQxOSwwLjA1MyAtMC4yNSwwIC0wLjQ0NiwtMC4wNTMgLTAuNTg5LC0wLjE2MSAtMC4xNDEsLTAuMTA1IC0wLjIxMiwtMC4yNDQgLTAuMjEyLC0wLjQxNiAwLC0wLjExMyAwLjAzNywtMC4yMDkgMC4xMSwtMC4yODUgMC4wNzQsLTAuMDc4IDAuMTcyLC0wLjE0NCAwLjI5MywtMC4yMDMgMC4xMjIsLTAuMDU4IDAuMjYsLTAuMTExIDAuNDE0LC0wLjE1NiAwLjE1NCwtMC4wNDcgMC4zMSwtMC4wOTggMC40NywtMC4xNTIgMC4xNiwtMC4wNTUgMC4zMTYsLTAuMTE4IDAuNDcsLTAuMTg4IDAuMTU1LC0wLjA3IDAuMjkyLC0wLjE2IDAuNDE0LC0wLjI2OCAwLjEyMSwtMC4xMDcgMC4yMTksLTAuMjM2IDAuMjkzLC0wLjM4NiAwLjA3NCwtMC4xNTMgMC4xMTEsLTAuMzM0IDAuMTExLC0wLjU0NSAwLC0wLjI1NCAtMC4wNDYsLTAuNDg5IC0wLjEzNywtMC43MDMgLTAuMDkxLC0wLjIxMyAtMC4yMjUsLTAuMzk5IC0wLjQwMywtMC41NTUgLTAuMTc4LC0wLjE1NiAtMC4zOTksLTAuMjc3IC0wLjY2LC0wLjM2NSAtMC4yNjMsLTAuMDg2IC0wLjU2NSwtMC4xMzEgLTAuOTA4LC0wLjEzMSAtMC4xODEsMCAtMC4zNTksMC4wMTYgLTAuNTMyLDAuMDQ5IC0wLjE3MywwLjAzMyAtMC4zMzksMC4wNzggLTAuNDk4LDAuMTM2IC0wLjE2LDAuMDU5IC0wLjMwNywwLjEyNyAtMC40NDIsMC4yMDUgLTAuMTM2LDAuMDc5IC0wLjI1NSwwLjE2NSAtMC4zNTgsMC4yNTggbCAwLjI5MywwLjQ4MyBjIDAuMDM4LDAuMDU4IDAuMDgyLDAuMTAzIDAuMTM0LDAuMTM0IDAuMDUyLDAuMDMgMC4xMTYsMC4wNDUgMC4xOTUsMC4wNDUgMC4wNzksMCAwLjE1NCwtMC4wMjEgMC4yMjQsLTAuMDY2IDAuMDcsLTAuMDQ1IDAuMTUxLC0wLjA5MiAwLjI0NCwtMC4xNDUgMC4wOTMsLTAuMDUgMC4yMDEsLTAuMDk5IDAuMzI2LC0wLjE0MiAwLjEyNSwtMC4wNDUgMC4yODQsLTAuMDY4IDAuNDc2LC0wLjA2OCAwLjE1LDAgMC4yOCwwLjAxOSAwLjM4OCwwLjA1NCAwLjEwOCwwLjAzNSAwLjE5NywwLjA4NCAwLjI2NywwLjE0MSAwLjA3LDAuMDU4IDAuMTIyLDAuMTI3IDAuMTU0LDAuMjAzIDAuMDMzLDAuMDc4IDAuMDQ5LDAuMTU4IDAuMDQ5LDAuMjQgMCwwLjEyMyAtMC4wMzcsMC4yMjUgLTAuMTEsMC4zMDMgLTAuMDc0LDAuMDc4IC0wLjE3MiwwLjE0NiAtMC4yOTMsMC4yMDUgLTAuMTIyLDAuMDU5IC0wLjI2MSwwLjExMSAtMC40MTYsMC4xNTggLTAuMTU2LDAuMDQ1IC0wLjMxNiwwLjA5NiAtMC40NzksMC4xNTEgLTAuMTYzLDAuMDU0IC0wLjMyMiwwLjExOSAtMC40NzcsMC4xOTMgLTAuMTU2LDAuMDc0IC0wLjI5NSwwLjE2NiAtMC40MTcsMC4yNzkgLTAuMTIxLDAuMTE0IC0wLjIxOSwwLjI1MiAtMC4yOTMsMC40MTYgLTAuMDczLDAuMTY2IC0wLjExLDAuMzY0IC0wLjExLDAuNTk4IDAsMC4yMTUgMC4wNDIsMC40MjIgMC4xMjgsMC42MTcgMC4wODUsMC4xOTUgMC4yMTEsMC4zNjUgMC4zNzcsMC41MSAwLjE2NywwLjE0NiAwLjM3NCwwLjI2NCAwLjYyMiwwLjM1IDAuMjQ5LDAuMDg3IDAuNTM3LDAuMTMgMC44NjIsMC4xMyAwLjM2MywwIDAuNjk0LC0wLjA1OCAwLjk5MiwtMC4xNzkgMC4yOTgsLTAuMTE5IDAuNTQ2LC0wLjI3OCAwLjc0NSwtMC40NzMgeiIvPjwvZz48cGF0aCBpZD0icGF0aDExNCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAxODAuOTk3LDIuMTk1IGggLTEuMjc0IHYgNS4yNzMgaCAxLjI3NCB6IG0gMC4xNzUsNi44MSBjIDAsLTAuMTA5IC0wLjAyMywtMC4yMTIgLTAuMDY3LC0wLjMwOCAtMC4wNDQsLTAuMDk2IC0wLjEwMywtMC4xOCAtMC4xNzcsLTAuMjUyIC0wLjA3NCwtMC4wNyAtMC4xNiwtMC4xMjkgLTAuMjYsLTAuMTcyIC0wLjA5OSwtMC4wNDMgLTAuMjA1LC0wLjA2NCAtMC4zMTgsLTAuMDY0IC0wLjExLDAgLTAuMjEzLDAuMDIxIC0wLjMxMSwwLjA2NCAtMC4wOTgsMC4wNDMgLTAuMTgzLDAuMTAyIC0wLjI1NSwwLjE3MiAtMC4wNzIsMC4wNzIgLTAuMTI5LDAuMTU2IC0wLjE3MiwwLjI1MiAtMC4wNDMsMC4wOTYgLTAuMDY0LDAuMTk5IC0wLjA2NCwwLjMwOCAwLDAuMTE0IDAuMDIxLDAuMjE5IDAuMDY0LDAuMzE5IDAuMDQzLDAuMDk5IDAuMSwwLjE4NSAwLjE3MiwwLjI1OCAwLjA3MiwwLjA3MiAwLjE1NywwLjEyOSAwLjI1NSwwLjE3MiAwLjA5OCwwLjA0MiAwLjIwMSwwLjA2NCAwLjMxMSwwLjA2NCAwLjExMywwIDAuMjE5LC0wLjAyMiAwLjMxOCwtMC4wNjQgMC4xLC0wLjA0MyAwLjE4NiwtMC4xIDAuMjYsLTAuMTcyIDAuMDc0LC0wLjA3MyAwLjEzMywtMC4xNTkgMC4xNzcsLTAuMjU4IDAuMDQ0LC0wLjEgMC4wNjcsLTAuMjA1IDAuMDY3LC0wLjMxOSIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4NC4wNDc5LDIuMTEyOSkiIGlkPSJnMTE2Ij48cGF0aCBpZD0icGF0aDExOCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAtMC40NTksMCAtMC44MTEsMC4xMjkgLTEuMDU2LDAuMzg5IC0wLjI0NSwwLjI1NyAtMC4zNjgsMC42MTUgLTAuMzY4LDEuMDcyIHYgMi45NDMgaCAtMC41MzkgYyAtMC4wNjgsMCAtMC4xMjcsMC4wMjQgLTAuMTc1LDAuMDY5IC0wLjA0OCwwLjA0MyAtMC4wNzIsMC4xMTEgLTAuMDcyLDAuMTk5IHYgMC41MDQgbCAwLjg0OSwwLjEzOCAwLjI2NiwxLjQ0IGMgMC4wMTgsMC4wNjggMC4wNSwwLjEyMSAwLjA5OCwwLjE2IDAuMDQ4LDAuMDM3IDAuMTEsMC4wNTcgMC4xODUsMC4wNTcgaCAwLjY1OSBWIDUuMzExIEggMS4yNTUgViA0LjQwNCBIIC0wLjE1MyBWIDEuNTQ3IGMgMCwtMC4xNjQgMC4wNCwtMC4yOTMgMC4xMiwtMC4zODUgMC4wODEsLTAuMDkyIDAuMTkxLC0wLjEzOSAwLjMzMiwtMC4xMzkgMC4wNzgsMCAwLjE0NCwwLjAxIDAuMTk3LDAuMDI4IEMgMC41NSwxLjA3IDAuNTk2LDEuMDkgMC42MzUsMS4xMTEgMC42NzUsMS4xMzEgMC43MSwxLjE1IDAuNzQsMS4xNyAwLjc3MSwxLjE4NyAwLjgwMywxLjE5NyAwLjgzMywxLjE5NyAwLjg3MSwxLjE5NyAwLjkwMSwxLjE4NyAwLjkyNiwxLjE3IDAuOTQ5LDEuMTUgMC45NzYsMS4xMjMgMS4wMDMsMS4wODQgTCAxLjM4MywwLjQ2OSBDIDEuMTk4LDAuMzE0IDAuOTg1LDAuMTk3IDAuNzQ2LDAuMTE5IDAuNTA2LDAuMDM5IDAuMjU4LDAgMCwwIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4OS40Njc4LDUuNDM5MSkiIGlkPSJnMTIwIj48cGF0aCBpZD0icGF0aDEyMiIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0iTSAwLDAgQyAwLDAuMTY0IC0wLjAyMywwLjMxOCAtMC4wNjksMC40NjUgLTAuMTE1LDAuNjExIC0wLjE4NiwwLjczOCAtMC4yNzcsMC44NDggLTAuMzcsMC45NTcgLTAuNDg3LDEuMDQzIC0wLjYzLDEuMTA3IC0wLjc3MSwxLjE3IC0wLjkzNywxLjIwMyAtMS4xMjYsMS4yMDMgLTEuNDkyLDEuMjAzIC0xLjc4MSwxLjA5OCAtMS45OTIsMC44ODkgLTIuMjAyLDAuNjggLTIuMzM3LDAuMzgzIC0yLjM5NiwwIFogbSAtMi40MjEsLTAuNzY2IGMgMC4wMjEsLTAuMjcxIDAuMDY4LC0wLjUwNSAwLjE0NCwtMC43MDMgMC4wNzUsLTAuMTk1IDAuMTc0LC0wLjM1OSAwLjI5OCwtMC40ODggMC4xMjQsLTAuMTI3IDAuMjcsLTAuMjIzIDAuNDQsLTAuMjg3IDAuMTY5LC0wLjA2MyAwLjM1NiwtMC4wOTYgMC41NjIsLTAuMDk2IDAuMjA2LDAgMC4zODMsMC4wMjYgMC41MzMsMC4wNzIgMC4xNDgsMC4wNDkgMC4yNzksMC4xMDIgMC4zOSwwLjE2MSAwLjExMiwwLjA1OCAwLjIwOSwwLjExMSAwLjI5MywwLjE1OCAwLjA4NCwwLjA0OSAwLjE2NSwwLjA3MiAwLjI0NCwwLjA3MiAwLjEwNiwwIDAuMTg1LC0wLjAzOSAwLjIzNywtMC4xMTcgTCAxLjA4NSwtMi40NTcgQyAwLjk0NCwtMi42MjEgMC43ODYsLTIuNzYgMC42MTEsLTIuODcxIDAuNDM3LC0yLjk4MiAwLjI1NCwtMy4wNzIgMC4wNjQsLTMuMTM5IC0wLjEyNiwtMy4yMDUgLTAuMzE5LC0zLjI1MiAtMC41MTcsLTMuMjc5IC0wLjcxNCwtMy4zMDcgLTAuOTA0LC0zLjMyIC0xLjA5LC0zLjMyIGMgLTAuMzY2LDAgLTAuNzA3LDAuMDYgLTEuMDIyLDAuMTgxIC0wLjMxNiwwLjEyMSAtMC41OSwwLjMwMyAtMC44MjMsMC41NDEgLTAuMjMzLDAuMjM3IC0wLjQxNywwLjUzMiAtMC41NSwwLjg4MyAtMC4xMzMsMC4zNTIgLTAuMjAxLDAuNzU4IC0wLjIwMSwxLjIyMSAwLDAuMzU5IDAuMDU5LDAuNjk5IDAuMTc1LDEuMDE1IDAuMTE2LDAuMzE3IDAuMjgzLDAuNTkyIDAuNTAxLDAuODI5IDAuMjE4LDAuMjM0IDAuNDg0LDAuNDIgMC43OTcsMC41NTYgMC4zMTQsMC4xMzcgMC42NjcsMC4yMDUgMS4wNjIsMC4yMDUgMC4zMzIsMCAwLjYzOCwtMC4wNTIgMC45MiwtMC4xNTggQyAwLjA1LDEuODQ2IDAuMjkxLDEuNjkxIDAuNDkzLDEuNDg4IDAuNjk1LDEuMjgzIDAuODU0LDEuMDMzIDAuOTY5LDAuNzM2IDEuMDg0LDAuNDQxIDEuMTQxLDAuMTAyIDEuMTQxLC0wLjI3NyAxLjE0MSwtMC40NzEgMS4xMiwtMC42IDEuMDc5LC0wLjY2NiBjIC0wLjA0MSwtMC4wNjYgLTAuMTIsLTAuMSAtMC4yMzYsLTAuMSB6Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE5NC43NzczLDYuNDQxKSIgaWQ9ImcxMjQiPjxwYXRoIGlkPSJwYXRoMTI2IiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJtIDAsMCBjIC0wLjAzNCwtMC4wNTUgLTAuMDcsLTAuMDk0IC0wLjEwOCwtMC4xMTUgLTAuMDM4LC0wLjAyNCAtMC4wODYsLTAuMDMzIC0wLjE0NCwtMC4wMzMgLTAuMDYxLDAgLTAuMTI4LDAuMDE1IC0wLjE5OCwwLjA1IC0wLjA3MSwwLjAzNiAtMC4xNTIsMC4wNzMgLTAuMjQ0LDAuMTE2IC0wLjA5MywwLjA0MyAtMC4xOTgsMC4wODIgLTAuMzE3LDAuMTE1IC0wLjExOCwwLjAzNSAtMC4yNTgsMC4wNTMgLTAuNDE4LDAuMDUzIC0wLjI1MSwwIC0wLjQ0NywtMC4wNTMgLTAuNTg5LC0wLjE2MSAtMC4xNDIsLTAuMTA1IC0wLjIxMywtMC4yNDQgLTAuMjEzLC0wLjQxNiAwLC0wLjExMyAwLjAzNywtMC4yMDkgMC4xMTEsLTAuMjg1IDAuMDczLC0wLjA3OCAwLjE3MSwtMC4xNDQgMC4yOTMsLTAuMjAzIDAuMTIxLC0wLjA1OCAwLjI1OSwtMC4xMTEgMC40MTMsLTAuMTU2IDAuMTU0LC0wLjA0NyAwLjMxMSwtMC4wOTggMC40NzEsLTAuMTUyIDAuMTU5LC0wLjA1NSAwLjMxNiwtMC4xMTggMC40NywtMC4xODggMC4xNTQsLTAuMDcgMC4yOTIsLTAuMTYgMC40MTMsLTAuMjY4IDAuMTIyLC0wLjEwNyAwLjIyLC0wLjIzNiAwLjI5MywtMC4zODYgMC4wNzUsLTAuMTUzIDAuMTExLC0wLjMzNCAwLjExMSwtMC41NDUgMCwtMC4yNTQgLTAuMDQ1LC0wLjQ4OSAtMC4xMzYsLTAuNzAzIC0wLjA5MSwtMC4yMTMgLTAuMjI2LC0wLjM5OSAtMC40MDMsLTAuNTU1IC0wLjE3OSwtMC4xNTYgLTAuMzk5LC0wLjI3NyAtMC42NjEsLTAuMzY1IC0wLjI2MiwtMC4wODYgLTAuNTY1LC0wLjEzMSAtMC45MDgsLTAuMTMxIC0wLjE4MSwwIC0wLjM1OCwwLjAxNiAtMC41MzEsMC4wNDkgLTAuMTc0LDAuMDMzIC0wLjM0LDAuMDc4IC0wLjQ5OSwwLjEzNiAtMC4xNTksMC4wNTkgLTAuMzA3LDAuMTI3IC0wLjQ0MiwwLjIwNSAtMC4xMzUsMC4wNzkgLTAuMjU0LDAuMTY1IC0wLjM1NywwLjI1OCBsIDAuMjkzLDAuNDgzIGMgMC4wMzcsMC4wNTggMC4wODIsMC4xMDMgMC4xMzQsMC4xMzQgMC4wNTEsMC4wMyAwLjExNiwwLjA0NSAwLjE5NSwwLjA0NSAwLjA3OCwwIDAuMTU0LC0wLjAyMSAwLjIyMywtMC4wNjYgMC4wNywtMC4wNDUgMC4xNTIsLTAuMDkyIDAuMjQ0LC0wLjE0NSAwLjA5MywtMC4wNSAwLjIwMiwtMC4wOTkgMC4zMjcsLTAuMTQyIDAuMTI1LC0wLjA0NSAwLjI4MywtMC4wNjggMC40NzYsLTAuMDY4IDAuMTUsMCAwLjI3OSwwLjAxOSAwLjM4OCwwLjA1NCAwLjEwNywwLjAzNSAwLjE5NywwLjA4NCAwLjI2NywwLjE0MSAwLjA3LDAuMDU4IDAuMTIxLDAuMTI3IDAuMTU0LDAuMjAzIDAuMDMzLDAuMDc4IDAuMDQ5LDAuMTU4IDAuMDQ5LDAuMjQgMCwwLjEyMyAtMC4wMzcsMC4yMjUgLTAuMTExLDAuMzAzIC0wLjA3MywwLjA3OCAtMC4xNzEsMC4xNDYgLTAuMjkzLDAuMjA1IC0wLjEyMSwwLjA1OSAtMC4yNiwwLjExMSAtMC40MTYsMC4xNTggLTAuMTU2LDAuMDQ1IC0wLjMxNiwwLjA5NiAtMC40NzgsMC4xNTEgLTAuMTYzLDAuMDU0IC0wLjMyMiwwLjExOSAtMC40NzgsMC4xOTMgLTAuMTU2LDAuMDc0IC0wLjI5NSwwLjE2NiAtMC40MTYsMC4yNzkgLTAuMTIyLDAuMTE0IC0wLjIyLDAuMjUyIC0wLjI5MywwLjQxNiAtMC4wNzQsMC4xNjYgLTAuMTEsMC4zNjQgLTAuMTEsMC41OTggMCwwLjIxNSAwLjA0MiwwLjQyMiAwLjEyNywwLjYxNyAwLjA4NiwwLjE5NSAwLjIxMiwwLjM2NSAwLjM3OCwwLjUxIDAuMTY2LDAuMTQ2IDAuMzczLDAuMjY0IDAuNjIyLDAuMzUgMC4yNDgsMC4wODcgMC41MzYsMC4xMyAwLjg2MSwwLjEzIDAuMzYzLDAgMC42OTQsLTAuMDU4IDAuOTkyLC0wLjE3OSAwLjI5OSwtMC4xMTkgMC41NDcsLTAuMjc4IDAuNzQ1LC0wLjQ3MyB6Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc3LjYxMTgsMzAuMjkwMSkiIGlkPSJnMTI4Ij48cGF0aCBpZD0icGF0aDEzMCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAwLDAgYyAwLDEuMzk0IC0wLjE4NSwyLjY0NSAtMC41NTMsMy43NTEgLTAuMzcsMS4xMDcgLTAuOTAzLDIuMDQ0IC0xLjYsMi44MTEgLTAuNjk3LDAuNzY4IC0xLjU0LDEuMzU2IC0yLjUzLDEuNzY3IC0wLjk5LDAuNDEgLTIuMTA2LDAuNjE0IC0zLjM0NywwLjYxNCBoIC00LjkzOCBWIC04Ljk0NCBoIDQuOTM4IGMgMS4yNDEsMCAyLjM1NywwLjIwNSAzLjM0NywwLjYxNSAwLjk5LDAuNDExIDEuODMzLDAuOTk4IDIuNTMsMS43NjYgMC42OTcsMC43NjggMS4yMywxLjcwNCAxLjYsMi44MTIgQyAtMC4xODUsLTIuNjQ1IDAsLTEuMzk0IDAsMCBNIDQuODUsMCBDIDQuODUsLTEuODYzIDQuNTM5LC0zLjU3MyAzLjkxOCwtNS4xMzEgMy4yOTcsLTYuNjg5IDIuNDI1LC04LjAzIDEuMywtOS4xNTUgYyAtMS4xMjQsLTEuMTI0IC0yLjQ3OCwtMS45OTcgLTQuMDU5LC0yLjYxOCAtMS41ODEsLTAuNjIxIC0zLjMzOCwtMC45MzEgLTUuMjcxLC0wLjkzMSBoIC05LjY4MiB2IDI1LjQwOCBoIDkuNjgyIGMgMS45MzMsMCAzLjY5LC0wLjMxNCA1LjI3MSwtMC45NCBDIC0xLjE3OCwxMS4xMzcgMC4xNzYsMTAuMjY0IDEuMyw5LjE0NiAyLjQyNSw4LjAyNyAzLjI5Nyw2LjY4OCAzLjkxOCw1LjEzMSA0LjUzOSwzLjU3MyA0Ljg1LDEuODYyIDQuODUsMCIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4OS43MTgzLDMyLjQ4NjQpIiBpZD0iZzEzMiI+PHBhdGggaWQ9InBhdGgxMzQiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Ik0gMCwwIEMgMC41NjIsMS4wNzggMS4yMywxLjkyNCAyLjAwNCwyLjUzOSAyLjc3NywzLjE1NCAzLjY5LDMuNDYxIDQuNzQ1LDMuNDYxIDUuNTc2LDMuNDYxIDYuMjQ0LDMuMjggNi43NDgsMi45MTcgTCA2LjQ2NiwtMC4zMzQgQyA2LjQwOCwtMC41NDUgNi4zMjMsLTAuNjk0IDYuMjExLC0wLjc4MiA2LjEsLTAuODcgNS45NTEsLTAuOTE0IDUuNzY0LC0wLjkxNCBjIC0wLjE3NiwwIC0wLjQzNywwLjAzIC0wLjc4MiwwLjA4OCAtMC4zNDYsMC4wNTkgLTAuNjgyLDAuMDg4IC0xLjAxLDAuMDg4IC0wLjQ4MSwwIC0wLjkwOSwtMC4wNyAtMS4yODMsLTAuMjExIEMgMi4zMTQsLTEuMDg5IDEuOTc4LC0xLjI5MiAxLjY3OSwtMS41NTUgMS4zOCwtMS44MTkgMS4xMTYsLTIuMTM4IDAuODg4LC0yLjUxMyAwLjY2LC0yLjg4OCAwLjQ0NSwtMy4zMTUgMC4yNDcsLTMuNzk1IFYgLTE0LjkgSCAtNC4wOTQgViAzLjEyNyBoIDIuNTQ4IGMgMC40NDUsMCAwLjc1NiwtMC4wNzggMC45MzEsLTAuMjM3IDAuMTc3LC0wLjE1OCAwLjI5MywtMC40NDIgMC4zNTIsLTAuODUyIHoiLz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTA2LjIwMDIsMjAuNjYwOCkiIGlkPSJnMTM2Ij48cGF0aCBpZD0icGF0aDEzOCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0iTSAwLDAgQyAxLjQ5OSwwIDIuNjA4LDAuNTA0IDMuMzI5LDEuNTEyIDQuMDUsMi41MTkgNC40MSwzLjk5NSA0LjQxLDUuOTM5IDQuNDEsNy44ODQgNC4wNSw5LjM2NiAzLjMyOSwxMC4zODUgMi42MDgsMTEuNDA0IDEuNDk5LDExLjkxNCAwLDExLjkxNCBjIC0xLjUyMywwIC0yLjY1LC0wLjUxMyAtMy4zODMsLTEuNTM4IEMgLTQuMTE1LDkuMzUxIC00LjQ4LDcuODcyIC00LjQ4LDUuOTM5IC00LjQ4LDQuMDA3IC00LjExNSwyLjUzMyAtMy4zODMsMS41MjEgLTIuNjUsMC41MDcgLTEuNTIzLDAgMCwwIG0gMCwxNS4yMzQgYyAxLjMzNSwwIDIuNTUxLC0wLjIxNiAzLjY0NiwtMC42NSBDIDQuNzQxLDE0LjE1MSA1LjY3OCwxMy41MzYgNi40NTcsMTIuNzM5IDcuMjM2LDExLjk0MiA3LjgzNiwxMC45NyA4LjI1OCw5LjgyMyA4LjY4LDguNjc0IDguODkxLDcuMzkyIDguODkxLDUuOTc1IDguODkxLDQuNTQ1IDguNjgsMy4yNTcgOC4yNTgsMi4xMDggNy44MzYsMC45NjEgNy4yMzYsLTAuMDE4IDYuNDU3LC0wLjgyNSA1LjY3OCwtMS42MzQgNC43NDEsLTIuMjU1IDMuNjQ2LC0yLjY4OCAyLjU1MSwtMy4xMjEgMS4zMzUsLTMuMzM4IDAsLTMuMzM4IGMgLTEuMzQ4LDAgLTIuNTcxLDAuMjE3IC0zLjY3MywwLjY1IC0xLjEwMSwwLjQzMyAtMi4wNDEsMS4wNTQgLTIuODIsMS44NjMgLTAuNzc4LDAuODA3IC0xLjM4MiwxLjc4NiAtMS44MDksMi45MzMgLTAuNDI4LDEuMTQ5IC0wLjY0MiwyLjQzNyAtMC42NDIsMy44NjcgMCwxLjQxNyAwLjIxNCwyLjY5OSAwLjY0MiwzLjg0OCAwLjQyNywxLjE0NyAxLjAzMSwyLjExOSAxLjgwOSwyLjkxNiAwLjc3OSwwLjc5NyAxLjcxOSwxLjQxMiAyLjgyLDEuODQ1IDEuMTAyLDAuNDM0IDIuMzI1LDAuNjUgMy42NzMsMC42NSIvPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjYuMzg4NywyMC42NjA4KSIgaWQ9ImcxNDAiPjxwYXRoIGlkPSJwYXRoMTQyIiBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiBkPSJtIDAsMCBjIDEuNDk5LDAgMi42MDksMC41MDQgMy4zMywxLjUxMiAwLjcyMSwxLjAwNyAxLjA4LDIuNDgzIDEuMDgsNC40MjcgMCwxLjk0NSAtMC4zNTksMy40MjcgLTEuMDgsNC40NDYgLTAuNzIxLDEuMDE5IC0xLjgzMSwxLjUyOSAtMy4zMywxLjUyOSAtMS41MjIsMCAtMi42NSwtMC41MTMgLTMuMzgyLC0xLjUzOCBDIC00LjExNSw5LjM1MSAtNC40OCw3Ljg3MiAtNC40OCw1LjkzOSAtNC40OCw0LjAwNyAtNC4xMTUsMi41MzMgLTMuMzgyLDEuNTIxIC0yLjY1LDAuNTA3IC0xLjUyMiwwIDAsMCBtIDAsMTUuMjM0IGMgMS4zMzYsMCAyLjU1MSwtMC4yMTYgMy42NDYsLTAuNjUgQyA0Ljc0MSwxNC4xNTEgNS42NzgsMTMuNTM2IDYuNDU4LDEyLjczOSA3LjIzNiwxMS45NDIgNy44MzcsMTAuOTcgOC4yNTgsOS44MjMgOC42OCw4LjY3NCA4Ljg5MSw3LjM5MiA4Ljg5MSw1Ljk3NSA4Ljg5MSw0LjU0NSA4LjY4LDMuMjU3IDguMjU4LDIuMTA4IDcuODM3LDAuOTYxIDcuMjM2LC0wLjAxOCA2LjQ1OCwtMC44MjUgNS42NzgsLTEuNjM0IDQuNzQxLC0yLjI1NSAzLjY0NiwtMi42ODggMi41NTEsLTMuMTIxIDEuMzM2LC0zLjMzOCAwLC0zLjMzOCBjIC0xLjM0OCwwIC0yLjU3MSwwLjIxNyAtMy42NzMsMC42NSAtMS4xLDAuNDMzIC0yLjA0MSwxLjA1NCAtMi44MTksMS44NjMgLTAuNzc5LDAuODA3IC0xLjM4MywxLjc4NiAtMS44MSwyLjkzMyAtMC40MjgsMS4xNDkgLTAuNjQyLDIuNDM3IC0wLjY0MiwzLjg2NyAwLDEuNDE3IDAuMjE0LDIuNjk5IDAuNjQyLDMuODQ4IDAuNDI3LDEuMTQ3IDEuMDMxLDIuMTE5IDEuODEsMi45MTYgMC43NzgsMC43OTcgMS43MTksMS40MTIgMi44MTksMS44NDUgMS4xMDIsMC40MzQgMi4zMjUsMC42NSAzLjY3MywwLjY1Ii8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE0Mi45NDA0LDIyLjI2MDQpIiBpZD0iZzE0NCI+PHBhdGggaWQ9InBhdGgxNDYiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Im0gMCwwIGMgMC40OTIsLTAuNTk4IDEuMDI4LC0xLjAyIDEuNjA3LC0xLjI2NiAwLjU4MSwtMC4yNDYgMS4yMSwtMC4zNjkgMS44ODksLTAuMzY5IDAuNjU2LDAgMS4yNDgsMC4xMjMgMS43NzUsMC4zNjkgMC41MjcsMC4yNDYgMC45NzUsMC42MjEgMS4zNDQsMS4xMjUgMC4zNjksMC41MDMgMC42NTQsMS4xMzkgMC44NTMsMS45MDcgMC4xOTksMC43NjYgMC4yOTksMS42NzIgMC4yOTksMi43MTQgMCwxLjA1NSAtMC4wODYsMS45NDggLTAuMjU1LDIuNjggQyA3LjM0Miw3Ljg5MiA3LjA5OSw4LjQ4NiA2Ljc4Miw4Ljk0MyA2LjQ2Niw5LjQgNi4wODIsOS43MzQgNS42MzEsOS45NDUgNS4xODEsMTAuMTU2IDQuNjY4LDEwLjI2MSA0LjA5NSwxMC4yNjEgMy4xOTIsMTAuMjYxIDIuNDI1LDEwLjA3MSAxLjc5Miw5LjY5IDEuMTU5LDkuMzA5IDAuNTYyLDguNzczIDAsOC4wODMgWiBtIC0wLjIyOSwxMC44OTQgYyAwLjczOSwwLjgzMSAxLjU3NiwxLjUwNCAyLjUxMywyLjAyMSAwLjkzNywwLjUxNSAyLjAzOCwwLjc3MyAzLjMwMywwLjc3MyAwLjk4NCwwIDEuODgzLC0wLjIwNiAyLjY5NywtMC42MTYgMC44MTUsLTAuNDA5IDEuNTE4LC0xLjAwNCAyLjEwOSwtMS43ODMgQyAxMC45ODQsMTAuNTEgMTEuNDQxLDkuNTUgMTEuNzY0LDguNDA3IDEyLjA4NSw3LjI2NSAxMi4yNDcsNS45NTYgMTIuMjQ3LDQuNDggMTIuMjQ3LDMuMTMzIDEyLjA2NCwxLjg4NiAxMS43MDIsMC43MzcgMTEuMzM5LC0wLjQxIDEwLjgyLC0xLjQwNiAxMC4xNDcsLTIuMjQ5IDkuNDc0LC0zLjA5MyA4LjY1OSwtMy43NTIgNy43MDUsLTQuMjI3IDYuNzUsLTQuNyA1LjY4MSwtNC45MzcgNC40OTgsLTQuOTM3IDMuNDkxLC00LjkzNyAyLjYzLC00Ljc4MiAxLjkxNSwtNC40NzMgMS4yLC00LjE2MiAwLjU2MiwtMy43MzEgMCwtMy4xODEgdiAtNy4zOCBoIC00LjM0IHYgMjMuOTE1IGggMi42NTMgYyAwLjU2MiwwIDAuOTMxLC0wLjI2NCAxLjEwNywtMC43OTEgeiIvPjwvZz48cGF0aCBpZD0icGF0aDE0OCIgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgZD0ibSAxNjIuOTU0LDE3LjU4NyBoIC00LjM0MSB2IDI2LjExIGggNC4zNDEgeiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE3OC45MDgyLDI4LjY3MzQpIiBpZD0iZzE1MCI+PHBhdGggaWQ9InBhdGgxNTIiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Ik0gMCwwIEMgMCwwLjU2MiAtMC4wOCwxLjA5MiAtMC4yMzcsMS41OSAtMC4zOTYsMi4wODggLTAuNjMzLDIuNTI0IC0wLjk0OSwyLjg5OSAtMS4yNjYsMy4yNzQgLTEuNjY3LDMuNTcgLTIuMTUzLDMuNzg3IC0yLjY0LDQuMDAzIC0zLjIwNCw0LjExMiAtMy44NDksNC4xMTIgLTUuMTAzLDQuMTEyIC02LjA4OSwzLjc1NCAtNi44MSwzLjA0IC03LjUyOSwyLjMyNSAtNy45ODksMS4zMTIgLTguMTg4LDAgWiBtIC04LjI3NiwtMi42MTggYyAwLjA3LC0wLjkyNiAwLjIzNCwtMS43MjUgMC40OTIsLTIuMzk5IDAuMjU3LC0wLjY3MyAwLjU5NywtMS4yMjkgMS4wMTgsLTEuNjY5IDAuNDIyLC0wLjQzOSAwLjkyMiwtMC43NjcgMS41MDIsLTAuOTg0IDAuNTgsLTAuMjE3IDEuMjIyLC0wLjMyNSAxLjkyNSwtMC4zMjUgMC43MDIsMCAxLjMwOSwwLjA4MiAxLjgxOCwwLjI0NiAwLjUxLDAuMTY0IDAuOTU2LDAuMzQ2IDEuMzM2LDAuNTQ1IDAuMzgsMC4xOTkgMC43MTQsMC4zODEgMS4wMDEsMC41NDUgMC4yODgsMC4xNjQgMC41NjUsMC4yNDYgMC44MzUsMC4yNDYgMC4zNjMsMCAwLjYzMiwtMC4xMzUgMC44MDksLTAuNDA0IGwgMS4yNDcsLTEuNTgyIGMgLTAuNDgsLTAuNTYyIC0xLjAxOSwtMS4wMzQgLTEuNjE2LC0xLjQxNCAtMC41OTksLTAuMzgxIC0xLjIyMiwtMC42ODYgLTEuODcyLC0wLjkxNCAtMC42NTEsLTAuMjI4IC0xLjMxMiwtMC4zODkgLTEuOTg2LC0wLjQ4MyAtMC42NzMsLTAuMDk0IC0xLjMyNiwtMC4xNDEgLTEuOTU5LC0wLjE0MSAtMS4yNTMsMCAtMi40MTksMC4yMDggLTMuNDk2LDAuNjI0IC0xLjA3OSwwLjQxNSAtMi4wMTUsMS4wMzEgLTIuODExLDEuODQ1IC0wLjc5OCwwLjgxNCAtMS40MjQsMS44MjEgLTEuODgxLDMuMDIyIC0wLjQ1NiwxLjIwMSAtMC42ODYsMi41OTIgLTAuNjg2LDQuMTczIDAsMS4yMyAwLjIwMSwyLjM4NyAwLjU5OSwzLjQ3IDAuMzk3LDEuMDg0IDAuOTY5LDIuMDI3IDEuNzEzLDIuODI5IDAuNzQzLDAuODAzIDEuNjUxLDEuNDM4IDIuNzI0LDEuOTA3IDEuMDcxLDAuNDY4IDIuMjgsMC43MDMgMy42MjcsMC43MDMgMS4xMzYsMCAyLjE4NSwtMC4xODIgMy4xNDYsLTAuNTQ1IEMgMC4xNjksNi4zMTQgMC45OTUsNS43ODQgMS42ODcsNS4wODcgMi4zNzcsNC4zOSAyLjkxOSwzLjUzNSAzLjMxMiwyLjUyMSAzLjcwNCwxLjUwOCAzLjksMC4zNTIgMy45LC0wLjk0OSAzLjksLTEuNjA1IDMuODMsLTIuMDQ3IDMuNjg5LC0yLjI3NSAzLjU0OSwtMi41MDQgMy4yNzksLTIuNjE4IDIuODgxLC0yLjYxOCBaIi8+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE5MC4xNTIzLDMyLjQ4NjQpIiBpZD0iZzE1NCI+PHBhdGggaWQ9InBhdGgxNTYiIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIGQ9Ik0gMCwwIEMgMC41NjIsMS4wNzggMS4yMywxLjkyNCAyLjAwNCwyLjUzOSAyLjc3NywzLjE1NCAzLjY5LDMuNDYxIDQuNzQ1LDMuNDYxIDUuNTc2LDMuNDYxIDYuMjQ0LDMuMjggNi43NDgsMi45MTcgTCA2LjQ2NywtMC4zMzQgQyA2LjQwOCwtMC41NDUgNi4zMjMsLTAuNjk0IDYuMjEyLC0wLjc4MiA2LjEwMSwtMC44NyA1Ljk1MSwtMC45MTQgNS43NjQsLTAuOTE0IGMgLTAuMTc2LDAgLTAuNDM3LDAuMDMgLTAuNzgyLDAuMDg4IC0wLjM0NSwwLjA1OSAtMC42ODIsMC4wODggLTEuMDEsMC4wODggLTAuNDgxLDAgLTAuOTA5LC0wLjA3IC0xLjI4NCwtMC4yMTEgQyAyLjMxNCwtMS4wODkgMS45NzgsLTEuMjkyIDEuNjc5LC0xLjU1NSAxLjM4LC0xLjgxOSAxLjExNiwtMi4xMzggMC44ODgsLTIuNTEzIDAuNjYsLTIuODg4IDAuNDQ1LC0zLjMxNSAwLjI0NywtMy43OTUgViAtMTQuOSBoIC00LjM0IFYgMy4xMjcgaCAyLjU0NyBjIDAuNDQ1LDAgMC43NTYsLTAuMDc4IDAuOTMyLC0wLjIzNyAwLjE3NiwtMC4xNTggMC4yOTIsLTAuNDQyIDAuMzUxLC0wLjg1MiB6Ii8+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPg=="
  16 + notes:
  17 + - heading: "Features"
  18 + content: |
  19 + PHP 8.1<br />
  20 + MariaDB 10.6<br />
  21 + Redis 7<br />
  22 + Drush included<br />
  23 + Automatic TLS certificates<br />
  24 + Composer-based build<br />
  25 +
  26 +initialize:
  27 + repository: https://github.com/droptica/droopler_project.git@4.0.0-alpha3
  28 + config: null
  29 + files: []
  30 + profile: Droopler
... ...
  1 +.platform/local
  2 +===============
  3 +
  4 +This directory is where the Platform.sh CLI stores configuration files, builds, and
  5 +other data to help work with your project locally.
  6 +
  7 +It is not used on remote environments at all - the directory is excluded from
  8 +your Git repository (via .git/info/exclude).
... ...
  1 +id: eq2jw3yvh7ugu
  2 +host: api.platform.sh
... ...
  1 +# The routes of the project.
  2 +#
  3 +# Each route describes how an incoming URL is going
  4 +# to be processed by Platform.sh.
  5 +
  6 +"https://{default}/":
  7 + type: upstream
  8 + upstream: "platform-app-name:http"
  9 + cache:
  10 + enabled: true
  11 +
  12 + # Base the cache on the session cookie and custom Drupal cookies. Ignore all other cookies.
  13 + cookies: ['/^SS?ESS/', '/^Drupal.visitor/']
  14 +
  15 +"https://www.{default}/":
  16 + type: redirect
  17 + to: "https://{default}/"
... ...
  1 +# The services of the project.
  2 +#
  3 +# Each service listed will be deployed
  4 +# to power your Platform.sh project.
  5 +
  6 +db:
  7 + type: mariadb:10.6
  8 + disk: 2048
  9 +
  10 +cache:
  11 + type: redis:7.0
... ...
  1 + GNU GENERAL PUBLIC LICENSE
  2 + Version 2, June 1991
  3 +
  4 + Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
  5 + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  6 + Everyone is permitted to copy and distribute verbatim copies
  7 + of this license document, but changing it is not allowed.
  8 +
  9 + Preamble
  10 +
  11 + The licenses for most software are designed to take away your
  12 +freedom to share and change it. By contrast, the GNU General Public
  13 +License is intended to guarantee your freedom to share and change free
  14 +software--to make sure the software is free for all its users. This
  15 +General Public License applies to most of the Free Software
  16 +Foundation's software and to any other program whose authors commit to
  17 +using it. (Some other Free Software Foundation software is covered by
  18 +the GNU Lesser General Public License instead.) You can apply it to
  19 +your programs, too.
  20 +
  21 + When we speak of free software, we are referring to freedom, not
  22 +price. Our General Public Licenses are designed to make sure that you
  23 +have the freedom to distribute copies of free software (and charge for
  24 +this service if you wish), that you receive source code or can get it
  25 +if you want it, that you can change the software or use pieces of it
  26 +in new free programs; and that you know you can do these things.
  27 +
  28 + To protect your rights, we need to make restrictions that forbid
  29 +anyone to deny you these rights or to ask you to surrender the rights.
  30 +These restrictions translate to certain responsibilities for you if you
  31 +distribute copies of the software, or if you modify it.
  32 +
  33 + For example, if you distribute copies of such a program, whether
  34 +gratis or for a fee, you must give the recipients all the rights that
  35 +you have. You must make sure that they, too, receive or can get the
  36 +source code. And you must show them these terms so they know their
  37 +rights.
  38 +
  39 + We protect your rights with two steps: (1) copyright the software, and
  40 +(2) offer you this license which gives you legal permission to copy,
  41 +distribute and/or modify the software.
  42 +
  43 + Also, for each author's protection and ours, we want to make certain
  44 +that everyone understands that there is no warranty for this free
  45 +software. If the software is modified by someone else and passed on, we
  46 +want its recipients to know that what they have is not the original, so
  47 +that any problems introduced by others will not reflect on the original
  48 +authors' reputations.
  49 +
  50 + Finally, any free program is threatened constantly by software
  51 +patents. We wish to avoid the danger that redistributors of a free
  52 +program will individually obtain patent licenses, in effect making the
  53 +program proprietary. To prevent this, we have made it clear that any
  54 +patent must be licensed for everyone's free use or not licensed at all.
  55 +
  56 + The precise terms and conditions for copying, distribution and
  57 +modification follow.
  58 +
  59 + GNU GENERAL PUBLIC LICENSE
  60 + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  61 +
  62 + 0. This License applies to any program or other work which contains
  63 +a notice placed by the copyright holder saying it may be distributed
  64 +under the terms of this General Public License. The "Program", below,
  65 +refers to any such program or work, and a "work based on the Program"
  66 +means either the Program or any derivative work under copyright law:
  67 +that is to say, a work containing the Program or a portion of it,
  68 +either verbatim or with modifications and/or translated into another
  69 +language. (Hereinafter, translation is included without limitation in
  70 +the term "modification".) Each licensee is addressed as "you".
  71 +
  72 +Activities other than copying, distribution and modification are not
  73 +covered by this License; they are outside its scope. The act of
  74 +running the Program is not restricted, and the output from the Program
  75 +is covered only if its contents constitute a work based on the
  76 +Program (independent of having been made by running the Program).
  77 +Whether that is true depends on what the Program does.
  78 +
  79 + 1. You may copy and distribute verbatim copies of the Program's
  80 +source code as you receive it, in any medium, provided that you
  81 +conspicuously and appropriately publish on each copy an appropriate
  82 +copyright notice and disclaimer of warranty; keep intact all the
  83 +notices that refer to this License and to the absence of any warranty;
  84 +and give any other recipients of the Program a copy of this License
  85 +along with the Program.
  86 +
  87 +You may charge a fee for the physical act of transferring a copy, and
  88 +you may at your option offer warranty protection in exchange for a fee.
  89 +
  90 + 2. You may modify your copy or copies of the Program or any portion
  91 +of it, thus forming a work based on the Program, and copy and
  92 +distribute such modifications or work under the terms of Section 1
  93 +above, provided that you also meet all of these conditions:
  94 +
  95 + a) You must cause the modified files to carry prominent notices
  96 + stating that you changed the files and the date of any change.
  97 +
  98 + b) You must cause any work that you distribute or publish, that in
  99 + whole or in part contains or is derived from the Program or any
  100 + part thereof, to be licensed as a whole at no charge to all third
  101 + parties under the terms of this License.
  102 +
  103 + c) If the modified program normally reads commands interactively
  104 + when run, you must cause it, when started running for such
  105 + interactive use in the most ordinary way, to print or display an
  106 + announcement including an appropriate copyright notice and a
  107 + notice that there is no warranty (or else, saying that you provide
  108 + a warranty) and that users may redistribute the program under
  109 + these conditions, and telling the user how to view a copy of this
  110 + License. (Exception: if the Program itself is interactive but
  111 + does not normally print such an announcement, your work based on
  112 + the Program is not required to print an announcement.)
  113 +
  114 +These requirements apply to the modified work as a whole. If
  115 +identifiable sections of that work are not derived from the Program,
  116 +and can be reasonably considered independent and separate works in
  117 +themselves, then this License, and its terms, do not apply to those
  118 +sections when you distribute them as separate works. But when you
  119 +distribute the same sections as part of a whole which is a work based
  120 +on the Program, the distribution of the whole must be on the terms of
  121 +this License, whose permissions for other licensees extend to the
  122 +entire whole, and thus to each and every part regardless of who wrote it.
  123 +
  124 +Thus, it is not the intent of this section to claim rights or contest
  125 +your rights to work written entirely by you; rather, the intent is to
  126 +exercise the right to control the distribution of derivative or
  127 +collective works based on the Program.
  128 +
  129 +In addition, mere aggregation of another work not based on the Program
  130 +with the Program (or with a work based on the Program) on a volume of
  131 +a storage or distribution medium does not bring the other work under
  132 +the scope of this License.
  133 +
  134 + 3. You may copy and distribute the Program (or a work based on it,
  135 +under Section 2) in object code or executable form under the terms of
  136 +Sections 1 and 2 above provided that you also do one of the following:
  137 +
  138 + a) Accompany it with the complete corresponding machine-readable
  139 + source code, which must be distributed under the terms of Sections
  140 + 1 and 2 above on a medium customarily used for software interchange; or,
  141 +
  142 + b) Accompany it with a written offer, valid for at least three
  143 + years, to give any third party, for a charge no more than your
  144 + cost of physically performing source distribution, a complete
  145 + machine-readable copy of the corresponding source code, to be
  146 + distributed under the terms of Sections 1 and 2 above on a medium
  147 + customarily used for software interchange; or,
  148 +
  149 + c) Accompany it with the information you received as to the offer
  150 + to distribute corresponding source code. (This alternative is
  151 + allowed only for noncommercial distribution and only if you
  152 + received the program in object code or executable form with such
  153 + an offer, in accord with Subsection b above.)
  154 +
  155 +The source code for a work means the preferred form of the work for
  156 +making modifications to it. For an executable work, complete source
  157 +code means all the source code for all modules it contains, plus any
  158 +associated interface definition files, plus the scripts used to
  159 +control compilation and installation of the executable. However, as a
  160 +special exception, the source code distributed need not include
  161 +anything that is normally distributed (in either source or binary
  162 +form) with the major components (compiler, kernel, and so on) of the
  163 +operating system on which the executable runs, unless that component
  164 +itself accompanies the executable.
  165 +
  166 +If distribution of executable or object code is made by offering
  167 +access to copy from a designated place, then offering equivalent
  168 +access to copy the source code from the same place counts as
  169 +distribution of the source code, even though third parties are not
  170 +compelled to copy the source along with the object code.
  171 +
  172 + 4. You may not copy, modify, sublicense, or distribute the Program
  173 +except as expressly provided under this License. Any attempt
  174 +otherwise to copy, modify, sublicense or distribute the Program is
  175 +void, and will automatically terminate your rights under this License.
  176 +However, parties who have received copies, or rights, from you under
  177 +this License will not have their licenses terminated so long as such
  178 +parties remain in full compliance.
  179 +
  180 + 5. You are not required to accept this License, since you have not
  181 +signed it. However, nothing else grants you permission to modify or
  182 +distribute the Program or its derivative works. These actions are
  183 +prohibited by law if you do not accept this License. Therefore, by
  184 +modifying or distributing the Program (or any work based on the
  185 +Program), you indicate your acceptance of this License to do so, and
  186 +all its terms and conditions for copying, distributing or modifying
  187 +the Program or works based on it.
  188 +
  189 + 6. Each time you redistribute the Program (or any work based on the
  190 +Program), the recipient automatically receives a license from the
  191 +original licensor to copy, distribute or modify the Program subject to
  192 +these terms and conditions. You may not impose any further
  193 +restrictions on the recipients' exercise of the rights granted herein.
  194 +You are not responsible for enforcing compliance by third parties to
  195 +this License.
  196 +
  197 + 7. If, as a consequence of a court judgment or allegation of patent
  198 +infringement or for any other reason (not limited to patent issues),
  199 +conditions are imposed on you (whether by court order, agreement or
  200 +otherwise) that contradict the conditions of this License, they do not
  201 +excuse you from the conditions of this License. If you cannot
  202 +distribute so as to satisfy simultaneously your obligations under this
  203 +License and any other pertinent obligations, then as a consequence you
  204 +may not distribute the Program at all. For example, if a patent
  205 +license would not permit royalty-free redistribution of the Program by
  206 +all those who receive copies directly or indirectly through you, then
  207 +the only way you could satisfy both it and this License would be to
  208 +refrain entirely from distribution of the Program.
  209 +
  210 +If any portion of this section is held invalid or unenforceable under
  211 +any particular circumstance, the balance of the section is intended to
  212 +apply and the section as a whole is intended to apply in other
  213 +circumstances.
  214 +
  215 +It is not the purpose of this section to induce you to infringe any
  216 +patents or other property right claims or to contest validity of any
  217 +such claims; this section has the sole purpose of protecting the
  218 +integrity of the free software distribution system, which is
  219 +implemented by public license practices. Many people have made
  220 +generous contributions to the wide range of software distributed
  221 +through that system in reliance on consistent application of that
  222 +system; it is up to the author/donor to decide if he or she is willing
  223 +to distribute software through any other system and a licensee cannot
  224 +impose that choice.
  225 +
  226 +This section is intended to make thoroughly clear what is believed to
  227 +be a consequence of the rest of this License.
  228 +
  229 + 8. If the distribution and/or use of the Program is restricted in
  230 +certain countries either by patents or by copyrighted interfaces, the
  231 +original copyright holder who places the Program under this License
  232 +may add an explicit geographical distribution limitation excluding
  233 +those countries, so that distribution is permitted only in or among
  234 +countries not thus excluded. In such case, this License incorporates
  235 +the limitation as if written in the body of this License.
  236 +
  237 + 9. The Free Software Foundation may publish revised and/or new versions
  238 +of the General Public License from time to time. Such new versions will
  239 +be similar in spirit to the present version, but may differ in detail to
  240 +address new problems or concerns.
  241 +
  242 +Each version is given a distinguishing version number. If the Program
  243 +specifies a version number of this License which applies to it and "any
  244 +later version", you have the option of following the terms and conditions
  245 +either of that version or of any later version published by the Free
  246 +Software Foundation. If the Program does not specify a version number of
  247 +this License, you may choose any version ever published by the Free Software
  248 +Foundation.
  249 +
  250 + 10. If you wish to incorporate parts of the Program into other free
  251 +programs whose distribution conditions are different, write to the author
  252 +to ask for permission. For software which is copyrighted by the Free
  253 +Software Foundation, write to the Free Software Foundation; we sometimes
  254 +make exceptions for this. Our decision will be guided by the two goals
  255 +of preserving the free status of all derivatives of our free software and
  256 +of promoting the sharing and reuse of software generally.
  257 +
  258 + NO WARRANTY
  259 +
  260 + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
  261 +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
  262 +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
  263 +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
  264 +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  265 +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
  266 +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
  267 +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
  268 +REPAIR OR CORRECTION.
  269 +
  270 + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
  271 +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
  272 +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
  273 +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
  274 +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
  275 +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
  276 +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
  277 +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
  278 +POSSIBILITY OF SUCH DAMAGES.
  279 +
  280 + END OF TERMS AND CONDITIONS
  281 +
  282 + How to Apply These Terms to Your New Programs
  283 +
  284 + If you develop a new program, and you want it to be of the greatest
  285 +possible use to the public, the best way to achieve this is to make it
  286 +free software which everyone can redistribute and change under these terms.
  287 +
  288 + To do so, attach the following notices to the program. It is safest
  289 +to attach them to the start of each source file to most effectively
  290 +convey the exclusion of warranty; and each file should have at least
  291 +the "copyright" line and a pointer to where the full notice is found.
  292 +
  293 + {description}
  294 + Copyright (C) {year} {fullname}
  295 +
  296 + This program is free software; you can redistribute it and/or modify
  297 + it under the terms of the GNU General Public License as published by
  298 + the Free Software Foundation; either version 2 of the License, or
  299 + (at your option) any later version.
  300 +
  301 + This program is distributed in the hope that it will be useful,
  302 + but WITHOUT ANY WARRANTY; without even the implied warranty of
  303 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  304 + GNU General Public License for more details.
  305 +
  306 + You should have received a copy of the GNU General Public License along
  307 + with this program; if not, write to the Free Software Foundation, Inc.,
  308 + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  309 +
  310 +Also add information on how to contact you by electronic and paper mail.
  311 +
  312 +If the program is interactive, make it output a short notice like this
  313 +when it starts in an interactive mode:
  314 +
  315 + Gnomovision version 69, Copyright (C) year name of author
  316 + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
  317 + This is free software, and you are welcome to redistribute it
  318 + under certain conditions; type `show c' for details.
  319 +
  320 +The hypothetical commands `show w' and `show c' should show the appropriate
  321 +parts of the General Public License. Of course, the commands you use may
  322 +be called something other than `show w' and `show c'; they could even be
  323 +mouse-clicks or menu items--whatever suits your program.
  324 +
  325 +You should also get your employer (if you work as a programmer) or your
  326 +school, if any, to sign a "copyright disclaimer" for the program, if
  327 +necessary. Here is a sample; alter the names:
  328 +
  329 + Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  330 + `Gnomovision' (which makes passes at compilers) written by James Hacker.
  331 +
  332 + {signature of Ty Coon}, 1 April 1989
  333 + Ty Coon, President of Vice
  334 +
  335 +This General Public License does not permit incorporating your program into
  336 +proprietary programs. If your program is a subroutine library, you may
  337 +consider it more useful to permit linking proprietary applications with the
  338 +library. If this is what you want to do, use the GNU Lesser General
  339 +Public License instead of this License.
... ...
  1 +[![Droopler](https://droopler-demo.droptica.com/themes/custom/droopler_subtheme/logo.svg 'Droopler')](https://droopler-demo.droptica.com)
  2 +
  3 +# Droopler template for new project
  4 +
  5 +---
  6 +
  7 +## About
  8 +
  9 +Droopler is a Drupal 10 profile designed to kickstart a new webpage in a few minutes. It's based on the latest frontend technologies, including Bootstrap 5. The maintainer of Droopler is [Droptica](https://droptica.com).
  10 +
  11 +* **Official website**: [droptica.com/droopler](https://www.droptica.com/droopler)
  12 +* **Tutorials**: [droptica.com/droopler/tutorials](https://www.droptica.com/droopler/tutorials/)
  13 +* **Demo**: [droopler-demo.droptica.com](https://droopler-demo.droptica.com)
  14 +* **Profile repository**: [github.com/droptica/droopler](https://github.com/droptica/droopler)
  15 +* **Drupal.org project**: [drupal.org/project/droopler](https://www.drupal.org/project/droopler)
  16 +* **Issue queue**: [drupal.org/project/issues/droopler](https://www.drupal.org/project/issues/droopler)
  17 +
  18 +For the latest news, follow us on [Facebook](https://www.facebook.com/Droopler/) and [Twitter](https://twitter.com/DrooplerCMS).
  19 +
  20 +### What is this Droopler template? ##
  21 +It's a skeleton, a boilerplate for new projects based on Droopler. If you wish to use Droopler - fork (or download) this repository. It contains a minimal set of code to start your new site. Threat it the same way as [drupal/recommended-project](https://github.com/drupal/recommended-project) or [drupal-composer/drupal-project](https://github.com/drupal-composer/drupal-project).
  22 +
  23 +This repository includes:
  24 +
  25 +- **composer.json** with all dependencies required to run Droopler.
  26 +- **.gitignore** adjusted to use GIT with Drupal.
  27 +- Boilerplate subtheme with minimal required CSS/SCSS and Javascript. It contains gulpfile.js to speed up development of Drupal's frontend.
  28 +
  29 +## Deploy on Platform.sh
  30 +
  31 +You can deploy and host your Droopler installation on [Platform.sh](https://platform.sh/).
  32 +
  33 +<a href="https://console.platform.sh/projects/create-project?template=https://raw.githubusercontent.com/droptica/droopler_project/4.0.x/.platform.template.yml">
  34 + <img src="https://platform.sh/images/deploy/lg-blue.svg" alt="Deploy Droopler on Platform.sh" width="180px" />
  35 +</a>
  36 +
  37 +## Quick start
  38 +
  39 +Fork this repository and clone the newly created to your local machine.
  40 +
  41 +## Local development
  42 +
  43 +This section provides instructions for running the `Droopler` distribution locally.
  44 +
  45 +### Using custom development environment
  46 +
  47 +1. Run `composer create-project droptica/droopler-project <path> "^8.4"` to install the project and its dependencies.
  48 +2. Run npm to download the theme dependencies and compile assets.<br /><br />
  49 +Droopler uses the npm stack to speed up the development of new sites. It compiles SCSS to CSS, allows Autoprefixer to handle browser compatibility, and minimizes all JavaScript files. [Install Node v18 and npm](https://nodejs.org/en/download/) on your computer and run the following commands in the root directory of your project:
  50 +
  51 +```sh
  52 +$ cd web/profiles/contrib/droopler/themes/custom/droopler_theme
  53 +$ npm install
  54 +
  55 +$ cd web/themes/custom/droopler_subtheme
  56 +$ npm install
  57 +$ npm run dev
  58 +```
  59 +3. Run Drupal installation.<br />
  60 +Go to http://yourserver.local/install.php and follow the steps of configuration.
  61 +
  62 +### Using DDEV
  63 +
  64 +1. [Install ddev](https://ddev.readthedocs.io/en/stable/#installation).
  65 +2. Run `ddev config` to configure the project.
  66 +3. Run `ddev start` to start the project.
  67 +4. Run `ddev composer install` to download the project dependencies.
  68 +5. If you notice problems with accessing to the repository, run `ddev auth ssh` to add the keys from your `~/.ssh` directory to the web container and run `ddev composer install` command once again.
  69 +6. Run `ddev theme` to install the theme dependencies and compile assets. By default, production assets are compiled. You can run `ddev theme dev` to compile assets for development. You can also run `ddev theme watch` to watch for changes in SCSS and JS and process them on the fly.
  70 +7. Go to the URL provided by ddev and finish installing the website. You can also run `ddev build-profile` to build the Droopler profile from the CLI (you will get a fully featured version, with blog, products and demo content).
  71 +
  72 +### Using Lando
  73 +1. [Install lando](https://docs.lando.dev/getting-started/installation.html).
  74 +2. Run `lando start` to start the project.
  75 +3. Run `lando prepare` to build the project's code. Alternatively, you can run `lando composer install` to download the project dependencies, and then `lando theme-production` and `lando subtheme-production` to compile assets.
  76 +4. Go to the URL provided by `lando info` and finish installing the website. You can also build the Droopler profile from the CLI. Run `lando build-full-profile` for the fully-featured version, or `lando build-full-profile` for the minimal one.
  77 +
  78 +### Using DDEV connected to a database instance on an active Platform.sh environment
  79 +This is instructions for running the template locally, connected to a live database instance on an active Platform.sh environment.
  80 +
  81 +In all cases for developing with Platform.sh, it's important to develop on an isolated environment - do not connect to data on your production environment when developing locally.
  82 +Each of the options below assume that you have already deployed this template to Platform.sh, as well as the following starting commands:
  83 +
  84 +```bash
  85 +platform get PROJECT_ID
  86 +cd project-name
  87 +platform environment:branch updates
  88 +```
  89 +
  90 +DDEV provides an integration with Platform.sh that makes it simple to develop Drupal locally. Check the [providers documentation](https://ddev.readthedocs.io/en/latest/users/providers/platform/) for the most up-to-date information.
  91 +
  92 +In general, the steps are as follows:
  93 +
  94 +1. [Install ddev](https://ddev.readthedocs.io/en/stable/#installation).
  95 +1. A configuration file has already been provided at `.ddev/providers/platform.yaml`, so you should not need to run `ddev config`.
  96 +1. [Retrieve an API token](https://docs.platform.sh/development/cli/api-tokens.html#get-a-token) for your organization via the management console.
  97 +1. Update your ddev global configuration file to use the token you've just retrieved:
  98 + ```yaml
  99 + web_environment:
  100 + - PLATFORMSH_CLI_TOKEN=abcdeyourtoken
  101 + ```
  102 +1. Run `ddev restart`.
  103 +1. Get your project ID with `platform project:info`. If you have not already connected your local repo with the project (as is the case with a source integration, by default), you can run `platform project:list` to locate the project ID, and `platform project:set-remote PROJECT_ID` to configure Platform.sh locally.
  104 +1. Update the `.ddev/providers/platform.yaml` file for your current setup:
  105 + ```yaml
  106 + environment_variables:
  107 + project_id: PROJECT_ID
  108 + environment: CURRENT_ENVIRONMENT
  109 + application: drupal
  110 + ```
  111 +1. Get the current environment's data with `ddev pull platform`.
  112 +1. When you have finished with your work, run `ddev stop` and `ddev poweroff`.
  113 +
  114 +> **Note:**
  115 +>
  116 +> For many of the steps above, you may need to include the CLI flags `-p PROJECT_ID` and `-e ENVIRONMENT_ID` if you are not in the project directory or if the environment is associated with an existing pull request.
  117 +
  118 +## How to work with the subtheme?
  119 +
  120 +### Using DDEV
  121 +There are several comands that help you to work with the subtheme. You can run them from the root directory of your project.
  122 +
  123 +- `ddev theme watch` - watches for changes in SCSS and JS and processes them on the fly
  124 +- `ddev theme dev` - cleans derivative files and compiles all SCSS/JS in the subtheme for DEV environment
  125 +- `ddev theme production` - cleans derivative files and compiles all SCSS/JS in the subtheme for PROD environment
  126 +
  127 +### Using lando
  128 +There are several comands that help you to work with the subtheme. You can run them from the root directory of your project.
  129 +
  130 +- `lando theme-watch` or `lando subtheme-watch` - watches for changes in SCSS and JS and processes them on the fly
  131 +- `lando theme-dev` or `lando subtheme-dev` - cleans derivative files and compiles all SCSS/JS in the theme for DEV environment
  132 +- `lando theme-production` or `lando subtheme-production` - cleans derivative files and compiles all SCSS/JS in the theme for PROD environment
  133 +
  134 +### Running npm on your own
  135 +First run <strong>npm run watch</strong> in your subtheme's directory. It will track all the changes in theme source files and compile assets in the fly.
  136 +
  137 +```sh
  138 +$ cd web/themes/custom/droopler_subtheme
  139 +$ npm run watch
  140 +```
  141 +
  142 +There are also other npm commands for theme developers, here's the full reference:
  143 +
  144 +- `npm run watch` - watches for changes in SCSS and JS and processes them on the fly
  145 +- `npm run dev` - cleans derivative files and compiles all SCSS/JS in the subtheme for DEV environment
  146 +- `npm run production` - cleans derivative files and compiles all SCSS/JS in the subtheme for PROD environment
  147 +- `npm run stylint` - run stylint
  148 +- `npm run stylint-fix` - run stylint and fix errors automatically
  149 +
  150 +## SCSS structure
  151 +
  152 +- **src/scss/main.style.scss** - combines all SCSS code from base theme and subtheme
  153 +- **src/components** - directory where you can keep all your components, see [components/README.md](web/themes/custom/droopler_subtheme/src/components/README.md)
  154 +
  155 +You can use any SCSS structure you like. We recommend dividing files into **layout/** and **components/** directories. Just remember to include your files in **main.style.scss**.
  156 +
  157 +## SCSS Configuration
  158 +
  159 +Droopler is designed to make your work easier. You don't have to override SCSS or CSS code to make your own adjustments. In most cases it is enough to modify the configuration.
  160 +
  161 +Just look into variables definitions in the subtheme.
  162 +
  163 +Use **src/scss/bootstrap/_variables.scss** file to overwrite base bootstrap variables.
  164 +```scss
  165 +// Colors.
  166 +// $red: #ac0000 !default;
  167 +// $orange: #ff9475 !default;
  168 +// $primary: $red !default;
  169 +```
  170 +
  171 +Use **src/scss/base/_themes.scss** file to overwrite project specific colors in each theme.
  172 +```scss
  173 +// *[data-theme="theme-light"] {
  174 +// --section-background-color: #fff;
  175 +// --overlay-background-color: #fff;
  176 +// --divider-background-color: #{$red};
  177 +// ...
  178 +// }
  179 +```
  180 +
  181 +Use **src/scss/base/_variables.scss** file to overwrite components/paragraphs variables.
  182 +```scss
  183 +// :root {
  184 +// // Base component: CTA.
  185 +// --cta-width: 100%;
  186 +// --cta-max-width: 18rem;
  187 +// --cta-margin-top-bottom: 0.25rem;
  188 +// ...
  189 +// }
  190 +```
  191 +
  192 +When you save this config file, **npm run dev** will recompile all SCSS with your own config.
  193 +
  194 +> **Extending and overwriting components**
  195 +>
  196 +> Instead of overwriting the particular component through the CSS variables in the `_variables.scss` file, you can extend or overwrite it in the `src/components` directory.
  197 +>
  198 +> See: [components/README.md](web/themes/custom/droopler_subtheme/src/components/README.md)
  199 +
  200 +## Updating Droopler
  201 +
  202 +See the [UPDATE.md](https://github.com/droptica/droopler/blob/master/UPDATE.md) file from the Droopler profile.
  203 +
  204 +## How to install Google Fonts?
  205 +
  206 +By default Droopler uses free [Inter](https://fonts.google.com/specimen/Inter) webfont. If you wish to install your own fonts from Google - put their definitions into **droopler_subtheme.libraries.yml** like this:
  207 +
  208 +```yaml
  209 +global-styling:
  210 + version: VERSION
  211 + css:
  212 + theme:
  213 + '//fonts.googleapis.com/css?family=Rajdhani:500,600,700|Roboto:400,700&subset=latin-ext': { type: external, minified: true }
  214 + css/style.css: {}
  215 +```
  216 +
  217 +## How to install icon fonts?
  218 +
  219 +If you wish to install FontAwesome or Glyphicons from the CDN - just grab their URLs and follow the steps described in previous chapter about Google Fonts. You'll find a FontAwesome example in **droopler_subtheme.libraries.yml** and **droopler_subtheme.info.yml**.
  220 +
  221 +## Setup git hooks
  222 +
  223 +In the `.githooks` directory you can find the pre-commit hooks to run the quality tools and to make sure that the front-end has been compiled in the `production` mode.
  224 +
  225 +To set-up git hooks run:
  226 +```shell
  227 +git config --local core.hooksPath .githooks/
  228 +```
  229 +
  230 +For the first time or when you get no permission error add `+x` to those scripts.
  231 +```shell
  232 +chmod -R +x .githooks/
  233 +```
... ...
  1 +{
  2 + "name": "droptica/droopler-project",
  3 + "description": "Project template for Droopler with Composer",
  4 + "type": "project",
  5 + "license": "GPL-2.0-or-later",
  6 + "homepage": "https://www.droopler.com",
  7 + "support": {
  8 + "docs": "https://www.droopler.com/developers",
  9 + "issues": "https://www.drupal.org/project/issues/droopler?categories=All"
  10 + },
  11 + "repositories": {
  12 + "drupal": {
  13 + "type": "composer",
  14 + "url": "https://packages.drupal.org/8"
  15 + },
  16 + "asset": {
  17 + "type": "composer",
  18 + "url": "https://asset-packagist.org"
  19 + }
  20 + },
  21 + "require": {
  22 + "composer/installers": "^2.2",
  23 + "droptica/droopler": "4.0.0-alpha3",
  24 + "drupal/better_exposed_filters": "^6.0",
  25 + "drupal/core-composer-scaffold": "^10.0",
  26 + "drupal/core-recommended": "^10.0",
  27 + "drupal/facets": "^2.0",
  28 + "drupal/redis": "^1.7",
  29 + "drupal/search_api": "^1.29",
  30 + "drupal/tvi": "2.0.x-dev@dev",
  31 + "drush/drush": "^12",
  32 + "oomphinc/composer-installers-extender": "^2.0",
  33 + "platformsh/config-reader": "^2.4"
  34 + },
  35 + "require-dev": {
  36 + "drupal/core-dev": "^10.0",
  37 + "drupal/devel": "^5.0"
  38 + },
  39 + "conflict": {
  40 + "drupal/drupal": "*"
  41 + },
  42 + "minimum-stability": "dev",
  43 + "prefer-stable": true,
  44 + "config": {
  45 + "sort-packages": true,
  46 + "allow-plugins": {
  47 + "dealerdirect/phpcodesniffer-composer-installer": true,
  48 + "composer/installers": true,
  49 + "cweagans/composer-patches": true,
  50 + "drupal/console-extend-plugin": true,
  51 + "drupal/core-composer-scaffold": true,
  52 + "oomphinc/composer-installers-extender": true,
  53 + "zaporylie/composer-drupal-optimizations": true,
  54 + "phpstan/extension-installer": true,
  55 + "php-http/discovery": true
  56 + },
  57 + "preferred-install": {
  58 + "droptica/droopler": "source",
  59 + "*": "dist"
  60 + }
  61 + },
  62 + "extra": {
  63 + "enable-patching": true,
  64 + "drupal-scaffold": {
  65 + "locations": {
  66 + "web-root": "web/"
  67 + }
  68 + },
  69 + "installer-types": ["bower-asset", "npm-asset"],
  70 + "installer-paths": {
  71 + "web/core": ["type:drupal-core"],
  72 + "web/libraries/{$name}": ["type:drupal-library", "type:git", "type:bower-asset", "type:npm-asset"],
  73 + "web/modules/contrib/{$name}": ["type:drupal-module"],
  74 + "web/profiles/contrib/droopler": ["type:drupal-profile"],
  75 + "web/themes/contrib/{$name}": ["type:drupal-theme"],
  76 + "drush/Commands/contrib/{$name}": ["type:drupal-drush"],
  77 + "web/modules/custom/{$name}": ["type:drupal-custom-module"],
  78 + "web/themes/custom/{$name}": ["type:drupal-custom-theme"]
  79 + }
  80 + }
  81 +}
... ...
Please register or login to post a comment