Калькулятор вероятности совместных событий
Вычислите вероятность одновременного наступления двух событий — с учётом их независимости или зависимости, а также получите дополнительные вероятности: объединения, исключающие исходы и противоположное событие.
—
Вероятность A и B вместе
P(A ∩ B)
—
Хотя бы одно событие
P(A ∪ B)
—
Только событие A
P(A \ B)
—
Только событие B
P(B \ A)
—
Ни одно не произойдёт
P(¬A ∩ ¬B)
Как пользоваться калькулятором
1
Введите вероятность события A в процентах (от 0 до 100). Например, 30 для вероятности 30%.
2
Введите вероятность события B. Например, 45. Выберите тип событий: независимые или зависимые.
3
Если события зависимы — укажите условную вероятность P(B|A). Это вероятность B при условии, что A уже произошло. Например, 60.
4
Нажмите «Рассчитать». Результаты покажут все ключевые вероятности в процентах и в виде десятичных долей.
Примеры расчёта
Пример 1: Независимые события
Вероятность дождя в субботу — 30%, в воскресенье — 40%. События независимы.
Вероятность дождя в оба дня: 0,30 × 0,40 = 0,12 → 12%.
Хотя бы в один день: 30% + 40% − 12% = 58%.
Пример 2: Зависимые события
Студент готовится к экзамену. Вероятность выучить первую тему — 70%. Если первая выучена, вероятность выучить вторую — 80% (зависимые события).
Обе темы выучены: 0,70 × 0,80 = 0,56 → 56%.
Формулы расчёта
P(A ∩ B) = P(A) × P(B) — для независимых событий
P(A ∩ B) = P(A) × P(B|A) — для зависимых событий
P(A ∪ B) = P(A) + P(B) − P(A ∩ B) — вероятность объединения
P(A \ B) = P(A) − P(A ∩ B) — только A
P(B \ A) = P(B) − P(A ∩ B) — только B
P(¬A ∩ ¬B) = 1 − P(A ∪ B) — ни одного события
Обозначения: P(A) — вероятность события A, P(B|A) — условная вероятность B при наступившем A, ∩ — пересечение (логическое «И»), ∪ — объединение (логическое «ИЛИ»).
Пошаговое объяснение
Допустим, P(A) = 30%, P(B) = 45%, события независимы.
Шаг 1. Перемножаем вероятности: 0,30 × 0,45 = 0,135. Это P(A ∩ B) — вероятность, что произойдут оба события одновременно. В процентах: 13,5%.
Шаг 2. Считаем объединение: 0,30 + 0,45 − 0,135 = 0,615. Это вероятность, что произойдёт хотя бы одно из двух событий: 61,5%.
Шаг 3. Только A: 0,30 − 0,135 = 0,165 (16,5%). Только B: 0,45 − 0,135 = 0,315 (31,5%).
Шаг 4. Ни одного: 1 − 0,615 = 0,385 (38,5%). Проверка: сумма всех исходов = 13,5% + 16,5% + 31,5% + 38,5% = 100%.
Где применяется
- Медицина: оценка вероятности наличия двух заболеваний у пациента одновременно.
- Страхование: расчёт риска наступления двух страховых случаев в одном периоде.
- Инвестиции: анализ портфеля — вероятность одновременного падения двух активов.
- Производство: оценка вероятности отказа двух узлов оборудования.
- Метеорология: прогноз вероятности двух погодных явлений в один день.
- Спортивная аналитика: шансы на победу в двух матчах подряд с учётом формы команды.
Важные нюансы
- Вероятности вводите в процентах от 0 до 100. Значения вне этого диапазона не имеют смысла.
- Для зависимых событий условная вероятность P(B|A) не обязана равняться P(B) — именно в этом суть зависимости.
- Результат P(A ∩ B) никогда не может превышать ни P(A), ни P(B). Если получилось иначе — проверьте исходные данные.
- При зависимых событиях P(B) может отличаться от той, что подразумевается условной вероятностью. Калькулятор использует введённое P(B) для расчёта объединения.
- Округление до двух знаков после запятой может давать погрешность порядка ±0,01%.
- Формулы предполагают классическое вероятностное пространство. Для субъективных или нечётких вероятностей нужны другие методы.
Частые ошибки
- Путаница между P(A ∩ B) и P(A ∪ B): пересечение — это «оба сразу», объединение — «хотя бы одно». Это разные величины.
- Сложение вероятностей без вычитания пересечения: формула P(A) + P(B) работает только для несовместных событий. Иначе вычитайте P(A ∩ B).
- Подмена условной вероятности: P(B|A) ≠ P(A|B). Это разные величины, не путайте их при вводе данных.
- Игнорирование зависимости: если события связаны, а вы считаете их независимыми — результат будет ошибочным. Всегда оценивайте характер связи.
- Ввод вероятностей больше 100%: вероятность не может превышать 100%. Проверяйте исходные данные.
- Отрицательные значения: вероятность не бывает отрицательной. Ноль означает невозможность события.
Ответы на частые вопросы
В: Чем отличаются независимые и зависимые события?
О: При независимых событиях наступление одного не влияет на вероятность другого. При зависимых — влияет, и это отражается через условную вероятность.
В: Можно ли вводить вероятности в десятичных долях?
О: Калькулятор принимает проценты (0–100). Чтобы перевести долю в проценты, умножьте её на 100. Например, 0,35 = 35%.
В: Почему P(A ∪ B) иногда меньше, чем P(A) + P(B)?
О: Потому что пересечение P(A ∩ B) учитывается дважды при простом сложении, и его нужно вычесть. Это называется формулой включений-исключений.
В: Что делать, если я не знаю, зависимы события или нет?
О: Если нет оснований предполагать зависимость, обычно считают события независимыми. В сомнительных случаях лучше собрать статистику или проконсультироваться со специалистом.
В: Как проверить корректность результата?
О: Сумма вероятностей всех четырёх несовместных исходов (A∩B, только A, только B, ни одного) должна равняться 100%.
В: Подходит ли калькулятор для более чем двух событий?
О: Нет, данный калькулятор рассчитан ровно на два события. Для трёх и более событий формулы усложняются, и нужен отдельный инструмент.
Источники и справочные данные
Расчёт основан на классических формулах теории вероятностей: аксиоматика Колмогорова, правила умножения и сложения вероятностей, определение условной вероятности. Материал соответствует школьному курсу математики (10–11 класс) и вузовскому курсу теории вероятностей. Для учебных и справочных целей; при ответственных инженерных или финансовых расчётах проверяйте результат вручную или в специализированном ПО.
Всё о вероятности совместных событий: от теории к практике
Вероятность совместных событий — одна из центральных тем теории вероятностей. Она помогает ответить на вопрос: «Каков шанс, что произойдут сразу два интересующих нас события?» Звучит академично, но на деле мы сталкиваемся с этим постоянно: от прогноза погоды на выходные до оценки рисков в бизнесе. В этой статье разберём тему подробно, с числами, примерами и без излишней сложности.
Что такое совместные события
Совместными называют два события, которые могут произойти одновременно в рамках одного испытания или наблюдения. Например, событие A — «завтра будет дождь», событие B — «завтра будет ветер». Они совместны, потому что дождливый и ветреный день — вполне возможный исход. Противоположность — несовместные события, которые исключают друг друга: например, выпадение орла и решки при одном броске монеты.
Ключевой показатель — вероятность пересечения, обозначаемая P(A ∩ B). Это число от 0 до 1 (или от 0% до 100%), показывающее шанс одновременного наступления обоих событий. Именно её чаще всего ищут с помощью калькулятора.
Независимые события: формула умножения
События A и B называют независимыми, если наступление одного никак не меняет вероятность другого. Классический пример — два броска игральной кости. Результат первого броска не влияет на второй. Для независимых событий работает простейшая формула:
P(A ∩ B) = P(A) × P(B)
Допустим, вероятность опоздания на автобус утром — 10% (0,10), а вероятность забыть зонт — 15% (0,15). Если эти события независимы, вероятность и опоздать, и забыть зонт одновременно: 0,10 × 0,15 = 0,015, то есть 1,5%. Маловероятно, но возможно.
Важно: независимость не означает, что события «не связаны по смыслу». Она означает лишь отсутствие статистического влияния. На практике независимость проверяют через сравнение P(B|A) и P(B): если они равны — события независимы.
Зависимые события и условная вероятность
Зависимые события встречаются в жизни гораздо чаще. Например, вероятность сдать экзамен зависит от того, посещал ли студент лекции. Здесь появляется понятие условной вероятности P(B|A) — вероятности события B при условии, что A уже наступило. Формула для совместной вероятности принимает вид:
P(A ∩ B) = P(A) × P(B|A)
Представьте: вероятность, что станок на заводе перегреется — 5% (0,05). Если перегрев случился, вероятность отключения предохранителя — 90% (0,90). Тогда вероятность совместного исхода (перегрев и отключение): 0,05 × 0,90 = 0,045, или 4,5%. Заметьте: безусловная вероятность отключения может быть совсем другой — скажем, 10% за счёт иных причин. Но при наступившем перегреве она резко возрастает.
Условная вероятность — мощный инструмент. Она лежит в основе формулы Байеса, которая используется в спам-фильтрах, медицинской диагностике и машинном обучении. Но для базового калькулятора достаточно понимать: если события связаны, простое перемножение «как для независимых» даст неверный результат.
Формула сложения: вероятность «хотя бы одного»
Часто нужно узнать не только вероятность совместного наступления, но и шанс, что произойдёт хотя бы одно из двух событий — обозначается P(A ∪ B). Логика проста: складываем вероятности A и B, но вычитаем их пересечение, так как иначе учтём его дважды:
P(A ∪ B) = P(A) + P(B) − P(A ∩ B)
Пример: вероятность найти свободное такси в час пик — 40%, вероятность вызвать каршеринг — 35%, а вероятность, что доступны оба варианта — 15%. Тогда шанс уехать хоть на чём-то: 40% + 35% − 15% = 60%. Без вычитания получилось бы 75% — завышенная оценка.
Для несовместных событий P(A ∩ B) = 0, и формула упрощается до P(A) + P(B). Но в реальном мире несовместные события — скорее исключение, чем правило.
Полная картина: четыре взаимоисключающих исхода
Для двух событий пространство элементарных исходов делится ровно на четыре непересекающиеся части: произошли оба (A∩B), только A (A \ B), только B (B \ A), ни одного (¬A ∩ ¬B). Сумма их вероятностей всегда равна 1 (100%). Это удобный способ проверки: если сумма не равна единице — в расчётах ошибка.
Наш калькулятор вычисляет все четыре величины автоматически. Вы видите не только итоговую цифру, но и расклад по сценариям. Это особенно полезно при планировании: например, оценивая риски проекта, вы можете увидеть вероятность «всё пойдёт не так» и подготовить запасной план.
Практические применения в реальной жизни
Теория вероятностей совместных событий — не абстракция. Вот несколько конкретных областей, где эти расчёты применяются ежедневно:
- Медицинское тестирование: пациент сдаёт два независимых анализа. Вероятность ложноположительного результата каждого — 3%. Вероятность, что оба ошибочно покажут болезнь: 0,03 × 0,03 = 0,0009 (0,09%). Это помогает оценить надёжность диагностики.
- Логистика и цепочки поставок: два поставщика могут задержать отгрузку с вероятностью 20% и 25%. Если задержки независимы, риск срыва всей цепочки (задержали оба) — 5%. Но если поставщики зависят от одного транспортного узла, нужна условная вероятность.
- IT и надёжность систем: сервер выходит из строя с вероятностью 2% в месяц, резервный сервер — с той же вероятностью. Шанс отказа обоих одновременно (если они независимы): 0,02 × 0,02 = 0,0004. Именно так проектируют отказоустойчивые системы.
- Маркетинг: клиент открывает email-рассылку с вероятностью 25% и переходит по ссылке внутри с вероятностью 10%. Если переход зависит от открытия (очевидно), то совместная вероятность: 0,25 × 0,10 = 2,5%. Это конверсия письма в клик.
- Повседневные решения: вероятность пробки на мосту — 30%, вероятность дождя — 40%. Если вы готовы промокнуть в пробке — это совместное событие. Его вероятность при независимости: 12%.
Типичные заблуждения и как их избежать
Самая распространённая ошибка — складывать вероятности там, где нужно перемножать, и наоборот. Запомните простое правило: «И» — умножение, «ИЛИ» — сложение с вычитанием пересечения. Если сомневаетесь, нарисуйте диаграмму Венна: два пересекающихся круга. Площадь пересечения — это P(A ∩ B), площадь объединения — P(A ∪ B). Визуализация мгновенно проясняет логику.
Ещё одно заблуждение — считать любые два события независимыми «по умолчанию». В реальности многие факторы связаны: экономические показатели, погодные условия в соседних регионах, поведение пользователей на сайте. Всегда задавайте себе вопрос: «Может ли наступление первого события изменить шансы второго?» Если ответ «да» — используйте зависимую модель и условную вероятность.
Наконец, аккуратно интерпретируйте проценты. Вероятность 0,5% и 5% отличаются в десять раз. В финансовых и медицинских контекстах такая разница может быть критичной. Всегда перепроверяйте исходные данные и не стесняйтесь пересчитать результат вручную для контроля.
Заключение
Калькулятор вероятности совместных событий — это простой, но мощный инструмент для быстрых и точных оценок. Он избавляет от рутинных вычислений и снижает риск арифметической ошибки. Понимание базовых формул — умножения для совместного наступления и сложения с поправкой для объединения — открывает дорогу к грамотному анализу рисков в самых разных сферах: от личных решений до профессиональных проектов. Пользуйтесь калькулятором осознанно, проверяйте исходные данные и помните: вероятность — это не гарантия, а мера ожидания, которая помогает принимать взвешенные решения в условиях неопределённости.
CiAgKGZ1bmN0aW9uKCl7CiAgICB2YXIgcGFJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1nZW4tY2FsLXBhJyk7CiAgICB2YXIgcGJJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1nZW4tY2FsLXBiJyk7CiAgICB2YXIgcGJhSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZ2VuLWNhbC1wYmEnKTsKICAgIHZhciBjb25kaXRpb25hbEZpZWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWdlbi1jYWwtY29uZGl0aW9uYWwtZmllbGQnKTsKICAgIHZhciBlcnJQYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1nZW4tY2FsLWVyci1wYScpOwogICAgdmFyIGVyclBiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWdlbi1jYWwtZXJyLXBiJyk7CiAgICB2YXIgZXJyUGJhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWdlbi1jYWwtZXJyLXBiYScpOwogICAgdmFyIGVyckdlbmVyYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZ2VuLWNhbC1lcnItZ2VuZXJhbCcpOwoKICAgIHZhciByZXNJbnRlcnNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZ2VuLWNhbC1yZXMtaW50ZXJzZWN0aW9uJyk7CiAgICB2YXIgcmVzVW5pb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZ2VuLWNhbC1yZXMtdW5pb24nKTsKICAgIHZhciByZXNPbmx5QSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1nZW4tY2FsLXJlcy1vbmx5LWEnKTsKICAgIHZhciByZXNPbmx5QiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1nZW4tY2FsLXJlcy1vbmx5LWInKTsKICAgIHZhciByZXNOZWl0aGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWdlbi1jYWwtcmVzLW5laXRoZXInKTsKCiAgICB2YXIgY2FsY3VsYXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWdlbi1jYWwtY2FsY3VsYXRlJyk7CiAgICB2YXIgcmVzZXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZ2VuLWNhbC1yZXNldCcpOwoKICAgIHZhciByYWRpb0dyb3VwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWdlbi1jYWwtZXZlbnQtdHlwZScpOwogICAgdmFyIGRlcGVuZGVudFJhZGlvID0gcmFkaW9Hcm91cC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt2YWx1ZT0iZGVwZW5kZW50Il0nKTsKICAgIHZhciBpbmRlcGVuZGVudFJhZGlvID0gcmFkaW9Hcm91cC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt2YWx1ZT0iaW5kZXBlbmRlbnQiXScpOwoKICAgIGZ1bmN0aW9uIGhpZGVBbGxFcnJvcnMoKSB7CiAgICAgIGVyclBhLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtdmlzaWJsZScpOwogICAgICBlcnJQYS50ZXh0Q29udGVudCA9ICcnOwogICAgICBlcnJQYi5jbGFzc0xpc3QucmVtb3ZlKCdubi1nZW4tY2FsLXZpc2libGUnKTsKICAgICAgZXJyUGIudGV4dENvbnRlbnQgPSAnJzsKICAgICAgZXJyUGJhLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1jYWwtdmlzaWJsZScpOwogICAgICBlcnJQYmEudGV4dENvbnRlbnQgPSAnJzsKICAgICAgZXJyR2VuZXJhbC5jbGFzc0xpc3QucmVtb3ZlKCdubi1nZW4tY2FsLXZpc2libGUnKTsKICAgICAgZXJyR2VuZXJhbC50ZXh0Q29udGVudCA9ICcnOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUNvbmRpdGlvbmFsVmlzaWJpbGl0eSgpIHsKICAgICAgaWYgKGRlcGVuZGVudFJhZGlvLmNoZWNrZWQpIHsKICAgICAgICBjb25kaXRpb25hbEZpZWxkLmNsYXNzTGlzdC5hZGQoJ25uLWdlbi1jYWwtdmlzaWJsZScpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbmRpdGlvbmFsRmllbGQuY2xhc3NMaXN0LnJlbW92ZSgnbm4tZ2VuLWNhbC12aXNpYmxlJyk7CiAgICAgICAgcGJhSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICBlcnJQYmEuY2xhc3NMaXN0LnJlbW92ZSgnbm4tZ2VuLWNhbC12aXNpYmxlJyk7CiAgICAgICAgZXJyUGJhLnRleHRDb250ZW50ID0gJyc7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVByb2JhYmlsaXR5KHZhbHVlLCBmaWVsZE5hbWUpIHsKICAgICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIHsgZXJyb3I6ICfQn9C+0LvQtSDQvdC1INC30LDQv9C+0LvQvdC10L3QvicsIHZhbHVlOiBudWxsIH07CiAgICAgIH0KICAgICAgdmFyIG51bSA9IHBhcnNlRmxvYXQodmFsdWUpOwogICAgICBpZiAoaXNOYU4obnVtKSkgewogICAgICAgIHJldHVybiB7IGVycm9yOiAn0JLQstC10LTQuNGC0LUg0YfQuNGB0LvQvicsIHZhbHVlOiBudWxsIH07CiAgICAgIH0KICAgICAgaWYgKG51bSA8IDApIHsKICAgICAgICByZXR1cm4geyBlcnJvcjogJ9CS0LXRgNC+0Y/RgtC90L7RgdGC0Ywg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINC+0YLRgNC40YbQsNGC0LXQu9GM0L3QvtC5JywgdmFsdWU6IG51bGwgfTsKICAgICAgfQogICAgICBpZiAobnVtID4gMTAwKSB7CiAgICAgICAgcmV0dXJuIHsgZXJyb3I6ICfQktC10YDQvtGP0YLQvdC+0YHRgtGMINC90LUg0LzQvtC20LXRgiDQv9GA0LXQstGL0YjQsNGC0YwgMTAwJScsIHZhbHVlOiBudWxsIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHsgZXJyb3I6IG51bGwsIHZhbHVlOiBudW0gLyAxMDAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRSZXN1bHQoZGVjaW1hbFZhbHVlKSB7CiAgICAgIHZhciBwZXJjZW50ID0gKGRlY2ltYWxWYWx1ZSAqIDEwMCk7CiAgICAgIHZhciBwZXJjZW50Um91bmRlZCA9IE1hdGgucm91bmQocGVyY2VudCAqIDEwMCkgLyAxMDA7CiAgICAgIHZhciBkZWNpbWFsUm91bmRlZCA9IE1hdGgucm91bmQoZGVjaW1hbFZhbHVlICogMTAwMDApIC8gMTAwMDA7CiAgICAgIHJldHVybiBwZXJjZW50Um91bmRlZC50b0ZpeGVkKDIpICsgJyUgKNC00L7Qu9GPOiAnICsgZGVjaW1hbFJvdW5kZWQudG9GaXhlZCg0KSArICcpJzsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNldFJlc3VsdHMoKSB7CiAgICAgIHJlc0ludGVyc2VjdGlvbi50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICByZXNVbmlvbi50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICByZXNPbmx5QS50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICByZXNPbmx5Qi50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICByZXNOZWl0aGVyLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICB9CgogICAgZnVuY3Rpb24gY2FsY3VsYXRlKCkgewogICAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICAgIHJlc2V0UmVzdWx0cygpOwoKICAgICAgdmFyIHBhUmVzdWx0ID0gcGFyc2VQcm9iYWJpbGl0eShwYUlucHV0LnZhbHVlLCAnQScpOwogICAgICBpZiAocGFSZXN1bHQuZXJyb3IpIHsKICAgICAgICBlcnJQYS50ZXh0Q29udGVudCA9IHBhUmVzdWx0LmVycm9yOwogICAgICAgIGVyclBhLmNsYXNzTGlzdC5hZGQoJ25uLWdlbi1jYWwtdmlzaWJsZScpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdmFyIHBiUmVzdWx0ID0gcGFyc2VQcm9iYWJpbGl0eShwYklucHV0LnZhbHVlLCAnQicpOwogICAgICBpZiAocGJSZXN1bHQuZXJyb3IpIHsKICAgICAgICBlcnJQYi50ZXh0Q29udGVudCA9IHBiUmVzdWx0LmVycm9yOwogICAgICAgIGVyclBiLmNsYXNzTGlzdC5hZGQoJ25uLWdlbi1jYWwtdmlzaWJsZScpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdmFyIHBBID0gcGFSZXN1bHQudmFsdWU7CiAgICAgIHZhciBwQiA9IHBiUmVzdWx0LnZhbHVlOwogICAgICB2YXIgaXNEZXBlbmRlbnQgPSBkZXBlbmRlbnRSYWRpby5jaGVja2VkOwogICAgICB2YXIgcEJBID0gbnVsbDsKCiAgICAgIGlmIChpc0RlcGVuZGVudCkgewogICAgICAgIHZhciBwYmFSZXN1bHQgPSBwYXJzZVByb2JhYmlsaXR5KHBiYUlucHV0LnZhbHVlLCAnQnxBJyk7CiAgICAgICAgaWYgKHBiYVJlc3VsdC5lcnJvcikgewogICAgICAgICAgZXJyUGJhLnRleHRDb250ZW50ID0gcGJhUmVzdWx0LmVycm9yOwogICAgICAgICAgZXJyUGJhLmNsYXNzTGlzdC5hZGQoJ25uLWdlbi1jYWwtdmlzaWJsZScpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBwQkEgPSBwYmFSZXN1bHQudmFsdWU7CiAgICAgIH0KCiAgICAgIHZhciBwSW50ZXJzZWN0aW9uOwogICAgICBpZiAoaXNEZXBlbmRlbnQpIHsKICAgICAgICBwSW50ZXJzZWN0aW9uID0gcEEgKiBwQkE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcEludGVyc2VjdGlvbiA9IHBBICogcEI7CiAgICAgIH0KCiAgICAgIGlmIChwSW50ZXJzZWN0aW9uID4gcEEgKyAxZS0xMCB8fCBwSW50ZXJzZWN0aW9uID4gcEIgKyAxZS0xMCkgewogICAgICAgIGVyckdlbmVyYWwudGV4dENvbnRlbnQgPSAn0JLQvdC40LzQsNC90LjQtTogUChBIOKIqSBCKSDQv9GA0LXQstGL0YjQsNC10YIgUChBKSDQuNC70LggUChCKS4g0J/RgNC+0LLQtdGA0YzRgtC1INC40YHRhdC+0LTQvdGL0LUg0LTQsNC90L3Ri9C1IOKAlCDRgtCw0LrQsNGPINC60L7QvNCx0LjQvdCw0YbQuNGPINC80LDQu9C+0LLQtdGA0L7Rj9GC0L3QsCDQuCDQvNC+0LbQtdGCINGD0LrQsNC30YvQstCw0YLRjCDQvdCwINC+0YjQuNCx0LrRgyDQstCy0L7QtNCwLic7CiAgICAgICAgZXJyR2VuZXJhbC5jbGFzc0xpc3QuYWRkKCdubi1nZW4tY2FsLXZpc2libGUnKTsKICAgICAgfQoKICAgICAgdmFyIHBVbmlvbiA9IHBBICsgcEIgLSBwSW50ZXJzZWN0aW9uOwogICAgICBpZiAocFVuaW9uID4gMSArIDFlLTEwKSB7CiAgICAgICAgcFVuaW9uID0gTWF0aC5taW4ocFVuaW9uLCAxKTsKICAgICAgfQogICAgICBpZiAocFVuaW9uIDwgMCkgewogICAgICAgIHBVbmlvbiA9IDA7CiAgICAgIH0KCiAgICAgIHZhciBwT25seUEgPSBwQSAtIHBJbnRlcnNlY3Rpb247CiAgICAgIGlmIChwT25seUEgPCAwKSB7CiAgICAgICAgcE9ubHlBID0gMDsKICAgICAgfQogICAgICB2YXIgcE9ubHlCID0gcEIgLSBwSW50ZXJzZWN0aW9uOwogICAgICBpZiAocE9ubHlCIDwgMCkgewogICAgICAgIHBPbmx5QiA9IDA7CiAgICAgIH0KICAgICAgdmFyIHBOZWl0aGVyID0gMSAtIHBVbmlvbjsKICAgICAgaWYgKHBOZWl0aGVyIDwgMCkgewogICAgICAgIHBOZWl0aGVyID0gMDsKICAgICAgfQoKICAgICAgcmVzSW50ZXJzZWN0aW9uLnRleHRDb250ZW50ID0gZm9ybWF0UmVzdWx0KHBJbnRlcnNlY3Rpb24pOwogICAgICByZXNVbmlvbi50ZXh0Q29udGVudCA9IGZvcm1hdFJlc3VsdChwVW5pb24pOwogICAgICByZXNPbmx5QS50ZXh0Q29udGVudCA9IGZvcm1hdFJlc3VsdChwT25seUEpOwogICAgICByZXNPbmx5Qi50ZXh0Q29udGVudCA9IGZvcm1hdFJlc3VsdChwT25seUIpOwogICAgICByZXNOZWl0aGVyLnRleHRDb250ZW50ID0gZm9ybWF0UmVzdWx0KHBOZWl0aGVyKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNldEFsbCgpIHsKICAgICAgcGFJbnB1dC52YWx1ZSA9ICcnOwogICAgICBwYklucHV0LnZhbHVlID0gJyc7CiAgICAgIHBiYUlucHV0LnZhbHVlID0gJyc7CiAgICAgIGluZGVwZW5kZW50UmFkaW8uY2hlY2tlZCA9IHRydWU7CiAgICAgIHVwZGF0ZUNvbmRpdGlvbmFsVmlzaWJpbGl0eSgpOwogICAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICAgIHJlc2V0UmVzdWx0cygpOwogICAgfQoKICAgIGNhbGN1bGF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNhbGN1bGF0ZSk7CgogICAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXNldEFsbCk7CgogICAgcmFkaW9Hcm91cC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChlLnRhcmdldC5uYW1lID09PSAnbm4tZ2VuLWNhbC1ldmVudC10eXBlJykgewogICAgICAgIHVwZGF0ZUNvbmRpdGlvbmFsVmlzaWJpbGl0eSgpOwogICAgICAgIGhpZGVBbGxFcnJvcnMoKTsKICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgfQogICAgfSk7CgogICAgdXBkYXRlQ29uZGl0aW9uYWxWaXNpYmlsaXR5KCk7CiAgfSkoKTsK