Анализ сайта cloud.digitalocean.com
Основное Готовность: 75%
Домен
cloud.digitalocean.com
Состояние доменного имени
?
Проверяем корректность доменного имени и наличие технических проблем на уровне домена.
Используйте для продвижения только домен второго уровня.
Длина домена велика. Но если вы продвигаете запрос, входящий в название домена, то это хорошо.
Ответ сервера
200 Успешный ответ
HTTP-код ответа и цепочка редиректов
?
Код 200 — страница доступна. Коды 3xx — редиректы (цепочки замедляют загрузку и размывают ссылочный вес). Коды 4xx/5xx — ошибки, поисковик не сможет проиндексировать страницу.
Кол-во редиректов 3 слишком большое! Проверьте настройки сайта и веб-сервера!
Цепочка редиректов:
http://cloud.digitalocean.com
301 MovedPermanently
https://cloud.digitalocean.com/
302 Found
https://cloud.digitalocean.com/login
200 OK
Безопасность
Сайт безопасен
Использование HTTPS и SSL-сертификат
?
HTTPS — обязательный стандарт. Google и Яндекс отдают предпочтение защищённым сайтам. Отсутствие SSL или просроченный сертификат ведут к предупреждениям в браузере и снижению позиций.
На сайте работает защищенный протокол ssl и сайт открывается по https.
Ssl-сертификат действителен до 09.01.2027 2:59:59.
Включён HSTS (Strict-Transport-Security) — защита от подмены на http.
HTTP автоматически перенаправляется на HTTPS.
Поздравляем! Сайт не содержится в реестре РКН.
Кодировка
utf-8
Кодировка символов страницы
?
Стандарт — UTF-8. Неправильная кодировка вызывает нечитаемые символы и мешает поисковику корректно распознать текст страницы.
Указана кодировка на странице utf-8.
Язык
en
Атрибут lang в HTML-теге
?
Атрибут lang (<html lang="ru">) сообщает поисковикам и браузерам, на каком языке написана страница. Помогает при ранжировании в региональном поиске.
Язык документа указан явно: en.
Скорость загрузки
~0,74сек
Время отклика сервера (TTFB)
?
Time To First Byte — время до получения первого байта от сервера. Норма до 200 мс. Медленный отклик ухудшает пользовательский опыт и ранжирование: Яндекс и Google учитывают скорость страниц.
Скорость загрузки сайта 0,74сек оптимальна.
Объем документа
50Кб
Размер HTML-кода страницы
?
Слишком большой HTML замедляет парсинг браузером и сканирование поисковым роботом. Рекомендуется не более 200 Кб.
Объем html-документа 50Кб оптимален.
Структура html-документа корректна.
Ресурсы
Ресурсы: 3
Внешние ресурсы страницы (CSS, JS, изображения)
?
Количество и тип подключённых ресурсов влияют на скорость загрузки. Большое число запросов увеличивает время рендеринга страницы.
Кол-во файлов ресурсов 3 достаточно.
Показать полный список ресурсов
| Тип | Название | Значение |
|---|---|---|
| js | https://ui-cdn.digitalocean-ui.com/federation/lobster-roll-host/assets/sentry.673b95ac984cb71c89eabf90df057f49eee898a8d585abf28ef86384d00c26fc.js | |
| js | https://assets.digitalocean.com/prism/prism.js | |
| js | https://ui-cdn.digitalocean-ui.com/federation/lobster-roll-host/assets/main.016a3d02d9b27462e972dc9d00664fdec9f3953040b60eb0863eee1a60636a52.js |
Серверные заголовки
Кол-во: 18
HTTP-заголовки ответа сервера
?
Заголовки сервера передают браузеру и поисковику служебную информацию: кеширование, безопасность (CSP, HSTS), сжатие (gzip). Правильная настройка ускоряет загрузку и повышает защищённость.
Найдены серверные заголовки 18шт. Подробнее про серверные заголовки.
Показать полный список серверных заголовков
| Ключ | Значение |
|---|---|
| Date | Sun, 23 Aug 2026 05:13:22 GMT |
| Cache-Control | no-store, must-revalidate, no-cache |
| Content-Security-Policy | frame-ancestors 'self' https://localdev.internal.digitalocean.com:4500 https://docs.digitalocean.com https://marketplace.digitalocean.com https://www.digitalocean.com; |
| content-security-policy-report-only | frame-ancestors 'self' https://localdev.internal.digitalocean.com:4500 https://docs.digitalocean.com https://marketplace.digitalocean.com https://www.digitalocean.com; default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.stripe.com m.stripe.network *.digitalocean.com *.digitalocean-ui.com *.digitaloceanspaces.com *.typekit.net https://www.googletagmanager.com https://pagead2.googlesyndication.com https://googleads.g.doubleclick.net https://maps.googleapis.com *.amplitude.com https://hexagon-analytics.com *.pw.adn.cloud https://www.gravatar.com *.wp.com *.sentry.io https://browser.sentry-cdn.com *.cloudfront.net https://services.taxamo.com https://websites.cdn.getfeedback.com https://pocustrack.com https://cdn.schemaapp.com https://www.paypal.com https://bat.bing.com https://gc.kis.v2.scr.kaspersky-labs.com *.inflection.io blob: https://cdn.jsdelivr.net https://cdnjs.cloudflare.com https://static.ads-twitter.com https://consent.trustarc.com https://client-api.arkoselabs.com https://canny.io *.canny.io localdev.internal.digitalocean.com:9000 localdev.internal.digitalocean.com:4501 localdev.internal.digitalocean.com:4500 cloud.s2r1.internal.digitalocean.com agent-bb7c8e8f107ffaca00e0-zo6gz.ondigitalocean.app https://app.marketo.com *.agents.do-ai.run *.agents.do-ai-test.run localdev.internal.digitalocean.com:*; style-src 'self' 'unsafe-inline' *.digitalocean-ui.com *.digitalocean.com https://use.typekit.net https://p.typekit.net agent-bb7c8e8f107ffaca00e0-zo6gz.ondigitalocean.app cloud.s2r1.internal.digitalocean.com https://fonts.googleapis.com ui-cdn-staging.sfo2.cdn.digitaloceanspaces.com https://cdn.jsdelivr.net https://cdnjs.cloudflare.com; style-src-elem 'self' 'unsafe-inline' *.digitalocean.com *.digitalocean-ui.com https://use.typekit.net localdev.internal.digitalocean.com:* https://p.typekit.net https://fonts.googleapis.com https://cdn.jsdelivr.net https://app.marketo.com; font-src 'self' *.digitalocean-ui.com https://use.typekit.net https://fonts.gstatic.com data: moz-extension: https://static.hsappstatic.net https://cdn.scite.ai https://r2cdn.perplexity.ai https://cdn.jsdelivr.net https://consent.trustarc.com; worker-src 'self' blob:; frame-src 'self' https://js.stripe.com https://www.googletagmanager.com *.digitalocean.com *.paypal.com https://r.perfsimpl.com https://pwm-image.trendmicro.com https://tatrck.com https://jump.spidershopping.com https://i.gtxen.com https://digitalocean.pxf.io https://hipodi.com *.trustarc.com https://td.doubleclick.net agent-bb7c8e8f107ffaca00e0-zo6gz.ondigitalocean.app https://client-api.arkoselabs.com https://changelog-widget.canny.io https://app.marketo.com *.agents.do-ai.run *.agents.do-ai-test.run; media-src 'self' ui-cdn.digitalocean-ui.com data:; img-src 'self' data: blob: https: http://assets.digitalocean.com *.digitalocean.com *.digitalocean-ui.com *.digitaloceanspaces.com *.google.com *.gstatic.com *.typekit.net *.wp.com *.gravatar.com https://hexagon-analytics.com https://www.googletagmanager.com https://analytics.twitter.com https://bat.bing.com https://px.ads.linkedin.com https://googleads.g.doubleclick.net https://consent-pref.trustarc.com https://img.alicdn.com https://yastatic.net https://cdn.manifold.co https://t.co https://pagead2.googlesyndication.com; connect-src 'self' *.digitalocean.com *.digitalocean-ui.com *.digitaloceanspaces.com *.amplitude.com *.google-analytics.com *.google.com *.algolianet.com *.algolia.net *.stripe.com *.paypal.com *.trustarc.com *.arkoselabs.com *.schemaapp.com *.do-ai.run *.agents.do-ai.run *.agents.do-ai-test.run *.canny.io https://sentry.io *.sentry.io https://use.typekit.net https://assets.digitalocean.com https://api.tx4.pw.adn.cloud https://pagead2.googlesyndication.com https://stats.g.doubleclick.net https://www.googleadservices.com https://bat.bing.com https://api.segment.io https://freegeoip.net https://events.ub-analytics.com https://gc.kis.v2.scr.kaspersky-labs.com *.prismic.io https://deliveryapi-tx4-27161589503.us-central1.run.app cims-stage2.s2r1.spaces.stage2gateway.com https://www.googletagmanager.com https://api-ingest.pocustrack.com data: wss: https:; report-to csp-endpoint; |
| report-to | {"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url":"https://o1109393.ingest.us.sentry.io/api/4507504849256448/security/?sentry_key=aee88abdb1378a68fd5ff728abdf2694"}]} |
| Strict-Transport-Security | max-age=31536000 |
| Vary | Accept-Encoding |
| X-Content-Type-Options | nosniff |
| x-gateway | Edge-Gateway |
| x-host-app-name | registration-next |
| x-host-revision | d2d34ee3eac053faa635de556dbaea6fc4dbe921 |
| X-Request-ID | 71ced886-fead-4c81-948e-cfc88cc19199 |
| x-response-from | service |
| X-XSS-Protection | 1; mode=block |
| do-upstream-service-time | 86 |
| cf-cache-status | DYNAMIC |
| Server | cloudflare |
| cf-ray | a2f7a0aab845e48e-DME |
CMS
Не определена
Система управления сайтом (движок)
?
CMS — это движок, на котором работает сайт (WordPress, 1C-Bitrix, Tilda и др.). Знание CMS помогает понять возможности SEO-оптимизации и подобрать подходящие инструменты. «Не определена» — вероятно, самописный сайт или нестандартная сборка.
CMS не определена. Вероятно, сайт самописный либо движок надёжно скрыт. Это не ошибка.
Веб-сервер
Программное обеспечение сервера
?
Веб-сервер — это ПО, которое отдаёт страницы посетителям (nginx, Apache, IIS, LiteSpeed и др.). Определяется по серверным заголовкам ответа (Server, X-Powered-By и т.п.). «Не определён» — сервер намеренно скрывает эти заголовки, это нормальная практика безопасности.
Сайт работает на веб-сервере Cloudflare.
Мета-теги Готовность: 78%
Title
DigitalOcean
Заголовок страницы в браузере и поисковой выдаче
?
Title — главный SEO-заголовок страницы. Влияет на CTR в поиске и ранжирование. Оптимальная длина: 50–70 символов. Ключевые слова — ближе к началу.
Необходимо увеличить число символов в title (текущее значение мало: 12, минимум: 25, оптимально: от 40 до 45)
Дублей словоформ в title не найдено.
Description
Helping millions of developers easily build, test, manage, and scale applications of any size — faster than ever before.
Описание страницы в поисковой выдаче (сниппет)
?
Meta Description — текст под заголовком в выдаче. Напрямую на позиции не влияет, но влияет на CTR. Оптимальная длина: 120–160 символов.
Число символов в description 120 оптимально (норма: от 120 до 130).
Keywords
Список ключевых слов страницы (устаревший тег)
?
Meta Keywords не учитывается Яндексом и Google для ранжирования с 2009–2012 годов. Заполнение не обязательно, но не вредит. Конкурент может использовать содержимое для анализа.
Установите мета-тег keywords!
Канонический Url
Указывает поисковику основную версию страницы
?
Canonical (rel=canonical) предотвращает проблему дублей страниц. Должен точно совпадать с URL проверяемой страницы. Неправильный canonical может передать ссылочный вес на другую страницу.
Рекомендуем прописать канонический Url.
Robots
Ошибок нет
Директивы для поисковых роботов на уровне страницы
?
Meta Robots управляет индексацией конкретной страницы: index/noindex — индексировать ли, follow/nofollow — следовать ли по ссылкам. Noindex полностью исключает страницу из поиска.
Meta-тег robots не указан. Страница свободна для индексации.
Адаптивность
width=device-width,initial-scale=1
Настройка масштабирования на мобильных устройствах
?
Тег viewport (<meta name="viewport">) сообщает браузеру, как масштабировать страницу на мобильных. Стандарт: width=device-width, initial-scale=1. Отсутствие — признак отсутствия мобильной версии.
Meta-тег viewport со значением-константой width=device-width задаёт ширину страницы в соответствии с размером экрана.
Meta-тег viewport со значением initial-scale=1.0 определяет масштаб 1:1, т.е. «не масштабировать».
Разметка OpenGraph
Кол-во: 6
Мета-теги для красивых превью в соцсетях
?
OpenGraph (og:title, og:description, og:image) управляет тем, как страница выглядит при репосте в социальных сетях и мессенджерах. Отсутствие OG-тегов — невзрачный превью при шеринге.
Разметка OpenGraph задана. Страница оптимизирована под социальные сети.
Показать полный список og мета-тегов
| Тип | Значение |
|---|---|
| og:url | https://www.digitalocean.com/ |
| og:title | DigitalOcean — The developer cloud |
| og:site_name | DigitalOcean |
| og:image | https://www.digitalocean.com/_next/static/media/social-share-default.e8530e9e.jpeg |
| og:type | website |
| og:description | Helping millions of developers easily build, test, manage, and scale applications of any size — faster than ever before. |
Все мета-теги
Кол-во: 11
Полный список мета-тегов страницы
?
Таблица всех meta-тегов, включая нестандартные. Позволяет найти опечатки, дубли и лишние теги.
Найдены мета-теги 11шт. Мета-теги не видимы для человека и предназначены для обмена информацией между веб-страницей и поисковыми системами, браузерами и другими веб-службами. С ними роботы 🤖 и устройства ведут себя более ожидаемо.
Показать полный список мета-тегов
| Тип | Название | Значение |
|---|---|---|
| name | viewport | width=device-width,initial-scale=1 |
| name | description | Helping millions of developers easily build, test, manage, and scale applications of any size — faster than ever before. |
| name | twitter:card | summary |
| name | twitter:site | @DigitalOcean |
| name | twitter:creator | @DigitalOcean |
| property | og:url | https://www.digitalocean.com/ |
| property | og:title | DigitalOcean — The developer cloud |
| property | og:site_name | DigitalOcean |
| property | og:image | https://www.digitalocean.com/_next/static/media/social-share-default.e8530e9e.jpeg |
| property | og:type | website |
| property | og:description | Helping millions of developers easily build, test, manage, and scale applications of any size — faster than ever before. |
Оптимизация Готовность: 0%
Структура
Ошибок нет
Семантические HTML-элементы страницы
?
Проверяет наличие основных структурных элементов: nav, header, footer, main. Корректная семантическая структура помогает поисковику понять архитектуру страницы.
Структура документа корректна (теги <html> и <body> присутствуют по одному на документ).
Контент
Есть ошибки
Объём и качество текстового содержимого
?
Анализирует объём полезного текста на странице. Слишком мало — страница может считаться малополезной. Слишком много — ухудшается читаемость и восприятие.
Слова из title 0 встречаются в тексте редко. Добавьте в контент страницы слова из тега <title>!
Абзацев с текстом 0 слишком мало. Добавьте больше абзацев с текстом (тег <p>)!
Среднее число слов в абзаце 0 слишком мало. Сделайте контент более читаемым!
Кол-во знаков контента 46 слишком мало. Добавьте больше текста!
Кол-во слов 9 слишком мало. Добавьте больше текста (минимум 400 слов)!
Заголовки
Есть ошибки
Иерархия заголовков H1–H6
?
H1 должен быть один и содержать ключевой запрос. H2–H6 описывают подразделы. Пропуск уровней (H1 → H3) и несколько H1 — типичные ошибки, снижающие понятность страницы для поисковика.
Не обнаружено заголовков на странице. Добавьте заголовки (<h1>, <h2> или <h3>)
Тошнота
1
Насколько одно слово доминирует в тексте
?
Классическая тошнота = √(частота самого повторяющегося слова). Норма до 7–8: текст воспринимается естественно. Выше — поисковик может счесть страницу переспамленной.
Тошнота страницы в пределах нормы 3.
Академич. тошнота
11,11%
Насколько текст перенасыщен ключевыми словами
?
Академическая тошнота = (частота слова / общее количество слов) × 100%. Показывает долю конкретного слова в тексте. Норма 5–15%.
Академическая тошнота страницы в пределах нормы.
Семантическое ядро
2
Наиболее часто встречающиеся слова на странице
?
Топ слов по частоте использования. Показывает, какие слова доминируют в тексте с точки зрения поисковика.
Контент страницы не содержит осмысленного текста. Добавьте текст на страницу!
Показать список слов
| Слово | Кол-во | Частота |
|---|---|---|
| enable | 1 | 11,11% |
| javascript | 1 | 11,11% |
Индексация Готовность: 0%
Индексирование
Есть ошибки
Разрешено ли индексирование страницы
?
Проверяет, не закрыта ли страница от индексации через robots.txt, meta robots или X-Robots-Tag. Страница, закрытая от индексации, не появится в поисковой выдаче.
Анкоров на странице не обнаружено. Велика вероятность, что сайт - одностраничник, такой сайт продвинуть крайне затруднительно!
Robots.txt
Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Кол-во редиректов для файла robots.txt 3 слишком большое! Это может вызывать затруднение при индексации поисковыми роботами!
Проверяемая страница не запрещена в robots.txt.
Robots.txt доступен по постоянному адресу
Цепочка редиректов для файла robots.txt:
http://cloud.digitalocean.com/robots.txt
301 MovedPermanently
https://cloud.digitalocean.com/robots.txt
302 Found
https://cloud.digitalocean.com/login?redirect_url=https%3A%2F%2Fcloud.digitalocean.com%2Frobots.txt
200 OK
Показать содержимое robots.txt
<!doctype html><html lang="en"><head>
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/websocket/versions/2026.8.13-8608aff158f2f84140de273eb94edb1b7c247ece/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/ui-copilot/versions/2026.8.20-f5d710615834df390b4368a22ab00fbd7fce9c98/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/track-exp/versions/2026.8.18-6a9f1c97830b5b1de341ebbe88899265434b18f1/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/session-manager/versions/2026.8.18-577c7ce1e98dfa33a577a5d4d4ef5e16f70322de/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/flippers/versions/2026.6.29-6cbd3a3d3317d997fa1e89fcc9d24fc66747423f/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/seashell/versions/2026.8.20-ff4541cd405ec490ce0c41b96b27349a980c6146/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/permissions/versions/2026.8.12-37e39a06cd9f05e2a59a4cad9512bae202cbd78c/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/current-user/versions/2026.8.4-549234d1d5f7f0e84476ed8399cc808ab81dd378/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/navigation/versions/2026.8.13-1194d26b905ac67da5d6686e2224c647dd3032a6/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/current-context-urn/versions/2026.6.18-2863e0a2cea783089ab6d9cd7ffac6283b336c90/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/graphql-client/versions/2026.8.18-c735118b1bd4d77cb97c0b684ec4a5bfdbf3d69b/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/walrus/versions/2026.8.21-326d383dba9997de583d40f62fc8e9112e6e2dec/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/message-bus/versions/2026.8.14-1ee19ac129656fd29031e204a18b2043b2233a20/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/error-boundary/versions/2026.8.14-1ee19ac129656fd29031e204a18b2043b2233a20/remoteEntry.js">
<link rel="preload" as="script" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/registration-next/versions/2026.8.19-64ec151fdb920a1857c4c0610f1aa37ce6f0b33a/remoteEntry.js">
<script>window.__LR_GLOBAL_APP_NAME__ = "registration-next";</script>
<title>DigitalOcean</title><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><link rel="preconnect" href="https://ui-cdn.digitalocean-ui.com"/><link rel="preconnect" href="https://www.google-analytics.com"/><link rel="preconnect" href="https://www.gravatar.com"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/><link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@300;400;500;600;700&family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&display=swap" onload="this.rel='stylesheet'" crossorigin="anonymous"/><link rel="shortcut icon" href="/favicon.png"/><link rel="manifest" href="/manifest.json"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><meta property="og:url" content="https://www.digitalocean.com/"/><meta property="og:title" content="DigitalOcean — The developer cloud"/><meta property="og:site_name" content="DigitalOcean"/><meta property="og:image" content="https://www.digitalocean.com/_next/static/media/social-share-default.e8530e9e.jpeg"/><meta property="og:type" content="website"/><meta property="og:description" content="Helping millions of developers easily build, test, manage, and scale applications of any size — faster than ever before."/><meta name="description" content="Helping millions of developers easily build, test, manage, and scale applications of any size — faster than ever before."/><meta name="twitter:card" content="summary"/><meta name="twitter:site" content="@DigitalOcean"/><meta name="twitter:creator" content="@DigitalOcean"/><link rel="preload" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/lobster-roll-host/assets/sentry.673b95ac984cb71c89eabf90df057f49eee898a8d585abf28ef86384d00c26fc.js" as="script"><link rel="prefetch" crossorigin="anonymous" href="https://ui-cdn.digitalocean-ui.com/federation/lobster-roll-host/assets/main.016a3d02d9b27462e972dc9d00664fdec9f3953040b60eb0863eee1a60636a52.js" as="script"><script>try{let e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},t=(new e.Error).stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="c458c572-7b63-4080-b141-7cd8a42fe430",e._sentryDebugIdIdentifier="sentry-dbid-c458c572-7b63-4080-b141-7cd8a42fe430")}catch(e){}{let e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{};e._sentryModuleMetadata=e._sentryModuleMetadata||{},e._sentryModuleMetadata[(new e.Error).stack]=Object.assign({},e._sentryModuleMetadata[(new e.Error).stack],{"_sentryBundlerPluginAppKey:lobster-roll":!0,dsn:"https://c269b31502512cd4929fd58446e6dd47@o1109393.ingest.us.sentry.io/4508853294006272",name:"lobster-roll-host"})}(()=>{"use strict";var e,t,r,s,n={"./src/client/runtime.ts":(e,t,r)=>{var s,n,o,a,i,c,d,l,u,h=function(e,t,r,s){if("a"===r&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?s:"a"===r?s.call(e):s?s.value:t.get(e)},f=function(e,t,r,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,r):n?n.value=r:t.set(e,r),r};class p{constructor(){s.set(this,new WeakMap)}getOrCompute(e,t,r){let n=h(this,s,"f").get(t);n||(n=new WeakMap,h(this,s,"f").set(t,n));let o=n.get(e);return o||(o=r(e,t.data),n.set(e,o)),o}}s=new WeakMap;class m{constructor(){n.add(this),o.set(this,void 0),a.set(this,[]),i.set(this,new p),c.set(this,new Set),l.set(this,(()=>{let e,t;const r=new Promise(((r,s)=>{e=e=>{n.resolution={status:"resolved",data:e},r(e),h(this,u,"f").call(this)},t=e=>{n.resolution={status:"rejected",data:e},s(e),h(this,u,"f").call(this)}}));r.catch(console.error);const s=()=>{const e=()=>{switch(n.resolution.status){case"pending":case"resolved":return n.resolution.data;case"rejected":throw n.resolution.data}},t=r.then(e,e);return t.catch(console.error),t},n={get promise(){return s()},resolve:e,reject:t,resolution:{status:"pending",get data(){return s()}}};return n})),u.set(this,(()=>{for(const e of h(this,c,"f"))e()})),f(this,o,h(this,l,"f").call(this),"f")}subscribe(e){return h(this,c,"f").add(e),()=>h(this,c,"f").delete(e)}resolve(e,t={}){const{force:r=!1}=t,s=h(this,o,"f");("pending"===s.resolution.status||r)&&s.resolve(e)}reject(e,t={}){const{force:r=!1}=t,s=h(this,o,"f");("pending"===s.resolution.status||r)&&s.reject(e)}use(e={}){const t=this.toResolution(e);if("resolved"!==t.status)throw t.data;return t.data}addLayer(e){const t=h(this,l,"f").call(this),r={state:t,key:e.key,merge:e.merge,priority:e.priority},s=e.loader();s instanceof Promise?s.then((e=>t.resolve(e))).catch((e=>{const r=e instanceof Error?e:new Error(String(e));t.reject(r)})):t.resolve(s);let n=[...h(this,a,"f")];return n.find((e=>e.key===r.key))?n=n.map((e=>e.key===r.key?r:e)):n.push(r),f(this,a,n.sort(((e,t)=>e.priority-t.priority)),"f"),!1!==e.notify&&h(this,u,"f").call(this),this.toPromise()}toResolution(e={}){const{excludeLayers:t=[]}=e,r=h(this,o,"f");if("rejected"===r.resolution.status)return r.resolution;if("pending"===r.resolution.status)return{status:"pending",data:this.toPromise()};let s=r.resolution.data;const n=h(this,a,"f").filter((e=>!t.includes(e.key)));for(const e of n){if("rejected"===e.state.resolution.status)return e.state.resolution;if("pending"===e.state.resolution.status)return{status:"pending",data:this.toPromise()};s=h(this,i,"f").getOrCompute(s,e.state.resolution,e.merge)}return{status:"resolved",data:s}}toPromise(e={}){const{excludeLayers:t=[]}=e,r=h(this,o,"f"),s=h(this,a,"f").filter((e=>!t.includes(e.key))),c=r.promise.then((async e=>{for(const t of s){const r=await h(this,n,"m",d).call(this,t);e=h(this,i,"f").getOrCompute(e,r,t.merge)}return e}));return c.catch(console.error),c}debug(e){const t={pending:"darkorange",resolved:"seagreen",rejected:"crimson"};function r(e,r){"pending"!==r.status?(console.group(`%c${e} (${r.status})`,`color:${t[r.status]}`),console.group("data"),console.log(JSON.stringify(r.data,null,2)),console.groupEnd(),console.groupEnd()):console.log(`%c${e} (${r.status})`,`color:${t[r.status]}`)}r(e,h(this,o,"f").resolution),console.group("layers");for(const e of h(this,a,"f"))r(e.key,e.state.resolution);console.groupEnd()}}o=new WeakMap,a=new WeakMap,i=new WeakMap,c=new WeakMap,l=new WeakMap,u=new WeakMap,n=new WeakSet,d=async function e(t){const r=t.state.resolution;switch(r.status){case"pending":return t.state.promise.then((()=>h(this,n,"m",e).call(this,t)),(()=>h(this,n,"m",e).call(this,t)));case"rejected":throw r.data;case"resolved":return r}};var b,g,w,y,_=function(e,t,r,s){if("a"===r&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?s:"a"===r?s.call(e):s?s.value:t.get(e)};class v{constructor(){b.add(this),g.set(this,new Map)}static parallel(e,t){const r=[],s=[];for(const n of e)try{r.push(t(n))}catch(e){if(!(e instanceof Promise))throw e;s.push(e)}if(s.length>0)throw Promise.allSettled(s);return r}init(e){_(this,g,"f").has(e)||_(this,g,"f").set(e,new m)}get(e,t={}){return!_(this,g,"f").has(e)&&t.loader&&(this.init(e),t.loader().then((t=>this.resolve(e,t))).catch((t=>{const r=t instanceof Error?t:new Error(String(t));this.reject(e,r)}))),_(this,b,"m",w).call(this,e).toPromise({excludeLayers:t.excludeLayers})}use(e,t={}){return!_(this,g,"f").has(e)&&t.loader&&(this.init(e),t.loader().then((t=>this.resolve(e,t))).catch((t=>{const r=t instanceof Error?t:new Error(String(t));this.reject(e,r)}))),_(this,b,"m",w).call(this,e).use({excludeLayers:t.excludeLayers})}subscribe(e,t){return _(this,b,"m",y).call(this,e).subscribe(t)}resolve(e,t,r={}){_(this,g,"f").has(e)||_(this,g,"f").set(e,new m),_(this,b,"m",w).call(this,e).resolve(t,r)}reject(e,t,r={}){_(this,g,"f").has(e)||_(this,g,"f").set(e,new m),_(this,b,"m",w).call(this,e).reject(t,r)}layer(e,t){return _(this,b,"m",y).call(this,e).addLayer(t)}reset(){_(this,g,"f").clear()}entries(){return[..._(this,g,"f").entries()].map((([e,t])=>[e,t]))}async*asyncEntries(){for(const e of _(this,g,"f").keys()){const t=await this.get(e);yield[e,t]}}}function j(e){return"[object Object]"===Object.prototype.toString.call(e)}g=new WeakMap,b=new WeakSet,w=function(e){try{return _(this,b,"m",y).call(this,e)}catch{const t=new m;return t.reject(new Error(`Key "${String(e)}" not found`)),t}},y=function(e){const t=_(this,g,"f").get(e);if(!t)throw new Error(`Key "${String(e)}" not found`);return t};const x="[Lobster Roll]";function E(e){console.warn(x,e)}function k(e){return Promise.reject(S(e))}function S(e){return new Error(`${x} ${e}`)}function $(e){return j(e)&&"string"==typeof e.id&&"string"==typeof e.remoteEntryUrl}function O(e){var t,r,s;return(t=e.current).dependencies??(t.dependencies={}),(r=e.current).flippers??(r.flippers={}),void 0===e.next?e.next=e.current:$(e.next)||(E(`Ignoring invalid data: next version must be a valid version but received "${JSON.stringify(e.next)}"`),e.next=e.current),j(s=e.rollout)&&"number"==typeof s.percentage?e.rollout.percentage<0?e.rollout.percentage=0:e.rollout.percentage>100&&(e.rollout.percentage=100):e.rollout={percentage:0},e}var P,M,T,R,W,C,L,N,B,U=function(e,t,r,s){if("a"===r&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?s:"a"===r?s.call(e):s?s.value:t.get(e)};const I="__LR__thresholds",z="__LR__overrides",D=/^dev:(?<port>\d+)$/,J=/^\d+\.\d+\.\d+/,F=/0\.0\.0-pre-/;function A(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")}class V{constructor(e){P.add(this),M.set(this,new v),this.captureException=e.captureException}register(e,t){if("string"!=typeof e)return E(`Failed to register library: name must be a string but received "${e}"`),!1;if(!j(r=t)||!$(r.current))return E(`Failed to register library: manifest must be a valid manifest but received "${JSON.stringify(t)}`),!1;var r;const s=O(t);return U(this,P,"m",C).call(this,e,{manifest:Promise.resolve(s)}),!0}async load(e){return"string"!=typeof e?k(`Failed to load library: name must be a string but received "${e}"`):A(e)!==e?k(`Failed to load library: name must not contain any HTML but received "${e}"`):(await U(this,P,"m",C).call(this,e)).remoteEntry}async getCache(){const e={};for await(const[t,r]of U(this,M,"f").asyncEntries())e[t]=r;return e}async debug(){const e=await this.getCache(),t=Object.entries(e).map((([e,t])=>[e,{activeVersion:t.version.id,currentVersion:t.manifest.current.id,nextVersion:t.manifest.next.id,rollout:t.manifest.rollout.percentage,threshold:t.threshold}]));console.table(Object.fromEntries(t))}use(e){return U(this,M,"f").use(e,{loader:()=>U(this,P,"m",L).call(this,e)})}applyOverrides(){const e=function(e){const t={};for(const r in e){const s=e[r];"string"==typeof s&&(t[A(r)]=A(s))}return t}({...U(this,P,"m",T).call(this),...this.fetchGlobalOverrides()});U(this,P,"m",R).call(this,e);let t={};for(const r in e){const s=e[r];if("clear"===s){delete e[r],U(this,P,"m",R).call(this,e);continue}if("current"===s){t[r]={type:"threshold",value:s},U(this,P,"m",C).call(this,r,{threshold:Promise.resolve(101)});continue}if("next"===s){t[r]={type:"threshold",value:s},U(this,P,"m",C).call(this,r,{threshold:Promise.resolve(0)});continue}const n=s.match(D);if(n){const{port:e}=n.groups;if(!e)continue;const s=this.fetchLocalDevManifest(r,e).then(O);t[r]={type:"dev",value:`dev:${e}`},U(this,P,"m",C).call(this,r,{manifest:s})}else if(J.test(s)){const e=F.test(s)?"preview":"version",n=this.fetchRemoteManifestByVersion(r,s).then(O);t[r]={type:e,value:s},U(this,P,"m",C).call(this,r,{manifest:n})}}return this.displayOverrides(t),{hasOverrides:Object.keys(t).length>0}}freeze(){return{load:this.load.bind(this),register:this.register.bind(this),getCache:this.getCache.bind(this),use:this.use.bind(this)}}}M=new WeakMap,P=new WeakSet,T=function(){try{const e=this.sessionStorage.getItem(z)??"{}",t=JSON.parse(e);if(!j(t))return this.sessionStorage.setItem(z,"{}"),{};for(const e in t)"string"==typeof t[e]||delete t[e];return t}catch{try{this.sessionStorage.setItem(z,"{}")}catch{}return{}}},R=function(e){try{this.sessionStorage.setItem(z,JSON.stringify(e))}catch{}},W=function e(t,r,s=this.localStorage){var n,o;try{const a=s.getItem(I)??"{}",i=JSON.parse(a);if(!j(i))return s.setItem(I,"{}"),U(this,P,"m",e).call(this,t,r,s);for(const e in i){const t=i[e];if(j(t))for(const r in t){const s=t[r];j(o=s)&&"number"==typeof o.value&&"number"==typeof o.expires&&!isNaN(o.value)&&!isNaN(o.expires)&&o.value<=100&&o.value>=1&&!this.thresholdIsExpired(s)||delete i[e][r]}else delete i[e]}return i[t]??(i[t]={}),(n=i[t])[r]??(n[r]=this.createRandomThreshold()),s.setItem(I,JSON.stringify(i)),i[t][r].value}catch{try{s.setItem(I,"{}")}catch{}return s===this.sessionStorage?101:U(this,P,"m",e).call(this,t,r,this.sessionStorage)}},C=function(e,t={}){return U(this,M,"f").get(e,{loader:()=>U(this,P,"m",L).call(this,e,t)})},L=async function(e,t={}){let r,s,n,o;return r=t.manifest?await t.manifest:await U(this,P,"m",N).call(this,e),s=t.threshold?await t.threshold:U(this,P,"m",W).call(this,e,r.current.id),n=t.version?await t.version:s>r.rollout.percentage?r.current:r.next,o=t.remoteEntry?await t.remoteEntry:await U(this,P,"m",B).call(this,e,n.remoteEntryUrl),{manifest:r,threshold:s,version:n,remoteEntry:o}},N=function(e){const t=Math.floor(Date.now()/12e4).toString(36);return this.fetchCurrentRemoteManifest(e).catch((async()=>(await this.captureException(new Error("Failed to fetch manifest.json"),"warning",{name:e}),this.fetchCurrentRemoteManifest(e,t)))).catch((async()=>(await this.captureException(new Error("Failed to fetch manifest.json"),"error",{name:e,param:t}),this.fallbackManifest(e,t)))).then(O)},B=function(e,t){const r=new URL(t),s=t=>async()=>(await this.captureException(new Error("Failed to fetch remoteEntry.js"),(e=>{switch(e){case 1:return"warning";case 2:case 3:return"error";default:return"fatal"}})(t),{name:e,remoteEntryUrl:r.toString()}),r.searchParams.set("retry",String(t)),this.fetchRemoteEntry(e,r.toString()));return this.fetchRemoteEntry(e,r.toString()).catch(s(1)).catch(s(2)).catch(s(3)).then((t=>{return j(s=t)&&"function"==typeof s.get&&"function"==typeof s.init?t:(this.captureException(new Error("Invalid remote entry received"),"fatal",{name:e,remoteEntryUrl:r.toString(),response:t}),k(`Failed to load remote entry for "${e}": remote entry must be a valid WebpackRemoteEntry but received "${JSON.stringify(t)}"`));var s}))};class G extends V{constructor(e){super(e),this.sessionStorage=sessionStorage,this.localStorage=localStorage,this.localhostUrl=e.localhostUrl,this.productionUrl=e.productionUrl}fetchGlobalOverrides(){const e=new URLSearchParams(window.location.search),t={};for(const[r,s]of e)r.endsWith("-version")&&(t[r.replace("-version","")]=s);return t}createRandomThreshold(){return{value:Math.ceil(100*Math.random()),expires:Date.now()+6048e5}}thresholdIsExpired(e){return e.expires<Date.now()}fetchLocalDevManifest(e,t){const r=`${this.localhostUrl}:${t}/versions/dev/manifest.json`;return fetch(r).then((e=>e.json())).then((e=>({current:e})))}fetchRemoteManifestByVersion(e,t){let r=`${this.productionUrl}/${e}/versions/${t}/manifest.json`;return fetch(r).then((e=>e.json())).then((e=>({current:e})))}async fetchCurrentRemoteManifest(e,t){let r=`${this.productionUrl}/${e}/runtime/manifest.json`;return t&&(r+=`?${t}`),fetch(r).then((e=>e.json()))}fetchRemoteEntry(e,t){const r=`__LR__${e}`;return new Promise(((s,n)=>{const o=document.createElement("script");o.src=t,o.async=!0,this.productionUrl!==window.location.origin&&(o.crossOrigin="anonymous"),o.onload=()=>{const e=window[r];s(e)},o.onerror=()=>{document.head.removeChild(o);let r=`Failed to load module "${e}" from "${t}"`;t.startsWith(this.localhostUrl)&&(r+="\n\nDid you forget to start your development server?"),n(new Error(r))},document.head.appendChild(o)}))}fallbackManifest(e,t){return{current:{id:"fallback",remoteEntryUrl:`${this.productionUrl}/${e}/fallback/remoteEntry.js?${t}`,dependencies:{},flippers:{}}}}displayOverrides(e){const t=new URL(window.location.href);for(const[e,r]of t.searchParams)e.endsWith("-version")&&"clear"===r&&t.searchParams.delete(e);window.history.replaceState({},"",t.toString()),0!==Object.keys(e).length&&r.e("lobster-roll-runtime_build_browser-overrides_js").then(r.bind(r,"../lobster-roll-runtime/build/browser-overrides.js")).then((t=>t.displayBrowserOverrides(e)))}}class q extends v{debug(){for(const[e,t]of this.entries())t.debug(e)}freeze(){return Object.freeze({init:this.init.bind(this),get:this.get.bind(this),subscribe:this.subscribe.bind(this),use:this.use.bind(this),resolve:this.resolve.bind(this),reject:this.reject.bind(this),layer:this.layer.bind(this)})}}class H{constructor(e,t,r){this.dependencyStore=e,this.dataBridge=t,this.messageBus=r}async debug(){console.clear(),console.group("%c🦞 lobster-roll debug 🦞","font-weight: bold; font-size: 20px; color: tomato; background: white; padding: 5px 10px; border-radius: 1px;"),console.log('%cRuntime version: "d2d34ee3eac053faa635de556dbaea6fc4dbe921"',"margin-left: 4px; font-weight: bold; color: white; background: crimson; padding: 5px 10px; border-radius: 1px;"),console.log('%cRuntime environment: "production"',"margin-left: 4px; font-weight: bold; color: white; background: goldenrod; padding: 5px 10px; border-radius: 1px;"),console.groupCollapsed("%cDependencies","font-weight: bold; color: white; background: seagreen; padding: 5px 10px; border-radius: 1px;"),await this.dependencyStore.debug(),console.groupEnd(),console.groupCollapsed("%cData Bridge","font-weight: bold; color: white; background: darkorange; padding: 5px 10px; border-radius: 1px;"),await this.dataBridge.debug(),console.groupEnd(),console.groupCollapsed("%cEvents","font-weight: bold; color: white; background: royalblue; padding: 5px 10px; border-radius: 1px;"),await this.messageBus.debug(),console.groupEnd()}freeze(){return this.debug.bind(this)}}const K=/(?<name>[a-zA-Z0-9-]+)-version/;var Y,Z,Q,X,ee,te,re,se,ne,oe=function(e,t,r,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,r):n?n.value=r:t.set(e,r),r},ae=function(e,t,r,s){if("a"===r&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?s:"a"===r?s.call(e):s?s.value:t.get(e)};let ie=1;class ce{constructor(e){Y.add(this),Z.set(this,new Map),Q.set(this,[]),X.set(this,!1),ee.set(this,void 0),oe(this,ee,e.captureException,"f")}bind(e){if(ae(this,Z,"f").has(e))throw new Error(`Event bus key "${e}" is already bound.`);const t={key:e,processedEvents:[],subscribers:new Set};return ae(this,Z,"f").set(e,t),{emit:e=>ae(this,Y,"m",te).call(this,t,e),subscribe:e=>ae(this,Y,"m",re).call(this,t,e),events:()=>ae(this,Y,"m",se).call(this,t)}}async events(){const e=[];for(const t of ae(this,Z,"f").values()){const r=ae(this,Y,"m",se).call(this,t).then((e=>[t.key,e]));e.push(r)}const t=await Promise.all(e);return Object.fromEntries(t)}async debug(){let e=!1;for(const t of ae(this,Z,"f").values()){e=!0,console.groupCollapsed(t.key);for(const e of t.processedEvents.slice().reverse())console.log(JSON.stringify(e));console.groupEnd()}e||console.log("No events emitted yet.")}reset(){for(const e of ae(this,Z,"f").values())e.processedEvents=[],e.subscribers.clear();oe(this,Q,[],"f"),oe(this,X,!1,"f"),ie=1}freeze(){return Object.freeze({bind:this.bind.bind(this)})}}Z=new WeakMap,Q=new WeakMap,X=new WeakMap,ee=new WeakMap,Y=new WeakSet,te=function(e,t){const r=(e=>Object.freeze({id:ie++,timestamp:Date.now(),data:e}))(t);let s=()=>{};const n=new Promise((e=>{s=e})),o={binding:e,event:r,promise:n,completed:()=>(e.processedEvents.push(r),e.processedEvents.length>100&&e.processedEvents.shift(),o.completed=()=>{},s())};return ae(this,Q,"f").push(o),ae(this,X,"f")||(oe(this,X,!0,"f"),ae(this,Y,"m",ne).call(this)),n},re=function(e,t){return e.subscribers.add(t),()=>e.subscribers.delete(t)},se=function(e){const t=ae(this,Q,"f").filter((t=>t.binding===e)).map((e=>e.promise));return Promise.all(t).then((()=>e.processedEvents.map((e=>e.data))))},ne=function(){for(oe(this,X,!1,"f");ae(this,Q,"f").length>0;){const e=ae(this,Q,"f").shift();if(!e)break;const{binding:t,event:r,completed:s}=e;for(const e of t.subscribers){const s=ie;let n;try{n=e(r.data)}catch(e){const s=e instanceof Error?e:new Error(String(e));ae(this,ee,"f").call(this,s,"error",{event:t.key,data:r.data}),E(`Event bus subscriber for "${t.key}" threw an error: ${e}`)}if(n instanceof Promise){const e=`Event bus subscriber for "${t.key}" is an async function. This should be avoided as it can lead to uncaught errors.`;ae(this,ee,"f").call(this,S(e),"warning",{event:t.key,data:r.data}),E(e)}if(s!==ie){const e=`Event bus subscriber for "${t.key}" emitted an event. This should be avoided as it can lead to an infinite loop.`;ae(this,ee,"f").call(this,S(e),"warning",{event:t.key,data:r.data}),E(e)}}s()}};class de extends Error{constructor(e,t,r={}){super(`[${t}] ${e}`),this.code=t,this.extra=r}}var le,ue,he=function(e,t,r,s){if("a"===r&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?s:"a"===r?s.call(e):s?s.value:t.get(e)};const fe="performance.getEntriesByType('navigation').map(e => e.responseStart)[0] || 0";class pe{constructor(e){le.set(this,void 0),ue.set(this,[]),function(e,t,r,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");"a"===s?n.call(e,r):n?n.value=r:t.set(e,r)}(this,le,e,"f")}push(e,t,r={}){const{timeout:s=5e3}=r,n=performance.now();let o;const a=new Promise(((t,r)=>{o=setTimeout((()=>{const t=new de(`Data bridge wait for "${e}" timed out after ${s}ms`,"data-bridge-timeout",{name:e});return pe.errorReporter(t),r(t)}),s)})),i=Promise.resolve(t()).catch((t=>{const r=new de(`Data bridge for "${e}" failed: ${t}`,"data-bridge-rejected",{name:e});return pe.errorReporter(r),Promise.reject(r)})).finally((()=>{clearTimeout(o)}));he(this,le,"f").call(this,["<script>",`window.__LR__.dataBridge.init(${JSON.stringify(e)});`,`performance.mark("data-bridge-init-${e}", {}, ${fe});`,"<\/script>"].join(""));const c=Promise.race([a,i]).then((t=>he(this,le,"f").call(this,["<script>",`window.__LR__.dataBridge.resolve(${JSON.stringify(e)}, ${JSON.stringify(t)});`,`performance.mark("data-bridge-complete-${e}", {}, ${fe} + ${performance.now()-n});`,`performance.measure("data-bridge-time-${e}", "data-bridge-init-${e}", "data-bridge-complete-${e}");`,"<\/script>"].join(""))),(t=>he(this,le,"f").call(this,["<script>",`window.__LR__.dataBridge.reject(${JSON.stringify(e)}, new Error(${JSON.stringify(t.message)}));`,`performance.mark("data-bridge-complete-${e}", {}, ${fe} + ${performance.now()-n});`,`performance.measure("data-bridge-time-${e}", "data-bridge-init-${e}", "data-bridge-complete-${e}");`,"<\/script>"].join(""))));he(this,ue,"f").push(c)}allSettled(){return Promise.allSettled(he(this,ue,"f"))}}le=new WeakMap,ue=new WeakMap,pe.errorReporter=()=>{};const me=atob("aHR0cHM6Ly9sb2NhbGRldi5pbnRlcm5hbC5kaWdpdGFsb2NlYW4uY29t"),be=new class{constructor(e){this.dependencyStore=new G(e),this.dataBridge=new q,this.messageBus=new ce({captureException:e.captureException}),this.debugger=new H(this.dependencyStore,this.dataBridge,this.messageBus)}applyOverrides(){return this.dependencyStore.applyOverrides()}freeze(e=(e=>{const t=new URL(e),{hostname:r,searchParams:s}=t;for(const e of s.keys())if(K.test(e))return"development";return r.startsWith("localhost")||r.startsWith("localdev.")?"development":r.startsWith("cloud.s2r1.")||r.startsWith("devcloud-amd.")?"staging":r.startsWith("cloud.")||r.startsWith("devcloud.amd.")?"production":"unknown"})(window.location.href)){return Object.freeze({environment:e,dependencies:this.dependencyStore.freeze(),dataBridge:this.dataBridge.freeze(),messageBus:this.messageBus.freeze(),debug:this.debugger.freeze()})}}({localhostUrl:me,productionUrl:"https://ui-cdn.digitalocean-ui.com/federation",async captureException(e,t,s={}){await r.e("src_client_sentry_bootstrap_ts").then(r.bind(r,"./src/client/sentry.bootstrap.ts")).then((r=>{r.captureException(e,{level:t,extra:s,contexts:{microfrontend:{dsn:"https://cb89305d5f41879d4bd42578af7aa2fe@o1109393.ingest.us.sentry.io/4508082240684032",release:"d2d34ee3eac053faa635de556dbaea6fc4dbe921"}}})}))}}),{hasOverrides:ge}=be.applyOverrides(),we=ge?"development":void 0;window.__LR__=be.freeze(we)}},o={};function a(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}};return n[e](r,r.exports,a),r.exports}a.m=n,a.c=o,a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,r)=>(a.f[r](e,t),t)),[])),a.u=e=>"assets/"+e+"."+{"vendors-node_modules_sentry_react_build_esm_index_js":"209cfa4786a99ce31f065882ae842bffc227213cede4aaeb414ff52f05918f7a","vendors-node_modules_react-dom_index_js":"1eafa809654b724f4eb088a70465bb37a5e3955391e2acae8b97f1a2748dcbed","vendors-node_modules_history_index_js":"16996fb4d95792f09ea6635f89147f21120995539aa89013c04b274e4362e0d5","node_modules_react-router-dom_index_js":"b9ff97789f98c900e264709b6833f9a6a8668fe52ba9eddb39b08d13af63e5ac","vendors-node_modules_react-router_index_js":"eb3fd65213ffc2034496e9cf65393c03b88cf49280d750088b675c6c8f8c8edd","node_modules_react_jsx-runtime_js":"79b28fcaf33574195aaf7646a20997311cb483adfb05e37fb186027237d0622e","node_modules_react_index_js-_8af10":"c786dbf1743366f584640ece39983fafafa85bbd4094e71a0297c982166f654a",src_client_sentry_bootstrap_ts:"37bdda2dfe7ce6be6f042083283b354247d0d3cc86094d867cc0630fcd3439a3","lobster-roll-runtime_build_browser-overrides_js":"47492ced31c09d97d445270ecc3a474c87dd366bcbd354c2d187718a57102261","node_modules_react_index_js-_8af11":"574f875065582e9cd1916c296921fd7f02c5b3eef76e9a9113c8893600f69d96"}[e]+".js",a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="@do/lobster-roll-host:",a.l=(r,s,n,o)=>{if(e[r])e[r].push(s);else{var i,c;if(void 0!==n)for(var d=document.getElementsByTagName("script"),l=0;l<d.length;l++){var u=d[l];if(u.getAttribute("src")==r||u.getAttribute("data-webpack")==t+n){i=u;break}}i||(c=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,a.nc&&i.setAttribute("nonce",a.nc),i.setAttribute("data-webpack",t+n),i.src=r,0!==i.src.indexOf(window.location.origin+"/")&&(i.crossOrigin="anonymous")),e[r]=[s];var h=(t,s)=>{i.onerror=i.onload=null,clearTimeout(f);var n=e[r];if(delete e[r],i.parentNode&&i.parentNode.removeChild(i),n&&n.forEach((e=>e(s))),t)return t(s)},f=setTimeout(h.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=h.bind(null,i.onerror),i.onload=h.bind(null,i.onload),c&&document.head.appendChild(i)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r={},s={},a.f.remotes=(e,t)=>{a.o(r,e)&&r[e].forEach((e=>{var r=a.R;r||(r=[]);var n=s[e];if(!(r.indexOf(n)>=0)){if(r.push(n),n.p)return t.push(n.p);var o=t=>{t||(t=new Error("Container missing")),"string"==typeof t.message&&(t.message+='\nwhile loading "'+n[1]+'" from '+n[2]),a.m[e]=()=>{throw t},n.p=0},i=(e,r,s,a,i,c)=>{try{var d=e(r,s);if(!d||!d.then)return i(d,a,c);var l=d.then((e=>i(e,a)),o);if(!c)return l;t.push(n.p=l)}catch(e){o(e)}},c=(e,t,s)=>i(t.get,n[1],r,0,d,s),d=t=>{n.p=1,a.m[e]=e=>{e.exports=t()}};i(a,n[2],0,0,((e,t,r)=>e?i(a.I,n[0],0,e,c,r):o()),1)}}))},(()=>{a.S={};var e={},t={};a.I=(r,s)=>{s||(s=[]);var n=t[r];if(n||(n=t[r]={}),!(s.indexOf(n)>=0)){if(s.push(n),e[r])return e[r];a.o(a.S,r)||(a.S[r]={});var o=a.S[r],i="@do/lobster-roll-host",c=(e,t,r,s)=>{var n=o[e]=o[e]||{},a=n[t];(!a||!a.loaded&&(!s!=!a.eager?s:i>a.from))&&(n[t]={get:r,from:i,eager:!!s})},d=[];return"default"===r&&(c("@sentry/react","0",(()=>Promise.all([a.e("vendors-node_modules_sentry_react_build_esm_index_js"),a.e("webpack_sharing_consume_default_react_react-_67f7")]).then((()=>()=>a("./node_modules/@sentry/react/build/esm/index.js"))))),c("react-dom","17.0.2",(()=>Promise.all([a.e("vendors-node_modules_react-dom_index_js"),a.e("webpack_sharing_consume_default_react_react-_d91f")]).then((()=>()=>a("./node_modules/react-dom/index.js"))))),c("react-router-dom","6.2.2",(()=>Promise.all([a.e("vendors-node_modules_history_index_js"),a.e("webpack_sharing_consume_default_react_react-_fd84"),a.e("node_modules_react-router-dom_index_js")]).then((()=>()=>a("./node_modules/react-router-dom/index.js"))))),c("react-router","6.2.2",(()=>Promise.all([a.e("vendors-node_modules_react-router_index_js"),a.e("vendors-node_modules_history_index_js"),a.e("webpack_sharing_consume_default_react_react-_fd84")]).then((()=>()=>a("./node_modules/react-router/index.js"))))),c("react/jsx-runtime","17.0.2",(()=>a.e("node_modules_react_jsx-runtime_js").then((()=>()=>a("./node_modules/react/jsx-runtime.js"))))),c("react","17.0.2",(()=>a.e("node_modules_react_index_js-_8af10").then((()=>()=>a("./node_modules/react/index.js")))))),e[r]=d.length?Promise.all(d).then((()=>e[r]=1)):1}}})(),a.p="https://ui-cdn.digitalocean-ui.com/federation/lobster-roll-host/",(()=>{var e=e=>{var t=e=>e.split(".").map((e=>+e==e?+e:e)),r=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),s=r[1]?t(r[1]):[];return r[2]&&(s.length++,s.push.apply(s,t(r[2]))),r[3]&&(s.push([]),s.push.apply(s,t(r[3]))),s},t=e=>{var r=e[0],s="";if(1===e.length)return"*";if(r+.5){s+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var n=1,o=1;o<e.length;o++)n--,s+="u"==(typeof(i=e[o]))[0]?"-":(n>0?".":"")+(n=2,i);return s}var a=[];for(o=1;o<e.length;o++){var i=e[o];a.push(0===i?"not("+c()+")":1===i?"("+c()+" || "+c()+")":2===i?a.pop()+" "+a.pop():t(i))}return c();function c(){return a.pop().replace(/^\((.+)\)$/,"$1")}},r=(t,s)=>{if(0 in t){s=e(s);var n=t[0],o=n<0;o&&(n=-n-1);for(var a=0,i=1,c=!0;;i++,a++){var d,l,u=i<t.length?(typeof t[i])[0]:"";if(a>=s.length||"o"==(l=(typeof(d=s[a]))[0]))return!c||("u"==u?i>n&&!o:""==u!=o);if("u"==l){if(!c||"u"!=u)return!1}else if(c)if(u==l)if(i<=n){if(d!=t[i])return!1}else{if(o?d>t[i]:d<t[i])return!1;d!=t[i]&&(c=!1)}else if("s"!=u&&"n"!=u){if(o||i<=n)return!1;c=!1,i--}else{if(i<=n||l<u!=o)return!1;c=!1}else"s"!=u&&"n"!=u&&(c=!1,i--)}}var h=[],f=h.pop.bind(h);for(a=1;a<t.length;a++){var p=t[a];h.push(1==p?f()|f():2==p?f()&f():p?r(p,s):!f())}return!!f()},s=(e,t)=>e&&a.o(e,t),n=e=>(e.loaded=1,e.get()),o=(t,r,s)=>{var n=s?(e=>Object.keys(e).reduce(((t,r)=>(e[r].eager&&(t[r]=e[r]),t)),{}))(t[r]):t[r];return Object.keys(n).reduce(((t,r)=>!t||!n[t].loaded&&((t,r)=>{t=e(t),r=e(r);for(var s=0;;){if(s>=t.length)return s<r.length&&"u"!=(typeof r[s])[0];var n=t[s],o=(typeof n)[0];if(s>=r.length)return"u"==o;var a=r[s],i=(typeof a)[0];if(o!=i)return"o"==o&&"n"==i||"s"==i||"u"==o;if("o"!=o&&"u"!=o&&n!=a)return n<a;s++}})(t,r)?r:t),0)},i=e=>function(t,r,s,n,o){var i=a.I(t);return i&&i.then&&!s?i.then(e.bind(e,t,a.S[t],r,!1,n,o)):e(t,a.S[t],r,s,n,o)},c=(e,t,r)=>r?r():((e,t)=>(e=>{throw new Error(e)})("Shared module "+t+" doesn't exist in shared scope "+e))(e,t),d=i(((e,t,r,a,i)=>{if(!s(t,r))return c(e,r,i);var d=o(t,r,a);return n(t[r][d])})),l=i(((e,a,i,d,l,u)=>{if(!s(a,i))return c(e,i,u);var h,f=o(a,i,d);return r(l,f)||(h=((e,r,s,n)=>"Unsatisfied version "+s+" from "+(s&&e[r][s].from)+" of shared singleton module "+r+" (required "+t(n)+")")(a,i,f,l),"undefined"!=typeof console&&console.warn&&console.warn(h)),n(a[i][f])})),u={},h={"webpack/sharing/consume/default/react/react?67f7":()=>l("default","react",!1,[,[1,19],[1,18],[1,17],[1,16,14,0],1,1,1],(()=>a.e("node_modules_react_index_js-_8af10").then((()=>()=>a("./node_modules/react/index.js"))))),"webpack/sharing/consume/default/react/react?d91f":()=>l("default","react",!1,[4,17,0,2],(()=>a.e("node_modules_react_index_js-_8af11").then((()=>()=>a("./node_modules/react/index.js"))))),"webpack/sharing/consume/default/react/react?fd84":()=>l("default","react",!1,[0,16,8],(()=>a.e("node_modules_react_index_js-_8af10").then((()=>()=>a("./node_modules/react/index.js"))))),"webpack/sharing/consume/default/react-router/react-router":()=>l("default","react-router",!1,[4,6,2,2],(()=>a.e("vendors-node_modules_react-router_index_js").then((()=>()=>a("./node_modules/react-router/index.js"))))),"webpack/sharing/consume/default/react/react?9896":()=>d("default","react",!1,(()=>a.e("node_modules_react_index_js-_8af11").then((()=>()=>a("./node_modules/react/index.js"))))),"webpack/sharing/consume/default/@sentry/react/@sentry/react":()=>d("default","@sentry/react",!1,(()=>Promise.all([a.e("vendors-node_modules_sentry_react_build_esm_index_js"),a.e("webpack_sharing_consume_default_react_react-_67f7")]).then((()=>()=>a("./node_modules/@sentry/react/build/esm/index.js")))))},f={"webpack_sharing_consume_default_react_react-_67f7":["webpack/sharing/consume/default/react/react?67f7"],"webpack_sharing_consume_default_react_react-_d91f":["webpack/sharing/consume/default/react/react?d91f"],"webpack_sharing_consume_default_react_react-_fd84":["webpack/sharing/consume/default/react/react?fd84"],"node_modules_react-router-dom_index_js":["webpack/sharing/consume/default/react-router/react-router"],"node_modules_react_jsx-runtime_js":["webpack/sharing/consume/default/react/react?9896"],src_client_sentry_bootstrap_ts:["webpack/sharing/consume/default/@sentry/react/@sentry/react"]},p={};a.f.consumes=(e,t)=>{a.o(f,e)&&f[e].forEach((e=>{if(a.o(u,e))return t.push(u[e]);if(!p[e]){var r=t=>{u[e]=0,a.m[e]=r=>{delete a.c[e],r.exports=t()}};p[e]=!0;var s=t=>{delete u[e],a.m[e]=r=>{throw delete a.c[e],t}};try{var n=h[e]();n.then?t.push(u[e]=n.then(r).catch(s)):r(n)}catch(e){s(e)}}}))}})(),(()=>{var e={runtime:0};a.f.j=(t,r)=>{var s=a.o(e,t)?e[t]:void 0;if(0!==s)if(s)r.push(s[2]);else if(/^webpack_sharing_consume_default_react_react\-_(67f7|d91f|fd84)$/.test(t))e[t]=0;else{var n=new Promise(((r,n)=>s=e[t]=[r,n]));r.push(s[2]=n);var o=a.p+a.u(t),i=new Error;a.l(o,(r=>{if(a.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var n=r&&("load"===r.type?"missing":r.type),o=r&&r.target&&r.target.src;i.message="Loading chunk "+t+" failed.\n("+n+": "+o+")",i.name="ChunkLoadError",i.type=n,i.request=o,s[1](i)}}),"chunk-"+t,t)}};var t=(t,r)=>{var s,n,[o,i,c]=r,d=0;if(o.some((t=>0!==e[t]))){for(s in i)a.o(i,s)&&(a.m[s]=i[s]);c&&c(a)}for(t&&t(r);d<o.length;d++)n=o[d],a.o(e,n)&&e[n]&&e[n][0](),e[n]=0},r=self.webpackChunk_do_lobster_roll_host=self.webpackChunk_do_lobster_roll_host||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),a("./src/client/runtime.ts")})();</script><script crossorigin="anonymous" src="https://ui-cdn.digitalocean-ui.com/federation/lobster-roll-host/assets/sentry.673b95ac984cb71c89eabf90df057f49eee898a8d585abf28ef86384d00c26fc.js"></script><script src="https://assets.digitalocean.com/prism/prism.js" async></script>
<script>window.__LR__.dataBridge.init("user-context");performance.mark("data-bridge-init-user-context", {}, performance.getEntriesByType('navigation').map(e => e.responseStart)[0] || 0);</script>
<script>window.__LR__.dataBridge.init("error-context");performance.mark("data-bridge-init-error-context", {}, performance.getEntriesByType('navigation').map(e => e.responseStart)[0] || 0);</script>
<script>window.__LR__.dataBridge.init("flippers");performance.mark("data-bridge-init-flippers", {}, performance.getEntriesByType('navigation').map(e => e.responseStart)[0] || 0);</script>
<script>window.__LR__.dataBridge.init("flippersV2");performance.mark("data-bridge-init-flippersV2", {}, performance.getEntriesByType('navigation').map(e => e.responseStart)[0] || 0);</script>
<script>window.__LR__.dataBridge.init("permissions");performance.mark("data-bridge-init-permissions", {}, performance.getEntriesByType('navigation').map(e => e.responseStart)[0] || 0);</script>
<script>window.__LR__.dependencies.register("websocket", {"current":{"id":"2026.8.13-8608aff158f2f84140de273eb94edb1b7c247ece","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/websocket/versions/2026.8.13-8608aff158f2f84140de273eb94edb1b7c247ece/remoteEntry.js","dependencies":{"graphql-client":{}},"flippers":{}}});</script>
<script>window.__LR__.dependencies.register("ui-copilot", {"current":{"id":"2026.8.20-f5d710615834df390b4368a22ab00fbd7fce9c98","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/ui-copilot/versions/2026.8.20-f5d710615834df390b4368a22ab00fbd7fce9c98/remoteEntry.js","dependencies":{"current-user":{},"error-boundary":{},"flippers":{},"graphql-client":{},"message-bus":{},"walrus":{}},"flippers":{"ui_copilots_use_pdocs_v2":{}}}});</script>
<script>window.__LR__.dependencies.register("track-exp", {"current":{"id":"2026.8.18-6a9f1c97830b5b1de341ebbe88899265434b18f1","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/track-exp/versions/2026.8.18-6a9f1c97830b5b1de341ebbe88899265434b18f1/remoteEntry.js","dependencies":{"current-user":{},"flippers":{},"message-bus":{}},"flippers":{}}});</script>
<script>window.__LR__.dependencies.register("session-manager", {"current":{"id":"2026.8.18-577c7ce1e98dfa33a577a5d4d4ef5e16f70322de","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/session-manager/versions/2026.8.18-577c7ce1e98dfa33a577a5d4d4ef5e16f70322de/remoteEntry.js","dependencies":{"current-user":{}},"flippers":{}}});</script>
<script>window.__LR__.dependencies.register("flippers", {"current":{"id":"2026.6.29-6cbd3a3d3317d997fa1e89fcc9d24fc66747423f","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/flippers/versions/2026.6.29-6cbd3a3d3317d997fa1e89fcc9d24fc66747423f/remoteEntry.js","dependencies":{},"flippers":{}}});</script>
<script>window.__LR__.dependencies.register("seashell", {"current":{"id":"2026.8.20-ff4541cd405ec490ce0c41b96b27349a980c6146","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/seashell/versions/2026.8.20-ff4541cd405ec490ce0c41b96b27349a980c6146/remoteEntry.js","dependencies":{"current-user":{},"error-boundary":{},"flippers":{},"graphql-client":{},"message-bus":{},"navigation":{},"permissions":{},"session-manager":{},"track-exp":{},"ui-copilot":{},"walrus":{},"websocket":{}},"flippers":{"amd_no_paywall":{},"read_only_mode":{},"managed_nfs_global_release_ui":{},"ui_watchdeck":{},"ui_total_security":{},"bare_metal_gpu_ui":{},"spaces_ui_cold_tier":{},"ui_observability":{},"genai_intelligent_inference":{},"genai_model_studio":{},"genai_si_observability":{},"questionnaire_service_dual_read_enabled":{},"inference_hub_show_model_services_tab":{},"inference_hub_show_explore_models_tab":{},"inference_hub_show_model_finetuning_tab":{},"inference_hub_show_batch_inference":{},"ui_vectordb":{},"ui_kbaas":{},"insights_v2_private_preview":{},"show_openharness_app":{},"feedback_system_show_left_nav":{},"feedback_system_show_evaluations":{},"feedback_system_show_simulation":{},"show_signals_on_left_nav":{},"action_infra_release":{},"ui-microdroplets-v2":{},"ui_walrus_v2":{}}}});</script>
<script>window.__LR__.dependencies.register("permissions", {"current":{"id":"2026.8.12-37e39a06cd9f05e2a59a4cad9512bae202cbd78c","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/permissions/versions/2026.8.12-37e39a06cd9f05e2a59a4cad9512bae202cbd78c/remoteEntry.js","dependencies":{"current-context-urn":{}},"flippers":{}}});</script>
<script>window.__LR__.dependencies.register("current-user", {"current":{"id":"2026.8.4-549234d1d5f7f0e84476ed8399cc808ab81dd378","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/current-user/versions/2026.8.4-549234d1d5f7f0e84476ed8399cc808ab81dd378/remoteEntry.js","dependencies":{},"flippers":{}}});</script>
<script>window.__LR__.dependencies.register("navigation", {"current":{"id":"2026.8.13-1194d26b905ac67da5d6686e2224c647dd3032a6","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/navigation/versions/2026.8.13-1194d26b905ac67da5d6686e2224c647dd3032a6/remoteEntry.js","dependencies":{"current-user":{},"permissions":{}},"flippers":{}}});</script>
<script>window.__LR__.dependencies.register("current-context-urn", {"current":{"id":"2026.6.18-2863e0a2cea783089ab6d9cd7ffac6283b336c90","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/current-context-urn/versions/2026.6.18-2863e0a2cea783089ab6d9cd7ffac6283b336c90/remoteEntry.js","dependencies":{},"flippers":{}}});</script>
<script>window.__LR__.dependencies.register("graphql-client", {"current":{"id":"2026.8.18-c735118b1bd4d77cb97c0b684ec4a5bfdbf3d69b","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/graphql-client/versions/2026.8.18-c735118b1bd4d77cb97c0b684ec4a5bfdbf3d69b/remoteEntry.js","dependencies":{"current-context-urn":{},"message-bus":{}},"flippers":{}}});</script>
<script>window.__LR__.dependencies.register("walrus", {"current":{"id":"2026.8.21-326d383dba9997de583d40f62fc8e9112e6e2dec","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/walrus/versions/2026.8.21-326d383dba9997de583d40f62fc8e9112e6e2dec/remoteEntry.js","dependencies":{},"flippers":{}}});</script>
<script>window.__LR__.dependencies.register("message-bus", {"current":{"id":"2026.8.14-1ee19ac129656fd29031e204a18b2043b2233a20","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/message-bus/versions/2026.8.14-1ee19ac129656fd29031e204a18b2043b2233a20/remoteEntry.js","dependencies":{},"flippers":{}}});</script>
<script>window.__LR__.dependencies.register("error-boundary", {"current":{"id":"2026.8.14-1ee19ac129656fd29031e204a18b2043b2233a20","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/error-boundary/versions/2026.8.14-1ee19ac129656fd29031e204a18b2043b2233a20/remoteEntry.js","dependencies":{"message-bus":{},"walrus":{}},"flippers":{}}});</script>
<script>window.__LR__.dependencies.register("registration-next", {"current":{"id":"2026.8.19-64ec151fdb920a1857c4c0610f1aa37ce6f0b33a","remoteEntryUrl":"https://ui-cdn.digitalocean-ui.com/federation/registration-next/versions/2026.8.19-64ec151fdb920a1857c4c0610f1aa37ce6f0b33a/remoteEntry.js","dependencies":{"error-boundary":{},"graphql-client":{},"message-bus":{},"navigation":{},"seashell":{},"session-manager":{},"walrus":{}},"flippers":{}}});</script>
</head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script async crossorigin="anonymous" src="https://ui-cdn.digitalocean-ui.com/federation/lobster-roll-host/assets/main.016a3d02d9b27462e972dc9d00664fdec9f3953040b60eb0863eee1a60636a52.js"></script>
<script>window.__LR__.dataBridge.resolve("user-context", {"data":{"status":"unauthenticated"}});performance.mark("data-bridge-complete-user-context", {}, performance.getEntriesByType('navigation').map(e => e.responseStart)[0] || 0 + 0.28636932373046875);performance.measure("data-bridge-time-user-context", "data-bridge-init-user-context", "data-bridge-complete-user-context");</script>
<script>window.__LR__.dataBridge.resolve("error-context", {"meta":{"errorCodes":{"ErrorBoundary":"error-boundary"},"reportUrl":{"path":"/client-api/error-reports/:applicationName/:errorCode","keys":{"applicationName":":applicationName","errorCode":":errorCode"}}}});performance.mark("data-bridge-complete-error-context", {}, performance.getEntriesByType('navigation').map(e => e.responseStart)[0] || 0 + 0.2523956298828125);performance.measure("data-bridge-time-error-context", "data-bridge-init-error-context", "data-bridge-complete-error-context");</script>
<script>window.__LR__.dataBridge.resolve("flippers", {"data":{"ui_copilots_use_pdocs_v2":false,"amd_no_paywall":false,"read_only_mode":false,"managed_nfs_global_release_ui":false,"ui_watchdeck":false,"ui_total_security":false,"bare_metal_gpu_ui":false,"spaces_ui_cold_tier":false,"ui_observability":false,"genai_intelligent_inference":false,"genai_model_studio":false,"genai_si_observability":false,"questionnaire_service_dual_read_enabled":false,"inference_hub_show_model_services_tab":false,"inference_hub_show_explore_models_tab":false,"inference_hub_show_model_finetuning_tab":false,"inference_hub_show_batch_inference":false,"ui_vectordb":false,"ui_kbaas":false,"insights_v2_private_preview":false,"show_openharness_app":false,"feedback_system_show_left_nav":false,"feedback_system_show_evaluations":false,"feedback_system_show_simulation":false,"show_signals_on_left_nav":false,"action_infra_release":false,"ui-microdroplets-v2":false,"ui_walrus_v2":false},"meta":{"fetchTemplate":{"path":"/client-api/flippers/:flipperName","key":":flipperName"}}});performance.mark("data-bridge-complete-flippers", {}, performance.getEntriesByType('navigation').map(e => e.responseStart)[0] || 0 + 0.2530975341796875);performance.measure("data-bridge-time-flippers", "data-bridge-init-flippers", "data-bridge-complete-flippers");</script>
<script>window.__LR__.dataBridge.resolve("flippersV2", {"data":{"urn":{}},"meta":{"serverFlippers":["ui_copilots_use_pdocs_v2","amd_no_paywall","read_only_mode","managed_nfs_global_release_ui","ui_watchdeck","ui_total_security","bare_metal_gpu_ui","spaces_ui_cold_tier","ui_observability","genai_intelligent_inference","genai_model_studio","genai_si_observability","questionnaire_service_dual_read_enabled","inference_hub_show_model_services_tab","inference_hub_show_explore_models_tab","inference_hub_show_model_finetuning_tab","inference_hub_show_batch_inference","ui_vectordb","ui_kbaas","insights_v2_private_preview","show_openharness_app","feedback_system_show_left_nav","feedback_system_show_evaluations","feedback_system_show_simulation","show_signals_on_left_nav","action_infra_release","ui-microdroplets-v2","ui_walrus_v2"],"fetchTemplate":{"path":"/client-api/flippers/:flipperName","key":":flipperName"},"fetchAllTemplate":{"path":"/client-api/applications/:appName/flippers","key":":appName"}}});performance.mark("data-bridge-complete-flippersV2", {}, performance.getEntriesByType('navigation').map(e => e.responseStart)[0] || 0 + 0.20653533935546875);performance.measure("data-bridge-time-flippersV2", "data-bridge-init-flippersV2", "data-bridge-complete-flippersV2");</script>
<script>window.__LR__.dataBridge.resolve("permissions", {"data":{"urn":{}},"meta":{"fetchAllTemplate":{"path":"/client-api/permissions"}}});performance.mark("data-bridge-complete-permissions", {}, performance.getEntriesByType('navigation').map(e => e.responseStart)[0] || 0 + 0.2100677490234375);performance.measure("data-bridge-time-permissions", "data-bridge-init-permissions", "data-bridge-complete-permissions");</script>
<script>window.dataLayer = [{ marketoId: "production" }];
(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({ "gtm.start": new Date().getTime(), event: "gtm.js" });
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != "dataLayer" ? "&l=" + l : "";
j.async = true;
j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, "script", "dataLayer", "GTM-KHWBBT");</script></body></html>
Sitemap
Кол-во: 0
XML-карта сайта для поисковиков
?
Sitemap.xml помогает поисковику быстрее находить и индексировать страницы. Особенно важен для крупных сайтов и новых страниц, на которые ещё нет входящих ссылок.
Robots.txt не содержит ссылку на карту сайта. Рекомендуется добавить карту сайта и указать ссылку на нее в robots.txt.
Внутренние ссылки
Не найдено
Ссылки на другие страницы своего сайта
?
Внутренние ссылки распределяют ссылочный вес между страницами и помогают поисковику обходить сайт. Пустые анкоры и ссылки на запрещённые robots.txt страницы — типичные ошибки.
Внутренних ссылок на странице 0 оптимально.
Внешние ссылки
Не найдено
Ссылки на сторонние сайты
?
Исходящие внешние ссылки передают часть ссылочного веса на чужие сайты. Ссылки на авторитетные ресурсы безопасны; ссылки на мусорные сайты могут навредить репутации страницы.
Внешних ссылок на странице не найдено.
Конкуренты Готовность: 0%
Конкуренты в Яндексе
Кол-во: 0
Топ сайтов-конкурентов в Яндексе
?
Сайты, чаще всего появляющиеся в ТОПе Яндекса по запросам из семантического ядра этой страницы.
Мы не нашли у вас конкурентов в Яндексе. Сайт или очень молодой или плохо продвигается.
Конкурентов в ТОП-10 Яндекса не нашлось.
Конкуренты в Google
Кол-во: 0
Топ сайтов-конкурентов в Google
?
Сайты, чаще всего появляющиеся в ТОПе Google по запросам из семантического ядра этой страницы.
Конкуренты в Google тоже не найдены. Займитесь продвижением сайта!
Конкурентов в ТОП-10 Google не нашлось.
ЗоЗПП: права потребителей Готовность: 100%
Нарушения
Не выявлены
Признаков дистанционной продажи товаров (интернет-магазина) не обнаружено — требования ЗоЗПП о раскрытии информации продавца к сайту не применяются. Нарушений нет.
ФЗ-149: рекомендательные технологии Готовность: 100%
Нарушения
Не выявлены
Рекомендательные блоки («с этим покупают», «похожие товары» и т.п.) на сайте не обнаружены — требования ст. 10.7 ФЗ-149 к сайту не применяются. Нарушений нет.
ФЗ-38: реклама Готовность: 100%
Нарушения
Не выявлены
Рекламных тематик с обязательными оговорками (медицина, БАД, кредиты и займы, новостройки) на сайте не обнаружено. Нарушений нет.
ФЗ-436: защита детей Готовность: 100%
Нарушения
Не выявлены
Признаков информационной продукции (новости, видео, книги, игры, курсы) не обнаружено — обязательная возрастная маркировка по ФЗ-436 сайту не требуется. Нарушений нет.
Вердикт
Анализ сайта cloud.digitalocean.com, слабо оптимизирован на 38%. Для хорошей оптимизации и выхода на первые места в поиске требуется:
Исправьте ошибки оптимизации.
Исправьте ошибки индексации.
Поделитесь с друзьями: