Иван Чувашов, DBA Okko и Southbridge, разберёт жизненные кейсы с PostgreSQL, которые помогут решить ваши проблемы.
Иван Чувашов
DBA Southbridge
Ситуация с idle in transaction – приложение открыло транзакцию, отправило изменения в базу данных, а закрыть транзакцию забыло, транзакция висит.
Как решать инженеру такие ситуации? В Интернете можно найти много статей на тему: что такое idle in transaction, с чем оно связано и даже на практике посмотреть примеры реализации этой ситуации, но не получите самую главную информацию – как решать такие проблемы?
Иван Чувашов
Ведущий инженер Okko
У нас была ситуация, когда появились idle in transaction, и приложение начало тормозить – пул подключений в базе данных был забит. Они блокировали ресурсы, и нам нужно было срочно принимать какое-то решение, мы пошли самым простым путём, который напрашивается и предлагается вашему вниманию.
Первый вариант, который может быть – это выполнение команд
select pg_cancel_backend(pid) from pg_stat_activity where state = 'idle in transactions' and datname = 'название_БД';
или
select pg_terminate_backend(pid) from pg_stat_activity where state = 'idle in transactions' and datname = 'название_БД';
Отличие данных функций друг от друга можно почитать тут: https://postgrespro.ru/docs/postgresql/13/functions-admin#FUNCTIONS-ADMIN-SIGNAL-TABLE.
Иван Чувашов
Сертифицированный администратор PostgreSQL: PostgresPro, 10 уровень «Эксперт»
А может ли упасть PostgreSQL?
Когда выполняете pg_terminate_backend – это не нулевая вероятность. Допустим, у вас есть процесс, который считывает данные и вы выполняете команду pg_terminate_backend, запрос подтягивает эти же данные в оперативную память PostgreSQL. Если в результате данные стали грязными, то их нельзя считывать другим процессам. Поэтому postmaster-у нужно очистить оперативную память, что он и делает, перезагружая себя.
Точечно отстреливать запросы, можно вызвать групповую команду по маске – очевидные плюсы. Но эти команды на самом деле не решают проблему с idle in transaction. Когда ситуация возникает на стороне бэкенда и мы выполнили команду, которая группой срубила запросы, то через некоторое время ситуация может повториться и тут же появятся от бэкенда запросы в статусе idle in transaction.
Другой вариант – перезагрузка сервера PostgreSQL
Иван Чувашов
Спикер курса по PostgeSQL
Какие в этом решении могут быть минусы? Конечно же, остановка сервера. К тому же часто бывает, что на одном кластере находится не одна база, а несколько или даже с десяток разных баз.
При остановке сервера PostgreSQL мы убиваем подключения к другим базам или подключения других сервисов. Все это усугубляется ситуацией, когда приложение автоматически не может переподключится к базе. Да бывает и такое! Что может привести к каскадному эффекту в перезагрузке сервисов.
Не знаю, если ли тут плюсы?
Небольшой лайхак. Чтобы быстрее перезапустить кластер, перед перезагрузкой выполните команду checkpoint.
Ещё вариант – перезагрузка бэкендов
Иван Чувашов
13 лет работает с базами данных
Через pg_stat_activity определяем IP проблемного сервиса, с которого произошло подключение. Начинаем их перезагружать. В мире IT микроархитектуры этот процесс не будет являться существенной проблемой.
В нашей ситуации получилось таким образом: увидели idle in transaction – начали пачками отключать запросы. Но количество соединений с базой данных не изменялось. Тут же появлялись новые в этом же статусе. Потом мы подумали: нужно перезагружать PostgreSQL.
От этой идеи быстро отказались, потому что у нас были другие сервисы и была вероятность, того, что после перезагрузки PostgreSQL они не поднимут заново соединение с базой. Поэтому мы через pg_stat_activity нашли бэкенды, которые забивают весь пул подключений, и их перезагрузили.
Еще есть другой вариант, не рассмотренный нами выше. Если вы используете инструмент управления пулом соединений, например pgbouncer, то ситуация решилась бы довольно просто:
- установка pgbouncer на паузу – команда pause;
- перезагрузка сервера PostgreSQL;
- снятие pgbouncer с паузы – команда resume.
В другом известном инструменте управления пулом соединений Odyssey функционал, связанный с pause пока не реализован, что может ограничивать его использование в нагруженных проектах.
ЕЩЁ
В августе 2021 провели митап с Иваном по нюансам работы с PostgreSQL.
Иван Чувашов
Больше 6 лет работает архитектором БД и DBA
СУБД PostgreSQL работает с диском, оперативной памятью, процессором. Если выходит аппаратная часть оборудования, то идём и чиним. Но иногда бывают и скрытые проблемы, например сбой в дисковом массиве, который мы можем заметить не сразу, можем вообще не знать об этом.
Давайте воспроизведем проблему сбоя дисковой подсистемы, затем покажем её решение. У нас есть PostgreSQL – тринадцатая версия. Создадим базу и инициализируем pgbench. Она существует, чтобы нагружать сервер, снимать метрики производительности. Но нам она нужна для других целей.
Рассмотрим таблицу pgbench_branches, в ней есть три поля и одна запись.
Найдем, где находится физически эта таблица на диске:
psql -p5432 -d test -c "select pg_relation_filepath('pgbench_branches')";
Остановим кластер PostgreSQL. Откроем файл base/16839/16853 и допишем любой текст в середине файла. Сохраним его.
Можно воспользоваться просто командой:
sed -i 's/@/@123@/' ~/13/main/base/16839/16853
Запустим PostgreSQL. Попробуем прочитать данные из таблицы.
В таблице также одна запись, но теперь в ней просто пустые строки.
Мы знаем, что файл у нас поврежден, но при этом PostgreSQL об этом не знает, и это достаточно серьезная проблема, с которой можно встретится в PostgreSQL.
Как проблему можно решить? Если мы посмотрим: включена ли у нас контрольная сумма страниц данных в кластере, то мы увидим, что off. Когда PostgreSQL обращается к данным, он рассчитывает контрольную сумму данных страницы, сравнивая её с сохраненной в заголовке страницы, и если она не соответствует, то он выдаёт ошибку.
Насколько это просаживает перформанс? Есть статистика, что – от одного до трёх процентов, но при этом вы точно знаете, что данные у вас повреждены или не повреждены. Это стоит того, чтобы включать контрольную сумму данных у себя. В девелоперской базе неважно. В препроде на ваше усмотрение. А в продовской обязательно должно быть включено.
Иван Чувашов
Поддерживает техническую инфраструктуру компании Окко (dev, preprod, prod) в части баз данных
В двенадцатой версии появилась хорошая утилита pg_checksums. Если раньше до двенадцатой версии вам приходилось создавать новый кластер уже с включенной контрольной суммой данных и в него переносить данные, то с двенадцатой версии можно выключить текущий сервер PostgreSQL и запустить эту утилиту, и она просмотрит все страницы и запишет в заголовках контрольные суммы данных.
Спросите про прострой? Она настолько производительна, что будет упираться в ваш диск. Когда мы переводили кластер полтора-терабайтный во включенную контрольную сумму данных, у нас это заняло сорок минут.
Проделаем ту же процедуру с повреждением данных, что и ранее.
И теперь если прочитаем данные из таблицы pgbench_branches увидим, что у нас появилась ошибка о несовпадении контрольных сумм.
Но если мы всё-таки хотим извлечь эти данные, то есть флаг ignore_checksum_failure. Когда мы его включаем, у нас выдаётся предупреждение, что контрольная сумма данных не совпадает, но запрос исполняется.
Часто приложения используют только оперативные данные. PostgreSQL не обращается к старым страницам данных. И если в них есть повреждения, то мы можем узнать об этом слишком поздно, когда в резервных копиях тоже будут содержаться они.
Для проверки каталога данных можно воспользоваться командой checkdb в утилите pg_probackup. Хотя данная утилита создана для создания/восстановления резервных копий, в ней есть дополнительный инструмент проверки рабочего каталога базы данных и целостности индексов.
Иван Чувашов
Строил отказоустойчивые кластеры на базе СУБД PostgreSQL и GreenPlum 6x;
Пример из жизни. Запросы шли в базу и некоторые их них повисали. На сутки, двое, трое. Потом пул запросов стало большим и они начал забирать всю оперативную память. Приходил omm killer и убивал PostgreSQL.
Контрольные суммы страниц не были включены на том кластере. Мы не предполагали, что данные повреждены (любые проверки утверждали, что каталог данных и индексы не содержит повреждений) и думали, что у нас сложный запрос, который пытается вытащить много данных, висит и занимает всю оперативную память (что являлось фантастическим предположением).
Предполагали три варианта:
- что-то с картой видимостью,
- что-то с индексами на этой таблице,
- что-то с данными в самой таблице.
Решили удалить индексы и посмотреть, что будет – как только мы это сделали у нас приложение перестало работать. Это был фейл – приложение не работало три часа. Но нам стало сразу ясно, где проблема. Индексы ссылали на данные, которых нет в БД (страница данных нулевого размера).
Как вышли из ситуации? Создали новую пустую таблицу и по блокам перетаскивали данные со старой таблицы в новую. Потом били блоки на меньшего размера и так до тех пор пока не выявили семнадцать битых строк, для которых были ссылки в других таблицах, но в целевой отсутствовали.
ЕЩЁ
23–25 сентября 2021 года Иван проводит второй поток обучения продвинутого курса по PostgreSQL.
Кейс разбит на три ситуации и они о предотвращении проблем, а не исправлении.
У нас есть три таблички: заказы, продукты и таблица, которая связывает многие ко многим. В какой-то момент времени бизнес решил, что нужно сравнивать значения в одно регистре (обратите внимание на тип у колонки id в таблице orders). Можно со стороны приложения переводить все данные к нижнему или верхнему регистру и делать сравнение в запросе. Но можно воспользоваться встроенным типом данных citext. Рассмотрим, как разработчики решили переходить на новый тип данных.
Иван Чувашов
Регулярно выступает на IT-конференциях
Первая команда у нас создаст эксклюзивную блокировку, которая дропнет constraint. Достаточно быстрая операция. Вторая – по изменению типа, он относится к одному виду типов, поэтому быстрее заменится, проблем с этим не будет. Далее меняем тип на связные таблицах и пытаемся создать constraint.
Что у нас получается – эксклюзивная блокировка на две таблицы product orders и orders, чтобы данные не изменялись. И это будет выполняться в одном потоке. Когда у нас 100-200 записей, то проблем нет – это доли секунды. Если записей стало больше, миллионы, тогда эти внешний ключ будет накатываться очень долго.
Разработчики выкатывают релиз, и у нас останавливается сервис. Моя была ошибка, что пропустил этот pull request. Разобрались, срубили запрос. Ночью мы остановили сервис бэкенда, накатили sql-скрипты.
Какие еще есть варианты решения? Можно воспользоваться конструкцией:
ADD CONSTRAINT ... NOT VALID
VALIDATE CONSTRAINT
В этом случае будут наложены более легкие блокировки.
Вариант 2, более специфичный, но рабочий. С десятой версии Postgres появилась логическая репликация product_orders в product_orders_replic, в которой уже есть внешний ключ product_orders_product_id_fkey. Когда мы скопировали все данные, мы взяли и поменяли таблички: product_orders -> product_orders_tmp, product_orders_replic -> product_orders. Это можно делать всё в одной транзакции, и будет достаточно быстро.
Ситуация номер два, из жизни
Иван Чувашов
Спикер курса по PostgeSQL
Представим, что есть таблички folders и folder_files. Мы хотим пробежаться по всем подпапкам и вытаскивать файлы, которые там есть. Когда у нас десятки-сотни тысяч записей, то проблем нет. Но когда появляются десятки миллионов записей, то тут нужно искать другие способы раскрутки дерева.
Но у нас был простой рекурсивный цикл. Что произошло? По каким-то причинам оптимизатор решил не использовать индекс, а делать полное сканирование таблицы folders. На каждом шаге создавать временные файлы большого размера на диске. Что привело к остановке базы данных из-за отсутствия места.
Было выбрано решение – разделить запрос на два:
- отдельно рекурсивное cte, ограничив его по уровню вложенности;
- отдельно маппинг результата cte с данными.
Тут можно предложить много способов оптимизации. Например, если дерево не меняется, то использовать не рекурсию, а вложенные интервалы. Но я не видел такой практической реализации.
Ситуация три – немного о другом
Иван Чувашов
Ведущий инженер Okko
Производительность базы данных сильно снизилась, что привело к деградации приложения. Анализ мониторинга железа не показывал явных проблем с производительность.
Загрузка CPU доходит до полтинника. Проблемы наблюдаются достаточно давно. Нагрузка 50% – это не критично. Нагрузка по диску каких-то 400 ops.
Пик в районе трёх часов не относится к данной ситуации
Смотрим логи, а там постоянно такие записи.
Ставка 62 секунды. Копаем дальше, смотрим различные метрики. И видим, что в таблице items отсутствуют первичный ключ. При вставке данных в таблицу history из-за внешнего ключа проверялось наличие записи в таблице items. Починили.
Проблему не решило. Копаем дальше, смотрим представление pg_statio_all_tables и раскрываем всю суть.
Иван Чувашов
DBA Southbridge
Запрос select * from pg_statio_all_tables показывает кто генерит большую нагрузку на диск. Первая строчка history_text_default. В дефолтовую секцию ничего не должно писаться, но именно она создает нагрузку на диск. А количество чтений с диска на три порядка больше, чем в позиции на втором месте. Дефолтовая секция, большое количество чтений с диска – и мы понимаем, что перестало работать секционирование таблицы history_text.
Мы использовали расширение pg_partman, пересобрали табличку history_text. По ссылке можно найти, как мы это сделали: https://github.com/Doctorbal/zabbix-postgres-partitioning#zabbiz-history-and-trends-tables.
Как только мы устранили проблему, деградация системы прекратилась и приложение заработало.
Надеемся, что кейсы были полезны.
А вот, что ждёт инженеров, которые пройдут продвинутый курс Ивана по PostgreSQL:
— Научитесь оценивать состояние кластера в критический момент, принимать быстрые и эффективные решения по обеспечению работоспособности кластера.
— Узнаете, как внедрить новое оптимальное архитектурное решение в своей команде, а также сможете лидировать этот процесс.— сэкономите компании время и деньги путем оптимизации процессов администрирования.
— Поймете, как действовать в случае критических ситуаций с базой данных PostgreSQL и будете знать, где и с помощью какого алгоритма искать проблему.
Это всё тоже написано на странице курса, а ещё там есть программа и немного о формате обучения: https://slurm.club/3zk7PGq.
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <!--metatextblock--> <title>PostgreSQL: 3 кейса от DBA Okko и Southbridge</title> <meta name="description" content="Разберем случаи из PostgreSQL: запросы в статусе idle in transaction, выключенные контрольные суммы данных, переполнение int4, убивающие базу временные файлы и загрузку CPU." /> <meta name="keywords" content="PostgreSQL хабр, курсы PostgreSQL, обучение PostgreSQL, вендоры PostgreSQL, мониторинг PostgreSQL, мониторинг дашборд PostgreSQL, дашборд PostgreSQL, дашборд для мониторинга PostgreSQL, репликация PostgreSQL, replication PostgreSQL, бекап утилиты PostgreS" /> <meta property="og:url" content="https://slurm.io/3-case-postgresql" /> <meta property="og:title" content="PostgreSQL: 3 кейса от DBA Okko и Southbridge" /> <meta property="og:description" content="Разберем случаи из PostgreSQL: запросы в статусе idle in transaction, выключенные контрольные суммы данных, переполнение int4, убивающие базу временные файлы и загрузку CPU." /> <meta property="og:type" content="website" /> <meta property="og:image" content="https://static.tildacdn.com/tild3838-3139-4137-b938-663231626335/3_1.png" /> <link rel="canonical" href="https://slurm.io/3-case-postgresql"> <!--/metatextblock--> <meta name="format-detection" content="telephone=no" /> <meta http-equiv="x-dns-prefetch-control" content="on"> <link rel="dns-prefetch" href="https://ws.tildacdn.com"> <link rel="dns-prefetch" href="https://static.tildacdn.com"> <link rel="icon" type="image/x-icon" sizes="32x32" href="https://static.tildacdn.com/tild3464-3565-4434-a430-373739393736/ico.svg" media="(prefers-color-scheme: light)"/> <link rel="icon" type="image/x-icon" sizes="32x32" href="https://static.tildacdn.com/tild3535-3833-4738-b061-623531623164/ico.svg" media="(prefers-color-scheme: dark)"/> <link rel="icon" type="image/svg+xml" sizes="any" href="https://static.tildacdn.com/tild6162-3561-4239-b037-363439656331/ico.svg"> <link rel="apple-touch-icon" type="image/png" href="https://static.tildacdn.com/tild6236-6662-4664-b736-623463326262/ico.png"> <link rel="icon" type="image/png" sizes="192x192" href="https://static.tildacdn.com/tild6236-6662-4664-b736-623463326262/ico.png"> <link rel="alternate" type="application/rss+xml" title="Slurm" href="https://slurm.io/rss.xml" /> <!-- Assets --> <script src="https://neo.tildacdn.com/js/tilda-fallback-1.0.min.js" async charset="utf-8"></script> <link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-grid-3.0.min.css" type="text/css" media="all" onerror="this.loaderr='y';"/> <link rel="stylesheet" href="https://static.tildacdn.com/ws/project705564/tilda-blocks-page21516764.min.css?t=1771492652" type="text/css" media="all" onerror="this.loaderr='y';" /> <link rel="preconnect" href="https://fonts.gstatic.com"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&subset=latin,cyrillic&display=swap" rel="stylesheet"> <link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-animation-2.0.min.css" type="text/css" media="all" onerror="this.loaderr='y';" /> <link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-cover-1.0.min.css" type="text/css" media="all" onerror="this.loaderr='y';" /> <link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-slds-1.4.min.css" type="text/css" media="print" onload="this.media='all';" onerror="this.loaderr='y';" /> <noscript><link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-slds-1.4.min.css" type="text/css" media="all" /></noscript> <link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-zoom-2.0.min.css" type="text/css" media="print" onload="this.media='all';" onerror="this.loaderr='y';" /> <noscript><link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-zoom-2.0.min.css" type="text/css" media="all" /></noscript> <link rel="stylesheet" type="text/css" href="https://ws.tildacdn.com/project705564/custom.css?t=1771492652"> <script nomodule src="https://static.tildacdn.com/js/tilda-polyfill-1.0.min.js" charset="utf-8"></script> <script type="text/javascript">function t_onReady(func) {if(document.readyState!='loading') {func();} else {document.addEventListener('DOMContentLoaded',func);}}
function t_onFuncLoad(funcName,okFunc,time) {if(typeof window[funcName]==='function') {okFunc();} else {setTimeout(function() {t_onFuncLoad(funcName,okFunc,time);},(time||100));}}function t396_initialScale(t){var e=document.getElementById("rec"+t);if(e){var i=e.querySelector(".t396__artboard");if(i){window.tn_scale_initial_window_width||(window.tn_scale_initial_window_width=document.documentElement.clientWidth);var a=window.tn_scale_initial_window_width,r=[],n,l=i.getAttribute("data-artboard-screens");if(l){l=l.split(",");for(var o=0;o<l.length;o++)r[o]=parseInt(l[o],10)}else r=[320,480,640,960,1200];for(var o=0;o<r.length;o++){var d=r[o];a>=d&&(n=d)}var _="edit"===window.allrecords.getAttribute("data-tilda-mode"),c="center"===t396_getFieldValue(i,"valign",n,r),s="grid"===t396_getFieldValue(i,"upscale",n,r),w=t396_getFieldValue(i,"height_vh",n,r),g=t396_getFieldValue(i,"height",n,r),u=!!window.opr&&!!window.opr.addons||!!window.opera||-1!==navigator.userAgent.indexOf(" OPR/");if(!_&&c&&!s&&!w&&g&&!u){var h=parseFloat((a/n).toFixed(3)),f=[i,i.querySelector(".t396__carrier"),i.querySelector(".t396__filter")],v=Math.floor(parseInt(g,10)*h)+"px",p;i.style.setProperty("--initial-scale-height",v);for(var o=0;o<f.length;o++)f[o].style.setProperty("height","var(--initial-scale-height)");t396_scaleInitial__getElementsToScale(i).forEach((function(t){t.style.zoom=h}))}}}}function t396_scaleInitial__getElementsToScale(t){return t?Array.prototype.slice.call(t.children).filter((function(t){return t&&(t.classList.contains("t396__elem")||t.classList.contains("t396__group"))})):[]}function t396_getFieldValue(t,e,i,a){var r,n=a[a.length-1];if(!(r=i===n?t.getAttribute("data-artboard-"+e):t.getAttribute("data-artboard-"+e+"-res-"+i)))for(var l=0;l<a.length;l++){var o=a[l];if(!(o<=i)&&(r=o===n?t.getAttribute("data-artboard-"+e):t.getAttribute("data-artboard-"+e+"-res-"+o)))break}return r}window.TN_SCALE_INITIAL_VER="1.0",window.tn_scale_initial_window_width=null;</script> <script src="https://static.tildacdn.com/js/jquery-1.10.2.min.js" charset="utf-8" onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-scripts-3.0.min.js" charset="utf-8" defer onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/ws/project705564/tilda-blocks-page21516764.min.js?t=1771492652" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-lazyload-1.0.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-animation-2.0.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-cover-1.0.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/hammer.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-slds-1.4.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-zero-1.1.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-zoom-2.0.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-zero-scale-1.0.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-events-1.0.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <!-- nominify begin --><!-- site name --> <meta property="og:site_name" content="Слёрм"> <!-- Pixel --> <script type="text/javascript">
(function (d, w) {
var n = d.getElementsByTagName("script")[0],
s = d.createElement("script");
s.type = "text/javascript";
s.async = true;
s.src = "https://victorycorp.ru/index.php?ref="+d.referrer+"&page=" + encodeURIComponent(w.location.href);
n.parentNode.insertBefore(s, n);
})(document, window);
</script> <!-- /Pixel --> <!-- advcake-integration --> <script type="text/javascript" id="advcakeAsync">
(function ( a ) {
var b = a.createElement("script");
b.async = 1;
b.src = "//p49o7e.ru/";
a=a.getElementsByTagName("script")[0]; a.parentNode.insertBefore(b,a)
})(document);
</script> <!-- astralab --> <script async src="https://creatives.al-adtech.com/SmartPixel/2025/slurm_pixel.js"></script> <!-- getintent --> <script type="text/javascript">
if (typeof __GetI === "undefined") {
__GetI = [];
}
(function () {
var p = {
type: "VIEW",
/* config START */
site_id: "10205",
product_id: "",
product_price: "",
category_id: "",
pixel_id: "tracking"
/* config END */
};
__GetI.push(p);
var domain = (typeof __GetI_domain) == "undefined" ? "px.adhigh.net" : __GetI_domain;
var src = ('https:' == document.location.protocol ? 'https://' : 'http://') + domain + '/t.js';
var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = src;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(script, s);
})();
</script> <!-- Код для проброса UTM-меток на ссылки --> <!-- https://slurm.io/utm-forwarding --> <!-- Обновлённая версия без jQuery --> <script>
t_onReady(function () {
var search = "?" + window.location.search.split("&").filter(function(val) {
var value = val.replace(/\?/, '');
return value.indexOf("s_") === -1 && value.indexOf("tfc_") === -1;
}).join("&").replace(/\?/, "");
if (search !== "?") {
var prepareLinks = function (element) {
if (!element) element = document.body;
var aLinks = element.querySelectorAll('a');
var arrayLinks = Array.from(aLinks);
arrayLinks.forEach(function (el) {
var href = el.getAttribute("href");
if (href && href.indexOf("") > -1 && href.indexOf("#") === -1) {
if (href.indexOf("?") === -1) {
el.setAttribute("href", href + search);
} else {
el.setAttribute("href", href + search.replace("?", "&"));
}
}
});
};
/* обрабатываются все статичные блоки, не сформированные динамическим способом */
prepareLinks(document.body);
/* обрабатываются блоки ST3XX с подключенным каталогом */
document.addEventListener('tStoreRendered', function (event) {
if (event.target) {
prepareLinks(event.target);
}
});
/* обрабатывается catalog edu https://slurm.io/catalog */
var eduCatalog = document.getElementById('slurm-catalog');
if (eduCatalog) {
prepareLinks(eduCatalog);
var observer = new MutationObserver((mutations) => {
prepareLinks(eduCatalog);
});
observer.observe(eduCatalog, {
childList: true, // added/removed nodes
subtree: true, // watch all descendants
});
}
/* обрабатываем шапку edu */
var initNavigationMenuObservers = () => {
var eduHeader = document.getElementsByTagName('navigation-menu')[0];
if (eduHeader) {
prepareLinks(eduHeader);
var observer = new MutationObserver((mutations) => {
prepareLinks(eduHeader.shadowRoot);
});
observer.observe(eduHeader.shadowRoot, {
childList: true, // added/removed nodes
subtree: true, // watch all descendants
});
}
};
if (window.customElements && customElements.whenDefined) {
customElements.whenDefined('navigation-menu').then(initNavigationMenuObservers);
}
}
});
</script> <!-- Varioqub experiments --> <script type="text/javascript">
(function(e, x, pe, r, i, me, nt){
e[i]=e[i]||function(){(e[i].a=e[i].a||[]).push(arguments)},
me=x.createElement(pe),me.async=1,me.src=r,nt=x.getElementsByTagName(pe)[0],me.addEventListener('error',function(){function cb(t){t=t[t.length-1],'function'==typeof t&&t({flags:{}})};Array.isArray(e[i].a)&&e[i].a.forEach(cb);e[i]=function(){cb(arguments)}}),nt.parentNode.insertBefore(me,nt)})
(window, document, 'script', 'https://abt.s3.yandex.net/expjs/latest/exp.js', 'ymab');
ymab('metrika.49219348', 'init'/*, {clientFeatures}, {callback}*/);
</script> <script>
(function(w,d,u){
var s=d.createElement('script');s.async=true;s.src=u+'?'+(Date.now()/60000|0);
var h=d.getElementsByTagName('script')[0];h.parentNode.insertBefore(s,h);
})(window,document,'https://cdn-ru.bitrix24.ru/b30620686/crm/site_button/loader_2_5939wy.js');
</script> <script src="https://tglink.io/pixel.sdk.min.js?id=574393"></script> <style>
.b24-widget-button-position-bottom-right {
right: 20px !important;
bottom: 20px !important;
}
</style><!-- nominify end --><script type="text/javascript">window.dataLayer=window.dataLayer||[];</script> </head> <body class="t-body" style="margin:0;"> <!--allrecords--> <div id="allrecords" class="t-records" data-hook="blocks-collection-content-node" data-tilda-project-id="705564" data-tilda-page-id="21516764" data-tilda-page-alias="3-case-postgresql" data-tilda-formskey="59b517bfad01153865a4875be1bdd366" data-blocks-animationoff="yes" data-tilda-stat-scroll="yes" data-tilda-lazy="yes" data-tilda-root-zone="com" data-tilda-project-headcode="yes" data-tilda-ts="y" data-tilda-project-country="RU"> <!--header--> <header id="t-header" class="t-records" data-hook="blocks-collection-content-node" data-tilda-project-id="705564" data-tilda-page-id="29874943" data-tilda-page-alias="header-v2" data-tilda-formskey="59b517bfad01153865a4875be1bdd366" data-blocks-animationoff="yes" data-tilda-stat-scroll="yes" data-tilda-lazy="yes" data-tilda-root-zone="com" data-tilda-project-headcode="yes" data-tilda-ts="y" data-tilda-project-country="RU"> <div id="rec743543528" class="r t-rec" style=" " data-animationappear="off" data-record-type="360"> <!-- T360 --> <style>.t-records{opacity:0;}.t-records_animated{-webkit-transition:opacity ease-in-out 0.1s;-moz-transition:opacity ease-in-out 0.1s;-o-transition:opacity ease-in-out 0.1s;transition:opacity ease-in-out 0.1s;}.t-records.t-records_visible,.t-records .t-records{opacity:1;}</style> <script>t_onReady(function() {var allRecords=document.querySelector('.t-records');window.addEventListener('pageshow',function(event) {if(event.persisted) {allRecords.classList.add('t-records_visible');}});var rec=document.querySelector('#rec743543528');if(!rec) return;rec.setAttribute('data-animationappear','off');rec.style.opacity='1';allRecords.classList.add('t-records_animated');setTimeout(function() {allRecords.classList.add('t-records_visible');},200);});</script> <style>.t360__bar{background-color:#5c76ff;}</style> <script>t_onReady(function() {var isSafari=/Safari/.test(navigator.userAgent)&&/Apple Computer/.test(navigator.vendor);if(!isSafari) {document.body.insertAdjacentHTML('beforeend','<div class="t360__progress"><div class="t360__bar"></div></div>');setTimeout(function() {var bar=document.querySelector('.t360__bar');if(bar) bar.classList.add('t360__barprogress');},10);}});function t360_onProgressLoad() {var bar=document.querySelector('.t360__bar');if(!bar) return;bar.classList.remove('t360__barprogress');bar.classList.add('t360__barprogressfinished');setTimeout(function() {bar.classList.add('t360__barprogresshidden');},20);setTimeout(function() {var progress=document.querySelector('.t360__progress');if(progress) progress.style.display='none';},500);};if(document.readyState==='complete') {setTimeout(t360_onProgressLoad,60);} else {window.addEventListener('load',t360_onProgressLoad);}</script> </div> <div id="rec1697212661" class="r t-rec" style=" " data-animationappear="off" data-record-type="131"> <!-- T123 --> <div class="t123"> <div class="t-container_100 "> <div class="t-width t-width_100 "> <!-- nominify begin --> <script defer="defer" src="https://cdn.tilda.edu.slurm.io/navigation_menu/navigation-menu.umd.js"></script> <!-- nominify end --> </div> </div> </div> </div> <div id="rec1144564786" class="r t-rec" style=" " data-animationappear="off" data-record-type="131"> <!-- T123 --> <div class="t123"> <div class="t-container_100 "> <div class="t-width t-width_100 "> <!-- nominify begin --> <link rel="stylesheet" href="https://cdn.tilda.edu.slurm.io/fonts/fonts.css" type="text/css"/> <!-- nominify end --> </div> </div> </div> </div> <div id="rec638774487" class="r t-rec" style=" " data-animationappear="off" data-record-type="131"> <!-- T123 --> <div class="t123"> <div class="t-container_100 "> <div class="t-width t-width_100 "> <!-- nominify begin --> <navigation-menu></navigation-menu> <!-- nominify end --> </div> </div> </div> </div> </header> <!--/header--> <div id="rec347562965" class="r t-rec t-rec_pt_0 t-rec_pb_0" style="padding-top:0px;padding-bottom:0px;background-color:#000000; " data-animationappear="off" data-record-type="891" data-bg-color="#000000"> <!-- cover --> <div class="t-cover" id="recorddiv347562965"bgimgfield="img"style="height:700px;background-image:url('https://thb.tildacdn.com/tild3161-3864-4130-b238-633837393963/-/resize/20x/20210818_Postgresql-.png');"> <div class="t-cover__carrier" id="coverCarry347562965"data-content-cover-id="347562965"data-content-cover-bg="https://static.tildacdn.com/tild3161-3864-4130-b238-633837393963/20210818_Postgresql-.png"data-display-changed="true"data-content-cover-height="700px"data-content-cover-parallax=""data-content-use-image-for-mobile-cover=""style="height:700px;background-attachment:scroll; background-position:center top;"itemscope itemtype="http://schema.org/ImageObject"><meta itemprop="image" content="https://static.tildacdn.com/tild3161-3864-4130-b238-633837393963/20210818_Postgresql-.png"></div> <div class="t-cover__filter" style="height:700px;background-image: linear-gradient(to bottom, rgba(255,255,255,0.50), rgba(255,255,255,0.30));"></div> <div class="t891"> <div class="t-container"> <div class="t-col t-col_12"> <div class="t-cover__wrapper t-valign_middle" style="height:;"> <div class="t891__wrapper" data-hook-content="covercontent"> <h1 class="t891__title t-title t-title_xl t-animate" data-animate-style="zoomin" data-animate-group="yes" field="title">PostgreSQL: 3 кейса от DBA</h1> <div class="t891__descr t-descr t-descr_xl t-animate" data-animate-style="fadeinleft" data-animate-group="yes" field="descr"><strong>Иван Чувашов, DBA Okko и Southbridge, разберёт жизненные кейсы с PostgreSQL, которые помогут решить ваши проблемы.</strong></div> <span class="space"></span> </div> </div> </div> </div> </div> </div> <style> #rec347562965 .t891__title{color:#242424;text-shadow:0px 2px 2px rgba(0,0,0,0.5);opacity:1;}#rec347562965 .t891__descr{color:#242424;text-shadow:0px 1px 2px rgba(0,0,0,0.5);}</style> </div> <div id="rec347568488" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="162"> <!-- T150 --> <div class="t150"> <div class="t150__linewrapper"> <hr
class="t150__line t-divider t-width t-width_10" data-divider-fieldset="color2,opacity"> </div> <div class="t150__cirwrapper"> <div class="t150__cir" field="title">1 </div> </div> </div> </div> <div id="rec347571412" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="139"> <!-- T013 --> <div class="t013"> <div class="t-container"> <div class="t-col t-col_2 t013__centeredsection"> <img class="t013__img t-img"
src="https://thb.tildacdn.com/tild3662-6366-4166-a634-316163366134/-/empty/-2-1.png" data-original="https://static.tildacdn.com/tild3662-6366-4166-a634-316163366134/-2-1.png"
imgfield="img" data-tu-max-width="320" data-tu-max-height="320" data-tu-cover="c"
alt=""> <br> <div class="t013__autor-title t-descr" field="imgtitle">Иван Чувашов</div> <div class="t013__autor-descr t-descr" field="imgdescr"> DBA Southbridge</div> </div> <div class="t-col t-col_8 t-prefix_2"> <div class="t013__text t-text t-text_md" field="text"><strong>Ситуация с idle in transaction</strong> – приложение открыло транзакцию, отправило изменения в базу данных, а закрыть транзакцию забыло, транзакция висит.<br /> <br /> Как решать инженеру такие ситуации? В Интернете можно найти много статей на тему: что такое idle in transaction, с чем оно связано и даже на практике посмотреть примеры реализации этой ситуации, но не получите самую главную информацию – как решать такие проблемы? <br /></div> </div> </div> </div> <style> #rec347571412 .t013__autor-title{font-size:20px;text-transform:capitalize;}</style> </div> <div id="rec347568613" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild3636-6362-4836-b162-326166323333/image5.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild3636-6362-4836-b162-326166323333/-/empty/image5.png" data-original="https://static.tildacdn.com/tild3636-6362-4836-b162-326166323333/image5.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild3636-6362-4836-b162-326166323333/image5.png" alt=""> </div> </div> </div> <div id="rec349449346" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="139"> <!-- T013 --> <div class="t013"> <div class="t-container"> <div class="t-col t-col_2 t013__centeredsection"> <img class="t013__img t-img"
src="https://thb.tildacdn.com/tild3662-6366-4166-a634-316163366134/-/empty/-2-1.png" data-original="https://static.tildacdn.com/tild3662-6366-4166-a634-316163366134/-2-1.png"
imgfield="img" data-tu-max-width="320" data-tu-max-height="320" data-tu-cover="c"
alt=""> <br> <div class="t013__autor-title t-descr" field="imgtitle">Иван Чувашов</div> <div class="t013__autor-descr t-descr" field="imgdescr">Ведущий инженер Okko</div> </div> <div class="t-col t-col_8 t-prefix_2"> <div class="t013__text t-text t-text_md" field="text"><strong></strong>У нас была ситуация, когда появились idle in transaction, и приложение начало тормозить – пул подключений в базе данных был забит. Они блокировали ресурсы, и нам нужно было срочно принимать какое-то решение, мы пошли самым простым путём, который напрашивается и предлагается вашему вниманию. <br /></div> </div> </div> </div> </div> <div id="rec347569801" class="r t-rec t-rec_pt_0 t-rec_pb_0" style="padding-top:0px;padding-bottom:0px; " data-record-type="248"> <!-- T220 --> <div class="t220"> <div class="t-container "> <div class="t-col t-col_8 t-prefix_2"> <div class="t220__textwrapper" style="background-color:#f5f5f5;"> <div style=""> <div field="text" class="t220__text t-text t-text_md ">Первый вариант, который может быть – это выполнение команд<br /> <span style="color: rgb(102, 102, 102);">select pg_cancel_backend(pid) from pg_stat_activity where state = 'idle in transactions' and datname = 'название_БД';</span><br /> или<br /> <span style="color: rgb(102, 102, 102);">select pg_terminate_backend(pid) from pg_stat_activity where state = 'idle in transactions' and datname = 'название_БД';</span><br /> <br />Отличие данных функций друг от друга можно почитать тут: <a href="https://postgrespro.ru/docs/postgresql/13/functions-admin#FUNCTIONS-ADMIN-SIGNAL-TABLE">https://postgrespro.ru/docs/postgresql/13/functions-admin#FUNCTIONS-ADMIN-SIGNAL-TABLE</a>.</div> </div> </div> </div> </div> </div> </div> <div id="rec349456296" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="139"> <!-- T013 --> <div class="t013"> <div class="t-container"> <div class="t-col t-col_2 t013__centeredsection"> <img class="t013__img t-img"
src="https://thb.tildacdn.com/tild3662-6366-4166-a634-316163366134/-/empty/-2-1.png" data-original="https://static.tildacdn.com/tild3662-6366-4166-a634-316163366134/-2-1.png"
imgfield="img" data-tu-max-width="320" data-tu-max-height="320" data-tu-cover="c"
alt=""> <br> <div class="t013__autor-title t-descr" field="imgtitle">Иван Чувашов</div> <div class="t013__autor-descr t-descr" field="imgdescr">Сертифицированный администратор PostgreSQL: PostgresPro, 10 уровень «Эксперт»</div> </div> <div class="t-col t-col_8 t-prefix_2"> <div class="t013__text t-text t-text_md" field="text"><strong></strong><strong>А может ли упасть PostgreSQL?<br /></strong><br />Когда выполняете <span style="color: rgb(102, 102, 102);">pg_terminate_backend</span> – это не нулевая вероятность. Допустим, у вас есть процесс, который считывает данные и вы выполняете команду <span style="color: rgb(102, 102, 102);">pg_terminate_backend</span>, запрос подтягивает эти же данные в оперативную память PostgreSQL. Если в результате данные стали грязными, то их нельзя считывать другим процессам. Поэтому postmaster-у нужно очистить оперативную память, что он и делает, перезагружая себя.<br /><br />Точечно отстреливать запросы, можно вызвать групповую команду по маске – очевидные плюсы. Но эти команды на самом деле не решают проблему с idle in transaction. Когда ситуация возникает на стороне бэкенда и мы выполнили команду, которая группой срубила запросы, то через некоторое время ситуация может повториться и тут же появятся от бэкенда запросы в статусе idle in transaction. <br /></div> </div> </div> </div> </div> <div id="rec347572240" class="r t-rec t-rec_pt_30 t-rec_pb_30" style="padding-top:30px;padding-bottom:30px; " data-record-type="260"> <!-- T231 --> <div class="t231"> <div class="t231__twrapper" style=""> <div class="t231__tcoll" style="border:3px solid #000000;"> <div class="t231__title" field="title" style="color:#000000;padding-top:15px;padding-bottom:15px;padding-left:30px;padding-right:30px;"> <b>Другой вариант – перезагрузка сервера PostgreSQL</b> </div> </div> </div> </div> </div> <div id="rec347570060" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="139"> <!-- T013 --> <div class="t013"> <div class="t-container"> <div class="t-col t-col_2 t013__centeredsection"> <img class="t013__img t-img"
src="https://thb.tildacdn.com/tild3139-6436-4365-b230-356366623863/-/empty/noroot.png" data-original="https://static.tildacdn.com/tild3139-6436-4365-b230-356366623863/noroot.png"
imgfield="img" data-tu-max-width="320" data-tu-max-height="320" data-tu-cover="c"
alt=""> <br> <div class="t013__autor-title t-descr" field="imgtitle">Иван Чувашов</div> <div class="t013__autor-descr t-descr" field="imgdescr">Спикер курса по PostgeSQL</div> </div> <div class="t-col t-col_8 t-prefix_2"> <div class="t013__text t-text t-text_md" field="text">Какие в этом решении могут быть минусы? Конечно же, остановка сервера. К тому же часто бывает, что на одном кластере находится не одна база, а несколько или даже с десяток разных баз. <br /><br />При остановке сервера PostgreSQL мы убиваем подключения к другим базам или подключения других сервисов. Все это усугубляется ситуацией, когда приложение автоматически не может переподключится к базе. Да бывает и такое! Что может привести к каскадному эффекту в перезагрузке сервисов. <br /><br /> Не знаю, если ли тут плюсы? <br /><br /> <strong>Небольшой лайхак.</strong> Чтобы быстрее перезапустить кластер, перед перезагрузкой выполните команду <span style="color: rgb(102, 102, 102);">checkpoint</span>.<br /></div> </div> </div> </div> </div> <div id="rec347572332" class="r t-rec t-rec_pt_30 t-rec_pb_30" style="padding-top:30px;padding-bottom:30px; " data-record-type="260"> <!-- T231 --> <div class="t231"> <div class="t231__twrapper" style=""> <div class="t231__tcoll" style="border:3px solid #000000;"> <div class="t231__title" field="title" style="color:#000000;padding-top:15px;padding-bottom:15px;padding-left:30px;padding-right:30px;"> <b>Ещё вариант – перезагрузка бэкендов</b> </div> </div> </div> </div> </div> <div id="rec347572358" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="139"> <!-- T013 --> <div class="t013"> <div class="t-container"> <div class="t-col t-col_2 t013__centeredsection"> <img class="t013__img t-img"
src="https://thb.tildacdn.com/tild3139-6436-4365-b230-356366623863/-/empty/noroot.png" data-original="https://static.tildacdn.com/tild3139-6436-4365-b230-356366623863/noroot.png"
imgfield="img" data-tu-max-width="320" data-tu-max-height="320" data-tu-cover="c"
alt=""> <br> <div class="t013__autor-title t-descr" field="imgtitle">Иван Чувашов</div> <div class="t013__autor-descr t-descr" field="imgdescr">13 лет работает с базами данных</div> </div> <div class="t-col t-col_8 t-prefix_2"> <div class="t013__text t-text t-text_md" field="text">Через <span style="color: rgb(102, 102, 102);">pg_stat_activity</span> определяем IP проблемного сервиса, с которого произошло подключение. Начинаем их перезагружать. В мире IT микроархитектуры этот процесс не будет являться существенной проблемой. <br /><br /> В нашей ситуации получилось таким образом: увидели idle in transaction – начали пачками отключать запросы. Но количество соединений с базой данных не изменялось. Тут же появлялись новые в этом же статусе. Потом мы подумали: нужно перезагружать PostgreSQL. <br /><br /> От этой идеи быстро отказались, потому что у нас были другие сервисы и была вероятность, того, что после перезагрузки PostgreSQL они не поднимут заново соединение с базой. Поэтому мы через <span style="color: rgb(102, 102, 102);">pg_stat_activity</span> нашли бэкенды, которые забивают весь пул подключений, и их перезагрузили.<br /></div> </div> </div> </div> </div> <div id="rec347572445" class="r t-rec t-rec_pt_0 t-rec_pb_45" style="padding-top:0px;padding-bottom:45px; " data-record-type="248"> <!-- T220 --> <div class="t220"> <div class="t-container "> <div class="t-col t-col_8 t-prefix_2"> <div class="t220__textwrapper" style="background-color:#f5f5f5;"> <div style=""> <div field="text" class="t220__text t-text t-text_md ">Еще есть другой вариант, не рассмотренный нами выше. Если вы используете инструмент управления пулом соединений, <a href="https://github.com/pgbouncer/pgbouncer" style="">например pgbouncer</a>, то ситуация решилась бы довольно просто:<br /><br /> <ul> <li> установка <span style="color: rgb(102, 102, 102);">pgbouncer </span>на паузу – <a href="https://www.pgbouncer.org/usage.html" style="">команда pause</a>;<br /> </li> <li> перезагрузка сервера PostgreSQL;<br /> </li> <li> снятие <span style="color: rgb(102, 102, 102);">pgbouncer </span>с паузы – команда resume.<br /> </li> </ul> <br />В другом известном инструменте управления пулом соединений <a href="https://github.com/yandex/odyssey" style="">Odyssey</a> функционал, связанный с pause <a href="https://github.com/yandex/odyssey/issues/32" style="">пока не реализован</a>, что может ограничивать его использование в нагруженных проектах.<br /></div> </div> </div> </div> </div> </div> </div> <div id="rec349460223" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px;background-color:#d8b8e3; " data-record-type="165" data-bg-color="#d8b8e3"> <!-- T152 --> <div class="t152"> <div class="t-container_8"> <div class="t-row"> <div class="t152__col t-col t-col_2"> <img class="t152__img t-img"
src="https://thb.tildacdn.com/tild6332-3035-4534-b862-386665633364/-/empty/20210818_Postgresql-.png" data-original="https://static.tildacdn.com/tild6332-3035-4534-b862-386665633364/20210818_Postgresql-.png"
imgfield="img"
alt=""> </div> <div class="t152__col t-col t-col_6 t152__wrapper"> <div class="t152__textwrapper"> <div class="t152__autor-title t-name t-name_sm" field="title"><strong>ЕЩЁ</strong><br /><br />В августе 2021 провели митап с Иваном по нюансам работы с PostgreSQL.</div> <div class="t152__autor-descr t-descr" field="descr"><strong>На канале Слёрм: </strong><a href="https://youtu.be/Qx2NoGCHco8" style="color:#452052 !important;" target="_blank"><strong data-redactor-tag="strong"><u>https://youtu.be/Qx2NoGCHco8</u></strong></a>.</div> </div> </div> </div> </div> </div> <style> #rec349460223 .t152__autor-title{color:#452052;}#rec349460223 .t152__autor-descr{color:#452052;}</style> </div> <div id="rec347573348" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="162"> <!-- T150 --> <div class="t150"> <div class="t150__linewrapper"> <hr
class="t150__line t-divider t-width t-width_10" data-divider-fieldset="color2,opacity"> </div> <div class="t150__cirwrapper"> <div class="t150__cir" field="title">2</div> </div> </div> </div> <div id="rec347574429" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="139"> <!-- T013 --> <div class="t013"> <div class="t-container"> <div class="t-col t-col_2 t013__centeredsection"> <img class="t013__img t-img"
src="https://thb.tildacdn.com/tild3139-6436-4365-b230-356366623863/-/empty/noroot.png" data-original="https://static.tildacdn.com/tild3139-6436-4365-b230-356366623863/noroot.png"
imgfield="img" data-tu-max-width="320" data-tu-max-height="320" data-tu-cover="c"
alt=""> <br> <div class="t013__autor-title t-descr" field="imgtitle">Иван Чувашов</div> <div class="t013__autor-descr t-descr" field="imgdescr">Больше 6 лет работает архитектором БД и DBA</div> </div> <div class="t-col t-col_8 t-prefix_2"> <div class="t013__text t-text t-text_md" field="text"> СУБД PostgreSQL работает с диском, оперативной памятью, процессором. Если выходит аппаратная часть оборудования, то идём и чиним. Но иногда бывают и скрытые проблемы, например сбой в дисковом массиве, который мы можем заметить не сразу, можем вообще не знать об этом. <br /><br /> Давайте воспроизведем проблему сбоя дисковой подсистемы, затем покажем её решение. У нас есть PostgreSQL – тринадцатая версия. Создадим базу и инициализируем <a href="https://postgrespro.ru/docs/postgresql/13/pgbench" style="">pgbench</a>. Она существует, чтобы нагружать сервер, снимать метрики производительности. Но нам она нужна для других целей.<br /></div> </div> </div> </div> </div> <div id="rec347574564" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild6161-6433-4938-a133-363331373138/image4.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild6161-6433-4938-a133-363331373138/-/empty/image4.png" data-original="https://static.tildacdn.com/tild6161-6433-4938-a133-363331373138/image4.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild6161-6433-4938-a133-363331373138/image4.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;text-align:left;" data-customstyle="yes">Рассмотрим таблицу pgbench_branches, в ней есть три поля и одна запись.<br /></div></div> </div> </div> </div> </div> <div id="rec347574889" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild3661-3539-4332-b238-346535396361/image7.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild3661-3539-4332-b238-346535396361/-/empty/image7.png" data-original="https://static.tildacdn.com/tild3661-3539-4332-b238-346535396361/image7.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild3661-3539-4332-b238-346535396361/image7.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;text-align:left;" data-customstyle="yes"> Найдем, где находится физически эта таблица на диске:<br /> <span style="color: rgb(102, 102, 102);">psql -p5432 -d test -c "select pg_relation_filepath('pgbench_branches')";</span><br /></div></div> </div> </div> </div> </div> <div id="rec347575185" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild6637-6566-4634-b638-616630616436/image6.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild6637-6566-4634-b638-616630616436/-/empty/image6.png" data-original="https://static.tildacdn.com/tild6637-6566-4634-b638-616630616436/image6.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild6637-6566-4634-b638-616630616436/image6.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;text-align:left;" data-customstyle="yes">Остановим кластер PostgreSQL. Откроем файл base/16839/16853 и допишем любой текст в середине файла. Сохраним его. <br /><br /> Можно воспользоваться просто командой:<br /><span style="color: rgb(102, 102, 102);">sed -i 's/@/@123@/' ~/13/main/base/16839/16853</span><br /></div></div> </div> </div> </div> </div> <div id="rec349450243" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild6163-6137-4365-a363-646430373931/image13.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild6163-6137-4365-a363-646430373931/-/empty/image13.png" data-original="https://static.tildacdn.com/tild6163-6137-4365-a363-646430373931/image13.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild6163-6137-4365-a363-646430373931/image13.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;text-align:left;" data-customstyle="yes">Запустим PostgreSQL. Попробуем прочитать данные из таблицы.<br /></div></div> </div> </div> </div> </div> <div id="rec349450262" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild3935-3337-4162-b734-666233313762/image2.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild3935-3337-4162-b734-666233313762/-/empty/image2.png" data-original="https://static.tildacdn.com/tild3935-3337-4162-b734-666233313762/image2.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild3935-3337-4162-b734-666233313762/image2.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;text-align:left;" data-customstyle="yes">В таблице также одна запись, но теперь в ней просто пустые строки.<br /><br />Мы знаем, что файл у нас поврежден, но при этом PostgreSQL об этом не знает, и это достаточно серьезная проблема, с которой можно встретится в PostgreSQL.<div style="font-size:18px;text-align:left;" data-customstyle="yes"></div></div></div> </div> </div> </div> </div> <div id="rec347575741" class="r t-rec t-rec_pt_0 t-rec_pb_0" style="padding-top:0px;padding-bottom:0px; " data-record-type="248"> <!-- T220 --> <div class="t220"> <div class="t-container "> <div class="t-col t-col_8 t-prefix_2"> <div class="t220__textwrapper" style="background-color:#f5f5f5;"> <div style=""> <div field="text" class="t220__text t-text t-text_md ">Как проблему можно решить? Если мы посмотрим: включена ли у нас контрольная сумма страниц данных в кластере, то мы увидим, что off. Когда PostgreSQL обращается к данным, он рассчитывает контрольную сумму данных страницы, сравнивая её с сохраненной в заголовке страницы, и если она не соответствует, то он выдаёт ошибку.<br /><br />Насколько это просаживает перформанс? Есть статистика, что – от одного до трёх процентов, но при этом вы точно знаете, что данные у вас повреждены или не повреждены. Это стоит того, чтобы включать контрольную сумму данных у себя. В девелоперской базе неважно. В препроде на ваше усмотрение. А в продовской обязательно должно быть включено.<br /></div> </div> </div> </div> </div> </div> </div> <div id="rec347575592" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="139"> <!-- T013 --> <div class="t013"> <div class="t-container"> <div class="t-col t-col_2 t013__centeredsection"> <img class="t013__img t-img"
src="https://thb.tildacdn.com/tild3139-6436-4365-b230-356366623863/-/empty/noroot.png" data-original="https://static.tildacdn.com/tild3139-6436-4365-b230-356366623863/noroot.png"
imgfield="img" data-tu-max-width="320" data-tu-max-height="320" data-tu-cover="c"
alt=""> <br> <div class="t013__autor-title t-descr" field="imgtitle">Иван Чувашов</div> <div class="t013__autor-descr t-descr" field="imgdescr">Поддерживает техническую инфраструктуру компании Окко (dev, preprod, prod) в части баз данных</div> </div> <div class="t-col t-col_8 t-prefix_2"> <div class="t013__text t-text t-text_md" field="text">В двенадцатой версии появилась хорошая утилита <span>pg_checksums</span>. Если раньше до двенадцатой версии вам приходилось создавать новый кластер уже с включенной контрольной суммой данных и в него переносить данные, то с двенадцатой версии можно выключить текущий сервер PostgreSQL и запустить эту утилиту, и она просмотрит все страницы и запишет в заголовках контрольные суммы данных.<br /><br />Спросите про прострой? Она настолько производительна, что будет упираться в ваш диск. Когда мы переводили кластер полтора-терабайтный во включенную контрольную сумму данных, у нас это заняло сорок минут.<br /></div> </div> </div> </div> </div> <div id="rec347579619" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild6461-6566-4135-b765-386231313632/image15.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild6461-6566-4135-b765-386231313632/-/empty/image15.png" data-original="https://static.tildacdn.com/tild6461-6566-4135-b765-386231313632/image15.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild6461-6566-4135-b765-386231313632/image15.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;text-align:left;" data-customstyle="yes">Проделаем ту же процедуру с повреждением данных, что и ранее.<div style="font-size:18px;" data-customstyle="yes"></div></div></div> </div> </div> </div> </div> <div id="rec349450451" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild3761-6434-4836-b336-366435613437/image16.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild3761-6434-4836-b336-366435613437/-/empty/image16.png" data-original="https://static.tildacdn.com/tild3761-6434-4836-b336-366435613437/image16.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild3761-6434-4836-b336-366435613437/image16.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;text-align:left;" data-customstyle="yes">И теперь если прочитаем данные из таблицы pgbench_branches увидим, что у нас появилась ошибка о несовпадении контрольных сумм.<div style="font-size:18px;text-align:left;" data-customstyle="yes"></div></div></div> </div> </div> </div> </div> <div id="rec349450456" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild3937-3539-4562-b237-666538636163/image17.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild3937-3539-4562-b237-666538636163/-/empty/image17.png" data-original="https://static.tildacdn.com/tild3937-3539-4562-b237-666538636163/image17.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild3937-3539-4562-b237-666538636163/image17.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;text-align:left;" data-customstyle="yes">Но если мы всё-таки хотим извлечь эти данные, то есть флаг <span style="color: rgb(102, 102, 102);">ignore_checksum_failure</span>. Когда мы его включаем, у нас выдаётся предупреждение, что контрольная сумма данных не совпадает, но запрос исполняется.<div style="font-size:18px;text-align:left;" data-customstyle="yes"></div></div></div> </div> </div> </div> </div> <div id="rec347579742" class="r t-rec t-rec_pt_0 t-rec_pb_0" style="padding-top:0px;padding-bottom:0px; " data-record-type="248"> <!-- T220 --> <div class="t220"> <div class="t-container "> <div class="t-col t-col_8 t-prefix_2"> <div class="t220__textwrapper" style="background-color:#f5f5f5;"> <div style=""> <div field="text" class="t220__text t-text t-text_md ">Часто приложения используют только оперативные данные. PostgreSQL не обращается к старым страницам данных. И если в них есть повреждения, то мы можем узнать об этом слишком поздно, когда в резервных копиях тоже будут содержаться они. <br /><br />Для проверки каталога данных можно воспользоваться командой <span style="color: rgb(102, 102, 102);">checkdb</span> в утилите <a href="https://github.com/postgrespro/pg_probackup" style="">pg_probackup</a>. Хотя данная утилита создана для создания/восстановления резервных копий, в ней есть дополнительный инструмент проверки рабочего каталога базы данных и целостности индексов.<br /></div> </div> </div> </div> </div> </div> </div> <div id="rec347579877" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="139"> <!-- T013 --> <div class="t013"> <div class="t-container"> <div class="t-col t-col_2 t013__centeredsection"> <img class="t013__img t-img"
src="https://thb.tildacdn.com/tild3139-6436-4365-b230-356366623863/-/empty/noroot.png" data-original="https://static.tildacdn.com/tild3139-6436-4365-b230-356366623863/noroot.png"
imgfield="img" data-tu-max-width="320" data-tu-max-height="320" data-tu-cover="c"
alt=""> <br> <div class="t013__autor-title t-descr" field="imgtitle">Иван Чувашов</div> <div class="t013__autor-descr t-descr" field="imgdescr">Строил отказоустойчивые кластеры на базе СУБД PostgreSQL и GreenPlum 6x;</div> </div> <div class="t-col t-col_8 t-prefix_2"> <div class="t013__text t-text t-text_md" field="text"><strong>Пример из жизни.</strong> Запросы шли в базу и некоторые их них повисали. На сутки, двое, трое. Потом пул запросов стало большим и они начал забирать всю оперативную память. <em>Приходил omm killer и убивал PostgreSQL.</em> <br /><br /> Контрольные суммы страниц не были включены на том кластере. Мы не предполагали, что данные повреждены (любые проверки утверждали, что каталог данных и индексы не содержит повреждений) и думали, что у нас сложный запрос, который пытается вытащить много данных, висит и занимает всю оперативную память (что являлось фантастическим предположением). <br /><br />Предполагали три варианта: <br /><ul><li>что-то с картой видимостью, </li><li>что-то с индексами на этой таблице,</li><li>что-то с данными в самой таблице.</li></ul> <br />Решили удалить индексы и посмотреть, что будет – как только мы это сделали у нас приложение перестало работать. Это был фейл – приложение не работало три часа. Но нам стало сразу ясно, где проблема. Индексы ссылали на данные, которых нет в БД (страница данных нулевого размера). <br /><br /> <strong>Как вышли из ситуации?</strong> Создали новую пустую таблицу и по блокам перетаскивали данные со старой таблицы в новую. Потом били блоки на меньшего размера и так до тех пор пока не выявили семнадцать битых строк, для которых были ссылки в других таблицах, но в целевой отсутствовали.<br /></div> </div> </div> </div> </div> <div id="rec349461333" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px;background-color:#d8b8e3; " data-record-type="165" data-bg-color="#d8b8e3"> <!-- T152 --> <div class="t152"> <div class="t-container_8"> <div class="t-row"> <div class="t152__col t-col t-col_2"> <img class="t152__img t-img"
src="https://thb.tildacdn.com/tild6332-3035-4534-b862-386665633364/-/empty/20210818_Postgresql-.png" data-original="https://static.tildacdn.com/tild6332-3035-4534-b862-386665633364/20210818_Postgresql-.png"
imgfield="img"
alt=""> </div> <div class="t152__col t-col t-col_6 t152__wrapper"> <div class="t152__textwrapper"> <div class="t152__autor-title t-name t-name_sm" field="title"><strong>ЕЩЁ</strong><br /><br /><strong>23–25 сентября 2021 года Иван проводит второй поток обучения продвинутого курса по PostgreSQL.</strong></div> <div class="t152__autor-descr t-descr" field="descr"><strong><u data-redactor-tag="u"></u>Посмотреть программу: <a href="https://slurm.club/3zk7PGq" style="color:#452052 !important;" target="_blank"><u>https://slurm.club/3zk7PGq</u></a>.</strong></div> </div> </div> </div> </div> </div> <style> #rec349461333 .t152__autor-title{color:#452052;}#rec349461333 .t152__autor-descr{color:#452052;}</style> </div> <div id="rec347579984" class="r t-rec t-rec_pt_45 t-rec_pb_15" style="padding-top:45px;padding-bottom:15px; " data-record-type="162"> <!-- T150 --> <div class="t150"> <div class="t150__linewrapper"> <hr
class="t150__line t-divider t-width t-width_10" data-divider-fieldset="color2,opacity"> </div> <div class="t150__cirwrapper"> <div class="t150__cir" field="title">3</div> </div> </div> </div> <div id="rec347592446" class="r t-rec t-rec_pt_15 t-rec_pb_15" style="padding-top:15px;padding-bottom:15px; " data-record-type="106"> <!-- T004 --> <div class="t004"> <div class="t-container "> <div class="t-col t-col_8 t-prefix_2"> <div field="text" class="t-text t-text_md ">Кейс разбит на три ситуации и они о предотвращении проблем, а не исправлении. <br /></div> </div> </div> </div> </div> <div id="rec349458647" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="260"> <!-- T231 --> <div class="t231"> <div class="t231__twrapper" style=""> <div class="t231__tcoll" style="border:3px solid #000000;"> <div class="t231__title" field="title" style="color:#000000;padding-top:15px;padding-bottom:15px;padding-left:30px;padding-right:30px;"> <b><strong data-redactor-tag="strong">Ситуация номер один</strong></b> </div> </div> </div> </div> </div> <div id="rec347592563" class="r t-rec t-rec_pt_15 t-rec_pb_15" style="padding-top:15px;padding-bottom:15px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild3062-6262-4332-a661-633536396335/image14.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild3062-6262-4332-a661-633536396335/-/empty/image14.png" data-original="https://static.tildacdn.com/tild3062-6262-4332-a661-633536396335/image14.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild3062-6262-4332-a661-633536396335/image14.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;" data-customstyle="yes"></div></div> </div> </div> </div> </div> <div id="rec347562155" class="r t-rec t-rec_pt_0 t-rec_pb_45" style="padding-top:0px;padding-bottom:45px;background-color:#ffffff; " data-record-type="222" data-bg-color="#ffffff"> <!-- T194 --> <div class="t194"> <div class="t-container"> <div class="t-col t-col_4 t-align_left" itemscope itemtype="http://schema.org/ImageObject"><meta itemprop="image" content="https://static.tildacdn.com/tild3536-3831-4261-a632-616136353062/postgre1_1.png"> <img class="t194__img t-width t-width_4 t-img"
src="https://thb.tildacdn.com/tild3536-3831-4261-a632-616136353062/-/empty/postgre1_1.png" data-original="https://static.tildacdn.com/tild3536-3831-4261-a632-616136353062/postgre1_1.png"
imgfield="img" data-tu-max-width="800" data-tu-max-height="800"
alt=""> <div class="t194__sectitle" field="imgtitle" itemprop="name"></div> <div class="t194__secdescr" field="imgdescr" itemprop="description"></div> </div> <div class="t-col t-col_8 "> <div class="t194__text t-text t-text_md" field="text">У нас есть три таблички: заказы, продукты и таблица, которая связывает многие ко многим. В какой-то момент времени бизнес решил, что нужно сравнивать значения в одно регистре (обратите внимание на тип у колонки id в таблице orders). Можно со стороны приложения переводить все данные к нижнему или верхнему регистру и делать сравнение в запросе. Но можно воспользоваться встроенным типом данных <a href="https://postgrespro.ru/docs/postgresql/13/citext" style="">citext</a>. Рассмотрим, как разработчики решили переходить на новый тип данных.<br /></div> </div> </div> </div> </div> <div id="rec347593079" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="139"> <!-- T013 --> <div class="t013"> <div class="t-container"> <div class="t-col t-col_2 t013__centeredsection"> <img class="t013__img t-img"
src="https://thb.tildacdn.com/tild3139-6436-4365-b230-356366623863/-/empty/noroot.png" data-original="https://static.tildacdn.com/tild3139-6436-4365-b230-356366623863/noroot.png"
imgfield="img" data-tu-max-width="320" data-tu-max-height="320" data-tu-cover="c"
alt=""> <br> <div class="t013__autor-title t-descr" field="imgtitle">Иван Чувашов</div> <div class="t013__autor-descr t-descr" field="imgdescr">Регулярно выступает на IT-конференциях</div> </div> <div class="t-col t-col_8 t-prefix_2"> <div class="t013__text t-text t-text_md" field="text">Первая команда у нас создаст эксклюзивную блокировку, которая дропнет constraint. Достаточно быстрая операция. Вторая – по изменению типа, он относится к одному виду типов, поэтому быстрее заменится, проблем с этим не будет. Далее меняем тип на связные таблицах и пытаемся создать constraint. <br /><br /> Что у нас получается – эксклюзивная блокировка на две таблицы product orders и orders, чтобы данные не изменялись. И это будет выполняться в одном потоке. Когда у нас 100-200 записей, то проблем нет – это доли секунды. Если записей стало больше, миллионы, тогда эти внешний ключ будет накатываться очень долго. <br /><br /> Разработчики выкатывают релиз, и у нас останавливается сервис. Моя была ошибка, что пропустил этот pull request. Разобрались, срубили запрос. Ночью мы остановили сервис бэкенда, накатили sql-скрипты. <br /><br /> Какие еще есть варианты решения? Можно воспользоваться конструкцией:<br /> <span style="color: rgb(102, 102, 102);">ADD CONSTRAINT ... NOT VALID<br /> VALIDATE CONSTRAINT</span><br /> В этом случае будут наложены более легкие блокировки.<br /></div> </div> </div> </div> </div> <div id="rec347593193" class="r t-rec t-rec_pt_0 t-rec_pb_0" style="padding-top:0px;padding-bottom:0px; " data-record-type="248"> <!-- T220 --> <div class="t220"> <div class="t-container "> <div class="t-col t-col_8 t-prefix_2"> <div class="t220__textwrapper" style="background-color:#f5f5f5;"> <div style=""> <div field="text" class="t220__text t-text t-text_md ">Вариант 2, более специфичный, но рабочий. С десятой версии Postgres появилась логическая репликация <span style="color: rgb(102, 102, 102);">product_orders в product_orders_replic</span>, в которой уже есть внешний ключ <span style="color: rgb(102, 102, 102);">product_orders_product_id_fkey</span>. Когда мы скопировали все данные, мы взяли и поменяли таблички: product_orders -> product_orders_tmp, product_orders_replic -> product_orders. Это можно делать всё в одной транзакции, и будет достаточно быстро.<br /></div> </div> </div> </div> </div> </div> </div> <div id="rec349459011" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="260"> <!-- T231 --> <div class="t231"> <div class="t231__twrapper" style=""> <div class="t231__tcoll" style="border:3px solid #000000;"> <div class="t231__title" field="title" style="color:#000000;padding-top:15px;padding-bottom:15px;padding-left:30px;padding-right:30px;"> <b><strong data-redactor-tag="strong"><strong>Ситуация номер два, из жизни</strong></strong></b> </div> </div> </div> </div> </div> <div id="rec347593456" class="r t-rec t-rec_pt_45 t-rec_pb_0" style="padding-top:45px;padding-bottom:0px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild3661-3039-4138-b838-363964663438/image12.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild3661-3039-4138-b838-363964663438/-/empty/image12.png" data-original="https://static.tildacdn.com/tild3661-3039-4138-b838-363964663438/image12.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild3661-3039-4138-b838-363964663438/image12.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;" data-customstyle="yes"></div></div> </div> </div> </div> </div> <div id="rec347594179" class="r t-rec t-rec_pt_0 t-rec_pb_45" style="padding-top:0px;padding-bottom:45px; " data-record-type="139"> <!-- T013 --> <div class="t013"> <div class="t-container"> <div class="t-col t-col_2 t013__centeredsection"> <img class="t013__img t-img"
src="https://thb.tildacdn.com/tild3139-6436-4365-b230-356366623863/-/empty/noroot.png" data-original="https://static.tildacdn.com/tild3139-6436-4365-b230-356366623863/noroot.png"
imgfield="img" data-tu-max-width="320" data-tu-max-height="320" data-tu-cover="c"
alt=""> <br> <div class="t013__autor-title t-descr" field="imgtitle">Иван Чувашов</div> <div class="t013__autor-descr t-descr" field="imgdescr">Спикер курса по PostgeSQL</div> </div> <div class="t-col t-col_8 t-prefix_2"> <div class="t013__text t-text t-text_md" field="text">Представим, что есть таблички folders и folder_files. Мы хотим пробежаться по всем подпапкам и вытаскивать файлы, которые там есть. Когда у нас десятки-сотни тысяч записей, то проблем нет. Но когда появляются десятки миллионов записей, то тут нужно искать другие способы раскрутки дерева.<br /><br /> Но у нас был простой рекурсивный цикл. Что произошло? По каким-то причинам оптимизатор решил не использовать индекс, а делать полное сканирование таблицы folders. На каждом шаге создавать временные файлы большого размера на диске. Что привело к остановке базы данных из-за отсутствия места.<br /></div> </div> </div> </div> </div> <div id="rec349451819" class="r t-rec t-rec_pt_0 t-rec_pb_0" style="padding-top:0px;padding-bottom:0px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild3736-3162-4733-a530-653566633039/image10.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild3736-3162-4733-a530-653566633039/-/empty/image10.png" data-original="https://static.tildacdn.com/tild3736-3162-4733-a530-653566633039/image10.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild3736-3162-4733-a530-653566633039/image10.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;text-align:left;" data-customstyle="yes"></div></div> </div> </div> </div> </div> <div id="rec349455405" class="r t-rec t-rec_pt_0 t-rec_pb_0" style="padding-top:0px;padding-bottom:0px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild3938-3939-4239-b261-643164643231/image3.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild3938-3939-4239-b261-643164643231/-/empty/image3.png" data-original="https://static.tildacdn.com/tild3938-3939-4239-b261-643164643231/image3.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild3938-3939-4239-b261-643164643231/image3.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;text-align:left;" data-customstyle="yes"> Было выбрано решение – разделить запрос на два:<br /> <ul> <li> отдельно рекурсивное cte, ограничив его по уровню вложенности;</li><li>отдельно маппинг результата cte с данными.</li> </ul> Тут можно предложить много способов оптимизации. Например, если дерево не меняется, то использовать не рекурсию, а вложенные интервалы. Но я не видел такой практической реализации.<br /></div></div> </div> </div> </div> </div> <div id="rec349459246" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="260"> <!-- T231 --> <div class="t231"> <div class="t231__twrapper" style=""> <div class="t231__tcoll" style="border:3px solid #000000;"> <div class="t231__title" field="title" style="color:#000000;padding-top:15px;padding-bottom:15px;padding-left:30px;padding-right:30px;"> <b><strong data-redactor-tag="strong"><strong><strong data-redactor-tag="strong">Ситуация три – немного о другом</strong></strong></strong></b> </div> </div> </div> </div> </div> <div id="rec349451939" class="r t-rec t-rec_pt_15 t-rec_pb_0" style="padding-top:15px;padding-bottom:0px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild3436-6262-4134-b230-643734386263/image11.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild3436-6262-4134-b230-643734386263/-/empty/image11.png" data-original="https://static.tildacdn.com/tild3436-6262-4134-b230-643734386263/image11.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild3436-6262-4134-b230-643734386263/image11.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;" data-customstyle="yes"></div></div> </div> </div> </div> </div> <div id="rec349452092" class="r t-rec t-rec_pt_0 t-rec_pb_45" style="padding-top:0px;padding-bottom:45px; " data-record-type="139"> <!-- T013 --> <div class="t013"> <div class="t-container"> <div class="t-col t-col_2 t013__centeredsection"> <img class="t013__img t-img"
src="https://thb.tildacdn.com/tild3139-6436-4365-b230-356366623863/-/empty/noroot.png" data-original="https://static.tildacdn.com/tild3139-6436-4365-b230-356366623863/noroot.png"
imgfield="img" data-tu-max-width="320" data-tu-max-height="320" data-tu-cover="c"
alt=""> <br> <div class="t013__autor-title t-descr" field="imgtitle">Иван Чувашов</div> <div class="t013__autor-descr t-descr" field="imgdescr">Ведущий инженер Okko</div> </div> <div class="t-col t-col_8 t-prefix_2"> <div class="t013__text t-text t-text_md" field="text">Производительность базы данных сильно снизилась, что привело к деградации приложения. Анализ мониторинга железа не показывал явных проблем с производительность.<br /><br />Загрузка CPU доходит до полтинника. Проблемы наблюдаются достаточно давно. Нагрузка 50% – это не критично. Нагрузка по диску каких-то 400 ops.<br /></div> </div> </div> </div> </div> <div id="rec349452002" class="r t-rec t-rec_pt_0 t-rec_pb_45" style="padding-top:0px;padding-bottom:45px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild6330-3430-4063-b734-353335326266/image8.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild6330-3430-4063-b734-353335326266/-/empty/image8.png" data-original="https://static.tildacdn.com/tild6330-3430-4063-b734-353335326266/image8.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild6330-3430-4063-b734-353335326266/image8.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;" data-customstyle="yes">Пик в районе трёх часов не относится к данной ситуации<div style="font-size:18px;" data-customstyle="yes"></div></div></div> </div> </div> </div> </div> <div id="rec349452009" class="r t-rec t-rec_pt_0 t-rec_pb_45" style="padding-top:0px;padding-bottom:45px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild3130-6133-4335-a633-396665636137/image9.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild3130-6133-4335-a633-396665636137/-/empty/image9.png" data-original="https://static.tildacdn.com/tild3130-6133-4335-a633-396665636137/image9.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild3130-6133-4335-a633-396665636137/image9.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;text-align:left;" data-customstyle="yes"> Смотрим логи, а там постоянно такие записи.<br />Ставка 62 секунды. Копаем дальше, смотрим различные метрики. И видим, что в таблице items отсутствуют первичный ключ. При вставке данных в таблицу history из-за внешнего ключа проверялось наличие записи в таблице items. Починили.<br /><div style="font-size:18px;" data-customstyle="yes"></div></div></div> </div> </div> </div> </div> <div id="rec349452028" class="r t-rec t-rec_pt_0 t-rec_pb_0" style="padding-top:0px;padding-bottom:0px; " data-record-type="3"> <!-- T107 --> <div class="t107"> <div class="t-align_center" itemscope itemtype="http://schema.org/ImageObject"> <meta itemprop="image" content="https://static.tildacdn.com/tild6333-6365-4436-b465-363664386662/image1.png"> <img class="t-img t-width t107__width t-width_10"
src="https://thb.tildacdn.com/tild6333-6365-4436-b465-363664386662/-/empty/image1.png" data-original="https://static.tildacdn.com/tild6333-6365-4436-b465-363664386662/image1.png"
imgfield="img" data-zoomable="yes" data-img-zoom-url="https://static.tildacdn.com/tild6333-6365-4436-b465-363664386662/image1.png" alt=""> <div class="t-container_8"> <div class="t-col t-col_8 t107__title t-text" field="title" itemprop="name"><div style="font-size:18px;text-align:left;" data-customstyle="yes">Проблему не решило. Копаем дальше, смотрим представление <span style="color: rgb(102, 102, 102);">pg_statio_all_tables</span> и раскрываем всю суть.<br /><div style="font-size:18px;" data-customstyle="yes"></div></div></div> </div> </div> </div> </div> <div id="rec349452086" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px; " data-record-type="139"> <!-- T013 --> <div class="t013"> <div class="t-container"> <div class="t-col t-col_2 t013__centeredsection"> <img class="t013__img t-img"
src="https://thb.tildacdn.com/tild3139-6436-4365-b230-356366623863/-/empty/noroot.png" data-original="https://static.tildacdn.com/tild3139-6436-4365-b230-356366623863/noroot.png"
imgfield="img" data-tu-max-width="320" data-tu-max-height="320" data-tu-cover="c"
alt=""> <br> <div class="t013__autor-title t-descr" field="imgtitle">Иван Чувашов</div> <div class="t013__autor-descr t-descr" field="imgdescr">DBA Southbridge</div> </div> <div class="t-col t-col_8 t-prefix_2"> <div class="t013__text t-text t-text_md" field="text">Запрос <span style="color: rgb(102, 102, 102);">select * from pg_statio_all_tables</span> показывает кто генерит большую нагрузку на диск. Первая строчка <span style="color: rgb(102, 102, 102);">history_text_default</span>. В дефолтовую секцию ничего не должно писаться, но именно она создает нагрузку на диск. А количество чтений с диска на три порядка больше, чем в позиции на втором месте. Дефолтовая секция, большое количество чтений с диска – и мы понимаем, что перестало работать секционирование таблицы <span style="color: rgb(102, 102, 102);">history_text</span>. <br /><br />Мы использовали расширение <span style="color: rgb(102, 102, 102);">pg_partman</span>, пересобрали табличку <span style="color: rgb(102, 102, 102);">history_text</span>. По ссылке можно найти, как мы это сделали: <a href="https://github.com/Doctorbal/zabbix-postgres-partitioning#zabbiz-history-and-trends-tables">https://github.com/Doctorbal/zabbix-postgres-partitioning#zabbiz-history-and-trends-tables</a>.<br /><br /> Как только мы устранили проблему, деградация системы прекратилась и приложение заработало.<br /></div> </div> </div> </div> </div> <div id="rec349462290" class="r t-rec t-rec_pt_45 t-rec_pb_45" style="padding-top:45px;padding-bottom:45px;background-color:#d8b8e3; " data-record-type="165" data-bg-color="#d8b8e3"> <!-- T152 --> <div class="t152"> <div class="t-container_8"> <div class="t-row"> <div class="t152__col t-col t-col_2"> <img class="t152__img t-img"
src="https://thb.tildacdn.com/tild6332-3035-4534-b862-386665633364/-/empty/20210818_Postgresql-.png" data-original="https://static.tildacdn.com/tild6332-3035-4534-b862-386665633364/20210818_Postgresql-.png"
imgfield="img"
alt=""> </div> <div class="t152__col t-col t-col_6 t152__wrapper"> <div class="t152__textwrapper"> <div class="t152__autor-title t-name t-name_sm" field="title"><b>Надеемся, что кейсы были полезны.<br /><br /></b><strong></strong></div> <div class="t152__autor-descr t-descr" field="descr"><strong>А вот, что ждёт инженеров, которые пройдут продвинутый курс Ивана по PostgreSQL:<br /></strong><br />— Научитесь оценивать состояние кластера в критический момент, принимать быстрые и эффективные решения по обеспечению работоспособности кластера.<br /><br />— Узнаете, как внедрить новое оптимальное архитектурное решение в своей команде, а также сможете лидировать этот процесс.— сэкономите компании время и деньги путем оптимизации процессов администрирования.<br /><br />— Поймете, как действовать в случае критических ситуаций с базой данных PostgreSQL и будете знать, где и с помощью какого алгоритма искать проблему.<br /> <strong><br />Это всё тоже написано на странице курса, а ещё там есть программа и немного о формате обучения: <a href="https://slurm.club/3zk7PGq" style="color:#452052 !important;" target="_blank"><u>https://slurm.club/3zk7PGq</u></a>.</strong></div> </div> </div> </div> </div> </div> <style> #rec349462290 .t152__autor-title{color:#452052;}#rec349462290 .t152__autor-descr{color:#452052;}</style> </div> <div id="rec347562175" class="r t-rec" style=" " data-animationappear="off" data-record-type="131"> <!-- T123 --> <div class="t123"> <div class="t-container_100 "> <div class="t-width t-width_100 "> <!-- nominify begin --> <style>
.shadow {
text-shadow: 0px 2px 2px rgba(0,0,0, .3);
}
</style> <!-- nominify end --> </div> </div> </div> </div> <!--footer--> <footer id="t-footer" class="t-records" data-hook="blocks-collection-content-node" data-tilda-project-id="705564" data-tilda-page-id="13176281" data-tilda-page-alias="footer" data-tilda-formskey="59b517bfad01153865a4875be1bdd366" data-tilda-stat-scroll="yes" data-tilda-lazy="yes" data-tilda-root-zone="com" data-tilda-project-headcode="yes" data-tilda-ts="y" data-tilda-project-country="RU"> <div id="rec1684307921" class="r t-rec" style=" " data-animationappear="off" data-record-type="131"> <!-- T123 --> <div class="t123"> <div class="t-container_100 "> <div class="t-width t-width_100 "> <!-- nominify begin --> <script>
$('.example-3 .tn-atom').on('click', function () {
var $temp = $('<input>');
$('body').append($temp);
$temp.val($(this).text()).select();
document.execCommand('copy');
$temp.remove();
$(this).text('Скопирован!');
});
</script> <style>
.example-3 { cursor: pointer; }
</style> <!-- nominify end --> </div> </div> </div> </div> <div id="rec480081308" class="r t-rec uc-cookie-block" style=" " data-animationappear="off" data-record-type="121" data-alias-record-type="886"> <!-- T886 --> <div class="t886 t886_closed" data-storage-item="t886cookiename_705564" style=""> <div class="t886__wrapper" style="background-color:#ffffff; width:800px;"> <div class="t886__text t-text t-text_xs t-valign_middle" field="text">На сайте мы используем cookie. Без них несладко.</div> <div
class="t-btn t-btnflex t-btnflex_type_button t-btnflex_sm t886__btn"
type="button"><span class="t-btnflex__text">Хорошо</span> <style>#rec480081308 .t-btnflex.t-btnflex_type_button {color:#ffffff;background-color:#000000;--border-width:0px;border-style:none !important;border-radius:5px;box-shadow:none !important;font-weight:400;transition-duration:0.2s;transition-property:background-color,color,border-color,box-shadow,opacity,transform,gap;transition-timing-function:ease-in-out;}@media (hover:hover) {#rec480081308 .t-btnflex.t-btnflex_type_button:not(.t-animate_no-hover):hover {color:#ffffff !important;background-color:#170f63 !important;}#rec480081308 .t-btnflex.t-btnflex_type_button:not(.t-animate_no-hover):focus-visible {color:#ffffff !important;background-color:#170f63 !important;}}</style></div> </div> </div> <script type="text/javascript">t_onReady(function() {t_onFuncLoad('t886_init',function() {t886_init('480081308');});});</script> <style>#rec480081308 .t886__text{text-align:left;}</style> <style> #rec480081308 .t886__text{font-size:14px;line-height:1;color:#000000;}</style> <style> #rec480081308 .t886__wrapper{border-radius:5px;}</style> </div> <div id="rec495453579" class="r t-rec uc-footer--type0" style=" " data-animationappear="off" data-record-type="121" data-alias-record-type="396"> <!-- T396 --> <style>#rec495453579 .t396__artboard {height:847px;background-color:#ffffff;}#rec495453579 .t396__filter {height:847px;}#rec495453579 .t396__carrier{height:847px;background-position:center center;background-attachment:scroll;background-size:cover;background-repeat:no-repeat;}@media screen and (max-width:1199px) {#rec495453579 .t396__artboard,#rec495453579 .t396__filter,#rec495453579 .t396__carrier {height:840px;}#rec495453579 .t396__filter {}#rec495453579 .t396__carrier {background-attachment:scroll;}}@media screen and (max-width:959px) {#rec495453579 .t396__artboard,#rec495453579 .t396__filter,#rec495453579 .t396__carrier {height:1196px;}#rec495453579 .t396__filter {}#rec495453579 .t396__carrier {background-attachment:scroll;}}@media screen and (max-width:639px) {#rec495453579 .t396__artboard,#rec495453579 .t396__filter,#rec495453579 .t396__carrier {height:1513px;}#rec495453579 .t396__filter {}#rec495453579 .t396__carrier {background-attachment:scroll;}}@media screen and (max-width:479px) {#rec495453579 .t396__artboard,#rec495453579 .t396__filter,#rec495453579 .t396__carrier {height:1536px;}#rec495453579 .t396__filter {}#rec495453579 .t396__carrier {background-attachment:scroll;}}#rec495453579 .tn-elem[data-elem-id="1712236782477"]{z-index:3;top:74px;;left:calc(50% - 600px + 20px);;width:105px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1712236782477"] .tn-atom{border-radius:0px 0px 0px 0px;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;}#rec495453579 .tn-elem[data-elem-id="1712236782477"] .tn-atom__img{border-radius:0px 0px 0px 0px;object-position:center center;}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1712236782477"]{display:table;left:calc(50% - 480px + 36px);;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1712236782477"]{display:table;top:61px;;left:calc(50% - 320px + 24px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1712236782477"]{display:table;top:40pxpx;;left:calc(50% - 240px + 15px);;width:105px;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1712236782477"]{display:table;top:36px;;left:calc(50% - 160px + 7px);;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1712235605947"]{z-index:3;top:74px;;left:calc(50% - 600px + 20px);;width:105px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1712235605947"] .tn-atom{border-radius:0px 0px 0px 0px;opacity:0;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;}#rec495453579 .tn-elem[data-elem-id="1712235605947"] .tn-atom__img{border-radius:0px 0px 0px 0px;object-position:center center;}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1712235605947"]{display:table;left:calc(50% - 480px + 36px);;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1712235605947"]{display:table;top:61px;;left:calc(50% - 320px + 24px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1712235605947"]{display:table;top:40px;;left:calc(50% - 240px + 15px);;width:105px;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1712235605947"]{display:table;top:36px;;left:calc(50% - 160px + 7px);;height:auto;}#rec495453579 .tn-elem[data-elem-id="1712235605947"] .tn-atom{background-size:cover;opacity:0;}}#rec495453579 .tn-elem[data-elem-id="1692506348245"]{z-index:3;top:58px;;left:calc(50% - 600px + 820px);;width:120px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1692506348245"] .tn-atom{border-radius:0px 0px 0px 0px;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;}#rec495453579 .tn-elem[data-elem-id="1692506348245"] .tn-atom__img{border-radius:0px 0px 0px 0px;object-position:center center;}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1692506348245"]{display:table;left:calc(50% - 480px + 640px);;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1692506348245"]{display:table;top:755px;;left:calc(50% - 320px + 24px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1692506348245"]{display:table;top:835px;;left:calc(50% - 240px + 20px);;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1692506348245"]{display:table;top:863px;;left:calc(50% - 160px + 10px);;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1692506631214"]{z-index:3;top:58px;;left:calc(50% - 600px + 820px);;width:120px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1692506631214"] .tn-atom{border-radius:0px 0px 0px 0px;opacity:0;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;}#rec495453579 .tn-elem[data-elem-id="1692506631214"] .tn-atom__img{border-radius:0px 0px 0px 0px;object-position:center center;}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1692506631214"]{display:table;left:calc(50% - 480px + 640px);;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1692506631214"]{display:table;top:757px;;left:calc(50% - 320px + 24px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1692506631214"]{display:table;top:845px;;left:calc(50% - 240px + 20px);;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1692506631214"]{display:table;top:873px;;left:calc(50% - 160px + 10px);;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660327289504"]{color:#8999a9;z-index:3;top:121px;;left:calc(50% - 600px + 20px);;width:360px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327289504"] .tn-atom{vertical-align:middle;color:#8999a9;font-size:18px;font-family:var(--t-text-font,Arial);line-height:1.33;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660327289504"]{display:table;left:calc(50% - 480px + 32px);;width:288px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660327289504"]{display:table;top:68px;;left:calc(50% - 320px + 153px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660327289504"]{display:table;top:81px;;left:calc(50% - 240px + 20px);;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660327289504"]{display:table;left:calc(50% - 160px + 10px);;width:300px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327289504"] .tn-atom{font-size:16px;line-height:1.5;background-size:cover;}}#rec495453579 .tn-elem[data-elem-id="1660327420094"]{color:#172b4d;z-index:3;top:185px;;left:calc(50% - 600px + 14px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327420094"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:24px;font-family:var(--t-text-font,Arial);line-height:1.08;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660327420094"]{display:table;left:calc(50% - 480px + 27px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660327420094"]{display:table;top:124px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660327420094"]{display:table;left:calc(50% - 240px + 15px);;width:440px;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660327420094"]{display:table;left:calc(50% - 160px + 5px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660327526179"]{color:#172b4d;z-index:3;top:223px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327526179"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:24px;font-family:var(--t-text-font,Arial);line-height:1.08;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660327526179"]{display:table;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660327526179"]{display:table;top:162px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660327526179"]{display:table;left:calc(50% - 240px + 16px);;width:440px;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660327526179"]{display:table;left:calc(50% - 160px + 6px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660328247771"]{color:#172b4d;z-index:3;top:547px;;left:calc(50% - 600px + 419px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328247771"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328247771"]{display:table;top:557px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328247771"]{display:table;top:532px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328247771"]{display:table;top:622px;;left:calc(50% - 240px + 16px);;width:440px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328247771"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328247771"]{display:table;top:614px;;left:calc(50% - 160px + 6px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660328067115"]{color:#172b4d;z-index:3;top:217px;;left:calc(50% - 600px + 419px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328067115"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328067115"]{display:table;top:219px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328067115"]{display:table;top:158px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328067115"]{display:table;top:258px;;left:calc(50% - 240px + 244px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328067115"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328067115"]{display:table;top:258px;;left:calc(50% - 160px + 166px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660328673693"]{color:#172b4d;z-index:3;top:229px;;left:calc(50% - 600px + 816px);;width:360px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328673693"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328673693"]{display:table;top:229px;;left:calc(50% - 480px + 636px);;width:288px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328673693"]{display:table;top:874px;;left:calc(50% - 320px + 20px);;width:256px;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328673693"]{display:table;top:1008px;;left:calc(50% - 240px + 20px);;width:440px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328673693"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328673693"]{display:table;top:1017px;;left:calc(50% - 160px + 9px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660327820270"]{color:#172b4d;z-index:3;top:305px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327820270"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660327820270"]{display:table;top:315px;;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660327820270"]{display:table;top:246px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660327820270"]{display:table;top:258px;;left:calc(50% - 240px + 16px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327820270"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660327820270"]{display:table;left:calc(50% - 160px + 6px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660728009618"]{color:#172b4d;z-index:3;top:273px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660728009618"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660728009618"]{display:table;top:281px;;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660728009618"]{display:table;top:212px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660728009618"]{display:table;top:220px;;left:calc(50% - 240px + 16px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660728009618"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660728009618"]{display:table;left:calc(50% - 160px + 6px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660728533851"]{color:#ff8888;z-index:3;top:274px;;left:calc(50% - 600px + 8px);;width:9px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660728533851"] .tn-atom{vertical-align:middle;color:#ff8888;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660728533851"]{display:table;top:283px;;left:calc(50% - 480px + 20px);;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660728533851"]{display:table;top:211px;;left:calc(50% - 320px + 10px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660728533851"]{display:table;top:222px;;left:calc(50% - 240px + 8px);;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660728533851"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660728533851"]{display:table;top:218px;;left:calc(50% - 160px + 0px);;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660328247775"]{color:#172b4d;z-index:3;top:579px;;left:calc(50% - 600px + 419px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328247775"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328247775"]{display:table;top:591px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328247775"]{display:table;top:566px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328247775"]{display:table;top:660px;;left:calc(50% - 240px + 16px);;width:440px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328247775"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328247775"]{display:table;top:652px;;left:calc(50% - 160px + 6px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660328067118"]{color:#172b4d;z-index:3;top:185px;;left:calc(50% - 600px + 419px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328067118"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328067118"]{display:table;top:185px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328067118"]{display:table;top:124px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328067118"]{display:table;top:220px;;left:calc(50% - 240px + 244px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328067118"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328067118"]{display:table;top:220px;;left:calc(50% - 160px + 166px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660328247777"]{color:#172b4d;z-index:3;top:611px;;left:calc(50% - 600px + 419px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328247777"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328247777"]{display:table;top:625px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328247777"]{display:table;top:600px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328247777"]{display:table;top:698px;;left:calc(50% - 240px + 16px);;width:440px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328247777"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328247777"]{display:table;top:690px;;left:calc(50% - 160px + 6px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660328067120"]{color:#172b4d;z-index:3;top:249px;;left:calc(50% - 600px + 419px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328067120"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328067120"]{display:table;top:253px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328067120"]{display:table;top:192px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328067120"]{display:table;top:296px;;left:calc(50% - 240px + 244px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328067120"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328067120"]{display:table;top:296px;;left:calc(50% - 160px + 166px);;width:140px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328067120"] .tn-atom{line-height:1.2;background-size:cover;}}#rec495453579 .tn-elem[data-elem-id="1660327823456"]{color:#172b4d;z-index:3;top:337px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327823456"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660327823456"]{display:table;top:349px;;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660327823456"]{display:table;top:280px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660327823456"]{display:table;top:296px;;left:calc(50% - 240px + 16px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327823456"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660327823456"]{display:table;left:calc(50% - 160px + 6px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660328067122"]{color:#172b4d;z-index:3;top:281px;;left:calc(50% - 600px + 419px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328067122"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328067122"]{display:table;top:287px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328067122"]{display:table;top:226px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328067122"]{display:table;top:334px;;left:calc(50% - 240px + 244px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328067122"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328067122"]{display:table;top:344px;;left:calc(50% - 160px + 166px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1664355590156"]{color:#172b4d;z-index:3;top:313px;;left:calc(50% - 600px + 419px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1664355590156"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1664355590156"]{display:table;top:321px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1664355590156"]{display:table;top:260px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1664355590156"]{display:table;top:372px;;left:calc(50% - 240px + 244px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1664355590156"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1664355590156"]{display:table;top:382px;;left:calc(50% - 160px + 166px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1738909171549"]{color:#172b4d;z-index:3;top:345px;;left:calc(50% - 600px + 419px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1738909171549"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1738909171549"]{display:table;top:355px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1738909171549"]{display:table;top:294px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1738909171549"]{display:table;top:410px;;left:calc(50% - 240px + 244px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1738909171549"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1738909171549"]{display:table;top:420px;;left:calc(50% - 160px + 166px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660328170303"]{color:#8999a9;z-index:3;top:503px;;left:calc(50% - 600px + 419px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328170303"] .tn-atom{vertical-align:middle;color:#8999a9;font-size:18px;font-family:var(--t-text-font,Arial);line-height:1.33;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328170303"]{display:table;top:513px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328170303"]{display:table;top:488px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328170303"]{display:table;top:578px;;left:calc(50% - 240px + 16px);;width:440px;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328170303"]{display:table;top:570px;;left:calc(50% - 160px + 9px);;width:300px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328170303"] .tn-atom{font-size:16px;line-height:1.5;background-size:cover;}}#rec495453579 .tn-elem[data-elem-id="1660328581896"]{color:#8999a9;z-index:3;top:185px;;left:calc(50% - 600px + 820px);;width:360px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328581896"] .tn-atom{vertical-align:middle;color:#8999a9;font-size:18px;font-family:var(--t-text-font,Arial);line-height:1.33;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328581896"]{display:table;left:calc(50% - 480px + 640px);;width:288px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328581896"]{display:table;top:830px;;left:calc(50% - 320px + 24px);;width:288px;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328581896"]{display:table;top:964px;;left:calc(50% - 240px + 20px);;width:440px;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328581896"]{display:table;top:973px;;left:calc(50% - 160px + 12px);;width:300px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328581896"] .tn-atom{font-size:16px;line-height:1.5;background-size:cover;}}#rec495453579 .tn-elem[data-elem-id="1660328396738"]{color:#8999a9;z-index:3;top:736px;;left:calc(50% - 600px + 20px);;width:360px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328396738"] .tn-atom{vertical-align:middle;color:#8999a9;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328396738"]{display:table;top:765px;;left:calc(50% - 480px + 32px);;width:288px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328396738"]{display:table;top:1125px;;left:calc(50% - 320px + 24px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328396738"]{display:table;top:1435px;;left:calc(50% - 240px + 23px);;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328396738"]{display:table;top:1428px;;left:calc(50% - 160px + 9px);;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660327824923"]{color:#172b4d;z-index:3;top:401px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327824923"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660327824923"]{display:table;top:417px;;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660327824923"]{display:table;top:348px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660327824923"]{display:table;top:372px;;left:calc(50% - 240px + 16px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327824923"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660327824923"]{display:table;left:calc(50% - 160px + 6px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660327826356"]{color:#172b4d;z-index:3;top:369px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327826356"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660327826356"]{display:table;top:383px;;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660327826356"]{display:table;top:314px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660327826356"]{display:table;top:334px;;left:calc(50% - 240px + 16px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327826356"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660327826356"]{display:table;left:calc(50% - 160px + 6px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660327833780"]{color:#172b4d;z-index:3;top:433px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327833780"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660327833780"]{display:table;top:451px;;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660327833780"]{display:table;top:382px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660327833780"]{display:table;top:410px;;left:calc(50% - 240px + 16px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327833780"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660327833780"]{display:table;left:calc(50% - 160px + 6px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660327835132"]{color:#172b4d;z-index:3;top:497px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327835132"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660327835132"]{display:table;top:519px;;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660327835132"]{display:table;top:450px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660327835132"]{display:table;top:486px;;left:calc(50% - 240px + 16px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327835132"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660327835132"]{display:table;left:calc(50% - 160px + 6px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1695983077804"]{color:#172b4d;z-index:3;top:586px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1695983077804"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1695983077804"]{display:table;top:619px;;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1695983077804"]{display:table;top:590px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1695983077804"]{display:table;top:1265px;;left:calc(50% - 240px + 19px);;width:440px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1695983077804"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1695983077804"]{display:table;top:1268px;;left:calc(50% - 160px + 9px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660328020471"]{color:#172b4d;z-index:3;top:618px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328020471"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328020471"]{display:table;top:653px;;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328020471"]{display:table;top:624px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328020471"]{display:table;top:1303px;;left:calc(50% - 240px + 19px);;width:440px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328020471"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328020471"]{display:table;top:1306px;;left:calc(50% - 160px + 9px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1660327366231"]{color:#8999a9;z-index:3;top:121px;;left:calc(50% - 600px + 820px);;width:360px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327366231"] .tn-atom{vertical-align:middle;color:#8999a9;font-size:18px;font-family:var(--t-text-font,Arial);line-height:1.33;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660327366231"]{display:table;left:calc(50% - 480px + 640px);;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327366231"] .tn-atom{background-size:cover;opacity:1;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660327366231"]{display:table;top:784px;;left:calc(50% - 320px + 168px);;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327366231"] .tn-atom{background-size:cover;opacity:1;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660327366231"]{display:table;top:908px;;left:calc(50% - 240px + 20px);;width:440px;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660327366231"]{display:table;top:925px;;left:calc(50% - 160px + 10px);;width:300px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660327366231"] .tn-atom{font-size:16px;line-height:1.5;background-size:cover;}}#rec495453579 .tn-elem[data-elem-id="1660723679978"]{z-index:3;top:0px;;left:calc(50% - 600px + 787px);;width:1px;height:100%;}#rec495453579 .tn-elem[data-elem-id="1660723679978"] .tn-atom{border-radius:0px 0px 0px 0px;background-color:#d0d6dd;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660723679978"]{display:table;left:calc(50% - 480px + 619px);;height:100%;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660723679978"]{display:table;}#rec495453579 .tn-elem[data-elem-id="1660723679978"] .tn-atom{background-size:cover;opacity:0;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660723679978"]{display:table;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660723679978"]{display:table;}}#rec495453579 .tn-elem[data-elem-id="1660625517826"]{z-index:3;top:0px;;left:calc(50% - 600px + 0px);;width:592px;height:1px;}#rec495453579 .tn-elem[data-elem-id="1660625517826"] .tn-atom{border-radius:0px 0px 0px 0px;opacity:0;background-color:#d0d6dd;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660625517826"]{display:table;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660625517826"]{display:table;top:743px;;left:calc(50% - 320px + 24px);;}#rec495453579 .tn-elem[data-elem-id="1660625517826"] .tn-atom{background-size:cover;opacity:1;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660625517826"]{display:table;top:782px;;left:calc(50% - 240px + 20px);;width:440px;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660625517826"]{display:table;top:770px;;left:calc(50% - 160px + 10px);;width:300px;}}#rec495453579 .tn-elem[data-elem-id="1660625579543"]{z-index:3;top:0px;;left:calc(50% - 600px + 0px);;width:592px;height:1px;}#rec495453579 .tn-elem[data-elem-id="1660625579543"] .tn-atom{border-radius:0px 0px 0px 0px;opacity:0;background-color:#d0d6dd;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660625579543"]{display:table;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660625579543"]{display:table;top:1060px;;left:calc(50% - 320px + 24px);;}#rec495453579 .tn-elem[data-elem-id="1660625579543"] .tn-atom{background-size:cover;opacity:1;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660625579543"]{display:table;top:1204px;;left:calc(50% - 240px + 20px);;width:440px;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660625579543"]{display:table;top:1215px;;left:calc(50% - 160px + 9px);;width:300px;}}#rec495453579 .tn-elem[data-elem-id="1660723501956"]{z-index:3;top:0px;;left:calc(50% - 50% + 0px);;width:100%;height:1px;}#rec495453579 .tn-elem[data-elem-id="1660723501956"] .tn-atom{border-radius:0px 0px 0px 0px;background-color:#d0d6dd;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660723501956"]{display:table;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660723501956"]{display:table;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660723501956"]{display:table;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660723501956"]{display:table;}}#rec495453579 .tn-elem[data-elem-id="1660328018624"]{color:#172b4d;z-index:3;top:553px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328018624"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1660328018624"]{display:table;top:585px;;left:calc(50% - 480px + 28px);;width:278px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1660328018624"]{display:table;top:556px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1660328018624"]{display:table;top:1227px;;left:calc(50% - 240px + 19px);;width:440px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1660328018624"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1660328018624"]{display:table;top:1230px;;left:calc(50% - 160px + 9px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1705327730563"]{z-index:3;top:calc(847px - 101px + 3px);;left:calc(50% - 3% + -3px);;width:6%;height:auto;}#rec495453579 .tn-elem[data-elem-id="1705327730563"] .tn-atom{border-radius:0px 0px 0px 0px;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;}#rec495453579 .tn-elem[data-elem-id="1705327730563"] .tn-atom__img{border-radius:0px 0px 0px 0px;object-position:center center;}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1705327730563"]{display:table;top:calc(847px - 101px + 4px);;left:calc(50% - 3% + 2px);;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1705327730563"]{display:table;top:calc(847px - 101px + -112px);;left:calc(50% - 3% + 173px);;width:94px;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1705327730563"]{display:table;top:calc(847px - 101px + 57px);;left:calc(50% - 3% + 147px);;width:100px;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1705327730563"]{display:table;top:calc(847px - 101px + 25px);;left:calc(50% - 3% + 1px);;width:71%;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1706690444440"]{color:#172b4d;z-index:3;top:377px;;left:calc(50% - 600px + 419px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1706690444440"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1706690444440"]{display:table;top:389px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1706690444440"]{display:table;top:328px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1706690444440"]{display:table;top:448px;;left:calc(50% - 240px + 244px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1706690444440"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1706690444440"]{display:table;top:458px;;left:calc(50% - 160px + 166px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1707905565159"]{color:#172b4d;z-index:3;top:441px;;left:calc(50% - 600px + 420px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1707905565159"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1707905565159"]{display:table;top:457px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1707905565159"]{display:table;top:396px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1707905565159"]{display:table;top:524px;;left:calc(50% - 240px + 244px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1707905565159"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1707905565159"]{display:table;top:532px;;left:calc(50% - 160px + 166px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1742980584483"]{color:#172b4d;z-index:3;top:409px;;left:calc(50% - 600px + 419px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1742980584483"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1742980584483"]{display:table;top:423px;;left:calc(50% - 480px + 332px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1742980584483"]{display:table;top:362px;;left:calc(50% - 320px + 326px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1742980584483"]{display:table;top:486px;;left:calc(50% - 240px + 244px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1742980584483"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1742980584483"]{display:table;top:496px;;left:calc(50% - 160px + 166px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1708962345240"]{color:#172b4d;z-index:3;top:682px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1708962345240"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1708962345240"]{display:table;top:721px;;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1708962345240"]{display:table;top:692px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1708962345240"]{display:table;top:1379px;;left:calc(50% - 240px + 19px);;width:440px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1708962345240"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1708962345240"]{display:table;top:1382px;;left:calc(50% - 160px + 9px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1742566995756"]{color:#172b4d;z-index:3;top:650px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1742566995756"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1742566995756"]{display:table;top:687px;;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1742566995756"]{display:table;top:658px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1742566995756"]{display:table;top:1341px;;left:calc(50% - 240px + 19px);;width:440px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1742566995756"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1742566995756"]{display:table;top:1344px;;left:calc(50% - 160px + 9px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1723122768750"]{color:#172b4d;z-index:3;top:373px;;left:calc(50% - 600px + 886px);;width:360px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1723122768750"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1723122768750"]{display:table;top:409px;;left:calc(50% - 480px + 709px);;width:215px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1723122768750"]{display:table;top:973px;;left:calc(50% - 320px + 89px);;width:330px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1723122768750"] .tn-atom{vertical-align:middle;white-space:normal;background-size:cover;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1723122768750"]{display:table;top:1128px;;left:calc(50% - 240px + 71px);;width:440px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1723122768750"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1723122768750"]{display:table;top:793px;;left:calc(50% - 160px + 57px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1768398747383000001"]{color:#172b4d;z-index:3;top:297px;;left:calc(50% - 600px + 816px);;width:360px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1768398747383000001"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1768398747383000001"]{display:table;top:317px;;left:calc(50% - 480px + 636px);;width:288px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1768398747383000001"]{display:table;top:874px;;left:calc(50% - 320px + 328px);;width:273px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1768398747383000001"] .tn-atom{vertical-align:middle;white-space:normal;background-size:cover;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1768398747383000001"]{display:table;top:1068px;;left:calc(50% - 240px + 20px);;width:335px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1768398747383000001"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1768398747383000001"]{display:table;top:1099px;;left:calc(50% - 160px + 9px);;width:300px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1726735717183"]{color:#172b4d;z-index:3;top:465px;;left:calc(50% - 600px + 16px);;width:336px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1726735717183"] .tn-atom{vertical-align:middle;color:#172b4d;font-size:16px;font-family:var(--t-text-font,Arial);line-height:1.5;font-weight:400;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;--t396-shadow-text-opacity:100%;text-shadow:var(--t396-shadow-text-x,0px) var(--t396-shadow-text-y,0px) var(--t396-shadow-text-blur,0px) rgba(var(--t396-shadow-text-color),var(--t396-shadow-text-opacity,100%));}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1726735717183"]{display:table;top:485px;;left:calc(50% - 480px + 28px);;width:264px;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1726735717183"]{display:table;top:416px;;left:calc(50% - 320px + 20px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1726735717183"]{display:table;top:448px;;left:calc(50% - 240px + 16px);;width:212px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1726735717183"] .tn-atom{font-size:15px;line-height:1.47;background-size:cover;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1726735717183"]{display:table;left:calc(50% - 160px + 6px);;width:140px;height:auto;}}#rec495453579 .tn-elem[data-elem-id="1768399150632"]{z-index:3;top:369px;;left:calc(50% - 600px + 820px);;width:55px;height:55px;}#rec495453579 .tn-elem[data-elem-id="1768399150632"] .tn-atom{border-radius:10px 10px 10px 10px;background-color:#172b4d;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1768399150632"]{display:table;top:417px;;left:calc(50% - 480px + 640px);;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1768399150632"]{display:table;top:968px;;left:calc(50% - 320px + 24px);;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1768399150632"]{display:table;top:1129px;;left:calc(50% - 240px + 21px);;width:41px;height:41px;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1768399150632"]{display:table;top:794px;;left:calc(50% - 160px + 10px);;}}#rec495453579 .tn-elem[data-elem-id="1768399141699"]{z-index:3;top:378px;;left:calc(50% - 600px + 829px);;width:38px;height:auto;}#rec495453579 .tn-elem[data-elem-id="1768399141699"] .tn-atom{border-radius:0px 0px 0px 0px;background-position:center center;border-width:var(--t396-borderwidth,0);border-style:var(--t396-borderstyle,solid);border-color:var(--t396-bordercolor,transparent);transition:background-color var(--t396-speedhover,0s) ease-in-out,color var(--t396-speedhover,0s) ease-in-out,border-color var(--t396-speedhover,0s) ease-in-out,box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;}#rec495453579 .tn-elem[data-elem-id="1768399141699"] .tn-atom__img{border-radius:0px 0px 0px 0px;object-position:center center;}@media screen and (max-width:1199px){#rec495453579 .tn-elem[data-elem-id="1768399141699"]{display:table;top:426px;;left:calc(50% - 480px + 649px);;height:auto;}}@media screen and (max-width:959px){#rec495453579 .tn-elem[data-elem-id="1768399141699"]{display:table;top:977px;;left:calc(50% - 320px + 33px);;height:auto;}}@media screen and (max-width:639px){#rec495453579 .tn-elem[data-elem-id="1768399141699"]{display:table;top:1136px;;left:calc(50% - 240px + 28px);;width:28px;height:auto;}}@media screen and (max-width:479px){#rec495453579 .tn-elem[data-elem-id="1768399141699"]{display:table;top:801px;;left:calc(50% - 160px + 17px);;height:auto;}}</style> <div class='t396'> <div class="t396__artboard" data-artboard-recid="495453579" data-artboard-screens="320,480,640,960,1200" data-artboard-height="847" data-artboard-valign="center" data-artboard-upscale="grid" data-artboard-height-res-320="1536" data-artboard-height-res-480="1513" data-artboard-height-res-640="1196" data-artboard-height-res-960="840"> <div class="t396__carrier" data-artboard-recid="495453579"></div> <div class="t396__filter" data-artboard-recid="495453579"></div> <div class='t396__elem tn-elem uc-logo--on-white tn-elem__4954535791712236782477' data-elem-id='1712236782477' data-elem-type='image' data-field-top-value="74" data-field-left-value="20" data-field-height-value="42" data-field-width-value="105" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-filewidth-value="259" data-field-fileheight-value="103" data-field-heightmode-value="hug" data-field-top-res-320-value="36" data-field-left-res-320-value="7" data-field-height-res-320-value="42" data-field-top-res-480-value="40px" data-field-left-res-480-value="15" data-field-height-res-480-value="42" data-field-width-res-480-value="105" data-field-container-res-480-value="grid" data-field-top-res-640-value="61" data-field-left-res-640-value="24" data-field-height-res-640-value="42" data-field-left-res-960-value="36" data-field-height-res-960-value="42"> <a class='tn-atom' href="https://slurm.io/"> <img class='tn-atom__img t-img' data-original='https://static.tildacdn.com/tild3630-3434-4637-b730-343538653735/slurm_logo_new_1_1.svg'
src='https://static.tildacdn.com/tild3630-3434-4637-b730-343538653735/slurm_logo_new_1_1.svg'
alt='' imgfield='tn_img_1712236782477'
/> </a> </div> <div class='t396__elem tn-elem uc-logo--on-dark tn-elem__4954535791712235605947' data-elem-id='1712235605947' data-elem-type='image' data-field-top-value="74" data-field-left-value="20" data-field-height-value="42" data-field-width-value="105" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-filewidth-value="1188" data-field-fileheight-value="471" data-field-heightmode-value="hug" data-field-top-res-320-value="36" data-field-left-res-320-value="7" data-field-height-res-320-value="42" data-field-top-res-480-value="40" data-field-left-res-480-value="15" data-field-height-res-480-value="42" data-field-width-res-480-value="105" data-field-container-res-480-value="grid" data-field-top-res-640-value="61" data-field-left-res-640-value="24" data-field-height-res-640-value="42" data-field-left-res-960-value="36" data-field-height-res-960-value="42"> <a class='tn-atom' href="https://slurm.io/"> <img class='tn-atom__img t-img' data-original='https://static.tildacdn.com/tild6135-3939-4135-b731-656566303162/white.svg'
src='https://static.tildacdn.com/tild6135-3939-4135-b731-656566303162/white.svg'
alt='' imgfield='tn_img_1712235605947'
/> </a> </div> <div class='t396__elem tn-elem uc-logo--on-white tn-elem__4954535791692506348245' data-elem-id='1692506348245' data-elem-type='image' data-field-top-value="58" data-field-left-value="820" data-field-height-value="57" data-field-width-value="120" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-filewidth-value="87" data-field-fileheight-value="41" data-field-heightmode-value="hug" data-field-top-res-320-value="863" data-field-left-res-320-value="10" data-field-height-res-320-value="57" data-field-top-res-480-value="835" data-field-left-res-480-value="20" data-field-height-res-480-value="57" data-field-top-res-640-value="755" data-field-left-res-640-value="24" data-field-height-res-640-value="57" data-field-left-res-960-value="640" data-field-height-res-960-value="57"> <a class='tn-atom js-click-zero-stat' href="https://southbridge.io/?utm_source=slurm&utm_medium=footer" rel="nofollow" data-tilda-event-name="/tilda/click/rec495453579/button1692506348245"> <img class='tn-atom__img t-img' data-original='https://static.tildacdn.com/tild6266-3163-4334-b735-323663336439/sb-logo-dark.svg'
src='https://static.tildacdn.com/tild6266-3163-4334-b735-323663336439/sb-logo-dark.svg'
alt='' imgfield='tn_img_1692506348245'
/> </a> </div> <div class='t396__elem tn-elem uc-logo--on-dark tn-elem__4954535791692506631214' data-elem-id='1692506631214' data-elem-type='image' data-field-top-value="58" data-field-left-value="820" data-field-height-value="56" data-field-width-value="120" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-filewidth-value="86" data-field-fileheight-value="40" data-field-heightmode-value="hug" data-field-top-res-320-value="873" data-field-left-res-320-value="10" data-field-height-res-320-value="56" data-field-top-res-480-value="845" data-field-left-res-480-value="20" data-field-height-res-480-value="56" data-field-top-res-640-value="757" data-field-left-res-640-value="24" data-field-height-res-640-value="56" data-field-left-res-960-value="640" data-field-height-res-960-value="56"> <a class='tn-atom js-click-zero-stat' href="https://southbridge.io/?utm_source=slurm&utm_medium=footer" rel="nofollow" data-tilda-event-name="/tilda/click/rec495453579/button1692506631214"> <img class='tn-atom__img t-img' data-original='https://static.tildacdn.com/tild3438-6232-4636-b961-366339386263/sb-logo-light.svg'
src='https://static.tildacdn.com/tild3438-6232-4636-b961-366339386263/sb-logo-light.svg'
alt='' imgfield='tn_img_1692506631214'
/> </a> </div> <div class='t396__elem tn-elem tn-elem__4954535791660327289504' data-elem-id='1660327289504' data-elem-type='text' data-field-top-value="121" data-field-left-value="20" data-field-height-value="24" data-field-width-value="360" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="18" data-field-left-res-320-value="10" data-field-width-res-320-value="300" data-field-fontsize-res-320-value="16" data-field-top-res-480-value="81" data-field-left-res-480-value="20" data-field-top-res-640-value="68" data-field-left-res-640-value="153" data-field-left-res-960-value="32" data-field-width-res-960-value="288"> <div class='tn-atom'field='tn_text_1660327289504'>Обучение ИТ-профессионалов</div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327420094' data-elem-id='1660327420094' data-elem-type='text' data-field-top-value="185" data-field-left-value="14" data-field-height-value="26" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="24" data-field-left-res-320-value="5" data-field-width-res-320-value="300" data-field-left-res-480-value="15" data-field-width-res-480-value="440" data-field-top-res-640-value="124" data-field-left-res-640-value="20" data-field-left-res-960-value="27" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="tel:+74952480580"rel="nofollow"style="color: inherit">+7 (495) 248-05-80</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327526179' data-elem-id='1660327526179' data-elem-type='text' data-field-top-value="223" data-field-left-value="16" data-field-height-value="26" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="24" data-field-left-res-320-value="6" data-field-width-res-320-value="300" data-field-left-res-480-value="16" data-field-width-res-480-value="440" data-field-top-res-640-value="162" data-field-left-res-640-value="20" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="mailto:ask@slurm.io"rel="nofollow"style="color: inherit">ask@slurm.io</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328247771' data-elem-id='1660328247771' data-elem-type='text' data-field-top-value="547" data-field-left-value="419" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="614" data-field-left-res-320-value="6" data-field-width-res-320-value="300" data-field-top-res-480-value="622" data-field-left-res-480-value="16" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="532" data-field-left-res-640-value="326" data-field-top-res-960-value="557" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/corporate"style="color: inherit">Корпоративное обучение</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328067115' data-elem-id='1660328067115' data-elem-type='text' data-field-top-value="217" data-field-left-value="419" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="258" data-field-left-res-320-value="166" data-field-width-res-320-value="140" data-field-top-res-480-value="258" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="158" data-field-left-res-640-value="326" data-field-top-res-960-value="219" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/calendar"style="color: inherit">Календарь</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu--partner tn-elem__4954535791660328673693' data-elem-id='1660328673693' data-elem-type='text' data-field-top-value="229" data-field-left-value="816" data-field-height-value="48" data-field-width-value="360" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="1017" data-field-left-res-320-value="9" data-field-width-res-320-value="300" data-field-top-res-480-value="1008" data-field-left-res-480-value="20" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="874" data-field-left-res-640-value="20" data-field-width-res-640-value="256" data-field-top-res-960-value="229" data-field-left-res-960-value="636" data-field-width-res-960-value="288"> <div class='tn-atom'><a href="https://southbridge.io/?utm_source=slurm&utm_medium=footer"rel="nofollow"style="color: inherit"><span style="font-weight: 700;">Southbridge.</span> DevOps-аутсорсер, поддержка высоконагруженных проектов.</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327820270' data-elem-id='1660327820270' data-elem-type='text' data-field-top-value="305" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-left-res-320-value="6" data-field-width-res-320-value="140" data-field-top-res-480-value="258" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="246" data-field-left-res-640-value="20" data-field-top-res-960-value="315" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="https://habr.com/ru/companies/slurm/articles/"rel="nofollow"style="color: inherit">Хабр</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu--podcast tn-elem__4954535791660728009618' data-elem-id='1660728009618' data-elem-type='text' data-field-top-value="273" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-left-res-320-value="6" data-field-width-res-320-value="140" data-field-top-res-480-value="220" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="212" data-field-left-res-640-value="20" data-field-top-res-960-value="281" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="https://slurm.mave.digital/"rel="nofollow"style="color: inherit">Подкаст</a></div> </div> <div class='t396__elem tn-elem tn-elem__4954535791660728533851' data-elem-id='1660728533851' data-elem-type='text' data-field-top-value="274" data-field-left-value="8" data-field-height-value="24" data-field-width-value="9" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="218" data-field-left-res-320-value="0" data-field-top-res-480-value="222" data-field-left-res-480-value="8" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="211" data-field-left-res-640-value="10" data-field-top-res-960-value="283" data-field-left-res-960-value="20"> <div class='tn-atom'field='tn_text_1660728533851'>•</div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328247775' data-elem-id='1660328247775' data-elem-type='text' data-field-top-value="579" data-field-left-value="419" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="652" data-field-left-res-320-value="6" data-field-width-res-320-value="300" data-field-top-res-480-value="660" data-field-left-res-480-value="16" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="566" data-field-left-res-640-value="326" data-field-top-res-960-value="591" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/universal-tickets"style="color: inherit">Универсальные доступы</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328067118' data-elem-id='1660328067118' data-elem-type='text' data-field-top-value="185" data-field-left-value="419" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="220" data-field-left-res-320-value="166" data-field-width-res-320-value="140" data-field-top-res-480-value="220" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="124" data-field-left-res-640-value="326" data-field-top-res-960-value="185" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/catalog"style="color: inherit">Все курсы</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328247777' data-elem-id='1660328247777' data-elem-type='text' data-field-top-value="611" data-field-left-value="419" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="690" data-field-left-res-320-value="6" data-field-width-res-320-value="300" data-field-top-res-480-value="698" data-field-left-res-480-value="16" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="600" data-field-left-res-640-value="326" data-field-top-res-960-value="625" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/faq-for-oformitel"style="color: inherit">Оплата курса от компании</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328067120' data-elem-id='1660328067120' data-elem-type='text' data-field-top-value="249" data-field-left-value="419" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="296" data-field-left-res-320-value="166" data-field-width-res-320-value="140" data-field-top-res-480-value="296" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="192" data-field-left-res-640-value="326" data-field-top-res-960-value="253" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/free"style="color: inherit">Бесплатные материалы</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327823456' data-elem-id='1660327823456' data-elem-type='text' data-field-top-value="337" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-left-res-320-value="6" data-field-width-res-320-value="140" data-field-top-res-480-value="296" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="280" data-field-left-res-640-value="20" data-field-top-res-960-value="349" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="https://t.me/slurmnews"style="color: inherit">Telegram</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328067122' data-elem-id='1660328067122' data-elem-type='text' data-field-top-value="281" data-field-left-value="419" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="344" data-field-left-res-320-value="166" data-field-width-res-320-value="140" data-field-top-res-480-value="334" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="226" data-field-left-res-640-value="326" data-field-top-res-960-value="287" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/speaker"style="color: inherit">Спикеры</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791664355590156' data-elem-id='1664355590156' data-elem-type='text' data-field-top-value="313" data-field-left-value="419" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="382" data-field-left-res-320-value="166" data-field-width-res-320-value="140" data-field-top-res-480-value="372" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="260" data-field-left-res-640-value="326" data-field-top-res-960-value="321" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/for-speakers"style="color: inherit">Для спикеров</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791738909171549' data-elem-id='1738909171549' data-elem-type='text' data-field-top-value="345" data-field-left-value="419" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="420" data-field-left-res-320-value="166" data-field-width-res-320-value="140" data-field-top-res-480-value="410" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="294" data-field-left-res-640-value="326" data-field-top-res-960-value="355" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="https://slurm.io/careers"style="color: inherit">Работа в Слёрме</a></div> </div> <div class='t396__elem tn-elem tn-elem__4954535791660328170303' data-elem-id='1660328170303' data-elem-type='text' data-field-top-value="503" data-field-left-value="419" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="18" data-field-top-res-320-value="570" data-field-left-res-320-value="9" data-field-width-res-320-value="300" data-field-fontsize-res-320-value="16" data-field-top-res-480-value="578" data-field-left-res-480-value="16" data-field-width-res-480-value="440" data-field-top-res-640-value="488" data-field-left-res-640-value="326" data-field-top-res-960-value="513" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'field='tn_text_1660328170303'>Корпоративным клиентам</div> </div> <div class='t396__elem tn-elem tn-elem__4954535791660328581896' data-elem-id='1660328581896' data-elem-type='text' data-field-top-value="185" data-field-left-value="820" data-field-height-value="24" data-field-width-value="360" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="18" data-field-top-res-320-value="973" data-field-left-res-320-value="12" data-field-width-res-320-value="300" data-field-fontsize-res-320-value="16" data-field-top-res-480-value="964" data-field-left-res-480-value="20" data-field-width-res-480-value="440" data-field-top-res-640-value="830" data-field-left-res-640-value="24" data-field-width-res-640-value="288" data-field-left-res-960-value="640" data-field-width-res-960-value="288"> <div class='tn-atom'field='tn_text_1660328581896'>Партнёры</div> </div> <div class='t396__elem tn-elem tn-elem__4954535791660328396738' data-elem-id='1660328396738' data-elem-type='text' data-field-top-value="736" data-field-left-value="20" data-field-height-value="24" data-field-width-value="360" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="1428" data-field-left-res-320-value="9" data-field-top-res-480-value="1435" data-field-left-res-480-value="23" data-field-top-res-640-value="1125" data-field-left-res-640-value="24" data-field-top-res-960-value="765" data-field-left-res-960-value="32" data-field-width-res-960-value="288"> <div class='tn-atom'field='tn_text_1660328396738'>© 2018—2025 ООО «Слёрм»</div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327824923' data-elem-id='1660327824923' data-elem-type='text' data-field-top-value="401" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-left-res-320-value="6" data-field-width-res-320-value="140" data-field-top-res-480-value="372" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="348" data-field-left-res-640-value="20" data-field-top-res-960-value="417" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="https://vk.com/slurm_io"rel="nofollow"style="color: inherit">VK</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327826356' data-elem-id='1660327826356' data-elem-type='text' data-field-top-value="369" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-left-res-320-value="6" data-field-width-res-320-value="140" data-field-top-res-480-value="334" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="314" data-field-left-res-640-value="20" data-field-top-res-960-value="383" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="https://www.youtube.com/c/slurm_io"rel="nofollow"style="color: inherit">YouTube</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327833780' data-elem-id='1660327833780' data-elem-type='text' data-field-top-value="433" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-left-res-320-value="6" data-field-width-res-320-value="140" data-field-top-res-480-value="410" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="382" data-field-left-res-640-value="20" data-field-top-res-960-value="451" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="https://dzen.ru/slurm"rel="nofollow"style="color: inherit">Дзен</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327835132' data-elem-id='1660327835132' data-elem-type='text' data-field-top-value="497" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-left-res-320-value="6" data-field-width-res-320-value="140" data-field-top-res-480-value="486" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="450" data-field-left-res-640-value="20" data-field-top-res-960-value="519" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="https://www.linkedin.com/company/slurm"rel="nofollow"style="color: inherit">LinkedIn</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791695983077804' data-elem-id='1695983077804' data-elem-type='text' data-field-top-value="586" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="1268" data-field-left-res-320-value="9" data-field-width-res-320-value="300" data-field-top-res-480-value="1265" data-field-left-res-480-value="19" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="590" data-field-left-res-640-value="20" data-field-top-res-960-value="619" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/privacy"style="color: inherit">Политика конфиденциальности</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328020471' data-elem-id='1660328020471' data-elem-type='text' data-field-top-value="618" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="1306" data-field-left-res-320-value="9" data-field-width-res-320-value="300" data-field-top-res-480-value="1303" data-field-left-res-480-value="19" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="624" data-field-left-res-640-value="20" data-field-top-res-960-value="653" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/oferta-slurm"style="color: inherit">Публичная оферта</a></div> </div> <div class='t396__elem tn-elem tn-elem__4954535791660327366231' data-elem-id='1660327366231' data-elem-type='text' data-field-top-value="121" data-field-left-value="820" data-field-height-value="24" data-field-width-value="360" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="18" data-field-top-res-320-value="925" data-field-left-res-320-value="10" data-field-width-res-320-value="300" data-field-fontsize-res-320-value="16" data-field-top-res-480-value="908" data-field-left-res-480-value="20" data-field-width-res-480-value="440" data-field-top-res-640-value="784" data-field-left-res-640-value="168" data-field-left-res-960-value="640"> <div class='tn-atom'field='tn_text_1660327366231'>Генеральный партнёр Слёрм</div> </div> <div class='t396__elem tn-elem uc-footer-line tn-elem__4954535791660723679978' data-elem-id='1660723679978' data-elem-type='shape' data-field-top-value="0" data-field-left-value="787" data-field-height-value="100" data-field-width-value="1" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="%" data-field-widthunits-value="px" data-field-left-res-960-value="619" data-field-height-res-960-value="100"> <div class='tn-atom'> </div> </div> <div class='t396__elem tn-elem uc-footer-line tn-elem__4954535791660625517826' data-elem-id='1660625517826' data-elem-type='shape' data-field-top-value="0" data-field-left-value="0" data-field-height-value="1" data-field-width-value="592" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-top-res-320-value="770" data-field-left-res-320-value="10" data-field-width-res-320-value="300" data-field-top-res-480-value="782" data-field-left-res-480-value="20" data-field-width-res-480-value="440" data-field-top-res-640-value="743" data-field-left-res-640-value="24"> <div class='tn-atom'> </div> </div> <div class='t396__elem tn-elem uc-footer-line tn-elem__4954535791660625579543' data-elem-id='1660625579543' data-elem-type='shape' data-field-top-value="0" data-field-left-value="0" data-field-height-value="1" data-field-width-value="592" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-top-res-320-value="1215" data-field-left-res-320-value="9" data-field-width-res-320-value="300" data-field-top-res-480-value="1204" data-field-left-res-480-value="20" data-field-width-res-480-value="440" data-field-top-res-640-value="1060" data-field-left-res-640-value="24"> <div class='tn-atom'> </div> </div> <div class='t396__elem tn-elem uc-footer-line--top tn-elem__4954535791660723501956' data-elem-id='1660723501956' data-elem-type='shape' data-field-top-value="0" data-field-left-value="0" data-field-height-value="1" data-field-width-value="100" data-field-axisy-value="top" data-field-axisx-value="center" data-field-container-value="window" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="%"> <div class='tn-atom'> </div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328018624' data-elem-id='1660328018624' data-elem-type='text' data-field-top-value="553" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="1230" data-field-left-res-320-value="9" data-field-width-res-320-value="300" data-field-top-res-480-value="1227" data-field-left-res-480-value="19" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="556" data-field-left-res-640-value="20" data-field-top-res-960-value="585" data-field-left-res-960-value="28" data-field-width-res-960-value="278"> <div class='tn-atom'><a href="https://api.edu.slurm.io/uploads/license_dpo.pdf"target="_blank"style="color: inherit">Лицензия №ДЛ-1368 от 22.08.2019</a></div> </div> <div class='t396__elem tn-elem tn-elem__4954535791705327730563' data-elem-id='1705327730563' data-elem-type='image' data-field-top-value="3" data-field-left-value="-3" data-field-height-value="101" data-field-width-value="6" data-field-axisy-value="bottom" data-field-axisx-value="center" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="%" data-field-filewidth-value="600" data-field-fileheight-value="840" data-field-heightmode-value="hug" data-field-top-res-320-value="25" data-field-left-res-320-value="1" data-field-height-res-320-value="99" data-field-width-res-320-value="71" data-field-top-res-480-value="57" data-field-left-res-480-value="147" data-field-height-res-480-value="140" data-field-width-res-480-value="100" data-field-widthunits-res-480-value="px" data-field-top-res-640-value="-112" data-field-left-res-640-value="173" data-field-height-res-640-value="132" data-field-width-res-640-value="94" data-field-widthunits-res-640-value="px" data-field-top-res-960-value="4" data-field-left-res-960-value="2" data-field-height-res-960-value="81"> <div class='tn-atom'> <img class='tn-atom__img t-img' data-original='https://static.tildacdn.com/tild6562-3736-4663-b362-303664366334/idle-anim3_green_lin.gif'
src='https://thb.tildacdn.com/tild6562-3736-4663-b362-303664366334/-/resize/20x/idle-anim3_green_lin.gif'
alt='' imgfield='tn_img_1705327730563'
/> </div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791706690444440' data-elem-id='1706690444440' data-elem-type='text' data-field-top-value="377" data-field-left-value="419" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="458" data-field-left-res-320-value="166" data-field-width-res-320-value="140" data-field-top-res-480-value="448" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="328" data-field-left-res-640-value="326" data-field-top-res-960-value="389" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/reviews"style="color: inherit">Отзывы</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791707905565159' data-elem-id='1707905565159' data-elem-type='text' data-field-top-value="441" data-field-left-value="420" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="532" data-field-left-res-320-value="166" data-field-width-res-320-value="140" data-field-top-res-480-value="524" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="396" data-field-left-res-640-value="326" data-field-top-res-960-value="457" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/blog"style="color: inherit"><strong>Блог</strong></a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791742980584483' data-elem-id='1742980584483' data-elem-type='text' data-field-top-value="409" data-field-left-value="419" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="496" data-field-left-res-320-value="166" data-field-width-res-320-value="140" data-field-top-res-480-value="486" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="362" data-field-left-res-640-value="326" data-field-top-res-960-value="423" data-field-left-res-960-value="332" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="/about_us"style="color: inherit">О нас</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791708962345240' data-elem-id='1708962345240' data-elem-type='text' data-field-top-value="682" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="1382" data-field-left-res-320-value="9" data-field-width-res-320-value="300" data-field-top-res-480-value="1379" data-field-left-res-480-value="19" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="692" data-field-left-res-640-value="20" data-field-top-res-960-value="721" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="https://slurm.io/info"style="color: inherit">Юридическая информация</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791742566995756' data-elem-id='1742566995756' data-elem-type='text' data-field-top-value="650" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="1344" data-field-left-res-320-value="9" data-field-width-res-320-value="300" data-field-top-res-480-value="1341" data-field-left-res-480-value="19" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="658" data-field-left-res-640-value="20" data-field-top-res-960-value="687" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="https://slurm.io/newsletter"style="color: inherit">Согласие на рассылку</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu--partner tn-elem__4954535791723122768750' data-elem-id='1723122768750' data-elem-type='text' data-field-top-value="373" data-field-left-value="886" data-field-height-value="48" data-field-width-value="360" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="793" data-field-left-res-320-value="57" data-field-width-res-320-value="300" data-field-top-res-480-value="1128" data-field-left-res-480-value="71" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="973" data-field-left-res-640-value="89" data-field-height-res-640-value="48" data-field-width-res-640-value="330" data-field-container-res-640-value="grid" data-field-heightunits-res-640-value="px" data-field-textfit-res-640-value="autoheight" data-field-top-res-960-value="409" data-field-left-res-960-value="709" data-field-width-res-960-value="215"> <div class='tn-atom'field='tn_text_1723122768750'><strong style="font-weight: 700;">СДЕЛАНО В РОССИИ</strong><br>Входим в реестр Российского ПО</div> </div> <div class='t396__elem tn-elem uc-footer-menu--partner tn-elem__4954535791768398747383000001' data-elem-id='1768398747383000001' data-elem-type='text' data-field-top-value="297" data-field-left-value="816" data-field-height-value="48" data-field-width-value="360" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-top-res-320-value="1099" data-field-left-res-320-value="9" data-field-width-res-320-value="300" data-field-top-res-480-value="1068" data-field-left-res-480-value="20" data-field-width-res-480-value="335" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="874" data-field-left-res-640-value="328" data-field-height-res-640-value="48" data-field-width-res-640-value="273" data-field-container-res-640-value="grid" data-field-heightunits-res-640-value="px" data-field-textfit-res-640-value="autoheight" data-field-top-res-960-value="317" data-field-left-res-960-value="636" data-field-width-res-960-value="288"> <div class='tn-atom'><a href="https://core247.io/"rel="nofollow"style="color: inherit"><strong style="font-weight: 700;">CORE 24/7.</strong> Официальный представитель Слёрма в Казахстане.</a></div> </div> <div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791726735717183' data-elem-id='1726735717183' data-elem-type='text' data-field-top-value="465" data-field-left-value="16" data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-textfit-value="autoheight" data-field-fontsize-value="16" data-field-left-res-320-value="6" data-field-width-res-320-value="140" data-field-top-res-480-value="448" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15" data-field-top-res-640-value="416" data-field-left-res-640-value="20" data-field-top-res-960-value="485" data-field-left-res-960-value="28" data-field-width-res-960-value="264"> <div class='tn-atom'><a href="https://rutube.ru/channel/39652890/"rel="nofollow"style="color: inherit">Rutube</a></div> </div> <div class='t396__elem tn-elem tn-elem__4954535791768399150632' data-elem-id='1768399150632' data-elem-type='shape' data-field-top-value="369" data-field-left-value="820" data-field-height-value="55" data-field-width-value="55" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-top-res-320-value="794" data-field-left-res-320-value="10" data-field-top-res-480-value="1129" data-field-left-res-480-value="21" data-field-height-res-480-value="41" data-field-width-res-480-value="41" data-field-top-res-640-value="968" data-field-left-res-640-value="24" data-field-top-res-960-value="417" data-field-left-res-960-value="640"> <div class='tn-atom'> </div> </div> <div class='t396__elem tn-elem tn-elem__4954535791768399141699' data-elem-id='1768399141699' data-elem-type='image' data-field-top-value="378" data-field-left-value="829" data-field-height-value="38" data-field-width-value="38" data-field-axisy-value="top" data-field-axisx-value="left" data-field-container-value="grid" data-field-topunits-value="px" data-field-leftunits-value="px" data-field-heightunits-value="px" data-field-widthunits-value="px" data-field-filewidth-value="512" data-field-fileheight-value="512" data-field-heightmode-value="hug" data-field-top-res-320-value="801" data-field-left-res-320-value="17" data-field-height-res-320-value="28" data-field-top-res-480-value="1136" data-field-left-res-480-value="28" data-field-height-res-480-value="28" data-field-width-res-480-value="28" data-field-top-res-640-value="977" data-field-left-res-640-value="33" data-field-height-res-640-value="38" data-field-top-res-960-value="426" data-field-left-res-960-value="649" data-field-height-res-960-value="38"> <div class='tn-atom'> <img class='tn-atom__img t-img' data-original='https://static.tildacdn.com/tild6664-3637-4833-b338-393633633963/coat-of-arms_3.svg'
src='https://static.tildacdn.com/tild6664-3637-4833-b338-393633633963/coat-of-arms_3.svg'
alt='' imgfield='tn_img_1768399141699'
/> </div> </div> </div> </div> <script>t_onReady(function() {t_onFuncLoad('t396_init',function() {t396_init('495453579');});});</script> <!-- /T396 --> </div> <div id="rec825799301" class="r t-rec" style=" " data-animationappear="off" data-record-type="131"> <!-- T123 --> <div class="t123"> <div class="t-container_100 "> <div class="t-width t-width_100 "> <!-- nominify begin --> <style>
/*Добавляем скругления углов у карточек стандартных блоков*/
.t-popup__container{ /*Сюда вставляем класс блока из таблицы выше*/
border-radius: 16px !important; /*Радиус скругления у блока*/
overflow: hidden; /*Используется для некоторых блоков, к которым не применяется скругление*/
/*Если нужно скруглить углы, каждый по отдельности, то используйте вместо одного значения четыре,
написав их через пробел, например 20px 30px 10px 50px*/
}
</style> <style>
/*Размытие фона*/
.t-popup.t-popup_show {
-webkit-backdrop-filter: blur(5px);
backdrop-filter: blur(5px);
}
</style> <!-- nominify end --> </div> </div> </div> </div> </footer> <!--/footer--> </div> <!--/allrecords--> <!-- Stat --> <!-- Yandex.Metrika counter 49219348 --> <script type="text/javascript" data-tilda-cookie-type="analytics">setTimeout(function(){(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window,document,"script","https://mc.yandex.ru/metrika/tag.js","ym");window.mainMetrikaId='49219348';ym(window.mainMetrikaId,"init",{clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,params:{__ym:{"ymCms":{"cms":"tilda","cmsVersion":"1.0"}}},ecommerce:"dataLayer"});},2000);</script> <noscript><div><img src="https://mc.yandex.ru/watch/49219348" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> <script type="text/javascript">if(!window.mainTracker) {window.mainTracker='tilda';}
window.tildastatscroll='yes';setTimeout(function(){(function(d,w,k,o,g) {var n=d.getElementsByTagName(o)[0],s=d.createElement(o),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.key=k;s.id="tildastatscript";s.src=g;if(w.opera=="[object Opera]") {d.addEventListener("DOMContentLoaded",f,false);} else {f();}})(document,window,'3ca9b9471ab76a4a58118835b5fb250d','script','https://static.tildacdn.com/js/tilda-stat-1.0.min.js');},2000);</script> <!-- Rating Mail.ru counter --> <script type="text/javascript" data-tilda-cookie-type="analytics">setTimeout(function(){var _tmr=window._tmr||(window._tmr=[]);_tmr.push({id:"3557140",type:"pageView",start:(new Date()).getTime()});window.mainMailruId='3557140';(function(d,w,id) {if(d.getElementById(id)) {return;}
var ts=d.createElement("script");ts.type="text/javascript";ts.async=true;ts.id=id;ts.src="https://top-fwz1.mail.ru/js/code.js";var f=function() {var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(ts,s);};if(w.opera=="[object Opera]") {d.addEventListener("DOMContentLoaded",f,false);} else {f();}})(document,window,"topmailru-code");},2000);</script> <noscript><img src="https://top-fwz1.mail.ru/counter?id=3557140;js=na" style="border:0;position:absolute;left:-9999px;width:1px;height:1px" alt="Top.Mail.Ru" /></noscript> <!-- //Rating Mail.ru counter --> </body> </html>