Калькулятор объёма растворителя
Точный расчёт объёма растворителя для приготовления растворов заданной концентрации — поддержка молярной, массовой концентрации и разбавления.
—
Общий объём раствора
мл
—
Коэффициент разбавления
раз
Как пользоваться
1
Выберите тип расчёта в выпадающем списке: приготовление из твёрдого вещества, разбавление раствора или расчёт по массовой концентрации.
2
Заполните все поля ввода. Для молярной концентрации укажите массу навески (например, 5.84 г), молярную массу вещества (NaCl — 58.44 г/моль) и желаемую концентрацию (например, 0.1 моль/л). Для разбавления — исходную и конечную концентрации с исходным объёмом.
3
Нажмите кнопку «Рассчитать». Результат отобразится в правой панели: объём растворителя, общий объём раствора и дополнительные показатели.
4
При необходимости измените параметры и повторите расчёт. Кнопка «Сбросить» очищает все поля и результаты.
Примеры использования
Приготовление 0.1 М раствора NaCl
Масса NaCl: 5.84 г, молярная масса: 58.44 г/моль, желаемая концентрация: 0.1 моль/л. Результат: объём растворителя ≈ 1000 мл (1 литр). Расчёт: V = 5.84 / (58.44 × 0.1) = 1.0 л.
Разбавление 1 М раствора HCl до 0.25 М
Исходная концентрация: 1 моль/л, исходный объём: 100 мл, желаемая концентрация: 0.25 моль/л. Конечный объём: V₂ = (1 × 100) / 0.25 = 400 мл. Объём добавляемого растворителя: 300 мл.
Приготовление раствора глюкозы 50 г/л
Масса глюкозы: 25 г, желаемая концентрация: 50 г/л. Объём растворителя ≈ 500 мл. Расчёт: V = 25 / 50 = 0.5 л = 500 мл.
Важные нюансы
- Техника безопасности: При работе с химическими веществами всегда используйте средства индивидуальной защиты (перчатки, очки, халат). Работайте в хорошо проветриваемом помещении или под вытяжкой. Ознакомьтесь с паспортом безопасности вещества перед началом работы.
- Приближение объёма: Калькулятор предполагает, что объём растворителя приблизительно равен общему объёму раствора. Для концентрированных растворов (выше 0.5 М для многих солей) реальный объём может отличаться из-за эффектов сольватации и изменения плотности. Для точных аналитических работ используйте мерную посуду и доводите до метки после растворения.
- Температурная зависимость: Объём раствора зависит от температуры. Стандартные концентрации обычно приводятся для 20–25 °C. При значительных отклонениях температуры учитывайте коэффициент теплового расширения растворителя.
- Разбавление кислот и щелочей: При разбавлении концентрированных кислот (серной, азотной) всегда лейте кислоту в воду, а не наоборот. Процесс экзотермичен — добавляйте кислоту медленно, при постоянном перемешивании и охлаждении.
- Единицы измерения: Следите за согласованностью единиц. В режиме разбавления исходная и желаемая концентрации должны быть выражены в одних и тех же единицах (обе в моль/л, обе в %, обе в г/л). Калькулятор не выполняет автоматического пересчёта между разными типами концентраций.
Формулы расчёта
Во всех формулах ниже Vр-ля — искомый объём чистого растворителя, Vобщ — общий объём приготовленного раствора.
Для пересчёта массовой доли (w, %) в массовую концентрацию (γ, г/л) для водных растворов с плотностью ~1 г/мл: γ ≈ w × 10 (например, 5% ≈ 50 г/л).
Источники данных
- IUPAC Gold Book — Международный союз теоретической и прикладной химии: определения молярности, моляльности, массовой концентрации и других величин, используемых в расчётах. goldbook.iupac.org
- NIST Chemistry WebBook — Национальный институт стандартов и технологий США: эталонные значения молярных масс, плотностей и термодинамических данных для широкого круга веществ. webbook.nist.gov/chemistry
- PubChem — Открытая химическая база данных NIH (Национальные институты здравоохранения США): молярные массы, структурные формулы и физико-химические свойства соединений. pubchem.ncbi.nlm.nih.gov
- CRC Handbook of Chemistry and Physics — Фундаментальный справочник: таблицы молярных масс, плотностей растворов, коэффициентов расширения и других справочных величин, используемых при лабораторных расчётах.
Все формулы, использованные в калькуляторе, основаны на стандартных уравнениях аналитической химии и общей химии вузовского курса. Молярные массы конкретных веществ пользователь вводит самостоятельно; для их уточнения рекомендуется обращаться к перечисленным выше источникам.
Калькулятор объёма растворителя — удобный онлайн-инструмент для студентов-химиков, лаборантов, фармацевтов и преподавателей. С его помощью можно быстро определить, сколько растворителя потребуется для приготовления раствора нужной концентрации из сухого вещества, для разбавления уже готового раствора или для получения раствора с заданной массовой концентрацией. Расчёты основаны на фундаментальных химических формулах: законе сохранения количества вещества при разбавлении (C₁V₁ = C₂V₂) и определении молярной концентрации. Инструмент учитывает основные лабораторные приближения и сопровождается подробными пояснениями по технике безопасности, что делает его полезным как для учебных, так и для практических лабораторных задач.
CiAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNlbGVjdE1vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsYy1tb2RlJyk7CiAgICAgICAgdmFyIGdyb3VwTW9sYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ3JvdXAtbW9sYXInKTsKICAgICAgICB2YXIgZ3JvdXBEaWx1dGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncm91cC1kaWx1dGlvbicpOwogICAgICAgIHZhciBncm91cE1hc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ3JvdXAtbWFzcycpOwoKICAgICAgICB2YXIgYnRuQ2FsY3VsYXRlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bi1jYWxjdWxhdGUnKTsKICAgICAgICB2YXIgYnRuUmVzZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLXJlc2V0Jyk7CiAgICAgICAgdmFyIGVycm9yR2VuZXJhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1nZW5lcmFsJyk7CgogICAgICAgIHZhciByZXN1bHRTb2x2ZW50Vm9sdW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1zb2x2ZW50LXZvbHVtZScpOwogICAgICAgIHZhciByZXN1bHRUb3RhbFZvbHVtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtdG90YWwtdm9sdW1lJyk7CiAgICAgICAgdmFyIHJlc3VsdERpbHV0aW9uRmFjdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1kaWx1dGlvbi1mYWN0b3InKTsKICAgICAgICB2YXIgdmFsU29sdmVudFZvbHVtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2YWwtc29sdmVudC12b2x1bWUnKTsKICAgICAgICB2YXIgdW5pdFNvbHZlbnRWb2x1bWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndW5pdC1zb2x2ZW50LXZvbHVtZScpOwogICAgICAgIHZhciB2YWxUb3RhbFZvbHVtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2YWwtdG90YWwtdm9sdW1lJyk7CiAgICAgICAgdmFyIHVuaXRUb3RhbFZvbHVtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bml0LXRvdGFsLXZvbHVtZScpOwogICAgICAgIHZhciB2YWxEaWx1dGlvbkZhY3RvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2YWwtZGlsdXRpb24tZmFjdG9yJyk7CgogICAgICAgIGZ1bmN0aW9uIGdldEFsbEVycm9yU3BhbnMoKSB7CiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubm4tZ2VuLWNhbC1lcnJvci1tc2cnKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhpZGVBbGxFcnJvcnMoKSB7CiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBnZXRBbGxFcnJvclNwYW5zKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBlcnJvcnNbaV0udGV4dENvbnRlbnQgPSAnJzsKICAgICAgICAgICAgICAgIGVycm9yc1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZXJyb3JHZW5lcmFsKSB7CiAgICAgICAgICAgICAgICBlcnJvckdlbmVyYWwudGV4dENvbnRlbnQgPSAnJzsKICAgICAgICAgICAgICAgIGVycm9yR2VuZXJhbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzaG93RXJyb3IoZWxlbWVudElkLCBtZXNzYWdlKSB7CiAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7CiAgICAgICAgICAgIGlmIChlbCkgewogICAgICAgICAgICAgICAgZWwudGV4dENvbnRlbnQgPSBtZXNzYWdlOwogICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNob3dHZW5lcmFsRXJyb3IobWVzc2FnZSkgewogICAgICAgICAgICBpZiAoZXJyb3JHZW5lcmFsKSB7CiAgICAgICAgICAgICAgICBlcnJvckdlbmVyYWwudGV4dENvbnRlbnQgPSBtZXNzYWdlOwogICAgICAgICAgICAgICAgZXJyb3JHZW5lcmFsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgICAgICAgZXJyb3JHZW5lcmFsLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwYXJzZVBvc2l0aXZlRmxvYXQodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBOYU47CiAgICAgICAgICAgIHZhciB0cmltbWVkID0gU3RyaW5nKHZhbHVlKS50cmltKCk7CiAgICAgICAgICAgIGlmICh0cmltbWVkID09PSAnJykgcmV0dXJuIE5hTjsKICAgICAgICAgICAgdmFyIG51bSA9IHBhcnNlRmxvYXQodHJpbW1lZCk7CiAgICAgICAgICAgIGlmIChpc05hTihudW0pKSByZXR1cm4gTmFOOwogICAgICAgICAgICBpZiAobnVtIDw9IDApIHJldHVybiBOYU47CiAgICAgICAgICAgIGlmICghaXNGaW5pdGUobnVtKSkgcmV0dXJuIE5hTjsKICAgICAgICAgICAgcmV0dXJuIG51bTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZU1vZGVWaXNpYmlsaXR5KCkgewogICAgICAgICAgICB2YXIgbW9kZSA9IHNlbGVjdE1vZGUudmFsdWU7CiAgICAgICAgICAgIGdyb3VwTW9sYXIuc3R5bGUuZGlzcGxheSA9IChtb2RlID09PSAnbW9sYXInKSA/ICcnIDogJ25vbmUnOwogICAgICAgICAgICBncm91cERpbHV0aW9uLnN0eWxlLmRpc3BsYXkgPSAobW9kZSA9PT0gJ2RpbHV0aW9uJykgPyAnJyA6ICdub25lJzsKICAgICAgICAgICAgZ3JvdXBNYXNzLnN0eWxlLmRpc3BsYXkgPSAobW9kZSA9PT0gJ21hc3MnKSA/ICcnIDogJ25vbmUnOwogICAgICAgICAgICByZXN1bHREaWx1dGlvbkZhY3Rvci5zdHlsZS5kaXNwbGF5ID0gKG1vZGUgPT09ICdkaWx1dGlvbicpID8gJycgOiAnbm9uZSc7CiAgICAgICAgICAgIGhpZGVBbGxFcnJvcnMoKTsKICAgICAgICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjbGVhclJlc3VsdHMoKSB7CiAgICAgICAgICAgIHZhbFNvbHZlbnRWb2x1bWUudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgdW5pdFNvbHZlbnRWb2x1bWUudGV4dENvbnRlbnQgPSAn0LzQuyc7CiAgICAgICAgICAgIHZhbFRvdGFsVm9sdW1lLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgIHVuaXRUb3RhbFZvbHVtZS50ZXh0Q29udGVudCA9ICfQvNC7JzsKICAgICAgICAgICAgdmFsRGlsdXRpb25GYWN0b3IudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGRpc3BsYXlSZXN1bHRzKHNvbHZlbnRWb2x1bWVMLCB0b3RhbFZvbHVtZUwsIGRpbHV0aW9uRmFjdG9yKSB7CiAgICAgICAgICAgIHZhciBzdk1sID0gc29sdmVudFZvbHVtZUwgKiAxMDAwOwogICAgICAgICAgICB2YXIgdHZNbCA9IHRvdGFsVm9sdW1lTCAqIDEwMDA7CiAgICAgICAgICAgIGlmIChzdk1sID49IDEwMDApIHsKICAgICAgICAgICAgICAgIHZhbFNvbHZlbnRWb2x1bWUudGV4dENvbnRlbnQgPSBwYXJzZUZsb2F0KHNvbHZlbnRWb2x1bWVMLnRvRml4ZWQoMykpOwogICAgICAgICAgICAgICAgdW5pdFNvbHZlbnRWb2x1bWUudGV4dENvbnRlbnQgPSAn0LsnOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN2TWwgPj0gMSkgewogICAgICAgICAgICAgICAgdmFsU29sdmVudFZvbHVtZS50ZXh0Q29udGVudCA9IHBhcnNlRmxvYXQoc3ZNbC50b0ZpeGVkKDIpKTsKICAgICAgICAgICAgICAgIHVuaXRTb2x2ZW50Vm9sdW1lLnRleHRDb250ZW50ID0gJ9C80LsnOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN2TWwgPj0gMC4wMDEpIHsKICAgICAgICAgICAgICAgIHZhbFNvbHZlbnRWb2x1bWUudGV4dENvbnRlbnQgPSBwYXJzZUZsb2F0KChzdk1sICogMTAwMCkudG9GaXhlZCgyKSk7CiAgICAgICAgICAgICAgICB1bml0U29sdmVudFZvbHVtZS50ZXh0Q29udGVudCA9ICfQvNC60LsnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFsU29sdmVudFZvbHVtZS50ZXh0Q29udGVudCA9IHBhcnNlRmxvYXQoc29sdmVudFZvbHVtZUwudG9GaXhlZCg2KSk7CiAgICAgICAgICAgICAgICB1bml0U29sdmVudFZvbHVtZS50ZXh0Q29udGVudCA9ICfQuyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR2TWwgPj0gMTAwMCkgewogICAgICAgICAgICAgICAgdmFsVG90YWxWb2x1bWUudGV4dENvbnRlbnQgPSBwYXJzZUZsb2F0KHRvdGFsVm9sdW1lTC50b0ZpeGVkKDMpKTsKICAgICAgICAgICAgICAgIHVuaXRUb3RhbFZvbHVtZS50ZXh0Q29udGVudCA9ICfQuyc7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHZNbCA+PSAxKSB7CiAgICAgICAgICAgICAgICB2YWxUb3RhbFZvbHVtZS50ZXh0Q29udGVudCA9IHBhcnNlRmxvYXQodHZNbC50b0ZpeGVkKDIpKTsKICAgICAgICAgICAgICAgIHVuaXRUb3RhbFZvbHVtZS50ZXh0Q29udGVudCA9ICfQvNC7JzsKICAgICAgICAgICAgfSBlbHNlIGlmICh0dk1sID49IDAuMDAxKSB7CiAgICAgICAgICAgICAgICB2YWxUb3RhbFZvbHVtZS50ZXh0Q29udGVudCA9IHBhcnNlRmxvYXQoKHR2TWwgKiAxMDAwKS50b0ZpeGVkKDIpKTsKICAgICAgICAgICAgICAgIHVuaXRUb3RhbFZvbHVtZS50ZXh0Q29udGVudCA9ICfQvNC60LsnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFsVG90YWxWb2x1bWUudGV4dENvbnRlbnQgPSBwYXJzZUZsb2F0KHRvdGFsVm9sdW1lTC50b0ZpeGVkKDYpKTsKICAgICAgICAgICAgICAgIHVuaXRUb3RhbFZvbHVtZS50ZXh0Q29udGVudCA9ICfQuyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRpbHV0aW9uRmFjdG9yICE9PSBudWxsICYmIGRpbHV0aW9uRmFjdG9yICE9PSB1bmRlZmluZWQgJiYgaXNGaW5pdGUoZGlsdXRpb25GYWN0b3IpICYmIGRpbHV0aW9uRmFjdG9yID4gMCkgewogICAgICAgICAgICAgICAgdmFsRGlsdXRpb25GYWN0b3IudGV4dENvbnRlbnQgPSBwYXJzZUZsb2F0KGRpbHV0aW9uRmFjdG9yLnRvRml4ZWQoMikpOwogICAgICAgICAgICAgICAgcmVzdWx0RGlsdXRpb25GYWN0b3Iuc3R5bGUuZGlzcGxheSA9ICcnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFsRGlsdXRpb25GYWN0b3IudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgICAgIHJlc3VsdERpbHV0aW9uRmFjdG9yLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZU1vbGFyKCkgewogICAgICAgICAgICB2YXIgbWFzc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Mtc29sdXRlJyk7CiAgICAgICAgICAgIHZhciBtb2xhck1hc3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2xhci1tYXNzJyk7CiAgICAgICAgICAgIHZhciBjb25jRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVzaXJlZC1jb25jJyk7CiAgICAgICAgICAgIHZhciBtYXNzID0gcGFyc2VQb3NpdGl2ZUZsb2F0KG1hc3NFbCA/IG1hc3NFbC52YWx1ZSA6ICcnKTsKICAgICAgICAgICAgdmFyIG1vbGFyTWFzcyA9IHBhcnNlUG9zaXRpdmVGbG9hdChtb2xhck1hc3NFbCA/IG1vbGFyTWFzc0VsLnZhbHVlIDogJycpOwogICAgICAgICAgICB2YXIgY29uYyA9IHBhcnNlUG9zaXRpdmVGbG9hdChjb25jRWwgPyBjb25jRWwudmFsdWUgOiAnJyk7CiAgICAgICAgICAgIHZhciBoYXNFcnJvciA9IGZhbHNlOwogICAgICAgICAgICBpZiAoaXNOYU4obWFzcykpIHsgc2hvd0Vycm9yKCdlcnJvci1tYXNzLXNvbHV0ZScsICfQktCy0LXQtNC40YLQtSDQv9C+0LvQvtC20LjRgtC10LvRjNC90L7QtSDRh9C40YHQu9C+ICjQsyknKTsgaGFzRXJyb3IgPSB0cnVlOyB9CiAgICAgICAgICAgIGlmIChpc05hTihtb2xhck1hc3MpKSB7IHNob3dFcnJvcignZXJyb3ItbW9sYXItbWFzcycsICfQktCy0LXQtNC40YLQtSDQv9C+0LvQvtC20LjRgtC10LvRjNC90L7QtSDRh9C40YHQu9C+ICjQsy/QvNC+0LvRjCknKTsgaGFzRXJyb3IgPSB0cnVlOyB9CiAgICAgICAgICAgIGlmIChpc05hTihjb25jKSkgeyBzaG93RXJyb3IoJ2Vycm9yLWRlc2lyZWQtY29uYycsICfQktCy0LXQtNC40YLQtSDQv9C+0LvQvtC20LjRgtC10LvRjNC90L7QtSDRh9C40YHQu9C+ICjQvNC+0LvRjC/QuyknKTsgaGFzRXJyb3IgPSB0cnVlOyB9CiAgICAgICAgICAgIGlmIChoYXNFcnJvcikgewogICAgICAgICAgICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRvdGFsVm9sdW1lTCA9IG1hc3MgLyAobW9sYXJNYXNzICogY29uYyk7CiAgICAgICAgICAgIGlmICghaXNGaW5pdGUodG90YWxWb2x1bWVMKSB8fCB0b3RhbFZvbHVtZUwgPD0gMCkgewogICAgICAgICAgICAgICAgc2hvd0dlbmVyYWxFcnJvcign0J7RiNC40LHQutCwINCy0YvRh9C40YHQu9C10L3QuNGPLiDQn9GA0L7QstC10YDRjNGC0LUg0LLQstC10LTRkdC90L3Ri9C1INC00LDQvdC90YvQtS4nKTsKICAgICAgICAgICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzb2x2ZW50Vm9sdW1lTCA9IHRvdGFsVm9sdW1lTDsKICAgICAgICAgICAgZGlzcGxheVJlc3VsdHMoc29sdmVudFZvbHVtZUwsIHRvdGFsVm9sdW1lTCwgbnVsbCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjYWxjdWxhdGVEaWx1dGlvbigpIHsKICAgICAgICAgICAgdmFyIGMxRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5pdGlhbC1jb25jJyk7CiAgICAgICAgICAgIHZhciB2MUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luaXRpYWwtdm9sdW1lJyk7CiAgICAgICAgICAgIHZhciBjMkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rlc2lyZWQtY29uYy0yJyk7CiAgICAgICAgICAgIHZhciBjMSA9IHBhcnNlUG9zaXRpdmVGbG9hdChjMUVsID8gYzFFbC52YWx1ZSA6ICcnKTsKICAgICAgICAgICAgdmFyIHYxTWwgPSBwYXJzZVBvc2l0aXZlRmxvYXQodjFFbCA/IHYxRWwudmFsdWUgOiAnJyk7CiAgICAgICAgICAgIHZhciBjMiA9IHBhcnNlUG9zaXRpdmVGbG9hdChjMkVsID8gYzJFbC52YWx1ZSA6ICcnKTsKICAgICAgICAgICAgdmFyIGhhc0Vycm9yID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChpc05hTihjMSkpIHsgc2hvd0Vycm9yKCdlcnJvci1pbml0aWFsLWNvbmMnLCAn0JLQstC10LTQuNGC0LUg0L/QvtC70L7QttC40YLQtdC70YzQvdC+0LUg0YfQuNGB0LvQvicpOyBoYXNFcnJvciA9IHRydWU7IH0KICAgICAgICAgICAgaWYgKGlzTmFOKHYxTWwpKSB7IHNob3dFcnJvcignZXJyb3ItaW5pdGlhbC12b2x1bWUnLCAn0JLQstC10LTQuNGC0LUg0L/QvtC70L7QttC40YLQtdC70YzQvdC+0LUg0YfQuNGB0LvQviAo0LzQuyknKTsgaGFzRXJyb3IgPSB0cnVlOyB9CiAgICAgICAgICAgIGlmIChpc05hTihjMikpIHsgc2hvd0Vycm9yKCdlcnJvci1kZXNpcmVkLWNvbmMtMicsICfQktCy0LXQtNC40YLQtSDQv9C+0LvQvtC20LjRgtC10LvRjNC90L7QtSDRh9C40YHQu9C+Jyk7IGhhc0Vycm9yID0gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoaGFzRXJyb3IpIHsKICAgICAgICAgICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjMiA+PSBjMSkgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKCdlcnJvci1kZXNpcmVkLWNvbmMtMicsICfQltC10LvQsNC10LzQsNGPINC60L7QvdGG0LXQvdGC0YDQsNGG0LjRjyDQtNC+0LvQttC90LAg0LHRi9GC0Ywg0YHRgtGA0L7Qs9C+INC80LXQvdGM0YjQtSDQuNGB0YXQvtC00L3QvtC5INC00LvRjyDRgNCw0LfQsdCw0LLQu9C10L3QuNGPJyk7CiAgICAgICAgICAgICAgICBjbGVhclJlc3VsdHMoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdjFMID0gdjFNbCAvIDEwMDA7CiAgICAgICAgICAgIHZhciB2MkwgPSAoYzEgKiB2MUwpIC8gYzI7CiAgICAgICAgICAgIGlmICghaXNGaW5pdGUodjJMKSB8fCB2MkwgPD0gMCkgewogICAgICAgICAgICAgICAgc2hvd0dlbmVyYWxFcnJvcign0J7RiNC40LHQutCwINCy0YvRh9C40YHQu9C10L3QuNGPLiDQn9GA0L7QstC10YDRjNGC0LUg0LLQstC10LTRkdC90L3Ri9C1INC00LDQvdC90YvQtS4nKTsKICAgICAgICAgICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzb2x2ZW50Vm9sdW1lTCA9IHYyTCAtIHYxTDsKICAgICAgICAgICAgaWYgKHNvbHZlbnRWb2x1bWVMIDwgMCkgc29sdmVudFZvbHVtZUwgPSAwOwogICAgICAgICAgICB2YXIgZGlsdXRpb25GYWN0b3IgPSBjMSAvIGMyOwogICAgICAgICAgICBkaXNwbGF5UmVzdWx0cyhzb2x2ZW50Vm9sdW1lTCwgdjJMLCBkaWx1dGlvbkZhY3Rvcik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjYWxjdWxhdGVNYXNzKCkgewogICAgICAgICAgICB2YXIgbWFzc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hc3Mtc29sdXRlLTInKTsKICAgICAgICAgICAgdmFyIGNvbmNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXNzLWNvbmMnKTsKICAgICAgICAgICAgdmFyIG1hc3MgPSBwYXJzZVBvc2l0aXZlRmxvYXQobWFzc0VsID8gbWFzc0VsLnZhbHVlIDogJycpOwogICAgICAgICAgICB2YXIgY29uYyA9IHBhcnNlUG9zaXRpdmVGbG9hdChjb25jRWwgPyBjb25jRWwudmFsdWUgOiAnJyk7CiAgICAgICAgICAgIHZhciBoYXNFcnJvciA9IGZhbHNlOwogICAgICAgICAgICBpZiAoaXNOYU4obWFzcykpIHsgc2hvd0Vycm9yKCdlcnJvci1tYXNzLXNvbHV0ZS0yJywgJ9CS0LLQtdC00LjRgtC1INC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3QvtC1INGH0LjRgdC70L4gKNCzKScpOyBoYXNFcnJvciA9IHRydWU7IH0KICAgICAgICAgICAgaWYgKGlzTmFOKGNvbmMpKSB7IHNob3dFcnJvcignZXJyb3ItbWFzcy1jb25jJywgJ9CS0LLQtdC00LjRgtC1INC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3QvtC1INGH0LjRgdC70L4gKNCzL9C7KScpOyBoYXNFcnJvciA9IHRydWU7IH0KICAgICAgICAgICAgaWYgKGhhc0Vycm9yKSB7CiAgICAgICAgICAgICAgICBjbGVhclJlc3VsdHMoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdG90YWxWb2x1bWVMID0gbWFzcyAvIGNvbmM7CiAgICAgICAgICAgIGlmICghaXNGaW5pdGUodG90YWxWb2x1bWVMKSB8fCB0b3RhbFZvbHVtZUwgPD0gMCkgewogICAgICAgICAgICAgICAgc2hvd0dlbmVyYWxFcnJvcign0J7RiNC40LHQutCwINCy0YvRh9C40YHQu9C10L3QuNGPLiDQn9GA0L7QstC10YDRjNGC0LUg0LLQstC10LTRkdC90L3Ri9C1INC00LDQvdC90YvQtS4nKTsKICAgICAgICAgICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzb2x2ZW50Vm9sdW1lTCA9IHRvdGFsVm9sdW1lTDsKICAgICAgICAgICAgZGlzcGxheVJlc3VsdHMoc29sdmVudFZvbHVtZUwsIHRvdGFsVm9sdW1lTCwgbnVsbCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBoYW5kbGVDYWxjdWxhdGUoKSB7CiAgICAgICAgICAgIGhpZGVBbGxFcnJvcnMoKTsKICAgICAgICAgICAgdmFyIG1vZGUgPSBzZWxlY3RNb2RlLnZhbHVlOwogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ21vbGFyJykgewogICAgICAgICAgICAgICAgY2FsY3VsYXRlTW9sYXIoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnZGlsdXRpb24nKSB7CiAgICAgICAgICAgICAgICBjYWxjdWxhdGVEaWx1dGlvbigpOwogICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdtYXNzJykgewogICAgICAgICAgICAgICAgY2FsY3VsYXRlTWFzcygpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJlc2V0KCkgewogICAgICAgICAgICB2YXIgYWxsSW5wdXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5uLWdlbi1jYWwtZmllbGQnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxJbnB1dHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChhbGxJbnB1dHNbaV0udGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHsKICAgICAgICAgICAgICAgICAgICBhbGxJbnB1dHNbaV0uc2VsZWN0ZWRJbmRleCA9IDA7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFsbElucHV0c1tpXS50eXBlICE9PSAnYnV0dG9uJyAmJiBhbGxJbnB1dHNbaV0udHlwZSAhPT0gJ3N1Ym1pdCcpIHsKICAgICAgICAgICAgICAgICAgICBhbGxJbnB1dHNbaV0udmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICAgICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgICAgICB1cGRhdGVNb2RlVmlzaWJpbGl0eSgpOwogICAgICAgIH0KCiAgICAgICAgc2VsZWN0TW9kZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaGlkZUFsbEVycm9ycygpOwogICAgICAgICAgICBjbGVhclJlc3VsdHMoKTsKICAgICAgICAgICAgdXBkYXRlTW9kZVZpc2liaWxpdHkoKTsKICAgICAgICB9KTsKCiAgICAgICAgYnRuQ2FsY3VsYXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQ2FsY3VsYXRlKTsKICAgICAgICBidG5SZXNldC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVJlc2V0KTsKCiAgICAgICAgdXBkYXRlTW9kZVZpc2liaWxpdHkoKTsKICAgIH0pKCk7Cg==