Калькулятор ионного произведения воды
Расчёт ионного произведения воды Kw, pH, pOH и концентраций ионов H⁺ и OH⁻ при заданной температуре (0–100 °C) по известному параметру.
1.00×10⁻¹⁴
Kw — ионное произведение
(моль/л)²
14.00
pKw = –lg(Kw)
безразмерная
7.00
pH = –lg[H⁺]
безразмерная
7.00
pOH = –lg[OH⁻]
безразмерная
1.00×10⁻⁷
[H⁺] — концентрация H⁺
моль/л
1.00×10⁻⁷
[OH⁻] — концентрация OH⁻
моль/л
Как пользоваться калькулятором
1
Укажите температуру воды в градусах Цельсия (от 0 до 100 °C). По умолчанию — 25 °C. Ионное произведение воды Kw сильно зависит от температуры: при 0 °C Kw ≈ 1,15×10⁻¹⁵, при 25 °C Kw = 1,00×10⁻¹⁴, при 100 °C Kw ≈ 5,50×10⁻¹³.
2
Выберите известный параметр из выпадающего списка: pH, pOH, концентрацию ионов водорода [H⁺] или концентрацию гидроксид-ионов [OH⁻]. Концентрации вводятся в моль/л (допускается экспоненциальная запись, например 1e-7).
3
Введите числовое значение выбранного параметра. Для pH и pOH — обычно от 0 до 14 (при 25 °C), для концентраций — положительное число. Например, для нейтральной воды при 25 °C: pH = 7,00 или [H⁺] = 1×10⁻⁷ моль/л.
4
Нажмите кнопку «Рассчитать». Справа появятся все шесть связанных величин: Kw, pKw, pH, pOH, [H⁺] и [OH⁻]. Кнопка «Сбросить» возвращает исходные значения (25 °C, pH = 7).
Примеры использования
Нейтральная вода при 25 °C
Температура: 25 °C. Известный параметр: pH = 7,00. Результат: Kw = 1,00×10⁻¹⁴, pKw = 14,00, pH = 7,00, pOH = 7,00, [H⁺] = 1,00×10⁻⁷ моль/л, [OH⁻] = 1,00×10⁻⁷ моль/л. Нейтральная среда: концентрации H⁺ и OH⁻ равны.
Кислый раствор при 40 °C
Температура: 40 °C. Известный параметр: [H⁺] = 1,00×10⁻⁴ моль/л. Результат: Kw ≈ 2,92×10⁻¹⁴, pKw ≈ 13,53, pH = 4,00, pOH ≈ 9,53, [H⁺] = 1,00×10⁻⁴ моль/л, [OH⁻] ≈ 2,92×10⁻¹⁰ моль/л. При повышенной температуре нейтральный pH смещается ниже 7 (нейтральный pH при 40 °C ≈ 6,77).
Щелочной раствор при 80 °C
Температура: 80 °C. Известный параметр: pOH = 3,00. Результат: Kw ≈ 2,51×10⁻¹³, pKw ≈ 12,60, pOH = 3,00, pH ≈ 9,60, [OH⁻] = 1,00×10⁻³ моль/л, [H⁺] ≈ 2,51×10⁻¹⁰ моль/л. Нейтральный pOH при 80 °C ≈ 6,30.
Важные нюансы
- Ионное произведение воды Kw сильно зависит от температуры. При нагревании Kw возрастает: диссоциация воды — эндотермический процесс. При 25 °C Kw = 1,0×10⁻¹⁴, но уже при 60 °C Kw ≈ 9,6×10⁻¹⁴.
- Понятия «нейтральный pH = 7» справедливо только при 25 °C. При других температурах нейтральный pH = pKw/2. Например, при 100 °C нейтральный pH ≈ 6,13.
- Концентрации [H⁺] и [OH⁻] можно вводить в экспоненциальном формате: 1e-7, 2.5e-4 и т.д. Десятичная запятая не поддерживается — используйте точку.
- Расчёт Kw для промежуточных температур выполняется методом линейной интерполяции pKw по табличным справочным данным, что обеспечивает высокую точность в диапазоне 0–100 °C.
- Калькулятор предназначен для разбавленных водных растворов. Для концентрированных растворов (>0,1 моль/л) необходимо учитывать коэффициенты активности ионов, что выходит за рамки данного инструмента.
Формулы расчёта
Kw = [H⁺] · [OH⁻]
Определение ионного произведения воды: произведение равновесных концентраций ионов водорода и гидроксид-ионов.
pKw = –lg(Kw)
Отрицательный десятичный логарифм ионного произведения.
pH = –lg[H⁺] | pOH = –lg[OH⁻]
Определения водородного и гидроксильного показателей.
pH + pOH = pKw
Основное соотношение, связывающее pH, pOH и pKw при любой температуре. При 25 °C: pH + pOH = 14.
[H⁺] = Kw / [OH⁻] | [OH⁻] = Kw / [H⁺]
Связь концентраций ионов через ионное произведение.
pKw(T) — линейная интерполяция по табличным данным
Для промежуточных температур pKw вычисляется интерполяцией между справочными точками (0, 10, 20, 25, 30, 40, 50, 60, 70, 80, 90, 100 °C). Kw = 10–pKw.
Источники данных
- IUPAC Gold Book — определение ионного произведения воды (ionic product of water, Kw) и стандартные значения. doi:10.1351/goldbook.I03123
- NIST Chemistry WebBook — термодинамические свойства воды, константы диссоциации. National Institute of Standards and Technology, SRD 69
- CRC Handbook of Chemistry and Physics (104th Edition, 2024) — таблицы Kw и pKw для воды в диапазоне 0–100 °C. CRC Press, Section 8
- Стандартные справочные данные — значения Kw приняты в соответствии с рекомендациями IUPAC и верифицированы по учебным пособиям общей и физической химии. Расчёт основан на стандартных химических формулах и школьно-вузовских справочных значениях.
Калькулятор ионного произведения воды позволяет быстро определить все ключевые параметры водного раствора — Kw, pKw, pH, pOH, концентрации ионов H⁺ и OH⁻ — при любой температуре от 0 до 100 °C. Инструмент использует табличные справочные данные с линейной интерполяцией pKw, обеспечивая высокую точность расчётов для учебных, лабораторных и аналитических задач. Достаточно указать температуру и один известный параметр, чтобы за секунду получить полную картину кислотно-основного равновесия в разбавленном водном растворе.
CiAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRlbXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpb24tdGVtcCcpOwogICAgICAgIHZhciBwYXJhbVR5cGVTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW9uLXBhcmFtLXR5cGUnKTsKICAgICAgICB2YXIgcGFyYW1WYWx1ZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lvbi1wYXJhbS12YWx1ZScpOwogICAgICAgIHZhciBlcnJvck1zZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpb24tZXJyb3ItbXNnJyk7CiAgICAgICAgdmFyIGNhbGNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW9uLWNhbGMtYnRuJyk7CiAgICAgICAgdmFyIHJlc2V0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lvbi1yZXNldC1idG4nKTsKCiAgICAgICAgdmFyIHJlc0t3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lvbi1yZXMta3cnKTsKICAgICAgICB2YXIgcmVzUGt3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lvbi1yZXMtcGt3Jyk7CiAgICAgICAgdmFyIHJlc1BoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lvbi1yZXMtcGgnKTsKICAgICAgICB2YXIgcmVzUG9oID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lvbi1yZXMtcG9oJyk7CiAgICAgICAgdmFyIHJlc0hwbHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lvbi1yZXMtaHBsdXMnKTsKICAgICAgICB2YXIgcmVzT2htaW51cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpb24tcmVzLW9obWludXMnKTsKCiAgICAgICAgdmFyIHRhYmxlVGVtcCA9IFswLCAxMCwgMjAsIDI1LCAzMCwgNDAsIDUwLCA2MCwgNzAsIDgwLCA5MCwgMTAwXTsKICAgICAgICB2YXIgdGFibGVQa3cgPSBbMTQuOTQsIDE0LjUzLCAxNC4xNywgMTQuMDAsIDEzLjgzLCAxMy41MywgMTMuMjYsIDEzLjAyLCAxMi44MCwgMTIuNjAsIDEyLjQyLCAxMi4yNl07CgogICAgICAgIGZ1bmN0aW9uIGludGVycG9sYXRlUGt3KFQpIHsKICAgICAgICAgICAgaWYgKFQgPD0gdGFibGVUZW1wWzBdKSByZXR1cm4gdGFibGVQa3dbMF07CiAgICAgICAgICAgIGlmIChUID49IHRhYmxlVGVtcFt0YWJsZVRlbXAubGVuZ3RoIC0gMV0pIHJldHVybiB0YWJsZVBrd1t0YWJsZVBrdy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWJsZVRlbXAubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoVCA+PSB0YWJsZVRlbXBbaV0gJiYgVCA8PSB0YWJsZVRlbXBbaSArIDFdKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQwID0gdGFibGVUZW1wW2ldOwogICAgICAgICAgICAgICAgICAgIHZhciB0MSA9IHRhYmxlVGVtcFtpICsgMV07CiAgICAgICAgICAgICAgICAgICAgdmFyIHAwID0gdGFibGVQa3dbaV07CiAgICAgICAgICAgICAgICAgICAgdmFyIHAxID0gdGFibGVQa3dbaSArIDFdOwogICAgICAgICAgICAgICAgICAgIHZhciBmcmFjdGlvbiA9IChUIC0gdDApIC8gKHQxIC0gdDApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBwMCArIGZyYWN0aW9uICogKHAxIC0gcDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0YWJsZVBrd1t0YWJsZVBrdy5sZW5ndGggLSAxXTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGZvcm1hdFNjaShudW0sIGRlY2ltYWxzKSB7CiAgICAgICAgICAgIGlmIChkZWNpbWFscyA9PT0gdW5kZWZpbmVkKSBkZWNpbWFscyA9IDI7CiAgICAgICAgICAgIGlmIChudW0gPT09IDApIHJldHVybiAnMCc7CiAgICAgICAgICAgIGlmIChpc05hTihudW0pIHx8ICFpc0Zpbml0ZShudW0pKSByZXR1cm4gJ+KAlCc7CiAgICAgICAgICAgIHZhciBleHBvbmVudCA9IE1hdGguZmxvb3IoTWF0aC5sb2cxMChNYXRoLmFicyhudW0pKSk7CiAgICAgICAgICAgIHZhciBtYW50aXNzYSA9IG51bSAvIE1hdGgucG93KDEwLCBleHBvbmVudCk7CiAgICAgICAgICAgIHZhciBtYW50aXNzYVN0ciA9IG1hbnRpc3NhLnRvRml4ZWQoZGVjaW1hbHMpOwogICAgICAgICAgICBpZiAobWFudGlzc2FTdHIgPT09ICcxMC4wMCcgfHwgbWFudGlzc2FTdHIgPT09ICcxMC4wJyB8fCBtYW50aXNzYVN0ciA9PT0gJzEwJykgewogICAgICAgICAgICAgICAgbWFudGlzc2FTdHIgPSAnMS4wMCc7CiAgICAgICAgICAgICAgICBleHBvbmVudCArPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdXBlcnNjcmlwdHMgPSB7CiAgICAgICAgICAgICAgICAnMCc6ICfigbAnLCAnMSc6ICfCuScsICcyJzogJ8KyJywgJzMnOiAnwrMnLCAnNCc6ICfigbQnLAogICAgICAgICAgICAgICAgJzUnOiAn4oG1JywgJzYnOiAn4oG2JywgJzcnOiAn4oG3JywgJzgnOiAn4oG4JywgJzknOiAn4oG5JywKICAgICAgICAgICAgICAgICctJzogJ+KBuycKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGV4cFN0ciA9ICcnOwogICAgICAgICAgICB2YXIgZXhwQWJzID0gTWF0aC5hYnMoZXhwb25lbnQpOwogICAgICAgICAgICB2YXIgZXhwRGlnaXRzID0gU3RyaW5nKGV4cEFicykuc3BsaXQoJycpOwogICAgICAgICAgICBleHBTdHIgPSAoZXhwb25lbnQgPCAwID8gJ+KBuycgOiAnJyk7CiAgICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgZXhwRGlnaXRzLmxlbmd0aDsgZCsrKSB7CiAgICAgICAgICAgICAgICBleHBTdHIgKz0gc3VwZXJzY3JpcHRzW2V4cERpZ2l0c1tkXV0gfHwgZXhwRGlnaXRzW2RdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChleHBvbmVudCA+PSAwICYmIGV4cG9uZW50IDwgMTAgJiYgU3RyaW5nKGV4cG9uZW50KS5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgIGV4cFN0ciA9IHN1cGVyc2NyaXB0c1tTdHJpbmcoZXhwb25lbnQpXSB8fCBTdHJpbmcoZXhwb25lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtYW50aXNzYVN0ciArICfDlzEwJyArIGV4cFN0cjsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGZvcm1hdEZpeGVkKG51bSwgZGVjaW1hbHMpIHsKICAgICAgICAgICAgaWYgKGRlY2ltYWxzID09PSB1bmRlZmluZWQpIGRlY2ltYWxzID0gMjsKICAgICAgICAgICAgaWYgKGlzTmFOKG51bSkgfHwgIWlzRmluaXRlKG51bSkpIHJldHVybiAn4oCUJzsKICAgICAgICAgICAgcmV0dXJuIG51bS50b0ZpeGVkKGRlY2ltYWxzKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNob3dFcnJvcihtc2cpIHsKICAgICAgICAgICAgZXJyb3JNc2cudGV4dENvbnRlbnQgPSBtc2c7CiAgICAgICAgICAgIGVycm9yTXNnLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhpZGVFcnJvcigpIHsKICAgICAgICAgICAgZXJyb3JNc2cudGV4dENvbnRlbnQgPSAnJzsKICAgICAgICAgICAgZXJyb3JNc2cuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdXBkYXRlUmVzdWx0cyhrdywgcGt3LCBwaCwgcG9oLCBocGx1cywgb2htaW51cykgewogICAgICAgICAgICByZXNLdy50ZXh0Q29udGVudCA9IGZvcm1hdFNjaShrdywgMik7CiAgICAgICAgICAgIHJlc1Brdy50ZXh0Q29udGVudCA9IGZvcm1hdEZpeGVkKHBrdywgMik7CiAgICAgICAgICAgIHJlc1BoLnRleHRDb250ZW50ID0gZm9ybWF0Rml4ZWQocGgsIDIpOwogICAgICAgICAgICByZXNQb2gudGV4dENvbnRlbnQgPSBmb3JtYXRGaXhlZChwb2gsIDIpOwogICAgICAgICAgICByZXNIcGx1cy50ZXh0Q29udGVudCA9IGZvcm1hdFNjaShocGx1cywgMik7CiAgICAgICAgICAgIHJlc09obWludXMudGV4dENvbnRlbnQgPSBmb3JtYXRTY2kob2htaW51cywgMik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjbGVhclJlc3VsdHMoKSB7CiAgICAgICAgICAgIHJlc0t3LnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgIHJlc1Brdy50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICByZXNQaC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICByZXNQb2gudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgcmVzSHBsdXMudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgcmVzT2htaW51cy50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlKCkgewogICAgICAgICAgICBoaWRlRXJyb3IoKTsKICAgICAgICAgICAgdmFyIHRlbXBSYXcgPSB0ZW1wSW5wdXQudmFsdWUudHJpbSgpOwogICAgICAgICAgICBpZiAodGVtcFJhdyA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHNob3dFcnJvcign0KPQutCw0LbQuNGC0LUg0YLQtdC80L/QtdGA0LDRgtGD0YDRgyDQstC+0LTRiyAoMOKAkzEwMOKAr8KwQykuJyk7CiAgICAgICAgICAgICAgICBjbGVhclJlc3VsdHMoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGVtcCA9IHBhcnNlRmxvYXQodGVtcFJhdyk7CiAgICAgICAgICAgIGlmIChpc05hTih0ZW1wKSkgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKCfQotC10LzQv9C10YDQsNGC0YPRgNCwINC00L7Qu9C20L3QsCDQsdGL0YLRjCDRh9C40YHQu9C+0LwuJyk7CiAgICAgICAgICAgICAgICBjbGVhclJlc3VsdHMoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGVtcCA8IDAgfHwgdGVtcCA+IDEwMCkgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKCfQotC10LzQv9C10YDQsNGC0YPRgNCwINC00L7Qu9C20L3QsCDQsdGL0YLRjCDQsiDQtNC40LDQv9Cw0LfQvtC90LUg0L7RgiAwINC00L4gMTAw4oCvwrBDLicpOwogICAgICAgICAgICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwa3cgPSBpbnRlcnBvbGF0ZVBrdyh0ZW1wKTsKICAgICAgICAgICAgdmFyIGt3ID0gTWF0aC5wb3coMTAsIC1wa3cpOwoKICAgICAgICAgICAgdmFyIHBhcmFtVHlwZSA9IHBhcmFtVHlwZVNlbGVjdC52YWx1ZTsKICAgICAgICAgICAgdmFyIHBhcmFtUmF3ID0gcGFyYW1WYWx1ZUlucHV0LnZhbHVlLnRyaW0oKTsKICAgICAgICAgICAgaWYgKHBhcmFtUmF3ID09PSAnJykgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKCfQktCy0LXQtNC40YLQtSDQt9C90LDRh9C10L3QuNC1INC/0LDRgNCw0LzQtdGC0YDQsC4nKTsKICAgICAgICAgICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwYXJhbVZhbCA9IHBhcnNlRmxvYXQocGFyYW1SYXcpOwogICAgICAgICAgICBpZiAoaXNOYU4ocGFyYW1WYWwpKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9CX0L3QsNGH0LXQvdC40LUg0L/QsNGA0LDQvNC10YLRgNCwINC00L7Qu9C20L3QviDQsdGL0YLRjCDRh9C40YHQu9C+0LwgKNC00L7Qv9GD0YHQutCw0LXRgtGB0Y8g0Y3QutGB0L/QvtC90LXQvdGG0LjQsNC70YzQvdCw0Y8g0LfQsNC/0LjRgdGMLCDQvdCw0L/RgNC40LzQtdGAIDFlLTcpLicpOwogICAgICAgICAgICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwaCwgcG9oLCBocGx1cywgb2htaW51czsKCiAgICAgICAgICAgIGlmIChwYXJhbVR5cGUgPT09ICdwSCcpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJhbVZhbCA8IC0yIHx8IHBhcmFtVmFsID4gMTYpIHsKICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ3BIINCy0L3QtSDRgNC10LDQu9C40YHRgtC40YfQvdC+0LPQviDQtNC40LDQv9Cw0LfQvtC90LAgKOKAkzIgLi4uIDE2KS4g0J/RgNC+0LLQtdGA0YzRgtC1INC30L3QsNGH0LXQvdC40LUuJyk7CiAgICAgICAgICAgICAgICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGggPSBwYXJhbVZhbDsKICAgICAgICAgICAgICAgIHBvaCA9IHBrdyAtIHBoOwogICAgICAgICAgICAgICAgaHBsdXMgPSBNYXRoLnBvdygxMCwgLXBoKTsKICAgICAgICAgICAgICAgIG9obWludXMgPSBNYXRoLnBvdygxMCwgLXBvaCk7CiAgICAgICAgICAgICAgICBpZiAob2htaW51cyA8PSAwIHx8ICFpc0Zpbml0ZShvaG1pbnVzKSkgewogICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcign0J/RgNC4INC00LDQvdC90L7QvCBwSCDQuCDRgtC10LzQv9C10YDQsNGC0YPRgNC1INGA0LDRgdGH0ZHRgiDQtNCw0ZHRgiDQvdC10LrQvtGA0YDQtdC60YLQvdGL0Lkg0YDQtdC30YPQu9GM0YLQsNGCLiDQn9GA0L7QstC10YDRjNGC0LUg0LLQstC10LTRkdC90L3Ri9C1INC00LDQvdC90YvQtS4nKTsKICAgICAgICAgICAgICAgICAgICBjbGVhclJlc3VsdHMoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1UeXBlID09PSAncE9IJykgewogICAgICAgICAgICAgICAgaWYgKHBhcmFtVmFsIDwgLTIgfHwgcGFyYW1WYWwgPiAxNikgewogICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcigncE9IINCy0L3QtSDRgNC10LDQu9C40YHRgtC40YfQvdC+0LPQviDQtNC40LDQv9Cw0LfQvtC90LAgKOKAkzIgLi4uIDE2KS4g0J/RgNC+0LLQtdGA0YzRgtC1INC30L3QsNGH0LXQvdC40LUuJyk7CiAgICAgICAgICAgICAgICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcG9oID0gcGFyYW1WYWw7CiAgICAgICAgICAgICAgICBwaCA9IHBrdyAtIHBvaDsKICAgICAgICAgICAgICAgIG9obWludXMgPSBNYXRoLnBvdygxMCwgLXBvaCk7CiAgICAgICAgICAgICAgICBocGx1cyA9IE1hdGgucG93KDEwLCAtcGgpOwogICAgICAgICAgICAgICAgaWYgKGhwbHVzIDw9IDAgfHwgIWlzRmluaXRlKGhwbHVzKSkgewogICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcign0J/RgNC4INC00LDQvdC90L7QvCBwT0gg0Lgg0YLQtdC80L/QtdGA0LDRgtGD0YDQtSDRgNCw0YHRh9GR0YIg0LTQsNGR0YIg0L3QtdC60L7RgNGA0LXQutGC0L3Ri9C5INGA0LXQt9GD0LvRjNGC0LDRgi4g0J/RgNC+0LLQtdGA0YzRgtC1INCy0LLQtdC00ZHQvdC90YvQtSDQtNCw0L3QvdGL0LUuJyk7CiAgICAgICAgICAgICAgICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtVHlwZSA9PT0gJ0grJykgewogICAgICAgICAgICAgICAgaWYgKHBhcmFtVmFsIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Ca0L7QvdGG0LXQvdGC0YDQsNGG0LjRjyBbSOKBul0g0LTQvtC70LbQvdCwINCx0YvRgtGMINC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3Ri9C8INGH0LjRgdC70L7QvC4nKTsKICAgICAgICAgICAgICAgICAgICBjbGVhclJlc3VsdHMoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocGFyYW1WYWwgPiAxMDApIHsKICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Ca0L7QvdGG0LXQvdGC0YDQsNGG0LjRjyBbSOKBul0g0YHQu9C40YjQutC+0Lwg0LLQtdC70LjQutCwICg+MTAwINC80L7Qu9GML9C7KS4g0JrQsNC70YzQutGD0LvRj9GC0L7RgCDQv9GA0LXQtNC90LDQt9C90LDRh9C10L0g0LTQu9GPINGA0LDQt9Cx0LDQstC70LXQvdC90YvRhSDRgNCw0YHRgtCy0L7RgNC+0LIuJyk7CiAgICAgICAgICAgICAgICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaHBsdXMgPSBwYXJhbVZhbDsKICAgICAgICAgICAgICAgIHBoID0gLU1hdGgubG9nMTAoaHBsdXMpOwogICAgICAgICAgICAgICAgcG9oID0gcGt3IC0gcGg7CiAgICAgICAgICAgICAgICBvaG1pbnVzID0gTWF0aC5wb3coMTAsIC1wb2gpOwogICAgICAgICAgICAgICAgaWYgKG9obWludXMgPD0gMCB8fCAhaXNGaW5pdGUob2htaW51cykpIHsKICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Cf0YDQuCDQtNCw0L3QvdC+0LkgW0jigbpdINC4INGC0LXQvNC/0LXRgNCw0YLRg9GA0LUg0YDQsNGB0YfRkdGCINC00LDRkdGCINC90LXQutC+0YDRgNC10LrRgtC90YvQuSDRgNC10LfRg9C70YzRgtCw0YIuINCf0YDQvtCy0LXRgNGM0YLQtSDQstCy0LXQtNGR0L3QvdGL0LUg0LTQsNC90L3Ri9C1LicpOwogICAgICAgICAgICAgICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbVR5cGUgPT09ICdPSC0nKSB7CiAgICAgICAgICAgICAgICBpZiAocGFyYW1WYWwgPD0gMCkgewogICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcign0JrQvtC90YbQtdC90YLRgNCw0YbQuNGPIFtPSOKBu10g0LTQvtC70LbQvdCwINCx0YvRgtGMINC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3Ri9C8INGH0LjRgdC70L7QvC4nKTsKICAgICAgICAgICAgICAgICAgICBjbGVhclJlc3VsdHMoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocGFyYW1WYWwgPiAxMDApIHsKICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Ca0L7QvdGG0LXQvdGC0YDQsNGG0LjRjyBbT0jigbtdINGB0LvQuNGI0LrQvtC8INCy0LXQu9C40LrQsCAoPjEwMCDQvNC+0LvRjC/QuykuINCa0LDQu9GM0LrRg9C70Y/RgtC+0YAg0L/RgNC10LTQvdCw0LfQvdCw0YfQtdC9INC00LvRjyDRgNCw0LfQsdCw0LLQu9C10L3QvdGL0YUg0YDQsNGB0YLQstC+0YDQvtCyLicpOwogICAgICAgICAgICAgICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG9obWludXMgPSBwYXJhbVZhbDsKICAgICAgICAgICAgICAgIHBvaCA9IC1NYXRoLmxvZzEwKG9obWludXMpOwogICAgICAgICAgICAgICAgcGggPSBwa3cgLSBwb2g7CiAgICAgICAgICAgICAgICBocGx1cyA9IE1hdGgucG93KDEwLCAtcGgpOwogICAgICAgICAgICAgICAgaWYgKGhwbHVzIDw9IDAgfHwgIWlzRmluaXRlKGhwbHVzKSkgewogICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcign0J/RgNC4INC00LDQvdC90L7QuSBbT0jigbtdINC4INGC0LXQvNC/0LXRgNCw0YLRg9GA0LUg0YDQsNGB0YfRkdGCINC00LDRkdGCINC90LXQutC+0YDRgNC10LrRgtC90YvQuSDRgNC10LfRg9C70YzRgtCw0YIuINCf0YDQvtCy0LXRgNGM0YLQtSDQstCy0LXQtNGR0L3QvdGL0LUg0LTQsNC90L3Ri9C1LicpOwogICAgICAgICAgICAgICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShwaCkgfHwgIWlzRmluaXRlKHBvaCkgfHwgIWlzRmluaXRlKGhwbHVzKSB8fCAhaXNGaW5pdGUob2htaW51cykgfHwKICAgICAgICAgICAgICAgIGhwbHVzIDw9IDAgfHwgb2htaW51cyA8PSAwIHx8IGlzTmFOKHBoKSB8fCBpc05hTihwb2gpKSB7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Cg0LDRgdGH0ZHRgiDQv9GA0LjQstGR0Lsg0Log0L3QtdC60L7RgNGA0LXQutGC0L3QvtC80YMg0YDQtdC30YPQu9GM0YLQsNGC0YMuINCf0YDQvtCy0LXRgNGM0YLQtSDQstCy0LXQtNGR0L3QvdGL0LUg0LTQsNC90L3Ri9C1LicpOwogICAgICAgICAgICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVwZGF0ZVJlc3VsdHMoa3csIHBrdywgcGgsIHBvaCwgaHBsdXMsIG9obWludXMpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzZXRGb3JtKCkgewogICAgICAgICAgICB0ZW1wSW5wdXQudmFsdWUgPSAnMjUnOwogICAgICAgICAgICBwYXJhbVR5cGVTZWxlY3QudmFsdWUgPSAncEgnOwogICAgICAgICAgICBwYXJhbVZhbHVlSW5wdXQudmFsdWUgPSAnNyc7CiAgICAgICAgICAgIGhpZGVFcnJvcigpOwogICAgICAgICAgICBjYWxjdWxhdGUoKTsKICAgICAgICB9CgogICAgICAgIGNhbGNCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjYWxjdWxhdGUpOwogICAgICAgIHJlc2V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVzZXRGb3JtKTsKCiAgICAgICAgdGVtcElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgY2FsY3VsYXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBwYXJhbVZhbHVlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBjYWxjdWxhdGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBjYWxjdWxhdGUoKTsKICAgIH0pKCk7Cg==