Мы всегда на связи 24/7
Возможно, ваша проблема решается одним звонком
Спасибо!
Мы свяжемся с вами в ближайшее время

Команда Senior SRE/DevOps инженеров

С опытом в FinTech и E-Commerce. SLA 15 минут

Мы всегда на связи 24/7
Возможно, ваша проблема решается одним звонком
Спасибо!
Мы свяжемся с вами в ближайшее время
Обеспечим сопровождение в черную пятницу или в дни распродаж. Подготовим проект к росту трафика
от 60 000
Поддержка интернет-магазинов
Поможем оптимизировать проект и обеспечить лучшие показатели. Мы не правим код, но знаем тонкости настройки Битрикс
от 60 000
1C-Битрикс сопровождение
Подключаем 24/7 мониторинг, настраиваем бэкапы, и реагируем в течении 15 минут на инциденты
от 20 000
Поддержка и сопровождение
от 50 000
Миграция в микросервисную инфраструктуру
Перенесем ваш проект в облако без потери данных, настроим все интеграции, подготовим к нагрузкам
от 70 000
Аудит систем резервного копирования
Найдем критические уязвимости, настроим резервное копирование и мониторинг за его процессами

С чем мы готовы помочь

Еще 5 услуг

Наши преимущества

Мониторинг
предвидим множество проблем еще до того, как они возникнут
Особый подход
разрабатываем индивидуальные решения и оптимизируем затраты
Круглосуточно
настоящие 24/7 за счет офисов в разных часовых поясах
формируем команду и приступаем к работе
Быстро
Администрируем проекты в разных отраслях
Нам доверяют
600+
проектов средней и высокой нагрузки
E-commerce, аэропорты, банки, стартапы, страхование, промышленность, образование, логистика и десятки компаний под NDA
Команда высококлассных профессионалов
Мы стремимся к тому, чтобы вы получали только качественную поддержку на всех ее уровнях
Технологии которые мы используем
Мониторинг и системы визуализации
Prometheus
NewRelic
Grafana
DataDog
Zabbix
Nagios
Icinga
Облачные платформы и сервисы
Yandex Cloud
Google Cloud Platform
Amazon AWS
Vk cloud
Microsoft Azure
Sbercloud
Selectel
Следим за развитием технологий. Высокая квалификация наших специалистов поможет решить любую вашу задачу
Логирование, отслеживание ошибок
Grafana Loki
ELK
EFK
Sentry
Graylog
Web, ingress и серверы приложений
NodeJs
Nginx
Traefik
HAProxy
Apache
Tomcat
Мы постоянно учимся новому
Jenkins
Системы автоматизации, CI/CD
Gitlab CI
Bitbucket Pipelines
TeamCity
Системы оркестрации
Docker compose
Kubernetes
Nomad
Terraform
Helm
Системы контейнеризации
LXC
Docker
Podman
Containerd
СУБД
Greenplum
PostgreSQL
MySQL
Kafka
Clickhouse
Redis
Mongo
Команда высококлассных профессионалов
Мы стремимся к тому, чтобы вы получали только качественную поддержку на всех ее уровнях
Технологии которые мы используем
Мониторинг и системы визуализации
Prometheus
NewRelic
Grafana
DataDog
Zabbix
Nagios
Icinga
Облачные платформы и сервисы
Yandex Cloud
Google Cloud Platform
Amazon AWS
Vk cloud
Microsoft Azure
Sbercloud
Selectel
Следим за развитием технологий. Высокая квалификация наших специалистов поможет решить любую вашу задачу
Мы постоянно учимся новому
Логирование, отслеживание ошибок
Grafana Loki
ELK
EFK
Sentry
Graylog
Web, ingress и серверы приложений
NodeJs
Nginx
Traefik
HAProxy
Apache
Tomcat
Jenkins
Системы автоматизации, CI/CD
Gitlab CI
Bitbucket Pipelines
TeamCity
Системы оркестрации
Docker compose
Kubernetes
Nomad
Terraform
Helm
Системы контейнеризации
LXC
Docker
Podman
Containerd
СУБД
Greenplum
PostgreSQL
MySQL
Kafka
Clickhouse
Redis
Mongo
Этапы работы с нами
Аудит проекта
1
2
Формирование команды
3
План работ
Внедрение
4
Поддержка
Познакомимся с вашим проектом, составим описание текущего стека технологий, выявим уязвимости
Создаем групповой чат с нужными специалистами, у вас будет возможность общаться с администраторами напрямую и быстро получать ответы на вопросы
Составляем и согласовываем таймлайн работ, согласовываем с вами и приступаем к задачам
5
Выполняем основные задачи по доработке инфраструктуры, переносим данные, настраиваем резервное копирование
Подключаем несколько независимых систем мониторинга и отслеживаем стабильную работу вашего проекта. Реагируем на сбои в течение 15 минут
*В зависимости от конкретных условий и требований проекта, этапы могут быть изменены или дополнены
Отзывы клиентов
Что клиенты говорят о нас
Международный институт интегративной нутрициологии
Обратились за срочной помощью, так как на сайте резко повысилось количество некачественного трафика. Администраторы помогли настроить спам фильтры и за неделю трафик пришел к нормальным показателя. Обращались только за разовыми задачами, но теперь подумываем о переходе на регулярную поддержку.
Магазин компьютерной техники
В целом мы довольны сотрудничеством. Ребята молодцы. Да и в рынке технологий и услуг администрирования вы намного лучше разбираетесь чем мы. Вы видите наш проект. И могли бы указать на его слабые стороны и посоветовать, что нужно улучшить, внедрить, обновить, проапгрейдить и так далее.
Гостиничный оператор
Доработали систему, теперь вы нам сообщаете, что видите проблему и устраняете ее — это радует. Радует, что не нужно держать все в уме, а хоть в этой части можно расслабиться, доверив дело вам. Мы работаем с вами уже почти 1,5 года, в целом поддержка нас удовлетворяет, планируем и в дальнейшем сотрудничать с вами.
Электротехническая компания
В целом сложилось хорошее впечатление от работы с вашей командой. Видно, что коллеги — профессионалы, работать с ними приятно, есть твердое ощущение надежности и экспертизы.
Блог
      Иногда нужно всего одно правильное действие
      Оставить заявку
      Получите бесплатную консультацию
      По всем вопросам
      Telegram
      '; let inpList = document.querySelectorAll(redid2 + ' [name="' + inputname + '"]'); if (item.getAttribute('type') == 'radio' && inpList.length >= 1) {} else { inpBox.insertAdjacentHTML('beforeend', gg); } } } }); newInputsList.forEach(function(item) { if (!item.classList.contains("js-tilda-rule")) { var inputname = item.getAttribute('name'); var gg = '
      '; inpBox.insertAdjacentHTML('beforeend', gg); } }); newInputsList.forEach(function(item) { if (item.classList.contains("js-tilda-rule") && !item.classList.contains("t-input__own-answer")) { var inputname = item.getAttribute('name'); let zeroChecked = document.querySelectorAll(redid1 + ' [name="' + inputname + '"]:checked'); let zeroNotChecked = document.querySelectorAll(redid1 + ' [name="' + inputname + '"]'); let inp204 = document.querySelector(redid2 + ' [name="' + inputname + '"]'); if (item.getAttribute('type') == 'checkbox' || item.classList.contains('t-radio') || item.classList.contains('t-checkbox') || item.classList.contains('t-img-select')) { if (zeroChecked.length >= 1) { inp204.value = zeroChecked[0].value; localStorage.setItem(inputname, inp204.value); } } else { if (item.getAttribute('type') == 'hidden' && item.classList.contains("t-img-select__hiddeninput") && !item.hasAttribute("value")) { inp204.value = "У поля нет атрибута 'value'. Пожалуйста проверьте настройки!"; } else { inp204.value = zeroNotChecked[0].value; localStorage.setItem(inputname, inp204.value); } } } }); newInputsList.forEach(function(item) { if (!item.classList.contains("js-tilda-rule")) { var inputname = item.getAttribute('name'); let inpList = document.querySelectorAll(redid2 + ' [name="' + inputname + '"]'); let zeroNotChecked = document.querySelector(redid1 + ' [name="' + inputname + '"]'); inpList.forEach(function(el) { el.value = zeroNotChecked.value; localStorage.setItem(inputname, el.value); }); } }); document.querySelectorAll(redid1 + ' .t-upwidget').forEach(function(item) { let parrentsList = getParents(item, 't-input-group'); var inputname = parrentsList[0].cloneNode(true); inpBox.prepend(inputname); }); clickEvent(document.querySelector(redid2 + ' .t-submit')); setTimeout(() => { let formsList = document.querySelectorAll(redid1 + ' form'); formsList.forEach(function(item) { item.reset(); item.querySelectorAll('input[type="tel"]').forEach(function(inp) { if (inp.hasAttribute("data-phonemask-current")) { inp.setAttribute("data-phonemask-current", ""); } }); item.querySelectorAll('input[data-tilda-rule="phone"]').forEach(function(inp) { if (inp.hasAttribute("value")) { inp.value = ""; } }); }); for (let i = 0; i < selectsList.length; i++) { selectsList[i].value = selectsInitValuesList[i]; } for (let i = 0; i < allCheckboxList.length; i++) { if (checkboxInitValuesList[i] == "checked") { allCheckboxList[i].click(); } } for (let i = 0; i < quantityList.length; i++) { quantityList[i].value = quantityInitValuesList[i]; } for (let i = 0; i < rangeList.length; i++) { rangeList[i].value = rangeInitValuesList[i]; rangeTxtList[i].innerHTML = rangeTxtInitValuesList[i]; rangeTxtList[i].style.left = rangeTxtInitStyleList[i]; rangeList[i].closest(".t-input-group").querySelector("style[class*='range']").innerHTML = rangeStyleTagInitList[i]; } for (let i = 0; i < calcsList.length; i++) { calcsList[i].innerHTML = calcsInitValuesList[i]; } document.querySelectorAll(redid1 + ' .t-uploadcare .uploadcare--widget__button_type_remove').forEach(function(item) { item.click(); }); document.querySelectorAll(redid1 + ' .t-upwidget-container__button_fileholder').forEach(function(item) { setTimeout(function() { clickEvent(item); if (item.closest('.t-upwidget-container').querySelector(".t-upwidget-container__data_table_actions_remove")) { clickEvent(item.closest('.t-upwidget-container').querySelector(".t-upwidget-container__data_table_actions_remove svg")); } },100); }); },0); } }); }); var zeroForma = function($form) { let = nlm001; if (window.NolimSuccessFunction906261274.length >= 1) { var hasSuccessUrl = document.querySelector(redid2 + ' form').hasAttribute('data-success-url'); if (hasSuccessUrl) { var successUrl = document.querySelector(redid2 + ' form').getAttribute('data-success-url'); if (successUrl !== undefined && successUrl !== '') { window.location.href = successUrl; } } else { setTimeout(function() { var st = document.querySelector(redid2 + ' .js-successbox').innerHTML; nolimShowSuccessPopup878943655(); document.querySelector('#nolimnolimtildaformsuccesspopuptext').innerHTML = st; if(window.t1093__closePopup) { t1093__closePopup(!0, -1, !0); } }, 0); } } }; if(typeof window.NolimSuccessFunction906261274 == 'undefined') { window.NolimSuccessFunction906261274 = []; window.NolimSuccessFunction906261274[0] = zeroForma; } else { window.NolimSuccessFunction906261274.push(zeroForma); }; window.mySuccessFunction906261274 = function ($form) { for (var i = 0; i < window.NolimSuccessFunction906261274.length; i++) { window.NolimSuccessFunction906261274[i]($form); } }; if (!window.nlm609rec906261274) { function afterSuccessNlm(form) { window.mySuccessFunction906261274(form); if (window.nlm020block792093043) { clickEvent(document.querySelector("#rec792093043 .nolim_popup_close")); } } setInterval(function() { let forms = document.querySelectorAll(redid2 + ' .js-form-proccess'); Array.prototype.forEach.call(forms, function (form) { form.removeEventListener('tildaform:aftersuccess', afterSuccessNlm); form.addEventListener('tildaform:aftersuccess', afterSuccessNlm); }); }, 1000); } zeroBlock.addEventListener("keypress", function(e) { var keyCode = e.keyCode || e.which; let btn = document.querySelectorAll(redid1 + ' [href="' + hurl + '"]'); if (keyCode === 13) { e.preventDefault(); btn[0].click(); return false; } }); }; }, 50); })); function hideErrors(t) { var e, r, o, a, n, i, s; "object" == typeof t && !t.length || (t instanceof Element || (t = t[0]), e = t.querySelectorAll(".js-errorbox-all"), r = t.querySelectorAll(".js-rule-error"), o = t.querySelectorAll(".js-error-rule-all"), a = t.querySelectorAll(".js-successbox"), n = t.querySelectorAll(".js-error-control-box"), i = t.querySelectorAll(".js-error-control-box .t-input-error"), s = document.getElementById("tilda-popup-for-error"), Array.prototype.forEach.call(e, function(t) { t.style.display = "none" }), Array.prototype.forEach.call(r, function(t) { t.style.display = "none" }), Array.prototype.forEach.call(o, function(t) { t.innerHTML = "" }), Array.prototype.forEach.call(a, function(t) { t.style.display = "none" }), Array.prototype.forEach.call(i, function(t) { t.innerHTML = "" }), Array.prototype.forEach.call(n, function(t) { t_removeClass(t, "js-error-control-box") }), t_removeClass(t, "js-send-form-error"), t_removeClass(t, "js-send-form-success")); } function validate(t) { t instanceof Element || (t = t[0]); for (var e, r, o = t.querySelectorAll(".js-tilda-rule"), a = [], n = !0, i = 0; i < o.length; i++) { var s = o[i] , l = !!parseInt(s.getAttribute("data-tilda-req") || 0, 10) , d = s.getAttribute("data-tilda-rule") || "none" , c = "" , u = "" , m = s.getAttribute("data-tilda-rule-minlength") || 0 , p = s.getAttribute("data-tilda-rule-maxlength") || 0 , f = {} , _ = s.value , y = "" , w = s.getAttribute("type") , h = s.getAttribute("name") , g = t.getAttribute("data-formcart"); f.obj = s, f.type = [], _ && _.length && (y = _.replace(/[\s\u0000—\u001F\u2000-\u200F\uFEFF\u2028-\u202F\u205F-\u206F]/gi, ""), _ = _.trim()), 0 < _.length && (n = !1), m = m && parseInt(m, 10), p = p && parseInt(p, 10); var v = !_.length && !y.length , w = "checkbox" === w || "radio" === w , h = !t.querySelectorAll('[name="' + h + '"]:checked').length; if (l && (v || w && h)) f.type.push("req"); else { switch (d) { case "email": c = /^(?!\.)(?!.*\.\.)[a-zA-Zёа-яЁА-Я0-9\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD_\.\-\+]{0,63}[a-zA-Zёа-яЁА-Я0-9\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD_\-\+]@[a-zA-Zёа-яЁА-ЯЁёäöüÄÖÜßèéû0-9][a-zA-Zёа-яЁА-ЯЁёäöüÄÖÜßèéû0-9\.\-]{0,253}\.[a-zA-Zёа-яЁА-Я]{2,10}$/gi, _.length && !_.match(c) && f.type.push("email"); break; case "url": c = /^((https?|ftp):\/\/)?[a-zA-Zёа-яЁА-ЯЁёäöüÄÖÜßèéûşç0-9][a-zA-Zёа-яЁА-ЯЁёäöüÄÖÜßèéûşç0-9_\.\-]{0,253}\.[a-zA-Zёа-яЁА-Я]{2,10}\/?$/gi, _.length && ((u = (u = (u = _.split("//")) && 1 < u.length ? u[1] : u[0]).split("/")) && u.length && u[0] ? (u = u[0]).match(c) || f.type.push("url") : (u && !u[0] || f.type.push("url"), u = "")); break; case "phone": var b = s.getAttribute("data-tilda-mask") , E = "^[0-9()+-"; b && (-1 !== b.indexOf("*") ? E += "a-zёа-я" : (-1 !== b.indexOf("a") && (E += "a-z"), -1 !== b.indexOf("а") && (E += "а-яё"))), E += "]+$", c = new RegExp(E,"gi"), (y.length && !y.match(c) || 1 == (u = y.replace(/[^0-9]+/g, "")).indexOf("000") || 1 == u.indexOf("111") || 1 == u.indexOf("222") && "5" != u.substring(0, 1) || 1 == u.indexOf("333") || 1 == u.indexOf("444") || 1 == u.indexOf("555") && "0" != u.substring(0, 1) || 1 == u.indexOf("666") && "0" != u.substring(0, 1) || 1 == u.indexOf("8888") && "4" != u.substring(0, 1)) && f.type.push("phone"); break; case "number": c = /^[0-9]+$/gi, 0 < y.length && !y.match(c) && f.type.push("number"); break; case "date": 0 < y.length && !y.match({ "DD-MM-YYYY": /^(0[1-9]|1[0-9]|2[0-9]|3[01])[\-\.\/](0[1-9]|1[012])[\-\.\/][0-9]{4}$/, "MM-DD-YYYY": /^(0[1-9]|1[012])[\-\.\/](0[1-9]|1[0-9]|2[0-9]|3[01])[\-\.\/][0-9]{4}$/, "YYYY-MM-DD": /^[0-9]{4}[\-\.\/](0[1-9]|1[012])[\-\.\/](0[1-9]|1[0-9]|2[0-9]|3[01])$/ }[s.getAttribute("data-tilda-dateformat")] || /^[0-9]{1,4}[\-\.\/][0-9]{1,2}[\-\.\/][0-9]{1,4}$/gi) && f.type.push("date"); break; case "time": c = /^[0-9]{2}[:\.][0-9]{2}$/gi, 0 < y.length && !y.match(c) && f.type.push("time"); break; case "name": c = /^([ЁёäöüÄÖÜßèéûҐґЄєІіЇїӐӑЙйК̆к̆Ӄ̆ӄ̆Ԛ̆ԛ̆Г̆г̆Ҕ̆ҕ̆ӖӗѢ̆ѣ̆ӁӂꚄ̆ꚅ̆ҊҋО̆о̆Ө̆ө̆Ꚍ̆ꚍ̆ЎўХ̆х̆Џ̆џ̆Ꚏ̆ꚏ̆Ꚇ̆ꚇ̆Ҽ̆ҽ̆Ш̆ш̆Ꚗ̆ꚗ̆Щ̆щ̆Ы̆ы̆Э̆э̆Ю̆ю̆Я̆я̆А́а́ЃѓД́д́Е́е́Ё́ёӘ́ә́З́з́И́и́І́і́Ї́ї́ЌќЛ́л́Н́н́О́о́Р́р́С́с́Т́т́У́у́Ӱ́ӱ́Ү́ү́Х́х́Ц́ц́Ы́ы́Э́э́Ӭ́ӭ́Ю́ю́Ю̈́ю̈́Я́я́Ѣ́ѣ́ҒғӺӻҒ̌ғ̌Ј̵ј̵ҞҟҜҝԞԟӨөҎҏҰұӾӿҸҹҌҍҢңҚқҒғӘәҺһІіҰұҮүӨөȺⱥꜺꜻƂƃɃƀȻȼꞒꞓƋƌĐđɆɇǤǥꞠꞡĦħƗɨƗ́ɨ́Ɨ̀ɨ̀Ɨ̂ɨ̂Ɨ̌ɨ̌Ɨ̃ɨ̃Ɨ̄ɨ̄Ɨ̈ɨ̈Ɨ̋ɨ̋Ɨ̏ɨ̏Ɨ̧ɨ̧Ɨ̧̀ɨ̧̀Ɨ̧̂ɨ̧̂Ɨ̧̌ɨ̧̌ᵼɈɉɟɟ̟ʄʄ̊ʄ̥K̵k̵ꝀꝁꝂꝃꝄꝅꞢꞣŁłł̓Ł̣ł̣ᴌȽƚⱠⱡꝈꝉƛƛ̓ꞤꞥꝊꝋØøǾǿØ̀ø̀Ø̂øØ̌ø̌Ø̄ø̄Ø̃ø̃Ø̨ø̨Ø᷎ø᷎ᴓⱣᵽꝐꝑꝖꝗꝘꝙɌɍꞦꞧꞨꞩẜẝŦŧȾⱦᵺꝤꝥꝦꝧɄʉɄ́ʉ́Ʉ̀ʉ̀Ʉ̂ʉ̂Ʉ̌ʉ̌Ʉ̄ʉ̄Ʉ̃ʉ̃Ʉ̃́ʉ̃́Ʉ̈ʉ̈ʉ̞ᵾU̸u̸ᵿꝞꝟw̸ɎɏƵƶA-Za-z\u00C0\u00C0-\u00C3\u00C8-\u00CA\u00CC\u00CD\u00D2-\u00D9\u00DA\u00DD\u00E0-\u00E3\u00E8\u00E9\u00EA\u00EC\u00ED\u00F2-\u00F5\u00F9\u00FA\u00FD\u0102\u0103\u0110\u0111\u0128\u0129\u0168\u0169\u01A0\u01A1\u01AF\u01B0\u1EA0\u1EA1-\u1EF9\u0027\u2019\u0300-\u03FF\u0400-\u04FF\u0500-\u05FF\u0600-\u06FF\u3040-\u30FF\u0041-\u007A\u00C0-\u02B8\uFB1D-\uFB1F\uFB2A-\uFB4E\u0E00-\u0E7F\u10A0-\u10FF\u3040-\u309F\u30A0-\u30FF\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD]{1,})([ЁёäöüÄÖÜßèéûҐґЄєІіЇїӐӑЙйК̆к̆Ӄ̆ӄ̆Ԛ̆ԛ̆Г̆г̆Ҕ̆ҕ̆ӖӗѢ̆ѣ̆ӁӂꚄ̆ꚅ̆ҊҋО̆о̆Ө̆ө̆Ꚍ̆ꚍ̆ЎўХ̆х̆Џ̆џ̆Ꚏ̆ꚏ̆Ꚇ̆ꚇ̆Ҽ̆ҽ̆Ш̆ш̆Ꚗ̆ꚗ̆Щ̆щ̆Ы̆ы̆Э̆э̆Ю̆ю̆Я̆я̆А́а́ЃѓД́д́Е́е́Ё́ёӘ́ә́З́з́И́и́І́і́Ї́ї́ЌќЛ́л́Н́н́О́о́Р́р́С́с́Т́т́У́у́Ӱ́ӱ́Ү́ү́Х́х́Ц́ц́Ы́ы́Э́э́Ӭ́ӭ́Ю́ю́Ю̈́ю̈́Я́я́Ѣ́ѣ́ҒғӺӻҒ̌ғ̌Ј̵ј̵ҞҟҜҝԞԟӨөҎҏҰұӾӿҸҹҌҍҢңҚқҒғӘәҺһІіҰұҮүӨөȺⱥꜺꜻƂƃɃƀȻȼꞒꞓƋƌĐđɆɇǤǥꞠꞡĦħƗɨƗ́ɨ́Ɨ̀ɨ̀Ɨ̂ɨ̂Ɨ̌ɨ̌Ɨ̃ɨ̃Ɨ̄ɨ̄Ɨ̈ɨ̈Ɨ̋ɨ̋Ɨ̏ɨ̏Ɨ̧ɨ̧Ɨ̧̀ɨ̧̀Ɨ̧̂ɨ̧̂Ɨ̧̌ɨ̧̌ᵼɈɉɟɟ̟ʄʄ̊ʄ̥K̵k̵ꝀꝁꝂꝃꝄꝅꞢꞣŁłł̓Ł̣ł̣ᴌȽƚⱠⱡꝈꝉƛƛ̓ꞤꞥꝊꝋØøǾǿØ̀ø̀Ø̂øØ̌ø̌Ø̄ø̄Ø̃ø̃Ø̨ø̨Ø᷎ø᷎ᴓⱣᵽꝐꝑꝖꝗꝘꝙɌɍꞦꞧꞨꞩẜẝŦŧȾⱦᵺꝤꝥꝦꝧɄʉɄ́ʉ́Ʉ̀ʉ̀Ʉ̂ʉ̂Ʉ̌ʉ̌Ʉ̄ʉ̄Ʉ̃ʉ̃Ʉ̃́ʉ̃́Ʉ̈ʉ̈ʉ̞ᵾU̸u̸ᵿꝞꝟw̸ɎɏƵƶA-Za-z\u00C0\u00C0-\u00C3\u00C8-\u00CA\u00CC\u00CD\u00D2-\u00D9\u00DA\u00DD\u00E0-\u00E3\u00E8\u00E9\u00EA\u00EC\u00ED\u00F2-\u00F5\u00F9\u00FA\u00FD\u0102\u0103\u0110\u0111\u0128\u0129\u0168\u0169\u01A0\u01A1\u01AF\u01B0\u1EA0\u1EA1-\u1EF9\u0041-\u007A\u00C0-\u02B8\u0300-\u03FF\u0400-\u04FF\u0500-\u05FF\u0600-\u06FF\u3040-\u30FF\uFB1D-\uFB1F\uFB2A-\uFB4E\u0E00-\u0E7F\u10A0-\u10FF\u3040-\u309F\u30A0-\u30FF\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD\-\'\‘\s\.]{0,})$/gi, _.length && !_.match(c) && f.type.push("name"); break; case "nameeng": c = /^([A-Za-z\s]{1,}((\-)?[A-Za-z\.\s](\')?){0,})*$/i, _.length && !_.match(c) && f.type.push("nameeng"); break; case "namerus": c = /^([А-Яа-яЁё\s]{1,}((\-)?[А-Яа-яЁё\.\s](\')?){0,})*$/i, _.length && !_.match(c) && f.type.push("namerus"); break; case "string": c = /^[A-Za-zА-Яа-я0-9ЁёЁёäöüÄÖÜßèéûӐӑЙйК̆к̆Ӄ̆ӄ̆Ԛ̆ԛ̆Г̆г̆Ҕ̆ҕ̆ӖӗѢ̆ѣ̆ӁӂꚄ̆ꚅ̆ҊҋО̆о̆Ө̆ө̆Ꚍ̆ꚍ̆ЎўХ̆х̆Џ̆џ̆Ꚏ̆ꚏ̆Ꚇ̆ꚇ̆Ҽ̆ҽ̆Ш̆ш̆Ꚗ̆ꚗ̆Щ̆щ̆Ы̆ы̆Э̆э̆Ю̆ю̆Я̆я̆А́а́ЃѓД́д́Е́е́Ё́ёӘ́ә́З́з́И́и́І́і́Ї́ї́ЌќЛ́л́Н́н́О́о́Р́р́С́с́Т́т́У́у́Ӱ́ӱ́Ү́ү́Х́х́Ц́ц́Ы́ы́Э́э́Ӭ́ӭ́Ю́ю́Ю̈́ю̈́Я́я́Ѣ́ѣ́ҒғӺӻҒ̌ғ̌Ј̵ј̵ҞҟҜҝԞԟӨөҎҏҰұӾӿҸҹҌҍҢңҚқҒғӘәҺһІіҰұҮүӨөȺⱥꜺꜻƂƃɃƀȻȼꞒꞓƋƌĐđɆɇǤǥꞠꞡĦħƗɨƗ́ɨ́Ɨ̀ɨ̀Ɨ̂ɨ̂Ɨ̌ɨ̌Ɨ̃ɨ̃Ɨ̄ɨ̄Ɨ̈ɨ̈Ɨ̋ɨ̋Ɨ̏ɨ̏Ɨ̧ɨ̧Ɨ̧̀ɨ̧̀Ɨ̧̂ɨ̧̂Ɨ̧̌ɨ̧̌ᵼɈɉɟɟ̟ʄʄ̊ʄ̥K̵k̵ꝀꝁꝂꝃꝄꝅꞢꞣŁłł̓Ł̣ł̣ᴌȽƚⱠⱡꝈꝉƛƛ̓ꞤꞥꝊꝋØøǾǿØ̀ø̀Ø̂øØ̌ø̌Ø̄ø̄Ø̃ø̃Ø̨ø̨Ø᷎ø᷎ᴓⱣᵽꝐꝑꝖꝗꝘꝙɌɍꞦꞧꞨꞩẜẝŦŧȾⱦᵺꝤꝥꝦꝧɄʉɄ́ʉ́Ʉ̀ʉ̀Ʉ̂ʉ̂Ʉ̌ʉ̌Ʉ̄ʉ̄Ʉ̃ʉ̃Ʉ̃́ʉ̃́Ʉ̈ʉ̈ʉ̞ᵾU̸u̸ᵿꝞꝟw̸ɎɏƵƶ\u0041-\u007A\u00C0-\u02B8\u0300-\u03FF\u0400-\u04FF\u0500-\u05FF\u0600-\u06FF\u3040-\u30FF\uFB1D-\uFB1F\uFB2A-\uFB4E\u0E00-\u0E7F\u10A0-\u10FF\u3040-\u309F\u30A0-\u30FF\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD,\.:;\"\'`\-\_\+\?\!\%\$\@\*\&\^\s]$/i, _.length && !_.match(c) && f.type.push("string"); break; case "chosevalue": "true" === s.getAttribute("data-option-selected") || f.type.push("chosevalue"); break; case "promocode": "y" !== g || !y.length || !window.tcart || window.tcart.promocode && window.tcart.prodamount_discountsum || f.type.push("promocode"); break; case "deliveryreq": f.type.push("deliveryreq") } 0 < m && _.length && _.length < m && f.type.push("minlength"), 0 < p && _.length && _.length > p && f.type.push("maxlength") } f.type && f.type.length && (a[a.length] = f) } return "y" === g && (e = void 0 !== window.tcart_minorder && 0 < window.tcart_minorder, r = void 0 !== window.tcart_mincntorder && 0 < window.tcart_mincntorder, e && window.tcart.prodamount < window.tcart_minorder && ((f = { obj: {}, type: [] }).type.push("minorder"), a.push(f)), r && window.tcart.total < window.tcart_mincntorder && ((f = { obj: {}, type: [] }).type.push("minquantity"), a.push(f))), n && !a.length && (a = [{ obj: "none", type: ["emptyfill"] }]), a } function showErrors(t, e) { if (t instanceof Element || (t = t[0]), !e || !e.length) return !1; if ("y" === t.getAttribute("data-error-popup")) return showErrorInPopup(t, e); for (var r = (r = t.getAttribute("data-inputbox")) || ".blockinput", o = "", a = !1, n = "", i = "", s = "", l = 0; l < e.length; l++) if (e[l] && e[l].obj) { if (0 === l && "none" === e[l].obj) { return false; } var c = e[l].obj; c instanceof Element || (c = c[0]), c && (o = c.closest(r)), o && (i = o.querySelectorAll(".t-input-error"), t_addClass(o, "js-error-control-box"), 0 < i.length && (a = !0)); for (d = 0; d < e[l].type.length; d++) { var u = e[l].type[d] , s = ""; if (1, (n = t.querySelectorAll(".js-rule-error-" + u)).length) for (var m = 0; m < n.length; m++) n[m].getAttribute("data-rule-filled") || (n[m].textContent && n[m].innerText || !t_forms__getMsg(u) ? s = n[0].textContent || n[0].innerText : n[m].innerHTML = t_forms__getMsg(u)), n[m].style.display = "block"; else if (t_forms__getMsg(u) && (n = t.querySelectorAll(".js-rule-error-all")).length) for (m = 0; m < n.length; m++) n[m].innerHTML = t_forms__getMsg(u), n[m].style.display = "block"; a && (!s && t_forms__getMsg(u + "field") ? s = t_forms__getMsg(u + "field") : t_forms__getMsg(u) && (s = t_forms__getMsg(u)), s && o && (i = o.querySelectorAll(".t-input-error"), Array.prototype.forEach.call(i, function(t) { t.innerHTML = s }))) } } var p = t.querySelectorAll(".js-errorbox-all"); return Array.prototype.forEach.call(p, function(t) { t.style.display = "block" }), t_triggerEvent(t, "tildaform:aftererror"), !0 } function showErrorInPopup(t, e) { if (t instanceof Element || (t = t[0]), !e || !e.length) return !1; let arr = []; let arrUniq = []; var r, o = t.getAttribute("id"), a = (a = t.getAttribute("data-inputbox")) || ".blockinput", n = "", i = !1, s = "", l = "", d = "", c = document.getElementById("tilda-popup-for-error"); c || (document.body.insertAdjacentHTML("beforeend", ''), t_addEventListener(c = document.getElementById("tilda-popup-for-error"), "click", function(t) { if (((t = t || window.event).target || t.srcElement).closest(".js-errorbox-close")) return t.preventDefault ? t.preventDefault() : t.returnValue = !1, t_fadeOut(c), !1 })); for (var u, m, p = 0; p < e.length; p++) if (e[p] && e[p].obj) { if (0 === p && "none" === e[p].obj) { return false; } var f = e[p].obj; f instanceof Element || (f = f[0]), f && (n = f.closest(a)), n && (s = n.querySelectorAll(".t-input-error"), t_addClass(n, "js-error-control-box"), s.length && (i = !0)); for (var _ = 0; _ < e[p].type.length; _++) { var y = e[p].type[_] , w = t_forms__getMsg(y) , l = ""; (r = t.querySelector(".js-rule-error-" + y)) ? r.textContent && r.innerText || !w || -1 !== d.indexOf(w) ? (l = r.textContent || r.innerText, -1 === d.indexOf(w) && (d = d + '

      ' + l + "

      ")) : d = d + '

      ' + w + "

      " : w && -1 === d.indexOf(w) && (d = d + '

      ' + w + "

      "), i && (!l && t_forms__getMsg(y + "field") ? l = t_forms__getMsg(y + "field") : w && (l = w), l && n && (s = n.querySelectorAll(".t-input-error"), Array.prototype.forEach.call(s, function(t) { t.innerHTML = l, t_fadeIn(t) }))) } } function h(t) { "INPUT" === ((t = t || window.event).target || t.srcElement).tagName && (t = u.querySelectorAll("form .t-input-error"), t_fadeOut(c), Array.prototype.forEach.call(t, function(t) { t.innerHTML = "", t_fadeOut(t) }), window.t_forms__errorTimerID && (window.clearTimeout(window.t_forms__errorTimerID), window.t_forms__errorTimerID = 0), window.isInitEventsZB[o] = !0) } return d && (c.querySelector(".t-form__errorbox-text").innerHTML += d, m = c.querySelectorAll(".t-form__errorbox-item"), arr = Array.from(m), arrUniq = arr.reduce((o, i) => { if (!o.find(v => v.innerHTML == i.innerHTML)) { o.push(i); } return o; }, []), Array.prototype.forEach.call(arrUniq, function(t) { t.style.display = "block" }), t_fadeIn(c)), window.t_forms__errorTimerID && window.clearTimeout(window.t_forms__errorTimerID), window.t_forms__errorTimerID = window.setTimeout(function() { t_fadeOut(c), s = t.querySelectorAll(".t-input-error"), Array.prototype.forEach.call(s, function(t) { t.innerHTML = "", t_fadeOut(t) }), window.t_forms__errorTimerID = 0 }, 1e4), window.isInitEventsZB[o] || (u = t.closest(".r"), m = "focus", document.addEventListener || (m = "focusin"), t_removeEventListener(u, m, h), t_addEventListener(u, m, h, !0), t_removeEventListener(u, "change", h), t_addEventListener(u, "change", h, !0)), t_triggerEvent(t, "tildaform:aftererror"), !0 }; function t_forms__getMsg(t) { var e = [] , r = window.t_forms__lang; return e.EN = { success: "Thank you! Your data has been submitted.", successorder: "Thank you! Order created. Please wait while you are redirected to the payment page...", email: "Please enter a valid email address", url: "Please put a correct URL", phone: "Please put a correct phone number", number: "Please put a correct number", date: "Please put a correct date", time: "Please put a correct time (HH:mm)", name: "Please put a name", namerus: "Please put a correct name (only cyrillic letters)", nameeng: "Please put a correct name (only latin letters)", string: "You put incorrect symbols. Only letters, numbers and punctuation symbols are allowed", req: "Please fill out all required fields", reqfield: "Required field", minlength: "Value is too short", maxlength: "Value too big", emptyfill: "None of the fields are filled in", chosevalue: "Please select an address from the options", deliveryreq: "It is not possible to place an order without delivery. Please refresh the page and try again", promocode: "Please activate promo code or clear input field" }, e.RU = { success: "Спасибо! Данные успешно отправлены.", successorder: "Спасибо! Заказ оформлен. Пожалуйста, подождите. Идет переход к оплате...", email: "Укажите, пожалуйста, корректный email", url: "Укажите, пожалуйста, корректный URL", phone: "Укажите, пожалуйста, корректный номер телефона", number: "Укажите, пожалуйста, корректный номер", date: "Укажите, пожалуйста, корректную дату", time: "Укажите, пожалуйста, корректное время (ЧЧ:ММ)", name: "Укажите, пожалуйста, имя", namerus: "Укажите, пожалуйста, имя (только кириллица)", nameeng: "Укажите, пожалуйста, имя (только латиница)", string: "Вы написали некорректные символы. Разрешены только буквы, числа и знаки пунктуации", req: "Пожалуйста, заполните все обязательные поля", reqfield: "Обязательное поле", minlength: "Слишком короткое значение", maxlength: "Слишком длинное", emptyfill: "Ни одно поле не заполнено", chosevalue: "Пожалуйста, выберите адрес из предложенных вариантов", deliveryreq: "Невозможно оформить заказ без доставки. Пожалуйста, перезагрузите страницу и попробуйте еще раз.", promocode: "Активируйте, пожалуйста промокод или очистите поле" }, "function" == typeof t_forms__getDict && "RU" !== r && "EN" !== r && (e = t_forms__getDict()), (e[r] || e.EN)[t] } }()); function nolimShowSuccessPopup878943655(t) { if (document.querySelector("#nolimnolimtildaformsuccesspopuptext")) { document.querySelector("#nolimnolimtildaformsuccesspopuptext").closest(".t-form-success-popup").remove(); } var e = "" , r = document.getElementById("nolimnolimtildaformsuccesspopup906261274") , o = document.getElementById("nolimnolimtildaformsuccesspopuptext") , a = document.body; r || (e += '', e += '', a.insertAdjacentHTML("beforeend", ''), r = document.getElementById("nolimnolimtildaformsuccesspopup906261274"), o = document.getElementById("nolimnolimtildaformsuccesspopuptext"), e = r.querySelector(".t-form-success-popup__close-icon"), t_addEventListener(r, "click", function(t) { ((t = t || window.event).target || t.srcElement) === this && nolimCloseSuccessPopup878943655() }), t_addEventListener(e, "click", function() { nolimCloseSuccessPopup878943655() }), t_addEventListener(a, "keydown", function(t) { 27 == ((t = t || window.event).keyCode || t.which) && nolimCloseSuccessPopup878943655() })), o.innerHTML = t, t_fadeIn(r), t_addClass(a, "t-body_success-popup-showed"), /iPhone|iPad|iPod/i.test(navigator.userAgent) && !window.MSStream && setTimeout(function() { nolimLockBodyScroll878943655() }, 500) } function nolimCloseSuccessPopup878943655() { var t = document.getElementById("nolimnolimtildaformsuccesspopup906261274"); t && (t_removeClass(document.body, "t-body_success-popup-showed"), /iPhone|iPad|iPod/i.test(navigator.userAgent) && !window.MSStream && nolimUnlockBodyScroll878943655(), t_fadeOut(t)) } function nolimLockBodyScroll878943655() { var t, e = document.body; t_hasClass(e, "t-body_scroll-locked") || (t = void 0 !== window.pageYOffset ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop, t_addClass(e, "t-body_scroll-locked"), e.style.top = "-" + t + "px", e.setAttribute("data-popup-scrolltop", t)) } function nolimUnlockBodyScroll878943655() { var t, e = document.body; t_hasClass(e, "t-body_scroll-locked") && (t = e.getAttribute("data-popup-scrolltop"), t_removeClass(e, "t-body_scroll-locked"), e.style.top = null, e.removeAttribute("data-popup-scrolltop"), document.documentElement.scrollTop = parseInt(t)) }
      Сообщение об успешной отправке!
      Запросить коммерческое предложение