fix: актуальные ресурсы Zoomzilla и проверяемый выпуск (refs #11)
This commit is contained in:
1 parent
144dda6d88
commit
e9a2a0d568
25 files changed
+1255
-67
No files matched your search
@@ -23,7 +23,24 @@ jobs:
|
|||||||
run: apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates git curl openssh-client sshpass php-cli
|
run: apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates git curl openssh-client sshpass php-cli
|
||||||
|
|
||||||
- name: Checkout staging branch
|
- name: Checkout staging branch
|
||||||
run: git clone --depth 1 --branch staging http://git.dira89kv.beget.tech:3000/anton/preland.git .
|
env:
|
||||||
|
RELEASE_SHA: ${{ github.sha }}
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
git clone --depth 1 --branch staging http://git.dira89kv.beget.tech:3000/anton/preland.git .
|
||||||
|
git fetch --depth 1 origin "$RELEASE_SHA"
|
||||||
|
git checkout --detach "$RELEASE_SHA"
|
||||||
|
[ "$(git rev-parse HEAD)" = "$RELEASE_SHA" ]
|
||||||
|
|
||||||
|
- name: Validate release and current stage sets before upload
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
php bin/release-assets.php --check
|
||||||
|
for test in tests/check-*.php; do php "$test"; done
|
||||||
|
php bin/release-assets.php --primary
|
||||||
|
# /N/ по-прежнему принадлежит stage. Любое расхождение требует
|
||||||
|
# сначала перенести актуальный снимок в Git по задаче.
|
||||||
|
php bin/release-assets.php --stage-sets "$PRELAND_URL"
|
||||||
|
|
||||||
- name: Preserve host config and add focus if absent
|
- name: Preserve host config and add focus if absent
|
||||||
env:
|
env:
|
||||||
@@ -39,13 +56,22 @@ jobs:
|
|||||||
trap 'rm -f "$known_hosts" "$batch" "$config"' EXIT
|
trap 'rm -f "$known_hosts" "$batch" "$config"' EXIT
|
||||||
printf '%s\n' "$SFTP_KNOWN_HOSTS" > "$known_hosts"
|
printf '%s\n' "$SFTP_KNOWN_HOSTS" > "$known_hosts"
|
||||||
printf '%s\n' "get -p $REMOTE_DIR/config.json $config" > "$batch"
|
printf '%s\n' "get -p $REMOTE_DIR/config.json $config" > "$batch"
|
||||||
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" "$SFTP_USER@$SFTP_HOST" < "$batch"
|
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" -b "$batch" "$SFTP_USER@$SFTP_HOST"
|
||||||
changed=0
|
changed=0
|
||||||
php bin/ensure-focus-config.php "$config" || changed=$?
|
php bin/ensure-focus-config.php "$config" || changed=$?
|
||||||
case "$changed" in
|
case "$changed" in
|
||||||
0) ;;
|
0) ;;
|
||||||
10) printf '%s\n' "put -p $config $REMOTE_DIR/config.json" > "$batch"
|
10) printf '%s\n' "put -p $config $REMOTE_DIR/config.json" > "$batch"
|
||||||
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" "$SFTP_USER@$SFTP_HOST" < "$batch" ;;
|
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" -b "$batch" "$SFTP_USER@$SFTP_HOST" ;;
|
||||||
|
*) exit "$changed" ;;
|
||||||
|
esac
|
||||||
|
# preland#11: отдельное прямое разрешение21.10 на актуальные реквизиты.
|
||||||
|
changed=0
|
||||||
|
php bin/ensure-requisites-config.php "$config" || changed=$?
|
||||||
|
case "$changed" in
|
||||||
|
0) ;;
|
||||||
|
10) printf '%s\n' "put -p $config $REMOTE_DIR/config.json" > "$batch"
|
||||||
|
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" -b "$batch" "$SFTP_USER@$SFTP_HOST" ;;
|
||||||
*) exit "$changed" ;;
|
*) exit "$changed" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@@ -68,7 +94,8 @@ jobs:
|
|||||||
# Наборы `/N/` на stage — редактируемый контент. Кодовая доставка их
|
# Наборы `/N/` на stage — редактируемый контент. Кодовая доставка их
|
||||||
# намеренно не перезаписывает: актуальное содержимое stage фиксируют в Git
|
# намеренно не перезаписывает: актуальное содержимое stage фиксируют в Git
|
||||||
# отдельной синхронизацией по задаче.
|
# отдельной синхронизацией по задаче.
|
||||||
git ls-files | grep -vE '^(\.gitea/|README\.md$|AGENTS\.md$|CLAUDE\.md$|\.gitignore$|requisites\.html$|config\.json$|[0-9]+/)' > "$files"
|
# Положительный список: tests/bin/планы не публикуются.
|
||||||
|
php bin/release-assets.php --files | grep -vE '^(config\.json$|[0-9]+/)' > "$files"
|
||||||
if grep -q '[^A-Za-z0-9._/-]' "$files"; then echo "имена с недопустимыми символами:"; grep '[^A-Za-z0-9._/-]' "$files"; exit 1; fi
|
if grep -q '[^A-Za-z0-9._/-]' "$files"; then echo "имена с недопустимыми символами:"; grep '[^A-Za-z0-9._/-]' "$files"; exit 1; fi
|
||||||
printf '%s\n' "-mkdir $REMOTE_DIR" > "$batch"
|
printf '%s\n' "-mkdir $REMOTE_DIR" > "$batch"
|
||||||
while read -r file; do
|
while read -r file; do
|
||||||
@@ -83,7 +110,7 @@ jobs:
|
|||||||
done < "$files"
|
done < "$files"
|
||||||
sort -u "$dirs" | while read -r dir; do printf '%s\n' "-mkdir $REMOTE_DIR/$dir" >> "$batch"; done
|
sort -u "$dirs" | while read -r dir; do printf '%s\n' "-mkdir $REMOTE_DIR/$dir" >> "$batch"; done
|
||||||
while read -r file; do printf '%s\n' "put -p $file $REMOTE_DIR/$file" >> "$batch"; done < "$files"
|
while read -r file; do printf '%s\n' "put -p $file $REMOTE_DIR/$file" >> "$batch"; done < "$files"
|
||||||
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" "$SFTP_USER@$SFTP_HOST" < "$batch"
|
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" -b "$batch" "$SFTP_USER@$SFTP_HOST"
|
||||||
echo "залито файлов: $(wc -l < "$files")"
|
echo "залито файлов: $(wc -l < "$files")"
|
||||||
|
|
||||||
- name: Check the page
|
- name: Check the page
|
||||||
@@ -98,6 +125,26 @@ jobs:
|
|||||||
curl -fsS --max-time 30 "$PRELAND_URL/2/01_desk_1-source.avif" -o /dev/null || { echo "не опубликован второй набор примеров"; exit 1; }
|
curl -fsS --max-time 30 "$PRELAND_URL/2/01_desk_1-source.avif" -o /dev/null || { echo "не опубликован второй набор примеров"; exit 1; }
|
||||||
page2=$(curl -fsS --max-time 30 "$PRELAND_URL/?indpic=2&nc=$(date +%s)")
|
page2=$(curl -fsS --max-time 30 "$PRELAND_URL/?indpic=2&nc=$(date +%s)")
|
||||||
printf '%s' "$page2" | grep -q '2/01_mob_1-source.avif' || { echo "indpic=2 не использует второй набор примеров"; exit 1; }
|
printf '%s' "$page2" | grep -q '2/01_mob_1-source.avif' || { echo "indpic=2 не использует второй набор примеров"; exit 1; }
|
||||||
|
php bin/release-assets.php --remote "$PRELAND_URL"
|
||||||
|
php bin/release-assets.php --stage-requisites "$PRELAND_URL"
|
||||||
|
|
||||||
|
- name: Remove previously published internal files
|
||||||
|
env:
|
||||||
|
SFTP_HOST: ${{ secrets.ZOOMPIXEL_SFTP_HOST }}
|
||||||
|
SFTP_USER: ${{ secrets.ZOOMPIXEL_SFTP_USER }}
|
||||||
|
SFTP_PASS: ${{ secrets.ZOOMPIXEL_SFTP_PASS }}
|
||||||
|
SFTP_KNOWN_HOSTS: ${{ secrets.ZOOMPIXEL_SFTP_KNOWN_HOSTS }}
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
umask 077
|
||||||
|
known_hosts=$(mktemp); batch=$(mktemp)
|
||||||
|
trap 'rm -f "$known_hosts" "$batch"' EXIT
|
||||||
|
printf '%s\n' "$SFTP_KNOWN_HOSTS" > "$known_hosts"
|
||||||
|
# Только точно известные служебные файлы прежнего deploy, без рекурсии.
|
||||||
|
git ls-files tests bin docs/superpowers | while read -r file; do
|
||||||
|
printf '%s\n' "-rm $REMOTE_DIR/$file" >> "$batch"
|
||||||
|
done
|
||||||
|
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" -b "$batch" "$SFTP_USER@$SFTP_HOST"
|
||||||
|
|
||||||
- name: Remove obsolete demo directories
|
- name: Remove obsolete demo directories
|
||||||
env:
|
env:
|
||||||
@@ -121,4 +168,4 @@ jobs:
|
|||||||
done
|
done
|
||||||
printf '%s\n' "-rmdir $REMOTE_DIR/images/$set" >> "$batch"
|
printf '%s\n' "-rmdir $REMOTE_DIR/images/$set" >> "$batch"
|
||||||
done
|
done
|
||||||
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" "$SFTP_USER@$SFTP_HOST" < "$batch"
|
SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" -b "$batch" "$SFTP_USER@$SFTP_HOST"
|
||||||
@@ -45,3 +45,13 @@
|
|||||||
|
|
||||||
## Актуальная маршрутизация (19.10.2026, preland#4)
|
## Актуальная маршрутизация (19.10.2026, preland#4)
|
||||||
До отдельного поручения владельца выкатывать только staging → zoomstage.online. Production zoompixel.ru/.online не обновлять. preland.anton.barbariskatest.ru больше не используется, не является целью и не должен упоминаться как требующий выпуска. CI запускает только stage. Сохранение runtime config и stage-наборов /N/ обязательно. Работа и решения — через Gitea.
|
До отдельного поручения владельца выкатывать только staging → zoomstage.online. Production zoompixel.ru/.online не обновлять. preland.anton.barbariskatest.ru больше не используется, не является целью и не должен упоминаться как требующий выпуска. CI запускает только stage. Сохранение runtime config и stage-наборов /N/ обязательно. Работа и решения — через Gitea.
|
||||||
|
|
||||||
|
## Актуальные ресурсы (21.10.2026, preland#11)
|
||||||
|
|
||||||
|
- Git main и staging содержат одно проверенное дерево. Источники: текущая zoomzilla.ru — два логотипа Zoomzilla, четыре PDF, favicon и реквизиты; zoomstage.online — все файлы наборов /1 и /2. История Git не переписывается; известная старая заглушка запрещена в рабочей поставке.
|
||||||
|
- release/assets.json фиксирует SHA-256 всех статических ресурсов (текстовые SVG/CSS/HTML/webmanifest нормализуют CRLF→LF). До выпуска выполнить девять tests/check-*.php, php bin/release-assets.php --check, --primary и --stage-sets https://zoomstage.online. Если источник изменился, сначала синхронизировать актуальные файлы и manifest по задаче, затем повторить проверки. Не отключать guard ради выката.
|
||||||
|
- --primary читает именно текущую страницу основного сайта и проверяет её актуальные URL/реквизиты: старый сохранённый asset URL не доказывает актуальность. Новые логотипы должны пройти визуальную проверку обеих тем/шапки/подвала. Cache version в components/asset-url.php зависит от содержимого.
|
||||||
|
- По прямому выбору владельца21.10 requisites.html теперь входит в каноническую поставку. Единственное новое разрешённое изменение runtime-config — ключ requisites из release/requisites.json через bin/ensure-requisites-config.php; остальные байты полей сохраняются, повторный запуск ничего не меняет. Это явное исключение к прежнему host-only правилу реквизитов, а не разрешение заменять весь config.json. Git config.json хранит согласованный снимок; после выпуска сверять runtime в памяти, не сохранять потенциальные секреты в логи.
|
||||||
|
- /N/ по-прежнему редактируется на stage и не перезаписывается обычной кодовой доставкой; все150файлов перед выкатом сверяются с Git. Drift блокирует выпуск до импорта актуального набора. При полном переносе репозитория набор уже должен быть правильным.
|
||||||
|
- SFTP берёт положительный список из bin/release-assets.php --files: никакие tests/bin/release/plans не публикуются. Старые известные служебные файлы удаляются только по точному списку git ls-files, без рекурсивной очистки. После выпуска --remote сверяет все184ресурса.
|
||||||
|
- Production-преленды остаются замороженными по preland#4. Push main ничего не публикует; staging обновляет только zoomstage.online из точного event SHA.
|
||||||
@@ -42,3 +42,13 @@
|
|||||||
|
|
||||||
План, журнал и база знаний ведутся в корне рабочей области по общим правилам. Ссылки на
|
План, журнал и база знаний ведутся в корне рабочей области по общим правилам. Ссылки на
|
||||||
политику и документацию не подключают MCP и не дают разрешения на публикацию или выкат.
|
политику и документацию не подключают MCP и не дают разрешения на публикацию или выкат.
|
||||||
|
|
||||||
|
## Актуальные ресурсы (21.10.2026, preland#11)
|
||||||
|
|
||||||
|
- Git main и staging содержат одно проверенное дерево. Источники: текущая zoomzilla.ru — два логотипа Zoomzilla, четыре PDF, favicon и реквизиты; zoomstage.online — все файлы наборов /1 и /2. История Git не переписывается; известная старая заглушка запрещена в рабочей поставке.
|
||||||
|
- release/assets.json фиксирует SHA-256 всех статических ресурсов (текстовые SVG/CSS/HTML/webmanifest нормализуют CRLF→LF). До выпуска выполнить девять tests/check-*.php, php bin/release-assets.php --check, --primary и --stage-sets https://zoomstage.online. Если источник изменился, сначала синхронизировать актуальные файлы и manifest по задаче, затем повторить проверки. Не отключать guard ради выката.
|
||||||
|
- --primary читает именно текущую страницу основного сайта и проверяет её актуальные URL/реквизиты: старый сохранённый asset URL не доказывает актуальность. Новые логотипы должны пройти визуальную проверку обеих тем/шапки/подвала. Cache version в components/asset-url.php зависит от содержимого.
|
||||||
|
- По прямому выбору владельца21.10 requisites.html теперь входит в каноническую поставку. Единственное новое разрешённое изменение runtime-config — ключ requisites из release/requisites.json через bin/ensure-requisites-config.php; остальные байты полей сохраняются, повторный запуск ничего не меняет. Это явное исключение к прежнему host-only правилу реквизитов, а не разрешение заменять весь config.json. Git config.json хранит согласованный снимок; после выпуска сверять runtime в памяти, не сохранять потенциальные секреты в логи.
|
||||||
|
- /N/ по-прежнему редактируется на stage и не перезаписывается обычной кодовой доставкой; все150файлов перед выкатом сверяются с Git. Drift блокирует выпуск до импорта актуального набора. При полном переносе репозитория набор уже должен быть правильным.
|
||||||
|
- SFTP берёт положительный список из bin/release-assets.php --files: никакие tests/bin/release/plans не публикуются. Старые известные служебные файлы удаляются только по точному списку git ls-files, без рекурсивной очистки. После выпуска --remote сверяет все184ресурса.
|
||||||
|
- Production-преленды остаются замороженными по preland#4. Push main ничего не публикует; staging обновляет только zoomstage.online из точного event SHA.
|
||||||
@@ -173,3 +173,15 @@ Workflow `.gitea/workflows/deploy.yml` содержит единственную
|
|||||||
|
|
||||||
## Android: фото и файлы (2026-10-19)
|
## Android: фото и файлы (2026-10-19)
|
||||||
Основная кнопка выбирает image/*; отдельная ссылка «Выбрать файлы (PDF и др.)» открывает общий picker без ограничения image/*. PDF в подписи скрывается по runtime API-policy. iOS/iPad/Desktop сохраняют прежний общий выбор. +много сохраняется в одной компактной mobile-строке. components/browser-upload.php и CSS upload-picker-links.php — лёгкие inline-копии соответствующих компонентов API: отдельный PHP-хост не использует Yii AssetManager, новый внешний запрос не добавляется. При изменении общего контракта синхронизировать обе копии; API mobile-picker.cjs покрывает обе реальные страницы. Android byte-copy FileProvider сохраняет исходные байты/имя/MIME и ограничен max_file_size_bytes; до ответа policy используется консервативный15MB предел копирования. UTM/client_key/claim/config.json не меняются.
|
Основная кнопка выбирает image/*; отдельная ссылка «Выбрать файлы (PDF и др.)» открывает общий picker без ограничения image/*. PDF в подписи скрывается по runtime API-policy. iOS/iPad/Desktop сохраняют прежний общий выбор. +много сохраняется в одной компактной mobile-строке. components/browser-upload.php и CSS upload-picker-links.php — лёгкие inline-копии соответствующих компонентов API: отдельный PHP-хост не использует Yii AssetManager, новый внешний запрос не добавляется. При изменении общего контракта синхронизировать обе копии; API mobile-picker.cjs покрывает обе реальные страницы. Android byte-copy FileProvider сохраняет исходные байты/имя/MIME и ограничен max_file_size_bytes; до ответа policy используется консервативный15MB предел копирования. UTM/client_key/claim/config.json не меняются.
|
||||||
|
|
||||||
|
## Актуальные ресурсы (21.10.2026, preland#11)
|
||||||
|
|
||||||
|
- Git main и staging содержат одно проверенное дерево. Источники: текущая zoomzilla.ru — два логотипа Zoomzilla, четыре PDF, favicon и реквизиты; zoomstage.online — все файлы наборов /1 и /2. История Git не переписывается; известная старая заглушка запрещена в рабочей поставке.
|
||||||
|
- release/assets.json фиксирует SHA-256 всех статических ресурсов (текстовые SVG/CSS/HTML/webmanifest нормализуют CRLF→LF). До выпуска выполнить девять tests/check-*.php, php bin/release-assets.php --check, --primary и --stage-sets https://zoomstage.online. Если источник изменился, сначала синхронизировать актуальные файлы и manifest по задаче, затем повторить проверки. Не отключать guard ради выката.
|
||||||
|
- --primary читает именно текущую страницу основного сайта и проверяет её актуальные URL/реквизиты: старый сохранённый asset URL не доказывает актуальность. Новые логотипы должны пройти визуальную проверку обеих тем/шапки/подвала. Cache version в components/asset-url.php зависит от содержимого.
|
||||||
|
- По прямому выбору владельца21.10 requisites.html теперь входит в каноническую поставку. Единственное новое разрешённое изменение runtime-config — ключ requisites из release/requisites.json через bin/ensure-requisites-config.php; остальные байты полей сохраняются, повторный запуск ничего не меняет. Это явное исключение к прежнему host-only правилу реквизитов, а не разрешение заменять весь config.json. Git config.json хранит согласованный снимок; после выпуска сверять runtime в памяти, не сохранять потенциальные секреты в логи.
|
||||||
|
- /N/ по-прежнему редактируется на stage и не перезаписывается обычной кодовой доставкой; все150файлов перед выкатом сверяются с Git. Drift блокирует выпуск до импорта актуального набора. При полном переносе репозитория набор уже должен быть правильным.
|
||||||
|
- SFTP берёт положительный список из bin/release-assets.php --files: никакие tests/bin/release/plans не публикуются. Старые известные служебные файлы удаляются только по точному списку git ls-files, без рекурсивной очистки. После выпуска --remote сверяет все184ресурса.
|
||||||
|
- Production-преленды остаются замороженными по preland#4. Push main ничего не публикует; staging обновляет только zoomstage.online из точного event SHA.
|
||||||
|
|
||||||
|
Повторная проверка выпуска: php bin/release-assets.php --stage-requisites https://zoomstage.online проверяет именно runtime config; успешная загрузка requisites.html сама по себе недостаточна. Все обязательные SFTP-команды выполняются через batch -b и прекращают выкат при ошибке put.
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
/** preland#11: владелец21.10 согласовал только requisites из текущей zoomzilla.ru. */
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
function replaceRequisites(string $raw, string $encoded): string
|
||||||
|
{
|
||||||
|
$depth = 0; $length = strlen($raw);
|
||||||
|
for ($i = 0; $i < $length; $i++) {
|
||||||
|
if ($raw[$i] === '"') {
|
||||||
|
$start = $i++;
|
||||||
|
for (; $i < $length; $i++) {
|
||||||
|
if ($raw[$i] === '\\') { $i++; continue; }
|
||||||
|
if ($raw[$i] === '"') break;
|
||||||
|
}
|
||||||
|
if ($depth !== 1 || json_decode(substr($raw, $start, $i - $start + 1)) !== 'requisites') continue;
|
||||||
|
$cursor = $i + 1;
|
||||||
|
while ($cursor < $length && ctype_space($raw[$cursor])) $cursor++;
|
||||||
|
if (($raw[$cursor] ?? '') !== ':') continue;
|
||||||
|
$cursor++;
|
||||||
|
while ($cursor < $length && ctype_space($raw[$cursor])) $cursor++;
|
||||||
|
$valueStart = $cursor; $nested = 0; $quoted = false;
|
||||||
|
for (; $cursor < $length; $cursor++) {
|
||||||
|
$char = $raw[$cursor];
|
||||||
|
if ($quoted) {
|
||||||
|
if ($char === '\\') $cursor++;
|
||||||
|
elseif ($char === '"') $quoted = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($char === '"') { $quoted = true; continue; }
|
||||||
|
if (($char === ',' || $char === '}') && $nested === 0) break;
|
||||||
|
if ($char === '[' || $char === '{') $nested++;
|
||||||
|
elseif ($char === ']' || $char === '}') $nested--;
|
||||||
|
}
|
||||||
|
return substr($raw, 0, $valueStart) . $encoded . substr($raw, $cursor);
|
||||||
|
}
|
||||||
|
if ($raw[$i] === '{' || $raw[$i] === '[') $depth++;
|
||||||
|
elseif ($raw[$i] === '}' || $raw[$i] === ']') $depth--;
|
||||||
|
}
|
||||||
|
$end = strrpos($raw, '}');
|
||||||
|
$prefix = substr($raw, 0, $end);
|
||||||
|
return $prefix . (count(json_decode($raw, true)) ? ',' : '') . '"requisites":' . $encoded . substr($raw, $end);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if ($argc !== 2) throw new RuntimeException('Требуется путь к текущему host config');
|
||||||
|
$path = $argv[1];
|
||||||
|
$raw = file_get_contents($path);
|
||||||
|
$config = json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
if (!is_array($config) || !str_starts_with(ltrim($raw), '{')) throw new RuntimeException('Требуется объект config');
|
||||||
|
$expected = json_decode(file_get_contents(dirname(__DIR__) . '/release/requisites.json'), true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
if (!is_array($expected) || !$expected || array_filter($expected, static fn($line) => !is_string($line) || trim($line) === '')) throw new RuntimeException('Некорректный согласованный источник requisites');
|
||||||
|
if (($config['requisites'] ?? null) === $expected) { echo "requisites актуальны: конфиг не изменён\n"; exit(0); }
|
||||||
|
$patched = replaceRequisites($raw, json_encode($expected, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR));
|
||||||
|
$actual = json_decode($patched, true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
$config['requisites'] = $expected;
|
||||||
|
// JSON-порядок ключей не меняет контракт, остальные значения должны совпасть.
|
||||||
|
if ($actual != $config) throw new RuntimeException('Изменились несогласованные поля');
|
||||||
|
if (file_put_contents($path, $patched, LOCK_EX) === false) throw new RuntimeException('Запись config не удалась');
|
||||||
|
echo "Изменён только requisites по решению владельца preland#11\n"; exit(10);
|
||||||
|
} catch (Throwable $error) { fwrite(STDERR, $error->getMessage() . "\n"); exit(2); }
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
<?php
|
||||||
|
/** preland#11: проверенный состав ресурсов; исполняется до SFTP. */
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
function releaseAssetBytes(string $path, string $bytes): string
|
||||||
|
{
|
||||||
|
return preg_match('/\.(svg|css|html|webmanifest)$/', $path) ? str_replace("\r\n", "\n", $bytes) : $bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
function releaseStaticFiles(string $root): array
|
||||||
|
{
|
||||||
|
$files = [];
|
||||||
|
foreach (scandir($root) as $name) {
|
||||||
|
if (in_array($name, ['docs', 'favicon', 'fonts', 'images'], true) || ctype_digit($name)) {
|
||||||
|
$directory = $root . '/' . $name;
|
||||||
|
if (!is_dir($directory)) continue;
|
||||||
|
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS));
|
||||||
|
foreach ($iterator as $entry) {
|
||||||
|
$path = str_replace('\\', '/', substr($entry->getPathname(), strlen($root) + 1));
|
||||||
|
if ($name === 'docs' && !preg_match('~^docs/[^/]+\.(svg|pdf)$~', $path)) continue;
|
||||||
|
if ($entry->isFile()) $files[] = $path;
|
||||||
|
}
|
||||||
|
} elseif (preg_match('/\.css$/', $name) || $name === 'requisites.html') {
|
||||||
|
$files[] = $name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort($files, SORT_STRING);
|
||||||
|
return $files;
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateReleaseAssets(string $root): array
|
||||||
|
{
|
||||||
|
$manifest = json_decode((string) file_get_contents($root . '/release/assets.json'), true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
$files = $manifest['files'] ?? [];
|
||||||
|
$required = ['docs/logo.svg', 'docs/logo-alt.svg', 'docs/privacy_policy.pdf', 'docs/public_offer.pdf', 'docs/tariffs.pdf', 'docs/user_agreement.pdf', 'requisites.html'];
|
||||||
|
foreach ($required as $path) {
|
||||||
|
if (!isset($files[$path])) throw new RuntimeException('В manifest отсутствует обязательный ресурс ' . $path);
|
||||||
|
}
|
||||||
|
$names = array_keys($files); sort($names, SORT_STRING);
|
||||||
|
if ($names !== releaseStaticFiles($root)) throw new RuntimeException('Состав статических ресурсов отличается от manifest; синхронизируйте актуальный набор');
|
||||||
|
foreach ($files as $path => $record) {
|
||||||
|
if (!preg_match('~^[A-Za-z0-9._/-]+$~', $path) || str_contains($path, '..')) throw new RuntimeException('Недопустимый путь ресурса');
|
||||||
|
$bytes = releaseAssetBytes($path, (string) file_get_contents($root . '/' . $path));
|
||||||
|
$blob = sha1('blob ' . strlen($bytes) . chr(0) . $bytes);
|
||||||
|
if ($blob === '91267982e1ad373b6ebd5fb2b761b34fe2a0c2a5' || preg_match('/WBE\s*70/i', $bytes)) {
|
||||||
|
throw new RuntimeException('Запрещённая заглушка бренда: ' . $path);
|
||||||
|
}
|
||||||
|
if (($record['sha256'] ?? '') !== hash('sha256', $bytes)) throw new RuntimeException('Ресурс не соответствует согласованному снимку: ' . $path);
|
||||||
|
}
|
||||||
|
return $files;
|
||||||
|
}
|
||||||
|
|
||||||
|
function releaseFiles(string $root): array
|
||||||
|
{
|
||||||
|
$files = array_values(array_filter(releaseStaticFiles($root), static fn(string $path): bool => !preg_match('~^[0-9]+/~', $path)));
|
||||||
|
foreach (['.htaccess', 'index.php', 'i18n.php', 'template.php'] as $path) $files[] = $path;
|
||||||
|
foreach (['components', 'messages'] as $directory) {
|
||||||
|
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($root . '/' . $directory, FilesystemIterator::SKIP_DOTS));
|
||||||
|
foreach ($iterator as $entry) if ($entry->isFile() && $entry->getExtension() === 'php') {
|
||||||
|
$files[] = str_replace('\\', '/', substr($entry->getPathname(), strlen($root) + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort($files, SORT_STRING);
|
||||||
|
return $files;
|
||||||
|
}
|
||||||
|
|
||||||
|
function verifyRemoteReleaseAssets(array $files, string $base, bool $setsOnly): void
|
||||||
|
{
|
||||||
|
if (!preg_match('~^https://[A-Za-z0-9.-]+$~', $base)) throw new RuntimeException('Требуется HTTPS origin');
|
||||||
|
$count = 0;
|
||||||
|
foreach ($files as $path => $record) {
|
||||||
|
if ($setsOnly && !preg_match('~^[0-9]+/~', $path)) continue;
|
||||||
|
$context = stream_context_create(['http' => ['timeout' => 30, 'header' => "Cache-Control: no-cache\r\n"], 'ssl' => ['verify_peer' => true, 'verify_peer_name' => true]]);
|
||||||
|
$bytes = @file_get_contents($base . '/' . $path . '?release_sha=' . $record['sha256'], false, $context);
|
||||||
|
if ($bytes === false || hash('sha256', releaseAssetBytes($path, $bytes)) !== $record['sha256']) {
|
||||||
|
throw new RuntimeException('Хост отличается от Git: ' . $path . '. Сначала синхронизируйте актуальный снимок по задаче.');
|
||||||
|
}
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
|
fwrite(STDERR, "OK: remote {$count} resources\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Сверка с текущей страницей основного сайта, а не с оставшимся старым asset URL. */
|
||||||
|
function verifyPrimaryAssets(string $root, array $files): void
|
||||||
|
{
|
||||||
|
$origin = 'https://zoomzilla.ru';
|
||||||
|
$context = stream_context_create(['http' => ['timeout' => 30, 'header' => "Cache-Control: no-cache\r\n"]]);
|
||||||
|
$html = @file_get_contents($origin . '/?theme=light&preland_asset_check=1', false, $context);
|
||||||
|
if ($html === false) throw new RuntimeException('Основной сайт недоступен для сверки ресурсов');
|
||||||
|
foreach ($files as $path => $record) {
|
||||||
|
if (!str_starts_with($path, 'docs/') && !str_starts_with($path, 'favicon/')) continue;
|
||||||
|
$name = basename($path === 'docs/logo.svg' ? 'logo-light.svg' : $path);
|
||||||
|
$pattern = '~(?:src|href)=["\']([^"\']*/' . preg_quote($name, '~') . '(?:\?[^"\']*)?)["\']~';
|
||||||
|
if (!preg_match($pattern, $html, $match)) {
|
||||||
|
// Часть размеров favicon ссылается только из manifest; общий каталог тот же.
|
||||||
|
if (!str_starts_with($path, 'favicon/') || !preg_match('~href=["\']([^"\']*/favicon\.ico)["\']~', $html, $base)) throw new RuntimeException('Текущая ссылка основного сайта не найдена: ' . $path);
|
||||||
|
$url = dirname($base[1]) . '/' . $name;
|
||||||
|
} else $url = html_entity_decode($match[1], ENT_QUOTES, 'UTF-8');
|
||||||
|
if (str_starts_with($url, '/')) $url = $origin . $url;
|
||||||
|
if (!str_starts_with($url, $origin . '/')) throw new RuntimeException('Неожиданный origin ресурса: ' . $path);
|
||||||
|
$bytes = @file_get_contents($url, false, $context);
|
||||||
|
if ($bytes === false || hash('sha256', releaseAssetBytes($path, $bytes)) !== $record['sha256']) {
|
||||||
|
throw new RuntimeException('Основной сайт обновлён: синхронизируйте ' . $path . ' в Git перед выпуском');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!preg_match('~<div[^>]*class=["\'][^"\']*\bh5\b[^"\']*["\'][^>]*>\s*Наши реквизиты\s*</div>(.*?)</div>~su', $html, $block)) throw new RuntimeException('Не найдены текущие реквизиты основного сайта');
|
||||||
|
preg_match_all('~<p\b[^>]*>(.*?)</p>~su', $block[1], $paragraphs);
|
||||||
|
$actual = [];
|
||||||
|
foreach ($paragraphs[1] as $paragraph) {
|
||||||
|
$paragraph = preg_replace('/\s+/u', ' ', $paragraph);
|
||||||
|
$text = html_entity_decode(strip_tags(preg_replace('~</?br\b[^>]*>~i', "\n", $paragraph)), ENT_QUOTES, 'UTF-8');
|
||||||
|
foreach (explode("\n", $text) as $line) if (trim($line) !== '') $actual[] = trim($line);
|
||||||
|
}
|
||||||
|
$expected = json_decode(file_get_contents($root . '/release/requisites.json'), true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
if ($actual !== $expected) throw new RuntimeException('Основной сайт обновил реквизиты; сначала синхронизируйте Git');
|
||||||
|
fwrite(STDERR, "OK: primary logos/PDF/favicon/requisites актуальны\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (realpath($_SERVER['SCRIPT_FILENAME'] ?? '') === __FILE__) {
|
||||||
|
try {
|
||||||
|
$root = dirname(__DIR__);
|
||||||
|
$files = validateReleaseAssets($root);
|
||||||
|
$mode = $argv[1] ?? '--check';
|
||||||
|
if ($mode === '--files') echo implode("\n", releaseFiles($root)), "\n";
|
||||||
|
elseif ($mode === '--primary') verifyPrimaryAssets($root, $files);
|
||||||
|
elseif ($mode === '--stage-requisites') {
|
||||||
|
$base = $argv[2] ?? '';
|
||||||
|
if (!preg_match('~^https://[A-Za-z0-9.-]+$~', $base)) throw new RuntimeException('Требуется HTTPS origin');
|
||||||
|
$context = stream_context_create(['http' => ['timeout' => 30, 'header' => "Cache-Control: no-cache\r\n"]]);
|
||||||
|
$actual = json_decode((string) file_get_contents($base . '/config.json?requisites_check=1', false, $context), true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
$expected = json_decode(file_get_contents($root . '/release/requisites.json'), true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
if (($actual['requisites'] ?? null) !== $expected) throw new RuntimeException('Host config не получил актуальные requisites');
|
||||||
|
echo "OK: runtime requisites актуальны\n";
|
||||||
|
}
|
||||||
|
elseif ($mode === '--remote' || $mode === '--stage-sets') verifyRemoteReleaseAssets($files, $argv[2] ?? '', $mode === '--stage-sets');
|
||||||
|
elseif ($mode === '--check') echo 'OK: release assets ', count($files), "\n";
|
||||||
|
else throw new RuntimeException('Неизвестный режим');
|
||||||
|
} catch (Throwable $error) {
|
||||||
|
fwrite(STDERR, $error->getMessage() . "\n"); exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
/** Версия логотипа по содержимому исключает старый бренд из браузерного кеша. */
|
||||||
|
function prelandAssetUrl(string $path): string
|
||||||
|
{
|
||||||
|
global $assetsUriPrefix;
|
||||||
|
$file = dirname(__DIR__) . '/' . $path;
|
||||||
|
$version = is_file($file) ? substr(hash_file('sha256', $file), 0, 16) : 'missing';
|
||||||
|
return htmlspecialchars(rtrim($assetsUriPrefix, '/') . '/' . $path . '?v=' . $version, ENT_QUOTES, 'UTF-8');
|
||||||
|
}
|
||||||
+1
-6
@@ -1,12 +1,7 @@
|
|||||||
{
|
{
|
||||||
"host": "zoomzilla.ru",
|
"host": "zoomzilla.ru",
|
||||||
|
|
||||||
"requisites": [
|
"requisites": ["ИП Кардаполова Яна Виталийсовна","346886, Ростовская обл., г. Батайск,","ДНТ «Труд», ул. 11-я линия, д. 1195","ИНН: 616202304132,","ОГРНИП: 326619600205915"],
|
||||||
"ИП Иванов Иван Иванович",
|
|
||||||
"123123, г. Москва, Пресненская наб., 12",
|
|
||||||
"ИНН: 123404385406",
|
|
||||||
"ОГРНИП: 123420000019175"
|
|
||||||
],
|
|
||||||
|
|
||||||
"utm": {
|
"utm": {
|
||||||
"indpic": {
|
"indpic": {
|
||||||
|
|||||||
+41
-24
@@ -1,29 +1,46 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="252" height="58" viewBox="0 0 252 58" fill="none">
|
<svg width="182" height="47" viewBox="0 0 182 47" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g opacity="0.18" filter="url(#filter0_f_241_1963)">
|
||||||
<path d="M112.076 8.8L103.832 34H97.568L92.024 16.936L86.3 34H80.072L71.792 8.8H77.84L83.528 26.512L89.468 8.8H94.868L100.628 26.656L106.496 8.8H112.076ZM133.836 20.896C135.276 21.352 136.404 22.12 137.22 23.2C138.036 24.256 138.444 25.564 138.444 27.124C138.444 29.332 137.58 31.036 135.852 32.236C134.148 33.412 131.652 34 128.364 34H115.332V8.8H127.644C130.716 8.8 133.068 9.388 134.7 10.564C136.356 11.74 137.184 13.336 137.184 15.352C137.184 16.576 136.884 17.668 136.284 18.628C135.708 19.588 134.892 20.344 133.836 20.896ZM121.128 13.192V19.132H126.924C128.364 19.132 129.456 18.88 130.2 18.376C130.944 17.872 131.316 17.128 131.316 16.144C131.316 15.16 130.944 14.428 130.2 13.948C129.456 13.444 128.364 13.192 126.924 13.192H121.128ZM127.932 29.608C129.468 29.608 130.62 29.356 131.388 28.852C132.18 28.348 132.576 27.568 132.576 26.512C132.576 24.424 131.028 23.38 127.932 23.38H121.128V29.608H127.932ZM162.371 29.32V34H142.859V8.8H161.903V13.48H148.655V18.952H160.355V23.488H148.655V29.32H162.371ZM185.015 8.8V12.58L175.655 34H169.319L178.355 13.552H170.003V17.656H164.819V8.8H185.015ZM197.708 34.432C195.62 34.432 193.76 33.916 192.128 32.884C190.496 31.852 189.212 30.364 188.276 28.42C187.364 26.452 186.908 24.112 186.908 21.4C186.908 18.688 187.364 16.36 188.276 14.416C189.212 12.448 190.496 10.948 192.128 9.916C193.76 8.884 195.62 8.368 197.708 8.368C199.796 8.368 201.656 8.884 203.288 9.916C204.92 10.948 206.192 12.448 207.104 14.416C208.04 16.36 208.508 18.688 208.508 21.4C208.508 24.112 208.04 26.452 207.104 28.42C206.192 30.364 204.92 31.852 203.288 32.884C201.656 33.916 199.796 34.432 197.708 34.432ZM197.708 29.5C199.244 29.5 200.444 28.84 201.308 27.52C202.196 26.2 202.64 24.16 202.64 21.4C202.64 18.64 202.196 16.6 201.308 15.28C200.444 13.96 199.244 13.3 197.708 13.3C196.196 13.3 194.996 13.96 194.108 15.28C193.244 16.6 192.812 18.64 192.812 21.4C192.812 24.16 193.244 26.2 194.108 27.52C194.996 28.84 196.196 29.5 197.708 29.5Z" fill="url(#paint0_linear)"/>
|
<path d="M23.5 37C30.9558 37 37 30.9558 37 23.5C37 16.0442 30.9558 10 23.5 10C16.0442 10 10 16.0442 10 23.5C10 30.9558 16.0442 37 23.5 37Z" fill="url(#paint0_linear_241_1963)"/>
|
||||||
<g clip-path="url(#clip0)">
|
|
||||||
<g opacity="0.2">
|
|
||||||
<path opacity="0.2" d="M11.7632 38.9239C12.9756 37.7274 14.5725 36.9859 16.2788 36.8271C15.1981 36.7236 14.1075 36.858 13.0857 37.2205C12.0638 37.5831 11.136 38.1648 10.3689 38.9239L14.2502 42.7577C14.4826 42.5282 14.7338 42.3111 14.985 42.1374L11.7632 38.9239Z" fill="#BDBDBD"/>
|
|
||||||
</g>
|
|
||||||
<path d="M20.7944 38.9239C21.1486 39.2786 21.4663 39.6672 21.7427 40.084C20.3716 39.9581 18.9893 40.1324 17.6942 40.5946C16.3992 41.0567 15.2232 41.7953 14.2502 42.7577L10.3689 38.9239C11.7524 37.5601 13.6271 36.7942 15.5816 36.7942C17.5362 36.7942 19.4109 37.5601 20.7944 38.9239V38.9239ZM62 26.07L37.6321 2L31.1068 8.45176L50.1615 27.2735C50.3496 27.4585 50.499 27.6785 50.6009 27.9207C50.7028 28.1629 50.7552 28.4226 50.7552 28.6848C50.7552 28.9471 50.7028 29.2068 50.6009 29.449C50.499 29.6912 50.3496 29.9111 50.1615 30.0962L30.2589 49.7678C30.1549 52.0743 29.1803 54.2588 27.5269 55.8908L29.6748 58.0124L62 26.07Z" fill="url(#paint1_linear)"/>
|
|
||||||
<path opacity="0.2" d="M28.8521 55.8784C30.5026 54.2495 31.477 52.07 31.5841 49.7678L51.4992 30.0961C51.8762 29.7208 52.0877 29.2135 52.0877 28.6848C52.0877 28.1561 51.8762 27.6488 51.4992 27.2735L32.4257 8.45174L36.3258 4.5993C36.866 4.06706 37.5588 3.71186 38.3104 3.58191C37.7194 3.47529 37.1111 3.51219 36.5378 3.68942C35.9645 3.86666 35.4434 4.17892 35.0195 4.5993L31.1068 8.45174L50.1615 27.2735C50.3497 27.4585 50.499 27.6785 50.6009 27.9207C50.7028 28.1629 50.7552 28.4225 50.7552 28.6848C50.7552 28.9471 50.7028 29.2068 50.6009 29.449C50.499 29.6912 50.3497 29.9111 50.1615 30.0961L30.2589 49.7678C30.1549 52.0743 29.1803 54.2588 27.5269 55.8908L29.6748 58.0124L30.3406 57.392L28.8521 55.8784Z" fill="#BDBDBD"/>
|
|
||||||
<path d="M29.6748 9.85997L24.3679 4.61792L0 28.6755L5.30693 33.9176L8.93699 37.5033C10.7386 35.9704 13.0603 35.1672 15.4364 35.2547C17.8125 35.3423 20.0673 36.3141 21.7482 37.9753C23.4291 39.6365 24.412 41.8641 24.4995 44.2112C24.587 46.5583 23.7727 48.8513 22.22 50.6301L24.3679 52.7517L30.0203 47.1685L48.7358 28.6755L29.6748 9.85997Z" fill="#7241E2"/>
|
|
||||||
<g opacity="0.15">
|
|
||||||
<path opacity="0.15" d="M23.4196 50.6301C24.77 49.2981 25.6772 47.5909 26.0199 45.7365C26.3627 43.882 26.1248 41.9683 25.338 40.2509C24.5512 38.5334 23.2529 37.0937 21.6163 36.124C19.9798 35.1542 18.0827 34.7005 16.1783 34.8233C17.9807 34.9354 19.712 35.5589 21.1645 36.619C22.617 37.6791 23.7289 39.1306 24.3668 40.7995C25.0047 42.4684 25.1414 44.2837 24.7606 46.0274C24.3798 47.7712 23.4977 49.3694 22.22 50.6301L24.3679 52.7518L24.996 52.1314L23.4196 50.6301Z" fill="#BDBDBD"/>
|
|
||||||
<path opacity="0.15" d="M6.51276 33.93L1.19955 28.6755L22.9423 7.21103C23.4931 6.66825 24.2027 6.31018 24.9708 6.18744C24.3882 6.09254 23.791 6.13587 23.2286 6.31384C22.6662 6.49182 22.1548 6.79934 21.7364 7.21103L0 28.6755L5.30693 33.9176L8.93699 37.5033C9.13577 37.3039 9.34543 37.1155 9.56503 36.9387L6.51276 33.93Z" fill="#BDBDBD"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
</g>
|
||||||
|
<path d="M8.11627 23.5001C11.4128 16.2164 16.8442 12.5117 23.5 12.5117C30.1558 12.5117 35.5872 16.2164 38.8837 23.5001C35.5872 30.7838 30.1558 34.4885 23.5 34.4885C16.8442 34.4885 11.4128 30.7838 8.11627 23.5001Z" fill="#090812" stroke="url(#paint1_linear_241_1963)" stroke-width="2.6" stroke-linejoin="round"/>
|
||||||
|
<path d="M23.5 29.7791C26.9678 29.7791 29.7791 26.9679 29.7791 23.5C29.7791 20.0322 26.9678 17.2209 23.5 17.2209C20.0322 17.2209 17.2209 20.0322 17.2209 23.5C17.2209 26.9679 20.0322 29.7791 23.5 29.7791Z" fill="url(#paint2_linear_241_1963)"/>
|
||||||
|
<path d="M23.5 26.3255C25.0605 26.3255 26.3256 25.0604 26.3256 23.4999C26.3256 21.9394 25.0605 20.6743 23.5 20.6743C21.9395 20.6743 20.6744 21.9394 20.6744 23.4999C20.6744 25.0604 21.9395 26.3255 23.5 26.3255Z" fill="#090812"/>
|
||||||
|
<path d="M28.8372 15.0232L29.936 17.6918L32.6046 18.7906L29.936 19.8895L28.8372 22.5581L27.7384 19.8895L25.0698 18.7906L27.7384 17.6918L28.8372 15.0232Z" fill="white"/>
|
||||||
|
<path d="M14.7093 27.2673H13.7674C13.4206 27.2673 13.1395 27.5485 13.1395 27.8952V28.8371C13.1395 29.1839 13.4206 29.465 13.7674 29.465H14.7093C15.0561 29.465 15.3372 29.1839 15.3372 28.8371V27.8952C15.3372 27.5485 15.0561 27.2673 14.7093 27.2673Z" fill="#6AA7FF"/>
|
||||||
|
<path d="M18.9477 29.1511H17.6919C17.2584 29.1511 16.907 29.5025 16.907 29.936V31.1918C16.907 31.6253 17.2584 31.9767 17.6919 31.9767H18.9477C19.3812 31.9767 19.7326 31.6253 19.7326 31.1918V29.936C19.7326 29.5025 19.3812 29.1511 18.9477 29.1511Z" fill="#7B5CFF"/>
|
||||||
|
<path d="M23.814 30.407H21.9302C21.4101 30.407 20.9884 30.8287 20.9884 31.3488V33.2326C20.9884 33.7527 21.4101 34.1744 21.9302 34.1744H23.814C24.3341 34.1744 24.7558 33.7527 24.7558 33.2326V31.3488C24.7558 30.8287 24.3341 30.407 23.814 30.407Z" fill="#D21BCE"/>
|
||||||
|
<path d="M31.3488 29.7791L36.0581 34.4884" stroke="url(#paint3_linear_241_1963)" stroke-width="2.6" stroke-linecap="round"/>
|
||||||
|
<path d="M48.3163 34V33.604L56.8363 19.432H48.9163V16.72H61.8403V17.128L53.3683 31.276H61.6363V34H48.3163ZM70.4343 34.36C69.1383 34.36 68.0063 34.068 67.0383 33.484C66.0703 32.9 65.3183 32.096 64.7823 31.072C64.2543 30.04 63.9903 28.856 63.9903 27.52C63.9903 26.16 64.2623 24.968 64.8063 23.944C65.3503 22.92 66.1063 22.12 67.0743 21.544C68.0423 20.968 69.1623 20.68 70.4343 20.68C71.7383 20.68 72.8743 20.972 73.8423 21.556C74.8103 22.14 75.5623 22.948 76.0983 23.98C76.6343 25.004 76.9023 26.184 76.9023 27.52C76.9023 28.864 76.6303 30.052 76.0863 31.084C75.5503 32.108 74.7983 32.912 73.8303 33.496C72.8623 34.072 71.7303 34.36 70.4343 34.36ZM70.4343 31.648C71.5863 31.648 72.4423 31.264 73.0023 30.496C73.5623 29.728 73.8423 28.736 73.8423 27.52C73.8423 26.264 73.5583 25.264 72.9903 24.52C72.4223 23.768 71.5703 23.392 70.4343 23.392C69.6583 23.392 69.0183 23.568 68.5143 23.92C68.0183 24.264 67.6503 24.748 67.4103 25.372C67.1703 25.988 67.0503 26.704 67.0503 27.52C67.0503 28.776 67.3343 29.78 67.9023 30.532C68.4783 31.276 69.3223 31.648 70.4343 31.648ZM85.2703 34.36C83.9743 34.36 82.8423 34.068 81.8743 33.484C80.9063 32.9 80.1543 32.096 79.6183 31.072C79.0903 30.04 78.8263 28.856 78.8263 27.52C78.8263 26.16 79.0983 24.968 79.6423 23.944C80.1863 22.92 80.9423 22.12 81.9103 21.544C82.8783 20.968 83.9983 20.68 85.2703 20.68C86.5743 20.68 87.7103 20.972 88.6783 21.556C89.6463 22.14 90.3983 22.948 90.9343 23.98C91.4703 25.004 91.7383 26.184 91.7383 27.52C91.7383 28.864 91.4663 30.052 90.9223 31.084C90.3863 32.108 89.6343 32.912 88.6663 33.496C87.6983 34.072 86.5663 34.36 85.2703 34.36ZM85.2703 31.648C86.4223 31.648 87.2783 31.264 87.8383 30.496C88.3983 29.728 88.6783 28.736 88.6783 27.52C88.6783 26.264 88.3943 25.264 87.8263 24.52C87.2583 23.768 86.4063 23.392 85.2703 23.392C84.4943 23.392 83.8543 23.568 83.3503 23.92C82.8543 24.264 82.4863 24.748 82.2463 25.372C82.0063 25.988 81.8863 26.704 81.8863 27.52C81.8863 28.776 82.1703 29.78 82.7383 30.532C83.3143 31.276 84.1583 31.648 85.2703 31.648ZM109.946 34V26.128C109.946 25.24 109.726 24.548 109.286 24.052C108.846 23.548 108.25 23.296 107.498 23.296C107.034 23.296 106.618 23.404 106.25 23.62C105.882 23.828 105.59 24.14 105.374 24.556C105.158 24.964 105.05 25.452 105.05 26.02L103.766 25.264C103.758 24.368 103.958 23.58 104.366 22.9C104.782 22.212 105.342 21.676 106.046 21.292C106.75 20.908 107.534 20.716 108.398 20.716C109.83 20.716 110.926 21.148 111.686 22.012C112.454 22.868 112.838 23.996 112.838 25.396V34H109.946ZM94.3582 34V21.04H96.9142V25.06H97.2742V34H94.3582ZM102.17 34V26.164C102.17 25.26 101.95 24.556 101.51 24.052C101.07 23.548 100.47 23.296 99.7102 23.296C98.9742 23.296 98.3822 23.548 97.9342 24.052C97.4942 24.556 97.2742 25.212 97.2742 26.02L95.9782 25.156C95.9782 24.316 96.1862 23.56 96.6022 22.888C97.0182 22.216 97.5782 21.688 98.2822 21.304C98.9942 20.912 99.7902 20.716 100.67 20.716C101.638 20.716 102.446 20.924 103.094 21.34C103.75 21.748 104.238 22.308 104.558 23.02C104.886 23.724 105.05 24.52 105.05 25.408V34H102.17ZM114.768 34V33.604L121.632 23.572H115.464V21.04H126.132V21.448L119.292 31.468H125.844V34H114.768ZM129.005 19.072V16.42H131.897V19.072H129.005ZM129.005 34V21.04H131.897V34H129.005ZM135.732 34V16.36H138.624V34H135.732ZM142.458 34V16.36H145.35V34H142.458ZM152.569 34.36C151.633 34.36 150.841 34.184 150.193 33.832C149.545 33.472 149.053 32.996 148.717 32.404C148.389 31.812 148.225 31.16 148.225 30.448C148.225 29.824 148.329 29.264 148.537 28.768C148.745 28.264 149.065 27.832 149.497 27.472C149.929 27.104 150.489 26.804 151.177 26.572C151.697 26.404 152.305 26.252 153.001 26.116C153.705 25.98 154.465 25.856 155.281 25.744C156.105 25.624 156.965 25.496 157.861 25.36L156.829 25.948C156.837 25.052 156.637 24.392 156.229 23.968C155.821 23.544 155.133 23.332 154.165 23.332C153.581 23.332 153.017 23.468 152.473 23.74C151.929 24.012 151.549 24.48 151.333 25.144L148.693 24.316C149.013 23.22 149.621 22.34 150.517 21.676C151.421 21.012 152.637 20.68 154.165 20.68C155.317 20.68 156.329 20.868 157.201 21.244C158.081 21.62 158.733 22.236 159.157 23.092C159.389 23.548 159.529 24.016 159.577 24.496C159.625 24.968 159.649 25.484 159.649 26.044V34H157.117V31.192L157.537 31.648C156.953 32.584 156.269 33.272 155.485 33.712C154.709 34.144 153.737 34.36 152.569 34.36ZM153.145 32.056C153.801 32.056 154.361 31.94 154.825 31.708C155.289 31.476 155.657 31.192 155.929 30.856C156.209 30.52 156.397 30.204 156.493 29.908C156.645 29.54 156.729 29.12 156.745 28.648C156.769 28.168 156.781 27.78 156.781 27.484L157.669 27.748C156.797 27.884 156.049 28.004 155.425 28.108C154.801 28.212 154.265 28.312 153.817 28.408C153.369 28.496 152.973 28.596 152.629 28.708C152.293 28.828 152.009 28.968 151.777 29.128C151.545 29.288 151.365 29.472 151.237 29.68C151.117 29.888 151.057 30.132 151.057 30.412C151.057 30.732 151.137 31.016 151.297 31.264C151.457 31.504 151.689 31.696 151.993 31.84C152.305 31.984 152.689 32.056 153.145 32.056Z" fill="url(#paint4_linear_241_1963)"/>
|
||||||
|
<path d="M162.466 34.5V32.6475H164.319V34.5H162.466ZM166.722 34.5V26.4H168.319V28.3725L168.124 28.1175C168.224 27.8475 168.357 27.6025 168.522 27.3825C168.692 27.1575 168.894 26.9725 169.129 26.8275C169.329 26.6925 169.549 26.5875 169.789 26.5125C170.034 26.4325 170.284 26.385 170.539 26.37C170.794 26.35 171.042 26.36 171.282 26.4V28.0875C171.042 28.0175 170.764 27.995 170.449 28.02C170.139 28.045 169.859 28.1325 169.609 28.2825C169.359 28.4175 169.154 28.59 168.994 28.8C168.839 29.01 168.724 29.25 168.649 29.52C168.574 29.785 168.537 30.0725 168.537 30.3825V34.5H166.722ZM175.751 34.7325C175.151 34.7325 174.656 34.6325 174.266 34.4325C173.876 34.2325 173.566 33.9775 173.336 33.6675C173.106 33.3575 172.936 33.0275 172.826 32.6775C172.716 32.3275 172.643 31.9975 172.608 31.6875C172.578 31.3725 172.563 31.1175 172.563 30.9225V26.4H174.393V30.3C174.393 30.55 174.411 30.8325 174.446 31.1475C174.481 31.4575 174.561 31.7575 174.686 32.0475C174.816 32.3325 175.006 32.5675 175.256 32.7525C175.511 32.9375 175.853 33.03 176.283 33.03C176.513 33.03 176.741 32.9925 176.966 32.9175C177.191 32.8425 177.393 32.715 177.573 32.535C177.758 32.35 177.906 32.0975 178.016 31.7775C178.126 31.4575 178.181 31.0525 178.181 30.5625L179.253 31.02C179.253 31.71 179.118 32.335 178.848 32.895C178.583 33.455 178.191 33.9025 177.671 34.2375C177.151 34.5675 176.511 34.7325 175.751 34.7325ZM178.398 34.5V31.9875H178.181V26.4H179.996V34.5H178.398Z" fill="#8EA2D9"/>
|
||||||
<defs>
|
<defs>
|
||||||
<linearGradient id="paint0_linear" x1="71" y1="21.5" x2="210" y2="21.5" gradientUnits="userSpaceOnUse">
|
<filter id="filter0_f_241_1963" x="0" y="0" width="47" height="47" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
<stop stop-color="#7241E2"/>
|
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||||
<stop offset="1" stop-color="#F413B5"/>
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||||
|
<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_241_1963"/>
|
||||||
|
</filter>
|
||||||
|
<linearGradient id="paint0_linear_241_1963" x1="7.80233" y1="9.05814" x2="40.4535" y2="38.5698" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#6AA7FF"/>
|
||||||
|
<stop offset="0.5" stop-color="#7B5CFF"/>
|
||||||
|
<stop offset="1" stop-color="#D21BCE"/>
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<linearGradient id="paint1_linear" x1="10.3689" y1="30.0062" x2="62" y2="30.0062" gradientUnits="userSpaceOnUse">
|
<linearGradient id="paint1_linear_241_1963" x1="7.80232" y1="9.05823" x2="40.4535" y2="38.5699" gradientUnits="userSpaceOnUse">
|
||||||
<stop stop-color="#662AF0"/>
|
<stop stop-color="#6AA7FF"/>
|
||||||
<stop offset="1" stop-color="#EF1AB3"/>
|
<stop offset="0.5" stop-color="#7B5CFF"/>
|
||||||
|
<stop offset="1" stop-color="#D21BCE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint2_linear_241_1963" x1="7.80231" y1="9.05816" x2="40.4535" y2="38.5698" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#6AA7FF"/>
|
||||||
|
<stop offset="0.5" stop-color="#7B5CFF"/>
|
||||||
|
<stop offset="1" stop-color="#D21BCE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint3_linear_241_1963" x1="7.8023" y1="9.05812" x2="40.4535" y2="38.5698" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#6AA7FF"/>
|
||||||
|
<stop offset="0.5" stop-color="#7B5CFF"/>
|
||||||
|
<stop offset="1" stop-color="#D21BCE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint4_linear_241_1963" x1="47.1163" y1="24.5" x2="161.116" y2="24.5" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#F9F9F9"/>
|
||||||
|
<stop offset="1" stop-color="#8EA2D9"/>
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<clipPath id="clip0">
|
|
||||||
<rect width="62" height="56" fill="white" transform="translate(0 2)"/>
|
|
||||||
</clipPath>
|
|
||||||
</defs>
|
</defs>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 10 KiB |
+41
-24
@@ -1,29 +1,46 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="252" height="58" viewBox="0 0 252 58" fill="none">
|
<svg width="182" height="47" viewBox="0 0 182 47" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g opacity="0.18" filter="url(#filter0_f_241_2041)">
|
||||||
<path d="M112.076 8.8L103.832 34H97.568L92.024 16.936L86.3 34H80.072L71.792 8.8H77.84L83.528 26.512L89.468 8.8H94.868L100.628 26.656L106.496 8.8H112.076ZM133.836 20.896C135.276 21.352 136.404 22.12 137.22 23.2C138.036 24.256 138.444 25.564 138.444 27.124C138.444 29.332 137.58 31.036 135.852 32.236C134.148 33.412 131.652 34 128.364 34H115.332V8.8H127.644C130.716 8.8 133.068 9.388 134.7 10.564C136.356 11.74 137.184 13.336 137.184 15.352C137.184 16.576 136.884 17.668 136.284 18.628C135.708 19.588 134.892 20.344 133.836 20.896ZM121.128 13.192V19.132H126.924C128.364 19.132 129.456 18.88 130.2 18.376C130.944 17.872 131.316 17.128 131.316 16.144C131.316 15.16 130.944 14.428 130.2 13.948C129.456 13.444 128.364 13.192 126.924 13.192H121.128ZM127.932 29.608C129.468 29.608 130.62 29.356 131.388 28.852C132.18 28.348 132.576 27.568 132.576 26.512C132.576 24.424 131.028 23.38 127.932 23.38H121.128V29.608H127.932ZM162.371 29.32V34H142.859V8.8H161.903V13.48H148.655V18.952H160.355V23.488H148.655V29.32H162.371ZM185.015 8.8V12.58L175.655 34H169.319L178.355 13.552H170.003V17.656H164.819V8.8H185.015ZM197.708 34.432C195.62 34.432 193.76 33.916 192.128 32.884C190.496 31.852 189.212 30.364 188.276 28.42C187.364 26.452 186.908 24.112 186.908 21.4C186.908 18.688 187.364 16.36 188.276 14.416C189.212 12.448 190.496 10.948 192.128 9.916C193.76 8.884 195.62 8.368 197.708 8.368C199.796 8.368 201.656 8.884 203.288 9.916C204.92 10.948 206.192 12.448 207.104 14.416C208.04 16.36 208.508 18.688 208.508 21.4C208.508 24.112 208.04 26.452 207.104 28.42C206.192 30.364 204.92 31.852 203.288 32.884C201.656 33.916 199.796 34.432 197.708 34.432ZM197.708 29.5C199.244 29.5 200.444 28.84 201.308 27.52C202.196 26.2 202.64 24.16 202.64 21.4C202.64 18.64 202.196 16.6 201.308 15.28C200.444 13.96 199.244 13.3 197.708 13.3C196.196 13.3 194.996 13.96 194.108 15.28C193.244 16.6 192.812 18.64 192.812 21.4C192.812 24.16 193.244 26.2 194.108 27.52C194.996 28.84 196.196 29.5 197.708 29.5Z" fill="url(#paint0_linear)"/>
|
<path d="M23.5 37C30.9558 37 37 30.9558 37 23.5C37 16.0442 30.9558 10 23.5 10C16.0442 10 10 16.0442 10 23.5C10 30.9558 16.0442 37 23.5 37Z" fill="url(#paint0_linear_241_2041)"/>
|
||||||
<g clip-path="url(#clip0)">
|
|
||||||
<g opacity="0.2">
|
|
||||||
<path opacity="0.2" d="M11.7632 38.9239C12.9756 37.7274 14.5725 36.9859 16.2788 36.8271C15.1981 36.7236 14.1075 36.858 13.0857 37.2205C12.0638 37.5831 11.136 38.1648 10.3689 38.9239L14.2502 42.7577C14.4826 42.5282 14.7338 42.3111 14.985 42.1374L11.7632 38.9239Z" fill="#BDBDBD"/>
|
|
||||||
</g>
|
|
||||||
<path d="M20.7944 38.9239C21.1486 39.2786 21.4663 39.6672 21.7427 40.084C20.3716 39.9581 18.9893 40.1324 17.6942 40.5946C16.3992 41.0567 15.2232 41.7953 14.2502 42.7577L10.3689 38.9239C11.7524 37.5601 13.6271 36.7942 15.5816 36.7942C17.5362 36.7942 19.4109 37.5601 20.7944 38.9239V38.9239ZM62 26.07L37.6321 2L31.1068 8.45176L50.1615 27.2735C50.3496 27.4585 50.499 27.6785 50.6009 27.9207C50.7028 28.1629 50.7552 28.4226 50.7552 28.6848C50.7552 28.9471 50.7028 29.2068 50.6009 29.449C50.499 29.6912 50.3496 29.9111 50.1615 30.0962L30.2589 49.7678C30.1549 52.0743 29.1803 54.2588 27.5269 55.8908L29.6748 58.0124L62 26.07Z" fill="url(#paint1_linear)"/>
|
|
||||||
<path opacity="0.2" d="M28.8521 55.8784C30.5026 54.2495 31.477 52.07 31.5841 49.7678L51.4992 30.0961C51.8762 29.7208 52.0877 29.2135 52.0877 28.6848C52.0877 28.1561 51.8762 27.6488 51.4992 27.2735L32.4257 8.45174L36.3258 4.5993C36.866 4.06706 37.5588 3.71186 38.3104 3.58191C37.7194 3.47529 37.1111 3.51219 36.5378 3.68942C35.9645 3.86666 35.4434 4.17892 35.0195 4.5993L31.1068 8.45174L50.1615 27.2735C50.3497 27.4585 50.499 27.6785 50.6009 27.9207C50.7028 28.1629 50.7552 28.4225 50.7552 28.6848C50.7552 28.9471 50.7028 29.2068 50.6009 29.449C50.499 29.6912 50.3497 29.9111 50.1615 30.0961L30.2589 49.7678C30.1549 52.0743 29.1803 54.2588 27.5269 55.8908L29.6748 58.0124L30.3406 57.392L28.8521 55.8784Z" fill="#BDBDBD"/>
|
|
||||||
<path d="M29.6748 9.85997L24.3679 4.61792L0 28.6755L5.30693 33.9176L8.93699 37.5033C10.7386 35.9704 13.0603 35.1672 15.4364 35.2547C17.8125 35.3423 20.0673 36.3141 21.7482 37.9753C23.4291 39.6365 24.412 41.8641 24.4995 44.2112C24.587 46.5583 23.7727 48.8513 22.22 50.6301L24.3679 52.7517L30.0203 47.1685L48.7358 28.6755L29.6748 9.85997Z" fill="#7241E2"/>
|
|
||||||
<g opacity="0.15">
|
|
||||||
<path opacity="0.15" d="M23.4196 50.6301C24.77 49.2981 25.6772 47.5909 26.0199 45.7365C26.3627 43.882 26.1248 41.9683 25.338 40.2509C24.5512 38.5334 23.2529 37.0937 21.6163 36.124C19.9798 35.1542 18.0827 34.7005 16.1783 34.8233C17.9807 34.9354 19.712 35.5589 21.1645 36.619C22.617 37.6791 23.7289 39.1306 24.3668 40.7995C25.0047 42.4684 25.1414 44.2837 24.7606 46.0274C24.3798 47.7712 23.4977 49.3694 22.22 50.6301L24.3679 52.7518L24.996 52.1314L23.4196 50.6301Z" fill="#BDBDBD"/>
|
|
||||||
<path opacity="0.15" d="M6.51276 33.93L1.19955 28.6755L22.9423 7.21103C23.4931 6.66825 24.2027 6.31018 24.9708 6.18744C24.3882 6.09254 23.791 6.13587 23.2286 6.31384C22.6662 6.49182 22.1548 6.79934 21.7364 7.21103L0 28.6755L5.30693 33.9176L8.93699 37.5033C9.13577 37.3039 9.34543 37.1155 9.56503 36.9387L6.51276 33.93Z" fill="#BDBDBD"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
</g>
|
||||||
|
<path d="M8.11628 23.5001C11.4128 16.2164 16.8442 12.5117 23.5 12.5117C30.1558 12.5117 35.5872 16.2164 38.8837 23.5001C35.5872 30.7838 30.1558 34.4885 23.5 34.4885C16.8442 34.4885 11.4128 30.7838 8.11628 23.5001Z" fill="#090812" stroke="url(#paint1_linear_241_2041)" stroke-width="2.6" stroke-linejoin="round"/>
|
||||||
|
<path d="M23.5 29.7791C26.9678 29.7791 29.7791 26.9679 29.7791 23.5C29.7791 20.0322 26.9678 17.2209 23.5 17.2209C20.0322 17.2209 17.2209 20.0322 17.2209 23.5C17.2209 26.9679 20.0322 29.7791 23.5 29.7791Z" fill="url(#paint2_linear_241_2041)"/>
|
||||||
|
<path d="M23.5 26.3255C25.0605 26.3255 26.3256 25.0604 26.3256 23.4999C26.3256 21.9394 25.0605 20.6743 23.5 20.6743C21.9395 20.6743 20.6744 21.9394 20.6744 23.4999C20.6744 25.0604 21.9395 26.3255 23.5 26.3255Z" fill="#090812"/>
|
||||||
|
<path d="M28.8372 15.0232L29.936 17.6918L32.6047 18.7906L29.936 19.8895L28.8372 22.5581L27.7384 19.8895L25.0698 18.7906L27.7384 17.6918L28.8372 15.0232Z" fill="white"/>
|
||||||
|
<path d="M14.7093 27.2673H13.7674C13.4207 27.2673 13.1395 27.5485 13.1395 27.8952V28.8371C13.1395 29.1839 13.4207 29.465 13.7674 29.465H14.7093C15.0561 29.465 15.3372 29.1839 15.3372 28.8371V27.8952C15.3372 27.5485 15.0561 27.2673 14.7093 27.2673Z" fill="#6AA7FF"/>
|
||||||
|
<path d="M18.9477 29.1511H17.6919C17.2584 29.1511 16.907 29.5025 16.907 29.936V31.1918C16.907 31.6253 17.2584 31.9767 17.6919 31.9767H18.9477C19.3812 31.9767 19.7326 31.6253 19.7326 31.1918V29.936C19.7326 29.5025 19.3812 29.1511 18.9477 29.1511Z" fill="#7B5CFF"/>
|
||||||
|
<path d="M23.814 30.407H21.9302C21.4101 30.407 20.9884 30.8287 20.9884 31.3488V33.2326C20.9884 33.7527 21.4101 34.1744 21.9302 34.1744H23.814C24.3341 34.1744 24.7558 33.7527 24.7558 33.2326V31.3488C24.7558 30.8287 24.3341 30.407 23.814 30.407Z" fill="#D21BCE"/>
|
||||||
|
<path d="M31.3488 29.7791L36.0581 34.4884" stroke="url(#paint3_linear_241_2041)" stroke-width="2.6" stroke-linecap="round"/>
|
||||||
|
<path d="M48.3163 34V33.604L56.8363 19.432H48.9163V16.72H61.8403V17.128L53.3683 31.276H61.6363V34H48.3163ZM70.4343 34.36C69.1383 34.36 68.0063 34.068 67.0383 33.484C66.0703 32.9 65.3183 32.096 64.7823 31.072C64.2543 30.04 63.9903 28.856 63.9903 27.52C63.9903 26.16 64.2623 24.968 64.8063 23.944C65.3503 22.92 66.1063 22.12 67.0743 21.544C68.0423 20.968 69.1623 20.68 70.4343 20.68C71.7383 20.68 72.8743 20.972 73.8423 21.556C74.8103 22.14 75.5623 22.948 76.0983 23.98C76.6343 25.004 76.9023 26.184 76.9023 27.52C76.9023 28.864 76.6303 30.052 76.0863 31.084C75.5503 32.108 74.7983 32.912 73.8303 33.496C72.8623 34.072 71.7303 34.36 70.4343 34.36ZM70.4343 31.648C71.5863 31.648 72.4423 31.264 73.0023 30.496C73.5623 29.728 73.8423 28.736 73.8423 27.52C73.8423 26.264 73.5583 25.264 72.9903 24.52C72.4223 23.768 71.5703 23.392 70.4343 23.392C69.6583 23.392 69.0183 23.568 68.5143 23.92C68.0183 24.264 67.6503 24.748 67.4103 25.372C67.1703 25.988 67.0503 26.704 67.0503 27.52C67.0503 28.776 67.3343 29.78 67.9023 30.532C68.4783 31.276 69.3223 31.648 70.4343 31.648ZM85.2703 34.36C83.9743 34.36 82.8423 34.068 81.8743 33.484C80.9063 32.9 80.1543 32.096 79.6183 31.072C79.0903 30.04 78.8263 28.856 78.8263 27.52C78.8263 26.16 79.0983 24.968 79.6423 23.944C80.1863 22.92 80.9423 22.12 81.9103 21.544C82.8783 20.968 83.9983 20.68 85.2703 20.68C86.5743 20.68 87.7103 20.972 88.6783 21.556C89.6463 22.14 90.3983 22.948 90.9343 23.98C91.4703 25.004 91.7383 26.184 91.7383 27.52C91.7383 28.864 91.4663 30.052 90.9223 31.084C90.3863 32.108 89.6343 32.912 88.6663 33.496C87.6983 34.072 86.5663 34.36 85.2703 34.36ZM85.2703 31.648C86.4223 31.648 87.2783 31.264 87.8383 30.496C88.3983 29.728 88.6783 28.736 88.6783 27.52C88.6783 26.264 88.3943 25.264 87.8263 24.52C87.2583 23.768 86.4063 23.392 85.2703 23.392C84.4943 23.392 83.8543 23.568 83.3503 23.92C82.8543 24.264 82.4863 24.748 82.2463 25.372C82.0063 25.988 81.8863 26.704 81.8863 27.52C81.8863 28.776 82.1703 29.78 82.7383 30.532C83.3143 31.276 84.1583 31.648 85.2703 31.648ZM109.946 34V26.128C109.946 25.24 109.726 24.548 109.286 24.052C108.846 23.548 108.25 23.296 107.498 23.296C107.034 23.296 106.618 23.404 106.25 23.62C105.882 23.828 105.59 24.14 105.374 24.556C105.158 24.964 105.05 25.452 105.05 26.02L103.766 25.264C103.758 24.368 103.958 23.58 104.366 22.9C104.782 22.212 105.342 21.676 106.046 21.292C106.75 20.908 107.534 20.716 108.398 20.716C109.83 20.716 110.926 21.148 111.686 22.012C112.454 22.868 112.838 23.996 112.838 25.396V34H109.946ZM94.3582 34V21.04H96.9142V25.06H97.2742V34H94.3582ZM102.17 34V26.164C102.17 25.26 101.95 24.556 101.51 24.052C101.07 23.548 100.47 23.296 99.7102 23.296C98.9742 23.296 98.3822 23.548 97.9342 24.052C97.4942 24.556 97.2742 25.212 97.2742 26.02L95.9782 25.156C95.9782 24.316 96.1862 23.56 96.6022 22.888C97.0182 22.216 97.5782 21.688 98.2822 21.304C98.9942 20.912 99.7902 20.716 100.67 20.716C101.638 20.716 102.446 20.924 103.094 21.34C103.75 21.748 104.238 22.308 104.558 23.02C104.886 23.724 105.05 24.52 105.05 25.408V34H102.17ZM114.768 34V33.604L121.632 23.572H115.464V21.04H126.132V21.448L119.292 31.468H125.844V34H114.768ZM129.005 19.072V16.42H131.897V19.072H129.005ZM129.005 34V21.04H131.897V34H129.005ZM135.732 34V16.36H138.624V34H135.732ZM142.458 34V16.36H145.35V34H142.458ZM152.569 34.36C151.633 34.36 150.841 34.184 150.193 33.832C149.545 33.472 149.053 32.996 148.717 32.404C148.389 31.812 148.225 31.16 148.225 30.448C148.225 29.824 148.329 29.264 148.537 28.768C148.745 28.264 149.065 27.832 149.497 27.472C149.929 27.104 150.489 26.804 151.177 26.572C151.697 26.404 152.305 26.252 153.001 26.116C153.705 25.98 154.465 25.856 155.281 25.744C156.105 25.624 156.965 25.496 157.861 25.36L156.829 25.948C156.837 25.052 156.637 24.392 156.229 23.968C155.821 23.544 155.133 23.332 154.165 23.332C153.581 23.332 153.017 23.468 152.473 23.74C151.929 24.012 151.549 24.48 151.333 25.144L148.693 24.316C149.013 23.22 149.621 22.34 150.517 21.676C151.421 21.012 152.637 20.68 154.165 20.68C155.317 20.68 156.329 20.868 157.201 21.244C158.081 21.62 158.733 22.236 159.157 23.092C159.389 23.548 159.529 24.016 159.577 24.496C159.625 24.968 159.649 25.484 159.649 26.044V34H157.117V31.192L157.537 31.648C156.953 32.584 156.269 33.272 155.485 33.712C154.709 34.144 153.737 34.36 152.569 34.36ZM153.145 32.056C153.801 32.056 154.361 31.94 154.825 31.708C155.289 31.476 155.657 31.192 155.929 30.856C156.209 30.52 156.397 30.204 156.493 29.908C156.645 29.54 156.729 29.12 156.745 28.648C156.769 28.168 156.781 27.78 156.781 27.484L157.669 27.748C156.797 27.884 156.049 28.004 155.425 28.108C154.801 28.212 154.265 28.312 153.817 28.408C153.369 28.496 152.973 28.596 152.629 28.708C152.293 28.828 152.009 28.968 151.777 29.128C151.545 29.288 151.365 29.472 151.237 29.68C151.117 29.888 151.057 30.132 151.057 30.412C151.057 30.732 151.137 31.016 151.297 31.264C151.457 31.504 151.689 31.696 151.993 31.84C152.305 31.984 152.689 32.056 153.145 32.056Z" fill="url(#paint4_linear_241_2041)"/>
|
||||||
|
<path d="M162.466 34.5V32.6475H164.319V34.5H162.466ZM166.722 34.5V26.4H168.319V28.3725L168.124 28.1175C168.224 27.8475 168.357 27.6025 168.522 27.3825C168.692 27.1575 168.894 26.9725 169.129 26.8275C169.329 26.6925 169.549 26.5875 169.789 26.5125C170.034 26.4325 170.284 26.385 170.539 26.37C170.794 26.35 171.042 26.36 171.282 26.4V28.0875C171.042 28.0175 170.764 27.995 170.449 28.02C170.139 28.045 169.859 28.1325 169.609 28.2825C169.359 28.4175 169.154 28.59 168.994 28.8C168.839 29.01 168.724 29.25 168.649 29.52C168.574 29.785 168.537 30.0725 168.537 30.3825V34.5H166.722ZM175.751 34.7325C175.151 34.7325 174.656 34.6325 174.266 34.4325C173.876 34.2325 173.566 33.9775 173.336 33.6675C173.106 33.3575 172.936 33.0275 172.826 32.6775C172.716 32.3275 172.643 31.9975 172.608 31.6875C172.578 31.3725 172.563 31.1175 172.563 30.9225V26.4H174.393V30.3C174.393 30.55 174.411 30.8325 174.446 31.1475C174.481 31.4575 174.561 31.7575 174.686 32.0475C174.816 32.3325 175.006 32.5675 175.256 32.7525C175.511 32.9375 175.853 33.03 176.283 33.03C176.513 33.03 176.741 32.9925 176.966 32.9175C177.191 32.8425 177.393 32.715 177.573 32.535C177.758 32.35 177.906 32.0975 178.016 31.7775C178.126 31.4575 178.181 31.0525 178.181 30.5625L179.253 31.02C179.253 31.71 179.118 32.335 178.848 32.895C178.583 33.455 178.191 33.9025 177.671 34.2375C177.151 34.5675 176.511 34.7325 175.751 34.7325ZM178.398 34.5V31.9875H178.181V26.4H179.996V34.5H178.398Z" fill="#8F139C"/>
|
||||||
<defs>
|
<defs>
|
||||||
<linearGradient id="paint0_linear" x1="71" y1="21.5" x2="210" y2="21.5" gradientUnits="userSpaceOnUse">
|
<filter id="filter0_f_241_2041" x="0" y="0" width="47" height="47" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
<stop stop-color="#7241E2"/>
|
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||||
<stop offset="1" stop-color="#F413B5"/>
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||||
|
<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_241_2041"/>
|
||||||
|
</filter>
|
||||||
|
<linearGradient id="paint0_linear_241_2041" x1="7.80233" y1="9.05814" x2="40.4535" y2="38.5698" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#6AA7FF"/>
|
||||||
|
<stop offset="0.5" stop-color="#7B5CFF"/>
|
||||||
|
<stop offset="1" stop-color="#D21BCE"/>
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<linearGradient id="paint1_linear" x1="10.3689" y1="30.0062" x2="62" y2="30.0062" gradientUnits="userSpaceOnUse">
|
<linearGradient id="paint1_linear_241_2041" x1="7.80233" y1="9.05823" x2="40.4535" y2="38.5699" gradientUnits="userSpaceOnUse">
|
||||||
<stop stop-color="#662AF0"/>
|
<stop stop-color="#6AA7FF"/>
|
||||||
<stop offset="1" stop-color="#EF1AB3"/>
|
<stop offset="0.5" stop-color="#7B5CFF"/>
|
||||||
|
<stop offset="1" stop-color="#D21BCE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint2_linear_241_2041" x1="7.80233" y1="9.05816" x2="40.4535" y2="38.5698" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#6AA7FF"/>
|
||||||
|
<stop offset="0.5" stop-color="#7B5CFF"/>
|
||||||
|
<stop offset="1" stop-color="#D21BCE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint3_linear_241_2041" x1="7.80233" y1="9.05812" x2="40.4535" y2="38.5698" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#6AA7FF"/>
|
||||||
|
<stop offset="0.5" stop-color="#7B5CFF"/>
|
||||||
|
<stop offset="1" stop-color="#D21BCE"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint4_linear_241_2041" x1="47.1163" y1="24.5" x2="168.241" y2="24.5" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#0F0911"/>
|
||||||
|
<stop offset="1" stop-color="#960A97"/>
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<clipPath id="clip0">
|
|
||||||
<rect width="62" height="56" fill="white" transform="translate(0 2)"/>
|
|
||||||
</clipPath>
|
|
||||||
</defs>
|
</defs>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 10 KiB |
@@ -0,0 +1,15 @@
|
|||||||
|
# preland#11 — актуальные ресурсы и проверяемая доставка
|
||||||
|
|
||||||
|
Решения владельца21.10.2026: держать актуальные ресурсы в Git main/staging; удалить заглушку соstage; PDF и реквизиты взять с текущей zoomzilla.ru. Основной реестр — Gitea anton/preland#11, связаны #10 (расследование) и api#304 (срочный Tour, уже выпущен).
|
||||||
|
|
||||||
|
1. Источники и карта: логотипы обеих тем/шапка/подвал,4PDF,9favicon,3fonts,10images,5CSS,реквизиты и150файлов /1,/2. Конфиг домена и UTM сохранять.
|
||||||
|
2. RED известной заглушки и старых реквизитов; импорт текущих файлов, фиксированный manifest184, запрет известного blob независимо от правки manifest, версии logo по содержимому.
|
||||||
|
3. Положительный список поставки; точный eventSHA; preflight текущихprimaryресурсов и150stageфайлов, блокировка drift. Только согласованный config.requisites меняется точечно; requisites.html теперь канонический.
|
||||||
|
4. Девять PHP-проверок, both-theme4width/2set brand+thumbnail, first-paint с задержками, real local Preland/Index→Tour→Join/error/retry; независимыйreview.
|
||||||
|
5. Сохранить точное testedstagingдерево, добавить main историческим родителем через merge-sours, проверить treeSHA и FFобе ветки к одному SHA. Автодеплой толькоstage. PostSHA184, защищённыеhostconfigполя/N/productionprelandбезизменений, видимыйбренд/подвал/интеракции. KB/Giteaзакрытьпослефактическойпроверки.
|
||||||
|
|
||||||
|
Ruling: не импортировать устаревший код main в staging — сохранить проверенное дерево и историюобеихветок; ценаошибки — возвратlegacydemo/layout, предотвращаетсяtreeSHA+CI.
|
||||||
|
Ruling: реквизиты теперьверсионируютсяпопрямомувыборувладельца; configредактируетсятольковэтомключе, полнаязаменазапрещена.
|
||||||
|
Ruling: footerpaymentнаstage768переполнялсядозадачи; скопированоужедействующееAPIправилоmax-width100%, не введённовыйдизайн. RED784→GREENбезoverflow.
|
||||||
|
|
||||||
|
Ограничения: физическиеустройстванепроверены; боевыеuploadsужеиспользованывпредыдущейприёмке, здесьреальныеuploadсценариитольковизолированномDocker.
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require_once __DIR__ . '/i18n.php';
|
require_once __DIR__ . '/i18n.php';
|
||||||
|
require_once __DIR__ . '/components/asset-url.php';
|
||||||
|
|
||||||
$configFile = __DIR__ . '/config.json';
|
$configFile = __DIR__ . '/config.json';
|
||||||
$config = file_exists($configFile) ? json_decode(file_get_contents($configFile), true) : [];
|
$config = file_exists($configFile) ? json_decode(file_get_contents($configFile), true) : [];
|
||||||
|
|||||||
@@ -0,0 +1,743 @@
|
|||||||
|
{
|
||||||
|
"issue": "anton/preland#11",
|
||||||
|
"captured": "2026-10-21",
|
||||||
|
"hashing": "SHA-256; SVG/CSS/HTML/webmanifest CRLF normalized to LF",
|
||||||
|
"files": {
|
||||||
|
"1/01_desk_1-source.avif": {
|
||||||
|
"sha256": "d81af6d3757d0e932af04d956cd4083e7c7c547c9fbac290d27f5ce8bbaede1c",
|
||||||
|
"source": "https://zoomstage.online/1/01_desk_1-source.avif"
|
||||||
|
},
|
||||||
|
"1/01_desk_1-source.jpg": {
|
||||||
|
"sha256": "6e84a4d61e8494d2f287e5e6ae2237e3a04f05dff506c0d203f992ee02cbba18",
|
||||||
|
"source": "https://zoomstage.online/1/01_desk_1-source.jpg"
|
||||||
|
},
|
||||||
|
"1/01_desk_1-source.webp": {
|
||||||
|
"sha256": "d66f5c2e940d260b28f1d122feb385be5e3afe4b1094edd4e92b62a56afb3dd7",
|
||||||
|
"source": "https://zoomstage.online/1/01_desk_1-source.webp"
|
||||||
|
},
|
||||||
|
"1/01_desk_2-result.avif": {
|
||||||
|
"sha256": "05f51c0302f00b7a017fd92fca42e0f148487746090e2789f0dfb28df098ef25",
|
||||||
|
"source": "https://zoomstage.online/1/01_desk_2-result.avif"
|
||||||
|
},
|
||||||
|
"1/01_desk_2-result.jpg": {
|
||||||
|
"sha256": "2c202a1e9e2ddcbbfcd66ab250eb7041b7c034ae2b8f40b74651a20a11092b76",
|
||||||
|
"source": "https://zoomstage.online/1/01_desk_2-result.jpg"
|
||||||
|
},
|
||||||
|
"1/01_desk_2-result.webp": {
|
||||||
|
"sha256": "9569d7d575a57a06d2974db2818ed02c14f9e9910d2c622a11fdd5d37164e228",
|
||||||
|
"source": "https://zoomstage.online/1/01_desk_2-result.webp"
|
||||||
|
},
|
||||||
|
"1/01_desk_3-thumb.avif": {
|
||||||
|
"sha256": "f03f35fb43691d9eda8793be07682094e5f358809b3d11e9466a66b2a95d3fee",
|
||||||
|
"source": "https://zoomstage.online/1/01_desk_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"1/01_desk_3-thumb.jpg": {
|
||||||
|
"sha256": "4df8f1b4d6a71d6ad5486c576b215bde5ddc9bd325dc55dbfeaa1722faa90003",
|
||||||
|
"source": "https://zoomstage.online/1/01_desk_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"1/01_desk_3-thumb.webp": {
|
||||||
|
"sha256": "84e0e7c7ddaf56a1fcd95951afd40f30b669abd0a89ef98775479cb22efcb9f3",
|
||||||
|
"source": "https://zoomstage.online/1/01_desk_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"1/01_mob_1-source.avif": {
|
||||||
|
"sha256": "218eb7fc3c0d0ecee03454b46984e86d6ed48e9a87942d0959373dd3aeb9217c",
|
||||||
|
"source": "https://zoomstage.online/1/01_mob_1-source.avif"
|
||||||
|
},
|
||||||
|
"1/01_mob_1-source.jpg": {
|
||||||
|
"sha256": "dd92e0108066b171ccfaf410efdafe7e1cdc81d48da166d239362f087aa9d6ef",
|
||||||
|
"source": "https://zoomstage.online/1/01_mob_1-source.jpg"
|
||||||
|
},
|
||||||
|
"1/01_mob_1-source.webp": {
|
||||||
|
"sha256": "30b5c8229aea67374fa70db9e39066748db43d2ba15f6c7c68f10570bcff31d9",
|
||||||
|
"source": "https://zoomstage.online/1/01_mob_1-source.webp"
|
||||||
|
},
|
||||||
|
"1/01_mob_2-result.avif": {
|
||||||
|
"sha256": "d0cdb18f65cafc2abcec237acf33b8684472375ff373bf8c180dcf40b7ea9b24",
|
||||||
|
"source": "https://zoomstage.online/1/01_mob_2-result.avif"
|
||||||
|
},
|
||||||
|
"1/01_mob_2-result.jpg": {
|
||||||
|
"sha256": "53e7b5d9c34575d76a5781922366e306be625ff01f105bf199864230ba938b65",
|
||||||
|
"source": "https://zoomstage.online/1/01_mob_2-result.jpg"
|
||||||
|
},
|
||||||
|
"1/01_mob_2-result.webp": {
|
||||||
|
"sha256": "c4c75a1b60c34fe005a2ad4384dc941beee7247e7c9adfbc92cb237e7d8e09cf",
|
||||||
|
"source": "https://zoomstage.online/1/01_mob_2-result.webp"
|
||||||
|
},
|
||||||
|
"1/01_mob_3-thumb.avif": {
|
||||||
|
"sha256": "767d9c9e4da5f2ab3a504a4ef1456f4b5b76a9bdb024d2fd606f62cdeae539d2",
|
||||||
|
"source": "https://zoomstage.online/1/01_mob_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"1/01_mob_3-thumb.jpg": {
|
||||||
|
"sha256": "bf19f05864048b961184aa93da76eb8ea04d22bad08cb6b5b4e43a1ae3ae254a",
|
||||||
|
"source": "https://zoomstage.online/1/01_mob_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"1/01_mob_3-thumb.webp": {
|
||||||
|
"sha256": "4b17692c86a231fea852d6284ac75f866c3d333849e1374b8d69706fab4a1c38",
|
||||||
|
"source": "https://zoomstage.online/1/01_mob_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"1/02_desk_1-source.avif": {
|
||||||
|
"sha256": "1c042a21d14b3f6d1f04c107bf7799256478a04cbc266af3915b71cef560b84f",
|
||||||
|
"source": "https://zoomstage.online/1/02_desk_1-source.avif"
|
||||||
|
},
|
||||||
|
"1/02_desk_1-source.jpg": {
|
||||||
|
"sha256": "41f8dc885efdb159cd0283502dcfc7a7f215dddc01563599e6b83b0f27833bf9",
|
||||||
|
"source": "https://zoomstage.online/1/02_desk_1-source.jpg"
|
||||||
|
},
|
||||||
|
"1/02_desk_1-source.webp": {
|
||||||
|
"sha256": "e8d709607266e2f06807171ddf698cb0e3fa3f6b819447774dc0066cfe02e2be",
|
||||||
|
"source": "https://zoomstage.online/1/02_desk_1-source.webp"
|
||||||
|
},
|
||||||
|
"1/02_desk_2-result.avif": {
|
||||||
|
"sha256": "5e99f674fe14f59d4b953015873844295f69387a6e08ee3344097b874e03a42f",
|
||||||
|
"source": "https://zoomstage.online/1/02_desk_2-result.avif"
|
||||||
|
},
|
||||||
|
"1/02_desk_2-result.jpg": {
|
||||||
|
"sha256": "16ad5e78b26a686e40023f90b4999c5e483cd7f11510e4086562d1e1d1c26ffb",
|
||||||
|
"source": "https://zoomstage.online/1/02_desk_2-result.jpg"
|
||||||
|
},
|
||||||
|
"1/02_desk_2-result.webp": {
|
||||||
|
"sha256": "85479727ac36566b40e6892bae392c5c3b921c1f93eaec94bf3c7bdf2cb810b8",
|
||||||
|
"source": "https://zoomstage.online/1/02_desk_2-result.webp"
|
||||||
|
},
|
||||||
|
"1/02_desk_3-thumb.avif": {
|
||||||
|
"sha256": "f734a69a307c6a42d7fbad2014ee78ffb227ad2ec91cf8827220cff6ccbf959f",
|
||||||
|
"source": "https://zoomstage.online/1/02_desk_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"1/02_desk_3-thumb.jpg": {
|
||||||
|
"sha256": "bba137700d987ce7fc1a27799f341766e14252375dfdd62a2ed22a52b42b584f",
|
||||||
|
"source": "https://zoomstage.online/1/02_desk_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"1/02_desk_3-thumb.webp": {
|
||||||
|
"sha256": "968dcd286a23f3815d13b648f9456f833b8c5065461cba55a1c1416b8de842b2",
|
||||||
|
"source": "https://zoomstage.online/1/02_desk_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"1/02_mob_1-source.avif": {
|
||||||
|
"sha256": "b975eeef8d57a6d92a8d2f3c49eeedc76159c0bb1106cedbbfcba916082b3de6",
|
||||||
|
"source": "https://zoomstage.online/1/02_mob_1-source.avif"
|
||||||
|
},
|
||||||
|
"1/02_mob_1-source.jpg": {
|
||||||
|
"sha256": "83c98111cc63aa0d8af166174c17ab7270f27abce278aa09a6e62d6ad532fbd2",
|
||||||
|
"source": "https://zoomstage.online/1/02_mob_1-source.jpg"
|
||||||
|
},
|
||||||
|
"1/02_mob_1-source.webp": {
|
||||||
|
"sha256": "b3cfbe26ee2239b3e26b03e5b762b901285c482cb3e38ef87a8094d17b1277da",
|
||||||
|
"source": "https://zoomstage.online/1/02_mob_1-source.webp"
|
||||||
|
},
|
||||||
|
"1/02_mob_2-result.avif": {
|
||||||
|
"sha256": "758bea1e70eaa8c7bb4387b93b29e01ebd73f6f7cd886dccb515f33d633d21dc",
|
||||||
|
"source": "https://zoomstage.online/1/02_mob_2-result.avif"
|
||||||
|
},
|
||||||
|
"1/02_mob_2-result.jpg": {
|
||||||
|
"sha256": "bb587caf5834c9fe247631f87160703dc5e436c9240a3a1ccfe5e3a29ffb0df5",
|
||||||
|
"source": "https://zoomstage.online/1/02_mob_2-result.jpg"
|
||||||
|
},
|
||||||
|
"1/02_mob_2-result.webp": {
|
||||||
|
"sha256": "83debd3926dd0786ea7e379c6c78bd9e3001f41a4c7252a0f2caf01144b3a0cd",
|
||||||
|
"source": "https://zoomstage.online/1/02_mob_2-result.webp"
|
||||||
|
},
|
||||||
|
"1/02_mob_3-thumb.avif": {
|
||||||
|
"sha256": "38ba7656ac0556ce0173747791a6ec62602e988c25a88c4f7ffd78617f552320",
|
||||||
|
"source": "https://zoomstage.online/1/02_mob_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"1/02_mob_3-thumb.jpg": {
|
||||||
|
"sha256": "b34b92a88a4d6618c47ede2f97a005e68a6a8f7ed4d8aaaa72180ea3e34abe2e",
|
||||||
|
"source": "https://zoomstage.online/1/02_mob_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"1/02_mob_3-thumb.webp": {
|
||||||
|
"sha256": "044bc3d59f2beb2e24b6f46ec8adbaada0c54277af11d281ec73a1bf77802d95",
|
||||||
|
"source": "https://zoomstage.online/1/02_mob_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"1/03_desk_1-source.avif": {
|
||||||
|
"sha256": "1c945bc12bafd62c1f696887e64f5f1177339d6b6ca07b1b3abc04353ab76f4a",
|
||||||
|
"source": "https://zoomstage.online/1/03_desk_1-source.avif"
|
||||||
|
},
|
||||||
|
"1/03_desk_1-source.jpg": {
|
||||||
|
"sha256": "181e751a28448e6e50b8def188031b624598e413a38463229c25acc0ca1e9aaf",
|
||||||
|
"source": "https://zoomstage.online/1/03_desk_1-source.jpg"
|
||||||
|
},
|
||||||
|
"1/03_desk_1-source.webp": {
|
||||||
|
"sha256": "c034f5ef757effb3838e677dd5dc059468a8ef928e1a8068a64d938c45a706b7",
|
||||||
|
"source": "https://zoomstage.online/1/03_desk_1-source.webp"
|
||||||
|
},
|
||||||
|
"1/03_desk_2-result.avif": {
|
||||||
|
"sha256": "868a879a01c44d7d062dd52e565f1ca3c5c142a194c2ed34d3d858bbcaec99a1",
|
||||||
|
"source": "https://zoomstage.online/1/03_desk_2-result.avif"
|
||||||
|
},
|
||||||
|
"1/03_desk_2-result.jpg": {
|
||||||
|
"sha256": "2f3ffdbe2e94b6b10b44d98b43ed0a1ff29e24697528c1e6794e0f59e66f05c0",
|
||||||
|
"source": "https://zoomstage.online/1/03_desk_2-result.jpg"
|
||||||
|
},
|
||||||
|
"1/03_desk_2-result.webp": {
|
||||||
|
"sha256": "6def0f71d9b723ed5aa57e60966548b17e919874b7468a9f0d4cf1c9151a7782",
|
||||||
|
"source": "https://zoomstage.online/1/03_desk_2-result.webp"
|
||||||
|
},
|
||||||
|
"1/03_desk_3-thumb.avif": {
|
||||||
|
"sha256": "799ddb6d2825039051014687584a84deac0f17df835a96f5d164a61d2fae7809",
|
||||||
|
"source": "https://zoomstage.online/1/03_desk_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"1/03_desk_3-thumb.jpg": {
|
||||||
|
"sha256": "7c872aebd11a98f26289df28b29bd6287ec725ddb7282d4ce3a940450426dfdb",
|
||||||
|
"source": "https://zoomstage.online/1/03_desk_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"1/03_desk_3-thumb.webp": {
|
||||||
|
"sha256": "6ea725369244d903fb33015d15a3ca4da68b09e7572c34b1c4df55592f7bb87c",
|
||||||
|
"source": "https://zoomstage.online/1/03_desk_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"1/03_mob_1-source.avif": {
|
||||||
|
"sha256": "54e07c4c45c87bbe098930d5a1d462c63b8deb54d80c82342c98d9ba397d030a",
|
||||||
|
"source": "https://zoomstage.online/1/03_mob_1-source.avif"
|
||||||
|
},
|
||||||
|
"1/03_mob_1-source.jpg": {
|
||||||
|
"sha256": "76bd246fb6dd2c3029d3697e4cd58f78055aa8eea1264f4002e412877b76e2e9",
|
||||||
|
"source": "https://zoomstage.online/1/03_mob_1-source.jpg"
|
||||||
|
},
|
||||||
|
"1/03_mob_1-source.webp": {
|
||||||
|
"sha256": "0e57e3e248217a747914561e3fd1d0266d0023283d8b224c238fad1055b3b6ce",
|
||||||
|
"source": "https://zoomstage.online/1/03_mob_1-source.webp"
|
||||||
|
},
|
||||||
|
"1/03_mob_2-result.avif": {
|
||||||
|
"sha256": "eab15220712f4c6bf76a616a9820b47f3813ddeefe86d10ca8d79be1f3fa6713",
|
||||||
|
"source": "https://zoomstage.online/1/03_mob_2-result.avif"
|
||||||
|
},
|
||||||
|
"1/03_mob_2-result.jpg": {
|
||||||
|
"sha256": "180db5c1586a1a60f5348c58effd52a3dae3aaece5a73af95582df59a87ed61f",
|
||||||
|
"source": "https://zoomstage.online/1/03_mob_2-result.jpg"
|
||||||
|
},
|
||||||
|
"1/03_mob_2-result.webp": {
|
||||||
|
"sha256": "1cfb9d19807bdb655467424fa6e0ffaf30508d6a525fcf11060d29225e0a7c4a",
|
||||||
|
"source": "https://zoomstage.online/1/03_mob_2-result.webp"
|
||||||
|
},
|
||||||
|
"1/03_mob_3-thumb.avif": {
|
||||||
|
"sha256": "dfa4f76bbb32c1cce8b615f381c97efdd808d7270b4d783f594b46d2251cb299",
|
||||||
|
"source": "https://zoomstage.online/1/03_mob_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"1/03_mob_3-thumb.jpg": {
|
||||||
|
"sha256": "a92745852596697f8efd2a488e19d67ccbfd252bda85670e768e3bd0517620fd",
|
||||||
|
"source": "https://zoomstage.online/1/03_mob_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"1/03_mob_3-thumb.webp": {
|
||||||
|
"sha256": "c51cdb975086282e140383fb19629b5c6f76948ff124be60650ffcb284c58bce",
|
||||||
|
"source": "https://zoomstage.online/1/03_mob_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"1/04_desk_1-source.avif": {
|
||||||
|
"sha256": "65cb679b4ced37aae4761ab3ee6264ea3eebff4d78d86f5d46e6f4ea3afc89b8",
|
||||||
|
"source": "https://zoomstage.online/1/04_desk_1-source.avif"
|
||||||
|
},
|
||||||
|
"1/04_desk_1-source.jpg": {
|
||||||
|
"sha256": "dd919226b04a3b64d13f6167457aabd7a11c28a3deb2e67bc68b14dd295c2298",
|
||||||
|
"source": "https://zoomstage.online/1/04_desk_1-source.jpg"
|
||||||
|
},
|
||||||
|
"1/04_desk_1-source.webp": {
|
||||||
|
"sha256": "b84791838665c9c1f805561b5e4ce51560f2a8bef1960b369fff96f795d40ad3",
|
||||||
|
"source": "https://zoomstage.online/1/04_desk_1-source.webp"
|
||||||
|
},
|
||||||
|
"1/04_desk_2-result.avif": {
|
||||||
|
"sha256": "6916aad05d6780d591d61881dbea099dbf17a3cad20b90e5df5bac1411ec9441",
|
||||||
|
"source": "https://zoomstage.online/1/04_desk_2-result.avif"
|
||||||
|
},
|
||||||
|
"1/04_desk_2-result.jpg": {
|
||||||
|
"sha256": "f87ebfad0761aee740b6cbd3b49c560e51285a97bcd87299302128266de38e82",
|
||||||
|
"source": "https://zoomstage.online/1/04_desk_2-result.jpg"
|
||||||
|
},
|
||||||
|
"1/04_desk_2-result.webp": {
|
||||||
|
"sha256": "46fb0e3eabd78f903e3f962b286a0e86d05e1eab0fd14687bde957348439384f",
|
||||||
|
"source": "https://zoomstage.online/1/04_desk_2-result.webp"
|
||||||
|
},
|
||||||
|
"1/04_desk_3-thumb.avif": {
|
||||||
|
"sha256": "fe518d47c5b0a97ba14f1b4cd25f06e5ba341a7eb18bdf60dc5787254528aa74",
|
||||||
|
"source": "https://zoomstage.online/1/04_desk_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"1/04_desk_3-thumb.jpg": {
|
||||||
|
"sha256": "cb33a65fc7988e80a211c5c0868b79813fc5f6ab673a66632ef5e79a11d12335",
|
||||||
|
"source": "https://zoomstage.online/1/04_desk_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"1/04_desk_3-thumb.webp": {
|
||||||
|
"sha256": "19f6fca38d2bda54a784d8789960db4b83f6c7d91200929083794fcbbb4b1b7c",
|
||||||
|
"source": "https://zoomstage.online/1/04_desk_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"1/04_mob_1-source.avif": {
|
||||||
|
"sha256": "9272edcf3875ad80908933a4f99291caa3bf0388681ccc707bb32d3695f547cc",
|
||||||
|
"source": "https://zoomstage.online/1/04_mob_1-source.avif"
|
||||||
|
},
|
||||||
|
"1/04_mob_1-source.jpg": {
|
||||||
|
"sha256": "e7f552ae69e2d225e3c026e6fe3bcb9037a77a13fc457f4acb9302f3e2e664d2",
|
||||||
|
"source": "https://zoomstage.online/1/04_mob_1-source.jpg"
|
||||||
|
},
|
||||||
|
"1/04_mob_1-source.webp": {
|
||||||
|
"sha256": "47e22debe67835117c8b976add82e4757b0b37c16c8074e32e9e2001aa766dd6",
|
||||||
|
"source": "https://zoomstage.online/1/04_mob_1-source.webp"
|
||||||
|
},
|
||||||
|
"1/04_mob_2-result.avif": {
|
||||||
|
"sha256": "9365055422b8879dafff37ad4550463d4a37fa3d845a861720d65f18b6f7c17c",
|
||||||
|
"source": "https://zoomstage.online/1/04_mob_2-result.avif"
|
||||||
|
},
|
||||||
|
"1/04_mob_2-result.jpg": {
|
||||||
|
"sha256": "47baa6717063700ebeae7628fc0986ade2bd48009ff9a703aca96a2a120a069a",
|
||||||
|
"source": "https://zoomstage.online/1/04_mob_2-result.jpg"
|
||||||
|
},
|
||||||
|
"1/04_mob_2-result.webp": {
|
||||||
|
"sha256": "4f9eac846f26e36c92c4554112ed195e187f59957bf1eb05392c66923d92fd61",
|
||||||
|
"source": "https://zoomstage.online/1/04_mob_2-result.webp"
|
||||||
|
},
|
||||||
|
"1/04_mob_3-thumb.avif": {
|
||||||
|
"sha256": "4b4b44c176e1614d1c52c945e62be62dcccbf759af9ec554b835a40ab68dec75",
|
||||||
|
"source": "https://zoomstage.online/1/04_mob_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"1/04_mob_3-thumb.jpg": {
|
||||||
|
"sha256": "2f237eb02fc3107548fbcf4e516cb022299045f4338d3bb5fb0c406c29950b67",
|
||||||
|
"source": "https://zoomstage.online/1/04_mob_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"1/04_mob_3-thumb.webp": {
|
||||||
|
"sha256": "ebe0250b95135ff36b478cba1725fe76b4a2e82e3423f0480a20dc420bdd04ee",
|
||||||
|
"source": "https://zoomstage.online/1/04_mob_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"1/05_desk_1-source.avif": {
|
||||||
|
"sha256": "0190471497dc2c4ad4515366f7a875e0a63dc02850e0f2831308d9119e6635b3",
|
||||||
|
"source": "https://zoomstage.online/1/05_desk_1-source.avif"
|
||||||
|
},
|
||||||
|
"1/05_desk_1-source.jpg": {
|
||||||
|
"sha256": "7a97d9909f67dce302b1707ccdc4a6eee83351faed91e9e9229fcb163117083e",
|
||||||
|
"source": "https://zoomstage.online/1/05_desk_1-source.jpg"
|
||||||
|
},
|
||||||
|
"1/05_desk_1-source.webp": {
|
||||||
|
"sha256": "0a0ca94e76bc36ac0439c65739ab16efbd444cedb53e7119946bfc3dd3abadd9",
|
||||||
|
"source": "https://zoomstage.online/1/05_desk_1-source.webp"
|
||||||
|
},
|
||||||
|
"1/05_desk_2-result.avif": {
|
||||||
|
"sha256": "f7d43aa554dcf0f798770cf21b890002b55b4b175949fbeafc24bcee125707fd",
|
||||||
|
"source": "https://zoomstage.online/1/05_desk_2-result.avif"
|
||||||
|
},
|
||||||
|
"1/05_desk_2-result.jpg": {
|
||||||
|
"sha256": "652015813ad038945e780d97f9fe793eff8819927cab4cc27af99d7cf032d32c",
|
||||||
|
"source": "https://zoomstage.online/1/05_desk_2-result.jpg"
|
||||||
|
},
|
||||||
|
"1/05_desk_2-result.webp": {
|
||||||
|
"sha256": "29305239d806b67c19dcb47b898bf9bf46f2fa2f0301896c01d13e24140a8e8e",
|
||||||
|
"source": "https://zoomstage.online/1/05_desk_2-result.webp"
|
||||||
|
},
|
||||||
|
"1/05_desk_3-thumb.avif": {
|
||||||
|
"sha256": "d02811e4deff120d29be88d3a8119a4f931828c69ca812179922753c5e70d684",
|
||||||
|
"source": "https://zoomstage.online/1/05_desk_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"1/05_desk_3-thumb.jpg": {
|
||||||
|
"sha256": "068cacabeca713c006acdbe24a695a7271849832174515bd307e3eb40b468748",
|
||||||
|
"source": "https://zoomstage.online/1/05_desk_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"1/05_desk_3-thumb.webp": {
|
||||||
|
"sha256": "cccd83ada4e4c2ddd22bbb9f0c1087f656465e7aea350adb148b91bf300ae9b5",
|
||||||
|
"source": "https://zoomstage.online/1/05_desk_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"1/05_mob_1-source.avif": {
|
||||||
|
"sha256": "032d2dfa889891765294790a018ded36ffa03d09e7bcdce2e64e4127e3bdd60d",
|
||||||
|
"source": "https://zoomstage.online/1/05_mob_1-source.avif"
|
||||||
|
},
|
||||||
|
"1/05_mob_1-source.jpg": {
|
||||||
|
"sha256": "1d2e9696fb2d858685794eca3ae9daa26477d4b69f30d7c38ba0299e0beaceb9",
|
||||||
|
"source": "https://zoomstage.online/1/05_mob_1-source.jpg"
|
||||||
|
},
|
||||||
|
"1/05_mob_1-source.webp": {
|
||||||
|
"sha256": "3b92e3c669b4edb03358c2b0e41de4d3d7e9562f56fa59430995632241c9cd7b",
|
||||||
|
"source": "https://zoomstage.online/1/05_mob_1-source.webp"
|
||||||
|
},
|
||||||
|
"1/05_mob_2-result.avif": {
|
||||||
|
"sha256": "5af8bcacbf69b73da9777a623e114a49904156855ba3711a480cc4067ee4621e",
|
||||||
|
"source": "https://zoomstage.online/1/05_mob_2-result.avif"
|
||||||
|
},
|
||||||
|
"1/05_mob_2-result.jpg": {
|
||||||
|
"sha256": "6a6df8a6958c4747dc8c83af92eb6364336959593d95c0575f49e91b0d7da27f",
|
||||||
|
"source": "https://zoomstage.online/1/05_mob_2-result.jpg"
|
||||||
|
},
|
||||||
|
"1/05_mob_2-result.webp": {
|
||||||
|
"sha256": "dc4049048ce69aecc38245dcb35f2ff4db68a335bd4945da542ef85878a5412e",
|
||||||
|
"source": "https://zoomstage.online/1/05_mob_2-result.webp"
|
||||||
|
},
|
||||||
|
"1/05_mob_3-thumb.avif": {
|
||||||
|
"sha256": "9f60e27a7a3937788fe4c42731a0f0405e6b48079862f9ee14382728654661b8",
|
||||||
|
"source": "https://zoomstage.online/1/05_mob_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"1/05_mob_3-thumb.jpg": {
|
||||||
|
"sha256": "5dd8457be9a4662cf680428f5d86829c06812c37417aa2fd7508ef3e6ade8891",
|
||||||
|
"source": "https://zoomstage.online/1/05_mob_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"1/05_mob_3-thumb.webp": {
|
||||||
|
"sha256": "5b125c06a4f91a9acf20302b7785c1c6b04e72f2837eb8cc7654bddcfb2b8010",
|
||||||
|
"source": "https://zoomstage.online/1/05_mob_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"2/01_desk_1-source.avif": {
|
||||||
|
"sha256": "05693cd307bbd8cc899408b40d0eb069f2ebca3a6d562572dfbe9beb1fe09e6a",
|
||||||
|
"source": "https://zoomstage.online/2/01_desk_1-source.avif"
|
||||||
|
},
|
||||||
|
"2/01_desk_1-source.jpg": {
|
||||||
|
"sha256": "2aa5e882db83e33c7585cea726a1a2eb7b1771180c04f2a7b2f0e19fbefa5d35",
|
||||||
|
"source": "https://zoomstage.online/2/01_desk_1-source.jpg"
|
||||||
|
},
|
||||||
|
"2/01_desk_1-source.webp": {
|
||||||
|
"sha256": "f7451a5557c45b7049183d7e762a343846bf86173c6f4e6ae64628412abebf72",
|
||||||
|
"source": "https://zoomstage.online/2/01_desk_1-source.webp"
|
||||||
|
},
|
||||||
|
"2/01_desk_2-result.avif": {
|
||||||
|
"sha256": "a98abb80ec628c0af732ea70bbe9eca0b6fa2be7404aac9b398396f2049a81fd",
|
||||||
|
"source": "https://zoomstage.online/2/01_desk_2-result.avif"
|
||||||
|
},
|
||||||
|
"2/01_desk_2-result.jpg": {
|
||||||
|
"sha256": "4d99b39af2b30a0431b406cae60a9600cbcf5be2aac53a3eb006e9b5dced2bd8",
|
||||||
|
"source": "https://zoomstage.online/2/01_desk_2-result.jpg"
|
||||||
|
},
|
||||||
|
"2/01_desk_2-result.webp": {
|
||||||
|
"sha256": "3e384151667ab4561037ad629a22c2ca789d1d1ee6ef4d90839bcdf7010b7b53",
|
||||||
|
"source": "https://zoomstage.online/2/01_desk_2-result.webp"
|
||||||
|
},
|
||||||
|
"2/01_desk_3-thumb.avif": {
|
||||||
|
"sha256": "403960e1e6ace0fd8b41df74fac06c2f69178dfcba58f09c7ea4e60a166b1a6e",
|
||||||
|
"source": "https://zoomstage.online/2/01_desk_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"2/01_desk_3-thumb.jpg": {
|
||||||
|
"sha256": "09189ca450ea070087ea704c2ef1f3ad1c4764c42c5b79318c2917896c2e8cad",
|
||||||
|
"source": "https://zoomstage.online/2/01_desk_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"2/01_desk_3-thumb.webp": {
|
||||||
|
"sha256": "9d1ff2dd86970e8bf115bda669876c1a652d6212375c0b251a9f80ee553f42c0",
|
||||||
|
"source": "https://zoomstage.online/2/01_desk_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"2/01_mob_1-source.avif": {
|
||||||
|
"sha256": "90225b3b0f89187519d10e2bc407cda247e7910efe72c6b3df0d64cecd12385d",
|
||||||
|
"source": "https://zoomstage.online/2/01_mob_1-source.avif"
|
||||||
|
},
|
||||||
|
"2/01_mob_2-result.avif": {
|
||||||
|
"sha256": "e23bdac9af1daf3f4c62464f7de42399741d46e00fe627726f06f9e8f54c463a",
|
||||||
|
"source": "https://zoomstage.online/2/01_mob_2-result.avif"
|
||||||
|
},
|
||||||
|
"2/01_mob_3-thumb.avif": {
|
||||||
|
"sha256": "8bd19f88579f4e70af7909e9c9989cde0d95e4b320381f433566bf389ba80177",
|
||||||
|
"source": "https://zoomstage.online/2/01_mob_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"2/02_desk_1-source.avif": {
|
||||||
|
"sha256": "114dfdf3d6b4157ccf2c70c0658a4ce63c0c4416fe7512fb228722ebad88352c",
|
||||||
|
"source": "https://zoomstage.online/2/02_desk_1-source.avif"
|
||||||
|
},
|
||||||
|
"2/02_desk_1-source.jpg": {
|
||||||
|
"sha256": "256d22ac9c7b30214c761658eddf2984cf46d6a319e1e2b3a3f7f2bae8db840d",
|
||||||
|
"source": "https://zoomstage.online/2/02_desk_1-source.jpg"
|
||||||
|
},
|
||||||
|
"2/02_desk_1-source.webp": {
|
||||||
|
"sha256": "2fd47a431be1c90f83d864d3722fa82594dc952a7ac0ecb53427d3b44b903b63",
|
||||||
|
"source": "https://zoomstage.online/2/02_desk_1-source.webp"
|
||||||
|
},
|
||||||
|
"2/02_desk_2-result.avif": {
|
||||||
|
"sha256": "580c7487ffecce9c42c31243ffb1e10c0a1ee6237d1780a52491753c7247904f",
|
||||||
|
"source": "https://zoomstage.online/2/02_desk_2-result.avif"
|
||||||
|
},
|
||||||
|
"2/02_desk_2-result.jpg": {
|
||||||
|
"sha256": "95c6930aff6a7b1f13a1216bd2c2e7bf33274295c7827b79558705f65fe9a698",
|
||||||
|
"source": "https://zoomstage.online/2/02_desk_2-result.jpg"
|
||||||
|
},
|
||||||
|
"2/02_desk_2-result.webp": {
|
||||||
|
"sha256": "f002f826030ff3d220480bcc822d556ac3934e7c75c36475fbd9bef05810f928",
|
||||||
|
"source": "https://zoomstage.online/2/02_desk_2-result.webp"
|
||||||
|
},
|
||||||
|
"2/02_desk_3-thumb.avif": {
|
||||||
|
"sha256": "0c53447ee56c0cac91e7006b2d235965c31603cb689108ba22afd72c8dbd7b5b",
|
||||||
|
"source": "https://zoomstage.online/2/02_desk_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"2/02_desk_3-thumb.jpg": {
|
||||||
|
"sha256": "cfd28c223a9107aa5a9481988fe421c461d040e9bfcb5c20d1d4e6c3a28478eb",
|
||||||
|
"source": "https://zoomstage.online/2/02_desk_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"2/02_desk_3-thumb.webp": {
|
||||||
|
"sha256": "d6716f7e0011143ff7712567552c6ebf66f862e789904f721c6833f6f949976a",
|
||||||
|
"source": "https://zoomstage.online/2/02_desk_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"2/02_mob_1-source.avif": {
|
||||||
|
"sha256": "15c457ddc50eeee2df0bfac945de31b0c77631a135168f417ec5fbac4c07767f",
|
||||||
|
"source": "https://zoomstage.online/2/02_mob_1-source.avif"
|
||||||
|
},
|
||||||
|
"2/02_mob_2-result.avif": {
|
||||||
|
"sha256": "8f75bdcdc8f1406c20a2664df31ae0aec2a6ae14638469028d8d83ae70cd4adc",
|
||||||
|
"source": "https://zoomstage.online/2/02_mob_2-result.avif"
|
||||||
|
},
|
||||||
|
"2/02_mob_3-thumb.avif": {
|
||||||
|
"sha256": "e7ee1b0e7886289c125c8c46726c287fd0abdc8cdf469a0636b8b28079729d04",
|
||||||
|
"source": "https://zoomstage.online/2/02_mob_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"2/03_desk_1-source.avif": {
|
||||||
|
"sha256": "33afc3a2a73b0dec174fcb1d900b2ef66c1ecf5b67edb97a25648c7a93cb1b83",
|
||||||
|
"source": "https://zoomstage.online/2/03_desk_1-source.avif"
|
||||||
|
},
|
||||||
|
"2/03_desk_1-source.jpg": {
|
||||||
|
"sha256": "752d8eb31d5874ccdab42d9275065c6d95bb554a12bde6bfafce4b6c2eda673d",
|
||||||
|
"source": "https://zoomstage.online/2/03_desk_1-source.jpg"
|
||||||
|
},
|
||||||
|
"2/03_desk_1-source.webp": {
|
||||||
|
"sha256": "d4386879477591872078eeb46a225717ece6717b717884f4841b58d981e74815",
|
||||||
|
"source": "https://zoomstage.online/2/03_desk_1-source.webp"
|
||||||
|
},
|
||||||
|
"2/03_desk_2-result.avif": {
|
||||||
|
"sha256": "832fd61bdf1b36225c6122f488b2fc655c9ef45209dd0db24e47469e09ccc62c",
|
||||||
|
"source": "https://zoomstage.online/2/03_desk_2-result.avif"
|
||||||
|
},
|
||||||
|
"2/03_desk_2-result.jpg": {
|
||||||
|
"sha256": "0986040558bd81eb454981519fffffc518dc2595fd8def98a696de58b6c714f4",
|
||||||
|
"source": "https://zoomstage.online/2/03_desk_2-result.jpg"
|
||||||
|
},
|
||||||
|
"2/03_desk_2-result.webp": {
|
||||||
|
"sha256": "de09ce8024af78fa5176ce7b4aeaaa01dc5c25a41c4d73c248596a8c63de974f",
|
||||||
|
"source": "https://zoomstage.online/2/03_desk_2-result.webp"
|
||||||
|
},
|
||||||
|
"2/03_desk_3-thumb.avif": {
|
||||||
|
"sha256": "73a0931dfe921a0c6afd0f34308a4ec2f358c19921abb0386968e4235d7bf677",
|
||||||
|
"source": "https://zoomstage.online/2/03_desk_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"2/03_desk_3-thumb.jpg": {
|
||||||
|
"sha256": "60d6e5e78535e73bf72740a9908e79d4bd7030b8ab5684f4cb0ea5533a1073ba",
|
||||||
|
"source": "https://zoomstage.online/2/03_desk_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"2/03_desk_3-thumb.webp": {
|
||||||
|
"sha256": "6cc52a6d96ef01d5ffd74682fce859fe831948229aefcf3b0dc959f8ed1fbaf6",
|
||||||
|
"source": "https://zoomstage.online/2/03_desk_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"2/03_mob_1-source.avif": {
|
||||||
|
"sha256": "1912d1d5050f00cd03857ee0776a54443ac398f91abcc043cbc5f040325d5f71",
|
||||||
|
"source": "https://zoomstage.online/2/03_mob_1-source.avif"
|
||||||
|
},
|
||||||
|
"2/03_mob_2-result.avif": {
|
||||||
|
"sha256": "78044eb77595fdeaca2ba8531d6c41b5b9e0b0d4b7474760f0c515446f82756f",
|
||||||
|
"source": "https://zoomstage.online/2/03_mob_2-result.avif"
|
||||||
|
},
|
||||||
|
"2/03_mob_3-thumb.avif": {
|
||||||
|
"sha256": "da91d0c4414bf9feb109ba6457ddd16ed65d6ba4a175db882e8fd289d0eadd28",
|
||||||
|
"source": "https://zoomstage.online/2/03_mob_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"2/04_desk_1-source.avif": {
|
||||||
|
"sha256": "75167d61ba549e6cd7857ca2173f7e407fde4f899842eac8838a83eb804c0030",
|
||||||
|
"source": "https://zoomstage.online/2/04_desk_1-source.avif"
|
||||||
|
},
|
||||||
|
"2/04_desk_1-source.jpg": {
|
||||||
|
"sha256": "2d7b4e3e706cb4e2527fff0b4a9e557f609c728d74e9cbc8cc8f24581a48bf00",
|
||||||
|
"source": "https://zoomstage.online/2/04_desk_1-source.jpg"
|
||||||
|
},
|
||||||
|
"2/04_desk_1-source.webp": {
|
||||||
|
"sha256": "903eea777948a5a627464abada4e51c8b1aee9937e0856fde738450745953c9e",
|
||||||
|
"source": "https://zoomstage.online/2/04_desk_1-source.webp"
|
||||||
|
},
|
||||||
|
"2/04_desk_2-result.avif": {
|
||||||
|
"sha256": "e3e56d8cdcf60151d66fd9c5905febb8153aa333d1330f628f4235334c29120d",
|
||||||
|
"source": "https://zoomstage.online/2/04_desk_2-result.avif"
|
||||||
|
},
|
||||||
|
"2/04_desk_2-result.jpg": {
|
||||||
|
"sha256": "f631a34a741ab17f493e45ef9c5868e550856207810d6f20bff889358eb01963",
|
||||||
|
"source": "https://zoomstage.online/2/04_desk_2-result.jpg"
|
||||||
|
},
|
||||||
|
"2/04_desk_2-result.webp": {
|
||||||
|
"sha256": "f387ecb2e3e00720f5de37ad96ee577ac19f01ea091e86e833d7db9c1ca87f1f",
|
||||||
|
"source": "https://zoomstage.online/2/04_desk_2-result.webp"
|
||||||
|
},
|
||||||
|
"2/04_desk_3-thumb.avif": {
|
||||||
|
"sha256": "e018297227e7abc582aea91c1eca9e47c3781ecb56dd61596badf9c1e9efd1db",
|
||||||
|
"source": "https://zoomstage.online/2/04_desk_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"2/04_desk_3-thumb.jpg": {
|
||||||
|
"sha256": "82c31dede3dc117a359cdcab81db9d7e0f615d386ee76748a4a4679e596ebb43",
|
||||||
|
"source": "https://zoomstage.online/2/04_desk_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"2/04_desk_3-thumb.webp": {
|
||||||
|
"sha256": "d247ef5916e553300bd5cad2e6917489a56f5e275e12ed24f8d516cae5ebf677",
|
||||||
|
"source": "https://zoomstage.online/2/04_desk_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"2/04_mob_1-source.avif": {
|
||||||
|
"sha256": "436a746e9b07dbca356b2304415e5a3d38c130dcad771a474ece4c566e3923f0",
|
||||||
|
"source": "https://zoomstage.online/2/04_mob_1-source.avif"
|
||||||
|
},
|
||||||
|
"2/04_mob_2-result.avif": {
|
||||||
|
"sha256": "0226d6d6dd058b403d144c1abf73177e1b90b24d64be9127c830f6e64fb33f89",
|
||||||
|
"source": "https://zoomstage.online/2/04_mob_2-result.avif"
|
||||||
|
},
|
||||||
|
"2/04_mob_3-thumb.avif": {
|
||||||
|
"sha256": "ed98c7aa386b988ece328f7a9dbaae6f733a2d32318bcde3ecf75fa2676ffe03",
|
||||||
|
"source": "https://zoomstage.online/2/04_mob_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"2/05_desk_1-source.avif": {
|
||||||
|
"sha256": "8fb22211499a316a708011d18f11069de884e316467242a4999046e8dbb35aa0",
|
||||||
|
"source": "https://zoomstage.online/2/05_desk_1-source.avif"
|
||||||
|
},
|
||||||
|
"2/05_desk_1-source.jpg": {
|
||||||
|
"sha256": "8414aebaf6e34d287eed884eff8db9e56d1d30927a568e714dd4221b1fbda170",
|
||||||
|
"source": "https://zoomstage.online/2/05_desk_1-source.jpg"
|
||||||
|
},
|
||||||
|
"2/05_desk_1-source.webp": {
|
||||||
|
"sha256": "92e3d15e39c065c03a75868516618a2357e2762defb4a3815bba73c6b197e2f4",
|
||||||
|
"source": "https://zoomstage.online/2/05_desk_1-source.webp"
|
||||||
|
},
|
||||||
|
"2/05_desk_2-result.avif": {
|
||||||
|
"sha256": "44bd818c5ac218e6f2065e469bae2999e7deac507c73509c24d47fdcb689946f",
|
||||||
|
"source": "https://zoomstage.online/2/05_desk_2-result.avif"
|
||||||
|
},
|
||||||
|
"2/05_desk_2-result.jpg": {
|
||||||
|
"sha256": "98ee8d691eb8a92ec03c1d1e1298357bd9d6aa5606a2afda74a80afcbbe8ae2b",
|
||||||
|
"source": "https://zoomstage.online/2/05_desk_2-result.jpg"
|
||||||
|
},
|
||||||
|
"2/05_desk_2-result.webp": {
|
||||||
|
"sha256": "eaf28272f55fc078a35758ffc5cebe19cea17b408e47a05851c07d6c15e0e625",
|
||||||
|
"source": "https://zoomstage.online/2/05_desk_2-result.webp"
|
||||||
|
},
|
||||||
|
"2/05_desk_3-thumb.avif": {
|
||||||
|
"sha256": "755be0874ad7c56d64782ccb709481d987c1b87a2e8b9c04d994118e261f9b6e",
|
||||||
|
"source": "https://zoomstage.online/2/05_desk_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"2/05_desk_3-thumb.jpg": {
|
||||||
|
"sha256": "cdd5d752af32cdfa1471bcdba2924b5a83adb489967b666722bfb0307a0b5221",
|
||||||
|
"source": "https://zoomstage.online/2/05_desk_3-thumb.jpg"
|
||||||
|
},
|
||||||
|
"2/05_desk_3-thumb.webp": {
|
||||||
|
"sha256": "f471e438efe927cd8fe366416520dbb2b866f855bd41e70e42a48dc79f461435",
|
||||||
|
"source": "https://zoomstage.online/2/05_desk_3-thumb.webp"
|
||||||
|
},
|
||||||
|
"2/05_mob_1-source.avif": {
|
||||||
|
"sha256": "f6b50e370340a6e4df76e73372155c5897cbe621bf90f1afe9f8aaef8425f1f4",
|
||||||
|
"source": "https://zoomstage.online/2/05_mob_1-source.avif"
|
||||||
|
},
|
||||||
|
"2/05_mob_2-result.avif": {
|
||||||
|
"sha256": "4907bb130e8c9fa0bd4391b2f6205973645ae47b22611967f7543f09227f284f",
|
||||||
|
"source": "https://zoomstage.online/2/05_mob_2-result.avif"
|
||||||
|
},
|
||||||
|
"2/05_mob_3-thumb.avif": {
|
||||||
|
"sha256": "4fecf25c3b250fb9b41e4a6fd03b85b9e23fb838d38dd8427c3ed938921bc2e5",
|
||||||
|
"source": "https://zoomstage.online/2/05_mob_3-thumb.avif"
|
||||||
|
},
|
||||||
|
"bootstrap.min.c.css": {
|
||||||
|
"sha256": "e3450fead306400ba24a20e2af963e6d9902ce6532eeed3ef5dbbe3b84543210",
|
||||||
|
"source": "https://zoomstage.online/bootstrap.min.c.css"
|
||||||
|
},
|
||||||
|
"bootstrap.min.css": {
|
||||||
|
"sha256": "f886516f3d41e9e7bd994c7f7a39a89cafae9483f90396cb0ddeafe8d1ea5e72",
|
||||||
|
"source": "https://zoomstage.online/bootstrap.min.css"
|
||||||
|
},
|
||||||
|
"docs/logo-alt.svg": {
|
||||||
|
"sha256": "919b0a436e6ffea1ec833a28e5b8c6f4d26029944a7d555ca4d61da63ea1f86f",
|
||||||
|
"source": "https://zoomzilla.ru/assets/6fd2ff6b/docs/logo-alt.svg"
|
||||||
|
},
|
||||||
|
"docs/logo.svg": {
|
||||||
|
"sha256": "1be54a2f9aa40b6d8740fd3367f045c5edf1cdea87c26d67b60cf663d4a2436f",
|
||||||
|
"source": "https://zoomzilla.ru/assets/6fd2ff6b/docs/logo-light.svg"
|
||||||
|
},
|
||||||
|
"docs/privacy_policy.pdf": {
|
||||||
|
"sha256": "61b483911be875810a7920efa5ddb9c9a132633cfe1d5d9efeb8f9d487cacf83",
|
||||||
|
"source": "https://zoomzilla.ru/assets/6fd2ff6b/docs/privacy_policy.pdf"
|
||||||
|
},
|
||||||
|
"docs/public_offer.pdf": {
|
||||||
|
"sha256": "4c1f05bcb818c688e89ad5b4ee5432cd810b943603340b1859fe54426fe27272",
|
||||||
|
"source": "https://zoomzilla.ru/assets/6fd2ff6b/docs/public_offer.pdf"
|
||||||
|
},
|
||||||
|
"docs/tariffs.pdf": {
|
||||||
|
"sha256": "d6d73d7e2a1d976d56d3a5ede0a5ce2e9144743e2fcbd14a8d73d6e159c383b9",
|
||||||
|
"source": "https://zoomzilla.ru/assets/6fd2ff6b/docs/tariffs.pdf"
|
||||||
|
},
|
||||||
|
"docs/user_agreement.pdf": {
|
||||||
|
"sha256": "2f5902d689e229abc4b3971831681e6e792cdedebcc9764cfe81521a10185a58",
|
||||||
|
"source": "https://zoomzilla.ru/assets/6fd2ff6b/docs/user_agreement.pdf"
|
||||||
|
},
|
||||||
|
"favicon/android-chrome-192x192.png": {
|
||||||
|
"sha256": "83e311e0f534c76de9c576da347daa4d8e0fd4f16150092d8f06441803238417",
|
||||||
|
"source": "https://zoomzilla.ru/assets/8f259a2e/android-chrome-192x192.png"
|
||||||
|
},
|
||||||
|
"favicon/android-chrome-512x512.png": {
|
||||||
|
"sha256": "1516ed9097f8abb66a632dde6c5bb7afcf096118710330387a18b3eaf2c1b793",
|
||||||
|
"source": "https://zoomzilla.ru/assets/8f259a2e/android-chrome-512x512.png"
|
||||||
|
},
|
||||||
|
"favicon/apple-touch-icon.png": {
|
||||||
|
"sha256": "0f8595d2116c03b879e5687fb0696b1802025c01437d689328bee5ce289d0a55",
|
||||||
|
"source": "https://zoomzilla.ru/assets/8f259a2e/apple-touch-icon.png"
|
||||||
|
},
|
||||||
|
"favicon/favicon-16x16.png": {
|
||||||
|
"sha256": "180344989e829ebb9a359a4210e9a6d55151f8637f004dfe0d7e1e127d81b867",
|
||||||
|
"source": "https://zoomzilla.ru/assets/8f259a2e/favicon-16x16.png"
|
||||||
|
},
|
||||||
|
"favicon/favicon-32x32.png": {
|
||||||
|
"sha256": "ecce74843584fa071053560f0e0b345ef91d707df87d3525bfc96286865745ab",
|
||||||
|
"source": "https://zoomzilla.ru/assets/8f259a2e/favicon-32x32.png"
|
||||||
|
},
|
||||||
|
"favicon/favicon-48x48.png": {
|
||||||
|
"sha256": "45a472452abfee5cd63387331e73150a718d6b11da0cba92b9b49d52699b2132",
|
||||||
|
"source": "https://zoomzilla.ru/assets/8f259a2e/favicon-48x48.png"
|
||||||
|
},
|
||||||
|
"favicon/favicon.ico": {
|
||||||
|
"sha256": "cbd8332a0def715eee9072e0ac81241728a5cc4a1b91aef042a35771c7c5526b",
|
||||||
|
"source": "https://zoomzilla.ru/assets/8f259a2e/favicon.ico"
|
||||||
|
},
|
||||||
|
"favicon/favicon.svg": {
|
||||||
|
"sha256": "85d52e14155f2f83f92c77b5188a5304902970988a0e639c6fa6b2683f794280",
|
||||||
|
"source": "https://zoomzilla.ru/assets/8f259a2e/favicon.svg"
|
||||||
|
},
|
||||||
|
"favicon/site.webmanifest": {
|
||||||
|
"sha256": "58b5df675b9c5d25a4b6b470a157be834f3f8f6862a4da86fa5b279ebd8136bd",
|
||||||
|
"source": "https://zoomzilla.ru/assets/8f259a2e/site.webmanifest"
|
||||||
|
},
|
||||||
|
"fonts/Inter-Medium.woff2": {
|
||||||
|
"sha256": "d6e2531976fa618cede5863027366e4011760b0610d7136a8f7d7ed149c26348",
|
||||||
|
"source": "https://zoomstage.online/fonts/Inter-Medium.woff2"
|
||||||
|
},
|
||||||
|
"fonts/Inter-Regular.woff2": {
|
||||||
|
"sha256": "413a527c0ed1833fea654b2bb065bda9ebe46bc1f585cf2d481f8a79dbc51610",
|
||||||
|
"source": "https://zoomstage.online/fonts/Inter-Regular.woff2"
|
||||||
|
},
|
||||||
|
"fonts/Inter-SemiBold.woff2": {
|
||||||
|
"sha256": "07d609457ea2e93be9e7b5dd8e9a9a156d2e80144bcd94cf0adf05c553da053b",
|
||||||
|
"source": "https://zoomstage.online/fonts/Inter-SemiBold.woff2"
|
||||||
|
},
|
||||||
|
"images/bg.jpg": {
|
||||||
|
"sha256": "2742589ea5f82d7fd68ddc98c4fb7a685e5eb79e33d428d519d5b7577e8a307b",
|
||||||
|
"source": "https://zoomstage.online/images/bg.jpg"
|
||||||
|
},
|
||||||
|
"images/confused.svg": {
|
||||||
|
"sha256": "ac3eb4691f4ec9556d3f2a70b8cb349fa9afc08dfd9526b20a6242b6b8d35048",
|
||||||
|
"source": "https://zoomstage.online/images/confused.svg"
|
||||||
|
},
|
||||||
|
"images/dark-bg.jpg": {
|
||||||
|
"sha256": "0d3fa322a523308abb7ffb899507d8b6218bc01c056da9ae741e44910479df61",
|
||||||
|
"source": "https://zoomstage.online/images/dark-bg.jpg"
|
||||||
|
},
|
||||||
|
"images/dropzone-bg.svg": {
|
||||||
|
"sha256": "431ba883e78ea0385e3f60539c1d3814ef93c05c0df6dbdea2d79836e9fe4a16",
|
||||||
|
"source": "https://zoomstage.online/images/dropzone-bg.svg"
|
||||||
|
},
|
||||||
|
"images/dropzone-icon.svg": {
|
||||||
|
"sha256": "8cb388e9bc4f8467ca0ebc0ab4ac3e78912f8481dcdd8a5434b7d6c921c64a47",
|
||||||
|
"source": "https://zoomstage.online/images/dropzone-icon.svg"
|
||||||
|
},
|
||||||
|
"images/modal-bg-2.svg": {
|
||||||
|
"sha256": "217f3df853073426079c6d79cffeeb0b499a5d671b46adb2e186de5e210757c2",
|
||||||
|
"source": "https://zoomstage.online/images/modal-bg-2.svg"
|
||||||
|
},
|
||||||
|
"images/payment.svg": {
|
||||||
|
"sha256": "031ec0a1e202ccecb128bbe2d1cc79b497166144a1a97529da2fe5293142044c",
|
||||||
|
"source": "https://zoomstage.online/images/payment.svg"
|
||||||
|
},
|
||||||
|
"images/sandglass.svg": {
|
||||||
|
"sha256": "914f8be205f4535690a5a6d64745e20a18fdc3a9ffc83d2574cde1c0a3100ad3",
|
||||||
|
"source": "https://zoomstage.online/images/sandglass.svg"
|
||||||
|
},
|
||||||
|
"images/spinner.svg": {
|
||||||
|
"sha256": "102699ae937c28b44270e49be78ee607cb795a6cc4004d38e2bd18cee3944845",
|
||||||
|
"source": "https://zoomstage.online/images/spinner.svg"
|
||||||
|
},
|
||||||
|
"images/sprite.svg": {
|
||||||
|
"sha256": "36c7e1c142c883f746eb5851278a34249897ec16aadfbbb9d9bbf5b11336459b",
|
||||||
|
"source": "https://zoomstage.online/images/sprite.svg"
|
||||||
|
},
|
||||||
|
"requisites.html": {
|
||||||
|
"sha256": "5d7d42da0029f2a90bebb2fc10bb507be3725a4be3fb8237f3afe21cfb485c88",
|
||||||
|
"source": "https://zoomzilla.ru/"
|
||||||
|
},
|
||||||
|
"style.css": {
|
||||||
|
"sha256": "102aee00546d897dd94887d69b35fec0b3430448ef6a21e072f5b7d76964ce06",
|
||||||
|
"source": "https://zoomstage.online/style.css"
|
||||||
|
},
|
||||||
|
"style.min.c.css": {
|
||||||
|
"sha256": "d4afd7aeaa56c97d6415beee220398f654d4d9ca0cac35770e7ea3d89412c878",
|
||||||
|
"source": "https://zoomstage.online/style.min.c.css"
|
||||||
|
},
|
||||||
|
"style.min.css": {
|
||||||
|
"sha256": "3e579e90cd8dd1193db45cf0d433ae8acfac76eb38444755f0b4d15a3af7f2f2",
|
||||||
|
"source": "https://zoomstage.online/style.min.css"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[
|
||||||
|
"ИП Кардаполова Яна Виталийсовна",
|
||||||
|
"346886, Ростовская обл., г. Батайск,",
|
||||||
|
"ДНТ «Труд», ул. 11-я линия, д. 1195",
|
||||||
|
"ИНН: 616202304132,",
|
||||||
|
"ОГРНИП: 326619600205915"
|
||||||
|
]
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<p class="mb-0">ИП Кардаполова Яна Виталийсовна</p>
|
||||||
|
<p class="mb-0">346886, Ростовская обл., г. Батайск,</p>
|
||||||
|
<p class="mb-0">ДНТ «Труд», ул. 11-я линия, д. 1195</p>
|
||||||
|
<p class="mb-0">ИНН: 616202304132,</p>
|
||||||
|
<p class="mb-0">ОГРНИП: 326619600205915</p>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
body {
|
body {
|
||||||
font-family: "Inter", sans-serif;
|
font-family: "Inter", sans-serif;
|
||||||
|
|
||||||
/* fix WBE70 */
|
/* Корневые отступы страницы задаёт общий layout. */
|
||||||
padding: unset !important;
|
padding: unset !important;
|
||||||
overflow: auto !important;
|
overflow: auto !important;
|
||||||
}
|
}
|
||||||
@@ -2910,7 +2910,7 @@ body { isolation: isolate; }
|
|||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
}
|
}
|
||||||
:is(.index-mobile-fit, .tour-processing) #preview { height: auto; aspect-ratio: 1696 / 920; }
|
:is(.index-mobile-fit, .tour-processing) #preview { height: 100%; aspect-ratio: auto; }
|
||||||
}
|
}
|
||||||
@media (max-width: 767.98px) { .wrapper { --site-header-height: 68px; } }
|
@media (max-width: 767.98px) { .wrapper { --site-header-height: 68px; } }
|
||||||
/* /api#298 */
|
/* /api#298 */
|
||||||
@@ -2939,3 +2939,6 @@ body { isolation: isolate; }
|
|||||||
html[data-upload-device=mobile] .index-mobile-fit #dropzone-form { min-height: 225px; }
|
html[data-upload-device=mobile] .index-mobile-fit #dropzone-form { min-height: 225px; }
|
||||||
html[data-upload-device=android] .index-mobile-fit .dropzone-form-action { min-height: 90px; }
|
html[data-upload-device=android] .index-mobile-fit .dropzone-form-action { min-height: 90px; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* preland#11: общий с API адаптивный платёжный бейдж подвала. */
|
||||||
|
.footer-main img[src$="/images/payment.svg"]{max-width:100%;height:auto;}
|
||||||
@@ -841,3 +841,6 @@ padding-top: 2svh !important;
|
|||||||
@media(max-width:767.98px){.result-download-title{font-size:24px;line-height:1.2;}}
|
@media(max-width:767.98px){.result-download-title{font-size:24px;line-height:1.2;}}
|
||||||
@media (min-width:768px){.image-compare .icv__label{top:10px;width:92px;height:36px;display:flex;align-items:center;justify-content:center;padding:4px 10px;font:400 16px/26px Inter,sans-serif;color:#fff;backdrop-filter:none;-webkit-backdrop-filter:none;background:rgb(0 0 0 / 25%);border:1px solid rgb(255 255 255 / 80%);box-shadow:none;text-shadow:none;}}
|
@media (min-width:768px){.image-compare .icv__label{top:10px;width:92px;height:36px;display:flex;align-items:center;justify-content:center;padding:4px 10px;font:400 16px/26px Inter,sans-serif;color:#fff;backdrop-filter:none;-webkit-backdrop-filter:none;background:rgb(0 0 0 / 25%);border:1px solid rgb(255 255 255 / 80%);box-shadow:none;text-shadow:none;}}
|
||||||
.upload-loading-dots{display:inline-grid;text-align:left;}.upload-loading-dots::before{content:'.....';visibility:hidden;grid-area:1 / 1;}.upload-loading-dots > span{grid-area:1 / 1;}
|
.upload-loading-dots{display:inline-grid;text-align:left;}.upload-loading-dots::before{content:'.....';visibility:hidden;grid-area:1 / 1;}.upload-loading-dots > span{grid-area:1 / 1;}
|
||||||
|
|
||||||
|
/* preland#11: общий с API адаптивный платёжный бейдж подвала. */
|
||||||
|
.footer-main img[src$="/images/payment.svg"]{max-width:100%;height:auto;}
|
||||||
Vendored
+4
-1
@@ -111,7 +111,7 @@ body { isolation: isolate; }
|
|||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
}
|
}
|
||||||
:is(.index-mobile-fit, .tour-processing) #preview { height: auto; aspect-ratio: 1696 / 920; }
|
:is(.index-mobile-fit, .tour-processing) #preview { height: 100%; aspect-ratio: auto; }
|
||||||
}
|
}
|
||||||
@media (max-width: 767.98px) { .wrapper { --site-header-height: 68px; } }
|
@media (max-width: 767.98px) { .wrapper { --site-header-height: 68px; } }
|
||||||
/* /api#298 */
|
/* /api#298 */
|
||||||
@@ -140,3 +140,6 @@ body { isolation: isolate; }
|
|||||||
html[data-upload-device=mobile] .index-mobile-fit #dropzone-form { min-height: 225px; }
|
html[data-upload-device=mobile] .index-mobile-fit #dropzone-form { min-height: 225px; }
|
||||||
html[data-upload-device=android] .index-mobile-fit .dropzone-form-action { min-height: 90px; }
|
html[data-upload-device=android] .index-mobile-fit .dropzone-form-action { min-height: 90px; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* preland#11: общий с API адаптивный платёжный бейдж подвала. */
|
||||||
|
.footer-main img[src$="/images/payment.svg"]{max-width:100%;height:auto;}
|
||||||
+4
-4
@@ -57,8 +57,8 @@
|
|||||||
<nav class="navbar navbar-dark py-1 py-md-3 px-0">
|
<nav class="navbar navbar-dark py-1 py-md-3 px-0">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<span class="navbar-brand" href="<?= $apiHost ?: '/' ?>" >
|
<span class="navbar-brand" href="<?= $apiHost ?: '/' ?>" >
|
||||||
<img src="<?= $assetsUriPrefix; ?>/docs/logo.svg" width="160" height="40" alt="Logo">
|
<img src="<?= prelandAssetUrl('docs/logo.svg') ?>" width="160" height="40" alt="Zoomzilla">
|
||||||
<img src="<?= $assetsUriPrefix; ?>/docs/logo-alt.<?= $logoAltExt ?>" width="160" height="40" alt="Logo-Alt">
|
<img src="<?= prelandAssetUrl('docs/logo-alt.svg') ?>" width="160" height="40" alt="Zoomzilla">
|
||||||
</span>
|
</span>
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
</div>
|
</div>
|
||||||
@@ -99,8 +99,8 @@
|
|||||||
<div class="row py-5 footer-main">
|
<div class="row py-5 footer-main">
|
||||||
<div class="col-md-4 mb-4 mb-md-0">
|
<div class="col-md-4 mb-4 mb-md-0">
|
||||||
<div class="footer-logo">
|
<div class="footer-logo">
|
||||||
<img src="<?= $assetsUriPrefix; ?>/docs/logo.svg" width="240" height="60" alt="Logo">
|
<img src="<?= prelandAssetUrl('docs/logo.svg') ?>" width="240" height="60" alt="Zoomzilla">
|
||||||
<img src="<?= $assetsUriPrefix; ?>/docs/logo-alt.<?= $logoAltExt ?>" width="240" height="60" alt="Logo">
|
<img src="<?= prelandAssetUrl('docs/logo-alt.svg') ?>" width="240" height="60" alt="Zoomzilla">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4 mb-4 mb-md-0">
|
<div class="col-md-4 mb-4 mb-md-0">
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
<?php
|
||||||
|
/** preland#11: старый бренд запрещён независимо от обновления manifest. */
|
||||||
|
declare(strict_types=1);
|
||||||
|
$root = dirname(__DIR__);
|
||||||
|
$oldBlob = '91267982e1ad373b6ebd5fb2b761b34fe2a0c2a5';
|
||||||
|
foreach (['docs/logo.svg', 'docs/logo-alt.svg'] as $file) {
|
||||||
|
$body = str_replace("\r\n", "\n", file_get_contents($root . '/' . $file));
|
||||||
|
if (sha1('blob ' . strlen($body) . chr(0) . $body) === $oldBlob) {
|
||||||
|
fwrite(STDERR, "FAILED: {$file} содержит запрещённую заглушку бренда\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
require $root . '/bin/release-assets.php';
|
||||||
|
validateReleaseAssets($root);
|
||||||
|
$files = releaseFiles($root);
|
||||||
|
foreach (['docs/logo.svg', 'docs/logo-alt.svg', 'docs/privacy_policy.pdf', 'template.php'] as $file) {
|
||||||
|
if (!in_array($file, $files, true)) throw new RuntimeException('Не включён ' . $file);
|
||||||
|
}
|
||||||
|
foreach ($files as $file) {
|
||||||
|
if (preg_match('~^(tests/|bin/|release/|docs/superpowers/|config\.json$|[0-9]+/)~', $file)) {
|
||||||
|
throw new RuntimeException('В кодовую поставку попал защищённый/служебный файл ' . $file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Повреждение/удаление ресурса и подмена manifest не должны проходить preflight.
|
||||||
|
$fixture = sys_get_temp_dir() . '/preland11-' . bin2hex(random_bytes(6));
|
||||||
|
mkdir($fixture);
|
||||||
|
$copy = static function (string $relative) use ($root, $fixture): void {
|
||||||
|
$target = $fixture . '/' . $relative;
|
||||||
|
if (!is_dir(dirname($target))) mkdir(dirname($target), 0700, true);
|
||||||
|
copy($root . '/' . $relative, $target);
|
||||||
|
};
|
||||||
|
$manifest = json_decode(file_get_contents($root . '/release/assets.json'), true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
foreach (array_keys($manifest['files']) as $file) $copy($file);
|
||||||
|
$copy('release/assets.json');
|
||||||
|
try {
|
||||||
|
validateReleaseAssets($fixture);
|
||||||
|
$mustFail = static function (callable $mutate) use ($fixture): void {
|
||||||
|
$mutate();
|
||||||
|
try { validateReleaseAssets($fixture); } catch (RuntimeException $e) { return; }
|
||||||
|
throw new RuntimeException('Повреждённый ресурс принят');
|
||||||
|
};
|
||||||
|
$mustFail(fn() => file_put_contents($fixture . '/docs/logo.svg', 'broken'));
|
||||||
|
$copy('docs/logo.svg');
|
||||||
|
$mustFail(fn() => unlink($fixture . '/docs/public_offer.pdf'));
|
||||||
|
$copy('docs/public_offer.pdf');
|
||||||
|
$mustFail(function () use ($fixture, $manifest): void {
|
||||||
|
unset($manifest['files']['docs/logo-alt.svg']);
|
||||||
|
file_put_contents($fixture . '/release/assets.json', json_encode($manifest));
|
||||||
|
});
|
||||||
|
$copy('release/assets.json');
|
||||||
|
$mustFail(function () use ($fixture, $manifest): void {
|
||||||
|
$body = '<svg>WBE70</svg>';
|
||||||
|
file_put_contents($fixture . '/docs/logo.svg', $body);
|
||||||
|
$manifest['files']['docs/logo.svg']['sha256'] = hash('sha256', $body);
|
||||||
|
file_put_contents($fixture . '/release/assets.json', json_encode($manifest));
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($fixture, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST);
|
||||||
|
foreach ($iterator as $item) $item->isDir() ? rmdir($item->getPathname()) : unlink($item->getPathname());
|
||||||
|
rmdir($fixture);
|
||||||
|
}
|
||||||
|
echo "OK: текущие ресурсы, повреждение/удаление/подмена manifest и состав поставки\n";
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
/** preland#11: разрешено менять только согласованный ключ requisites. */
|
||||||
|
declare(strict_types=1);
|
||||||
|
$root = dirname(__DIR__);
|
||||||
|
$expected = json_decode(file_get_contents($root . '/release/requisites.json'), true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
$saved = json_decode(file_get_contents($root . '/config.json'), true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
if (($saved['requisites'] ?? null) !== $expected) {
|
||||||
|
fwrite(STDERR, "FAILED: Git config содержит старые реквизиты\n"); exit(1);
|
||||||
|
}
|
||||||
|
$raw = "{\n \"host\" : \"custom.example\", \"nested\":{\"requisites\":[\"do not change\"]},\n \"requisites\": [\"old\",\"escaped \\\"quote\"], \"utm\" : {\"focus\":\"custom\"}, \"unknown\":\"\\u0041\"\n}\n";
|
||||||
|
$path = tempnam(sys_get_temp_dir(), 'requs-');
|
||||||
|
try {
|
||||||
|
foreach ([$raw, '{"host":"other.example","unknown":{"a":1}}'] as $fixture) {
|
||||||
|
file_put_contents($path, $fixture);
|
||||||
|
exec(PHP_BINARY . ' ' . escapeshellarg($root . '/bin/ensure-requisites-config.php') . ' ' . escapeshellarg($path), $output, $code);
|
||||||
|
if ($code !== 10) throw new RuntimeException('Ожидалась точечная замена requisites');
|
||||||
|
$after = file_get_contents($path);
|
||||||
|
$beforeData = json_decode($fixture, true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
$afterData = json_decode($after, true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
if ($afterData['requisites'] !== $expected) throw new RuntimeException('Реквизиты не заменены');
|
||||||
|
unset($beforeData['requisites'], $afterData['requisites']);
|
||||||
|
if ($beforeData !== $afterData) throw new RuntimeException('Другие значения изменены');
|
||||||
|
if (isset($afterData['nested']) && !str_contains($after, '"unknown":"\\u0041"')) throw new RuntimeException('Изменены байты чужих полей');
|
||||||
|
exec(PHP_BINARY . ' ' . escapeshellarg($root . '/bin/ensure-requisites-config.php') . ' ' . escapeshellarg($path), $output, $code);
|
||||||
|
if ($code !== 0 || file_get_contents($path) !== $after) throw new RuntimeException('Повторная операция не идемпотентна');
|
||||||
|
}
|
||||||
|
} finally { unlink($path); }
|
||||||
|
echo "OK: requisites-only, чужие поля/байты сохранены, повторный запуск без изменений\n";
|
||||||
Reference in new issue
Block a user